Speedometer 2.0: Document es2015-babel-webpack build process
authorcommit-queue@webkit.org <commit-queue@webkit.org@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Wed, 26 Jul 2017 04:42:19 +0000 (04:42 +0000)
committercommit-queue@webkit.org <commit-queue@webkit.org@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Wed, 26 Jul 2017 04:42:19 +0000 (04:42 +0000)
https://bugs.webkit.org/show_bug.cgi?id=174252

Patch by Mathias Bynens <mathias@qiwi.be> on 2017-07-25
Reviewed by Ryosuke Niwa.

* Speedometer/resources/todomvc/vanilla-examples/es2015-babel-webpack/README.md: Added build docs.
* Speedometer/resources/todomvc/vanilla-examples/es2015-babel-webpack/dist/*: Update generated build files.
* Speedometer/resources/todomvc/vanilla-examples/es2015-babel-webpack/package.json: Remove unused items.
* Speedometer/resources/todomvc/vanilla-examples/es2015-babel-webpack/package-lock.json: Added lockfile.
* Speedometer/resources/todomvc/vanilla-examples/es2015-babel-webpack/src/index.html: Make title consistent.

git-svn-id: https://svn.webkit.org/repository/webkit/trunk@219903 268f45cc-cd09-0410-ab3c-d52691b4dbfc

17 files changed:
PerformanceTests/ChangeLog
PerformanceTests/Speedometer/resources/todomvc/vanilla-examples/es2015-babel-webpack/README.md [new file with mode: 0644]
PerformanceTests/Speedometer/resources/todomvc/vanilla-examples/es2015-babel-webpack/dist/bundle.app.9debb1b0a94f14d0ebe9.js [moved from PerformanceTests/Speedometer/resources/todomvc/vanilla-examples/es2015-babel-webpack/dist/bundle.app.73bcc5d3c1d07180f0e3.js with 99% similarity]
PerformanceTests/Speedometer/resources/todomvc/vanilla-examples/es2015-babel-webpack/dist/bundle.app.9debb1b0a94f14d0ebe9.js.map [moved from PerformanceTests/Speedometer/resources/todomvc/vanilla-examples/es2015-babel-webpack/dist/bundle.app.73bcc5d3c1d07180f0e3.js.map with 99% similarity]
PerformanceTests/Speedometer/resources/todomvc/vanilla-examples/es2015-babel-webpack/dist/bundle.manifest.112bf70a7f3deebf1f93.js [deleted file]
PerformanceTests/Speedometer/resources/todomvc/vanilla-examples/es2015-babel-webpack/dist/bundle.manifest.a55034b424c795b1a9a8.js [new file with mode: 0644]
PerformanceTests/Speedometer/resources/todomvc/vanilla-examples/es2015-babel-webpack/dist/bundle.manifest.a55034b424c795b1a9a8.js.map [moved from PerformanceTests/Speedometer/resources/todomvc/vanilla-examples/es2015-babel-webpack/dist/bundle.manifest.112bf70a7f3deebf1f93.js.map with 95% similarity]
PerformanceTests/Speedometer/resources/todomvc/vanilla-examples/es2015-babel-webpack/dist/bundle.vendor.bade2cb8992d8a68d0d7.js [moved from PerformanceTests/Speedometer/resources/todomvc/vanilla-examples/es2015-babel-webpack/dist/bundle.vendor.efaa3e0e20077c8e7471.js with 89% similarity]
PerformanceTests/Speedometer/resources/todomvc/vanilla-examples/es2015-babel-webpack/dist/bundle.vendor.bade2cb8992d8a68d0d7.js.map [moved from PerformanceTests/Speedometer/resources/todomvc/vanilla-examples/es2015-babel-webpack/dist/bundle.vendor.efaa3e0e20077c8e7471.js.map with 93% similarity]
PerformanceTests/Speedometer/resources/todomvc/vanilla-examples/es2015-babel-webpack/dist/index.html
PerformanceTests/Speedometer/resources/todomvc/vanilla-examples/es2015-babel-webpack/dist/styles.app.9debb1b0a94f14d0ebe9.css [moved from PerformanceTests/Speedometer/resources/todomvc/vanilla-examples/es2015-babel-webpack/dist/styles.app.73bcc5d3c1d07180f0e3.css with 80% similarity]
PerformanceTests/Speedometer/resources/todomvc/vanilla-examples/es2015-babel-webpack/dist/styles.app.9debb1b0a94f14d0ebe9.css.map [moved from PerformanceTests/Speedometer/resources/todomvc/vanilla-examples/es2015-babel-webpack/dist/styles.app.73bcc5d3c1d07180f0e3.css.map with 57% similarity]
PerformanceTests/Speedometer/resources/todomvc/vanilla-examples/es2015-babel-webpack/dist/styles.vendor.bade2cb8992d8a68d0d7.css [moved from PerformanceTests/Speedometer/resources/todomvc/vanilla-examples/es2015-babel-webpack/dist/styles.vendor.efaa3e0e20077c8e7471.css with 98% similarity]
PerformanceTests/Speedometer/resources/todomvc/vanilla-examples/es2015-babel-webpack/dist/styles.vendor.bade2cb8992d8a68d0d7.css.map [moved from PerformanceTests/Speedometer/resources/todomvc/vanilla-examples/es2015-babel-webpack/dist/styles.vendor.efaa3e0e20077c8e7471.css.map with 55% similarity]
PerformanceTests/Speedometer/resources/todomvc/vanilla-examples/es2015-babel-webpack/package-lock.json [new file with mode: 0644]
PerformanceTests/Speedometer/resources/todomvc/vanilla-examples/es2015-babel-webpack/package.json
PerformanceTests/Speedometer/resources/todomvc/vanilla-examples/es2015-babel-webpack/src/index.html

index e6d0d54..37ce51d 100644 (file)
@@ -1,3 +1,16 @@
+2017-07-25  Mathias Bynens  <mathias@qiwi.be>
+
+        Speedometer 2.0: Document es2015-babel-webpack build process
+        https://bugs.webkit.org/show_bug.cgi?id=174252
+
+        Reviewed by Ryosuke Niwa.
+
+        * Speedometer/resources/todomvc/vanilla-examples/es2015-babel-webpack/README.md: Added build docs.
+        * Speedometer/resources/todomvc/vanilla-examples/es2015-babel-webpack/dist/*: Update generated build files.
+        * Speedometer/resources/todomvc/vanilla-examples/es2015-babel-webpack/package.json: Remove unused items.
+        * Speedometer/resources/todomvc/vanilla-examples/es2015-babel-webpack/package-lock.json: Added lockfile.
+        * Speedometer/resources/todomvc/vanilla-examples/es2015-babel-webpack/src/index.html: Make title consistent.
+
 2017-07-18  Matt Kotsenas  <mattkot@microsoft.com>
 
         Add performance.mark()s around each test step
diff --git a/PerformanceTests/Speedometer/resources/todomvc/vanilla-examples/es2015-babel-webpack/README.md b/PerformanceTests/Speedometer/resources/todomvc/vanilla-examples/es2015-babel-webpack/README.md
new file mode 100644 (file)
index 0000000..306ee07
--- /dev/null
@@ -0,0 +1,10 @@
+# Speedometer 2.0: ES2015 + Babel + Webpack TodoMVC example
+
+## Test locally
+
+1. `npm install`
+2. `npm run build` (production build)
+
+## Build
+
+1. `npm run build` (production build)
@@ -1,2 +1,2 @@
 webpackJsonp([0,2],[function(t,e,i){"use strict";function o(t,e){return(e||document).querySelector(t)}function n(t,e){return(e||document).querySelectorAll(t)}function r(t,e,i,o){t.addEventListener(e,i,!!o)}function c(t,e,i,o){function c(i){var r=i.target,c=n(e,t),l=Array.prototype.indexOf.call(c,r)>=0;l&&o.call(r,i)}var l="blur"===i||"focus"===i;r(t,i,c,l)}function l(t,e){if(t.parentNode)return t.parentNode.tagName.toLowerCase()===e.toLowerCase()?t.parentNode:l(t.parentNode,e)}function a(t,e){var i=t.indexOf(e);return i===-1?t:void t.splice(i,1)}i.d(e,"a",function(){return o}),i.d(e,"b",function(){return n}),i.d(e,"d",function(){return r}),i.d(e,"c",function(){return c}),i.d(e,"e",function(){return l}),i.d(e,"f",function(){return a}),NodeList.prototype.forEach=Array.prototype.forEach},,function(t,e,i){"use strict";function o(){i.i(c.a)()}var n=i(1),r=(i.n(n),i(10)),c=(i.n(r),i(0),i(8));e.a=o},function(t,e,i){"use strict";function o(t,e){var i=this;i.model=t,i.view=e,i.view.bind("newTodo",function(t){i.addItem(t)}),i.view.bind("itemEdit",function(t){i.editItem(t.id)}),i.view.bind("itemEditDone",function(t){i.editItemSave(t.id,t.title)}),i.view.bind("itemEditCancel",function(t){i.editItemCancel(t.id)}),i.view.bind("itemRemove",function(t){i.removeItem(t.id)}),i.view.bind("itemToggle",function(t){i.toggleComplete(t.id,t.completed)}),i.view.bind("removeCompleted",function(){i.removeCompletedItems()}),i.view.bind("toggleAll",function(t){i.toggleAll(t.completed)})}e.a=o,o.prototype.setView=function(t){var e=t.split("/")[1],i=e||"";this._updateFilterState(i)},o.prototype.showAll=function(){var t=this;t.model.read(function(e){t.view.render("showEntries",e)})},o.prototype.showActive=function(){var t=this;t.model.read({completed:!1},function(e){t.view.render("showEntries",e)})},o.prototype.showCompleted=function(){var t=this;t.model.read({completed:!0},function(e){t.view.render("showEntries",e)})},o.prototype.addItem=function(t){var e=this;""!==t.trim()&&e.model.create(t,function(){e.view.render("clearNewTodo"),e._filter(!0)})},o.prototype.editItem=function(t){var e=this;e.model.read(t,function(i){e.view.render("editItem",{id:t,title:i[0].title})})},o.prototype.editItemSave=function(t,e){var i=this;e.trim()?i.model.update(t,{title:e},function(){i.view.render("editItemDone",{id:t,title:e})}):i.removeItem(t)},o.prototype.editItemCancel=function(t){var e=this;e.model.read(t,function(i){e.view.render("editItemDone",{id:t,title:i[0].title})})},o.prototype.removeItem=function(t){var e=this;e.model.remove(t,function(){e.view.render("removeItem",t)}),e._filter()},o.prototype.removeCompletedItems=function(){var t=this;t.model.read({completed:!0},function(e){e.forEach(function(e){t.removeItem(e.id)})}),t._filter()},o.prototype.toggleComplete=function(t,e,i){var o=this;o.model.update(t,{completed:e},function(){o.view.render("elementComplete",{id:t,completed:e})}),i||o._filter()},o.prototype.toggleAll=function(t){var e=this;e.model.read({completed:!t},function(i){i.forEach(function(i){e.toggleComplete(i.id,t,!0)})}),e._filter()},o.prototype._updateCount=function(){var t=this;t.model.getCount(function(e){t.view.render("updateElementCount",e.active),t.view.render("clearCompletedButton",{completed:e.completed,visible:e.completed>0}),t.view.render("toggleAll",{checked:e.completed===e.total}),t.view.render("contentBlockVisibility",{visible:e.total>0})})},o.prototype._filter=function(t){var e=this._activeRoute.charAt(0).toUpperCase()+this._activeRoute.substr(1);this._updateCount(),(t||"All"!==this._lastActiveRoute||this._lastActiveRoute!==e)&&this["show"+e](),this._lastActiveRoute=e},o.prototype._updateFilterState=function(t){t=t.split("?")[0],this._activeRoute=t,""===t&&(this._activeRoute="All"),this._filter(),this.view.render("setFilter",t)}},function(t,e,i){var o="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t};!function(i){var n={},r={};n.length=0,n.getItem=function(t){return r[t]||null},n.setItem=function(t,e){"undefined"==typeof e?n.removeItem(t):(r.hasOwnProperty(t)||n.length++,r[t]=""+e)},n.removeItem=function(t){r.hasOwnProperty(t)&&(delete r[t],n.length--)},n.key=function(t){return Object.keys(r)[t]||null},n.clear=function(){r={},n.length=0},"object"===o(e)?t.exports=n:i.localStorageMemory=n}(this)},function(t,e,i){"use strict";function o(t){this.storage=t}var n="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t};e.a=o,o.prototype.create=function(t,e){t=t||"",e=e||function(){};var i={title:t.trim(),completed:!1};this.storage.save(i,e)},o.prototype.read=function(t,e){var i="undefined"==typeof t?"undefined":n(t);return e=e||function(){},"function"===i?(e=t,this.storage.findAll(e)):void("string"===i||"number"===i?(t=parseInt(t,10),this.storage.find({id:t},e)):this.storage.find(t,e))},o.prototype.update=function(t,e,i){this.storage.save(e,i,t)},o.prototype.remove=function(t,e){this.storage.remove(t,e)},o.prototype.removeAll=function(t){this.storage.drop(t)},o.prototype.getCount=function(t){var e={active:0,completed:0,total:0};this.storage.findAll(function(i){i.forEach(function(t){t.completed?e.completed++:e.active++,e.total++}),t(e)})}},function(t,e,i){"use strict";function o(t,e){if(e=e||function(){},this._dbName=t,!r[t]){var i={todos:[]};r[t]=JSON.stringify(i)}e.call(this,JSON.parse(r[t])),this.subscribers=[]}var n=i(0),r=i(4);i.n(r);e.a=o,o.prototype.subscribe=function(t){var e=this;return this.subscribers.push(t),function(){return i.i(n.f)(e.subscribers,t)}},o.prototype._notify=function(){this.subscribers.forEach(function(t){return t()})},o.prototype.find=function(t,e){if(e){var i=JSON.parse(r[this._dbName]).todos;e.call(this,i.filter(function(e){for(var i in t)if(t[i]!==e[i])return!1;return!0}))}},o.prototype.findAll=function(t){t=t||function(){},t.call(this,JSON.parse(r[this._dbName]).todos)},o.prototype.save=function(t,e,i){var o=JSON.parse(r[this._dbName]),n=o.todos;if(e=e||function(){},i){for(var c=0;c<n.length;c++)if(n[c].id===i){for(var l in t)n[c][l]=t[l];break}r[this._dbName]=JSON.stringify(o),e.call(this,JSON.parse(r[this._dbName]).todos)}else t.id=(new Date).getTime(),n.push(t),r[this._dbName]=JSON.stringify(o),e.call(this,[t]);this._notify()},o.prototype.remove=function(t,e){for(var i=JSON.parse(r[this._dbName]),o=i.todos,n=0;n<o.length;n++)if(o[n].id===t){o.splice(n,1);break}r[this._dbName]=JSON.stringify(i),e.call(this,JSON.parse(r[this._dbName]).todos),this._notify()},o.prototype.drop=function(t){r[this._dbName]=JSON.stringify({todos:[]}),t.call(this,JSON.parse(r[this._dbName]).todos),this._notify()}},function(t,e,i){"use strict";function o(){this.defaultTemplate='\n    <li data-id="{{id}}" class="{{completed}}">\n      <div class="view">\n        <input class="toggle" type="checkbox" {{checked}} />\n        <label>{{title}}</label>\n        <button class="destroy"></button>\n      </div>\n    </li>\n  '}e.a=o;var n={"&":"&amp;","<":"&lt;",">":"&gt;",'"':"&quot;","'":"&#x27;","`":"&#x60;"},r=function(t){return n[t]},c=/[&<>"'`]/g,l=new RegExp(c.source),a=function(t){return t&&l.test(t)?t.replace(c,r):t};o.prototype.show=function(t){var e,i,o="";for(e=0,i=t.length;e<i;e++){var n=this.defaultTemplate,r="",c="";t[e].completed&&(r="completed",c="checked"),n=n.replace("{{id}}",t[e].id),n=n.replace("{{title}}",a(t[e].title)),n=n.replace("{{completed}}",r),n=n.replace("{{checked}}",c),o+=n}return o},o.prototype.itemCounter=function(t){var e=1===t?"":"s";return"<strong>"+t+"</strong> item"+e+" left"},o.prototype.clearCompletedButton=function(t){return t>0?"Clear completed":""}},function(t,e,i){"use strict";function o(t){this.storage=new a.a(t),this.model=new l.a(this.storage),this.template=new d.a,this.view=new r.a(this.template),this.controller=new c.a(this.model,this.view)}function n(){s=new o("todos-vanillajs"),s.controller.setView(document.location.hash),u.forEach(function(t){return t()})}var r=i(9),c=i(3),l=i(5),a=i(6),d=i(7);i(0);i.d(e,"a",function(){return n});var s=void 0,u=[]},function(t,e,i){"use strict";function o(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function n(t){i.i(a.a)(".filters .selected").className="",i.i(a.a)('.filters [href="#/'+t+'"]').className="selected"}function r(t,e){var o=i.i(a.a)('[data-id="'+t+'"]');o&&(o.className=e?"completed":"",i.i(a.a)("input",o).checked=e)}function c(t,e){var o=i.i(a.a)('[data-id="'+t+'"]');if(o){o.className=o.className+" editing";var n=document.createElement("input");n.className="edit",o.appendChild(n),n.focus(),n.value=e}}function l(t){var e=i.i(a.e)(t,"li");return parseInt(e.dataset.id,10)}var a=i(0),d=function(){function t(t,e){for(var i=0;i<e.length;i++){var o=e[i];o.enumerable=o.enumerable||!1,o.configurable=!0,"value"in o&&(o.writable=!0),Object.defineProperty(t,o.key,o)}}return function(e,i,o){return i&&t(e.prototype,i),o&&t(e,o),e}}(),s=function(){function t(e){o(this,t),this.template=e,this.ENTER_KEY=13,this.ESCAPE_KEY=27,this.$todoList=i.i(a.a)(".todo-list"),this.$todoItemCounter=i.i(a.a)(".todo-count"),this.$clearCompleted=i.i(a.a)(".clear-completed"),this.$main=i.i(a.a)(".main"),this.$footer=i.i(a.a)(".footer"),this.$toggleAll=i.i(a.a)(".toggle-all"),this.$newTodo=i.i(a.a)(".new-todo")}return d(t,[{key:"_removeItem",value:function(t){var e=i.i(a.a)('[data-id="'+t+'"]');e&&this.$todoList.removeChild(e)}},{key:"_clearCompletedButton",value:function(t,e){this.$clearCompleted.innerHTML=this.template.clearCompletedButton(t),this.$clearCompleted.style.display=e?"block":"none"}},{key:"_editItemDone",value:function(t,e){var o=i.i(a.a)('[data-id="'+t+'"]');if(o){var n=i.i(a.a)("input.edit",o);o.removeChild(n),o.className=o.className.replace("editing",""),i.i(a.b)("label",o).forEach(function(t){t.textContent=e})}}},{key:"render",value:function(t,e){var i=this,o={showEntries:function(){i.$todoList.innerHTML=i.template.show(e)},removeItem:function(){i._removeItem(e)},updateElementCount:function(){i.$todoItemCounter.innerHTML=i.template.itemCounter(e)},clearCompletedButton:function(){i._clearCompletedButton(e.completed,e.visible)},contentBlockVisibility:function(){i.$main.style.display=i.$footer.style.display=e.visible?"block":"none"},toggleAll:function(){i.$toggleAll.checked=e.checked},setFilter:function(){n(e)},clearNewTodo:function(){i.$newTodo.value=""},elementComplete:function(){r(e.id,e.completed)},editItem:function(){c(e.id,e.title)},editItemDone:function(){i._editItemDone(e.id,e.title)}};o[t]()}},{key:"_bindItemEditDone",value:function(t){var e=this;i.i(a.c)(e.$todoList,"li .edit","blur",function(){this.dataset.iscanceled||t({id:l(this),title:this.value})}),i.i(a.c)(e.$todoList,"li .edit","keypress",function(t){t.keyCode===e.ENTER_KEY&&this.blur()})}},{key:"_bindItemEditCancel",value:function(t){var e=this;i.i(a.c)(e.$todoList,"li .edit","keyup",function(i){i.keyCode===e.ESCAPE_KEY&&(this.dataset.iscanceled=!0,this.blur(),t({id:l(this)}))})}},{key:"bind",value:function(t,e){var o=this;"newTodo"===t?i.i(a.d)(o.$newTodo,"change",function(){e(o.$newTodo.value)}):"removeCompleted"===t?i.i(a.d)(o.$clearCompleted,"click",function(){e()}):"toggleAll"===t?i.i(a.d)(o.$toggleAll,"click",function(){e({completed:this.checked})}):"itemEdit"===t?i.i(a.c)(o.$todoList,"li label","dblclick",function(){e({id:l(this)})}):"itemRemove"===t?i.i(a.c)(o.$todoList,".destroy","click",function(){e({id:l(this)})}):"itemToggle"===t?i.i(a.c)(o.$todoList,".toggle","click",function(){e({id:l(this),completed:this.checked})}):"itemEditDone"===t?o._bindItemEditDone(e):"itemEditCancel"===t&&o._bindItemEditCancel(e)}}]),t}();e.a=s},function(t,e){},function(t,e,i){"use strict";function o(){i.i(r.d)(window,"load",n.a),i.i(r.d)(window,"hashchange",n.a)}var n=i(2),r=i(0);"complete"===document.readyState;o()}],[11]);
-//# sourceMappingURL=bundle.app.73bcc5d3c1d07180f0e3.js.map
\ No newline at end of file
+//# sourceMappingURL=bundle.app.9debb1b0a94f14d0ebe9.js.map
\ No newline at end of file
@@ -1 +1 @@
-{"version":3,"sources":["webpack:///bundle.app.73bcc5d3c1d07180f0e3.js","webpack:///./helpers.js","webpack:///./app.js","webpack:///./controller.js","webpack:///./memory.js","webpack:///./model.js","webpack:///./store.js","webpack:///./template.js","webpack:///./todo.js","webpack:///./view.js","webpack:///./bootstrap.js"],"names":["webpackJsonp","module","exports","__webpack_require__","qs","selector","scope","document","querySelector","qsa","querySelectorAll","$on","target","type","callback","useCapture","addEventListener","$delegate","handler","dispatchEvent","event","targetElement","potentialElements","hasMatch","Array","prototype","indexOf","call","$parent","element","tagName","parentNode","toLowerCase","remove","array","thing","index","splice","d","NodeList","forEach","onLoad","i","__WEBPACK_IMPORTED_MODULE_3__todo__","__WEBPACK_IMPORTED_MODULE_0_todomvc_app_css_index_css__","__WEBPACK_IMPORTED_MODULE_1__app_css__","n","Controller","model","view","that","this","bind","title","addItem","item","editItem","id","editItemSave","editItemCancel","removeItem","toggleComplete","completed","removeCompletedItems","status","toggleAll","setView","locationHash","route","split","page","_updateFilterState","showAll","read","data","render","showActive","showCompleted","trim","create","_filter","update","silent","_updateCount","getCount","todos","active","visible","checked","total","force","activeRoute","_activeRoute","charAt","toUpperCase","substr","_lastActiveRoute","currentPage","_typeof","Symbol","iterator","obj","constructor","root","localStorageMemory","cache","length","getItem","key","setItem","value","hasOwnProperty","Object","keys","clear","Model","storage","newItem","save","query","queryType","findAll","parseInt","find","removeAll","drop","todo","Store","name","_dbName","__WEBPACK_IMPORTED_MODULE_1__memory__","JSON","stringify","parse","subscribers","__WEBPACK_IMPORTED_MODULE_0__helpers__","subscribe","subscriber","_this","push","_notify","s","filter","q","updateData","Date","getTime","Template","defaultTemplate","htmlEscapes","&","<",">","\"","'","`","escapeHtmlChar","chr","reUnescapedHtml","reHasUnescapedHtml","RegExp","source","escape","string","test","replace","show","l","template","itemCounter","activeTodos","plural","clearCompletedButton","completedTodos","Todo","__WEBPACK_IMPORTED_MODULE_3__store__","__WEBPACK_IMPORTED_MODULE_2__model__","__WEBPACK_IMPORTED_MODULE_4__template__","__WEBPACK_IMPORTED_MODULE_0__view__","controller","__WEBPACK_IMPORTED_MODULE_1__controller__","updateTodo","location","hash","_classCallCheck","instance","Constructor","TypeError","_setFilter","className","_elementComplete","listItem","_editItem","input","createElement","appendChild","focus","_itemId","li","dataset","_createClass","defineProperties","props","descriptor","enumerable","configurable","writable","defineProperty","protoProps","staticProps","View","ENTER_KEY","ESCAPE_KEY","$todoList","$todoItemCounter","$clearCompleted","$main","$footer","$toggleAll","$newTodo","elem","removeChild","completedCount","innerHTML","style","display","label","textContent","viewCmd","parameter","viewCommands","showEntries","_removeItem","updateElementCount","_clearCompletedButton","contentBlockVisibility","setFilter","clearNewTodo","elementComplete","editItemDone","_editItemDone","iscanceled","keyCode","blur","_bindItemEditDone","_bindItemEditCancel","bootstrap","__WEBPACK_IMPORTED_MODULE_1__helpers__","window","__WEBPACK_IMPORTED_MODULE_0__app__","readyState"],"mappings":"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","file":"bundle.app.73bcc5d3c1d07180f0e3.js","sourcesContent":["webpackJsonp([0,2],[\n/* 0 */\n/***/ function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n/* harmony export */ __webpack_require__.d(exports, \"a\", function() { return qs; });\n/* harmony export */ __webpack_require__.d(exports, \"b\", function() { return qsa; });\n/* harmony export */ __webpack_require__.d(exports, \"d\", function() { return $on; });\n/* harmony export */ __webpack_require__.d(exports, \"c\", function() { return $delegate; });\n/* harmony export */ __webpack_require__.d(exports, \"e\", function() { return $parent; });\n/* harmony export */ __webpack_require__.d(exports, \"f\", function() { return remove; });\n\n// Get element(s) by CSS selector:\nfunction qs(selector, scope) {\n  return (scope || document).querySelector(selector);\n}\n\nfunction qsa(selector, scope) {\n  return (scope || document).querySelectorAll(selector);\n}\n\n// addEventListener wrapper:\nfunction $on(target, type, callback, useCapture) {\n  target.addEventListener(type, callback, !!useCapture);\n}\n\n// Attach a handler to event for all elements that match the selector,\n// now or in the future, based on a root element\nfunction $delegate(target, selector, type, handler) {\n  // https://developer.mozilla.org/en-US/docs/Web/Events/blur\n  var useCapture = type === 'blur' || type === 'focus';\n  $on(target, type, dispatchEvent, useCapture);\n\n  function dispatchEvent(event) {\n    var targetElement = event.target;\n    var potentialElements = qsa(selector, target);\n    var hasMatch = Array.prototype.indexOf.call(potentialElements, targetElement) >= 0;\n\n    if (hasMatch) {\n      handler.call(targetElement, event);\n    }\n  }\n}\n\n// Find the element's parent with the given tag name:\n// $parent(qs('a'), 'div');\nfunction $parent(element, tagName) {\n  if (!element.parentNode) {\n    return undefined;\n  }\n  if (element.parentNode.tagName.toLowerCase() === tagName.toLowerCase()) {\n    return element.parentNode;\n  }\n  return $parent(element.parentNode, tagName);\n}\n\n// removes an element from an array\n// const x = [1,2,3]\n// remove(x, 2)\n// x ~== [1,3]\nfunction remove(array, thing) {\n  var index = array.indexOf(thing);\n  if (index === -1) {\n    return array;\n  }\n  array.splice(index, 1);\n}\n\n// Allow for looping on nodes by chaining:\n// qsa('.foo').forEach(function () {})\nNodeList.prototype.forEach = Array.prototype.forEach;\n\n/***/ },\n/* 1 */,\n/* 2 */\n/***/ function(module, exports, __webpack_require__) {\n\n\"use strict\";\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_todomvc_app_css_index_css__ = __webpack_require__(1);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_todomvc_app_css_index_css___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_0_todomvc_app_css_index_css__);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__app_css__ = __webpack_require__(10);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__app_css___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_1__app_css__);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__helpers__ = __webpack_require__(0);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__todo__ = __webpack_require__(8);\n/* harmony export */ exports[\"a\"] = onLoad;\n\n\n\n\n\nfunction onLoad() {\n  // eslint-disable-line import/prefer-default-export\n  __webpack_require__.i(__WEBPACK_IMPORTED_MODULE_3__todo__[\"a\" /* updateTodo */])();\n}\n\n/***/ },\n/* 3 */\n/***/ function(module, exports, __webpack_require__) {\n\n\"use strict\";\n/* harmony default export */ exports[\"a\"] = Controller;\n\n/**\n* Takes a model and view and acts as the controller between them\n*\n* @constructor\n* @param {object} model The model instance\n* @param {object} view The view instance\n*/\nfunction Controller(model, view) {\n  var that = this;\n  that.model = model;\n  that.view = view;\n\n  that.view.bind('newTodo', function (title) {\n    that.addItem(title);\n  });\n\n  that.view.bind('itemEdit', function (item) {\n    that.editItem(item.id);\n  });\n\n  that.view.bind('itemEditDone', function (item) {\n    that.editItemSave(item.id, item.title);\n  });\n\n  that.view.bind('itemEditCancel', function (item) {\n    that.editItemCancel(item.id);\n  });\n\n  that.view.bind('itemRemove', function (item) {\n    that.removeItem(item.id);\n  });\n\n  that.view.bind('itemToggle', function (item) {\n    that.toggleComplete(item.id, item.completed);\n  });\n\n  that.view.bind('removeCompleted', function () {\n    that.removeCompletedItems();\n  });\n\n  that.view.bind('toggleAll', function (status) {\n    that.toggleAll(status.completed);\n  });\n}\n\n/**\n* Loads and initialises the view\n*\n* @param {string} '' | 'active' | 'completed'\n*/\nController.prototype.setView = function (locationHash) {\n  var route = locationHash.split('/')[1];\n  var page = route || '';\n  this._updateFilterState(page);\n};\n\n/**\n* An event to fire on load. Will get all items and display them in the\n* todo-list\n*/\nController.prototype.showAll = function () {\n  var that = this;\n  that.model.read(function (data) {\n    that.view.render('showEntries', data);\n  });\n};\n\n/**\n* Renders all active tasks\n*/\nController.prototype.showActive = function () {\n  var that = this;\n  that.model.read({ completed: false }, function (data) {\n    that.view.render('showEntries', data);\n  });\n};\n\n/**\n* Renders all completed tasks\n*/\nController.prototype.showCompleted = function () {\n  var that = this;\n  that.model.read({ completed: true }, function (data) {\n    that.view.render('showEntries', data);\n  });\n};\n\n/**\n* An event to fire whenever you want to add an item. Simply pass in the event\n* object and it'll handle the DOM insertion and saving of the new item.\n*/\nController.prototype.addItem = function (title) {\n  var that = this;\n\n  if (title.trim() === '') {\n    return;\n  }\n\n  that.model.create(title, function () {\n    that.view.render('clearNewTodo');\n    that._filter(true);\n  });\n};\n\n/*\n* Triggers the item editing mode.\n*/\nController.prototype.editItem = function (id) {\n  var that = this;\n  that.model.read(id, function (data) {\n    that.view.render('editItem', { id: id, title: data[0].title });\n  });\n};\n\n/*\n* Finishes the item editing mode successfully.\n*/\nController.prototype.editItemSave = function (id, title) {\n  var that = this;\n  if (title.trim()) {\n    that.model.update(id, { title: title }, function () {\n      that.view.render('editItemDone', { id: id, title: title });\n    });\n  } else {\n    that.removeItem(id);\n  }\n};\n\n/*\n* Cancels the item editing mode.\n*/\nController.prototype.editItemCancel = function (id) {\n  var that = this;\n  that.model.read(id, function (data) {\n    that.view.render('editItemDone', { id: id, title: data[0].title });\n  });\n};\n\n/**\n* By giving it an ID it'll find the DOM element matching that ID,\n* remove it from the DOM and also remove it from storage.\n*\n* @param {number} id The ID of the item to remove from the DOM and\n* storage\n*/\nController.prototype.removeItem = function (id) {\n  var that = this;\n  that.model.remove(id, function () {\n    that.view.render('removeItem', id);\n  });\n\n  that._filter();\n};\n\n/**\n* Will remove all completed items from the DOM and storage.\n*/\nController.prototype.removeCompletedItems = function () {\n  var that = this;\n  that.model.read({ completed: true }, function (data) {\n    data.forEach(function (item) {\n      that.removeItem(item.id);\n    });\n  });\n\n  that._filter();\n};\n\n/**\n* Give it an ID of a model and a checkbox and it will update the item\n* in storage based on the checkbox's state.\n*\n* @param {number} id The ID of the element to complete or uncomplete\n* @param {object} checkbox The checkbox to check the state of complete\n*                          or not\n* @param {boolean|undefined} silent Prevent re-filtering the todo items\n*/\nController.prototype.toggleComplete = function (id, completed, silent) {\n  var that = this;\n  that.model.update(id, { completed: completed }, function () {\n    that.view.render('elementComplete', {\n      id: id,\n      completed: completed\n    });\n  });\n\n  if (!silent) {\n    that._filter();\n  }\n};\n\n/**\n* Will toggle ALL checkboxes' on/off state and completeness of models.\n* Just pass in the event object.\n*/\nController.prototype.toggleAll = function (completed) {\n  var that = this;\n  that.model.read({ completed: !completed }, function (data) {\n    data.forEach(function (item) {\n      that.toggleComplete(item.id, completed, true);\n    });\n  });\n\n  that._filter();\n};\n\n/**\n* Updates the pieces of the page which change depending on the remaining\n* number of todos.\n*/\nController.prototype._updateCount = function () {\n  var that = this;\n  that.model.getCount(function (todos) {\n    that.view.render('updateElementCount', todos.active);\n    that.view.render('clearCompletedButton', {\n      completed: todos.completed,\n      visible: todos.completed > 0\n    });\n\n    that.view.render('toggleAll', { checked: todos.completed === todos.total });\n    that.view.render('contentBlockVisibility', { visible: todos.total > 0 });\n  });\n};\n\n/**\n* Re-filters the todo items, based on the active route.\n* @param {boolean|undefined} force  forces a re-painting of todo items.\n*/\nController.prototype._filter = function (force) {\n  var activeRoute = this._activeRoute.charAt(0).toUpperCase() + this._activeRoute.substr(1);\n\n  // Update the elements on the page, which change with each completed todo\n  this._updateCount();\n\n  // If the last active route isn't \"All\", or we're switching routes, we\n  // re-create the todo item elements, calling:\n  //   this.show[All|Active|Completed]();\n  if (force || this._lastActiveRoute !== 'All' || this._lastActiveRoute !== activeRoute) {\n    this['show' + activeRoute]();\n  }\n\n  this._lastActiveRoute = activeRoute;\n};\n\n/**\n* Simply updates the filter nav's selected states\n*/\nController.prototype._updateFilterState = function (currentPage) {\n  // Store a reference to the active route, allowing us to re-filter todo\n  // items as they are marked complete or incomplete.\n  currentPage = currentPage.split('?')[0];\n  this._activeRoute = currentPage;\n\n  if (currentPage === '') {\n    this._activeRoute = 'All';\n  }\n\n  this._filter();\n\n  this.view.render('setFilter', currentPage);\n};\n\n/***/ },\n/* 4 */\n/***/ function(module, exports, __webpack_require__) {\n\nvar _typeof = typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; };\n\n(function (root) {\n  var localStorageMemory = {};\n  var cache = {};\n\n  /**\n   * number of stored items.\n   */\n  localStorageMemory.length = 0;\n\n  /**\n   * returns item for passed key, or null\n   *\n   * @para {String} key\n   *       name of item to be returned\n   * @returns {String|null}\n   */\n  localStorageMemory.getItem = function (key) {\n    return cache[key] || null;\n  };\n\n  /**\n   * sets item for key to passed value, as String\n   *\n   * @para {String} key\n   *       name of item to be set\n   * @para {String} value\n   *       value, will always be turned into a String\n   * @returns {undefined}\n   */\n  localStorageMemory.setItem = function (key, value) {\n    if (typeof value === 'undefined') {\n      localStorageMemory.removeItem(key);\n    } else {\n      if (!cache.hasOwnProperty(key)) {\n        localStorageMemory.length++;\n      }\n\n      cache[key] = '' + value;\n    }\n  };\n\n  /**\n   * removes item for passed key\n   *\n   * @para {String} key\n   *       name of item to be removed\n   * @returns {undefined}\n   */\n  localStorageMemory.removeItem = function (key) {\n    if (cache.hasOwnProperty(key)) {\n      delete cache[key];\n      localStorageMemory.length--;\n    }\n  };\n\n  /**\n   * returns name of key at passed index\n   *\n   * @para {Number} index\n   *       Position for key to be returned (starts at 0)\n   * @returns {String|null}\n   */\n  localStorageMemory.key = function (index) {\n    return Object.keys(cache)[index] || null;\n  };\n\n  /**\n   * removes all stored items and sets length to 0\n   *\n   * @returns {undefined}\n   */\n  localStorageMemory.clear = function () {\n    cache = {};\n    localStorageMemory.length = 0;\n  };\n\n  if (( false ? 'undefined' : _typeof(exports)) === 'object') {\n    module.exports = localStorageMemory;\n  } else {\n    root.localStorageMemory = localStorageMemory;\n  }\n})(this);\n\n/***/ },\n/* 5 */\n/***/ function(module, exports, __webpack_require__) {\n\n\"use strict\";\nvar _typeof = typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; };\n\n/* harmony default export */ exports[\"a\"] = Model;\n\n/**\n* Creates a new Model instance and hooks up the storage.\n*\n* @constructor\n* @param {object} storage A reference to the client side storage class\n*/\nfunction Model(storage) {\n  this.storage = storage;\n}\n\n/**\n* Creates a new todo model\n*\n* @param {string} [title] The title of the task\n* @param {function} [callback] The callback to fire after the model is created\n*/\nModel.prototype.create = function (title, callback) {\n  title = title || '';\n  callback = callback || function () {};\n\n  var newItem = {\n    title: title.trim(),\n    completed: false\n  };\n\n  this.storage.save(newItem, callback);\n};\n\n/**\n * Finds and returns a model in storage. If no query is given it'll simply\n * return everything. If you pass in a string or number it'll look that up as\n * the ID of the model to find. Lastly, you can pass it an object to match against.\n *\n * @param {string|number|object} [query] A query to match models against\n * @param {function} [callback] The callback to fire after the model is found\n *\n * @example\n * model.read(1, func); // Will find the model with an ID of 1\n * model.read('1'); // Same as above\n * //Below will find a model with foo equalling bar and hello equalling world.\n * model.read({ foo: 'bar', hello: 'world' });\n */\nModel.prototype.read = function (query, callback) {\n  var queryType = typeof query === 'undefined' ? 'undefined' : _typeof(query);\n  callback = callback || function () {};\n\n  if (queryType === 'function') {\n    callback = query;\n    return this.storage.findAll(callback);\n  } else if (queryType === 'string' || queryType === 'number') {\n    query = parseInt(query, 10);\n    this.storage.find({ id: query }, callback);\n  } else {\n    this.storage.find(query, callback);\n  }\n  return undefined;\n};\n\n/**\n* Updates a model by giving it an ID, data to update, and a callback to fire when\n* the update is complete.\n*\n* @param {number} id The id of the model to update\n* @param {object} data The properties to update and their new value\n* @param {function} callback The callback to fire when the update is complete.\n*/\nModel.prototype.update = function (id, data, callback) {\n  this.storage.save(data, callback, id);\n};\n\n/**\n* Removes a model from storage\n*\n* @param {number} id The ID of the model to remove\n* @param {function} callback The callback to fire when the removal is complete.\n*/\nModel.prototype.remove = function (id, callback) {\n  this.storage.remove(id, callback);\n};\n\n/**\n* WARNING: Will remove ALL data from storage.\n*\n* @param {function} callback The callback to fire when the storage is wiped.\n*/\nModel.prototype.removeAll = function (callback) {\n  this.storage.drop(callback);\n};\n\n/**\n* Returns a count of all todos\n*/\nModel.prototype.getCount = function (callback) {\n  var todos = {\n    active: 0,\n    completed: 0,\n    total: 0\n  };\n\n  this.storage.findAll(function (data) {\n    data.forEach(function (todo) {\n      if (todo.completed) {\n        todos.completed++;\n      } else {\n        todos.active++;\n      }\n\n      todos.total++;\n    });\n    callback(todos);\n  });\n};\n\n/***/ },\n/* 6 */\n/***/ function(module, exports, __webpack_require__) {\n\n\"use strict\";\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__helpers__ = __webpack_require__(0);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__memory__ = __webpack_require__(4);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__memory___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_1__memory__);\n\n\n/* harmony default export */ exports[\"a\"] = Store;\n\n/**\n * Creates a new client side storage object and will create an empty\n * collection if no collection already exists.\n *\n * @param {string} name The name of our DB we want to use\n * @param {function} callback Our fake DB uses callbacks because in\n * real life you probably would be making AJAX calls\n */\nfunction Store(name, callback) {\n  callback = callback || function () {};\n\n  this._dbName = name;\n\n  if (!__WEBPACK_IMPORTED_MODULE_1__memory__[name]) {\n    var data = {\n      todos: []\n    };\n\n    __WEBPACK_IMPORTED_MODULE_1__memory__[name] = JSON.stringify(data);\n  }\n\n  callback.call(this, JSON.parse(__WEBPACK_IMPORTED_MODULE_1__memory__[name]));\n  this.subscribers = [];\n}\n\nStore.prototype.subscribe = function (subscriber) {\n  var _this = this;\n\n  this.subscribers.push(subscriber);\n  return function () {\n    return __webpack_require__.i(__WEBPACK_IMPORTED_MODULE_0__helpers__[\"f\" /* remove */])(_this.subscribers, subscriber);\n  };\n};\n\nStore.prototype._notify = function () {\n  this.subscribers.forEach(function (s) {\n    return s();\n  });\n};\n\n/**\n* Finds items based on a query given as a JS object\n*\n* @param {object} query The query to match against (i.e. {foo: 'bar'})\n* @param {function} callback   The callback to fire when the query has\n* completed running\n*\n* @example\n* db.find({foo: 'bar', hello: 'world'}, function (data) {\n*   // data will return any items that have foo: bar and\n*   // hello: world in their properties\n* });\n*/\nStore.prototype.find = function (query, callback) {\n  if (!callback) {\n    return;\n  }\n\n  var todos = JSON.parse(__WEBPACK_IMPORTED_MODULE_1__memory__[this._dbName]).todos;\n\n  callback.call(this, todos.filter(function (todo) {\n    for (var q in query) {\n      if (query[q] !== todo[q]) {\n        return false;\n      }\n    }\n    return true;\n  }));\n};\n\n/**\n* Will retrieve all data from the collection\n*\n* @param {function} callback The callback to fire upon retrieving data\n*/\nStore.prototype.findAll = function (callback) {\n  callback = callback || function () {};\n  callback.call(this, JSON.parse(__WEBPACK_IMPORTED_MODULE_1__memory__[this._dbName]).todos);\n};\n\n/**\n* Will save the given data to the DB. If no item exists it will create a new\n* item, otherwise it'll simply update an existing item's properties\n*\n* @param {object} updateData The data to save back into the DB\n* @param {function} callback The callback to fire after saving\n* @param {number} id An optional param to enter an ID of an item to update\n*/\nStore.prototype.save = function (updateData, callback, id) {\n  var data = JSON.parse(__WEBPACK_IMPORTED_MODULE_1__memory__[this._dbName]);\n  var todos = data.todos;\n\n  callback = callback || function () {};\n\n  // If an ID was actually given, find the item and update each property\n  if (id) {\n    for (var i = 0; i < todos.length; i++) {\n      if (todos[i].id === id) {\n        for (var key in updateData) {\n          // eslint-disable-line guard-for-in\n          todos[i][key] = updateData[key];\n        }\n        break;\n      }\n    }\n\n    __WEBPACK_IMPORTED_MODULE_1__memory__[this._dbName] = JSON.stringify(data);\n    callback.call(this, JSON.parse(__WEBPACK_IMPORTED_MODULE_1__memory__[this._dbName]).todos);\n  } else {\n    // Generate an ID\n    updateData.id = new Date().getTime();\n\n    todos.push(updateData);\n    __WEBPACK_IMPORTED_MODULE_1__memory__[this._dbName] = JSON.stringify(data);\n    callback.call(this, [updateData]);\n  }\n  this._notify();\n};\n\n/**\n* Will remove an item from the Store based on its ID\n*\n* @param {number} id The ID of the item you want to remove\n* @param {function} callback The callback to fire after saving\n*/\nStore.prototype.remove = function (id, callback) {\n  var data = JSON.parse(__WEBPACK_IMPORTED_MODULE_1__memory__[this._dbName]);\n  var todos = data.todos;\n\n  for (var i = 0; i < todos.length; i++) {\n    if (todos[i].id === id) {\n      todos.splice(i, 1);\n      break;\n    }\n  }\n\n  __WEBPACK_IMPORTED_MODULE_1__memory__[this._dbName] = JSON.stringify(data);\n  callback.call(this, JSON.parse(__WEBPACK_IMPORTED_MODULE_1__memory__[this._dbName]).todos);\n  this._notify();\n};\n\n/**\n* Will drop all storage and start fresh\n*\n* @param {function} callback The callback to fire after dropping the data\n*/\nStore.prototype.drop = function (callback) {\n  __WEBPACK_IMPORTED_MODULE_1__memory__[this._dbName] = JSON.stringify({ todos: [] });\n  callback.call(this, JSON.parse(__WEBPACK_IMPORTED_MODULE_1__memory__[this._dbName]).todos);\n  this._notify();\n};\n\n/***/ },\n/* 7 */\n/***/ function(module, exports, __webpack_require__) {\n\n\"use strict\";\n/* harmony default export */ exports[\"a\"] = Template;\n\nvar htmlEscapes = {\n  '&': '&amp;',\n  '<': '&lt;',\n  '>': '&gt;',\n  '\"': '&quot;',\n  '\\'': '&#x27;',\n  '`': '&#x60;'\n};\n\nvar escapeHtmlChar = function escapeHtmlChar(chr) {\n  return htmlEscapes[chr];\n};\n\nvar reUnescapedHtml = /[&<>\"'`]/g;\nvar reHasUnescapedHtml = new RegExp(reUnescapedHtml.source);\n\nvar escape = function escape(string) {\n  if (string && reHasUnescapedHtml.test(string)) {\n    return string.replace(reUnescapedHtml, escapeHtmlChar);\n  } else {\n    return string;\n  }\n};\n\n/**\n* Sets up defaults for all the Template methods such as a default template\n*\n* @constructor\n*/\nfunction Template() {\n  this.defaultTemplate = '\\n    <li data-id=\"{{id}}\" class=\"{{completed}}\">\\n      <div class=\"view\">\\n        <input class=\"toggle\" type=\"checkbox\" {{checked}} />\\n        <label>{{title}}</label>\\n        <button class=\"destroy\"></button>\\n      </div>\\n    </li>\\n  ';\n}\n\n/**\n * Creates an <li> HTML string and returns it for placement in your app.\n *\n * NOTE: In real life you should be using a templating engine such as Mustache\n * or Handlebars, however, this is a vanilla JS example.\n *\n * @param {object} data The object containing keys you want to find in the\n *                      template to replace.\n * @returns {string} HTML String of an <li> element\n *\n * @example\n * view.show({\n *  id: 1,\n *  title: \"Hello World\",\n *  completed: 0,\n * });\n */\nTemplate.prototype.show = function (data) {\n  var i, l;\n  var view = '';\n\n  for (i = 0, l = data.length; i < l; i++) {\n    var template = this.defaultTemplate;\n    var completed = '';\n    var checked = '';\n\n    if (data[i].completed) {\n      completed = 'completed';\n      checked = 'checked';\n    }\n\n    template = template.replace('{{id}}', data[i].id);\n    template = template.replace('{{title}}', escape(data[i].title));\n    template = template.replace('{{completed}}', completed);\n    template = template.replace('{{checked}}', checked);\n\n    view = view + template;\n  }\n\n  return view;\n};\n\n/**\n * Displays a counter of how many to dos are left to complete\n *\n * @param {number} activeTodos The number of active todos.\n * @returns {string} String containing the count\n */\nTemplate.prototype.itemCounter = function (activeTodos) {\n  var plural = activeTodos === 1 ? '' : 's';\n\n  return '<strong>' + activeTodos + '</strong> item' + plural + ' left';\n};\n\n/**\n * Updates the text within the \"Clear completed\" button\n *\n * @param  {[type]} completedTodos The number of completed todos.\n * @returns {string} String containing the count\n */\nTemplate.prototype.clearCompletedButton = function (completedTodos) {\n  if (completedTodos > 0) {\n    return 'Clear completed';\n  } else {\n    return '';\n  }\n};\n\n/***/ },\n/* 8 */\n/***/ function(module, exports, __webpack_require__) {\n\n\"use strict\";\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__view__ = __webpack_require__(9);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__controller__ = __webpack_require__(3);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__model__ = __webpack_require__(5);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__store__ = __webpack_require__(6);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_4__template__ = __webpack_require__(7);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_5__helpers__ = __webpack_require__(0);\n\n/* harmony export */ __webpack_require__.d(exports, \"a\", function() { return updateTodo; });/* unused harmony export getTodo *//* unused harmony export subscribe */\n\n\n\n\n\n\n\n\nvar todo = void 0;\nvar subscribers = [];\n\n/**\n * Sets up a brand new Todo list.\n *\n * @param {string} name The name of your new to do list.\n */\nfunction Todo(name) {\n  this.storage = new __WEBPACK_IMPORTED_MODULE_3__store__[\"a\" /* default */](name);\n  this.model = new __WEBPACK_IMPORTED_MODULE_2__model__[\"a\" /* default */](this.storage);\n  this.template = new __WEBPACK_IMPORTED_MODULE_4__template__[\"a\" /* default */]();\n  this.view = new __WEBPACK_IMPORTED_MODULE_0__view__[\"a\" /* default */](this.template);\n  this.controller = new __WEBPACK_IMPORTED_MODULE_1__controller__[\"a\" /* default */](this.model, this.view);\n}\n\nfunction updateTodo() {\n  todo = new Todo('todos-vanillajs');\n  todo.controller.setView(document.location.hash);\n  subscribers.forEach(function (s) {\n    return s();\n  });\n}\n\nfunction getTodo() {\n  return todo;\n}\n\nfunction subscribe(cb) {\n  subscribers.push(cb);\n  return function unsubscribe() {\n    __webpack_require__.i(__WEBPACK_IMPORTED_MODULE_5__helpers__[\"f\" /* remove */])(subscribers, cb);\n  };\n}\n\n/***/ },\n/* 9 */\n/***/ function(module, exports, __webpack_require__) {\n\n\"use strict\";\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__helpers__ = __webpack_require__(0);\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\n/* eslint no-invalid-this: 0, complexity:[2, 9] */\n\n\n/**\n * View that abstracts away the browser's DOM completely.\n * It has two simple entry points:\n *\n *   - bind(eventName, handler)\n *     Takes a todo application event and registers the handler\n *   - render(command, parameterObject)\n *     Renders the given command with the options\n */\n\nvar View = function () {\n  function View(template) {\n    _classCallCheck(this, View);\n\n    this.template = template;\n\n    this.ENTER_KEY = 13;\n    this.ESCAPE_KEY = 27;\n\n    this.$todoList = __webpack_require__.i(__WEBPACK_IMPORTED_MODULE_0__helpers__[\"a\" /* qs */])('.todo-list');\n    this.$todoItemCounter = __webpack_require__.i(__WEBPACK_IMPORTED_MODULE_0__helpers__[\"a\" /* qs */])('.todo-count');\n    this.$clearCompleted = __webpack_require__.i(__WEBPACK_IMPORTED_MODULE_0__helpers__[\"a\" /* qs */])('.clear-completed');\n    this.$main = __webpack_require__.i(__WEBPACK_IMPORTED_MODULE_0__helpers__[\"a\" /* qs */])('.main');\n    this.$footer = __webpack_require__.i(__WEBPACK_IMPORTED_MODULE_0__helpers__[\"a\" /* qs */])('.footer');\n    this.$toggleAll = __webpack_require__.i(__WEBPACK_IMPORTED_MODULE_0__helpers__[\"a\" /* qs */])('.toggle-all');\n    this.$newTodo = __webpack_require__.i(__WEBPACK_IMPORTED_MODULE_0__helpers__[\"a\" /* qs */])('.new-todo');\n  }\n\n  _createClass(View, [{\n    key: '_removeItem',\n    value: function _removeItem(id) {\n      var elem = __webpack_require__.i(__WEBPACK_IMPORTED_MODULE_0__helpers__[\"a\" /* qs */])('[data-id=\"' + id + '\"]');\n\n      if (elem) {\n        this.$todoList.removeChild(elem);\n      }\n    }\n  }, {\n    key: '_clearCompletedButton',\n    value: function _clearCompletedButton(completedCount, visible) {\n      this.$clearCompleted.innerHTML = this.template.clearCompletedButton(completedCount);\n      this.$clearCompleted.style.display = visible ? 'block' : 'none';\n    }\n  }, {\n    key: '_editItemDone',\n    value: function _editItemDone(id, title) {\n      var listItem = __webpack_require__.i(__WEBPACK_IMPORTED_MODULE_0__helpers__[\"a\" /* qs */])('[data-id=\"' + id + '\"]');\n\n      if (!listItem) {\n        return;\n      }\n\n      var input = __webpack_require__.i(__WEBPACK_IMPORTED_MODULE_0__helpers__[\"a\" /* qs */])('input.edit', listItem);\n      listItem.removeChild(input);\n\n      listItem.className = listItem.className.replace('editing', '');\n\n      __webpack_require__.i(__WEBPACK_IMPORTED_MODULE_0__helpers__[\"b\" /* qsa */])('label', listItem).forEach(function (label) {\n        label.textContent = title;\n      });\n    }\n  }, {\n    key: 'render',\n    value: function render(viewCmd, parameter) {\n      var that = this;\n      var viewCommands = {\n        showEntries: function showEntries() {\n          that.$todoList.innerHTML = that.template.show(parameter);\n        },\n        removeItem: function removeItem() {\n          that._removeItem(parameter);\n        },\n        updateElementCount: function updateElementCount() {\n          that.$todoItemCounter.innerHTML = that.template.itemCounter(parameter);\n        },\n        clearCompletedButton: function clearCompletedButton() {\n          that._clearCompletedButton(parameter.completed, parameter.visible);\n        },\n        contentBlockVisibility: function contentBlockVisibility() {\n          that.$main.style.display = that.$footer.style.display = parameter.visible ? 'block' : 'none';\n        },\n        toggleAll: function toggleAll() {\n          that.$toggleAll.checked = parameter.checked;\n        },\n        setFilter: function setFilter() {\n          _setFilter(parameter);\n        },\n        clearNewTodo: function clearNewTodo() {\n          that.$newTodo.value = '';\n        },\n        elementComplete: function elementComplete() {\n          _elementComplete(parameter.id, parameter.completed);\n        },\n        editItem: function editItem() {\n          _editItem(parameter.id, parameter.title);\n        },\n        editItemDone: function editItemDone() {\n          that._editItemDone(parameter.id, parameter.title);\n        }\n      };\n\n      viewCommands[viewCmd]();\n    }\n  }, {\n    key: '_bindItemEditDone',\n    value: function _bindItemEditDone(handler) {\n      var that = this;\n      __webpack_require__.i(__WEBPACK_IMPORTED_MODULE_0__helpers__[\"c\" /* $delegate */])(that.$todoList, 'li .edit', 'blur', function () {\n        if (!this.dataset.iscanceled) {\n          handler({\n            id: _itemId(this),\n            title: this.value\n          });\n        }\n      });\n\n      __webpack_require__.i(__WEBPACK_IMPORTED_MODULE_0__helpers__[\"c\" /* $delegate */])(that.$todoList, 'li .edit', 'keypress', function (event) {\n        if (event.keyCode === that.ENTER_KEY) {\n          // Remove the cursor from the input when you hit enter just like if it\n          // were a real form\n          this.blur();\n        }\n      });\n    }\n  }, {\n    key: '_bindItemEditCancel',\n    value: function _bindItemEditCancel(handler) {\n      var that = this;\n      __webpack_require__.i(__WEBPACK_IMPORTED_MODULE_0__helpers__[\"c\" /* $delegate */])(that.$todoList, 'li .edit', 'keyup', function (event) {\n        if (event.keyCode === that.ESCAPE_KEY) {\n          this.dataset.iscanceled = true;\n          this.blur();\n\n          handler({ id: _itemId(this) });\n        }\n      });\n    }\n  }, {\n    key: 'bind',\n    value: function bind(event, handler) {\n      var that = this;\n      if (event === 'newTodo') {\n        __webpack_require__.i(__WEBPACK_IMPORTED_MODULE_0__helpers__[\"d\" /* $on */])(that.$newTodo, 'change', function () {\n          handler(that.$newTodo.value);\n        });\n      } else if (event === 'removeCompleted') {\n        __webpack_require__.i(__WEBPACK_IMPORTED_MODULE_0__helpers__[\"d\" /* $on */])(that.$clearCompleted, 'click', function () {\n          handler();\n        });\n      } else if (event === 'toggleAll') {\n        __webpack_require__.i(__WEBPACK_IMPORTED_MODULE_0__helpers__[\"d\" /* $on */])(that.$toggleAll, 'click', function () {\n          handler({ completed: this.checked });\n        });\n      } else if (event === 'itemEdit') {\n        __webpack_require__.i(__WEBPACK_IMPORTED_MODULE_0__helpers__[\"c\" /* $delegate */])(that.$todoList, 'li label', 'dblclick', function () {\n          handler({ id: _itemId(this) });\n        });\n      } else if (event === 'itemRemove') {\n        __webpack_require__.i(__WEBPACK_IMPORTED_MODULE_0__helpers__[\"c\" /* $delegate */])(that.$todoList, '.destroy', 'click', function () {\n          handler({ id: _itemId(this) });\n        });\n      } else if (event === 'itemToggle') {\n        __webpack_require__.i(__WEBPACK_IMPORTED_MODULE_0__helpers__[\"c\" /* $delegate */])(that.$todoList, '.toggle', 'click', function () {\n          handler({\n            id: _itemId(this),\n            completed: this.checked\n          });\n        });\n      } else if (event === 'itemEditDone') {\n        that._bindItemEditDone(handler);\n      } else if (event === 'itemEditCancel') {\n        that._bindItemEditCancel(handler);\n      }\n    }\n  }]);\n\n  return View;\n}();\n\n/* harmony default export */ exports[\"a\"] = View;\n\n\nfunction _setFilter(currentPage) {\n  __webpack_require__.i(__WEBPACK_IMPORTED_MODULE_0__helpers__[\"a\" /* qs */])('.filters .selected').className = '';\n  __webpack_require__.i(__WEBPACK_IMPORTED_MODULE_0__helpers__[\"a\" /* qs */])('.filters [href=\"#/' + currentPage + '\"]').className = 'selected';\n}\n\nfunction _elementComplete(id, completed) {\n  var listItem = __webpack_require__.i(__WEBPACK_IMPORTED_MODULE_0__helpers__[\"a\" /* qs */])('[data-id=\"' + id + '\"]');\n\n  if (!listItem) {\n    return;\n  }\n\n  listItem.className = completed ? 'completed' : '';\n\n  // In case it was toggled from an event and not by clicking the checkbox\n  __webpack_require__.i(__WEBPACK_IMPORTED_MODULE_0__helpers__[\"a\" /* qs */])('input', listItem).checked = completed;\n}\n\nfunction _editItem(id, title) {\n  var listItem = __webpack_require__.i(__WEBPACK_IMPORTED_MODULE_0__helpers__[\"a\" /* qs */])('[data-id=\"' + id + '\"]');\n\n  if (!listItem) {\n    return;\n  }\n\n  listItem.className = listItem.className + ' editing';\n\n  var input = document.createElement('input');\n  input.className = 'edit';\n\n  listItem.appendChild(input);\n  input.focus();\n  input.value = title;\n}\n\nfunction _itemId(element) {\n  var li = __webpack_require__.i(__WEBPACK_IMPORTED_MODULE_0__helpers__[\"e\" /* $parent */])(element, 'li');\n  return parseInt(li.dataset.id, 10);\n}\n\n/***/ },\n/* 10 */\n/***/ function(module, exports) {\n\n// removed by extract-text-webpack-plugin\n\n/***/ },\n/* 11 */\n/***/ function(module, exports, __webpack_require__) {\n\n\"use strict\";\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__app__ = __webpack_require__(2);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__helpers__ = __webpack_require__(0);\n/* eslint no-console:0 */\n\n\n\n// this is only relevant when using `hot` mode with webpack\n// special thanks to Eric Clemmons: https://github.com/ericclemmons/webpack-hot-server-example\nvar reloading = document.readyState === 'complete';\nif (false) {\n  module.hot.accept(function (err) {});\n  if (reloading) {\n    onLoad();\n  } else {\n    bootstrap();\n  }\n} else {\n  bootstrap();\n}\n\nfunction bootstrap() {\n  __webpack_require__.i(__WEBPACK_IMPORTED_MODULE_1__helpers__[\"d\" /* $on */])(window, 'load', __WEBPACK_IMPORTED_MODULE_0__app__[\"a\" /* onLoad */]);\n  __webpack_require__.i(__WEBPACK_IMPORTED_MODULE_1__helpers__[\"d\" /* $on */])(window, 'hashchange', __WEBPACK_IMPORTED_MODULE_0__app__[\"a\" /* onLoad */]);\n}\n\n/***/ }\n],[11]);\n\n\n// WEBPACK FOOTER //\n// bundle.app.73bcc5d3c1d07180f0e3.js","export {qs, qsa, $on, $delegate, $parent, remove}\n\n// Get element(s) by CSS selector:\nfunction qs(selector, scope) {\n  return (scope || document).querySelector(selector)\n}\n\nfunction qsa(selector, scope) {\n  return (scope || document).querySelectorAll(selector)\n}\n\n// addEventListener wrapper:\nfunction $on(target, type, callback, useCapture) {\n  target.addEventListener(type, callback, !!useCapture)\n}\n\n// Attach a handler to event for all elements that match the selector,\n// now or in the future, based on a root element\nfunction $delegate(target, selector, type, handler) {\n  // https://developer.mozilla.org/en-US/docs/Web/Events/blur\n  var useCapture = type === 'blur' || type === 'focus'\n  $on(target, type, dispatchEvent, useCapture)\n\n  function dispatchEvent(event) {\n    var targetElement = event.target\n    var potentialElements = qsa(selector, target)\n    var hasMatch = Array.prototype.indexOf.call(potentialElements, targetElement) >= 0\n\n    if (hasMatch) {\n      handler.call(targetElement, event)\n    }\n  }\n}\n\n// Find the element's parent with the given tag name:\n// $parent(qs('a'), 'div');\nfunction $parent(element, tagName) {\n  if (!element.parentNode) {\n    return undefined\n  }\n  if (element.parentNode.tagName.toLowerCase() === tagName.toLowerCase()) {\n    return element.parentNode\n  }\n  return $parent(element.parentNode, tagName)\n}\n\n// removes an element from an array\n// const x = [1,2,3]\n// remove(x, 2)\n// x ~== [1,3]\nfunction remove(array, thing) {\n  const index = array.indexOf(thing)\n  if (index === -1) {\n    return array\n  }\n  array.splice(index, 1)\n}\n\n// Allow for looping on nodes by chaining:\n// qsa('.foo').forEach(function () {})\nNodeList.prototype.forEach = Array.prototype.forEach\n\n\n\n// WEBPACK FOOTER //\n// ./helpers.js","import 'todomvc-app-css/index.css'\nimport './app.css'\n\nimport {$on} from './helpers'\nimport {updateTodo} from './todo'\n\nexport function onLoad() { // eslint-disable-line import/prefer-default-export\n  updateTodo()\n}\n\n\n\n// WEBPACK FOOTER //\n// ./app.js","export default Controller\n\n/**\n* Takes a model and view and acts as the controller between them\n*\n* @constructor\n* @param {object} model The model instance\n* @param {object} view The view instance\n*/\nfunction Controller(model, view) {\n  var that = this\n  that.model = model\n  that.view = view\n\n  that.view.bind('newTodo', function(title) {\n    that.addItem(title)\n  })\n\n  that.view.bind('itemEdit', function(item) {\n    that.editItem(item.id)\n  })\n\n  that.view.bind('itemEditDone', function(item) {\n    that.editItemSave(item.id, item.title)\n  })\n\n  that.view.bind('itemEditCancel', function(item) {\n    that.editItemCancel(item.id)\n  })\n\n  that.view.bind('itemRemove', function(item) {\n    that.removeItem(item.id)\n  })\n\n  that.view.bind('itemToggle', function(item) {\n    that.toggleComplete(item.id, item.completed)\n  })\n\n  that.view.bind('removeCompleted', function() {\n    that.removeCompletedItems()\n  })\n\n  that.view.bind('toggleAll', function(status) {\n    that.toggleAll(status.completed)\n  })\n}\n\n/**\n* Loads and initialises the view\n*\n* @param {string} '' | 'active' | 'completed'\n*/\nController.prototype.setView = function(locationHash) {\n  var route = locationHash.split('/')[1]\n  var page = route || ''\n  this._updateFilterState(page)\n}\n\n/**\n* An event to fire on load. Will get all items and display them in the\n* todo-list\n*/\nController.prototype.showAll = function() {\n  var that = this\n  that.model.read(function(data) {\n    that.view.render('showEntries', data)\n  })\n}\n\n/**\n* Renders all active tasks\n*/\nController.prototype.showActive = function() {\n  var that = this\n  that.model.read({completed: false}, function(data) {\n    that.view.render('showEntries', data)\n  })\n}\n\n/**\n* Renders all completed tasks\n*/\nController.prototype.showCompleted = function() {\n  var that = this\n  that.model.read({completed: true}, function(data) {\n    that.view.render('showEntries', data)\n  })\n}\n\n/**\n* An event to fire whenever you want to add an item. Simply pass in the event\n* object and it'll handle the DOM insertion and saving of the new item.\n*/\nController.prototype.addItem = function(title) {\n  var that = this\n\n  if (title.trim() === '') {\n    return\n  }\n\n  that.model.create(title, function() {\n    that.view.render('clearNewTodo')\n    that._filter(true)\n  })\n}\n\n/*\n* Triggers the item editing mode.\n*/\nController.prototype.editItem = function(id) {\n  var that = this\n  that.model.read(id, function(data) {\n    that.view.render('editItem', {id, title: data[0].title})\n  })\n}\n\n/*\n* Finishes the item editing mode successfully.\n*/\nController.prototype.editItemSave = function(id, title) {\n  var that = this\n  if (title.trim()) {\n    that.model.update(id, {title}, function() {\n      that.view.render('editItemDone', {id, title})\n    })\n  } else {\n    that.removeItem(id)\n  }\n}\n\n/*\n* Cancels the item editing mode.\n*/\nController.prototype.editItemCancel = function(id) {\n  var that = this\n  that.model.read(id, function(data) {\n    that.view.render('editItemDone', {id, title: data[0].title})\n  })\n}\n\n/**\n* By giving it an ID it'll find the DOM element matching that ID,\n* remove it from the DOM and also remove it from storage.\n*\n* @param {number} id The ID of the item to remove from the DOM and\n* storage\n*/\nController.prototype.removeItem = function(id) {\n  var that = this\n  that.model.remove(id, function() {\n    that.view.render('removeItem', id)\n  })\n\n  that._filter()\n}\n\n/**\n* Will remove all completed items from the DOM and storage.\n*/\nController.prototype.removeCompletedItems = function() {\n  var that = this\n  that.model.read({completed: true}, function(data) {\n    data.forEach(function(item) {\n      that.removeItem(item.id)\n    })\n  })\n\n  that._filter()\n}\n\n/**\n* Give it an ID of a model and a checkbox and it will update the item\n* in storage based on the checkbox's state.\n*\n* @param {number} id The ID of the element to complete or uncomplete\n* @param {object} checkbox The checkbox to check the state of complete\n*                          or not\n* @param {boolean|undefined} silent Prevent re-filtering the todo items\n*/\nController.prototype.toggleComplete = function(id, completed, silent) {\n  var that = this\n  that.model.update(id, {completed}, function() {\n    that.view.render('elementComplete', {\n      id,\n      completed,\n    })\n  })\n\n  if (!silent) {\n    that._filter()\n  }\n}\n\n/**\n* Will toggle ALL checkboxes' on/off state and completeness of models.\n* Just pass in the event object.\n*/\nController.prototype.toggleAll = function(completed) {\n  var that = this\n  that.model.read({completed: !completed}, function(data) {\n    data.forEach(function(item) {\n      that.toggleComplete(item.id, completed, true)\n    })\n  })\n\n  that._filter()\n}\n\n/**\n* Updates the pieces of the page which change depending on the remaining\n* number of todos.\n*/\nController.prototype._updateCount = function() {\n  var that = this\n  that.model.getCount(function(todos) {\n    that.view.render('updateElementCount', todos.active)\n    that.view.render('clearCompletedButton', {\n      completed: todos.completed,\n      visible: todos.completed > 0\n    })\n\n    that.view.render('toggleAll', {checked: todos.completed === todos.total})\n    that.view.render('contentBlockVisibility', {visible: todos.total > 0})\n  })\n}\n\n/**\n* Re-filters the todo items, based on the active route.\n* @param {boolean|undefined} force  forces a re-painting of todo items.\n*/\nController.prototype._filter = function(force) {\n  var activeRoute = this._activeRoute.charAt(0).toUpperCase() + this._activeRoute.substr(1)\n\n  // Update the elements on the page, which change with each completed todo\n  this._updateCount()\n\n  // If the last active route isn't \"All\", or we're switching routes, we\n  // re-create the todo item elements, calling:\n  //   this.show[All|Active|Completed]();\n  if (force || this._lastActiveRoute !== 'All' || this._lastActiveRoute !== activeRoute) {\n    this['show' + activeRoute]()\n  }\n\n  this._lastActiveRoute = activeRoute\n}\n\n/**\n* Simply updates the filter nav's selected states\n*/\nController.prototype._updateFilterState = function(currentPage) {\n  // Store a reference to the active route, allowing us to re-filter todo\n  // items as they are marked complete or incomplete.\n  currentPage = currentPage.split('?')[0]\n  this._activeRoute = currentPage\n\n  if (currentPage === '') {\n    this._activeRoute = 'All'\n  }\n\n  this._filter()\n\n  this.view.render('setFilter', currentPage)\n}\n\n\n\n// WEBPACK FOOTER //\n// ./controller.js","(function(root) {\n  var localStorageMemory = {};\n  var cache = {};\n\n  /**\n   * number of stored items.\n   */\n  localStorageMemory.length = 0;\n\n  /**\n   * returns item for passed key, or null\n   *\n   * @para {String} key\n   *       name of item to be returned\n   * @returns {String|null}\n   */\n  localStorageMemory.getItem = function(key) {\n    return cache[key] || null;\n  };\n\n  /**\n   * sets item for key to passed value, as String\n   *\n   * @para {String} key\n   *       name of item to be set\n   * @para {String} value\n   *       value, will always be turned into a String\n   * @returns {undefined}\n   */\n  localStorageMemory.setItem = function(key, value) {\n    if (typeof value === 'undefined') {\n      localStorageMemory.removeItem(key);\n    } else {\n      if (!(cache.hasOwnProperty(key))) {\n        localStorageMemory.length++;\n      }\n\n      cache[key] = '' + value;\n    }\n  };\n\n  /**\n   * removes item for passed key\n   *\n   * @para {String} key\n   *       name of item to be removed\n   * @returns {undefined}\n   */\n  localStorageMemory.removeItem = function(key) {\n    if (cache.hasOwnProperty(key)) {\n      delete cache[key];\n      localStorageMemory.length--;\n    }\n  };\n\n  /**\n   * returns name of key at passed index\n   *\n   * @para {Number} index\n   *       Position for key to be returned (starts at 0)\n   * @returns {String|null}\n   */\n  localStorageMemory.key = function(index) {\n    return Object.keys(cache)[index] || null;\n  };\n\n  /**\n   * removes all stored items and sets length to 0\n   *\n   * @returns {undefined}\n   */\n  localStorageMemory.clear = function() {\n    cache = {};\n    localStorageMemory.length = 0;\n  };\n\n  if (typeof exports === 'object') {\n    module.exports = localStorageMemory;\n  } else {\n    root.localStorageMemory = localStorageMemory;\n  }\n})(this);\n\n\n// WEBPACK FOOTER //\n// ./memory.js","export default Model\n\n/**\n* Creates a new Model instance and hooks up the storage.\n*\n* @constructor\n* @param {object} storage A reference to the client side storage class\n*/\nfunction Model(storage) {\n  this.storage = storage\n}\n\n/**\n* Creates a new todo model\n*\n* @param {string} [title] The title of the task\n* @param {function} [callback] The callback to fire after the model is created\n*/\nModel.prototype.create = function(title, callback) {\n  title = title || ''\n  callback = callback || function() {\n  }\n\n  var newItem = {\n    title: title.trim(),\n    completed: false\n  }\n\n  this.storage.save(newItem, callback)\n}\n\n/**\n * Finds and returns a model in storage. If no query is given it'll simply\n * return everything. If you pass in a string or number it'll look that up as\n * the ID of the model to find. Lastly, you can pass it an object to match against.\n *\n * @param {string|number|object} [query] A query to match models against\n * @param {function} [callback] The callback to fire after the model is found\n *\n * @example\n * model.read(1, func); // Will find the model with an ID of 1\n * model.read('1'); // Same as above\n * //Below will find a model with foo equalling bar and hello equalling world.\n * model.read({ foo: 'bar', hello: 'world' });\n */\nModel.prototype.read = function(query, callback) {\n  var queryType = typeof query\n  callback = callback || function() {\n  }\n\n  if (queryType === 'function') {\n    callback = query\n    return this.storage.findAll(callback)\n  } else if (queryType === 'string' || queryType === 'number') {\n    query = parseInt(query, 10)\n    this.storage.find({id: query}, callback)\n  } else {\n    this.storage.find(query, callback)\n  }\n  return undefined\n}\n\n/**\n* Updates a model by giving it an ID, data to update, and a callback to fire when\n* the update is complete.\n*\n* @param {number} id The id of the model to update\n* @param {object} data The properties to update and their new value\n* @param {function} callback The callback to fire when the update is complete.\n*/\nModel.prototype.update = function(id, data, callback) {\n  this.storage.save(data, callback, id)\n}\n\n/**\n* Removes a model from storage\n*\n* @param {number} id The ID of the model to remove\n* @param {function} callback The callback to fire when the removal is complete.\n*/\nModel.prototype.remove = function(id, callback) {\n  this.storage.remove(id, callback)\n}\n\n/**\n* WARNING: Will remove ALL data from storage.\n*\n* @param {function} callback The callback to fire when the storage is wiped.\n*/\nModel.prototype.removeAll = function(callback) {\n  this.storage.drop(callback)\n}\n\n/**\n* Returns a count of all todos\n*/\nModel.prototype.getCount = function(callback) {\n  var todos = {\n    active: 0,\n    completed: 0,\n    total: 0\n  }\n\n  this.storage.findAll(function(data) {\n    data.forEach(function(todo) {\n      if (todo.completed) {\n        todos.completed++\n      } else {\n        todos.active++\n      }\n\n      todos.total++\n    })\n    callback(todos)\n  })\n}\n\n\n\n// WEBPACK FOOTER //\n// ./model.js","import {remove} from './helpers'\nimport * as localStorageMemory from './memory'\nexport default Store\n\n/**\n * Creates a new client side storage object and will create an empty\n * collection if no collection already exists.\n *\n * @param {string} name The name of our DB we want to use\n * @param {function} callback Our fake DB uses callbacks because in\n * real life you probably would be making AJAX calls\n */\nfunction Store(name, callback) {\n  callback = callback || function() {\n  }\n\n  this._dbName = name\n\n  if (!localStorageMemory[name]) {\n    var data = {\n      todos: []\n    }\n\n    localStorageMemory[name] = JSON.stringify(data)\n  }\n\n  callback.call(this, JSON.parse(localStorageMemory[name]))\n  this.subscribers = []\n}\n\nStore.prototype.subscribe = function(subscriber) {\n  this.subscribers.push(subscriber)\n  return () => remove(this.subscribers, subscriber)\n}\n\nStore.prototype._notify = function() {\n  this.subscribers.forEach(s => s())\n}\n\n/**\n* Finds items based on a query given as a JS object\n*\n* @param {object} query The query to match against (i.e. {foo: 'bar'})\n* @param {function} callback   The callback to fire when the query has\n* completed running\n*\n* @example\n* db.find({foo: 'bar', hello: 'world'}, function (data) {\n*   // data will return any items that have foo: bar and\n*   // hello: world in their properties\n* });\n*/\nStore.prototype.find = function(query, callback) {\n  if (!callback) {\n    return\n  }\n\n  var todos = JSON.parse(localStorageMemory[this._dbName]).todos\n\n  callback.call(this, todos.filter(function(todo) {\n    for (var q in query) {\n      if (query[q] !== todo[q]) {\n        return false\n      }\n    }\n    return true\n  }))\n}\n\n/**\n* Will retrieve all data from the collection\n*\n* @param {function} callback The callback to fire upon retrieving data\n*/\nStore.prototype.findAll = function(callback) {\n  callback = callback || function() {\n  }\n  callback.call(this, JSON.parse(localStorageMemory[this._dbName]).todos)\n}\n\n/**\n* Will save the given data to the DB. If no item exists it will create a new\n* item, otherwise it'll simply update an existing item's properties\n*\n* @param {object} updateData The data to save back into the DB\n* @param {function} callback The callback to fire after saving\n* @param {number} id An optional param to enter an ID of an item to update\n*/\nStore.prototype.save = function(updateData, callback, id) {\n  var data = JSON.parse(localStorageMemory[this._dbName])\n  var todos = data.todos\n\n  callback = callback || function() {\n  }\n\n  // If an ID was actually given, find the item and update each property\n  if (id) {\n    for (var i = 0; i < todos.length; i++) {\n      if (todos[i].id === id) {\n        for (var key in updateData) { // eslint-disable-line guard-for-in\n          todos[i][key] = updateData[key]\n        }\n        break\n      }\n    }\n\n    localStorageMemory[this._dbName] = JSON.stringify(data)\n    callback.call(this, JSON.parse(localStorageMemory[this._dbName]).todos)\n  } else {\n    // Generate an ID\n    updateData.id = new Date().getTime()\n\n    todos.push(updateData)\n    localStorageMemory[this._dbName] = JSON.stringify(data)\n    callback.call(this, [updateData])\n  }\n  this._notify()\n}\n\n/**\n* Will remove an item from the Store based on its ID\n*\n* @param {number} id The ID of the item you want to remove\n* @param {function} callback The callback to fire after saving\n*/\nStore.prototype.remove = function(id, callback) {\n  var data = JSON.parse(localStorageMemory[this._dbName])\n  var todos = data.todos\n\n  for (var i = 0; i < todos.length; i++) {\n    if (todos[i].id === id) {\n      todos.splice(i, 1)\n      break\n    }\n  }\n\n  localStorageMemory[this._dbName] = JSON.stringify(data)\n  callback.call(this, JSON.parse(localStorageMemory[this._dbName]).todos)\n  this._notify()\n}\n\n/**\n* Will drop all storage and start fresh\n*\n* @param {function} callback The callback to fire after dropping the data\n*/\nStore.prototype.drop = function(callback) {\n  localStorageMemory[this._dbName] = JSON.stringify({todos: []})\n  callback.call(this, JSON.parse(localStorageMemory[this._dbName]).todos)\n  this._notify()\n}\n\n\n\n// WEBPACK FOOTER //\n// ./store.js","export default Template\n\nvar htmlEscapes = {\n  '&': '&amp;',\n  '<': '&lt;',\n  '>': '&gt;',\n  '\"': '&quot;',\n  '\\'': '&#x27;',\n  '`': '&#x60;'\n}\n\nvar escapeHtmlChar = function(chr) {\n  return htmlEscapes[chr]\n}\n\nvar reUnescapedHtml = /[&<>\"'`]/g\nvar reHasUnescapedHtml = new RegExp(reUnescapedHtml.source)\n\nvar escape = function(string) {\n  if (string && reHasUnescapedHtml.test(string)) {\n    return string.replace(reUnescapedHtml, escapeHtmlChar)\n  } else {\n    return string\n  }\n}\n\n/**\n* Sets up defaults for all the Template methods such as a default template\n*\n* @constructor\n*/\nfunction Template() {\n  this.defaultTemplate = `\n    <li data-id=\"{{id}}\" class=\"{{completed}}\">\n      <div class=\"view\">\n        <input class=\"toggle\" type=\"checkbox\" {{checked}} />\n        <label>{{title}}</label>\n        <button class=\"destroy\"></button>\n      </div>\n    </li>\n  `\n}\n\n/**\n * Creates an <li> HTML string and returns it for placement in your app.\n *\n * NOTE: In real life you should be using a templating engine such as Mustache\n * or Handlebars, however, this is a vanilla JS example.\n *\n * @param {object} data The object containing keys you want to find in the\n *                      template to replace.\n * @returns {string} HTML String of an <li> element\n *\n * @example\n * view.show({\n *  id: 1,\n *  title: \"Hello World\",\n *  completed: 0,\n * });\n */\nTemplate.prototype.show = function(data) {\n  var i, l\n  var view = ''\n\n  for (i = 0, l = data.length; i < l; i++) {\n    var template = this.defaultTemplate\n    var completed = ''\n    var checked = ''\n\n    if (data[i].completed) {\n      completed = 'completed'\n      checked = 'checked'\n    }\n\n    template = template.replace('{{id}}', data[i].id)\n    template = template.replace('{{title}}', escape(data[i].title))\n    template = template.replace('{{completed}}', completed)\n    template = template.replace('{{checked}}', checked)\n\n    view = view + template\n  }\n\n  return view\n}\n\n/**\n * Displays a counter of how many to dos are left to complete\n *\n * @param {number} activeTodos The number of active todos.\n * @returns {string} String containing the count\n */\nTemplate.prototype.itemCounter = function(activeTodos) {\n  var plural = activeTodos === 1 ? '' : 's'\n\n  return '<strong>' + activeTodos + '</strong> item' + plural + ' left'\n}\n\n/**\n * Updates the text within the \"Clear completed\" button\n *\n * @param  {[type]} completedTodos The number of completed todos.\n * @returns {string} String containing the count\n */\nTemplate.prototype.clearCompletedButton = function(completedTodos) {\n  if (completedTodos > 0) {\n    return 'Clear completed'\n  } else {\n    return ''\n  }\n}\n\n\n\n// WEBPACK FOOTER //\n// ./template.js","import View from './view'\nimport Controller from './controller'\nimport Model from './model'\nimport Store from './store'\nimport Template from './template'\nimport {remove} from './helpers'\n\nexport {updateTodo, getTodo, subscribe}\n\nlet todo\nconst subscribers = []\n\n/**\n * Sets up a brand new Todo list.\n *\n * @param {string} name The name of your new to do list.\n */\nfunction Todo(name) {\n  this.storage = new Store(name)\n  this.model = new Model(this.storage)\n  this.template = new Template()\n  this.view = new View(this.template)\n  this.controller = new Controller(this.model, this.view)\n}\n\nfunction updateTodo() {\n  todo = new Todo('todos-vanillajs')\n  todo.controller.setView(document.location.hash)\n  subscribers.forEach(s => s())\n}\n\nfunction getTodo() {\n  return todo\n}\n\nfunction subscribe(cb) {\n  subscribers.push(cb)\n  return function unsubscribe() {\n    remove(subscribers, cb)\n  }\n}\n\n\n\n// WEBPACK FOOTER //\n// ./todo.js","/* eslint no-invalid-this: 0, complexity:[2, 9] */\nimport {qs, qsa, $on, $parent, $delegate} from './helpers'\n\n/**\n * View that abstracts away the browser's DOM completely.\n * It has two simple entry points:\n *\n *   - bind(eventName, handler)\n *     Takes a todo application event and registers the handler\n *   - render(command, parameterObject)\n *     Renders the given command with the options\n */\nexport default class View {\n  constructor(template) {\n    this.template = template\n\n    this.ENTER_KEY = 13\n    this.ESCAPE_KEY = 27\n\n    this.$todoList = qs('.todo-list')\n    this.$todoItemCounter = qs('.todo-count')\n    this.$clearCompleted = qs('.clear-completed')\n    this.$main = qs('.main')\n    this.$footer = qs('.footer')\n    this.$toggleAll = qs('.toggle-all')\n    this.$newTodo = qs('.new-todo')\n  }\n\n  _removeItem(id) {\n    var elem = qs('[data-id=\"' + id + '\"]')\n\n    if (elem) {\n      this.$todoList.removeChild(elem)\n    }\n  }\n\n  _clearCompletedButton(completedCount, visible) {\n    this.$clearCompleted.innerHTML = this.template.clearCompletedButton(completedCount)\n    this.$clearCompleted.style.display = visible ? 'block' : 'none'\n  }\n\n  _editItemDone(id, title) {\n    var listItem = qs('[data-id=\"' + id + '\"]')\n\n    if (!listItem) {\n      return\n    }\n\n    var input = qs('input.edit', listItem)\n    listItem.removeChild(input)\n\n    listItem.className = listItem.className.replace('editing', '')\n\n    qsa('label', listItem).forEach(function(label) {\n      label.textContent = title\n    })\n  }\n\n  render(viewCmd, parameter) {\n    var that = this\n    var viewCommands = {\n      showEntries: function() {\n        that.$todoList.innerHTML = that.template.show(parameter)\n      },\n      removeItem: function() {\n        that._removeItem(parameter)\n      },\n      updateElementCount: function() {\n        that.$todoItemCounter.innerHTML = that.template.itemCounter(parameter)\n      },\n      clearCompletedButton: function() {\n        that._clearCompletedButton(parameter.completed, parameter.visible)\n      },\n      contentBlockVisibility: function() {\n        that.$main.style.display = that.$footer.style.display = parameter.visible ? 'block' : 'none'\n      },\n      toggleAll: function() {\n        that.$toggleAll.checked = parameter.checked\n      },\n      setFilter: function() {\n        _setFilter(parameter)\n      },\n      clearNewTodo: function() {\n        that.$newTodo.value = ''\n      },\n      elementComplete: function() {\n        _elementComplete(parameter.id, parameter.completed)\n      },\n      editItem: function() {\n        _editItem(parameter.id, parameter.title)\n      },\n      editItemDone: function() {\n        that._editItemDone(parameter.id, parameter.title)\n      }\n    }\n\n    viewCommands[viewCmd]()\n  }\n\n  _bindItemEditDone(handler) {\n    var that = this\n    $delegate(that.$todoList, 'li .edit', 'blur', function() {\n      if (!this.dataset.iscanceled) {\n        handler({\n          id: _itemId(this),\n          title: this.value\n        })\n      }\n    })\n\n    $delegate(that.$todoList, 'li .edit', 'keypress', function(event) {\n      if (event.keyCode === that.ENTER_KEY) {\n        // Remove the cursor from the input when you hit enter just like if it\n        // were a real form\n        this.blur()\n      }\n    })\n  }\n\n  _bindItemEditCancel(handler) {\n    var that = this\n    $delegate(that.$todoList, 'li .edit', 'keyup', function(event) {\n      if (event.keyCode === that.ESCAPE_KEY) {\n        this.dataset.iscanceled = true\n        this.blur()\n\n        handler({id: _itemId(this)})\n      }\n    })\n  }\n\n  bind(event, handler) {\n    var that = this\n    if (event === 'newTodo') {\n      $on(that.$newTodo, 'change', function() {\n        handler(that.$newTodo.value)\n      })\n\n    } else if (event === 'removeCompleted') {\n      $on(that.$clearCompleted, 'click', function() {\n        handler()\n      })\n\n    } else if (event === 'toggleAll') {\n      $on(that.$toggleAll, 'click', function() {\n        handler({completed: this.checked})\n      })\n\n    } else if (event === 'itemEdit') {\n      $delegate(that.$todoList, 'li label', 'dblclick', function() {\n        handler({id: _itemId(this)})\n      })\n\n    } else if (event === 'itemRemove') {\n      $delegate(that.$todoList, '.destroy', 'click', function() {\n        handler({id: _itemId(this)})\n      })\n\n    } else if (event === 'itemToggle') {\n      $delegate(that.$todoList, '.toggle', 'click', function() {\n        handler({\n          id: _itemId(this),\n          completed: this.checked\n        })\n      })\n\n    } else if (event === 'itemEditDone') {\n      that._bindItemEditDone(handler)\n\n    } else if (event === 'itemEditCancel') {\n      that._bindItemEditCancel(handler)\n    }\n  }\n}\n\nfunction _setFilter(currentPage) {\n  qs('.filters .selected').className = ''\n  qs('.filters [href=\"#/' + currentPage + '\"]').className = 'selected'\n}\n\nfunction _elementComplete(id, completed) {\n  var listItem = qs('[data-id=\"' + id + '\"]')\n\n  if (!listItem) {\n    return\n  }\n\n  listItem.className = completed ? 'completed' : ''\n\n  // In case it was toggled from an event and not by clicking the checkbox\n  qs('input', listItem).checked = completed\n}\n\nfunction _editItem(id, title) {\n  var listItem = qs('[data-id=\"' + id + '\"]')\n\n  if (!listItem) {\n    return\n  }\n\n  listItem.className = listItem.className + ' editing'\n\n  var input = document.createElement('input')\n  input.className = 'edit'\n\n  listItem.appendChild(input)\n  input.focus()\n  input.value = title\n}\n\nfunction _itemId(element) {\n  var li = $parent(element, 'li')\n  return parseInt(li.dataset.id, 10)\n}\n\n\n\n// WEBPACK FOOTER //\n// ./view.js","/* eslint no-console:0 */\nimport {onLoad} from './app'\nimport {$on} from './helpers'\n\n// this is only relevant when using `hot` mode with webpack\n// special thanks to Eric Clemmons: https://github.com/ericclemmons/webpack-hot-server-example\nconst reloading = document.readyState === 'complete'\nif (module.hot) {\n  module.hot.accept(function(err) {\n  })\n  if (reloading) {\n    onLoad()\n  } else {\n    bootstrap()\n  }\n} else {\n  bootstrap()\n}\n\nfunction bootstrap() {\n  $on(window, 'load', onLoad)\n  $on(window, 'hashchange', onLoad)\n}\n\n\n\n// WEBPACK FOOTER //\n// ./bootstrap.js"],"sourceRoot":""}
\ No newline at end of file
+{"version":3,"sources":["webpack:///bundle.app.9debb1b0a94f14d0ebe9.js","webpack:///./helpers.js","webpack:///./app.js","webpack:///./controller.js","webpack:///./memory.js","webpack:///./model.js","webpack:///./store.js","webpack:///./template.js","webpack:///./todo.js","webpack:///./view.js","webpack:///./bootstrap.js"],"names":["webpackJsonp","module","exports","__webpack_require__","qs","selector","scope","document","querySelector","qsa","querySelectorAll","$on","target","type","callback","useCapture","addEventListener","$delegate","handler","dispatchEvent","event","targetElement","potentialElements","hasMatch","Array","prototype","indexOf","call","$parent","element","tagName","parentNode","toLowerCase","remove","array","thing","index","splice","d","NodeList","forEach","onLoad","i","__WEBPACK_IMPORTED_MODULE_3__todo__","__WEBPACK_IMPORTED_MODULE_0_todomvc_app_css_index_css__","__WEBPACK_IMPORTED_MODULE_1__app_css__","n","Controller","model","view","that","this","bind","title","addItem","item","editItem","id","editItemSave","editItemCancel","removeItem","toggleComplete","completed","removeCompletedItems","status","toggleAll","setView","locationHash","route","split","page","_updateFilterState","showAll","read","data","render","showActive","showCompleted","trim","create","_filter","update","silent","_updateCount","getCount","todos","active","visible","checked","total","force","activeRoute","_activeRoute","charAt","toUpperCase","substr","_lastActiveRoute","currentPage","_typeof","Symbol","iterator","obj","constructor","root","localStorageMemory","cache","length","getItem","key","setItem","value","hasOwnProperty","Object","keys","clear","Model","storage","newItem","save","query","queryType","findAll","parseInt","find","removeAll","drop","todo","Store","name","_dbName","__WEBPACK_IMPORTED_MODULE_1__memory__","JSON","stringify","parse","subscribers","__WEBPACK_IMPORTED_MODULE_0__helpers__","subscribe","subscriber","_this","push","_notify","s","filter","q","updateData","Date","getTime","Template","defaultTemplate","htmlEscapes","&","<",">","\"","'","`","escapeHtmlChar","chr","reUnescapedHtml","reHasUnescapedHtml","RegExp","source","escape","string","test","replace","show","l","template","itemCounter","activeTodos","plural","clearCompletedButton","completedTodos","Todo","__WEBPACK_IMPORTED_MODULE_3__store__","__WEBPACK_IMPORTED_MODULE_2__model__","__WEBPACK_IMPORTED_MODULE_4__template__","__WEBPACK_IMPORTED_MODULE_0__view__","controller","__WEBPACK_IMPORTED_MODULE_1__controller__","updateTodo","location","hash","_classCallCheck","instance","Constructor","TypeError","_setFilter","className","_elementComplete","listItem","_editItem","input","createElement","appendChild","focus","_itemId","li","dataset","_createClass","defineProperties","props","descriptor","enumerable","configurable","writable","defineProperty","protoProps","staticProps","View","ENTER_KEY","ESCAPE_KEY","$todoList","$todoItemCounter","$clearCompleted","$main","$footer","$toggleAll","$newTodo","elem","removeChild","completedCount","innerHTML","style","display","label","textContent","viewCmd","parameter","viewCommands","showEntries","_removeItem","updateElementCount","_clearCompletedButton","contentBlockVisibility","setFilter","clearNewTodo","elementComplete","editItemDone","_editItemDone","iscanceled","keyCode","blur","_bindItemEditDone","_bindItemEditCancel","bootstrap","__WEBPACK_IMPORTED_MODULE_1__helpers__","window","__WEBPACK_IMPORTED_MODULE_0__app__","readyState"],"mappings":"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","file":"bundle.app.9debb1b0a94f14d0ebe9.js","sourcesContent":["webpackJsonp([0,2],[\n/* 0 */\n/***/ function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n/* harmony export */ __webpack_require__.d(exports, \"a\", function() { return qs; });\n/* harmony export */ __webpack_require__.d(exports, \"b\", function() { return qsa; });\n/* harmony export */ __webpack_require__.d(exports, \"d\", function() { return $on; });\n/* harmony export */ __webpack_require__.d(exports, \"c\", function() { return $delegate; });\n/* harmony export */ __webpack_require__.d(exports, \"e\", function() { return $parent; });\n/* harmony export */ __webpack_require__.d(exports, \"f\", function() { return remove; });\n\n// Get element(s) by CSS selector:\nfunction qs(selector, scope) {\n  return (scope || document).querySelector(selector);\n}\n\nfunction qsa(selector, scope) {\n  return (scope || document).querySelectorAll(selector);\n}\n\n// addEventListener wrapper:\nfunction $on(target, type, callback, useCapture) {\n  target.addEventListener(type, callback, !!useCapture);\n}\n\n// Attach a handler to event for all elements that match the selector,\n// now or in the future, based on a root element\nfunction $delegate(target, selector, type, handler) {\n  // https://developer.mozilla.org/en-US/docs/Web/Events/blur\n  var useCapture = type === 'blur' || type === 'focus';\n  $on(target, type, dispatchEvent, useCapture);\n\n  function dispatchEvent(event) {\n    var targetElement = event.target;\n    var potentialElements = qsa(selector, target);\n    var hasMatch = Array.prototype.indexOf.call(potentialElements, targetElement) >= 0;\n\n    if (hasMatch) {\n      handler.call(targetElement, event);\n    }\n  }\n}\n\n// Find the element's parent with the given tag name:\n// $parent(qs('a'), 'div');\nfunction $parent(element, tagName) {\n  if (!element.parentNode) {\n    return undefined;\n  }\n  if (element.parentNode.tagName.toLowerCase() === tagName.toLowerCase()) {\n    return element.parentNode;\n  }\n  return $parent(element.parentNode, tagName);\n}\n\n// removes an element from an array\n// const x = [1,2,3]\n// remove(x, 2)\n// x ~== [1,3]\nfunction remove(array, thing) {\n  var index = array.indexOf(thing);\n  if (index === -1) {\n    return array;\n  }\n  array.splice(index, 1);\n}\n\n// Allow for looping on nodes by chaining:\n// qsa('.foo').forEach(function () {})\nNodeList.prototype.forEach = Array.prototype.forEach;\n\n/***/ },\n/* 1 */,\n/* 2 */\n/***/ function(module, exports, __webpack_require__) {\n\n\"use strict\";\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_todomvc_app_css_index_css__ = __webpack_require__(1);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_todomvc_app_css_index_css___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_0_todomvc_app_css_index_css__);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__app_css__ = __webpack_require__(10);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__app_css___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_1__app_css__);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__helpers__ = __webpack_require__(0);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__todo__ = __webpack_require__(8);\n/* harmony export */ exports[\"a\"] = onLoad;\n\n\n\n\n\nfunction onLoad() {\n  // eslint-disable-line import/prefer-default-export\n  __webpack_require__.i(__WEBPACK_IMPORTED_MODULE_3__todo__[\"a\" /* updateTodo */])();\n}\n\n/***/ },\n/* 3 */\n/***/ function(module, exports, __webpack_require__) {\n\n\"use strict\";\n/* harmony default export */ exports[\"a\"] = Controller;\n\n/**\n* Takes a model and view and acts as the controller between them\n*\n* @constructor\n* @param {object} model The model instance\n* @param {object} view The view instance\n*/\nfunction Controller(model, view) {\n  var that = this;\n  that.model = model;\n  that.view = view;\n\n  that.view.bind('newTodo', function (title) {\n    that.addItem(title);\n  });\n\n  that.view.bind('itemEdit', function (item) {\n    that.editItem(item.id);\n  });\n\n  that.view.bind('itemEditDone', function (item) {\n    that.editItemSave(item.id, item.title);\n  });\n\n  that.view.bind('itemEditCancel', function (item) {\n    that.editItemCancel(item.id);\n  });\n\n  that.view.bind('itemRemove', function (item) {\n    that.removeItem(item.id);\n  });\n\n  that.view.bind('itemToggle', function (item) {\n    that.toggleComplete(item.id, item.completed);\n  });\n\n  that.view.bind('removeCompleted', function () {\n    that.removeCompletedItems();\n  });\n\n  that.view.bind('toggleAll', function (status) {\n    that.toggleAll(status.completed);\n  });\n}\n\n/**\n* Loads and initialises the view\n*\n* @param {string} '' | 'active' | 'completed'\n*/\nController.prototype.setView = function (locationHash) {\n  var route = locationHash.split('/')[1];\n  var page = route || '';\n  this._updateFilterState(page);\n};\n\n/**\n* An event to fire on load. Will get all items and display them in the\n* todo-list\n*/\nController.prototype.showAll = function () {\n  var that = this;\n  that.model.read(function (data) {\n    that.view.render('showEntries', data);\n  });\n};\n\n/**\n* Renders all active tasks\n*/\nController.prototype.showActive = function () {\n  var that = this;\n  that.model.read({ completed: false }, function (data) {\n    that.view.render('showEntries', data);\n  });\n};\n\n/**\n* Renders all completed tasks\n*/\nController.prototype.showCompleted = function () {\n  var that = this;\n  that.model.read({ completed: true }, function (data) {\n    that.view.render('showEntries', data);\n  });\n};\n\n/**\n* An event to fire whenever you want to add an item. Simply pass in the event\n* object and it'll handle the DOM insertion and saving of the new item.\n*/\nController.prototype.addItem = function (title) {\n  var that = this;\n\n  if (title.trim() === '') {\n    return;\n  }\n\n  that.model.create(title, function () {\n    that.view.render('clearNewTodo');\n    that._filter(true);\n  });\n};\n\n/*\n* Triggers the item editing mode.\n*/\nController.prototype.editItem = function (id) {\n  var that = this;\n  that.model.read(id, function (data) {\n    that.view.render('editItem', { id: id, title: data[0].title });\n  });\n};\n\n/*\n* Finishes the item editing mode successfully.\n*/\nController.prototype.editItemSave = function (id, title) {\n  var that = this;\n  if (title.trim()) {\n    that.model.update(id, { title: title }, function () {\n      that.view.render('editItemDone', { id: id, title: title });\n    });\n  } else {\n    that.removeItem(id);\n  }\n};\n\n/*\n* Cancels the item editing mode.\n*/\nController.prototype.editItemCancel = function (id) {\n  var that = this;\n  that.model.read(id, function (data) {\n    that.view.render('editItemDone', { id: id, title: data[0].title });\n  });\n};\n\n/**\n* By giving it an ID it'll find the DOM element matching that ID,\n* remove it from the DOM and also remove it from storage.\n*\n* @param {number} id The ID of the item to remove from the DOM and\n* storage\n*/\nController.prototype.removeItem = function (id) {\n  var that = this;\n  that.model.remove(id, function () {\n    that.view.render('removeItem', id);\n  });\n\n  that._filter();\n};\n\n/**\n* Will remove all completed items from the DOM and storage.\n*/\nController.prototype.removeCompletedItems = function () {\n  var that = this;\n  that.model.read({ completed: true }, function (data) {\n    data.forEach(function (item) {\n      that.removeItem(item.id);\n    });\n  });\n\n  that._filter();\n};\n\n/**\n* Give it an ID of a model and a checkbox and it will update the item\n* in storage based on the checkbox's state.\n*\n* @param {number} id The ID of the element to complete or uncomplete\n* @param {object} checkbox The checkbox to check the state of complete\n*                          or not\n* @param {boolean|undefined} silent Prevent re-filtering the todo items\n*/\nController.prototype.toggleComplete = function (id, completed, silent) {\n  var that = this;\n  that.model.update(id, { completed: completed }, function () {\n    that.view.render('elementComplete', {\n      id: id,\n      completed: completed\n    });\n  });\n\n  if (!silent) {\n    that._filter();\n  }\n};\n\n/**\n* Will toggle ALL checkboxes' on/off state and completeness of models.\n* Just pass in the event object.\n*/\nController.prototype.toggleAll = function (completed) {\n  var that = this;\n  that.model.read({ completed: !completed }, function (data) {\n    data.forEach(function (item) {\n      that.toggleComplete(item.id, completed, true);\n    });\n  });\n\n  that._filter();\n};\n\n/**\n* Updates the pieces of the page which change depending on the remaining\n* number of todos.\n*/\nController.prototype._updateCount = function () {\n  var that = this;\n  that.model.getCount(function (todos) {\n    that.view.render('updateElementCount', todos.active);\n    that.view.render('clearCompletedButton', {\n      completed: todos.completed,\n      visible: todos.completed > 0\n    });\n\n    that.view.render('toggleAll', { checked: todos.completed === todos.total });\n    that.view.render('contentBlockVisibility', { visible: todos.total > 0 });\n  });\n};\n\n/**\n* Re-filters the todo items, based on the active route.\n* @param {boolean|undefined} force  forces a re-painting of todo items.\n*/\nController.prototype._filter = function (force) {\n  var activeRoute = this._activeRoute.charAt(0).toUpperCase() + this._activeRoute.substr(1);\n\n  // Update the elements on the page, which change with each completed todo\n  this._updateCount();\n\n  // If the last active route isn't \"All\", or we're switching routes, we\n  // re-create the todo item elements, calling:\n  //   this.show[All|Active|Completed]();\n  if (force || this._lastActiveRoute !== 'All' || this._lastActiveRoute !== activeRoute) {\n    this['show' + activeRoute]();\n  }\n\n  this._lastActiveRoute = activeRoute;\n};\n\n/**\n* Simply updates the filter nav's selected states\n*/\nController.prototype._updateFilterState = function (currentPage) {\n  // Store a reference to the active route, allowing us to re-filter todo\n  // items as they are marked complete or incomplete.\n  currentPage = currentPage.split('?')[0];\n  this._activeRoute = currentPage;\n\n  if (currentPage === '') {\n    this._activeRoute = 'All';\n  }\n\n  this._filter();\n\n  this.view.render('setFilter', currentPage);\n};\n\n/***/ },\n/* 4 */\n/***/ function(module, exports, __webpack_require__) {\n\nvar _typeof = typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; };\n\n(function (root) {\n  var localStorageMemory = {};\n  var cache = {};\n\n  /**\n   * number of stored items.\n   */\n  localStorageMemory.length = 0;\n\n  /**\n   * returns item for passed key, or null\n   *\n   * @para {String} key\n   *       name of item to be returned\n   * @returns {String|null}\n   */\n  localStorageMemory.getItem = function (key) {\n    return cache[key] || null;\n  };\n\n  /**\n   * sets item for key to passed value, as String\n   *\n   * @para {String} key\n   *       name of item to be set\n   * @para {String} value\n   *       value, will always be turned into a String\n   * @returns {undefined}\n   */\n  localStorageMemory.setItem = function (key, value) {\n    if (typeof value === 'undefined') {\n      localStorageMemory.removeItem(key);\n    } else {\n      if (!cache.hasOwnProperty(key)) {\n        localStorageMemory.length++;\n      }\n\n      cache[key] = '' + value;\n    }\n  };\n\n  /**\n   * removes item for passed key\n   *\n   * @para {String} key\n   *       name of item to be removed\n   * @returns {undefined}\n   */\n  localStorageMemory.removeItem = function (key) {\n    if (cache.hasOwnProperty(key)) {\n      delete cache[key];\n      localStorageMemory.length--;\n    }\n  };\n\n  /**\n   * returns name of key at passed index\n   *\n   * @para {Number} index\n   *       Position for key to be returned (starts at 0)\n   * @returns {String|null}\n   */\n  localStorageMemory.key = function (index) {\n    return Object.keys(cache)[index] || null;\n  };\n\n  /**\n   * removes all stored items and sets length to 0\n   *\n   * @returns {undefined}\n   */\n  localStorageMemory.clear = function () {\n    cache = {};\n    localStorageMemory.length = 0;\n  };\n\n  if (( false ? 'undefined' : _typeof(exports)) === 'object') {\n    module.exports = localStorageMemory;\n  } else {\n    root.localStorageMemory = localStorageMemory;\n  }\n})(this);\n\n/***/ },\n/* 5 */\n/***/ function(module, exports, __webpack_require__) {\n\n\"use strict\";\nvar _typeof = typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; };\n\n/* harmony default export */ exports[\"a\"] = Model;\n\n/**\n* Creates a new Model instance and hooks up the storage.\n*\n* @constructor\n* @param {object} storage A reference to the client side storage class\n*/\nfunction Model(storage) {\n  this.storage = storage;\n}\n\n/**\n* Creates a new todo model\n*\n* @param {string} [title] The title of the task\n* @param {function} [callback] The callback to fire after the model is created\n*/\nModel.prototype.create = function (title, callback) {\n  title = title || '';\n  callback = callback || function () {};\n\n  var newItem = {\n    title: title.trim(),\n    completed: false\n  };\n\n  this.storage.save(newItem, callback);\n};\n\n/**\n * Finds and returns a model in storage. If no query is given it'll simply\n * return everything. If you pass in a string or number it'll look that up as\n * the ID of the model to find. Lastly, you can pass it an object to match against.\n *\n * @param {string|number|object} [query] A query to match models against\n * @param {function} [callback] The callback to fire after the model is found\n *\n * @example\n * model.read(1, func); // Will find the model with an ID of 1\n * model.read('1'); // Same as above\n * //Below will find a model with foo equalling bar and hello equalling world.\n * model.read({ foo: 'bar', hello: 'world' });\n */\nModel.prototype.read = function (query, callback) {\n  var queryType = typeof query === 'undefined' ? 'undefined' : _typeof(query);\n  callback = callback || function () {};\n\n  if (queryType === 'function') {\n    callback = query;\n    return this.storage.findAll(callback);\n  } else if (queryType === 'string' || queryType === 'number') {\n    query = parseInt(query, 10);\n    this.storage.find({ id: query }, callback);\n  } else {\n    this.storage.find(query, callback);\n  }\n  return undefined;\n};\n\n/**\n* Updates a model by giving it an ID, data to update, and a callback to fire when\n* the update is complete.\n*\n* @param {number} id The id of the model to update\n* @param {object} data The properties to update and their new value\n* @param {function} callback The callback to fire when the update is complete.\n*/\nModel.prototype.update = function (id, data, callback) {\n  this.storage.save(data, callback, id);\n};\n\n/**\n* Removes a model from storage\n*\n* @param {number} id The ID of the model to remove\n* @param {function} callback The callback to fire when the removal is complete.\n*/\nModel.prototype.remove = function (id, callback) {\n  this.storage.remove(id, callback);\n};\n\n/**\n* WARNING: Will remove ALL data from storage.\n*\n* @param {function} callback The callback to fire when the storage is wiped.\n*/\nModel.prototype.removeAll = function (callback) {\n  this.storage.drop(callback);\n};\n\n/**\n* Returns a count of all todos\n*/\nModel.prototype.getCount = function (callback) {\n  var todos = {\n    active: 0,\n    completed: 0,\n    total: 0\n  };\n\n  this.storage.findAll(function (data) {\n    data.forEach(function (todo) {\n      if (todo.completed) {\n        todos.completed++;\n      } else {\n        todos.active++;\n      }\n\n      todos.total++;\n    });\n    callback(todos);\n  });\n};\n\n/***/ },\n/* 6 */\n/***/ function(module, exports, __webpack_require__) {\n\n\"use strict\";\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__helpers__ = __webpack_require__(0);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__memory__ = __webpack_require__(4);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__memory___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_1__memory__);\n\n\n/* harmony default export */ exports[\"a\"] = Store;\n\n/**\n * Creates a new client side storage object and will create an empty\n * collection if no collection already exists.\n *\n * @param {string} name The name of our DB we want to use\n * @param {function} callback Our fake DB uses callbacks because in\n * real life you probably would be making AJAX calls\n */\nfunction Store(name, callback) {\n  callback = callback || function () {};\n\n  this._dbName = name;\n\n  if (!__WEBPACK_IMPORTED_MODULE_1__memory__[name]) {\n    var data = {\n      todos: []\n    };\n\n    __WEBPACK_IMPORTED_MODULE_1__memory__[name] = JSON.stringify(data);\n  }\n\n  callback.call(this, JSON.parse(__WEBPACK_IMPORTED_MODULE_1__memory__[name]));\n  this.subscribers = [];\n}\n\nStore.prototype.subscribe = function (subscriber) {\n  var _this = this;\n\n  this.subscribers.push(subscriber);\n  return function () {\n    return __webpack_require__.i(__WEBPACK_IMPORTED_MODULE_0__helpers__[\"f\" /* remove */])(_this.subscribers, subscriber);\n  };\n};\n\nStore.prototype._notify = function () {\n  this.subscribers.forEach(function (s) {\n    return s();\n  });\n};\n\n/**\n* Finds items based on a query given as a JS object\n*\n* @param {object} query The query to match against (i.e. {foo: 'bar'})\n* @param {function} callback   The callback to fire when the query has\n* completed running\n*\n* @example\n* db.find({foo: 'bar', hello: 'world'}, function (data) {\n*   // data will return any items that have foo: bar and\n*   // hello: world in their properties\n* });\n*/\nStore.prototype.find = function (query, callback) {\n  if (!callback) {\n    return;\n  }\n\n  var todos = JSON.parse(__WEBPACK_IMPORTED_MODULE_1__memory__[this._dbName]).todos;\n\n  callback.call(this, todos.filter(function (todo) {\n    for (var q in query) {\n      if (query[q] !== todo[q]) {\n        return false;\n      }\n    }\n    return true;\n  }));\n};\n\n/**\n* Will retrieve all data from the collection\n*\n* @param {function} callback The callback to fire upon retrieving data\n*/\nStore.prototype.findAll = function (callback) {\n  callback = callback || function () {};\n  callback.call(this, JSON.parse(__WEBPACK_IMPORTED_MODULE_1__memory__[this._dbName]).todos);\n};\n\n/**\n* Will save the given data to the DB. If no item exists it will create a new\n* item, otherwise it'll simply update an existing item's properties\n*\n* @param {object} updateData The data to save back into the DB\n* @param {function} callback The callback to fire after saving\n* @param {number} id An optional param to enter an ID of an item to update\n*/\nStore.prototype.save = function (updateData, callback, id) {\n  var data = JSON.parse(__WEBPACK_IMPORTED_MODULE_1__memory__[this._dbName]);\n  var todos = data.todos;\n\n  callback = callback || function () {};\n\n  // If an ID was actually given, find the item and update each property\n  if (id) {\n    for (var i = 0; i < todos.length; i++) {\n      if (todos[i].id === id) {\n        for (var key in updateData) {\n          // eslint-disable-line guard-for-in\n          todos[i][key] = updateData[key];\n        }\n        break;\n      }\n    }\n\n    __WEBPACK_IMPORTED_MODULE_1__memory__[this._dbName] = JSON.stringify(data);\n    callback.call(this, JSON.parse(__WEBPACK_IMPORTED_MODULE_1__memory__[this._dbName]).todos);\n  } else {\n    // Generate an ID\n    updateData.id = new Date().getTime();\n\n    todos.push(updateData);\n    __WEBPACK_IMPORTED_MODULE_1__memory__[this._dbName] = JSON.stringify(data);\n    callback.call(this, [updateData]);\n  }\n  this._notify();\n};\n\n/**\n* Will remove an item from the Store based on its ID\n*\n* @param {number} id The ID of the item you want to remove\n* @param {function} callback The callback to fire after saving\n*/\nStore.prototype.remove = function (id, callback) {\n  var data = JSON.parse(__WEBPACK_IMPORTED_MODULE_1__memory__[this._dbName]);\n  var todos = data.todos;\n\n  for (var i = 0; i < todos.length; i++) {\n    if (todos[i].id === id) {\n      todos.splice(i, 1);\n      break;\n    }\n  }\n\n  __WEBPACK_IMPORTED_MODULE_1__memory__[this._dbName] = JSON.stringify(data);\n  callback.call(this, JSON.parse(__WEBPACK_IMPORTED_MODULE_1__memory__[this._dbName]).todos);\n  this._notify();\n};\n\n/**\n* Will drop all storage and start fresh\n*\n* @param {function} callback The callback to fire after dropping the data\n*/\nStore.prototype.drop = function (callback) {\n  __WEBPACK_IMPORTED_MODULE_1__memory__[this._dbName] = JSON.stringify({ todos: [] });\n  callback.call(this, JSON.parse(__WEBPACK_IMPORTED_MODULE_1__memory__[this._dbName]).todos);\n  this._notify();\n};\n\n/***/ },\n/* 7 */\n/***/ function(module, exports, __webpack_require__) {\n\n\"use strict\";\n/* harmony default export */ exports[\"a\"] = Template;\n\nvar htmlEscapes = {\n  '&': '&amp;',\n  '<': '&lt;',\n  '>': '&gt;',\n  '\"': '&quot;',\n  '\\'': '&#x27;',\n  '`': '&#x60;'\n};\n\nvar escapeHtmlChar = function escapeHtmlChar(chr) {\n  return htmlEscapes[chr];\n};\n\nvar reUnescapedHtml = /[&<>\"'`]/g;\nvar reHasUnescapedHtml = new RegExp(reUnescapedHtml.source);\n\nvar escape = function escape(string) {\n  if (string && reHasUnescapedHtml.test(string)) {\n    return string.replace(reUnescapedHtml, escapeHtmlChar);\n  } else {\n    return string;\n  }\n};\n\n/**\n* Sets up defaults for all the Template methods such as a default template\n*\n* @constructor\n*/\nfunction Template() {\n  this.defaultTemplate = '\\n    <li data-id=\"{{id}}\" class=\"{{completed}}\">\\n      <div class=\"view\">\\n        <input class=\"toggle\" type=\"checkbox\" {{checked}} />\\n        <label>{{title}}</label>\\n        <button class=\"destroy\"></button>\\n      </div>\\n    </li>\\n  ';\n}\n\n/**\n * Creates an <li> HTML string and returns it for placement in your app.\n *\n * NOTE: In real life you should be using a templating engine such as Mustache\n * or Handlebars, however, this is a vanilla JS example.\n *\n * @param {object} data The object containing keys you want to find in the\n *                      template to replace.\n * @returns {string} HTML String of an <li> element\n *\n * @example\n * view.show({\n *  id: 1,\n *  title: \"Hello World\",\n *  completed: 0,\n * });\n */\nTemplate.prototype.show = function (data) {\n  var i, l;\n  var view = '';\n\n  for (i = 0, l = data.length; i < l; i++) {\n    var template = this.defaultTemplate;\n    var completed = '';\n    var checked = '';\n\n    if (data[i].completed) {\n      completed = 'completed';\n      checked = 'checked';\n    }\n\n    template = template.replace('{{id}}', data[i].id);\n    template = template.replace('{{title}}', escape(data[i].title));\n    template = template.replace('{{completed}}', completed);\n    template = template.replace('{{checked}}', checked);\n\n    view = view + template;\n  }\n\n  return view;\n};\n\n/**\n * Displays a counter of how many to dos are left to complete\n *\n * @param {number} activeTodos The number of active todos.\n * @returns {string} String containing the count\n */\nTemplate.prototype.itemCounter = function (activeTodos) {\n  var plural = activeTodos === 1 ? '' : 's';\n\n  return '<strong>' + activeTodos + '</strong> item' + plural + ' left';\n};\n\n/**\n * Updates the text within the \"Clear completed\" button\n *\n * @param  {[type]} completedTodos The number of completed todos.\n * @returns {string} String containing the count\n */\nTemplate.prototype.clearCompletedButton = function (completedTodos) {\n  if (completedTodos > 0) {\n    return 'Clear completed';\n  } else {\n    return '';\n  }\n};\n\n/***/ },\n/* 8 */\n/***/ function(module, exports, __webpack_require__) {\n\n\"use strict\";\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__view__ = __webpack_require__(9);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__controller__ = __webpack_require__(3);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__model__ = __webpack_require__(5);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__store__ = __webpack_require__(6);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_4__template__ = __webpack_require__(7);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_5__helpers__ = __webpack_require__(0);\n\n/* harmony export */ __webpack_require__.d(exports, \"a\", function() { return updateTodo; });/* unused harmony export getTodo *//* unused harmony export subscribe */\n\n\n\n\n\n\n\n\nvar todo = void 0;\nvar subscribers = [];\n\n/**\n * Sets up a brand new Todo list.\n *\n * @param {string} name The name of your new to do list.\n */\nfunction Todo(name) {\n  this.storage = new __WEBPACK_IMPORTED_MODULE_3__store__[\"a\" /* default */](name);\n  this.model = new __WEBPACK_IMPORTED_MODULE_2__model__[\"a\" /* default */](this.storage);\n  this.template = new __WEBPACK_IMPORTED_MODULE_4__template__[\"a\" /* default */]();\n  this.view = new __WEBPACK_IMPORTED_MODULE_0__view__[\"a\" /* default */](this.template);\n  this.controller = new __WEBPACK_IMPORTED_MODULE_1__controller__[\"a\" /* default */](this.model, this.view);\n}\n\nfunction updateTodo() {\n  todo = new Todo('todos-vanillajs');\n  todo.controller.setView(document.location.hash);\n  subscribers.forEach(function (s) {\n    return s();\n  });\n}\n\nfunction getTodo() {\n  return todo;\n}\n\nfunction subscribe(cb) {\n  subscribers.push(cb);\n  return function unsubscribe() {\n    __webpack_require__.i(__WEBPACK_IMPORTED_MODULE_5__helpers__[\"f\" /* remove */])(subscribers, cb);\n  };\n}\n\n/***/ },\n/* 9 */\n/***/ function(module, exports, __webpack_require__) {\n\n\"use strict\";\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__helpers__ = __webpack_require__(0);\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\n/* eslint no-invalid-this: 0, complexity:[2, 9] */\n\n\n/**\n * View that abstracts away the browser's DOM completely.\n * It has two simple entry points:\n *\n *   - bind(eventName, handler)\n *     Takes a todo application event and registers the handler\n *   - render(command, parameterObject)\n *     Renders the given command with the options\n */\n\nvar View = function () {\n  function View(template) {\n    _classCallCheck(this, View);\n\n    this.template = template;\n\n    this.ENTER_KEY = 13;\n    this.ESCAPE_KEY = 27;\n\n    this.$todoList = __webpack_require__.i(__WEBPACK_IMPORTED_MODULE_0__helpers__[\"a\" /* qs */])('.todo-list');\n    this.$todoItemCounter = __webpack_require__.i(__WEBPACK_IMPORTED_MODULE_0__helpers__[\"a\" /* qs */])('.todo-count');\n    this.$clearCompleted = __webpack_require__.i(__WEBPACK_IMPORTED_MODULE_0__helpers__[\"a\" /* qs */])('.clear-completed');\n    this.$main = __webpack_require__.i(__WEBPACK_IMPORTED_MODULE_0__helpers__[\"a\" /* qs */])('.main');\n    this.$footer = __webpack_require__.i(__WEBPACK_IMPORTED_MODULE_0__helpers__[\"a\" /* qs */])('.footer');\n    this.$toggleAll = __webpack_require__.i(__WEBPACK_IMPORTED_MODULE_0__helpers__[\"a\" /* qs */])('.toggle-all');\n    this.$newTodo = __webpack_require__.i(__WEBPACK_IMPORTED_MODULE_0__helpers__[\"a\" /* qs */])('.new-todo');\n  }\n\n  _createClass(View, [{\n    key: '_removeItem',\n    value: function _removeItem(id) {\n      var elem = __webpack_require__.i(__WEBPACK_IMPORTED_MODULE_0__helpers__[\"a\" /* qs */])('[data-id=\"' + id + '\"]');\n\n      if (elem) {\n        this.$todoList.removeChild(elem);\n      }\n    }\n  }, {\n    key: '_clearCompletedButton',\n    value: function _clearCompletedButton(completedCount, visible) {\n      this.$clearCompleted.innerHTML = this.template.clearCompletedButton(completedCount);\n      this.$clearCompleted.style.display = visible ? 'block' : 'none';\n    }\n  }, {\n    key: '_editItemDone',\n    value: function _editItemDone(id, title) {\n      var listItem = __webpack_require__.i(__WEBPACK_IMPORTED_MODULE_0__helpers__[\"a\" /* qs */])('[data-id=\"' + id + '\"]');\n\n      if (!listItem) {\n        return;\n      }\n\n      var input = __webpack_require__.i(__WEBPACK_IMPORTED_MODULE_0__helpers__[\"a\" /* qs */])('input.edit', listItem);\n      listItem.removeChild(input);\n\n      listItem.className = listItem.className.replace('editing', '');\n\n      __webpack_require__.i(__WEBPACK_IMPORTED_MODULE_0__helpers__[\"b\" /* qsa */])('label', listItem).forEach(function (label) {\n        label.textContent = title;\n      });\n    }\n  }, {\n    key: 'render',\n    value: function render(viewCmd, parameter) {\n      var that = this;\n      var viewCommands = {\n        showEntries: function showEntries() {\n          that.$todoList.innerHTML = that.template.show(parameter);\n        },\n        removeItem: function removeItem() {\n          that._removeItem(parameter);\n        },\n        updateElementCount: function updateElementCount() {\n          that.$todoItemCounter.innerHTML = that.template.itemCounter(parameter);\n        },\n        clearCompletedButton: function clearCompletedButton() {\n          that._clearCompletedButton(parameter.completed, parameter.visible);\n        },\n        contentBlockVisibility: function contentBlockVisibility() {\n          that.$main.style.display = that.$footer.style.display = parameter.visible ? 'block' : 'none';\n        },\n        toggleAll: function toggleAll() {\n          that.$toggleAll.checked = parameter.checked;\n        },\n        setFilter: function setFilter() {\n          _setFilter(parameter);\n        },\n        clearNewTodo: function clearNewTodo() {\n          that.$newTodo.value = '';\n        },\n        elementComplete: function elementComplete() {\n          _elementComplete(parameter.id, parameter.completed);\n        },\n        editItem: function editItem() {\n          _editItem(parameter.id, parameter.title);\n        },\n        editItemDone: function editItemDone() {\n          that._editItemDone(parameter.id, parameter.title);\n        }\n      };\n\n      viewCommands[viewCmd]();\n    }\n  }, {\n    key: '_bindItemEditDone',\n    value: function _bindItemEditDone(handler) {\n      var that = this;\n      __webpack_require__.i(__WEBPACK_IMPORTED_MODULE_0__helpers__[\"c\" /* $delegate */])(that.$todoList, 'li .edit', 'blur', function () {\n        if (!this.dataset.iscanceled) {\n          handler({\n            id: _itemId(this),\n            title: this.value\n          });\n        }\n      });\n\n      __webpack_require__.i(__WEBPACK_IMPORTED_MODULE_0__helpers__[\"c\" /* $delegate */])(that.$todoList, 'li .edit', 'keypress', function (event) {\n        if (event.keyCode === that.ENTER_KEY) {\n          // Remove the cursor from the input when you hit enter just like if it\n          // were a real form\n          this.blur();\n        }\n      });\n    }\n  }, {\n    key: '_bindItemEditCancel',\n    value: function _bindItemEditCancel(handler) {\n      var that = this;\n      __webpack_require__.i(__WEBPACK_IMPORTED_MODULE_0__helpers__[\"c\" /* $delegate */])(that.$todoList, 'li .edit', 'keyup', function (event) {\n        if (event.keyCode === that.ESCAPE_KEY) {\n          this.dataset.iscanceled = true;\n          this.blur();\n\n          handler({ id: _itemId(this) });\n        }\n      });\n    }\n  }, {\n    key: 'bind',\n    value: function bind(event, handler) {\n      var that = this;\n      if (event === 'newTodo') {\n        __webpack_require__.i(__WEBPACK_IMPORTED_MODULE_0__helpers__[\"d\" /* $on */])(that.$newTodo, 'change', function () {\n          handler(that.$newTodo.value);\n        });\n      } else if (event === 'removeCompleted') {\n        __webpack_require__.i(__WEBPACK_IMPORTED_MODULE_0__helpers__[\"d\" /* $on */])(that.$clearCompleted, 'click', function () {\n          handler();\n        });\n      } else if (event === 'toggleAll') {\n        __webpack_require__.i(__WEBPACK_IMPORTED_MODULE_0__helpers__[\"d\" /* $on */])(that.$toggleAll, 'click', function () {\n          handler({ completed: this.checked });\n        });\n      } else if (event === 'itemEdit') {\n        __webpack_require__.i(__WEBPACK_IMPORTED_MODULE_0__helpers__[\"c\" /* $delegate */])(that.$todoList, 'li label', 'dblclick', function () {\n          handler({ id: _itemId(this) });\n        });\n      } else if (event === 'itemRemove') {\n        __webpack_require__.i(__WEBPACK_IMPORTED_MODULE_0__helpers__[\"c\" /* $delegate */])(that.$todoList, '.destroy', 'click', function () {\n          handler({ id: _itemId(this) });\n        });\n      } else if (event === 'itemToggle') {\n        __webpack_require__.i(__WEBPACK_IMPORTED_MODULE_0__helpers__[\"c\" /* $delegate */])(that.$todoList, '.toggle', 'click', function () {\n          handler({\n            id: _itemId(this),\n            completed: this.checked\n          });\n        });\n      } else if (event === 'itemEditDone') {\n        that._bindItemEditDone(handler);\n      } else if (event === 'itemEditCancel') {\n        that._bindItemEditCancel(handler);\n      }\n    }\n  }]);\n\n  return View;\n}();\n\n/* harmony default export */ exports[\"a\"] = View;\n\n\nfunction _setFilter(currentPage) {\n  __webpack_require__.i(__WEBPACK_IMPORTED_MODULE_0__helpers__[\"a\" /* qs */])('.filters .selected').className = '';\n  __webpack_require__.i(__WEBPACK_IMPORTED_MODULE_0__helpers__[\"a\" /* qs */])('.filters [href=\"#/' + currentPage + '\"]').className = 'selected';\n}\n\nfunction _elementComplete(id, completed) {\n  var listItem = __webpack_require__.i(__WEBPACK_IMPORTED_MODULE_0__helpers__[\"a\" /* qs */])('[data-id=\"' + id + '\"]');\n\n  if (!listItem) {\n    return;\n  }\n\n  listItem.className = completed ? 'completed' : '';\n\n  // In case it was toggled from an event and not by clicking the checkbox\n  __webpack_require__.i(__WEBPACK_IMPORTED_MODULE_0__helpers__[\"a\" /* qs */])('input', listItem).checked = completed;\n}\n\nfunction _editItem(id, title) {\n  var listItem = __webpack_require__.i(__WEBPACK_IMPORTED_MODULE_0__helpers__[\"a\" /* qs */])('[data-id=\"' + id + '\"]');\n\n  if (!listItem) {\n    return;\n  }\n\n  listItem.className = listItem.className + ' editing';\n\n  var input = document.createElement('input');\n  input.className = 'edit';\n\n  listItem.appendChild(input);\n  input.focus();\n  input.value = title;\n}\n\nfunction _itemId(element) {\n  var li = __webpack_require__.i(__WEBPACK_IMPORTED_MODULE_0__helpers__[\"e\" /* $parent */])(element, 'li');\n  return parseInt(li.dataset.id, 10);\n}\n\n/***/ },\n/* 10 */\n/***/ function(module, exports) {\n\n// removed by extract-text-webpack-plugin\n\n/***/ },\n/* 11 */\n/***/ function(module, exports, __webpack_require__) {\n\n\"use strict\";\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__app__ = __webpack_require__(2);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__helpers__ = __webpack_require__(0);\n/* eslint no-console:0 */\n\n\n\n// this is only relevant when using `hot` mode with webpack\n// special thanks to Eric Clemmons: https://github.com/ericclemmons/webpack-hot-server-example\nvar reloading = document.readyState === 'complete';\nif (false) {\n  module.hot.accept(function (err) {});\n  if (reloading) {\n    onLoad();\n  } else {\n    bootstrap();\n  }\n} else {\n  bootstrap();\n}\n\nfunction bootstrap() {\n  __webpack_require__.i(__WEBPACK_IMPORTED_MODULE_1__helpers__[\"d\" /* $on */])(window, 'load', __WEBPACK_IMPORTED_MODULE_0__app__[\"a\" /* onLoad */]);\n  __webpack_require__.i(__WEBPACK_IMPORTED_MODULE_1__helpers__[\"d\" /* $on */])(window, 'hashchange', __WEBPACK_IMPORTED_MODULE_0__app__[\"a\" /* onLoad */]);\n}\n\n/***/ }\n],[11]);\n\n\n// WEBPACK FOOTER //\n// bundle.app.9debb1b0a94f14d0ebe9.js","export {qs, qsa, $on, $delegate, $parent, remove}\n\n// Get element(s) by CSS selector:\nfunction qs(selector, scope) {\n  return (scope || document).querySelector(selector)\n}\n\nfunction qsa(selector, scope) {\n  return (scope || document).querySelectorAll(selector)\n}\n\n// addEventListener wrapper:\nfunction $on(target, type, callback, useCapture) {\n  target.addEventListener(type, callback, !!useCapture)\n}\n\n// Attach a handler to event for all elements that match the selector,\n// now or in the future, based on a root element\nfunction $delegate(target, selector, type, handler) {\n  // https://developer.mozilla.org/en-US/docs/Web/Events/blur\n  var useCapture = type === 'blur' || type === 'focus'\n  $on(target, type, dispatchEvent, useCapture)\n\n  function dispatchEvent(event) {\n    var targetElement = event.target\n    var potentialElements = qsa(selector, target)\n    var hasMatch = Array.prototype.indexOf.call(potentialElements, targetElement) >= 0\n\n    if (hasMatch) {\n      handler.call(targetElement, event)\n    }\n  }\n}\n\n// Find the element's parent with the given tag name:\n// $parent(qs('a'), 'div');\nfunction $parent(element, tagName) {\n  if (!element.parentNode) {\n    return undefined\n  }\n  if (element.parentNode.tagName.toLowerCase() === tagName.toLowerCase()) {\n    return element.parentNode\n  }\n  return $parent(element.parentNode, tagName)\n}\n\n// removes an element from an array\n// const x = [1,2,3]\n// remove(x, 2)\n// x ~== [1,3]\nfunction remove(array, thing) {\n  const index = array.indexOf(thing)\n  if (index === -1) {\n    return array\n  }\n  array.splice(index, 1)\n}\n\n// Allow for looping on nodes by chaining:\n// qsa('.foo').forEach(function () {})\nNodeList.prototype.forEach = Array.prototype.forEach\n\n\n\n// WEBPACK FOOTER //\n// ./helpers.js","import 'todomvc-app-css/index.css'\nimport './app.css'\n\nimport {$on} from './helpers'\nimport {updateTodo} from './todo'\n\nexport function onLoad() { // eslint-disable-line import/prefer-default-export\n  updateTodo()\n}\n\n\n\n// WEBPACK FOOTER //\n// ./app.js","export default Controller\n\n/**\n* Takes a model and view and acts as the controller between them\n*\n* @constructor\n* @param {object} model The model instance\n* @param {object} view The view instance\n*/\nfunction Controller(model, view) {\n  var that = this\n  that.model = model\n  that.view = view\n\n  that.view.bind('newTodo', function(title) {\n    that.addItem(title)\n  })\n\n  that.view.bind('itemEdit', function(item) {\n    that.editItem(item.id)\n  })\n\n  that.view.bind('itemEditDone', function(item) {\n    that.editItemSave(item.id, item.title)\n  })\n\n  that.view.bind('itemEditCancel', function(item) {\n    that.editItemCancel(item.id)\n  })\n\n  that.view.bind('itemRemove', function(item) {\n    that.removeItem(item.id)\n  })\n\n  that.view.bind('itemToggle', function(item) {\n    that.toggleComplete(item.id, item.completed)\n  })\n\n  that.view.bind('removeCompleted', function() {\n    that.removeCompletedItems()\n  })\n\n  that.view.bind('toggleAll', function(status) {\n    that.toggleAll(status.completed)\n  })\n}\n\n/**\n* Loads and initialises the view\n*\n* @param {string} '' | 'active' | 'completed'\n*/\nController.prototype.setView = function(locationHash) {\n  var route = locationHash.split('/')[1]\n  var page = route || ''\n  this._updateFilterState(page)\n}\n\n/**\n* An event to fire on load. Will get all items and display them in the\n* todo-list\n*/\nController.prototype.showAll = function() {\n  var that = this\n  that.model.read(function(data) {\n    that.view.render('showEntries', data)\n  })\n}\n\n/**\n* Renders all active tasks\n*/\nController.prototype.showActive = function() {\n  var that = this\n  that.model.read({completed: false}, function(data) {\n    that.view.render('showEntries', data)\n  })\n}\n\n/**\n* Renders all completed tasks\n*/\nController.prototype.showCompleted = function() {\n  var that = this\n  that.model.read({completed: true}, function(data) {\n    that.view.render('showEntries', data)\n  })\n}\n\n/**\n* An event to fire whenever you want to add an item. Simply pass in the event\n* object and it'll handle the DOM insertion and saving of the new item.\n*/\nController.prototype.addItem = function(title) {\n  var that = this\n\n  if (title.trim() === '') {\n    return\n  }\n\n  that.model.create(title, function() {\n    that.view.render('clearNewTodo')\n    that._filter(true)\n  })\n}\n\n/*\n* Triggers the item editing mode.\n*/\nController.prototype.editItem = function(id) {\n  var that = this\n  that.model.read(id, function(data) {\n    that.view.render('editItem', {id, title: data[0].title})\n  })\n}\n\n/*\n* Finishes the item editing mode successfully.\n*/\nController.prototype.editItemSave = function(id, title) {\n  var that = this\n  if (title.trim()) {\n    that.model.update(id, {title}, function() {\n      that.view.render('editItemDone', {id, title})\n    })\n  } else {\n    that.removeItem(id)\n  }\n}\n\n/*\n* Cancels the item editing mode.\n*/\nController.prototype.editItemCancel = function(id) {\n  var that = this\n  that.model.read(id, function(data) {\n    that.view.render('editItemDone', {id, title: data[0].title})\n  })\n}\n\n/**\n* By giving it an ID it'll find the DOM element matching that ID,\n* remove it from the DOM and also remove it from storage.\n*\n* @param {number} id The ID of the item to remove from the DOM and\n* storage\n*/\nController.prototype.removeItem = function(id) {\n  var that = this\n  that.model.remove(id, function() {\n    that.view.render('removeItem', id)\n  })\n\n  that._filter()\n}\n\n/**\n* Will remove all completed items from the DOM and storage.\n*/\nController.prototype.removeCompletedItems = function() {\n  var that = this\n  that.model.read({completed: true}, function(data) {\n    data.forEach(function(item) {\n      that.removeItem(item.id)\n    })\n  })\n\n  that._filter()\n}\n\n/**\n* Give it an ID of a model and a checkbox and it will update the item\n* in storage based on the checkbox's state.\n*\n* @param {number} id The ID of the element to complete or uncomplete\n* @param {object} checkbox The checkbox to check the state of complete\n*                          or not\n* @param {boolean|undefined} silent Prevent re-filtering the todo items\n*/\nController.prototype.toggleComplete = function(id, completed, silent) {\n  var that = this\n  that.model.update(id, {completed}, function() {\n    that.view.render('elementComplete', {\n      id,\n      completed,\n    })\n  })\n\n  if (!silent) {\n    that._filter()\n  }\n}\n\n/**\n* Will toggle ALL checkboxes' on/off state and completeness of models.\n* Just pass in the event object.\n*/\nController.prototype.toggleAll = function(completed) {\n  var that = this\n  that.model.read({completed: !completed}, function(data) {\n    data.forEach(function(item) {\n      that.toggleComplete(item.id, completed, true)\n    })\n  })\n\n  that._filter()\n}\n\n/**\n* Updates the pieces of the page which change depending on the remaining\n* number of todos.\n*/\nController.prototype._updateCount = function() {\n  var that = this\n  that.model.getCount(function(todos) {\n    that.view.render('updateElementCount', todos.active)\n    that.view.render('clearCompletedButton', {\n      completed: todos.completed,\n      visible: todos.completed > 0\n    })\n\n    that.view.render('toggleAll', {checked: todos.completed === todos.total})\n    that.view.render('contentBlockVisibility', {visible: todos.total > 0})\n  })\n}\n\n/**\n* Re-filters the todo items, based on the active route.\n* @param {boolean|undefined} force  forces a re-painting of todo items.\n*/\nController.prototype._filter = function(force) {\n  var activeRoute = this._activeRoute.charAt(0).toUpperCase() + this._activeRoute.substr(1)\n\n  // Update the elements on the page, which change with each completed todo\n  this._updateCount()\n\n  // If the last active route isn't \"All\", or we're switching routes, we\n  // re-create the todo item elements, calling:\n  //   this.show[All|Active|Completed]();\n  if (force || this._lastActiveRoute !== 'All' || this._lastActiveRoute !== activeRoute) {\n    this['show' + activeRoute]()\n  }\n\n  this._lastActiveRoute = activeRoute\n}\n\n/**\n* Simply updates the filter nav's selected states\n*/\nController.prototype._updateFilterState = function(currentPage) {\n  // Store a reference to the active route, allowing us to re-filter todo\n  // items as they are marked complete or incomplete.\n  currentPage = currentPage.split('?')[0]\n  this._activeRoute = currentPage\n\n  if (currentPage === '') {\n    this._activeRoute = 'All'\n  }\n\n  this._filter()\n\n  this.view.render('setFilter', currentPage)\n}\n\n\n\n// WEBPACK FOOTER //\n// ./controller.js","(function(root) {\n  var localStorageMemory = {};\n  var cache = {};\n\n  /**\n   * number of stored items.\n   */\n  localStorageMemory.length = 0;\n\n  /**\n   * returns item for passed key, or null\n   *\n   * @para {String} key\n   *       name of item to be returned\n   * @returns {String|null}\n   */\n  localStorageMemory.getItem = function(key) {\n    return cache[key] || null;\n  };\n\n  /**\n   * sets item for key to passed value, as String\n   *\n   * @para {String} key\n   *       name of item to be set\n   * @para {String} value\n   *       value, will always be turned into a String\n   * @returns {undefined}\n   */\n  localStorageMemory.setItem = function(key, value) {\n    if (typeof value === 'undefined') {\n      localStorageMemory.removeItem(key);\n    } else {\n      if (!(cache.hasOwnProperty(key))) {\n        localStorageMemory.length++;\n      }\n\n      cache[key] = '' + value;\n    }\n  };\n\n  /**\n   * removes item for passed key\n   *\n   * @para {String} key\n   *       name of item to be removed\n   * @returns {undefined}\n   */\n  localStorageMemory.removeItem = function(key) {\n    if (cache.hasOwnProperty(key)) {\n      delete cache[key];\n      localStorageMemory.length--;\n    }\n  };\n\n  /**\n   * returns name of key at passed index\n   *\n   * @para {Number} index\n   *       Position for key to be returned (starts at 0)\n   * @returns {String|null}\n   */\n  localStorageMemory.key = function(index) {\n    return Object.keys(cache)[index] || null;\n  };\n\n  /**\n   * removes all stored items and sets length to 0\n   *\n   * @returns {undefined}\n   */\n  localStorageMemory.clear = function() {\n    cache = {};\n    localStorageMemory.length = 0;\n  };\n\n  if (typeof exports === 'object') {\n    module.exports = localStorageMemory;\n  } else {\n    root.localStorageMemory = localStorageMemory;\n  }\n})(this);\n\n\n// WEBPACK FOOTER //\n// ./memory.js","export default Model\n\n/**\n* Creates a new Model instance and hooks up the storage.\n*\n* @constructor\n* @param {object} storage A reference to the client side storage class\n*/\nfunction Model(storage) {\n  this.storage = storage\n}\n\n/**\n* Creates a new todo model\n*\n* @param {string} [title] The title of the task\n* @param {function} [callback] The callback to fire after the model is created\n*/\nModel.prototype.create = function(title, callback) {\n  title = title || ''\n  callback = callback || function() {\n  }\n\n  var newItem = {\n    title: title.trim(),\n    completed: false\n  }\n\n  this.storage.save(newItem, callback)\n}\n\n/**\n * Finds and returns a model in storage. If no query is given it'll simply\n * return everything. If you pass in a string or number it'll look that up as\n * the ID of the model to find. Lastly, you can pass it an object to match against.\n *\n * @param {string|number|object} [query] A query to match models against\n * @param {function} [callback] The callback to fire after the model is found\n *\n * @example\n * model.read(1, func); // Will find the model with an ID of 1\n * model.read('1'); // Same as above\n * //Below will find a model with foo equalling bar and hello equalling world.\n * model.read({ foo: 'bar', hello: 'world' });\n */\nModel.prototype.read = function(query, callback) {\n  var queryType = typeof query\n  callback = callback || function() {\n  }\n\n  if (queryType === 'function') {\n    callback = query\n    return this.storage.findAll(callback)\n  } else if (queryType === 'string' || queryType === 'number') {\n    query = parseInt(query, 10)\n    this.storage.find({id: query}, callback)\n  } else {\n    this.storage.find(query, callback)\n  }\n  return undefined\n}\n\n/**\n* Updates a model by giving it an ID, data to update, and a callback to fire when\n* the update is complete.\n*\n* @param {number} id The id of the model to update\n* @param {object} data The properties to update and their new value\n* @param {function} callback The callback to fire when the update is complete.\n*/\nModel.prototype.update = function(id, data, callback) {\n  this.storage.save(data, callback, id)\n}\n\n/**\n* Removes a model from storage\n*\n* @param {number} id The ID of the model to remove\n* @param {function} callback The callback to fire when the removal is complete.\n*/\nModel.prototype.remove = function(id, callback) {\n  this.storage.remove(id, callback)\n}\n\n/**\n* WARNING: Will remove ALL data from storage.\n*\n* @param {function} callback The callback to fire when the storage is wiped.\n*/\nModel.prototype.removeAll = function(callback) {\n  this.storage.drop(callback)\n}\n\n/**\n* Returns a count of all todos\n*/\nModel.prototype.getCount = function(callback) {\n  var todos = {\n    active: 0,\n    completed: 0,\n    total: 0\n  }\n\n  this.storage.findAll(function(data) {\n    data.forEach(function(todo) {\n      if (todo.completed) {\n        todos.completed++\n      } else {\n        todos.active++\n      }\n\n      todos.total++\n    })\n    callback(todos)\n  })\n}\n\n\n\n// WEBPACK FOOTER //\n// ./model.js","import {remove} from './helpers'\nimport * as localStorageMemory from './memory'\nexport default Store\n\n/**\n * Creates a new client side storage object and will create an empty\n * collection if no collection already exists.\n *\n * @param {string} name The name of our DB we want to use\n * @param {function} callback Our fake DB uses callbacks because in\n * real life you probably would be making AJAX calls\n */\nfunction Store(name, callback) {\n  callback = callback || function() {\n  }\n\n  this._dbName = name\n\n  if (!localStorageMemory[name]) {\n    var data = {\n      todos: []\n    }\n\n    localStorageMemory[name] = JSON.stringify(data)\n  }\n\n  callback.call(this, JSON.parse(localStorageMemory[name]))\n  this.subscribers = []\n}\n\nStore.prototype.subscribe = function(subscriber) {\n  this.subscribers.push(subscriber)\n  return () => remove(this.subscribers, subscriber)\n}\n\nStore.prototype._notify = function() {\n  this.subscribers.forEach(s => s())\n}\n\n/**\n* Finds items based on a query given as a JS object\n*\n* @param {object} query The query to match against (i.e. {foo: 'bar'})\n* @param {function} callback   The callback to fire when the query has\n* completed running\n*\n* @example\n* db.find({foo: 'bar', hello: 'world'}, function (data) {\n*   // data will return any items that have foo: bar and\n*   // hello: world in their properties\n* });\n*/\nStore.prototype.find = function(query, callback) {\n  if (!callback) {\n    return\n  }\n\n  var todos = JSON.parse(localStorageMemory[this._dbName]).todos\n\n  callback.call(this, todos.filter(function(todo) {\n    for (var q in query) {\n      if (query[q] !== todo[q]) {\n        return false\n      }\n    }\n    return true\n  }))\n}\n\n/**\n* Will retrieve all data from the collection\n*\n* @param {function} callback The callback to fire upon retrieving data\n*/\nStore.prototype.findAll = function(callback) {\n  callback = callback || function() {\n  }\n  callback.call(this, JSON.parse(localStorageMemory[this._dbName]).todos)\n}\n\n/**\n* Will save the given data to the DB. If no item exists it will create a new\n* item, otherwise it'll simply update an existing item's properties\n*\n* @param {object} updateData The data to save back into the DB\n* @param {function} callback The callback to fire after saving\n* @param {number} id An optional param to enter an ID of an item to update\n*/\nStore.prototype.save = function(updateData, callback, id) {\n  var data = JSON.parse(localStorageMemory[this._dbName])\n  var todos = data.todos\n\n  callback = callback || function() {\n  }\n\n  // If an ID was actually given, find the item and update each property\n  if (id) {\n    for (var i = 0; i < todos.length; i++) {\n      if (todos[i].id === id) {\n        for (var key in updateData) { // eslint-disable-line guard-for-in\n          todos[i][key] = updateData[key]\n        }\n        break\n      }\n    }\n\n    localStorageMemory[this._dbName] = JSON.stringify(data)\n    callback.call(this, JSON.parse(localStorageMemory[this._dbName]).todos)\n  } else {\n    // Generate an ID\n    updateData.id = new Date().getTime()\n\n    todos.push(updateData)\n    localStorageMemory[this._dbName] = JSON.stringify(data)\n    callback.call(this, [updateData])\n  }\n  this._notify()\n}\n\n/**\n* Will remove an item from the Store based on its ID\n*\n* @param {number} id The ID of the item you want to remove\n* @param {function} callback The callback to fire after saving\n*/\nStore.prototype.remove = function(id, callback) {\n  var data = JSON.parse(localStorageMemory[this._dbName])\n  var todos = data.todos\n\n  for (var i = 0; i < todos.length; i++) {\n    if (todos[i].id === id) {\n      todos.splice(i, 1)\n      break\n    }\n  }\n\n  localStorageMemory[this._dbName] = JSON.stringify(data)\n  callback.call(this, JSON.parse(localStorageMemory[this._dbName]).todos)\n  this._notify()\n}\n\n/**\n* Will drop all storage and start fresh\n*\n* @param {function} callback The callback to fire after dropping the data\n*/\nStore.prototype.drop = function(callback) {\n  localStorageMemory[this._dbName] = JSON.stringify({todos: []})\n  callback.call(this, JSON.parse(localStorageMemory[this._dbName]).todos)\n  this._notify()\n}\n\n\n\n// WEBPACK FOOTER //\n// ./store.js","export default Template\n\nvar htmlEscapes = {\n  '&': '&amp;',\n  '<': '&lt;',\n  '>': '&gt;',\n  '\"': '&quot;',\n  '\\'': '&#x27;',\n  '`': '&#x60;'\n}\n\nvar escapeHtmlChar = function(chr) {\n  return htmlEscapes[chr]\n}\n\nvar reUnescapedHtml = /[&<>\"'`]/g\nvar reHasUnescapedHtml = new RegExp(reUnescapedHtml.source)\n\nvar escape = function(string) {\n  if (string && reHasUnescapedHtml.test(string)) {\n    return string.replace(reUnescapedHtml, escapeHtmlChar)\n  } else {\n    return string\n  }\n}\n\n/**\n* Sets up defaults for all the Template methods such as a default template\n*\n* @constructor\n*/\nfunction Template() {\n  this.defaultTemplate = `\n    <li data-id=\"{{id}}\" class=\"{{completed}}\">\n      <div class=\"view\">\n        <input class=\"toggle\" type=\"checkbox\" {{checked}} />\n        <label>{{title}}</label>\n        <button class=\"destroy\"></button>\n      </div>\n    </li>\n  `\n}\n\n/**\n * Creates an <li> HTML string and returns it for placement in your app.\n *\n * NOTE: In real life you should be using a templating engine such as Mustache\n * or Handlebars, however, this is a vanilla JS example.\n *\n * @param {object} data The object containing keys you want to find in the\n *                      template to replace.\n * @returns {string} HTML String of an <li> element\n *\n * @example\n * view.show({\n *  id: 1,\n *  title: \"Hello World\",\n *  completed: 0,\n * });\n */\nTemplate.prototype.show = function(data) {\n  var i, l\n  var view = ''\n\n  for (i = 0, l = data.length; i < l; i++) {\n    var template = this.defaultTemplate\n    var completed = ''\n    var checked = ''\n\n    if (data[i].completed) {\n      completed = 'completed'\n      checked = 'checked'\n    }\n\n    template = template.replace('{{id}}', data[i].id)\n    template = template.replace('{{title}}', escape(data[i].title))\n    template = template.replace('{{completed}}', completed)\n    template = template.replace('{{checked}}', checked)\n\n    view = view + template\n  }\n\n  return view\n}\n\n/**\n * Displays a counter of how many to dos are left to complete\n *\n * @param {number} activeTodos The number of active todos.\n * @returns {string} String containing the count\n */\nTemplate.prototype.itemCounter = function(activeTodos) {\n  var plural = activeTodos === 1 ? '' : 's'\n\n  return '<strong>' + activeTodos + '</strong> item' + plural + ' left'\n}\n\n/**\n * Updates the text within the \"Clear completed\" button\n *\n * @param  {[type]} completedTodos The number of completed todos.\n * @returns {string} String containing the count\n */\nTemplate.prototype.clearCompletedButton = function(completedTodos) {\n  if (completedTodos > 0) {\n    return 'Clear completed'\n  } else {\n    return ''\n  }\n}\n\n\n\n// WEBPACK FOOTER //\n// ./template.js","import View from './view'\nimport Controller from './controller'\nimport Model from './model'\nimport Store from './store'\nimport Template from './template'\nimport {remove} from './helpers'\n\nexport {updateTodo, getTodo, subscribe}\n\nlet todo\nconst subscribers = []\n\n/**\n * Sets up a brand new Todo list.\n *\n * @param {string} name The name of your new to do list.\n */\nfunction Todo(name) {\n  this.storage = new Store(name)\n  this.model = new Model(this.storage)\n  this.template = new Template()\n  this.view = new View(this.template)\n  this.controller = new Controller(this.model, this.view)\n}\n\nfunction updateTodo() {\n  todo = new Todo('todos-vanillajs')\n  todo.controller.setView(document.location.hash)\n  subscribers.forEach(s => s())\n}\n\nfunction getTodo() {\n  return todo\n}\n\nfunction subscribe(cb) {\n  subscribers.push(cb)\n  return function unsubscribe() {\n    remove(subscribers, cb)\n  }\n}\n\n\n\n// WEBPACK FOOTER //\n// ./todo.js","/* eslint no-invalid-this: 0, complexity:[2, 9] */\nimport {qs, qsa, $on, $parent, $delegate} from './helpers'\n\n/**\n * View that abstracts away the browser's DOM completely.\n * It has two simple entry points:\n *\n *   - bind(eventName, handler)\n *     Takes a todo application event and registers the handler\n *   - render(command, parameterObject)\n *     Renders the given command with the options\n */\nexport default class View {\n  constructor(template) {\n    this.template = template\n\n    this.ENTER_KEY = 13\n    this.ESCAPE_KEY = 27\n\n    this.$todoList = qs('.todo-list')\n    this.$todoItemCounter = qs('.todo-count')\n    this.$clearCompleted = qs('.clear-completed')\n    this.$main = qs('.main')\n    this.$footer = qs('.footer')\n    this.$toggleAll = qs('.toggle-all')\n    this.$newTodo = qs('.new-todo')\n  }\n\n  _removeItem(id) {\n    var elem = qs('[data-id=\"' + id + '\"]')\n\n    if (elem) {\n      this.$todoList.removeChild(elem)\n    }\n  }\n\n  _clearCompletedButton(completedCount, visible) {\n    this.$clearCompleted.innerHTML = this.template.clearCompletedButton(completedCount)\n    this.$clearCompleted.style.display = visible ? 'block' : 'none'\n  }\n\n  _editItemDone(id, title) {\n    var listItem = qs('[data-id=\"' + id + '\"]')\n\n    if (!listItem) {\n      return\n    }\n\n    var input = qs('input.edit', listItem)\n    listItem.removeChild(input)\n\n    listItem.className = listItem.className.replace('editing', '')\n\n    qsa('label', listItem).forEach(function(label) {\n      label.textContent = title\n    })\n  }\n\n  render(viewCmd, parameter) {\n    var that = this\n    var viewCommands = {\n      showEntries: function() {\n        that.$todoList.innerHTML = that.template.show(parameter)\n      },\n      removeItem: function() {\n        that._removeItem(parameter)\n      },\n      updateElementCount: function() {\n        that.$todoItemCounter.innerHTML = that.template.itemCounter(parameter)\n      },\n      clearCompletedButton: function() {\n        that._clearCompletedButton(parameter.completed, parameter.visible)\n      },\n      contentBlockVisibility: function() {\n        that.$main.style.display = that.$footer.style.display = parameter.visible ? 'block' : 'none'\n      },\n      toggleAll: function() {\n        that.$toggleAll.checked = parameter.checked\n      },\n      setFilter: function() {\n        _setFilter(parameter)\n      },\n      clearNewTodo: function() {\n        that.$newTodo.value = ''\n      },\n      elementComplete: function() {\n        _elementComplete(parameter.id, parameter.completed)\n      },\n      editItem: function() {\n        _editItem(parameter.id, parameter.title)\n      },\n      editItemDone: function() {\n        that._editItemDone(parameter.id, parameter.title)\n      }\n    }\n\n    viewCommands[viewCmd]()\n  }\n\n  _bindItemEditDone(handler) {\n    var that = this\n    $delegate(that.$todoList, 'li .edit', 'blur', function() {\n      if (!this.dataset.iscanceled) {\n        handler({\n          id: _itemId(this),\n          title: this.value\n        })\n      }\n    })\n\n    $delegate(that.$todoList, 'li .edit', 'keypress', function(event) {\n      if (event.keyCode === that.ENTER_KEY) {\n        // Remove the cursor from the input when you hit enter just like if it\n        // were a real form\n        this.blur()\n      }\n    })\n  }\n\n  _bindItemEditCancel(handler) {\n    var that = this\n    $delegate(that.$todoList, 'li .edit', 'keyup', function(event) {\n      if (event.keyCode === that.ESCAPE_KEY) {\n        this.dataset.iscanceled = true\n        this.blur()\n\n        handler({id: _itemId(this)})\n      }\n    })\n  }\n\n  bind(event, handler) {\n    var that = this\n    if (event === 'newTodo') {\n      $on(that.$newTodo, 'change', function() {\n        handler(that.$newTodo.value)\n      })\n\n    } else if (event === 'removeCompleted') {\n      $on(that.$clearCompleted, 'click', function() {\n        handler()\n      })\n\n    } else if (event === 'toggleAll') {\n      $on(that.$toggleAll, 'click', function() {\n        handler({completed: this.checked})\n      })\n\n    } else if (event === 'itemEdit') {\n      $delegate(that.$todoList, 'li label', 'dblclick', function() {\n        handler({id: _itemId(this)})\n      })\n\n    } else if (event === 'itemRemove') {\n      $delegate(that.$todoList, '.destroy', 'click', function() {\n        handler({id: _itemId(this)})\n      })\n\n    } else if (event === 'itemToggle') {\n      $delegate(that.$todoList, '.toggle', 'click', function() {\n        handler({\n          id: _itemId(this),\n          completed: this.checked\n        })\n      })\n\n    } else if (event === 'itemEditDone') {\n      that._bindItemEditDone(handler)\n\n    } else if (event === 'itemEditCancel') {\n      that._bindItemEditCancel(handler)\n    }\n  }\n}\n\nfunction _setFilter(currentPage) {\n  qs('.filters .selected').className = ''\n  qs('.filters [href=\"#/' + currentPage + '\"]').className = 'selected'\n}\n\nfunction _elementComplete(id, completed) {\n  var listItem = qs('[data-id=\"' + id + '\"]')\n\n  if (!listItem) {\n    return\n  }\n\n  listItem.className = completed ? 'completed' : ''\n\n  // In case it was toggled from an event and not by clicking the checkbox\n  qs('input', listItem).checked = completed\n}\n\nfunction _editItem(id, title) {\n  var listItem = qs('[data-id=\"' + id + '\"]')\n\n  if (!listItem) {\n    return\n  }\n\n  listItem.className = listItem.className + ' editing'\n\n  var input = document.createElement('input')\n  input.className = 'edit'\n\n  listItem.appendChild(input)\n  input.focus()\n  input.value = title\n}\n\nfunction _itemId(element) {\n  var li = $parent(element, 'li')\n  return parseInt(li.dataset.id, 10)\n}\n\n\n\n// WEBPACK FOOTER //\n// ./view.js","/* eslint no-console:0 */\nimport {onLoad} from './app'\nimport {$on} from './helpers'\n\n// this is only relevant when using `hot` mode with webpack\n// special thanks to Eric Clemmons: https://github.com/ericclemmons/webpack-hot-server-example\nconst reloading = document.readyState === 'complete'\nif (module.hot) {\n  module.hot.accept(function(err) {\n  })\n  if (reloading) {\n    onLoad()\n  } else {\n    bootstrap()\n  }\n} else {\n  bootstrap()\n}\n\nfunction bootstrap() {\n  $on(window, 'load', onLoad)\n  $on(window, 'hashchange', onLoad)\n}\n\n\n\n// WEBPACK FOOTER //\n// ./bootstrap.js"],"sourceRoot":""}
\ No newline at end of file
diff --git a/PerformanceTests/Speedometer/resources/todomvc/vanilla-examples/es2015-babel-webpack/dist/bundle.manifest.112bf70a7f3deebf1f93.js b/PerformanceTests/Speedometer/resources/todomvc/vanilla-examples/es2015-babel-webpack/dist/bundle.manifest.112bf70a7f3deebf1f93.js
deleted file mode 100644 (file)
index fdbe482..0000000
+++ /dev/null
@@ -1,2 +0,0 @@
-!function(e){function r(n){if(t[n])return t[n].exports;var o=t[n]={i:n,l:!1,exports:{}};return e[n].call(o.exports,o,o.exports,r),o.l=!0,o.exports}var n=window.webpackJsonp;window.webpackJsonp=function(t,c,u){for(var a,i,f,l=0,s=[];l<t.length;l++)i=t[l],o[i]&&s.push(o[i][0]),o[i]=0;for(a in c)Object.prototype.hasOwnProperty.call(c,a)&&(e[a]=c[a]);for(n&&n(t,c,u);s.length;)s.shift()();if(u)for(l=0;l<u.length;l++)f=r(r.s=u[l]);return f};var t={},o={2:0};r.e=function(e){function n(){c.onerror=c.onload=null,clearTimeout(u);var r=o[e];0!==r&&(r&&r[1](new Error("Loading chunk "+e+" failed.")),o[e]=void 0)}if(0===o[e])return Promise.resolve();if(o[e])return o[e][2];var t=document.getElementsByTagName("head")[0],c=document.createElement("script");c.type="text/javascript",c.charset="utf-8",c.async=!0,c.timeout=12e4,c.src=r.p+"bundle."+e+"."+{0:"73bcc5d3c1d07180f0e3",1:"efaa3e0e20077c8e7471"}[e]+".js";var u=setTimeout(n,12e4);c.onerror=c.onload=n,t.appendChild(c);var a=new Promise(function(r,n){o[e]=[r,n]});return o[e][2]=a},r.m=e,r.c=t,r.i=function(e){return e},r.d=function(e,r,n){Object.defineProperty(e,r,{configurable:!1,enumerable:!0,get:n})},r.n=function(e){var n=e&&e.__esModule?function(){return e["default"]}:function(){return e};return r.d(n,"a",n),n},r.o=function(e,r){return Object.prototype.hasOwnProperty.call(e,r)},r.p="",r.oe=function(e){throw console.error(e),e}}([]);
-//# sourceMappingURL=bundle.manifest.112bf70a7f3deebf1f93.js.map
\ No newline at end of file
diff --git a/PerformanceTests/Speedometer/resources/todomvc/vanilla-examples/es2015-babel-webpack/dist/bundle.manifest.a55034b424c795b1a9a8.js b/PerformanceTests/Speedometer/resources/todomvc/vanilla-examples/es2015-babel-webpack/dist/bundle.manifest.a55034b424c795b1a9a8.js
new file mode 100644 (file)
index 0000000..e9c8bb7
--- /dev/null
@@ -0,0 +1,2 @@
+!function(e){function r(n){if(t[n])return t[n].exports;var o=t[n]={i:n,l:!1,exports:{}};return e[n].call(o.exports,o,o.exports,r),o.l=!0,o.exports}var n=window.webpackJsonp;window.webpackJsonp=function(t,u,a){for(var i,c,f,l=0,s=[];l<t.length;l++)c=t[l],o[c]&&s.push(o[c][0]),o[c]=0;for(i in u)Object.prototype.hasOwnProperty.call(u,i)&&(e[i]=u[i]);for(n&&n(t,u,a);s.length;)s.shift()();if(a)for(l=0;l<a.length;l++)f=r(r.s=a[l]);return f};var t={},o={2:0};r.e=function(e){function n(){u.onerror=u.onload=null,clearTimeout(a);var r=o[e];0!==r&&(r&&r[1](new Error("Loading chunk "+e+" failed.")),o[e]=void 0)}if(0===o[e])return Promise.resolve();if(o[e])return o[e][2];var t=document.getElementsByTagName("head")[0],u=document.createElement("script");u.type="text/javascript",u.charset="utf-8",u.async=!0,u.timeout=12e4,u.src=r.p+"bundle."+e+"."+{0:"9debb1b0a94f14d0ebe9",1:"bade2cb8992d8a68d0d7"}[e]+".js";var a=setTimeout(n,12e4);u.onerror=u.onload=n,t.appendChild(u);var i=new Promise(function(r,n){o[e]=[r,n]});return o[e][2]=i},r.m=e,r.c=t,r.i=function(e){return e},r.d=function(e,r,n){Object.defineProperty(e,r,{configurable:!1,enumerable:!0,get:n})},r.n=function(e){var n=e&&e.__esModule?function(){return e["default"]}:function(){return e};return r.d(n,"a",n),n},r.o=function(e,r){return Object.prototype.hasOwnProperty.call(e,r)},r.p="",r.oe=function(e){throw console.error(e),e}}([]);
+//# sourceMappingURL=bundle.manifest.a55034b424c795b1a9a8.js.map
\ No newline at end of file
@@ -1 +1 @@
-{"version":3,"sources":["webpack:///bundle.manifest.112bf70a7f3deebf1f93.js","webpack:///webpack/bootstrap d32b2cef151447642421"],"names":["modules","__webpack_require__","moduleId","installedModules","exports","module","i","l","call","parentJsonpFunction","window","chunkIds","moreModules","executeModules","chunkId","result","resolves","length","installedChunks","push","Object","prototype","hasOwnProperty","shift","s","2","e","onScriptComplete","script","onerror","onload","clearTimeout","timeout","chunk","Error","undefined","Promise","resolve","head","document","getElementsByTagName","createElement","type","charset","async","src","p","0","1","setTimeout","appendChild","promise","reject","m","c","value","d","name","getter","defineProperty","configurable","enumerable","get","n","__esModule","o","object","property","oe","err","console","error"],"mappings":"CAAS,SAAUA,GCqCnB,QAAAC,GAAAC,GAGA,GAAAC,EAAAD,GACA,MAAAC,GAAAD,GAAAE,OAGA,IAAAC,GAAAF,EAAAD,IACAI,EAAAJ,EACAK,GAAA,EACAH,WAUA,OANAJ,GAAAE,GAAAM,KAAAH,EAAAD,QAAAC,IAAAD,QAAAH,GAGAI,EAAAE,GAAA,EAGAF,EAAAD,QAxDA,GAAAK,GAAAC,OAAA,YACAA,QAAA,sBAAAC,EAAAC,EAAAC,GAIA,IADA,GAAAX,GAAAY,EAAAC,EAAAT,EAAA,EAAAU,KACQV,EAAAK,EAAAM,OAAoBX,IAC5BQ,EAAAH,EAAAL,GACAY,EAAAJ,IACAE,EAAAG,KAAAD,EAAAJ,GAAA,IACAI,EAAAJ,GAAA,CAEA,KAAAZ,IAAAU,GACAQ,OAAAC,UAAAC,eAAAd,KAAAI,EAAAV,KACAF,EAAAE,GAAAU,EAAAV,GAIA,KADAO,KAAAE,EAAAC,EAAAC,GACAG,EAAAC,QACAD,EAAAO,SACA,IAAAV,EACA,IAAAP,EAAA,EAAYA,EAAAO,EAAAI,OAA2BX,IACvCS,EAAAd,IAAAuB,EAAAX,EAAAP,GAGA,OAAAS,GAIA,IAAAZ,MAGAe,GACAO,EAAA,EA6BAxB,GAAAyB,EAAA,SAAAZ,GAmBA,QAAAa,KAEAC,EAAAC,QAAAD,EAAAE,OAAA,KACAC,aAAAC,EACA,IAAAC,GAAAf,EAAAJ,EACA,KAAAmB,IACAA,KAAA,MAAAC,OAAA,iBAAApB,EAAA,aACAI,EAAAJ,GAAAqB,QAzBA,OAAAjB,EAAAJ,GACA,MAAAsB,SAAAC,SAGA,IAAAnB,EAAAJ,GACA,MAAAI,GAAAJ,GAAA,EAGA,IAAAwB,GAAAC,SAAAC,qBAAA,WACAZ,EAAAW,SAAAE,cAAA,SACAb,GAAAc,KAAA,kBACAd,EAAAe,QAAA,QACAf,EAAAgB,OAAA,EACAhB,EAAAI,QAAA,KAEAJ,EAAAiB,IAAA5C,EAAA6C,EAAA,UAAAhC,EAAA,KAAqEiC,EAAA,uBAAAC,EAAA,wBAAsDlC,GAAA,KAC3H,IAAAkB,GAAAiB,WAAAtB,EAAA,KACAC,GAAAC,QAAAD,EAAAE,OAAAH,EAWAW,EAAAY,YAAAtB,EAEA,IAAAuB,GAAA,GAAAf,SAAA,SAAAC,EAAAe,GACAlC,EAAAJ,IAAAuB,EAAAe,IAEA,OAAAlC,GAAAJ,GAAA,GAAAqC,GAIAlD,EAAAoD,EAAArD,EAGAC,EAAAqD,EAAAnD,EAGAF,EAAAK,EAAA,SAAAiD,GAA2C,MAAAA,IAG3CtD,EAAAuD,EAAA,SAAApD,EAAAqD,EAAAC,GACAtC,OAAAuC,eAAAvD,EAAAqD,GACAG,cAAA,EACAC,YAAA,EACAC,IAAAJ,KAKAzD,EAAA8D,EAAA,SAAA1D,GACA,GAAAqD,GAAArD,KAAA2D,WACA,WAA2B,MAAA3D,GAAA,YAC3B,WAAiC,MAAAA,GAEjC,OADAJ,GAAAuD,EAAAE,EAAA,IAAAA,GACAA,GAIAzD,EAAAgE,EAAA,SAAAC,EAAAC,GAAsD,MAAA/C,QAAAC,UAAAC,eAAAd,KAAA0D,EAAAC,IAGtDlE,EAAA6C,EAAA,GAGA7C,EAAAmE,GAAA,SAAAC,GAA8D,KAApBC,SAAAC,MAAAF,GAAoBA","file":"bundle.manifest.112bf70a7f3deebf1f93.js","sourcesContent":["/******/ (function(modules) { // webpackBootstrap\n/******/ \t// install a JSONP callback for chunk loading\n/******/ \tvar parentJsonpFunction = window[\"webpackJsonp\"];\n/******/ \twindow[\"webpackJsonp\"] = function webpackJsonpCallback(chunkIds, moreModules, executeModules) {\n/******/ \t\t// add \"moreModules\" to the modules object,\n/******/ \t\t// then flag all \"chunkIds\" as loaded and fire callback\n/******/ \t\tvar moduleId, chunkId, i = 0, resolves = [], result;\n/******/ \t\tfor(;i < chunkIds.length; i++) {\n/******/ \t\t\tchunkId = chunkIds[i];\n/******/ \t\t\tif(installedChunks[chunkId])\n/******/ \t\t\t\tresolves.push(installedChunks[chunkId][0]);\n/******/ \t\t\tinstalledChunks[chunkId] = 0;\n/******/ \t\t}\n/******/ \t\tfor(moduleId in moreModules) {\n/******/ \t\t\tif(Object.prototype.hasOwnProperty.call(moreModules, moduleId)) {\n/******/ \t\t\t\tmodules[moduleId] = moreModules[moduleId];\n/******/ \t\t\t}\n/******/ \t\t}\n/******/ \t\tif(parentJsonpFunction) parentJsonpFunction(chunkIds, moreModules, executeModules);\n/******/ \t\twhile(resolves.length)\n/******/ \t\t\tresolves.shift()();\n/******/ \t\tif(executeModules) {\n/******/ \t\t\tfor(i=0; i < executeModules.length; i++) {\n/******/ \t\t\t\tresult = __webpack_require__(__webpack_require__.s = executeModules[i]);\n/******/ \t\t\t}\n/******/ \t\t}\n/******/ \t\treturn result;\n/******/ \t};\n/******/\n/******/ \t// The module cache\n/******/ \tvar installedModules = {};\n/******/\n/******/ \t// objects to store loaded and loading chunks\n/******/ \tvar installedChunks = {\n/******/ \t\t2: 0\n/******/ \t};\n/******/\n/******/ \t// The require function\n/******/ \tfunction __webpack_require__(moduleId) {\n/******/\n/******/ \t\t// Check if module is in cache\n/******/ \t\tif(installedModules[moduleId])\n/******/ \t\t\treturn installedModules[moduleId].exports;\n/******/\n/******/ \t\t// Create a new module (and put it into the cache)\n/******/ \t\tvar module = installedModules[moduleId] = {\n/******/ \t\t\ti: moduleId,\n/******/ \t\t\tl: false,\n/******/ \t\t\texports: {}\n/******/ \t\t};\n/******/\n/******/ \t\t// Execute the module function\n/******/ \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n/******/\n/******/ \t\t// Flag the module as loaded\n/******/ \t\tmodule.l = true;\n/******/\n/******/ \t\t// Return the exports of the module\n/******/ \t\treturn module.exports;\n/******/ \t}\n/******/\n/******/ \t// This file contains only the entry chunk.\n/******/ \t// The chunk loading function for additional chunks\n/******/ \t__webpack_require__.e = function requireEnsure(chunkId) {\n/******/ \t\tif(installedChunks[chunkId] === 0)\n/******/ \t\t\treturn Promise.resolve();\n/******/\n/******/ \t\t// an Promise means \"currently loading\".\n/******/ \t\tif(installedChunks[chunkId]) {\n/******/ \t\t\treturn installedChunks[chunkId][2];\n/******/ \t\t}\n/******/ \t\t// start chunk loading\n/******/ \t\tvar head = document.getElementsByTagName('head')[0];\n/******/ \t\tvar script = document.createElement('script');\n/******/ \t\tscript.type = 'text/javascript';\n/******/ \t\tscript.charset = 'utf-8';\n/******/ \t\tscript.async = true;\n/******/ \t\tscript.timeout = 120000;\n/******/\n/******/ \t\tscript.src = __webpack_require__.p + \"bundle.\" + chunkId + \".\" + {\"0\":\"73bcc5d3c1d07180f0e3\",\"1\":\"efaa3e0e20077c8e7471\"}[chunkId] + \".js\";\n/******/ \t\tvar timeout = setTimeout(onScriptComplete, 120000);\n/******/ \t\tscript.onerror = script.onload = onScriptComplete;\n/******/ \t\tfunction onScriptComplete() {\n/******/ \t\t\t// avoid mem leaks in IE.\n/******/ \t\t\tscript.onerror = script.onload = null;\n/******/ \t\t\tclearTimeout(timeout);\n/******/ \t\t\tvar chunk = installedChunks[chunkId];\n/******/ \t\t\tif(chunk !== 0) {\n/******/ \t\t\t\tif(chunk) chunk[1](new Error('Loading chunk ' + chunkId + ' failed.'));\n/******/ \t\t\t\tinstalledChunks[chunkId] = undefined;\n/******/ \t\t\t}\n/******/ \t\t};\n/******/ \t\thead.appendChild(script);\n/******/\n/******/ \t\tvar promise = new Promise(function(resolve, reject) {\n/******/ \t\t\tinstalledChunks[chunkId] = [resolve, reject];\n/******/ \t\t});\n/******/ \t\treturn installedChunks[chunkId][2] = promise;\n/******/ \t};\n/******/\n/******/ \t// expose the modules object (__webpack_modules__)\n/******/ \t__webpack_require__.m = modules;\n/******/\n/******/ \t// expose the module cache\n/******/ \t__webpack_require__.c = installedModules;\n/******/\n/******/ \t// identity function for calling harmory imports with the correct context\n/******/ \t__webpack_require__.i = function(value) { return value; };\n/******/\n/******/ \t// define getter function for harmory exports\n/******/ \t__webpack_require__.d = function(exports, name, getter) {\n/******/ \t\tObject.defineProperty(exports, name, {\n/******/ \t\t\tconfigurable: false,\n/******/ \t\t\tenumerable: true,\n/******/ \t\t\tget: getter\n/******/ \t\t});\n/******/ \t};\n/******/\n/******/ \t// getDefaultExport function for compatibility with non-harmony modules\n/******/ \t__webpack_require__.n = function(module) {\n/******/ \t\tvar getter = module && module.__esModule ?\n/******/ \t\t\tfunction getDefault() { return module['default']; } :\n/******/ \t\t\tfunction getModuleExports() { return module; };\n/******/ \t\t__webpack_require__.d(getter, 'a', getter);\n/******/ \t\treturn getter;\n/******/ \t};\n/******/\n/******/ \t// Object.prototype.hasOwnProperty.call\n/******/ \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n/******/\n/******/ \t// __webpack_public_path__\n/******/ \t__webpack_require__.p = \"\";\n/******/\n/******/ \t// on error function for async loading\n/******/ \t__webpack_require__.oe = function(err) { console.error(err); throw err; };\n/******/ })\n/************************************************************************/\n/******/ ([]);\n\n\n// WEBPACK FOOTER //\n// bundle.manifest.112bf70a7f3deebf1f93.js"," \t// install a JSONP callback for chunk loading\n \tvar parentJsonpFunction = window[\"webpackJsonp\"];\n \twindow[\"webpackJsonp\"] = function webpackJsonpCallback(chunkIds, moreModules, executeModules) {\n \t\t// add \"moreModules\" to the modules object,\n \t\t// then flag all \"chunkIds\" as loaded and fire callback\n \t\tvar moduleId, chunkId, i = 0, resolves = [], result;\n \t\tfor(;i < chunkIds.length; i++) {\n \t\t\tchunkId = chunkIds[i];\n \t\t\tif(installedChunks[chunkId])\n \t\t\t\tresolves.push(installedChunks[chunkId][0]);\n \t\t\tinstalledChunks[chunkId] = 0;\n \t\t}\n \t\tfor(moduleId in moreModules) {\n \t\t\tif(Object.prototype.hasOwnProperty.call(moreModules, moduleId)) {\n \t\t\t\tmodules[moduleId] = moreModules[moduleId];\n \t\t\t}\n \t\t}\n \t\tif(parentJsonpFunction) parentJsonpFunction(chunkIds, moreModules, executeModules);\n \t\twhile(resolves.length)\n \t\t\tresolves.shift()();\n \t\tif(executeModules) {\n \t\t\tfor(i=0; i < executeModules.length; i++) {\n \t\t\t\tresult = __webpack_require__(__webpack_require__.s = executeModules[i]);\n \t\t\t}\n \t\t}\n \t\treturn result;\n \t};\n\n \t// The module cache\n \tvar installedModules = {};\n\n \t// objects to store loaded and loading chunks\n \tvar installedChunks = {\n \t\t2: 0\n \t};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId])\n \t\t\treturn installedModules[moduleId].exports;\n\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n \t// This file contains only the entry chunk.\n \t// The chunk loading function for additional chunks\n \t__webpack_require__.e = function requireEnsure(chunkId) {\n \t\tif(installedChunks[chunkId] === 0)\n \t\t\treturn Promise.resolve();\n\n \t\t// an Promise means \"currently loading\".\n \t\tif(installedChunks[chunkId]) {\n \t\t\treturn installedChunks[chunkId][2];\n \t\t}\n \t\t// start chunk loading\n \t\tvar head = document.getElementsByTagName('head')[0];\n \t\tvar script = document.createElement('script');\n \t\tscript.type = 'text/javascript';\n \t\tscript.charset = 'utf-8';\n \t\tscript.async = true;\n \t\tscript.timeout = 120000;\n\n \t\tscript.src = __webpack_require__.p + \"bundle.\" + chunkId + \".\" + {\"0\":\"73bcc5d3c1d07180f0e3\",\"1\":\"efaa3e0e20077c8e7471\"}[chunkId] + \".js\";\n \t\tvar timeout = setTimeout(onScriptComplete, 120000);\n \t\tscript.onerror = script.onload = onScriptComplete;\n \t\tfunction onScriptComplete() {\n \t\t\t// avoid mem leaks in IE.\n \t\t\tscript.onerror = script.onload = null;\n \t\t\tclearTimeout(timeout);\n \t\t\tvar chunk = installedChunks[chunkId];\n \t\t\tif(chunk !== 0) {\n \t\t\t\tif(chunk) chunk[1](new Error('Loading chunk ' + chunkId + ' failed.'));\n \t\t\t\tinstalledChunks[chunkId] = undefined;\n \t\t\t}\n \t\t};\n \t\thead.appendChild(script);\n\n \t\tvar promise = new Promise(function(resolve, reject) {\n \t\t\tinstalledChunks[chunkId] = [resolve, reject];\n \t\t});\n \t\treturn installedChunks[chunkId][2] = promise;\n \t};\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// identity function for calling harmory imports with the correct context\n \t__webpack_require__.i = function(value) { return value; };\n\n \t// define getter function for harmory exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tObject.defineProperty(exports, name, {\n \t\t\tconfigurable: false,\n \t\t\tenumerable: true,\n \t\t\tget: getter\n \t\t});\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n \t// on error function for async loading\n \t__webpack_require__.oe = function(err) { console.error(err); throw err; };\n\n\n\n// WEBPACK FOOTER //\n// webpack/bootstrap d32b2cef151447642421"],"sourceRoot":""}
\ No newline at end of file
+{"version":3,"sources":["webpack:///bundle.manifest.a55034b424c795b1a9a8.js","webpack:///webpack/bootstrap f8b9c276690ba4d5a4d8"],"names":["modules","__webpack_require__","moduleId","installedModules","exports","module","i","l","call","parentJsonpFunction","window","chunkIds","moreModules","executeModules","chunkId","result","resolves","length","installedChunks","push","Object","prototype","hasOwnProperty","shift","s","2","e","onScriptComplete","script","onerror","onload","clearTimeout","timeout","chunk","Error","undefined","Promise","resolve","head","document","getElementsByTagName","createElement","type","charset","async","src","p","0","1","setTimeout","appendChild","promise","reject","m","c","value","d","name","getter","defineProperty","configurable","enumerable","get","n","__esModule","o","object","property","oe","err","console","error"],"mappings":"CAAS,SAAUA,GCqCnB,QAAAC,GAAAC,GAGA,GAAAC,EAAAD,GACA,MAAAC,GAAAD,GAAAE,OAGA,IAAAC,GAAAF,EAAAD,IACAI,EAAAJ,EACAK,GAAA,EACAH,WAUA,OANAJ,GAAAE,GAAAM,KAAAH,EAAAD,QAAAC,IAAAD,QAAAH,GAGAI,EAAAE,GAAA,EAGAF,EAAAD,QAxDA,GAAAK,GAAAC,OAAA,YACAA,QAAA,sBAAAC,EAAAC,EAAAC,GAIA,IADA,GAAAX,GAAAY,EAAAC,EAAAT,EAAA,EAAAU,KACQV,EAAAK,EAAAM,OAAoBX,IAC5BQ,EAAAH,EAAAL,GACAY,EAAAJ,IACAE,EAAAG,KAAAD,EAAAJ,GAAA,IACAI,EAAAJ,GAAA,CAEA,KAAAZ,IAAAU,GACAQ,OAAAC,UAAAC,eAAAd,KAAAI,EAAAV,KACAF,EAAAE,GAAAU,EAAAV,GAIA,KADAO,KAAAE,EAAAC,EAAAC,GACAG,EAAAC,QACAD,EAAAO,SACA,IAAAV,EACA,IAAAP,EAAA,EAAYA,EAAAO,EAAAI,OAA2BX,IACvCS,EAAAd,IAAAuB,EAAAX,EAAAP,GAGA,OAAAS,GAIA,IAAAZ,MAGAe,GACAO,EAAA,EA6BAxB,GAAAyB,EAAA,SAAAZ,GAmBA,QAAAa,KAEAC,EAAAC,QAAAD,EAAAE,OAAA,KACAC,aAAAC,EACA,IAAAC,GAAAf,EAAAJ,EACA,KAAAmB,IACAA,KAAA,MAAAC,OAAA,iBAAApB,EAAA,aACAI,EAAAJ,GAAAqB,QAzBA,OAAAjB,EAAAJ,GACA,MAAAsB,SAAAC,SAGA,IAAAnB,EAAAJ,GACA,MAAAI,GAAAJ,GAAA,EAGA,IAAAwB,GAAAC,SAAAC,qBAAA,WACAZ,EAAAW,SAAAE,cAAA,SACAb,GAAAc,KAAA,kBACAd,EAAAe,QAAA,QACAf,EAAAgB,OAAA,EACAhB,EAAAI,QAAA,KAEAJ,EAAAiB,IAAA5C,EAAA6C,EAAA,UAAAhC,EAAA,KAAqEiC,EAAA,uBAAAC,EAAA,wBAAsDlC,GAAA,KAC3H,IAAAkB,GAAAiB,WAAAtB,EAAA,KACAC,GAAAC,QAAAD,EAAAE,OAAAH,EAWAW,EAAAY,YAAAtB,EAEA,IAAAuB,GAAA,GAAAf,SAAA,SAAAC,EAAAe,GACAlC,EAAAJ,IAAAuB,EAAAe,IAEA,OAAAlC,GAAAJ,GAAA,GAAAqC,GAIAlD,EAAAoD,EAAArD,EAGAC,EAAAqD,EAAAnD,EAGAF,EAAAK,EAAA,SAAAiD,GAA2C,MAAAA,IAG3CtD,EAAAuD,EAAA,SAAApD,EAAAqD,EAAAC,GACAtC,OAAAuC,eAAAvD,EAAAqD,GACAG,cAAA,EACAC,YAAA,EACAC,IAAAJ,KAKAzD,EAAA8D,EAAA,SAAA1D,GACA,GAAAqD,GAAArD,KAAA2D,WACA,WAA2B,MAAA3D,GAAA,YAC3B,WAAiC,MAAAA,GAEjC,OADAJ,GAAAuD,EAAAE,EAAA,IAAAA,GACAA,GAIAzD,EAAAgE,EAAA,SAAAC,EAAAC,GAAsD,MAAA/C,QAAAC,UAAAC,eAAAd,KAAA0D,EAAAC,IAGtDlE,EAAA6C,EAAA,GAGA7C,EAAAmE,GAAA,SAAAC,GAA8D,KAApBC,SAAAC,MAAAF,GAAoBA","file":"bundle.manifest.a55034b424c795b1a9a8.js","sourcesContent":["/******/ (function(modules) { // webpackBootstrap\n/******/ \t// install a JSONP callback for chunk loading\n/******/ \tvar parentJsonpFunction = window[\"webpackJsonp\"];\n/******/ \twindow[\"webpackJsonp\"] = function webpackJsonpCallback(chunkIds, moreModules, executeModules) {\n/******/ \t\t// add \"moreModules\" to the modules object,\n/******/ \t\t// then flag all \"chunkIds\" as loaded and fire callback\n/******/ \t\tvar moduleId, chunkId, i = 0, resolves = [], result;\n/******/ \t\tfor(;i < chunkIds.length; i++) {\n/******/ \t\t\tchunkId = chunkIds[i];\n/******/ \t\t\tif(installedChunks[chunkId])\n/******/ \t\t\t\tresolves.push(installedChunks[chunkId][0]);\n/******/ \t\t\tinstalledChunks[chunkId] = 0;\n/******/ \t\t}\n/******/ \t\tfor(moduleId in moreModules) {\n/******/ \t\t\tif(Object.prototype.hasOwnProperty.call(moreModules, moduleId)) {\n/******/ \t\t\t\tmodules[moduleId] = moreModules[moduleId];\n/******/ \t\t\t}\n/******/ \t\t}\n/******/ \t\tif(parentJsonpFunction) parentJsonpFunction(chunkIds, moreModules, executeModules);\n/******/ \t\twhile(resolves.length)\n/******/ \t\t\tresolves.shift()();\n/******/ \t\tif(executeModules) {\n/******/ \t\t\tfor(i=0; i < executeModules.length; i++) {\n/******/ \t\t\t\tresult = __webpack_require__(__webpack_require__.s = executeModules[i]);\n/******/ \t\t\t}\n/******/ \t\t}\n/******/ \t\treturn result;\n/******/ \t};\n/******/\n/******/ \t// The module cache\n/******/ \tvar installedModules = {};\n/******/\n/******/ \t// objects to store loaded and loading chunks\n/******/ \tvar installedChunks = {\n/******/ \t\t2: 0\n/******/ \t};\n/******/\n/******/ \t// The require function\n/******/ \tfunction __webpack_require__(moduleId) {\n/******/\n/******/ \t\t// Check if module is in cache\n/******/ \t\tif(installedModules[moduleId])\n/******/ \t\t\treturn installedModules[moduleId].exports;\n/******/\n/******/ \t\t// Create a new module (and put it into the cache)\n/******/ \t\tvar module = installedModules[moduleId] = {\n/******/ \t\t\ti: moduleId,\n/******/ \t\t\tl: false,\n/******/ \t\t\texports: {}\n/******/ \t\t};\n/******/\n/******/ \t\t// Execute the module function\n/******/ \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n/******/\n/******/ \t\t// Flag the module as loaded\n/******/ \t\tmodule.l = true;\n/******/\n/******/ \t\t// Return the exports of the module\n/******/ \t\treturn module.exports;\n/******/ \t}\n/******/\n/******/ \t// This file contains only the entry chunk.\n/******/ \t// The chunk loading function for additional chunks\n/******/ \t__webpack_require__.e = function requireEnsure(chunkId) {\n/******/ \t\tif(installedChunks[chunkId] === 0)\n/******/ \t\t\treturn Promise.resolve();\n/******/\n/******/ \t\t// an Promise means \"currently loading\".\n/******/ \t\tif(installedChunks[chunkId]) {\n/******/ \t\t\treturn installedChunks[chunkId][2];\n/******/ \t\t}\n/******/ \t\t// start chunk loading\n/******/ \t\tvar head = document.getElementsByTagName('head')[0];\n/******/ \t\tvar script = document.createElement('script');\n/******/ \t\tscript.type = 'text/javascript';\n/******/ \t\tscript.charset = 'utf-8';\n/******/ \t\tscript.async = true;\n/******/ \t\tscript.timeout = 120000;\n/******/\n/******/ \t\tscript.src = __webpack_require__.p + \"bundle.\" + chunkId + \".\" + {\"0\":\"9debb1b0a94f14d0ebe9\",\"1\":\"bade2cb8992d8a68d0d7\"}[chunkId] + \".js\";\n/******/ \t\tvar timeout = setTimeout(onScriptComplete, 120000);\n/******/ \t\tscript.onerror = script.onload = onScriptComplete;\n/******/ \t\tfunction onScriptComplete() {\n/******/ \t\t\t// avoid mem leaks in IE.\n/******/ \t\t\tscript.onerror = script.onload = null;\n/******/ \t\t\tclearTimeout(timeout);\n/******/ \t\t\tvar chunk = installedChunks[chunkId];\n/******/ \t\t\tif(chunk !== 0) {\n/******/ \t\t\t\tif(chunk) chunk[1](new Error('Loading chunk ' + chunkId + ' failed.'));\n/******/ \t\t\t\tinstalledChunks[chunkId] = undefined;\n/******/ \t\t\t}\n/******/ \t\t};\n/******/ \t\thead.appendChild(script);\n/******/\n/******/ \t\tvar promise = new Promise(function(resolve, reject) {\n/******/ \t\t\tinstalledChunks[chunkId] = [resolve, reject];\n/******/ \t\t});\n/******/ \t\treturn installedChunks[chunkId][2] = promise;\n/******/ \t};\n/******/\n/******/ \t// expose the modules object (__webpack_modules__)\n/******/ \t__webpack_require__.m = modules;\n/******/\n/******/ \t// expose the module cache\n/******/ \t__webpack_require__.c = installedModules;\n/******/\n/******/ \t// identity function for calling harmory imports with the correct context\n/******/ \t__webpack_require__.i = function(value) { return value; };\n/******/\n/******/ \t// define getter function for harmory exports\n/******/ \t__webpack_require__.d = function(exports, name, getter) {\n/******/ \t\tObject.defineProperty(exports, name, {\n/******/ \t\t\tconfigurable: false,\n/******/ \t\t\tenumerable: true,\n/******/ \t\t\tget: getter\n/******/ \t\t});\n/******/ \t};\n/******/\n/******/ \t// getDefaultExport function for compatibility with non-harmony modules\n/******/ \t__webpack_require__.n = function(module) {\n/******/ \t\tvar getter = module && module.__esModule ?\n/******/ \t\t\tfunction getDefault() { return module['default']; } :\n/******/ \t\t\tfunction getModuleExports() { return module; };\n/******/ \t\t__webpack_require__.d(getter, 'a', getter);\n/******/ \t\treturn getter;\n/******/ \t};\n/******/\n/******/ \t// Object.prototype.hasOwnProperty.call\n/******/ \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n/******/\n/******/ \t// __webpack_public_path__\n/******/ \t__webpack_require__.p = \"\";\n/******/\n/******/ \t// on error function for async loading\n/******/ \t__webpack_require__.oe = function(err) { console.error(err); throw err; };\n/******/ })\n/************************************************************************/\n/******/ ([]);\n\n\n// WEBPACK FOOTER //\n// bundle.manifest.a55034b424c795b1a9a8.js"," \t// install a JSONP callback for chunk loading\n \tvar parentJsonpFunction = window[\"webpackJsonp\"];\n \twindow[\"webpackJsonp\"] = function webpackJsonpCallback(chunkIds, moreModules, executeModules) {\n \t\t// add \"moreModules\" to the modules object,\n \t\t// then flag all \"chunkIds\" as loaded and fire callback\n \t\tvar moduleId, chunkId, i = 0, resolves = [], result;\n \t\tfor(;i < chunkIds.length; i++) {\n \t\t\tchunkId = chunkIds[i];\n \t\t\tif(installedChunks[chunkId])\n \t\t\t\tresolves.push(installedChunks[chunkId][0]);\n \t\t\tinstalledChunks[chunkId] = 0;\n \t\t}\n \t\tfor(moduleId in moreModules) {\n \t\t\tif(Object.prototype.hasOwnProperty.call(moreModules, moduleId)) {\n \t\t\t\tmodules[moduleId] = moreModules[moduleId];\n \t\t\t}\n \t\t}\n \t\tif(parentJsonpFunction) parentJsonpFunction(chunkIds, moreModules, executeModules);\n \t\twhile(resolves.length)\n \t\t\tresolves.shift()();\n \t\tif(executeModules) {\n \t\t\tfor(i=0; i < executeModules.length; i++) {\n \t\t\t\tresult = __webpack_require__(__webpack_require__.s = executeModules[i]);\n \t\t\t}\n \t\t}\n \t\treturn result;\n \t};\n\n \t// The module cache\n \tvar installedModules = {};\n\n \t// objects to store loaded and loading chunks\n \tvar installedChunks = {\n \t\t2: 0\n \t};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId])\n \t\t\treturn installedModules[moduleId].exports;\n\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n \t// This file contains only the entry chunk.\n \t// The chunk loading function for additional chunks\n \t__webpack_require__.e = function requireEnsure(chunkId) {\n \t\tif(installedChunks[chunkId] === 0)\n \t\t\treturn Promise.resolve();\n\n \t\t// an Promise means \"currently loading\".\n \t\tif(installedChunks[chunkId]) {\n \t\t\treturn installedChunks[chunkId][2];\n \t\t}\n \t\t// start chunk loading\n \t\tvar head = document.getElementsByTagName('head')[0];\n \t\tvar script = document.createElement('script');\n \t\tscript.type = 'text/javascript';\n \t\tscript.charset = 'utf-8';\n \t\tscript.async = true;\n \t\tscript.timeout = 120000;\n\n \t\tscript.src = __webpack_require__.p + \"bundle.\" + chunkId + \".\" + {\"0\":\"9debb1b0a94f14d0ebe9\",\"1\":\"bade2cb8992d8a68d0d7\"}[chunkId] + \".js\";\n \t\tvar timeout = setTimeout(onScriptComplete, 120000);\n \t\tscript.onerror = script.onload = onScriptComplete;\n \t\tfunction onScriptComplete() {\n \t\t\t// avoid mem leaks in IE.\n \t\t\tscript.onerror = script.onload = null;\n \t\t\tclearTimeout(timeout);\n \t\t\tvar chunk = installedChunks[chunkId];\n \t\t\tif(chunk !== 0) {\n \t\t\t\tif(chunk) chunk[1](new Error('Loading chunk ' + chunkId + ' failed.'));\n \t\t\t\tinstalledChunks[chunkId] = undefined;\n \t\t\t}\n \t\t};\n \t\thead.appendChild(script);\n\n \t\tvar promise = new Promise(function(resolve, reject) {\n \t\t\tinstalledChunks[chunkId] = [resolve, reject];\n \t\t});\n \t\treturn installedChunks[chunkId][2] = promise;\n \t};\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// identity function for calling harmory imports with the correct context\n \t__webpack_require__.i = function(value) { return value; };\n\n \t// define getter function for harmory exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tObject.defineProperty(exports, name, {\n \t\t\tconfigurable: false,\n \t\t\tenumerable: true,\n \t\t\tget: getter\n \t\t});\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n \t// on error function for async loading\n \t__webpack_require__.oe = function(err) { console.error(err); throw err; };\n\n\n\n// WEBPACK FOOTER //\n// webpack/bootstrap f8b9c276690ba4d5a4d8"],"sourceRoot":""}
\ No newline at end of file
@@ -1,2 +1,2 @@
 webpackJsonp([1,2],{1:function(n,t){},12:function(n,t,r){n.exports=r(1)},13:function(n,t){n.exports=function(){var n=[];return n.toString=function(){for(var n=[],t=0;t<this.length;t++){var r=this[t];r[2]?n.push("@media "+r[2]+"{"+r[1]+"}"):n.push(r[1])}return n.join("")},n.i=function(t,r){"string"==typeof t&&(t=[[null,t,""]]);for(var o={},i=0;i<this.length;i++){var e=this[i][0];"number"==typeof e&&(o[e]=!0)}for(i=0;i<t.length;i++){var u=t[i];"number"==typeof u[0]&&o[u[0]]||(r&&!u[2]?u[2]=r:r&&(u[2]="("+u[2]+") and ("+r+")"),n.push(u))}},n}}},[12]);
-//# sourceMappingURL=bundle.vendor.efaa3e0e20077c8e7471.js.map
\ No newline at end of file
+//# sourceMappingURL=bundle.vendor.bade2cb8992d8a68d0d7.js.map
\ No newline at end of file
@@ -1 +1 @@
-{"version":3,"sources":["webpack:///bundle.vendor.efaa3e0e20077c8e7471.js","webpack:///../~/css-loader/lib/css-base.js"],"names":["webpackJsonp","1","module","exports","12","__webpack_require__","13","list","toString","result","i","this","length","item","push","join","modules","mediaQuery","alreadyImportedModules","id"],"mappings":"AAAAA,cAAc,EAAE,IAEVC,EACA,SAASC,EAAQC,KAMjBC,GACA,SAASF,EAAQC,EAASE,GAEhCH,EAAOC,QAAUE,EAAoB,IAK/BC,GACA,SAASJ,EAAQC,GCbvBD,EAAAC,QAAA,WACA,GAAAI,KA0CA,OAvCAA,GAAAC,SAAA,WAEA,OADAC,MACAC,EAAA,EAAgBA,EAAAC,KAAAC,OAAiBF,IAAA,CACjC,GAAAG,GAAAF,KAAAD,EACAG,GAAA,GACAJ,EAAAK,KAAA,UAAAD,EAAA,OAAwCA,EAAA,QAExCJ,EAAAK,KAAAD,EAAA,IAGA,MAAAJ,GAAAM,KAAA,KAIAR,EAAAG,EAAA,SAAAM,EAAAC,GACA,gBAAAD,KACAA,IAAA,KAAAA,EAAA,KAEA,QADAE,MACAR,EAAA,EAAgBA,EAAAC,KAAAC,OAAiBF,IAAA,CACjC,GAAAS,GAAAR,KAAAD,GAAA,EACA,iBAAAS,KACAD,EAAAC,IAAA,GAEA,IAAAT,EAAA,EAAYA,EAAAM,EAAAJ,OAAoBF,IAAA,CAChC,GAAAG,GAAAG,EAAAN,EAKA,iBAAAG,GAAA,IAAAK,EAAAL,EAAA,MACAI,IAAAJ,EAAA,GACAA,EAAA,GAAAI,EACKA,IACLJ,EAAA,OAAAA,EAAA,aAAAI,EAAA,KAEAV,EAAAO,KAAAD,MAIAN,MD0BG","file":"bundle.vendor.efaa3e0e20077c8e7471.js","sourcesContent":["webpackJsonp([1,2],{\n\n/***/ 1:\n/***/ function(module, exports) {\n\n// removed by extract-text-webpack-plugin\n\n/***/ },\n\n/***/ 12:\n/***/ function(module, exports, __webpack_require__) {\n\nmodule.exports = __webpack_require__(1);\n\n\n/***/ },\n\n/***/ 13:\n/***/ function(module, exports) {\n\n/*\r\n\tMIT License http://www.opensource.org/licenses/mit-license.php\r\n\tAuthor Tobias Koppers @sokra\r\n*/\r\n// css base code, injected by the css-loader\r\nmodule.exports = function() {\r\n\tvar list = [];\r\n\r\n\t// return the list of modules as css string\r\n\tlist.toString = function toString() {\r\n\t\tvar result = [];\r\n\t\tfor(var i = 0; i < this.length; i++) {\r\n\t\t\tvar item = this[i];\r\n\t\t\tif(item[2]) {\r\n\t\t\t\tresult.push(\"@media \" + item[2] + \"{\" + item[1] + \"}\");\r\n\t\t\t} else {\r\n\t\t\t\tresult.push(item[1]);\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn result.join(\"\");\r\n\t};\r\n\r\n\t// import a list of modules into the list\r\n\tlist.i = function(modules, mediaQuery) {\r\n\t\tif(typeof modules === \"string\")\r\n\t\t\tmodules = [[null, modules, \"\"]];\r\n\t\tvar alreadyImportedModules = {};\r\n\t\tfor(var i = 0; i < this.length; i++) {\r\n\t\t\tvar id = this[i][0];\r\n\t\t\tif(typeof id === \"number\")\r\n\t\t\t\talreadyImportedModules[id] = true;\r\n\t\t}\r\n\t\tfor(i = 0; i < modules.length; i++) {\r\n\t\t\tvar item = modules[i];\r\n\t\t\t// skip already imported module\r\n\t\t\t// this implementation is not 100% perfect for weird media query combinations\r\n\t\t\t//  when a module is imported multiple times with different media queries.\r\n\t\t\t//  I hope this will never occur (Hey this way we have smaller bundles)\r\n\t\t\tif(typeof item[0] !== \"number\" || !alreadyImportedModules[item[0]]) {\r\n\t\t\t\tif(mediaQuery && !item[2]) {\r\n\t\t\t\t\titem[2] = mediaQuery;\r\n\t\t\t\t} else if(mediaQuery) {\r\n\t\t\t\t\titem[2] = \"(\" + item[2] + \") and (\" + mediaQuery + \")\";\r\n\t\t\t\t}\r\n\t\t\t\tlist.push(item);\r\n\t\t\t}\r\n\t\t}\r\n\t};\r\n\treturn list;\r\n};\r\n\n\n/***/ }\n\n},[12]);\n\n\n// WEBPACK FOOTER //\n// bundle.vendor.efaa3e0e20077c8e7471.js","/*\r\n\tMIT License http://www.opensource.org/licenses/mit-license.php\r\n\tAuthor Tobias Koppers @sokra\r\n*/\r\n// css base code, injected by the css-loader\r\nmodule.exports = function() {\r\n\tvar list = [];\r\n\r\n\t// return the list of modules as css string\r\n\tlist.toString = function toString() {\r\n\t\tvar result = [];\r\n\t\tfor(var i = 0; i < this.length; i++) {\r\n\t\t\tvar item = this[i];\r\n\t\t\tif(item[2]) {\r\n\t\t\t\tresult.push(\"@media \" + item[2] + \"{\" + item[1] + \"}\");\r\n\t\t\t} else {\r\n\t\t\t\tresult.push(item[1]);\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn result.join(\"\");\r\n\t};\r\n\r\n\t// import a list of modules into the list\r\n\tlist.i = function(modules, mediaQuery) {\r\n\t\tif(typeof modules === \"string\")\r\n\t\t\tmodules = [[null, modules, \"\"]];\r\n\t\tvar alreadyImportedModules = {};\r\n\t\tfor(var i = 0; i < this.length; i++) {\r\n\t\t\tvar id = this[i][0];\r\n\t\t\tif(typeof id === \"number\")\r\n\t\t\t\talreadyImportedModules[id] = true;\r\n\t\t}\r\n\t\tfor(i = 0; i < modules.length; i++) {\r\n\t\t\tvar item = modules[i];\r\n\t\t\t// skip already imported module\r\n\t\t\t// this implementation is not 100% perfect for weird media query combinations\r\n\t\t\t//  when a module is imported multiple times with different media queries.\r\n\t\t\t//  I hope this will never occur (Hey this way we have smaller bundles)\r\n\t\t\tif(typeof item[0] !== \"number\" || !alreadyImportedModules[item[0]]) {\r\n\t\t\t\tif(mediaQuery && !item[2]) {\r\n\t\t\t\t\titem[2] = mediaQuery;\r\n\t\t\t\t} else if(mediaQuery) {\r\n\t\t\t\t\titem[2] = \"(\" + item[2] + \") and (\" + mediaQuery + \")\";\r\n\t\t\t\t}\r\n\t\t\t\tlist.push(item);\r\n\t\t\t}\r\n\t\t}\r\n\t};\r\n\treturn list;\r\n};\r\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ../~/css-loader/lib/css-base.js\n// module id = 13\n// module chunks = 1"],"sourceRoot":""}
\ No newline at end of file
+{"version":3,"sources":["webpack:///bundle.vendor.bade2cb8992d8a68d0d7.js","webpack:///../~/css-loader/lib/css-base.js"],"names":["webpackJsonp","1","module","exports","12","__webpack_require__","13","list","toString","result","i","this","length","item","push","join","modules","mediaQuery","alreadyImportedModules","id"],"mappings":"AAAAA,cAAc,EAAE,IAEVC,EACA,SAASC,EAAQC,KAMjBC,GACA,SAASF,EAAQC,EAASE,GAEhCH,EAAOC,QAAUE,EAAoB,IAK/BC,GACA,SAASJ,EAAQC,GCbvBD,EAAAC,QAAA,WACA,GAAAI,KA0CA,OAvCAA,GAAAC,SAAA,WAEA,OADAC,MACAC,EAAA,EAAgBA,EAAAC,KAAAC,OAAiBF,IAAA,CACjC,GAAAG,GAAAF,KAAAD,EACAG,GAAA,GACAJ,EAAAK,KAAA,UAAAD,EAAA,OAAwCA,EAAA,QAExCJ,EAAAK,KAAAD,EAAA,IAGA,MAAAJ,GAAAM,KAAA,KAIAR,EAAAG,EAAA,SAAAM,EAAAC,GACA,gBAAAD,KACAA,IAAA,KAAAA,EAAA,KAEA,QADAE,MACAR,EAAA,EAAgBA,EAAAC,KAAAC,OAAiBF,IAAA,CACjC,GAAAS,GAAAR,KAAAD,GAAA,EACA,iBAAAS,KACAD,EAAAC,IAAA,GAEA,IAAAT,EAAA,EAAYA,EAAAM,EAAAJ,OAAoBF,IAAA,CAChC,GAAAG,GAAAG,EAAAN,EAKA,iBAAAG,GAAA,IAAAK,EAAAL,EAAA,MACAI,IAAAJ,EAAA,GACAA,EAAA,GAAAI,EACKA,IACLJ,EAAA,OAAAA,EAAA,aAAAI,EAAA,KAEAV,EAAAO,KAAAD,MAIAN,MD0BG","file":"bundle.vendor.bade2cb8992d8a68d0d7.js","sourcesContent":["webpackJsonp([1,2],{\n\n/***/ 1:\n/***/ function(module, exports) {\n\n// removed by extract-text-webpack-plugin\n\n/***/ },\n\n/***/ 12:\n/***/ function(module, exports, __webpack_require__) {\n\nmodule.exports = __webpack_require__(1);\n\n\n/***/ },\n\n/***/ 13:\n/***/ function(module, exports) {\n\n/*\r\n\tMIT License http://www.opensource.org/licenses/mit-license.php\r\n\tAuthor Tobias Koppers @sokra\r\n*/\r\n// css base code, injected by the css-loader\r\nmodule.exports = function() {\r\n\tvar list = [];\r\n\r\n\t// return the list of modules as css string\r\n\tlist.toString = function toString() {\r\n\t\tvar result = [];\r\n\t\tfor(var i = 0; i < this.length; i++) {\r\n\t\t\tvar item = this[i];\r\n\t\t\tif(item[2]) {\r\n\t\t\t\tresult.push(\"@media \" + item[2] + \"{\" + item[1] + \"}\");\r\n\t\t\t} else {\r\n\t\t\t\tresult.push(item[1]);\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn result.join(\"\");\r\n\t};\r\n\r\n\t// import a list of modules into the list\r\n\tlist.i = function(modules, mediaQuery) {\r\n\t\tif(typeof modules === \"string\")\r\n\t\t\tmodules = [[null, modules, \"\"]];\r\n\t\tvar alreadyImportedModules = {};\r\n\t\tfor(var i = 0; i < this.length; i++) {\r\n\t\t\tvar id = this[i][0];\r\n\t\t\tif(typeof id === \"number\")\r\n\t\t\t\talreadyImportedModules[id] = true;\r\n\t\t}\r\n\t\tfor(i = 0; i < modules.length; i++) {\r\n\t\t\tvar item = modules[i];\r\n\t\t\t// skip already imported module\r\n\t\t\t// this implementation is not 100% perfect for weird media query combinations\r\n\t\t\t//  when a module is imported multiple times with different media queries.\r\n\t\t\t//  I hope this will never occur (Hey this way we have smaller bundles)\r\n\t\t\tif(typeof item[0] !== \"number\" || !alreadyImportedModules[item[0]]) {\r\n\t\t\t\tif(mediaQuery && !item[2]) {\r\n\t\t\t\t\titem[2] = mediaQuery;\r\n\t\t\t\t} else if(mediaQuery) {\r\n\t\t\t\t\titem[2] = \"(\" + item[2] + \") and (\" + mediaQuery + \")\";\r\n\t\t\t\t}\r\n\t\t\t\tlist.push(item);\r\n\t\t\t}\r\n\t\t}\r\n\t};\r\n\treturn list;\r\n};\r\n\n\n/***/ }\n\n},[12]);\n\n\n// WEBPACK FOOTER //\n// bundle.vendor.bade2cb8992d8a68d0d7.js","/*\r\n\tMIT License http://www.opensource.org/licenses/mit-license.php\r\n\tAuthor Tobias Koppers @sokra\r\n*/\r\n// css base code, injected by the css-loader\r\nmodule.exports = function() {\r\n\tvar list = [];\r\n\r\n\t// return the list of modules as css string\r\n\tlist.toString = function toString() {\r\n\t\tvar result = [];\r\n\t\tfor(var i = 0; i < this.length; i++) {\r\n\t\t\tvar item = this[i];\r\n\t\t\tif(item[2]) {\r\n\t\t\t\tresult.push(\"@media \" + item[2] + \"{\" + item[1] + \"}\");\r\n\t\t\t} else {\r\n\t\t\t\tresult.push(item[1]);\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn result.join(\"\");\r\n\t};\r\n\r\n\t// import a list of modules into the list\r\n\tlist.i = function(modules, mediaQuery) {\r\n\t\tif(typeof modules === \"string\")\r\n\t\t\tmodules = [[null, modules, \"\"]];\r\n\t\tvar alreadyImportedModules = {};\r\n\t\tfor(var i = 0; i < this.length; i++) {\r\n\t\t\tvar id = this[i][0];\r\n\t\t\tif(typeof id === \"number\")\r\n\t\t\t\talreadyImportedModules[id] = true;\r\n\t\t}\r\n\t\tfor(i = 0; i < modules.length; i++) {\r\n\t\t\tvar item = modules[i];\r\n\t\t\t// skip already imported module\r\n\t\t\t// this implementation is not 100% perfect for weird media query combinations\r\n\t\t\t//  when a module is imported multiple times with different media queries.\r\n\t\t\t//  I hope this will never occur (Hey this way we have smaller bundles)\r\n\t\t\tif(typeof item[0] !== \"number\" || !alreadyImportedModules[item[0]]) {\r\n\t\t\t\tif(mediaQuery && !item[2]) {\r\n\t\t\t\t\titem[2] = mediaQuery;\r\n\t\t\t\t} else if(mediaQuery) {\r\n\t\t\t\t\titem[2] = \"(\" + item[2] + \") and (\" + mediaQuery + \")\";\r\n\t\t\t\t}\r\n\t\t\t\tlist.push(item);\r\n\t\t\t}\r\n\t\t}\r\n\t};\r\n\treturn list;\r\n};\r\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ../~/css-loader/lib/css-base.js\n// module id = 13\n// module chunks = 1"],"sourceRoot":""}
\ No newline at end of file
index d4a0eeb..b0e5ed7 100644 (file)
@@ -2,10 +2,10 @@
 <html lang="en" data-framework="javascript">
   <head>
     <meta charset="utf-8">
-    <title>VanillaJS • TodoMVC</title>
-    <script>!function(e){function r(n){if(t[n])return t[n].exports;var o=t[n]={i:n,l:!1,exports:{}};return e[n].call(o.exports,o,o.exports,r),o.l=!0,o.exports}var n=window.webpackJsonp;window.webpackJsonp=function(t,c,u){for(var a,i,f,l=0,s=[];l<t.length;l++)i=t[l],o[i]&&s.push(o[i][0]),o[i]=0;for(a in c)Object.prototype.hasOwnProperty.call(c,a)&&(e[a]=c[a]);for(n&&n(t,c,u);s.length;)s.shift()();if(u)for(l=0;l<u.length;l++)f=r(r.s=u[l]);return f};var t={},o={2:0};r.e=function(e){function n(){c.onerror=c.onload=null,clearTimeout(u);var r=o[e];0!==r&&(r&&r[1](new Error("Loading chunk "+e+" failed.")),o[e]=void 0)}if(0===o[e])return Promise.resolve();if(o[e])return o[e][2];var t=document.getElementsByTagName("head")[0],c=document.createElement("script");c.type="text/javascript",c.charset="utf-8",c.async=!0,c.timeout=12e4,c.src=r.p+"bundle."+e+"."+{0:"73bcc5d3c1d07180f0e3",1:"efaa3e0e20077c8e7471"}[e]+".js";var u=setTimeout(n,12e4);c.onerror=c.onload=n,t.appendChild(c);var a=new Promise(function(r,n){o[e]=[r,n]});return o[e][2]=a},r.m=e,r.c=t,r.i=function(e){return e},r.d=function(e,r,n){Object.defineProperty(e,r,{configurable:!1,enumerable:!0,get:n})},r.n=function(e){var n=e&&e.__esModule?function(){return e["default"]}:function(){return e};return r.d(n,"a",n),n},r.o=function(e,r){return Object.prototype.hasOwnProperty.call(e,r)},r.p="",r.oe=function(e){throw console.error(e),e}}([]);
+    <title>ES2015 + Babel + Webpack TodoMVC example</title>
+    <script>!function(e){function r(n){if(t[n])return t[n].exports;var o=t[n]={i:n,l:!1,exports:{}};return e[n].call(o.exports,o,o.exports,r),o.l=!0,o.exports}var n=window.webpackJsonp;window.webpackJsonp=function(t,u,a){for(var i,c,f,l=0,s=[];l<t.length;l++)c=t[l],o[c]&&s.push(o[c][0]),o[c]=0;for(i in u)Object.prototype.hasOwnProperty.call(u,i)&&(e[i]=u[i]);for(n&&n(t,u,a);s.length;)s.shift()();if(a)for(l=0;l<a.length;l++)f=r(r.s=a[l]);return f};var t={},o={2:0};r.e=function(e){function n(){u.onerror=u.onload=null,clearTimeout(a);var r=o[e];0!==r&&(r&&r[1](new Error("Loading chunk "+e+" failed.")),o[e]=void 0)}if(0===o[e])return Promise.resolve();if(o[e])return o[e][2];var t=document.getElementsByTagName("head")[0],u=document.createElement("script");u.type="text/javascript",u.charset="utf-8",u.async=!0,u.timeout=12e4,u.src=r.p+"bundle."+e+"."+{0:"9debb1b0a94f14d0ebe9",1:"bade2cb8992d8a68d0d7"}[e]+".js";var a=setTimeout(n,12e4);u.onerror=u.onload=n,t.appendChild(u);var i=new Promise(function(r,n){o[e]=[r,n]});return o[e][2]=i},r.m=e,r.c=t,r.i=function(e){return e},r.d=function(e,r,n){Object.defineProperty(e,r,{configurable:!1,enumerable:!0,get:n})},r.n=function(e){var n=e&&e.__esModule?function(){return e["default"]}:function(){return e};return r.d(n,"a",n),n},r.o=function(e,r){return Object.prototype.hasOwnProperty.call(e,r)},r.p="",r.oe=function(e){throw console.error(e),e}}([]);
 </script>
-  <link href="styles.vendor.efaa3e0e20077c8e7471.css" rel="stylesheet"><link href="styles.app.73bcc5d3c1d07180f0e3.css" rel="stylesheet"><script type="text/javascript" src="bundle.vendor.efaa3e0e20077c8e7471.js"></script><script type="text/javascript" src="bundle.app.73bcc5d3c1d07180f0e3.js"></script></head>
+  <link href="styles.vendor.bade2cb8992d8a68d0d7.css" rel="stylesheet"><link href="styles.app.9debb1b0a94f14d0ebe9.css" rel="stylesheet"><script type="text/javascript" src="bundle.vendor.bade2cb8992d8a68d0d7.js"></script><script type="text/javascript" src="bundle.app.9debb1b0a94f14d0ebe9.js"></script></head>
   <body>
     <section class="todoapp">
       <header class="header">
@@ -1,2 +1,2 @@
 .toggle-graph{float:left;margin-left:16px;cursor:pointer;position:relative;z-index:1}.toggle-graph svg{height:20px;width:20px}.toggle-graph svg path{fill:#777}.toggle-graph.active svg path,.toggle-graph:focus svg path,.toggle-graph:hover svg path{fill:#000}
-/*# sourceMappingURL=styles.app.73bcc5d3c1d07180f0e3.css.map*/
\ No newline at end of file
+/*# sourceMappingURL=styles.app.9debb1b0a94f14d0ebe9.css.map*/
\ No newline at end of file
@@ -1,2 +1,2 @@
 body,button,html{margin:0;padding:0}button{border:0;background:none;font-size:100%;vertical-align:baseline;font-family:inherit;font-weight:inherit;color:inherit;-webkit-appearance:none;appearance:none;-webkit-font-smoothing:antialiased}body,button{-moz-osx-font-smoothing:grayscale}body{font:14px Helvetica Neue,Helvetica,Arial,sans-serif;line-height:1.4em;background:#f5f5f5;color:#4d4d4d;min-width:230px;max-width:550px;margin:0 auto;-webkit-font-smoothing:antialiased;font-weight:300}:focus{outline:0}.hidden{display:none}.todoapp{background:#fff;margin:130px 0 40px;position:relative;box-shadow:0 2px 4px 0 rgba(0,0,0,.2),0 25px 50px 0 rgba(0,0,0,.1)}.todoapp input::-webkit-input-placeholder{font-style:italic;font-weight:300;color:#e6e6e6}.todoapp input::-moz-placeholder{font-style:italic;font-weight:300;color:#e6e6e6}.todoapp input::input-placeholder{font-style:italic;font-weight:300;color:#e6e6e6}.todoapp h1{position:absolute;top:-155px;width:100%;font-size:100px;font-weight:100;text-align:center;color:rgba(175,47,47,.15);-webkit-text-rendering:optimizeLegibility;-moz-text-rendering:optimizeLegibility;text-rendering:optimizeLegibility}.edit,.new-todo{position:relative;margin:0;width:100%;font-size:24px;font-family:inherit;font-weight:inherit;line-height:1.4em;border:0;color:inherit;padding:6px;border:1px solid #999;box-shadow:inset 0 -1px 5px 0 rgba(0,0,0,.2);box-sizing:border-box;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.new-todo{padding:16px 16px 16px 60px;border:none;background:rgba(0,0,0,.003);box-shadow:inset 0 -2px 1px rgba(0,0,0,.03)}.main{position:relative;z-index:2;border-top:1px solid #e6e6e6}label[for=toggle-all]{display:none}.toggle-all{position:absolute;top:-55px;left:-12px;width:60px;height:34px;text-align:center;border:none}.toggle-all:before{content:"\276F";font-size:22px;color:#e6e6e6;padding:10px 27px}.toggle-all:checked:before{color:#737373}.todo-list{margin:0;padding:0;list-style:none}.todo-list li{position:relative;font-size:24px;border-bottom:1px solid #ededed}.todo-list li:last-child{border-bottom:none}.todo-list li.editing{border-bottom:none;padding:0}.todo-list li.editing .edit{display:block;width:506px;padding:12px 16px;margin:0 0 0 43px}.todo-list li.editing .view{display:none}.todo-list li .toggle{text-align:center;width:40px;height:auto;position:absolute;top:0;bottom:0;margin:auto 0;border:none;-webkit-appearance:none;appearance:none}.todo-list li .toggle:after{content:url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" width="40" height="40" viewBox="-10 -18 100 135"><circle cx="50" cy="50" r="50" fill="none" stroke="#ededed" stroke-width="3"/></svg>')}.todo-list li .toggle:checked:after{content:url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" width="40" height="40" viewBox="-10 -18 100 135"><circle cx="50" cy="50" r="50" fill="none" stroke="#bddad5" stroke-width="3"/><path fill="#5dc2af" d="M72 25L42 71 27 56l-4 4 20 20 34-52z"/></svg>')}.todo-list li label{word-break:break-all;padding:15px 60px 15px 15px;margin-left:45px;display:block;line-height:1.2;transition:color .4s}.todo-list li.completed label{color:#d9d9d9;text-decoration:line-through}.todo-list li .destroy{display:none;position:absolute;top:0;right:10px;bottom:0;width:40px;height:40px;margin:auto 0;font-size:30px;color:#cc9a9a;margin-bottom:11px;transition:color .2s ease-out}.todo-list li .destroy:hover{color:#af5b5e}.todo-list li .destroy:after{content:"\D7"}.todo-list li:hover .destroy{display:block}.todo-list li .edit{display:none}.todo-list li.editing:last-child{margin-bottom:-1px}.footer{color:#777;padding:10px 15px;height:20px;text-align:center;border-top:1px solid #e6e6e6}.footer:before{content:"";position:absolute;right:0;bottom:0;left:0;height:50px;overflow:hidden;box-shadow:0 1px 1px rgba(0,0,0,.2),0 8px 0 -3px #f6f6f6,0 9px 1px -3px rgba(0,0,0,.2),0 16px 0 -6px #f6f6f6,0 17px 2px -6px rgba(0,0,0,.2)}.todo-count{float:left;text-align:left}.todo-count strong{font-weight:300}.filters{margin:0;padding:0;list-style:none;position:absolute;right:0;left:0}.filters li{display:inline}.filters li a{color:inherit;margin:3px;padding:3px 7px;text-decoration:none;border:1px solid transparent;border-radius:3px}.filters li a:hover{border-color:rgba(175,47,47,.1)}.filters li a.selected{border-color:rgba(175,47,47,.2)}.clear-completed,html .clear-completed:active{float:right;position:relative;line-height:20px;text-decoration:none;cursor:pointer}.clear-completed:hover{text-decoration:underline}.info{margin:65px auto 0;color:#bfbfbf;font-size:10px;text-shadow:0 1px 0 hsla(0,0%,100%,.5);text-align:center}.info p{line-height:1}.info a{color:inherit;text-decoration:none;font-weight:400}.info a:hover{text-decoration:underline}@media screen and (-webkit-min-device-pixel-ratio:0){.todo-list li .toggle,.toggle-all{background:none}.todo-list li .toggle{height:40px}.toggle-all{-webkit-transform:rotate(90deg);transform:rotate(90deg);-webkit-appearance:none;appearance:none}}@media (max-width:430px){.footer{height:50px}.filters{bottom:10px}}
-/*# sourceMappingURL=styles.vendor.efaa3e0e20077c8e7471.css.map*/
\ No newline at end of file
+/*# sourceMappingURL=styles.vendor.bade2cb8992d8a68d0d7.css.map*/
\ No newline at end of file
diff --git a/PerformanceTests/Speedometer/resources/todomvc/vanilla-examples/es2015-babel-webpack/package-lock.json b/PerformanceTests/Speedometer/resources/todomvc/vanilla-examples/es2015-babel-webpack/package-lock.json
new file mode 100644 (file)
index 0000000..5fa2af7
--- /dev/null
@@ -0,0 +1,10511 @@
+{
+  "requires": true,
+  "lockfileVersion": 1,
+  "dependencies": {
+    "abbrev": {
+      "version": "1.0.9",
+      "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.0.9.tgz",
+      "integrity": "sha1-kbR5JYinc4wl813W9jdSovh3YTU=",
+      "dev": true
+    },
+    "accepts": {
+      "version": "1.1.4",
+      "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.1.4.tgz",
+      "integrity": "sha1-1xyW99QdD+2iw4zRToonwEFY30o=",
+      "dev": true,
+      "requires": {
+        "mime-types": "2.0.14",
+        "negotiator": "0.4.9"
+      },
+      "dependencies": {
+        "mime-db": {
+          "version": "1.12.0",
+          "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.12.0.tgz",
+          "integrity": "sha1-PQxjGA9FjrENMlqqN9fFiuMS6dc=",
+          "dev": true
+        },
+        "mime-types": {
+          "version": "2.0.14",
+          "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.0.14.tgz",
+          "integrity": "sha1-MQ4VnbI+B3+Lsit0jav6SVcUCqY=",
+          "dev": true,
+          "requires": {
+            "mime-db": "1.12.0"
+          }
+        }
+      }
+    },
+    "acorn": {
+      "version": "5.1.1",
+      "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.1.1.tgz",
+      "integrity": "sha512-vOk6uEMctu0vQrvuSqFdJyqj1Q0S5VTDL79qtjo+DhRr+1mmaD+tluFSCZqhvi/JUhXSzoZN2BhtstaPEeE8cw==",
+      "dev": true
+    },
+    "acorn-jsx": {
+      "version": "3.0.1",
+      "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-3.0.1.tgz",
+      "integrity": "sha1-r9+UiPsezvyDSPb7IvRk4ypYs2s=",
+      "dev": true,
+      "requires": {
+        "acorn": "3.3.0"
+      },
+      "dependencies": {
+        "acorn": {
+          "version": "3.3.0",
+          "resolved": "https://registry.npmjs.org/acorn/-/acorn-3.3.0.tgz",
+          "integrity": "sha1-ReN/s56No/JbruP/U2niu18iAXo=",
+          "dev": true
+        }
+      }
+    },
+    "after": {
+      "version": "0.8.1",
+      "resolved": "https://registry.npmjs.org/after/-/after-0.8.1.tgz",
+      "integrity": "sha1-q11PuIP1loFtNRX495HAr0ht1ic=",
+      "dev": true
+    },
+    "ajv": {
+      "version": "4.11.8",
+      "resolved": "https://registry.npmjs.org/ajv/-/ajv-4.11.8.tgz",
+      "integrity": "sha1-gv+wKynmYq5TvcIK8VlHcGc5xTY=",
+      "dev": true,
+      "requires": {
+        "co": "4.6.0",
+        "json-stable-stringify": "1.0.1"
+      }
+    },
+    "ajv-keywords": {
+      "version": "1.5.1",
+      "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-1.5.1.tgz",
+      "integrity": "sha1-MU3QpLM2j609/NxU7eYXG4htrzw=",
+      "dev": true
+    },
+    "align-text": {
+      "version": "0.1.4",
+      "resolved": "https://registry.npmjs.org/align-text/-/align-text-0.1.4.tgz",
+      "integrity": "sha1-DNkKVhCT810KmSVsIrcGlDP60Rc=",
+      "dev": true,
+      "requires": {
+        "kind-of": "3.2.2",
+        "longest": "1.0.1",
+        "repeat-string": "1.6.1"
+      }
+    },
+    "alphanum-sort": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/alphanum-sort/-/alphanum-sort-1.0.2.tgz",
+      "integrity": "sha1-l6ERlkmyEa0zaR2fn0hqjsn74KM=",
+      "dev": true
+    },
+    "amdefine": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.1.tgz",
+      "integrity": "sha1-SlKCrBZHKek2Gbz9OtFR+BfOkfU=",
+      "dev": true
+    },
+    "ansi": {
+      "version": "0.3.1",
+      "resolved": "https://registry.npmjs.org/ansi/-/ansi-0.3.1.tgz",
+      "integrity": "sha1-DELU+xcWDVqa8eSEus4cZpIsGyE=",
+      "dev": true
+    },
+    "ansi-escapes": {
+      "version": "1.4.0",
+      "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-1.4.0.tgz",
+      "integrity": "sha1-06ioOzGapneTZisT52HHkRQiMG4=",
+      "dev": true
+    },
+    "ansi-regex": {
+      "version": "2.1.1",
+      "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz",
+      "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=",
+      "dev": true
+    },
+    "ansi-styles": {
+      "version": "2.2.1",
+      "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz",
+      "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=",
+      "dev": true
+    },
+    "anymatch": {
+      "version": "1.3.0",
+      "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-1.3.0.tgz",
+      "integrity": "sha1-o+Uvo5FoyCX/V7AkgSbOWo/5VQc=",
+      "dev": true,
+      "requires": {
+        "arrify": "1.0.1",
+        "micromatch": "2.3.11"
+      }
+    },
+    "are-we-there-yet": {
+      "version": "1.1.4",
+      "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.1.4.tgz",
+      "integrity": "sha1-u13KOCu5TwXhUZQ3PRb9O6HKEQ0=",
+      "dev": true,
+      "requires": {
+        "delegates": "1.0.0",
+        "readable-stream": "2.3.3"
+      }
+    },
+    "argparse": {
+      "version": "1.0.9",
+      "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.9.tgz",
+      "integrity": "sha1-c9g7wmP4bpf4zE9rrhsOkKfSLIY=",
+      "dev": true,
+      "requires": {
+        "sprintf-js": "1.0.3"
+      }
+    },
+    "arr-diff": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-2.0.0.tgz",
+      "integrity": "sha1-jzuCf5Vai9ZpaX5KQlasPOrjVs8=",
+      "dev": true,
+      "requires": {
+        "arr-flatten": "1.1.0"
+      }
+    },
+    "arr-flatten": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz",
+      "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==",
+      "dev": true
+    },
+    "array-differ": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/array-differ/-/array-differ-1.0.0.tgz",
+      "integrity": "sha1-7/UuN1gknTO+QCuLuOVkuytdQDE=",
+      "dev": true
+    },
+    "array-filter": {
+      "version": "0.0.1",
+      "resolved": "https://registry.npmjs.org/array-filter/-/array-filter-0.0.1.tgz",
+      "integrity": "sha1-fajPLiZijtcygDWB/SH2fKzS7uw=",
+      "dev": true
+    },
+    "array-find": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/array-find/-/array-find-1.0.0.tgz",
+      "integrity": "sha1-bI4obRHtdoMn+OYuzuhzU8o+eLg=",
+      "dev": true
+    },
+    "array-find-index": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/array-find-index/-/array-find-index-1.0.2.tgz",
+      "integrity": "sha1-3wEKoSh+Fku9pvlyOwqWoexBh6E=",
+      "dev": true
+    },
+    "array-flatten": {
+      "version": "1.1.1",
+      "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz",
+      "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=",
+      "dev": true
+    },
+    "array-map": {
+      "version": "0.0.0",
+      "resolved": "https://registry.npmjs.org/array-map/-/array-map-0.0.0.tgz",
+      "integrity": "sha1-iKK6tz0c97zVwbEYoAP2b2ZfpmI=",
+      "dev": true
+    },
+    "array-reduce": {
+      "version": "0.0.0",
+      "resolved": "https://registry.npmjs.org/array-reduce/-/array-reduce-0.0.0.tgz",
+      "integrity": "sha1-FziZ0//Rx9k4PkR5Ul2+J4yrXys=",
+      "dev": true
+    },
+    "array-slice": {
+      "version": "0.2.3",
+      "resolved": "https://registry.npmjs.org/array-slice/-/array-slice-0.2.3.tgz",
+      "integrity": "sha1-3Tz7gO15c6dRF82sabC5nshhhvU=",
+      "dev": true
+    },
+    "array-union": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz",
+      "integrity": "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=",
+      "dev": true,
+      "requires": {
+        "array-uniq": "1.0.3"
+      }
+    },
+    "array-uniq": {
+      "version": "1.0.3",
+      "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz",
+      "integrity": "sha1-r2rId6Jcx/dOBYiUdThY39sk/bY=",
+      "dev": true
+    },
+    "array-unique": {
+      "version": "0.2.1",
+      "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.2.1.tgz",
+      "integrity": "sha1-odl8yvy8JiXMcPrc6zalDFiwGlM=",
+      "dev": true
+    },
+    "array.prototype.find": {
+      "version": "2.0.4",
+      "resolved": "https://registry.npmjs.org/array.prototype.find/-/array.prototype.find-2.0.4.tgz",
+      "integrity": "sha1-VWpcU2LAhkgyPdrrnenRS8GGTJA=",
+      "dev": true,
+      "requires": {
+        "define-properties": "1.1.2",
+        "es-abstract": "1.7.0"
+      }
+    },
+    "arraybuffer.slice": {
+      "version": "0.0.6",
+      "resolved": "https://registry.npmjs.org/arraybuffer.slice/-/arraybuffer.slice-0.0.6.tgz",
+      "integrity": "sha1-8zshWfBTKj8xB6JywMz70a0peco=",
+      "dev": true
+    },
+    "arrify": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz",
+      "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=",
+      "dev": true
+    },
+    "asap": {
+      "version": "2.0.5",
+      "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.5.tgz",
+      "integrity": "sha1-UidltQw1EEkOUtfc/ghe+bqWlY8="
+    },
+    "asn1": {
+      "version": "0.1.11",
+      "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.1.11.tgz",
+      "integrity": "sha1-VZvhg3bQik7E2+gId9J4GGObLfc=",
+      "dev": true,
+      "optional": true
+    },
+    "asn1.js": {
+      "version": "4.9.1",
+      "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-4.9.1.tgz",
+      "integrity": "sha1-SLokC0WpKA6UdImQull9IWYX/UA=",
+      "dev": true,
+      "requires": {
+        "bn.js": "4.11.7",
+        "inherits": "2.0.3",
+        "minimalistic-assert": "1.0.0"
+      }
+    },
+    "assert": {
+      "version": "1.4.1",
+      "resolved": "https://registry.npmjs.org/assert/-/assert-1.4.1.tgz",
+      "integrity": "sha1-mZEtWRg2tab1s0XA8H7vwI/GXZE=",
+      "dev": true,
+      "requires": {
+        "util": "0.10.3"
+      }
+    },
+    "assert-plus": {
+      "version": "0.1.5",
+      "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-0.1.5.tgz",
+      "integrity": "sha1-7nQAlBMALYTOxyGcasgRgS5yMWA=",
+      "dev": true,
+      "optional": true
+    },
+    "assertion-error": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.0.2.tgz",
+      "integrity": "sha1-E8pRXYYgbaC6xm6DTdOX2HWBCUw=",
+      "dev": true
+    },
+    "async": {
+      "version": "1.5.2",
+      "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz",
+      "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=",
+      "dev": true
+    },
+    "async-each": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/async-each/-/async-each-1.0.1.tgz",
+      "integrity": "sha1-GdOGodntxufByF04iu28xW0zYC0=",
+      "dev": true
+    },
+    "autoprefixer": {
+      "version": "6.7.7",
+      "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-6.7.7.tgz",
+      "integrity": "sha1-Hb0cg1ZY41zj+ZhAmdsAWFx4IBQ=",
+      "dev": true,
+      "requires": {
+        "browserslist": "1.7.7",
+        "caniuse-db": "1.0.30000698",
+        "normalize-range": "0.1.2",
+        "num2fraction": "1.2.2",
+        "postcss": "5.2.17",
+        "postcss-value-parser": "3.3.0"
+      }
+    },
+    "aws-sign2": {
+      "version": "0.5.0",
+      "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.5.0.tgz",
+      "integrity": "sha1-xXED96F/wDfwLXwuZLYC6iI/fWM=",
+      "dev": true,
+      "optional": true
+    },
+    "babel-code-frame": {
+      "version": "6.22.0",
+      "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.22.0.tgz",
+      "integrity": "sha1-AnYgvuVnqIwyVhV05/0IAdMxGOQ=",
+      "dev": true,
+      "requires": {
+        "chalk": "1.1.3",
+        "esutils": "2.0.2",
+        "js-tokens": "3.0.2"
+      }
+    },
+    "babel-core": {
+      "version": "6.13.2",
+      "resolved": "https://registry.npmjs.org/babel-core/-/babel-core-6.13.2.tgz",
+      "integrity": "sha1-92HhGZNh1abtFvk86AGtUKytszg=",
+      "dev": true,
+      "requires": {
+        "babel-code-frame": "6.22.0",
+        "babel-generator": "6.25.0",
+        "babel-helpers": "6.24.1",
+        "babel-messages": "6.23.0",
+        "babel-register": "6.24.1",
+        "babel-runtime": "6.23.0",
+        "babel-template": "6.25.0",
+        "babel-traverse": "6.25.0",
+        "babel-types": "6.25.0",
+        "babylon": "6.17.4",
+        "convert-source-map": "1.5.0",
+        "debug": "2.6.8",
+        "json5": "0.4.0",
+        "lodash": "4.14.1",
+        "minimatch": "3.0.4",
+        "path-exists": "1.0.0",
+        "path-is-absolute": "1.0.1",
+        "private": "0.1.7",
+        "shebang-regex": "1.0.0",
+        "slash": "1.0.0",
+        "source-map": "0.5.6"
+      }
+    },
+    "babel-eslint": {
+      "version": "6.1.2",
+      "resolved": "https://registry.npmjs.org/babel-eslint/-/babel-eslint-6.1.2.tgz",
+      "integrity": "sha1-UpNBn+NnLWZZjTJ9qWlFZ7pqXy8=",
+      "dev": true,
+      "requires": {
+        "babel-traverse": "6.25.0",
+        "babel-types": "6.25.0",
+        "babylon": "6.17.4",
+        "lodash.assign": "4.2.0",
+        "lodash.pickby": "4.6.0"
+      }
+    },
+    "babel-generator": {
+      "version": "6.25.0",
+      "resolved": "https://registry.npmjs.org/babel-generator/-/babel-generator-6.25.0.tgz",
+      "integrity": "sha1-M6GvcNXyiQrrRlpKd5PB32qeqfw=",
+      "dev": true,
+      "requires": {
+        "babel-messages": "6.23.0",
+        "babel-runtime": "6.23.0",
+        "babel-types": "6.25.0",
+        "detect-indent": "4.0.0",
+        "jsesc": "1.3.0",
+        "lodash": "4.14.1",
+        "source-map": "0.5.6",
+        "trim-right": "1.0.1"
+      }
+    },
+    "babel-helper-bindify-decorators": {
+      "version": "6.24.1",
+      "resolved": "https://registry.npmjs.org/babel-helper-bindify-decorators/-/babel-helper-bindify-decorators-6.24.1.tgz",
+      "integrity": "sha1-FMGeXxQte0fxmlJDHlKxzLxAozA=",
+      "dev": true,
+      "requires": {
+        "babel-runtime": "6.23.0",
+        "babel-traverse": "6.25.0",
+        "babel-types": "6.25.0"
+      }
+    },
+    "babel-helper-builder-binary-assignment-operator-visitor": {
+      "version": "6.24.1",
+      "resolved": "https://registry.npmjs.org/babel-helper-builder-binary-assignment-operator-visitor/-/babel-helper-builder-binary-assignment-operator-visitor-6.24.1.tgz",
+      "integrity": "sha1-zORReto1b0IgvK6KAsKzRvmlZmQ=",
+      "dev": true,
+      "requires": {
+        "babel-helper-explode-assignable-expression": "6.24.1",
+        "babel-runtime": "6.23.0",
+        "babel-types": "6.25.0"
+      }
+    },
+    "babel-helper-builder-react-jsx": {
+      "version": "6.24.1",
+      "resolved": "https://registry.npmjs.org/babel-helper-builder-react-jsx/-/babel-helper-builder-react-jsx-6.24.1.tgz",
+      "integrity": "sha1-CteRfjPI11HmRtrKTnfMGTd9LLw=",
+      "dev": true,
+      "requires": {
+        "babel-runtime": "6.23.0",
+        "babel-types": "6.25.0",
+        "esutils": "2.0.2"
+      }
+    },
+    "babel-helper-call-delegate": {
+      "version": "6.24.1",
+      "resolved": "https://registry.npmjs.org/babel-helper-call-delegate/-/babel-helper-call-delegate-6.24.1.tgz",
+      "integrity": "sha1-7Oaqzdx25Bw0YfiL/Fdb0Nqi340=",
+      "dev": true,
+      "requires": {
+        "babel-helper-hoist-variables": "6.24.1",
+        "babel-runtime": "6.23.0",
+        "babel-traverse": "6.25.0",
+        "babel-types": "6.25.0"
+      }
+    },
+    "babel-helper-define-map": {
+      "version": "6.24.1",
+      "resolved": "https://registry.npmjs.org/babel-helper-define-map/-/babel-helper-define-map-6.24.1.tgz",
+      "integrity": "sha1-epdH8ljYlH0y1RX2qhx70CIEoIA=",
+      "dev": true,
+      "requires": {
+        "babel-helper-function-name": "6.24.1",
+        "babel-runtime": "6.23.0",
+        "babel-types": "6.25.0",
+        "lodash": "4.14.1"
+      }
+    },
+    "babel-helper-explode-assignable-expression": {
+      "version": "6.24.1",
+      "resolved": "https://registry.npmjs.org/babel-helper-explode-assignable-expression/-/babel-helper-explode-assignable-expression-6.24.1.tgz",
+      "integrity": "sha1-8luCz33BBDPFX3BZLVdGQArCLKo=",
+      "dev": true,
+      "requires": {
+        "babel-runtime": "6.23.0",
+        "babel-traverse": "6.25.0",
+        "babel-types": "6.25.0"
+      }
+    },
+    "babel-helper-explode-class": {
+      "version": "6.24.1",
+      "resolved": "https://registry.npmjs.org/babel-helper-explode-class/-/babel-helper-explode-class-6.24.1.tgz",
+      "integrity": "sha1-fcKjkQ3uAHBW4eMdZAztPVTqqes=",
+      "dev": true,
+      "requires": {
+        "babel-helper-bindify-decorators": "6.24.1",
+        "babel-runtime": "6.23.0",
+        "babel-traverse": "6.25.0",
+        "babel-types": "6.25.0"
+      }
+    },
+    "babel-helper-function-name": {
+      "version": "6.24.1",
+      "resolved": "https://registry.npmjs.org/babel-helper-function-name/-/babel-helper-function-name-6.24.1.tgz",
+      "integrity": "sha1-00dbjAPtmCQqJbSDUasYOZ01gKk=",
+      "dev": true,
+      "requires": {
+        "babel-helper-get-function-arity": "6.24.1",
+        "babel-runtime": "6.23.0",
+        "babel-template": "6.25.0",
+        "babel-traverse": "6.25.0",
+        "babel-types": "6.25.0"
+      }
+    },
+    "babel-helper-get-function-arity": {
+      "version": "6.24.1",
+      "resolved": "https://registry.npmjs.org/babel-helper-get-function-arity/-/babel-helper-get-function-arity-6.24.1.tgz",
+      "integrity": "sha1-j3eCqpNAfEHTqlCQj4mwMbG2hT0=",
+      "dev": true,
+      "requires": {
+        "babel-runtime": "6.23.0",
+        "babel-types": "6.25.0"
+      }
+    },
+    "babel-helper-hoist-variables": {
+      "version": "6.24.1",
+      "resolved": "https://registry.npmjs.org/babel-helper-hoist-variables/-/babel-helper-hoist-variables-6.24.1.tgz",
+      "integrity": "sha1-HssnaJydJVE+rbyZFKc/VAi+enY=",
+      "dev": true,
+      "requires": {
+        "babel-runtime": "6.23.0",
+        "babel-types": "6.25.0"
+      }
+    },
+    "babel-helper-optimise-call-expression": {
+      "version": "6.24.1",
+      "resolved": "https://registry.npmjs.org/babel-helper-optimise-call-expression/-/babel-helper-optimise-call-expression-6.24.1.tgz",
+      "integrity": "sha1-96E0J7qfc/j0+pk8VKl4gtEkQlc=",
+      "dev": true,
+      "requires": {
+        "babel-runtime": "6.23.0",
+        "babel-types": "6.25.0"
+      }
+    },
+    "babel-helper-regex": {
+      "version": "6.24.1",
+      "resolved": "https://registry.npmjs.org/babel-helper-regex/-/babel-helper-regex-6.24.1.tgz",
+      "integrity": "sha1-024i+rEAjXnYhkjjIRaGgShFbOg=",
+      "dev": true,
+      "requires": {
+        "babel-runtime": "6.23.0",
+        "babel-types": "6.25.0",
+        "lodash": "4.14.1"
+      }
+    },
+    "babel-helper-remap-async-to-generator": {
+      "version": "6.24.1",
+      "resolved": "https://registry.npmjs.org/babel-helper-remap-async-to-generator/-/babel-helper-remap-async-to-generator-6.24.1.tgz",
+      "integrity": "sha1-XsWBgnrXI/7N04HxySg5BnbkVRs=",
+      "dev": true,
+      "requires": {
+        "babel-helper-function-name": "6.24.1",
+        "babel-runtime": "6.23.0",
+        "babel-template": "6.25.0",
+        "babel-traverse": "6.25.0",
+        "babel-types": "6.25.0"
+      }
+    },
+    "babel-helper-replace-supers": {
+      "version": "6.24.1",
+      "resolved": "https://registry.npmjs.org/babel-helper-replace-supers/-/babel-helper-replace-supers-6.24.1.tgz",
+      "integrity": "sha1-v22/5Dk40XNpohPKiov3S2qQqxo=",
+      "dev": true,
+      "requires": {
+        "babel-helper-optimise-call-expression": "6.24.1",
+        "babel-messages": "6.23.0",
+        "babel-runtime": "6.23.0",
+        "babel-template": "6.25.0",
+        "babel-traverse": "6.25.0",
+        "babel-types": "6.25.0"
+      }
+    },
+    "babel-helpers": {
+      "version": "6.24.1",
+      "resolved": "https://registry.npmjs.org/babel-helpers/-/babel-helpers-6.24.1.tgz",
+      "integrity": "sha1-NHHenK7DiOXIUOWX5Yom3fN2ArI=",
+      "dev": true,
+      "requires": {
+        "babel-runtime": "6.23.0",
+        "babel-template": "6.25.0"
+      }
+    },
+    "babel-loader": {
+      "version": "6.2.4",
+      "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-6.2.4.tgz",
+      "integrity": "sha1-qnCv+N3CI6WVLoOaQ6bDpMi/oek=",
+      "dev": true,
+      "requires": {
+        "loader-utils": "0.2.17",
+        "mkdirp": "0.5.1",
+        "object-assign": "4.1.1"
+      }
+    },
+    "babel-messages": {
+      "version": "6.23.0",
+      "resolved": "https://registry.npmjs.org/babel-messages/-/babel-messages-6.23.0.tgz",
+      "integrity": "sha1-8830cDhYA1sqKVHG7F7fbGLyYw4=",
+      "dev": true,
+      "requires": {
+        "babel-runtime": "6.23.0"
+      }
+    },
+    "babel-plugin-__coverage__": {
+      "version": "11.0.0",
+      "resolved": "https://registry.npmjs.org/babel-plugin-__coverage__/-/babel-plugin-__coverage__-11.0.0.tgz",
+      "integrity": "sha1-tZu2jPcqyqGxKsRS2XdWB48l8jc=",
+      "dev": true,
+      "requires": {
+        "babel-helper-function-name": "6.24.1",
+        "babel-template": "6.25.0",
+        "test-exclude": "1.1.0"
+      }
+    },
+    "babel-plugin-check-es2015-constants": {
+      "version": "6.22.0",
+      "resolved": "https://registry.npmjs.org/babel-plugin-check-es2015-constants/-/babel-plugin-check-es2015-constants-6.22.0.tgz",
+      "integrity": "sha1-NRV7EBQm/S/9PaP3XH0ekYNbv4o=",
+      "dev": true,
+      "requires": {
+        "babel-runtime": "6.23.0"
+      }
+    },
+    "babel-plugin-module-alias": {
+      "version": "1.6.0",
+      "resolved": "https://registry.npmjs.org/babel-plugin-module-alias/-/babel-plugin-module-alias-1.6.0.tgz",
+      "integrity": "sha1-3346q6NUT0wGqdMxSia7v/bYe2E=",
+      "dev": true
+    },
+    "babel-plugin-syntax-async-functions": {
+      "version": "6.13.0",
+      "resolved": "https://registry.npmjs.org/babel-plugin-syntax-async-functions/-/babel-plugin-syntax-async-functions-6.13.0.tgz",
+      "integrity": "sha1-ytnK0RkbWtY0vzCuCHI5HgZHvpU=",
+      "dev": true
+    },
+    "babel-plugin-syntax-async-generators": {
+      "version": "6.13.0",
+      "resolved": "https://registry.npmjs.org/babel-plugin-syntax-async-generators/-/babel-plugin-syntax-async-generators-6.13.0.tgz",
+      "integrity": "sha1-a8lj67FuzLrmuStZbrfzXDQqi5o=",
+      "dev": true
+    },
+    "babel-plugin-syntax-class-properties": {
+      "version": "6.13.0",
+      "resolved": "https://registry.npmjs.org/babel-plugin-syntax-class-properties/-/babel-plugin-syntax-class-properties-6.13.0.tgz",
+      "integrity": "sha1-1+sjt5oxf4VDlixQW4J8fWysJ94=",
+      "dev": true
+    },
+    "babel-plugin-syntax-decorators": {
+      "version": "6.13.0",
+      "resolved": "https://registry.npmjs.org/babel-plugin-syntax-decorators/-/babel-plugin-syntax-decorators-6.13.0.tgz",
+      "integrity": "sha1-MSVjtNvePMgGzuPkFszurd0RrAs=",
+      "dev": true
+    },
+    "babel-plugin-syntax-exponentiation-operator": {
+      "version": "6.13.0",
+      "resolved": "https://registry.npmjs.org/babel-plugin-syntax-exponentiation-operator/-/babel-plugin-syntax-exponentiation-operator-6.13.0.tgz",
+      "integrity": "sha1-nufoM3KQ2pUoggGmpX9BcDF4MN4=",
+      "dev": true
+    },
+    "babel-plugin-syntax-flow": {
+      "version": "6.18.0",
+      "resolved": "https://registry.npmjs.org/babel-plugin-syntax-flow/-/babel-plugin-syntax-flow-6.18.0.tgz",
+      "integrity": "sha1-TDqyCiryaqIM0lmVw5jE63AxDI0=",
+      "dev": true
+    },
+    "babel-plugin-syntax-jsx": {
+      "version": "6.18.0",
+      "resolved": "https://registry.npmjs.org/babel-plugin-syntax-jsx/-/babel-plugin-syntax-jsx-6.18.0.tgz",
+      "integrity": "sha1-CvMqmm4Tyno/1QaeYtew9Y0NiUY=",
+      "dev": true
+    },
+    "babel-plugin-syntax-object-rest-spread": {
+      "version": "6.13.0",
+      "resolved": "https://registry.npmjs.org/babel-plugin-syntax-object-rest-spread/-/babel-plugin-syntax-object-rest-spread-6.13.0.tgz",
+      "integrity": "sha1-/WU28rzhODb/o6VFjEkDpZe7O/U=",
+      "dev": true
+    },
+    "babel-plugin-syntax-trailing-function-commas": {
+      "version": "6.22.0",
+      "resolved": "https://registry.npmjs.org/babel-plugin-syntax-trailing-function-commas/-/babel-plugin-syntax-trailing-function-commas-6.22.0.tgz",
+      "integrity": "sha1-ugNgk3+NBuQBgKQ/4NVhb/9TLPM=",
+      "dev": true
+    },
+    "babel-plugin-transform-async-generator-functions": {
+      "version": "6.24.1",
+      "resolved": "https://registry.npmjs.org/babel-plugin-transform-async-generator-functions/-/babel-plugin-transform-async-generator-functions-6.24.1.tgz",
+      "integrity": "sha1-8FiQAUX9PpkHpt3yjaWfIVJYpds=",
+      "dev": true,
+      "requires": {
+        "babel-helper-remap-async-to-generator": "6.24.1",
+        "babel-plugin-syntax-async-generators": "6.13.0",
+        "babel-runtime": "6.23.0"
+      }
+    },
+    "babel-plugin-transform-async-to-generator": {
+      "version": "6.24.1",
+      "resolved": "https://registry.npmjs.org/babel-plugin-transform-async-to-generator/-/babel-plugin-transform-async-to-generator-6.24.1.tgz",
+      "integrity": "sha1-ZTbjeK/2yx1VF6wOQOs+n8jQh2E=",
+      "dev": true,
+      "requires": {
+        "babel-helper-remap-async-to-generator": "6.24.1",
+        "babel-plugin-syntax-async-functions": "6.13.0",
+        "babel-runtime": "6.23.0"
+      }
+    },
+    "babel-plugin-transform-class-properties": {
+      "version": "6.24.1",
+      "resolved": "https://registry.npmjs.org/babel-plugin-transform-class-properties/-/babel-plugin-transform-class-properties-6.24.1.tgz",
+      "integrity": "sha1-anl2PqYdM9NvN7YRqp3vgagbRqw=",
+      "dev": true,
+      "requires": {
+        "babel-helper-function-name": "6.24.1",
+        "babel-plugin-syntax-class-properties": "6.13.0",
+        "babel-runtime": "6.23.0",
+        "babel-template": "6.25.0"
+      }
+    },
+    "babel-plugin-transform-decorators": {
+      "version": "6.24.1",
+      "resolved": "https://registry.npmjs.org/babel-plugin-transform-decorators/-/babel-plugin-transform-decorators-6.24.1.tgz",
+      "integrity": "sha1-eIAT2PjGtSIr33s0Q5Df13Vp4k0=",
+      "dev": true,
+      "requires": {
+        "babel-helper-explode-class": "6.24.1",
+        "babel-plugin-syntax-decorators": "6.13.0",
+        "babel-runtime": "6.23.0",
+        "babel-template": "6.25.0",
+        "babel-types": "6.25.0"
+      }
+    },
+    "babel-plugin-transform-es2015-arrow-functions": {
+      "version": "6.22.0",
+      "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-arrow-functions/-/babel-plugin-transform-es2015-arrow-functions-6.22.0.tgz",
+      "integrity": "sha1-RSaSy3EdX3ncf4XkQM5BufJE0iE=",
+      "dev": true,
+      "requires": {
+        "babel-runtime": "6.23.0"
+      }
+    },
+    "babel-plugin-transform-es2015-block-scoped-functions": {
+      "version": "6.22.0",
+      "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-block-scoped-functions/-/babel-plugin-transform-es2015-block-scoped-functions-6.22.0.tgz",
+      "integrity": "sha1-u8UbSflk1wy42OC5ToICRs46YUE=",
+      "dev": true,
+      "requires": {
+        "babel-runtime": "6.23.0"
+      }
+    },
+    "babel-plugin-transform-es2015-block-scoping": {
+      "version": "6.24.1",
+      "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-block-scoping/-/babel-plugin-transform-es2015-block-scoping-6.24.1.tgz",
+      "integrity": "sha1-dsKV3DpHQbFmWt/TFnIV3P8ypXY=",
+      "dev": true,
+      "requires": {
+        "babel-runtime": "6.23.0",
+        "babel-template": "6.25.0",
+        "babel-traverse": "6.25.0",
+        "babel-types": "6.25.0",
+        "lodash": "4.14.1"
+      }
+    },
+    "babel-plugin-transform-es2015-classes": {
+      "version": "6.24.1",
+      "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-classes/-/babel-plugin-transform-es2015-classes-6.24.1.tgz",
+      "integrity": "sha1-WkxYpQyclGHlZLSyo7+ryXolhNs=",
+      "dev": true,
+      "requires": {
+        "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.23.0",
+        "babel-template": "6.25.0",
+        "babel-traverse": "6.25.0",
+        "babel-types": "6.25.0"
+      }
+    },
+    "babel-plugin-transform-es2015-computed-properties": {
+      "version": "6.24.1",
+      "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-computed-properties/-/babel-plugin-transform-es2015-computed-properties-6.24.1.tgz",
+      "integrity": "sha1-b+Ko0WiV1WNPTNmZttNICjCBWbM=",
+      "dev": true,
+      "requires": {
+        "babel-runtime": "6.23.0",
+        "babel-template": "6.25.0"
+      }
+    },
+    "babel-plugin-transform-es2015-destructuring": {
+      "version": "6.23.0",
+      "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-destructuring/-/babel-plugin-transform-es2015-destructuring-6.23.0.tgz",
+      "integrity": "sha1-mXux8auWf2gtKwh2/jWNYOdlxW0=",
+      "dev": true,
+      "requires": {
+        "babel-runtime": "6.23.0"
+      }
+    },
+    "babel-plugin-transform-es2015-duplicate-keys": {
+      "version": "6.24.1",
+      "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-duplicate-keys/-/babel-plugin-transform-es2015-duplicate-keys-6.24.1.tgz",
+      "integrity": "sha1-c+s9MQypaePvnskcU3QabxV2Qj4=",
+      "dev": true,
+      "requires": {
+        "babel-runtime": "6.23.0",
+        "babel-types": "6.25.0"
+      }
+    },
+    "babel-plugin-transform-es2015-for-of": {
+      "version": "6.23.0",
+      "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-for-of/-/babel-plugin-transform-es2015-for-of-6.23.0.tgz",
+      "integrity": "sha1-9HyVsrYT3x0+zC/bdXNiPHUkhpE=",
+      "dev": true,
+      "requires": {
+        "babel-runtime": "6.23.0"
+      }
+    },
+    "babel-plugin-transform-es2015-function-name": {
+      "version": "6.24.1",
+      "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-function-name/-/babel-plugin-transform-es2015-function-name-6.24.1.tgz",
+      "integrity": "sha1-g0yJhTvDaxrw86TF26qU/Y6sqos=",
+      "dev": true,
+      "requires": {
+        "babel-helper-function-name": "6.24.1",
+        "babel-runtime": "6.23.0",
+        "babel-types": "6.25.0"
+      }
+    },
+    "babel-plugin-transform-es2015-literals": {
+      "version": "6.22.0",
+      "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-literals/-/babel-plugin-transform-es2015-literals-6.22.0.tgz",
+      "integrity": "sha1-T1SgLWzWbPkVKAAZox0xklN3yi4=",
+      "dev": true,
+      "requires": {
+        "babel-runtime": "6.23.0"
+      }
+    },
+    "babel-plugin-transform-es2015-modules-amd": {
+      "version": "6.24.1",
+      "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-amd/-/babel-plugin-transform-es2015-modules-amd-6.24.1.tgz",
+      "integrity": "sha1-Oz5UAXI5hC1tGcMBHEvS8AoA0VQ=",
+      "dev": true,
+      "requires": {
+        "babel-plugin-transform-es2015-modules-commonjs": "6.24.1",
+        "babel-runtime": "6.23.0",
+        "babel-template": "6.25.0"
+      }
+    },
+    "babel-plugin-transform-es2015-modules-commonjs": {
+      "version": "6.24.1",
+      "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-commonjs/-/babel-plugin-transform-es2015-modules-commonjs-6.24.1.tgz",
+      "integrity": "sha1-0+MQtA72ZKNmIiAAl8bUQCmPK/4=",
+      "dev": true,
+      "requires": {
+        "babel-plugin-transform-strict-mode": "6.24.1",
+        "babel-runtime": "6.23.0",
+        "babel-template": "6.25.0",
+        "babel-types": "6.25.0"
+      }
+    },
+    "babel-plugin-transform-es2015-modules-systemjs": {
+      "version": "6.24.1",
+      "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-systemjs/-/babel-plugin-transform-es2015-modules-systemjs-6.24.1.tgz",
+      "integrity": "sha1-/4mhQrkRmpBhlfXxBuzzBdlAfSM=",
+      "dev": true,
+      "requires": {
+        "babel-helper-hoist-variables": "6.24.1",
+        "babel-runtime": "6.23.0",
+        "babel-template": "6.25.0"
+      }
+    },
+    "babel-plugin-transform-es2015-modules-umd": {
+      "version": "6.24.1",
+      "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-umd/-/babel-plugin-transform-es2015-modules-umd-6.24.1.tgz",
+      "integrity": "sha1-rJl+YoXNGO1hdq22B9YCNErThGg=",
+      "dev": true,
+      "requires": {
+        "babel-plugin-transform-es2015-modules-amd": "6.24.1",
+        "babel-runtime": "6.23.0",
+        "babel-template": "6.25.0"
+      }
+    },
+    "babel-plugin-transform-es2015-object-super": {
+      "version": "6.24.1",
+      "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-object-super/-/babel-plugin-transform-es2015-object-super-6.24.1.tgz",
+      "integrity": "sha1-JM72muIcuDp/hgPa0CH1cusnj40=",
+      "dev": true,
+      "requires": {
+        "babel-helper-replace-supers": "6.24.1",
+        "babel-runtime": "6.23.0"
+      }
+    },
+    "babel-plugin-transform-es2015-parameters": {
+      "version": "6.24.1",
+      "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-parameters/-/babel-plugin-transform-es2015-parameters-6.24.1.tgz",
+      "integrity": "sha1-V6w1GrScrxSpfNE7CfZv3wpiXys=",
+      "dev": true,
+      "requires": {
+        "babel-helper-call-delegate": "6.24.1",
+        "babel-helper-get-function-arity": "6.24.1",
+        "babel-runtime": "6.23.0",
+        "babel-template": "6.25.0",
+        "babel-traverse": "6.25.0",
+        "babel-types": "6.25.0"
+      }
+    },
+    "babel-plugin-transform-es2015-shorthand-properties": {
+      "version": "6.24.1",
+      "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-shorthand-properties/-/babel-plugin-transform-es2015-shorthand-properties-6.24.1.tgz",
+      "integrity": "sha1-JPh11nIch2YbvZmkYi5R8U3jiqA=",
+      "dev": true,
+      "requires": {
+        "babel-runtime": "6.23.0",
+        "babel-types": "6.25.0"
+      }
+    },
+    "babel-plugin-transform-es2015-spread": {
+      "version": "6.22.0",
+      "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-spread/-/babel-plugin-transform-es2015-spread-6.22.0.tgz",
+      "integrity": "sha1-1taKmfia7cRTbIGlQujdnxdG+NE=",
+      "dev": true,
+      "requires": {
+        "babel-runtime": "6.23.0"
+      }
+    },
+    "babel-plugin-transform-es2015-sticky-regex": {
+      "version": "6.24.1",
+      "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-sticky-regex/-/babel-plugin-transform-es2015-sticky-regex-6.24.1.tgz",
+      "integrity": "sha1-AMHNsaynERLN8M9hJsLta0V8zbw=",
+      "dev": true,
+      "requires": {
+        "babel-helper-regex": "6.24.1",
+        "babel-runtime": "6.23.0",
+        "babel-types": "6.25.0"
+      }
+    },
+    "babel-plugin-transform-es2015-template-literals": {
+      "version": "6.22.0",
+      "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-template-literals/-/babel-plugin-transform-es2015-template-literals-6.22.0.tgz",
+      "integrity": "sha1-qEs0UPfp+PH2g51taH2oS7EjbY0=",
+      "dev": true,
+      "requires": {
+        "babel-runtime": "6.23.0"
+      }
+    },
+    "babel-plugin-transform-es2015-typeof-symbol": {
+      "version": "6.23.0",
+      "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-typeof-symbol/-/babel-plugin-transform-es2015-typeof-symbol-6.23.0.tgz",
+      "integrity": "sha1-3sCfHN3/lLUqxz1QXITfWdzOs3I=",
+      "dev": true,
+      "requires": {
+        "babel-runtime": "6.23.0"
+      }
+    },
+    "babel-plugin-transform-es2015-unicode-regex": {
+      "version": "6.24.1",
+      "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-unicode-regex/-/babel-plugin-transform-es2015-unicode-regex-6.24.1.tgz",
+      "integrity": "sha1-04sS9C6nMj9yk4fxinxa4frrNek=",
+      "dev": true,
+      "requires": {
+        "babel-helper-regex": "6.24.1",
+        "babel-runtime": "6.23.0",
+        "regexpu-core": "2.0.0"
+      }
+    },
+    "babel-plugin-transform-exponentiation-operator": {
+      "version": "6.24.1",
+      "resolved": "https://registry.npmjs.org/babel-plugin-transform-exponentiation-operator/-/babel-plugin-transform-exponentiation-operator-6.24.1.tgz",
+      "integrity": "sha1-KrDJx/MJj6SJB3cruBP+QejeOg4=",
+      "dev": true,
+      "requires": {
+        "babel-helper-builder-binary-assignment-operator-visitor": "6.24.1",
+        "babel-plugin-syntax-exponentiation-operator": "6.13.0",
+        "babel-runtime": "6.23.0"
+      }
+    },
+    "babel-plugin-transform-flow-strip-types": {
+      "version": "6.22.0",
+      "resolved": "https://registry.npmjs.org/babel-plugin-transform-flow-strip-types/-/babel-plugin-transform-flow-strip-types-6.22.0.tgz",
+      "integrity": "sha1-hMtnKTXUNxT9wyvOhFaNh0Qc988=",
+      "dev": true,
+      "requires": {
+        "babel-plugin-syntax-flow": "6.18.0",
+        "babel-runtime": "6.23.0"
+      }
+    },
+    "babel-plugin-transform-object-rest-spread": {
+      "version": "6.23.0",
+      "resolved": "https://registry.npmjs.org/babel-plugin-transform-object-rest-spread/-/babel-plugin-transform-object-rest-spread-6.23.0.tgz",
+      "integrity": "sha1-h11ryb52HFiirj/u5dxIldjH+SE=",
+      "dev": true,
+      "requires": {
+        "babel-plugin-syntax-object-rest-spread": "6.13.0",
+        "babel-runtime": "6.23.0"
+      }
+    },
+    "babel-plugin-transform-react-display-name": {
+      "version": "6.25.0",
+      "resolved": "https://registry.npmjs.org/babel-plugin-transform-react-display-name/-/babel-plugin-transform-react-display-name-6.25.0.tgz",
+      "integrity": "sha1-Z+K/Hx6ck6sI25Z5LgU5K/LMKNE=",
+      "dev": true,
+      "requires": {
+        "babel-runtime": "6.23.0"
+      }
+    },
+    "babel-plugin-transform-react-jsx": {
+      "version": "6.24.1",
+      "resolved": "https://registry.npmjs.org/babel-plugin-transform-react-jsx/-/babel-plugin-transform-react-jsx-6.24.1.tgz",
+      "integrity": "sha1-hAoCjn30YN/DotKfDA2R9jduZqM=",
+      "dev": true,
+      "requires": {
+        "babel-helper-builder-react-jsx": "6.24.1",
+        "babel-plugin-syntax-jsx": "6.18.0",
+        "babel-runtime": "6.23.0"
+      }
+    },
+    "babel-plugin-transform-react-jsx-self": {
+      "version": "6.22.0",
+      "resolved": "https://registry.npmjs.org/babel-plugin-transform-react-jsx-self/-/babel-plugin-transform-react-jsx-self-6.22.0.tgz",
+      "integrity": "sha1-322AqdomEqEh5t3XVYvL7PBuY24=",
+      "dev": true,
+      "requires": {
+        "babel-plugin-syntax-jsx": "6.18.0",
+        "babel-runtime": "6.23.0"
+      }
+    },
+    "babel-plugin-transform-react-jsx-source": {
+      "version": "6.22.0",
+      "resolved": "https://registry.npmjs.org/babel-plugin-transform-react-jsx-source/-/babel-plugin-transform-react-jsx-source-6.22.0.tgz",
+      "integrity": "sha1-ZqwSFT9c0tF7PBkmj0vwGX9E7NY=",
+      "dev": true,
+      "requires": {
+        "babel-plugin-syntax-jsx": "6.18.0",
+        "babel-runtime": "6.23.0"
+      }
+    },
+    "babel-plugin-transform-regenerator": {
+      "version": "6.24.1",
+      "resolved": "https://registry.npmjs.org/babel-plugin-transform-regenerator/-/babel-plugin-transform-regenerator-6.24.1.tgz",
+      "integrity": "sha1-uNowWtQ8PJm0hI5P5AN7dw0jxBg=",
+      "dev": true,
+      "requires": {
+        "regenerator-transform": "0.9.11"
+      }
+    },
+    "babel-plugin-transform-strict-mode": {
+      "version": "6.24.1",
+      "resolved": "https://registry.npmjs.org/babel-plugin-transform-strict-mode/-/babel-plugin-transform-strict-mode-6.24.1.tgz",
+      "integrity": "sha1-1fr3qleKZbvlkc9e2uBKDGcCB1g=",
+      "dev": true,
+      "requires": {
+        "babel-runtime": "6.23.0",
+        "babel-types": "6.25.0"
+      }
+    },
+    "babel-preset-es2015": {
+      "version": "6.13.2",
+      "resolved": "https://registry.npmjs.org/babel-preset-es2015/-/babel-preset-es2015-6.13.2.tgz",
+      "integrity": "sha1-AGxGmnUovQZvKRfItJVTCdzVPPs=",
+      "dev": true,
+      "requires": {
+        "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.23.0",
+        "babel-plugin-transform-es2015-duplicate-keys": "6.24.1",
+        "babel-plugin-transform-es2015-for-of": "6.23.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.23.0",
+        "babel-plugin-transform-es2015-unicode-regex": "6.24.1",
+        "babel-plugin-transform-regenerator": "6.24.1"
+      }
+    },
+    "babel-preset-es2016": {
+      "version": "6.11.3",
+      "resolved": "https://registry.npmjs.org/babel-preset-es2016/-/babel-preset-es2016-6.11.3.tgz",
+      "integrity": "sha1-9CIgv1+kxvxXsj6+4TcwfnSVBaI=",
+      "dev": true,
+      "requires": {
+        "babel-plugin-transform-exponentiation-operator": "6.24.1"
+      }
+    },
+    "babel-preset-react": {
+      "version": "6.11.1",
+      "resolved": "https://registry.npmjs.org/babel-preset-react/-/babel-preset-react-6.11.1.tgz",
+      "integrity": "sha1-mKwr08G3bzBirgglgOreFUoZtZA=",
+      "dev": true,
+      "requires": {
+        "babel-plugin-syntax-flow": "6.18.0",
+        "babel-plugin-syntax-jsx": "6.18.0",
+        "babel-plugin-transform-flow-strip-types": "6.22.0",
+        "babel-plugin-transform-react-display-name": "6.25.0",
+        "babel-plugin-transform-react-jsx": "6.24.1",
+        "babel-plugin-transform-react-jsx-self": "6.22.0",
+        "babel-plugin-transform-react-jsx-source": "6.22.0"
+      }
+    },
+    "babel-preset-stage-2": {
+      "version": "6.13.0",
+      "resolved": "https://registry.npmjs.org/babel-preset-stage-2/-/babel-preset-stage-2-6.13.0.tgz",
+      "integrity": "sha1-ej2eJCCahiHaxLDCoWOlR3/0EOM=",
+      "dev": true,
+      "requires": {
+        "babel-plugin-transform-class-properties": "6.24.1",
+        "babel-plugin-transform-decorators": "6.24.1",
+        "babel-plugin-transform-object-rest-spread": "6.23.0",
+        "babel-preset-stage-3": "6.24.1"
+      }
+    },
+    "babel-preset-stage-3": {
+      "version": "6.24.1",
+      "resolved": "https://registry.npmjs.org/babel-preset-stage-3/-/babel-preset-stage-3-6.24.1.tgz",
+      "integrity": "sha1-g2raCp56f6N8sTj7kyb4eTSkg5U=",
+      "dev": true,
+      "requires": {
+        "babel-plugin-syntax-trailing-function-commas": "6.22.0",
+        "babel-plugin-transform-async-generator-functions": "6.24.1",
+        "babel-plugin-transform-async-to-generator": "6.24.1",
+        "babel-plugin-transform-exponentiation-operator": "6.24.1",
+        "babel-plugin-transform-object-rest-spread": "6.23.0"
+      }
+    },
+    "babel-register": {
+      "version": "6.24.1",
+      "resolved": "https://registry.npmjs.org/babel-register/-/babel-register-6.24.1.tgz",
+      "integrity": "sha1-fhDhOi9xBlvfrVoXh7pFvKbe118=",
+      "dev": true,
+      "requires": {
+        "babel-core": "6.25.0",
+        "babel-runtime": "6.23.0",
+        "core-js": "2.4.1",
+        "home-or-tmp": "2.0.0",
+        "lodash": "4.14.1",
+        "mkdirp": "0.5.1",
+        "source-map-support": "0.4.15"
+      },
+      "dependencies": {
+        "babel-core": {
+          "version": "6.25.0",
+          "resolved": "https://registry.npmjs.org/babel-core/-/babel-core-6.25.0.tgz",
+          "integrity": "sha1-fdQrBGPHQunVKW3rPsZ6kyLa1yk=",
+          "dev": true,
+          "requires": {
+            "babel-code-frame": "6.22.0",
+            "babel-generator": "6.25.0",
+            "babel-helpers": "6.24.1",
+            "babel-messages": "6.23.0",
+            "babel-register": "6.24.1",
+            "babel-runtime": "6.23.0",
+            "babel-template": "6.25.0",
+            "babel-traverse": "6.25.0",
+            "babel-types": "6.25.0",
+            "babylon": "6.17.4",
+            "convert-source-map": "1.5.0",
+            "debug": "2.6.8",
+            "json5": "0.5.1",
+            "lodash": "4.14.1",
+            "minimatch": "3.0.4",
+            "path-is-absolute": "1.0.1",
+            "private": "0.1.7",
+            "slash": "1.0.0",
+            "source-map": "0.5.6"
+          }
+        },
+        "core-js": {
+          "version": "2.4.1",
+          "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.4.1.tgz",
+          "integrity": "sha1-TekR5mew6ukSTjQlS1OupvxhjT4=",
+          "dev": true
+        },
+        "json5": {
+          "version": "0.5.1",
+          "resolved": "https://registry.npmjs.org/json5/-/json5-0.5.1.tgz",
+          "integrity": "sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE=",
+          "dev": true
+        }
+      }
+    },
+    "babel-runtime": {
+      "version": "6.23.0",
+      "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.23.0.tgz",
+      "integrity": "sha1-CpSJ8UTecO+zzkMArM2zKeL8VDs=",
+      "dev": true,
+      "requires": {
+        "core-js": "2.4.1",
+        "regenerator-runtime": "0.10.5"
+      },
+      "dependencies": {
+        "core-js": {
+          "version": "2.4.1",
+          "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.4.1.tgz",
+          "integrity": "sha1-TekR5mew6ukSTjQlS1OupvxhjT4=",
+          "dev": true
+        }
+      }
+    },
+    "babel-template": {
+      "version": "6.25.0",
+      "resolved": "https://registry.npmjs.org/babel-template/-/babel-template-6.25.0.tgz",
+      "integrity": "sha1-ZlJBFmt8KqTGGdceGSlpVSsQwHE=",
+      "dev": true,
+      "requires": {
+        "babel-runtime": "6.23.0",
+        "babel-traverse": "6.25.0",
+        "babel-types": "6.25.0",
+        "babylon": "6.17.4",
+        "lodash": "4.14.1"
+      }
+    },
+    "babel-traverse": {
+      "version": "6.25.0",
+      "resolved": "https://registry.npmjs.org/babel-traverse/-/babel-traverse-6.25.0.tgz",
+      "integrity": "sha1-IldJfi/NGbie3BPEyROB+VEklvE=",
+      "dev": true,
+      "requires": {
+        "babel-code-frame": "6.22.0",
+        "babel-messages": "6.23.0",
+        "babel-runtime": "6.23.0",
+        "babel-types": "6.25.0",
+        "babylon": "6.17.4",
+        "debug": "2.6.8",
+        "globals": "9.18.0",
+        "invariant": "2.2.2",
+        "lodash": "4.14.1"
+      }
+    },
+    "babel-types": {
+      "version": "6.25.0",
+      "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-6.25.0.tgz",
+      "integrity": "sha1-cK+ySNVmDl0Y+BHZHIMDtUE0oY4=",
+      "dev": true,
+      "requires": {
+        "babel-runtime": "6.23.0",
+        "esutils": "2.0.2",
+        "lodash": "4.14.1",
+        "to-fast-properties": "1.0.3"
+      }
+    },
+    "babylon": {
+      "version": "6.17.4",
+      "resolved": "https://registry.npmjs.org/babylon/-/babylon-6.17.4.tgz",
+      "integrity": "sha512-kChlV+0SXkjE0vUn9OZ7pBMWRFd8uq3mZe8x1K6jhuNcAFAtEnjchFAqB+dYEXKyd+JpT6eppRR78QAr5gTsUw==",
+      "dev": true
+    },
+    "backo2": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/backo2/-/backo2-1.0.2.tgz",
+      "integrity": "sha1-MasayLEpNjRj41s+u2n038+6eUc=",
+      "dev": true
+    },
+    "balanced-match": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz",
+      "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=",
+      "dev": true
+    },
+    "base64-arraybuffer": {
+      "version": "0.1.2",
+      "resolved": "https://registry.npmjs.org/base64-arraybuffer/-/base64-arraybuffer-0.1.2.tgz",
+      "integrity": "sha1-R030qfLaJOBd8xWMOx2zw81GoVQ=",
+      "dev": true
+    },
+    "base64-js": {
+      "version": "1.2.1",
+      "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.2.1.tgz",
+      "integrity": "sha512-dwVUVIXsBZXwTuwnXI9RK8sBmgq09NDHzyR9SAph9eqk76gKK2JSQmZARC2zRC81JC2QTtxD0ARU5qTS25gIGw==",
+      "dev": true
+    },
+    "base64id": {
+      "version": "0.1.0",
+      "resolved": "https://registry.npmjs.org/base64id/-/base64id-0.1.0.tgz",
+      "integrity": "sha1-As4P3u4M709ACA4ec+g08LG/zj8=",
+      "dev": true
+    },
+    "basename": {
+      "version": "0.1.2",
+      "resolved": "https://registry.npmjs.org/basename/-/basename-0.1.2.tgz",
+      "integrity": "sha1-1gOb75OYYxYMeASMztPF5/iMsmE=",
+      "dev": true
+    },
+    "batch": {
+      "version": "0.6.1",
+      "resolved": "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz",
+      "integrity": "sha1-3DQxT05nkxgJP8dgJyUl+UvyXBY=",
+      "dev": true
+    },
+    "benchmark": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/benchmark/-/benchmark-1.0.0.tgz",
+      "integrity": "sha1-Lx4vpMNZ8REiqhgwgiGOlX45DHM=",
+      "dev": true
+    },
+    "better-assert": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/better-assert/-/better-assert-1.0.2.tgz",
+      "integrity": "sha1-QIZrnhueC1W0gYlDEeaPr/rrxSI=",
+      "dev": true,
+      "requires": {
+        "callsite": "1.0.0"
+      }
+    },
+    "big.js": {
+      "version": "3.1.3",
+      "resolved": "https://registry.npmjs.org/big.js/-/big.js-3.1.3.tgz",
+      "integrity": "sha1-TK2iGTZS6zyp7I5VyQFWacmAaXg=",
+      "dev": true
+    },
+    "binary-extensions": {
+      "version": "1.8.0",
+      "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.8.0.tgz",
+      "integrity": "sha1-SOyNFt9Dd+rl+liEaCSAr02Vx3Q=",
+      "dev": true
+    },
+    "blob": {
+      "version": "0.0.4",
+      "resolved": "https://registry.npmjs.org/blob/-/blob-0.0.4.tgz",
+      "integrity": "sha1-vPEwUspURj8w+fx+lbmkdjCpSSE=",
+      "dev": true
+    },
+    "block-stream": {
+      "version": "0.0.9",
+      "resolved": "https://registry.npmjs.org/block-stream/-/block-stream-0.0.9.tgz",
+      "integrity": "sha1-E+v+d4oDIFz+A3UUgeu0szAMEmo=",
+      "dev": true,
+      "requires": {
+        "inherits": "2.0.3"
+      }
+    },
+    "bluebird": {
+      "version": "3.5.0",
+      "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.5.0.tgz",
+      "integrity": "sha1-eRQg1/VR7qKJdFOop3ZT+WYG1nw=",
+      "dev": true
+    },
+    "bn.js": {
+      "version": "4.11.7",
+      "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.7.tgz",
+      "integrity": "sha512-LxFiV5mefv0ley0SzqkOPR1bC4EbpPx8LkOz5vMe/Yi15t5hzwgO/G+tc7wOtL4PZTYjwHu8JnEiSLumuSjSfA==",
+      "dev": true
+    },
+    "body-parser": {
+      "version": "1.17.2",
+      "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.17.2.tgz",
+      "integrity": "sha1-+IkqvI+eYn1Crtr7yma/WrmRBO4=",
+      "dev": true,
+      "requires": {
+        "bytes": "2.4.0",
+        "content-type": "1.0.2",
+        "debug": "2.6.7",
+        "depd": "1.1.0",
+        "http-errors": "1.6.1",
+        "iconv-lite": "0.4.15",
+        "on-finished": "2.3.0",
+        "qs": "6.4.0",
+        "raw-body": "2.2.0",
+        "type-is": "1.6.15"
+      },
+      "dependencies": {
+        "debug": {
+          "version": "2.6.7",
+          "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.7.tgz",
+          "integrity": "sha1-krrR9tBbu2u6Isyoi80OyJTChh4=",
+          "dev": true,
+          "requires": {
+            "ms": "2.0.0"
+          }
+        },
+        "iconv-lite": {
+          "version": "0.4.15",
+          "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.15.tgz",
+          "integrity": "sha1-/iZaIYrGpXz+hUkn6dBMGYJe3es=",
+          "dev": true
+        },
+        "qs": {
+          "version": "6.4.0",
+          "resolved": "https://registry.npmjs.org/qs/-/qs-6.4.0.tgz",
+          "integrity": "sha1-E+JtKK1rD/qpExLNO/cI7TUecjM=",
+          "dev": true
+        }
+      }
+    },
+    "boolbase": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz",
+      "integrity": "sha1-aN/1++YMUes3cl6p4+0xDcwed24=",
+      "dev": true
+    },
+    "boom": {
+      "version": "0.4.2",
+      "resolved": "https://registry.npmjs.org/boom/-/boom-0.4.2.tgz",
+      "integrity": "sha1-emNune1O/O+xnO9JR6PGffrukRs=",
+      "dev": true,
+      "requires": {
+        "hoek": "0.9.1"
+      }
+    },
+    "brace-expansion": {
+      "version": "1.1.8",
+      "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.8.tgz",
+      "integrity": "sha1-wHshHHyVLsH479Uad+8NHTmQopI=",
+      "dev": true,
+      "requires": {
+        "balanced-match": "1.0.0",
+        "concat-map": "0.0.1"
+      }
+    },
+    "braces": {
+      "version": "1.8.5",
+      "resolved": "https://registry.npmjs.org/braces/-/braces-1.8.5.tgz",
+      "integrity": "sha1-uneWLhLf+WnWt2cR6RS3N4V79qc=",
+      "dev": true,
+      "requires": {
+        "expand-range": "1.8.2",
+        "preserve": "0.2.0",
+        "repeat-element": "1.1.2"
+      }
+    },
+    "brorand": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz",
+      "integrity": "sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8=",
+      "dev": true
+    },
+    "browser-stdout": {
+      "version": "1.3.0",
+      "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.0.tgz",
+      "integrity": "sha1-81HTKWnTL6XXpVZxVCY9korjvR8=",
+      "dev": true
+    },
+    "browserify-aes": {
+      "version": "1.0.6",
+      "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.0.6.tgz",
+      "integrity": "sha1-Xncl297x/Vkw1OurSFZ85FHEigo=",
+      "dev": true,
+      "requires": {
+        "buffer-xor": "1.0.3",
+        "cipher-base": "1.0.4",
+        "create-hash": "1.1.3",
+        "evp_bytestokey": "1.0.0",
+        "inherits": "2.0.3"
+      }
+    },
+    "browserify-cipher": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/browserify-cipher/-/browserify-cipher-1.0.0.tgz",
+      "integrity": "sha1-mYgkSHS/XtTijalWZtzWasj8Njo=",
+      "dev": true,
+      "requires": {
+        "browserify-aes": "1.0.6",
+        "browserify-des": "1.0.0",
+        "evp_bytestokey": "1.0.0"
+      }
+    },
+    "browserify-des": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/browserify-des/-/browserify-des-1.0.0.tgz",
+      "integrity": "sha1-2qJ3cXRwki7S/hhZQRihdUOXId0=",
+      "dev": true,
+      "requires": {
+        "cipher-base": "1.0.4",
+        "des.js": "1.0.0",
+        "inherits": "2.0.3"
+      }
+    },
+    "browserify-rsa": {
+      "version": "4.0.1",
+      "resolved": "https://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.0.1.tgz",
+      "integrity": "sha1-IeCr+vbyApzy+vsTNWenAdQTVSQ=",
+      "dev": true,
+      "requires": {
+        "bn.js": "4.11.7",
+        "randombytes": "2.0.5"
+      }
+    },
+    "browserify-sign": {
+      "version": "4.0.4",
+      "resolved": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.0.4.tgz",
+      "integrity": "sha1-qk62jl17ZYuqa/alfmMMvXqT0pg=",
+      "dev": true,
+      "requires": {
+        "bn.js": "4.11.7",
+        "browserify-rsa": "4.0.1",
+        "create-hash": "1.1.3",
+        "create-hmac": "1.1.6",
+        "elliptic": "6.4.0",
+        "inherits": "2.0.3",
+        "parse-asn1": "5.1.0"
+      }
+    },
+    "browserify-zlib": {
+      "version": "0.1.4",
+      "resolved": "https://registry.npmjs.org/browserify-zlib/-/browserify-zlib-0.1.4.tgz",
+      "integrity": "sha1-uzX4pRn2AOD6a4SFJByXnQFB+y0=",
+      "dev": true,
+      "requires": {
+        "pako": "0.2.9"
+      }
+    },
+    "browserslist": {
+      "version": "1.7.7",
+      "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-1.7.7.tgz",
+      "integrity": "sha1-C9dnBCWL6CmyOYu1Dkti0aFmsLk=",
+      "dev": true,
+      "requires": {
+        "caniuse-db": "1.0.30000698",
+        "electron-to-chromium": "1.3.15"
+      }
+    },
+    "buf-compare": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/buf-compare/-/buf-compare-1.0.1.tgz",
+      "integrity": "sha1-/vKNqLgROgoNtEMLC2Rntpcws0o=",
+      "dev": true
+    },
+    "buffer": {
+      "version": "4.9.1",
+      "resolved": "https://registry.npmjs.org/buffer/-/buffer-4.9.1.tgz",
+      "integrity": "sha1-bRu2AbB6TvztlwlBMgkwJ8lbwpg=",
+      "dev": true,
+      "requires": {
+        "base64-js": "1.2.1",
+        "ieee754": "1.1.8",
+        "isarray": "1.0.0"
+      }
+    },
+    "buffer-xor": {
+      "version": "1.0.3",
+      "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz",
+      "integrity": "sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk=",
+      "dev": true
+    },
+    "builtin-modules": {
+      "version": "1.1.1",
+      "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz",
+      "integrity": "sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8=",
+      "dev": true
+    },
+    "builtin-status-codes": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz",
+      "integrity": "sha1-hZgoeOIbmOHGZCXgPQF0eI9Wnug=",
+      "dev": true
+    },
+    "bytes": {
+      "version": "2.4.0",
+      "resolved": "https://registry.npmjs.org/bytes/-/bytes-2.4.0.tgz",
+      "integrity": "sha1-fZcZb51br39pNeJZhVSe3SpsIzk=",
+      "dev": true
+    },
+    "caller-path": {
+      "version": "0.1.0",
+      "resolved": "https://registry.npmjs.org/caller-path/-/caller-path-0.1.0.tgz",
+      "integrity": "sha1-lAhe9jWB7NPaqSREqP6U6CV3dR8=",
+      "dev": true,
+      "requires": {
+        "callsites": "0.2.0"
+      }
+    },
+    "callsite": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/callsite/-/callsite-1.0.0.tgz",
+      "integrity": "sha1-KAOY5dZkvXQDi28JBRU+borxvCA=",
+      "dev": true
+    },
+    "callsites": {
+      "version": "0.2.0",
+      "resolved": "https://registry.npmjs.org/callsites/-/callsites-0.2.0.tgz",
+      "integrity": "sha1-r6uWJikQp/M8GaV3WCXGnzTjUMo=",
+      "dev": true
+    },
+    "camel-case": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-3.0.0.tgz",
+      "integrity": "sha1-yjw2iKTpzzpM2nd9xNy8cTJJz3M=",
+      "dev": true,
+      "requires": {
+        "no-case": "2.3.1",
+        "upper-case": "1.1.3"
+      }
+    },
+    "camelcase": {
+      "version": "2.1.1",
+      "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-2.1.1.tgz",
+      "integrity": "sha1-fB0W1nmhu+WcoCys7PsBHiAfWh8=",
+      "dev": true
+    },
+    "camelcase-keys": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-2.1.0.tgz",
+      "integrity": "sha1-MIvur/3ygRkFHvodkyITyRuPkuc=",
+      "dev": true,
+      "requires": {
+        "camelcase": "2.1.1",
+        "map-obj": "1.0.1"
+      }
+    },
+    "caniuse-api": {
+      "version": "1.6.1",
+      "resolved": "https://registry.npmjs.org/caniuse-api/-/caniuse-api-1.6.1.tgz",
+      "integrity": "sha1-tTTnxzTE+B7F++isoq0kNUuWLGw=",
+      "dev": true,
+      "requires": {
+        "browserslist": "1.7.7",
+        "caniuse-db": "1.0.30000698",
+        "lodash.memoize": "4.1.2",
+        "lodash.uniq": "4.5.0"
+      }
+    },
+    "caniuse-db": {
+      "version": "1.0.30000698",
+      "resolved": "https://registry.npmjs.org/caniuse-db/-/caniuse-db-1.0.30000698.tgz",
+      "integrity": "sha1-Yjot40WM7KN5hGqPFw57F3HHw6M=",
+      "dev": true
+    },
+    "center-align": {
+      "version": "0.1.3",
+      "resolved": "https://registry.npmjs.org/center-align/-/center-align-0.1.3.tgz",
+      "integrity": "sha1-qg0yYptu6XIgBBHL1EYckHvCt60=",
+      "dev": true,
+      "requires": {
+        "align-text": "0.1.4",
+        "lazy-cache": "1.0.4"
+      }
+    },
+    "chai": {
+      "version": "3.5.0",
+      "resolved": "https://registry.npmjs.org/chai/-/chai-3.5.0.tgz",
+      "integrity": "sha1-TQJjewZ/6Vi9v906QOxW/vc3Mkc=",
+      "dev": true,
+      "requires": {
+        "assertion-error": "1.0.2",
+        "deep-eql": "0.1.3",
+        "type-detect": "1.0.0"
+      }
+    },
+    "chalk": {
+      "version": "1.1.3",
+      "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz",
+      "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=",
+      "dev": true,
+      "requires": {
+        "ansi-styles": "2.2.1",
+        "escape-string-regexp": "1.0.5",
+        "has-ansi": "2.0.0",
+        "strip-ansi": "3.0.1",
+        "supports-color": "2.0.0"
+      }
+    },
+    "change-case": {
+      "version": "3.0.1",
+      "resolved": "https://registry.npmjs.org/change-case/-/change-case-3.0.1.tgz",
+      "integrity": "sha1-7l9a0EFa0a2egHLPSc1M+nZgpVQ=",
+      "dev": true,
+      "requires": {
+        "camel-case": "3.0.0",
+        "constant-case": "2.0.0",
+        "dot-case": "2.1.1",
+        "header-case": "1.0.1",
+        "is-lower-case": "1.1.3",
+        "is-upper-case": "1.1.2",
+        "lower-case": "1.1.4",
+        "lower-case-first": "1.0.2",
+        "no-case": "2.3.1",
+        "param-case": "2.1.1",
+        "pascal-case": "2.0.1",
+        "path-case": "2.1.1",
+        "sentence-case": "2.1.1",
+        "snake-case": "2.1.0",
+        "swap-case": "1.1.2",
+        "title-case": "2.1.1",
+        "upper-case": "1.1.3",
+        "upper-case-first": "1.1.2"
+      }
+    },
+    "chokidar": {
+      "version": "1.7.0",
+      "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-1.7.0.tgz",
+      "integrity": "sha1-eY5ol3gVHIB2tLNg5e3SjNortGg=",
+      "dev": true,
+      "requires": {
+        "anymatch": "1.3.0",
+        "async-each": "1.0.1",
+        "fsevents": "1.1.2",
+        "glob-parent": "2.0.0",
+        "inherits": "2.0.3",
+        "is-binary-path": "1.0.1",
+        "is-glob": "2.0.1",
+        "path-is-absolute": "1.0.1",
+        "readdirp": "2.1.0"
+      }
+    },
+    "cipher-base": {
+      "version": "1.0.4",
+      "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz",
+      "integrity": "sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==",
+      "dev": true,
+      "requires": {
+        "inherits": "2.0.3",
+        "safe-buffer": "5.1.1"
+      }
+    },
+    "circular-json": {
+      "version": "0.3.1",
+      "resolved": "https://registry.npmjs.org/circular-json/-/circular-json-0.3.1.tgz",
+      "integrity": "sha1-vos2rvzN6LPKeqLWr8B6NyQsDS0=",
+      "dev": true
+    },
+    "clap": {
+      "version": "1.2.0",
+      "resolved": "https://registry.npmjs.org/clap/-/clap-1.2.0.tgz",
+      "integrity": "sha1-WckP4+E3EEdG/xlGmiemNP9oyFc=",
+      "dev": true,
+      "requires": {
+        "chalk": "1.1.3"
+      }
+    },
+    "clean-css": {
+      "version": "3.4.27",
+      "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-3.4.27.tgz",
+      "integrity": "sha1-re91sxwWD/pdcvTeZ5ZuJmDBolU=",
+      "dev": true,
+      "requires": {
+        "commander": "2.8.1",
+        "source-map": "0.4.4"
+      },
+      "dependencies": {
+        "commander": {
+          "version": "2.8.1",
+          "resolved": "https://registry.npmjs.org/commander/-/commander-2.8.1.tgz",
+          "integrity": "sha1-Br42f+v9oMMwqh4qBy09yXYkJdQ=",
+          "dev": true,
+          "requires": {
+            "graceful-readlink": "1.0.1"
+          }
+        },
+        "source-map": {
+          "version": "0.4.4",
+          "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.4.4.tgz",
+          "integrity": "sha1-66T12pwNyZneaAMti092FzZSA2s=",
+          "dev": true,
+          "requires": {
+            "amdefine": "1.0.1"
+          }
+        }
+      }
+    },
+    "cli-cursor": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-1.0.2.tgz",
+      "integrity": "sha1-ZNo/fValRBLll5S9Ytw1KV6PKYc=",
+      "dev": true,
+      "requires": {
+        "restore-cursor": "1.0.1"
+      }
+    },
+    "cli-width": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-2.1.0.tgz",
+      "integrity": "sha1-sjTKIJsp72b8UY2bmNWEewDt8Ao=",
+      "dev": true
+    },
+    "cliui": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npmjs.org/cliui/-/cliui-2.1.0.tgz",
+      "integrity": "sha1-S0dXYP+AJkx2LDoXGQMukcf+oNE=",
+      "dev": true,
+      "requires": {
+        "center-align": "0.1.3",
+        "right-align": "0.1.3",
+        "wordwrap": "0.0.2"
+      },
+      "dependencies": {
+        "wordwrap": {
+          "version": "0.0.2",
+          "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.2.tgz",
+          "integrity": "sha1-t5Zpu0LstAn4PVg8rVLKF+qhZD8=",
+          "dev": true
+        }
+      }
+    },
+    "clone": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.2.tgz",
+      "integrity": "sha1-Jgt6meux7f4kdTgXX3gyQ8sZ0Uk=",
+      "dev": true
+    },
+    "co": {
+      "version": "4.6.0",
+      "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz",
+      "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=",
+      "dev": true
+    },
+    "coa": {
+      "version": "1.0.4",
+      "resolved": "https://registry.npmjs.org/coa/-/coa-1.0.4.tgz",
+      "integrity": "sha1-qe8VNmDWqGqL3sAomlxoTSF0Mv0=",
+      "dev": true,
+      "requires": {
+        "q": "1.5.0"
+      }
+    },
+    "code-point-at": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz",
+      "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=",
+      "dev": true
+    },
+    "color": {
+      "version": "0.11.4",
+      "resolved": "https://registry.npmjs.org/color/-/color-0.11.4.tgz",
+      "integrity": "sha1-bXtcdPtl6EHNSHkq0e1eB7kE12Q=",
+      "dev": true,
+      "requires": {
+        "clone": "1.0.2",
+        "color-convert": "1.9.0",
+        "color-string": "0.3.0"
+      }
+    },
+    "color-convert": {
+      "version": "1.9.0",
+      "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.0.tgz",
+      "integrity": "sha1-Gsz5fdc5uYO/mU1W/sj5WFNkG3o=",
+      "dev": true,
+      "requires": {
+        "color-name": "1.1.2"
+      }
+    },
+    "color-name": {
+      "version": "1.1.2",
+      "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.2.tgz",
+      "integrity": "sha1-XIq3K2S9IhXWF66VWeuxSEdc+Y0=",
+      "dev": true
+    },
+    "color-string": {
+      "version": "0.3.0",
+      "resolved": "https://registry.npmjs.org/color-string/-/color-string-0.3.0.tgz",
+      "integrity": "sha1-J9RvtnAlxcL6JZk7+/V55HhBuZE=",
+      "dev": true,
+      "requires": {
+        "color-name": "1.1.2"
+      }
+    },
+    "colormin": {
+      "version": "1.1.2",
+      "resolved": "https://registry.npmjs.org/colormin/-/colormin-1.1.2.tgz",
+      "integrity": "sha1-6i90IKcrlogaOKrlnsEkpvcpgTM=",
+      "dev": true,
+      "requires": {
+        "color": "0.11.4",
+        "css-color-names": "0.0.4",
+        "has": "1.0.1"
+      }
+    },
+    "colors": {
+      "version": "1.1.2",
+      "resolved": "https://registry.npmjs.org/colors/-/colors-1.1.2.tgz",
+      "integrity": "sha1-FopHAXVran9RoSzgyXv6KMCE7WM=",
+      "dev": true
+    },
+    "combine-lists": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/combine-lists/-/combine-lists-1.0.1.tgz",
+      "integrity": "sha1-RYwH4J4NkA/Ci3Cj/sLazR0st/Y=",
+      "dev": true,
+      "requires": {
+        "lodash": "4.14.1"
+      }
+    },
+    "combined-stream": {
+      "version": "0.0.7",
+      "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-0.0.7.tgz",
+      "integrity": "sha1-ATfmV7qlp1QcV6w3rF/AfXO03B8=",
+      "dev": true,
+      "optional": true,
+      "requires": {
+        "delayed-stream": "0.0.5"
+      }
+    },
+    "commander": {
+      "version": "2.9.0",
+      "resolved": "https://registry.npmjs.org/commander/-/commander-2.9.0.tgz",
+      "integrity": "sha1-nJkJQXbhIkDLItbFFGCYQA/g99Q=",
+      "dev": true,
+      "requires": {
+        "graceful-readlink": "1.0.1"
+      }
+    },
+    "common-tags": {
+      "version": "0.1.1",
+      "resolved": "https://registry.npmjs.org/common-tags/-/common-tags-0.1.1.tgz",
+      "integrity": "sha1-2JNIbsxt8iz/5sOTyIwS9x5+iHE=",
+      "dev": true,
+      "requires": {
+        "babel-runtime": "6.23.0"
+      }
+    },
+    "component-bind": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/component-bind/-/component-bind-1.0.0.tgz",
+      "integrity": "sha1-AMYIq33Nk4l8AAllGx06jh5zu9E=",
+      "dev": true
+    },
+    "component-emitter": {
+      "version": "1.1.2",
+      "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.1.2.tgz",
+      "integrity": "sha1-KWWU8nU9qmOZbSrwjRWpURbJrsM=",
+      "dev": true
+    },
+    "component-inherit": {
+      "version": "0.0.3",
+      "resolved": "https://registry.npmjs.org/component-inherit/-/component-inherit-0.0.3.tgz",
+      "integrity": "sha1-ZF/ErfWLcrZJ1crmUTVhnbJv8UM=",
+      "dev": true
+    },
+    "compressible": {
+      "version": "2.0.10",
+      "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.10.tgz",
+      "integrity": "sha1-/tocf3YXkScyspv4zyYlKiC57s0=",
+      "dev": true,
+      "requires": {
+        "mime-db": "1.27.0"
+      }
+    },
+    "compression": {
+      "version": "1.6.2",
+      "resolved": "https://registry.npmjs.org/compression/-/compression-1.6.2.tgz",
+      "integrity": "sha1-zOsSHsydCcUtetDDNQ6pPd1AK8M=",
+      "dev": true,
+      "requires": {
+        "accepts": "1.3.3",
+        "bytes": "2.3.0",
+        "compressible": "2.0.10",
+        "debug": "2.2.0",
+        "on-headers": "1.0.1",
+        "vary": "1.1.1"
+      },
+      "dependencies": {
+        "accepts": {
+          "version": "1.3.3",
+          "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.3.tgz",
+          "integrity": "sha1-w8p0NJOGSMPg2cHjKN1otiLChMo=",
+          "dev": true,
+          "requires": {
+            "mime-types": "2.1.15",
+            "negotiator": "0.6.1"
+          }
+        },
+        "bytes": {
+          "version": "2.3.0",
+          "resolved": "https://registry.npmjs.org/bytes/-/bytes-2.3.0.tgz",
+          "integrity": "sha1-1baAoWW2IBc5rLYRVCqrwtjOsHA=",
+          "dev": true
+        },
+        "debug": {
+          "version": "2.2.0",
+          "resolved": "https://registry.npmjs.org/debug/-/debug-2.2.0.tgz",
+          "integrity": "sha1-+HBX6ZWxofauaklgZkE3vFbwOdo=",
+          "dev": true,
+          "requires": {
+            "ms": "0.7.1"
+          }
+        },
+        "ms": {
+          "version": "0.7.1",
+          "resolved": "https://registry.npmjs.org/ms/-/ms-0.7.1.tgz",
+          "integrity": "sha1-nNE8A62/8ltl7/3nzoZO6VIBcJg=",
+          "dev": true
+        },
+        "negotiator": {
+          "version": "0.6.1",
+          "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.1.tgz",
+          "integrity": "sha1-KzJxhOiZIQEXeyhWP7XnECrNDKk=",
+          "dev": true
+        }
+      }
+    },
+    "concat-map": {
+      "version": "0.0.1",
+      "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
+      "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=",
+      "dev": true
+    },
+    "concat-stream": {
+      "version": "1.6.0",
+      "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.0.tgz",
+      "integrity": "sha1-CqxmL9Ur54lk1VMvaUeE5wEQrPc=",
+      "dev": true,
+      "requires": {
+        "inherits": "2.0.3",
+        "readable-stream": "2.3.3",
+        "typedarray": "0.0.6"
+      }
+    },
+    "connect": {
+      "version": "3.6.2",
+      "resolved": "https://registry.npmjs.org/connect/-/connect-3.6.2.tgz",
+      "integrity": "sha1-aU6NIGgb/kkCgsiriGvpjwn0L+c=",
+      "dev": true,
+      "requires": {
+        "debug": "2.6.7",
+        "finalhandler": "1.0.3",
+        "parseurl": "1.3.1",
+        "utils-merge": "1.0.0"
+      },
+      "dependencies": {
+        "debug": {
+          "version": "2.6.7",
+          "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.7.tgz",
+          "integrity": "sha1-krrR9tBbu2u6Isyoi80OyJTChh4=",
+          "dev": true,
+          "requires": {
+            "ms": "2.0.0"
+          }
+        }
+      }
+    },
+    "connect-history-api-fallback": {
+      "version": "1.3.0",
+      "resolved": "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-1.3.0.tgz",
+      "integrity": "sha1-5R0X+PDvDbkKZP20feMFFVbp8Wk=",
+      "dev": true
+    },
+    "console-browserify": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.1.0.tgz",
+      "integrity": "sha1-8CQcRXMKn8YyOyBtvzjtx0HQuxA=",
+      "dev": true,
+      "requires": {
+        "date-now": "0.1.4"
+      }
+    },
+    "constant-case": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/constant-case/-/constant-case-2.0.0.tgz",
+      "integrity": "sha1-QXV2TTidP6nI7NKRhu1gBSQ7akY=",
+      "dev": true,
+      "requires": {
+        "snake-case": "2.1.0",
+        "upper-case": "1.1.3"
+      }
+    },
+    "constants-browserify": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/constants-browserify/-/constants-browserify-1.0.0.tgz",
+      "integrity": "sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U=",
+      "dev": true
+    },
+    "contains-path": {
+      "version": "0.1.0",
+      "resolved": "https://registry.npmjs.org/contains-path/-/contains-path-0.1.0.tgz",
+      "integrity": "sha1-/ozxhP9mcLa67wGp1IYaXL7EEgo=",
+      "dev": true
+    },
+    "content-disposition": {
+      "version": "0.5.2",
+      "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.2.tgz",
+      "integrity": "sha1-DPaLud318r55YcOoUXjLhdunjLQ=",
+      "dev": true
+    },
+    "content-type": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.2.tgz",
+      "integrity": "sha1-t9ETrueo3Se9IRM8TcJSnfFyHu0=",
+      "dev": true
+    },
+    "convert-source-map": {
+      "version": "1.5.0",
+      "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.5.0.tgz",
+      "integrity": "sha1-ms1whRxtXf3ZPZKC5e35SgP/RrU=",
+      "dev": true
+    },
+    "cookie": {
+      "version": "0.3.1",
+      "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.3.1.tgz",
+      "integrity": "sha1-5+Ch+e9DtMi6klxcWpboBtFoc7s=",
+      "dev": true
+    },
+    "cookie-signature": {
+      "version": "1.0.6",
+      "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz",
+      "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=",
+      "dev": true
+    },
+    "core-assert": {
+      "version": "0.1.3",
+      "resolved": "https://registry.npmjs.org/core-assert/-/core-assert-0.1.3.tgz",
+      "integrity": "sha1-oznK3+GJiiKZz37g31wUmToys9E=",
+      "dev": true,
+      "requires": {
+        "buf-compare": "1.0.1"
+      }
+    },
+    "core-js": {
+      "version": "1.2.7",
+      "resolved": "https://registry.npmjs.org/core-js/-/core-js-1.2.7.tgz",
+      "integrity": "sha1-ZSKUwUZR2yj6k70tX/KYOk8IxjY="
+    },
+    "core-util-is": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz",
+      "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=",
+      "dev": true
+    },
+    "corser": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npmjs.org/corser/-/corser-2.0.1.tgz",
+      "integrity": "sha1-jtolLsqrWEDc2XXOuQ2TcMgZ/4c=",
+      "dev": true
+    },
+    "cp-file": {
+      "version": "3.2.0",
+      "resolved": "https://registry.npmjs.org/cp-file/-/cp-file-3.2.0.tgz",
+      "integrity": "sha1-b4NhYlRiTwrViqSqjQdvAmvn4Yg=",
+      "dev": true,
+      "requires": {
+        "graceful-fs": "4.1.11",
+        "mkdirp": "0.5.1",
+        "nested-error-stacks": "1.0.2",
+        "object-assign": "4.1.1",
+        "pify": "2.3.0",
+        "pinkie-promise": "2.0.1",
+        "readable-stream": "2.3.3"
+      }
+    },
+    "cpy": {
+      "version": "4.0.1",
+      "resolved": "https://registry.npmjs.org/cpy/-/cpy-4.0.1.tgz",
+      "integrity": "sha1-tnJn66LzlgugalphrJQDNCKDNCQ=",
+      "dev": true,
+      "requires": {
+        "cp-file": "3.2.0",
+        "globby": "4.1.0",
+        "meow": "3.7.0",
+        "nested-error-stacks": "1.0.2",
+        "object-assign": "4.1.1",
+        "pinkie-promise": "2.0.1"
+      }
+    },
+    "cpy-cli": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/cpy-cli/-/cpy-cli-1.0.1.tgz",
+      "integrity": "sha1-Z/taSi3sKMqKv/N13kuecfanVhw=",
+      "dev": true,
+      "requires": {
+        "cpy": "4.0.1",
+        "meow": "3.7.0"
+      }
+    },
+    "create-ecdh": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.0.tgz",
+      "integrity": "sha1-iIxyNZbN92EvZJgjPuvXo1MBc30=",
+      "dev": true,
+      "requires": {
+        "bn.js": "4.11.7",
+        "elliptic": "6.4.0"
+      }
+    },
+    "create-hash": {
+      "version": "1.1.3",
+      "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.1.3.tgz",
+      "integrity": "sha1-YGBCrIuSYnUPSDyt2rD1gZFy2P0=",
+      "dev": true,
+      "requires": {
+        "cipher-base": "1.0.4",
+        "inherits": "2.0.3",
+        "ripemd160": "2.0.1",
+        "sha.js": "2.4.8"
+      }
+    },
+    "create-hmac": {
+      "version": "1.1.6",
+      "resolved": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.6.tgz",
+      "integrity": "sha1-rLniIaThe9sHbpBlfEK5PjcmzwY=",
+      "dev": true,
+      "requires": {
+        "cipher-base": "1.0.4",
+        "create-hash": "1.1.3",
+        "inherits": "2.0.3",
+        "ripemd160": "2.0.1",
+        "safe-buffer": "5.1.1",
+        "sha.js": "2.4.8"
+      }
+    },
+    "cross-env": {
+      "version": "1.0.8",
+      "resolved": "https://registry.npmjs.org/cross-env/-/cross-env-1.0.8.tgz",
+      "integrity": "sha1-K950jvx4D1bd8H6mn8rYdTV3dM4=",
+      "dev": true,
+      "requires": {
+        "cross-spawn": "3.0.1",
+        "lodash.assign": "3.2.0"
+      },
+      "dependencies": {
+        "cross-spawn": {
+          "version": "3.0.1",
+          "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-3.0.1.tgz",
+          "integrity": "sha1-ElYDfsufDF9549bvE14wdwGEuYI=",
+          "dev": true,
+          "requires": {
+            "lru-cache": "4.1.1",
+            "which": "1.2.14"
+          }
+        },
+        "lodash.assign": {
+          "version": "3.2.0",
+          "resolved": "https://registry.npmjs.org/lodash.assign/-/lodash.assign-3.2.0.tgz",
+          "integrity": "sha1-POnwI0tLIiPilrj6CsH+6OvKZPo=",
+          "dev": true,
+          "requires": {
+            "lodash._baseassign": "3.2.0",
+            "lodash._createassigner": "3.1.1",
+            "lodash.keys": "3.1.2"
+          }
+        },
+        "lru-cache": {
+          "version": "4.1.1",
+          "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.1.tgz",
+          "integrity": "sha512-q4spe4KTfsAS1SUHLO0wz8Qiyf1+vMIAgpRYioFYDMNqKfHQbg+AVDH3i4fvpl71/P1L0dBl+fQi+P37UYf0ew==",
+          "dev": true,
+          "requires": {
+            "pseudomap": "1.0.2",
+            "yallist": "2.1.2"
+          }
+        }
+      }
+    },
+    "cross-spawn": {
+      "version": "4.0.2",
+      "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-4.0.2.tgz",
+      "integrity": "sha1-e5JHYhwjrf3ThWAEqCPL45dCTUE=",
+      "dev": true,
+      "requires": {
+        "lru-cache": "4.1.1",
+        "which": "1.2.14"
+      },
+      "dependencies": {
+        "lru-cache": {
+          "version": "4.1.1",
+          "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.1.tgz",
+          "integrity": "sha512-q4spe4KTfsAS1SUHLO0wz8Qiyf1+vMIAgpRYioFYDMNqKfHQbg+AVDH3i4fvpl71/P1L0dBl+fQi+P37UYf0ew==",
+          "dev": true,
+          "requires": {
+            "pseudomap": "1.0.2",
+            "yallist": "2.1.2"
+          }
+        }
+      }
+    },
+    "cryptiles": {
+      "version": "0.2.2",
+      "resolved": "https://registry.npmjs.org/cryptiles/-/cryptiles-0.2.2.tgz",
+      "integrity": "sha1-7ZH/HxetE9N0gohZT4pIoNJvMlw=",
+      "dev": true,
+      "optional": true,
+      "requires": {
+        "boom": "0.4.2"
+      }
+    },
+    "crypto-browserify": {
+      "version": "3.11.0",
+      "resolved": "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.11.0.tgz",
+      "integrity": "sha1-NlKgkGq5sqfgw85mpAjpV6JIVSI=",
+      "dev": true,
+      "requires": {
+        "browserify-cipher": "1.0.0",
+        "browserify-sign": "4.0.4",
+        "create-ecdh": "4.0.0",
+        "create-hash": "1.1.3",
+        "create-hmac": "1.1.6",
+        "diffie-hellman": "5.0.2",
+        "inherits": "2.0.3",
+        "pbkdf2": "3.0.12",
+        "public-encrypt": "4.0.0",
+        "randombytes": "2.0.5"
+      }
+    },
+    "css-color-names": {
+      "version": "0.0.4",
+      "resolved": "https://registry.npmjs.org/css-color-names/-/css-color-names-0.0.4.tgz",
+      "integrity": "sha1-gIrcLnnPhHOAabZGyyDsJ762KeA=",
+      "dev": true
+    },
+    "css-loader": {
+      "version": "0.23.1",
+      "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-0.23.1.tgz",
+      "integrity": "sha1-n6I/K1wJZSNZEK1ezvO4o2OQ/lA=",
+      "dev": true,
+      "requires": {
+        "css-selector-tokenizer": "0.5.4",
+        "cssnano": "3.10.0",
+        "loader-utils": "0.2.17",
+        "lodash.camelcase": "3.0.1",
+        "object-assign": "4.1.1",
+        "postcss": "5.2.17",
+        "postcss-modules-extract-imports": "1.1.0",
+        "postcss-modules-local-by-default": "1.2.0",
+        "postcss-modules-scope": "1.1.0",
+        "postcss-modules-values": "1.3.0",
+        "source-list-map": "0.1.8"
+      }
+    },
+    "css-select": {
+      "version": "1.2.0",
+      "resolved": "https://registry.npmjs.org/css-select/-/css-select-1.2.0.tgz",
+      "integrity": "sha1-KzoRBTnFNV8c2NMUYj6HCxIeyFg=",
+      "dev": true,
+      "requires": {
+        "boolbase": "1.0.0",
+        "css-what": "2.1.0",
+        "domutils": "1.5.1",
+        "nth-check": "1.0.1"
+      }
+    },
+    "css-selector-tokenizer": {
+      "version": "0.5.4",
+      "resolved": "https://registry.npmjs.org/css-selector-tokenizer/-/css-selector-tokenizer-0.5.4.tgz",
+      "integrity": "sha1-E5uv00o1/QwUKEhwSeBpnm9qLCE=",
+      "dev": true,
+      "requires": {
+        "cssesc": "0.1.0",
+        "fastparse": "1.1.1"
+      }
+    },
+    "css-what": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npmjs.org/css-what/-/css-what-2.1.0.tgz",
+      "integrity": "sha1-lGfQMsOM+u+58teVASUwYvh/ob0=",
+      "dev": true
+    },
+    "cssesc": {
+      "version": "0.1.0",
+      "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-0.1.0.tgz",
+      "integrity": "sha1-yBSQPkViM3GgR3tAEJqq++6t27Q=",
+      "dev": true
+    },
+    "cssnano": {
+      "version": "3.10.0",
+      "resolved": "https://registry.npmjs.org/cssnano/-/cssnano-3.10.0.tgz",
+      "integrity": "sha1-Tzj2zqK5sX+gFJDyPx3GjqZcHDg=",
+      "dev": true,
+      "requires": {
+        "autoprefixer": "6.7.7",
+        "decamelize": "1.2.0",
+        "defined": "1.0.0",
+        "has": "1.0.1",
+        "object-assign": "4.1.1",
+        "postcss": "5.2.17",
+        "postcss-calc": "5.3.1",
+        "postcss-colormin": "2.2.2",
+        "postcss-convert-values": "2.6.1",
+        "postcss-discard-comments": "2.0.4",
+        "postcss-discard-duplicates": "2.1.0",
+        "postcss-discard-empty": "2.1.0",
+        "postcss-discard-overridden": "0.1.1",
+        "postcss-discard-unused": "2.2.3",
+        "postcss-filter-plugins": "2.0.2",
+        "postcss-merge-idents": "2.1.7",
+        "postcss-merge-longhand": "2.0.2",
+        "postcss-merge-rules": "2.1.2",
+        "postcss-minify-font-values": "1.0.5",
+        "postcss-minify-gradients": "1.0.5",
+        "postcss-minify-params": "1.2.2",
+        "postcss-minify-selectors": "2.1.1",
+        "postcss-normalize-charset": "1.1.1",
+        "postcss-normalize-url": "3.0.8",
+        "postcss-ordered-values": "2.2.3",
+        "postcss-reduce-idents": "2.4.0",
+        "postcss-reduce-initial": "1.0.1",
+        "postcss-reduce-transforms": "1.0.4",
+        "postcss-svgo": "2.1.6",
+        "postcss-unique-selectors": "2.0.2",
+        "postcss-value-parser": "3.3.0",
+        "postcss-zindex": "2.2.0"
+      }
+    },
+    "csso": {
+      "version": "2.3.2",
+      "resolved": "https://registry.npmjs.org/csso/-/csso-2.3.2.tgz",
+      "integrity": "sha1-3dUsWHAz9J6Utx/FVWnyUuj/X4U=",
+      "dev": true,
+      "requires": {
+        "clap": "1.2.0",
+        "source-map": "0.5.6"
+      }
+    },
+    "ctype": {
+      "version": "0.5.3",
+      "resolved": "https://registry.npmjs.org/ctype/-/ctype-0.5.3.tgz",
+      "integrity": "sha1-gsGMJGH3QRTvFsE1IkrQuRRMoS8=",
+      "dev": true,
+      "optional": true
+    },
+    "currently-unhandled": {
+      "version": "0.4.1",
+      "resolved": "https://registry.npmjs.org/currently-unhandled/-/currently-unhandled-0.4.1.tgz",
+      "integrity": "sha1-mI3zP+qxke95mmE2nddsF635V+o=",
+      "dev": true,
+      "requires": {
+        "array-find-index": "1.0.2"
+      }
+    },
+    "custom-event": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/custom-event/-/custom-event-1.0.1.tgz",
+      "integrity": "sha1-XQKkaFCt8bSjF5RqOSj8y1v9BCU=",
+      "dev": true
+    },
+    "cycle": {
+      "version": "1.0.3",
+      "resolved": "https://registry.npmjs.org/cycle/-/cycle-1.0.3.tgz",
+      "integrity": "sha1-IegLK+hYD5i0aPN5QwZisEbDStI=",
+      "dev": true
+    },
+    "d": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/d/-/d-1.0.0.tgz",
+      "integrity": "sha1-dUu1v+VUUdpppYuU1F9MWwRi1Y8=",
+      "dev": true,
+      "requires": {
+        "es5-ext": "0.10.23"
+      }
+    },
+    "d3": {
+      "version": "3.5.17",
+      "resolved": "https://registry.npmjs.org/d3/-/d3-3.5.17.tgz",
+      "integrity": "sha1-vEZ0gAQ3iyGjYMn8fPUjF5B2L7g="
+    },
+    "damerau-levenshtein": {
+      "version": "1.0.4",
+      "resolved": "https://registry.npmjs.org/damerau-levenshtein/-/damerau-levenshtein-1.0.4.tgz",
+      "integrity": "sha1-AxkcQyy27qFou3fzpV/9zLiXhRQ=",
+      "dev": true
+    },
+    "date-now": {
+      "version": "0.1.4",
+      "resolved": "https://registry.npmjs.org/date-now/-/date-now-0.1.4.tgz",
+      "integrity": "sha1-6vQ5/U1ISK105cx9vvIAZyueNFs=",
+      "dev": true
+    },
+    "dateformat": {
+      "version": "1.0.12",
+      "resolved": "https://registry.npmjs.org/dateformat/-/dateformat-1.0.12.tgz",
+      "integrity": "sha1-nxJLZ1lMk3/3BpMuSmQsyo27/uk=",
+      "dev": true,
+      "requires": {
+        "get-stdin": "4.0.1",
+        "meow": "3.7.0"
+      }
+    },
+    "debug": {
+      "version": "2.6.8",
+      "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.8.tgz",
+      "integrity": "sha1-5zFTHKLt4n0YgiJCfaF4IdaP9Pw=",
+      "dev": true,
+      "requires": {
+        "ms": "2.0.0"
+      }
+    },
+    "decamelize": {
+      "version": "1.2.0",
+      "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz",
+      "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=",
+      "dev": true
+    },
+    "deep-eql": {
+      "version": "0.1.3",
+      "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-0.1.3.tgz",
+      "integrity": "sha1-71WKyrjeJSBs1xOQbXTlaTDrafI=",
+      "dev": true,
+      "requires": {
+        "type-detect": "0.1.1"
+      },
+      "dependencies": {
+        "type-detect": {
+          "version": "0.1.1",
+          "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-0.1.1.tgz",
+          "integrity": "sha1-C6XsKohWQORw6k6FBZcZANrFiCI=",
+          "dev": true
+        }
+      }
+    },
+    "deep-equal": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-1.0.1.tgz",
+      "integrity": "sha1-9dJgKStmDghO/0zbyfCK0yR0SLU=",
+      "dev": true
+    },
+    "deep-is": {
+      "version": "0.1.3",
+      "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz",
+      "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=",
+      "dev": true
+    },
+    "deep-strict-equal": {
+      "version": "0.1.0",
+      "resolved": "https://registry.npmjs.org/deep-strict-equal/-/deep-strict-equal-0.1.0.tgz",
+      "integrity": "sha1-XD+Qqkx92d7gJpOmYuV0QX4LLhc=",
+      "dev": true,
+      "requires": {
+        "core-assert": "0.1.3"
+      }
+    },
+    "define-properties": {
+      "version": "1.1.2",
+      "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.2.tgz",
+      "integrity": "sha1-g6c/L+pWmJj7c3GTyPhzyvbUXJQ=",
+      "dev": true,
+      "requires": {
+        "foreach": "2.0.5",
+        "object-keys": "1.0.11"
+      }
+    },
+    "defined": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/defined/-/defined-1.0.0.tgz",
+      "integrity": "sha1-yY2bzvdWdBiOEQlpFRGZ45sfppM=",
+      "dev": true
+    },
+    "del": {
+      "version": "2.2.2",
+      "resolved": "https://registry.npmjs.org/del/-/del-2.2.2.tgz",
+      "integrity": "sha1-wSyYHQZ4RshLyvhiz/kw2Qf/0ag=",
+      "dev": true,
+      "requires": {
+        "globby": "5.0.0",
+        "is-path-cwd": "1.0.0",
+        "is-path-in-cwd": "1.0.0",
+        "object-assign": "4.1.1",
+        "pify": "2.3.0",
+        "pinkie-promise": "2.0.1",
+        "rimraf": "2.5.4"
+      },
+      "dependencies": {
+        "glob": {
+          "version": "7.1.2",
+          "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz",
+          "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==",
+          "dev": true,
+          "requires": {
+            "fs.realpath": "1.0.0",
+            "inflight": "1.0.6",
+            "inherits": "2.0.3",
+            "minimatch": "3.0.4",
+            "once": "1.4.0",
+            "path-is-absolute": "1.0.1"
+          }
+        },
+        "globby": {
+          "version": "5.0.0",
+          "resolved": "https://registry.npmjs.org/globby/-/globby-5.0.0.tgz",
+          "integrity": "sha1-69hGZ8oNuzMLmbz8aOrCvFQ3Dg0=",
+          "dev": true,
+          "requires": {
+            "array-union": "1.0.2",
+            "arrify": "1.0.1",
+            "glob": "7.1.2",
+            "object-assign": "4.1.1",
+            "pify": "2.3.0",
+            "pinkie-promise": "2.0.1"
+          }
+        }
+      }
+    },
+    "delayed-stream": {
+      "version": "0.0.5",
+      "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-0.0.5.tgz",
+      "integrity": "sha1-1LH0OpPoKW3+AmlPRoC8N6MTxz8=",
+      "dev": true,
+      "optional": true
+    },
+    "delegates": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz",
+      "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=",
+      "dev": true
+    },
+    "depd": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.0.tgz",
+      "integrity": "sha1-4b2Cxqq2ztlluXuIsX7T5SjKGMM=",
+      "dev": true
+    },
+    "des.js": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/des.js/-/des.js-1.0.0.tgz",
+      "integrity": "sha1-wHTS4qpqipoH29YfmhXCzYPsjsw=",
+      "dev": true,
+      "requires": {
+        "inherits": "2.0.3",
+        "minimalistic-assert": "1.0.0"
+      }
+    },
+    "destroy": {
+      "version": "1.0.4",
+      "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz",
+      "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=",
+      "dev": true
+    },
+    "detect-file": {
+      "version": "0.1.0",
+      "resolved": "https://registry.npmjs.org/detect-file/-/detect-file-0.1.0.tgz",
+      "integrity": "sha1-STXe39lIhkjgBrASlWbpOGcR6mM=",
+      "dev": true,
+      "requires": {
+        "fs-exists-sync": "0.1.0"
+      }
+    },
+    "detect-indent": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-4.0.0.tgz",
+      "integrity": "sha1-920GQ1LN9Docts5hnE7jqUdd4gg=",
+      "dev": true,
+      "requires": {
+        "repeating": "2.0.1"
+      }
+    },
+    "di": {
+      "version": "0.0.1",
+      "resolved": "https://registry.npmjs.org/di/-/di-0.0.1.tgz",
+      "integrity": "sha1-gGZJMmzqp8qjMG112YXqJ0i6kTw=",
+      "dev": true
+    },
+    "diff": {
+      "version": "1.4.0",
+      "resolved": "https://registry.npmjs.org/diff/-/diff-1.4.0.tgz",
+      "integrity": "sha1-fyjS657nsVqX79ic5j3P2qPMur8=",
+      "dev": true
+    },
+    "diffie-hellman": {
+      "version": "5.0.2",
+      "resolved": "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.2.tgz",
+      "integrity": "sha1-tYNXOScM/ias9jIJn97SoH8gnl4=",
+      "dev": true,
+      "requires": {
+        "bn.js": "4.11.7",
+        "miller-rabin": "4.0.0",
+        "randombytes": "2.0.5"
+      }
+    },
+    "doctrine": {
+      "version": "1.5.0",
+      "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-1.5.0.tgz",
+      "integrity": "sha1-N53Ocw9hZvds76TmcHoVmwLFpvo=",
+      "dev": true,
+      "requires": {
+        "esutils": "2.0.2",
+        "isarray": "1.0.0"
+      }
+    },
+    "dom-converter": {
+      "version": "0.1.4",
+      "resolved": "https://registry.npmjs.org/dom-converter/-/dom-converter-0.1.4.tgz",
+      "integrity": "sha1-pF71cnuJDJv/5tfIduexnLDhfzs=",
+      "dev": true,
+      "requires": {
+        "utila": "0.3.3"
+      },
+      "dependencies": {
+        "utila": {
+          "version": "0.3.3",
+          "resolved": "https://registry.npmjs.org/utila/-/utila-0.3.3.tgz",
+          "integrity": "sha1-1+jn1+MJEHCSsF+NloiCTWM6QiY=",
+          "dev": true
+        }
+      }
+    },
+    "dom-serialize": {
+      "version": "2.2.1",
+      "resolved": "https://registry.npmjs.org/dom-serialize/-/dom-serialize-2.2.1.tgz",
+      "integrity": "sha1-ViromZ9Evl6jB29UGdzVnrQ6yVs=",
+      "dev": true,
+      "requires": {
+        "custom-event": "1.0.1",
+        "ent": "2.2.0",
+        "extend": "3.0.1",
+        "void-elements": "2.0.1"
+      }
+    },
+    "dom-serializer": {
+      "version": "0.1.0",
+      "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.1.0.tgz",
+      "integrity": "sha1-BzxpdUbOB4DOI75KKOKT5AvDDII=",
+      "dev": true,
+      "requires": {
+        "domelementtype": "1.1.3",
+        "entities": "1.1.1"
+      },
+      "dependencies": {
+        "domelementtype": {
+          "version": "1.1.3",
+          "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.1.3.tgz",
+          "integrity": "sha1-vSh3PiZCiBrsUVRJJCmcXNgiGFs=",
+          "dev": true
+        }
+      }
+    },
+    "domain-browser": {
+      "version": "1.1.7",
+      "resolved": "https://registry.npmjs.org/domain-browser/-/domain-browser-1.1.7.tgz",
+      "integrity": "sha1-hnqksJP6oF8d4IwG9NeyH9+GmLw=",
+      "dev": true
+    },
+    "domelementtype": {
+      "version": "1.3.0",
+      "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.0.tgz",
+      "integrity": "sha1-sXrtguirWeUt2cGbF1bg/BhyBMI=",
+      "dev": true
+    },
+    "domhandler": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-2.1.0.tgz",
+      "integrity": "sha1-0mRvXlf2w7qxHPbLBdPArPdBJZQ=",
+      "dev": true,
+      "requires": {
+        "domelementtype": "1.3.0"
+      }
+    },
+    "domutils": {
+      "version": "1.5.1",
+      "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.5.1.tgz",
+      "integrity": "sha1-3NhIiib1Y9YQeeSMn3t+Mjc2gs8=",
+      "dev": true,
+      "requires": {
+        "dom-serializer": "0.1.0",
+        "domelementtype": "1.3.0"
+      }
+    },
+    "dot-case": {
+      "version": "2.1.1",
+      "resolved": "https://registry.npmjs.org/dot-case/-/dot-case-2.1.1.tgz",
+      "integrity": "sha1-NNzzf1Co6TwrO8qLt/uRVcfaO+4=",
+      "dev": true,
+      "requires": {
+        "no-case": "2.3.1"
+      }
+    },
+    "du": {
+      "version": "0.1.0",
+      "resolved": "https://registry.npmjs.org/du/-/du-0.1.0.tgz",
+      "integrity": "sha1-8m40CgnHvFtv1pr2263qYPqMb00=",
+      "dev": true,
+      "requires": {
+        "async": "0.1.22"
+      },
+      "dependencies": {
+        "async": {
+          "version": "0.1.22",
+          "resolved": "https://registry.npmjs.org/async/-/async-0.1.22.tgz",
+          "integrity": "sha1-D8GqoIig4+8Ovi2IMbqw3PiEUGE=",
+          "dev": true
+        }
+      }
+    },
+    "duplexer": {
+      "version": "0.1.1",
+      "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.1.tgz",
+      "integrity": "sha1-rOb/gIwc5mtX0ev5eXessCM0z8E=",
+      "dev": true
+    },
+    "ecstatic": {
+      "version": "1.4.1",
+      "resolved": "https://registry.npmjs.org/ecstatic/-/ecstatic-1.4.1.tgz",
+      "integrity": "sha1-Mst7b6LikNWGaGdNEV6PDD1WfWo=",
+      "dev": true,
+      "requires": {
+        "he": "0.5.0",
+        "mime": "1.3.6",
+        "minimist": "1.2.0",
+        "url-join": "1.1.0"
+      },
+      "dependencies": {
+        "he": {
+          "version": "0.5.0",
+          "resolved": "https://registry.npmjs.org/he/-/he-0.5.0.tgz",
+          "integrity": "sha1-LAX/rvkLaOhg8/0rVO9YCYknfuI=",
+          "dev": true
+        },
+        "minimist": {
+          "version": "1.2.0",
+          "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz",
+          "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=",
+          "dev": true
+        }
+      }
+    },
+    "ee-first": {
+      "version": "1.1.1",
+      "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz",
+      "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=",
+      "dev": true
+    },
+    "electron-to-chromium": {
+      "version": "1.3.15",
+      "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.15.tgz",
+      "integrity": "sha1-CDl5NIkcvPrrvRi4KpW1pIETg2k=",
+      "dev": true
+    },
+    "elliptic": {
+      "version": "6.4.0",
+      "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.4.0.tgz",
+      "integrity": "sha1-ysmvh2LIWDYYcAPI3+GT5eLq5d8=",
+      "dev": true,
+      "requires": {
+        "bn.js": "4.11.7",
+        "brorand": "1.1.0",
+        "hash.js": "1.1.3",
+        "hmac-drbg": "1.0.1",
+        "inherits": "2.0.3",
+        "minimalistic-assert": "1.0.0",
+        "minimalistic-crypto-utils": "1.0.1"
+      }
+    },
+    "emojis-list": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-2.1.0.tgz",
+      "integrity": "sha1-TapNnbAPmBmIDHn6RXrlsJof04k=",
+      "dev": true
+    },
+    "encodeurl": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.1.tgz",
+      "integrity": "sha1-eePVhlU0aQn+bw9Fpd5oEDspTSA=",
+      "dev": true
+    },
+    "encoding": {
+      "version": "0.1.12",
+      "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.12.tgz",
+      "integrity": "sha1-U4tm8+5izRq1HsMjgp0flIDHS+s=",
+      "requires": {
+        "iconv-lite": "0.4.18"
+      }
+    },
+    "engine.io": {
+      "version": "1.6.10",
+      "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-1.6.10.tgz",
+      "integrity": "sha1-+H2E4b0h0aLsf43u8MYgVKzfsno=",
+      "dev": true,
+      "requires": {
+        "accepts": "1.1.4",
+        "base64id": "0.1.0",
+        "debug": "2.2.0",
+        "engine.io-parser": "1.2.4",
+        "ws": "1.0.1"
+      },
+      "dependencies": {
+        "debug": {
+          "version": "2.2.0",
+          "resolved": "https://registry.npmjs.org/debug/-/debug-2.2.0.tgz",
+          "integrity": "sha1-+HBX6ZWxofauaklgZkE3vFbwOdo=",
+          "dev": true,
+          "requires": {
+            "ms": "0.7.1"
+          }
+        },
+        "ms": {
+          "version": "0.7.1",
+          "resolved": "https://registry.npmjs.org/ms/-/ms-0.7.1.tgz",
+          "integrity": "sha1-nNE8A62/8ltl7/3nzoZO6VIBcJg=",
+          "dev": true
+        }
+      }
+    },
+    "engine.io-client": {
+      "version": "1.6.9",
+      "resolved": "https://registry.npmjs.org/engine.io-client/-/engine.io-client-1.6.9.tgz",
+      "integrity": "sha1-HWrUgEilCDyVCWlDsp0279shJAE=",
+      "dev": true,
+      "requires": {
+        "component-emitter": "1.1.2",
+        "component-inherit": "0.0.3",
+        "debug": "2.2.0",
+        "engine.io-parser": "1.2.4",
+        "has-cors": "1.1.0",
+        "indexof": "0.0.1",
+        "parsejson": "0.0.1",
+        "parseqs": "0.0.2",
+        "parseuri": "0.0.4",
+        "ws": "1.0.1",
+        "xmlhttprequest-ssl": "1.5.1",
+        "yeast": "0.1.2"
+      },
+      "dependencies": {
+        "debug": {
+          "version": "2.2.0",
+          "resolved": "https://registry.npmjs.org/debug/-/debug-2.2.0.tgz",
+          "integrity": "sha1-+HBX6ZWxofauaklgZkE3vFbwOdo=",
+          "dev": true,
+          "requires": {
+            "ms": "0.7.1"
+          }
+        },
+        "ms": {
+          "version": "0.7.1",
+          "resolved": "https://registry.npmjs.org/ms/-/ms-0.7.1.tgz",
+          "integrity": "sha1-nNE8A62/8ltl7/3nzoZO6VIBcJg=",
+          "dev": true
+        }
+      }
+    },
+    "engine.io-parser": {
+      "version": "1.2.4",
+      "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-1.2.4.tgz",
+      "integrity": "sha1-4Il7C/FOeS1M0qWVBVORnFaUjEI=",
+      "dev": true,
+      "requires": {
+        "after": "0.8.1",
+        "arraybuffer.slice": "0.0.6",
+        "base64-arraybuffer": "0.1.2",
+        "blob": "0.0.4",
+        "has-binary": "0.1.6",
+        "utf8": "2.1.0"
+      },
+      "dependencies": {
+        "has-binary": {
+          "version": "0.1.6",
+          "resolved": "https://registry.npmjs.org/has-binary/-/has-binary-0.1.6.tgz",
+          "integrity": "sha1-JTJvOc+k9hath4eJTjryz7x7bhA=",
+          "dev": true,
+          "requires": {
+            "isarray": "0.0.1"
+          }
+        },
+        "isarray": {
+          "version": "0.0.1",
+          "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz",
+          "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=",
+          "dev": true
+        }
+      }
+    },
+    "enhanced-resolve": {
+      "version": "0.9.1",
+      "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-0.9.1.tgz",
+      "integrity": "sha1-TW5omzcl+GCQknzMhs2fFjW4ni4=",
+      "dev": true,
+      "requires": {
+        "graceful-fs": "4.1.11",
+        "memory-fs": "0.2.0",
+        "tapable": "0.1.10"
+      }
+    },
+    "ent": {
+      "version": "2.2.0",
+      "resolved": "https://registry.npmjs.org/ent/-/ent-2.2.0.tgz",
+      "integrity": "sha1-6WQhkyWiHQX0RGai9obtbOX13R0=",
+      "dev": true
+    },
+    "entities": {
+      "version": "1.1.1",
+      "resolved": "https://registry.npmjs.org/entities/-/entities-1.1.1.tgz",
+      "integrity": "sha1-blwtClYhtdra7O+AuQ7ftc13cvA=",
+      "dev": true
+    },
+    "errno": {
+      "version": "0.1.4",
+      "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.4.tgz",
+      "integrity": "sha1-uJbiOp5ei6M4cfyZar02NfyaHH0=",
+      "dev": true,
+      "requires": {
+        "prr": "0.0.0"
+      }
+    },
+    "error-ex": {
+      "version": "1.3.1",
+      "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.1.tgz",
+      "integrity": "sha1-+FWobOYa3E6GIcPNoh56dhLDqNw=",
+      "dev": true,
+      "requires": {
+        "is-arrayish": "0.2.1"
+      }
+    },
+    "es-abstract": {
+      "version": "1.7.0",
+      "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.7.0.tgz",
+      "integrity": "sha1-363ndOAb/Nl/lhgCmMRJyGI/uUw=",
+      "dev": true,
+      "requires": {
+        "es-to-primitive": "1.1.1",
+        "function-bind": "1.1.0",
+        "is-callable": "1.1.3",
+        "is-regex": "1.0.4"
+      }
+    },
+    "es-to-primitive": {
+      "version": "1.1.1",
+      "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.1.1.tgz",
+      "integrity": "sha1-RTVSSKiJeQNLZ5Lhm7gfK3l13Q0=",
+      "dev": true,
+      "requires": {
+        "is-callable": "1.1.3",
+        "is-date-object": "1.0.1",
+        "is-symbol": "1.0.1"
+      }
+    },
+    "es5-ext": {
+      "version": "0.10.23",
+      "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.23.tgz",
+      "integrity": "sha1-dXi1G+l0IHpUh4IbVlOMIk5Oezg=",
+      "dev": true,
+      "requires": {
+        "es6-iterator": "2.0.1",
+        "es6-symbol": "3.1.1"
+      }
+    },
+    "es6-iterator": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.1.tgz",
+      "integrity": "sha1-jjGcnwRTv1ddN0lAplWSDlnKVRI=",
+      "dev": true,
+      "requires": {
+        "d": "1.0.0",
+        "es5-ext": "0.10.23",
+        "es6-symbol": "3.1.1"
+      }
+    },
+    "es6-map": {
+      "version": "0.1.5",
+      "resolved": "https://registry.npmjs.org/es6-map/-/es6-map-0.1.5.tgz",
+      "integrity": "sha1-kTbgUD3MBqMBaQ8LsU/042TpSfA=",
+      "dev": true,
+      "requires": {
+        "d": "1.0.0",
+        "es5-ext": "0.10.23",
+        "es6-iterator": "2.0.1",
+        "es6-set": "0.1.5",
+        "es6-symbol": "3.1.1",
+        "event-emitter": "0.3.5"
+      }
+    },
+    "es6-set": {
+      "version": "0.1.5",
+      "resolved": "https://registry.npmjs.org/es6-set/-/es6-set-0.1.5.tgz",
+      "integrity": "sha1-0rPsXU2ADO2BjbU40ol02wpzzLE=",
+      "dev": true,
+      "requires": {
+        "d": "1.0.0",
+        "es5-ext": "0.10.23",
+        "es6-iterator": "2.0.1",
+        "es6-symbol": "3.1.1",
+        "event-emitter": "0.3.5"
+      }
+    },
+    "es6-symbol": {
+      "version": "3.1.1",
+      "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.1.tgz",
+      "integrity": "sha1-vwDvT9q2uhtG7Le2KbTH7VcVzHc=",
+      "dev": true,
+      "requires": {
+        "d": "1.0.0",
+        "es5-ext": "0.10.23"
+      }
+    },
+    "es6-weak-map": {
+      "version": "2.0.2",
+      "resolved": "https://registry.npmjs.org/es6-weak-map/-/es6-weak-map-2.0.2.tgz",
+      "integrity": "sha1-XjqzIlH/0VOKH45f+hNXdy+S2W8=",
+      "dev": true,
+      "requires": {
+        "d": "1.0.0",
+        "es5-ext": "0.10.23",
+        "es6-iterator": "2.0.1",
+        "es6-symbol": "3.1.1"
+      }
+    },
+    "escape-html": {
+      "version": "1.0.3",
+      "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz",
+      "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=",
+      "dev": true
+    },
+    "escape-string-regexp": {
+      "version": "1.0.5",
+      "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
+      "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=",
+      "dev": true
+    },
+    "escodegen": {
+      "version": "1.8.1",
+      "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.8.1.tgz",
+      "integrity": "sha1-WltTr0aTEQvrsIZ6o0MN07cKEBg=",
+      "dev": true,
+      "requires": {
+        "esprima": "2.7.3",
+        "estraverse": "1.9.3",
+        "esutils": "2.0.2",
+        "optionator": "0.8.2",
+        "source-map": "0.2.0"
+      },
+      "dependencies": {
+        "estraverse": {
+          "version": "1.9.3",
+          "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-1.9.3.tgz",
+          "integrity": "sha1-r2fy3JIlgkFZUJJgkaQAXSnJu0Q=",
+          "dev": true
+        },
+        "source-map": {
+          "version": "0.2.0",
+          "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.2.0.tgz",
+          "integrity": "sha1-2rc/vPwrqBm03gO9b26qSBZLP50=",
+          "dev": true,
+          "optional": true,
+          "requires": {
+            "amdefine": "1.0.1"
+          }
+        }
+      }
+    },
+    "escope": {
+      "version": "3.6.0",
+      "resolved": "https://registry.npmjs.org/escope/-/escope-3.6.0.tgz",
+      "integrity": "sha1-4Bl16BJ4GhY6ba392AOY3GTIicM=",
+      "dev": true,
+      "requires": {
+        "es6-map": "0.1.5",
+        "es6-weak-map": "2.0.2",
+        "esrecurse": "4.2.0",
+        "estraverse": "4.2.0"
+      }
+    },
+    "eslint": {
+      "version": "3.2.2",
+      "resolved": "https://registry.npmjs.org/eslint/-/eslint-3.2.2.tgz",
+      "integrity": "sha1-RyJvaw5wnyP2rNBsXMnpezlXTHw=",
+      "dev": true,
+      "requires": {
+        "chalk": "1.1.3",
+        "concat-stream": "1.6.0",
+        "debug": "2.6.8",
+        "doctrine": "1.5.0",
+        "escope": "3.6.0",
+        "espree": "3.4.3",
+        "estraverse": "4.2.0",
+        "esutils": "2.0.2",
+        "file-entry-cache": "1.3.1",
+        "glob": "7.1.2",
+        "globals": "9.18.0",
+        "ignore": "3.3.3",
+        "imurmurhash": "0.1.4",
+        "inquirer": "0.12.0",
+        "is-my-json-valid": "2.16.0",
+        "is-resolvable": "1.0.0",
+        "js-yaml": "3.7.0",
+        "json-stable-stringify": "1.0.1",
+        "levn": "0.3.0",
+        "lodash": "4.14.1",
+        "mkdirp": "0.5.1",
+        "optionator": "0.8.2",
+        "path-is-inside": "1.0.2",
+        "pluralize": "1.2.1",
+        "progress": "1.1.8",
+        "require-uncached": "1.0.3",
+        "shelljs": "0.6.1",
+        "strip-bom": "3.0.0",
+        "strip-json-comments": "1.0.4",
+        "table": "3.8.3",
+        "text-table": "0.2.0",
+        "user-home": "2.0.0"
+      },
+      "dependencies": {
+        "glob": {
+          "version": "7.1.2",
+          "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz",
+          "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==",
+          "dev": true,
+          "requires": {
+            "fs.realpath": "1.0.0",
+            "inflight": "1.0.6",
+            "inherits": "2.0.3",
+            "minimatch": "3.0.4",
+            "once": "1.4.0",
+            "path-is-absolute": "1.0.1"
+          }
+        },
+        "strip-bom": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz",
+          "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=",
+          "dev": true
+        }
+      }
+    },
+    "eslint-config-kentcdodds": {
+      "version": "9.0.3",
+      "resolved": "https://registry.npmjs.org/eslint-config-kentcdodds/-/eslint-config-kentcdodds-9.0.3.tgz",
+      "integrity": "sha1-oK4z/Nld9E/z8SsKu8LdLi90fRg=",
+      "dev": true,
+      "requires": {
+        "babel-eslint": "6.1.2",
+        "babel-plugin-module-alias": "1.6.0",
+        "eslint-import-resolver-babel-module-alias": "1.5.1",
+        "eslint-import-resolver-webpack": "0.4.0",
+        "eslint-plugin-ava": "2.5.0",
+        "eslint-plugin-babel": "3.3.0",
+        "eslint-plugin-import": "1.16.0",
+        "eslint-plugin-jsx-a11y": "2.2.3",
+        "eslint-plugin-mocha": "4.11.0",
+        "eslint-plugin-react": "6.10.3"
+      }
+    },
+    "eslint-import-resolver-babel-module-alias": {
+      "version": "1.5.1",
+      "resolved": "https://registry.npmjs.org/eslint-import-resolver-babel-module-alias/-/eslint-import-resolver-babel-module-alias-1.5.1.tgz",
+      "integrity": "sha1-KyEkXOMZEy7Nkb+m9E/Aft/QNns=",
+      "dev": true,
+      "requires": {
+        "find-babel-config": "1.1.0",
+        "object-assign": "4.1.1",
+        "resolve": "1.3.3"
+      }
+    },
+    "eslint-import-resolver-node": {
+      "version": "0.2.3",
+      "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.2.3.tgz",
+      "integrity": "sha1-Wt2BBujJKNssuiMrzZ76hG49oWw=",
+      "dev": true,
+      "requires": {
+        "debug": "2.6.8",
+        "object-assign": "4.1.1",
+        "resolve": "1.3.3"
+      }
+    },
+    "eslint-import-resolver-webpack": {
+      "version": "0.4.0",
+      "resolved": "https://registry.npmjs.org/eslint-import-resolver-webpack/-/eslint-import-resolver-webpack-0.4.0.tgz",
+      "integrity": "sha1-e74YcKZWAoWhHJr9d0qTl/gH3bM=",
+      "dev": true,
+      "requires": {
+        "array-find": "1.0.0",
+        "debug": "2.6.8",
+        "enhanced-resolve": "0.9.1",
+        "find-root": "0.1.2",
+        "interpret": "1.0.3",
+        "is-absolute": "0.2.6",
+        "lodash.get": "3.7.0",
+        "node-libs-browser": "1.1.1"
+      }
+    },
+    "eslint-plugin-ava": {
+      "version": "2.5.0",
+      "resolved": "https://registry.npmjs.org/eslint-plugin-ava/-/eslint-plugin-ava-2.5.0.tgz",
+      "integrity": "sha1-lDWsYYSIUHMk7lQpyNJWhqtqsNE=",
+      "dev": true,
+      "requires": {
+        "arrify": "1.0.1",
+        "deep-strict-equal": "0.1.0",
+        "espree": "3.4.3",
+        "espurify": "1.7.0",
+        "lodash.rest": "4.0.5",
+        "multimatch": "2.1.0",
+        "object-assign": "4.1.1",
+        "pkg-up": "1.0.0"
+      }
+    },
+    "eslint-plugin-babel": {
+      "version": "3.3.0",
+      "resolved": "https://registry.npmjs.org/eslint-plugin-babel/-/eslint-plugin-babel-3.3.0.tgz",
+      "integrity": "sha1-L0lK7c9vSqTnW5FVmAg3vB+94ZM=",
+      "dev": true
+    },
+    "eslint-plugin-import": {
+      "version": "1.16.0",
+      "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-1.16.0.tgz",
+      "integrity": "sha1-svoH68xTUE0PKkR3WC7Iv/GHG58=",
+      "dev": true,
+      "requires": {
+        "builtin-modules": "1.1.1",
+        "contains-path": "0.1.0",
+        "debug": "2.6.8",
+        "doctrine": "1.3.0",
+        "es6-map": "0.1.5",
+        "es6-set": "0.1.5",
+        "eslint-import-resolver-node": "0.2.3",
+        "has": "1.0.1",
+        "lodash.cond": "4.5.2",
+        "lodash.endswith": "4.2.1",
+        "lodash.find": "4.6.0",
+        "lodash.findindex": "4.6.0",
+        "minimatch": "3.0.4",
+        "object-assign": "4.1.1",
+        "pkg-dir": "1.0.0",
+        "pkg-up": "1.0.0"
+      },
+      "dependencies": {
+        "doctrine": {
+          "version": "1.3.0",
+          "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-1.3.0.tgz",
+          "integrity": "sha1-E+dWgrVVGEJCdvfBc3g0Vu+RPSY=",
+          "dev": true,
+          "requires": {
+            "esutils": "2.0.2",
+            "isarray": "1.0.0"
+          }
+        }
+      }
+    },
+    "eslint-plugin-jsx-a11y": {
+      "version": "2.2.3",
+      "resolved": "https://registry.npmjs.org/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-2.2.3.tgz",
+      "integrity": "sha1-TjXLcbin23AqxBXIBuuOjZ6mxl0=",
+      "dev": true,
+      "requires": {
+        "damerau-levenshtein": "1.0.4",
+        "jsx-ast-utils": "1.4.1",
+        "object-assign": "4.1.1"
+      }
+    },
+    "eslint-plugin-mocha": {
+      "version": "4.11.0",
+      "resolved": "https://registry.npmjs.org/eslint-plugin-mocha/-/eslint-plugin-mocha-4.11.0.tgz",
+      "integrity": "sha1-kRk6L1XiCl41l0BUoAidMBmO5Xg=",
+      "dev": true,
+      "requires": {
+        "ramda": "0.24.1"
+      }
+    },
+    "eslint-plugin-react": {
+      "version": "6.10.3",
+      "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-6.10.3.tgz",
+      "integrity": "sha1-xUNb6wZ3ThLH2y9qut3L+QDNP3g=",
+      "dev": true,
+      "requires": {
+        "array.prototype.find": "2.0.4",
+        "doctrine": "1.5.0",
+        "has": "1.0.1",
+        "jsx-ast-utils": "1.4.1",
+        "object.assign": "4.0.4"
+      }
+    },
+    "espree": {
+      "version": "3.4.3",
+      "resolved": "https://registry.npmjs.org/espree/-/espree-3.4.3.tgz",
+      "integrity": "sha1-KRC1zNSc6JPC//+qtP2LOjG4I3Q=",
+      "dev": true,
+      "requires": {
+        "acorn": "5.1.1",
+        "acorn-jsx": "3.0.1"
+      }
+    },
+    "esprima": {
+      "version": "2.7.3",
+      "resolved": "https://registry.npmjs.org/esprima/-/esprima-2.7.3.tgz",
+      "integrity": "sha1-luO3DVd59q1JzQMmc9HDEnZ7pYE=",
+      "dev": true
+    },
+    "espurify": {
+      "version": "1.7.0",
+      "resolved": "https://registry.npmjs.org/espurify/-/espurify-1.7.0.tgz",
+      "integrity": "sha1-HFz2y8zDLm9jk4C9T5kfq5up0iY=",
+      "dev": true,
+      "requires": {
+        "core-js": "2.4.1"
+      },
+      "dependencies": {
+        "core-js": {
+          "version": "2.4.1",
+          "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.4.1.tgz",
+          "integrity": "sha1-TekR5mew6ukSTjQlS1OupvxhjT4=",
+          "dev": true
+        }
+      }
+    },
+    "esrecurse": {
+      "version": "4.2.0",
+      "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.2.0.tgz",
+      "integrity": "sha1-+pVo2Y04I/mkHZHpAtyrnqblsWM=",
+      "dev": true,
+      "requires": {
+        "estraverse": "4.2.0",
+        "object-assign": "4.1.1"
+      }
+    },
+    "estraverse": {
+      "version": "4.2.0",
+      "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.2.0.tgz",
+      "integrity": "sha1-De4/7TH81GlhjOc0IJn8GvoL2xM=",
+      "dev": true
+    },
+    "esutils": {
+      "version": "2.0.2",
+      "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz",
+      "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=",
+      "dev": true
+    },
+    "etag": {
+      "version": "1.8.0",
+      "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.0.tgz",
+      "integrity": "sha1-b2Ma7zNtbEY2K1F2QETOIWvjwFE=",
+      "dev": true
+    },
+    "event-emitter": {
+      "version": "0.3.5",
+      "resolved": "https://registry.npmjs.org/event-emitter/-/event-emitter-0.3.5.tgz",
+      "integrity": "sha1-34xp7vFkeSPHFXuc6DhAYQsCzDk=",
+      "dev": true,
+      "requires": {
+        "d": "1.0.0",
+        "es5-ext": "0.10.23"
+      }
+    },
+    "event-stream": {
+      "version": "3.3.4",
+      "resolved": "https://registry.npmjs.org/event-stream/-/event-stream-3.3.4.tgz",
+      "integrity": "sha1-SrTJoPWlTbkzi0w02Gv86PSzVXE=",
+      "dev": true,
+      "requires": {
+        "duplexer": "0.1.1",
+        "from": "0.1.7",
+        "map-stream": "0.1.0",
+        "pause-stream": "0.0.11",
+        "split": "0.3.3",
+        "stream-combiner": "0.0.4",
+        "through": "2.3.8"
+      }
+    },
+    "eventemitter3": {
+      "version": "1.2.0",
+      "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-1.2.0.tgz",
+      "integrity": "sha1-HIaZHYFq0eUEdQ5zh0Ik7PO+xQg=",
+      "dev": true
+    },
+    "events": {
+      "version": "1.1.1",
+      "resolved": "https://registry.npmjs.org/events/-/events-1.1.1.tgz",
+      "integrity": "sha1-nr23Y1rQmccNzEwqH1AEKI6L2SQ=",
+      "dev": true
+    },
+    "eventsource": {
+      "version": "0.1.6",
+      "resolved": "https://registry.npmjs.org/eventsource/-/eventsource-0.1.6.tgz",
+      "integrity": "sha1-Cs7ehJ7X3RzMMsgRuxG5RNTykjI=",
+      "dev": true,
+      "requires": {
+        "original": "1.0.0"
+      }
+    },
+    "evp_bytestokey": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.0.tgz",
+      "integrity": "sha1-SXtmrZ/vZc18CKYYCCS6FHa2blM=",
+      "dev": true,
+      "requires": {
+        "create-hash": "1.1.3"
+      }
+    },
+    "exit-hook": {
+      "version": "1.1.1",
+      "resolved": "https://registry.npmjs.org/exit-hook/-/exit-hook-1.1.1.tgz",
+      "integrity": "sha1-8FyiM7SMBdVP/wd2XfhQfpXAL/g=",
+      "dev": true
+    },
+    "expand-braces": {
+      "version": "0.1.2",
+      "resolved": "https://registry.npmjs.org/expand-braces/-/expand-braces-0.1.2.tgz",
+      "integrity": "sha1-SIsdHSRRyz06axks/AMPRMWFX+o=",
+      "dev": true,
+      "requires": {
+        "array-slice": "0.2.3",
+        "array-unique": "0.2.1",
+        "braces": "0.1.5"
+      },
+      "dependencies": {
+        "braces": {
+          "version": "0.1.5",
+          "resolved": "https://registry.npmjs.org/braces/-/braces-0.1.5.tgz",
+          "integrity": "sha1-wIVxEIUpHYt1/ddOqw+FlygHEeY=",
+          "dev": true,
+          "requires": {
+            "expand-range": "0.1.1"
+          }
+        },
+        "expand-range": {
+          "version": "0.1.1",
+          "resolved": "https://registry.npmjs.org/expand-range/-/expand-range-0.1.1.tgz",
+          "integrity": "sha1-TLjtoJk8pW+k9B/ELzy7TMrf8EQ=",
+          "dev": true,
+          "requires": {
+            "is-number": "0.1.1",
+            "repeat-string": "0.2.2"
+          }
+        },
+        "is-number": {
+          "version": "0.1.1",
+          "resolved": "https://registry.npmjs.org/is-number/-/is-number-0.1.1.tgz",
+          "integrity": "sha1-aaevEWlj1HIG7JvZtIoUIW8eOAY=",
+          "dev": true
+        },
+        "repeat-string": {
+          "version": "0.2.2",
+          "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-0.2.2.tgz",
+          "integrity": "sha1-x6jTI2BoNiBZp+RlH8aITosftK4=",
+          "dev": true
+        }
+      }
+    },
+    "expand-brackets": {
+      "version": "0.1.5",
+      "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-0.1.5.tgz",
+      "integrity": "sha1-3wcoTjQqgHzXM6xa9yQR5YHRF3s=",
+      "dev": true,
+      "requires": {
+        "is-posix-bracket": "0.1.1"
+      }
+    },
+    "expand-range": {
+      "version": "1.8.2",
+      "resolved": "https://registry.npmjs.org/expand-range/-/expand-range-1.8.2.tgz",
+      "integrity": "sha1-opnv/TNf4nIeuujiV+x5ZE/IUzc=",
+      "dev": true,
+      "requires": {
+        "fill-range": "2.2.3"
+      }
+    },
+    "expand-tilde": {
+      "version": "1.2.2",
+      "resolved": "https://registry.npmjs.org/expand-tilde/-/expand-tilde-1.2.2.tgz",
+      "integrity": "sha1-C4HrqJflo9MdHD0QL48BRB5VlEk=",
+      "dev": true,
+      "requires": {
+        "os-homedir": "1.0.2"
+      }
+    },
+    "express": {
+      "version": "4.15.3",
+      "resolved": "https://registry.npmjs.org/express/-/express-4.15.3.tgz",
+      "integrity": "sha1-urZdDwOqgMNYQIly/HAPkWlEtmI=",
+      "dev": true,
+      "requires": {
+        "accepts": "1.3.3",
+        "array-flatten": "1.1.1",
+        "content-disposition": "0.5.2",
+        "content-type": "1.0.2",
+        "cookie": "0.3.1",
+        "cookie-signature": "1.0.6",
+        "debug": "2.6.7",
+        "depd": "1.1.0",
+        "encodeurl": "1.0.1",
+        "escape-html": "1.0.3",
+        "etag": "1.8.0",
+        "finalhandler": "1.0.3",
+        "fresh": "0.5.0",
+        "merge-descriptors": "1.0.1",
+        "methods": "1.1.2",
+        "on-finished": "2.3.0",
+        "parseurl": "1.3.1",
+        "path-to-regexp": "0.1.7",
+        "proxy-addr": "1.1.4",
+        "qs": "6.4.0",
+        "range-parser": "1.2.0",
+        "send": "0.15.3",
+        "serve-static": "1.12.3",
+        "setprototypeof": "1.0.3",
+        "statuses": "1.3.1",
+        "type-is": "1.6.15",
+        "utils-merge": "1.0.0",
+        "vary": "1.1.1"
+      },
+      "dependencies": {
+        "accepts": {
+          "version": "1.3.3",
+          "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.3.tgz",
+          "integrity": "sha1-w8p0NJOGSMPg2cHjKN1otiLChMo=",
+          "dev": true,
+          "requires": {
+            "mime-types": "2.1.15",
+            "negotiator": "0.6.1"
+          }
+        },
+        "debug": {
+          "version": "2.6.7",
+          "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.7.tgz",
+          "integrity": "sha1-krrR9tBbu2u6Isyoi80OyJTChh4=",
+          "dev": true,
+          "requires": {
+            "ms": "2.0.0"
+          }
+        },
+        "negotiator": {
+          "version": "0.6.1",
+          "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.1.tgz",
+          "integrity": "sha1-KzJxhOiZIQEXeyhWP7XnECrNDKk=",
+          "dev": true
+        },
+        "qs": {
+          "version": "6.4.0",
+          "resolved": "https://registry.npmjs.org/qs/-/qs-6.4.0.tgz",
+          "integrity": "sha1-E+JtKK1rD/qpExLNO/cI7TUecjM=",
+          "dev": true
+        }
+      }
+    },
+    "extend": {
+      "version": "3.0.1",
+      "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.1.tgz",
+      "integrity": "sha1-p1Xqe8Gt/MWjHOfnYtuq3F5jZEQ=",
+      "dev": true
+    },
+    "extglob": {
+      "version": "0.3.2",
+      "resolved": "https://registry.npmjs.org/extglob/-/extglob-0.3.2.tgz",
+      "integrity": "sha1-Lhj/PS9JqydlzskCPwEdqo2DSaE=",
+      "dev": true,
+      "requires": {
+        "is-extglob": "1.0.0"
+      }
+    },
+    "extract-text-webpack-plugin": {
+      "version": "2.0.0-beta.3",
+      "resolved": "https://registry.npmjs.org/extract-text-webpack-plugin/-/extract-text-webpack-plugin-2.0.0-beta.3.tgz",
+      "integrity": "sha1-0abZfEuaMkrIwK7aGKK2pP8U4V0=",
+      "dev": true,
+      "requires": {
+        "async": "1.5.2",
+        "loader-utils": "0.2.17",
+        "webpack-sources": "0.1.5"
+      }
+    },
+    "eyes": {
+      "version": "0.1.8",
+      "resolved": "https://registry.npmjs.org/eyes/-/eyes-0.1.8.tgz",
+      "integrity": "sha1-Ys8SAjTGg3hdkCNIqADvPgzCC8A=",
+      "dev": true
+    },
+    "fast-levenshtein": {
+      "version": "2.0.6",
+      "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz",
+      "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=",
+      "dev": true
+    },
+    "fastparse": {
+      "version": "1.1.1",
+      "resolved": "https://registry.npmjs.org/fastparse/-/fastparse-1.1.1.tgz",
+      "integrity": "sha1-0eJkOzipTXWDtHkGDmxK/8lAcfg=",
+      "dev": true
+    },
+    "faye-websocket": {
+      "version": "0.10.0",
+      "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.10.0.tgz",
+      "integrity": "sha1-TkkvjQTftviQA1B/btvy1QHnxvQ=",
+      "dev": true,
+      "requires": {
+        "websocket-driver": "0.6.5"
+      }
+    },
+    "fbjs": {
+      "version": "0.8.12",
+      "resolved": "https://registry.npmjs.org/fbjs/-/fbjs-0.8.12.tgz",
+      "integrity": "sha1-ELXZL3bUVXX9Y6IX1OoCvqL47QQ=",
+      "requires": {
+        "core-js": "1.2.7",
+        "isomorphic-fetch": "2.2.1",
+        "loose-envify": "1.3.1",
+        "object-assign": "4.1.1",
+        "promise": "7.3.1",
+        "setimmediate": "1.0.5",
+        "ua-parser-js": "0.7.13"
+      }
+    },
+    "figures": {
+      "version": "1.7.0",
+      "resolved": "https://registry.npmjs.org/figures/-/figures-1.7.0.tgz",
+      "integrity": "sha1-y+Hjr/zxzUS4DK3+0o3Hk6lwHS4=",
+      "dev": true,
+      "requires": {
+        "escape-string-regexp": "1.0.5",
+        "object-assign": "4.1.1"
+      }
+    },
+    "file-entry-cache": {
+      "version": "1.3.1",
+      "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-1.3.1.tgz",
+      "integrity": "sha1-RMYepgeuS+nBQC9B9EJwy/4zT/g=",
+      "dev": true,
+      "requires": {
+        "flat-cache": "1.2.2",
+        "object-assign": "4.1.1"
+      }
+    },
+    "filename-regex": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npmjs.org/filename-regex/-/filename-regex-2.0.1.tgz",
+      "integrity": "sha1-wcS5vuPglyXdsQa3XB4wH+LxiyY=",
+      "dev": true
+    },
+    "fill-range": {
+      "version": "2.2.3",
+      "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-2.2.3.tgz",
+      "integrity": "sha1-ULd9/X5Gm8dJJHCWNpn+eoSFpyM=",
+      "dev": true,
+      "requires": {
+        "is-number": "2.1.0",
+        "isobject": "2.1.0",
+        "randomatic": "1.1.7",
+        "repeat-element": "1.1.2",
+        "repeat-string": "1.6.1"
+      }
+    },
+    "finalhandler": {
+      "version": "1.0.3",
+      "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.0.3.tgz",
+      "integrity": "sha1-70fneVDpmXgOhgIqVg4yF+DQzIk=",
+      "dev": true,
+      "requires": {
+        "debug": "2.6.7",
+        "encodeurl": "1.0.1",
+        "escape-html": "1.0.3",
+        "on-finished": "2.3.0",
+        "parseurl": "1.3.1",
+        "statuses": "1.3.1",
+        "unpipe": "1.0.0"
+      },
+      "dependencies": {
+        "debug": {
+          "version": "2.6.7",
+          "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.7.tgz",
+          "integrity": "sha1-krrR9tBbu2u6Isyoi80OyJTChh4=",
+          "dev": true,
+          "requires": {
+            "ms": "2.0.0"
+          }
+        }
+      }
+    },
+    "find-babel-config": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/find-babel-config/-/find-babel-config-1.1.0.tgz",
+      "integrity": "sha1-rMAQQ6Z0n+w0Qpvmtk9ULrtdY1U=",
+      "dev": true,
+      "requires": {
+        "json5": "0.5.1",
+        "path-exists": "3.0.0"
+      },
+      "dependencies": {
+        "json5": {
+          "version": "0.5.1",
+          "resolved": "https://registry.npmjs.org/json5/-/json5-0.5.1.tgz",
+          "integrity": "sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE=",
+          "dev": true
+        },
+        "path-exists": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz",
+          "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=",
+          "dev": true
+        }
+      }
+    },
+    "find-node-modules": {
+      "version": "1.0.4",
+      "resolved": "https://registry.npmjs.org/find-node-modules/-/find-node-modules-1.0.4.tgz",
+      "integrity": "sha1-tt6zzMtpnIcDdne87eLF9YYrJVA=",
+      "dev": true,
+      "requires": {
+        "findup-sync": "0.4.2",
+        "merge": "1.2.0"
+      }
+    },
+    "find-root": {
+      "version": "0.1.2",
+      "resolved": "https://registry.npmjs.org/find-root/-/find-root-0.1.2.tgz",
+      "integrity": "sha1-mNImfP8ZFsyvJ0OzoO6oHXnX3NE=",
+      "dev": true
+    },
+    "find-up": {
+      "version": "1.1.2",
+      "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz",
+      "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=",
+      "dev": true,
+      "requires": {
+        "path-exists": "2.1.0",
+        "pinkie-promise": "2.0.1"
+      },
+      "dependencies": {
+        "path-exists": {
+          "version": "2.1.0",
+          "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz",
+          "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=",
+          "dev": true,
+          "requires": {
+            "pinkie-promise": "2.0.1"
+          }
+        }
+      }
+    },
+    "findup-sync": {
+      "version": "0.4.2",
+      "resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-0.4.2.tgz",
+      "integrity": "sha1-qBF9D3MST1pFRoOVef5S1xKfteU=",
+      "dev": true,
+      "requires": {
+        "detect-file": "0.1.0",
+        "is-glob": "2.0.1",
+        "micromatch": "2.3.11",
+        "resolve-dir": "0.1.1"
+      }
+    },
+    "flat-cache": {
+      "version": "1.2.2",
+      "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-1.2.2.tgz",
+      "integrity": "sha1-+oZxTnLCHbiGAXYezy9VXRq8a5Y=",
+      "dev": true,
+      "requires": {
+        "circular-json": "0.3.1",
+        "del": "2.2.2",
+        "graceful-fs": "4.1.11",
+        "write": "0.2.1"
+      }
+    },
+    "flatten": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/flatten/-/flatten-1.0.2.tgz",
+      "integrity": "sha1-2uRqnXj74lKSJYzB54CkHZXAN4I=",
+      "dev": true
+    },
+    "for-in": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz",
+      "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=",
+      "dev": true
+    },
+    "for-own": {
+      "version": "0.1.5",
+      "resolved": "https://registry.npmjs.org/for-own/-/for-own-0.1.5.tgz",
+      "integrity": "sha1-UmXGgaTylNq78XyVCbZ2OqhFEM4=",
+      "dev": true,
+      "requires": {
+        "for-in": "1.0.2"
+      }
+    },
+    "foreach": {
+      "version": "2.0.5",
+      "resolved": "https://registry.npmjs.org/foreach/-/foreach-2.0.5.tgz",
+      "integrity": "sha1-C+4AUBiusmDQo6865ljdATbsG5k=",
+      "dev": true
+    },
+    "forever-agent": {
+      "version": "0.5.2",
+      "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.5.2.tgz",
+      "integrity": "sha1-bQ4JxJIflKJ/Y9O0nF/v8epMUTA=",
+      "dev": true
+    },
+    "form-data": {
+      "version": "0.1.4",
+      "resolved": "https://registry.npmjs.org/form-data/-/form-data-0.1.4.tgz",
+      "integrity": "sha1-kavXiKupcCsaq/qLwBAxoqyeOxI=",
+      "dev": true,
+      "optional": true,
+      "requires": {
+        "async": "0.9.2",
+        "combined-stream": "0.0.7",
+        "mime": "1.2.11"
+      },
+      "dependencies": {
+        "async": {
+          "version": "0.9.2",
+          "resolved": "https://registry.npmjs.org/async/-/async-0.9.2.tgz",
+          "integrity": "sha1-rqdNXmHB+JlhO/ZL2mbUx48v0X0=",
+          "dev": true,
+          "optional": true
+        },
+        "mime": {
+          "version": "1.2.11",
+          "resolved": "https://registry.npmjs.org/mime/-/mime-1.2.11.tgz",
+          "integrity": "sha1-WCA+7Ybjpe8XrtK32evUfwpg3RA=",
+          "dev": true,
+          "optional": true
+        }
+      }
+    },
+    "forwarded": {
+      "version": "0.1.0",
+      "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.1.0.tgz",
+      "integrity": "sha1-Ge+YdMSuHCl7zweP3mOgm2aoQ2M=",
+      "dev": true
+    },
+    "fresh": {
+      "version": "0.5.0",
+      "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.0.tgz",
+      "integrity": "sha1-9HTKXmqSRtb9jglTz6m5yAWvp44=",
+      "dev": true
+    },
+    "from": {
+      "version": "0.1.7",
+      "resolved": "https://registry.npmjs.org/from/-/from-0.1.7.tgz",
+      "integrity": "sha1-g8YK/Fi5xWmXAH7Rp2izqzA6RP4=",
+      "dev": true
+    },
+    "fs-access": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/fs-access/-/fs-access-1.0.1.tgz",
+      "integrity": "sha1-1qh/JiJxzv6+wwxVNAf7mV2od3o=",
+      "dev": true,
+      "requires": {
+        "null-check": "1.0.0"
+      }
+    },
+    "fs-exists-sync": {
+      "version": "0.1.0",
+      "resolved": "https://registry.npmjs.org/fs-exists-sync/-/fs-exists-sync-0.1.0.tgz",
+      "integrity": "sha1-mC1ok6+RjnLQjeyehnP/K1qNat0=",
+      "dev": true
+    },
+    "fs.realpath": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
+      "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=",
+      "dev": true
+    },
+    "fsevents": {
+      "version": "1.1.2",
+      "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.1.2.tgz",
+      "integrity": "sha512-Sn44E5wQW4bTHXvQmvSHwqbuiXtduD6Rrjm2ZtUEGbyrig+nUH3t/QD4M4/ZXViY556TBpRgZkHLDx3JxPwxiw==",
+      "dev": true,
+      "optional": true,
+      "requires": {
+        "nan": "2.6.2",
+        "node-pre-gyp": "0.6.36"
+      },
+      "dependencies": {
+        "abbrev": {
+          "version": "1.1.0",
+          "bundled": true,
+          "dev": true,
+          "optional": true
+        },
+        "ajv": {
+          "version": "4.11.8",
+          "bundled": true,
+          "dev": true,
+          "optional": true,
+          "requires": {
+            "co": "4.6.0",
+            "json-stable-stringify": "1.0.1"
+          }
+        },
+        "ansi-regex": {
+          "version": "2.1.1",
+          "bundled": true,
+          "dev": true
+        },
+        "aproba": {
+          "version": "1.1.1",
+          "bundled": true,
+          "dev": true,
+          "optional": true
+        },
+        "are-we-there-yet": {
+          "version": "1.1.4",
+          "bundled": true,
+          "dev": true,
+          "optional": true,
+          "requires": {
+            "delegates": "1.0.0",
+            "readable-stream": "2.2.9"
+          }
+        },
+        "asn1": {
+          "version": "0.2.3",
+          "bundled": true,
+          "dev": true,
+          "optional": true
+        },
+        "assert-plus": {
+          "version": "0.2.0",
+          "bundled": true,
+          "dev": true,
+          "optional": true
+        },
+        "asynckit": {
+          "version": "0.4.0",
+          "bundled": true,
+          "dev": true,
+          "optional": true
+        },
+        "aws-sign2": {
+          "version": "0.6.0",
+          "bundled": true,
+          "dev": true,
+          "optional": true
+        },
+        "aws4": {
+          "version": "1.6.0",
+          "bundled": true,
+          "dev": true,
+          "optional": true
+        },
+        "balanced-match": {
+          "version": "0.4.2",
+          "bundled": true,
+          "dev": true
+        },
+        "bcrypt-pbkdf": {
+          "version": "1.0.1",
+          "bundled": true,
+          "dev": true,
+          "optional": true,
+          "requires": {
+            "tweetnacl": "0.14.5"
+          }
+        },
+        "block-stream": {
+          "version": "0.0.9",
+          "bundled": true,
+          "dev": true,
+          "requires": {
+            "inherits": "2.0.3"
+          }
+        },
+        "boom": {
+          "version": "2.10.1",
+          "bundled": true,
+          "dev": true,
+          "requires": {
+            "hoek": "2.16.3"
+          }
+        },
+        "brace-expansion": {
+          "version": "1.1.7",
+          "bundled": true,
+          "dev": true,
+          "requires": {
+            "balanced-match": "0.4.2",
+            "concat-map": "0.0.1"
+          }
+        },
+        "buffer-shims": {
+          "version": "1.0.0",
+          "bundled": true,
+          "dev": true
+        },
+        "caseless": {
+          "version": "0.12.0",
+          "bundled": true,
+          "dev": true,
+          "optional": true
+        },
+        "co": {
+          "version": "4.6.0",
+          "bundled": true,
+          "dev": true,
+          "optional": true
+        },
+        "code-point-at": {
+          "version": "1.1.0",
+          "bundled": true,
+          "dev": true
+        },
+        "combined-stream": {
+          "version": "1.0.5",
+          "bundled": true,
+          "dev": true,
+          "requires": {
+            "delayed-stream": "1.0.0"
+          }
+        },
+        "concat-map": {
+          "version": "0.0.1",
+          "bundled": true,
+          "dev": true
+        },
+        "console-control-strings": {
+          "version": "1.1.0",
+          "bundled": true,
+          "dev": true
+        },
+        "core-util-is": {
+          "version": "1.0.2",
+          "bundled": true,
+          "dev": true
+        },
+        "cryptiles": {
+          "version": "2.0.5",
+          "bundled": true,
+          "dev": true,
+          "optional": true,
+          "requires": {
+            "boom": "2.10.1"
+          }
+        },
+        "dashdash": {
+          "version": "1.14.1",
+          "bundled": true,
+          "dev": true,
+          "optional": true,
+          "requires": {
+            "assert-plus": "1.0.0"
+          },
+          "dependencies": {
+            "assert-plus": {
+              "version": "1.0.0",
+              "bundled": true,
+              "dev": true,
+              "optional": true
+            }
+          }
+        },
+        "debug": {
+          "version": "2.6.8",
+          "bundled": true,
+          "dev": true,
+          "optional": true,
+          "requires": {
+            "ms": "2.0.0"
+          }
+        },
+        "deep-extend": {
+          "version": "0.4.2",
+          "bundled": true,
+          "dev": true,
+          "optional": true
+        },
+        "delayed-stream": {
+          "version": "1.0.0",
+          "bundled": true,
+          "dev": true
+        },
+        "delegates": {
+          "version": "1.0.0",
+          "bundled": true,
+          "dev": true,
+          "optional": true
+        },
+        "ecc-jsbn": {
+          "version": "0.1.1",
+          "bundled": true,
+          "dev": true,
+          "optional": true,
+          "requires": {
+            "jsbn": "0.1.1"
+          }
+        },
+        "extend": {
+          "version": "3.0.1",
+          "bundled": true,
+          "dev": true,
+          "optional": true
+        },
+        "extsprintf": {
+          "version": "1.0.2",
+          "bundled": true,
+          "dev": true
+        },
+        "forever-agent": {
+          "version": "0.6.1",
+          "bundled": true,
+          "dev": true,
+          "optional": true
+        },
+        "form-data": {
+          "version": "2.1.4",
+          "bundled": true,
+          "dev": true,
+          "optional": true,
+          "requires": {
+            "asynckit": "0.4.0",
+            "combined-stream": "1.0.5",
+            "mime-types": "2.1.15"
+          }
+        },
+        "fs.realpath": {
+          "version": "1.0.0",
+          "bundled": true,
+          "dev": true
+        },
+        "fstream": {
+          "version": "1.0.11",
+          "bundled": true,
+          "dev": true,
+          "requires": {
+            "graceful-fs": "4.1.11",
+            "inherits": "2.0.3",
+            "mkdirp": "0.5.1",
+            "rimraf": "2.6.1"
+          }
+        },
+        "fstream-ignore": {
+          "version": "1.0.5",
+          "bundled": true,
+          "dev": true,
+          "optional": true,
+          "requires": {
+            "fstream": "1.0.11",
+            "inherits": "2.0.3",
+            "minimatch": "3.0.4"
+          }
+        },
+        "gauge": {
+          "version": "2.7.4",
+          "bundled": true,
+          "dev": true,
+          "optional": true,
+          "requires": {
+            "aproba": "1.1.1",
+            "console-control-strings": "1.1.0",
+            "has-unicode": "2.0.1",
+            "object-assign": "4.1.1",
+            "signal-exit": "3.0.2",
+            "string-width": "1.0.2",
+            "strip-ansi": "3.0.1",
+            "wide-align": "1.1.2"
+          }
+        },
+        "getpass": {
+          "version": "0.1.7",
+          "bundled": true,
+          "dev": true,
+          "optional": true,
+          "requires": {
+            "assert-plus": "1.0.0"
+          },
+          "dependencies": {
+            "assert-plus": {
+              "version": "1.0.0",
+              "bundled": true,
+              "dev": true,
+              "optional": true
+            }
+          }
+        },
+        "glob": {
+          "version": "7.1.2",
+          "bundled": true,
+          "dev": true,
+          "requires": {
+            "fs.realpath": "1.0.0",
+            "inflight": "1.0.6",
+            "inherits": "2.0.3",
+            "minimatch": "3.0.4",
+            "once": "1.4.0",
+            "path-is-absolute": "1.0.1"
+          }
+        },
+        "graceful-fs": {
+          "version": "4.1.11",
+          "bundled": true,
+          "dev": true
+        },
+        "har-schema": {
+          "version": "1.0.5",
+          "bundled": true,
+          "dev": true,
+          "optional": true
+        },
+        "har-validator": {
+          "version": "4.2.1",
+          "bundled": true,
+          "dev": true,
+          "optional": true,
+          "requires": {
+            "ajv": "4.11.8",
+            "har-schema": "1.0.5"
+          }
+        },
+        "has-unicode": {
+          "version": "2.0.1",
+          "bundled": true,
+          "dev": true,
+          "optional": true
+        },
+        "hawk": {
+          "version": "3.1.3",
+          "bundled": true,
+          "dev": true,
+          "optional": true,
+          "requires": {
+            "boom": "2.10.1",
+            "cryptiles": "2.0.5",
+            "hoek": "2.16.3",
+            "sntp": "1.0.9"
+          }
+        },
+        "hoek": {
+          "version": "2.16.3",
+          "bundled": true,
+          "dev": true
+        },
+        "http-signature": {
+          "version": "1.1.1",
+          "bundled": true,
+          "dev": true,
+          "optional": true,
+          "requires": {
+            "assert-plus": "0.2.0",
+            "jsprim": "1.4.0",
+            "sshpk": "1.13.0"
+          }
+        },
+        "inflight": {
+          "version": "1.0.6",
+          "bundled": true,
+          "dev": true,
+          "requires": {
+            "once": "1.4.0",
+            "wrappy": "1.0.2"
+          }
+        },
+        "inherits": {
+          "version": "2.0.3",
+          "bundled": true,
+          "dev": true
+        },
+        "ini": {
+          "version": "1.3.4",
+          "bundled": true,
+          "dev": true,
+          "optional": true
+        },
+        "is-fullwidth-code-point": {
+          "version": "1.0.0",
+          "bundled": true,
+          "dev": true,
+          "requires": {
+            "number-is-nan": "1.0.1"
+          }
+        },
+        "is-typedarray": {
+          "version": "1.0.0",
+          "bundled": true,
+          "dev": true,
+          "optional": true
+        },
+        "isarray": {
+          "version": "1.0.0",
+          "bundled": true,
+          "dev": true
+        },
+        "isstream": {
+          "version": "0.1.2",
+          "bundled": true,
+          "dev": true,
+          "optional": true
+        },
+        "jodid25519": {
+          "version": "1.0.2",
+          "bundled": true,
+          "dev": true,
+          "optional": true,
+          "requires": {
+            "jsbn": "0.1.1"
+          }
+        },
+        "jsbn": {
+          "version": "0.1.1",
+          "bundled": true,
+          "dev": true,
+          "optional": true
+        },
+        "json-schema": {
+          "version": "0.2.3",
+          "bundled": true,
+          "dev": true,
+          "optional": true
+        },
+        "json-stable-stringify": {
+          "version": "1.0.1",
+          "bundled": true,
+          "dev": true,
+          "optional": true,
+          "requires": {
+            "jsonify": "0.0.0"
+          }
+        },
+        "json-stringify-safe": {
+          "version": "5.0.1",
+          "bundled": true,
+          "dev": true,
+          "optional": true
+        },
+        "jsonify": {
+          "version": "0.0.0",
+          "bundled": true,
+          "dev": true,
+          "optional": true
+        },
+        "jsprim": {
+          "version": "1.4.0",
+          "bundled": true,
+          "dev": true,
+          "optional": true,
+          "requires": {
+            "assert-plus": "1.0.0",
+            "extsprintf": "1.0.2",
+            "json-schema": "0.2.3",
+            "verror": "1.3.6"
+          },
+          "dependencies": {
+            "assert-plus": {
+              "version": "1.0.0",
+              "bundled": true,
+              "dev": true,
+              "optional": true
+            }
+          }
+        },
+        "mime-db": {
+          "version": "1.27.0",
+          "bundled": true,
+          "dev": true
+        },
+        "mime-types": {
+          "version": "2.1.15",
+          "bundled": true,
+          "dev": true,
+          "requires": {
+            "mime-db": "1.27.0"
+          }
+        },
+        "minimatch": {
+          "version": "3.0.4",
+          "bundled": true,
+          "dev": true,
+          "requires": {
+            "brace-expansion": "1.1.7"
+          }
+        },
+        "minimist": {
+          "version": "0.0.8",
+          "bundled": true,
+          "dev": true
+        },
+        "mkdirp": {
+          "version": "0.5.1",
+          "bundled": true,
+          "dev": true,
+          "requires": {
+            "minimist": "0.0.8"
+          }
+        },
+        "ms": {
+          "version": "2.0.0",
+          "bundled": true,
+          "dev": true,
+          "optional": true
+        },
+        "node-pre-gyp": {
+          "version": "0.6.36",
+          "bundled": true,
+          "dev": true,
+          "optional": true,
+          "requires": {
+            "mkdirp": "0.5.1",
+            "nopt": "4.0.1",
+            "npmlog": "4.1.0",
+            "rc": "1.2.1",
+            "request": "2.81.0",
+            "rimraf": "2.6.1",
+            "semver": "5.3.0",
+            "tar": "2.2.1",
+            "tar-pack": "3.4.0"
+          }
+        },
+        "nopt": {
+          "version": "4.0.1",
+          "bundled": true,
+          "dev": true,
+          "optional": true,
+          "requires": {
+            "abbrev": "1.1.0",
+            "osenv": "0.1.4"
+          }
+        },
+        "npmlog": {
+          "version": "4.1.0",
+          "bundled": true,
+          "dev": true,
+          "optional": true,
+          "requires": {
+            "are-we-there-yet": "1.1.4",
+            "console-control-strings": "1.1.0",
+            "gauge": "2.7.4",
+            "set-blocking": "2.0.0"
+          }
+        },
+        "number-is-nan": {
+          "version": "1.0.1",
+          "bundled": true,
+          "dev": true
+        },
+        "oauth-sign": {
+          "version": "0.8.2",
+          "bundled": true,
+          "dev": true,
+          "optional": true
+        },
+        "object-assign": {
+          "version": "4.1.1",
+          "bundled": true,
+          "dev": true,
+          "optional": true
+        },
+        "once": {
+          "version": "1.4.0",
+          "bundled": true,
+          "dev": true,
+          "requires": {
+            "wrappy": "1.0.2"
+          }
+        },
+        "os-homedir": {
+          "version": "1.0.2",
+          "bundled": true,
+          "dev": true,
+          "optional": true
+        },
+        "os-tmpdir": {
+          "version": "1.0.2",
+          "bundled": true,
+          "dev": true,
+          "optional": true
+        },
+        "osenv": {
+          "version": "0.1.4",
+          "bundled": true,
+          "dev": true,
+          "optional": true,
+          "requires": {
+            "os-homedir": "1.0.2",
+            "os-tmpdir": "1.0.2"
+          }
+        },
+        "path-is-absolute": {
+          "version": "1.0.1",
+          "bundled": true,
+          "dev": true
+        },
+        "performance-now": {
+          "version": "0.2.0",
+          "bundled": true,
+          "dev": true,
+          "optional": true
+        },
+        "process-nextick-args": {
+          "version": "1.0.7",
+          "bundled": true,
+          "dev": true
+        },
+        "punycode": {
+          "version": "1.4.1",
+          "bundled": true,
+          "dev": true,
+          "optional": true
+        },
+        "qs": {
+          "version": "6.4.0",
+          "bundled": true,
+          "dev": true,
+          "optional": true
+        },
+        "rc": {
+          "version": "1.2.1",
+          "bundled": true,
+          "dev": true,
+          "optional": true,
+          "requires": {
+            "deep-extend": "0.4.2",
+            "ini": "1.3.4",
+            "minimist": "1.2.0",
+            "strip-json-comments": "2.0.1"
+          },
+          "dependencies": {
+            "minimist": {
+              "version": "1.2.0",
+              "bundled": true,
+              "dev": true,
+              "optional": true
+            }
+          }
+        },
+        "readable-stream": {
+          "version": "2.2.9",
+          "bundled": true,
+          "dev": true,
+          "requires": {
+            "buffer-shims": "1.0.0",
+            "core-util-is": "1.0.2",
+            "inherits": "2.0.3",
+            "isarray": "1.0.0",
+            "process-nextick-args": "1.0.7",
+            "string_decoder": "1.0.1",
+            "util-deprecate": "1.0.2"
+          }
+        },
+        "request": {
+          "version": "2.81.0",
+          "bundled": true,
+          "dev": true,
+          "optional": true,
+          "requires": {
+            "aws-sign2": "0.6.0",
+            "aws4": "1.6.0",
+            "caseless": "0.12.0",
+            "combined-stream": "1.0.5",
+            "extend": "3.0.1",
+            "forever-agent": "0.6.1",
+            "form-data": "2.1.4",
+            "har-validator": "4.2.1",
+            "hawk": "3.1.3",
+            "http-signature": "1.1.1",
+            "is-typedarray": "1.0.0",
+            "isstream": "0.1.2",
+            "json-stringify-safe": "5.0.1",
+            "mime-types": "2.1.15",
+            "oauth-sign": "0.8.2",
+            "performance-now": "0.2.0",
+            "qs": "6.4.0",
+            "safe-buffer": "5.0.1",
+            "stringstream": "0.0.5",
+            "tough-cookie": "2.3.2",
+            "tunnel-agent": "0.6.0",
+            "uuid": "3.0.1"
+          }
+        },
+        "rimraf": {
+          "version": "2.6.1",
+          "bundled": true,
+          "dev": true,
+          "requires": {
+            "glob": "7.1.2"
+          }
+        },
+        "safe-buffer": {
+          "version": "5.0.1",
+          "bundled": true,
+          "dev": true
+        },
+        "semver": {
+          "version": "5.3.0",
+          "bundled": true,
+          "dev": true,
+          "optional": true
+        },
+        "set-blocking": {
+          "version": "2.0.0",
+          "bundled": true,
+          "dev": true,
+          "optional": true
+        },
+        "signal-exit": {
+          "version": "3.0.2",
+          "bundled": true,
+          "dev": true,
+          "optional": true
+        },
+        "sntp": {
+          "version": "1.0.9",
+          "bundled": true,
+          "dev": true,
+          "optional": true,
+          "requires": {
+            "hoek": "2.16.3"
+          }
+        },
+        "sshpk": {
+          "version": "1.13.0",
+          "bundled": true,
+          "dev": true,
+          "optional": true,
+          "requires": {
+            "asn1": "0.2.3",
+            "assert-plus": "1.0.0",
+            "bcrypt-pbkdf": "1.0.1",
+            "dashdash": "1.14.1",
+            "ecc-jsbn": "0.1.1",
+            "getpass": "0.1.7",
+            "jodid25519": "1.0.2",
+            "jsbn": "0.1.1",
+            "tweetnacl": "0.14.5"
+          },
+          "dependencies": {
+            "assert-plus": {
+              "version": "1.0.0",
+              "bundled": true,
+              "dev": true,
+              "optional": true
+            }
+          }
+        },
+        "string_decoder": {
+          "version": "1.0.1",
+          "bundled": true,
+          "dev": true,
+          "requires": {
+            "safe-buffer": "5.0.1"
+          }
+        },
+        "string-width": {
+          "version": "1.0.2",
+          "bundled": true,
+          "dev": true,
+          "requires": {
+            "code-point-at": "1.1.0",
+            "is-fullwidth-code-point": "1.0.0",
+            "strip-ansi": "3.0.1"
+          }
+        },
+        "stringstream": {
+          "version": "0.0.5",
+          "bundled": true,
+          "dev": true,
+          "optional": true
+        },
+        "strip-ansi": {
+          "version": "3.0.1",
+          "bundled": true,
+          "dev": true,
+          "requires": {
+            "ansi-regex": "2.1.1"
+          }
+        },
+        "strip-json-comments": {
+          "version": "2.0.1",
+          "bundled": true,
+          "dev": true,
+          "optional": true
+        },
+        "tar": {
+          "version": "2.2.1",
+          "bundled": true,
+          "dev": true,
+          "requires": {
+            "block-stream": "0.0.9",
+            "fstream": "1.0.11",
+            "inherits": "2.0.3"
+          }
+        },
+        "tar-pack": {
+          "version": "3.4.0",
+          "bundled": true,
+          "dev": true,
+          "optional": true,
+          "requires": {
+            "debug": "2.6.8",
+            "fstream": "1.0.11",
+            "fstream-ignore": "1.0.5",
+            "once": "1.4.0",
+            "readable-stream": "2.2.9",
+            "rimraf": "2.6.1",
+            "tar": "2.2.1",
+            "uid-number": "0.0.6"
+          }
+        },
+        "tough-cookie": {
+          "version": "2.3.2",
+          "bundled": true,
+          "dev": true,
+          "optional": true,
+          "requires": {
+            "punycode": "1.4.1"
+          }
+        },
+        "tunnel-agent": {
+          "version": "0.6.0",
+          "bundled": true,
+          "dev": true,
+          "optional": true,
+          "requires": {
+            "safe-buffer": "5.0.1"
+          }
+        },
+        "tweetnacl": {
+          "version": "0.14.5",
+          "bundled": true,
+          "dev": true,
+          "optional": true
+        },
+        "uid-number": {
+          "version": "0.0.6",
+          "bundled": true,
+          "dev": true,
+          "optional": true
+        },
+        "util-deprecate": {
+          "version": "1.0.2",
+          "bundled": true,
+          "dev": true
+        },
+        "uuid": {
+          "version": "3.0.1",
+          "bundled": true,
+          "dev": true,
+          "optional": true
+        },
+        "verror": {
+          "version": "1.3.6",
+          "bundled": true,
+          "dev": true,
+          "optional": true,
+          "requires": {
+            "extsprintf": "1.0.2"
+          }
+        },
+        "wide-align": {
+          "version": "1.1.2",
+          "bundled": true,
+          "dev": true,
+          "optional": true,
+          "requires": {
+            "string-width": "1.0.2"
+          }
+        },
+        "wrappy": {
+          "version": "1.0.2",
+          "bundled": true,
+          "dev": true
+        }
+      }
+    },
+    "fstream": {
+      "version": "1.0.11",
+      "resolved": "https://registry.npmjs.org/fstream/-/fstream-1.0.11.tgz",
+      "integrity": "sha1-XB+x8RdHcRTwYyoOtLcbPLD9MXE=",
+      "dev": true,
+      "requires": {
+        "graceful-fs": "4.1.11",
+        "inherits": "2.0.3",
+        "mkdirp": "0.5.1",
+        "rimraf": "2.5.4"
+      }
+    },
+    "fstream-ignore": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/fstream-ignore/-/fstream-ignore-1.0.2.tgz",
+      "integrity": "sha1-GMiR2wG3gqdKe/+Tag8kmXdBx6s=",
+      "dev": true,
+      "requires": {
+        "fstream": "1.0.11",
+        "inherits": "2.0.3",
+        "minimatch": "2.0.10"
+      },
+      "dependencies": {
+        "minimatch": {
+          "version": "2.0.10",
+          "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-2.0.10.tgz",
+          "integrity": "sha1-jQh8OcazjAAbl/ynzm0OHoCvusc=",
+          "dev": true,
+          "requires": {
+            "brace-expansion": "1.1.8"
+          }
+        }
+      }
+    },
+    "function-bind": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.0.tgz",
+      "integrity": "sha1-FhdnFMgBeY5Ojyz391KUZ7tKV3E=",
+      "dev": true
+    },
+    "gauge": {
+      "version": "1.2.7",
+      "resolved": "https://registry.npmjs.org/gauge/-/gauge-1.2.7.tgz",
+      "integrity": "sha1-6c7FSD09TuDvRLYKfZnkk14TbZM=",
+      "dev": true,
+      "requires": {
+        "ansi": "0.3.1",
+        "has-unicode": "2.0.1",
+        "lodash.pad": "4.5.1",
+        "lodash.padend": "4.6.1",
+        "lodash.padstart": "4.6.1"
+      }
+    },
+    "generate-function": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/generate-function/-/generate-function-2.0.0.tgz",
+      "integrity": "sha1-aFj+fAlpt9TpCTM3ZHrHn2DfvnQ=",
+      "dev": true
+    },
+    "generate-object-property": {
+      "version": "1.2.0",
+      "resolved": "https://registry.npmjs.org/generate-object-property/-/generate-object-property-1.2.0.tgz",
+      "integrity": "sha1-nA4cQDCM6AT0eDYYuTf6iPmdUNA=",
+      "dev": true,
+      "requires": {
+        "is-property": "1.0.2"
+      }
+    },
+    "get-caller-file": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.2.tgz",
+      "integrity": "sha1-9wLmMSfn4jHBYKgMFVSstw1QR+U=",
+      "dev": true
+    },
+    "get-stdin": {
+      "version": "4.0.1",
+      "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-4.0.1.tgz",
+      "integrity": "sha1-uWjGsKBDhDJJAui/Gl3zJXmkUP4=",
+      "dev": true
+    },
+    "glob": {
+      "version": "6.0.4",
+      "resolved": "https://registry.npmjs.org/glob/-/glob-6.0.4.tgz",
+      "integrity": "sha1-DwiGD2oVUSey+t1PnOJLGqtuTSI=",
+      "dev": true,
+      "requires": {
+        "inflight": "1.0.6",
+        "inherits": "2.0.3",
+        "minimatch": "3.0.4",
+        "once": "1.4.0",
+        "path-is-absolute": "1.0.1"
+      }
+    },
+    "glob-base": {
+      "version": "0.3.0",
+      "resolved": "https://registry.npmjs.org/glob-base/-/glob-base-0.3.0.tgz",
+      "integrity": "sha1-27Fk9iIbHAscz4Kuoyi0l98Oo8Q=",
+      "dev": true,
+      "requires": {
+        "glob-parent": "2.0.0",
+        "is-glob": "2.0.1"
+      }
+    },
+    "glob-parent": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-2.0.0.tgz",
+      "integrity": "sha1-gTg9ctsFT8zPUzbaqQLxgvbtuyg=",
+      "dev": true,
+      "requires": {
+        "is-glob": "2.0.1"
+      }
+    },
+    "global-modules": {
+      "version": "0.2.3",
+      "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-0.2.3.tgz",
+      "integrity": "sha1-6lo77ULG1s6ZWk+KEmm12uIjgo0=",
+      "dev": true,
+      "requires": {
+        "global-prefix": "0.1.5",
+        "is-windows": "0.2.0"
+      }
+    },
+    "global-prefix": {
+      "version": "0.1.5",
+      "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-0.1.5.tgz",
+      "integrity": "sha1-jTvGuNo8qBEqFg2NSW/wRiv+948=",
+      "dev": true,
+      "requires": {
+        "homedir-polyfill": "1.0.1",
+        "ini": "1.3.4",
+        "is-windows": "0.2.0",
+        "which": "1.2.14"
+      }
+    },
+    "globals": {
+      "version": "9.18.0",
+      "resolved": "https://registry.npmjs.org/globals/-/globals-9.18.0.tgz",
+      "integrity": "sha512-S0nG3CLEQiY/ILxqtztTWH/3iRRdyBLw6KMDxnKMchrtbj2OFmehVh0WUCfW3DUrIgx/qFrJPICrq4Z4sTR9UQ==",
+      "dev": true
+    },
+    "globby": {
+      "version": "4.1.0",
+      "resolved": "https://registry.npmjs.org/globby/-/globby-4.1.0.tgz",
+      "integrity": "sha1-CA9UVJ7BuCpsYOYx/ILhIR2+lfg=",
+      "dev": true,
+      "requires": {
+        "array-union": "1.0.2",
+        "arrify": "1.0.1",
+        "glob": "6.0.4",
+        "object-assign": "4.1.1",
+        "pify": "2.3.0",
+        "pinkie-promise": "2.0.1"
+      }
+    },
+    "graceful-fs": {
+      "version": "4.1.11",
+      "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz",
+      "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=",
+      "dev": true
+    },
+    "graceful-readlink": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/graceful-readlink/-/graceful-readlink-1.0.1.tgz",
+      "integrity": "sha1-TK+tdrxi8C+gObL5Tpo906ORpyU=",
+      "dev": true
+    },
+    "growl": {
+      "version": "1.9.2",
+      "resolved": "https://registry.npmjs.org/growl/-/growl-1.9.2.tgz",
+      "integrity": "sha1-Dqd0NxXbjY3ixe3hd14bRayFwC8=",
+      "dev": true
+    },
+    "handlebars": {
+      "version": "4.0.10",
+      "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.0.10.tgz",
+      "integrity": "sha1-PTDHGLCaPZbyPqTMH0A8TTup/08=",
+      "dev": true,
+      "requires": {
+        "async": "1.5.2",
+        "optimist": "0.6.1",
+        "source-map": "0.4.4",
+        "uglify-js": "2.6.4"
+      },
+      "dependencies": {
+        "source-map": {
+          "version": "0.4.4",
+          "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.4.4.tgz",
+          "integrity": "sha1-66T12pwNyZneaAMti092FzZSA2s=",
+          "dev": true,
+          "requires": {
+            "amdefine": "1.0.1"
+          }
+        }
+      }
+    },
+    "has": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/has/-/has-1.0.1.tgz",
+      "integrity": "sha1-hGFzP1OLCDfJNh45qauelwTcLyg=",
+      "dev": true,
+      "requires": {
+        "function-bind": "1.1.0"
+      }
+    },
+    "has-ansi": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz",
+      "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=",
+      "dev": true,
+      "requires": {
+        "ansi-regex": "2.1.1"
+      }
+    },
+    "has-binary": {
+      "version": "0.1.7",
+      "resolved": "https://registry.npmjs.org/has-binary/-/has-binary-0.1.7.tgz",
+      "integrity": "sha1-aOYesWIQyVRaClzOBqhzkS/h5ow=",
+      "dev": true,
+      "requires": {
+        "isarray": "0.0.1"
+      },
+      "dependencies": {
+        "isarray": {
+          "version": "0.0.1",
+          "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz",
+          "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=",
+          "dev": true
+        }
+      }
+    },
+    "has-cors": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/has-cors/-/has-cors-1.1.0.tgz",
+      "integrity": "sha1-XkdHk/fqmEPRu5nCPu9J/xJv/zk=",
+      "dev": true
+    },
+    "has-flag": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz",
+      "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=",
+      "dev": true
+    },
+    "has-unicode": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz",
+      "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=",
+      "dev": true
+    },
+    "hash-base": {
+      "version": "2.0.2",
+      "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-2.0.2.tgz",
+      "integrity": "sha1-ZuodhW206KVHDK32/OI65SRO8uE=",
+      "dev": true,
+      "requires": {
+        "inherits": "2.0.3"
+      }
+    },
+    "hash.js": {
+      "version": "1.1.3",
+      "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.3.tgz",
+      "integrity": "sha512-/UETyP0W22QILqS+6HowevwhEFJ3MBJnwTf75Qob9Wz9t0DPuisL8kW8YZMK62dHAKE1c1p+gY1TtOLY+USEHA==",
+      "dev": true,
+      "requires": {
+        "inherits": "2.0.3",
+        "minimalistic-assert": "1.0.0"
+      }
+    },
+    "hawk": {
+      "version": "1.1.1",
+      "resolved": "https://registry.npmjs.org/hawk/-/hawk-1.1.1.tgz",
+      "integrity": "sha1-h81JH5tG5OKurKM1QWdmiF0tHtk=",
+      "dev": true,
+      "optional": true,
+      "requires": {
+        "boom": "0.4.2",
+        "cryptiles": "0.2.2",
+        "hoek": "0.9.1",
+        "sntp": "0.2.4"
+      }
+    },
+    "he": {
+      "version": "1.1.1",
+      "resolved": "https://registry.npmjs.org/he/-/he-1.1.1.tgz",
+      "integrity": "sha1-k0EP0hsAlzUVH4howvJx80J+I/0=",
+      "dev": true
+    },
+    "header-case": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/header-case/-/header-case-1.0.1.tgz",
+      "integrity": "sha1-lTWXMZfBRLCWE81l0xfvGZY70C0=",
+      "dev": true,
+      "requires": {
+        "no-case": "2.3.1",
+        "upper-case": "1.1.3"
+      }
+    },
+    "hmac-drbg": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz",
+      "integrity": "sha1-0nRXAQJabHdabFRXk+1QL8DGSaE=",
+      "dev": true,
+      "requires": {
+        "hash.js": "1.1.3",
+        "minimalistic-assert": "1.0.0",
+        "minimalistic-crypto-utils": "1.0.1"
+      }
+    },
+    "hoek": {
+      "version": "0.9.1",
+      "resolved": "https://registry.npmjs.org/hoek/-/hoek-0.9.1.tgz",
+      "integrity": "sha1-PTIkYrrfB3Fup+uFuviAec3c5QU=",
+      "dev": true
+    },
+    "home-or-tmp": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/home-or-tmp/-/home-or-tmp-2.0.0.tgz",
+      "integrity": "sha1-42w/LSyufXRqhX440Y1fMqeILbg=",
+      "dev": true,
+      "requires": {
+        "os-homedir": "1.0.2",
+        "os-tmpdir": "1.0.2"
+      }
+    },
+    "homedir-polyfill": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/homedir-polyfill/-/homedir-polyfill-1.0.1.tgz",
+      "integrity": "sha1-TCu8inWJmP7r9e1oWA921GdotLw=",
+      "dev": true,
+      "requires": {
+        "parse-passwd": "1.0.0"
+      }
+    },
+    "hosted-git-info": {
+      "version": "2.5.0",
+      "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.5.0.tgz",
+      "integrity": "sha512-pNgbURSuab90KbTqvRPsseaTxOJCZBD0a7t+haSN33piP9cCM4l0CqdzAif2hUqm716UovKB2ROmiabGAKVXyg==",
+      "dev": true
+    },
+    "html-comment-regex": {
+      "version": "1.1.1",
+      "resolved": "https://registry.npmjs.org/html-comment-regex/-/html-comment-regex-1.1.1.tgz",
+      "integrity": "sha1-ZouTd26q5V696POtRkswekljYl4=",
+      "dev": true
+    },
+    "html-minifier": {
+      "version": "2.1.7",
+      "resolved": "https://registry.npmjs.org/html-minifier/-/html-minifier-2.1.7.tgz",
+      "integrity": "sha1-kFHW/LvPIU7TB+GtdPQyu5rWVcw=",
+      "dev": true,
+      "requires": {
+        "change-case": "3.0.1",
+        "clean-css": "3.4.27",
+        "commander": "2.9.0",
+        "he": "1.1.1",
+        "ncname": "1.0.0",
+        "relateurl": "0.2.7",
+        "uglify-js": "2.6.4"
+      }
+    },
+    "html-webpack-plugin": {
+      "version": "2.22.0",
+      "resolved": "https://registry.npmjs.org/html-webpack-plugin/-/html-webpack-plugin-2.22.0.tgz",
+      "integrity": "sha1-frAv+QOdqE5bpxAE1Gk8BLktKQU=",
+      "dev": true,
+      "requires": {
+        "bluebird": "3.5.0",
+        "html-minifier": "2.1.7",
+        "loader-utils": "0.2.17",
+        "lodash": "4.14.1",
+        "pretty-error": "2.1.1",
+        "toposort": "1.0.3"
+      }
+    },
+    "htmlparser2": {
+      "version": "3.3.0",
+      "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-3.3.0.tgz",
+      "integrity": "sha1-zHDQWln2VC5D8OaFyYLhTJJKnv4=",
+      "dev": true,
+      "requires": {
+        "domelementtype": "1.3.0",
+        "domhandler": "2.1.0",
+        "domutils": "1.1.6",
+        "readable-stream": "1.0.34"
+      },
+      "dependencies": {
+        "domutils": {
+          "version": "1.1.6",
+          "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.1.6.tgz",
+          "integrity": "sha1-vdw94Jm5ou+sxRxiPyj0FuzFdIU=",
+          "dev": true,
+          "requires": {
+            "domelementtype": "1.3.0"
+          }
+        },
+        "isarray": {
+          "version": "0.0.1",
+          "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz",
+          "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=",
+          "dev": true
+        },
+        "readable-stream": {
+          "version": "1.0.34",
+          "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz",
+          "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=",
+          "dev": true,
+          "requires": {
+            "core-util-is": "1.0.2",
+            "inherits": "2.0.3",
+            "isarray": "0.0.1",
+            "string_decoder": "0.10.31"
+          }
+        },
+        "string_decoder": {
+          "version": "0.10.31",
+          "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz",
+          "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=",
+          "dev": true
+        }
+      }
+    },
+    "http-errors": {
+      "version": "1.6.1",
+      "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.1.tgz",
+      "integrity": "sha1-X4uO2YrKVFZWv1cplzh/kEpyIlc=",
+      "dev": true,
+      "requires": {
+        "depd": "1.1.0",
+        "inherits": "2.0.3",
+        "setprototypeof": "1.0.3",
+        "statuses": "1.3.1"
+      }
+    },
+    "http-proxy": {
+      "version": "1.16.2",
+      "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.16.2.tgz",
+      "integrity": "sha1-Bt/ykpUr9k2+hHH6nfcwZtTzd0I=",
+      "dev": true,
+      "requires": {
+        "eventemitter3": "1.2.0",
+        "requires-port": "1.0.0"
+      }
+    },
+    "http-proxy-middleware": {
+      "version": "0.15.2",
+      "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-0.15.2.tgz",
+      "integrity": "sha1-4cabiUj7BOKEbuIvOLZQ5PCcAn8=",
+      "dev": true,
+      "requires": {
+        "http-proxy": "1.16.2",
+        "is-glob": "2.0.1",
+        "lodash": "4.14.1",
+        "micromatch": "2.3.11"
+      }
+    },
+    "http-server": {
+      "version": "0.9.0",
+      "resolved": "https://registry.npmjs.org/http-server/-/http-server-0.9.0.tgz",
+      "integrity": "sha1-jxsGvcczYY1NxCgxx7oa/04GABo=",
+      "dev": true,
+      "requires": {
+        "colors": "1.0.3",
+        "corser": "2.0.1",
+        "ecstatic": "1.4.1",
+        "http-proxy": "1.16.2",
+        "opener": "1.4.3",
+        "optimist": "0.6.1",
+        "portfinder": "0.4.0",
+        "union": "0.4.6"
+      },
+      "dependencies": {
+        "colors": {
+          "version": "1.0.3",
+          "resolved": "https://registry.npmjs.org/colors/-/colors-1.0.3.tgz",
+          "integrity": "sha1-BDP0TYCWgP3rYO0mDxsMJi6CpAs=",
+          "dev": true
+        }
+      }
+    },
+    "http-signature": {
+      "version": "0.10.1",
+      "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-0.10.1.tgz",
+      "integrity": "sha1-T72sEyVZqoMjEh5UB3nAoBKyfmY=",
+      "dev": true,
+      "optional": true,
+      "requires": {
+        "asn1": "0.1.11",
+        "assert-plus": "0.1.5",
+        "ctype": "0.5.3"
+      }
+    },
+    "https-browserify": {
+      "version": "0.0.1",
+      "resolved": "https://registry.npmjs.org/https-browserify/-/https-browserify-0.0.1.tgz",
+      "integrity": "sha1-P5E2XKvmC3ftDruiS0VOPgnZWoI=",
+      "dev": true
+    },
+    "i": {
+      "version": "0.3.5",
+      "resolved": "https://registry.npmjs.org/i/-/i-0.3.5.tgz",
+      "integrity": "sha1-HSuFQVjsgWkRPGy39raAHpniEdU=",
+      "dev": true
+    },
+    "iconv-lite": {
+      "version": "0.4.18",
+      "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.18.tgz",
+      "integrity": "sha512-sr1ZQph3UwHTR0XftSbK85OvBbxe/abLGzEnPENCQwmHf7sck8Oyu4ob3LgBxWWxRoM+QszeUyl7jbqapu2TqA=="
+    },
+    "icss-replace-symbols": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/icss-replace-symbols/-/icss-replace-symbols-1.1.0.tgz",
+      "integrity": "sha1-Bupvg2ead0njhs/h/oEq5dsiPe0=",
+      "dev": true
+    },
+    "ieee754": {
+      "version": "1.1.8",
+      "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.8.tgz",
+      "integrity": "sha1-vjPUCsEO8ZJnAfbwii2G+/0a0+Q=",
+      "dev": true
+    },
+    "ignore": {
+      "version": "3.3.3",
+      "resolved": "https://registry.npmjs.org/ignore/-/ignore-3.3.3.tgz",
+      "integrity": "sha1-QyNS5XrM2HqzEQ6C0/6g5HgSFW0=",
+      "dev": true
+    },
+    "imurmurhash": {
+      "version": "0