From 24641e264e5bdf8d64fe36fa1ddb04034a31409d Mon Sep 17 00:00:00 2001 From: "Rico Sta. Cruz" Date: Fri, 20 Oct 2017 07:38:50 +0800 Subject: [PATCH] Delay Disqus loading --- _includes/2017/comments-area.html | 2 +- _js/behaviors/disqus.js | 14 +++++++++++++- assets/packed/app.js | 2 +- assets/packed/app.js.map | 2 +- 4 files changed, 16 insertions(+), 4 deletions(-) diff --git a/_includes/2017/comments-area.html b/_includes/2017/comments-area.html index 9e0910121..28dd4b09a 100644 --- a/_includes/2017/comments-area.html +++ b/_includes/2017/comments-area.html @@ -13,10 +13,10 @@
-
+ {% endif %} diff --git a/_js/behaviors/disqus.js b/_js/behaviors/disqus.js index 36de6d244..35bbb30bf 100644 --- a/_js/behaviors/disqus.js +++ b/_js/behaviors/disqus.js @@ -2,12 +2,21 @@ import onmount from 'onmount' import injectDisqus from '../helpers/inject_disqus' import ready from 'dom101/ready' +/** + * Delay disqus by some time. It's at the bottom of the page, there's no need + * for it to load fast. This will give more time to load more critical assets. + */ + +const DISQUS_DELAY = 10 * 1000 + /** * Injects Disqus onto the page. */ onmount('[data-js-disqus]', function () { const data = JSON.parse(this.getAttribute('data-js-disqus')) + const $parent = this.parentNode + $parent.setAttribute('hidden', true) window.disqus_config = function () { this.page.url = data.url @@ -16,6 +25,9 @@ onmount('[data-js-disqus]', function () { // Disqus takes a while to load, don't do it so eagerly. ready(() => { - injectDisqus(data.host) + setTimeout(() => { + injectDisqus(data.host) + $parent.removeAttribute('hidden') + }, DISQUS_DELAY) }) }) diff --git a/assets/packed/app.js b/assets/packed/app.js index ccec57e00..8ac115070 100644 --- a/assets/packed/app.js +++ b/assets/packed/app.js @@ -1,4 +1,4 @@ -webpackJsonp([0],{"/k7tj9kxRFhFtZjlt346":function(t,e,i){"use strict";function n(t,e){if(window.localStorage){var i=JSON.parse(window.localStorage[t]||"{}");i=e(i),window.localStorage[t]=JSON.stringify(i)}}function o(t){if(window.localStorage)return JSON.parse(window.localStorage[t]||"{}")}Object.defineProperty(e,"__esModule",{value:!0}),e.update=n,e.fetch=o},"2QOxTCxkuzN0PP2kJ2jn":function(t,e,i){"use strict";function n(t){s.update("dismissed",function(e){return e[t]=!0,e})}function o(t){var e=s.fetch("dismissed");return e&&e[t]}Object.defineProperty(e,"__esModule",{value:!0}),e.setDismissed=n,e.isDismissed=o;var r=i("/k7tj9kxRFhFtZjlt346"),s=function(t){if(t&&t.__esModule)return t;var e={};if(null!=t)for(var i in t)Object.prototype.hasOwnProperty.call(t,i)&&(e[i]=t[i]);return e.default=t,e}(r)},"2tov+8o2NrZdw/Lg8JZA":function(t,e,i){function n(t){return i(o(t))}function o(t){var e=r[t];if(!(e+1))throw new Error("Cannot find module '"+t+"'.");return e}var r={"./onmount.js":"6hLKOGpXaWUwTDQA5TL2"};n.keys=function(){return Object.keys(r)},n.resolve=o,t.exports=n,n.id="2tov+8o2NrZdw/Lg8JZA"},"6hLKOGpXaWUwTDQA5TL2":function(t,e,i){"use strict";function n(t){return t&&t.__esModule?t:{default:t}}var o=i("tqbVxj9+xGAhlFrQpyTS"),r=n(o),s=i("yfX/NEeqeNrvWENPWWKS"),a=n(s);(0,r.default)(function(){setTimeout(function(){(0,a.default)()})})},"BF4TFfJ+K+wsuHfLZ/S3":function(t,e,i){"use strict";function n(){return-1!==window.location.search.indexOf("preview=1")}Object.defineProperty(e,"__esModule",{value:!0}),e.isPreview=n},BuWMdGeXUEK0GmkN01pU:function(t,e,i){"use strict";function n(t){return t&&t.__esModule?t:{default:t}}var o=i("yfX/NEeqeNrvWENPWWKS"),r=n(o),s=i("cYqQDyTPtD7lV79ovj4Y"),a=n(s),u=i("tqbVxj9+xGAhlFrQpyTS"),h=n(u);(0,r.default)("[data-js-disqus]",function(){var t=JSON.parse(this.getAttribute("data-js-disqus"));window.disqus_config=function(){this.page.url=t.url,this.page.identifier=t.identifier},(0,h.default)(function(){(0,a.default)(t.host)})})},C2mk7N9JzKWlcOYJrkfi:function(t,e){function i(t,e){var i=t.matches||t.matchesSelector||t.msMatchesSelector||t.mozMatchesSelector||t.webkitMatchesSelector||t.oMatchesSelector;if(i)return i.call(t,e);if(t.parentNode){for(var n=t.parentNode.querySelectorAll(e),o=n.length;o--;0)if(n[o]===t)return!0;return!1}}t.exports=i},"CjZN/azBHJxH2NsOjfdD":function(t,e,i){"use strict";function n(t,e,i){return void 0!==i?o(t,e):r(t,e,i)}function o(t,e){var i=t.getAttribute("data-"+e);return JSON.parse(i||"{}")}function r(t,e,i){t.setAttribute("data-"+e,JSON.stringify(i))}Object.defineProperty(e,"__esModule",{value:!0}),e.data=n,e.getData=o,e.setData=r},"D3SYMdNAenu80VOO7/Dv":function(t,e,i){"use strict";function n(t){return t&&t.__esModule?t:{default:t}}var o=i("yfX/NEeqeNrvWENPWWKS"),r=n(o),s=i("MKJaVdnD9jF7rk6rW6AJ"),a=n(s);(0,r.default)("[data-js-search-form]",function(){(0,a.default)(this,"submit",function(t){t.preventDefault();var e=document.querySelector("a[data-search-index]:visible"),i=e&&e.getAttribute("href");i&&(window.location=i)})})},DfTyEU8lscjHXmCMlptO:function(t,e,i){"use strict";function n(){(0,a.default)("[data-search-index]").forEach(function(t){t.removeAttribute("aria-hidden")})}function o(t){var e=(0,r.splitwords)(t);if(!e.length)return n();var i=e.map(function(t){return"[data-search-index~="+JSON.stringify(t)+"]"}).join("");(0,a.default)("[data-search-index]").forEach(function(t){t.setAttribute("aria-hidden",!0)}),(0,a.default)(i).forEach(function(t){t.removeAttribute("aria-hidden")})}Object.defineProperty(e,"__esModule",{value:!0}),e.showAll=n,e.show=o;var r=i("GOdGag34TlRuHa2OZoh9"),s=i("EvxNxLK9yKFmn1U14Kvw"),a=function(t){return t&&t.__esModule?t:{default:t}}(s)},"E+dCGfS1pT5WowYv7jpv":function(t,e,i){"use strict";function n(t){return t&&t.__esModule?t:{default:t}}var o=i("GbzL7C/QFmiBZDICkla+"),r=n(o),s=i("yfX/NEeqeNrvWENPWWKS"),a=n(s),u=i("MKJaVdnD9jF7rk6rW6AJ"),h=n(u),c=i("EvxNxLK9yKFmn1U14Kvw"),f=n(c);(0,a.default)("[data-js-h3-section-list]",function(){var t=new r.default(this,{itemSelector:".h3-section",transitionDuration:0});(0,f.default)("img",this).forEach(function(e){(0,h.default)(e,"load",function(){t.layout()})}),(0,h.default)(window,"load",function(){t.layout()})})},EvxNxLK9yKFmn1U14Kvw:function(t,e){function i(t,e){return Array.prototype.slice.call((e||document).querySelectorAll(t))}t.exports=i},GOdGag34TlRuHa2OZoh9:function(t,e,i){"use strict";function n(t){var e=[];return t.slug&&(e=e.concat(o(t.slug))),t.category&&(e=e.concat(o(t.category))),e}function o(t){var e=[];return s(t).forEach(function(t){e=e.concat(r(t))}),e}function r(t){for(var e=[],i=t.length,n=1;n<=i;++n)e.push(t.substr(0,n));return e}function s(t){return t.toLowerCase().split(/[ \/\-_]/).filter(function(t){return t&&0!==t.length})}Object.defineProperty(e,"__esModule",{value:!0}),e.default=n,e.permutateString=o,e.permutateWord=r,e.splitwords=s},"GbzL7C/QFmiBZDICkla+":function(t,e,i){var n,o,r,s,a,n,u,h,c,f,n,d,n,l,p,n,m,n,l,v,n,l,g,n,l,y,n,l,_,n,l,b,n,l,E,n,o;/*! +webpackJsonp([0],{"/k7tj9kxRFhFtZjlt346":function(t,e,i){"use strict";function n(t,e){if(window.localStorage){var i=JSON.parse(window.localStorage[t]||"{}");i=e(i),window.localStorage[t]=JSON.stringify(i)}}function o(t){if(window.localStorage)return JSON.parse(window.localStorage[t]||"{}")}Object.defineProperty(e,"__esModule",{value:!0}),e.update=n,e.fetch=o},"2QOxTCxkuzN0PP2kJ2jn":function(t,e,i){"use strict";function n(t){s.update("dismissed",function(e){return e[t]=!0,e})}function o(t){var e=s.fetch("dismissed");return e&&e[t]}Object.defineProperty(e,"__esModule",{value:!0}),e.setDismissed=n,e.isDismissed=o;var r=i("/k7tj9kxRFhFtZjlt346"),s=function(t){if(t&&t.__esModule)return t;var e={};if(null!=t)for(var i in t)Object.prototype.hasOwnProperty.call(t,i)&&(e[i]=t[i]);return e.default=t,e}(r)},"2tov+8o2NrZdw/Lg8JZA":function(t,e,i){function n(t){return i(o(t))}function o(t){var e=r[t];if(!(e+1))throw new Error("Cannot find module '"+t+"'.");return e}var r={"./onmount.js":"6hLKOGpXaWUwTDQA5TL2"};n.keys=function(){return Object.keys(r)},n.resolve=o,t.exports=n,n.id="2tov+8o2NrZdw/Lg8JZA"},"6hLKOGpXaWUwTDQA5TL2":function(t,e,i){"use strict";function n(t){return t&&t.__esModule?t:{default:t}}var o=i("tqbVxj9+xGAhlFrQpyTS"),r=n(o),s=i("yfX/NEeqeNrvWENPWWKS"),a=n(s);(0,r.default)(function(){setTimeout(function(){(0,a.default)()})})},"BF4TFfJ+K+wsuHfLZ/S3":function(t,e,i){"use strict";function n(){return-1!==window.location.search.indexOf("preview=1")}Object.defineProperty(e,"__esModule",{value:!0}),e.isPreview=n},BuWMdGeXUEK0GmkN01pU:function(t,e,i){"use strict";function n(t){return t&&t.__esModule?t:{default:t}}var o=i("yfX/NEeqeNrvWENPWWKS"),r=n(o),s=i("cYqQDyTPtD7lV79ovj4Y"),a=n(s),u=i("tqbVxj9+xGAhlFrQpyTS"),h=n(u);(0,r.default)("[data-js-disqus]",function(){var t=JSON.parse(this.getAttribute("data-js-disqus")),e=this.parentNode;e.setAttribute("hidden",!0),window.disqus_config=function(){this.page.url=t.url,this.page.identifier=t.identifier},(0,h.default)(function(){setTimeout(function(){(0,a.default)(t.host),e.removeAttribute("hidden")},1e4)})})},C2mk7N9JzKWlcOYJrkfi:function(t,e){function i(t,e){var i=t.matches||t.matchesSelector||t.msMatchesSelector||t.mozMatchesSelector||t.webkitMatchesSelector||t.oMatchesSelector;if(i)return i.call(t,e);if(t.parentNode){for(var n=t.parentNode.querySelectorAll(e),o=n.length;o--;0)if(n[o]===t)return!0;return!1}}t.exports=i},"CjZN/azBHJxH2NsOjfdD":function(t,e,i){"use strict";function n(t,e,i){return void 0!==i?o(t,e):r(t,e,i)}function o(t,e){var i=t.getAttribute("data-"+e);return JSON.parse(i||"{}")}function r(t,e,i){t.setAttribute("data-"+e,JSON.stringify(i))}Object.defineProperty(e,"__esModule",{value:!0}),e.data=n,e.getData=o,e.setData=r},"D3SYMdNAenu80VOO7/Dv":function(t,e,i){"use strict";function n(t){return t&&t.__esModule?t:{default:t}}var o=i("yfX/NEeqeNrvWENPWWKS"),r=n(o),s=i("MKJaVdnD9jF7rk6rW6AJ"),a=n(s);(0,r.default)("[data-js-search-form]",function(){(0,a.default)(this,"submit",function(t){t.preventDefault();var e=document.querySelector("a[data-search-index]:visible"),i=e&&e.getAttribute("href");i&&(window.location=i)})})},DfTyEU8lscjHXmCMlptO:function(t,e,i){"use strict";function n(){(0,a.default)("[data-search-index]").forEach(function(t){t.removeAttribute("aria-hidden")})}function o(t){var e=(0,r.splitwords)(t);if(!e.length)return n();var i=e.map(function(t){return"[data-search-index~="+JSON.stringify(t)+"]"}).join("");(0,a.default)("[data-search-index]").forEach(function(t){t.setAttribute("aria-hidden",!0)}),(0,a.default)(i).forEach(function(t){t.removeAttribute("aria-hidden")})}Object.defineProperty(e,"__esModule",{value:!0}),e.showAll=n,e.show=o;var r=i("GOdGag34TlRuHa2OZoh9"),s=i("EvxNxLK9yKFmn1U14Kvw"),a=function(t){return t&&t.__esModule?t:{default:t}}(s)},"E+dCGfS1pT5WowYv7jpv":function(t,e,i){"use strict";function n(t){return t&&t.__esModule?t:{default:t}}var o=i("GbzL7C/QFmiBZDICkla+"),r=n(o),s=i("yfX/NEeqeNrvWENPWWKS"),a=n(s),u=i("MKJaVdnD9jF7rk6rW6AJ"),h=n(u),c=i("EvxNxLK9yKFmn1U14Kvw"),f=n(c);(0,a.default)("[data-js-h3-section-list]",function(){var t=new r.default(this,{itemSelector:".h3-section",transitionDuration:0});(0,f.default)("img",this).forEach(function(e){(0,h.default)(e,"load",function(){t.layout()})}),(0,h.default)(window,"load",function(){t.layout()})})},EvxNxLK9yKFmn1U14Kvw:function(t,e){function i(t,e){return Array.prototype.slice.call((e||document).querySelectorAll(t))}t.exports=i},GOdGag34TlRuHa2OZoh9:function(t,e,i){"use strict";function n(t){var e=[];return t.slug&&(e=e.concat(o(t.slug))),t.category&&(e=e.concat(o(t.category))),e}function o(t){var e=[];return s(t).forEach(function(t){e=e.concat(r(t))}),e}function r(t){for(var e=[],i=t.length,n=1;n<=i;++n)e.push(t.substr(0,n));return e}function s(t){return t.toLowerCase().split(/[ \/\-_]/).filter(function(t){return t&&0!==t.length})}Object.defineProperty(e,"__esModule",{value:!0}),e.default=n,e.permutateString=o,e.permutateWord=r,e.splitwords=s},"GbzL7C/QFmiBZDICkla+":function(t,e,i){var n,o,r,s,a,n,u,h,c,f,n,d,n,l,p,n,m,n,l,v,n,l,g,n,l,y,n,l,_,n,l,b,n,l,E,n,o;/*! * Isotope PACKAGED v3.0.4 * * Licensed GPLv3 for open source use diff --git a/assets/packed/app.js.map b/assets/packed/app.js.map index 2f09e4bd6..caa04847b 100644 --- a/assets/packed/app.js.map +++ b/assets/packed/app.js.map @@ -1 +1 @@ -{"version":3,"sources":["webpack:///app.js","webpack:////Users/rsc/Projects/@devhints/cheatsheets/_js/helpers/store.js","webpack:////Users/rsc/Projects/@devhints/cheatsheets/_js/helpers/dismiss.js","webpack:////Users/rsc/Projects/@devhints/cheatsheets/_js/initializers /\\.js$/","webpack:////Users/rsc/Projects/@devhints/cheatsheets/_js/initializers/onmount.js","webpack:////Users/rsc/Projects/@devhints/cheatsheets/_js/helpers/preview.js","webpack:////Users/rsc/Projects/@devhints/cheatsheets/_js/behaviors/disqus.js","webpack:////Users/rsc/Projects/@devhints/cheatsheets/node_modules/dom101/matches.js","webpack:////Users/rsc/Projects/@devhints/cheatsheets/_js/helpers/data.js","webpack:////Users/rsc/Projects/@devhints/cheatsheets/_js/behaviors/search-form.js","webpack:////Users/rsc/Projects/@devhints/cheatsheets/_js/helpers/search.js","webpack:////Users/rsc/Projects/@devhints/cheatsheets/_js/behaviors/h3-section-list.js","webpack:////Users/rsc/Projects/@devhints/cheatsheets/node_modules/dom101/query-selector-all.js","webpack:////Users/rsc/Projects/@devhints/cheatsheets/_js/helpers/permutate.js","webpack:////Users/rsc/Projects/@devhints/cheatsheets/node_modules/isotope-layout/dist/isotope.pkgd.js","webpack:////Users/rsc/Projects/@devhints/cheatsheets/node_modules/dom101/closest.js","webpack:////Users/rsc/Projects/@devhints/cheatsheets/node_modules/dom101/on.js","webpack:////Users/rsc/Projects/@devhints/cheatsheets/node_modules/dom101/each.js","webpack:////Users/rsc/Projects/@devhints/cheatsheets/_js/behaviors/dismissable.js","webpack:////Users/rsc/Projects/@devhints/cheatsheets/_js/helpers/dom.js","webpack:////Users/rsc/Projects/@devhints/cheatsheets/_js/behaviors/dismiss.js","webpack:////Users/rsc/Projects/@devhints/cheatsheets/node_modules/dom101/remove-class.js","webpack:////Users/rsc/Projects/@devhints/cheatsheets/_js/behaviors /\\.js$/","webpack:////Users/rsc/Projects/@devhints/cheatsheets/_js/helpers/inject_disqus.js","webpack:////Users/rsc/Projects/@devhints/cheatsheets/_js/helpers/qs.js","webpack:////Users/rsc/Projects/@devhints/cheatsheets/_js/behaviors/no-preview.js","webpack:////Users/rsc/Projects/@devhints/cheatsheets/node_modules/dom101/add-class.js","webpack:////Users/rsc/Projects/@devhints/cheatsheets/_js/behaviors/searchable-item.js","webpack:////Users/rsc/Projects/@devhints/cheatsheets/node_modules/dom101/ready.js","webpack:////Users/rsc/Projects/@devhints/cheatsheets/_js/behaviors/searchable-header.js","webpack:////Users/rsc/Projects/@devhints/cheatsheets/node_modules/dom101/remove.js","webpack:////Users/rsc/Projects/@devhints/cheatsheets/node_modules/onmount/index.js","webpack:////Users/rsc/Projects/@devhints/cheatsheets/_js/app.js","webpack:////Users/rsc/Projects/@devhints/cheatsheets/_js/behaviors/search-input.js"],"names":["webpackJsonp","/k7tj9kxRFhFtZjlt346","module","exports","__webpack_require__","update","key","fn","window","localStorage","data","JSON","parse","stringify","fetch","Object","defineProperty","value","2QOxTCxkuzN0PP2kJ2jn","setDismissed","id","Store","isDismissed","_store","obj","__esModule","newObj","prototype","hasOwnProperty","call","default","2tov+8o2NrZdw/Lg8JZA","webpackContext","req","webpackContextResolve","map","Error","./onmount.js","keys","resolve","6hLKOGpXaWUwTDQA5TL2","_interopRequireDefault","_ready","_ready2","_onmount","_onmount2","setTimeout","BF4TFfJ+K+wsuHfLZ/S3","isPreview","location","search","indexOf","BuWMdGeXUEK0GmkN01pU","_inject_disqus","_inject_disqus2","this","getAttribute","disqus_config","page","url","identifier","host","C2mk7N9JzKWlcOYJrkfi","matches","el","selector","_matches","matchesSelector","msMatchesSelector","mozMatchesSelector","webkitMatchesSelector","oMatchesSelector","parentNode","nodes","querySelectorAll","i","length","CjZN/azBHJxH2NsOjfdD","val","getData","setData","str","setAttribute","D3SYMdNAenu80VOO7/Dv","_on","_on2","e","preventDefault","link","document","querySelector","href","DfTyEU8lscjHXmCMlptO","showAll","_querySelectorAll2","forEach","removeAttribute","show","keywords","_permutate","splitwords","selectors","k","join","_querySelectorAll","E+dCGfS1pT5WowYv7jpv","_isotopePkgd","_isotopePkgd2","iso","itemSelector","transitionDuration","image","layout","EvxNxLK9yKFmn1U14Kvw","query","context","Array","slice","GOdGag34TlRuHa2OZoh9","permutate","words","slug","concat","permutateString","category","word","permutateWord","len","push","substr","toLowerCase","split","filter","GbzL7C/QFmiBZDICkla+","__WEBPACK_AMD_DEFINE_ARRAY__","__WEBPACK_AMD_DEFINE_RESULT__","__WEBPACK_LOCAL_MODULE_1__","__WEBPACK_LOCAL_MODULE_1__factory","__WEBPACK_LOCAL_MODULE_1__module","__WEBPACK_LOCAL_MODULE_2__","__WEBPACK_LOCAL_MODULE_3__","__WEBPACK_LOCAL_MODULE_3__factory","__WEBPACK_LOCAL_MODULE_3__module","__WEBPACK_LOCAL_MODULE_4__","__WEBPACK_AMD_DEFINE_FACTORY__","__WEBPACK_LOCAL_MODULE_5__","__WEBPACK_LOCAL_MODULE_6__","__WEBPACK_LOCAL_MODULE_7__","__WEBPACK_LOCAL_MODULE_8__","__WEBPACK_LOCAL_MODULE_9__","__WEBPACK_LOCAL_MODULE_10__","__WEBPACK_LOCAL_MODULE_11__","__WEBPACK_LOCAL_MODULE_12__","factory","undefined","jQuery","apply","jQueryBridget","namespace","PluginClass","$","methodCall","$elems","methodName","args","returnValue","pluginMethodStr","each","elem","instance","logError","method","charAt","plainCall","options","option","_init","opts","isPlainObject","extend","arg0","arraySlice","arguments","updateJQuery","bridget","console","message","error","global","loaded","EvEmitter","proto","on","eventName","listener","events","_events","listeners","once","onceEvents","_onceEvents","off","index","splice","emitEvent","onceListeners","isOnce","getStyleSize","num","parseFloat","isNaN","noop","getZeroSize","size","width","height","innerWidth","innerHeight","outerWidth","outerHeight","measurementsLength","measurements","getStyle","style","getComputedStyle","setup","isSetup","div","createElement","padding","borderStyle","borderWidth","boxSizing","body","documentElement","appendChild","getSize","isBoxSizeOuter","removeChild","nodeType","display","offsetWidth","offsetHeight","isBorderBox","measurement","paddingWidth","paddingLeft","paddingRight","paddingHeight","paddingTop","paddingBottom","marginWidth","marginLeft","marginRight","marginHeight","marginTop","marginBottom","borderLeftWidth","borderRightWidth","borderHeight","borderTopWidth","borderBottomWidth","isBorderBoxSizeOuter","styleWidth","styleHeight","matchesMethod","ElemProto","Element","prefixes","prefix","utils","a","b","prop","modulo","makeArray","ary","isArray","removeFrom","getParent","getQueryElement","handleEvent","event","type","filterFindElements","elems","ffElems","HTMLElement","childElems","debounceMethod","_class","threshold","timeoutName","timeout","clearTimeout","_this","docReady","callback","readyState","addEventListener","toDashed","replace","match","$1","$2","htmlInit","WidgetClass","dashedNamespace","dataAttr","dataAttrElems","jsDashElems","dataOptionsAttr","attr","className","isEmptyObj","Item","element","position","x","y","_create","docElemStyle","transitionProperty","transition","transformProperty","transform","transitionEndEvent","WebkitTransition","vendorProperties","transitionDelay","create","constructor","_transn","ingProperties","clean","onEnd","css","elemStyle","getPosition","isOriginLeft","_getOption","isOriginTop","xValue","yValue","layoutSize","parseInt","layoutPosition","xPadding","xProperty","xResetProperty","getXValue","yPadding","yProperty","yResetProperty","getYValue","isHorizontal","percentPosition","_transitionTo","curX","curY","compareX","compareY","didNotMove","setPosition","isTransitioning","transX","transY","transitionStyle","getTranslate","to","onTransitionEnd","isCleaning","goTo","moveTo","_nonTransition","_removeStyles","_transition","from","enableTransition","transitionProps","duration","staggerDelay","onwebkitTransitionEnd","ontransitionend","onotransitionend","dashedVendorProperties","-webkit-transform","target","propertyName","disableTransition","removeTransitionStyles","removeEventListener","cleanStyle","cleanTransitionStyle","stagger","delay","removeElem","remove","hide","reveal","isHidden","getHideRevealTransitionEndProperty","onRevealTransitionEnd","hiddenStyle","visibleStyle","styleProperty","optionStyle","opacity","onHideTransitionEnd","destroy","left","right","top","bottom","Outlayer","queryElement","$element","defaults","GUID","outlayerGUID","instances","subclass","Parent","SubClass","getMilliseconds","time","unit","msUnits","containerStyle","initLayout","originLeft","originTop","resize","resizeContainer","oldOption","compatOptions","horizontal","layoutInstant","reloadItems","stamps","stamp","bindResize","items","_itemize","children","itemElems","_filterFindItemElements","item","getItemElements","_resetLayout","_manageStamps","isInstant","_isLayoutInited","layoutItems","_getMeasurement","_getItemsForLayout","_layoutItems","_postLayout","isIgnored","_emitCompleteOnItems","queue","_getItemLayoutPosition","isLayoutInstant","_processLayoutQueue","updateStagger","_positionItem","_getContainerSize","_setContainerMeasure","measure","isWidth","elemSize","Math","max","onComplete","dispatchEvent","tick","doneCount","count","emitArgs","$event","Event","trigger","ignore","getItem","unignore","_find","unstamp","_getBoundingRect","_manageStamp","boundingRect","getBoundingClientRect","_boundingRect","_getElementOffset","thisRect","isResizeBound","unbindResize","onresize","needsResizeLayout","addItems","appended","prepended","previousItems","revealItemElements","getItems","hideItemElements","removeItems","removeData","Layout","ms","s","itemGUID","sortData","updateSortData","random","getSortData","sorters","_sorters","sorter","_destroy","LayoutMode","isotope","filteredItems","needsVerticalResizeLayout","getColumnWidth","getSegmentSize","getRowHeight","segment","segmentName","outerSize","firstItemSize","getFirstItemSize","firstItem","modes","Mode","Masonry","fitWidth","measureColumns","colYs","cols","maxY","horizontalColIndex","getContainerWidth","columnWidth","firstItemElem","containerWidth","gutter","excess","mathMethod","isFitWidth","container","remainder","colSpan","min","colPosMethod","horizontalOrder","colPosition","col","setHeight","setMax","_getTopColPosition","colGroup","_getTopColGroup","minimumY","groupCount","_getColGroupY","groupColYs","_getHorizontalColPosition","hasSize","stampSize","offset","firstX","lastX","firstCol","floor","lastCol","stampMaxY","_getContainerFitWidth","unusedCols","previousWidth","MasonryMode","keepModeMethods","FitRows","itemWidth","Vertical","horizontalAlignment","getItemSorter","sortBys","sortAsc","itemA","itemB","sortBy","isAscending","direction","trim","String","Isotope","layoutMode","isJQueryFiltering","sortAscending","_getSorters","sortHistory","name","_initLayoutMode","_updateItemsSortData","initialOpts","arrange","_layout","_getIsInstant","filtered","_filter","_bindArrangeComplete","_isInstant","_noTransition","_hideReveal","_sort","needReveal","needHide","arrangeParallelCallback","isLayoutComplete","isHideComplete","isRevealComplete","hiddenMatched","visibleUnmatched","test","_getFilterTest","isMatched","is","mungeSorter","attrMatch","getValue","getValueGetter","parser","sortDataParsers","child","textContent","_getIsSameSortBy","itemSorter","sort","_mode","mode","_filterRevealAdded","insert","filteredInsertItems","_remove","shuffle","getFilteredItemElements","Gz0TuoFFs6JdDvtR2PYZ","closest","sel","MKJaVdnD9jF7rk6rW6AJ","handler","attachEvent","O7wD3s+p+jjyw5ivWGEg","list","idx","XxGrbZud7DE4W4TdQZtc","_remove2","_removeClass","_removeClass2","_data","_dismiss","_preview","ahJreyGRfWuLMDCl+A3L","_toConsumableArray","arr","arr2","appendMany","nextUntil","nextUntilTick","nextSibling","acc","_matches2","before","reference","newNode","insertBefore","findChildren","createDiv","props","d","azEBDvunS5n/qbuQInIF","_closest","_closest2","Dismiss","parent","dismissable","bq+j3PCtCSGVXgg8xWPw","removeClass","classList","classNames","Boolean","expr","RegExp","cBdQffYQOU2SCSRXjSUx","./dismiss.js","./dismissable.js","./disqus.js","./h3-section-list.js","./main-body.js","./no-preview.js","./search-form.js","./search-input.js","./searchable-header.js","./searchable-item.js","cYqQDyTPtD7lV79ovj4Y","inject","injectEmbed","injectCount","src","Date","head","async","g2okcHDGBNRpe9zqR9sR","g3wkw0XZUos0Eo8rU7p6","j059HZGO2uzpV/UZMXr3","qs","p","reduce","result","part","qsdecode","string","k6EYej2Qda8Mq9A5Oeqn","_addClass","_addClass2","lGfezzQL7fc5RE8kg33g","addClass","add","tcev71HWHlq3Ur/sw7Ir","_permutate2","tqbVxj9+xGAhlFrQpyTS","ready","isReady","veOabZWTWtixkn1TyITD","_dom","els","n","wYegCzKWCG2ZRJZfGEZa","yfX/NEeqeNrvWENPWWKS","root","onmount","init","exit","isjQuery","isEvent","poll","be","Behavior","behaviors","register","bid","selectify","detectMutate","isAttached","parentElement","eachOf","has","handlers","noConflict","log","cid","Zepto","Ender","MutationObserver","WebKitMutationObserver","MozMutationObserver","debug","observe","obs","mutations","mutation","addedNodes","visitEnter","removedNodes","doExit","subtree","childList","observer","unobserve","disconnect","teardown","reset","visitExit","styles","enter","navigator","userAgent","z+w/DGZianwIMo5d4qOD","requireAll","r","Prism","zNHHVy5XxvKjnqTgwxy7","_search","Search","_qs","_qs2","q"],"mappings":"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","file":"app.js","sourcesContent":["webpackJsonp([0],{\n\n/***/ \"/k7tj9kxRFhFtZjlt346\":\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.update = update;\nexports.fetch = fetch;\n/**\n * Updates a local storage key. If it doesn't exist, it defaults to an empty\n * object.\n *\n * @example\n * update('dismissed', (data) => {\n * data.lol = true\n * return data\n * })\n */\n\nfunction update(key, fn) {\n if (!window.localStorage) return;\n var data = JSON.parse(window.localStorage[key] || '{}');\n data = fn(data);\n window.localStorage[key] = JSON.stringify(data);\n}\n\n/**\n * Fetches a local storage key.\n *\n * @example\n * const data = fetch('dismissed')\n */\n\nfunction fetch(key) {\n if (!window.localStorage) return;\n return JSON.parse(window.localStorage[key] || '{}');\n}\n\n/***/ }),\n\n/***/ \"2QOxTCxkuzN0PP2kJ2jn\":\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.setDismissed = setDismissed;\nexports.isDismissed = isDismissed;\n\nvar _store = __webpack_require__(\"/k7tj9kxRFhFtZjlt346\");\n\nvar Store = _interopRequireWildcard(_store);\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }\n\n/**\n * Dismisses an announcement.\n *\n * @example\n * setDismissed('2017-09-02-happy-birthday')\n */\n\nfunction setDismissed(id) {\n Store.update('dismissed', function (data) {\n data[id] = true;\n return data;\n });\n}\n\n/**\n * Checks if an announcement has been dismissed before.\n *\n * @example\n * setDismissed('2017-09-02-happy-birthday')\n * isDismissed('2017-09-02-happy-birthday') => true\n */\n\nfunction isDismissed(id) {\n var data = Store.fetch('dismissed');\n return data && data[id];\n}\n\n/***/ }),\n\n/***/ \"2tov+8o2NrZdw/Lg8JZA\":\n/***/ (function(module, exports, __webpack_require__) {\n\nvar map = {\n\t\"./onmount.js\": \"6hLKOGpXaWUwTDQA5TL2\"\n};\nfunction webpackContext(req) {\n\treturn __webpack_require__(webpackContextResolve(req));\n};\nfunction webpackContextResolve(req) {\n\tvar id = map[req];\n\tif(!(id + 1)) // check for number or string\n\t\tthrow new Error(\"Cannot find module '\" + req + \"'.\");\n\treturn id;\n};\nwebpackContext.keys = function webpackContextKeys() {\n\treturn Object.keys(map);\n};\nwebpackContext.resolve = webpackContextResolve;\nmodule.exports = webpackContext;\nwebpackContext.id = \"2tov+8o2NrZdw/Lg8JZA\";\n\n/***/ }),\n\n/***/ \"6hLKOGpXaWUwTDQA5TL2\":\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nvar _ready = __webpack_require__(\"tqbVxj9+xGAhlFrQpyTS\");\n\nvar _ready2 = _interopRequireDefault(_ready);\n\nvar _onmount = __webpack_require__(\"yfX/NEeqeNrvWENPWWKS\");\n\nvar _onmount2 = _interopRequireDefault(_onmount);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n/**\n * Behavior: Wrapping\n */\n\n(0, _ready2.default)(function () {\n setTimeout(function () {\n (0, _onmount2.default)();\n });\n});\n\n/***/ }),\n\n/***/ \"BF4TFfJ+K+wsuHfLZ/S3\":\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.isPreview = isPreview;\n/**\n * Checks if we're in preview mode (?preview=1).\n */\n\nfunction isPreview() {\n return window.location.search.indexOf('preview=1') !== -1;\n}\n\n/***/ }),\n\n/***/ \"BuWMdGeXUEK0GmkN01pU\":\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nvar _onmount = __webpack_require__(\"yfX/NEeqeNrvWENPWWKS\");\n\nvar _onmount2 = _interopRequireDefault(_onmount);\n\nvar _inject_disqus = __webpack_require__(\"cYqQDyTPtD7lV79ovj4Y\");\n\nvar _inject_disqus2 = _interopRequireDefault(_inject_disqus);\n\nvar _ready = __webpack_require__(\"tqbVxj9+xGAhlFrQpyTS\");\n\nvar _ready2 = _interopRequireDefault(_ready);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n/**\n * Injects Disqus onto the page.\n */\n\n(0, _onmount2.default)('[data-js-disqus]', function () {\n var data = JSON.parse(this.getAttribute('data-js-disqus'));\n\n window.disqus_config = function () {\n this.page.url = data.url;\n this.page.identifier = data.identifier;\n };\n\n // Disqus takes a while to load, don't do it so eagerly.\n (0, _ready2.default)(function () {\n (0, _inject_disqus2.default)(data.host);\n });\n});\n\n/***/ }),\n\n/***/ \"C2mk7N9JzKWlcOYJrkfi\":\n/***/ (function(module, exports) {\n\n/**\n * matches : matches(el, selector)\n * Checks if a given element `el` matches `selector`.\n * Compare with [$.fn.is](http://api.jquery.com/is/).\n *\n * var matches = require('dom101/matches');\n *\n * matches(button, ':focus');\n */\n\nfunction matches (el, selector) {\n var _matches = el.matches ||\n el.matchesSelector ||\n el.msMatchesSelector ||\n el.mozMatchesSelector ||\n el.webkitMatchesSelector ||\n el.oMatchesSelector\n\n if (_matches) {\n return _matches.call(el, selector)\n } else if (el.parentNode) {\n // IE8 and below\n var nodes = el.parentNode.querySelectorAll(selector)\n for (var i = nodes.length; i--; 0) {\n if (nodes[i] === el) return true\n }\n return false\n }\n}\n\nmodule.exports = matches\n\n\n/***/ }),\n\n/***/ \"CjZN/azBHJxH2NsOjfdD\":\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.data = data;\nexports.getData = getData;\nexports.setData = setData;\n/**\n * Stores and retrieves data from an element. Works like jQuery.data().\n */\n\nfunction data(el, key, val) {\n if (typeof val !== 'undefined') {\n return getData(el, key);\n } else {\n return setData(el, key, val);\n }\n}\n\nfunction getData(el, key) {\n var str = el.getAttribute('data-' + key);\n return JSON.parse(str || '{}');\n}\n\nfunction setData(el, key, val) {\n el.setAttribute('data-' + key, JSON.stringify(val));\n}\n\n/***/ }),\n\n/***/ \"D3SYMdNAenu80VOO7/Dv\":\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nvar _onmount = __webpack_require__(\"yfX/NEeqeNrvWENPWWKS\");\n\nvar _onmount2 = _interopRequireDefault(_onmount);\n\nvar _on = __webpack_require__(\"MKJaVdnD9jF7rk6rW6AJ\");\n\nvar _on2 = _interopRequireDefault(_on);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n/**\n * Submitting the search form\n */\n\n(0, _onmount2.default)('[data-js-search-form]', function () {\n (0, _on2.default)(this, 'submit', function (e) {\n e.preventDefault();\n\n var link = document.querySelector('a[data-search-index]:visible');\n var href = link && link.getAttribute('href');\n\n if (href) window.location = href;\n });\n});\n\n/***/ }),\n\n/***/ \"DfTyEU8lscjHXmCMlptO\":\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.showAll = showAll;\nexports.show = show;\n\nvar _permutate = __webpack_require__(\"GOdGag34TlRuHa2OZoh9\");\n\nvar _querySelectorAll = __webpack_require__(\"EvxNxLK9yKFmn1U14Kvw\");\n\nvar _querySelectorAll2 = _interopRequireDefault(_querySelectorAll);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n/**\n * Show everything.\n *\n * @example\n * Search.showAll()\n */\n\nfunction showAll() {\n (0, _querySelectorAll2.default)('[data-search-index]').forEach(function (el) {\n el.removeAttribute('aria-hidden');\n });\n}\n\n/**\n * Search for a given keyword.\n *\n * @example\n * Search.show('hello')\n */\n\nfunction show(val) {\n var keywords = (0, _permutate.splitwords)(val);\n\n if (!keywords.length) return showAll();\n\n var selectors = keywords.map(function (k) {\n return '[data-search-index~=' + JSON.stringify(k) + ']';\n }).join('');\n\n (0, _querySelectorAll2.default)('[data-search-index]').forEach(function (el) {\n el.setAttribute('aria-hidden', true);\n });\n\n (0, _querySelectorAll2.default)(selectors).forEach(function (el) {\n el.removeAttribute('aria-hidden');\n });\n}\n\n/***/ }),\n\n/***/ \"E+dCGfS1pT5WowYv7jpv\":\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nvar _isotopePkgd = __webpack_require__(\"GbzL7C/QFmiBZDICkla+\");\n\nvar _isotopePkgd2 = _interopRequireDefault(_isotopePkgd);\n\nvar _onmount = __webpack_require__(\"yfX/NEeqeNrvWENPWWKS\");\n\nvar _onmount2 = _interopRequireDefault(_onmount);\n\nvar _on = __webpack_require__(\"MKJaVdnD9jF7rk6rW6AJ\");\n\nvar _on2 = _interopRequireDefault(_on);\n\nvar _querySelectorAll = __webpack_require__(\"EvxNxLK9yKFmn1U14Kvw\");\n\nvar _querySelectorAll2 = _interopRequireDefault(_querySelectorAll);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n/*\n * Behavior: Isotope\n */\n\n/* eslint-disable no-new */\n\n(0, _onmount2.default)('[data-js-h3-section-list]', function () {\n var iso = new _isotopePkgd2.default(this, {\n itemSelector: '.h3-section',\n transitionDuration: 0\n });\n\n var images = (0, _querySelectorAll2.default)('img', this);\n\n images.forEach(function (image) {\n (0, _on2.default)(image, 'load', function () {\n iso.layout();\n });\n });\n\n // Insurance against weirdness on pages like devhints.io/vim, where the\n // critical path CSS may look different from the final CSS (because of the\n // tables).\n (0, _on2.default)(window, 'load', function () {\n iso.layout();\n });\n});\n\n/***/ }),\n\n/***/ \"EvxNxLK9yKFmn1U14Kvw\":\n/***/ (function(module, exports) {\n\n/**\n * querySelectorAll : querySelectorAll(query, [element])\n * Convenience function to access `document.querySelectorAll`. Unlike the\n * default version, this always returns an array.\n *\n * If a 2nd parameter `element` is given, it only searches for descendants of\n * that element.\n *\n * var each = require('dom101/each');\n * var qsa = require('dom101/query-selector-all');\n *\n * qsa('.button').each(el => {\n * addClass('el', 'selected');\n * };\n */\n\nfunction querySelectorAll (query, context) {\n return Array.prototype.slice.call(\n (context || document).querySelectorAll(query)\n )\n}\n\nmodule.exports = querySelectorAll\n\n\n/***/ }),\n\n/***/ \"GOdGag34TlRuHa2OZoh9\":\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.default = permutate;\nexports.permutateString = permutateString;\nexports.permutateWord = permutateWord;\nexports.splitwords = splitwords;\n/**\n * Permutates a searcheable item.\n *\n * permutate({\n * slug: 'hello-world',\n * category: 'greetings'\n * })\n */\n\nfunction permutate(data) {\n var words = [];\n if (data.slug) {\n words = words.concat(permutateString(data.slug));\n }\n if (data.category) {\n words = words.concat(permutateString(data.category));\n }\n return words;\n}\n\n/*\n * Permutates strings.\n *\n * @example\n * permutateString('hi joe')\n * => ['h', 'hi', 'j', 'jo', 'joe']\n */\n\nfunction permutateString(str) {\n var words = [];\n var inputs = splitwords(str);\n\n inputs.forEach(function (word) {\n words = words.concat(permutateWord(word));\n });\n\n return words;\n}\n\n/**\n * Permutates a word.\n *\n * @example\n * permutateWord('hello')\n * => ['h', 'he', 'hel', 'hell', 'hello']\n */\n\nfunction permutateWord(str) {\n var words = [];\n var len = str.length;\n for (var i = 1; i <= len; ++i) {\n words.push(str.substr(0, i));\n }\n return words;\n}\n\n/**\n * Helper for splitting to words.\n *\n * @example\n * splitWords('Hello, world!')\n * => ['hello', 'world']\n */\n\nfunction splitwords(str) {\n var words = str.toLowerCase().split(/[ \\/\\-_]/).filter(function (k) {\n return k && k.length !== 0;\n });\n\n return words;\n}\n\n/***/ }),\n\n/***/ \"GbzL7C/QFmiBZDICkla+\":\n/***/ (function(module, exports, __webpack_require__) {\n\nvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;var __WEBPACK_LOCAL_MODULE_1__, __WEBPACK_LOCAL_MODULE_1__factory, __WEBPACK_LOCAL_MODULE_1__module;var __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_LOCAL_MODULE_2__;var __WEBPACK_LOCAL_MODULE_3__, __WEBPACK_LOCAL_MODULE_3__factory, __WEBPACK_LOCAL_MODULE_3__module;var __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_LOCAL_MODULE_4__;var __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_LOCAL_MODULE_5__;var __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_LOCAL_MODULE_6__;var __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_LOCAL_MODULE_7__;var __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_LOCAL_MODULE_8__;var __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_LOCAL_MODULE_9__;var __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_LOCAL_MODULE_10__;var __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_LOCAL_MODULE_11__;var __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_LOCAL_MODULE_12__;var __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;/*!\n * Isotope PACKAGED v3.0.4\n *\n * Licensed GPLv3 for open source use\n * or Isotope Commercial License for commercial use\n *\n * http://isotope.metafizzy.co\n * Copyright 2017 Metafizzy\n */\n\n/**\n * Bridget makes jQuery widgets\n * v2.0.1\n * MIT license\n */\n\n/* jshint browser: true, strict: true, undef: true, unused: true */\n\n( function( window, factory ) {\n // universal module definition\n /*jshint strict: false */ /* globals define, module, require */\n if ( true ) {\n // AMD\n !(__WEBPACK_AMD_DEFINE_ARRAY__ = [ __webpack_require__(\"g2okcHDGBNRpe9zqR9sR\") ], __WEBPACK_AMD_DEFINE_RESULT__ = function( jQuery ) {\n return factory( window, jQuery );\n }.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n } else if ( typeof module == 'object' && module.exports ) {\n // CommonJS\n module.exports = factory(\n window,\n require('jquery')\n );\n } else {\n // browser global\n window.jQueryBridget = factory(\n window,\n window.jQuery\n );\n }\n\n}( window, function factory( window, jQuery ) {\n'use strict';\n\n// ----- utils ----- //\n\nvar arraySlice = Array.prototype.slice;\n\n// helper function for logging errors\n// $.error breaks jQuery chaining\nvar console = window.console;\nvar logError = typeof console == 'undefined' ? function() {} :\n function( message ) {\n console.error( message );\n };\n\n// ----- jQueryBridget ----- //\n\nfunction jQueryBridget( namespace, PluginClass, $ ) {\n $ = $ || jQuery || window.jQuery;\n if ( !$ ) {\n return;\n }\n\n // add option method -> $().plugin('option', {...})\n if ( !PluginClass.prototype.option ) {\n // option setter\n PluginClass.prototype.option = function( opts ) {\n // bail out if not an object\n if ( !$.isPlainObject( opts ) ){\n return;\n }\n this.options = $.extend( true, this.options, opts );\n };\n }\n\n // make jQuery plugin\n $.fn[ namespace ] = function( arg0 /*, arg1 */ ) {\n if ( typeof arg0 == 'string' ) {\n // method call $().plugin( 'methodName', { options } )\n // shift arguments by 1\n var args = arraySlice.call( arguments, 1 );\n return methodCall( this, arg0, args );\n }\n // just $().plugin({ options })\n plainCall( this, arg0 );\n return this;\n };\n\n // $().plugin('methodName')\n function methodCall( $elems, methodName, args ) {\n var returnValue;\n var pluginMethodStr = '$().' + namespace + '(\"' + methodName + '\")';\n\n $elems.each( function( i, elem ) {\n // get instance\n var instance = $.data( elem, namespace );\n if ( !instance ) {\n logError( namespace + ' not initialized. Cannot call methods, i.e. ' +\n pluginMethodStr );\n return;\n }\n\n var method = instance[ methodName ];\n if ( !method || methodName.charAt(0) == '_' ) {\n logError( pluginMethodStr + ' is not a valid method' );\n return;\n }\n\n // apply method, get return value\n var value = method.apply( instance, args );\n // set return value if value is returned, use only first value\n returnValue = returnValue === undefined ? value : returnValue;\n });\n\n return returnValue !== undefined ? returnValue : $elems;\n }\n\n function plainCall( $elems, options ) {\n $elems.each( function( i, elem ) {\n var instance = $.data( elem, namespace );\n if ( instance ) {\n // set options & init\n instance.option( options );\n instance._init();\n } else {\n // initialize new instance\n instance = new PluginClass( elem, options );\n $.data( elem, namespace, instance );\n }\n });\n }\n\n updateJQuery( $ );\n\n}\n\n// ----- updateJQuery ----- //\n\n// set $.bridget for v1 backwards compatibility\nfunction updateJQuery( $ ) {\n if ( !$ || ( $ && $.bridget ) ) {\n return;\n }\n $.bridget = jQueryBridget;\n}\n\nupdateJQuery( jQuery || window.jQuery );\n\n// ----- ----- //\n\nreturn jQueryBridget;\n\n}));\n\n/**\n * EvEmitter v1.0.3\n * Lil' event emitter\n * MIT License\n */\n\n/* jshint unused: true, undef: true, strict: true */\n\n( function( global, factory ) {\n // universal module definition\n /* jshint strict: false */ /* globals define, module, window */\n if ( true ) {\n // AMD - RequireJS\n !(__WEBPACK_LOCAL_MODULE_1__factory = (factory), (__WEBPACK_LOCAL_MODULE_1__module = { id: \"ev-emitter/ev-emitter\", exports: {}, loaded: false }), __WEBPACK_LOCAL_MODULE_1__ = (typeof __WEBPACK_LOCAL_MODULE_1__factory === 'function' ? (__WEBPACK_LOCAL_MODULE_1__factory.call(__WEBPACK_LOCAL_MODULE_1__module.exports, __webpack_require__, __WEBPACK_LOCAL_MODULE_1__module.exports, __WEBPACK_LOCAL_MODULE_1__module)) : __WEBPACK_LOCAL_MODULE_1__factory), (__WEBPACK_LOCAL_MODULE_1__module.loaded = true), __WEBPACK_LOCAL_MODULE_1__ === undefined && (__WEBPACK_LOCAL_MODULE_1__ = __WEBPACK_LOCAL_MODULE_1__module.exports));\n } else if ( typeof module == 'object' && module.exports ) {\n // CommonJS - Browserify, Webpack\n module.exports = factory();\n } else {\n // Browser globals\n global.EvEmitter = factory();\n }\n\n}( typeof window != 'undefined' ? window : this, function() {\n\n\n\nfunction EvEmitter() {}\n\nvar proto = EvEmitter.prototype;\n\nproto.on = function( eventName, listener ) {\n if ( !eventName || !listener ) {\n return;\n }\n // set events hash\n var events = this._events = this._events || {};\n // set listeners array\n var listeners = events[ eventName ] = events[ eventName ] || [];\n // only add once\n if ( listeners.indexOf( listener ) == -1 ) {\n listeners.push( listener );\n }\n\n return this;\n};\n\nproto.once = function( eventName, listener ) {\n if ( !eventName || !listener ) {\n return;\n }\n // add event\n this.on( eventName, listener );\n // set once flag\n // set onceEvents hash\n var onceEvents = this._onceEvents = this._onceEvents || {};\n // set onceListeners object\n var onceListeners = onceEvents[ eventName ] = onceEvents[ eventName ] || {};\n // set flag\n onceListeners[ listener ] = true;\n\n return this;\n};\n\nproto.off = function( eventName, listener ) {\n var listeners = this._events && this._events[ eventName ];\n if ( !listeners || !listeners.length ) {\n return;\n }\n var index = listeners.indexOf( listener );\n if ( index != -1 ) {\n listeners.splice( index, 1 );\n }\n\n return this;\n};\n\nproto.emitEvent = function( eventName, args ) {\n var listeners = this._events && this._events[ eventName ];\n if ( !listeners || !listeners.length ) {\n return;\n }\n var i = 0;\n var listener = listeners[i];\n args = args || [];\n // once stuff\n var onceListeners = this._onceEvents && this._onceEvents[ eventName ];\n\n while ( listener ) {\n var isOnce = onceListeners && onceListeners[ listener ];\n if ( isOnce ) {\n // remove listener\n // remove before trigger to prevent recursion\n this.off( eventName, listener );\n // unset once flag\n delete onceListeners[ listener ];\n }\n // trigger listener\n listener.apply( this, args );\n // get next listener\n i += isOnce ? 0 : 1;\n listener = listeners[i];\n }\n\n return this;\n};\n\nreturn EvEmitter;\n\n}));\n\n/*!\n * getSize v2.0.2\n * measure size of elements\n * MIT license\n */\n\n/*jshint browser: true, strict: true, undef: true, unused: true */\n/*global define: false, module: false, console: false */\n\n( function( window, factory ) {\n 'use strict';\n\n if ( true ) {\n // AMD\n !(__WEBPACK_AMD_DEFINE_ARRAY__ = [], __WEBPACK_LOCAL_MODULE_2__ = (function() {\n return factory();\n }.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__)));\n } else if ( typeof module == 'object' && module.exports ) {\n // CommonJS\n module.exports = factory();\n } else {\n // browser global\n window.getSize = factory();\n }\n\n})( window, function factory() {\n'use strict';\n\n// -------------------------- helpers -------------------------- //\n\n// get a number from a string, not a percentage\nfunction getStyleSize( value ) {\n var num = parseFloat( value );\n // not a percent like '100%', and a number\n var isValid = value.indexOf('%') == -1 && !isNaN( num );\n return isValid && num;\n}\n\nfunction noop() {}\n\nvar logError = typeof console == 'undefined' ? noop :\n function( message ) {\n console.error( message );\n };\n\n// -------------------------- measurements -------------------------- //\n\nvar measurements = [\n 'paddingLeft',\n 'paddingRight',\n 'paddingTop',\n 'paddingBottom',\n 'marginLeft',\n 'marginRight',\n 'marginTop',\n 'marginBottom',\n 'borderLeftWidth',\n 'borderRightWidth',\n 'borderTopWidth',\n 'borderBottomWidth'\n];\n\nvar measurementsLength = measurements.length;\n\nfunction getZeroSize() {\n var size = {\n width: 0,\n height: 0,\n innerWidth: 0,\n innerHeight: 0,\n outerWidth: 0,\n outerHeight: 0\n };\n for ( var i=0; i < measurementsLength; i++ ) {\n var measurement = measurements[i];\n size[ measurement ] = 0;\n }\n return size;\n}\n\n// -------------------------- getStyle -------------------------- //\n\n/**\n * getStyle, get style of element, check for Firefox bug\n * https://bugzilla.mozilla.org/show_bug.cgi?id=548397\n */\nfunction getStyle( elem ) {\n var style = getComputedStyle( elem );\n if ( !style ) {\n logError( 'Style returned ' + style +\n '. Are you running this code in a hidden iframe on Firefox? ' +\n 'See http://bit.ly/getsizebug1' );\n }\n return style;\n}\n\n// -------------------------- setup -------------------------- //\n\nvar isSetup = false;\n\nvar isBoxSizeOuter;\n\n/**\n * setup\n * check isBoxSizerOuter\n * do on first getSize() rather than on page load for Firefox bug\n */\nfunction setup() {\n // setup once\n if ( isSetup ) {\n return;\n }\n isSetup = true;\n\n // -------------------------- box sizing -------------------------- //\n\n /**\n * WebKit measures the outer-width on style.width on border-box elems\n * IE & Firefox<29 measures the inner-width\n */\n var div = document.createElement('div');\n div.style.width = '200px';\n div.style.padding = '1px 2px 3px 4px';\n div.style.borderStyle = 'solid';\n div.style.borderWidth = '1px 2px 3px 4px';\n div.style.boxSizing = 'border-box';\n\n var body = document.body || document.documentElement;\n body.appendChild( div );\n var style = getStyle( div );\n\n getSize.isBoxSizeOuter = isBoxSizeOuter = getStyleSize( style.width ) == 200;\n body.removeChild( div );\n\n}\n\n// -------------------------- getSize -------------------------- //\n\nfunction getSize( elem ) {\n setup();\n\n // use querySeletor if elem is string\n if ( typeof elem == 'string' ) {\n elem = document.querySelector( elem );\n }\n\n // do not proceed on non-objects\n if ( !elem || typeof elem != 'object' || !elem.nodeType ) {\n return;\n }\n\n var style = getStyle( elem );\n\n // if hidden, everything is 0\n if ( style.display == 'none' ) {\n return getZeroSize();\n }\n\n var size = {};\n size.width = elem.offsetWidth;\n size.height = elem.offsetHeight;\n\n var isBorderBox = size.isBorderBox = style.boxSizing == 'border-box';\n\n // get all measurements\n for ( var i=0; i < measurementsLength; i++ ) {\n var measurement = measurements[i];\n var value = style[ measurement ];\n var num = parseFloat( value );\n // any 'auto', 'medium' value will be 0\n size[ measurement ] = !isNaN( num ) ? num : 0;\n }\n\n var paddingWidth = size.paddingLeft + size.paddingRight;\n var paddingHeight = size.paddingTop + size.paddingBottom;\n var marginWidth = size.marginLeft + size.marginRight;\n var marginHeight = size.marginTop + size.marginBottom;\n var borderWidth = size.borderLeftWidth + size.borderRightWidth;\n var borderHeight = size.borderTopWidth + size.borderBottomWidth;\n\n var isBorderBoxSizeOuter = isBorderBox && isBoxSizeOuter;\n\n // overwrite width and height if we can get it from style\n var styleWidth = getStyleSize( style.width );\n if ( styleWidth !== false ) {\n size.width = styleWidth +\n // add padding and border unless it's already including it\n ( isBorderBoxSizeOuter ? 0 : paddingWidth + borderWidth );\n }\n\n var styleHeight = getStyleSize( style.height );\n if ( styleHeight !== false ) {\n size.height = styleHeight +\n // add padding and border unless it's already including it\n ( isBorderBoxSizeOuter ? 0 : paddingHeight + borderHeight );\n }\n\n size.innerWidth = size.width - ( paddingWidth + borderWidth );\n size.innerHeight = size.height - ( paddingHeight + borderHeight );\n\n size.outerWidth = size.width + marginWidth;\n size.outerHeight = size.height + marginHeight;\n\n return size;\n}\n\nreturn getSize;\n\n});\n\n/**\n * matchesSelector v2.0.2\n * matchesSelector( element, '.selector' )\n * MIT license\n */\n\n/*jshint browser: true, strict: true, undef: true, unused: true */\n\n( function( window, factory ) {\n /*global define: false, module: false */\n 'use strict';\n // universal module definition\n if ( true ) {\n // AMD\n !(__WEBPACK_LOCAL_MODULE_3__factory = (factory), (__WEBPACK_LOCAL_MODULE_3__module = { id: \"desandro-matches-selector/matches-selector\", exports: {}, loaded: false }), __WEBPACK_LOCAL_MODULE_3__ = (typeof __WEBPACK_LOCAL_MODULE_3__factory === 'function' ? (__WEBPACK_LOCAL_MODULE_3__factory.call(__WEBPACK_LOCAL_MODULE_3__module.exports, __webpack_require__, __WEBPACK_LOCAL_MODULE_3__module.exports, __WEBPACK_LOCAL_MODULE_3__module)) : __WEBPACK_LOCAL_MODULE_3__factory), (__WEBPACK_LOCAL_MODULE_3__module.loaded = true), __WEBPACK_LOCAL_MODULE_3__ === undefined && (__WEBPACK_LOCAL_MODULE_3__ = __WEBPACK_LOCAL_MODULE_3__module.exports));\n } else if ( typeof module == 'object' && module.exports ) {\n // CommonJS\n module.exports = factory();\n } else {\n // browser global\n window.matchesSelector = factory();\n }\n\n}( window, function factory() {\n 'use strict';\n\n var matchesMethod = ( function() {\n var ElemProto = window.Element.prototype;\n // check for the standard method name first\n if ( ElemProto.matches ) {\n return 'matches';\n }\n // check un-prefixed\n if ( ElemProto.matchesSelector ) {\n return 'matchesSelector';\n }\n // check vendor prefixes\n var prefixes = [ 'webkit', 'moz', 'ms', 'o' ];\n\n for ( var i=0; i < prefixes.length; i++ ) {\n var prefix = prefixes[i];\n var method = prefix + 'MatchesSelector';\n if ( ElemProto[ method ] ) {\n return method;\n }\n }\n })();\n\n return function matchesSelector( elem, selector ) {\n return elem[ matchesMethod ]( selector );\n };\n\n}));\n\n/**\n * Fizzy UI utils v2.0.5\n * MIT license\n */\n\n/*jshint browser: true, undef: true, unused: true, strict: true */\n\n( function( window, factory ) {\n // universal module definition\n /*jshint strict: false */ /*globals define, module, require */\n\n if ( true ) {\n // AMD\n !(__WEBPACK_AMD_DEFINE_ARRAY__ = [\n __WEBPACK_LOCAL_MODULE_3__\n ], __WEBPACK_LOCAL_MODULE_4__ = (function( matchesSelector ) {\n return factory( window, matchesSelector );\n }.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__)));\n } else if ( typeof module == 'object' && module.exports ) {\n // CommonJS\n module.exports = factory(\n window,\n require('desandro-matches-selector')\n );\n } else {\n // browser global\n window.fizzyUIUtils = factory(\n window,\n window.matchesSelector\n );\n }\n\n}( window, function factory( window, matchesSelector ) {\n\n\n\nvar utils = {};\n\n// ----- extend ----- //\n\n// extends objects\nutils.extend = function( a, b ) {\n for ( var prop in b ) {\n a[ prop ] = b[ prop ];\n }\n return a;\n};\n\n// ----- modulo ----- //\n\nutils.modulo = function( num, div ) {\n return ( ( num % div ) + div ) % div;\n};\n\n// ----- makeArray ----- //\n\n// turn element or nodeList into an array\nutils.makeArray = function( obj ) {\n var ary = [];\n if ( Array.isArray( obj ) ) {\n // use object if already an array\n ary = obj;\n } else if ( obj && typeof obj == 'object' &&\n typeof obj.length == 'number' ) {\n // convert nodeList to array\n for ( var i=0; i < obj.length; i++ ) {\n ary.push( obj[i] );\n }\n } else {\n // array of single index\n ary.push( obj );\n }\n return ary;\n};\n\n// ----- removeFrom ----- //\n\nutils.removeFrom = function( ary, obj ) {\n var index = ary.indexOf( obj );\n if ( index != -1 ) {\n ary.splice( index, 1 );\n }\n};\n\n// ----- getParent ----- //\n\nutils.getParent = function( elem, selector ) {\n while ( elem.parentNode && elem != document.body ) {\n elem = elem.parentNode;\n if ( matchesSelector( elem, selector ) ) {\n return elem;\n }\n }\n};\n\n// ----- getQueryElement ----- //\n\n// use element as selector string\nutils.getQueryElement = function( elem ) {\n if ( typeof elem == 'string' ) {\n return document.querySelector( elem );\n }\n return elem;\n};\n\n// ----- handleEvent ----- //\n\n// enable .ontype to trigger from .addEventListener( elem, 'type' )\nutils.handleEvent = function( event ) {\n var method = 'on' + event.type;\n if ( this[ method ] ) {\n this[ method ]( event );\n }\n};\n\n// ----- filterFindElements ----- //\n\nutils.filterFindElements = function( elems, selector ) {\n // make array of elems\n elems = utils.makeArray( elems );\n var ffElems = [];\n\n elems.forEach( function( elem ) {\n // check that elem is an actual element\n if ( !( elem instanceof HTMLElement ) ) {\n return;\n }\n // add elem if no selector\n if ( !selector ) {\n ffElems.push( elem );\n return;\n }\n // filter & find items if we have a selector\n // filter\n if ( matchesSelector( elem, selector ) ) {\n ffElems.push( elem );\n }\n // find children\n var childElems = elem.querySelectorAll( selector );\n // concat childElems to filterFound array\n for ( var i=0; i < childElems.length; i++ ) {\n ffElems.push( childElems[i] );\n }\n });\n\n return ffElems;\n};\n\n// ----- debounceMethod ----- //\n\nutils.debounceMethod = function( _class, methodName, threshold ) {\n // original method\n var method = _class.prototype[ methodName ];\n var timeoutName = methodName + 'Timeout';\n\n _class.prototype[ methodName ] = function() {\n var timeout = this[ timeoutName ];\n if ( timeout ) {\n clearTimeout( timeout );\n }\n var args = arguments;\n\n var _this = this;\n this[ timeoutName ] = setTimeout( function() {\n method.apply( _this, args );\n delete _this[ timeoutName ];\n }, threshold || 100 );\n };\n};\n\n// ----- docReady ----- //\n\nutils.docReady = function( callback ) {\n var readyState = document.readyState;\n if ( readyState == 'complete' || readyState == 'interactive' ) {\n // do async to allow for other scripts to run. metafizzy/flickity#441\n setTimeout( callback );\n } else {\n document.addEventListener( 'DOMContentLoaded', callback );\n }\n};\n\n// ----- htmlInit ----- //\n\n// http://jamesroberts.name/blog/2010/02/22/string-functions-for-javascript-trim-to-camel-case-to-dashed-and-to-underscore/\nutils.toDashed = function( str ) {\n return str.replace( /(.)([A-Z])/g, function( match, $1, $2 ) {\n return $1 + '-' + $2;\n }).toLowerCase();\n};\n\nvar console = window.console;\n/**\n * allow user to initialize classes via [data-namespace] or .js-namespace class\n * htmlInit( Widget, 'widgetName' )\n * options are parsed from data-namespace-options\n */\nutils.htmlInit = function( WidgetClass, namespace ) {\n utils.docReady( function() {\n var dashedNamespace = utils.toDashed( namespace );\n var dataAttr = 'data-' + dashedNamespace;\n var dataAttrElems = document.querySelectorAll( '[' + dataAttr + ']' );\n var jsDashElems = document.querySelectorAll( '.js-' + dashedNamespace );\n var elems = utils.makeArray( dataAttrElems )\n .concat( utils.makeArray( jsDashElems ) );\n var dataOptionsAttr = dataAttr + '-options';\n var jQuery = window.jQuery;\n\n elems.forEach( function( elem ) {\n var attr = elem.getAttribute( dataAttr ) ||\n elem.getAttribute( dataOptionsAttr );\n var options;\n try {\n options = attr && JSON.parse( attr );\n } catch ( error ) {\n // log error, do not initialize\n if ( console ) {\n console.error( 'Error parsing ' + dataAttr + ' on ' + elem.className +\n ': ' + error );\n }\n return;\n }\n // initialize\n var instance = new WidgetClass( elem, options );\n // make available via $().data('namespace')\n if ( jQuery ) {\n jQuery.data( elem, namespace, instance );\n }\n });\n\n });\n};\n\n// ----- ----- //\n\nreturn utils;\n\n}));\n\n/**\n * Outlayer Item\n */\n\n( function( window, factory ) {\n // universal module definition\n /* jshint strict: false */ /* globals define, module, require */\n if ( true ) {\n // AMD - RequireJS\n !(__WEBPACK_AMD_DEFINE_ARRAY__ = [\n __WEBPACK_LOCAL_MODULE_1__,\n __WEBPACK_LOCAL_MODULE_2__\n ], __WEBPACK_AMD_DEFINE_FACTORY__ = (factory),\n\t\t\t\t__WEBPACK_LOCAL_MODULE_5__ = (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === 'function' ?\n\t\t\t\t(__WEBPACK_AMD_DEFINE_FACTORY__.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__)) : __WEBPACK_AMD_DEFINE_FACTORY__));\n } else if ( typeof module == 'object' && module.exports ) {\n // CommonJS - Browserify, Webpack\n module.exports = factory(\n require('ev-emitter'),\n require('get-size')\n );\n } else {\n // browser global\n window.Outlayer = {};\n window.Outlayer.Item = factory(\n window.EvEmitter,\n window.getSize\n );\n }\n\n}( window, function factory( EvEmitter, getSize ) {\n'use strict';\n\n// ----- helpers ----- //\n\nfunction isEmptyObj( obj ) {\n for ( var prop in obj ) {\n return false;\n }\n prop = null;\n return true;\n}\n\n// -------------------------- CSS3 support -------------------------- //\n\n\nvar docElemStyle = document.documentElement.style;\n\nvar transitionProperty = typeof docElemStyle.transition == 'string' ?\n 'transition' : 'WebkitTransition';\nvar transformProperty = typeof docElemStyle.transform == 'string' ?\n 'transform' : 'WebkitTransform';\n\nvar transitionEndEvent = {\n WebkitTransition: 'webkitTransitionEnd',\n transition: 'transitionend'\n}[ transitionProperty ];\n\n// cache all vendor properties that could have vendor prefix\nvar vendorProperties = {\n transform: transformProperty,\n transition: transitionProperty,\n transitionDuration: transitionProperty + 'Duration',\n transitionProperty: transitionProperty + 'Property',\n transitionDelay: transitionProperty + 'Delay'\n};\n\n// -------------------------- Item -------------------------- //\n\nfunction Item( element, layout ) {\n if ( !element ) {\n return;\n }\n\n this.element = element;\n // parent layout class, i.e. Masonry, Isotope, or Packery\n this.layout = layout;\n this.position = {\n x: 0,\n y: 0\n };\n\n this._create();\n}\n\n// inherit EvEmitter\nvar proto = Item.prototype = Object.create( EvEmitter.prototype );\nproto.constructor = Item;\n\nproto._create = function() {\n // transition objects\n this._transn = {\n ingProperties: {},\n clean: {},\n onEnd: {}\n };\n\n this.css({\n position: 'absolute'\n });\n};\n\n// trigger specified handler for event type\nproto.handleEvent = function( event ) {\n var method = 'on' + event.type;\n if ( this[ method ] ) {\n this[ method ]( event );\n }\n};\n\nproto.getSize = function() {\n this.size = getSize( this.element );\n};\n\n/**\n * apply CSS styles to element\n * @param {Object} style\n */\nproto.css = function( style ) {\n var elemStyle = this.element.style;\n\n for ( var prop in style ) {\n // use vendor property if available\n var supportedProp = vendorProperties[ prop ] || prop;\n elemStyle[ supportedProp ] = style[ prop ];\n }\n};\n\n // measure position, and sets it\nproto.getPosition = function() {\n var style = getComputedStyle( this.element );\n var isOriginLeft = this.layout._getOption('originLeft');\n var isOriginTop = this.layout._getOption('originTop');\n var xValue = style[ isOriginLeft ? 'left' : 'right' ];\n var yValue = style[ isOriginTop ? 'top' : 'bottom' ];\n // convert percent to pixels\n var layoutSize = this.layout.size;\n var x = xValue.indexOf('%') != -1 ?\n ( parseFloat( xValue ) / 100 ) * layoutSize.width : parseInt( xValue, 10 );\n var y = yValue.indexOf('%') != -1 ?\n ( parseFloat( yValue ) / 100 ) * layoutSize.height : parseInt( yValue, 10 );\n\n // clean up 'auto' or other non-integer values\n x = isNaN( x ) ? 0 : x;\n y = isNaN( y ) ? 0 : y;\n // remove padding from measurement\n x -= isOriginLeft ? layoutSize.paddingLeft : layoutSize.paddingRight;\n y -= isOriginTop ? layoutSize.paddingTop : layoutSize.paddingBottom;\n\n this.position.x = x;\n this.position.y = y;\n};\n\n// set settled position, apply padding\nproto.layoutPosition = function() {\n var layoutSize = this.layout.size;\n var style = {};\n var isOriginLeft = this.layout._getOption('originLeft');\n var isOriginTop = this.layout._getOption('originTop');\n\n // x\n var xPadding = isOriginLeft ? 'paddingLeft' : 'paddingRight';\n var xProperty = isOriginLeft ? 'left' : 'right';\n var xResetProperty = isOriginLeft ? 'right' : 'left';\n\n var x = this.position.x + layoutSize[ xPadding ];\n // set in percentage or pixels\n style[ xProperty ] = this.getXValue( x );\n // reset other property\n style[ xResetProperty ] = '';\n\n // y\n var yPadding = isOriginTop ? 'paddingTop' : 'paddingBottom';\n var yProperty = isOriginTop ? 'top' : 'bottom';\n var yResetProperty = isOriginTop ? 'bottom' : 'top';\n\n var y = this.position.y + layoutSize[ yPadding ];\n // set in percentage or pixels\n style[ yProperty ] = this.getYValue( y );\n // reset other property\n style[ yResetProperty ] = '';\n\n this.css( style );\n this.emitEvent( 'layout', [ this ] );\n};\n\nproto.getXValue = function( x ) {\n var isHorizontal = this.layout._getOption('horizontal');\n return this.layout.options.percentPosition && !isHorizontal ?\n ( ( x / this.layout.size.width ) * 100 ) + '%' : x + 'px';\n};\n\nproto.getYValue = function( y ) {\n var isHorizontal = this.layout._getOption('horizontal');\n return this.layout.options.percentPosition && isHorizontal ?\n ( ( y / this.layout.size.height ) * 100 ) + '%' : y + 'px';\n};\n\nproto._transitionTo = function( x, y ) {\n this.getPosition();\n // get current x & y from top/left\n var curX = this.position.x;\n var curY = this.position.y;\n\n var compareX = parseInt( x, 10 );\n var compareY = parseInt( y, 10 );\n var didNotMove = compareX === this.position.x && compareY === this.position.y;\n\n // save end position\n this.setPosition( x, y );\n\n // if did not move and not transitioning, just go to layout\n if ( didNotMove && !this.isTransitioning ) {\n this.layoutPosition();\n return;\n }\n\n var transX = x - curX;\n var transY = y - curY;\n var transitionStyle = {};\n transitionStyle.transform = this.getTranslate( transX, transY );\n\n this.transition({\n to: transitionStyle,\n onTransitionEnd: {\n transform: this.layoutPosition\n },\n isCleaning: true\n });\n};\n\nproto.getTranslate = function( x, y ) {\n // flip cooridinates if origin on right or bottom\n var isOriginLeft = this.layout._getOption('originLeft');\n var isOriginTop = this.layout._getOption('originTop');\n x = isOriginLeft ? x : -x;\n y = isOriginTop ? y : -y;\n return 'translate3d(' + x + 'px, ' + y + 'px, 0)';\n};\n\n// non transition + transform support\nproto.goTo = function( x, y ) {\n this.setPosition( x, y );\n this.layoutPosition();\n};\n\nproto.moveTo = proto._transitionTo;\n\nproto.setPosition = function( x, y ) {\n this.position.x = parseInt( x, 10 );\n this.position.y = parseInt( y, 10 );\n};\n\n// ----- transition ----- //\n\n/**\n * @param {Object} style - CSS\n * @param {Function} onTransitionEnd\n */\n\n// non transition, just trigger callback\nproto._nonTransition = function( args ) {\n this.css( args.to );\n if ( args.isCleaning ) {\n this._removeStyles( args.to );\n }\n for ( var prop in args.onTransitionEnd ) {\n args.onTransitionEnd[ prop ].call( this );\n }\n};\n\n/**\n * proper transition\n * @param {Object} args - arguments\n * @param {Object} to - style to transition to\n * @param {Object} from - style to start transition from\n * @param {Boolean} isCleaning - removes transition styles after transition\n * @param {Function} onTransitionEnd - callback\n */\nproto.transition = function( args ) {\n // redirect to nonTransition if no transition duration\n if ( !parseFloat( this.layout.options.transitionDuration ) ) {\n this._nonTransition( args );\n return;\n }\n\n var _transition = this._transn;\n // keep track of onTransitionEnd callback by css property\n for ( var prop in args.onTransitionEnd ) {\n _transition.onEnd[ prop ] = args.onTransitionEnd[ prop ];\n }\n // keep track of properties that are transitioning\n for ( prop in args.to ) {\n _transition.ingProperties[ prop ] = true;\n // keep track of properties to clean up when transition is done\n if ( args.isCleaning ) {\n _transition.clean[ prop ] = true;\n }\n }\n\n // set from styles\n if ( args.from ) {\n this.css( args.from );\n // force redraw. http://blog.alexmaccaw.com/css-transitions\n var h = this.element.offsetHeight;\n // hack for JSHint to hush about unused var\n h = null;\n }\n // enable transition\n this.enableTransition( args.to );\n // set styles that are transitioning\n this.css( args.to );\n\n this.isTransitioning = true;\n\n};\n\n// dash before all cap letters, including first for\n// WebkitTransform => -webkit-transform\nfunction toDashedAll( str ) {\n return str.replace( /([A-Z])/g, function( $1 ) {\n return '-' + $1.toLowerCase();\n });\n}\n\nvar transitionProps = 'opacity,' + toDashedAll( transformProperty );\n\nproto.enableTransition = function(/* style */) {\n // HACK changing transitionProperty during a transition\n // will cause transition to jump\n if ( this.isTransitioning ) {\n return;\n }\n\n // make `transition: foo, bar, baz` from style object\n // HACK un-comment this when enableTransition can work\n // while a transition is happening\n // var transitionValues = [];\n // for ( var prop in style ) {\n // // dash-ify camelCased properties like WebkitTransition\n // prop = vendorProperties[ prop ] || prop;\n // transitionValues.push( toDashedAll( prop ) );\n // }\n // munge number to millisecond, to match stagger\n var duration = this.layout.options.transitionDuration;\n duration = typeof duration == 'number' ? duration + 'ms' : duration;\n // enable transition styles\n this.css({\n transitionProperty: transitionProps,\n transitionDuration: duration,\n transitionDelay: this.staggerDelay || 0\n });\n // listen for transition end event\n this.element.addEventListener( transitionEndEvent, this, false );\n};\n\n// ----- events ----- //\n\nproto.onwebkitTransitionEnd = function( event ) {\n this.ontransitionend( event );\n};\n\nproto.onotransitionend = function( event ) {\n this.ontransitionend( event );\n};\n\n// properties that I munge to make my life easier\nvar dashedVendorProperties = {\n '-webkit-transform': 'transform'\n};\n\nproto.ontransitionend = function( event ) {\n // disregard bubbled events from children\n if ( event.target !== this.element ) {\n return;\n }\n var _transition = this._transn;\n // get property name of transitioned property, convert to prefix-free\n var propertyName = dashedVendorProperties[ event.propertyName ] || event.propertyName;\n\n // remove property that has completed transitioning\n delete _transition.ingProperties[ propertyName ];\n // check if any properties are still transitioning\n if ( isEmptyObj( _transition.ingProperties ) ) {\n // all properties have completed transitioning\n this.disableTransition();\n }\n // clean style\n if ( propertyName in _transition.clean ) {\n // clean up style\n this.element.style[ event.propertyName ] = '';\n delete _transition.clean[ propertyName ];\n }\n // trigger onTransitionEnd callback\n if ( propertyName in _transition.onEnd ) {\n var onTransitionEnd = _transition.onEnd[ propertyName ];\n onTransitionEnd.call( this );\n delete _transition.onEnd[ propertyName ];\n }\n\n this.emitEvent( 'transitionEnd', [ this ] );\n};\n\nproto.disableTransition = function() {\n this.removeTransitionStyles();\n this.element.removeEventListener( transitionEndEvent, this, false );\n this.isTransitioning = false;\n};\n\n/**\n * removes style property from element\n * @param {Object} style\n**/\nproto._removeStyles = function( style ) {\n // clean up transition styles\n var cleanStyle = {};\n for ( var prop in style ) {\n cleanStyle[ prop ] = '';\n }\n this.css( cleanStyle );\n};\n\nvar cleanTransitionStyle = {\n transitionProperty: '',\n transitionDuration: '',\n transitionDelay: ''\n};\n\nproto.removeTransitionStyles = function() {\n // remove transition\n this.css( cleanTransitionStyle );\n};\n\n// ----- stagger ----- //\n\nproto.stagger = function( delay ) {\n delay = isNaN( delay ) ? 0 : delay;\n this.staggerDelay = delay + 'ms';\n};\n\n// ----- show/hide/remove ----- //\n\n// remove element from DOM\nproto.removeElem = function() {\n this.element.parentNode.removeChild( this.element );\n // remove display: none\n this.css({ display: '' });\n this.emitEvent( 'remove', [ this ] );\n};\n\nproto.remove = function() {\n // just remove element if no transition support or no transition\n if ( !transitionProperty || !parseFloat( this.layout.options.transitionDuration ) ) {\n this.removeElem();\n return;\n }\n\n // start transition\n this.once( 'transitionEnd', function() {\n this.removeElem();\n });\n this.hide();\n};\n\nproto.reveal = function() {\n delete this.isHidden;\n // remove display: none\n this.css({ display: '' });\n\n var options = this.layout.options;\n\n var onTransitionEnd = {};\n var transitionEndProperty = this.getHideRevealTransitionEndProperty('visibleStyle');\n onTransitionEnd[ transitionEndProperty ] = this.onRevealTransitionEnd;\n\n this.transition({\n from: options.hiddenStyle,\n to: options.visibleStyle,\n isCleaning: true,\n onTransitionEnd: onTransitionEnd\n });\n};\n\nproto.onRevealTransitionEnd = function() {\n // check if still visible\n // during transition, item may have been hidden\n if ( !this.isHidden ) {\n this.emitEvent('reveal');\n }\n};\n\n/**\n * get style property use for hide/reveal transition end\n * @param {String} styleProperty - hiddenStyle/visibleStyle\n * @returns {String}\n */\nproto.getHideRevealTransitionEndProperty = function( styleProperty ) {\n var optionStyle = this.layout.options[ styleProperty ];\n // use opacity\n if ( optionStyle.opacity ) {\n return 'opacity';\n }\n // get first property\n for ( var prop in optionStyle ) {\n return prop;\n }\n};\n\nproto.hide = function() {\n // set flag\n this.isHidden = true;\n // remove display: none\n this.css({ display: '' });\n\n var options = this.layout.options;\n\n var onTransitionEnd = {};\n var transitionEndProperty = this.getHideRevealTransitionEndProperty('hiddenStyle');\n onTransitionEnd[ transitionEndProperty ] = this.onHideTransitionEnd;\n\n this.transition({\n from: options.visibleStyle,\n to: options.hiddenStyle,\n // keep hidden stuff hidden\n isCleaning: true,\n onTransitionEnd: onTransitionEnd\n });\n};\n\nproto.onHideTransitionEnd = function() {\n // check if still hidden\n // during transition, item may have been un-hidden\n if ( this.isHidden ) {\n this.css({ display: 'none' });\n this.emitEvent('hide');\n }\n};\n\nproto.destroy = function() {\n this.css({\n position: '',\n left: '',\n right: '',\n top: '',\n bottom: '',\n transition: '',\n transform: ''\n });\n};\n\nreturn Item;\n\n}));\n\n/*!\n * Outlayer v2.1.0\n * the brains and guts of a layout library\n * MIT license\n */\n\n( function( window, factory ) {\n 'use strict';\n // universal module definition\n /* jshint strict: false */ /* globals define, module, require */\n if ( true ) {\n // AMD - RequireJS\n !(__WEBPACK_AMD_DEFINE_ARRAY__ = [\n __WEBPACK_LOCAL_MODULE_1__,\n __WEBPACK_LOCAL_MODULE_2__,\n __WEBPACK_LOCAL_MODULE_4__,\n __WEBPACK_LOCAL_MODULE_5__\n ], __WEBPACK_LOCAL_MODULE_6__ = (function( EvEmitter, getSize, utils, Item ) {\n return factory( window, EvEmitter, getSize, utils, Item);\n }.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__)));\n } else if ( typeof module == 'object' && module.exports ) {\n // CommonJS - Browserify, Webpack\n module.exports = factory(\n window,\n require('ev-emitter'),\n require('get-size'),\n require('fizzy-ui-utils'),\n require('./item')\n );\n } else {\n // browser global\n window.Outlayer = factory(\n window,\n window.EvEmitter,\n window.getSize,\n window.fizzyUIUtils,\n window.Outlayer.Item\n );\n }\n\n}( window, function factory( window, EvEmitter, getSize, utils, Item ) {\n'use strict';\n\n// ----- vars ----- //\n\nvar console = window.console;\nvar jQuery = window.jQuery;\nvar noop = function() {};\n\n// -------------------------- Outlayer -------------------------- //\n\n// globally unique identifiers\nvar GUID = 0;\n// internal store of all Outlayer intances\nvar instances = {};\n\n\n/**\n * @param {Element, String} element\n * @param {Object} options\n * @constructor\n */\nfunction Outlayer( element, options ) {\n var queryElement = utils.getQueryElement( element );\n if ( !queryElement ) {\n if ( console ) {\n console.error( 'Bad element for ' + this.constructor.namespace +\n ': ' + ( queryElement || element ) );\n }\n return;\n }\n this.element = queryElement;\n // add jQuery\n if ( jQuery ) {\n this.$element = jQuery( this.element );\n }\n\n // options\n this.options = utils.extend( {}, this.constructor.defaults );\n this.option( options );\n\n // add id for Outlayer.getFromElement\n var id = ++GUID;\n this.element.outlayerGUID = id; // expando\n instances[ id ] = this; // associate via id\n\n // kick it off\n this._create();\n\n var isInitLayout = this._getOption('initLayout');\n if ( isInitLayout ) {\n this.layout();\n }\n}\n\n// settings are for internal use only\nOutlayer.namespace = 'outlayer';\nOutlayer.Item = Item;\n\n// default options\nOutlayer.defaults = {\n containerStyle: {\n position: 'relative'\n },\n initLayout: true,\n originLeft: true,\n originTop: true,\n resize: true,\n resizeContainer: true,\n // item options\n transitionDuration: '0.4s',\n hiddenStyle: {\n opacity: 0,\n transform: 'scale(0.001)'\n },\n visibleStyle: {\n opacity: 1,\n transform: 'scale(1)'\n }\n};\n\nvar proto = Outlayer.prototype;\n// inherit EvEmitter\nutils.extend( proto, EvEmitter.prototype );\n\n/**\n * set options\n * @param {Object} opts\n */\nproto.option = function( opts ) {\n utils.extend( this.options, opts );\n};\n\n/**\n * get backwards compatible option value, check old name\n */\nproto._getOption = function( option ) {\n var oldOption = this.constructor.compatOptions[ option ];\n return oldOption && this.options[ oldOption ] !== undefined ?\n this.options[ oldOption ] : this.options[ option ];\n};\n\nOutlayer.compatOptions = {\n // currentName: oldName\n initLayout: 'isInitLayout',\n horizontal: 'isHorizontal',\n layoutInstant: 'isLayoutInstant',\n originLeft: 'isOriginLeft',\n originTop: 'isOriginTop',\n resize: 'isResizeBound',\n resizeContainer: 'isResizingContainer'\n};\n\nproto._create = function() {\n // get items from children\n this.reloadItems();\n // elements that affect layout, but are not laid out\n this.stamps = [];\n this.stamp( this.options.stamp );\n // set container style\n utils.extend( this.element.style, this.options.containerStyle );\n\n // bind resize method\n var canBindResize = this._getOption('resize');\n if ( canBindResize ) {\n this.bindResize();\n }\n};\n\n// goes through all children again and gets bricks in proper order\nproto.reloadItems = function() {\n // collection of item elements\n this.items = this._itemize( this.element.children );\n};\n\n\n/**\n * turn elements into Outlayer.Items to be used in layout\n * @param {Array or NodeList or HTMLElement} elems\n * @returns {Array} items - collection of new Outlayer Items\n */\nproto._itemize = function( elems ) {\n\n var itemElems = this._filterFindItemElements( elems );\n var Item = this.constructor.Item;\n\n // create new Outlayer Items for collection\n var items = [];\n for ( var i=0; i < itemElems.length; i++ ) {\n var elem = itemElems[i];\n var item = new Item( elem, this );\n items.push( item );\n }\n\n return items;\n};\n\n/**\n * get item elements to be used in layout\n * @param {Array or NodeList or HTMLElement} elems\n * @returns {Array} items - item elements\n */\nproto._filterFindItemElements = function( elems ) {\n return utils.filterFindElements( elems, this.options.itemSelector );\n};\n\n/**\n * getter method for getting item elements\n * @returns {Array} elems - collection of item elements\n */\nproto.getItemElements = function() {\n return this.items.map( function( item ) {\n return item.element;\n });\n};\n\n// ----- init & layout ----- //\n\n/**\n * lays out all items\n */\nproto.layout = function() {\n this._resetLayout();\n this._manageStamps();\n\n // don't animate first layout\n var layoutInstant = this._getOption('layoutInstant');\n var isInstant = layoutInstant !== undefined ?\n layoutInstant : !this._isLayoutInited;\n this.layoutItems( this.items, isInstant );\n\n // flag for initalized\n this._isLayoutInited = true;\n};\n\n// _init is alias for layout\nproto._init = proto.layout;\n\n/**\n * logic before any new layout\n */\nproto._resetLayout = function() {\n this.getSize();\n};\n\n\nproto.getSize = function() {\n this.size = getSize( this.element );\n};\n\n/**\n * get measurement from option, for columnWidth, rowHeight, gutter\n * if option is String -> get element from selector string, & get size of element\n * if option is Element -> get size of element\n * else use option as a number\n *\n * @param {String} measurement\n * @param {String} size - width or height\n * @private\n */\nproto._getMeasurement = function( measurement, size ) {\n var option = this.options[ measurement ];\n var elem;\n if ( !option ) {\n // default to 0\n this[ measurement ] = 0;\n } else {\n // use option as an element\n if ( typeof option == 'string' ) {\n elem = this.element.querySelector( option );\n } else if ( option instanceof HTMLElement ) {\n elem = option;\n }\n // use size of element, if element\n this[ measurement ] = elem ? getSize( elem )[ size ] : option;\n }\n};\n\n/**\n * layout a collection of item elements\n * @api public\n */\nproto.layoutItems = function( items, isInstant ) {\n items = this._getItemsForLayout( items );\n\n this._layoutItems( items, isInstant );\n\n this._postLayout();\n};\n\n/**\n * get the items to be laid out\n * you may want to skip over some items\n * @param {Array} items\n * @returns {Array} items\n */\nproto._getItemsForLayout = function( items ) {\n return items.filter( function( item ) {\n return !item.isIgnored;\n });\n};\n\n/**\n * layout items\n * @param {Array} items\n * @param {Boolean} isInstant\n */\nproto._layoutItems = function( items, isInstant ) {\n this._emitCompleteOnItems( 'layout', items );\n\n if ( !items || !items.length ) {\n // no items, emit event with empty array\n return;\n }\n\n var queue = [];\n\n items.forEach( function( item ) {\n // get x/y object from method\n var position = this._getItemLayoutPosition( item );\n // enqueue\n position.item = item;\n position.isInstant = isInstant || item.isLayoutInstant;\n queue.push( position );\n }, this );\n\n this._processLayoutQueue( queue );\n};\n\n/**\n * get item layout position\n * @param {Outlayer.Item} item\n * @returns {Object} x and y position\n */\nproto._getItemLayoutPosition = function( /* item */ ) {\n return {\n x: 0,\n y: 0\n };\n};\n\n/**\n * iterate over array and position each item\n * Reason being - separating this logic prevents 'layout invalidation'\n * thx @paul_irish\n * @param {Array} queue\n */\nproto._processLayoutQueue = function( queue ) {\n this.updateStagger();\n queue.forEach( function( obj, i ) {\n this._positionItem( obj.item, obj.x, obj.y, obj.isInstant, i );\n }, this );\n};\n\n// set stagger from option in milliseconds number\nproto.updateStagger = function() {\n var stagger = this.options.stagger;\n if ( stagger === null || stagger === undefined ) {\n this.stagger = 0;\n return;\n }\n this.stagger = getMilliseconds( stagger );\n return this.stagger;\n};\n\n/**\n * Sets position of item in DOM\n * @param {Outlayer.Item} item\n * @param {Number} x - horizontal position\n * @param {Number} y - vertical position\n * @param {Boolean} isInstant - disables transitions\n */\nproto._positionItem = function( item, x, y, isInstant, i ) {\n if ( isInstant ) {\n // if not transition, just set CSS\n item.goTo( x, y );\n } else {\n item.stagger( i * this.stagger );\n item.moveTo( x, y );\n }\n};\n\n/**\n * Any logic you want to do after each layout,\n * i.e. size the container\n */\nproto._postLayout = function() {\n this.resizeContainer();\n};\n\nproto.resizeContainer = function() {\n var isResizingContainer = this._getOption('resizeContainer');\n if ( !isResizingContainer ) {\n return;\n }\n var size = this._getContainerSize();\n if ( size ) {\n this._setContainerMeasure( size.width, true );\n this._setContainerMeasure( size.height, false );\n }\n};\n\n/**\n * Sets width or height of container if returned\n * @returns {Object} size\n * @param {Number} width\n * @param {Number} height\n */\nproto._getContainerSize = noop;\n\n/**\n * @param {Number} measure - size of width or height\n * @param {Boolean} isWidth\n */\nproto._setContainerMeasure = function( measure, isWidth ) {\n if ( measure === undefined ) {\n return;\n }\n\n var elemSize = this.size;\n // add padding and border width if border box\n if ( elemSize.isBorderBox ) {\n measure += isWidth ? elemSize.paddingLeft + elemSize.paddingRight +\n elemSize.borderLeftWidth + elemSize.borderRightWidth :\n elemSize.paddingBottom + elemSize.paddingTop +\n elemSize.borderTopWidth + elemSize.borderBottomWidth;\n }\n\n measure = Math.max( measure, 0 );\n this.element.style[ isWidth ? 'width' : 'height' ] = measure + 'px';\n};\n\n/**\n * emit eventComplete on a collection of items events\n * @param {String} eventName\n * @param {Array} items - Outlayer.Items\n */\nproto._emitCompleteOnItems = function( eventName, items ) {\n var _this = this;\n function onComplete() {\n _this.dispatchEvent( eventName + 'Complete', null, [ items ] );\n }\n\n var count = items.length;\n if ( !items || !count ) {\n onComplete();\n return;\n }\n\n var doneCount = 0;\n function tick() {\n doneCount++;\n if ( doneCount == count ) {\n onComplete();\n }\n }\n\n // bind callback\n items.forEach( function( item ) {\n item.once( eventName, tick );\n });\n};\n\n/**\n * emits events via EvEmitter and jQuery events\n * @param {String} type - name of event\n * @param {Event} event - original event\n * @param {Array} args - extra arguments\n */\nproto.dispatchEvent = function( type, event, args ) {\n // add original event to arguments\n var emitArgs = event ? [ event ].concat( args ) : args;\n this.emitEvent( type, emitArgs );\n\n if ( jQuery ) {\n // set this.$element\n this.$element = this.$element || jQuery( this.element );\n if ( event ) {\n // create jQuery event\n var $event = jQuery.Event( event );\n $event.type = type;\n this.$element.trigger( $event, args );\n } else {\n // just trigger with type if no event available\n this.$element.trigger( type, args );\n }\n }\n};\n\n// -------------------------- ignore & stamps -------------------------- //\n\n\n/**\n * keep item in collection, but do not lay it out\n * ignored items do not get skipped in layout\n * @param {Element} elem\n */\nproto.ignore = function( elem ) {\n var item = this.getItem( elem );\n if ( item ) {\n item.isIgnored = true;\n }\n};\n\n/**\n * return item to layout collection\n * @param {Element} elem\n */\nproto.unignore = function( elem ) {\n var item = this.getItem( elem );\n if ( item ) {\n delete item.isIgnored;\n }\n};\n\n/**\n * adds elements to stamps\n * @param {NodeList, Array, Element, or String} elems\n */\nproto.stamp = function( elems ) {\n elems = this._find( elems );\n if ( !elems ) {\n return;\n }\n\n this.stamps = this.stamps.concat( elems );\n // ignore\n elems.forEach( this.ignore, this );\n};\n\n/**\n * removes elements to stamps\n * @param {NodeList, Array, or Element} elems\n */\nproto.unstamp = function( elems ) {\n elems = this._find( elems );\n if ( !elems ){\n return;\n }\n\n elems.forEach( function( elem ) {\n // filter out removed stamp elements\n utils.removeFrom( this.stamps, elem );\n this.unignore( elem );\n }, this );\n};\n\n/**\n * finds child elements\n * @param {NodeList, Array, Element, or String} elems\n * @returns {Array} elems\n */\nproto._find = function( elems ) {\n if ( !elems ) {\n return;\n }\n // if string, use argument as selector string\n if ( typeof elems == 'string' ) {\n elems = this.element.querySelectorAll( elems );\n }\n elems = utils.makeArray( elems );\n return elems;\n};\n\nproto._manageStamps = function() {\n if ( !this.stamps || !this.stamps.length ) {\n return;\n }\n\n this._getBoundingRect();\n\n this.stamps.forEach( this._manageStamp, this );\n};\n\n// update boundingLeft / Top\nproto._getBoundingRect = function() {\n // get bounding rect for container element\n var boundingRect = this.element.getBoundingClientRect();\n var size = this.size;\n this._boundingRect = {\n left: boundingRect.left + size.paddingLeft + size.borderLeftWidth,\n top: boundingRect.top + size.paddingTop + size.borderTopWidth,\n right: boundingRect.right - ( size.paddingRight + size.borderRightWidth ),\n bottom: boundingRect.bottom - ( size.paddingBottom + size.borderBottomWidth )\n };\n};\n\n/**\n * @param {Element} stamp\n**/\nproto._manageStamp = noop;\n\n/**\n * get x/y position of element relative to container element\n * @param {Element} elem\n * @returns {Object} offset - has left, top, right, bottom\n */\nproto._getElementOffset = function( elem ) {\n var boundingRect = elem.getBoundingClientRect();\n var thisRect = this._boundingRect;\n var size = getSize( elem );\n var offset = {\n left: boundingRect.left - thisRect.left - size.marginLeft,\n top: boundingRect.top - thisRect.top - size.marginTop,\n right: thisRect.right - boundingRect.right - size.marginRight,\n bottom: thisRect.bottom - boundingRect.bottom - size.marginBottom\n };\n return offset;\n};\n\n// -------------------------- resize -------------------------- //\n\n// enable event handlers for listeners\n// i.e. resize -> onresize\nproto.handleEvent = utils.handleEvent;\n\n/**\n * Bind layout to window resizing\n */\nproto.bindResize = function() {\n window.addEventListener( 'resize', this );\n this.isResizeBound = true;\n};\n\n/**\n * Unbind layout to window resizing\n */\nproto.unbindResize = function() {\n window.removeEventListener( 'resize', this );\n this.isResizeBound = false;\n};\n\nproto.onresize = function() {\n this.resize();\n};\n\nutils.debounceMethod( Outlayer, 'onresize', 100 );\n\nproto.resize = function() {\n // don't trigger if size did not change\n // or if resize was unbound. See #9\n if ( !this.isResizeBound || !this.needsResizeLayout() ) {\n return;\n }\n\n this.layout();\n};\n\n/**\n * check if layout is needed post layout\n * @returns Boolean\n */\nproto.needsResizeLayout = function() {\n var size = getSize( this.element );\n // check that this.size and size are there\n // IE8 triggers resize on body size change, so they might not be\n var hasSizes = this.size && size;\n return hasSizes && size.innerWidth !== this.size.innerWidth;\n};\n\n// -------------------------- methods -------------------------- //\n\n/**\n * add items to Outlayer instance\n * @param {Array or NodeList or Element} elems\n * @returns {Array} items - Outlayer.Items\n**/\nproto.addItems = function( elems ) {\n var items = this._itemize( elems );\n // add items to collection\n if ( items.length ) {\n this.items = this.items.concat( items );\n }\n return items;\n};\n\n/**\n * Layout newly-appended item elements\n * @param {Array or NodeList or Element} elems\n */\nproto.appended = function( elems ) {\n var items = this.addItems( elems );\n if ( !items.length ) {\n return;\n }\n // layout and reveal just the new items\n this.layoutItems( items, true );\n this.reveal( items );\n};\n\n/**\n * Layout prepended elements\n * @param {Array or NodeList or Element} elems\n */\nproto.prepended = function( elems ) {\n var items = this._itemize( elems );\n if ( !items.length ) {\n return;\n }\n // add items to beginning of collection\n var previousItems = this.items.slice(0);\n this.items = items.concat( previousItems );\n // start new layout\n this._resetLayout();\n this._manageStamps();\n // layout new stuff without transition\n this.layoutItems( items, true );\n this.reveal( items );\n // layout previous items\n this.layoutItems( previousItems );\n};\n\n/**\n * reveal a collection of items\n * @param {Array of Outlayer.Items} items\n */\nproto.reveal = function( items ) {\n this._emitCompleteOnItems( 'reveal', items );\n if ( !items || !items.length ) {\n return;\n }\n var stagger = this.updateStagger();\n items.forEach( function( item, i ) {\n item.stagger( i * stagger );\n item.reveal();\n });\n};\n\n/**\n * hide a collection of items\n * @param {Array of Outlayer.Items} items\n */\nproto.hide = function( items ) {\n this._emitCompleteOnItems( 'hide', items );\n if ( !items || !items.length ) {\n return;\n }\n var stagger = this.updateStagger();\n items.forEach( function( item, i ) {\n item.stagger( i * stagger );\n item.hide();\n });\n};\n\n/**\n * reveal item elements\n * @param {Array}, {Element}, {NodeList} items\n */\nproto.revealItemElements = function( elems ) {\n var items = this.getItems( elems );\n this.reveal( items );\n};\n\n/**\n * hide item elements\n * @param {Array}, {Element}, {NodeList} items\n */\nproto.hideItemElements = function( elems ) {\n var items = this.getItems( elems );\n this.hide( items );\n};\n\n/**\n * get Outlayer.Item, given an Element\n * @param {Element} elem\n * @param {Function} callback\n * @returns {Outlayer.Item} item\n */\nproto.getItem = function( elem ) {\n // loop through items to get the one that matches\n for ( var i=0; i < this.items.length; i++ ) {\n var item = this.items[i];\n if ( item.element == elem ) {\n // return item\n return item;\n }\n }\n};\n\n/**\n * get collection of Outlayer.Items, given Elements\n * @param {Array} elems\n * @returns {Array} items - Outlayer.Items\n */\nproto.getItems = function( elems ) {\n elems = utils.makeArray( elems );\n var items = [];\n elems.forEach( function( elem ) {\n var item = this.getItem( elem );\n if ( item ) {\n items.push( item );\n }\n }, this );\n\n return items;\n};\n\n/**\n * remove element(s) from instance and DOM\n * @param {Array or NodeList or Element} elems\n */\nproto.remove = function( elems ) {\n var removeItems = this.getItems( elems );\n\n this._emitCompleteOnItems( 'remove', removeItems );\n\n // bail if no items to remove\n if ( !removeItems || !removeItems.length ) {\n return;\n }\n\n removeItems.forEach( function( item ) {\n item.remove();\n // remove item from collection\n utils.removeFrom( this.items, item );\n }, this );\n};\n\n// ----- destroy ----- //\n\n// remove and disable Outlayer instance\nproto.destroy = function() {\n // clean up dynamic styles\n var style = this.element.style;\n style.height = '';\n style.position = '';\n style.width = '';\n // destroy items\n this.items.forEach( function( item ) {\n item.destroy();\n });\n\n this.unbindResize();\n\n var id = this.element.outlayerGUID;\n delete instances[ id ]; // remove reference to instance by id\n delete this.element.outlayerGUID;\n // remove data for jQuery\n if ( jQuery ) {\n jQuery.removeData( this.element, this.constructor.namespace );\n }\n\n};\n\n// -------------------------- data -------------------------- //\n\n/**\n * get Outlayer instance from element\n * @param {Element} elem\n * @returns {Outlayer}\n */\nOutlayer.data = function( elem ) {\n elem = utils.getQueryElement( elem );\n var id = elem && elem.outlayerGUID;\n return id && instances[ id ];\n};\n\n\n// -------------------------- create Outlayer class -------------------------- //\n\n/**\n * create a layout class\n * @param {String} namespace\n */\nOutlayer.create = function( namespace, options ) {\n // sub-class Outlayer\n var Layout = subclass( Outlayer );\n // apply new options and compatOptions\n Layout.defaults = utils.extend( {}, Outlayer.defaults );\n utils.extend( Layout.defaults, options );\n Layout.compatOptions = utils.extend( {}, Outlayer.compatOptions );\n\n Layout.namespace = namespace;\n\n Layout.data = Outlayer.data;\n\n // sub-class Item\n Layout.Item = subclass( Item );\n\n // -------------------------- declarative -------------------------- //\n\n utils.htmlInit( Layout, namespace );\n\n // -------------------------- jQuery bridge -------------------------- //\n\n // make into jQuery plugin\n if ( jQuery && jQuery.bridget ) {\n jQuery.bridget( namespace, Layout );\n }\n\n return Layout;\n};\n\nfunction subclass( Parent ) {\n function SubClass() {\n Parent.apply( this, arguments );\n }\n\n SubClass.prototype = Object.create( Parent.prototype );\n SubClass.prototype.constructor = SubClass;\n\n return SubClass;\n}\n\n// ----- helpers ----- //\n\n// how many milliseconds are in each unit\nvar msUnits = {\n ms: 1,\n s: 1000\n};\n\n// munge time-like parameter into millisecond number\n// '0.4s' -> 40\nfunction getMilliseconds( time ) {\n if ( typeof time == 'number' ) {\n return time;\n }\n var matches = time.match( /(^\\d*\\.?\\d*)(\\w*)/ );\n var num = matches && matches[1];\n var unit = matches && matches[2];\n if ( !num.length ) {\n return 0;\n }\n num = parseFloat( num );\n var mult = msUnits[ unit ] || 1;\n return num * mult;\n}\n\n// ----- fin ----- //\n\n// back in global\nOutlayer.Item = Item;\n\nreturn Outlayer;\n\n}));\n\n/**\n * Isotope Item\n**/\n\n( function( window, factory ) {\n // universal module definition\n /* jshint strict: false */ /*globals define, module, require */\n if ( true ) {\n // AMD\n !(__WEBPACK_AMD_DEFINE_ARRAY__ = [\n __WEBPACK_LOCAL_MODULE_6__\n ], __WEBPACK_AMD_DEFINE_FACTORY__ = (factory),\n\t\t\t\t__WEBPACK_LOCAL_MODULE_7__ = (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === 'function' ?\n\t\t\t\t(__WEBPACK_AMD_DEFINE_FACTORY__.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__)) : __WEBPACK_AMD_DEFINE_FACTORY__));\n } else if ( typeof module == 'object' && module.exports ) {\n // CommonJS\n module.exports = factory(\n require('outlayer')\n );\n } else {\n // browser global\n window.Isotope = window.Isotope || {};\n window.Isotope.Item = factory(\n window.Outlayer\n );\n }\n\n}( window, function factory( Outlayer ) {\n'use strict';\n\n// -------------------------- Item -------------------------- //\n\n// sub-class Outlayer Item\nfunction Item() {\n Outlayer.Item.apply( this, arguments );\n}\n\nvar proto = Item.prototype = Object.create( Outlayer.Item.prototype );\n\nvar _create = proto._create;\nproto._create = function() {\n // assign id, used for original-order sorting\n this.id = this.layout.itemGUID++;\n _create.call( this );\n this.sortData = {};\n};\n\nproto.updateSortData = function() {\n if ( this.isIgnored ) {\n return;\n }\n // default sorters\n this.sortData.id = this.id;\n // for backward compatibility\n this.sortData['original-order'] = this.id;\n this.sortData.random = Math.random();\n // go thru getSortData obj and apply the sorters\n var getSortData = this.layout.options.getSortData;\n var sorters = this.layout._sorters;\n for ( var key in getSortData ) {\n var sorter = sorters[ key ];\n this.sortData[ key ] = sorter( this.element, this );\n }\n};\n\nvar _destroy = proto.destroy;\nproto.destroy = function() {\n // call super\n _destroy.apply( this, arguments );\n // reset display, #741\n this.css({\n display: ''\n });\n};\n\nreturn Item;\n\n}));\n\n/**\n * Isotope LayoutMode\n */\n\n( function( window, factory ) {\n // universal module definition\n /* jshint strict: false */ /*globals define, module, require */\n if ( true ) {\n // AMD\n !(__WEBPACK_AMD_DEFINE_ARRAY__ = [\n __WEBPACK_LOCAL_MODULE_2__,\n __WEBPACK_LOCAL_MODULE_6__\n ], __WEBPACK_AMD_DEFINE_FACTORY__ = (factory),\n\t\t\t\t__WEBPACK_LOCAL_MODULE_8__ = (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === 'function' ?\n\t\t\t\t(__WEBPACK_AMD_DEFINE_FACTORY__.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__)) : __WEBPACK_AMD_DEFINE_FACTORY__));\n } else if ( typeof module == 'object' && module.exports ) {\n // CommonJS\n module.exports = factory(\n require('get-size'),\n require('outlayer')\n );\n } else {\n // browser global\n window.Isotope = window.Isotope || {};\n window.Isotope.LayoutMode = factory(\n window.getSize,\n window.Outlayer\n );\n }\n\n}( window, function factory( getSize, Outlayer ) {\n 'use strict';\n\n // layout mode class\n function LayoutMode( isotope ) {\n this.isotope = isotope;\n // link properties\n if ( isotope ) {\n this.options = isotope.options[ this.namespace ];\n this.element = isotope.element;\n this.items = isotope.filteredItems;\n this.size = isotope.size;\n }\n }\n\n var proto = LayoutMode.prototype;\n\n /**\n * some methods should just defer to default Outlayer method\n * and reference the Isotope instance as `this`\n **/\n var facadeMethods = [\n '_resetLayout',\n '_getItemLayoutPosition',\n '_manageStamp',\n '_getContainerSize',\n '_getElementOffset',\n 'needsResizeLayout',\n '_getOption'\n ];\n\n facadeMethods.forEach( function( methodName ) {\n proto[ methodName ] = function() {\n return Outlayer.prototype[ methodName ].apply( this.isotope, arguments );\n };\n });\n\n // ----- ----- //\n\n // for horizontal layout modes, check vertical size\n proto.needsVerticalResizeLayout = function() {\n // don't trigger if size did not change\n var size = getSize( this.isotope.element );\n // check that this.size and size are there\n // IE8 triggers resize on body size change, so they might not be\n var hasSizes = this.isotope.size && size;\n return hasSizes && size.innerHeight != this.isotope.size.innerHeight;\n };\n\n // ----- measurements ----- //\n\n proto._getMeasurement = function() {\n this.isotope._getMeasurement.apply( this, arguments );\n };\n\n proto.getColumnWidth = function() {\n this.getSegmentSize( 'column', 'Width' );\n };\n\n proto.getRowHeight = function() {\n this.getSegmentSize( 'row', 'Height' );\n };\n\n /**\n * get columnWidth or rowHeight\n * segment: 'column' or 'row'\n * size 'Width' or 'Height'\n **/\n proto.getSegmentSize = function( segment, size ) {\n var segmentName = segment + size;\n var outerSize = 'outer' + size;\n // columnWidth / outerWidth // rowHeight / outerHeight\n this._getMeasurement( segmentName, outerSize );\n // got rowHeight or columnWidth, we can chill\n if ( this[ segmentName ] ) {\n return;\n }\n // fall back to item of first element\n var firstItemSize = this.getFirstItemSize();\n this[ segmentName ] = firstItemSize && firstItemSize[ outerSize ] ||\n // or size of container\n this.isotope.size[ 'inner' + size ];\n };\n\n proto.getFirstItemSize = function() {\n var firstItem = this.isotope.filteredItems[0];\n return firstItem && firstItem.element && getSize( firstItem.element );\n };\n\n // ----- methods that should reference isotope ----- //\n\n proto.layout = function() {\n this.isotope.layout.apply( this.isotope, arguments );\n };\n\n proto.getSize = function() {\n this.isotope.getSize();\n this.size = this.isotope.size;\n };\n\n // -------------------------- create -------------------------- //\n\n LayoutMode.modes = {};\n\n LayoutMode.create = function( namespace, options ) {\n\n function Mode() {\n LayoutMode.apply( this, arguments );\n }\n\n Mode.prototype = Object.create( proto );\n Mode.prototype.constructor = Mode;\n\n // default options\n if ( options ) {\n Mode.options = options;\n }\n\n Mode.prototype.namespace = namespace;\n // register in Isotope\n LayoutMode.modes[ namespace ] = Mode;\n\n return Mode;\n };\n\n return LayoutMode;\n\n}));\n\n/*!\n * Masonry v4.2.0\n * Cascading grid layout library\n * http://masonry.desandro.com\n * MIT License\n * by David DeSandro\n */\n\n( function( window, factory ) {\n // universal module definition\n /* jshint strict: false */ /*globals define, module, require */\n if ( true ) {\n // AMD\n !(__WEBPACK_AMD_DEFINE_ARRAY__ = [\n __WEBPACK_LOCAL_MODULE_6__,\n __WEBPACK_LOCAL_MODULE_2__\n ], __WEBPACK_AMD_DEFINE_FACTORY__ = (factory),\n\t\t\t\t__WEBPACK_LOCAL_MODULE_9__ = (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === 'function' ?\n\t\t\t\t(__WEBPACK_AMD_DEFINE_FACTORY__.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__)) : __WEBPACK_AMD_DEFINE_FACTORY__));\n } else if ( typeof module == 'object' && module.exports ) {\n // CommonJS\n module.exports = factory(\n require('outlayer'),\n require('get-size')\n );\n } else {\n // browser global\n window.Masonry = factory(\n window.Outlayer,\n window.getSize\n );\n }\n\n}( window, function factory( Outlayer, getSize ) {\n\n\n\n// -------------------------- masonryDefinition -------------------------- //\n\n // create an Outlayer layout class\n var Masonry = Outlayer.create('masonry');\n // isFitWidth -> fitWidth\n Masonry.compatOptions.fitWidth = 'isFitWidth';\n\n var proto = Masonry.prototype;\n\n proto._resetLayout = function() {\n this.getSize();\n this._getMeasurement( 'columnWidth', 'outerWidth' );\n this._getMeasurement( 'gutter', 'outerWidth' );\n this.measureColumns();\n\n // reset column Y\n this.colYs = [];\n for ( var i=0; i < this.cols; i++ ) {\n this.colYs.push( 0 );\n }\n\n this.maxY = 0;\n this.horizontalColIndex = 0;\n };\n\n proto.measureColumns = function() {\n this.getContainerWidth();\n // if columnWidth is 0, default to outerWidth of first item\n if ( !this.columnWidth ) {\n var firstItem = this.items[0];\n var firstItemElem = firstItem && firstItem.element;\n // columnWidth fall back to item of first element\n this.columnWidth = firstItemElem && getSize( firstItemElem ).outerWidth ||\n // if first elem has no width, default to size of container\n this.containerWidth;\n }\n\n var columnWidth = this.columnWidth += this.gutter;\n\n // calculate columns\n var containerWidth = this.containerWidth + this.gutter;\n var cols = containerWidth / columnWidth;\n // fix rounding errors, typically with gutters\n var excess = columnWidth - containerWidth % columnWidth;\n // if overshoot is less than a pixel, round up, otherwise floor it\n var mathMethod = excess && excess < 1 ? 'round' : 'floor';\n cols = Math[ mathMethod ]( cols );\n this.cols = Math.max( cols, 1 );\n };\n\n proto.getContainerWidth = function() {\n // container is parent if fit width\n var isFitWidth = this._getOption('fitWidth');\n var container = isFitWidth ? this.element.parentNode : this.element;\n // check that this.size and size are there\n // IE8 triggers resize on body size change, so they might not be\n var size = getSize( container );\n this.containerWidth = size && size.innerWidth;\n };\n\n proto._getItemLayoutPosition = function( item ) {\n item.getSize();\n // how many columns does this brick span\n var remainder = item.size.outerWidth % this.columnWidth;\n var mathMethod = remainder && remainder < 1 ? 'round' : 'ceil';\n // round if off by 1 pixel, otherwise use ceil\n var colSpan = Math[ mathMethod ]( item.size.outerWidth / this.columnWidth );\n colSpan = Math.min( colSpan, this.cols );\n // use horizontal or top column position\n var colPosMethod = this.options.horizontalOrder ?\n '_getHorizontalColPosition' : '_getTopColPosition';\n var colPosition = this[ colPosMethod ]( colSpan, item );\n // position the brick\n var position = {\n x: this.columnWidth * colPosition.col,\n y: colPosition.y\n };\n // apply setHeight to necessary columns\n var setHeight = colPosition.y + item.size.outerHeight;\n var setMax = colSpan + colPosition.col;\n for ( var i = colPosition.col; i < setMax; i++ ) {\n this.colYs[i] = setHeight;\n }\n\n return position;\n };\n\n proto._getTopColPosition = function( colSpan ) {\n var colGroup = this._getTopColGroup( colSpan );\n // get the minimum Y value from the columns\n var minimumY = Math.min.apply( Math, colGroup );\n\n return {\n col: colGroup.indexOf( minimumY ),\n y: minimumY,\n };\n };\n\n /**\n * @param {Number} colSpan - number of columns the element spans\n * @returns {Array} colGroup\n */\n proto._getTopColGroup = function( colSpan ) {\n if ( colSpan < 2 ) {\n // if brick spans only one column, use all the column Ys\n return this.colYs;\n }\n\n var colGroup = [];\n // how many different places could this brick fit horizontally\n var groupCount = this.cols + 1 - colSpan;\n // for each group potential horizontal position\n for ( var i = 0; i < groupCount; i++ ) {\n colGroup[i] = this._getColGroupY( i, colSpan );\n }\n return colGroup;\n };\n\n proto._getColGroupY = function( col, colSpan ) {\n if ( colSpan < 2 ) {\n return this.colYs[ col ];\n }\n // make an array of colY values for that one group\n var groupColYs = this.colYs.slice( col, col + colSpan );\n // and get the max value of the array\n return Math.max.apply( Math, groupColYs );\n };\n\n // get column position based on horizontal index. #873\n proto._getHorizontalColPosition = function( colSpan, item ) {\n var col = this.horizontalColIndex % this.cols;\n var isOver = colSpan > 1 && col + colSpan > this.cols;\n // shift to next row if item can't fit on current row\n col = isOver ? 0 : col;\n // don't let zero-size items take up space\n var hasSize = item.size.outerWidth && item.size.outerHeight;\n this.horizontalColIndex = hasSize ? col + colSpan : this.horizontalColIndex;\n\n return {\n col: col,\n y: this._getColGroupY( col, colSpan ),\n };\n };\n\n proto._manageStamp = function( stamp ) {\n var stampSize = getSize( stamp );\n var offset = this._getElementOffset( stamp );\n // get the columns that this stamp affects\n var isOriginLeft = this._getOption('originLeft');\n var firstX = isOriginLeft ? offset.left : offset.right;\n var lastX = firstX + stampSize.outerWidth;\n var firstCol = Math.floor( firstX / this.columnWidth );\n firstCol = Math.max( 0, firstCol );\n var lastCol = Math.floor( lastX / this.columnWidth );\n // lastCol should not go over if multiple of columnWidth #425\n lastCol -= lastX % this.columnWidth ? 0 : 1;\n lastCol = Math.min( this.cols - 1, lastCol );\n // set colYs to bottom of the stamp\n\n var isOriginTop = this._getOption('originTop');\n var stampMaxY = ( isOriginTop ? offset.top : offset.bottom ) +\n stampSize.outerHeight;\n for ( var i = firstCol; i <= lastCol; i++ ) {\n this.colYs[i] = Math.max( stampMaxY, this.colYs[i] );\n }\n };\n\n proto._getContainerSize = function() {\n this.maxY = Math.max.apply( Math, this.colYs );\n var size = {\n height: this.maxY\n };\n\n if ( this._getOption('fitWidth') ) {\n size.width = this._getContainerFitWidth();\n }\n\n return size;\n };\n\n proto._getContainerFitWidth = function() {\n var unusedCols = 0;\n // count unused columns\n var i = this.cols;\n while ( --i ) {\n if ( this.colYs[i] !== 0 ) {\n break;\n }\n unusedCols++;\n }\n // fit container to columns that have been used\n return ( this.cols - unusedCols ) * this.columnWidth - this.gutter;\n };\n\n proto.needsResizeLayout = function() {\n var previousWidth = this.containerWidth;\n this.getContainerWidth();\n return previousWidth != this.containerWidth;\n };\n\n return Masonry;\n\n}));\n\n/*!\n * Masonry layout mode\n * sub-classes Masonry\n * http://masonry.desandro.com\n */\n\n( function( window, factory ) {\n // universal module definition\n /* jshint strict: false */ /*globals define, module, require */\n if ( true ) {\n // AMD\n !(__WEBPACK_AMD_DEFINE_ARRAY__ = [\n __WEBPACK_LOCAL_MODULE_8__,\n __WEBPACK_LOCAL_MODULE_9__\n ], __WEBPACK_AMD_DEFINE_FACTORY__ = (factory),\n\t\t\t\t__WEBPACK_LOCAL_MODULE_10__ = (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === 'function' ?\n\t\t\t\t(__WEBPACK_AMD_DEFINE_FACTORY__.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__)) : __WEBPACK_AMD_DEFINE_FACTORY__));\n } else if ( typeof module == 'object' && module.exports ) {\n // CommonJS\n module.exports = factory(\n require('../layout-mode'),\n require('masonry-layout')\n );\n } else {\n // browser global\n factory(\n window.Isotope.LayoutMode,\n window.Masonry\n );\n }\n\n}( window, function factory( LayoutMode, Masonry ) {\n'use strict';\n\n// -------------------------- masonryDefinition -------------------------- //\n\n // create an Outlayer layout class\n var MasonryMode = LayoutMode.create('masonry');\n\n var proto = MasonryMode.prototype;\n\n var keepModeMethods = {\n _getElementOffset: true,\n layout: true,\n _getMeasurement: true\n };\n\n // inherit Masonry prototype\n for ( var method in Masonry.prototype ) {\n // do not inherit mode methods\n if ( !keepModeMethods[ method ] ) {\n proto[ method ] = Masonry.prototype[ method ];\n }\n }\n\n var measureColumns = proto.measureColumns;\n proto.measureColumns = function() {\n // set items, used if measuring first item\n this.items = this.isotope.filteredItems;\n measureColumns.call( this );\n };\n\n // point to mode options for fitWidth\n var _getOption = proto._getOption;\n proto._getOption = function( option ) {\n if ( option == 'fitWidth' ) {\n return this.options.isFitWidth !== undefined ?\n this.options.isFitWidth : this.options.fitWidth;\n }\n return _getOption.apply( this.isotope, arguments );\n };\n\n return MasonryMode;\n\n}));\n\n/**\n * fitRows layout mode\n */\n\n( function( window, factory ) {\n // universal module definition\n /* jshint strict: false */ /*globals define, module, require */\n if ( true ) {\n // AMD\n !(__WEBPACK_AMD_DEFINE_ARRAY__ = [\n __WEBPACK_LOCAL_MODULE_8__\n ], __WEBPACK_AMD_DEFINE_FACTORY__ = (factory),\n\t\t\t\t__WEBPACK_LOCAL_MODULE_11__ = (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === 'function' ?\n\t\t\t\t(__WEBPACK_AMD_DEFINE_FACTORY__.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__)) : __WEBPACK_AMD_DEFINE_FACTORY__));\n } else if ( typeof exports == 'object' ) {\n // CommonJS\n module.exports = factory(\n require('../layout-mode')\n );\n } else {\n // browser global\n factory(\n window.Isotope.LayoutMode\n );\n }\n\n}( window, function factory( LayoutMode ) {\n'use strict';\n\nvar FitRows = LayoutMode.create('fitRows');\n\nvar proto = FitRows.prototype;\n\nproto._resetLayout = function() {\n this.x = 0;\n this.y = 0;\n this.maxY = 0;\n this._getMeasurement( 'gutter', 'outerWidth' );\n};\n\nproto._getItemLayoutPosition = function( item ) {\n item.getSize();\n\n var itemWidth = item.size.outerWidth + this.gutter;\n // if this element cannot fit in the current row\n var containerWidth = this.isotope.size.innerWidth + this.gutter;\n if ( this.x !== 0 && itemWidth + this.x > containerWidth ) {\n this.x = 0;\n this.y = this.maxY;\n }\n\n var position = {\n x: this.x,\n y: this.y\n };\n\n this.maxY = Math.max( this.maxY, this.y + item.size.outerHeight );\n this.x += itemWidth;\n\n return position;\n};\n\nproto._getContainerSize = function() {\n return { height: this.maxY };\n};\n\nreturn FitRows;\n\n}));\n\n/**\n * vertical layout mode\n */\n\n( function( window, factory ) {\n // universal module definition\n /* jshint strict: false */ /*globals define, module, require */\n if ( true ) {\n // AMD\n !(__WEBPACK_AMD_DEFINE_ARRAY__ = [\n __WEBPACK_LOCAL_MODULE_8__\n ], __WEBPACK_AMD_DEFINE_FACTORY__ = (factory),\n\t\t\t\t__WEBPACK_LOCAL_MODULE_12__ = (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === 'function' ?\n\t\t\t\t(__WEBPACK_AMD_DEFINE_FACTORY__.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__)) : __WEBPACK_AMD_DEFINE_FACTORY__));\n } else if ( typeof module == 'object' && module.exports ) {\n // CommonJS\n module.exports = factory(\n require('../layout-mode')\n );\n } else {\n // browser global\n factory(\n window.Isotope.LayoutMode\n );\n }\n\n}( window, function factory( LayoutMode ) {\n'use strict';\n\nvar Vertical = LayoutMode.create( 'vertical', {\n horizontalAlignment: 0\n});\n\nvar proto = Vertical.prototype;\n\nproto._resetLayout = function() {\n this.y = 0;\n};\n\nproto._getItemLayoutPosition = function( item ) {\n item.getSize();\n var x = ( this.isotope.size.innerWidth - item.size.outerWidth ) *\n this.options.horizontalAlignment;\n var y = this.y;\n this.y += item.size.outerHeight;\n return { x: x, y: y };\n};\n\nproto._getContainerSize = function() {\n return { height: this.y };\n};\n\nreturn Vertical;\n\n}));\n\n/*!\n * Isotope v3.0.4\n *\n * Licensed GPLv3 for open source use\n * or Isotope Commercial License for commercial use\n *\n * http://isotope.metafizzy.co\n * Copyright 2017 Metafizzy\n */\n\n( function( window, factory ) {\n // universal module definition\n /* jshint strict: false */ /*globals define, module, require */\n if ( true ) {\n // AMD\n !(__WEBPACK_AMD_DEFINE_ARRAY__ = [\n __WEBPACK_LOCAL_MODULE_6__,\n __WEBPACK_LOCAL_MODULE_2__,\n __WEBPACK_LOCAL_MODULE_3__,\n __WEBPACK_LOCAL_MODULE_4__,\n __WEBPACK_LOCAL_MODULE_7__,\n __WEBPACK_LOCAL_MODULE_8__,\n // include default layout modes\n __WEBPACK_LOCAL_MODULE_10__,\n __WEBPACK_LOCAL_MODULE_11__,\n __WEBPACK_LOCAL_MODULE_12__\n ], __WEBPACK_AMD_DEFINE_RESULT__ = function( Outlayer, getSize, matchesSelector, utils, Item, LayoutMode ) {\n return factory( window, Outlayer, getSize, matchesSelector, utils, Item, LayoutMode );\n }.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n } else if ( typeof module == 'object' && module.exports ) {\n // CommonJS\n module.exports = factory(\n window,\n require('outlayer'),\n require('get-size'),\n require('desandro-matches-selector'),\n require('fizzy-ui-utils'),\n require('isotope/js/item'),\n require('isotope/js/layout-mode'),\n // include default layout modes\n require('isotope/js/layout-modes/masonry'),\n require('isotope/js/layout-modes/fit-rows'),\n require('isotope/js/layout-modes/vertical')\n );\n } else {\n // browser global\n window.Isotope = factory(\n window,\n window.Outlayer,\n window.getSize,\n window.matchesSelector,\n window.fizzyUIUtils,\n window.Isotope.Item,\n window.Isotope.LayoutMode\n );\n }\n\n}( window, function factory( window, Outlayer, getSize, matchesSelector, utils,\n Item, LayoutMode ) {\n\n\n\n// -------------------------- vars -------------------------- //\n\nvar jQuery = window.jQuery;\n\n// -------------------------- helpers -------------------------- //\n\nvar trim = String.prototype.trim ?\n function( str ) {\n return str.trim();\n } :\n function( str ) {\n return str.replace( /^\\s+|\\s+$/g, '' );\n };\n\n// -------------------------- isotopeDefinition -------------------------- //\n\n // create an Outlayer layout class\n var Isotope = Outlayer.create( 'isotope', {\n layoutMode: 'masonry',\n isJQueryFiltering: true,\n sortAscending: true\n });\n\n Isotope.Item = Item;\n Isotope.LayoutMode = LayoutMode;\n\n var proto = Isotope.prototype;\n\n proto._create = function() {\n this.itemGUID = 0;\n // functions that sort items\n this._sorters = {};\n this._getSorters();\n // call super\n Outlayer.prototype._create.call( this );\n\n // create layout modes\n this.modes = {};\n // start filteredItems with all items\n this.filteredItems = this.items;\n // keep of track of sortBys\n this.sortHistory = [ 'original-order' ];\n // create from registered layout modes\n for ( var name in LayoutMode.modes ) {\n this._initLayoutMode( name );\n }\n };\n\n proto.reloadItems = function() {\n // reset item ID counter\n this.itemGUID = 0;\n // call super\n Outlayer.prototype.reloadItems.call( this );\n };\n\n proto._itemize = function() {\n var items = Outlayer.prototype._itemize.apply( this, arguments );\n // assign ID for original-order\n for ( var i=0; i < items.length; i++ ) {\n var item = items[i];\n item.id = this.itemGUID++;\n }\n this._updateItemsSortData( items );\n return items;\n };\n\n\n // -------------------------- layout -------------------------- //\n\n proto._initLayoutMode = function( name ) {\n var Mode = LayoutMode.modes[ name ];\n // set mode options\n // HACK extend initial options, back-fill in default options\n var initialOpts = this.options[ name ] || {};\n this.options[ name ] = Mode.options ?\n utils.extend( Mode.options, initialOpts ) : initialOpts;\n // init layout mode instance\n this.modes[ name ] = new Mode( this );\n };\n\n\n proto.layout = function() {\n // if first time doing layout, do all magic\n if ( !this._isLayoutInited && this._getOption('initLayout') ) {\n this.arrange();\n return;\n }\n this._layout();\n };\n\n // private method to be used in layout() & magic()\n proto._layout = function() {\n // don't animate first layout\n var isInstant = this._getIsInstant();\n // layout flow\n this._resetLayout();\n this._manageStamps();\n this.layoutItems( this.filteredItems, isInstant );\n\n // flag for initalized\n this._isLayoutInited = true;\n };\n\n // filter + sort + layout\n proto.arrange = function( opts ) {\n // set any options pass\n this.option( opts );\n this._getIsInstant();\n // filter, sort, and layout\n\n // filter\n var filtered = this._filter( this.items );\n this.filteredItems = filtered.matches;\n\n this._bindArrangeComplete();\n\n if ( this._isInstant ) {\n this._noTransition( this._hideReveal, [ filtered ] );\n } else {\n this._hideReveal( filtered );\n }\n\n this._sort();\n this._layout();\n };\n // alias to _init for main plugin method\n proto._init = proto.arrange;\n\n proto._hideReveal = function( filtered ) {\n this.reveal( filtered.needReveal );\n this.hide( filtered.needHide );\n };\n\n // HACK\n // Don't animate/transition first layout\n // Or don't animate/transition other layouts\n proto._getIsInstant = function() {\n var isLayoutInstant = this._getOption('layoutInstant');\n var isInstant = isLayoutInstant !== undefined ? isLayoutInstant :\n !this._isLayoutInited;\n this._isInstant = isInstant;\n return isInstant;\n };\n\n // listen for layoutComplete, hideComplete and revealComplete\n // to trigger arrangeComplete\n proto._bindArrangeComplete = function() {\n // listen for 3 events to trigger arrangeComplete\n var isLayoutComplete, isHideComplete, isRevealComplete;\n var _this = this;\n function arrangeParallelCallback() {\n if ( isLayoutComplete && isHideComplete && isRevealComplete ) {\n _this.dispatchEvent( 'arrangeComplete', null, [ _this.filteredItems ] );\n }\n }\n this.once( 'layoutComplete', function() {\n isLayoutComplete = true;\n arrangeParallelCallback();\n });\n this.once( 'hideComplete', function() {\n isHideComplete = true;\n arrangeParallelCallback();\n });\n this.once( 'revealComplete', function() {\n isRevealComplete = true;\n arrangeParallelCallback();\n });\n };\n\n // -------------------------- filter -------------------------- //\n\n proto._filter = function( items ) {\n var filter = this.options.filter;\n filter = filter || '*';\n var matches = [];\n var hiddenMatched = [];\n var visibleUnmatched = [];\n\n var test = this._getFilterTest( filter );\n\n // test each item\n for ( var i=0; i < items.length; i++ ) {\n var item = items[i];\n if ( item.isIgnored ) {\n continue;\n }\n // add item to either matched or unmatched group\n var isMatched = test( item );\n // item.isFilterMatched = isMatched;\n // add to matches if its a match\n if ( isMatched ) {\n matches.push( item );\n }\n // add to additional group if item needs to be hidden or revealed\n if ( isMatched && item.isHidden ) {\n hiddenMatched.push( item );\n } else if ( !isMatched && !item.isHidden ) {\n visibleUnmatched.push( item );\n }\n }\n\n // return collections of items to be manipulated\n return {\n matches: matches,\n needReveal: hiddenMatched,\n needHide: visibleUnmatched\n };\n };\n\n // get a jQuery, function, or a matchesSelector test given the filter\n proto._getFilterTest = function( filter ) {\n if ( jQuery && this.options.isJQueryFiltering ) {\n // use jQuery\n return function( item ) {\n return jQuery( item.element ).is( filter );\n };\n }\n if ( typeof filter == 'function' ) {\n // use filter as function\n return function( item ) {\n return filter( item.element );\n };\n }\n // default, use filter as selector string\n return function( item ) {\n return matchesSelector( item.element, filter );\n };\n };\n\n // -------------------------- sorting -------------------------- //\n\n /**\n * @params {Array} elems\n * @public\n */\n proto.updateSortData = function( elems ) {\n // get items\n var items;\n if ( elems ) {\n elems = utils.makeArray( elems );\n items = this.getItems( elems );\n } else {\n // update all items if no elems provided\n items = this.items;\n }\n\n this._getSorters();\n this._updateItemsSortData( items );\n };\n\n proto._getSorters = function() {\n var getSortData = this.options.getSortData;\n for ( var key in getSortData ) {\n var sorter = getSortData[ key ];\n this._sorters[ key ] = mungeSorter( sorter );\n }\n };\n\n /**\n * @params {Array} items - of Isotope.Items\n * @private\n */\n proto._updateItemsSortData = function( items ) {\n // do not update if no items\n var len = items && items.length;\n\n for ( var i=0; len && i < len; i++ ) {\n var item = items[i];\n item.updateSortData();\n }\n };\n\n // ----- munge sorter ----- //\n\n // encapsulate this, as we just need mungeSorter\n // other functions in here are just for munging\n var mungeSorter = ( function() {\n // add a magic layer to sorters for convienent shorthands\n // `.foo-bar` will use the text of .foo-bar querySelector\n // `[foo-bar]` will use attribute\n // you can also add parser\n // `.foo-bar parseInt` will parse that as a number\n function mungeSorter( sorter ) {\n // if not a string, return function or whatever it is\n if ( typeof sorter != 'string' ) {\n return sorter;\n }\n // parse the sorter string\n var args = trim( sorter ).split(' ');\n var query = args[0];\n // check if query looks like [an-attribute]\n var attrMatch = query.match( /^\\[(.+)\\]$/ );\n var attr = attrMatch && attrMatch[1];\n var getValue = getValueGetter( attr, query );\n // use second argument as a parser\n var parser = Isotope.sortDataParsers[ args[1] ];\n // parse the value, if there was a parser\n sorter = parser ? function( elem ) {\n return elem && parser( getValue( elem ) );\n } :\n // otherwise just return value\n function( elem ) {\n return elem && getValue( elem );\n };\n\n return sorter;\n }\n\n // get an attribute getter, or get text of the querySelector\n function getValueGetter( attr, query ) {\n // if query looks like [foo-bar], get attribute\n if ( attr ) {\n return function getAttribute( elem ) {\n return elem.getAttribute( attr );\n };\n }\n\n // otherwise, assume its a querySelector, and get its text\n return function getChildText( elem ) {\n var child = elem.querySelector( query );\n return child && child.textContent;\n };\n }\n\n return mungeSorter;\n })();\n\n // parsers used in getSortData shortcut strings\n Isotope.sortDataParsers = {\n 'parseInt': function( val ) {\n return parseInt( val, 10 );\n },\n 'parseFloat': function( val ) {\n return parseFloat( val );\n }\n };\n\n // ----- sort method ----- //\n\n // sort filteredItem order\n proto._sort = function() {\n if ( !this.options.sortBy ) {\n return;\n }\n // keep track of sortBy History\n var sortBys = utils.makeArray( this.options.sortBy );\n if ( !this._getIsSameSortBy( sortBys ) ) {\n // concat all sortBy and sortHistory, add to front, oldest goes in last\n this.sortHistory = sortBys.concat( this.sortHistory );\n }\n // sort magic\n var itemSorter = getItemSorter( this.sortHistory, this.options.sortAscending );\n this.filteredItems.sort( itemSorter );\n };\n\n // check if sortBys is same as start of sortHistory\n proto._getIsSameSortBy = function( sortBys ) {\n for ( var i=0; i < sortBys.length; i++ ) {\n if ( sortBys[i] != this.sortHistory[i] ) {\n return false;\n }\n }\n return true;\n };\n\n // returns a function used for sorting\n function getItemSorter( sortBys, sortAsc ) {\n return function sorter( itemA, itemB ) {\n // cycle through all sortKeys\n for ( var i = 0; i < sortBys.length; i++ ) {\n var sortBy = sortBys[i];\n var a = itemA.sortData[ sortBy ];\n var b = itemB.sortData[ sortBy ];\n if ( a > b || a < b ) {\n // if sortAsc is an object, use the value given the sortBy key\n var isAscending = sortAsc[ sortBy ] !== undefined ? sortAsc[ sortBy ] : sortAsc;\n var direction = isAscending ? 1 : -1;\n return ( a > b ? 1 : -1 ) * direction;\n }\n }\n return 0;\n };\n }\n\n // -------------------------- methods -------------------------- //\n\n // get layout mode\n proto._mode = function() {\n var layoutMode = this.options.layoutMode;\n var mode = this.modes[ layoutMode ];\n if ( !mode ) {\n // TODO console.error\n throw new Error( 'No layout mode: ' + layoutMode );\n }\n // HACK sync mode's options\n // any options set after init for layout mode need to be synced\n mode.options = this.options[ layoutMode ];\n return mode;\n };\n\n proto._resetLayout = function() {\n // trigger original reset layout\n Outlayer.prototype._resetLayout.call( this );\n this._mode()._resetLayout();\n };\n\n proto._getItemLayoutPosition = function( item ) {\n return this._mode()._getItemLayoutPosition( item );\n };\n\n proto._manageStamp = function( stamp ) {\n this._mode()._manageStamp( stamp );\n };\n\n proto._getContainerSize = function() {\n return this._mode()._getContainerSize();\n };\n\n proto.needsResizeLayout = function() {\n return this._mode().needsResizeLayout();\n };\n\n // -------------------------- adding & removing -------------------------- //\n\n // HEADS UP overwrites default Outlayer appended\n proto.appended = function( elems ) {\n var items = this.addItems( elems );\n if ( !items.length ) {\n return;\n }\n // filter, layout, reveal new items\n var filteredItems = this._filterRevealAdded( items );\n // add to filteredItems\n this.filteredItems = this.filteredItems.concat( filteredItems );\n };\n\n // HEADS UP overwrites default Outlayer prepended\n proto.prepended = function( elems ) {\n var items = this._itemize( elems );\n if ( !items.length ) {\n return;\n }\n // start new layout\n this._resetLayout();\n this._manageStamps();\n // filter, layout, reveal new items\n var filteredItems = this._filterRevealAdded( items );\n // layout previous items\n this.layoutItems( this.filteredItems );\n // add to items and filteredItems\n this.filteredItems = filteredItems.concat( this.filteredItems );\n this.items = items.concat( this.items );\n };\n\n proto._filterRevealAdded = function( items ) {\n var filtered = this._filter( items );\n this.hide( filtered.needHide );\n // reveal all new items\n this.reveal( filtered.matches );\n // layout new items, no transition\n this.layoutItems( filtered.matches, true );\n return filtered.matches;\n };\n\n /**\n * Filter, sort, and layout newly-appended item elements\n * @param {Array or NodeList or Element} elems\n */\n proto.insert = function( elems ) {\n var items = this.addItems( elems );\n if ( !items.length ) {\n return;\n }\n // append item elements\n var i, item;\n var len = items.length;\n for ( i=0; i < len; i++ ) {\n item = items[i];\n this.element.appendChild( item.element );\n }\n // filter new stuff\n var filteredInsertItems = this._filter( items ).matches;\n // set flag\n for ( i=0; i < len; i++ ) {\n items[i].isLayoutInstant = true;\n }\n this.arrange();\n // reset flag\n for ( i=0; i < len; i++ ) {\n delete items[i].isLayoutInstant;\n }\n this.reveal( filteredInsertItems );\n };\n\n var _remove = proto.remove;\n proto.remove = function( elems ) {\n elems = utils.makeArray( elems );\n var removeItems = this.getItems( elems );\n // do regular thing\n _remove.call( this, elems );\n // bail if no items to remove\n var len = removeItems && removeItems.length;\n // remove elems from filteredItems\n for ( var i=0; len && i < len; i++ ) {\n var item = removeItems[i];\n // remove item from collection\n utils.removeFrom( this.filteredItems, item );\n }\n };\n\n proto.shuffle = function() {\n // update random sortData\n for ( var i=0; i < this.items.length; i++ ) {\n var item = this.items[i];\n item.sortData.random = Math.random();\n }\n this.options.sortBy = 'random';\n this._sort();\n this._layout();\n };\n\n /**\n * trigger fn without transition\n * kind of hacky to have this in the first place\n * @param {Function} fn\n * @param {Array} args\n * @returns ret\n * @private\n */\n proto._noTransition = function( fn, args ) {\n // save transitionDuration before disabling\n var transitionDuration = this.options.transitionDuration;\n // disable transition\n this.options.transitionDuration = 0;\n // do it\n var returnValue = fn.apply( this, args );\n // re-enable transition for reveal\n this.options.transitionDuration = transitionDuration;\n return returnValue;\n };\n\n // ----- helper methods ----- //\n\n /**\n * getter method for getting filtered item elements\n * @returns {Array} elems - collection of item elements\n */\n proto.getFilteredItemElements = function() {\n return this.filteredItems.map( function( item ) {\n return item.element;\n });\n };\n\n // ----- ----- //\n\n return Isotope;\n\n}));\n\n\n\n/***/ }),\n\n/***/ \"Gz0TuoFFs6JdDvtR2PYZ\":\n/***/ (function(module, exports, __webpack_require__) {\n\nvar matches = __webpack_require__(\"C2mk7N9JzKWlcOYJrkfi\")\n\n/**\n * closest : closest(el, selector)\n * Looks for the closest ancestor of element `el` that matches `selector`.\n * Compare with [$.fn.closest](http://api.jquery.com/closest/).\n *\n * var closest = require('dom101/closest');\n *\n * closest(input, 'label');\n */\n\nfunction closest (el, sel) {\n if (!el) return\n if (matches(el, sel)) {\n return el\n } else {\n return closest(el.parentNode, sel)\n }\n}\n\nmodule.exports = closest\n\n\n/***/ }),\n\n/***/ \"MKJaVdnD9jF7rk6rW6AJ\":\n/***/ (function(module, exports) {\n\n/**\n * on : on(el, event, fn)\n * Adds an event handler.\n *\n * var on = require('dom101/on');\n *\n * on(el, 'click', function () {\n * ...\n * });\n */\n\nfunction on (el, event, handler) {\n if (el.addEventListener) {\n el.addEventListener(event, handler)\n } else {\n el.attachEvent('on' + event, function () {\n handler.call(el)\n })\n }\n}\n\nmodule.exports = on\n\n\n/***/ }),\n\n/***/ \"O7wD3s+p+jjyw5ivWGEg\":\n/***/ (function(module, exports) {\n\n/**\n * each : each(list, fn)\n * Iterates through `list` (an array or an object). This is useful when dealing\n * with NodeLists like `document.querySelectorAll`.\n *\n * var each = require('dom101/each');\n * var qa = require('dom101/query-selector-all');\n *\n * each(qa('.button'), function (el) {\n * addClass('el', 'selected');\n * });\n */\n\nfunction each (list, fn) {\n var i\n var len = list.length\n var idx\n\n if (typeof len === 'number') {\n for (i = 0; i < len; i++) {\n fn(list[i], i)\n }\n } else {\n idx = 0\n for (i in list) {\n if (list.hasOwnProperty(i)) {\n fn(list[i], i, idx++)\n }\n }\n }\n\n return list\n}\n\nmodule.exports = each\n\n\n/***/ }),\n\n/***/ \"XxGrbZud7DE4W4TdQZtc\":\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nvar _onmount = __webpack_require__(\"yfX/NEeqeNrvWENPWWKS\");\n\nvar _onmount2 = _interopRequireDefault(_onmount);\n\nvar _remove = __webpack_require__(\"wYegCzKWCG2ZRJZfGEZa\");\n\nvar _remove2 = _interopRequireDefault(_remove);\n\nvar _removeClass = __webpack_require__(\"bq+j3PCtCSGVXgg8xWPw\");\n\nvar _removeClass2 = _interopRequireDefault(_removeClass);\n\nvar _data = __webpack_require__(\"CjZN/azBHJxH2NsOjfdD\");\n\nvar _dismiss = __webpack_require__(\"2QOxTCxkuzN0PP2kJ2jn\");\n\nvar _preview = __webpack_require__(\"BF4TFfJ+K+wsuHfLZ/S3\");\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n(0, _onmount2.default)('[data-js-dismissable]', function () {\n var id = (0, _data.getData)(this, 'js-dismissable').id || '';\n\n if ((0, _preview.isPreview)() || (0, _dismiss.isDismissed)(id)) {\n (0, _remove2.default)(this);\n } else {\n (0, _removeClass2.default)(this, '-hide');\n }\n});\n\n/***/ }),\n\n/***/ \"ahJreyGRfWuLMDCl+A3L\":\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.appendMany = appendMany;\nexports.nextUntil = nextUntil;\nexports.before = before;\nexports.findChildren = findChildren;\nexports.createDiv = createDiv;\n\nvar _matches = __webpack_require__(\"C2mk7N9JzKWlcOYJrkfi\");\n\nvar _matches2 = _interopRequireDefault(_matches);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _toConsumableArray(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } else { return Array.from(arr); } }\n\n/*\n * Just like jQuery.append\n */\n\nfunction appendMany(el, children) {\n children.forEach(function (child) {\n el.appendChild(child);\n });\n}\n\n/*\n * Just like jQuery.nextUntil\n */\n\nfunction nextUntil(el, selector) {\n var nextEl = el.nextSibling;\n return nextUntilTick(nextEl, selector, []);\n}\n\nfunction nextUntilTick(el, selector, acc) {\n if (!el) return acc;\n\n var isMatch = (0, _matches2.default)(el, selector);\n if (isMatch) return acc;\n\n return nextUntilTick(el.nextSibling, selector, [].concat(_toConsumableArray(acc), [el]));\n}\n\n/*\n * Just like jQuery.before\n */\n\nfunction before(reference, newNode) {\n reference.parentNode.insertBefore(newNode, reference);\n}\n\n/*\n * Like jQuery.children('selector')\n */\n\nfunction findChildren(el, selector) {\n return [].slice.call(el.children).filter(function (child) {\n return (0, _matches2.default)(child, selector);\n });\n}\n\n/**\n * Creates a div\n * @private\n *\n * @example\n *\n * createDiv({ class: 'foo' })\n */\n\nfunction createDiv(props) {\n var d = document.createElement('div');\n Object.keys(props).forEach(function (key) {\n d.setAttribute(key, props[key]);\n });\n return d;\n}\n\n/***/ }),\n\n/***/ \"azEBDvunS5n/qbuQInIF\":\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nvar _closest = __webpack_require__(\"Gz0TuoFFs6JdDvtR2PYZ\");\n\nvar _closest2 = _interopRequireDefault(_closest);\n\nvar _remove = __webpack_require__(\"wYegCzKWCG2ZRJZfGEZa\");\n\nvar _remove2 = _interopRequireDefault(_remove);\n\nvar _on = __webpack_require__(\"MKJaVdnD9jF7rk6rW6AJ\");\n\nvar _on2 = _interopRequireDefault(_on);\n\nvar _data = __webpack_require__(\"CjZN/azBHJxH2NsOjfdD\");\n\nvar _onmount = __webpack_require__(\"yfX/NEeqeNrvWENPWWKS\");\n\nvar _onmount2 = _interopRequireDefault(_onmount);\n\nvar _dismiss = __webpack_require__(\"2QOxTCxkuzN0PP2kJ2jn\");\n\nvar Dismiss = _interopRequireWildcard(_dismiss);\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n/**\n * Dismiss button\n */\n\n(0, _onmount2.default)('[data-js-dismiss]', function () {\n var parent = (0, _closest2.default)(this, '[data-js-dismissable]');\n var dismissable = (0, _data.getData)(parent, 'js-dismissable');\n var id = dismissable && dismissable.id || '';\n\n (0, _on2.default)(this, 'click', function (e) {\n Dismiss.setDismissed(id);\n e.preventDefault();\n if (parent) (0, _remove2.default)(parent);\n });\n});\n\n/***/ }),\n\n/***/ \"bq+j3PCtCSGVXgg8xWPw\":\n/***/ (function(module, exports, __webpack_require__) {\n\nvar each = __webpack_require__(\"O7wD3s+p+jjyw5ivWGEg\")\n\n/**\n * removeClass : removeClass(el, className)\n * Removes a classname.\n *\n * var removeClass = require('dom101/remove-class');\n *\n * el.className = 'selected active';\n * removeClass(el, 'active');\n *\n * el.className\n * => \"selected\"\n */\n\nfunction removeClass (el, className) {\n if (!className) return\n\n if (Array.isArray(className)) {\n each(className, function (className) {\n removeClass(el, className)\n })\n\n return\n }\n\n if (el.classList) {\n var classNames = className.split(' ').filter(Boolean)\n each(classNames, function (className) {\n el.classList.remove(className)\n })\n } else {\n var expr =\n new RegExp('(^|\\\\b)' + className.split(' ').join('|') + '(\\\\b|$)', 'gi')\n\n el.className = el.className.replace(expr, ' ')\n }\n}\n\nmodule.exports = removeClass\n\n\n/***/ }),\n\n/***/ \"cBdQffYQOU2SCSRXjSUx\":\n/***/ (function(module, exports, __webpack_require__) {\n\nvar map = {\n\t\"./dismiss.js\": \"azEBDvunS5n/qbuQInIF\",\n\t\"./dismissable.js\": \"XxGrbZud7DE4W4TdQZtc\",\n\t\"./disqus.js\": \"BuWMdGeXUEK0GmkN01pU\",\n\t\"./h3-section-list.js\": \"E+dCGfS1pT5WowYv7jpv\",\n\t\"./main-body.js\": \"g3wkw0XZUos0Eo8rU7p6\",\n\t\"./no-preview.js\": \"k6EYej2Qda8Mq9A5Oeqn\",\n\t\"./search-form.js\": \"D3SYMdNAenu80VOO7/Dv\",\n\t\"./search-input.js\": \"zNHHVy5XxvKjnqTgwxy7\",\n\t\"./searchable-header.js\": \"veOabZWTWtixkn1TyITD\",\n\t\"./searchable-item.js\": \"tcev71HWHlq3Ur/sw7Ir\"\n};\nfunction webpackContext(req) {\n\treturn __webpack_require__(webpackContextResolve(req));\n};\nfunction webpackContextResolve(req) {\n\tvar id = map[req];\n\tif(!(id + 1)) // check for number or string\n\t\tthrow new Error(\"Cannot find module '\" + req + \"'.\");\n\treturn id;\n};\nwebpackContext.keys = function webpackContextKeys() {\n\treturn Object.keys(map);\n};\nwebpackContext.resolve = webpackContextResolve;\nmodule.exports = webpackContext;\nwebpackContext.id = \"cBdQffYQOU2SCSRXjSUx\";\n\n/***/ }),\n\n/***/ \"cYqQDyTPtD7lV79ovj4Y\":\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.default = inject;\nexports.injectEmbed = injectEmbed;\nexports.injectCount = injectCount;\n/**\n * Injects disqus's scripts into the page.\n *\n * @example\n * inject('devhints.disqus.com')\n */\n\nfunction inject(host) {\n injectEmbed(host);\n injectCount(host);\n}\n\nfunction injectEmbed(host) {\n var d = document;\n var s = d.createElement('script');\n s.src = 'https://' + host + '/embed.js';\n s.setAttribute('data-timestamp', +new Date());(d.head || d.body).appendChild(s);\n}\n\nfunction injectCount(host) {\n var d = document;\n var s = d.createElement('script');\n s.src = 'https://' + host + '/count.js';\n s.id = 'dsq-count-scr';\n s.async = true;(d.head || d.body).appendChild(s);\n}\n\n/***/ }),\n\n/***/ \"g2okcHDGBNRpe9zqR9sR\":\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n/* blank */\n\n\n/***/ }),\n\n/***/ \"g3wkw0XZUos0Eo8rU7p6\":\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\n/***/ }),\n\n/***/ \"j059HZGO2uzpV/UZMXr3\":\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.default = qs;\nexports.qsdecode = qsdecode;\n/*\n * Helper: minimal qs implementation\n */\n\nfunction qs(search) {\n search = search.substr(1);\n var parts = search.split('&').map(function (p) {\n return p.split('=');\n });\n return parts.reduce(function (result, part) {\n result[part[0]] = qsdecode(part[1]);\n return result;\n }, {});\n}\n\nfunction qsdecode(string) {\n if (!string) string = '';\n string = string.replace(/\\+/g, ' ');\n return string;\n}\n\n/***/ }),\n\n/***/ \"k6EYej2Qda8Mq9A5Oeqn\":\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nvar _remove = __webpack_require__(\"wYegCzKWCG2ZRJZfGEZa\");\n\nvar _remove2 = _interopRequireDefault(_remove);\n\nvar _onmount = __webpack_require__(\"yfX/NEeqeNrvWENPWWKS\");\n\nvar _onmount2 = _interopRequireDefault(_onmount);\n\nvar _addClass = __webpack_require__(\"lGfezzQL7fc5RE8kg33g\");\n\nvar _addClass2 = _interopRequireDefault(_addClass);\n\nvar _preview = __webpack_require__(\"BF4TFfJ+K+wsuHfLZ/S3\");\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n/*\n * Behavior: Things to remove when preview mode is on\n */\n\n(0, _onmount2.default)('[data-js-no-preview]', function (b) {\n if ((0, _preview.isPreview)()) {\n (0, _remove2.default)(this);\n (0, _addClass2.default)(document.documentElement, 'PreviewMode');\n }\n});\n\n/***/ }),\n\n/***/ \"lGfezzQL7fc5RE8kg33g\":\n/***/ (function(module, exports, __webpack_require__) {\n\nvar each = __webpack_require__(\"O7wD3s+p+jjyw5ivWGEg\")\n\n/**\n * addClass : addClass(el, className)\n * Adds a class name to an element. Compare with `$.fn.addClass`.\n *\n * var addClass = require('dom101/add-class');\n *\n * addClass(el, 'active');\n */\n\nfunction addClass (el, className) {\n if (!className) return\n\n if (Array.isArray(className)) {\n each(className, function (className) {\n addClass(el, className)\n })\n\n return\n }\n\n if (el.classList) {\n var classNames = className.split(' ').filter(Boolean)\n each(classNames, function (className) {\n el.classList.add(className)\n })\n } else {\n el.className += ' ' + className\n }\n}\n\nmodule.exports = addClass\n\n\n/***/ }),\n\n/***/ \"tcev71HWHlq3Ur/sw7Ir\":\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nvar _onmount = __webpack_require__(\"yfX/NEeqeNrvWENPWWKS\");\n\nvar _onmount2 = _interopRequireDefault(_onmount);\n\nvar _permutate = __webpack_require__(\"GOdGag34TlRuHa2OZoh9\");\n\nvar _permutate2 = _interopRequireDefault(_permutate);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n/**\n * Sets search indices (`data-search-index` attribute)\n */\n\n(0, _onmount2.default)('[data-js-searchable-item]', function () {\n var data = JSON.parse(this.getAttribute('data-js-searchable-item') || '{}');\n var words = (0, _permutate2.default)(data);\n\n this.setAttribute('data-search-index', words.join(' '));\n});\n\n/***/ }),\n\n/***/ \"tqbVxj9+xGAhlFrQpyTS\":\n/***/ (function(module, exports) {\n\n/**\n * ready : ready(fn)\n * Executes `fn` when the DOM is ready. If the DOM is already ready, the given\n * callback will be called immediately.\n *\n * var ready = require('dom101/ready');\n *\n * ready(function () {\n * ...\n * });\n */\n\nfunction ready (fn) {\n if (isReady()) {\n return fn()\n } else if (document.addEventListener) {\n document.addEventListener('DOMContentLoaded', fn)\n } else {\n document.attachEvent('onreadystatechange', function () {\n if (isReady()) fn()\n })\n }\n}\n\nfunction isReady () {\n return (document.readyState === 'complete' || document.readyState === 'interactive')\n}\n\nmodule.exports = ready\n\n\n/***/ }),\n\n/***/ \"veOabZWTWtixkn1TyITD\":\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nvar _onmount = __webpack_require__(\"yfX/NEeqeNrvWENPWWKS\");\n\nvar _onmount2 = _interopRequireDefault(_onmount);\n\nvar _dom = __webpack_require__(\"ahJreyGRfWuLMDCl+A3L\");\n\nvar _matches = __webpack_require__(\"C2mk7N9JzKWlcOYJrkfi\");\n\nvar _matches2 = _interopRequireDefault(_matches);\n\n__webpack_require__(\"tcev71HWHlq3Ur/sw7Ir\");\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n/**\n * Propagate item search indices to headers\n */\n\n(0, _onmount2.default)('[data-js-searchable-header]', function () {\n var els = (0, _dom.nextUntil)(this, '[data-js-searchable-header]').filter(function (el) {\n return (0, _matches2.default)(el, '[data-search-index]');\n });\n\n var keywords = els.map(function (n) {\n return n.getAttribute('data-search-index');\n }).join(' ').split(' ');\n\n this.setAttribute('data-search-index', keywords.join(' '));\n});\n\n// Ensure that search-index is set first\n\n/***/ }),\n\n/***/ \"wYegCzKWCG2ZRJZfGEZa\":\n/***/ (function(module, exports) {\n\n/**\n * remove : remove(el)\n * Removes an element from the DOM.\n *\n * var remove = require('dom101/remove');\n *\n * remove(el);\n */\n\nfunction remove (el) {\n el && el.parentNode && el.parentNode.removeChild(el)\n}\n\nmodule.exports = remove\n\n\n/***/ }),\n\n/***/ \"yfX/NEeqeNrvWENPWWKS\":\n/***/ (function(module, exports, __webpack_require__) {\n\nvar __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_RESULT__;/* global define */\nvoid (function (root, factory) {\n if (true) !(__WEBPACK_AMD_DEFINE_FACTORY__ = (factory),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ = (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === 'function' ?\n\t\t\t\t(__WEBPACK_AMD_DEFINE_FACTORY__.call(exports, __webpack_require__, exports, module)) :\n\t\t\t\t__WEBPACK_AMD_DEFINE_FACTORY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__))\n else if (typeof exports === 'object') module.exports = factory()\n else {\n if (window.jQuery) window.jQuery.onmount = factory()\n else root.onmount = factory()\n }\n}(this, function ($) {\n /*\n * Internal: Registry.\n */\n\n var handlers, behaviors, selectors, log\n\n /*\n * Internal: IDs for auto-incrementing.\n */\n\n var bid = 0 /* behavior ID */\n var cid = 0 /* component ID */\n\n /**\n * (Module) Adds a behavior, or triggers behaviors.\n *\n * When no parameters are passed, it triggers all behaviors. When one\n * parameter is passed, it triggers the given behavior. Otherwise, it adds a\n * behavior.\n *\n * // define a behavior\n * $.onmount('.select-box', function () {\n * $(this).on('...')\n * })\n *\n * // define a behavior with exit\n * $.onmount('.select-box', function () {\n * $(document).on('...')\n * }, function () {\n * $(document).off('...')\n * })\n *\n * // retrigger a onmount\n * $.onmount('.select-box')\n *\n * // retriggers all behaviors\n * $.onmount()\n */\n\n function onmount (selector, init, exit, options) {\n if (typeof exit === 'object') {\n options = exit\n exit = undefined\n }\n\n if (arguments.length === 0 || isjQuery(selector) || isEvent(selector)) {\n // onmount() - trigger all behaviors. Also account for cases such as\n // $($.onmount), where it's triggered with a jQuery event object.\n onmount.poll()\n } else if (arguments.length === 1) {\n // onmount(selector) - trigger for a given selector.\n onmount.poll(selector)\n } else {\n // onmount(sel, fn, [fn]) - register a new behavior.\n var be = new Behavior(selector, init, exit, options)\n behaviors.push(be)\n be.register()\n }\n\n return this\n }\n\n /*\n * Use jQuery (or a jQuery-like) when available. This will allow\n * the use of jQuery selectors.\n */\n\n onmount.$ = window.jQuery || window.Zepto || window.Ender\n\n /*\n * Detect MutationObserver support for `onmount.observe()`.\n * You may even add a polyfill here via\n * `onmount.MutationObserver = require('mutation-observer')`.\n */\n\n onmount.MutationObserver =\n window.MutationObserver ||\n window.WebKitMutationObserver ||\n window.MozMutationObserver\n\n /**\n * Set this to true if you want to see debug messages.\n */\n\n onmount.debug = false\n\n /**\n * Internal: triggers behaviors for a selector or for all.\n *\n * onmount.poll()\n * onmount.poll('.js-button')\n */\n\n onmount.poll = function poll (selector) {\n if (selector) selector = onmount.selectify(selector)\n var functions = (selector ? selectors[selector] : handlers) || []\n each(functions, function (fn) { fn() })\n }\n\n /**\n * Observes automatically using MutationObserver events.\n *\n * onmount.observe()\n */\n\n onmount.observe = function observe () {\n var MutationObserver = onmount.MutationObserver\n if (typeof MutationObserver === 'undefined') return\n\n var obs = new MutationObserver(function (mutations) {\n each(behaviors, function (be) {\n each(mutations, function (mutation) {\n each(mutation.addedNodes, function (el) {\n if (matches(el, be.selector)) be.visitEnter(el)\n })\n\n each(mutation.removedNodes, function (el) {\n if (matches(el, be.selector)) be.doExit(el)\n })\n })\n })\n })\n\n obs.observe(document, { subtree: true, childList: true })\n onmount.observer = obs\n\n // trigger everything before going\n onmount()\n return true\n }\n\n /**\n * Turns off observation first issued by `onmount.observe()`.\n */\n\n onmount.unobserve = function unobserve () {\n if (!this.observer) return\n this.observer.disconnect()\n delete this.observer\n }\n\n /**\n * Forces teardown of all behaviors currently applied.\n */\n\n onmount.teardown = function teardown () {\n each(behaviors, function (be) {\n each(be.loaded, function (el, i) {\n if (el) be.doExit(el, i)\n })\n })\n }\n\n /**\n * Clears all behaviors. Useful for tests.\n * This will NOT call exit handlers.\n */\n\n onmount.reset = function reset () {\n handlers = onmount.handlers = []\n selectors = onmount.selectors = {}\n behaviors = onmount.behaviors = []\n }\n\n /**\n * Internal: Converts `@role` to `[role~=\"role\"]` if needed. You can override\n * this by reimplementing `onmount.selectify`.\n *\n * selectify('@hi') //=> '[role=\"hi\"]'\n * selectify('.btn') //=> '.btn'\n */\n\n onmount.selectify = function selectify (selector) {\n if (selector[0] === '@') {\n return '[role~=\"' + selector.substr(1).replace(/\"/g, '\\\\\"') + '\"]'\n }\n return selector\n }\n\n /**\n * Internal: behavior class\n */\n\n function Behavior (selector, init, exit, options) {\n this.id = 'b' + bid++\n this.init = init\n this.exit = exit\n this.selector = onmount.selectify(selector)\n this.loaded = [] // keep track of dom elements loaded for this behavior\n this.key = '__onmount:' + bid // leave the state in el['__onmount:12']\n this.detectMutate = options && options.detectMutate\n }\n\n /**\n * Internal: initialize this behavior by registering itself to the internal\n * `selectors` map. This allows you to call `onmount(selector)` later on.\n */\n\n Behavior.prototype.register = function () {\n var be = this\n var loaded = this.loaded\n var selector = this.selector\n\n register(selector, function () {\n var list = query(selector)\n\n // This is the function invoked on `onmount(selector)`.\n // Clean up old ones (if they're not in the DOM anymore).\n each(loaded, function (element, i) {\n be.visitExit(element, i, list)\n })\n\n // Clean up new ones (if they're not loaded yet).\n eachOf(list, function (element) {\n be.visitEnter(element)\n })\n })\n }\n\n /**\n * Internal: visits the element `el` and turns it on if applicable.\n */\n\n Behavior.prototype.visitEnter = function (el) {\n if (el[this.key]) return\n var options = { id: 'c' + cid, selector: this.selector }\n if (this.init.call(el, options) !== false) {\n if (onmount.debug) log('enter', this.selector, el)\n el[this.key] = options\n this.loaded.push(el)\n cid++\n }\n }\n\n /**\n * Internal: visits the element `el` and sees if it needs its exit handler\n * called.\n */\n\n Behavior.prototype.visitExit = function (el, i, list) {\n if (!el) return\n if (this.detectMutate) {\n if (!has(list, el)) return this.doExit(el, i)\n } else {\n if (!isAttached(el)) return this.doExit(el, i)\n }\n }\n\n /**\n * Internal: calls the exit handler for the behavior for element `el` (if\n * available), and marks the behavior/element as uninitialized.\n */\n\n Behavior.prototype.doExit = function (el, i) {\n if (typeof i === 'undefined') i = this.loaded.indexOf(el)\n this.loaded[i] = undefined\n if (this.exit && this.exit.call(el, el[this.key]) !== false) {\n if (onmount.debug) log('exit', this.selector, el)\n delete el[this.key]\n }\n }\n\n /**\n * Internal: check if an element is still attached to its document.\n */\n\n function isAttached (el) {\n while (el) {\n if (el === document.documentElement) return true\n el = el.parentElement\n }\n }\n\n /**\n * Internal: reimplementation of `$('...')`. If jQuery is available,\n * use it (I guess to preserve IE compatibility and to enable special jQuery\n * attribute selectors). Use with `eachOf()` or `has()`.\n */\n\n function query (selector, fn) {\n if (onmount.$) return onmount.$(selector)\n return document.querySelectorAll(selector)\n }\n\n /**\n * Internal: iterates through a `query()` result.\n */\n\n function eachOf (list, fn) {\n if (onmount.$) return list.each(function (i) { fn(this, i) })\n return each(list, fn)\n }\n\n /**\n * Interanl: checks if given element `el` is in the query result `list`.\n */\n\n function has (list, el) {\n if (onmount.$) return list.index(el) > -1\n return list.indexOf(el) > -1\n }\n\n /**\n * Internal: registers a behavior handler for a selector.\n */\n\n function register (selector, fn) {\n if (!selectors[selector]) selectors[selector] = []\n selectors[selector].push(fn)\n handlers.push(fn)\n }\n\n /**\n * Checks if a given element `el` matches `selector`.\n * Compare with [$.fn.is](http://api.jquery.com/is/).\n *\n * var matches = require('dom101/matches');\n *\n * matches(button, ':focus');\n */\n\n function matches (el, selector) {\n var _matches = el.matches ||\n el.matchesSelector ||\n el.msMatchesSelector ||\n el.mozMatchesSelector ||\n el.webkitMatchesSelector ||\n el.oMatchesSelector\n\n if (onmount.$) {\n return onmount.$(el).is(selector)\n } else if (_matches) {\n return _matches.call(el, selector)\n } else if (el.parentNode) {\n // IE8 and below\n var nodes = el.parentNode.querySelectorAll(selector)\n for (var i = nodes.length; i--; 0) {\n if (nodes[i] === el) return true\n }\n return false\n }\n }\n\n /**\n * Iterates through `list` (an array or an object). This is useful when dealing\n * with NodeLists like `document.querySelectorAll`.\n *\n * var each = require('dom101/each');\n * var qa = require('dom101/query-selector-all');\n *\n * each(qa('.button'), function (el) {\n * addClass('el', 'selected');\n * });\n */\n\n function each (list, fn) {\n var i\n var len = list.length\n\n if (len === +len) {\n for (i = 0; i < len; i++) { fn(list[i], i) }\n } else {\n for (i in list) {\n if (list.hasOwnProperty(i)) fn(list[i], i)\n }\n }\n\n return list\n }\n\n /**\n * Internal: Check if a given object is jQuery\n */\n\n function isjQuery ($) {\n return typeof $ === 'function' && $.fn && $.noConflict\n }\n\n function isEvent (e) {\n return typeof e === 'object' && e.target\n }\n\n /**\n * Internal: logging\n */\n\n var styles = {\n enter: 'background-color:#dfd;font-weight:bold;color:#141',\n exit: 'background-color:#fdd;font-weight:bold;color:#411'\n }\n\n if (~navigator.userAgent.indexOf('Mozilla')) {\n log = function (type, selector, el) {\n console.log('%c %s ', styles[type], selector, el)\n }\n } else {\n log = function (type, selector, el) {\n console.log('(onmount)', type, selector)\n }\n }\n\n /*\n * Export\n */\n\n onmount.reset()\n return onmount\n}))\n\n\n/***/ }),\n\n/***/ \"z+w/DGZianwIMo5d4qOD\":\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\n// 3rd party libs\nwindow.Prism = __webpack_require__(\"+HohgKHTHTXOIAa8uoqY\");\n\n// All the others\nfunction requireAll(r) {\n r.keys().forEach(r);\n}\nrequireAll(__webpack_require__(\"2tov+8o2NrZdw/Lg8JZA\"));\nrequireAll(__webpack_require__(\"cBdQffYQOU2SCSRXjSUx\"));\n\n/***/ }),\n\n/***/ \"zNHHVy5XxvKjnqTgwxy7\":\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nvar _onmount = __webpack_require__(\"yfX/NEeqeNrvWENPWWKS\");\n\nvar _onmount2 = _interopRequireDefault(_onmount);\n\nvar _search = __webpack_require__(\"DfTyEU8lscjHXmCMlptO\");\n\nvar Search = _interopRequireWildcard(_search);\n\nvar _qs = __webpack_require__(\"j059HZGO2uzpV/UZMXr3\");\n\nvar _qs2 = _interopRequireDefault(_qs);\n\nvar _on = __webpack_require__(\"MKJaVdnD9jF7rk6rW6AJ\");\n\nvar _on2 = _interopRequireDefault(_on);\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n(0, _onmount2.default)('[data-js-search-input]', function () {\n var _this = this;\n\n (0, _on2.default)(this, 'input', function () {\n var val = _this.value;\n\n if (val === '') {\n Search.showAll();\n } else {\n Search.show(val);\n }\n });\n\n var query = ((0, _qs2.default)(window.location.search) || {}).q;\n if (query && query.length) {\n this.value = query;\n setTimeout(function () {\n Search.show(query);\n });\n }\n});\n\n/***/ })\n\n},[\"z+w/DGZianwIMo5d4qOD\"]);\n\n\n// WEBPACK FOOTER //\n// app.js","/**\n * Updates a local storage key. If it doesn't exist, it defaults to an empty\n * object.\n *\n * @example\n * update('dismissed', (data) => {\n * data.lol = true\n * return data\n * })\n */\n\nexport function update (key, fn) {\n if (!window.localStorage) return\n let data = JSON.parse(window.localStorage[key] || '{}')\n data = fn(data)\n window.localStorage[key] = JSON.stringify(data)\n}\n\n/**\n * Fetches a local storage key.\n *\n * @example\n * const data = fetch('dismissed')\n */\n\nexport function fetch (key) {\n if (!window.localStorage) return\n return JSON.parse(window.localStorage[key] || '{}')\n}\n\n\n\n// WEBPACK FOOTER //\n// ./_js/helpers/store.js","import * as Store from './store'\n\n/**\n * Dismisses an announcement.\n *\n * @example\n * setDismissed('2017-09-02-happy-birthday')\n */\n\nexport function setDismissed (id) {\n Store.update('dismissed', function (data) {\n data[id] = true\n return data\n })\n}\n\n/**\n * Checks if an announcement has been dismissed before.\n *\n * @example\n * setDismissed('2017-09-02-happy-birthday')\n * isDismissed('2017-09-02-happy-birthday') => true\n */\n\nexport function isDismissed (id) {\n const data = Store.fetch('dismissed')\n return data && data[id]\n}\n\n\n\n// WEBPACK FOOTER //\n// ./_js/helpers/dismiss.js","var map = {\n\t\"./onmount.js\": \"6hLKOGpXaWUwTDQA5TL2\"\n};\nfunction webpackContext(req) {\n\treturn __webpack_require__(webpackContextResolve(req));\n};\nfunction webpackContextResolve(req) {\n\tvar id = map[req];\n\tif(!(id + 1)) // check for number or string\n\t\tthrow new Error(\"Cannot find module '\" + req + \"'.\");\n\treturn id;\n};\nwebpackContext.keys = function webpackContextKeys() {\n\treturn Object.keys(map);\n};\nwebpackContext.resolve = webpackContextResolve;\nmodule.exports = webpackContext;\nwebpackContext.id = \"2tov+8o2NrZdw/Lg8JZA\";\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./_js/initializers \\.js$\n// module id = 2tov+8o2NrZdw/Lg8JZA\n// module chunks = 0","import ready from 'dom101/ready'\nimport onmount from 'onmount'\n\n/**\n * Behavior: Wrapping\n */\n\nready(() => {\n setTimeout(() => { onmount() })\n})\n\n\n\n// WEBPACK FOOTER //\n// ./_js/initializers/onmount.js","/**\n * Checks if we're in preview mode (?preview=1).\n */\n\nexport function isPreview () {\n return window.location.search.indexOf('preview=1') !== -1\n}\n\n\n\n// WEBPACK FOOTER //\n// ./_js/helpers/preview.js","import onmount from 'onmount'\nimport injectDisqus from '../helpers/inject_disqus'\nimport ready from 'dom101/ready'\n\n/**\n * Injects Disqus onto the page.\n */\n\nonmount('[data-js-disqus]', function () {\n const data = JSON.parse(this.getAttribute('data-js-disqus'))\n\n window.disqus_config = function () {\n this.page.url = data.url\n this.page.identifier = data.identifier\n }\n\n // Disqus takes a while to load, don't do it so eagerly.\n ready(() => {\n injectDisqus(data.host)\n })\n})\n\n\n\n// WEBPACK FOOTER //\n// ./_js/behaviors/disqus.js","/**\n * matches : matches(el, selector)\n * Checks if a given element `el` matches `selector`.\n * Compare with [$.fn.is](http://api.jquery.com/is/).\n *\n * var matches = require('dom101/matches');\n *\n * matches(button, ':focus');\n */\n\nfunction matches (el, selector) {\n var _matches = el.matches ||\n el.matchesSelector ||\n el.msMatchesSelector ||\n el.mozMatchesSelector ||\n el.webkitMatchesSelector ||\n el.oMatchesSelector\n\n if (_matches) {\n return _matches.call(el, selector)\n } else if (el.parentNode) {\n // IE8 and below\n var nodes = el.parentNode.querySelectorAll(selector)\n for (var i = nodes.length; i--; 0) {\n if (nodes[i] === el) return true\n }\n return false\n }\n}\n\nmodule.exports = matches\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/dom101/matches.js\n// module id = C2mk7N9JzKWlcOYJrkfi\n// module chunks = 0","/**\n * Stores and retrieves data from an element. Works like jQuery.data().\n */\n\nexport function data (el, key, val) {\n if (typeof val !== 'undefined') {\n return getData(el, key)\n } else {\n return setData(el, key, val)\n }\n}\n\nexport function getData (el, key) {\n const str = el.getAttribute('data-' + key)\n return JSON.parse(str || '{}')\n}\n\nexport function setData (el, key, val) {\n el.setAttribute('data-' + key, JSON.stringify(val))\n}\n\n\n\n// WEBPACK FOOTER //\n// ./_js/helpers/data.js","import onmount from 'onmount'\nimport on from 'dom101/on'\n\n/**\n * Submitting the search form\n */\n\nonmount('[data-js-search-form]', function () {\n on(this, 'submit', e => {\n e.preventDefault()\n\n const link = document.querySelector('a[data-search-index]:visible')\n const href = link && link.getAttribute('href')\n\n if (href) window.location = href\n })\n})\n\n\n\n// WEBPACK FOOTER //\n// ./_js/behaviors/search-form.js","import { splitwords } from './permutate'\nimport qsa from 'dom101/query-selector-all'\n\n/**\n * Show everything.\n *\n * @example\n * Search.showAll()\n */\n\nexport function showAll () {\n qsa('[data-search-index]').forEach(el => {\n el.removeAttribute('aria-hidden')\n })\n}\n\n/**\n * Search for a given keyword.\n *\n * @example\n * Search.show('hello')\n */\n\nexport function show (val) {\n const keywords = splitwords(val)\n\n if (!keywords.length) return showAll()\n\n const selectors = keywords\n .map(k => `[data-search-index~=${JSON.stringify(k)}]`)\n .join('')\n\n qsa('[data-search-index]').forEach(el => {\n el.setAttribute('aria-hidden', true)\n })\n\n qsa(selectors).forEach(el => {\n el.removeAttribute('aria-hidden')\n })\n}\n\n\n\n// WEBPACK FOOTER //\n// ./_js/helpers/search.js","/* eslint-disable no-new */\n\nimport Isotope from 'isotope-layout/dist/isotope.pkgd.js'\nimport onmount from 'onmount'\nimport on from 'dom101/on'\nimport qsa from 'dom101/query-selector-all'\n\n/*\n * Behavior: Isotope\n */\n\nonmount('[data-js-h3-section-list]', function () {\n const iso = new Isotope(this, {\n itemSelector: '.h3-section',\n transitionDuration: 0\n })\n\n const images = qsa('img', this)\n\n images.forEach(image => {\n on(image, 'load', () => {\n iso.layout()\n })\n })\n\n // Insurance against weirdness on pages like devhints.io/vim, where the\n // critical path CSS may look different from the final CSS (because of the\n // tables).\n on(window, 'load', () => {\n iso.layout()\n })\n})\n\n\n\n// WEBPACK FOOTER //\n// ./_js/behaviors/h3-section-list.js","/**\n * querySelectorAll : querySelectorAll(query, [element])\n * Convenience function to access `document.querySelectorAll`. Unlike the\n * default version, this always returns an array.\n *\n * If a 2nd parameter `element` is given, it only searches for descendants of\n * that element.\n *\n * var each = require('dom101/each');\n * var qsa = require('dom101/query-selector-all');\n *\n * qsa('.button').each(el => {\n * addClass('el', 'selected');\n * };\n */\n\nfunction querySelectorAll (query, context) {\n return Array.prototype.slice.call(\n (context || document).querySelectorAll(query)\n )\n}\n\nmodule.exports = querySelectorAll\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/dom101/query-selector-all.js\n// module id = EvxNxLK9yKFmn1U14Kvw\n// module chunks = 0","/**\n * Permutates a searcheable item.\n *\n * permutate({\n * slug: 'hello-world',\n * category: 'greetings'\n * })\n */\n\nexport default function permutate (data) {\n let words = []\n if (data.slug) {\n words = words.concat(permutateString(data.slug))\n }\n if (data.category) {\n words = words.concat(permutateString(data.category))\n }\n return words\n}\n\n/*\n * Permutates strings.\n *\n * @example\n * permutateString('hi joe')\n * => ['h', 'hi', 'j', 'jo', 'joe']\n */\n\nexport function permutateString (str) {\n let words = []\n let inputs = splitwords(str)\n\n inputs.forEach(word => {\n words = words.concat(permutateWord(word))\n })\n\n return words\n}\n\n/**\n * Permutates a word.\n *\n * @example\n * permutateWord('hello')\n * => ['h', 'he', 'hel', 'hell', 'hello']\n */\n\nexport function permutateWord (str) {\n let words = []\n const len = str.length\n for (var i = 1; i <= len; ++i) {\n words.push(str.substr(0, i))\n }\n return words\n}\n\n/**\n * Helper for splitting to words.\n *\n * @example\n * splitWords('Hello, world!')\n * => ['hello', 'world']\n */\n\nexport function splitwords (str) {\n const words = str.toLowerCase()\n .split(/[ \\/\\-_]/)\n .filter(k => k && k.length !== 0)\n\n return words\n}\n\n\n\n// WEBPACK FOOTER //\n// ./_js/helpers/permutate.js","/*!\n * Isotope PACKAGED v3.0.4\n *\n * Licensed GPLv3 for open source use\n * or Isotope Commercial License for commercial use\n *\n * http://isotope.metafizzy.co\n * Copyright 2017 Metafizzy\n */\n\n/**\n * Bridget makes jQuery widgets\n * v2.0.1\n * MIT license\n */\n\n/* jshint browser: true, strict: true, undef: true, unused: true */\n\n( function( window, factory ) {\n // universal module definition\n /*jshint strict: false */ /* globals define, module, require */\n if ( typeof define == 'function' && define.amd ) {\n // AMD\n define( 'jquery-bridget/jquery-bridget',[ 'jquery' ], function( jQuery ) {\n return factory( window, jQuery );\n });\n } else if ( typeof module == 'object' && module.exports ) {\n // CommonJS\n module.exports = factory(\n window,\n require('jquery')\n );\n } else {\n // browser global\n window.jQueryBridget = factory(\n window,\n window.jQuery\n );\n }\n\n}( window, function factory( window, jQuery ) {\n'use strict';\n\n// ----- utils ----- //\n\nvar arraySlice = Array.prototype.slice;\n\n// helper function for logging errors\n// $.error breaks jQuery chaining\nvar console = window.console;\nvar logError = typeof console == 'undefined' ? function() {} :\n function( message ) {\n console.error( message );\n };\n\n// ----- jQueryBridget ----- //\n\nfunction jQueryBridget( namespace, PluginClass, $ ) {\n $ = $ || jQuery || window.jQuery;\n if ( !$ ) {\n return;\n }\n\n // add option method -> $().plugin('option', {...})\n if ( !PluginClass.prototype.option ) {\n // option setter\n PluginClass.prototype.option = function( opts ) {\n // bail out if not an object\n if ( !$.isPlainObject( opts ) ){\n return;\n }\n this.options = $.extend( true, this.options, opts );\n };\n }\n\n // make jQuery plugin\n $.fn[ namespace ] = function( arg0 /*, arg1 */ ) {\n if ( typeof arg0 == 'string' ) {\n // method call $().plugin( 'methodName', { options } )\n // shift arguments by 1\n var args = arraySlice.call( arguments, 1 );\n return methodCall( this, arg0, args );\n }\n // just $().plugin({ options })\n plainCall( this, arg0 );\n return this;\n };\n\n // $().plugin('methodName')\n function methodCall( $elems, methodName, args ) {\n var returnValue;\n var pluginMethodStr = '$().' + namespace + '(\"' + methodName + '\")';\n\n $elems.each( function( i, elem ) {\n // get instance\n var instance = $.data( elem, namespace );\n if ( !instance ) {\n logError( namespace + ' not initialized. Cannot call methods, i.e. ' +\n pluginMethodStr );\n return;\n }\n\n var method = instance[ methodName ];\n if ( !method || methodName.charAt(0) == '_' ) {\n logError( pluginMethodStr + ' is not a valid method' );\n return;\n }\n\n // apply method, get return value\n var value = method.apply( instance, args );\n // set return value if value is returned, use only first value\n returnValue = returnValue === undefined ? value : returnValue;\n });\n\n return returnValue !== undefined ? returnValue : $elems;\n }\n\n function plainCall( $elems, options ) {\n $elems.each( function( i, elem ) {\n var instance = $.data( elem, namespace );\n if ( instance ) {\n // set options & init\n instance.option( options );\n instance._init();\n } else {\n // initialize new instance\n instance = new PluginClass( elem, options );\n $.data( elem, namespace, instance );\n }\n });\n }\n\n updateJQuery( $ );\n\n}\n\n// ----- updateJQuery ----- //\n\n// set $.bridget for v1 backwards compatibility\nfunction updateJQuery( $ ) {\n if ( !$ || ( $ && $.bridget ) ) {\n return;\n }\n $.bridget = jQueryBridget;\n}\n\nupdateJQuery( jQuery || window.jQuery );\n\n// ----- ----- //\n\nreturn jQueryBridget;\n\n}));\n\n/**\n * EvEmitter v1.0.3\n * Lil' event emitter\n * MIT License\n */\n\n/* jshint unused: true, undef: true, strict: true */\n\n( function( global, factory ) {\n // universal module definition\n /* jshint strict: false */ /* globals define, module, window */\n if ( typeof define == 'function' && define.amd ) {\n // AMD - RequireJS\n define( 'ev-emitter/ev-emitter',factory );\n } else if ( typeof module == 'object' && module.exports ) {\n // CommonJS - Browserify, Webpack\n module.exports = factory();\n } else {\n // Browser globals\n global.EvEmitter = factory();\n }\n\n}( typeof window != 'undefined' ? window : this, function() {\n\n\n\nfunction EvEmitter() {}\n\nvar proto = EvEmitter.prototype;\n\nproto.on = function( eventName, listener ) {\n if ( !eventName || !listener ) {\n return;\n }\n // set events hash\n var events = this._events = this._events || {};\n // set listeners array\n var listeners = events[ eventName ] = events[ eventName ] || [];\n // only add once\n if ( listeners.indexOf( listener ) == -1 ) {\n listeners.push( listener );\n }\n\n return this;\n};\n\nproto.once = function( eventName, listener ) {\n if ( !eventName || !listener ) {\n return;\n }\n // add event\n this.on( eventName, listener );\n // set once flag\n // set onceEvents hash\n var onceEvents = this._onceEvents = this._onceEvents || {};\n // set onceListeners object\n var onceListeners = onceEvents[ eventName ] = onceEvents[ eventName ] || {};\n // set flag\n onceListeners[ listener ] = true;\n\n return this;\n};\n\nproto.off = function( eventName, listener ) {\n var listeners = this._events && this._events[ eventName ];\n if ( !listeners || !listeners.length ) {\n return;\n }\n var index = listeners.indexOf( listener );\n if ( index != -1 ) {\n listeners.splice( index, 1 );\n }\n\n return this;\n};\n\nproto.emitEvent = function( eventName, args ) {\n var listeners = this._events && this._events[ eventName ];\n if ( !listeners || !listeners.length ) {\n return;\n }\n var i = 0;\n var listener = listeners[i];\n args = args || [];\n // once stuff\n var onceListeners = this._onceEvents && this._onceEvents[ eventName ];\n\n while ( listener ) {\n var isOnce = onceListeners && onceListeners[ listener ];\n if ( isOnce ) {\n // remove listener\n // remove before trigger to prevent recursion\n this.off( eventName, listener );\n // unset once flag\n delete onceListeners[ listener ];\n }\n // trigger listener\n listener.apply( this, args );\n // get next listener\n i += isOnce ? 0 : 1;\n listener = listeners[i];\n }\n\n return this;\n};\n\nreturn EvEmitter;\n\n}));\n\n/*!\n * getSize v2.0.2\n * measure size of elements\n * MIT license\n */\n\n/*jshint browser: true, strict: true, undef: true, unused: true */\n/*global define: false, module: false, console: false */\n\n( function( window, factory ) {\n 'use strict';\n\n if ( typeof define == 'function' && define.amd ) {\n // AMD\n define( 'get-size/get-size',[],function() {\n return factory();\n });\n } else if ( typeof module == 'object' && module.exports ) {\n // CommonJS\n module.exports = factory();\n } else {\n // browser global\n window.getSize = factory();\n }\n\n})( window, function factory() {\n'use strict';\n\n// -------------------------- helpers -------------------------- //\n\n// get a number from a string, not a percentage\nfunction getStyleSize( value ) {\n var num = parseFloat( value );\n // not a percent like '100%', and a number\n var isValid = value.indexOf('%') == -1 && !isNaN( num );\n return isValid && num;\n}\n\nfunction noop() {}\n\nvar logError = typeof console == 'undefined' ? noop :\n function( message ) {\n console.error( message );\n };\n\n// -------------------------- measurements -------------------------- //\n\nvar measurements = [\n 'paddingLeft',\n 'paddingRight',\n 'paddingTop',\n 'paddingBottom',\n 'marginLeft',\n 'marginRight',\n 'marginTop',\n 'marginBottom',\n 'borderLeftWidth',\n 'borderRightWidth',\n 'borderTopWidth',\n 'borderBottomWidth'\n];\n\nvar measurementsLength = measurements.length;\n\nfunction getZeroSize() {\n var size = {\n width: 0,\n height: 0,\n innerWidth: 0,\n innerHeight: 0,\n outerWidth: 0,\n outerHeight: 0\n };\n for ( var i=0; i < measurementsLength; i++ ) {\n var measurement = measurements[i];\n size[ measurement ] = 0;\n }\n return size;\n}\n\n// -------------------------- getStyle -------------------------- //\n\n/**\n * getStyle, get style of element, check for Firefox bug\n * https://bugzilla.mozilla.org/show_bug.cgi?id=548397\n */\nfunction getStyle( elem ) {\n var style = getComputedStyle( elem );\n if ( !style ) {\n logError( 'Style returned ' + style +\n '. Are you running this code in a hidden iframe on Firefox? ' +\n 'See http://bit.ly/getsizebug1' );\n }\n return style;\n}\n\n// -------------------------- setup -------------------------- //\n\nvar isSetup = false;\n\nvar isBoxSizeOuter;\n\n/**\n * setup\n * check isBoxSizerOuter\n * do on first getSize() rather than on page load for Firefox bug\n */\nfunction setup() {\n // setup once\n if ( isSetup ) {\n return;\n }\n isSetup = true;\n\n // -------------------------- box sizing -------------------------- //\n\n /**\n * WebKit measures the outer-width on style.width on border-box elems\n * IE & Firefox<29 measures the inner-width\n */\n var div = document.createElement('div');\n div.style.width = '200px';\n div.style.padding = '1px 2px 3px 4px';\n div.style.borderStyle = 'solid';\n div.style.borderWidth = '1px 2px 3px 4px';\n div.style.boxSizing = 'border-box';\n\n var body = document.body || document.documentElement;\n body.appendChild( div );\n var style = getStyle( div );\n\n getSize.isBoxSizeOuter = isBoxSizeOuter = getStyleSize( style.width ) == 200;\n body.removeChild( div );\n\n}\n\n// -------------------------- getSize -------------------------- //\n\nfunction getSize( elem ) {\n setup();\n\n // use querySeletor if elem is string\n if ( typeof elem == 'string' ) {\n elem = document.querySelector( elem );\n }\n\n // do not proceed on non-objects\n if ( !elem || typeof elem != 'object' || !elem.nodeType ) {\n return;\n }\n\n var style = getStyle( elem );\n\n // if hidden, everything is 0\n if ( style.display == 'none' ) {\n return getZeroSize();\n }\n\n var size = {};\n size.width = elem.offsetWidth;\n size.height = elem.offsetHeight;\n\n var isBorderBox = size.isBorderBox = style.boxSizing == 'border-box';\n\n // get all measurements\n for ( var i=0; i < measurementsLength; i++ ) {\n var measurement = measurements[i];\n var value = style[ measurement ];\n var num = parseFloat( value );\n // any 'auto', 'medium' value will be 0\n size[ measurement ] = !isNaN( num ) ? num : 0;\n }\n\n var paddingWidth = size.paddingLeft + size.paddingRight;\n var paddingHeight = size.paddingTop + size.paddingBottom;\n var marginWidth = size.marginLeft + size.marginRight;\n var marginHeight = size.marginTop + size.marginBottom;\n var borderWidth = size.borderLeftWidth + size.borderRightWidth;\n var borderHeight = size.borderTopWidth + size.borderBottomWidth;\n\n var isBorderBoxSizeOuter = isBorderBox && isBoxSizeOuter;\n\n // overwrite width and height if we can get it from style\n var styleWidth = getStyleSize( style.width );\n if ( styleWidth !== false ) {\n size.width = styleWidth +\n // add padding and border unless it's already including it\n ( isBorderBoxSizeOuter ? 0 : paddingWidth + borderWidth );\n }\n\n var styleHeight = getStyleSize( style.height );\n if ( styleHeight !== false ) {\n size.height = styleHeight +\n // add padding and border unless it's already including it\n ( isBorderBoxSizeOuter ? 0 : paddingHeight + borderHeight );\n }\n\n size.innerWidth = size.width - ( paddingWidth + borderWidth );\n size.innerHeight = size.height - ( paddingHeight + borderHeight );\n\n size.outerWidth = size.width + marginWidth;\n size.outerHeight = size.height + marginHeight;\n\n return size;\n}\n\nreturn getSize;\n\n});\n\n/**\n * matchesSelector v2.0.2\n * matchesSelector( element, '.selector' )\n * MIT license\n */\n\n/*jshint browser: true, strict: true, undef: true, unused: true */\n\n( function( window, factory ) {\n /*global define: false, module: false */\n 'use strict';\n // universal module definition\n if ( typeof define == 'function' && define.amd ) {\n // AMD\n define( 'desandro-matches-selector/matches-selector',factory );\n } else if ( typeof module == 'object' && module.exports ) {\n // CommonJS\n module.exports = factory();\n } else {\n // browser global\n window.matchesSelector = factory();\n }\n\n}( window, function factory() {\n 'use strict';\n\n var matchesMethod = ( function() {\n var ElemProto = window.Element.prototype;\n // check for the standard method name first\n if ( ElemProto.matches ) {\n return 'matches';\n }\n // check un-prefixed\n if ( ElemProto.matchesSelector ) {\n return 'matchesSelector';\n }\n // check vendor prefixes\n var prefixes = [ 'webkit', 'moz', 'ms', 'o' ];\n\n for ( var i=0; i < prefixes.length; i++ ) {\n var prefix = prefixes[i];\n var method = prefix + 'MatchesSelector';\n if ( ElemProto[ method ] ) {\n return method;\n }\n }\n })();\n\n return function matchesSelector( elem, selector ) {\n return elem[ matchesMethod ]( selector );\n };\n\n}));\n\n/**\n * Fizzy UI utils v2.0.5\n * MIT license\n */\n\n/*jshint browser: true, undef: true, unused: true, strict: true */\n\n( function( window, factory ) {\n // universal module definition\n /*jshint strict: false */ /*globals define, module, require */\n\n if ( typeof define == 'function' && define.amd ) {\n // AMD\n define( 'fizzy-ui-utils/utils',[\n 'desandro-matches-selector/matches-selector'\n ], function( matchesSelector ) {\n return factory( window, matchesSelector );\n });\n } else if ( typeof module == 'object' && module.exports ) {\n // CommonJS\n module.exports = factory(\n window,\n require('desandro-matches-selector')\n );\n } else {\n // browser global\n window.fizzyUIUtils = factory(\n window,\n window.matchesSelector\n );\n }\n\n}( window, function factory( window, matchesSelector ) {\n\n\n\nvar utils = {};\n\n// ----- extend ----- //\n\n// extends objects\nutils.extend = function( a, b ) {\n for ( var prop in b ) {\n a[ prop ] = b[ prop ];\n }\n return a;\n};\n\n// ----- modulo ----- //\n\nutils.modulo = function( num, div ) {\n return ( ( num % div ) + div ) % div;\n};\n\n// ----- makeArray ----- //\n\n// turn element or nodeList into an array\nutils.makeArray = function( obj ) {\n var ary = [];\n if ( Array.isArray( obj ) ) {\n // use object if already an array\n ary = obj;\n } else if ( obj && typeof obj == 'object' &&\n typeof obj.length == 'number' ) {\n // convert nodeList to array\n for ( var i=0; i < obj.length; i++ ) {\n ary.push( obj[i] );\n }\n } else {\n // array of single index\n ary.push( obj );\n }\n return ary;\n};\n\n// ----- removeFrom ----- //\n\nutils.removeFrom = function( ary, obj ) {\n var index = ary.indexOf( obj );\n if ( index != -1 ) {\n ary.splice( index, 1 );\n }\n};\n\n// ----- getParent ----- //\n\nutils.getParent = function( elem, selector ) {\n while ( elem.parentNode && elem != document.body ) {\n elem = elem.parentNode;\n if ( matchesSelector( elem, selector ) ) {\n return elem;\n }\n }\n};\n\n// ----- getQueryElement ----- //\n\n// use element as selector string\nutils.getQueryElement = function( elem ) {\n if ( typeof elem == 'string' ) {\n return document.querySelector( elem );\n }\n return elem;\n};\n\n// ----- handleEvent ----- //\n\n// enable .ontype to trigger from .addEventListener( elem, 'type' )\nutils.handleEvent = function( event ) {\n var method = 'on' + event.type;\n if ( this[ method ] ) {\n this[ method ]( event );\n }\n};\n\n// ----- filterFindElements ----- //\n\nutils.filterFindElements = function( elems, selector ) {\n // make array of elems\n elems = utils.makeArray( elems );\n var ffElems = [];\n\n elems.forEach( function( elem ) {\n // check that elem is an actual element\n if ( !( elem instanceof HTMLElement ) ) {\n return;\n }\n // add elem if no selector\n if ( !selector ) {\n ffElems.push( elem );\n return;\n }\n // filter & find items if we have a selector\n // filter\n if ( matchesSelector( elem, selector ) ) {\n ffElems.push( elem );\n }\n // find children\n var childElems = elem.querySelectorAll( selector );\n // concat childElems to filterFound array\n for ( var i=0; i < childElems.length; i++ ) {\n ffElems.push( childElems[i] );\n }\n });\n\n return ffElems;\n};\n\n// ----- debounceMethod ----- //\n\nutils.debounceMethod = function( _class, methodName, threshold ) {\n // original method\n var method = _class.prototype[ methodName ];\n var timeoutName = methodName + 'Timeout';\n\n _class.prototype[ methodName ] = function() {\n var timeout = this[ timeoutName ];\n if ( timeout ) {\n clearTimeout( timeout );\n }\n var args = arguments;\n\n var _this = this;\n this[ timeoutName ] = setTimeout( function() {\n method.apply( _this, args );\n delete _this[ timeoutName ];\n }, threshold || 100 );\n };\n};\n\n// ----- docReady ----- //\n\nutils.docReady = function( callback ) {\n var readyState = document.readyState;\n if ( readyState == 'complete' || readyState == 'interactive' ) {\n // do async to allow for other scripts to run. metafizzy/flickity#441\n setTimeout( callback );\n } else {\n document.addEventListener( 'DOMContentLoaded', callback );\n }\n};\n\n// ----- htmlInit ----- //\n\n// http://jamesroberts.name/blog/2010/02/22/string-functions-for-javascript-trim-to-camel-case-to-dashed-and-to-underscore/\nutils.toDashed = function( str ) {\n return str.replace( /(.)([A-Z])/g, function( match, $1, $2 ) {\n return $1 + '-' + $2;\n }).toLowerCase();\n};\n\nvar console = window.console;\n/**\n * allow user to initialize classes via [data-namespace] or .js-namespace class\n * htmlInit( Widget, 'widgetName' )\n * options are parsed from data-namespace-options\n */\nutils.htmlInit = function( WidgetClass, namespace ) {\n utils.docReady( function() {\n var dashedNamespace = utils.toDashed( namespace );\n var dataAttr = 'data-' + dashedNamespace;\n var dataAttrElems = document.querySelectorAll( '[' + dataAttr + ']' );\n var jsDashElems = document.querySelectorAll( '.js-' + dashedNamespace );\n var elems = utils.makeArray( dataAttrElems )\n .concat( utils.makeArray( jsDashElems ) );\n var dataOptionsAttr = dataAttr + '-options';\n var jQuery = window.jQuery;\n\n elems.forEach( function( elem ) {\n var attr = elem.getAttribute( dataAttr ) ||\n elem.getAttribute( dataOptionsAttr );\n var options;\n try {\n options = attr && JSON.parse( attr );\n } catch ( error ) {\n // log error, do not initialize\n if ( console ) {\n console.error( 'Error parsing ' + dataAttr + ' on ' + elem.className +\n ': ' + error );\n }\n return;\n }\n // initialize\n var instance = new WidgetClass( elem, options );\n // make available via $().data('namespace')\n if ( jQuery ) {\n jQuery.data( elem, namespace, instance );\n }\n });\n\n });\n};\n\n// ----- ----- //\n\nreturn utils;\n\n}));\n\n/**\n * Outlayer Item\n */\n\n( function( window, factory ) {\n // universal module definition\n /* jshint strict: false */ /* globals define, module, require */\n if ( typeof define == 'function' && define.amd ) {\n // AMD - RequireJS\n define( 'outlayer/item',[\n 'ev-emitter/ev-emitter',\n 'get-size/get-size'\n ],\n factory\n );\n } else if ( typeof module == 'object' && module.exports ) {\n // CommonJS - Browserify, Webpack\n module.exports = factory(\n require('ev-emitter'),\n require('get-size')\n );\n } else {\n // browser global\n window.Outlayer = {};\n window.Outlayer.Item = factory(\n window.EvEmitter,\n window.getSize\n );\n }\n\n}( window, function factory( EvEmitter, getSize ) {\n'use strict';\n\n// ----- helpers ----- //\n\nfunction isEmptyObj( obj ) {\n for ( var prop in obj ) {\n return false;\n }\n prop = null;\n return true;\n}\n\n// -------------------------- CSS3 support -------------------------- //\n\n\nvar docElemStyle = document.documentElement.style;\n\nvar transitionProperty = typeof docElemStyle.transition == 'string' ?\n 'transition' : 'WebkitTransition';\nvar transformProperty = typeof docElemStyle.transform == 'string' ?\n 'transform' : 'WebkitTransform';\n\nvar transitionEndEvent = {\n WebkitTransition: 'webkitTransitionEnd',\n transition: 'transitionend'\n}[ transitionProperty ];\n\n// cache all vendor properties that could have vendor prefix\nvar vendorProperties = {\n transform: transformProperty,\n transition: transitionProperty,\n transitionDuration: transitionProperty + 'Duration',\n transitionProperty: transitionProperty + 'Property',\n transitionDelay: transitionProperty + 'Delay'\n};\n\n// -------------------------- Item -------------------------- //\n\nfunction Item( element, layout ) {\n if ( !element ) {\n return;\n }\n\n this.element = element;\n // parent layout class, i.e. Masonry, Isotope, or Packery\n this.layout = layout;\n this.position = {\n x: 0,\n y: 0\n };\n\n this._create();\n}\n\n// inherit EvEmitter\nvar proto = Item.prototype = Object.create( EvEmitter.prototype );\nproto.constructor = Item;\n\nproto._create = function() {\n // transition objects\n this._transn = {\n ingProperties: {},\n clean: {},\n onEnd: {}\n };\n\n this.css({\n position: 'absolute'\n });\n};\n\n// trigger specified handler for event type\nproto.handleEvent = function( event ) {\n var method = 'on' + event.type;\n if ( this[ method ] ) {\n this[ method ]( event );\n }\n};\n\nproto.getSize = function() {\n this.size = getSize( this.element );\n};\n\n/**\n * apply CSS styles to element\n * @param {Object} style\n */\nproto.css = function( style ) {\n var elemStyle = this.element.style;\n\n for ( var prop in style ) {\n // use vendor property if available\n var supportedProp = vendorProperties[ prop ] || prop;\n elemStyle[ supportedProp ] = style[ prop ];\n }\n};\n\n // measure position, and sets it\nproto.getPosition = function() {\n var style = getComputedStyle( this.element );\n var isOriginLeft = this.layout._getOption('originLeft');\n var isOriginTop = this.layout._getOption('originTop');\n var xValue = style[ isOriginLeft ? 'left' : 'right' ];\n var yValue = style[ isOriginTop ? 'top' : 'bottom' ];\n // convert percent to pixels\n var layoutSize = this.layout.size;\n var x = xValue.indexOf('%') != -1 ?\n ( parseFloat( xValue ) / 100 ) * layoutSize.width : parseInt( xValue, 10 );\n var y = yValue.indexOf('%') != -1 ?\n ( parseFloat( yValue ) / 100 ) * layoutSize.height : parseInt( yValue, 10 );\n\n // clean up 'auto' or other non-integer values\n x = isNaN( x ) ? 0 : x;\n y = isNaN( y ) ? 0 : y;\n // remove padding from measurement\n x -= isOriginLeft ? layoutSize.paddingLeft : layoutSize.paddingRight;\n y -= isOriginTop ? layoutSize.paddingTop : layoutSize.paddingBottom;\n\n this.position.x = x;\n this.position.y = y;\n};\n\n// set settled position, apply padding\nproto.layoutPosition = function() {\n var layoutSize = this.layout.size;\n var style = {};\n var isOriginLeft = this.layout._getOption('originLeft');\n var isOriginTop = this.layout._getOption('originTop');\n\n // x\n var xPadding = isOriginLeft ? 'paddingLeft' : 'paddingRight';\n var xProperty = isOriginLeft ? 'left' : 'right';\n var xResetProperty = isOriginLeft ? 'right' : 'left';\n\n var x = this.position.x + layoutSize[ xPadding ];\n // set in percentage or pixels\n style[ xProperty ] = this.getXValue( x );\n // reset other property\n style[ xResetProperty ] = '';\n\n // y\n var yPadding = isOriginTop ? 'paddingTop' : 'paddingBottom';\n var yProperty = isOriginTop ? 'top' : 'bottom';\n var yResetProperty = isOriginTop ? 'bottom' : 'top';\n\n var y = this.position.y + layoutSize[ yPadding ];\n // set in percentage or pixels\n style[ yProperty ] = this.getYValue( y );\n // reset other property\n style[ yResetProperty ] = '';\n\n this.css( style );\n this.emitEvent( 'layout', [ this ] );\n};\n\nproto.getXValue = function( x ) {\n var isHorizontal = this.layout._getOption('horizontal');\n return this.layout.options.percentPosition && !isHorizontal ?\n ( ( x / this.layout.size.width ) * 100 ) + '%' : x + 'px';\n};\n\nproto.getYValue = function( y ) {\n var isHorizontal = this.layout._getOption('horizontal');\n return this.layout.options.percentPosition && isHorizontal ?\n ( ( y / this.layout.size.height ) * 100 ) + '%' : y + 'px';\n};\n\nproto._transitionTo = function( x, y ) {\n this.getPosition();\n // get current x & y from top/left\n var curX = this.position.x;\n var curY = this.position.y;\n\n var compareX = parseInt( x, 10 );\n var compareY = parseInt( y, 10 );\n var didNotMove = compareX === this.position.x && compareY === this.position.y;\n\n // save end position\n this.setPosition( x, y );\n\n // if did not move and not transitioning, just go to layout\n if ( didNotMove && !this.isTransitioning ) {\n this.layoutPosition();\n return;\n }\n\n var transX = x - curX;\n var transY = y - curY;\n var transitionStyle = {};\n transitionStyle.transform = this.getTranslate( transX, transY );\n\n this.transition({\n to: transitionStyle,\n onTransitionEnd: {\n transform: this.layoutPosition\n },\n isCleaning: true\n });\n};\n\nproto.getTranslate = function( x, y ) {\n // flip cooridinates if origin on right or bottom\n var isOriginLeft = this.layout._getOption('originLeft');\n var isOriginTop = this.layout._getOption('originTop');\n x = isOriginLeft ? x : -x;\n y = isOriginTop ? y : -y;\n return 'translate3d(' + x + 'px, ' + y + 'px, 0)';\n};\n\n// non transition + transform support\nproto.goTo = function( x, y ) {\n this.setPosition( x, y );\n this.layoutPosition();\n};\n\nproto.moveTo = proto._transitionTo;\n\nproto.setPosition = function( x, y ) {\n this.position.x = parseInt( x, 10 );\n this.position.y = parseInt( y, 10 );\n};\n\n// ----- transition ----- //\n\n/**\n * @param {Object} style - CSS\n * @param {Function} onTransitionEnd\n */\n\n// non transition, just trigger callback\nproto._nonTransition = function( args ) {\n this.css( args.to );\n if ( args.isCleaning ) {\n this._removeStyles( args.to );\n }\n for ( var prop in args.onTransitionEnd ) {\n args.onTransitionEnd[ prop ].call( this );\n }\n};\n\n/**\n * proper transition\n * @param {Object} args - arguments\n * @param {Object} to - style to transition to\n * @param {Object} from - style to start transition from\n * @param {Boolean} isCleaning - removes transition styles after transition\n * @param {Function} onTransitionEnd - callback\n */\nproto.transition = function( args ) {\n // redirect to nonTransition if no transition duration\n if ( !parseFloat( this.layout.options.transitionDuration ) ) {\n this._nonTransition( args );\n return;\n }\n\n var _transition = this._transn;\n // keep track of onTransitionEnd callback by css property\n for ( var prop in args.onTransitionEnd ) {\n _transition.onEnd[ prop ] = args.onTransitionEnd[ prop ];\n }\n // keep track of properties that are transitioning\n for ( prop in args.to ) {\n _transition.ingProperties[ prop ] = true;\n // keep track of properties to clean up when transition is done\n if ( args.isCleaning ) {\n _transition.clean[ prop ] = true;\n }\n }\n\n // set from styles\n if ( args.from ) {\n this.css( args.from );\n // force redraw. http://blog.alexmaccaw.com/css-transitions\n var h = this.element.offsetHeight;\n // hack for JSHint to hush about unused var\n h = null;\n }\n // enable transition\n this.enableTransition( args.to );\n // set styles that are transitioning\n this.css( args.to );\n\n this.isTransitioning = true;\n\n};\n\n// dash before all cap letters, including first for\n// WebkitTransform => -webkit-transform\nfunction toDashedAll( str ) {\n return str.replace( /([A-Z])/g, function( $1 ) {\n return '-' + $1.toLowerCase();\n });\n}\n\nvar transitionProps = 'opacity,' + toDashedAll( transformProperty );\n\nproto.enableTransition = function(/* style */) {\n // HACK changing transitionProperty during a transition\n // will cause transition to jump\n if ( this.isTransitioning ) {\n return;\n }\n\n // make `transition: foo, bar, baz` from style object\n // HACK un-comment this when enableTransition can work\n // while a transition is happening\n // var transitionValues = [];\n // for ( var prop in style ) {\n // // dash-ify camelCased properties like WebkitTransition\n // prop = vendorProperties[ prop ] || prop;\n // transitionValues.push( toDashedAll( prop ) );\n // }\n // munge number to millisecond, to match stagger\n var duration = this.layout.options.transitionDuration;\n duration = typeof duration == 'number' ? duration + 'ms' : duration;\n // enable transition styles\n this.css({\n transitionProperty: transitionProps,\n transitionDuration: duration,\n transitionDelay: this.staggerDelay || 0\n });\n // listen for transition end event\n this.element.addEventListener( transitionEndEvent, this, false );\n};\n\n// ----- events ----- //\n\nproto.onwebkitTransitionEnd = function( event ) {\n this.ontransitionend( event );\n};\n\nproto.onotransitionend = function( event ) {\n this.ontransitionend( event );\n};\n\n// properties that I munge to make my life easier\nvar dashedVendorProperties = {\n '-webkit-transform': 'transform'\n};\n\nproto.ontransitionend = function( event ) {\n // disregard bubbled events from children\n if ( event.target !== this.element ) {\n return;\n }\n var _transition = this._transn;\n // get property name of transitioned property, convert to prefix-free\n var propertyName = dashedVendorProperties[ event.propertyName ] || event.propertyName;\n\n // remove property that has completed transitioning\n delete _transition.ingProperties[ propertyName ];\n // check if any properties are still transitioning\n if ( isEmptyObj( _transition.ingProperties ) ) {\n // all properties have completed transitioning\n this.disableTransition();\n }\n // clean style\n if ( propertyName in _transition.clean ) {\n // clean up style\n this.element.style[ event.propertyName ] = '';\n delete _transition.clean[ propertyName ];\n }\n // trigger onTransitionEnd callback\n if ( propertyName in _transition.onEnd ) {\n var onTransitionEnd = _transition.onEnd[ propertyName ];\n onTransitionEnd.call( this );\n delete _transition.onEnd[ propertyName ];\n }\n\n this.emitEvent( 'transitionEnd', [ this ] );\n};\n\nproto.disableTransition = function() {\n this.removeTransitionStyles();\n this.element.removeEventListener( transitionEndEvent, this, false );\n this.isTransitioning = false;\n};\n\n/**\n * removes style property from element\n * @param {Object} style\n**/\nproto._removeStyles = function( style ) {\n // clean up transition styles\n var cleanStyle = {};\n for ( var prop in style ) {\n cleanStyle[ prop ] = '';\n }\n this.css( cleanStyle );\n};\n\nvar cleanTransitionStyle = {\n transitionProperty: '',\n transitionDuration: '',\n transitionDelay: ''\n};\n\nproto.removeTransitionStyles = function() {\n // remove transition\n this.css( cleanTransitionStyle );\n};\n\n// ----- stagger ----- //\n\nproto.stagger = function( delay ) {\n delay = isNaN( delay ) ? 0 : delay;\n this.staggerDelay = delay + 'ms';\n};\n\n// ----- show/hide/remove ----- //\n\n// remove element from DOM\nproto.removeElem = function() {\n this.element.parentNode.removeChild( this.element );\n // remove display: none\n this.css({ display: '' });\n this.emitEvent( 'remove', [ this ] );\n};\n\nproto.remove = function() {\n // just remove element if no transition support or no transition\n if ( !transitionProperty || !parseFloat( this.layout.options.transitionDuration ) ) {\n this.removeElem();\n return;\n }\n\n // start transition\n this.once( 'transitionEnd', function() {\n this.removeElem();\n });\n this.hide();\n};\n\nproto.reveal = function() {\n delete this.isHidden;\n // remove display: none\n this.css({ display: '' });\n\n var options = this.layout.options;\n\n var onTransitionEnd = {};\n var transitionEndProperty = this.getHideRevealTransitionEndProperty('visibleStyle');\n onTransitionEnd[ transitionEndProperty ] = this.onRevealTransitionEnd;\n\n this.transition({\n from: options.hiddenStyle,\n to: options.visibleStyle,\n isCleaning: true,\n onTransitionEnd: onTransitionEnd\n });\n};\n\nproto.onRevealTransitionEnd = function() {\n // check if still visible\n // during transition, item may have been hidden\n if ( !this.isHidden ) {\n this.emitEvent('reveal');\n }\n};\n\n/**\n * get style property use for hide/reveal transition end\n * @param {String} styleProperty - hiddenStyle/visibleStyle\n * @returns {String}\n */\nproto.getHideRevealTransitionEndProperty = function( styleProperty ) {\n var optionStyle = this.layout.options[ styleProperty ];\n // use opacity\n if ( optionStyle.opacity ) {\n return 'opacity';\n }\n // get first property\n for ( var prop in optionStyle ) {\n return prop;\n }\n};\n\nproto.hide = function() {\n // set flag\n this.isHidden = true;\n // remove display: none\n this.css({ display: '' });\n\n var options = this.layout.options;\n\n var onTransitionEnd = {};\n var transitionEndProperty = this.getHideRevealTransitionEndProperty('hiddenStyle');\n onTransitionEnd[ transitionEndProperty ] = this.onHideTransitionEnd;\n\n this.transition({\n from: options.visibleStyle,\n to: options.hiddenStyle,\n // keep hidden stuff hidden\n isCleaning: true,\n onTransitionEnd: onTransitionEnd\n });\n};\n\nproto.onHideTransitionEnd = function() {\n // check if still hidden\n // during transition, item may have been un-hidden\n if ( this.isHidden ) {\n this.css({ display: 'none' });\n this.emitEvent('hide');\n }\n};\n\nproto.destroy = function() {\n this.css({\n position: '',\n left: '',\n right: '',\n top: '',\n bottom: '',\n transition: '',\n transform: ''\n });\n};\n\nreturn Item;\n\n}));\n\n/*!\n * Outlayer v2.1.0\n * the brains and guts of a layout library\n * MIT license\n */\n\n( function( window, factory ) {\n 'use strict';\n // universal module definition\n /* jshint strict: false */ /* globals define, module, require */\n if ( typeof define == 'function' && define.amd ) {\n // AMD - RequireJS\n define( 'outlayer/outlayer',[\n 'ev-emitter/ev-emitter',\n 'get-size/get-size',\n 'fizzy-ui-utils/utils',\n './item'\n ],\n function( EvEmitter, getSize, utils, Item ) {\n return factory( window, EvEmitter, getSize, utils, Item);\n }\n );\n } else if ( typeof module == 'object' && module.exports ) {\n // CommonJS - Browserify, Webpack\n module.exports = factory(\n window,\n require('ev-emitter'),\n require('get-size'),\n require('fizzy-ui-utils'),\n require('./item')\n );\n } else {\n // browser global\n window.Outlayer = factory(\n window,\n window.EvEmitter,\n window.getSize,\n window.fizzyUIUtils,\n window.Outlayer.Item\n );\n }\n\n}( window, function factory( window, EvEmitter, getSize, utils, Item ) {\n'use strict';\n\n// ----- vars ----- //\n\nvar console = window.console;\nvar jQuery = window.jQuery;\nvar noop = function() {};\n\n// -------------------------- Outlayer -------------------------- //\n\n// globally unique identifiers\nvar GUID = 0;\n// internal store of all Outlayer intances\nvar instances = {};\n\n\n/**\n * @param {Element, String} element\n * @param {Object} options\n * @constructor\n */\nfunction Outlayer( element, options ) {\n var queryElement = utils.getQueryElement( element );\n if ( !queryElement ) {\n if ( console ) {\n console.error( 'Bad element for ' + this.constructor.namespace +\n ': ' + ( queryElement || element ) );\n }\n return;\n }\n this.element = queryElement;\n // add jQuery\n if ( jQuery ) {\n this.$element = jQuery( this.element );\n }\n\n // options\n this.options = utils.extend( {}, this.constructor.defaults );\n this.option( options );\n\n // add id for Outlayer.getFromElement\n var id = ++GUID;\n this.element.outlayerGUID = id; // expando\n instances[ id ] = this; // associate via id\n\n // kick it off\n this._create();\n\n var isInitLayout = this._getOption('initLayout');\n if ( isInitLayout ) {\n this.layout();\n }\n}\n\n// settings are for internal use only\nOutlayer.namespace = 'outlayer';\nOutlayer.Item = Item;\n\n// default options\nOutlayer.defaults = {\n containerStyle: {\n position: 'relative'\n },\n initLayout: true,\n originLeft: true,\n originTop: true,\n resize: true,\n resizeContainer: true,\n // item options\n transitionDuration: '0.4s',\n hiddenStyle: {\n opacity: 0,\n transform: 'scale(0.001)'\n },\n visibleStyle: {\n opacity: 1,\n transform: 'scale(1)'\n }\n};\n\nvar proto = Outlayer.prototype;\n// inherit EvEmitter\nutils.extend( proto, EvEmitter.prototype );\n\n/**\n * set options\n * @param {Object} opts\n */\nproto.option = function( opts ) {\n utils.extend( this.options, opts );\n};\n\n/**\n * get backwards compatible option value, check old name\n */\nproto._getOption = function( option ) {\n var oldOption = this.constructor.compatOptions[ option ];\n return oldOption && this.options[ oldOption ] !== undefined ?\n this.options[ oldOption ] : this.options[ option ];\n};\n\nOutlayer.compatOptions = {\n // currentName: oldName\n initLayout: 'isInitLayout',\n horizontal: 'isHorizontal',\n layoutInstant: 'isLayoutInstant',\n originLeft: 'isOriginLeft',\n originTop: 'isOriginTop',\n resize: 'isResizeBound',\n resizeContainer: 'isResizingContainer'\n};\n\nproto._create = function() {\n // get items from children\n this.reloadItems();\n // elements that affect layout, but are not laid out\n this.stamps = [];\n this.stamp( this.options.stamp );\n // set container style\n utils.extend( this.element.style, this.options.containerStyle );\n\n // bind resize method\n var canBindResize = this._getOption('resize');\n if ( canBindResize ) {\n this.bindResize();\n }\n};\n\n// goes through all children again and gets bricks in proper order\nproto.reloadItems = function() {\n // collection of item elements\n this.items = this._itemize( this.element.children );\n};\n\n\n/**\n * turn elements into Outlayer.Items to be used in layout\n * @param {Array or NodeList or HTMLElement} elems\n * @returns {Array} items - collection of new Outlayer Items\n */\nproto._itemize = function( elems ) {\n\n var itemElems = this._filterFindItemElements( elems );\n var Item = this.constructor.Item;\n\n // create new Outlayer Items for collection\n var items = [];\n for ( var i=0; i < itemElems.length; i++ ) {\n var elem = itemElems[i];\n var item = new Item( elem, this );\n items.push( item );\n }\n\n return items;\n};\n\n/**\n * get item elements to be used in layout\n * @param {Array or NodeList or HTMLElement} elems\n * @returns {Array} items - item elements\n */\nproto._filterFindItemElements = function( elems ) {\n return utils.filterFindElements( elems, this.options.itemSelector );\n};\n\n/**\n * getter method for getting item elements\n * @returns {Array} elems - collection of item elements\n */\nproto.getItemElements = function() {\n return this.items.map( function( item ) {\n return item.element;\n });\n};\n\n// ----- init & layout ----- //\n\n/**\n * lays out all items\n */\nproto.layout = function() {\n this._resetLayout();\n this._manageStamps();\n\n // don't animate first layout\n var layoutInstant = this._getOption('layoutInstant');\n var isInstant = layoutInstant !== undefined ?\n layoutInstant : !this._isLayoutInited;\n this.layoutItems( this.items, isInstant );\n\n // flag for initalized\n this._isLayoutInited = true;\n};\n\n// _init is alias for layout\nproto._init = proto.layout;\n\n/**\n * logic before any new layout\n */\nproto._resetLayout = function() {\n this.getSize();\n};\n\n\nproto.getSize = function() {\n this.size = getSize( this.element );\n};\n\n/**\n * get measurement from option, for columnWidth, rowHeight, gutter\n * if option is String -> get element from selector string, & get size of element\n * if option is Element -> get size of element\n * else use option as a number\n *\n * @param {String} measurement\n * @param {String} size - width or height\n * @private\n */\nproto._getMeasurement = function( measurement, size ) {\n var option = this.options[ measurement ];\n var elem;\n if ( !option ) {\n // default to 0\n this[ measurement ] = 0;\n } else {\n // use option as an element\n if ( typeof option == 'string' ) {\n elem = this.element.querySelector( option );\n } else if ( option instanceof HTMLElement ) {\n elem = option;\n }\n // use size of element, if element\n this[ measurement ] = elem ? getSize( elem )[ size ] : option;\n }\n};\n\n/**\n * layout a collection of item elements\n * @api public\n */\nproto.layoutItems = function( items, isInstant ) {\n items = this._getItemsForLayout( items );\n\n this._layoutItems( items, isInstant );\n\n this._postLayout();\n};\n\n/**\n * get the items to be laid out\n * you may want to skip over some items\n * @param {Array} items\n * @returns {Array} items\n */\nproto._getItemsForLayout = function( items ) {\n return items.filter( function( item ) {\n return !item.isIgnored;\n });\n};\n\n/**\n * layout items\n * @param {Array} items\n * @param {Boolean} isInstant\n */\nproto._layoutItems = function( items, isInstant ) {\n this._emitCompleteOnItems( 'layout', items );\n\n if ( !items || !items.length ) {\n // no items, emit event with empty array\n return;\n }\n\n var queue = [];\n\n items.forEach( function( item ) {\n // get x/y object from method\n var position = this._getItemLayoutPosition( item );\n // enqueue\n position.item = item;\n position.isInstant = isInstant || item.isLayoutInstant;\n queue.push( position );\n }, this );\n\n this._processLayoutQueue( queue );\n};\n\n/**\n * get item layout position\n * @param {Outlayer.Item} item\n * @returns {Object} x and y position\n */\nproto._getItemLayoutPosition = function( /* item */ ) {\n return {\n x: 0,\n y: 0\n };\n};\n\n/**\n * iterate over array and position each item\n * Reason being - separating this logic prevents 'layout invalidation'\n * thx @paul_irish\n * @param {Array} queue\n */\nproto._processLayoutQueue = function( queue ) {\n this.updateStagger();\n queue.forEach( function( obj, i ) {\n this._positionItem( obj.item, obj.x, obj.y, obj.isInstant, i );\n }, this );\n};\n\n// set stagger from option in milliseconds number\nproto.updateStagger = function() {\n var stagger = this.options.stagger;\n if ( stagger === null || stagger === undefined ) {\n this.stagger = 0;\n return;\n }\n this.stagger = getMilliseconds( stagger );\n return this.stagger;\n};\n\n/**\n * Sets position of item in DOM\n * @param {Outlayer.Item} item\n * @param {Number} x - horizontal position\n * @param {Number} y - vertical position\n * @param {Boolean} isInstant - disables transitions\n */\nproto._positionItem = function( item, x, y, isInstant, i ) {\n if ( isInstant ) {\n // if not transition, just set CSS\n item.goTo( x, y );\n } else {\n item.stagger( i * this.stagger );\n item.moveTo( x, y );\n }\n};\n\n/**\n * Any logic you want to do after each layout,\n * i.e. size the container\n */\nproto._postLayout = function() {\n this.resizeContainer();\n};\n\nproto.resizeContainer = function() {\n var isResizingContainer = this._getOption('resizeContainer');\n if ( !isResizingContainer ) {\n return;\n }\n var size = this._getContainerSize();\n if ( size ) {\n this._setContainerMeasure( size.width, true );\n this._setContainerMeasure( size.height, false );\n }\n};\n\n/**\n * Sets width or height of container if returned\n * @returns {Object} size\n * @param {Number} width\n * @param {Number} height\n */\nproto._getContainerSize = noop;\n\n/**\n * @param {Number} measure - size of width or height\n * @param {Boolean} isWidth\n */\nproto._setContainerMeasure = function( measure, isWidth ) {\n if ( measure === undefined ) {\n return;\n }\n\n var elemSize = this.size;\n // add padding and border width if border box\n if ( elemSize.isBorderBox ) {\n measure += isWidth ? elemSize.paddingLeft + elemSize.paddingRight +\n elemSize.borderLeftWidth + elemSize.borderRightWidth :\n elemSize.paddingBottom + elemSize.paddingTop +\n elemSize.borderTopWidth + elemSize.borderBottomWidth;\n }\n\n measure = Math.max( measure, 0 );\n this.element.style[ isWidth ? 'width' : 'height' ] = measure + 'px';\n};\n\n/**\n * emit eventComplete on a collection of items events\n * @param {String} eventName\n * @param {Array} items - Outlayer.Items\n */\nproto._emitCompleteOnItems = function( eventName, items ) {\n var _this = this;\n function onComplete() {\n _this.dispatchEvent( eventName + 'Complete', null, [ items ] );\n }\n\n var count = items.length;\n if ( !items || !count ) {\n onComplete();\n return;\n }\n\n var doneCount = 0;\n function tick() {\n doneCount++;\n if ( doneCount == count ) {\n onComplete();\n }\n }\n\n // bind callback\n items.forEach( function( item ) {\n item.once( eventName, tick );\n });\n};\n\n/**\n * emits events via EvEmitter and jQuery events\n * @param {String} type - name of event\n * @param {Event} event - original event\n * @param {Array} args - extra arguments\n */\nproto.dispatchEvent = function( type, event, args ) {\n // add original event to arguments\n var emitArgs = event ? [ event ].concat( args ) : args;\n this.emitEvent( type, emitArgs );\n\n if ( jQuery ) {\n // set this.$element\n this.$element = this.$element || jQuery( this.element );\n if ( event ) {\n // create jQuery event\n var $event = jQuery.Event( event );\n $event.type = type;\n this.$element.trigger( $event, args );\n } else {\n // just trigger with type if no event available\n this.$element.trigger( type, args );\n }\n }\n};\n\n// -------------------------- ignore & stamps -------------------------- //\n\n\n/**\n * keep item in collection, but do not lay it out\n * ignored items do not get skipped in layout\n * @param {Element} elem\n */\nproto.ignore = function( elem ) {\n var item = this.getItem( elem );\n if ( item ) {\n item.isIgnored = true;\n }\n};\n\n/**\n * return item to layout collection\n * @param {Element} elem\n */\nproto.unignore = function( elem ) {\n var item = this.getItem( elem );\n if ( item ) {\n delete item.isIgnored;\n }\n};\n\n/**\n * adds elements to stamps\n * @param {NodeList, Array, Element, or String} elems\n */\nproto.stamp = function( elems ) {\n elems = this._find( elems );\n if ( !elems ) {\n return;\n }\n\n this.stamps = this.stamps.concat( elems );\n // ignore\n elems.forEach( this.ignore, this );\n};\n\n/**\n * removes elements to stamps\n * @param {NodeList, Array, or Element} elems\n */\nproto.unstamp = function( elems ) {\n elems = this._find( elems );\n if ( !elems ){\n return;\n }\n\n elems.forEach( function( elem ) {\n // filter out removed stamp elements\n utils.removeFrom( this.stamps, elem );\n this.unignore( elem );\n }, this );\n};\n\n/**\n * finds child elements\n * @param {NodeList, Array, Element, or String} elems\n * @returns {Array} elems\n */\nproto._find = function( elems ) {\n if ( !elems ) {\n return;\n }\n // if string, use argument as selector string\n if ( typeof elems == 'string' ) {\n elems = this.element.querySelectorAll( elems );\n }\n elems = utils.makeArray( elems );\n return elems;\n};\n\nproto._manageStamps = function() {\n if ( !this.stamps || !this.stamps.length ) {\n return;\n }\n\n this._getBoundingRect();\n\n this.stamps.forEach( this._manageStamp, this );\n};\n\n// update boundingLeft / Top\nproto._getBoundingRect = function() {\n // get bounding rect for container element\n var boundingRect = this.element.getBoundingClientRect();\n var size = this.size;\n this._boundingRect = {\n left: boundingRect.left + size.paddingLeft + size.borderLeftWidth,\n top: boundingRect.top + size.paddingTop + size.borderTopWidth,\n right: boundingRect.right - ( size.paddingRight + size.borderRightWidth ),\n bottom: boundingRect.bottom - ( size.paddingBottom + size.borderBottomWidth )\n };\n};\n\n/**\n * @param {Element} stamp\n**/\nproto._manageStamp = noop;\n\n/**\n * get x/y position of element relative to container element\n * @param {Element} elem\n * @returns {Object} offset - has left, top, right, bottom\n */\nproto._getElementOffset = function( elem ) {\n var boundingRect = elem.getBoundingClientRect();\n var thisRect = this._boundingRect;\n var size = getSize( elem );\n var offset = {\n left: boundingRect.left - thisRect.left - size.marginLeft,\n top: boundingRect.top - thisRect.top - size.marginTop,\n right: thisRect.right - boundingRect.right - size.marginRight,\n bottom: thisRect.bottom - boundingRect.bottom - size.marginBottom\n };\n return offset;\n};\n\n// -------------------------- resize -------------------------- //\n\n// enable event handlers for listeners\n// i.e. resize -> onresize\nproto.handleEvent = utils.handleEvent;\n\n/**\n * Bind layout to window resizing\n */\nproto.bindResize = function() {\n window.addEventListener( 'resize', this );\n this.isResizeBound = true;\n};\n\n/**\n * Unbind layout to window resizing\n */\nproto.unbindResize = function() {\n window.removeEventListener( 'resize', this );\n this.isResizeBound = false;\n};\n\nproto.onresize = function() {\n this.resize();\n};\n\nutils.debounceMethod( Outlayer, 'onresize', 100 );\n\nproto.resize = function() {\n // don't trigger if size did not change\n // or if resize was unbound. See #9\n if ( !this.isResizeBound || !this.needsResizeLayout() ) {\n return;\n }\n\n this.layout();\n};\n\n/**\n * check if layout is needed post layout\n * @returns Boolean\n */\nproto.needsResizeLayout = function() {\n var size = getSize( this.element );\n // check that this.size and size are there\n // IE8 triggers resize on body size change, so they might not be\n var hasSizes = this.size && size;\n return hasSizes && size.innerWidth !== this.size.innerWidth;\n};\n\n// -------------------------- methods -------------------------- //\n\n/**\n * add items to Outlayer instance\n * @param {Array or NodeList or Element} elems\n * @returns {Array} items - Outlayer.Items\n**/\nproto.addItems = function( elems ) {\n var items = this._itemize( elems );\n // add items to collection\n if ( items.length ) {\n this.items = this.items.concat( items );\n }\n return items;\n};\n\n/**\n * Layout newly-appended item elements\n * @param {Array or NodeList or Element} elems\n */\nproto.appended = function( elems ) {\n var items = this.addItems( elems );\n if ( !items.length ) {\n return;\n }\n // layout and reveal just the new items\n this.layoutItems( items, true );\n this.reveal( items );\n};\n\n/**\n * Layout prepended elements\n * @param {Array or NodeList or Element} elems\n */\nproto.prepended = function( elems ) {\n var items = this._itemize( elems );\n if ( !items.length ) {\n return;\n }\n // add items to beginning of collection\n var previousItems = this.items.slice(0);\n this.items = items.concat( previousItems );\n // start new layout\n this._resetLayout();\n this._manageStamps();\n // layout new stuff without transition\n this.layoutItems( items, true );\n this.reveal( items );\n // layout previous items\n this.layoutItems( previousItems );\n};\n\n/**\n * reveal a collection of items\n * @param {Array of Outlayer.Items} items\n */\nproto.reveal = function( items ) {\n this._emitCompleteOnItems( 'reveal', items );\n if ( !items || !items.length ) {\n return;\n }\n var stagger = this.updateStagger();\n items.forEach( function( item, i ) {\n item.stagger( i * stagger );\n item.reveal();\n });\n};\n\n/**\n * hide a collection of items\n * @param {Array of Outlayer.Items} items\n */\nproto.hide = function( items ) {\n this._emitCompleteOnItems( 'hide', items );\n if ( !items || !items.length ) {\n return;\n }\n var stagger = this.updateStagger();\n items.forEach( function( item, i ) {\n item.stagger( i * stagger );\n item.hide();\n });\n};\n\n/**\n * reveal item elements\n * @param {Array}, {Element}, {NodeList} items\n */\nproto.revealItemElements = function( elems ) {\n var items = this.getItems( elems );\n this.reveal( items );\n};\n\n/**\n * hide item elements\n * @param {Array}, {Element}, {NodeList} items\n */\nproto.hideItemElements = function( elems ) {\n var items = this.getItems( elems );\n this.hide( items );\n};\n\n/**\n * get Outlayer.Item, given an Element\n * @param {Element} elem\n * @param {Function} callback\n * @returns {Outlayer.Item} item\n */\nproto.getItem = function( elem ) {\n // loop through items to get the one that matches\n for ( var i=0; i < this.items.length; i++ ) {\n var item = this.items[i];\n if ( item.element == elem ) {\n // return item\n return item;\n }\n }\n};\n\n/**\n * get collection of Outlayer.Items, given Elements\n * @param {Array} elems\n * @returns {Array} items - Outlayer.Items\n */\nproto.getItems = function( elems ) {\n elems = utils.makeArray( elems );\n var items = [];\n elems.forEach( function( elem ) {\n var item = this.getItem( elem );\n if ( item ) {\n items.push( item );\n }\n }, this );\n\n return items;\n};\n\n/**\n * remove element(s) from instance and DOM\n * @param {Array or NodeList or Element} elems\n */\nproto.remove = function( elems ) {\n var removeItems = this.getItems( elems );\n\n this._emitCompleteOnItems( 'remove', removeItems );\n\n // bail if no items to remove\n if ( !removeItems || !removeItems.length ) {\n return;\n }\n\n removeItems.forEach( function( item ) {\n item.remove();\n // remove item from collection\n utils.removeFrom( this.items, item );\n }, this );\n};\n\n// ----- destroy ----- //\n\n// remove and disable Outlayer instance\nproto.destroy = function() {\n // clean up dynamic styles\n var style = this.element.style;\n style.height = '';\n style.position = '';\n style.width = '';\n // destroy items\n this.items.forEach( function( item ) {\n item.destroy();\n });\n\n this.unbindResize();\n\n var id = this.element.outlayerGUID;\n delete instances[ id ]; // remove reference to instance by id\n delete this.element.outlayerGUID;\n // remove data for jQuery\n if ( jQuery ) {\n jQuery.removeData( this.element, this.constructor.namespace );\n }\n\n};\n\n// -------------------------- data -------------------------- //\n\n/**\n * get Outlayer instance from element\n * @param {Element} elem\n * @returns {Outlayer}\n */\nOutlayer.data = function( elem ) {\n elem = utils.getQueryElement( elem );\n var id = elem && elem.outlayerGUID;\n return id && instances[ id ];\n};\n\n\n// -------------------------- create Outlayer class -------------------------- //\n\n/**\n * create a layout class\n * @param {String} namespace\n */\nOutlayer.create = function( namespace, options ) {\n // sub-class Outlayer\n var Layout = subclass( Outlayer );\n // apply new options and compatOptions\n Layout.defaults = utils.extend( {}, Outlayer.defaults );\n utils.extend( Layout.defaults, options );\n Layout.compatOptions = utils.extend( {}, Outlayer.compatOptions );\n\n Layout.namespace = namespace;\n\n Layout.data = Outlayer.data;\n\n // sub-class Item\n Layout.Item = subclass( Item );\n\n // -------------------------- declarative -------------------------- //\n\n utils.htmlInit( Layout, namespace );\n\n // -------------------------- jQuery bridge -------------------------- //\n\n // make into jQuery plugin\n if ( jQuery && jQuery.bridget ) {\n jQuery.bridget( namespace, Layout );\n }\n\n return Layout;\n};\n\nfunction subclass( Parent ) {\n function SubClass() {\n Parent.apply( this, arguments );\n }\n\n SubClass.prototype = Object.create( Parent.prototype );\n SubClass.prototype.constructor = SubClass;\n\n return SubClass;\n}\n\n// ----- helpers ----- //\n\n// how many milliseconds are in each unit\nvar msUnits = {\n ms: 1,\n s: 1000\n};\n\n// munge time-like parameter into millisecond number\n// '0.4s' -> 40\nfunction getMilliseconds( time ) {\n if ( typeof time == 'number' ) {\n return time;\n }\n var matches = time.match( /(^\\d*\\.?\\d*)(\\w*)/ );\n var num = matches && matches[1];\n var unit = matches && matches[2];\n if ( !num.length ) {\n return 0;\n }\n num = parseFloat( num );\n var mult = msUnits[ unit ] || 1;\n return num * mult;\n}\n\n// ----- fin ----- //\n\n// back in global\nOutlayer.Item = Item;\n\nreturn Outlayer;\n\n}));\n\n/**\n * Isotope Item\n**/\n\n( function( window, factory ) {\n // universal module definition\n /* jshint strict: false */ /*globals define, module, require */\n if ( typeof define == 'function' && define.amd ) {\n // AMD\n define( 'isotope/js/item',[\n 'outlayer/outlayer'\n ],\n factory );\n } else if ( typeof module == 'object' && module.exports ) {\n // CommonJS\n module.exports = factory(\n require('outlayer')\n );\n } else {\n // browser global\n window.Isotope = window.Isotope || {};\n window.Isotope.Item = factory(\n window.Outlayer\n );\n }\n\n}( window, function factory( Outlayer ) {\n'use strict';\n\n// -------------------------- Item -------------------------- //\n\n// sub-class Outlayer Item\nfunction Item() {\n Outlayer.Item.apply( this, arguments );\n}\n\nvar proto = Item.prototype = Object.create( Outlayer.Item.prototype );\n\nvar _create = proto._create;\nproto._create = function() {\n // assign id, used for original-order sorting\n this.id = this.layout.itemGUID++;\n _create.call( this );\n this.sortData = {};\n};\n\nproto.updateSortData = function() {\n if ( this.isIgnored ) {\n return;\n }\n // default sorters\n this.sortData.id = this.id;\n // for backward compatibility\n this.sortData['original-order'] = this.id;\n this.sortData.random = Math.random();\n // go thru getSortData obj and apply the sorters\n var getSortData = this.layout.options.getSortData;\n var sorters = this.layout._sorters;\n for ( var key in getSortData ) {\n var sorter = sorters[ key ];\n this.sortData[ key ] = sorter( this.element, this );\n }\n};\n\nvar _destroy = proto.destroy;\nproto.destroy = function() {\n // call super\n _destroy.apply( this, arguments );\n // reset display, #741\n this.css({\n display: ''\n });\n};\n\nreturn Item;\n\n}));\n\n/**\n * Isotope LayoutMode\n */\n\n( function( window, factory ) {\n // universal module definition\n /* jshint strict: false */ /*globals define, module, require */\n if ( typeof define == 'function' && define.amd ) {\n // AMD\n define( 'isotope/js/layout-mode',[\n 'get-size/get-size',\n 'outlayer/outlayer'\n ],\n factory );\n } else if ( typeof module == 'object' && module.exports ) {\n // CommonJS\n module.exports = factory(\n require('get-size'),\n require('outlayer')\n );\n } else {\n // browser global\n window.Isotope = window.Isotope || {};\n window.Isotope.LayoutMode = factory(\n window.getSize,\n window.Outlayer\n );\n }\n\n}( window, function factory( getSize, Outlayer ) {\n 'use strict';\n\n // layout mode class\n function LayoutMode( isotope ) {\n this.isotope = isotope;\n // link properties\n if ( isotope ) {\n this.options = isotope.options[ this.namespace ];\n this.element = isotope.element;\n this.items = isotope.filteredItems;\n this.size = isotope.size;\n }\n }\n\n var proto = LayoutMode.prototype;\n\n /**\n * some methods should just defer to default Outlayer method\n * and reference the Isotope instance as `this`\n **/\n var facadeMethods = [\n '_resetLayout',\n '_getItemLayoutPosition',\n '_manageStamp',\n '_getContainerSize',\n '_getElementOffset',\n 'needsResizeLayout',\n '_getOption'\n ];\n\n facadeMethods.forEach( function( methodName ) {\n proto[ methodName ] = function() {\n return Outlayer.prototype[ methodName ].apply( this.isotope, arguments );\n };\n });\n\n // ----- ----- //\n\n // for horizontal layout modes, check vertical size\n proto.needsVerticalResizeLayout = function() {\n // don't trigger if size did not change\n var size = getSize( this.isotope.element );\n // check that this.size and size are there\n // IE8 triggers resize on body size change, so they might not be\n var hasSizes = this.isotope.size && size;\n return hasSizes && size.innerHeight != this.isotope.size.innerHeight;\n };\n\n // ----- measurements ----- //\n\n proto._getMeasurement = function() {\n this.isotope._getMeasurement.apply( this, arguments );\n };\n\n proto.getColumnWidth = function() {\n this.getSegmentSize( 'column', 'Width' );\n };\n\n proto.getRowHeight = function() {\n this.getSegmentSize( 'row', 'Height' );\n };\n\n /**\n * get columnWidth or rowHeight\n * segment: 'column' or 'row'\n * size 'Width' or 'Height'\n **/\n proto.getSegmentSize = function( segment, size ) {\n var segmentName = segment + size;\n var outerSize = 'outer' + size;\n // columnWidth / outerWidth // rowHeight / outerHeight\n this._getMeasurement( segmentName, outerSize );\n // got rowHeight or columnWidth, we can chill\n if ( this[ segmentName ] ) {\n return;\n }\n // fall back to item of first element\n var firstItemSize = this.getFirstItemSize();\n this[ segmentName ] = firstItemSize && firstItemSize[ outerSize ] ||\n // or size of container\n this.isotope.size[ 'inner' + size ];\n };\n\n proto.getFirstItemSize = function() {\n var firstItem = this.isotope.filteredItems[0];\n return firstItem && firstItem.element && getSize( firstItem.element );\n };\n\n // ----- methods that should reference isotope ----- //\n\n proto.layout = function() {\n this.isotope.layout.apply( this.isotope, arguments );\n };\n\n proto.getSize = function() {\n this.isotope.getSize();\n this.size = this.isotope.size;\n };\n\n // -------------------------- create -------------------------- //\n\n LayoutMode.modes = {};\n\n LayoutMode.create = function( namespace, options ) {\n\n function Mode() {\n LayoutMode.apply( this, arguments );\n }\n\n Mode.prototype = Object.create( proto );\n Mode.prototype.constructor = Mode;\n\n // default options\n if ( options ) {\n Mode.options = options;\n }\n\n Mode.prototype.namespace = namespace;\n // register in Isotope\n LayoutMode.modes[ namespace ] = Mode;\n\n return Mode;\n };\n\n return LayoutMode;\n\n}));\n\n/*!\n * Masonry v4.2.0\n * Cascading grid layout library\n * http://masonry.desandro.com\n * MIT License\n * by David DeSandro\n */\n\n( function( window, factory ) {\n // universal module definition\n /* jshint strict: false */ /*globals define, module, require */\n if ( typeof define == 'function' && define.amd ) {\n // AMD\n define( 'masonry/masonry',[\n 'outlayer/outlayer',\n 'get-size/get-size'\n ],\n factory );\n } else if ( typeof module == 'object' && module.exports ) {\n // CommonJS\n module.exports = factory(\n require('outlayer'),\n require('get-size')\n );\n } else {\n // browser global\n window.Masonry = factory(\n window.Outlayer,\n window.getSize\n );\n }\n\n}( window, function factory( Outlayer, getSize ) {\n\n\n\n// -------------------------- masonryDefinition -------------------------- //\n\n // create an Outlayer layout class\n var Masonry = Outlayer.create('masonry');\n // isFitWidth -> fitWidth\n Masonry.compatOptions.fitWidth = 'isFitWidth';\n\n var proto = Masonry.prototype;\n\n proto._resetLayout = function() {\n this.getSize();\n this._getMeasurement( 'columnWidth', 'outerWidth' );\n this._getMeasurement( 'gutter', 'outerWidth' );\n this.measureColumns();\n\n // reset column Y\n this.colYs = [];\n for ( var i=0; i < this.cols; i++ ) {\n this.colYs.push( 0 );\n }\n\n this.maxY = 0;\n this.horizontalColIndex = 0;\n };\n\n proto.measureColumns = function() {\n this.getContainerWidth();\n // if columnWidth is 0, default to outerWidth of first item\n if ( !this.columnWidth ) {\n var firstItem = this.items[0];\n var firstItemElem = firstItem && firstItem.element;\n // columnWidth fall back to item of first element\n this.columnWidth = firstItemElem && getSize( firstItemElem ).outerWidth ||\n // if first elem has no width, default to size of container\n this.containerWidth;\n }\n\n var columnWidth = this.columnWidth += this.gutter;\n\n // calculate columns\n var containerWidth = this.containerWidth + this.gutter;\n var cols = containerWidth / columnWidth;\n // fix rounding errors, typically with gutters\n var excess = columnWidth - containerWidth % columnWidth;\n // if overshoot is less than a pixel, round up, otherwise floor it\n var mathMethod = excess && excess < 1 ? 'round' : 'floor';\n cols = Math[ mathMethod ]( cols );\n this.cols = Math.max( cols, 1 );\n };\n\n proto.getContainerWidth = function() {\n // container is parent if fit width\n var isFitWidth = this._getOption('fitWidth');\n var container = isFitWidth ? this.element.parentNode : this.element;\n // check that this.size and size are there\n // IE8 triggers resize on body size change, so they might not be\n var size = getSize( container );\n this.containerWidth = size && size.innerWidth;\n };\n\n proto._getItemLayoutPosition = function( item ) {\n item.getSize();\n // how many columns does this brick span\n var remainder = item.size.outerWidth % this.columnWidth;\n var mathMethod = remainder && remainder < 1 ? 'round' : 'ceil';\n // round if off by 1 pixel, otherwise use ceil\n var colSpan = Math[ mathMethod ]( item.size.outerWidth / this.columnWidth );\n colSpan = Math.min( colSpan, this.cols );\n // use horizontal or top column position\n var colPosMethod = this.options.horizontalOrder ?\n '_getHorizontalColPosition' : '_getTopColPosition';\n var colPosition = this[ colPosMethod ]( colSpan, item );\n // position the brick\n var position = {\n x: this.columnWidth * colPosition.col,\n y: colPosition.y\n };\n // apply setHeight to necessary columns\n var setHeight = colPosition.y + item.size.outerHeight;\n var setMax = colSpan + colPosition.col;\n for ( var i = colPosition.col; i < setMax; i++ ) {\n this.colYs[i] = setHeight;\n }\n\n return position;\n };\n\n proto._getTopColPosition = function( colSpan ) {\n var colGroup = this._getTopColGroup( colSpan );\n // get the minimum Y value from the columns\n var minimumY = Math.min.apply( Math, colGroup );\n\n return {\n col: colGroup.indexOf( minimumY ),\n y: minimumY,\n };\n };\n\n /**\n * @param {Number} colSpan - number of columns the element spans\n * @returns {Array} colGroup\n */\n proto._getTopColGroup = function( colSpan ) {\n if ( colSpan < 2 ) {\n // if brick spans only one column, use all the column Ys\n return this.colYs;\n }\n\n var colGroup = [];\n // how many different places could this brick fit horizontally\n var groupCount = this.cols + 1 - colSpan;\n // for each group potential horizontal position\n for ( var i = 0; i < groupCount; i++ ) {\n colGroup[i] = this._getColGroupY( i, colSpan );\n }\n return colGroup;\n };\n\n proto._getColGroupY = function( col, colSpan ) {\n if ( colSpan < 2 ) {\n return this.colYs[ col ];\n }\n // make an array of colY values for that one group\n var groupColYs = this.colYs.slice( col, col + colSpan );\n // and get the max value of the array\n return Math.max.apply( Math, groupColYs );\n };\n\n // get column position based on horizontal index. #873\n proto._getHorizontalColPosition = function( colSpan, item ) {\n var col = this.horizontalColIndex % this.cols;\n var isOver = colSpan > 1 && col + colSpan > this.cols;\n // shift to next row if item can't fit on current row\n col = isOver ? 0 : col;\n // don't let zero-size items take up space\n var hasSize = item.size.outerWidth && item.size.outerHeight;\n this.horizontalColIndex = hasSize ? col + colSpan : this.horizontalColIndex;\n\n return {\n col: col,\n y: this._getColGroupY( col, colSpan ),\n };\n };\n\n proto._manageStamp = function( stamp ) {\n var stampSize = getSize( stamp );\n var offset = this._getElementOffset( stamp );\n // get the columns that this stamp affects\n var isOriginLeft = this._getOption('originLeft');\n var firstX = isOriginLeft ? offset.left : offset.right;\n var lastX = firstX + stampSize.outerWidth;\n var firstCol = Math.floor( firstX / this.columnWidth );\n firstCol = Math.max( 0, firstCol );\n var lastCol = Math.floor( lastX / this.columnWidth );\n // lastCol should not go over if multiple of columnWidth #425\n lastCol -= lastX % this.columnWidth ? 0 : 1;\n lastCol = Math.min( this.cols - 1, lastCol );\n // set colYs to bottom of the stamp\n\n var isOriginTop = this._getOption('originTop');\n var stampMaxY = ( isOriginTop ? offset.top : offset.bottom ) +\n stampSize.outerHeight;\n for ( var i = firstCol; i <= lastCol; i++ ) {\n this.colYs[i] = Math.max( stampMaxY, this.colYs[i] );\n }\n };\n\n proto._getContainerSize = function() {\n this.maxY = Math.max.apply( Math, this.colYs );\n var size = {\n height: this.maxY\n };\n\n if ( this._getOption('fitWidth') ) {\n size.width = this._getContainerFitWidth();\n }\n\n return size;\n };\n\n proto._getContainerFitWidth = function() {\n var unusedCols = 0;\n // count unused columns\n var i = this.cols;\n while ( --i ) {\n if ( this.colYs[i] !== 0 ) {\n break;\n }\n unusedCols++;\n }\n // fit container to columns that have been used\n return ( this.cols - unusedCols ) * this.columnWidth - this.gutter;\n };\n\n proto.needsResizeLayout = function() {\n var previousWidth = this.containerWidth;\n this.getContainerWidth();\n return previousWidth != this.containerWidth;\n };\n\n return Masonry;\n\n}));\n\n/*!\n * Masonry layout mode\n * sub-classes Masonry\n * http://masonry.desandro.com\n */\n\n( function( window, factory ) {\n // universal module definition\n /* jshint strict: false */ /*globals define, module, require */\n if ( typeof define == 'function' && define.amd ) {\n // AMD\n define( 'isotope/js/layout-modes/masonry',[\n '../layout-mode',\n 'masonry/masonry'\n ],\n factory );\n } else if ( typeof module == 'object' && module.exports ) {\n // CommonJS\n module.exports = factory(\n require('../layout-mode'),\n require('masonry-layout')\n );\n } else {\n // browser global\n factory(\n window.Isotope.LayoutMode,\n window.Masonry\n );\n }\n\n}( window, function factory( LayoutMode, Masonry ) {\n'use strict';\n\n// -------------------------- masonryDefinition -------------------------- //\n\n // create an Outlayer layout class\n var MasonryMode = LayoutMode.create('masonry');\n\n var proto = MasonryMode.prototype;\n\n var keepModeMethods = {\n _getElementOffset: true,\n layout: true,\n _getMeasurement: true\n };\n\n // inherit Masonry prototype\n for ( var method in Masonry.prototype ) {\n // do not inherit mode methods\n if ( !keepModeMethods[ method ] ) {\n proto[ method ] = Masonry.prototype[ method ];\n }\n }\n\n var measureColumns = proto.measureColumns;\n proto.measureColumns = function() {\n // set items, used if measuring first item\n this.items = this.isotope.filteredItems;\n measureColumns.call( this );\n };\n\n // point to mode options for fitWidth\n var _getOption = proto._getOption;\n proto._getOption = function( option ) {\n if ( option == 'fitWidth' ) {\n return this.options.isFitWidth !== undefined ?\n this.options.isFitWidth : this.options.fitWidth;\n }\n return _getOption.apply( this.isotope, arguments );\n };\n\n return MasonryMode;\n\n}));\n\n/**\n * fitRows layout mode\n */\n\n( function( window, factory ) {\n // universal module definition\n /* jshint strict: false */ /*globals define, module, require */\n if ( typeof define == 'function' && define.amd ) {\n // AMD\n define( 'isotope/js/layout-modes/fit-rows',[\n '../layout-mode'\n ],\n factory );\n } else if ( typeof exports == 'object' ) {\n // CommonJS\n module.exports = factory(\n require('../layout-mode')\n );\n } else {\n // browser global\n factory(\n window.Isotope.LayoutMode\n );\n }\n\n}( window, function factory( LayoutMode ) {\n'use strict';\n\nvar FitRows = LayoutMode.create('fitRows');\n\nvar proto = FitRows.prototype;\n\nproto._resetLayout = function() {\n this.x = 0;\n this.y = 0;\n this.maxY = 0;\n this._getMeasurement( 'gutter', 'outerWidth' );\n};\n\nproto._getItemLayoutPosition = function( item ) {\n item.getSize();\n\n var itemWidth = item.size.outerWidth + this.gutter;\n // if this element cannot fit in the current row\n var containerWidth = this.isotope.size.innerWidth + this.gutter;\n if ( this.x !== 0 && itemWidth + this.x > containerWidth ) {\n this.x = 0;\n this.y = this.maxY;\n }\n\n var position = {\n x: this.x,\n y: this.y\n };\n\n this.maxY = Math.max( this.maxY, this.y + item.size.outerHeight );\n this.x += itemWidth;\n\n return position;\n};\n\nproto._getContainerSize = function() {\n return { height: this.maxY };\n};\n\nreturn FitRows;\n\n}));\n\n/**\n * vertical layout mode\n */\n\n( function( window, factory ) {\n // universal module definition\n /* jshint strict: false */ /*globals define, module, require */\n if ( typeof define == 'function' && define.amd ) {\n // AMD\n define( 'isotope/js/layout-modes/vertical',[\n '../layout-mode'\n ],\n factory );\n } else if ( typeof module == 'object' && module.exports ) {\n // CommonJS\n module.exports = factory(\n require('../layout-mode')\n );\n } else {\n // browser global\n factory(\n window.Isotope.LayoutMode\n );\n }\n\n}( window, function factory( LayoutMode ) {\n'use strict';\n\nvar Vertical = LayoutMode.create( 'vertical', {\n horizontalAlignment: 0\n});\n\nvar proto = Vertical.prototype;\n\nproto._resetLayout = function() {\n this.y = 0;\n};\n\nproto._getItemLayoutPosition = function( item ) {\n item.getSize();\n var x = ( this.isotope.size.innerWidth - item.size.outerWidth ) *\n this.options.horizontalAlignment;\n var y = this.y;\n this.y += item.size.outerHeight;\n return { x: x, y: y };\n};\n\nproto._getContainerSize = function() {\n return { height: this.y };\n};\n\nreturn Vertical;\n\n}));\n\n/*!\n * Isotope v3.0.4\n *\n * Licensed GPLv3 for open source use\n * or Isotope Commercial License for commercial use\n *\n * http://isotope.metafizzy.co\n * Copyright 2017 Metafizzy\n */\n\n( function( window, factory ) {\n // universal module definition\n /* jshint strict: false */ /*globals define, module, require */\n if ( typeof define == 'function' && define.amd ) {\n // AMD\n define( [\n 'outlayer/outlayer',\n 'get-size/get-size',\n 'desandro-matches-selector/matches-selector',\n 'fizzy-ui-utils/utils',\n 'isotope/js/item',\n 'isotope/js/layout-mode',\n // include default layout modes\n 'isotope/js/layout-modes/masonry',\n 'isotope/js/layout-modes/fit-rows',\n 'isotope/js/layout-modes/vertical'\n ],\n function( Outlayer, getSize, matchesSelector, utils, Item, LayoutMode ) {\n return factory( window, Outlayer, getSize, matchesSelector, utils, Item, LayoutMode );\n });\n } else if ( typeof module == 'object' && module.exports ) {\n // CommonJS\n module.exports = factory(\n window,\n require('outlayer'),\n require('get-size'),\n require('desandro-matches-selector'),\n require('fizzy-ui-utils'),\n require('isotope/js/item'),\n require('isotope/js/layout-mode'),\n // include default layout modes\n require('isotope/js/layout-modes/masonry'),\n require('isotope/js/layout-modes/fit-rows'),\n require('isotope/js/layout-modes/vertical')\n );\n } else {\n // browser global\n window.Isotope = factory(\n window,\n window.Outlayer,\n window.getSize,\n window.matchesSelector,\n window.fizzyUIUtils,\n window.Isotope.Item,\n window.Isotope.LayoutMode\n );\n }\n\n}( window, function factory( window, Outlayer, getSize, matchesSelector, utils,\n Item, LayoutMode ) {\n\n\n\n// -------------------------- vars -------------------------- //\n\nvar jQuery = window.jQuery;\n\n// -------------------------- helpers -------------------------- //\n\nvar trim = String.prototype.trim ?\n function( str ) {\n return str.trim();\n } :\n function( str ) {\n return str.replace( /^\\s+|\\s+$/g, '' );\n };\n\n// -------------------------- isotopeDefinition -------------------------- //\n\n // create an Outlayer layout class\n var Isotope = Outlayer.create( 'isotope', {\n layoutMode: 'masonry',\n isJQueryFiltering: true,\n sortAscending: true\n });\n\n Isotope.Item = Item;\n Isotope.LayoutMode = LayoutMode;\n\n var proto = Isotope.prototype;\n\n proto._create = function() {\n this.itemGUID = 0;\n // functions that sort items\n this._sorters = {};\n this._getSorters();\n // call super\n Outlayer.prototype._create.call( this );\n\n // create layout modes\n this.modes = {};\n // start filteredItems with all items\n this.filteredItems = this.items;\n // keep of track of sortBys\n this.sortHistory = [ 'original-order' ];\n // create from registered layout modes\n for ( var name in LayoutMode.modes ) {\n this._initLayoutMode( name );\n }\n };\n\n proto.reloadItems = function() {\n // reset item ID counter\n this.itemGUID = 0;\n // call super\n Outlayer.prototype.reloadItems.call( this );\n };\n\n proto._itemize = function() {\n var items = Outlayer.prototype._itemize.apply( this, arguments );\n // assign ID for original-order\n for ( var i=0; i < items.length; i++ ) {\n var item = items[i];\n item.id = this.itemGUID++;\n }\n this._updateItemsSortData( items );\n return items;\n };\n\n\n // -------------------------- layout -------------------------- //\n\n proto._initLayoutMode = function( name ) {\n var Mode = LayoutMode.modes[ name ];\n // set mode options\n // HACK extend initial options, back-fill in default options\n var initialOpts = this.options[ name ] || {};\n this.options[ name ] = Mode.options ?\n utils.extend( Mode.options, initialOpts ) : initialOpts;\n // init layout mode instance\n this.modes[ name ] = new Mode( this );\n };\n\n\n proto.layout = function() {\n // if first time doing layout, do all magic\n if ( !this._isLayoutInited && this._getOption('initLayout') ) {\n this.arrange();\n return;\n }\n this._layout();\n };\n\n // private method to be used in layout() & magic()\n proto._layout = function() {\n // don't animate first layout\n var isInstant = this._getIsInstant();\n // layout flow\n this._resetLayout();\n this._manageStamps();\n this.layoutItems( this.filteredItems, isInstant );\n\n // flag for initalized\n this._isLayoutInited = true;\n };\n\n // filter + sort + layout\n proto.arrange = function( opts ) {\n // set any options pass\n this.option( opts );\n this._getIsInstant();\n // filter, sort, and layout\n\n // filter\n var filtered = this._filter( this.items );\n this.filteredItems = filtered.matches;\n\n this._bindArrangeComplete();\n\n if ( this._isInstant ) {\n this._noTransition( this._hideReveal, [ filtered ] );\n } else {\n this._hideReveal( filtered );\n }\n\n this._sort();\n this._layout();\n };\n // alias to _init for main plugin method\n proto._init = proto.arrange;\n\n proto._hideReveal = function( filtered ) {\n this.reveal( filtered.needReveal );\n this.hide( filtered.needHide );\n };\n\n // HACK\n // Don't animate/transition first layout\n // Or don't animate/transition other layouts\n proto._getIsInstant = function() {\n var isLayoutInstant = this._getOption('layoutInstant');\n var isInstant = isLayoutInstant !== undefined ? isLayoutInstant :\n !this._isLayoutInited;\n this._isInstant = isInstant;\n return isInstant;\n };\n\n // listen for layoutComplete, hideComplete and revealComplete\n // to trigger arrangeComplete\n proto._bindArrangeComplete = function() {\n // listen for 3 events to trigger arrangeComplete\n var isLayoutComplete, isHideComplete, isRevealComplete;\n var _this = this;\n function arrangeParallelCallback() {\n if ( isLayoutComplete && isHideComplete && isRevealComplete ) {\n _this.dispatchEvent( 'arrangeComplete', null, [ _this.filteredItems ] );\n }\n }\n this.once( 'layoutComplete', function() {\n isLayoutComplete = true;\n arrangeParallelCallback();\n });\n this.once( 'hideComplete', function() {\n isHideComplete = true;\n arrangeParallelCallback();\n });\n this.once( 'revealComplete', function() {\n isRevealComplete = true;\n arrangeParallelCallback();\n });\n };\n\n // -------------------------- filter -------------------------- //\n\n proto._filter = function( items ) {\n var filter = this.options.filter;\n filter = filter || '*';\n var matches = [];\n var hiddenMatched = [];\n var visibleUnmatched = [];\n\n var test = this._getFilterTest( filter );\n\n // test each item\n for ( var i=0; i < items.length; i++ ) {\n var item = items[i];\n if ( item.isIgnored ) {\n continue;\n }\n // add item to either matched or unmatched group\n var isMatched = test( item );\n // item.isFilterMatched = isMatched;\n // add to matches if its a match\n if ( isMatched ) {\n matches.push( item );\n }\n // add to additional group if item needs to be hidden or revealed\n if ( isMatched && item.isHidden ) {\n hiddenMatched.push( item );\n } else if ( !isMatched && !item.isHidden ) {\n visibleUnmatched.push( item );\n }\n }\n\n // return collections of items to be manipulated\n return {\n matches: matches,\n needReveal: hiddenMatched,\n needHide: visibleUnmatched\n };\n };\n\n // get a jQuery, function, or a matchesSelector test given the filter\n proto._getFilterTest = function( filter ) {\n if ( jQuery && this.options.isJQueryFiltering ) {\n // use jQuery\n return function( item ) {\n return jQuery( item.element ).is( filter );\n };\n }\n if ( typeof filter == 'function' ) {\n // use filter as function\n return function( item ) {\n return filter( item.element );\n };\n }\n // default, use filter as selector string\n return function( item ) {\n return matchesSelector( item.element, filter );\n };\n };\n\n // -------------------------- sorting -------------------------- //\n\n /**\n * @params {Array} elems\n * @public\n */\n proto.updateSortData = function( elems ) {\n // get items\n var items;\n if ( elems ) {\n elems = utils.makeArray( elems );\n items = this.getItems( elems );\n } else {\n // update all items if no elems provided\n items = this.items;\n }\n\n this._getSorters();\n this._updateItemsSortData( items );\n };\n\n proto._getSorters = function() {\n var getSortData = this.options.getSortData;\n for ( var key in getSortData ) {\n var sorter = getSortData[ key ];\n this._sorters[ key ] = mungeSorter( sorter );\n }\n };\n\n /**\n * @params {Array} items - of Isotope.Items\n * @private\n */\n proto._updateItemsSortData = function( items ) {\n // do not update if no items\n var len = items && items.length;\n\n for ( var i=0; len && i < len; i++ ) {\n var item = items[i];\n item.updateSortData();\n }\n };\n\n // ----- munge sorter ----- //\n\n // encapsulate this, as we just need mungeSorter\n // other functions in here are just for munging\n var mungeSorter = ( function() {\n // add a magic layer to sorters for convienent shorthands\n // `.foo-bar` will use the text of .foo-bar querySelector\n // `[foo-bar]` will use attribute\n // you can also add parser\n // `.foo-bar parseInt` will parse that as a number\n function mungeSorter( sorter ) {\n // if not a string, return function or whatever it is\n if ( typeof sorter != 'string' ) {\n return sorter;\n }\n // parse the sorter string\n var args = trim( sorter ).split(' ');\n var query = args[0];\n // check if query looks like [an-attribute]\n var attrMatch = query.match( /^\\[(.+)\\]$/ );\n var attr = attrMatch && attrMatch[1];\n var getValue = getValueGetter( attr, query );\n // use second argument as a parser\n var parser = Isotope.sortDataParsers[ args[1] ];\n // parse the value, if there was a parser\n sorter = parser ? function( elem ) {\n return elem && parser( getValue( elem ) );\n } :\n // otherwise just return value\n function( elem ) {\n return elem && getValue( elem );\n };\n\n return sorter;\n }\n\n // get an attribute getter, or get text of the querySelector\n function getValueGetter( attr, query ) {\n // if query looks like [foo-bar], get attribute\n if ( attr ) {\n return function getAttribute( elem ) {\n return elem.getAttribute( attr );\n };\n }\n\n // otherwise, assume its a querySelector, and get its text\n return function getChildText( elem ) {\n var child = elem.querySelector( query );\n return child && child.textContent;\n };\n }\n\n return mungeSorter;\n })();\n\n // parsers used in getSortData shortcut strings\n Isotope.sortDataParsers = {\n 'parseInt': function( val ) {\n return parseInt( val, 10 );\n },\n 'parseFloat': function( val ) {\n return parseFloat( val );\n }\n };\n\n // ----- sort method ----- //\n\n // sort filteredItem order\n proto._sort = function() {\n if ( !this.options.sortBy ) {\n return;\n }\n // keep track of sortBy History\n var sortBys = utils.makeArray( this.options.sortBy );\n if ( !this._getIsSameSortBy( sortBys ) ) {\n // concat all sortBy and sortHistory, add to front, oldest goes in last\n this.sortHistory = sortBys.concat( this.sortHistory );\n }\n // sort magic\n var itemSorter = getItemSorter( this.sortHistory, this.options.sortAscending );\n this.filteredItems.sort( itemSorter );\n };\n\n // check if sortBys is same as start of sortHistory\n proto._getIsSameSortBy = function( sortBys ) {\n for ( var i=0; i < sortBys.length; i++ ) {\n if ( sortBys[i] != this.sortHistory[i] ) {\n return false;\n }\n }\n return true;\n };\n\n // returns a function used for sorting\n function getItemSorter( sortBys, sortAsc ) {\n return function sorter( itemA, itemB ) {\n // cycle through all sortKeys\n for ( var i = 0; i < sortBys.length; i++ ) {\n var sortBy = sortBys[i];\n var a = itemA.sortData[ sortBy ];\n var b = itemB.sortData[ sortBy ];\n if ( a > b || a < b ) {\n // if sortAsc is an object, use the value given the sortBy key\n var isAscending = sortAsc[ sortBy ] !== undefined ? sortAsc[ sortBy ] : sortAsc;\n var direction = isAscending ? 1 : -1;\n return ( a > b ? 1 : -1 ) * direction;\n }\n }\n return 0;\n };\n }\n\n // -------------------------- methods -------------------------- //\n\n // get layout mode\n proto._mode = function() {\n var layoutMode = this.options.layoutMode;\n var mode = this.modes[ layoutMode ];\n if ( !mode ) {\n // TODO console.error\n throw new Error( 'No layout mode: ' + layoutMode );\n }\n // HACK sync mode's options\n // any options set after init for layout mode need to be synced\n mode.options = this.options[ layoutMode ];\n return mode;\n };\n\n proto._resetLayout = function() {\n // trigger original reset layout\n Outlayer.prototype._resetLayout.call( this );\n this._mode()._resetLayout();\n };\n\n proto._getItemLayoutPosition = function( item ) {\n return this._mode()._getItemLayoutPosition( item );\n };\n\n proto._manageStamp = function( stamp ) {\n this._mode()._manageStamp( stamp );\n };\n\n proto._getContainerSize = function() {\n return this._mode()._getContainerSize();\n };\n\n proto.needsResizeLayout = function() {\n return this._mode().needsResizeLayout();\n };\n\n // -------------------------- adding & removing -------------------------- //\n\n // HEADS UP overwrites default Outlayer appended\n proto.appended = function( elems ) {\n var items = this.addItems( elems );\n if ( !items.length ) {\n return;\n }\n // filter, layout, reveal new items\n var filteredItems = this._filterRevealAdded( items );\n // add to filteredItems\n this.filteredItems = this.filteredItems.concat( filteredItems );\n };\n\n // HEADS UP overwrites default Outlayer prepended\n proto.prepended = function( elems ) {\n var items = this._itemize( elems );\n if ( !items.length ) {\n return;\n }\n // start new layout\n this._resetLayout();\n this._manageStamps();\n // filter, layout, reveal new items\n var filteredItems = this._filterRevealAdded( items );\n // layout previous items\n this.layoutItems( this.filteredItems );\n // add to items and filteredItems\n this.filteredItems = filteredItems.concat( this.filteredItems );\n this.items = items.concat( this.items );\n };\n\n proto._filterRevealAdded = function( items ) {\n var filtered = this._filter( items );\n this.hide( filtered.needHide );\n // reveal all new items\n this.reveal( filtered.matches );\n // layout new items, no transition\n this.layoutItems( filtered.matches, true );\n return filtered.matches;\n };\n\n /**\n * Filter, sort, and layout newly-appended item elements\n * @param {Array or NodeList or Element} elems\n */\n proto.insert = function( elems ) {\n var items = this.addItems( elems );\n if ( !items.length ) {\n return;\n }\n // append item elements\n var i, item;\n var len = items.length;\n for ( i=0; i < len; i++ ) {\n item = items[i];\n this.element.appendChild( item.element );\n }\n // filter new stuff\n var filteredInsertItems = this._filter( items ).matches;\n // set flag\n for ( i=0; i < len; i++ ) {\n items[i].isLayoutInstant = true;\n }\n this.arrange();\n // reset flag\n for ( i=0; i < len; i++ ) {\n delete items[i].isLayoutInstant;\n }\n this.reveal( filteredInsertItems );\n };\n\n var _remove = proto.remove;\n proto.remove = function( elems ) {\n elems = utils.makeArray( elems );\n var removeItems = this.getItems( elems );\n // do regular thing\n _remove.call( this, elems );\n // bail if no items to remove\n var len = removeItems && removeItems.length;\n // remove elems from filteredItems\n for ( var i=0; len && i < len; i++ ) {\n var item = removeItems[i];\n // remove item from collection\n utils.removeFrom( this.filteredItems, item );\n }\n };\n\n proto.shuffle = function() {\n // update random sortData\n for ( var i=0; i < this.items.length; i++ ) {\n var item = this.items[i];\n item.sortData.random = Math.random();\n }\n this.options.sortBy = 'random';\n this._sort();\n this._layout();\n };\n\n /**\n * trigger fn without transition\n * kind of hacky to have this in the first place\n * @param {Function} fn\n * @param {Array} args\n * @returns ret\n * @private\n */\n proto._noTransition = function( fn, args ) {\n // save transitionDuration before disabling\n var transitionDuration = this.options.transitionDuration;\n // disable transition\n this.options.transitionDuration = 0;\n // do it\n var returnValue = fn.apply( this, args );\n // re-enable transition for reveal\n this.options.transitionDuration = transitionDuration;\n return returnValue;\n };\n\n // ----- helper methods ----- //\n\n /**\n * getter method for getting filtered item elements\n * @returns {Array} elems - collection of item elements\n */\n proto.getFilteredItemElements = function() {\n return this.filteredItems.map( function( item ) {\n return item.element;\n });\n };\n\n // ----- ----- //\n\n return Isotope;\n\n}));\n\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/isotope-layout/dist/isotope.pkgd.js\n// module id = GbzL7C/QFmiBZDICkla+\n// module chunks = 0","var matches = require('./matches')\n\n/**\n * closest : closest(el, selector)\n * Looks for the closest ancestor of element `el` that matches `selector`.\n * Compare with [$.fn.closest](http://api.jquery.com/closest/).\n *\n * var closest = require('dom101/closest');\n *\n * closest(input, 'label');\n */\n\nfunction closest (el, sel) {\n if (!el) return\n if (matches(el, sel)) {\n return el\n } else {\n return closest(el.parentNode, sel)\n }\n}\n\nmodule.exports = closest\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/dom101/closest.js\n// module id = Gz0TuoFFs6JdDvtR2PYZ\n// module chunks = 0","/**\n * on : on(el, event, fn)\n * Adds an event handler.\n *\n * var on = require('dom101/on');\n *\n * on(el, 'click', function () {\n * ...\n * });\n */\n\nfunction on (el, event, handler) {\n if (el.addEventListener) {\n el.addEventListener(event, handler)\n } else {\n el.attachEvent('on' + event, function () {\n handler.call(el)\n })\n }\n}\n\nmodule.exports = on\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/dom101/on.js\n// module id = MKJaVdnD9jF7rk6rW6AJ\n// module chunks = 0","/**\n * each : each(list, fn)\n * Iterates through `list` (an array or an object). This is useful when dealing\n * with NodeLists like `document.querySelectorAll`.\n *\n * var each = require('dom101/each');\n * var qa = require('dom101/query-selector-all');\n *\n * each(qa('.button'), function (el) {\n * addClass('el', 'selected');\n * });\n */\n\nfunction each (list, fn) {\n var i\n var len = list.length\n var idx\n\n if (typeof len === 'number') {\n for (i = 0; i < len; i++) {\n fn(list[i], i)\n }\n } else {\n idx = 0\n for (i in list) {\n if (list.hasOwnProperty(i)) {\n fn(list[i], i, idx++)\n }\n }\n }\n\n return list\n}\n\nmodule.exports = each\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/dom101/each.js\n// module id = O7wD3s+p+jjyw5ivWGEg\n// module chunks = 0","import onmount from 'onmount'\nimport remove from 'dom101/remove'\nimport removeClass from 'dom101/remove-class'\n\nimport { getData } from '../helpers/data'\nimport { isDismissed } from '../helpers/dismiss'\nimport { isPreview } from '../helpers/preview'\n\nonmount('[data-js-dismissable]', function () {\n const id = getData(this, 'js-dismissable').id || ''\n\n if (isPreview() || isDismissed(id)) {\n remove(this)\n } else {\n removeClass(this, '-hide')\n }\n})\n\n\n\n// WEBPACK FOOTER //\n// ./_js/behaviors/dismissable.js","import matches from 'dom101/matches'\n\n/*\n * Just like jQuery.append\n */\n\nexport function appendMany (el, children) {\n children.forEach(child => { el.appendChild(child) })\n}\n\n/*\n * Just like jQuery.nextUntil\n */\n\nexport function nextUntil (el, selector) {\n const nextEl = el.nextSibling\n return nextUntilTick(nextEl, selector, [])\n}\n\nfunction nextUntilTick (el, selector, acc) {\n if (!el) return acc\n\n const isMatch = matches(el, selector)\n if (isMatch) return acc\n\n return nextUntilTick(el.nextSibling, selector, [ ...acc, el ])\n}\n\n/*\n * Just like jQuery.before\n */\n\nexport function before (reference, newNode) {\n reference.parentNode.insertBefore(newNode, reference)\n}\n\n/*\n * Like jQuery.children('selector')\n */\n\nexport function findChildren (el, selector) {\n return [].slice.call(el.children)\n .filter(child => matches(child, selector))\n}\n\n/**\n * Creates a div\n * @private\n *\n * @example\n *\n * createDiv({ class: 'foo' })\n */\n\nexport function createDiv (props) {\n const d = document.createElement('div')\n Object.keys(props).forEach(key => {\n d.setAttribute(key, props[key])\n })\n return d\n}\n\n\n\n// WEBPACK FOOTER //\n// ./_js/helpers/dom.js","import closest from 'dom101/closest'\nimport remove from 'dom101/remove'\nimport on from 'dom101/on'\nimport { getData } from '../helpers/data'\nimport onmount from 'onmount'\nimport * as Dismiss from '../helpers/dismiss'\n\n/**\n * Dismiss button\n */\n\nonmount('[data-js-dismiss]', function () {\n const parent = closest(this, '[data-js-dismissable]')\n const dismissable = getData(parent, 'js-dismissable')\n const id = (dismissable && dismissable.id) || ''\n\n on(this, 'click', e => {\n Dismiss.setDismissed(id)\n e.preventDefault()\n if (parent) remove(parent)\n })\n})\n\n\n\n// WEBPACK FOOTER //\n// ./_js/behaviors/dismiss.js","var each = require('./each')\n\n/**\n * removeClass : removeClass(el, className)\n * Removes a classname.\n *\n * var removeClass = require('dom101/remove-class');\n *\n * el.className = 'selected active';\n * removeClass(el, 'active');\n *\n * el.className\n * => \"selected\"\n */\n\nfunction removeClass (el, className) {\n if (!className) return\n\n if (Array.isArray(className)) {\n each(className, function (className) {\n removeClass(el, className)\n })\n\n return\n }\n\n if (el.classList) {\n var classNames = className.split(' ').filter(Boolean)\n each(classNames, function (className) {\n el.classList.remove(className)\n })\n } else {\n var expr =\n new RegExp('(^|\\\\b)' + className.split(' ').join('|') + '(\\\\b|$)', 'gi')\n\n el.className = el.className.replace(expr, ' ')\n }\n}\n\nmodule.exports = removeClass\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/dom101/remove-class.js\n// module id = bq+j3PCtCSGVXgg8xWPw\n// module chunks = 0","var map = {\n\t\"./dismiss.js\": \"azEBDvunS5n/qbuQInIF\",\n\t\"./dismissable.js\": \"XxGrbZud7DE4W4TdQZtc\",\n\t\"./disqus.js\": \"BuWMdGeXUEK0GmkN01pU\",\n\t\"./h3-section-list.js\": \"E+dCGfS1pT5WowYv7jpv\",\n\t\"./main-body.js\": \"g3wkw0XZUos0Eo8rU7p6\",\n\t\"./no-preview.js\": \"k6EYej2Qda8Mq9A5Oeqn\",\n\t\"./search-form.js\": \"D3SYMdNAenu80VOO7/Dv\",\n\t\"./search-input.js\": \"zNHHVy5XxvKjnqTgwxy7\",\n\t\"./searchable-header.js\": \"veOabZWTWtixkn1TyITD\",\n\t\"./searchable-item.js\": \"tcev71HWHlq3Ur/sw7Ir\"\n};\nfunction webpackContext(req) {\n\treturn __webpack_require__(webpackContextResolve(req));\n};\nfunction webpackContextResolve(req) {\n\tvar id = map[req];\n\tif(!(id + 1)) // check for number or string\n\t\tthrow new Error(\"Cannot find module '\" + req + \"'.\");\n\treturn id;\n};\nwebpackContext.keys = function webpackContextKeys() {\n\treturn Object.keys(map);\n};\nwebpackContext.resolve = webpackContextResolve;\nmodule.exports = webpackContext;\nwebpackContext.id = \"cBdQffYQOU2SCSRXjSUx\";\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./_js/behaviors \\.js$\n// module id = cBdQffYQOU2SCSRXjSUx\n// module chunks = 0","/**\n * Injects disqus's scripts into the page.\n *\n * @example\n * inject('devhints.disqus.com')\n */\n\nexport default function inject (host) {\n injectEmbed(host)\n injectCount(host)\n}\n\nexport function injectEmbed (host) {\n const d = document\n const s = d.createElement('script')\n s.src = `https://${host}/embed.js`\n s.setAttribute('data-timestamp', +new Date())\n ;(d.head || d.body).appendChild(s)\n}\n\nexport function injectCount (host) {\n const d = document\n const s = d.createElement('script')\n s.src = `https://${host}/count.js`\n s.id = 'dsq-count-scr'\n s.async = true\n ;(d.head || d.body).appendChild(s)\n}\n\n\n\n// WEBPACK FOOTER //\n// ./_js/helpers/inject_disqus.js","/*\n * Helper: minimal qs implementation\n */\n\nexport default function qs (search) {\n search = search.substr(1)\n const parts = search.split('&').map(p => p.split('='))\n return parts.reduce((result, part) => {\n result[part[0]] = qsdecode(part[1])\n return result\n }, {})\n}\n\nexport function qsdecode (string) {\n if (!string) string = ''\n string = string.replace(/\\+/g, ' ')\n return string\n}\n\n\n\n// WEBPACK FOOTER //\n// ./_js/helpers/qs.js","import remove from 'dom101/remove'\nimport onmount from 'onmount'\nimport addClass from 'dom101/add-class'\n\nimport { isPreview } from '../helpers/preview'\n\n/*\n * Behavior: Things to remove when preview mode is on\n */\n\nonmount('[data-js-no-preview]', function (b) {\n if (isPreview()) {\n remove(this)\n addClass(document.documentElement, 'PreviewMode')\n }\n})\n\n\n\n// WEBPACK FOOTER //\n// ./_js/behaviors/no-preview.js","var each = require('./each')\n\n/**\n * addClass : addClass(el, className)\n * Adds a class name to an element. Compare with `$.fn.addClass`.\n *\n * var addClass = require('dom101/add-class');\n *\n * addClass(el, 'active');\n */\n\nfunction addClass (el, className) {\n if (!className) return\n\n if (Array.isArray(className)) {\n each(className, function (className) {\n addClass(el, className)\n })\n\n return\n }\n\n if (el.classList) {\n var classNames = className.split(' ').filter(Boolean)\n each(classNames, function (className) {\n el.classList.add(className)\n })\n } else {\n el.className += ' ' + className\n }\n}\n\nmodule.exports = addClass\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/dom101/add-class.js\n// module id = lGfezzQL7fc5RE8kg33g\n// module chunks = 0","import onmount from 'onmount'\nimport permutate from '../helpers/permutate'\n\n/**\n * Sets search indices (`data-search-index` attribute)\n */\n\nonmount('[data-js-searchable-item]', function () {\n const data = JSON.parse(this.getAttribute('data-js-searchable-item') || '{}')\n const words = permutate(data)\n\n this.setAttribute('data-search-index', words.join(' '))\n})\n\n\n\n// WEBPACK FOOTER //\n// ./_js/behaviors/searchable-item.js","/**\n * ready : ready(fn)\n * Executes `fn` when the DOM is ready. If the DOM is already ready, the given\n * callback will be called immediately.\n *\n * var ready = require('dom101/ready');\n *\n * ready(function () {\n * ...\n * });\n */\n\nfunction ready (fn) {\n if (isReady()) {\n return fn()\n } else if (document.addEventListener) {\n document.addEventListener('DOMContentLoaded', fn)\n } else {\n document.attachEvent('onreadystatechange', function () {\n if (isReady()) fn()\n })\n }\n}\n\nfunction isReady () {\n return (document.readyState === 'complete' || document.readyState === 'interactive')\n}\n\nmodule.exports = ready\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/dom101/ready.js\n// module id = tqbVxj9+xGAhlFrQpyTS\n// module chunks = 0","import onmount from 'onmount'\nimport { nextUntil } from '../helpers/dom'\nimport matches from 'dom101/matches'\n\n// Ensure that search-index is set first\nimport './searchable-item'\n\n/**\n * Propagate item search indices to headers\n */\n\nonmount('[data-js-searchable-header]', function () {\n const els = nextUntil(this, '[data-js-searchable-header]')\n .filter(el => matches(el, '[data-search-index]'))\n\n const keywords = els\n .map(n => n.getAttribute('data-search-index'))\n .join(' ')\n .split(' ')\n\n this.setAttribute('data-search-index', keywords.join(' '))\n})\n\n\n\n// WEBPACK FOOTER //\n// ./_js/behaviors/searchable-header.js","/**\n * remove : remove(el)\n * Removes an element from the DOM.\n *\n * var remove = require('dom101/remove');\n *\n * remove(el);\n */\n\nfunction remove (el) {\n el && el.parentNode && el.parentNode.removeChild(el)\n}\n\nmodule.exports = remove\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/dom101/remove.js\n// module id = wYegCzKWCG2ZRJZfGEZa\n// module chunks = 0","/* global define */\nvoid (function (root, factory) {\n if (typeof define === 'function' && define.amd) define(factory)\n else if (typeof exports === 'object') module.exports = factory()\n else {\n if (window.jQuery) window.jQuery.onmount = factory()\n else root.onmount = factory()\n }\n}(this, function ($) {\n /*\n * Internal: Registry.\n */\n\n var handlers, behaviors, selectors, log\n\n /*\n * Internal: IDs for auto-incrementing.\n */\n\n var bid = 0 /* behavior ID */\n var cid = 0 /* component ID */\n\n /**\n * (Module) Adds a behavior, or triggers behaviors.\n *\n * When no parameters are passed, it triggers all behaviors. When one\n * parameter is passed, it triggers the given behavior. Otherwise, it adds a\n * behavior.\n *\n * // define a behavior\n * $.onmount('.select-box', function () {\n * $(this).on('...')\n * })\n *\n * // define a behavior with exit\n * $.onmount('.select-box', function () {\n * $(document).on('...')\n * }, function () {\n * $(document).off('...')\n * })\n *\n * // retrigger a onmount\n * $.onmount('.select-box')\n *\n * // retriggers all behaviors\n * $.onmount()\n */\n\n function onmount (selector, init, exit, options) {\n if (typeof exit === 'object') {\n options = exit\n exit = undefined\n }\n\n if (arguments.length === 0 || isjQuery(selector) || isEvent(selector)) {\n // onmount() - trigger all behaviors. Also account for cases such as\n // $($.onmount), where it's triggered with a jQuery event object.\n onmount.poll()\n } else if (arguments.length === 1) {\n // onmount(selector) - trigger for a given selector.\n onmount.poll(selector)\n } else {\n // onmount(sel, fn, [fn]) - register a new behavior.\n var be = new Behavior(selector, init, exit, options)\n behaviors.push(be)\n be.register()\n }\n\n return this\n }\n\n /*\n * Use jQuery (or a jQuery-like) when available. This will allow\n * the use of jQuery selectors.\n */\n\n onmount.$ = window.jQuery || window.Zepto || window.Ender\n\n /*\n * Detect MutationObserver support for `onmount.observe()`.\n * You may even add a polyfill here via\n * `onmount.MutationObserver = require('mutation-observer')`.\n */\n\n onmount.MutationObserver =\n window.MutationObserver ||\n window.WebKitMutationObserver ||\n window.MozMutationObserver\n\n /**\n * Set this to true if you want to see debug messages.\n */\n\n onmount.debug = false\n\n /**\n * Internal: triggers behaviors for a selector or for all.\n *\n * onmount.poll()\n * onmount.poll('.js-button')\n */\n\n onmount.poll = function poll (selector) {\n if (selector) selector = onmount.selectify(selector)\n var functions = (selector ? selectors[selector] : handlers) || []\n each(functions, function (fn) { fn() })\n }\n\n /**\n * Observes automatically using MutationObserver events.\n *\n * onmount.observe()\n */\n\n onmount.observe = function observe () {\n var MutationObserver = onmount.MutationObserver\n if (typeof MutationObserver === 'undefined') return\n\n var obs = new MutationObserver(function (mutations) {\n each(behaviors, function (be) {\n each(mutations, function (mutation) {\n each(mutation.addedNodes, function (el) {\n if (matches(el, be.selector)) be.visitEnter(el)\n })\n\n each(mutation.removedNodes, function (el) {\n if (matches(el, be.selector)) be.doExit(el)\n })\n })\n })\n })\n\n obs.observe(document, { subtree: true, childList: true })\n onmount.observer = obs\n\n // trigger everything before going\n onmount()\n return true\n }\n\n /**\n * Turns off observation first issued by `onmount.observe()`.\n */\n\n onmount.unobserve = function unobserve () {\n if (!this.observer) return\n this.observer.disconnect()\n delete this.observer\n }\n\n /**\n * Forces teardown of all behaviors currently applied.\n */\n\n onmount.teardown = function teardown () {\n each(behaviors, function (be) {\n each(be.loaded, function (el, i) {\n if (el) be.doExit(el, i)\n })\n })\n }\n\n /**\n * Clears all behaviors. Useful for tests.\n * This will NOT call exit handlers.\n */\n\n onmount.reset = function reset () {\n handlers = onmount.handlers = []\n selectors = onmount.selectors = {}\n behaviors = onmount.behaviors = []\n }\n\n /**\n * Internal: Converts `@role` to `[role~=\"role\"]` if needed. You can override\n * this by reimplementing `onmount.selectify`.\n *\n * selectify('@hi') //=> '[role=\"hi\"]'\n * selectify('.btn') //=> '.btn'\n */\n\n onmount.selectify = function selectify (selector) {\n if (selector[0] === '@') {\n return '[role~=\"' + selector.substr(1).replace(/\"/g, '\\\\\"') + '\"]'\n }\n return selector\n }\n\n /**\n * Internal: behavior class\n */\n\n function Behavior (selector, init, exit, options) {\n this.id = 'b' + bid++\n this.init = init\n this.exit = exit\n this.selector = onmount.selectify(selector)\n this.loaded = [] // keep track of dom elements loaded for this behavior\n this.key = '__onmount:' + bid // leave the state in el['__onmount:12']\n this.detectMutate = options && options.detectMutate\n }\n\n /**\n * Internal: initialize this behavior by registering itself to the internal\n * `selectors` map. This allows you to call `onmount(selector)` later on.\n */\n\n Behavior.prototype.register = function () {\n var be = this\n var loaded = this.loaded\n var selector = this.selector\n\n register(selector, function () {\n var list = query(selector)\n\n // This is the function invoked on `onmount(selector)`.\n // Clean up old ones (if they're not in the DOM anymore).\n each(loaded, function (element, i) {\n be.visitExit(element, i, list)\n })\n\n // Clean up new ones (if they're not loaded yet).\n eachOf(list, function (element) {\n be.visitEnter(element)\n })\n })\n }\n\n /**\n * Internal: visits the element `el` and turns it on if applicable.\n */\n\n Behavior.prototype.visitEnter = function (el) {\n if (el[this.key]) return\n var options = { id: 'c' + cid, selector: this.selector }\n if (this.init.call(el, options) !== false) {\n if (onmount.debug) log('enter', this.selector, el)\n el[this.key] = options\n this.loaded.push(el)\n cid++\n }\n }\n\n /**\n * Internal: visits the element `el` and sees if it needs its exit handler\n * called.\n */\n\n Behavior.prototype.visitExit = function (el, i, list) {\n if (!el) return\n if (this.detectMutate) {\n if (!has(list, el)) return this.doExit(el, i)\n } else {\n if (!isAttached(el)) return this.doExit(el, i)\n }\n }\n\n /**\n * Internal: calls the exit handler for the behavior for element `el` (if\n * available), and marks the behavior/element as uninitialized.\n */\n\n Behavior.prototype.doExit = function (el, i) {\n if (typeof i === 'undefined') i = this.loaded.indexOf(el)\n this.loaded[i] = undefined\n if (this.exit && this.exit.call(el, el[this.key]) !== false) {\n if (onmount.debug) log('exit', this.selector, el)\n delete el[this.key]\n }\n }\n\n /**\n * Internal: check if an element is still attached to its document.\n */\n\n function isAttached (el) {\n while (el) {\n if (el === document.documentElement) return true\n el = el.parentElement\n }\n }\n\n /**\n * Internal: reimplementation of `$('...')`. If jQuery is available,\n * use it (I guess to preserve IE compatibility and to enable special jQuery\n * attribute selectors). Use with `eachOf()` or `has()`.\n */\n\n function query (selector, fn) {\n if (onmount.$) return onmount.$(selector)\n return document.querySelectorAll(selector)\n }\n\n /**\n * Internal: iterates through a `query()` result.\n */\n\n function eachOf (list, fn) {\n if (onmount.$) return list.each(function (i) { fn(this, i) })\n return each(list, fn)\n }\n\n /**\n * Interanl: checks if given element `el` is in the query result `list`.\n */\n\n function has (list, el) {\n if (onmount.$) return list.index(el) > -1\n return list.indexOf(el) > -1\n }\n\n /**\n * Internal: registers a behavior handler for a selector.\n */\n\n function register (selector, fn) {\n if (!selectors[selector]) selectors[selector] = []\n selectors[selector].push(fn)\n handlers.push(fn)\n }\n\n /**\n * Checks if a given element `el` matches `selector`.\n * Compare with [$.fn.is](http://api.jquery.com/is/).\n *\n * var matches = require('dom101/matches');\n *\n * matches(button, ':focus');\n */\n\n function matches (el, selector) {\n var _matches = el.matches ||\n el.matchesSelector ||\n el.msMatchesSelector ||\n el.mozMatchesSelector ||\n el.webkitMatchesSelector ||\n el.oMatchesSelector\n\n if (onmount.$) {\n return onmount.$(el).is(selector)\n } else if (_matches) {\n return _matches.call(el, selector)\n } else if (el.parentNode) {\n // IE8 and below\n var nodes = el.parentNode.querySelectorAll(selector)\n for (var i = nodes.length; i--; 0) {\n if (nodes[i] === el) return true\n }\n return false\n }\n }\n\n /**\n * Iterates through `list` (an array or an object). This is useful when dealing\n * with NodeLists like `document.querySelectorAll`.\n *\n * var each = require('dom101/each');\n * var qa = require('dom101/query-selector-all');\n *\n * each(qa('.button'), function (el) {\n * addClass('el', 'selected');\n * });\n */\n\n function each (list, fn) {\n var i\n var len = list.length\n\n if (len === +len) {\n for (i = 0; i < len; i++) { fn(list[i], i) }\n } else {\n for (i in list) {\n if (list.hasOwnProperty(i)) fn(list[i], i)\n }\n }\n\n return list\n }\n\n /**\n * Internal: Check if a given object is jQuery\n */\n\n function isjQuery ($) {\n return typeof $ === 'function' && $.fn && $.noConflict\n }\n\n function isEvent (e) {\n return typeof e === 'object' && e.target\n }\n\n /**\n * Internal: logging\n */\n\n var styles = {\n enter: 'background-color:#dfd;font-weight:bold;color:#141',\n exit: 'background-color:#fdd;font-weight:bold;color:#411'\n }\n\n if (~navigator.userAgent.indexOf('Mozilla')) {\n log = function (type, selector, el) {\n console.log('%c %s ', styles[type], selector, el)\n }\n } else {\n log = function (type, selector, el) {\n console.log('(onmount)', type, selector)\n }\n }\n\n /*\n * Export\n */\n\n onmount.reset()\n return onmount\n}))\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/onmount/index.js\n// module id = yfX/NEeqeNrvWENPWWKS\n// module chunks = 0","// 3rd party libs\nwindow.Prism = require('prismjs')\n\n// All the others\nfunction requireAll (r) { r.keys().forEach(r) }\nrequireAll(require.context('./initializers/', true, /\\.js$/))\nrequireAll(require.context('./behaviors/', true, /\\.js$/))\n\n\n\n// WEBPACK FOOTER //\n// ./_js/app.js","import onmount from 'onmount'\nimport * as Search from '../helpers/search'\nimport qs from '../helpers/qs'\nimport on from 'dom101/on'\n\nonmount('[data-js-search-input]', function () {\n on(this, 'input', () => {\n const val = this.value\n\n if (val === '') {\n Search.showAll()\n } else {\n Search.show(val)\n }\n })\n\n const query = (qs(window.location.search) || {}).q\n if (query && query.length) {\n this.value = query\n setTimeout(() => { Search.show(query) })\n }\n})\n\n\n\n// WEBPACK FOOTER //\n// ./_js/behaviors/search-input.js"],"sourceRoot":""} \ No newline at end of file +{"version":3,"sources":["webpack:///app.js","webpack:////Users/rsc/Projects/@devhints/cheatsheets/_js/helpers/store.js","webpack:////Users/rsc/Projects/@devhints/cheatsheets/_js/helpers/dismiss.js","webpack:////Users/rsc/Projects/@devhints/cheatsheets/_js/initializers /\\.js$/","webpack:////Users/rsc/Projects/@devhints/cheatsheets/_js/initializers/onmount.js","webpack:////Users/rsc/Projects/@devhints/cheatsheets/_js/helpers/preview.js","webpack:////Users/rsc/Projects/@devhints/cheatsheets/_js/behaviors/disqus.js","webpack:////Users/rsc/Projects/@devhints/cheatsheets/node_modules/dom101/matches.js","webpack:////Users/rsc/Projects/@devhints/cheatsheets/_js/helpers/data.js","webpack:////Users/rsc/Projects/@devhints/cheatsheets/_js/behaviors/search-form.js","webpack:////Users/rsc/Projects/@devhints/cheatsheets/_js/helpers/search.js","webpack:////Users/rsc/Projects/@devhints/cheatsheets/_js/behaviors/h3-section-list.js","webpack:////Users/rsc/Projects/@devhints/cheatsheets/node_modules/dom101/query-selector-all.js","webpack:////Users/rsc/Projects/@devhints/cheatsheets/_js/helpers/permutate.js","webpack:////Users/rsc/Projects/@devhints/cheatsheets/node_modules/isotope-layout/dist/isotope.pkgd.js","webpack:////Users/rsc/Projects/@devhints/cheatsheets/node_modules/dom101/closest.js","webpack:////Users/rsc/Projects/@devhints/cheatsheets/node_modules/dom101/on.js","webpack:////Users/rsc/Projects/@devhints/cheatsheets/node_modules/dom101/each.js","webpack:////Users/rsc/Projects/@devhints/cheatsheets/_js/behaviors/dismissable.js","webpack:////Users/rsc/Projects/@devhints/cheatsheets/_js/helpers/dom.js","webpack:////Users/rsc/Projects/@devhints/cheatsheets/_js/behaviors/dismiss.js","webpack:////Users/rsc/Projects/@devhints/cheatsheets/node_modules/dom101/remove-class.js","webpack:////Users/rsc/Projects/@devhints/cheatsheets/_js/behaviors /\\.js$/","webpack:////Users/rsc/Projects/@devhints/cheatsheets/_js/helpers/inject_disqus.js","webpack:////Users/rsc/Projects/@devhints/cheatsheets/_js/helpers/qs.js","webpack:////Users/rsc/Projects/@devhints/cheatsheets/_js/behaviors/no-preview.js","webpack:////Users/rsc/Projects/@devhints/cheatsheets/node_modules/dom101/add-class.js","webpack:////Users/rsc/Projects/@devhints/cheatsheets/_js/behaviors/searchable-item.js","webpack:////Users/rsc/Projects/@devhints/cheatsheets/node_modules/dom101/ready.js","webpack:////Users/rsc/Projects/@devhints/cheatsheets/_js/behaviors/searchable-header.js","webpack:////Users/rsc/Projects/@devhints/cheatsheets/node_modules/dom101/remove.js","webpack:////Users/rsc/Projects/@devhints/cheatsheets/node_modules/onmount/index.js","webpack:////Users/rsc/Projects/@devhints/cheatsheets/_js/app.js","webpack:////Users/rsc/Projects/@devhints/cheatsheets/_js/behaviors/search-input.js"],"names":["webpackJsonp","/k7tj9kxRFhFtZjlt346","module","exports","__webpack_require__","update","key","fn","window","localStorage","data","JSON","parse","stringify","fetch","Object","defineProperty","value","2QOxTCxkuzN0PP2kJ2jn","setDismissed","id","Store","isDismissed","_store","obj","__esModule","newObj","prototype","hasOwnProperty","call","default","2tov+8o2NrZdw/Lg8JZA","webpackContext","req","webpackContextResolve","map","Error","./onmount.js","keys","resolve","6hLKOGpXaWUwTDQA5TL2","_interopRequireDefault","_ready","_ready2","_onmount","_onmount2","setTimeout","BF4TFfJ+K+wsuHfLZ/S3","isPreview","location","search","indexOf","BuWMdGeXUEK0GmkN01pU","_inject_disqus","_inject_disqus2","this","getAttribute","$parent","parentNode","setAttribute","disqus_config","page","url","identifier","host","removeAttribute","C2mk7N9JzKWlcOYJrkfi","matches","el","selector","_matches","matchesSelector","msMatchesSelector","mozMatchesSelector","webkitMatchesSelector","oMatchesSelector","nodes","querySelectorAll","i","length","CjZN/azBHJxH2NsOjfdD","val","getData","setData","str","D3SYMdNAenu80VOO7/Dv","_on","_on2","e","preventDefault","link","document","querySelector","href","DfTyEU8lscjHXmCMlptO","showAll","_querySelectorAll2","forEach","show","keywords","_permutate","splitwords","selectors","k","join","_querySelectorAll","E+dCGfS1pT5WowYv7jpv","_isotopePkgd","_isotopePkgd2","iso","itemSelector","transitionDuration","image","layout","EvxNxLK9yKFmn1U14Kvw","query","context","Array","slice","GOdGag34TlRuHa2OZoh9","permutate","words","slug","concat","permutateString","category","word","permutateWord","len","push","substr","toLowerCase","split","filter","GbzL7C/QFmiBZDICkla+","__WEBPACK_AMD_DEFINE_ARRAY__","__WEBPACK_AMD_DEFINE_RESULT__","__WEBPACK_LOCAL_MODULE_1__","__WEBPACK_LOCAL_MODULE_1__factory","__WEBPACK_LOCAL_MODULE_1__module","__WEBPACK_LOCAL_MODULE_2__","__WEBPACK_LOCAL_MODULE_3__","__WEBPACK_LOCAL_MODULE_3__factory","__WEBPACK_LOCAL_MODULE_3__module","__WEBPACK_LOCAL_MODULE_4__","__WEBPACK_AMD_DEFINE_FACTORY__","__WEBPACK_LOCAL_MODULE_5__","__WEBPACK_LOCAL_MODULE_6__","__WEBPACK_LOCAL_MODULE_7__","__WEBPACK_LOCAL_MODULE_8__","__WEBPACK_LOCAL_MODULE_9__","__WEBPACK_LOCAL_MODULE_10__","__WEBPACK_LOCAL_MODULE_11__","__WEBPACK_LOCAL_MODULE_12__","factory","undefined","jQuery","apply","jQueryBridget","namespace","PluginClass","$","methodCall","$elems","methodName","args","returnValue","pluginMethodStr","each","elem","instance","logError","method","charAt","plainCall","options","option","_init","opts","isPlainObject","extend","arg0","arraySlice","arguments","updateJQuery","bridget","console","message","error","global","loaded","EvEmitter","proto","on","eventName","listener","events","_events","listeners","once","onceEvents","_onceEvents","off","index","splice","emitEvent","onceListeners","isOnce","getStyleSize","num","parseFloat","isNaN","noop","getZeroSize","size","width","height","innerWidth","innerHeight","outerWidth","outerHeight","measurementsLength","measurements","getStyle","style","getComputedStyle","setup","isSetup","div","createElement","padding","borderStyle","borderWidth","boxSizing","body","documentElement","appendChild","getSize","isBoxSizeOuter","removeChild","nodeType","display","offsetWidth","offsetHeight","isBorderBox","measurement","paddingWidth","paddingLeft","paddingRight","paddingHeight","paddingTop","paddingBottom","marginWidth","marginLeft","marginRight","marginHeight","marginTop","marginBottom","borderLeftWidth","borderRightWidth","borderHeight","borderTopWidth","borderBottomWidth","isBorderBoxSizeOuter","styleWidth","styleHeight","matchesMethod","ElemProto","Element","prefixes","prefix","utils","a","b","prop","modulo","makeArray","ary","isArray","removeFrom","getParent","getQueryElement","handleEvent","event","type","filterFindElements","elems","ffElems","HTMLElement","childElems","debounceMethod","_class","threshold","timeoutName","timeout","clearTimeout","_this","docReady","callback","readyState","addEventListener","toDashed","replace","match","$1","$2","htmlInit","WidgetClass","dashedNamespace","dataAttr","dataAttrElems","jsDashElems","dataOptionsAttr","attr","className","isEmptyObj","Item","element","position","x","y","_create","docElemStyle","transitionProperty","transition","transformProperty","transform","transitionEndEvent","WebkitTransition","vendorProperties","transitionDelay","create","constructor","_transn","ingProperties","clean","onEnd","css","elemStyle","getPosition","isOriginLeft","_getOption","isOriginTop","xValue","yValue","layoutSize","parseInt","layoutPosition","xPadding","xProperty","xResetProperty","getXValue","yPadding","yProperty","yResetProperty","getYValue","isHorizontal","percentPosition","_transitionTo","curX","curY","compareX","compareY","didNotMove","setPosition","isTransitioning","transX","transY","transitionStyle","getTranslate","to","onTransitionEnd","isCleaning","goTo","moveTo","_nonTransition","_removeStyles","_transition","from","enableTransition","transitionProps","duration","staggerDelay","onwebkitTransitionEnd","ontransitionend","onotransitionend","dashedVendorProperties","-webkit-transform","target","propertyName","disableTransition","removeTransitionStyles","removeEventListener","cleanStyle","cleanTransitionStyle","stagger","delay","removeElem","remove","hide","reveal","isHidden","getHideRevealTransitionEndProperty","onRevealTransitionEnd","hiddenStyle","visibleStyle","styleProperty","optionStyle","opacity","onHideTransitionEnd","destroy","left","right","top","bottom","Outlayer","queryElement","$element","defaults","GUID","outlayerGUID","instances","subclass","Parent","SubClass","getMilliseconds","time","unit","msUnits","containerStyle","initLayout","originLeft","originTop","resize","resizeContainer","oldOption","compatOptions","horizontal","layoutInstant","reloadItems","stamps","stamp","bindResize","items","_itemize","children","itemElems","_filterFindItemElements","item","getItemElements","_resetLayout","_manageStamps","isInstant","_isLayoutInited","layoutItems","_getMeasurement","_getItemsForLayout","_layoutItems","_postLayout","isIgnored","_emitCompleteOnItems","queue","_getItemLayoutPosition","isLayoutInstant","_processLayoutQueue","updateStagger","_positionItem","_getContainerSize","_setContainerMeasure","measure","isWidth","elemSize","Math","max","onComplete","dispatchEvent","tick","doneCount","count","emitArgs","$event","Event","trigger","ignore","getItem","unignore","_find","unstamp","_getBoundingRect","_manageStamp","boundingRect","getBoundingClientRect","_boundingRect","_getElementOffset","thisRect","isResizeBound","unbindResize","onresize","needsResizeLayout","addItems","appended","prepended","previousItems","revealItemElements","getItems","hideItemElements","removeItems","removeData","Layout","ms","s","itemGUID","sortData","updateSortData","random","getSortData","sorters","_sorters","sorter","_destroy","LayoutMode","isotope","filteredItems","needsVerticalResizeLayout","getColumnWidth","getSegmentSize","getRowHeight","segment","segmentName","outerSize","firstItemSize","getFirstItemSize","firstItem","modes","Mode","Masonry","fitWidth","measureColumns","colYs","cols","maxY","horizontalColIndex","getContainerWidth","columnWidth","firstItemElem","containerWidth","gutter","excess","mathMethod","isFitWidth","container","remainder","colSpan","min","colPosMethod","horizontalOrder","colPosition","col","setHeight","setMax","_getTopColPosition","colGroup","_getTopColGroup","minimumY","groupCount","_getColGroupY","groupColYs","_getHorizontalColPosition","hasSize","stampSize","offset","firstX","lastX","firstCol","floor","lastCol","stampMaxY","_getContainerFitWidth","unusedCols","previousWidth","MasonryMode","keepModeMethods","FitRows","itemWidth","Vertical","horizontalAlignment","getItemSorter","sortBys","sortAsc","itemA","itemB","sortBy","isAscending","direction","trim","String","Isotope","layoutMode","isJQueryFiltering","sortAscending","_getSorters","sortHistory","name","_initLayoutMode","_updateItemsSortData","initialOpts","arrange","_layout","_getIsInstant","filtered","_filter","_bindArrangeComplete","_isInstant","_noTransition","_hideReveal","_sort","needReveal","needHide","arrangeParallelCallback","isLayoutComplete","isHideComplete","isRevealComplete","hiddenMatched","visibleUnmatched","test","_getFilterTest","isMatched","is","mungeSorter","attrMatch","getValue","getValueGetter","parser","sortDataParsers","child","textContent","_getIsSameSortBy","itemSorter","sort","_mode","mode","_filterRevealAdded","insert","filteredInsertItems","_remove","shuffle","getFilteredItemElements","Gz0TuoFFs6JdDvtR2PYZ","closest","sel","MKJaVdnD9jF7rk6rW6AJ","handler","attachEvent","O7wD3s+p+jjyw5ivWGEg","list","idx","XxGrbZud7DE4W4TdQZtc","_remove2","_removeClass","_removeClass2","_data","_dismiss","_preview","ahJreyGRfWuLMDCl+A3L","_toConsumableArray","arr","arr2","appendMany","nextUntil","nextUntilTick","nextSibling","acc","_matches2","before","reference","newNode","insertBefore","findChildren","createDiv","props","d","azEBDvunS5n/qbuQInIF","_closest","_closest2","Dismiss","parent","dismissable","bq+j3PCtCSGVXgg8xWPw","removeClass","classList","classNames","Boolean","expr","RegExp","cBdQffYQOU2SCSRXjSUx","./dismiss.js","./dismissable.js","./disqus.js","./h3-section-list.js","./main-body.js","./no-preview.js","./search-form.js","./search-input.js","./searchable-header.js","./searchable-item.js","cYqQDyTPtD7lV79ovj4Y","inject","injectEmbed","injectCount","src","Date","head","async","g2okcHDGBNRpe9zqR9sR","g3wkw0XZUos0Eo8rU7p6","j059HZGO2uzpV/UZMXr3","qs","p","reduce","result","part","qsdecode","string","k6EYej2Qda8Mq9A5Oeqn","_addClass","_addClass2","lGfezzQL7fc5RE8kg33g","addClass","add","tcev71HWHlq3Ur/sw7Ir","_permutate2","tqbVxj9+xGAhlFrQpyTS","ready","isReady","veOabZWTWtixkn1TyITD","_dom","els","n","wYegCzKWCG2ZRJZfGEZa","yfX/NEeqeNrvWENPWWKS","root","onmount","init","exit","isjQuery","isEvent","poll","be","Behavior","behaviors","register","bid","selectify","detectMutate","isAttached","parentElement","eachOf","has","handlers","noConflict","log","cid","Zepto","Ender","MutationObserver","WebKitMutationObserver","MozMutationObserver","debug","observe","obs","mutations","mutation","addedNodes","visitEnter","removedNodes","doExit","subtree","childList","observer","unobserve","disconnect","teardown","reset","visitExit","styles","enter","navigator","userAgent","z+w/DGZianwIMo5d4qOD","requireAll","r","Prism","zNHHVy5XxvKjnqTgwxy7","_search","Search","_qs","_qs2","q"],"mappings":"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","file":"app.js","sourcesContent":["webpackJsonp([0],{\n\n/***/ \"/k7tj9kxRFhFtZjlt346\":\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.update = update;\nexports.fetch = fetch;\n/**\n * Updates a local storage key. If it doesn't exist, it defaults to an empty\n * object.\n *\n * @example\n * update('dismissed', (data) => {\n * data.lol = true\n * return data\n * })\n */\n\nfunction update(key, fn) {\n if (!window.localStorage) return;\n var data = JSON.parse(window.localStorage[key] || '{}');\n data = fn(data);\n window.localStorage[key] = JSON.stringify(data);\n}\n\n/**\n * Fetches a local storage key.\n *\n * @example\n * const data = fetch('dismissed')\n */\n\nfunction fetch(key) {\n if (!window.localStorage) return;\n return JSON.parse(window.localStorage[key] || '{}');\n}\n\n/***/ }),\n\n/***/ \"2QOxTCxkuzN0PP2kJ2jn\":\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.setDismissed = setDismissed;\nexports.isDismissed = isDismissed;\n\nvar _store = __webpack_require__(\"/k7tj9kxRFhFtZjlt346\");\n\nvar Store = _interopRequireWildcard(_store);\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }\n\n/**\n * Dismisses an announcement.\n *\n * @example\n * setDismissed('2017-09-02-happy-birthday')\n */\n\nfunction setDismissed(id) {\n Store.update('dismissed', function (data) {\n data[id] = true;\n return data;\n });\n}\n\n/**\n * Checks if an announcement has been dismissed before.\n *\n * @example\n * setDismissed('2017-09-02-happy-birthday')\n * isDismissed('2017-09-02-happy-birthday') => true\n */\n\nfunction isDismissed(id) {\n var data = Store.fetch('dismissed');\n return data && data[id];\n}\n\n/***/ }),\n\n/***/ \"2tov+8o2NrZdw/Lg8JZA\":\n/***/ (function(module, exports, __webpack_require__) {\n\nvar map = {\n\t\"./onmount.js\": \"6hLKOGpXaWUwTDQA5TL2\"\n};\nfunction webpackContext(req) {\n\treturn __webpack_require__(webpackContextResolve(req));\n};\nfunction webpackContextResolve(req) {\n\tvar id = map[req];\n\tif(!(id + 1)) // check for number or string\n\t\tthrow new Error(\"Cannot find module '\" + req + \"'.\");\n\treturn id;\n};\nwebpackContext.keys = function webpackContextKeys() {\n\treturn Object.keys(map);\n};\nwebpackContext.resolve = webpackContextResolve;\nmodule.exports = webpackContext;\nwebpackContext.id = \"2tov+8o2NrZdw/Lg8JZA\";\n\n/***/ }),\n\n/***/ \"6hLKOGpXaWUwTDQA5TL2\":\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nvar _ready = __webpack_require__(\"tqbVxj9+xGAhlFrQpyTS\");\n\nvar _ready2 = _interopRequireDefault(_ready);\n\nvar _onmount = __webpack_require__(\"yfX/NEeqeNrvWENPWWKS\");\n\nvar _onmount2 = _interopRequireDefault(_onmount);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n/**\n * Behavior: Wrapping\n */\n\n(0, _ready2.default)(function () {\n setTimeout(function () {\n (0, _onmount2.default)();\n });\n});\n\n/***/ }),\n\n/***/ \"BF4TFfJ+K+wsuHfLZ/S3\":\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.isPreview = isPreview;\n/**\n * Checks if we're in preview mode (?preview=1).\n */\n\nfunction isPreview() {\n return window.location.search.indexOf('preview=1') !== -1;\n}\n\n/***/ }),\n\n/***/ \"BuWMdGeXUEK0GmkN01pU\":\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nvar _onmount = __webpack_require__(\"yfX/NEeqeNrvWENPWWKS\");\n\nvar _onmount2 = _interopRequireDefault(_onmount);\n\nvar _inject_disqus = __webpack_require__(\"cYqQDyTPtD7lV79ovj4Y\");\n\nvar _inject_disqus2 = _interopRequireDefault(_inject_disqus);\n\nvar _ready = __webpack_require__(\"tqbVxj9+xGAhlFrQpyTS\");\n\nvar _ready2 = _interopRequireDefault(_ready);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n/**\n * Delay disqus by some time. It's at the bottom of the page, there's no need\n * for it to load fast. This will give more time to load more critical assets.\n */\n\nvar DISQUS_DELAY = 10 * 1000;\n\n/**\n * Injects Disqus onto the page.\n */\n\n(0, _onmount2.default)('[data-js-disqus]', function () {\n var data = JSON.parse(this.getAttribute('data-js-disqus'));\n var $parent = this.parentNode;\n $parent.setAttribute('hidden', true);\n\n window.disqus_config = function () {\n this.page.url = data.url;\n this.page.identifier = data.identifier;\n };\n\n // Disqus takes a while to load, don't do it so eagerly.\n (0, _ready2.default)(function () {\n setTimeout(function () {\n (0, _inject_disqus2.default)(data.host);\n $parent.removeAttribute('hidden');\n }, DISQUS_DELAY);\n });\n});\n\n/***/ }),\n\n/***/ \"C2mk7N9JzKWlcOYJrkfi\":\n/***/ (function(module, exports) {\n\n/**\n * matches : matches(el, selector)\n * Checks if a given element `el` matches `selector`.\n * Compare with [$.fn.is](http://api.jquery.com/is/).\n *\n * var matches = require('dom101/matches');\n *\n * matches(button, ':focus');\n */\n\nfunction matches (el, selector) {\n var _matches = el.matches ||\n el.matchesSelector ||\n el.msMatchesSelector ||\n el.mozMatchesSelector ||\n el.webkitMatchesSelector ||\n el.oMatchesSelector\n\n if (_matches) {\n return _matches.call(el, selector)\n } else if (el.parentNode) {\n // IE8 and below\n var nodes = el.parentNode.querySelectorAll(selector)\n for (var i = nodes.length; i--; 0) {\n if (nodes[i] === el) return true\n }\n return false\n }\n}\n\nmodule.exports = matches\n\n\n/***/ }),\n\n/***/ \"CjZN/azBHJxH2NsOjfdD\":\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.data = data;\nexports.getData = getData;\nexports.setData = setData;\n/**\n * Stores and retrieves data from an element. Works like jQuery.data().\n */\n\nfunction data(el, key, val) {\n if (typeof val !== 'undefined') {\n return getData(el, key);\n } else {\n return setData(el, key, val);\n }\n}\n\nfunction getData(el, key) {\n var str = el.getAttribute('data-' + key);\n return JSON.parse(str || '{}');\n}\n\nfunction setData(el, key, val) {\n el.setAttribute('data-' + key, JSON.stringify(val));\n}\n\n/***/ }),\n\n/***/ \"D3SYMdNAenu80VOO7/Dv\":\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nvar _onmount = __webpack_require__(\"yfX/NEeqeNrvWENPWWKS\");\n\nvar _onmount2 = _interopRequireDefault(_onmount);\n\nvar _on = __webpack_require__(\"MKJaVdnD9jF7rk6rW6AJ\");\n\nvar _on2 = _interopRequireDefault(_on);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n/**\n * Submitting the search form\n */\n\n(0, _onmount2.default)('[data-js-search-form]', function () {\n (0, _on2.default)(this, 'submit', function (e) {\n e.preventDefault();\n\n var link = document.querySelector('a[data-search-index]:visible');\n var href = link && link.getAttribute('href');\n\n if (href) window.location = href;\n });\n});\n\n/***/ }),\n\n/***/ \"DfTyEU8lscjHXmCMlptO\":\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.showAll = showAll;\nexports.show = show;\n\nvar _permutate = __webpack_require__(\"GOdGag34TlRuHa2OZoh9\");\n\nvar _querySelectorAll = __webpack_require__(\"EvxNxLK9yKFmn1U14Kvw\");\n\nvar _querySelectorAll2 = _interopRequireDefault(_querySelectorAll);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n/**\n * Show everything.\n *\n * @example\n * Search.showAll()\n */\n\nfunction showAll() {\n (0, _querySelectorAll2.default)('[data-search-index]').forEach(function (el) {\n el.removeAttribute('aria-hidden');\n });\n}\n\n/**\n * Search for a given keyword.\n *\n * @example\n * Search.show('hello')\n */\n\nfunction show(val) {\n var keywords = (0, _permutate.splitwords)(val);\n\n if (!keywords.length) return showAll();\n\n var selectors = keywords.map(function (k) {\n return '[data-search-index~=' + JSON.stringify(k) + ']';\n }).join('');\n\n (0, _querySelectorAll2.default)('[data-search-index]').forEach(function (el) {\n el.setAttribute('aria-hidden', true);\n });\n\n (0, _querySelectorAll2.default)(selectors).forEach(function (el) {\n el.removeAttribute('aria-hidden');\n });\n}\n\n/***/ }),\n\n/***/ \"E+dCGfS1pT5WowYv7jpv\":\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nvar _isotopePkgd = __webpack_require__(\"GbzL7C/QFmiBZDICkla+\");\n\nvar _isotopePkgd2 = _interopRequireDefault(_isotopePkgd);\n\nvar _onmount = __webpack_require__(\"yfX/NEeqeNrvWENPWWKS\");\n\nvar _onmount2 = _interopRequireDefault(_onmount);\n\nvar _on = __webpack_require__(\"MKJaVdnD9jF7rk6rW6AJ\");\n\nvar _on2 = _interopRequireDefault(_on);\n\nvar _querySelectorAll = __webpack_require__(\"EvxNxLK9yKFmn1U14Kvw\");\n\nvar _querySelectorAll2 = _interopRequireDefault(_querySelectorAll);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n/*\n * Behavior: Isotope\n */\n\n/* eslint-disable no-new */\n\n(0, _onmount2.default)('[data-js-h3-section-list]', function () {\n var iso = new _isotopePkgd2.default(this, {\n itemSelector: '.h3-section',\n transitionDuration: 0\n });\n\n var images = (0, _querySelectorAll2.default)('img', this);\n\n images.forEach(function (image) {\n (0, _on2.default)(image, 'load', function () {\n iso.layout();\n });\n });\n\n // Insurance against weirdness on pages like devhints.io/vim, where the\n // critical path CSS may look different from the final CSS (because of the\n // tables).\n (0, _on2.default)(window, 'load', function () {\n iso.layout();\n });\n});\n\n/***/ }),\n\n/***/ \"EvxNxLK9yKFmn1U14Kvw\":\n/***/ (function(module, exports) {\n\n/**\n * querySelectorAll : querySelectorAll(query, [element])\n * Convenience function to access `document.querySelectorAll`. Unlike the\n * default version, this always returns an array.\n *\n * If a 2nd parameter `element` is given, it only searches for descendants of\n * that element.\n *\n * var each = require('dom101/each');\n * var qsa = require('dom101/query-selector-all');\n *\n * qsa('.button').each(el => {\n * addClass('el', 'selected');\n * };\n */\n\nfunction querySelectorAll (query, context) {\n return Array.prototype.slice.call(\n (context || document).querySelectorAll(query)\n )\n}\n\nmodule.exports = querySelectorAll\n\n\n/***/ }),\n\n/***/ \"GOdGag34TlRuHa2OZoh9\":\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.default = permutate;\nexports.permutateString = permutateString;\nexports.permutateWord = permutateWord;\nexports.splitwords = splitwords;\n/**\n * Permutates a searcheable item.\n *\n * permutate({\n * slug: 'hello-world',\n * category: 'greetings'\n * })\n */\n\nfunction permutate(data) {\n var words = [];\n if (data.slug) {\n words = words.concat(permutateString(data.slug));\n }\n if (data.category) {\n words = words.concat(permutateString(data.category));\n }\n return words;\n}\n\n/*\n * Permutates strings.\n *\n * @example\n * permutateString('hi joe')\n * => ['h', 'hi', 'j', 'jo', 'joe']\n */\n\nfunction permutateString(str) {\n var words = [];\n var inputs = splitwords(str);\n\n inputs.forEach(function (word) {\n words = words.concat(permutateWord(word));\n });\n\n return words;\n}\n\n/**\n * Permutates a word.\n *\n * @example\n * permutateWord('hello')\n * => ['h', 'he', 'hel', 'hell', 'hello']\n */\n\nfunction permutateWord(str) {\n var words = [];\n var len = str.length;\n for (var i = 1; i <= len; ++i) {\n words.push(str.substr(0, i));\n }\n return words;\n}\n\n/**\n * Helper for splitting to words.\n *\n * @example\n * splitWords('Hello, world!')\n * => ['hello', 'world']\n */\n\nfunction splitwords(str) {\n var words = str.toLowerCase().split(/[ \\/\\-_]/).filter(function (k) {\n return k && k.length !== 0;\n });\n\n return words;\n}\n\n/***/ }),\n\n/***/ \"GbzL7C/QFmiBZDICkla+\":\n/***/ (function(module, exports, __webpack_require__) {\n\nvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;var __WEBPACK_LOCAL_MODULE_1__, __WEBPACK_LOCAL_MODULE_1__factory, __WEBPACK_LOCAL_MODULE_1__module;var __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_LOCAL_MODULE_2__;var __WEBPACK_LOCAL_MODULE_3__, __WEBPACK_LOCAL_MODULE_3__factory, __WEBPACK_LOCAL_MODULE_3__module;var __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_LOCAL_MODULE_4__;var __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_LOCAL_MODULE_5__;var __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_LOCAL_MODULE_6__;var __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_LOCAL_MODULE_7__;var __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_LOCAL_MODULE_8__;var __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_LOCAL_MODULE_9__;var __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_LOCAL_MODULE_10__;var __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_LOCAL_MODULE_11__;var __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_LOCAL_MODULE_12__;var __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;/*!\n * Isotope PACKAGED v3.0.4\n *\n * Licensed GPLv3 for open source use\n * or Isotope Commercial License for commercial use\n *\n * http://isotope.metafizzy.co\n * Copyright 2017 Metafizzy\n */\n\n/**\n * Bridget makes jQuery widgets\n * v2.0.1\n * MIT license\n */\n\n/* jshint browser: true, strict: true, undef: true, unused: true */\n\n( function( window, factory ) {\n // universal module definition\n /*jshint strict: false */ /* globals define, module, require */\n if ( true ) {\n // AMD\n !(__WEBPACK_AMD_DEFINE_ARRAY__ = [ __webpack_require__(\"g2okcHDGBNRpe9zqR9sR\") ], __WEBPACK_AMD_DEFINE_RESULT__ = function( jQuery ) {\n return factory( window, jQuery );\n }.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n } else if ( typeof module == 'object' && module.exports ) {\n // CommonJS\n module.exports = factory(\n window,\n require('jquery')\n );\n } else {\n // browser global\n window.jQueryBridget = factory(\n window,\n window.jQuery\n );\n }\n\n}( window, function factory( window, jQuery ) {\n'use strict';\n\n// ----- utils ----- //\n\nvar arraySlice = Array.prototype.slice;\n\n// helper function for logging errors\n// $.error breaks jQuery chaining\nvar console = window.console;\nvar logError = typeof console == 'undefined' ? function() {} :\n function( message ) {\n console.error( message );\n };\n\n// ----- jQueryBridget ----- //\n\nfunction jQueryBridget( namespace, PluginClass, $ ) {\n $ = $ || jQuery || window.jQuery;\n if ( !$ ) {\n return;\n }\n\n // add option method -> $().plugin('option', {...})\n if ( !PluginClass.prototype.option ) {\n // option setter\n PluginClass.prototype.option = function( opts ) {\n // bail out if not an object\n if ( !$.isPlainObject( opts ) ){\n return;\n }\n this.options = $.extend( true, this.options, opts );\n };\n }\n\n // make jQuery plugin\n $.fn[ namespace ] = function( arg0 /*, arg1 */ ) {\n if ( typeof arg0 == 'string' ) {\n // method call $().plugin( 'methodName', { options } )\n // shift arguments by 1\n var args = arraySlice.call( arguments, 1 );\n return methodCall( this, arg0, args );\n }\n // just $().plugin({ options })\n plainCall( this, arg0 );\n return this;\n };\n\n // $().plugin('methodName')\n function methodCall( $elems, methodName, args ) {\n var returnValue;\n var pluginMethodStr = '$().' + namespace + '(\"' + methodName + '\")';\n\n $elems.each( function( i, elem ) {\n // get instance\n var instance = $.data( elem, namespace );\n if ( !instance ) {\n logError( namespace + ' not initialized. Cannot call methods, i.e. ' +\n pluginMethodStr );\n return;\n }\n\n var method = instance[ methodName ];\n if ( !method || methodName.charAt(0) == '_' ) {\n logError( pluginMethodStr + ' is not a valid method' );\n return;\n }\n\n // apply method, get return value\n var value = method.apply( instance, args );\n // set return value if value is returned, use only first value\n returnValue = returnValue === undefined ? value : returnValue;\n });\n\n return returnValue !== undefined ? returnValue : $elems;\n }\n\n function plainCall( $elems, options ) {\n $elems.each( function( i, elem ) {\n var instance = $.data( elem, namespace );\n if ( instance ) {\n // set options & init\n instance.option( options );\n instance._init();\n } else {\n // initialize new instance\n instance = new PluginClass( elem, options );\n $.data( elem, namespace, instance );\n }\n });\n }\n\n updateJQuery( $ );\n\n}\n\n// ----- updateJQuery ----- //\n\n// set $.bridget for v1 backwards compatibility\nfunction updateJQuery( $ ) {\n if ( !$ || ( $ && $.bridget ) ) {\n return;\n }\n $.bridget = jQueryBridget;\n}\n\nupdateJQuery( jQuery || window.jQuery );\n\n// ----- ----- //\n\nreturn jQueryBridget;\n\n}));\n\n/**\n * EvEmitter v1.0.3\n * Lil' event emitter\n * MIT License\n */\n\n/* jshint unused: true, undef: true, strict: true */\n\n( function( global, factory ) {\n // universal module definition\n /* jshint strict: false */ /* globals define, module, window */\n if ( true ) {\n // AMD - RequireJS\n !(__WEBPACK_LOCAL_MODULE_1__factory = (factory), (__WEBPACK_LOCAL_MODULE_1__module = { id: \"ev-emitter/ev-emitter\", exports: {}, loaded: false }), __WEBPACK_LOCAL_MODULE_1__ = (typeof __WEBPACK_LOCAL_MODULE_1__factory === 'function' ? (__WEBPACK_LOCAL_MODULE_1__factory.call(__WEBPACK_LOCAL_MODULE_1__module.exports, __webpack_require__, __WEBPACK_LOCAL_MODULE_1__module.exports, __WEBPACK_LOCAL_MODULE_1__module)) : __WEBPACK_LOCAL_MODULE_1__factory), (__WEBPACK_LOCAL_MODULE_1__module.loaded = true), __WEBPACK_LOCAL_MODULE_1__ === undefined && (__WEBPACK_LOCAL_MODULE_1__ = __WEBPACK_LOCAL_MODULE_1__module.exports));\n } else if ( typeof module == 'object' && module.exports ) {\n // CommonJS - Browserify, Webpack\n module.exports = factory();\n } else {\n // Browser globals\n global.EvEmitter = factory();\n }\n\n}( typeof window != 'undefined' ? window : this, function() {\n\n\n\nfunction EvEmitter() {}\n\nvar proto = EvEmitter.prototype;\n\nproto.on = function( eventName, listener ) {\n if ( !eventName || !listener ) {\n return;\n }\n // set events hash\n var events = this._events = this._events || {};\n // set listeners array\n var listeners = events[ eventName ] = events[ eventName ] || [];\n // only add once\n if ( listeners.indexOf( listener ) == -1 ) {\n listeners.push( listener );\n }\n\n return this;\n};\n\nproto.once = function( eventName, listener ) {\n if ( !eventName || !listener ) {\n return;\n }\n // add event\n this.on( eventName, listener );\n // set once flag\n // set onceEvents hash\n var onceEvents = this._onceEvents = this._onceEvents || {};\n // set onceListeners object\n var onceListeners = onceEvents[ eventName ] = onceEvents[ eventName ] || {};\n // set flag\n onceListeners[ listener ] = true;\n\n return this;\n};\n\nproto.off = function( eventName, listener ) {\n var listeners = this._events && this._events[ eventName ];\n if ( !listeners || !listeners.length ) {\n return;\n }\n var index = listeners.indexOf( listener );\n if ( index != -1 ) {\n listeners.splice( index, 1 );\n }\n\n return this;\n};\n\nproto.emitEvent = function( eventName, args ) {\n var listeners = this._events && this._events[ eventName ];\n if ( !listeners || !listeners.length ) {\n return;\n }\n var i = 0;\n var listener = listeners[i];\n args = args || [];\n // once stuff\n var onceListeners = this._onceEvents && this._onceEvents[ eventName ];\n\n while ( listener ) {\n var isOnce = onceListeners && onceListeners[ listener ];\n if ( isOnce ) {\n // remove listener\n // remove before trigger to prevent recursion\n this.off( eventName, listener );\n // unset once flag\n delete onceListeners[ listener ];\n }\n // trigger listener\n listener.apply( this, args );\n // get next listener\n i += isOnce ? 0 : 1;\n listener = listeners[i];\n }\n\n return this;\n};\n\nreturn EvEmitter;\n\n}));\n\n/*!\n * getSize v2.0.2\n * measure size of elements\n * MIT license\n */\n\n/*jshint browser: true, strict: true, undef: true, unused: true */\n/*global define: false, module: false, console: false */\n\n( function( window, factory ) {\n 'use strict';\n\n if ( true ) {\n // AMD\n !(__WEBPACK_AMD_DEFINE_ARRAY__ = [], __WEBPACK_LOCAL_MODULE_2__ = (function() {\n return factory();\n }.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__)));\n } else if ( typeof module == 'object' && module.exports ) {\n // CommonJS\n module.exports = factory();\n } else {\n // browser global\n window.getSize = factory();\n }\n\n})( window, function factory() {\n'use strict';\n\n// -------------------------- helpers -------------------------- //\n\n// get a number from a string, not a percentage\nfunction getStyleSize( value ) {\n var num = parseFloat( value );\n // not a percent like '100%', and a number\n var isValid = value.indexOf('%') == -1 && !isNaN( num );\n return isValid && num;\n}\n\nfunction noop() {}\n\nvar logError = typeof console == 'undefined' ? noop :\n function( message ) {\n console.error( message );\n };\n\n// -------------------------- measurements -------------------------- //\n\nvar measurements = [\n 'paddingLeft',\n 'paddingRight',\n 'paddingTop',\n 'paddingBottom',\n 'marginLeft',\n 'marginRight',\n 'marginTop',\n 'marginBottom',\n 'borderLeftWidth',\n 'borderRightWidth',\n 'borderTopWidth',\n 'borderBottomWidth'\n];\n\nvar measurementsLength = measurements.length;\n\nfunction getZeroSize() {\n var size = {\n width: 0,\n height: 0,\n innerWidth: 0,\n innerHeight: 0,\n outerWidth: 0,\n outerHeight: 0\n };\n for ( var i=0; i < measurementsLength; i++ ) {\n var measurement = measurements[i];\n size[ measurement ] = 0;\n }\n return size;\n}\n\n// -------------------------- getStyle -------------------------- //\n\n/**\n * getStyle, get style of element, check for Firefox bug\n * https://bugzilla.mozilla.org/show_bug.cgi?id=548397\n */\nfunction getStyle( elem ) {\n var style = getComputedStyle( elem );\n if ( !style ) {\n logError( 'Style returned ' + style +\n '. Are you running this code in a hidden iframe on Firefox? ' +\n 'See http://bit.ly/getsizebug1' );\n }\n return style;\n}\n\n// -------------------------- setup -------------------------- //\n\nvar isSetup = false;\n\nvar isBoxSizeOuter;\n\n/**\n * setup\n * check isBoxSizerOuter\n * do on first getSize() rather than on page load for Firefox bug\n */\nfunction setup() {\n // setup once\n if ( isSetup ) {\n return;\n }\n isSetup = true;\n\n // -------------------------- box sizing -------------------------- //\n\n /**\n * WebKit measures the outer-width on style.width on border-box elems\n * IE & Firefox<29 measures the inner-width\n */\n var div = document.createElement('div');\n div.style.width = '200px';\n div.style.padding = '1px 2px 3px 4px';\n div.style.borderStyle = 'solid';\n div.style.borderWidth = '1px 2px 3px 4px';\n div.style.boxSizing = 'border-box';\n\n var body = document.body || document.documentElement;\n body.appendChild( div );\n var style = getStyle( div );\n\n getSize.isBoxSizeOuter = isBoxSizeOuter = getStyleSize( style.width ) == 200;\n body.removeChild( div );\n\n}\n\n// -------------------------- getSize -------------------------- //\n\nfunction getSize( elem ) {\n setup();\n\n // use querySeletor if elem is string\n if ( typeof elem == 'string' ) {\n elem = document.querySelector( elem );\n }\n\n // do not proceed on non-objects\n if ( !elem || typeof elem != 'object' || !elem.nodeType ) {\n return;\n }\n\n var style = getStyle( elem );\n\n // if hidden, everything is 0\n if ( style.display == 'none' ) {\n return getZeroSize();\n }\n\n var size = {};\n size.width = elem.offsetWidth;\n size.height = elem.offsetHeight;\n\n var isBorderBox = size.isBorderBox = style.boxSizing == 'border-box';\n\n // get all measurements\n for ( var i=0; i < measurementsLength; i++ ) {\n var measurement = measurements[i];\n var value = style[ measurement ];\n var num = parseFloat( value );\n // any 'auto', 'medium' value will be 0\n size[ measurement ] = !isNaN( num ) ? num : 0;\n }\n\n var paddingWidth = size.paddingLeft + size.paddingRight;\n var paddingHeight = size.paddingTop + size.paddingBottom;\n var marginWidth = size.marginLeft + size.marginRight;\n var marginHeight = size.marginTop + size.marginBottom;\n var borderWidth = size.borderLeftWidth + size.borderRightWidth;\n var borderHeight = size.borderTopWidth + size.borderBottomWidth;\n\n var isBorderBoxSizeOuter = isBorderBox && isBoxSizeOuter;\n\n // overwrite width and height if we can get it from style\n var styleWidth = getStyleSize( style.width );\n if ( styleWidth !== false ) {\n size.width = styleWidth +\n // add padding and border unless it's already including it\n ( isBorderBoxSizeOuter ? 0 : paddingWidth + borderWidth );\n }\n\n var styleHeight = getStyleSize( style.height );\n if ( styleHeight !== false ) {\n size.height = styleHeight +\n // add padding and border unless it's already including it\n ( isBorderBoxSizeOuter ? 0 : paddingHeight + borderHeight );\n }\n\n size.innerWidth = size.width - ( paddingWidth + borderWidth );\n size.innerHeight = size.height - ( paddingHeight + borderHeight );\n\n size.outerWidth = size.width + marginWidth;\n size.outerHeight = size.height + marginHeight;\n\n return size;\n}\n\nreturn getSize;\n\n});\n\n/**\n * matchesSelector v2.0.2\n * matchesSelector( element, '.selector' )\n * MIT license\n */\n\n/*jshint browser: true, strict: true, undef: true, unused: true */\n\n( function( window, factory ) {\n /*global define: false, module: false */\n 'use strict';\n // universal module definition\n if ( true ) {\n // AMD\n !(__WEBPACK_LOCAL_MODULE_3__factory = (factory), (__WEBPACK_LOCAL_MODULE_3__module = { id: \"desandro-matches-selector/matches-selector\", exports: {}, loaded: false }), __WEBPACK_LOCAL_MODULE_3__ = (typeof __WEBPACK_LOCAL_MODULE_3__factory === 'function' ? (__WEBPACK_LOCAL_MODULE_3__factory.call(__WEBPACK_LOCAL_MODULE_3__module.exports, __webpack_require__, __WEBPACK_LOCAL_MODULE_3__module.exports, __WEBPACK_LOCAL_MODULE_3__module)) : __WEBPACK_LOCAL_MODULE_3__factory), (__WEBPACK_LOCAL_MODULE_3__module.loaded = true), __WEBPACK_LOCAL_MODULE_3__ === undefined && (__WEBPACK_LOCAL_MODULE_3__ = __WEBPACK_LOCAL_MODULE_3__module.exports));\n } else if ( typeof module == 'object' && module.exports ) {\n // CommonJS\n module.exports = factory();\n } else {\n // browser global\n window.matchesSelector = factory();\n }\n\n}( window, function factory() {\n 'use strict';\n\n var matchesMethod = ( function() {\n var ElemProto = window.Element.prototype;\n // check for the standard method name first\n if ( ElemProto.matches ) {\n return 'matches';\n }\n // check un-prefixed\n if ( ElemProto.matchesSelector ) {\n return 'matchesSelector';\n }\n // check vendor prefixes\n var prefixes = [ 'webkit', 'moz', 'ms', 'o' ];\n\n for ( var i=0; i < prefixes.length; i++ ) {\n var prefix = prefixes[i];\n var method = prefix + 'MatchesSelector';\n if ( ElemProto[ method ] ) {\n return method;\n }\n }\n })();\n\n return function matchesSelector( elem, selector ) {\n return elem[ matchesMethod ]( selector );\n };\n\n}));\n\n/**\n * Fizzy UI utils v2.0.5\n * MIT license\n */\n\n/*jshint browser: true, undef: true, unused: true, strict: true */\n\n( function( window, factory ) {\n // universal module definition\n /*jshint strict: false */ /*globals define, module, require */\n\n if ( true ) {\n // AMD\n !(__WEBPACK_AMD_DEFINE_ARRAY__ = [\n __WEBPACK_LOCAL_MODULE_3__\n ], __WEBPACK_LOCAL_MODULE_4__ = (function( matchesSelector ) {\n return factory( window, matchesSelector );\n }.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__)));\n } else if ( typeof module == 'object' && module.exports ) {\n // CommonJS\n module.exports = factory(\n window,\n require('desandro-matches-selector')\n );\n } else {\n // browser global\n window.fizzyUIUtils = factory(\n window,\n window.matchesSelector\n );\n }\n\n}( window, function factory( window, matchesSelector ) {\n\n\n\nvar utils = {};\n\n// ----- extend ----- //\n\n// extends objects\nutils.extend = function( a, b ) {\n for ( var prop in b ) {\n a[ prop ] = b[ prop ];\n }\n return a;\n};\n\n// ----- modulo ----- //\n\nutils.modulo = function( num, div ) {\n return ( ( num % div ) + div ) % div;\n};\n\n// ----- makeArray ----- //\n\n// turn element or nodeList into an array\nutils.makeArray = function( obj ) {\n var ary = [];\n if ( Array.isArray( obj ) ) {\n // use object if already an array\n ary = obj;\n } else if ( obj && typeof obj == 'object' &&\n typeof obj.length == 'number' ) {\n // convert nodeList to array\n for ( var i=0; i < obj.length; i++ ) {\n ary.push( obj[i] );\n }\n } else {\n // array of single index\n ary.push( obj );\n }\n return ary;\n};\n\n// ----- removeFrom ----- //\n\nutils.removeFrom = function( ary, obj ) {\n var index = ary.indexOf( obj );\n if ( index != -1 ) {\n ary.splice( index, 1 );\n }\n};\n\n// ----- getParent ----- //\n\nutils.getParent = function( elem, selector ) {\n while ( elem.parentNode && elem != document.body ) {\n elem = elem.parentNode;\n if ( matchesSelector( elem, selector ) ) {\n return elem;\n }\n }\n};\n\n// ----- getQueryElement ----- //\n\n// use element as selector string\nutils.getQueryElement = function( elem ) {\n if ( typeof elem == 'string' ) {\n return document.querySelector( elem );\n }\n return elem;\n};\n\n// ----- handleEvent ----- //\n\n// enable .ontype to trigger from .addEventListener( elem, 'type' )\nutils.handleEvent = function( event ) {\n var method = 'on' + event.type;\n if ( this[ method ] ) {\n this[ method ]( event );\n }\n};\n\n// ----- filterFindElements ----- //\n\nutils.filterFindElements = function( elems, selector ) {\n // make array of elems\n elems = utils.makeArray( elems );\n var ffElems = [];\n\n elems.forEach( function( elem ) {\n // check that elem is an actual element\n if ( !( elem instanceof HTMLElement ) ) {\n return;\n }\n // add elem if no selector\n if ( !selector ) {\n ffElems.push( elem );\n return;\n }\n // filter & find items if we have a selector\n // filter\n if ( matchesSelector( elem, selector ) ) {\n ffElems.push( elem );\n }\n // find children\n var childElems = elem.querySelectorAll( selector );\n // concat childElems to filterFound array\n for ( var i=0; i < childElems.length; i++ ) {\n ffElems.push( childElems[i] );\n }\n });\n\n return ffElems;\n};\n\n// ----- debounceMethod ----- //\n\nutils.debounceMethod = function( _class, methodName, threshold ) {\n // original method\n var method = _class.prototype[ methodName ];\n var timeoutName = methodName + 'Timeout';\n\n _class.prototype[ methodName ] = function() {\n var timeout = this[ timeoutName ];\n if ( timeout ) {\n clearTimeout( timeout );\n }\n var args = arguments;\n\n var _this = this;\n this[ timeoutName ] = setTimeout( function() {\n method.apply( _this, args );\n delete _this[ timeoutName ];\n }, threshold || 100 );\n };\n};\n\n// ----- docReady ----- //\n\nutils.docReady = function( callback ) {\n var readyState = document.readyState;\n if ( readyState == 'complete' || readyState == 'interactive' ) {\n // do async to allow for other scripts to run. metafizzy/flickity#441\n setTimeout( callback );\n } else {\n document.addEventListener( 'DOMContentLoaded', callback );\n }\n};\n\n// ----- htmlInit ----- //\n\n// http://jamesroberts.name/blog/2010/02/22/string-functions-for-javascript-trim-to-camel-case-to-dashed-and-to-underscore/\nutils.toDashed = function( str ) {\n return str.replace( /(.)([A-Z])/g, function( match, $1, $2 ) {\n return $1 + '-' + $2;\n }).toLowerCase();\n};\n\nvar console = window.console;\n/**\n * allow user to initialize classes via [data-namespace] or .js-namespace class\n * htmlInit( Widget, 'widgetName' )\n * options are parsed from data-namespace-options\n */\nutils.htmlInit = function( WidgetClass, namespace ) {\n utils.docReady( function() {\n var dashedNamespace = utils.toDashed( namespace );\n var dataAttr = 'data-' + dashedNamespace;\n var dataAttrElems = document.querySelectorAll( '[' + dataAttr + ']' );\n var jsDashElems = document.querySelectorAll( '.js-' + dashedNamespace );\n var elems = utils.makeArray( dataAttrElems )\n .concat( utils.makeArray( jsDashElems ) );\n var dataOptionsAttr = dataAttr + '-options';\n var jQuery = window.jQuery;\n\n elems.forEach( function( elem ) {\n var attr = elem.getAttribute( dataAttr ) ||\n elem.getAttribute( dataOptionsAttr );\n var options;\n try {\n options = attr && JSON.parse( attr );\n } catch ( error ) {\n // log error, do not initialize\n if ( console ) {\n console.error( 'Error parsing ' + dataAttr + ' on ' + elem.className +\n ': ' + error );\n }\n return;\n }\n // initialize\n var instance = new WidgetClass( elem, options );\n // make available via $().data('namespace')\n if ( jQuery ) {\n jQuery.data( elem, namespace, instance );\n }\n });\n\n });\n};\n\n// ----- ----- //\n\nreturn utils;\n\n}));\n\n/**\n * Outlayer Item\n */\n\n( function( window, factory ) {\n // universal module definition\n /* jshint strict: false */ /* globals define, module, require */\n if ( true ) {\n // AMD - RequireJS\n !(__WEBPACK_AMD_DEFINE_ARRAY__ = [\n __WEBPACK_LOCAL_MODULE_1__,\n __WEBPACK_LOCAL_MODULE_2__\n ], __WEBPACK_AMD_DEFINE_FACTORY__ = (factory),\n\t\t\t\t__WEBPACK_LOCAL_MODULE_5__ = (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === 'function' ?\n\t\t\t\t(__WEBPACK_AMD_DEFINE_FACTORY__.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__)) : __WEBPACK_AMD_DEFINE_FACTORY__));\n } else if ( typeof module == 'object' && module.exports ) {\n // CommonJS - Browserify, Webpack\n module.exports = factory(\n require('ev-emitter'),\n require('get-size')\n );\n } else {\n // browser global\n window.Outlayer = {};\n window.Outlayer.Item = factory(\n window.EvEmitter,\n window.getSize\n );\n }\n\n}( window, function factory( EvEmitter, getSize ) {\n'use strict';\n\n// ----- helpers ----- //\n\nfunction isEmptyObj( obj ) {\n for ( var prop in obj ) {\n return false;\n }\n prop = null;\n return true;\n}\n\n// -------------------------- CSS3 support -------------------------- //\n\n\nvar docElemStyle = document.documentElement.style;\n\nvar transitionProperty = typeof docElemStyle.transition == 'string' ?\n 'transition' : 'WebkitTransition';\nvar transformProperty = typeof docElemStyle.transform == 'string' ?\n 'transform' : 'WebkitTransform';\n\nvar transitionEndEvent = {\n WebkitTransition: 'webkitTransitionEnd',\n transition: 'transitionend'\n}[ transitionProperty ];\n\n// cache all vendor properties that could have vendor prefix\nvar vendorProperties = {\n transform: transformProperty,\n transition: transitionProperty,\n transitionDuration: transitionProperty + 'Duration',\n transitionProperty: transitionProperty + 'Property',\n transitionDelay: transitionProperty + 'Delay'\n};\n\n// -------------------------- Item -------------------------- //\n\nfunction Item( element, layout ) {\n if ( !element ) {\n return;\n }\n\n this.element = element;\n // parent layout class, i.e. Masonry, Isotope, or Packery\n this.layout = layout;\n this.position = {\n x: 0,\n y: 0\n };\n\n this._create();\n}\n\n// inherit EvEmitter\nvar proto = Item.prototype = Object.create( EvEmitter.prototype );\nproto.constructor = Item;\n\nproto._create = function() {\n // transition objects\n this._transn = {\n ingProperties: {},\n clean: {},\n onEnd: {}\n };\n\n this.css({\n position: 'absolute'\n });\n};\n\n// trigger specified handler for event type\nproto.handleEvent = function( event ) {\n var method = 'on' + event.type;\n if ( this[ method ] ) {\n this[ method ]( event );\n }\n};\n\nproto.getSize = function() {\n this.size = getSize( this.element );\n};\n\n/**\n * apply CSS styles to element\n * @param {Object} style\n */\nproto.css = function( style ) {\n var elemStyle = this.element.style;\n\n for ( var prop in style ) {\n // use vendor property if available\n var supportedProp = vendorProperties[ prop ] || prop;\n elemStyle[ supportedProp ] = style[ prop ];\n }\n};\n\n // measure position, and sets it\nproto.getPosition = function() {\n var style = getComputedStyle( this.element );\n var isOriginLeft = this.layout._getOption('originLeft');\n var isOriginTop = this.layout._getOption('originTop');\n var xValue = style[ isOriginLeft ? 'left' : 'right' ];\n var yValue = style[ isOriginTop ? 'top' : 'bottom' ];\n // convert percent to pixels\n var layoutSize = this.layout.size;\n var x = xValue.indexOf('%') != -1 ?\n ( parseFloat( xValue ) / 100 ) * layoutSize.width : parseInt( xValue, 10 );\n var y = yValue.indexOf('%') != -1 ?\n ( parseFloat( yValue ) / 100 ) * layoutSize.height : parseInt( yValue, 10 );\n\n // clean up 'auto' or other non-integer values\n x = isNaN( x ) ? 0 : x;\n y = isNaN( y ) ? 0 : y;\n // remove padding from measurement\n x -= isOriginLeft ? layoutSize.paddingLeft : layoutSize.paddingRight;\n y -= isOriginTop ? layoutSize.paddingTop : layoutSize.paddingBottom;\n\n this.position.x = x;\n this.position.y = y;\n};\n\n// set settled position, apply padding\nproto.layoutPosition = function() {\n var layoutSize = this.layout.size;\n var style = {};\n var isOriginLeft = this.layout._getOption('originLeft');\n var isOriginTop = this.layout._getOption('originTop');\n\n // x\n var xPadding = isOriginLeft ? 'paddingLeft' : 'paddingRight';\n var xProperty = isOriginLeft ? 'left' : 'right';\n var xResetProperty = isOriginLeft ? 'right' : 'left';\n\n var x = this.position.x + layoutSize[ xPadding ];\n // set in percentage or pixels\n style[ xProperty ] = this.getXValue( x );\n // reset other property\n style[ xResetProperty ] = '';\n\n // y\n var yPadding = isOriginTop ? 'paddingTop' : 'paddingBottom';\n var yProperty = isOriginTop ? 'top' : 'bottom';\n var yResetProperty = isOriginTop ? 'bottom' : 'top';\n\n var y = this.position.y + layoutSize[ yPadding ];\n // set in percentage or pixels\n style[ yProperty ] = this.getYValue( y );\n // reset other property\n style[ yResetProperty ] = '';\n\n this.css( style );\n this.emitEvent( 'layout', [ this ] );\n};\n\nproto.getXValue = function( x ) {\n var isHorizontal = this.layout._getOption('horizontal');\n return this.layout.options.percentPosition && !isHorizontal ?\n ( ( x / this.layout.size.width ) * 100 ) + '%' : x + 'px';\n};\n\nproto.getYValue = function( y ) {\n var isHorizontal = this.layout._getOption('horizontal');\n return this.layout.options.percentPosition && isHorizontal ?\n ( ( y / this.layout.size.height ) * 100 ) + '%' : y + 'px';\n};\n\nproto._transitionTo = function( x, y ) {\n this.getPosition();\n // get current x & y from top/left\n var curX = this.position.x;\n var curY = this.position.y;\n\n var compareX = parseInt( x, 10 );\n var compareY = parseInt( y, 10 );\n var didNotMove = compareX === this.position.x && compareY === this.position.y;\n\n // save end position\n this.setPosition( x, y );\n\n // if did not move and not transitioning, just go to layout\n if ( didNotMove && !this.isTransitioning ) {\n this.layoutPosition();\n return;\n }\n\n var transX = x - curX;\n var transY = y - curY;\n var transitionStyle = {};\n transitionStyle.transform = this.getTranslate( transX, transY );\n\n this.transition({\n to: transitionStyle,\n onTransitionEnd: {\n transform: this.layoutPosition\n },\n isCleaning: true\n });\n};\n\nproto.getTranslate = function( x, y ) {\n // flip cooridinates if origin on right or bottom\n var isOriginLeft = this.layout._getOption('originLeft');\n var isOriginTop = this.layout._getOption('originTop');\n x = isOriginLeft ? x : -x;\n y = isOriginTop ? y : -y;\n return 'translate3d(' + x + 'px, ' + y + 'px, 0)';\n};\n\n// non transition + transform support\nproto.goTo = function( x, y ) {\n this.setPosition( x, y );\n this.layoutPosition();\n};\n\nproto.moveTo = proto._transitionTo;\n\nproto.setPosition = function( x, y ) {\n this.position.x = parseInt( x, 10 );\n this.position.y = parseInt( y, 10 );\n};\n\n// ----- transition ----- //\n\n/**\n * @param {Object} style - CSS\n * @param {Function} onTransitionEnd\n */\n\n// non transition, just trigger callback\nproto._nonTransition = function( args ) {\n this.css( args.to );\n if ( args.isCleaning ) {\n this._removeStyles( args.to );\n }\n for ( var prop in args.onTransitionEnd ) {\n args.onTransitionEnd[ prop ].call( this );\n }\n};\n\n/**\n * proper transition\n * @param {Object} args - arguments\n * @param {Object} to - style to transition to\n * @param {Object} from - style to start transition from\n * @param {Boolean} isCleaning - removes transition styles after transition\n * @param {Function} onTransitionEnd - callback\n */\nproto.transition = function( args ) {\n // redirect to nonTransition if no transition duration\n if ( !parseFloat( this.layout.options.transitionDuration ) ) {\n this._nonTransition( args );\n return;\n }\n\n var _transition = this._transn;\n // keep track of onTransitionEnd callback by css property\n for ( var prop in args.onTransitionEnd ) {\n _transition.onEnd[ prop ] = args.onTransitionEnd[ prop ];\n }\n // keep track of properties that are transitioning\n for ( prop in args.to ) {\n _transition.ingProperties[ prop ] = true;\n // keep track of properties to clean up when transition is done\n if ( args.isCleaning ) {\n _transition.clean[ prop ] = true;\n }\n }\n\n // set from styles\n if ( args.from ) {\n this.css( args.from );\n // force redraw. http://blog.alexmaccaw.com/css-transitions\n var h = this.element.offsetHeight;\n // hack for JSHint to hush about unused var\n h = null;\n }\n // enable transition\n this.enableTransition( args.to );\n // set styles that are transitioning\n this.css( args.to );\n\n this.isTransitioning = true;\n\n};\n\n// dash before all cap letters, including first for\n// WebkitTransform => -webkit-transform\nfunction toDashedAll( str ) {\n return str.replace( /([A-Z])/g, function( $1 ) {\n return '-' + $1.toLowerCase();\n });\n}\n\nvar transitionProps = 'opacity,' + toDashedAll( transformProperty );\n\nproto.enableTransition = function(/* style */) {\n // HACK changing transitionProperty during a transition\n // will cause transition to jump\n if ( this.isTransitioning ) {\n return;\n }\n\n // make `transition: foo, bar, baz` from style object\n // HACK un-comment this when enableTransition can work\n // while a transition is happening\n // var transitionValues = [];\n // for ( var prop in style ) {\n // // dash-ify camelCased properties like WebkitTransition\n // prop = vendorProperties[ prop ] || prop;\n // transitionValues.push( toDashedAll( prop ) );\n // }\n // munge number to millisecond, to match stagger\n var duration = this.layout.options.transitionDuration;\n duration = typeof duration == 'number' ? duration + 'ms' : duration;\n // enable transition styles\n this.css({\n transitionProperty: transitionProps,\n transitionDuration: duration,\n transitionDelay: this.staggerDelay || 0\n });\n // listen for transition end event\n this.element.addEventListener( transitionEndEvent, this, false );\n};\n\n// ----- events ----- //\n\nproto.onwebkitTransitionEnd = function( event ) {\n this.ontransitionend( event );\n};\n\nproto.onotransitionend = function( event ) {\n this.ontransitionend( event );\n};\n\n// properties that I munge to make my life easier\nvar dashedVendorProperties = {\n '-webkit-transform': 'transform'\n};\n\nproto.ontransitionend = function( event ) {\n // disregard bubbled events from children\n if ( event.target !== this.element ) {\n return;\n }\n var _transition = this._transn;\n // get property name of transitioned property, convert to prefix-free\n var propertyName = dashedVendorProperties[ event.propertyName ] || event.propertyName;\n\n // remove property that has completed transitioning\n delete _transition.ingProperties[ propertyName ];\n // check if any properties are still transitioning\n if ( isEmptyObj( _transition.ingProperties ) ) {\n // all properties have completed transitioning\n this.disableTransition();\n }\n // clean style\n if ( propertyName in _transition.clean ) {\n // clean up style\n this.element.style[ event.propertyName ] = '';\n delete _transition.clean[ propertyName ];\n }\n // trigger onTransitionEnd callback\n if ( propertyName in _transition.onEnd ) {\n var onTransitionEnd = _transition.onEnd[ propertyName ];\n onTransitionEnd.call( this );\n delete _transition.onEnd[ propertyName ];\n }\n\n this.emitEvent( 'transitionEnd', [ this ] );\n};\n\nproto.disableTransition = function() {\n this.removeTransitionStyles();\n this.element.removeEventListener( transitionEndEvent, this, false );\n this.isTransitioning = false;\n};\n\n/**\n * removes style property from element\n * @param {Object} style\n**/\nproto._removeStyles = function( style ) {\n // clean up transition styles\n var cleanStyle = {};\n for ( var prop in style ) {\n cleanStyle[ prop ] = '';\n }\n this.css( cleanStyle );\n};\n\nvar cleanTransitionStyle = {\n transitionProperty: '',\n transitionDuration: '',\n transitionDelay: ''\n};\n\nproto.removeTransitionStyles = function() {\n // remove transition\n this.css( cleanTransitionStyle );\n};\n\n// ----- stagger ----- //\n\nproto.stagger = function( delay ) {\n delay = isNaN( delay ) ? 0 : delay;\n this.staggerDelay = delay + 'ms';\n};\n\n// ----- show/hide/remove ----- //\n\n// remove element from DOM\nproto.removeElem = function() {\n this.element.parentNode.removeChild( this.element );\n // remove display: none\n this.css({ display: '' });\n this.emitEvent( 'remove', [ this ] );\n};\n\nproto.remove = function() {\n // just remove element if no transition support or no transition\n if ( !transitionProperty || !parseFloat( this.layout.options.transitionDuration ) ) {\n this.removeElem();\n return;\n }\n\n // start transition\n this.once( 'transitionEnd', function() {\n this.removeElem();\n });\n this.hide();\n};\n\nproto.reveal = function() {\n delete this.isHidden;\n // remove display: none\n this.css({ display: '' });\n\n var options = this.layout.options;\n\n var onTransitionEnd = {};\n var transitionEndProperty = this.getHideRevealTransitionEndProperty('visibleStyle');\n onTransitionEnd[ transitionEndProperty ] = this.onRevealTransitionEnd;\n\n this.transition({\n from: options.hiddenStyle,\n to: options.visibleStyle,\n isCleaning: true,\n onTransitionEnd: onTransitionEnd\n });\n};\n\nproto.onRevealTransitionEnd = function() {\n // check if still visible\n // during transition, item may have been hidden\n if ( !this.isHidden ) {\n this.emitEvent('reveal');\n }\n};\n\n/**\n * get style property use for hide/reveal transition end\n * @param {String} styleProperty - hiddenStyle/visibleStyle\n * @returns {String}\n */\nproto.getHideRevealTransitionEndProperty = function( styleProperty ) {\n var optionStyle = this.layout.options[ styleProperty ];\n // use opacity\n if ( optionStyle.opacity ) {\n return 'opacity';\n }\n // get first property\n for ( var prop in optionStyle ) {\n return prop;\n }\n};\n\nproto.hide = function() {\n // set flag\n this.isHidden = true;\n // remove display: none\n this.css({ display: '' });\n\n var options = this.layout.options;\n\n var onTransitionEnd = {};\n var transitionEndProperty = this.getHideRevealTransitionEndProperty('hiddenStyle');\n onTransitionEnd[ transitionEndProperty ] = this.onHideTransitionEnd;\n\n this.transition({\n from: options.visibleStyle,\n to: options.hiddenStyle,\n // keep hidden stuff hidden\n isCleaning: true,\n onTransitionEnd: onTransitionEnd\n });\n};\n\nproto.onHideTransitionEnd = function() {\n // check if still hidden\n // during transition, item may have been un-hidden\n if ( this.isHidden ) {\n this.css({ display: 'none' });\n this.emitEvent('hide');\n }\n};\n\nproto.destroy = function() {\n this.css({\n position: '',\n left: '',\n right: '',\n top: '',\n bottom: '',\n transition: '',\n transform: ''\n });\n};\n\nreturn Item;\n\n}));\n\n/*!\n * Outlayer v2.1.0\n * the brains and guts of a layout library\n * MIT license\n */\n\n( function( window, factory ) {\n 'use strict';\n // universal module definition\n /* jshint strict: false */ /* globals define, module, require */\n if ( true ) {\n // AMD - RequireJS\n !(__WEBPACK_AMD_DEFINE_ARRAY__ = [\n __WEBPACK_LOCAL_MODULE_1__,\n __WEBPACK_LOCAL_MODULE_2__,\n __WEBPACK_LOCAL_MODULE_4__,\n __WEBPACK_LOCAL_MODULE_5__\n ], __WEBPACK_LOCAL_MODULE_6__ = (function( EvEmitter, getSize, utils, Item ) {\n return factory( window, EvEmitter, getSize, utils, Item);\n }.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__)));\n } else if ( typeof module == 'object' && module.exports ) {\n // CommonJS - Browserify, Webpack\n module.exports = factory(\n window,\n require('ev-emitter'),\n require('get-size'),\n require('fizzy-ui-utils'),\n require('./item')\n );\n } else {\n // browser global\n window.Outlayer = factory(\n window,\n window.EvEmitter,\n window.getSize,\n window.fizzyUIUtils,\n window.Outlayer.Item\n );\n }\n\n}( window, function factory( window, EvEmitter, getSize, utils, Item ) {\n'use strict';\n\n// ----- vars ----- //\n\nvar console = window.console;\nvar jQuery = window.jQuery;\nvar noop = function() {};\n\n// -------------------------- Outlayer -------------------------- //\n\n// globally unique identifiers\nvar GUID = 0;\n// internal store of all Outlayer intances\nvar instances = {};\n\n\n/**\n * @param {Element, String} element\n * @param {Object} options\n * @constructor\n */\nfunction Outlayer( element, options ) {\n var queryElement = utils.getQueryElement( element );\n if ( !queryElement ) {\n if ( console ) {\n console.error( 'Bad element for ' + this.constructor.namespace +\n ': ' + ( queryElement || element ) );\n }\n return;\n }\n this.element = queryElement;\n // add jQuery\n if ( jQuery ) {\n this.$element = jQuery( this.element );\n }\n\n // options\n this.options = utils.extend( {}, this.constructor.defaults );\n this.option( options );\n\n // add id for Outlayer.getFromElement\n var id = ++GUID;\n this.element.outlayerGUID = id; // expando\n instances[ id ] = this; // associate via id\n\n // kick it off\n this._create();\n\n var isInitLayout = this._getOption('initLayout');\n if ( isInitLayout ) {\n this.layout();\n }\n}\n\n// settings are for internal use only\nOutlayer.namespace = 'outlayer';\nOutlayer.Item = Item;\n\n// default options\nOutlayer.defaults = {\n containerStyle: {\n position: 'relative'\n },\n initLayout: true,\n originLeft: true,\n originTop: true,\n resize: true,\n resizeContainer: true,\n // item options\n transitionDuration: '0.4s',\n hiddenStyle: {\n opacity: 0,\n transform: 'scale(0.001)'\n },\n visibleStyle: {\n opacity: 1,\n transform: 'scale(1)'\n }\n};\n\nvar proto = Outlayer.prototype;\n// inherit EvEmitter\nutils.extend( proto, EvEmitter.prototype );\n\n/**\n * set options\n * @param {Object} opts\n */\nproto.option = function( opts ) {\n utils.extend( this.options, opts );\n};\n\n/**\n * get backwards compatible option value, check old name\n */\nproto._getOption = function( option ) {\n var oldOption = this.constructor.compatOptions[ option ];\n return oldOption && this.options[ oldOption ] !== undefined ?\n this.options[ oldOption ] : this.options[ option ];\n};\n\nOutlayer.compatOptions = {\n // currentName: oldName\n initLayout: 'isInitLayout',\n horizontal: 'isHorizontal',\n layoutInstant: 'isLayoutInstant',\n originLeft: 'isOriginLeft',\n originTop: 'isOriginTop',\n resize: 'isResizeBound',\n resizeContainer: 'isResizingContainer'\n};\n\nproto._create = function() {\n // get items from children\n this.reloadItems();\n // elements that affect layout, but are not laid out\n this.stamps = [];\n this.stamp( this.options.stamp );\n // set container style\n utils.extend( this.element.style, this.options.containerStyle );\n\n // bind resize method\n var canBindResize = this._getOption('resize');\n if ( canBindResize ) {\n this.bindResize();\n }\n};\n\n// goes through all children again and gets bricks in proper order\nproto.reloadItems = function() {\n // collection of item elements\n this.items = this._itemize( this.element.children );\n};\n\n\n/**\n * turn elements into Outlayer.Items to be used in layout\n * @param {Array or NodeList or HTMLElement} elems\n * @returns {Array} items - collection of new Outlayer Items\n */\nproto._itemize = function( elems ) {\n\n var itemElems = this._filterFindItemElements( elems );\n var Item = this.constructor.Item;\n\n // create new Outlayer Items for collection\n var items = [];\n for ( var i=0; i < itemElems.length; i++ ) {\n var elem = itemElems[i];\n var item = new Item( elem, this );\n items.push( item );\n }\n\n return items;\n};\n\n/**\n * get item elements to be used in layout\n * @param {Array or NodeList or HTMLElement} elems\n * @returns {Array} items - item elements\n */\nproto._filterFindItemElements = function( elems ) {\n return utils.filterFindElements( elems, this.options.itemSelector );\n};\n\n/**\n * getter method for getting item elements\n * @returns {Array} elems - collection of item elements\n */\nproto.getItemElements = function() {\n return this.items.map( function( item ) {\n return item.element;\n });\n};\n\n// ----- init & layout ----- //\n\n/**\n * lays out all items\n */\nproto.layout = function() {\n this._resetLayout();\n this._manageStamps();\n\n // don't animate first layout\n var layoutInstant = this._getOption('layoutInstant');\n var isInstant = layoutInstant !== undefined ?\n layoutInstant : !this._isLayoutInited;\n this.layoutItems( this.items, isInstant );\n\n // flag for initalized\n this._isLayoutInited = true;\n};\n\n// _init is alias for layout\nproto._init = proto.layout;\n\n/**\n * logic before any new layout\n */\nproto._resetLayout = function() {\n this.getSize();\n};\n\n\nproto.getSize = function() {\n this.size = getSize( this.element );\n};\n\n/**\n * get measurement from option, for columnWidth, rowHeight, gutter\n * if option is String -> get element from selector string, & get size of element\n * if option is Element -> get size of element\n * else use option as a number\n *\n * @param {String} measurement\n * @param {String} size - width or height\n * @private\n */\nproto._getMeasurement = function( measurement, size ) {\n var option = this.options[ measurement ];\n var elem;\n if ( !option ) {\n // default to 0\n this[ measurement ] = 0;\n } else {\n // use option as an element\n if ( typeof option == 'string' ) {\n elem = this.element.querySelector( option );\n } else if ( option instanceof HTMLElement ) {\n elem = option;\n }\n // use size of element, if element\n this[ measurement ] = elem ? getSize( elem )[ size ] : option;\n }\n};\n\n/**\n * layout a collection of item elements\n * @api public\n */\nproto.layoutItems = function( items, isInstant ) {\n items = this._getItemsForLayout( items );\n\n this._layoutItems( items, isInstant );\n\n this._postLayout();\n};\n\n/**\n * get the items to be laid out\n * you may want to skip over some items\n * @param {Array} items\n * @returns {Array} items\n */\nproto._getItemsForLayout = function( items ) {\n return items.filter( function( item ) {\n return !item.isIgnored;\n });\n};\n\n/**\n * layout items\n * @param {Array} items\n * @param {Boolean} isInstant\n */\nproto._layoutItems = function( items, isInstant ) {\n this._emitCompleteOnItems( 'layout', items );\n\n if ( !items || !items.length ) {\n // no items, emit event with empty array\n return;\n }\n\n var queue = [];\n\n items.forEach( function( item ) {\n // get x/y object from method\n var position = this._getItemLayoutPosition( item );\n // enqueue\n position.item = item;\n position.isInstant = isInstant || item.isLayoutInstant;\n queue.push( position );\n }, this );\n\n this._processLayoutQueue( queue );\n};\n\n/**\n * get item layout position\n * @param {Outlayer.Item} item\n * @returns {Object} x and y position\n */\nproto._getItemLayoutPosition = function( /* item */ ) {\n return {\n x: 0,\n y: 0\n };\n};\n\n/**\n * iterate over array and position each item\n * Reason being - separating this logic prevents 'layout invalidation'\n * thx @paul_irish\n * @param {Array} queue\n */\nproto._processLayoutQueue = function( queue ) {\n this.updateStagger();\n queue.forEach( function( obj, i ) {\n this._positionItem( obj.item, obj.x, obj.y, obj.isInstant, i );\n }, this );\n};\n\n// set stagger from option in milliseconds number\nproto.updateStagger = function() {\n var stagger = this.options.stagger;\n if ( stagger === null || stagger === undefined ) {\n this.stagger = 0;\n return;\n }\n this.stagger = getMilliseconds( stagger );\n return this.stagger;\n};\n\n/**\n * Sets position of item in DOM\n * @param {Outlayer.Item} item\n * @param {Number} x - horizontal position\n * @param {Number} y - vertical position\n * @param {Boolean} isInstant - disables transitions\n */\nproto._positionItem = function( item, x, y, isInstant, i ) {\n if ( isInstant ) {\n // if not transition, just set CSS\n item.goTo( x, y );\n } else {\n item.stagger( i * this.stagger );\n item.moveTo( x, y );\n }\n};\n\n/**\n * Any logic you want to do after each layout,\n * i.e. size the container\n */\nproto._postLayout = function() {\n this.resizeContainer();\n};\n\nproto.resizeContainer = function() {\n var isResizingContainer = this._getOption('resizeContainer');\n if ( !isResizingContainer ) {\n return;\n }\n var size = this._getContainerSize();\n if ( size ) {\n this._setContainerMeasure( size.width, true );\n this._setContainerMeasure( size.height, false );\n }\n};\n\n/**\n * Sets width or height of container if returned\n * @returns {Object} size\n * @param {Number} width\n * @param {Number} height\n */\nproto._getContainerSize = noop;\n\n/**\n * @param {Number} measure - size of width or height\n * @param {Boolean} isWidth\n */\nproto._setContainerMeasure = function( measure, isWidth ) {\n if ( measure === undefined ) {\n return;\n }\n\n var elemSize = this.size;\n // add padding and border width if border box\n if ( elemSize.isBorderBox ) {\n measure += isWidth ? elemSize.paddingLeft + elemSize.paddingRight +\n elemSize.borderLeftWidth + elemSize.borderRightWidth :\n elemSize.paddingBottom + elemSize.paddingTop +\n elemSize.borderTopWidth + elemSize.borderBottomWidth;\n }\n\n measure = Math.max( measure, 0 );\n this.element.style[ isWidth ? 'width' : 'height' ] = measure + 'px';\n};\n\n/**\n * emit eventComplete on a collection of items events\n * @param {String} eventName\n * @param {Array} items - Outlayer.Items\n */\nproto._emitCompleteOnItems = function( eventName, items ) {\n var _this = this;\n function onComplete() {\n _this.dispatchEvent( eventName + 'Complete', null, [ items ] );\n }\n\n var count = items.length;\n if ( !items || !count ) {\n onComplete();\n return;\n }\n\n var doneCount = 0;\n function tick() {\n doneCount++;\n if ( doneCount == count ) {\n onComplete();\n }\n }\n\n // bind callback\n items.forEach( function( item ) {\n item.once( eventName, tick );\n });\n};\n\n/**\n * emits events via EvEmitter and jQuery events\n * @param {String} type - name of event\n * @param {Event} event - original event\n * @param {Array} args - extra arguments\n */\nproto.dispatchEvent = function( type, event, args ) {\n // add original event to arguments\n var emitArgs = event ? [ event ].concat( args ) : args;\n this.emitEvent( type, emitArgs );\n\n if ( jQuery ) {\n // set this.$element\n this.$element = this.$element || jQuery( this.element );\n if ( event ) {\n // create jQuery event\n var $event = jQuery.Event( event );\n $event.type = type;\n this.$element.trigger( $event, args );\n } else {\n // just trigger with type if no event available\n this.$element.trigger( type, args );\n }\n }\n};\n\n// -------------------------- ignore & stamps -------------------------- //\n\n\n/**\n * keep item in collection, but do not lay it out\n * ignored items do not get skipped in layout\n * @param {Element} elem\n */\nproto.ignore = function( elem ) {\n var item = this.getItem( elem );\n if ( item ) {\n item.isIgnored = true;\n }\n};\n\n/**\n * return item to layout collection\n * @param {Element} elem\n */\nproto.unignore = function( elem ) {\n var item = this.getItem( elem );\n if ( item ) {\n delete item.isIgnored;\n }\n};\n\n/**\n * adds elements to stamps\n * @param {NodeList, Array, Element, or String} elems\n */\nproto.stamp = function( elems ) {\n elems = this._find( elems );\n if ( !elems ) {\n return;\n }\n\n this.stamps = this.stamps.concat( elems );\n // ignore\n elems.forEach( this.ignore, this );\n};\n\n/**\n * removes elements to stamps\n * @param {NodeList, Array, or Element} elems\n */\nproto.unstamp = function( elems ) {\n elems = this._find( elems );\n if ( !elems ){\n return;\n }\n\n elems.forEach( function( elem ) {\n // filter out removed stamp elements\n utils.removeFrom( this.stamps, elem );\n this.unignore( elem );\n }, this );\n};\n\n/**\n * finds child elements\n * @param {NodeList, Array, Element, or String} elems\n * @returns {Array} elems\n */\nproto._find = function( elems ) {\n if ( !elems ) {\n return;\n }\n // if string, use argument as selector string\n if ( typeof elems == 'string' ) {\n elems = this.element.querySelectorAll( elems );\n }\n elems = utils.makeArray( elems );\n return elems;\n};\n\nproto._manageStamps = function() {\n if ( !this.stamps || !this.stamps.length ) {\n return;\n }\n\n this._getBoundingRect();\n\n this.stamps.forEach( this._manageStamp, this );\n};\n\n// update boundingLeft / Top\nproto._getBoundingRect = function() {\n // get bounding rect for container element\n var boundingRect = this.element.getBoundingClientRect();\n var size = this.size;\n this._boundingRect = {\n left: boundingRect.left + size.paddingLeft + size.borderLeftWidth,\n top: boundingRect.top + size.paddingTop + size.borderTopWidth,\n right: boundingRect.right - ( size.paddingRight + size.borderRightWidth ),\n bottom: boundingRect.bottom - ( size.paddingBottom + size.borderBottomWidth )\n };\n};\n\n/**\n * @param {Element} stamp\n**/\nproto._manageStamp = noop;\n\n/**\n * get x/y position of element relative to container element\n * @param {Element} elem\n * @returns {Object} offset - has left, top, right, bottom\n */\nproto._getElementOffset = function( elem ) {\n var boundingRect = elem.getBoundingClientRect();\n var thisRect = this._boundingRect;\n var size = getSize( elem );\n var offset = {\n left: boundingRect.left - thisRect.left - size.marginLeft,\n top: boundingRect.top - thisRect.top - size.marginTop,\n right: thisRect.right - boundingRect.right - size.marginRight,\n bottom: thisRect.bottom - boundingRect.bottom - size.marginBottom\n };\n return offset;\n};\n\n// -------------------------- resize -------------------------- //\n\n// enable event handlers for listeners\n// i.e. resize -> onresize\nproto.handleEvent = utils.handleEvent;\n\n/**\n * Bind layout to window resizing\n */\nproto.bindResize = function() {\n window.addEventListener( 'resize', this );\n this.isResizeBound = true;\n};\n\n/**\n * Unbind layout to window resizing\n */\nproto.unbindResize = function() {\n window.removeEventListener( 'resize', this );\n this.isResizeBound = false;\n};\n\nproto.onresize = function() {\n this.resize();\n};\n\nutils.debounceMethod( Outlayer, 'onresize', 100 );\n\nproto.resize = function() {\n // don't trigger if size did not change\n // or if resize was unbound. See #9\n if ( !this.isResizeBound || !this.needsResizeLayout() ) {\n return;\n }\n\n this.layout();\n};\n\n/**\n * check if layout is needed post layout\n * @returns Boolean\n */\nproto.needsResizeLayout = function() {\n var size = getSize( this.element );\n // check that this.size and size are there\n // IE8 triggers resize on body size change, so they might not be\n var hasSizes = this.size && size;\n return hasSizes && size.innerWidth !== this.size.innerWidth;\n};\n\n// -------------------------- methods -------------------------- //\n\n/**\n * add items to Outlayer instance\n * @param {Array or NodeList or Element} elems\n * @returns {Array} items - Outlayer.Items\n**/\nproto.addItems = function( elems ) {\n var items = this._itemize( elems );\n // add items to collection\n if ( items.length ) {\n this.items = this.items.concat( items );\n }\n return items;\n};\n\n/**\n * Layout newly-appended item elements\n * @param {Array or NodeList or Element} elems\n */\nproto.appended = function( elems ) {\n var items = this.addItems( elems );\n if ( !items.length ) {\n return;\n }\n // layout and reveal just the new items\n this.layoutItems( items, true );\n this.reveal( items );\n};\n\n/**\n * Layout prepended elements\n * @param {Array or NodeList or Element} elems\n */\nproto.prepended = function( elems ) {\n var items = this._itemize( elems );\n if ( !items.length ) {\n return;\n }\n // add items to beginning of collection\n var previousItems = this.items.slice(0);\n this.items = items.concat( previousItems );\n // start new layout\n this._resetLayout();\n this._manageStamps();\n // layout new stuff without transition\n this.layoutItems( items, true );\n this.reveal( items );\n // layout previous items\n this.layoutItems( previousItems );\n};\n\n/**\n * reveal a collection of items\n * @param {Array of Outlayer.Items} items\n */\nproto.reveal = function( items ) {\n this._emitCompleteOnItems( 'reveal', items );\n if ( !items || !items.length ) {\n return;\n }\n var stagger = this.updateStagger();\n items.forEach( function( item, i ) {\n item.stagger( i * stagger );\n item.reveal();\n });\n};\n\n/**\n * hide a collection of items\n * @param {Array of Outlayer.Items} items\n */\nproto.hide = function( items ) {\n this._emitCompleteOnItems( 'hide', items );\n if ( !items || !items.length ) {\n return;\n }\n var stagger = this.updateStagger();\n items.forEach( function( item, i ) {\n item.stagger( i * stagger );\n item.hide();\n });\n};\n\n/**\n * reveal item elements\n * @param {Array}, {Element}, {NodeList} items\n */\nproto.revealItemElements = function( elems ) {\n var items = this.getItems( elems );\n this.reveal( items );\n};\n\n/**\n * hide item elements\n * @param {Array}, {Element}, {NodeList} items\n */\nproto.hideItemElements = function( elems ) {\n var items = this.getItems( elems );\n this.hide( items );\n};\n\n/**\n * get Outlayer.Item, given an Element\n * @param {Element} elem\n * @param {Function} callback\n * @returns {Outlayer.Item} item\n */\nproto.getItem = function( elem ) {\n // loop through items to get the one that matches\n for ( var i=0; i < this.items.length; i++ ) {\n var item = this.items[i];\n if ( item.element == elem ) {\n // return item\n return item;\n }\n }\n};\n\n/**\n * get collection of Outlayer.Items, given Elements\n * @param {Array} elems\n * @returns {Array} items - Outlayer.Items\n */\nproto.getItems = function( elems ) {\n elems = utils.makeArray( elems );\n var items = [];\n elems.forEach( function( elem ) {\n var item = this.getItem( elem );\n if ( item ) {\n items.push( item );\n }\n }, this );\n\n return items;\n};\n\n/**\n * remove element(s) from instance and DOM\n * @param {Array or NodeList or Element} elems\n */\nproto.remove = function( elems ) {\n var removeItems = this.getItems( elems );\n\n this._emitCompleteOnItems( 'remove', removeItems );\n\n // bail if no items to remove\n if ( !removeItems || !removeItems.length ) {\n return;\n }\n\n removeItems.forEach( function( item ) {\n item.remove();\n // remove item from collection\n utils.removeFrom( this.items, item );\n }, this );\n};\n\n// ----- destroy ----- //\n\n// remove and disable Outlayer instance\nproto.destroy = function() {\n // clean up dynamic styles\n var style = this.element.style;\n style.height = '';\n style.position = '';\n style.width = '';\n // destroy items\n this.items.forEach( function( item ) {\n item.destroy();\n });\n\n this.unbindResize();\n\n var id = this.element.outlayerGUID;\n delete instances[ id ]; // remove reference to instance by id\n delete this.element.outlayerGUID;\n // remove data for jQuery\n if ( jQuery ) {\n jQuery.removeData( this.element, this.constructor.namespace );\n }\n\n};\n\n// -------------------------- data -------------------------- //\n\n/**\n * get Outlayer instance from element\n * @param {Element} elem\n * @returns {Outlayer}\n */\nOutlayer.data = function( elem ) {\n elem = utils.getQueryElement( elem );\n var id = elem && elem.outlayerGUID;\n return id && instances[ id ];\n};\n\n\n// -------------------------- create Outlayer class -------------------------- //\n\n/**\n * create a layout class\n * @param {String} namespace\n */\nOutlayer.create = function( namespace, options ) {\n // sub-class Outlayer\n var Layout = subclass( Outlayer );\n // apply new options and compatOptions\n Layout.defaults = utils.extend( {}, Outlayer.defaults );\n utils.extend( Layout.defaults, options );\n Layout.compatOptions = utils.extend( {}, Outlayer.compatOptions );\n\n Layout.namespace = namespace;\n\n Layout.data = Outlayer.data;\n\n // sub-class Item\n Layout.Item = subclass( Item );\n\n // -------------------------- declarative -------------------------- //\n\n utils.htmlInit( Layout, namespace );\n\n // -------------------------- jQuery bridge -------------------------- //\n\n // make into jQuery plugin\n if ( jQuery && jQuery.bridget ) {\n jQuery.bridget( namespace, Layout );\n }\n\n return Layout;\n};\n\nfunction subclass( Parent ) {\n function SubClass() {\n Parent.apply( this, arguments );\n }\n\n SubClass.prototype = Object.create( Parent.prototype );\n SubClass.prototype.constructor = SubClass;\n\n return SubClass;\n}\n\n// ----- helpers ----- //\n\n// how many milliseconds are in each unit\nvar msUnits = {\n ms: 1,\n s: 1000\n};\n\n// munge time-like parameter into millisecond number\n// '0.4s' -> 40\nfunction getMilliseconds( time ) {\n if ( typeof time == 'number' ) {\n return time;\n }\n var matches = time.match( /(^\\d*\\.?\\d*)(\\w*)/ );\n var num = matches && matches[1];\n var unit = matches && matches[2];\n if ( !num.length ) {\n return 0;\n }\n num = parseFloat( num );\n var mult = msUnits[ unit ] || 1;\n return num * mult;\n}\n\n// ----- fin ----- //\n\n// back in global\nOutlayer.Item = Item;\n\nreturn Outlayer;\n\n}));\n\n/**\n * Isotope Item\n**/\n\n( function( window, factory ) {\n // universal module definition\n /* jshint strict: false */ /*globals define, module, require */\n if ( true ) {\n // AMD\n !(__WEBPACK_AMD_DEFINE_ARRAY__ = [\n __WEBPACK_LOCAL_MODULE_6__\n ], __WEBPACK_AMD_DEFINE_FACTORY__ = (factory),\n\t\t\t\t__WEBPACK_LOCAL_MODULE_7__ = (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === 'function' ?\n\t\t\t\t(__WEBPACK_AMD_DEFINE_FACTORY__.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__)) : __WEBPACK_AMD_DEFINE_FACTORY__));\n } else if ( typeof module == 'object' && module.exports ) {\n // CommonJS\n module.exports = factory(\n require('outlayer')\n );\n } else {\n // browser global\n window.Isotope = window.Isotope || {};\n window.Isotope.Item = factory(\n window.Outlayer\n );\n }\n\n}( window, function factory( Outlayer ) {\n'use strict';\n\n// -------------------------- Item -------------------------- //\n\n// sub-class Outlayer Item\nfunction Item() {\n Outlayer.Item.apply( this, arguments );\n}\n\nvar proto = Item.prototype = Object.create( Outlayer.Item.prototype );\n\nvar _create = proto._create;\nproto._create = function() {\n // assign id, used for original-order sorting\n this.id = this.layout.itemGUID++;\n _create.call( this );\n this.sortData = {};\n};\n\nproto.updateSortData = function() {\n if ( this.isIgnored ) {\n return;\n }\n // default sorters\n this.sortData.id = this.id;\n // for backward compatibility\n this.sortData['original-order'] = this.id;\n this.sortData.random = Math.random();\n // go thru getSortData obj and apply the sorters\n var getSortData = this.layout.options.getSortData;\n var sorters = this.layout._sorters;\n for ( var key in getSortData ) {\n var sorter = sorters[ key ];\n this.sortData[ key ] = sorter( this.element, this );\n }\n};\n\nvar _destroy = proto.destroy;\nproto.destroy = function() {\n // call super\n _destroy.apply( this, arguments );\n // reset display, #741\n this.css({\n display: ''\n });\n};\n\nreturn Item;\n\n}));\n\n/**\n * Isotope LayoutMode\n */\n\n( function( window, factory ) {\n // universal module definition\n /* jshint strict: false */ /*globals define, module, require */\n if ( true ) {\n // AMD\n !(__WEBPACK_AMD_DEFINE_ARRAY__ = [\n __WEBPACK_LOCAL_MODULE_2__,\n __WEBPACK_LOCAL_MODULE_6__\n ], __WEBPACK_AMD_DEFINE_FACTORY__ = (factory),\n\t\t\t\t__WEBPACK_LOCAL_MODULE_8__ = (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === 'function' ?\n\t\t\t\t(__WEBPACK_AMD_DEFINE_FACTORY__.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__)) : __WEBPACK_AMD_DEFINE_FACTORY__));\n } else if ( typeof module == 'object' && module.exports ) {\n // CommonJS\n module.exports = factory(\n require('get-size'),\n require('outlayer')\n );\n } else {\n // browser global\n window.Isotope = window.Isotope || {};\n window.Isotope.LayoutMode = factory(\n window.getSize,\n window.Outlayer\n );\n }\n\n}( window, function factory( getSize, Outlayer ) {\n 'use strict';\n\n // layout mode class\n function LayoutMode( isotope ) {\n this.isotope = isotope;\n // link properties\n if ( isotope ) {\n this.options = isotope.options[ this.namespace ];\n this.element = isotope.element;\n this.items = isotope.filteredItems;\n this.size = isotope.size;\n }\n }\n\n var proto = LayoutMode.prototype;\n\n /**\n * some methods should just defer to default Outlayer method\n * and reference the Isotope instance as `this`\n **/\n var facadeMethods = [\n '_resetLayout',\n '_getItemLayoutPosition',\n '_manageStamp',\n '_getContainerSize',\n '_getElementOffset',\n 'needsResizeLayout',\n '_getOption'\n ];\n\n facadeMethods.forEach( function( methodName ) {\n proto[ methodName ] = function() {\n return Outlayer.prototype[ methodName ].apply( this.isotope, arguments );\n };\n });\n\n // ----- ----- //\n\n // for horizontal layout modes, check vertical size\n proto.needsVerticalResizeLayout = function() {\n // don't trigger if size did not change\n var size = getSize( this.isotope.element );\n // check that this.size and size are there\n // IE8 triggers resize on body size change, so they might not be\n var hasSizes = this.isotope.size && size;\n return hasSizes && size.innerHeight != this.isotope.size.innerHeight;\n };\n\n // ----- measurements ----- //\n\n proto._getMeasurement = function() {\n this.isotope._getMeasurement.apply( this, arguments );\n };\n\n proto.getColumnWidth = function() {\n this.getSegmentSize( 'column', 'Width' );\n };\n\n proto.getRowHeight = function() {\n this.getSegmentSize( 'row', 'Height' );\n };\n\n /**\n * get columnWidth or rowHeight\n * segment: 'column' or 'row'\n * size 'Width' or 'Height'\n **/\n proto.getSegmentSize = function( segment, size ) {\n var segmentName = segment + size;\n var outerSize = 'outer' + size;\n // columnWidth / outerWidth // rowHeight / outerHeight\n this._getMeasurement( segmentName, outerSize );\n // got rowHeight or columnWidth, we can chill\n if ( this[ segmentName ] ) {\n return;\n }\n // fall back to item of first element\n var firstItemSize = this.getFirstItemSize();\n this[ segmentName ] = firstItemSize && firstItemSize[ outerSize ] ||\n // or size of container\n this.isotope.size[ 'inner' + size ];\n };\n\n proto.getFirstItemSize = function() {\n var firstItem = this.isotope.filteredItems[0];\n return firstItem && firstItem.element && getSize( firstItem.element );\n };\n\n // ----- methods that should reference isotope ----- //\n\n proto.layout = function() {\n this.isotope.layout.apply( this.isotope, arguments );\n };\n\n proto.getSize = function() {\n this.isotope.getSize();\n this.size = this.isotope.size;\n };\n\n // -------------------------- create -------------------------- //\n\n LayoutMode.modes = {};\n\n LayoutMode.create = function( namespace, options ) {\n\n function Mode() {\n LayoutMode.apply( this, arguments );\n }\n\n Mode.prototype = Object.create( proto );\n Mode.prototype.constructor = Mode;\n\n // default options\n if ( options ) {\n Mode.options = options;\n }\n\n Mode.prototype.namespace = namespace;\n // register in Isotope\n LayoutMode.modes[ namespace ] = Mode;\n\n return Mode;\n };\n\n return LayoutMode;\n\n}));\n\n/*!\n * Masonry v4.2.0\n * Cascading grid layout library\n * http://masonry.desandro.com\n * MIT License\n * by David DeSandro\n */\n\n( function( window, factory ) {\n // universal module definition\n /* jshint strict: false */ /*globals define, module, require */\n if ( true ) {\n // AMD\n !(__WEBPACK_AMD_DEFINE_ARRAY__ = [\n __WEBPACK_LOCAL_MODULE_6__,\n __WEBPACK_LOCAL_MODULE_2__\n ], __WEBPACK_AMD_DEFINE_FACTORY__ = (factory),\n\t\t\t\t__WEBPACK_LOCAL_MODULE_9__ = (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === 'function' ?\n\t\t\t\t(__WEBPACK_AMD_DEFINE_FACTORY__.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__)) : __WEBPACK_AMD_DEFINE_FACTORY__));\n } else if ( typeof module == 'object' && module.exports ) {\n // CommonJS\n module.exports = factory(\n require('outlayer'),\n require('get-size')\n );\n } else {\n // browser global\n window.Masonry = factory(\n window.Outlayer,\n window.getSize\n );\n }\n\n}( window, function factory( Outlayer, getSize ) {\n\n\n\n// -------------------------- masonryDefinition -------------------------- //\n\n // create an Outlayer layout class\n var Masonry = Outlayer.create('masonry');\n // isFitWidth -> fitWidth\n Masonry.compatOptions.fitWidth = 'isFitWidth';\n\n var proto = Masonry.prototype;\n\n proto._resetLayout = function() {\n this.getSize();\n this._getMeasurement( 'columnWidth', 'outerWidth' );\n this._getMeasurement( 'gutter', 'outerWidth' );\n this.measureColumns();\n\n // reset column Y\n this.colYs = [];\n for ( var i=0; i < this.cols; i++ ) {\n this.colYs.push( 0 );\n }\n\n this.maxY = 0;\n this.horizontalColIndex = 0;\n };\n\n proto.measureColumns = function() {\n this.getContainerWidth();\n // if columnWidth is 0, default to outerWidth of first item\n if ( !this.columnWidth ) {\n var firstItem = this.items[0];\n var firstItemElem = firstItem && firstItem.element;\n // columnWidth fall back to item of first element\n this.columnWidth = firstItemElem && getSize( firstItemElem ).outerWidth ||\n // if first elem has no width, default to size of container\n this.containerWidth;\n }\n\n var columnWidth = this.columnWidth += this.gutter;\n\n // calculate columns\n var containerWidth = this.containerWidth + this.gutter;\n var cols = containerWidth / columnWidth;\n // fix rounding errors, typically with gutters\n var excess = columnWidth - containerWidth % columnWidth;\n // if overshoot is less than a pixel, round up, otherwise floor it\n var mathMethod = excess && excess < 1 ? 'round' : 'floor';\n cols = Math[ mathMethod ]( cols );\n this.cols = Math.max( cols, 1 );\n };\n\n proto.getContainerWidth = function() {\n // container is parent if fit width\n var isFitWidth = this._getOption('fitWidth');\n var container = isFitWidth ? this.element.parentNode : this.element;\n // check that this.size and size are there\n // IE8 triggers resize on body size change, so they might not be\n var size = getSize( container );\n this.containerWidth = size && size.innerWidth;\n };\n\n proto._getItemLayoutPosition = function( item ) {\n item.getSize();\n // how many columns does this brick span\n var remainder = item.size.outerWidth % this.columnWidth;\n var mathMethod = remainder && remainder < 1 ? 'round' : 'ceil';\n // round if off by 1 pixel, otherwise use ceil\n var colSpan = Math[ mathMethod ]( item.size.outerWidth / this.columnWidth );\n colSpan = Math.min( colSpan, this.cols );\n // use horizontal or top column position\n var colPosMethod = this.options.horizontalOrder ?\n '_getHorizontalColPosition' : '_getTopColPosition';\n var colPosition = this[ colPosMethod ]( colSpan, item );\n // position the brick\n var position = {\n x: this.columnWidth * colPosition.col,\n y: colPosition.y\n };\n // apply setHeight to necessary columns\n var setHeight = colPosition.y + item.size.outerHeight;\n var setMax = colSpan + colPosition.col;\n for ( var i = colPosition.col; i < setMax; i++ ) {\n this.colYs[i] = setHeight;\n }\n\n return position;\n };\n\n proto._getTopColPosition = function( colSpan ) {\n var colGroup = this._getTopColGroup( colSpan );\n // get the minimum Y value from the columns\n var minimumY = Math.min.apply( Math, colGroup );\n\n return {\n col: colGroup.indexOf( minimumY ),\n y: minimumY,\n };\n };\n\n /**\n * @param {Number} colSpan - number of columns the element spans\n * @returns {Array} colGroup\n */\n proto._getTopColGroup = function( colSpan ) {\n if ( colSpan < 2 ) {\n // if brick spans only one column, use all the column Ys\n return this.colYs;\n }\n\n var colGroup = [];\n // how many different places could this brick fit horizontally\n var groupCount = this.cols + 1 - colSpan;\n // for each group potential horizontal position\n for ( var i = 0; i < groupCount; i++ ) {\n colGroup[i] = this._getColGroupY( i, colSpan );\n }\n return colGroup;\n };\n\n proto._getColGroupY = function( col, colSpan ) {\n if ( colSpan < 2 ) {\n return this.colYs[ col ];\n }\n // make an array of colY values for that one group\n var groupColYs = this.colYs.slice( col, col + colSpan );\n // and get the max value of the array\n return Math.max.apply( Math, groupColYs );\n };\n\n // get column position based on horizontal index. #873\n proto._getHorizontalColPosition = function( colSpan, item ) {\n var col = this.horizontalColIndex % this.cols;\n var isOver = colSpan > 1 && col + colSpan > this.cols;\n // shift to next row if item can't fit on current row\n col = isOver ? 0 : col;\n // don't let zero-size items take up space\n var hasSize = item.size.outerWidth && item.size.outerHeight;\n this.horizontalColIndex = hasSize ? col + colSpan : this.horizontalColIndex;\n\n return {\n col: col,\n y: this._getColGroupY( col, colSpan ),\n };\n };\n\n proto._manageStamp = function( stamp ) {\n var stampSize = getSize( stamp );\n var offset = this._getElementOffset( stamp );\n // get the columns that this stamp affects\n var isOriginLeft = this._getOption('originLeft');\n var firstX = isOriginLeft ? offset.left : offset.right;\n var lastX = firstX + stampSize.outerWidth;\n var firstCol = Math.floor( firstX / this.columnWidth );\n firstCol = Math.max( 0, firstCol );\n var lastCol = Math.floor( lastX / this.columnWidth );\n // lastCol should not go over if multiple of columnWidth #425\n lastCol -= lastX % this.columnWidth ? 0 : 1;\n lastCol = Math.min( this.cols - 1, lastCol );\n // set colYs to bottom of the stamp\n\n var isOriginTop = this._getOption('originTop');\n var stampMaxY = ( isOriginTop ? offset.top : offset.bottom ) +\n stampSize.outerHeight;\n for ( var i = firstCol; i <= lastCol; i++ ) {\n this.colYs[i] = Math.max( stampMaxY, this.colYs[i] );\n }\n };\n\n proto._getContainerSize = function() {\n this.maxY = Math.max.apply( Math, this.colYs );\n var size = {\n height: this.maxY\n };\n\n if ( this._getOption('fitWidth') ) {\n size.width = this._getContainerFitWidth();\n }\n\n return size;\n };\n\n proto._getContainerFitWidth = function() {\n var unusedCols = 0;\n // count unused columns\n var i = this.cols;\n while ( --i ) {\n if ( this.colYs[i] !== 0 ) {\n break;\n }\n unusedCols++;\n }\n // fit container to columns that have been used\n return ( this.cols - unusedCols ) * this.columnWidth - this.gutter;\n };\n\n proto.needsResizeLayout = function() {\n var previousWidth = this.containerWidth;\n this.getContainerWidth();\n return previousWidth != this.containerWidth;\n };\n\n return Masonry;\n\n}));\n\n/*!\n * Masonry layout mode\n * sub-classes Masonry\n * http://masonry.desandro.com\n */\n\n( function( window, factory ) {\n // universal module definition\n /* jshint strict: false */ /*globals define, module, require */\n if ( true ) {\n // AMD\n !(__WEBPACK_AMD_DEFINE_ARRAY__ = [\n __WEBPACK_LOCAL_MODULE_8__,\n __WEBPACK_LOCAL_MODULE_9__\n ], __WEBPACK_AMD_DEFINE_FACTORY__ = (factory),\n\t\t\t\t__WEBPACK_LOCAL_MODULE_10__ = (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === 'function' ?\n\t\t\t\t(__WEBPACK_AMD_DEFINE_FACTORY__.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__)) : __WEBPACK_AMD_DEFINE_FACTORY__));\n } else if ( typeof module == 'object' && module.exports ) {\n // CommonJS\n module.exports = factory(\n require('../layout-mode'),\n require('masonry-layout')\n );\n } else {\n // browser global\n factory(\n window.Isotope.LayoutMode,\n window.Masonry\n );\n }\n\n}( window, function factory( LayoutMode, Masonry ) {\n'use strict';\n\n// -------------------------- masonryDefinition -------------------------- //\n\n // create an Outlayer layout class\n var MasonryMode = LayoutMode.create('masonry');\n\n var proto = MasonryMode.prototype;\n\n var keepModeMethods = {\n _getElementOffset: true,\n layout: true,\n _getMeasurement: true\n };\n\n // inherit Masonry prototype\n for ( var method in Masonry.prototype ) {\n // do not inherit mode methods\n if ( !keepModeMethods[ method ] ) {\n proto[ method ] = Masonry.prototype[ method ];\n }\n }\n\n var measureColumns = proto.measureColumns;\n proto.measureColumns = function() {\n // set items, used if measuring first item\n this.items = this.isotope.filteredItems;\n measureColumns.call( this );\n };\n\n // point to mode options for fitWidth\n var _getOption = proto._getOption;\n proto._getOption = function( option ) {\n if ( option == 'fitWidth' ) {\n return this.options.isFitWidth !== undefined ?\n this.options.isFitWidth : this.options.fitWidth;\n }\n return _getOption.apply( this.isotope, arguments );\n };\n\n return MasonryMode;\n\n}));\n\n/**\n * fitRows layout mode\n */\n\n( function( window, factory ) {\n // universal module definition\n /* jshint strict: false */ /*globals define, module, require */\n if ( true ) {\n // AMD\n !(__WEBPACK_AMD_DEFINE_ARRAY__ = [\n __WEBPACK_LOCAL_MODULE_8__\n ], __WEBPACK_AMD_DEFINE_FACTORY__ = (factory),\n\t\t\t\t__WEBPACK_LOCAL_MODULE_11__ = (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === 'function' ?\n\t\t\t\t(__WEBPACK_AMD_DEFINE_FACTORY__.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__)) : __WEBPACK_AMD_DEFINE_FACTORY__));\n } else if ( typeof exports == 'object' ) {\n // CommonJS\n module.exports = factory(\n require('../layout-mode')\n );\n } else {\n // browser global\n factory(\n window.Isotope.LayoutMode\n );\n }\n\n}( window, function factory( LayoutMode ) {\n'use strict';\n\nvar FitRows = LayoutMode.create('fitRows');\n\nvar proto = FitRows.prototype;\n\nproto._resetLayout = function() {\n this.x = 0;\n this.y = 0;\n this.maxY = 0;\n this._getMeasurement( 'gutter', 'outerWidth' );\n};\n\nproto._getItemLayoutPosition = function( item ) {\n item.getSize();\n\n var itemWidth = item.size.outerWidth + this.gutter;\n // if this element cannot fit in the current row\n var containerWidth = this.isotope.size.innerWidth + this.gutter;\n if ( this.x !== 0 && itemWidth + this.x > containerWidth ) {\n this.x = 0;\n this.y = this.maxY;\n }\n\n var position = {\n x: this.x,\n y: this.y\n };\n\n this.maxY = Math.max( this.maxY, this.y + item.size.outerHeight );\n this.x += itemWidth;\n\n return position;\n};\n\nproto._getContainerSize = function() {\n return { height: this.maxY };\n};\n\nreturn FitRows;\n\n}));\n\n/**\n * vertical layout mode\n */\n\n( function( window, factory ) {\n // universal module definition\n /* jshint strict: false */ /*globals define, module, require */\n if ( true ) {\n // AMD\n !(__WEBPACK_AMD_DEFINE_ARRAY__ = [\n __WEBPACK_LOCAL_MODULE_8__\n ], __WEBPACK_AMD_DEFINE_FACTORY__ = (factory),\n\t\t\t\t__WEBPACK_LOCAL_MODULE_12__ = (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === 'function' ?\n\t\t\t\t(__WEBPACK_AMD_DEFINE_FACTORY__.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__)) : __WEBPACK_AMD_DEFINE_FACTORY__));\n } else if ( typeof module == 'object' && module.exports ) {\n // CommonJS\n module.exports = factory(\n require('../layout-mode')\n );\n } else {\n // browser global\n factory(\n window.Isotope.LayoutMode\n );\n }\n\n}( window, function factory( LayoutMode ) {\n'use strict';\n\nvar Vertical = LayoutMode.create( 'vertical', {\n horizontalAlignment: 0\n});\n\nvar proto = Vertical.prototype;\n\nproto._resetLayout = function() {\n this.y = 0;\n};\n\nproto._getItemLayoutPosition = function( item ) {\n item.getSize();\n var x = ( this.isotope.size.innerWidth - item.size.outerWidth ) *\n this.options.horizontalAlignment;\n var y = this.y;\n this.y += item.size.outerHeight;\n return { x: x, y: y };\n};\n\nproto._getContainerSize = function() {\n return { height: this.y };\n};\n\nreturn Vertical;\n\n}));\n\n/*!\n * Isotope v3.0.4\n *\n * Licensed GPLv3 for open source use\n * or Isotope Commercial License for commercial use\n *\n * http://isotope.metafizzy.co\n * Copyright 2017 Metafizzy\n */\n\n( function( window, factory ) {\n // universal module definition\n /* jshint strict: false */ /*globals define, module, require */\n if ( true ) {\n // AMD\n !(__WEBPACK_AMD_DEFINE_ARRAY__ = [\n __WEBPACK_LOCAL_MODULE_6__,\n __WEBPACK_LOCAL_MODULE_2__,\n __WEBPACK_LOCAL_MODULE_3__,\n __WEBPACK_LOCAL_MODULE_4__,\n __WEBPACK_LOCAL_MODULE_7__,\n __WEBPACK_LOCAL_MODULE_8__,\n // include default layout modes\n __WEBPACK_LOCAL_MODULE_10__,\n __WEBPACK_LOCAL_MODULE_11__,\n __WEBPACK_LOCAL_MODULE_12__\n ], __WEBPACK_AMD_DEFINE_RESULT__ = function( Outlayer, getSize, matchesSelector, utils, Item, LayoutMode ) {\n return factory( window, Outlayer, getSize, matchesSelector, utils, Item, LayoutMode );\n }.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n } else if ( typeof module == 'object' && module.exports ) {\n // CommonJS\n module.exports = factory(\n window,\n require('outlayer'),\n require('get-size'),\n require('desandro-matches-selector'),\n require('fizzy-ui-utils'),\n require('isotope/js/item'),\n require('isotope/js/layout-mode'),\n // include default layout modes\n require('isotope/js/layout-modes/masonry'),\n require('isotope/js/layout-modes/fit-rows'),\n require('isotope/js/layout-modes/vertical')\n );\n } else {\n // browser global\n window.Isotope = factory(\n window,\n window.Outlayer,\n window.getSize,\n window.matchesSelector,\n window.fizzyUIUtils,\n window.Isotope.Item,\n window.Isotope.LayoutMode\n );\n }\n\n}( window, function factory( window, Outlayer, getSize, matchesSelector, utils,\n Item, LayoutMode ) {\n\n\n\n// -------------------------- vars -------------------------- //\n\nvar jQuery = window.jQuery;\n\n// -------------------------- helpers -------------------------- //\n\nvar trim = String.prototype.trim ?\n function( str ) {\n return str.trim();\n } :\n function( str ) {\n return str.replace( /^\\s+|\\s+$/g, '' );\n };\n\n// -------------------------- isotopeDefinition -------------------------- //\n\n // create an Outlayer layout class\n var Isotope = Outlayer.create( 'isotope', {\n layoutMode: 'masonry',\n isJQueryFiltering: true,\n sortAscending: true\n });\n\n Isotope.Item = Item;\n Isotope.LayoutMode = LayoutMode;\n\n var proto = Isotope.prototype;\n\n proto._create = function() {\n this.itemGUID = 0;\n // functions that sort items\n this._sorters = {};\n this._getSorters();\n // call super\n Outlayer.prototype._create.call( this );\n\n // create layout modes\n this.modes = {};\n // start filteredItems with all items\n this.filteredItems = this.items;\n // keep of track of sortBys\n this.sortHistory = [ 'original-order' ];\n // create from registered layout modes\n for ( var name in LayoutMode.modes ) {\n this._initLayoutMode( name );\n }\n };\n\n proto.reloadItems = function() {\n // reset item ID counter\n this.itemGUID = 0;\n // call super\n Outlayer.prototype.reloadItems.call( this );\n };\n\n proto._itemize = function() {\n var items = Outlayer.prototype._itemize.apply( this, arguments );\n // assign ID for original-order\n for ( var i=0; i < items.length; i++ ) {\n var item = items[i];\n item.id = this.itemGUID++;\n }\n this._updateItemsSortData( items );\n return items;\n };\n\n\n // -------------------------- layout -------------------------- //\n\n proto._initLayoutMode = function( name ) {\n var Mode = LayoutMode.modes[ name ];\n // set mode options\n // HACK extend initial options, back-fill in default options\n var initialOpts = this.options[ name ] || {};\n this.options[ name ] = Mode.options ?\n utils.extend( Mode.options, initialOpts ) : initialOpts;\n // init layout mode instance\n this.modes[ name ] = new Mode( this );\n };\n\n\n proto.layout = function() {\n // if first time doing layout, do all magic\n if ( !this._isLayoutInited && this._getOption('initLayout') ) {\n this.arrange();\n return;\n }\n this._layout();\n };\n\n // private method to be used in layout() & magic()\n proto._layout = function() {\n // don't animate first layout\n var isInstant = this._getIsInstant();\n // layout flow\n this._resetLayout();\n this._manageStamps();\n this.layoutItems( this.filteredItems, isInstant );\n\n // flag for initalized\n this._isLayoutInited = true;\n };\n\n // filter + sort + layout\n proto.arrange = function( opts ) {\n // set any options pass\n this.option( opts );\n this._getIsInstant();\n // filter, sort, and layout\n\n // filter\n var filtered = this._filter( this.items );\n this.filteredItems = filtered.matches;\n\n this._bindArrangeComplete();\n\n if ( this._isInstant ) {\n this._noTransition( this._hideReveal, [ filtered ] );\n } else {\n this._hideReveal( filtered );\n }\n\n this._sort();\n this._layout();\n };\n // alias to _init for main plugin method\n proto._init = proto.arrange;\n\n proto._hideReveal = function( filtered ) {\n this.reveal( filtered.needReveal );\n this.hide( filtered.needHide );\n };\n\n // HACK\n // Don't animate/transition first layout\n // Or don't animate/transition other layouts\n proto._getIsInstant = function() {\n var isLayoutInstant = this._getOption('layoutInstant');\n var isInstant = isLayoutInstant !== undefined ? isLayoutInstant :\n !this._isLayoutInited;\n this._isInstant = isInstant;\n return isInstant;\n };\n\n // listen for layoutComplete, hideComplete and revealComplete\n // to trigger arrangeComplete\n proto._bindArrangeComplete = function() {\n // listen for 3 events to trigger arrangeComplete\n var isLayoutComplete, isHideComplete, isRevealComplete;\n var _this = this;\n function arrangeParallelCallback() {\n if ( isLayoutComplete && isHideComplete && isRevealComplete ) {\n _this.dispatchEvent( 'arrangeComplete', null, [ _this.filteredItems ] );\n }\n }\n this.once( 'layoutComplete', function() {\n isLayoutComplete = true;\n arrangeParallelCallback();\n });\n this.once( 'hideComplete', function() {\n isHideComplete = true;\n arrangeParallelCallback();\n });\n this.once( 'revealComplete', function() {\n isRevealComplete = true;\n arrangeParallelCallback();\n });\n };\n\n // -------------------------- filter -------------------------- //\n\n proto._filter = function( items ) {\n var filter = this.options.filter;\n filter = filter || '*';\n var matches = [];\n var hiddenMatched = [];\n var visibleUnmatched = [];\n\n var test = this._getFilterTest( filter );\n\n // test each item\n for ( var i=0; i < items.length; i++ ) {\n var item = items[i];\n if ( item.isIgnored ) {\n continue;\n }\n // add item to either matched or unmatched group\n var isMatched = test( item );\n // item.isFilterMatched = isMatched;\n // add to matches if its a match\n if ( isMatched ) {\n matches.push( item );\n }\n // add to additional group if item needs to be hidden or revealed\n if ( isMatched && item.isHidden ) {\n hiddenMatched.push( item );\n } else if ( !isMatched && !item.isHidden ) {\n visibleUnmatched.push( item );\n }\n }\n\n // return collections of items to be manipulated\n return {\n matches: matches,\n needReveal: hiddenMatched,\n needHide: visibleUnmatched\n };\n };\n\n // get a jQuery, function, or a matchesSelector test given the filter\n proto._getFilterTest = function( filter ) {\n if ( jQuery && this.options.isJQueryFiltering ) {\n // use jQuery\n return function( item ) {\n return jQuery( item.element ).is( filter );\n };\n }\n if ( typeof filter == 'function' ) {\n // use filter as function\n return function( item ) {\n return filter( item.element );\n };\n }\n // default, use filter as selector string\n return function( item ) {\n return matchesSelector( item.element, filter );\n };\n };\n\n // -------------------------- sorting -------------------------- //\n\n /**\n * @params {Array} elems\n * @public\n */\n proto.updateSortData = function( elems ) {\n // get items\n var items;\n if ( elems ) {\n elems = utils.makeArray( elems );\n items = this.getItems( elems );\n } else {\n // update all items if no elems provided\n items = this.items;\n }\n\n this._getSorters();\n this._updateItemsSortData( items );\n };\n\n proto._getSorters = function() {\n var getSortData = this.options.getSortData;\n for ( var key in getSortData ) {\n var sorter = getSortData[ key ];\n this._sorters[ key ] = mungeSorter( sorter );\n }\n };\n\n /**\n * @params {Array} items - of Isotope.Items\n * @private\n */\n proto._updateItemsSortData = function( items ) {\n // do not update if no items\n var len = items && items.length;\n\n for ( var i=0; len && i < len; i++ ) {\n var item = items[i];\n item.updateSortData();\n }\n };\n\n // ----- munge sorter ----- //\n\n // encapsulate this, as we just need mungeSorter\n // other functions in here are just for munging\n var mungeSorter = ( function() {\n // add a magic layer to sorters for convienent shorthands\n // `.foo-bar` will use the text of .foo-bar querySelector\n // `[foo-bar]` will use attribute\n // you can also add parser\n // `.foo-bar parseInt` will parse that as a number\n function mungeSorter( sorter ) {\n // if not a string, return function or whatever it is\n if ( typeof sorter != 'string' ) {\n return sorter;\n }\n // parse the sorter string\n var args = trim( sorter ).split(' ');\n var query = args[0];\n // check if query looks like [an-attribute]\n var attrMatch = query.match( /^\\[(.+)\\]$/ );\n var attr = attrMatch && attrMatch[1];\n var getValue = getValueGetter( attr, query );\n // use second argument as a parser\n var parser = Isotope.sortDataParsers[ args[1] ];\n // parse the value, if there was a parser\n sorter = parser ? function( elem ) {\n return elem && parser( getValue( elem ) );\n } :\n // otherwise just return value\n function( elem ) {\n return elem && getValue( elem );\n };\n\n return sorter;\n }\n\n // get an attribute getter, or get text of the querySelector\n function getValueGetter( attr, query ) {\n // if query looks like [foo-bar], get attribute\n if ( attr ) {\n return function getAttribute( elem ) {\n return elem.getAttribute( attr );\n };\n }\n\n // otherwise, assume its a querySelector, and get its text\n return function getChildText( elem ) {\n var child = elem.querySelector( query );\n return child && child.textContent;\n };\n }\n\n return mungeSorter;\n })();\n\n // parsers used in getSortData shortcut strings\n Isotope.sortDataParsers = {\n 'parseInt': function( val ) {\n return parseInt( val, 10 );\n },\n 'parseFloat': function( val ) {\n return parseFloat( val );\n }\n };\n\n // ----- sort method ----- //\n\n // sort filteredItem order\n proto._sort = function() {\n if ( !this.options.sortBy ) {\n return;\n }\n // keep track of sortBy History\n var sortBys = utils.makeArray( this.options.sortBy );\n if ( !this._getIsSameSortBy( sortBys ) ) {\n // concat all sortBy and sortHistory, add to front, oldest goes in last\n this.sortHistory = sortBys.concat( this.sortHistory );\n }\n // sort magic\n var itemSorter = getItemSorter( this.sortHistory, this.options.sortAscending );\n this.filteredItems.sort( itemSorter );\n };\n\n // check if sortBys is same as start of sortHistory\n proto._getIsSameSortBy = function( sortBys ) {\n for ( var i=0; i < sortBys.length; i++ ) {\n if ( sortBys[i] != this.sortHistory[i] ) {\n return false;\n }\n }\n return true;\n };\n\n // returns a function used for sorting\n function getItemSorter( sortBys, sortAsc ) {\n return function sorter( itemA, itemB ) {\n // cycle through all sortKeys\n for ( var i = 0; i < sortBys.length; i++ ) {\n var sortBy = sortBys[i];\n var a = itemA.sortData[ sortBy ];\n var b = itemB.sortData[ sortBy ];\n if ( a > b || a < b ) {\n // if sortAsc is an object, use the value given the sortBy key\n var isAscending = sortAsc[ sortBy ] !== undefined ? sortAsc[ sortBy ] : sortAsc;\n var direction = isAscending ? 1 : -1;\n return ( a > b ? 1 : -1 ) * direction;\n }\n }\n return 0;\n };\n }\n\n // -------------------------- methods -------------------------- //\n\n // get layout mode\n proto._mode = function() {\n var layoutMode = this.options.layoutMode;\n var mode = this.modes[ layoutMode ];\n if ( !mode ) {\n // TODO console.error\n throw new Error( 'No layout mode: ' + layoutMode );\n }\n // HACK sync mode's options\n // any options set after init for layout mode need to be synced\n mode.options = this.options[ layoutMode ];\n return mode;\n };\n\n proto._resetLayout = function() {\n // trigger original reset layout\n Outlayer.prototype._resetLayout.call( this );\n this._mode()._resetLayout();\n };\n\n proto._getItemLayoutPosition = function( item ) {\n return this._mode()._getItemLayoutPosition( item );\n };\n\n proto._manageStamp = function( stamp ) {\n this._mode()._manageStamp( stamp );\n };\n\n proto._getContainerSize = function() {\n return this._mode()._getContainerSize();\n };\n\n proto.needsResizeLayout = function() {\n return this._mode().needsResizeLayout();\n };\n\n // -------------------------- adding & removing -------------------------- //\n\n // HEADS UP overwrites default Outlayer appended\n proto.appended = function( elems ) {\n var items = this.addItems( elems );\n if ( !items.length ) {\n return;\n }\n // filter, layout, reveal new items\n var filteredItems = this._filterRevealAdded( items );\n // add to filteredItems\n this.filteredItems = this.filteredItems.concat( filteredItems );\n };\n\n // HEADS UP overwrites default Outlayer prepended\n proto.prepended = function( elems ) {\n var items = this._itemize( elems );\n if ( !items.length ) {\n return;\n }\n // start new layout\n this._resetLayout();\n this._manageStamps();\n // filter, layout, reveal new items\n var filteredItems = this._filterRevealAdded( items );\n // layout previous items\n this.layoutItems( this.filteredItems );\n // add to items and filteredItems\n this.filteredItems = filteredItems.concat( this.filteredItems );\n this.items = items.concat( this.items );\n };\n\n proto._filterRevealAdded = function( items ) {\n var filtered = this._filter( items );\n this.hide( filtered.needHide );\n // reveal all new items\n this.reveal( filtered.matches );\n // layout new items, no transition\n this.layoutItems( filtered.matches, true );\n return filtered.matches;\n };\n\n /**\n * Filter, sort, and layout newly-appended item elements\n * @param {Array or NodeList or Element} elems\n */\n proto.insert = function( elems ) {\n var items = this.addItems( elems );\n if ( !items.length ) {\n return;\n }\n // append item elements\n var i, item;\n var len = items.length;\n for ( i=0; i < len; i++ ) {\n item = items[i];\n this.element.appendChild( item.element );\n }\n // filter new stuff\n var filteredInsertItems = this._filter( items ).matches;\n // set flag\n for ( i=0; i < len; i++ ) {\n items[i].isLayoutInstant = true;\n }\n this.arrange();\n // reset flag\n for ( i=0; i < len; i++ ) {\n delete items[i].isLayoutInstant;\n }\n this.reveal( filteredInsertItems );\n };\n\n var _remove = proto.remove;\n proto.remove = function( elems ) {\n elems = utils.makeArray( elems );\n var removeItems = this.getItems( elems );\n // do regular thing\n _remove.call( this, elems );\n // bail if no items to remove\n var len = removeItems && removeItems.length;\n // remove elems from filteredItems\n for ( var i=0; len && i < len; i++ ) {\n var item = removeItems[i];\n // remove item from collection\n utils.removeFrom( this.filteredItems, item );\n }\n };\n\n proto.shuffle = function() {\n // update random sortData\n for ( var i=0; i < this.items.length; i++ ) {\n var item = this.items[i];\n item.sortData.random = Math.random();\n }\n this.options.sortBy = 'random';\n this._sort();\n this._layout();\n };\n\n /**\n * trigger fn without transition\n * kind of hacky to have this in the first place\n * @param {Function} fn\n * @param {Array} args\n * @returns ret\n * @private\n */\n proto._noTransition = function( fn, args ) {\n // save transitionDuration before disabling\n var transitionDuration = this.options.transitionDuration;\n // disable transition\n this.options.transitionDuration = 0;\n // do it\n var returnValue = fn.apply( this, args );\n // re-enable transition for reveal\n this.options.transitionDuration = transitionDuration;\n return returnValue;\n };\n\n // ----- helper methods ----- //\n\n /**\n * getter method for getting filtered item elements\n * @returns {Array} elems - collection of item elements\n */\n proto.getFilteredItemElements = function() {\n return this.filteredItems.map( function( item ) {\n return item.element;\n });\n };\n\n // ----- ----- //\n\n return Isotope;\n\n}));\n\n\n\n/***/ }),\n\n/***/ \"Gz0TuoFFs6JdDvtR2PYZ\":\n/***/ (function(module, exports, __webpack_require__) {\n\nvar matches = __webpack_require__(\"C2mk7N9JzKWlcOYJrkfi\")\n\n/**\n * closest : closest(el, selector)\n * Looks for the closest ancestor of element `el` that matches `selector`.\n * Compare with [$.fn.closest](http://api.jquery.com/closest/).\n *\n * var closest = require('dom101/closest');\n *\n * closest(input, 'label');\n */\n\nfunction closest (el, sel) {\n if (!el) return\n if (matches(el, sel)) {\n return el\n } else {\n return closest(el.parentNode, sel)\n }\n}\n\nmodule.exports = closest\n\n\n/***/ }),\n\n/***/ \"MKJaVdnD9jF7rk6rW6AJ\":\n/***/ (function(module, exports) {\n\n/**\n * on : on(el, event, fn)\n * Adds an event handler.\n *\n * var on = require('dom101/on');\n *\n * on(el, 'click', function () {\n * ...\n * });\n */\n\nfunction on (el, event, handler) {\n if (el.addEventListener) {\n el.addEventListener(event, handler)\n } else {\n el.attachEvent('on' + event, function () {\n handler.call(el)\n })\n }\n}\n\nmodule.exports = on\n\n\n/***/ }),\n\n/***/ \"O7wD3s+p+jjyw5ivWGEg\":\n/***/ (function(module, exports) {\n\n/**\n * each : each(list, fn)\n * Iterates through `list` (an array or an object). This is useful when dealing\n * with NodeLists like `document.querySelectorAll`.\n *\n * var each = require('dom101/each');\n * var qa = require('dom101/query-selector-all');\n *\n * each(qa('.button'), function (el) {\n * addClass('el', 'selected');\n * });\n */\n\nfunction each (list, fn) {\n var i\n var len = list.length\n var idx\n\n if (typeof len === 'number') {\n for (i = 0; i < len; i++) {\n fn(list[i], i)\n }\n } else {\n idx = 0\n for (i in list) {\n if (list.hasOwnProperty(i)) {\n fn(list[i], i, idx++)\n }\n }\n }\n\n return list\n}\n\nmodule.exports = each\n\n\n/***/ }),\n\n/***/ \"XxGrbZud7DE4W4TdQZtc\":\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nvar _onmount = __webpack_require__(\"yfX/NEeqeNrvWENPWWKS\");\n\nvar _onmount2 = _interopRequireDefault(_onmount);\n\nvar _remove = __webpack_require__(\"wYegCzKWCG2ZRJZfGEZa\");\n\nvar _remove2 = _interopRequireDefault(_remove);\n\nvar _removeClass = __webpack_require__(\"bq+j3PCtCSGVXgg8xWPw\");\n\nvar _removeClass2 = _interopRequireDefault(_removeClass);\n\nvar _data = __webpack_require__(\"CjZN/azBHJxH2NsOjfdD\");\n\nvar _dismiss = __webpack_require__(\"2QOxTCxkuzN0PP2kJ2jn\");\n\nvar _preview = __webpack_require__(\"BF4TFfJ+K+wsuHfLZ/S3\");\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n(0, _onmount2.default)('[data-js-dismissable]', function () {\n var id = (0, _data.getData)(this, 'js-dismissable').id || '';\n\n if ((0, _preview.isPreview)() || (0, _dismiss.isDismissed)(id)) {\n (0, _remove2.default)(this);\n } else {\n (0, _removeClass2.default)(this, '-hide');\n }\n});\n\n/***/ }),\n\n/***/ \"ahJreyGRfWuLMDCl+A3L\":\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.appendMany = appendMany;\nexports.nextUntil = nextUntil;\nexports.before = before;\nexports.findChildren = findChildren;\nexports.createDiv = createDiv;\n\nvar _matches = __webpack_require__(\"C2mk7N9JzKWlcOYJrkfi\");\n\nvar _matches2 = _interopRequireDefault(_matches);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _toConsumableArray(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } else { return Array.from(arr); } }\n\n/*\n * Just like jQuery.append\n */\n\nfunction appendMany(el, children) {\n children.forEach(function (child) {\n el.appendChild(child);\n });\n}\n\n/*\n * Just like jQuery.nextUntil\n */\n\nfunction nextUntil(el, selector) {\n var nextEl = el.nextSibling;\n return nextUntilTick(nextEl, selector, []);\n}\n\nfunction nextUntilTick(el, selector, acc) {\n if (!el) return acc;\n\n var isMatch = (0, _matches2.default)(el, selector);\n if (isMatch) return acc;\n\n return nextUntilTick(el.nextSibling, selector, [].concat(_toConsumableArray(acc), [el]));\n}\n\n/*\n * Just like jQuery.before\n */\n\nfunction before(reference, newNode) {\n reference.parentNode.insertBefore(newNode, reference);\n}\n\n/*\n * Like jQuery.children('selector')\n */\n\nfunction findChildren(el, selector) {\n return [].slice.call(el.children).filter(function (child) {\n return (0, _matches2.default)(child, selector);\n });\n}\n\n/**\n * Creates a div\n * @private\n *\n * @example\n *\n * createDiv({ class: 'foo' })\n */\n\nfunction createDiv(props) {\n var d = document.createElement('div');\n Object.keys(props).forEach(function (key) {\n d.setAttribute(key, props[key]);\n });\n return d;\n}\n\n/***/ }),\n\n/***/ \"azEBDvunS5n/qbuQInIF\":\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nvar _closest = __webpack_require__(\"Gz0TuoFFs6JdDvtR2PYZ\");\n\nvar _closest2 = _interopRequireDefault(_closest);\n\nvar _remove = __webpack_require__(\"wYegCzKWCG2ZRJZfGEZa\");\n\nvar _remove2 = _interopRequireDefault(_remove);\n\nvar _on = __webpack_require__(\"MKJaVdnD9jF7rk6rW6AJ\");\n\nvar _on2 = _interopRequireDefault(_on);\n\nvar _data = __webpack_require__(\"CjZN/azBHJxH2NsOjfdD\");\n\nvar _onmount = __webpack_require__(\"yfX/NEeqeNrvWENPWWKS\");\n\nvar _onmount2 = _interopRequireDefault(_onmount);\n\nvar _dismiss = __webpack_require__(\"2QOxTCxkuzN0PP2kJ2jn\");\n\nvar Dismiss = _interopRequireWildcard(_dismiss);\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n/**\n * Dismiss button\n */\n\n(0, _onmount2.default)('[data-js-dismiss]', function () {\n var parent = (0, _closest2.default)(this, '[data-js-dismissable]');\n var dismissable = (0, _data.getData)(parent, 'js-dismissable');\n var id = dismissable && dismissable.id || '';\n\n (0, _on2.default)(this, 'click', function (e) {\n Dismiss.setDismissed(id);\n e.preventDefault();\n if (parent) (0, _remove2.default)(parent);\n });\n});\n\n/***/ }),\n\n/***/ \"bq+j3PCtCSGVXgg8xWPw\":\n/***/ (function(module, exports, __webpack_require__) {\n\nvar each = __webpack_require__(\"O7wD3s+p+jjyw5ivWGEg\")\n\n/**\n * removeClass : removeClass(el, className)\n * Removes a classname.\n *\n * var removeClass = require('dom101/remove-class');\n *\n * el.className = 'selected active';\n * removeClass(el, 'active');\n *\n * el.className\n * => \"selected\"\n */\n\nfunction removeClass (el, className) {\n if (!className) return\n\n if (Array.isArray(className)) {\n each(className, function (className) {\n removeClass(el, className)\n })\n\n return\n }\n\n if (el.classList) {\n var classNames = className.split(' ').filter(Boolean)\n each(classNames, function (className) {\n el.classList.remove(className)\n })\n } else {\n var expr =\n new RegExp('(^|\\\\b)' + className.split(' ').join('|') + '(\\\\b|$)', 'gi')\n\n el.className = el.className.replace(expr, ' ')\n }\n}\n\nmodule.exports = removeClass\n\n\n/***/ }),\n\n/***/ \"cBdQffYQOU2SCSRXjSUx\":\n/***/ (function(module, exports, __webpack_require__) {\n\nvar map = {\n\t\"./dismiss.js\": \"azEBDvunS5n/qbuQInIF\",\n\t\"./dismissable.js\": \"XxGrbZud7DE4W4TdQZtc\",\n\t\"./disqus.js\": \"BuWMdGeXUEK0GmkN01pU\",\n\t\"./h3-section-list.js\": \"E+dCGfS1pT5WowYv7jpv\",\n\t\"./main-body.js\": \"g3wkw0XZUos0Eo8rU7p6\",\n\t\"./no-preview.js\": \"k6EYej2Qda8Mq9A5Oeqn\",\n\t\"./search-form.js\": \"D3SYMdNAenu80VOO7/Dv\",\n\t\"./search-input.js\": \"zNHHVy5XxvKjnqTgwxy7\",\n\t\"./searchable-header.js\": \"veOabZWTWtixkn1TyITD\",\n\t\"./searchable-item.js\": \"tcev71HWHlq3Ur/sw7Ir\"\n};\nfunction webpackContext(req) {\n\treturn __webpack_require__(webpackContextResolve(req));\n};\nfunction webpackContextResolve(req) {\n\tvar id = map[req];\n\tif(!(id + 1)) // check for number or string\n\t\tthrow new Error(\"Cannot find module '\" + req + \"'.\");\n\treturn id;\n};\nwebpackContext.keys = function webpackContextKeys() {\n\treturn Object.keys(map);\n};\nwebpackContext.resolve = webpackContextResolve;\nmodule.exports = webpackContext;\nwebpackContext.id = \"cBdQffYQOU2SCSRXjSUx\";\n\n/***/ }),\n\n/***/ \"cYqQDyTPtD7lV79ovj4Y\":\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.default = inject;\nexports.injectEmbed = injectEmbed;\nexports.injectCount = injectCount;\n/**\n * Injects disqus's scripts into the page.\n *\n * @example\n * inject('devhints.disqus.com')\n */\n\nfunction inject(host) {\n injectEmbed(host);\n injectCount(host);\n}\n\nfunction injectEmbed(host) {\n var d = document;\n var s = d.createElement('script');\n s.src = 'https://' + host + '/embed.js';\n s.setAttribute('data-timestamp', +new Date());(d.head || d.body).appendChild(s);\n}\n\nfunction injectCount(host) {\n var d = document;\n var s = d.createElement('script');\n s.src = 'https://' + host + '/count.js';\n s.id = 'dsq-count-scr';\n s.async = true;(d.head || d.body).appendChild(s);\n}\n\n/***/ }),\n\n/***/ \"g2okcHDGBNRpe9zqR9sR\":\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n/* blank */\n\n\n/***/ }),\n\n/***/ \"g3wkw0XZUos0Eo8rU7p6\":\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\n/***/ }),\n\n/***/ \"j059HZGO2uzpV/UZMXr3\":\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.default = qs;\nexports.qsdecode = qsdecode;\n/*\n * Helper: minimal qs implementation\n */\n\nfunction qs(search) {\n search = search.substr(1);\n var parts = search.split('&').map(function (p) {\n return p.split('=');\n });\n return parts.reduce(function (result, part) {\n result[part[0]] = qsdecode(part[1]);\n return result;\n }, {});\n}\n\nfunction qsdecode(string) {\n if (!string) string = '';\n string = string.replace(/\\+/g, ' ');\n return string;\n}\n\n/***/ }),\n\n/***/ \"k6EYej2Qda8Mq9A5Oeqn\":\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nvar _remove = __webpack_require__(\"wYegCzKWCG2ZRJZfGEZa\");\n\nvar _remove2 = _interopRequireDefault(_remove);\n\nvar _onmount = __webpack_require__(\"yfX/NEeqeNrvWENPWWKS\");\n\nvar _onmount2 = _interopRequireDefault(_onmount);\n\nvar _addClass = __webpack_require__(\"lGfezzQL7fc5RE8kg33g\");\n\nvar _addClass2 = _interopRequireDefault(_addClass);\n\nvar _preview = __webpack_require__(\"BF4TFfJ+K+wsuHfLZ/S3\");\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n/*\n * Behavior: Things to remove when preview mode is on\n */\n\n(0, _onmount2.default)('[data-js-no-preview]', function (b) {\n if ((0, _preview.isPreview)()) {\n (0, _remove2.default)(this);\n (0, _addClass2.default)(document.documentElement, 'PreviewMode');\n }\n});\n\n/***/ }),\n\n/***/ \"lGfezzQL7fc5RE8kg33g\":\n/***/ (function(module, exports, __webpack_require__) {\n\nvar each = __webpack_require__(\"O7wD3s+p+jjyw5ivWGEg\")\n\n/**\n * addClass : addClass(el, className)\n * Adds a class name to an element. Compare with `$.fn.addClass`.\n *\n * var addClass = require('dom101/add-class');\n *\n * addClass(el, 'active');\n */\n\nfunction addClass (el, className) {\n if (!className) return\n\n if (Array.isArray(className)) {\n each(className, function (className) {\n addClass(el, className)\n })\n\n return\n }\n\n if (el.classList) {\n var classNames = className.split(' ').filter(Boolean)\n each(classNames, function (className) {\n el.classList.add(className)\n })\n } else {\n el.className += ' ' + className\n }\n}\n\nmodule.exports = addClass\n\n\n/***/ }),\n\n/***/ \"tcev71HWHlq3Ur/sw7Ir\":\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nvar _onmount = __webpack_require__(\"yfX/NEeqeNrvWENPWWKS\");\n\nvar _onmount2 = _interopRequireDefault(_onmount);\n\nvar _permutate = __webpack_require__(\"GOdGag34TlRuHa2OZoh9\");\n\nvar _permutate2 = _interopRequireDefault(_permutate);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n/**\n * Sets search indices (`data-search-index` attribute)\n */\n\n(0, _onmount2.default)('[data-js-searchable-item]', function () {\n var data = JSON.parse(this.getAttribute('data-js-searchable-item') || '{}');\n var words = (0, _permutate2.default)(data);\n\n this.setAttribute('data-search-index', words.join(' '));\n});\n\n/***/ }),\n\n/***/ \"tqbVxj9+xGAhlFrQpyTS\":\n/***/ (function(module, exports) {\n\n/**\n * ready : ready(fn)\n * Executes `fn` when the DOM is ready. If the DOM is already ready, the given\n * callback will be called immediately.\n *\n * var ready = require('dom101/ready');\n *\n * ready(function () {\n * ...\n * });\n */\n\nfunction ready (fn) {\n if (isReady()) {\n return fn()\n } else if (document.addEventListener) {\n document.addEventListener('DOMContentLoaded', fn)\n } else {\n document.attachEvent('onreadystatechange', function () {\n if (isReady()) fn()\n })\n }\n}\n\nfunction isReady () {\n return (document.readyState === 'complete' || document.readyState === 'interactive')\n}\n\nmodule.exports = ready\n\n\n/***/ }),\n\n/***/ \"veOabZWTWtixkn1TyITD\":\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nvar _onmount = __webpack_require__(\"yfX/NEeqeNrvWENPWWKS\");\n\nvar _onmount2 = _interopRequireDefault(_onmount);\n\nvar _dom = __webpack_require__(\"ahJreyGRfWuLMDCl+A3L\");\n\nvar _matches = __webpack_require__(\"C2mk7N9JzKWlcOYJrkfi\");\n\nvar _matches2 = _interopRequireDefault(_matches);\n\n__webpack_require__(\"tcev71HWHlq3Ur/sw7Ir\");\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n/**\n * Propagate item search indices to headers\n */\n\n(0, _onmount2.default)('[data-js-searchable-header]', function () {\n var els = (0, _dom.nextUntil)(this, '[data-js-searchable-header]').filter(function (el) {\n return (0, _matches2.default)(el, '[data-search-index]');\n });\n\n var keywords = els.map(function (n) {\n return n.getAttribute('data-search-index');\n }).join(' ').split(' ');\n\n this.setAttribute('data-search-index', keywords.join(' '));\n});\n\n// Ensure that search-index is set first\n\n/***/ }),\n\n/***/ \"wYegCzKWCG2ZRJZfGEZa\":\n/***/ (function(module, exports) {\n\n/**\n * remove : remove(el)\n * Removes an element from the DOM.\n *\n * var remove = require('dom101/remove');\n *\n * remove(el);\n */\n\nfunction remove (el) {\n el && el.parentNode && el.parentNode.removeChild(el)\n}\n\nmodule.exports = remove\n\n\n/***/ }),\n\n/***/ \"yfX/NEeqeNrvWENPWWKS\":\n/***/ (function(module, exports, __webpack_require__) {\n\nvar __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_RESULT__;/* global define */\nvoid (function (root, factory) {\n if (true) !(__WEBPACK_AMD_DEFINE_FACTORY__ = (factory),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ = (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === 'function' ?\n\t\t\t\t(__WEBPACK_AMD_DEFINE_FACTORY__.call(exports, __webpack_require__, exports, module)) :\n\t\t\t\t__WEBPACK_AMD_DEFINE_FACTORY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__))\n else if (typeof exports === 'object') module.exports = factory()\n else {\n if (window.jQuery) window.jQuery.onmount = factory()\n else root.onmount = factory()\n }\n}(this, function ($) {\n /*\n * Internal: Registry.\n */\n\n var handlers, behaviors, selectors, log\n\n /*\n * Internal: IDs for auto-incrementing.\n */\n\n var bid = 0 /* behavior ID */\n var cid = 0 /* component ID */\n\n /**\n * (Module) Adds a behavior, or triggers behaviors.\n *\n * When no parameters are passed, it triggers all behaviors. When one\n * parameter is passed, it triggers the given behavior. Otherwise, it adds a\n * behavior.\n *\n * // define a behavior\n * $.onmount('.select-box', function () {\n * $(this).on('...')\n * })\n *\n * // define a behavior with exit\n * $.onmount('.select-box', function () {\n * $(document).on('...')\n * }, function () {\n * $(document).off('...')\n * })\n *\n * // retrigger a onmount\n * $.onmount('.select-box')\n *\n * // retriggers all behaviors\n * $.onmount()\n */\n\n function onmount (selector, init, exit, options) {\n if (typeof exit === 'object') {\n options = exit\n exit = undefined\n }\n\n if (arguments.length === 0 || isjQuery(selector) || isEvent(selector)) {\n // onmount() - trigger all behaviors. Also account for cases such as\n // $($.onmount), where it's triggered with a jQuery event object.\n onmount.poll()\n } else if (arguments.length === 1) {\n // onmount(selector) - trigger for a given selector.\n onmount.poll(selector)\n } else {\n // onmount(sel, fn, [fn]) - register a new behavior.\n var be = new Behavior(selector, init, exit, options)\n behaviors.push(be)\n be.register()\n }\n\n return this\n }\n\n /*\n * Use jQuery (or a jQuery-like) when available. This will allow\n * the use of jQuery selectors.\n */\n\n onmount.$ = window.jQuery || window.Zepto || window.Ender\n\n /*\n * Detect MutationObserver support for `onmount.observe()`.\n * You may even add a polyfill here via\n * `onmount.MutationObserver = require('mutation-observer')`.\n */\n\n onmount.MutationObserver =\n window.MutationObserver ||\n window.WebKitMutationObserver ||\n window.MozMutationObserver\n\n /**\n * Set this to true if you want to see debug messages.\n */\n\n onmount.debug = false\n\n /**\n * Internal: triggers behaviors for a selector or for all.\n *\n * onmount.poll()\n * onmount.poll('.js-button')\n */\n\n onmount.poll = function poll (selector) {\n if (selector) selector = onmount.selectify(selector)\n var functions = (selector ? selectors[selector] : handlers) || []\n each(functions, function (fn) { fn() })\n }\n\n /**\n * Observes automatically using MutationObserver events.\n *\n * onmount.observe()\n */\n\n onmount.observe = function observe () {\n var MutationObserver = onmount.MutationObserver\n if (typeof MutationObserver === 'undefined') return\n\n var obs = new MutationObserver(function (mutations) {\n each(behaviors, function (be) {\n each(mutations, function (mutation) {\n each(mutation.addedNodes, function (el) {\n if (matches(el, be.selector)) be.visitEnter(el)\n })\n\n each(mutation.removedNodes, function (el) {\n if (matches(el, be.selector)) be.doExit(el)\n })\n })\n })\n })\n\n obs.observe(document, { subtree: true, childList: true })\n onmount.observer = obs\n\n // trigger everything before going\n onmount()\n return true\n }\n\n /**\n * Turns off observation first issued by `onmount.observe()`.\n */\n\n onmount.unobserve = function unobserve () {\n if (!this.observer) return\n this.observer.disconnect()\n delete this.observer\n }\n\n /**\n * Forces teardown of all behaviors currently applied.\n */\n\n onmount.teardown = function teardown () {\n each(behaviors, function (be) {\n each(be.loaded, function (el, i) {\n if (el) be.doExit(el, i)\n })\n })\n }\n\n /**\n * Clears all behaviors. Useful for tests.\n * This will NOT call exit handlers.\n */\n\n onmount.reset = function reset () {\n handlers = onmount.handlers = []\n selectors = onmount.selectors = {}\n behaviors = onmount.behaviors = []\n }\n\n /**\n * Internal: Converts `@role` to `[role~=\"role\"]` if needed. You can override\n * this by reimplementing `onmount.selectify`.\n *\n * selectify('@hi') //=> '[role=\"hi\"]'\n * selectify('.btn') //=> '.btn'\n */\n\n onmount.selectify = function selectify (selector) {\n if (selector[0] === '@') {\n return '[role~=\"' + selector.substr(1).replace(/\"/g, '\\\\\"') + '\"]'\n }\n return selector\n }\n\n /**\n * Internal: behavior class\n */\n\n function Behavior (selector, init, exit, options) {\n this.id = 'b' + bid++\n this.init = init\n this.exit = exit\n this.selector = onmount.selectify(selector)\n this.loaded = [] // keep track of dom elements loaded for this behavior\n this.key = '__onmount:' + bid // leave the state in el['__onmount:12']\n this.detectMutate = options && options.detectMutate\n }\n\n /**\n * Internal: initialize this behavior by registering itself to the internal\n * `selectors` map. This allows you to call `onmount(selector)` later on.\n */\n\n Behavior.prototype.register = function () {\n var be = this\n var loaded = this.loaded\n var selector = this.selector\n\n register(selector, function () {\n var list = query(selector)\n\n // This is the function invoked on `onmount(selector)`.\n // Clean up old ones (if they're not in the DOM anymore).\n each(loaded, function (element, i) {\n be.visitExit(element, i, list)\n })\n\n // Clean up new ones (if they're not loaded yet).\n eachOf(list, function (element) {\n be.visitEnter(element)\n })\n })\n }\n\n /**\n * Internal: visits the element `el` and turns it on if applicable.\n */\n\n Behavior.prototype.visitEnter = function (el) {\n if (el[this.key]) return\n var options = { id: 'c' + cid, selector: this.selector }\n if (this.init.call(el, options) !== false) {\n if (onmount.debug) log('enter', this.selector, el)\n el[this.key] = options\n this.loaded.push(el)\n cid++\n }\n }\n\n /**\n * Internal: visits the element `el` and sees if it needs its exit handler\n * called.\n */\n\n Behavior.prototype.visitExit = function (el, i, list) {\n if (!el) return\n if (this.detectMutate) {\n if (!has(list, el)) return this.doExit(el, i)\n } else {\n if (!isAttached(el)) return this.doExit(el, i)\n }\n }\n\n /**\n * Internal: calls the exit handler for the behavior for element `el` (if\n * available), and marks the behavior/element as uninitialized.\n */\n\n Behavior.prototype.doExit = function (el, i) {\n if (typeof i === 'undefined') i = this.loaded.indexOf(el)\n this.loaded[i] = undefined\n if (this.exit && this.exit.call(el, el[this.key]) !== false) {\n if (onmount.debug) log('exit', this.selector, el)\n delete el[this.key]\n }\n }\n\n /**\n * Internal: check if an element is still attached to its document.\n */\n\n function isAttached (el) {\n while (el) {\n if (el === document.documentElement) return true\n el = el.parentElement\n }\n }\n\n /**\n * Internal: reimplementation of `$('...')`. If jQuery is available,\n * use it (I guess to preserve IE compatibility and to enable special jQuery\n * attribute selectors). Use with `eachOf()` or `has()`.\n */\n\n function query (selector, fn) {\n if (onmount.$) return onmount.$(selector)\n return document.querySelectorAll(selector)\n }\n\n /**\n * Internal: iterates through a `query()` result.\n */\n\n function eachOf (list, fn) {\n if (onmount.$) return list.each(function (i) { fn(this, i) })\n return each(list, fn)\n }\n\n /**\n * Interanl: checks if given element `el` is in the query result `list`.\n */\n\n function has (list, el) {\n if (onmount.$) return list.index(el) > -1\n return list.indexOf(el) > -1\n }\n\n /**\n * Internal: registers a behavior handler for a selector.\n */\n\n function register (selector, fn) {\n if (!selectors[selector]) selectors[selector] = []\n selectors[selector].push(fn)\n handlers.push(fn)\n }\n\n /**\n * Checks if a given element `el` matches `selector`.\n * Compare with [$.fn.is](http://api.jquery.com/is/).\n *\n * var matches = require('dom101/matches');\n *\n * matches(button, ':focus');\n */\n\n function matches (el, selector) {\n var _matches = el.matches ||\n el.matchesSelector ||\n el.msMatchesSelector ||\n el.mozMatchesSelector ||\n el.webkitMatchesSelector ||\n el.oMatchesSelector\n\n if (onmount.$) {\n return onmount.$(el).is(selector)\n } else if (_matches) {\n return _matches.call(el, selector)\n } else if (el.parentNode) {\n // IE8 and below\n var nodes = el.parentNode.querySelectorAll(selector)\n for (var i = nodes.length; i--; 0) {\n if (nodes[i] === el) return true\n }\n return false\n }\n }\n\n /**\n * Iterates through `list` (an array or an object). This is useful when dealing\n * with NodeLists like `document.querySelectorAll`.\n *\n * var each = require('dom101/each');\n * var qa = require('dom101/query-selector-all');\n *\n * each(qa('.button'), function (el) {\n * addClass('el', 'selected');\n * });\n */\n\n function each (list, fn) {\n var i\n var len = list.length\n\n if (len === +len) {\n for (i = 0; i < len; i++) { fn(list[i], i) }\n } else {\n for (i in list) {\n if (list.hasOwnProperty(i)) fn(list[i], i)\n }\n }\n\n return list\n }\n\n /**\n * Internal: Check if a given object is jQuery\n */\n\n function isjQuery ($) {\n return typeof $ === 'function' && $.fn && $.noConflict\n }\n\n function isEvent (e) {\n return typeof e === 'object' && e.target\n }\n\n /**\n * Internal: logging\n */\n\n var styles = {\n enter: 'background-color:#dfd;font-weight:bold;color:#141',\n exit: 'background-color:#fdd;font-weight:bold;color:#411'\n }\n\n if (~navigator.userAgent.indexOf('Mozilla')) {\n log = function (type, selector, el) {\n console.log('%c %s ', styles[type], selector, el)\n }\n } else {\n log = function (type, selector, el) {\n console.log('(onmount)', type, selector)\n }\n }\n\n /*\n * Export\n */\n\n onmount.reset()\n return onmount\n}))\n\n\n/***/ }),\n\n/***/ \"z+w/DGZianwIMo5d4qOD\":\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\n// 3rd party libs\nwindow.Prism = __webpack_require__(\"+HohgKHTHTXOIAa8uoqY\");\n\n// All the others\nfunction requireAll(r) {\n r.keys().forEach(r);\n}\nrequireAll(__webpack_require__(\"2tov+8o2NrZdw/Lg8JZA\"));\nrequireAll(__webpack_require__(\"cBdQffYQOU2SCSRXjSUx\"));\n\n/***/ }),\n\n/***/ \"zNHHVy5XxvKjnqTgwxy7\":\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nvar _onmount = __webpack_require__(\"yfX/NEeqeNrvWENPWWKS\");\n\nvar _onmount2 = _interopRequireDefault(_onmount);\n\nvar _search = __webpack_require__(\"DfTyEU8lscjHXmCMlptO\");\n\nvar Search = _interopRequireWildcard(_search);\n\nvar _qs = __webpack_require__(\"j059HZGO2uzpV/UZMXr3\");\n\nvar _qs2 = _interopRequireDefault(_qs);\n\nvar _on = __webpack_require__(\"MKJaVdnD9jF7rk6rW6AJ\");\n\nvar _on2 = _interopRequireDefault(_on);\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n(0, _onmount2.default)('[data-js-search-input]', function () {\n var _this = this;\n\n (0, _on2.default)(this, 'input', function () {\n var val = _this.value;\n\n if (val === '') {\n Search.showAll();\n } else {\n Search.show(val);\n }\n });\n\n var query = ((0, _qs2.default)(window.location.search) || {}).q;\n if (query && query.length) {\n this.value = query;\n setTimeout(function () {\n Search.show(query);\n });\n }\n});\n\n/***/ })\n\n},[\"z+w/DGZianwIMo5d4qOD\"]);\n\n\n// WEBPACK FOOTER //\n// app.js","/**\n * Updates a local storage key. If it doesn't exist, it defaults to an empty\n * object.\n *\n * @example\n * update('dismissed', (data) => {\n * data.lol = true\n * return data\n * })\n */\n\nexport function update (key, fn) {\n if (!window.localStorage) return\n let data = JSON.parse(window.localStorage[key] || '{}')\n data = fn(data)\n window.localStorage[key] = JSON.stringify(data)\n}\n\n/**\n * Fetches a local storage key.\n *\n * @example\n * const data = fetch('dismissed')\n */\n\nexport function fetch (key) {\n if (!window.localStorage) return\n return JSON.parse(window.localStorage[key] || '{}')\n}\n\n\n\n// WEBPACK FOOTER //\n// ./_js/helpers/store.js","import * as Store from './store'\n\n/**\n * Dismisses an announcement.\n *\n * @example\n * setDismissed('2017-09-02-happy-birthday')\n */\n\nexport function setDismissed (id) {\n Store.update('dismissed', function (data) {\n data[id] = true\n return data\n })\n}\n\n/**\n * Checks if an announcement has been dismissed before.\n *\n * @example\n * setDismissed('2017-09-02-happy-birthday')\n * isDismissed('2017-09-02-happy-birthday') => true\n */\n\nexport function isDismissed (id) {\n const data = Store.fetch('dismissed')\n return data && data[id]\n}\n\n\n\n// WEBPACK FOOTER //\n// ./_js/helpers/dismiss.js","var map = {\n\t\"./onmount.js\": \"6hLKOGpXaWUwTDQA5TL2\"\n};\nfunction webpackContext(req) {\n\treturn __webpack_require__(webpackContextResolve(req));\n};\nfunction webpackContextResolve(req) {\n\tvar id = map[req];\n\tif(!(id + 1)) // check for number or string\n\t\tthrow new Error(\"Cannot find module '\" + req + \"'.\");\n\treturn id;\n};\nwebpackContext.keys = function webpackContextKeys() {\n\treturn Object.keys(map);\n};\nwebpackContext.resolve = webpackContextResolve;\nmodule.exports = webpackContext;\nwebpackContext.id = \"2tov+8o2NrZdw/Lg8JZA\";\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./_js/initializers \\.js$\n// module id = 2tov+8o2NrZdw/Lg8JZA\n// module chunks = 0","import ready from 'dom101/ready'\nimport onmount from 'onmount'\n\n/**\n * Behavior: Wrapping\n */\n\nready(() => {\n setTimeout(() => { onmount() })\n})\n\n\n\n// WEBPACK FOOTER //\n// ./_js/initializers/onmount.js","/**\n * Checks if we're in preview mode (?preview=1).\n */\n\nexport function isPreview () {\n return window.location.search.indexOf('preview=1') !== -1\n}\n\n\n\n// WEBPACK FOOTER //\n// ./_js/helpers/preview.js","import onmount from 'onmount'\nimport injectDisqus from '../helpers/inject_disqus'\nimport ready from 'dom101/ready'\n\n/**\n * Delay disqus by some time. It's at the bottom of the page, there's no need\n * for it to load fast. This will give more time to load more critical assets.\n */\n\nconst DISQUS_DELAY = 10 * 1000\n\n/**\n * Injects Disqus onto the page.\n */\n\nonmount('[data-js-disqus]', function () {\n const data = JSON.parse(this.getAttribute('data-js-disqus'))\n const $parent = this.parentNode\n $parent.setAttribute('hidden', true)\n\n window.disqus_config = function () {\n this.page.url = data.url\n this.page.identifier = data.identifier\n }\n\n // Disqus takes a while to load, don't do it so eagerly.\n ready(() => {\n setTimeout(() => {\n injectDisqus(data.host)\n $parent.removeAttribute('hidden')\n }, DISQUS_DELAY)\n })\n})\n\n\n\n// WEBPACK FOOTER //\n// ./_js/behaviors/disqus.js","/**\n * matches : matches(el, selector)\n * Checks if a given element `el` matches `selector`.\n * Compare with [$.fn.is](http://api.jquery.com/is/).\n *\n * var matches = require('dom101/matches');\n *\n * matches(button, ':focus');\n */\n\nfunction matches (el, selector) {\n var _matches = el.matches ||\n el.matchesSelector ||\n el.msMatchesSelector ||\n el.mozMatchesSelector ||\n el.webkitMatchesSelector ||\n el.oMatchesSelector\n\n if (_matches) {\n return _matches.call(el, selector)\n } else if (el.parentNode) {\n // IE8 and below\n var nodes = el.parentNode.querySelectorAll(selector)\n for (var i = nodes.length; i--; 0) {\n if (nodes[i] === el) return true\n }\n return false\n }\n}\n\nmodule.exports = matches\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/dom101/matches.js\n// module id = C2mk7N9JzKWlcOYJrkfi\n// module chunks = 0","/**\n * Stores and retrieves data from an element. Works like jQuery.data().\n */\n\nexport function data (el, key, val) {\n if (typeof val !== 'undefined') {\n return getData(el, key)\n } else {\n return setData(el, key, val)\n }\n}\n\nexport function getData (el, key) {\n const str = el.getAttribute('data-' + key)\n return JSON.parse(str || '{}')\n}\n\nexport function setData (el, key, val) {\n el.setAttribute('data-' + key, JSON.stringify(val))\n}\n\n\n\n// WEBPACK FOOTER //\n// ./_js/helpers/data.js","import onmount from 'onmount'\nimport on from 'dom101/on'\n\n/**\n * Submitting the search form\n */\n\nonmount('[data-js-search-form]', function () {\n on(this, 'submit', e => {\n e.preventDefault()\n\n const link = document.querySelector('a[data-search-index]:visible')\n const href = link && link.getAttribute('href')\n\n if (href) window.location = href\n })\n})\n\n\n\n// WEBPACK FOOTER //\n// ./_js/behaviors/search-form.js","import { splitwords } from './permutate'\nimport qsa from 'dom101/query-selector-all'\n\n/**\n * Show everything.\n *\n * @example\n * Search.showAll()\n */\n\nexport function showAll () {\n qsa('[data-search-index]').forEach(el => {\n el.removeAttribute('aria-hidden')\n })\n}\n\n/**\n * Search for a given keyword.\n *\n * @example\n * Search.show('hello')\n */\n\nexport function show (val) {\n const keywords = splitwords(val)\n\n if (!keywords.length) return showAll()\n\n const selectors = keywords\n .map(k => `[data-search-index~=${JSON.stringify(k)}]`)\n .join('')\n\n qsa('[data-search-index]').forEach(el => {\n el.setAttribute('aria-hidden', true)\n })\n\n qsa(selectors).forEach(el => {\n el.removeAttribute('aria-hidden')\n })\n}\n\n\n\n// WEBPACK FOOTER //\n// ./_js/helpers/search.js","/* eslint-disable no-new */\n\nimport Isotope from 'isotope-layout/dist/isotope.pkgd.js'\nimport onmount from 'onmount'\nimport on from 'dom101/on'\nimport qsa from 'dom101/query-selector-all'\n\n/*\n * Behavior: Isotope\n */\n\nonmount('[data-js-h3-section-list]', function () {\n const iso = new Isotope(this, {\n itemSelector: '.h3-section',\n transitionDuration: 0\n })\n\n const images = qsa('img', this)\n\n images.forEach(image => {\n on(image, 'load', () => {\n iso.layout()\n })\n })\n\n // Insurance against weirdness on pages like devhints.io/vim, where the\n // critical path CSS may look different from the final CSS (because of the\n // tables).\n on(window, 'load', () => {\n iso.layout()\n })\n})\n\n\n\n// WEBPACK FOOTER //\n// ./_js/behaviors/h3-section-list.js","/**\n * querySelectorAll : querySelectorAll(query, [element])\n * Convenience function to access `document.querySelectorAll`. Unlike the\n * default version, this always returns an array.\n *\n * If a 2nd parameter `element` is given, it only searches for descendants of\n * that element.\n *\n * var each = require('dom101/each');\n * var qsa = require('dom101/query-selector-all');\n *\n * qsa('.button').each(el => {\n * addClass('el', 'selected');\n * };\n */\n\nfunction querySelectorAll (query, context) {\n return Array.prototype.slice.call(\n (context || document).querySelectorAll(query)\n )\n}\n\nmodule.exports = querySelectorAll\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/dom101/query-selector-all.js\n// module id = EvxNxLK9yKFmn1U14Kvw\n// module chunks = 0","/**\n * Permutates a searcheable item.\n *\n * permutate({\n * slug: 'hello-world',\n * category: 'greetings'\n * })\n */\n\nexport default function permutate (data) {\n let words = []\n if (data.slug) {\n words = words.concat(permutateString(data.slug))\n }\n if (data.category) {\n words = words.concat(permutateString(data.category))\n }\n return words\n}\n\n/*\n * Permutates strings.\n *\n * @example\n * permutateString('hi joe')\n * => ['h', 'hi', 'j', 'jo', 'joe']\n */\n\nexport function permutateString (str) {\n let words = []\n let inputs = splitwords(str)\n\n inputs.forEach(word => {\n words = words.concat(permutateWord(word))\n })\n\n return words\n}\n\n/**\n * Permutates a word.\n *\n * @example\n * permutateWord('hello')\n * => ['h', 'he', 'hel', 'hell', 'hello']\n */\n\nexport function permutateWord (str) {\n let words = []\n const len = str.length\n for (var i = 1; i <= len; ++i) {\n words.push(str.substr(0, i))\n }\n return words\n}\n\n/**\n * Helper for splitting to words.\n *\n * @example\n * splitWords('Hello, world!')\n * => ['hello', 'world']\n */\n\nexport function splitwords (str) {\n const words = str.toLowerCase()\n .split(/[ \\/\\-_]/)\n .filter(k => k && k.length !== 0)\n\n return words\n}\n\n\n\n// WEBPACK FOOTER //\n// ./_js/helpers/permutate.js","/*!\n * Isotope PACKAGED v3.0.4\n *\n * Licensed GPLv3 for open source use\n * or Isotope Commercial License for commercial use\n *\n * http://isotope.metafizzy.co\n * Copyright 2017 Metafizzy\n */\n\n/**\n * Bridget makes jQuery widgets\n * v2.0.1\n * MIT license\n */\n\n/* jshint browser: true, strict: true, undef: true, unused: true */\n\n( function( window, factory ) {\n // universal module definition\n /*jshint strict: false */ /* globals define, module, require */\n if ( typeof define == 'function' && define.amd ) {\n // AMD\n define( 'jquery-bridget/jquery-bridget',[ 'jquery' ], function( jQuery ) {\n return factory( window, jQuery );\n });\n } else if ( typeof module == 'object' && module.exports ) {\n // CommonJS\n module.exports = factory(\n window,\n require('jquery')\n );\n } else {\n // browser global\n window.jQueryBridget = factory(\n window,\n window.jQuery\n );\n }\n\n}( window, function factory( window, jQuery ) {\n'use strict';\n\n// ----- utils ----- //\n\nvar arraySlice = Array.prototype.slice;\n\n// helper function for logging errors\n// $.error breaks jQuery chaining\nvar console = window.console;\nvar logError = typeof console == 'undefined' ? function() {} :\n function( message ) {\n console.error( message );\n };\n\n// ----- jQueryBridget ----- //\n\nfunction jQueryBridget( namespace, PluginClass, $ ) {\n $ = $ || jQuery || window.jQuery;\n if ( !$ ) {\n return;\n }\n\n // add option method -> $().plugin('option', {...})\n if ( !PluginClass.prototype.option ) {\n // option setter\n PluginClass.prototype.option = function( opts ) {\n // bail out if not an object\n if ( !$.isPlainObject( opts ) ){\n return;\n }\n this.options = $.extend( true, this.options, opts );\n };\n }\n\n // make jQuery plugin\n $.fn[ namespace ] = function( arg0 /*, arg1 */ ) {\n if ( typeof arg0 == 'string' ) {\n // method call $().plugin( 'methodName', { options } )\n // shift arguments by 1\n var args = arraySlice.call( arguments, 1 );\n return methodCall( this, arg0, args );\n }\n // just $().plugin({ options })\n plainCall( this, arg0 );\n return this;\n };\n\n // $().plugin('methodName')\n function methodCall( $elems, methodName, args ) {\n var returnValue;\n var pluginMethodStr = '$().' + namespace + '(\"' + methodName + '\")';\n\n $elems.each( function( i, elem ) {\n // get instance\n var instance = $.data( elem, namespace );\n if ( !instance ) {\n logError( namespace + ' not initialized. Cannot call methods, i.e. ' +\n pluginMethodStr );\n return;\n }\n\n var method = instance[ methodName ];\n if ( !method || methodName.charAt(0) == '_' ) {\n logError( pluginMethodStr + ' is not a valid method' );\n return;\n }\n\n // apply method, get return value\n var value = method.apply( instance, args );\n // set return value if value is returned, use only first value\n returnValue = returnValue === undefined ? value : returnValue;\n });\n\n return returnValue !== undefined ? returnValue : $elems;\n }\n\n function plainCall( $elems, options ) {\n $elems.each( function( i, elem ) {\n var instance = $.data( elem, namespace );\n if ( instance ) {\n // set options & init\n instance.option( options );\n instance._init();\n } else {\n // initialize new instance\n instance = new PluginClass( elem, options );\n $.data( elem, namespace, instance );\n }\n });\n }\n\n updateJQuery( $ );\n\n}\n\n// ----- updateJQuery ----- //\n\n// set $.bridget for v1 backwards compatibility\nfunction updateJQuery( $ ) {\n if ( !$ || ( $ && $.bridget ) ) {\n return;\n }\n $.bridget = jQueryBridget;\n}\n\nupdateJQuery( jQuery || window.jQuery );\n\n// ----- ----- //\n\nreturn jQueryBridget;\n\n}));\n\n/**\n * EvEmitter v1.0.3\n * Lil' event emitter\n * MIT License\n */\n\n/* jshint unused: true, undef: true, strict: true */\n\n( function( global, factory ) {\n // universal module definition\n /* jshint strict: false */ /* globals define, module, window */\n if ( typeof define == 'function' && define.amd ) {\n // AMD - RequireJS\n define( 'ev-emitter/ev-emitter',factory );\n } else if ( typeof module == 'object' && module.exports ) {\n // CommonJS - Browserify, Webpack\n module.exports = factory();\n } else {\n // Browser globals\n global.EvEmitter = factory();\n }\n\n}( typeof window != 'undefined' ? window : this, function() {\n\n\n\nfunction EvEmitter() {}\n\nvar proto = EvEmitter.prototype;\n\nproto.on = function( eventName, listener ) {\n if ( !eventName || !listener ) {\n return;\n }\n // set events hash\n var events = this._events = this._events || {};\n // set listeners array\n var listeners = events[ eventName ] = events[ eventName ] || [];\n // only add once\n if ( listeners.indexOf( listener ) == -1 ) {\n listeners.push( listener );\n }\n\n return this;\n};\n\nproto.once = function( eventName, listener ) {\n if ( !eventName || !listener ) {\n return;\n }\n // add event\n this.on( eventName, listener );\n // set once flag\n // set onceEvents hash\n var onceEvents = this._onceEvents = this._onceEvents || {};\n // set onceListeners object\n var onceListeners = onceEvents[ eventName ] = onceEvents[ eventName ] || {};\n // set flag\n onceListeners[ listener ] = true;\n\n return this;\n};\n\nproto.off = function( eventName, listener ) {\n var listeners = this._events && this._events[ eventName ];\n if ( !listeners || !listeners.length ) {\n return;\n }\n var index = listeners.indexOf( listener );\n if ( index != -1 ) {\n listeners.splice( index, 1 );\n }\n\n return this;\n};\n\nproto.emitEvent = function( eventName, args ) {\n var listeners = this._events && this._events[ eventName ];\n if ( !listeners || !listeners.length ) {\n return;\n }\n var i = 0;\n var listener = listeners[i];\n args = args || [];\n // once stuff\n var onceListeners = this._onceEvents && this._onceEvents[ eventName ];\n\n while ( listener ) {\n var isOnce = onceListeners && onceListeners[ listener ];\n if ( isOnce ) {\n // remove listener\n // remove before trigger to prevent recursion\n this.off( eventName, listener );\n // unset once flag\n delete onceListeners[ listener ];\n }\n // trigger listener\n listener.apply( this, args );\n // get next listener\n i += isOnce ? 0 : 1;\n listener = listeners[i];\n }\n\n return this;\n};\n\nreturn EvEmitter;\n\n}));\n\n/*!\n * getSize v2.0.2\n * measure size of elements\n * MIT license\n */\n\n/*jshint browser: true, strict: true, undef: true, unused: true */\n/*global define: false, module: false, console: false */\n\n( function( window, factory ) {\n 'use strict';\n\n if ( typeof define == 'function' && define.amd ) {\n // AMD\n define( 'get-size/get-size',[],function() {\n return factory();\n });\n } else if ( typeof module == 'object' && module.exports ) {\n // CommonJS\n module.exports = factory();\n } else {\n // browser global\n window.getSize = factory();\n }\n\n})( window, function factory() {\n'use strict';\n\n// -------------------------- helpers -------------------------- //\n\n// get a number from a string, not a percentage\nfunction getStyleSize( value ) {\n var num = parseFloat( value );\n // not a percent like '100%', and a number\n var isValid = value.indexOf('%') == -1 && !isNaN( num );\n return isValid && num;\n}\n\nfunction noop() {}\n\nvar logError = typeof console == 'undefined' ? noop :\n function( message ) {\n console.error( message );\n };\n\n// -------------------------- measurements -------------------------- //\n\nvar measurements = [\n 'paddingLeft',\n 'paddingRight',\n 'paddingTop',\n 'paddingBottom',\n 'marginLeft',\n 'marginRight',\n 'marginTop',\n 'marginBottom',\n 'borderLeftWidth',\n 'borderRightWidth',\n 'borderTopWidth',\n 'borderBottomWidth'\n];\n\nvar measurementsLength = measurements.length;\n\nfunction getZeroSize() {\n var size = {\n width: 0,\n height: 0,\n innerWidth: 0,\n innerHeight: 0,\n outerWidth: 0,\n outerHeight: 0\n };\n for ( var i=0; i < measurementsLength; i++ ) {\n var measurement = measurements[i];\n size[ measurement ] = 0;\n }\n return size;\n}\n\n// -------------------------- getStyle -------------------------- //\n\n/**\n * getStyle, get style of element, check for Firefox bug\n * https://bugzilla.mozilla.org/show_bug.cgi?id=548397\n */\nfunction getStyle( elem ) {\n var style = getComputedStyle( elem );\n if ( !style ) {\n logError( 'Style returned ' + style +\n '. Are you running this code in a hidden iframe on Firefox? ' +\n 'See http://bit.ly/getsizebug1' );\n }\n return style;\n}\n\n// -------------------------- setup -------------------------- //\n\nvar isSetup = false;\n\nvar isBoxSizeOuter;\n\n/**\n * setup\n * check isBoxSizerOuter\n * do on first getSize() rather than on page load for Firefox bug\n */\nfunction setup() {\n // setup once\n if ( isSetup ) {\n return;\n }\n isSetup = true;\n\n // -------------------------- box sizing -------------------------- //\n\n /**\n * WebKit measures the outer-width on style.width on border-box elems\n * IE & Firefox<29 measures the inner-width\n */\n var div = document.createElement('div');\n div.style.width = '200px';\n div.style.padding = '1px 2px 3px 4px';\n div.style.borderStyle = 'solid';\n div.style.borderWidth = '1px 2px 3px 4px';\n div.style.boxSizing = 'border-box';\n\n var body = document.body || document.documentElement;\n body.appendChild( div );\n var style = getStyle( div );\n\n getSize.isBoxSizeOuter = isBoxSizeOuter = getStyleSize( style.width ) == 200;\n body.removeChild( div );\n\n}\n\n// -------------------------- getSize -------------------------- //\n\nfunction getSize( elem ) {\n setup();\n\n // use querySeletor if elem is string\n if ( typeof elem == 'string' ) {\n elem = document.querySelector( elem );\n }\n\n // do not proceed on non-objects\n if ( !elem || typeof elem != 'object' || !elem.nodeType ) {\n return;\n }\n\n var style = getStyle( elem );\n\n // if hidden, everything is 0\n if ( style.display == 'none' ) {\n return getZeroSize();\n }\n\n var size = {};\n size.width = elem.offsetWidth;\n size.height = elem.offsetHeight;\n\n var isBorderBox = size.isBorderBox = style.boxSizing == 'border-box';\n\n // get all measurements\n for ( var i=0; i < measurementsLength; i++ ) {\n var measurement = measurements[i];\n var value = style[ measurement ];\n var num = parseFloat( value );\n // any 'auto', 'medium' value will be 0\n size[ measurement ] = !isNaN( num ) ? num : 0;\n }\n\n var paddingWidth = size.paddingLeft + size.paddingRight;\n var paddingHeight = size.paddingTop + size.paddingBottom;\n var marginWidth = size.marginLeft + size.marginRight;\n var marginHeight = size.marginTop + size.marginBottom;\n var borderWidth = size.borderLeftWidth + size.borderRightWidth;\n var borderHeight = size.borderTopWidth + size.borderBottomWidth;\n\n var isBorderBoxSizeOuter = isBorderBox && isBoxSizeOuter;\n\n // overwrite width and height if we can get it from style\n var styleWidth = getStyleSize( style.width );\n if ( styleWidth !== false ) {\n size.width = styleWidth +\n // add padding and border unless it's already including it\n ( isBorderBoxSizeOuter ? 0 : paddingWidth + borderWidth );\n }\n\n var styleHeight = getStyleSize( style.height );\n if ( styleHeight !== false ) {\n size.height = styleHeight +\n // add padding and border unless it's already including it\n ( isBorderBoxSizeOuter ? 0 : paddingHeight + borderHeight );\n }\n\n size.innerWidth = size.width - ( paddingWidth + borderWidth );\n size.innerHeight = size.height - ( paddingHeight + borderHeight );\n\n size.outerWidth = size.width + marginWidth;\n size.outerHeight = size.height + marginHeight;\n\n return size;\n}\n\nreturn getSize;\n\n});\n\n/**\n * matchesSelector v2.0.2\n * matchesSelector( element, '.selector' )\n * MIT license\n */\n\n/*jshint browser: true, strict: true, undef: true, unused: true */\n\n( function( window, factory ) {\n /*global define: false, module: false */\n 'use strict';\n // universal module definition\n if ( typeof define == 'function' && define.amd ) {\n // AMD\n define( 'desandro-matches-selector/matches-selector',factory );\n } else if ( typeof module == 'object' && module.exports ) {\n // CommonJS\n module.exports = factory();\n } else {\n // browser global\n window.matchesSelector = factory();\n }\n\n}( window, function factory() {\n 'use strict';\n\n var matchesMethod = ( function() {\n var ElemProto = window.Element.prototype;\n // check for the standard method name first\n if ( ElemProto.matches ) {\n return 'matches';\n }\n // check un-prefixed\n if ( ElemProto.matchesSelector ) {\n return 'matchesSelector';\n }\n // check vendor prefixes\n var prefixes = [ 'webkit', 'moz', 'ms', 'o' ];\n\n for ( var i=0; i < prefixes.length; i++ ) {\n var prefix = prefixes[i];\n var method = prefix + 'MatchesSelector';\n if ( ElemProto[ method ] ) {\n return method;\n }\n }\n })();\n\n return function matchesSelector( elem, selector ) {\n return elem[ matchesMethod ]( selector );\n };\n\n}));\n\n/**\n * Fizzy UI utils v2.0.5\n * MIT license\n */\n\n/*jshint browser: true, undef: true, unused: true, strict: true */\n\n( function( window, factory ) {\n // universal module definition\n /*jshint strict: false */ /*globals define, module, require */\n\n if ( typeof define == 'function' && define.amd ) {\n // AMD\n define( 'fizzy-ui-utils/utils',[\n 'desandro-matches-selector/matches-selector'\n ], function( matchesSelector ) {\n return factory( window, matchesSelector );\n });\n } else if ( typeof module == 'object' && module.exports ) {\n // CommonJS\n module.exports = factory(\n window,\n require('desandro-matches-selector')\n );\n } else {\n // browser global\n window.fizzyUIUtils = factory(\n window,\n window.matchesSelector\n );\n }\n\n}( window, function factory( window, matchesSelector ) {\n\n\n\nvar utils = {};\n\n// ----- extend ----- //\n\n// extends objects\nutils.extend = function( a, b ) {\n for ( var prop in b ) {\n a[ prop ] = b[ prop ];\n }\n return a;\n};\n\n// ----- modulo ----- //\n\nutils.modulo = function( num, div ) {\n return ( ( num % div ) + div ) % div;\n};\n\n// ----- makeArray ----- //\n\n// turn element or nodeList into an array\nutils.makeArray = function( obj ) {\n var ary = [];\n if ( Array.isArray( obj ) ) {\n // use object if already an array\n ary = obj;\n } else if ( obj && typeof obj == 'object' &&\n typeof obj.length == 'number' ) {\n // convert nodeList to array\n for ( var i=0; i < obj.length; i++ ) {\n ary.push( obj[i] );\n }\n } else {\n // array of single index\n ary.push( obj );\n }\n return ary;\n};\n\n// ----- removeFrom ----- //\n\nutils.removeFrom = function( ary, obj ) {\n var index = ary.indexOf( obj );\n if ( index != -1 ) {\n ary.splice( index, 1 );\n }\n};\n\n// ----- getParent ----- //\n\nutils.getParent = function( elem, selector ) {\n while ( elem.parentNode && elem != document.body ) {\n elem = elem.parentNode;\n if ( matchesSelector( elem, selector ) ) {\n return elem;\n }\n }\n};\n\n// ----- getQueryElement ----- //\n\n// use element as selector string\nutils.getQueryElement = function( elem ) {\n if ( typeof elem == 'string' ) {\n return document.querySelector( elem );\n }\n return elem;\n};\n\n// ----- handleEvent ----- //\n\n// enable .ontype to trigger from .addEventListener( elem, 'type' )\nutils.handleEvent = function( event ) {\n var method = 'on' + event.type;\n if ( this[ method ] ) {\n this[ method ]( event );\n }\n};\n\n// ----- filterFindElements ----- //\n\nutils.filterFindElements = function( elems, selector ) {\n // make array of elems\n elems = utils.makeArray( elems );\n var ffElems = [];\n\n elems.forEach( function( elem ) {\n // check that elem is an actual element\n if ( !( elem instanceof HTMLElement ) ) {\n return;\n }\n // add elem if no selector\n if ( !selector ) {\n ffElems.push( elem );\n return;\n }\n // filter & find items if we have a selector\n // filter\n if ( matchesSelector( elem, selector ) ) {\n ffElems.push( elem );\n }\n // find children\n var childElems = elem.querySelectorAll( selector );\n // concat childElems to filterFound array\n for ( var i=0; i < childElems.length; i++ ) {\n ffElems.push( childElems[i] );\n }\n });\n\n return ffElems;\n};\n\n// ----- debounceMethod ----- //\n\nutils.debounceMethod = function( _class, methodName, threshold ) {\n // original method\n var method = _class.prototype[ methodName ];\n var timeoutName = methodName + 'Timeout';\n\n _class.prototype[ methodName ] = function() {\n var timeout = this[ timeoutName ];\n if ( timeout ) {\n clearTimeout( timeout );\n }\n var args = arguments;\n\n var _this = this;\n this[ timeoutName ] = setTimeout( function() {\n method.apply( _this, args );\n delete _this[ timeoutName ];\n }, threshold || 100 );\n };\n};\n\n// ----- docReady ----- //\n\nutils.docReady = function( callback ) {\n var readyState = document.readyState;\n if ( readyState == 'complete' || readyState == 'interactive' ) {\n // do async to allow for other scripts to run. metafizzy/flickity#441\n setTimeout( callback );\n } else {\n document.addEventListener( 'DOMContentLoaded', callback );\n }\n};\n\n// ----- htmlInit ----- //\n\n// http://jamesroberts.name/blog/2010/02/22/string-functions-for-javascript-trim-to-camel-case-to-dashed-and-to-underscore/\nutils.toDashed = function( str ) {\n return str.replace( /(.)([A-Z])/g, function( match, $1, $2 ) {\n return $1 + '-' + $2;\n }).toLowerCase();\n};\n\nvar console = window.console;\n/**\n * allow user to initialize classes via [data-namespace] or .js-namespace class\n * htmlInit( Widget, 'widgetName' )\n * options are parsed from data-namespace-options\n */\nutils.htmlInit = function( WidgetClass, namespace ) {\n utils.docReady( function() {\n var dashedNamespace = utils.toDashed( namespace );\n var dataAttr = 'data-' + dashedNamespace;\n var dataAttrElems = document.querySelectorAll( '[' + dataAttr + ']' );\n var jsDashElems = document.querySelectorAll( '.js-' + dashedNamespace );\n var elems = utils.makeArray( dataAttrElems )\n .concat( utils.makeArray( jsDashElems ) );\n var dataOptionsAttr = dataAttr + '-options';\n var jQuery = window.jQuery;\n\n elems.forEach( function( elem ) {\n var attr = elem.getAttribute( dataAttr ) ||\n elem.getAttribute( dataOptionsAttr );\n var options;\n try {\n options = attr && JSON.parse( attr );\n } catch ( error ) {\n // log error, do not initialize\n if ( console ) {\n console.error( 'Error parsing ' + dataAttr + ' on ' + elem.className +\n ': ' + error );\n }\n return;\n }\n // initialize\n var instance = new WidgetClass( elem, options );\n // make available via $().data('namespace')\n if ( jQuery ) {\n jQuery.data( elem, namespace, instance );\n }\n });\n\n });\n};\n\n// ----- ----- //\n\nreturn utils;\n\n}));\n\n/**\n * Outlayer Item\n */\n\n( function( window, factory ) {\n // universal module definition\n /* jshint strict: false */ /* globals define, module, require */\n if ( typeof define == 'function' && define.amd ) {\n // AMD - RequireJS\n define( 'outlayer/item',[\n 'ev-emitter/ev-emitter',\n 'get-size/get-size'\n ],\n factory\n );\n } else if ( typeof module == 'object' && module.exports ) {\n // CommonJS - Browserify, Webpack\n module.exports = factory(\n require('ev-emitter'),\n require('get-size')\n );\n } else {\n // browser global\n window.Outlayer = {};\n window.Outlayer.Item = factory(\n window.EvEmitter,\n window.getSize\n );\n }\n\n}( window, function factory( EvEmitter, getSize ) {\n'use strict';\n\n// ----- helpers ----- //\n\nfunction isEmptyObj( obj ) {\n for ( var prop in obj ) {\n return false;\n }\n prop = null;\n return true;\n}\n\n// -------------------------- CSS3 support -------------------------- //\n\n\nvar docElemStyle = document.documentElement.style;\n\nvar transitionProperty = typeof docElemStyle.transition == 'string' ?\n 'transition' : 'WebkitTransition';\nvar transformProperty = typeof docElemStyle.transform == 'string' ?\n 'transform' : 'WebkitTransform';\n\nvar transitionEndEvent = {\n WebkitTransition: 'webkitTransitionEnd',\n transition: 'transitionend'\n}[ transitionProperty ];\n\n// cache all vendor properties that could have vendor prefix\nvar vendorProperties = {\n transform: transformProperty,\n transition: transitionProperty,\n transitionDuration: transitionProperty + 'Duration',\n transitionProperty: transitionProperty + 'Property',\n transitionDelay: transitionProperty + 'Delay'\n};\n\n// -------------------------- Item -------------------------- //\n\nfunction Item( element, layout ) {\n if ( !element ) {\n return;\n }\n\n this.element = element;\n // parent layout class, i.e. Masonry, Isotope, or Packery\n this.layout = layout;\n this.position = {\n x: 0,\n y: 0\n };\n\n this._create();\n}\n\n// inherit EvEmitter\nvar proto = Item.prototype = Object.create( EvEmitter.prototype );\nproto.constructor = Item;\n\nproto._create = function() {\n // transition objects\n this._transn = {\n ingProperties: {},\n clean: {},\n onEnd: {}\n };\n\n this.css({\n position: 'absolute'\n });\n};\n\n// trigger specified handler for event type\nproto.handleEvent = function( event ) {\n var method = 'on' + event.type;\n if ( this[ method ] ) {\n this[ method ]( event );\n }\n};\n\nproto.getSize = function() {\n this.size = getSize( this.element );\n};\n\n/**\n * apply CSS styles to element\n * @param {Object} style\n */\nproto.css = function( style ) {\n var elemStyle = this.element.style;\n\n for ( var prop in style ) {\n // use vendor property if available\n var supportedProp = vendorProperties[ prop ] || prop;\n elemStyle[ supportedProp ] = style[ prop ];\n }\n};\n\n // measure position, and sets it\nproto.getPosition = function() {\n var style = getComputedStyle( this.element );\n var isOriginLeft = this.layout._getOption('originLeft');\n var isOriginTop = this.layout._getOption('originTop');\n var xValue = style[ isOriginLeft ? 'left' : 'right' ];\n var yValue = style[ isOriginTop ? 'top' : 'bottom' ];\n // convert percent to pixels\n var layoutSize = this.layout.size;\n var x = xValue.indexOf('%') != -1 ?\n ( parseFloat( xValue ) / 100 ) * layoutSize.width : parseInt( xValue, 10 );\n var y = yValue.indexOf('%') != -1 ?\n ( parseFloat( yValue ) / 100 ) * layoutSize.height : parseInt( yValue, 10 );\n\n // clean up 'auto' or other non-integer values\n x = isNaN( x ) ? 0 : x;\n y = isNaN( y ) ? 0 : y;\n // remove padding from measurement\n x -= isOriginLeft ? layoutSize.paddingLeft : layoutSize.paddingRight;\n y -= isOriginTop ? layoutSize.paddingTop : layoutSize.paddingBottom;\n\n this.position.x = x;\n this.position.y = y;\n};\n\n// set settled position, apply padding\nproto.layoutPosition = function() {\n var layoutSize = this.layout.size;\n var style = {};\n var isOriginLeft = this.layout._getOption('originLeft');\n var isOriginTop = this.layout._getOption('originTop');\n\n // x\n var xPadding = isOriginLeft ? 'paddingLeft' : 'paddingRight';\n var xProperty = isOriginLeft ? 'left' : 'right';\n var xResetProperty = isOriginLeft ? 'right' : 'left';\n\n var x = this.position.x + layoutSize[ xPadding ];\n // set in percentage or pixels\n style[ xProperty ] = this.getXValue( x );\n // reset other property\n style[ xResetProperty ] = '';\n\n // y\n var yPadding = isOriginTop ? 'paddingTop' : 'paddingBottom';\n var yProperty = isOriginTop ? 'top' : 'bottom';\n var yResetProperty = isOriginTop ? 'bottom' : 'top';\n\n var y = this.position.y + layoutSize[ yPadding ];\n // set in percentage or pixels\n style[ yProperty ] = this.getYValue( y );\n // reset other property\n style[ yResetProperty ] = '';\n\n this.css( style );\n this.emitEvent( 'layout', [ this ] );\n};\n\nproto.getXValue = function( x ) {\n var isHorizontal = this.layout._getOption('horizontal');\n return this.layout.options.percentPosition && !isHorizontal ?\n ( ( x / this.layout.size.width ) * 100 ) + '%' : x + 'px';\n};\n\nproto.getYValue = function( y ) {\n var isHorizontal = this.layout._getOption('horizontal');\n return this.layout.options.percentPosition && isHorizontal ?\n ( ( y / this.layout.size.height ) * 100 ) + '%' : y + 'px';\n};\n\nproto._transitionTo = function( x, y ) {\n this.getPosition();\n // get current x & y from top/left\n var curX = this.position.x;\n var curY = this.position.y;\n\n var compareX = parseInt( x, 10 );\n var compareY = parseInt( y, 10 );\n var didNotMove = compareX === this.position.x && compareY === this.position.y;\n\n // save end position\n this.setPosition( x, y );\n\n // if did not move and not transitioning, just go to layout\n if ( didNotMove && !this.isTransitioning ) {\n this.layoutPosition();\n return;\n }\n\n var transX = x - curX;\n var transY = y - curY;\n var transitionStyle = {};\n transitionStyle.transform = this.getTranslate( transX, transY );\n\n this.transition({\n to: transitionStyle,\n onTransitionEnd: {\n transform: this.layoutPosition\n },\n isCleaning: true\n });\n};\n\nproto.getTranslate = function( x, y ) {\n // flip cooridinates if origin on right or bottom\n var isOriginLeft = this.layout._getOption('originLeft');\n var isOriginTop = this.layout._getOption('originTop');\n x = isOriginLeft ? x : -x;\n y = isOriginTop ? y : -y;\n return 'translate3d(' + x + 'px, ' + y + 'px, 0)';\n};\n\n// non transition + transform support\nproto.goTo = function( x, y ) {\n this.setPosition( x, y );\n this.layoutPosition();\n};\n\nproto.moveTo = proto._transitionTo;\n\nproto.setPosition = function( x, y ) {\n this.position.x = parseInt( x, 10 );\n this.position.y = parseInt( y, 10 );\n};\n\n// ----- transition ----- //\n\n/**\n * @param {Object} style - CSS\n * @param {Function} onTransitionEnd\n */\n\n// non transition, just trigger callback\nproto._nonTransition = function( args ) {\n this.css( args.to );\n if ( args.isCleaning ) {\n this._removeStyles( args.to );\n }\n for ( var prop in args.onTransitionEnd ) {\n args.onTransitionEnd[ prop ].call( this );\n }\n};\n\n/**\n * proper transition\n * @param {Object} args - arguments\n * @param {Object} to - style to transition to\n * @param {Object} from - style to start transition from\n * @param {Boolean} isCleaning - removes transition styles after transition\n * @param {Function} onTransitionEnd - callback\n */\nproto.transition = function( args ) {\n // redirect to nonTransition if no transition duration\n if ( !parseFloat( this.layout.options.transitionDuration ) ) {\n this._nonTransition( args );\n return;\n }\n\n var _transition = this._transn;\n // keep track of onTransitionEnd callback by css property\n for ( var prop in args.onTransitionEnd ) {\n _transition.onEnd[ prop ] = args.onTransitionEnd[ prop ];\n }\n // keep track of properties that are transitioning\n for ( prop in args.to ) {\n _transition.ingProperties[ prop ] = true;\n // keep track of properties to clean up when transition is done\n if ( args.isCleaning ) {\n _transition.clean[ prop ] = true;\n }\n }\n\n // set from styles\n if ( args.from ) {\n this.css( args.from );\n // force redraw. http://blog.alexmaccaw.com/css-transitions\n var h = this.element.offsetHeight;\n // hack for JSHint to hush about unused var\n h = null;\n }\n // enable transition\n this.enableTransition( args.to );\n // set styles that are transitioning\n this.css( args.to );\n\n this.isTransitioning = true;\n\n};\n\n// dash before all cap letters, including first for\n// WebkitTransform => -webkit-transform\nfunction toDashedAll( str ) {\n return str.replace( /([A-Z])/g, function( $1 ) {\n return '-' + $1.toLowerCase();\n });\n}\n\nvar transitionProps = 'opacity,' + toDashedAll( transformProperty );\n\nproto.enableTransition = function(/* style */) {\n // HACK changing transitionProperty during a transition\n // will cause transition to jump\n if ( this.isTransitioning ) {\n return;\n }\n\n // make `transition: foo, bar, baz` from style object\n // HACK un-comment this when enableTransition can work\n // while a transition is happening\n // var transitionValues = [];\n // for ( var prop in style ) {\n // // dash-ify camelCased properties like WebkitTransition\n // prop = vendorProperties[ prop ] || prop;\n // transitionValues.push( toDashedAll( prop ) );\n // }\n // munge number to millisecond, to match stagger\n var duration = this.layout.options.transitionDuration;\n duration = typeof duration == 'number' ? duration + 'ms' : duration;\n // enable transition styles\n this.css({\n transitionProperty: transitionProps,\n transitionDuration: duration,\n transitionDelay: this.staggerDelay || 0\n });\n // listen for transition end event\n this.element.addEventListener( transitionEndEvent, this, false );\n};\n\n// ----- events ----- //\n\nproto.onwebkitTransitionEnd = function( event ) {\n this.ontransitionend( event );\n};\n\nproto.onotransitionend = function( event ) {\n this.ontransitionend( event );\n};\n\n// properties that I munge to make my life easier\nvar dashedVendorProperties = {\n '-webkit-transform': 'transform'\n};\n\nproto.ontransitionend = function( event ) {\n // disregard bubbled events from children\n if ( event.target !== this.element ) {\n return;\n }\n var _transition = this._transn;\n // get property name of transitioned property, convert to prefix-free\n var propertyName = dashedVendorProperties[ event.propertyName ] || event.propertyName;\n\n // remove property that has completed transitioning\n delete _transition.ingProperties[ propertyName ];\n // check if any properties are still transitioning\n if ( isEmptyObj( _transition.ingProperties ) ) {\n // all properties have completed transitioning\n this.disableTransition();\n }\n // clean style\n if ( propertyName in _transition.clean ) {\n // clean up style\n this.element.style[ event.propertyName ] = '';\n delete _transition.clean[ propertyName ];\n }\n // trigger onTransitionEnd callback\n if ( propertyName in _transition.onEnd ) {\n var onTransitionEnd = _transition.onEnd[ propertyName ];\n onTransitionEnd.call( this );\n delete _transition.onEnd[ propertyName ];\n }\n\n this.emitEvent( 'transitionEnd', [ this ] );\n};\n\nproto.disableTransition = function() {\n this.removeTransitionStyles();\n this.element.removeEventListener( transitionEndEvent, this, false );\n this.isTransitioning = false;\n};\n\n/**\n * removes style property from element\n * @param {Object} style\n**/\nproto._removeStyles = function( style ) {\n // clean up transition styles\n var cleanStyle = {};\n for ( var prop in style ) {\n cleanStyle[ prop ] = '';\n }\n this.css( cleanStyle );\n};\n\nvar cleanTransitionStyle = {\n transitionProperty: '',\n transitionDuration: '',\n transitionDelay: ''\n};\n\nproto.removeTransitionStyles = function() {\n // remove transition\n this.css( cleanTransitionStyle );\n};\n\n// ----- stagger ----- //\n\nproto.stagger = function( delay ) {\n delay = isNaN( delay ) ? 0 : delay;\n this.staggerDelay = delay + 'ms';\n};\n\n// ----- show/hide/remove ----- //\n\n// remove element from DOM\nproto.removeElem = function() {\n this.element.parentNode.removeChild( this.element );\n // remove display: none\n this.css({ display: '' });\n this.emitEvent( 'remove', [ this ] );\n};\n\nproto.remove = function() {\n // just remove element if no transition support or no transition\n if ( !transitionProperty || !parseFloat( this.layout.options.transitionDuration ) ) {\n this.removeElem();\n return;\n }\n\n // start transition\n this.once( 'transitionEnd', function() {\n this.removeElem();\n });\n this.hide();\n};\n\nproto.reveal = function() {\n delete this.isHidden;\n // remove display: none\n this.css({ display: '' });\n\n var options = this.layout.options;\n\n var onTransitionEnd = {};\n var transitionEndProperty = this.getHideRevealTransitionEndProperty('visibleStyle');\n onTransitionEnd[ transitionEndProperty ] = this.onRevealTransitionEnd;\n\n this.transition({\n from: options.hiddenStyle,\n to: options.visibleStyle,\n isCleaning: true,\n onTransitionEnd: onTransitionEnd\n });\n};\n\nproto.onRevealTransitionEnd = function() {\n // check if still visible\n // during transition, item may have been hidden\n if ( !this.isHidden ) {\n this.emitEvent('reveal');\n }\n};\n\n/**\n * get style property use for hide/reveal transition end\n * @param {String} styleProperty - hiddenStyle/visibleStyle\n * @returns {String}\n */\nproto.getHideRevealTransitionEndProperty = function( styleProperty ) {\n var optionStyle = this.layout.options[ styleProperty ];\n // use opacity\n if ( optionStyle.opacity ) {\n return 'opacity';\n }\n // get first property\n for ( var prop in optionStyle ) {\n return prop;\n }\n};\n\nproto.hide = function() {\n // set flag\n this.isHidden = true;\n // remove display: none\n this.css({ display: '' });\n\n var options = this.layout.options;\n\n var onTransitionEnd = {};\n var transitionEndProperty = this.getHideRevealTransitionEndProperty('hiddenStyle');\n onTransitionEnd[ transitionEndProperty ] = this.onHideTransitionEnd;\n\n this.transition({\n from: options.visibleStyle,\n to: options.hiddenStyle,\n // keep hidden stuff hidden\n isCleaning: true,\n onTransitionEnd: onTransitionEnd\n });\n};\n\nproto.onHideTransitionEnd = function() {\n // check if still hidden\n // during transition, item may have been un-hidden\n if ( this.isHidden ) {\n this.css({ display: 'none' });\n this.emitEvent('hide');\n }\n};\n\nproto.destroy = function() {\n this.css({\n position: '',\n left: '',\n right: '',\n top: '',\n bottom: '',\n transition: '',\n transform: ''\n });\n};\n\nreturn Item;\n\n}));\n\n/*!\n * Outlayer v2.1.0\n * the brains and guts of a layout library\n * MIT license\n */\n\n( function( window, factory ) {\n 'use strict';\n // universal module definition\n /* jshint strict: false */ /* globals define, module, require */\n if ( typeof define == 'function' && define.amd ) {\n // AMD - RequireJS\n define( 'outlayer/outlayer',[\n 'ev-emitter/ev-emitter',\n 'get-size/get-size',\n 'fizzy-ui-utils/utils',\n './item'\n ],\n function( EvEmitter, getSize, utils, Item ) {\n return factory( window, EvEmitter, getSize, utils, Item);\n }\n );\n } else if ( typeof module == 'object' && module.exports ) {\n // CommonJS - Browserify, Webpack\n module.exports = factory(\n window,\n require('ev-emitter'),\n require('get-size'),\n require('fizzy-ui-utils'),\n require('./item')\n );\n } else {\n // browser global\n window.Outlayer = factory(\n window,\n window.EvEmitter,\n window.getSize,\n window.fizzyUIUtils,\n window.Outlayer.Item\n );\n }\n\n}( window, function factory( window, EvEmitter, getSize, utils, Item ) {\n'use strict';\n\n// ----- vars ----- //\n\nvar console = window.console;\nvar jQuery = window.jQuery;\nvar noop = function() {};\n\n// -------------------------- Outlayer -------------------------- //\n\n// globally unique identifiers\nvar GUID = 0;\n// internal store of all Outlayer intances\nvar instances = {};\n\n\n/**\n * @param {Element, String} element\n * @param {Object} options\n * @constructor\n */\nfunction Outlayer( element, options ) {\n var queryElement = utils.getQueryElement( element );\n if ( !queryElement ) {\n if ( console ) {\n console.error( 'Bad element for ' + this.constructor.namespace +\n ': ' + ( queryElement || element ) );\n }\n return;\n }\n this.element = queryElement;\n // add jQuery\n if ( jQuery ) {\n this.$element = jQuery( this.element );\n }\n\n // options\n this.options = utils.extend( {}, this.constructor.defaults );\n this.option( options );\n\n // add id for Outlayer.getFromElement\n var id = ++GUID;\n this.element.outlayerGUID = id; // expando\n instances[ id ] = this; // associate via id\n\n // kick it off\n this._create();\n\n var isInitLayout = this._getOption('initLayout');\n if ( isInitLayout ) {\n this.layout();\n }\n}\n\n// settings are for internal use only\nOutlayer.namespace = 'outlayer';\nOutlayer.Item = Item;\n\n// default options\nOutlayer.defaults = {\n containerStyle: {\n position: 'relative'\n },\n initLayout: true,\n originLeft: true,\n originTop: true,\n resize: true,\n resizeContainer: true,\n // item options\n transitionDuration: '0.4s',\n hiddenStyle: {\n opacity: 0,\n transform: 'scale(0.001)'\n },\n visibleStyle: {\n opacity: 1,\n transform: 'scale(1)'\n }\n};\n\nvar proto = Outlayer.prototype;\n// inherit EvEmitter\nutils.extend( proto, EvEmitter.prototype );\n\n/**\n * set options\n * @param {Object} opts\n */\nproto.option = function( opts ) {\n utils.extend( this.options, opts );\n};\n\n/**\n * get backwards compatible option value, check old name\n */\nproto._getOption = function( option ) {\n var oldOption = this.constructor.compatOptions[ option ];\n return oldOption && this.options[ oldOption ] !== undefined ?\n this.options[ oldOption ] : this.options[ option ];\n};\n\nOutlayer.compatOptions = {\n // currentName: oldName\n initLayout: 'isInitLayout',\n horizontal: 'isHorizontal',\n layoutInstant: 'isLayoutInstant',\n originLeft: 'isOriginLeft',\n originTop: 'isOriginTop',\n resize: 'isResizeBound',\n resizeContainer: 'isResizingContainer'\n};\n\nproto._create = function() {\n // get items from children\n this.reloadItems();\n // elements that affect layout, but are not laid out\n this.stamps = [];\n this.stamp( this.options.stamp );\n // set container style\n utils.extend( this.element.style, this.options.containerStyle );\n\n // bind resize method\n var canBindResize = this._getOption('resize');\n if ( canBindResize ) {\n this.bindResize();\n }\n};\n\n// goes through all children again and gets bricks in proper order\nproto.reloadItems = function() {\n // collection of item elements\n this.items = this._itemize( this.element.children );\n};\n\n\n/**\n * turn elements into Outlayer.Items to be used in layout\n * @param {Array or NodeList or HTMLElement} elems\n * @returns {Array} items - collection of new Outlayer Items\n */\nproto._itemize = function( elems ) {\n\n var itemElems = this._filterFindItemElements( elems );\n var Item = this.constructor.Item;\n\n // create new Outlayer Items for collection\n var items = [];\n for ( var i=0; i < itemElems.length; i++ ) {\n var elem = itemElems[i];\n var item = new Item( elem, this );\n items.push( item );\n }\n\n return items;\n};\n\n/**\n * get item elements to be used in layout\n * @param {Array or NodeList or HTMLElement} elems\n * @returns {Array} items - item elements\n */\nproto._filterFindItemElements = function( elems ) {\n return utils.filterFindElements( elems, this.options.itemSelector );\n};\n\n/**\n * getter method for getting item elements\n * @returns {Array} elems - collection of item elements\n */\nproto.getItemElements = function() {\n return this.items.map( function( item ) {\n return item.element;\n });\n};\n\n// ----- init & layout ----- //\n\n/**\n * lays out all items\n */\nproto.layout = function() {\n this._resetLayout();\n this._manageStamps();\n\n // don't animate first layout\n var layoutInstant = this._getOption('layoutInstant');\n var isInstant = layoutInstant !== undefined ?\n layoutInstant : !this._isLayoutInited;\n this.layoutItems( this.items, isInstant );\n\n // flag for initalized\n this._isLayoutInited = true;\n};\n\n// _init is alias for layout\nproto._init = proto.layout;\n\n/**\n * logic before any new layout\n */\nproto._resetLayout = function() {\n this.getSize();\n};\n\n\nproto.getSize = function() {\n this.size = getSize( this.element );\n};\n\n/**\n * get measurement from option, for columnWidth, rowHeight, gutter\n * if option is String -> get element from selector string, & get size of element\n * if option is Element -> get size of element\n * else use option as a number\n *\n * @param {String} measurement\n * @param {String} size - width or height\n * @private\n */\nproto._getMeasurement = function( measurement, size ) {\n var option = this.options[ measurement ];\n var elem;\n if ( !option ) {\n // default to 0\n this[ measurement ] = 0;\n } else {\n // use option as an element\n if ( typeof option == 'string' ) {\n elem = this.element.querySelector( option );\n } else if ( option instanceof HTMLElement ) {\n elem = option;\n }\n // use size of element, if element\n this[ measurement ] = elem ? getSize( elem )[ size ] : option;\n }\n};\n\n/**\n * layout a collection of item elements\n * @api public\n */\nproto.layoutItems = function( items, isInstant ) {\n items = this._getItemsForLayout( items );\n\n this._layoutItems( items, isInstant );\n\n this._postLayout();\n};\n\n/**\n * get the items to be laid out\n * you may want to skip over some items\n * @param {Array} items\n * @returns {Array} items\n */\nproto._getItemsForLayout = function( items ) {\n return items.filter( function( item ) {\n return !item.isIgnored;\n });\n};\n\n/**\n * layout items\n * @param {Array} items\n * @param {Boolean} isInstant\n */\nproto._layoutItems = function( items, isInstant ) {\n this._emitCompleteOnItems( 'layout', items );\n\n if ( !items || !items.length ) {\n // no items, emit event with empty array\n return;\n }\n\n var queue = [];\n\n items.forEach( function( item ) {\n // get x/y object from method\n var position = this._getItemLayoutPosition( item );\n // enqueue\n position.item = item;\n position.isInstant = isInstant || item.isLayoutInstant;\n queue.push( position );\n }, this );\n\n this._processLayoutQueue( queue );\n};\n\n/**\n * get item layout position\n * @param {Outlayer.Item} item\n * @returns {Object} x and y position\n */\nproto._getItemLayoutPosition = function( /* item */ ) {\n return {\n x: 0,\n y: 0\n };\n};\n\n/**\n * iterate over array and position each item\n * Reason being - separating this logic prevents 'layout invalidation'\n * thx @paul_irish\n * @param {Array} queue\n */\nproto._processLayoutQueue = function( queue ) {\n this.updateStagger();\n queue.forEach( function( obj, i ) {\n this._positionItem( obj.item, obj.x, obj.y, obj.isInstant, i );\n }, this );\n};\n\n// set stagger from option in milliseconds number\nproto.updateStagger = function() {\n var stagger = this.options.stagger;\n if ( stagger === null || stagger === undefined ) {\n this.stagger = 0;\n return;\n }\n this.stagger = getMilliseconds( stagger );\n return this.stagger;\n};\n\n/**\n * Sets position of item in DOM\n * @param {Outlayer.Item} item\n * @param {Number} x - horizontal position\n * @param {Number} y - vertical position\n * @param {Boolean} isInstant - disables transitions\n */\nproto._positionItem = function( item, x, y, isInstant, i ) {\n if ( isInstant ) {\n // if not transition, just set CSS\n item.goTo( x, y );\n } else {\n item.stagger( i * this.stagger );\n item.moveTo( x, y );\n }\n};\n\n/**\n * Any logic you want to do after each layout,\n * i.e. size the container\n */\nproto._postLayout = function() {\n this.resizeContainer();\n};\n\nproto.resizeContainer = function() {\n var isResizingContainer = this._getOption('resizeContainer');\n if ( !isResizingContainer ) {\n return;\n }\n var size = this._getContainerSize();\n if ( size ) {\n this._setContainerMeasure( size.width, true );\n this._setContainerMeasure( size.height, false );\n }\n};\n\n/**\n * Sets width or height of container if returned\n * @returns {Object} size\n * @param {Number} width\n * @param {Number} height\n */\nproto._getContainerSize = noop;\n\n/**\n * @param {Number} measure - size of width or height\n * @param {Boolean} isWidth\n */\nproto._setContainerMeasure = function( measure, isWidth ) {\n if ( measure === undefined ) {\n return;\n }\n\n var elemSize = this.size;\n // add padding and border width if border box\n if ( elemSize.isBorderBox ) {\n measure += isWidth ? elemSize.paddingLeft + elemSize.paddingRight +\n elemSize.borderLeftWidth + elemSize.borderRightWidth :\n elemSize.paddingBottom + elemSize.paddingTop +\n elemSize.borderTopWidth + elemSize.borderBottomWidth;\n }\n\n measure = Math.max( measure, 0 );\n this.element.style[ isWidth ? 'width' : 'height' ] = measure + 'px';\n};\n\n/**\n * emit eventComplete on a collection of items events\n * @param {String} eventName\n * @param {Array} items - Outlayer.Items\n */\nproto._emitCompleteOnItems = function( eventName, items ) {\n var _this = this;\n function onComplete() {\n _this.dispatchEvent( eventName + 'Complete', null, [ items ] );\n }\n\n var count = items.length;\n if ( !items || !count ) {\n onComplete();\n return;\n }\n\n var doneCount = 0;\n function tick() {\n doneCount++;\n if ( doneCount == count ) {\n onComplete();\n }\n }\n\n // bind callback\n items.forEach( function( item ) {\n item.once( eventName, tick );\n });\n};\n\n/**\n * emits events via EvEmitter and jQuery events\n * @param {String} type - name of event\n * @param {Event} event - original event\n * @param {Array} args - extra arguments\n */\nproto.dispatchEvent = function( type, event, args ) {\n // add original event to arguments\n var emitArgs = event ? [ event ].concat( args ) : args;\n this.emitEvent( type, emitArgs );\n\n if ( jQuery ) {\n // set this.$element\n this.$element = this.$element || jQuery( this.element );\n if ( event ) {\n // create jQuery event\n var $event = jQuery.Event( event );\n $event.type = type;\n this.$element.trigger( $event, args );\n } else {\n // just trigger with type if no event available\n this.$element.trigger( type, args );\n }\n }\n};\n\n// -------------------------- ignore & stamps -------------------------- //\n\n\n/**\n * keep item in collection, but do not lay it out\n * ignored items do not get skipped in layout\n * @param {Element} elem\n */\nproto.ignore = function( elem ) {\n var item = this.getItem( elem );\n if ( item ) {\n item.isIgnored = true;\n }\n};\n\n/**\n * return item to layout collection\n * @param {Element} elem\n */\nproto.unignore = function( elem ) {\n var item = this.getItem( elem );\n if ( item ) {\n delete item.isIgnored;\n }\n};\n\n/**\n * adds elements to stamps\n * @param {NodeList, Array, Element, or String} elems\n */\nproto.stamp = function( elems ) {\n elems = this._find( elems );\n if ( !elems ) {\n return;\n }\n\n this.stamps = this.stamps.concat( elems );\n // ignore\n elems.forEach( this.ignore, this );\n};\n\n/**\n * removes elements to stamps\n * @param {NodeList, Array, or Element} elems\n */\nproto.unstamp = function( elems ) {\n elems = this._find( elems );\n if ( !elems ){\n return;\n }\n\n elems.forEach( function( elem ) {\n // filter out removed stamp elements\n utils.removeFrom( this.stamps, elem );\n this.unignore( elem );\n }, this );\n};\n\n/**\n * finds child elements\n * @param {NodeList, Array, Element, or String} elems\n * @returns {Array} elems\n */\nproto._find = function( elems ) {\n if ( !elems ) {\n return;\n }\n // if string, use argument as selector string\n if ( typeof elems == 'string' ) {\n elems = this.element.querySelectorAll( elems );\n }\n elems = utils.makeArray( elems );\n return elems;\n};\n\nproto._manageStamps = function() {\n if ( !this.stamps || !this.stamps.length ) {\n return;\n }\n\n this._getBoundingRect();\n\n this.stamps.forEach( this._manageStamp, this );\n};\n\n// update boundingLeft / Top\nproto._getBoundingRect = function() {\n // get bounding rect for container element\n var boundingRect = this.element.getBoundingClientRect();\n var size = this.size;\n this._boundingRect = {\n left: boundingRect.left + size.paddingLeft + size.borderLeftWidth,\n top: boundingRect.top + size.paddingTop + size.borderTopWidth,\n right: boundingRect.right - ( size.paddingRight + size.borderRightWidth ),\n bottom: boundingRect.bottom - ( size.paddingBottom + size.borderBottomWidth )\n };\n};\n\n/**\n * @param {Element} stamp\n**/\nproto._manageStamp = noop;\n\n/**\n * get x/y position of element relative to container element\n * @param {Element} elem\n * @returns {Object} offset - has left, top, right, bottom\n */\nproto._getElementOffset = function( elem ) {\n var boundingRect = elem.getBoundingClientRect();\n var thisRect = this._boundingRect;\n var size = getSize( elem );\n var offset = {\n left: boundingRect.left - thisRect.left - size.marginLeft,\n top: boundingRect.top - thisRect.top - size.marginTop,\n right: thisRect.right - boundingRect.right - size.marginRight,\n bottom: thisRect.bottom - boundingRect.bottom - size.marginBottom\n };\n return offset;\n};\n\n// -------------------------- resize -------------------------- //\n\n// enable event handlers for listeners\n// i.e. resize -> onresize\nproto.handleEvent = utils.handleEvent;\n\n/**\n * Bind layout to window resizing\n */\nproto.bindResize = function() {\n window.addEventListener( 'resize', this );\n this.isResizeBound = true;\n};\n\n/**\n * Unbind layout to window resizing\n */\nproto.unbindResize = function() {\n window.removeEventListener( 'resize', this );\n this.isResizeBound = false;\n};\n\nproto.onresize = function() {\n this.resize();\n};\n\nutils.debounceMethod( Outlayer, 'onresize', 100 );\n\nproto.resize = function() {\n // don't trigger if size did not change\n // or if resize was unbound. See #9\n if ( !this.isResizeBound || !this.needsResizeLayout() ) {\n return;\n }\n\n this.layout();\n};\n\n/**\n * check if layout is needed post layout\n * @returns Boolean\n */\nproto.needsResizeLayout = function() {\n var size = getSize( this.element );\n // check that this.size and size are there\n // IE8 triggers resize on body size change, so they might not be\n var hasSizes = this.size && size;\n return hasSizes && size.innerWidth !== this.size.innerWidth;\n};\n\n// -------------------------- methods -------------------------- //\n\n/**\n * add items to Outlayer instance\n * @param {Array or NodeList or Element} elems\n * @returns {Array} items - Outlayer.Items\n**/\nproto.addItems = function( elems ) {\n var items = this._itemize( elems );\n // add items to collection\n if ( items.length ) {\n this.items = this.items.concat( items );\n }\n return items;\n};\n\n/**\n * Layout newly-appended item elements\n * @param {Array or NodeList or Element} elems\n */\nproto.appended = function( elems ) {\n var items = this.addItems( elems );\n if ( !items.length ) {\n return;\n }\n // layout and reveal just the new items\n this.layoutItems( items, true );\n this.reveal( items );\n};\n\n/**\n * Layout prepended elements\n * @param {Array or NodeList or Element} elems\n */\nproto.prepended = function( elems ) {\n var items = this._itemize( elems );\n if ( !items.length ) {\n return;\n }\n // add items to beginning of collection\n var previousItems = this.items.slice(0);\n this.items = items.concat( previousItems );\n // start new layout\n this._resetLayout();\n this._manageStamps();\n // layout new stuff without transition\n this.layoutItems( items, true );\n this.reveal( items );\n // layout previous items\n this.layoutItems( previousItems );\n};\n\n/**\n * reveal a collection of items\n * @param {Array of Outlayer.Items} items\n */\nproto.reveal = function( items ) {\n this._emitCompleteOnItems( 'reveal', items );\n if ( !items || !items.length ) {\n return;\n }\n var stagger = this.updateStagger();\n items.forEach( function( item, i ) {\n item.stagger( i * stagger );\n item.reveal();\n });\n};\n\n/**\n * hide a collection of items\n * @param {Array of Outlayer.Items} items\n */\nproto.hide = function( items ) {\n this._emitCompleteOnItems( 'hide', items );\n if ( !items || !items.length ) {\n return;\n }\n var stagger = this.updateStagger();\n items.forEach( function( item, i ) {\n item.stagger( i * stagger );\n item.hide();\n });\n};\n\n/**\n * reveal item elements\n * @param {Array}, {Element}, {NodeList} items\n */\nproto.revealItemElements = function( elems ) {\n var items = this.getItems( elems );\n this.reveal( items );\n};\n\n/**\n * hide item elements\n * @param {Array}, {Element}, {NodeList} items\n */\nproto.hideItemElements = function( elems ) {\n var items = this.getItems( elems );\n this.hide( items );\n};\n\n/**\n * get Outlayer.Item, given an Element\n * @param {Element} elem\n * @param {Function} callback\n * @returns {Outlayer.Item} item\n */\nproto.getItem = function( elem ) {\n // loop through items to get the one that matches\n for ( var i=0; i < this.items.length; i++ ) {\n var item = this.items[i];\n if ( item.element == elem ) {\n // return item\n return item;\n }\n }\n};\n\n/**\n * get collection of Outlayer.Items, given Elements\n * @param {Array} elems\n * @returns {Array} items - Outlayer.Items\n */\nproto.getItems = function( elems ) {\n elems = utils.makeArray( elems );\n var items = [];\n elems.forEach( function( elem ) {\n var item = this.getItem( elem );\n if ( item ) {\n items.push( item );\n }\n }, this );\n\n return items;\n};\n\n/**\n * remove element(s) from instance and DOM\n * @param {Array or NodeList or Element} elems\n */\nproto.remove = function( elems ) {\n var removeItems = this.getItems( elems );\n\n this._emitCompleteOnItems( 'remove', removeItems );\n\n // bail if no items to remove\n if ( !removeItems || !removeItems.length ) {\n return;\n }\n\n removeItems.forEach( function( item ) {\n item.remove();\n // remove item from collection\n utils.removeFrom( this.items, item );\n }, this );\n};\n\n// ----- destroy ----- //\n\n// remove and disable Outlayer instance\nproto.destroy = function() {\n // clean up dynamic styles\n var style = this.element.style;\n style.height = '';\n style.position = '';\n style.width = '';\n // destroy items\n this.items.forEach( function( item ) {\n item.destroy();\n });\n\n this.unbindResize();\n\n var id = this.element.outlayerGUID;\n delete instances[ id ]; // remove reference to instance by id\n delete this.element.outlayerGUID;\n // remove data for jQuery\n if ( jQuery ) {\n jQuery.removeData( this.element, this.constructor.namespace );\n }\n\n};\n\n// -------------------------- data -------------------------- //\n\n/**\n * get Outlayer instance from element\n * @param {Element} elem\n * @returns {Outlayer}\n */\nOutlayer.data = function( elem ) {\n elem = utils.getQueryElement( elem );\n var id = elem && elem.outlayerGUID;\n return id && instances[ id ];\n};\n\n\n// -------------------------- create Outlayer class -------------------------- //\n\n/**\n * create a layout class\n * @param {String} namespace\n */\nOutlayer.create = function( namespace, options ) {\n // sub-class Outlayer\n var Layout = subclass( Outlayer );\n // apply new options and compatOptions\n Layout.defaults = utils.extend( {}, Outlayer.defaults );\n utils.extend( Layout.defaults, options );\n Layout.compatOptions = utils.extend( {}, Outlayer.compatOptions );\n\n Layout.namespace = namespace;\n\n Layout.data = Outlayer.data;\n\n // sub-class Item\n Layout.Item = subclass( Item );\n\n // -------------------------- declarative -------------------------- //\n\n utils.htmlInit( Layout, namespace );\n\n // -------------------------- jQuery bridge -------------------------- //\n\n // make into jQuery plugin\n if ( jQuery && jQuery.bridget ) {\n jQuery.bridget( namespace, Layout );\n }\n\n return Layout;\n};\n\nfunction subclass( Parent ) {\n function SubClass() {\n Parent.apply( this, arguments );\n }\n\n SubClass.prototype = Object.create( Parent.prototype );\n SubClass.prototype.constructor = SubClass;\n\n return SubClass;\n}\n\n// ----- helpers ----- //\n\n// how many milliseconds are in each unit\nvar msUnits = {\n ms: 1,\n s: 1000\n};\n\n// munge time-like parameter into millisecond number\n// '0.4s' -> 40\nfunction getMilliseconds( time ) {\n if ( typeof time == 'number' ) {\n return time;\n }\n var matches = time.match( /(^\\d*\\.?\\d*)(\\w*)/ );\n var num = matches && matches[1];\n var unit = matches && matches[2];\n if ( !num.length ) {\n return 0;\n }\n num = parseFloat( num );\n var mult = msUnits[ unit ] || 1;\n return num * mult;\n}\n\n// ----- fin ----- //\n\n// back in global\nOutlayer.Item = Item;\n\nreturn Outlayer;\n\n}));\n\n/**\n * Isotope Item\n**/\n\n( function( window, factory ) {\n // universal module definition\n /* jshint strict: false */ /*globals define, module, require */\n if ( typeof define == 'function' && define.amd ) {\n // AMD\n define( 'isotope/js/item',[\n 'outlayer/outlayer'\n ],\n factory );\n } else if ( typeof module == 'object' && module.exports ) {\n // CommonJS\n module.exports = factory(\n require('outlayer')\n );\n } else {\n // browser global\n window.Isotope = window.Isotope || {};\n window.Isotope.Item = factory(\n window.Outlayer\n );\n }\n\n}( window, function factory( Outlayer ) {\n'use strict';\n\n// -------------------------- Item -------------------------- //\n\n// sub-class Outlayer Item\nfunction Item() {\n Outlayer.Item.apply( this, arguments );\n}\n\nvar proto = Item.prototype = Object.create( Outlayer.Item.prototype );\n\nvar _create = proto._create;\nproto._create = function() {\n // assign id, used for original-order sorting\n this.id = this.layout.itemGUID++;\n _create.call( this );\n this.sortData = {};\n};\n\nproto.updateSortData = function() {\n if ( this.isIgnored ) {\n return;\n }\n // default sorters\n this.sortData.id = this.id;\n // for backward compatibility\n this.sortData['original-order'] = this.id;\n this.sortData.random = Math.random();\n // go thru getSortData obj and apply the sorters\n var getSortData = this.layout.options.getSortData;\n var sorters = this.layout._sorters;\n for ( var key in getSortData ) {\n var sorter = sorters[ key ];\n this.sortData[ key ] = sorter( this.element, this );\n }\n};\n\nvar _destroy = proto.destroy;\nproto.destroy = function() {\n // call super\n _destroy.apply( this, arguments );\n // reset display, #741\n this.css({\n display: ''\n });\n};\n\nreturn Item;\n\n}));\n\n/**\n * Isotope LayoutMode\n */\n\n( function( window, factory ) {\n // universal module definition\n /* jshint strict: false */ /*globals define, module, require */\n if ( typeof define == 'function' && define.amd ) {\n // AMD\n define( 'isotope/js/layout-mode',[\n 'get-size/get-size',\n 'outlayer/outlayer'\n ],\n factory );\n } else if ( typeof module == 'object' && module.exports ) {\n // CommonJS\n module.exports = factory(\n require('get-size'),\n require('outlayer')\n );\n } else {\n // browser global\n window.Isotope = window.Isotope || {};\n window.Isotope.LayoutMode = factory(\n window.getSize,\n window.Outlayer\n );\n }\n\n}( window, function factory( getSize, Outlayer ) {\n 'use strict';\n\n // layout mode class\n function LayoutMode( isotope ) {\n this.isotope = isotope;\n // link properties\n if ( isotope ) {\n this.options = isotope.options[ this.namespace ];\n this.element = isotope.element;\n this.items = isotope.filteredItems;\n this.size = isotope.size;\n }\n }\n\n var proto = LayoutMode.prototype;\n\n /**\n * some methods should just defer to default Outlayer method\n * and reference the Isotope instance as `this`\n **/\n var facadeMethods = [\n '_resetLayout',\n '_getItemLayoutPosition',\n '_manageStamp',\n '_getContainerSize',\n '_getElementOffset',\n 'needsResizeLayout',\n '_getOption'\n ];\n\n facadeMethods.forEach( function( methodName ) {\n proto[ methodName ] = function() {\n return Outlayer.prototype[ methodName ].apply( this.isotope, arguments );\n };\n });\n\n // ----- ----- //\n\n // for horizontal layout modes, check vertical size\n proto.needsVerticalResizeLayout = function() {\n // don't trigger if size did not change\n var size = getSize( this.isotope.element );\n // check that this.size and size are there\n // IE8 triggers resize on body size change, so they might not be\n var hasSizes = this.isotope.size && size;\n return hasSizes && size.innerHeight != this.isotope.size.innerHeight;\n };\n\n // ----- measurements ----- //\n\n proto._getMeasurement = function() {\n this.isotope._getMeasurement.apply( this, arguments );\n };\n\n proto.getColumnWidth = function() {\n this.getSegmentSize( 'column', 'Width' );\n };\n\n proto.getRowHeight = function() {\n this.getSegmentSize( 'row', 'Height' );\n };\n\n /**\n * get columnWidth or rowHeight\n * segment: 'column' or 'row'\n * size 'Width' or 'Height'\n **/\n proto.getSegmentSize = function( segment, size ) {\n var segmentName = segment + size;\n var outerSize = 'outer' + size;\n // columnWidth / outerWidth // rowHeight / outerHeight\n this._getMeasurement( segmentName, outerSize );\n // got rowHeight or columnWidth, we can chill\n if ( this[ segmentName ] ) {\n return;\n }\n // fall back to item of first element\n var firstItemSize = this.getFirstItemSize();\n this[ segmentName ] = firstItemSize && firstItemSize[ outerSize ] ||\n // or size of container\n this.isotope.size[ 'inner' + size ];\n };\n\n proto.getFirstItemSize = function() {\n var firstItem = this.isotope.filteredItems[0];\n return firstItem && firstItem.element && getSize( firstItem.element );\n };\n\n // ----- methods that should reference isotope ----- //\n\n proto.layout = function() {\n this.isotope.layout.apply( this.isotope, arguments );\n };\n\n proto.getSize = function() {\n this.isotope.getSize();\n this.size = this.isotope.size;\n };\n\n // -------------------------- create -------------------------- //\n\n LayoutMode.modes = {};\n\n LayoutMode.create = function( namespace, options ) {\n\n function Mode() {\n LayoutMode.apply( this, arguments );\n }\n\n Mode.prototype = Object.create( proto );\n Mode.prototype.constructor = Mode;\n\n // default options\n if ( options ) {\n Mode.options = options;\n }\n\n Mode.prototype.namespace = namespace;\n // register in Isotope\n LayoutMode.modes[ namespace ] = Mode;\n\n return Mode;\n };\n\n return LayoutMode;\n\n}));\n\n/*!\n * Masonry v4.2.0\n * Cascading grid layout library\n * http://masonry.desandro.com\n * MIT License\n * by David DeSandro\n */\n\n( function( window, factory ) {\n // universal module definition\n /* jshint strict: false */ /*globals define, module, require */\n if ( typeof define == 'function' && define.amd ) {\n // AMD\n define( 'masonry/masonry',[\n 'outlayer/outlayer',\n 'get-size/get-size'\n ],\n factory );\n } else if ( typeof module == 'object' && module.exports ) {\n // CommonJS\n module.exports = factory(\n require('outlayer'),\n require('get-size')\n );\n } else {\n // browser global\n window.Masonry = factory(\n window.Outlayer,\n window.getSize\n );\n }\n\n}( window, function factory( Outlayer, getSize ) {\n\n\n\n// -------------------------- masonryDefinition -------------------------- //\n\n // create an Outlayer layout class\n var Masonry = Outlayer.create('masonry');\n // isFitWidth -> fitWidth\n Masonry.compatOptions.fitWidth = 'isFitWidth';\n\n var proto = Masonry.prototype;\n\n proto._resetLayout = function() {\n this.getSize();\n this._getMeasurement( 'columnWidth', 'outerWidth' );\n this._getMeasurement( 'gutter', 'outerWidth' );\n this.measureColumns();\n\n // reset column Y\n this.colYs = [];\n for ( var i=0; i < this.cols; i++ ) {\n this.colYs.push( 0 );\n }\n\n this.maxY = 0;\n this.horizontalColIndex = 0;\n };\n\n proto.measureColumns = function() {\n this.getContainerWidth();\n // if columnWidth is 0, default to outerWidth of first item\n if ( !this.columnWidth ) {\n var firstItem = this.items[0];\n var firstItemElem = firstItem && firstItem.element;\n // columnWidth fall back to item of first element\n this.columnWidth = firstItemElem && getSize( firstItemElem ).outerWidth ||\n // if first elem has no width, default to size of container\n this.containerWidth;\n }\n\n var columnWidth = this.columnWidth += this.gutter;\n\n // calculate columns\n var containerWidth = this.containerWidth + this.gutter;\n var cols = containerWidth / columnWidth;\n // fix rounding errors, typically with gutters\n var excess = columnWidth - containerWidth % columnWidth;\n // if overshoot is less than a pixel, round up, otherwise floor it\n var mathMethod = excess && excess < 1 ? 'round' : 'floor';\n cols = Math[ mathMethod ]( cols );\n this.cols = Math.max( cols, 1 );\n };\n\n proto.getContainerWidth = function() {\n // container is parent if fit width\n var isFitWidth = this._getOption('fitWidth');\n var container = isFitWidth ? this.element.parentNode : this.element;\n // check that this.size and size are there\n // IE8 triggers resize on body size change, so they might not be\n var size = getSize( container );\n this.containerWidth = size && size.innerWidth;\n };\n\n proto._getItemLayoutPosition = function( item ) {\n item.getSize();\n // how many columns does this brick span\n var remainder = item.size.outerWidth % this.columnWidth;\n var mathMethod = remainder && remainder < 1 ? 'round' : 'ceil';\n // round if off by 1 pixel, otherwise use ceil\n var colSpan = Math[ mathMethod ]( item.size.outerWidth / this.columnWidth );\n colSpan = Math.min( colSpan, this.cols );\n // use horizontal or top column position\n var colPosMethod = this.options.horizontalOrder ?\n '_getHorizontalColPosition' : '_getTopColPosition';\n var colPosition = this[ colPosMethod ]( colSpan, item );\n // position the brick\n var position = {\n x: this.columnWidth * colPosition.col,\n y: colPosition.y\n };\n // apply setHeight to necessary columns\n var setHeight = colPosition.y + item.size.outerHeight;\n var setMax = colSpan + colPosition.col;\n for ( var i = colPosition.col; i < setMax; i++ ) {\n this.colYs[i] = setHeight;\n }\n\n return position;\n };\n\n proto._getTopColPosition = function( colSpan ) {\n var colGroup = this._getTopColGroup( colSpan );\n // get the minimum Y value from the columns\n var minimumY = Math.min.apply( Math, colGroup );\n\n return {\n col: colGroup.indexOf( minimumY ),\n y: minimumY,\n };\n };\n\n /**\n * @param {Number} colSpan - number of columns the element spans\n * @returns {Array} colGroup\n */\n proto._getTopColGroup = function( colSpan ) {\n if ( colSpan < 2 ) {\n // if brick spans only one column, use all the column Ys\n return this.colYs;\n }\n\n var colGroup = [];\n // how many different places could this brick fit horizontally\n var groupCount = this.cols + 1 - colSpan;\n // for each group potential horizontal position\n for ( var i = 0; i < groupCount; i++ ) {\n colGroup[i] = this._getColGroupY( i, colSpan );\n }\n return colGroup;\n };\n\n proto._getColGroupY = function( col, colSpan ) {\n if ( colSpan < 2 ) {\n return this.colYs[ col ];\n }\n // make an array of colY values for that one group\n var groupColYs = this.colYs.slice( col, col + colSpan );\n // and get the max value of the array\n return Math.max.apply( Math, groupColYs );\n };\n\n // get column position based on horizontal index. #873\n proto._getHorizontalColPosition = function( colSpan, item ) {\n var col = this.horizontalColIndex % this.cols;\n var isOver = colSpan > 1 && col + colSpan > this.cols;\n // shift to next row if item can't fit on current row\n col = isOver ? 0 : col;\n // don't let zero-size items take up space\n var hasSize = item.size.outerWidth && item.size.outerHeight;\n this.horizontalColIndex = hasSize ? col + colSpan : this.horizontalColIndex;\n\n return {\n col: col,\n y: this._getColGroupY( col, colSpan ),\n };\n };\n\n proto._manageStamp = function( stamp ) {\n var stampSize = getSize( stamp );\n var offset = this._getElementOffset( stamp );\n // get the columns that this stamp affects\n var isOriginLeft = this._getOption('originLeft');\n var firstX = isOriginLeft ? offset.left : offset.right;\n var lastX = firstX + stampSize.outerWidth;\n var firstCol = Math.floor( firstX / this.columnWidth );\n firstCol = Math.max( 0, firstCol );\n var lastCol = Math.floor( lastX / this.columnWidth );\n // lastCol should not go over if multiple of columnWidth #425\n lastCol -= lastX % this.columnWidth ? 0 : 1;\n lastCol = Math.min( this.cols - 1, lastCol );\n // set colYs to bottom of the stamp\n\n var isOriginTop = this._getOption('originTop');\n var stampMaxY = ( isOriginTop ? offset.top : offset.bottom ) +\n stampSize.outerHeight;\n for ( var i = firstCol; i <= lastCol; i++ ) {\n this.colYs[i] = Math.max( stampMaxY, this.colYs[i] );\n }\n };\n\n proto._getContainerSize = function() {\n this.maxY = Math.max.apply( Math, this.colYs );\n var size = {\n height: this.maxY\n };\n\n if ( this._getOption('fitWidth') ) {\n size.width = this._getContainerFitWidth();\n }\n\n return size;\n };\n\n proto._getContainerFitWidth = function() {\n var unusedCols = 0;\n // count unused columns\n var i = this.cols;\n while ( --i ) {\n if ( this.colYs[i] !== 0 ) {\n break;\n }\n unusedCols++;\n }\n // fit container to columns that have been used\n return ( this.cols - unusedCols ) * this.columnWidth - this.gutter;\n };\n\n proto.needsResizeLayout = function() {\n var previousWidth = this.containerWidth;\n this.getContainerWidth();\n return previousWidth != this.containerWidth;\n };\n\n return Masonry;\n\n}));\n\n/*!\n * Masonry layout mode\n * sub-classes Masonry\n * http://masonry.desandro.com\n */\n\n( function( window, factory ) {\n // universal module definition\n /* jshint strict: false */ /*globals define, module, require */\n if ( typeof define == 'function' && define.amd ) {\n // AMD\n define( 'isotope/js/layout-modes/masonry',[\n '../layout-mode',\n 'masonry/masonry'\n ],\n factory );\n } else if ( typeof module == 'object' && module.exports ) {\n // CommonJS\n module.exports = factory(\n require('../layout-mode'),\n require('masonry-layout')\n );\n } else {\n // browser global\n factory(\n window.Isotope.LayoutMode,\n window.Masonry\n );\n }\n\n}( window, function factory( LayoutMode, Masonry ) {\n'use strict';\n\n// -------------------------- masonryDefinition -------------------------- //\n\n // create an Outlayer layout class\n var MasonryMode = LayoutMode.create('masonry');\n\n var proto = MasonryMode.prototype;\n\n var keepModeMethods = {\n _getElementOffset: true,\n layout: true,\n _getMeasurement: true\n };\n\n // inherit Masonry prototype\n for ( var method in Masonry.prototype ) {\n // do not inherit mode methods\n if ( !keepModeMethods[ method ] ) {\n proto[ method ] = Masonry.prototype[ method ];\n }\n }\n\n var measureColumns = proto.measureColumns;\n proto.measureColumns = function() {\n // set items, used if measuring first item\n this.items = this.isotope.filteredItems;\n measureColumns.call( this );\n };\n\n // point to mode options for fitWidth\n var _getOption = proto._getOption;\n proto._getOption = function( option ) {\n if ( option == 'fitWidth' ) {\n return this.options.isFitWidth !== undefined ?\n this.options.isFitWidth : this.options.fitWidth;\n }\n return _getOption.apply( this.isotope, arguments );\n };\n\n return MasonryMode;\n\n}));\n\n/**\n * fitRows layout mode\n */\n\n( function( window, factory ) {\n // universal module definition\n /* jshint strict: false */ /*globals define, module, require */\n if ( typeof define == 'function' && define.amd ) {\n // AMD\n define( 'isotope/js/layout-modes/fit-rows',[\n '../layout-mode'\n ],\n factory );\n } else if ( typeof exports == 'object' ) {\n // CommonJS\n module.exports = factory(\n require('../layout-mode')\n );\n } else {\n // browser global\n factory(\n window.Isotope.LayoutMode\n );\n }\n\n}( window, function factory( LayoutMode ) {\n'use strict';\n\nvar FitRows = LayoutMode.create('fitRows');\n\nvar proto = FitRows.prototype;\n\nproto._resetLayout = function() {\n this.x = 0;\n this.y = 0;\n this.maxY = 0;\n this._getMeasurement( 'gutter', 'outerWidth' );\n};\n\nproto._getItemLayoutPosition = function( item ) {\n item.getSize();\n\n var itemWidth = item.size.outerWidth + this.gutter;\n // if this element cannot fit in the current row\n var containerWidth = this.isotope.size.innerWidth + this.gutter;\n if ( this.x !== 0 && itemWidth + this.x > containerWidth ) {\n this.x = 0;\n this.y = this.maxY;\n }\n\n var position = {\n x: this.x,\n y: this.y\n };\n\n this.maxY = Math.max( this.maxY, this.y + item.size.outerHeight );\n this.x += itemWidth;\n\n return position;\n};\n\nproto._getContainerSize = function() {\n return { height: this.maxY };\n};\n\nreturn FitRows;\n\n}));\n\n/**\n * vertical layout mode\n */\n\n( function( window, factory ) {\n // universal module definition\n /* jshint strict: false */ /*globals define, module, require */\n if ( typeof define == 'function' && define.amd ) {\n // AMD\n define( 'isotope/js/layout-modes/vertical',[\n '../layout-mode'\n ],\n factory );\n } else if ( typeof module == 'object' && module.exports ) {\n // CommonJS\n module.exports = factory(\n require('../layout-mode')\n );\n } else {\n // browser global\n factory(\n window.Isotope.LayoutMode\n );\n }\n\n}( window, function factory( LayoutMode ) {\n'use strict';\n\nvar Vertical = LayoutMode.create( 'vertical', {\n horizontalAlignment: 0\n});\n\nvar proto = Vertical.prototype;\n\nproto._resetLayout = function() {\n this.y = 0;\n};\n\nproto._getItemLayoutPosition = function( item ) {\n item.getSize();\n var x = ( this.isotope.size.innerWidth - item.size.outerWidth ) *\n this.options.horizontalAlignment;\n var y = this.y;\n this.y += item.size.outerHeight;\n return { x: x, y: y };\n};\n\nproto._getContainerSize = function() {\n return { height: this.y };\n};\n\nreturn Vertical;\n\n}));\n\n/*!\n * Isotope v3.0.4\n *\n * Licensed GPLv3 for open source use\n * or Isotope Commercial License for commercial use\n *\n * http://isotope.metafizzy.co\n * Copyright 2017 Metafizzy\n */\n\n( function( window, factory ) {\n // universal module definition\n /* jshint strict: false */ /*globals define, module, require */\n if ( typeof define == 'function' && define.amd ) {\n // AMD\n define( [\n 'outlayer/outlayer',\n 'get-size/get-size',\n 'desandro-matches-selector/matches-selector',\n 'fizzy-ui-utils/utils',\n 'isotope/js/item',\n 'isotope/js/layout-mode',\n // include default layout modes\n 'isotope/js/layout-modes/masonry',\n 'isotope/js/layout-modes/fit-rows',\n 'isotope/js/layout-modes/vertical'\n ],\n function( Outlayer, getSize, matchesSelector, utils, Item, LayoutMode ) {\n return factory( window, Outlayer, getSize, matchesSelector, utils, Item, LayoutMode );\n });\n } else if ( typeof module == 'object' && module.exports ) {\n // CommonJS\n module.exports = factory(\n window,\n require('outlayer'),\n require('get-size'),\n require('desandro-matches-selector'),\n require('fizzy-ui-utils'),\n require('isotope/js/item'),\n require('isotope/js/layout-mode'),\n // include default layout modes\n require('isotope/js/layout-modes/masonry'),\n require('isotope/js/layout-modes/fit-rows'),\n require('isotope/js/layout-modes/vertical')\n );\n } else {\n // browser global\n window.Isotope = factory(\n window,\n window.Outlayer,\n window.getSize,\n window.matchesSelector,\n window.fizzyUIUtils,\n window.Isotope.Item,\n window.Isotope.LayoutMode\n );\n }\n\n}( window, function factory( window, Outlayer, getSize, matchesSelector, utils,\n Item, LayoutMode ) {\n\n\n\n// -------------------------- vars -------------------------- //\n\nvar jQuery = window.jQuery;\n\n// -------------------------- helpers -------------------------- //\n\nvar trim = String.prototype.trim ?\n function( str ) {\n return str.trim();\n } :\n function( str ) {\n return str.replace( /^\\s+|\\s+$/g, '' );\n };\n\n// -------------------------- isotopeDefinition -------------------------- //\n\n // create an Outlayer layout class\n var Isotope = Outlayer.create( 'isotope', {\n layoutMode: 'masonry',\n isJQueryFiltering: true,\n sortAscending: true\n });\n\n Isotope.Item = Item;\n Isotope.LayoutMode = LayoutMode;\n\n var proto = Isotope.prototype;\n\n proto._create = function() {\n this.itemGUID = 0;\n // functions that sort items\n this._sorters = {};\n this._getSorters();\n // call super\n Outlayer.prototype._create.call( this );\n\n // create layout modes\n this.modes = {};\n // start filteredItems with all items\n this.filteredItems = this.items;\n // keep of track of sortBys\n this.sortHistory = [ 'original-order' ];\n // create from registered layout modes\n for ( var name in LayoutMode.modes ) {\n this._initLayoutMode( name );\n }\n };\n\n proto.reloadItems = function() {\n // reset item ID counter\n this.itemGUID = 0;\n // call super\n Outlayer.prototype.reloadItems.call( this );\n };\n\n proto._itemize = function() {\n var items = Outlayer.prototype._itemize.apply( this, arguments );\n // assign ID for original-order\n for ( var i=0; i < items.length; i++ ) {\n var item = items[i];\n item.id = this.itemGUID++;\n }\n this._updateItemsSortData( items );\n return items;\n };\n\n\n // -------------------------- layout -------------------------- //\n\n proto._initLayoutMode = function( name ) {\n var Mode = LayoutMode.modes[ name ];\n // set mode options\n // HACK extend initial options, back-fill in default options\n var initialOpts = this.options[ name ] || {};\n this.options[ name ] = Mode.options ?\n utils.extend( Mode.options, initialOpts ) : initialOpts;\n // init layout mode instance\n this.modes[ name ] = new Mode( this );\n };\n\n\n proto.layout = function() {\n // if first time doing layout, do all magic\n if ( !this._isLayoutInited && this._getOption('initLayout') ) {\n this.arrange();\n return;\n }\n this._layout();\n };\n\n // private method to be used in layout() & magic()\n proto._layout = function() {\n // don't animate first layout\n var isInstant = this._getIsInstant();\n // layout flow\n this._resetLayout();\n this._manageStamps();\n this.layoutItems( this.filteredItems, isInstant );\n\n // flag for initalized\n this._isLayoutInited = true;\n };\n\n // filter + sort + layout\n proto.arrange = function( opts ) {\n // set any options pass\n this.option( opts );\n this._getIsInstant();\n // filter, sort, and layout\n\n // filter\n var filtered = this._filter( this.items );\n this.filteredItems = filtered.matches;\n\n this._bindArrangeComplete();\n\n if ( this._isInstant ) {\n this._noTransition( this._hideReveal, [ filtered ] );\n } else {\n this._hideReveal( filtered );\n }\n\n this._sort();\n this._layout();\n };\n // alias to _init for main plugin method\n proto._init = proto.arrange;\n\n proto._hideReveal = function( filtered ) {\n this.reveal( filtered.needReveal );\n this.hide( filtered.needHide );\n };\n\n // HACK\n // Don't animate/transition first layout\n // Or don't animate/transition other layouts\n proto._getIsInstant = function() {\n var isLayoutInstant = this._getOption('layoutInstant');\n var isInstant = isLayoutInstant !== undefined ? isLayoutInstant :\n !this._isLayoutInited;\n this._isInstant = isInstant;\n return isInstant;\n };\n\n // listen for layoutComplete, hideComplete and revealComplete\n // to trigger arrangeComplete\n proto._bindArrangeComplete = function() {\n // listen for 3 events to trigger arrangeComplete\n var isLayoutComplete, isHideComplete, isRevealComplete;\n var _this = this;\n function arrangeParallelCallback() {\n if ( isLayoutComplete && isHideComplete && isRevealComplete ) {\n _this.dispatchEvent( 'arrangeComplete', null, [ _this.filteredItems ] );\n }\n }\n this.once( 'layoutComplete', function() {\n isLayoutComplete = true;\n arrangeParallelCallback();\n });\n this.once( 'hideComplete', function() {\n isHideComplete = true;\n arrangeParallelCallback();\n });\n this.once( 'revealComplete', function() {\n isRevealComplete = true;\n arrangeParallelCallback();\n });\n };\n\n // -------------------------- filter -------------------------- //\n\n proto._filter = function( items ) {\n var filter = this.options.filter;\n filter = filter || '*';\n var matches = [];\n var hiddenMatched = [];\n var visibleUnmatched = [];\n\n var test = this._getFilterTest( filter );\n\n // test each item\n for ( var i=0; i < items.length; i++ ) {\n var item = items[i];\n if ( item.isIgnored ) {\n continue;\n }\n // add item to either matched or unmatched group\n var isMatched = test( item );\n // item.isFilterMatched = isMatched;\n // add to matches if its a match\n if ( isMatched ) {\n matches.push( item );\n }\n // add to additional group if item needs to be hidden or revealed\n if ( isMatched && item.isHidden ) {\n hiddenMatched.push( item );\n } else if ( !isMatched && !item.isHidden ) {\n visibleUnmatched.push( item );\n }\n }\n\n // return collections of items to be manipulated\n return {\n matches: matches,\n needReveal: hiddenMatched,\n needHide: visibleUnmatched\n };\n };\n\n // get a jQuery, function, or a matchesSelector test given the filter\n proto._getFilterTest = function( filter ) {\n if ( jQuery && this.options.isJQueryFiltering ) {\n // use jQuery\n return function( item ) {\n return jQuery( item.element ).is( filter );\n };\n }\n if ( typeof filter == 'function' ) {\n // use filter as function\n return function( item ) {\n return filter( item.element );\n };\n }\n // default, use filter as selector string\n return function( item ) {\n return matchesSelector( item.element, filter );\n };\n };\n\n // -------------------------- sorting -------------------------- //\n\n /**\n * @params {Array} elems\n * @public\n */\n proto.updateSortData = function( elems ) {\n // get items\n var items;\n if ( elems ) {\n elems = utils.makeArray( elems );\n items = this.getItems( elems );\n } else {\n // update all items if no elems provided\n items = this.items;\n }\n\n this._getSorters();\n this._updateItemsSortData( items );\n };\n\n proto._getSorters = function() {\n var getSortData = this.options.getSortData;\n for ( var key in getSortData ) {\n var sorter = getSortData[ key ];\n this._sorters[ key ] = mungeSorter( sorter );\n }\n };\n\n /**\n * @params {Array} items - of Isotope.Items\n * @private\n */\n proto._updateItemsSortData = function( items ) {\n // do not update if no items\n var len = items && items.length;\n\n for ( var i=0; len && i < len; i++ ) {\n var item = items[i];\n item.updateSortData();\n }\n };\n\n // ----- munge sorter ----- //\n\n // encapsulate this, as we just need mungeSorter\n // other functions in here are just for munging\n var mungeSorter = ( function() {\n // add a magic layer to sorters for convienent shorthands\n // `.foo-bar` will use the text of .foo-bar querySelector\n // `[foo-bar]` will use attribute\n // you can also add parser\n // `.foo-bar parseInt` will parse that as a number\n function mungeSorter( sorter ) {\n // if not a string, return function or whatever it is\n if ( typeof sorter != 'string' ) {\n return sorter;\n }\n // parse the sorter string\n var args = trim( sorter ).split(' ');\n var query = args[0];\n // check if query looks like [an-attribute]\n var attrMatch = query.match( /^\\[(.+)\\]$/ );\n var attr = attrMatch && attrMatch[1];\n var getValue = getValueGetter( attr, query );\n // use second argument as a parser\n var parser = Isotope.sortDataParsers[ args[1] ];\n // parse the value, if there was a parser\n sorter = parser ? function( elem ) {\n return elem && parser( getValue( elem ) );\n } :\n // otherwise just return value\n function( elem ) {\n return elem && getValue( elem );\n };\n\n return sorter;\n }\n\n // get an attribute getter, or get text of the querySelector\n function getValueGetter( attr, query ) {\n // if query looks like [foo-bar], get attribute\n if ( attr ) {\n return function getAttribute( elem ) {\n return elem.getAttribute( attr );\n };\n }\n\n // otherwise, assume its a querySelector, and get its text\n return function getChildText( elem ) {\n var child = elem.querySelector( query );\n return child && child.textContent;\n };\n }\n\n return mungeSorter;\n })();\n\n // parsers used in getSortData shortcut strings\n Isotope.sortDataParsers = {\n 'parseInt': function( val ) {\n return parseInt( val, 10 );\n },\n 'parseFloat': function( val ) {\n return parseFloat( val );\n }\n };\n\n // ----- sort method ----- //\n\n // sort filteredItem order\n proto._sort = function() {\n if ( !this.options.sortBy ) {\n return;\n }\n // keep track of sortBy History\n var sortBys = utils.makeArray( this.options.sortBy );\n if ( !this._getIsSameSortBy( sortBys ) ) {\n // concat all sortBy and sortHistory, add to front, oldest goes in last\n this.sortHistory = sortBys.concat( this.sortHistory );\n }\n // sort magic\n var itemSorter = getItemSorter( this.sortHistory, this.options.sortAscending );\n this.filteredItems.sort( itemSorter );\n };\n\n // check if sortBys is same as start of sortHistory\n proto._getIsSameSortBy = function( sortBys ) {\n for ( var i=0; i < sortBys.length; i++ ) {\n if ( sortBys[i] != this.sortHistory[i] ) {\n return false;\n }\n }\n return true;\n };\n\n // returns a function used for sorting\n function getItemSorter( sortBys, sortAsc ) {\n return function sorter( itemA, itemB ) {\n // cycle through all sortKeys\n for ( var i = 0; i < sortBys.length; i++ ) {\n var sortBy = sortBys[i];\n var a = itemA.sortData[ sortBy ];\n var b = itemB.sortData[ sortBy ];\n if ( a > b || a < b ) {\n // if sortAsc is an object, use the value given the sortBy key\n var isAscending = sortAsc[ sortBy ] !== undefined ? sortAsc[ sortBy ] : sortAsc;\n var direction = isAscending ? 1 : -1;\n return ( a > b ? 1 : -1 ) * direction;\n }\n }\n return 0;\n };\n }\n\n // -------------------------- methods -------------------------- //\n\n // get layout mode\n proto._mode = function() {\n var layoutMode = this.options.layoutMode;\n var mode = this.modes[ layoutMode ];\n if ( !mode ) {\n // TODO console.error\n throw new Error( 'No layout mode: ' + layoutMode );\n }\n // HACK sync mode's options\n // any options set after init for layout mode need to be synced\n mode.options = this.options[ layoutMode ];\n return mode;\n };\n\n proto._resetLayout = function() {\n // trigger original reset layout\n Outlayer.prototype._resetLayout.call( this );\n this._mode()._resetLayout();\n };\n\n proto._getItemLayoutPosition = function( item ) {\n return this._mode()._getItemLayoutPosition( item );\n };\n\n proto._manageStamp = function( stamp ) {\n this._mode()._manageStamp( stamp );\n };\n\n proto._getContainerSize = function() {\n return this._mode()._getContainerSize();\n };\n\n proto.needsResizeLayout = function() {\n return this._mode().needsResizeLayout();\n };\n\n // -------------------------- adding & removing -------------------------- //\n\n // HEADS UP overwrites default Outlayer appended\n proto.appended = function( elems ) {\n var items = this.addItems( elems );\n if ( !items.length ) {\n return;\n }\n // filter, layout, reveal new items\n var filteredItems = this._filterRevealAdded( items );\n // add to filteredItems\n this.filteredItems = this.filteredItems.concat( filteredItems );\n };\n\n // HEADS UP overwrites default Outlayer prepended\n proto.prepended = function( elems ) {\n var items = this._itemize( elems );\n if ( !items.length ) {\n return;\n }\n // start new layout\n this._resetLayout();\n this._manageStamps();\n // filter, layout, reveal new items\n var filteredItems = this._filterRevealAdded( items );\n // layout previous items\n this.layoutItems( this.filteredItems );\n // add to items and filteredItems\n this.filteredItems = filteredItems.concat( this.filteredItems );\n this.items = items.concat( this.items );\n };\n\n proto._filterRevealAdded = function( items ) {\n var filtered = this._filter( items );\n this.hide( filtered.needHide );\n // reveal all new items\n this.reveal( filtered.matches );\n // layout new items, no transition\n this.layoutItems( filtered.matches, true );\n return filtered.matches;\n };\n\n /**\n * Filter, sort, and layout newly-appended item elements\n * @param {Array or NodeList or Element} elems\n */\n proto.insert = function( elems ) {\n var items = this.addItems( elems );\n if ( !items.length ) {\n return;\n }\n // append item elements\n var i, item;\n var len = items.length;\n for ( i=0; i < len; i++ ) {\n item = items[i];\n this.element.appendChild( item.element );\n }\n // filter new stuff\n var filteredInsertItems = this._filter( items ).matches;\n // set flag\n for ( i=0; i < len; i++ ) {\n items[i].isLayoutInstant = true;\n }\n this.arrange();\n // reset flag\n for ( i=0; i < len; i++ ) {\n delete items[i].isLayoutInstant;\n }\n this.reveal( filteredInsertItems );\n };\n\n var _remove = proto.remove;\n proto.remove = function( elems ) {\n elems = utils.makeArray( elems );\n var removeItems = this.getItems( elems );\n // do regular thing\n _remove.call( this, elems );\n // bail if no items to remove\n var len = removeItems && removeItems.length;\n // remove elems from filteredItems\n for ( var i=0; len && i < len; i++ ) {\n var item = removeItems[i];\n // remove item from collection\n utils.removeFrom( this.filteredItems, item );\n }\n };\n\n proto.shuffle = function() {\n // update random sortData\n for ( var i=0; i < this.items.length; i++ ) {\n var item = this.items[i];\n item.sortData.random = Math.random();\n }\n this.options.sortBy = 'random';\n this._sort();\n this._layout();\n };\n\n /**\n * trigger fn without transition\n * kind of hacky to have this in the first place\n * @param {Function} fn\n * @param {Array} args\n * @returns ret\n * @private\n */\n proto._noTransition = function( fn, args ) {\n // save transitionDuration before disabling\n var transitionDuration = this.options.transitionDuration;\n // disable transition\n this.options.transitionDuration = 0;\n // do it\n var returnValue = fn.apply( this, args );\n // re-enable transition for reveal\n this.options.transitionDuration = transitionDuration;\n return returnValue;\n };\n\n // ----- helper methods ----- //\n\n /**\n * getter method for getting filtered item elements\n * @returns {Array} elems - collection of item elements\n */\n proto.getFilteredItemElements = function() {\n return this.filteredItems.map( function( item ) {\n return item.element;\n });\n };\n\n // ----- ----- //\n\n return Isotope;\n\n}));\n\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/isotope-layout/dist/isotope.pkgd.js\n// module id = GbzL7C/QFmiBZDICkla+\n// module chunks = 0","var matches = require('./matches')\n\n/**\n * closest : closest(el, selector)\n * Looks for the closest ancestor of element `el` that matches `selector`.\n * Compare with [$.fn.closest](http://api.jquery.com/closest/).\n *\n * var closest = require('dom101/closest');\n *\n * closest(input, 'label');\n */\n\nfunction closest (el, sel) {\n if (!el) return\n if (matches(el, sel)) {\n return el\n } else {\n return closest(el.parentNode, sel)\n }\n}\n\nmodule.exports = closest\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/dom101/closest.js\n// module id = Gz0TuoFFs6JdDvtR2PYZ\n// module chunks = 0","/**\n * on : on(el, event, fn)\n * Adds an event handler.\n *\n * var on = require('dom101/on');\n *\n * on(el, 'click', function () {\n * ...\n * });\n */\n\nfunction on (el, event, handler) {\n if (el.addEventListener) {\n el.addEventListener(event, handler)\n } else {\n el.attachEvent('on' + event, function () {\n handler.call(el)\n })\n }\n}\n\nmodule.exports = on\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/dom101/on.js\n// module id = MKJaVdnD9jF7rk6rW6AJ\n// module chunks = 0","/**\n * each : each(list, fn)\n * Iterates through `list` (an array or an object). This is useful when dealing\n * with NodeLists like `document.querySelectorAll`.\n *\n * var each = require('dom101/each');\n * var qa = require('dom101/query-selector-all');\n *\n * each(qa('.button'), function (el) {\n * addClass('el', 'selected');\n * });\n */\n\nfunction each (list, fn) {\n var i\n var len = list.length\n var idx\n\n if (typeof len === 'number') {\n for (i = 0; i < len; i++) {\n fn(list[i], i)\n }\n } else {\n idx = 0\n for (i in list) {\n if (list.hasOwnProperty(i)) {\n fn(list[i], i, idx++)\n }\n }\n }\n\n return list\n}\n\nmodule.exports = each\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/dom101/each.js\n// module id = O7wD3s+p+jjyw5ivWGEg\n// module chunks = 0","import onmount from 'onmount'\nimport remove from 'dom101/remove'\nimport removeClass from 'dom101/remove-class'\n\nimport { getData } from '../helpers/data'\nimport { isDismissed } from '../helpers/dismiss'\nimport { isPreview } from '../helpers/preview'\n\nonmount('[data-js-dismissable]', function () {\n const id = getData(this, 'js-dismissable').id || ''\n\n if (isPreview() || isDismissed(id)) {\n remove(this)\n } else {\n removeClass(this, '-hide')\n }\n})\n\n\n\n// WEBPACK FOOTER //\n// ./_js/behaviors/dismissable.js","import matches from 'dom101/matches'\n\n/*\n * Just like jQuery.append\n */\n\nexport function appendMany (el, children) {\n children.forEach(child => { el.appendChild(child) })\n}\n\n/*\n * Just like jQuery.nextUntil\n */\n\nexport function nextUntil (el, selector) {\n const nextEl = el.nextSibling\n return nextUntilTick(nextEl, selector, [])\n}\n\nfunction nextUntilTick (el, selector, acc) {\n if (!el) return acc\n\n const isMatch = matches(el, selector)\n if (isMatch) return acc\n\n return nextUntilTick(el.nextSibling, selector, [ ...acc, el ])\n}\n\n/*\n * Just like jQuery.before\n */\n\nexport function before (reference, newNode) {\n reference.parentNode.insertBefore(newNode, reference)\n}\n\n/*\n * Like jQuery.children('selector')\n */\n\nexport function findChildren (el, selector) {\n return [].slice.call(el.children)\n .filter(child => matches(child, selector))\n}\n\n/**\n * Creates a div\n * @private\n *\n * @example\n *\n * createDiv({ class: 'foo' })\n */\n\nexport function createDiv (props) {\n const d = document.createElement('div')\n Object.keys(props).forEach(key => {\n d.setAttribute(key, props[key])\n })\n return d\n}\n\n\n\n// WEBPACK FOOTER //\n// ./_js/helpers/dom.js","import closest from 'dom101/closest'\nimport remove from 'dom101/remove'\nimport on from 'dom101/on'\nimport { getData } from '../helpers/data'\nimport onmount from 'onmount'\nimport * as Dismiss from '../helpers/dismiss'\n\n/**\n * Dismiss button\n */\n\nonmount('[data-js-dismiss]', function () {\n const parent = closest(this, '[data-js-dismissable]')\n const dismissable = getData(parent, 'js-dismissable')\n const id = (dismissable && dismissable.id) || ''\n\n on(this, 'click', e => {\n Dismiss.setDismissed(id)\n e.preventDefault()\n if (parent) remove(parent)\n })\n})\n\n\n\n// WEBPACK FOOTER //\n// ./_js/behaviors/dismiss.js","var each = require('./each')\n\n/**\n * removeClass : removeClass(el, className)\n * Removes a classname.\n *\n * var removeClass = require('dom101/remove-class');\n *\n * el.className = 'selected active';\n * removeClass(el, 'active');\n *\n * el.className\n * => \"selected\"\n */\n\nfunction removeClass (el, className) {\n if (!className) return\n\n if (Array.isArray(className)) {\n each(className, function (className) {\n removeClass(el, className)\n })\n\n return\n }\n\n if (el.classList) {\n var classNames = className.split(' ').filter(Boolean)\n each(classNames, function (className) {\n el.classList.remove(className)\n })\n } else {\n var expr =\n new RegExp('(^|\\\\b)' + className.split(' ').join('|') + '(\\\\b|$)', 'gi')\n\n el.className = el.className.replace(expr, ' ')\n }\n}\n\nmodule.exports = removeClass\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/dom101/remove-class.js\n// module id = bq+j3PCtCSGVXgg8xWPw\n// module chunks = 0","var map = {\n\t\"./dismiss.js\": \"azEBDvunS5n/qbuQInIF\",\n\t\"./dismissable.js\": \"XxGrbZud7DE4W4TdQZtc\",\n\t\"./disqus.js\": \"BuWMdGeXUEK0GmkN01pU\",\n\t\"./h3-section-list.js\": \"E+dCGfS1pT5WowYv7jpv\",\n\t\"./main-body.js\": \"g3wkw0XZUos0Eo8rU7p6\",\n\t\"./no-preview.js\": \"k6EYej2Qda8Mq9A5Oeqn\",\n\t\"./search-form.js\": \"D3SYMdNAenu80VOO7/Dv\",\n\t\"./search-input.js\": \"zNHHVy5XxvKjnqTgwxy7\",\n\t\"./searchable-header.js\": \"veOabZWTWtixkn1TyITD\",\n\t\"./searchable-item.js\": \"tcev71HWHlq3Ur/sw7Ir\"\n};\nfunction webpackContext(req) {\n\treturn __webpack_require__(webpackContextResolve(req));\n};\nfunction webpackContextResolve(req) {\n\tvar id = map[req];\n\tif(!(id + 1)) // check for number or string\n\t\tthrow new Error(\"Cannot find module '\" + req + \"'.\");\n\treturn id;\n};\nwebpackContext.keys = function webpackContextKeys() {\n\treturn Object.keys(map);\n};\nwebpackContext.resolve = webpackContextResolve;\nmodule.exports = webpackContext;\nwebpackContext.id = \"cBdQffYQOU2SCSRXjSUx\";\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./_js/behaviors \\.js$\n// module id = cBdQffYQOU2SCSRXjSUx\n// module chunks = 0","/**\n * Injects disqus's scripts into the page.\n *\n * @example\n * inject('devhints.disqus.com')\n */\n\nexport default function inject (host) {\n injectEmbed(host)\n injectCount(host)\n}\n\nexport function injectEmbed (host) {\n const d = document\n const s = d.createElement('script')\n s.src = `https://${host}/embed.js`\n s.setAttribute('data-timestamp', +new Date())\n ;(d.head || d.body).appendChild(s)\n}\n\nexport function injectCount (host) {\n const d = document\n const s = d.createElement('script')\n s.src = `https://${host}/count.js`\n s.id = 'dsq-count-scr'\n s.async = true\n ;(d.head || d.body).appendChild(s)\n}\n\n\n\n// WEBPACK FOOTER //\n// ./_js/helpers/inject_disqus.js","/*\n * Helper: minimal qs implementation\n */\n\nexport default function qs (search) {\n search = search.substr(1)\n const parts = search.split('&').map(p => p.split('='))\n return parts.reduce((result, part) => {\n result[part[0]] = qsdecode(part[1])\n return result\n }, {})\n}\n\nexport function qsdecode (string) {\n if (!string) string = ''\n string = string.replace(/\\+/g, ' ')\n return string\n}\n\n\n\n// WEBPACK FOOTER //\n// ./_js/helpers/qs.js","import remove from 'dom101/remove'\nimport onmount from 'onmount'\nimport addClass from 'dom101/add-class'\n\nimport { isPreview } from '../helpers/preview'\n\n/*\n * Behavior: Things to remove when preview mode is on\n */\n\nonmount('[data-js-no-preview]', function (b) {\n if (isPreview()) {\n remove(this)\n addClass(document.documentElement, 'PreviewMode')\n }\n})\n\n\n\n// WEBPACK FOOTER //\n// ./_js/behaviors/no-preview.js","var each = require('./each')\n\n/**\n * addClass : addClass(el, className)\n * Adds a class name to an element. Compare with `$.fn.addClass`.\n *\n * var addClass = require('dom101/add-class');\n *\n * addClass(el, 'active');\n */\n\nfunction addClass (el, className) {\n if (!className) return\n\n if (Array.isArray(className)) {\n each(className, function (className) {\n addClass(el, className)\n })\n\n return\n }\n\n if (el.classList) {\n var classNames = className.split(' ').filter(Boolean)\n each(classNames, function (className) {\n el.classList.add(className)\n })\n } else {\n el.className += ' ' + className\n }\n}\n\nmodule.exports = addClass\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/dom101/add-class.js\n// module id = lGfezzQL7fc5RE8kg33g\n// module chunks = 0","import onmount from 'onmount'\nimport permutate from '../helpers/permutate'\n\n/**\n * Sets search indices (`data-search-index` attribute)\n */\n\nonmount('[data-js-searchable-item]', function () {\n const data = JSON.parse(this.getAttribute('data-js-searchable-item') || '{}')\n const words = permutate(data)\n\n this.setAttribute('data-search-index', words.join(' '))\n})\n\n\n\n// WEBPACK FOOTER //\n// ./_js/behaviors/searchable-item.js","/**\n * ready : ready(fn)\n * Executes `fn` when the DOM is ready. If the DOM is already ready, the given\n * callback will be called immediately.\n *\n * var ready = require('dom101/ready');\n *\n * ready(function () {\n * ...\n * });\n */\n\nfunction ready (fn) {\n if (isReady()) {\n return fn()\n } else if (document.addEventListener) {\n document.addEventListener('DOMContentLoaded', fn)\n } else {\n document.attachEvent('onreadystatechange', function () {\n if (isReady()) fn()\n })\n }\n}\n\nfunction isReady () {\n return (document.readyState === 'complete' || document.readyState === 'interactive')\n}\n\nmodule.exports = ready\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/dom101/ready.js\n// module id = tqbVxj9+xGAhlFrQpyTS\n// module chunks = 0","import onmount from 'onmount'\nimport { nextUntil } from '../helpers/dom'\nimport matches from 'dom101/matches'\n\n// Ensure that search-index is set first\nimport './searchable-item'\n\n/**\n * Propagate item search indices to headers\n */\n\nonmount('[data-js-searchable-header]', function () {\n const els = nextUntil(this, '[data-js-searchable-header]')\n .filter(el => matches(el, '[data-search-index]'))\n\n const keywords = els\n .map(n => n.getAttribute('data-search-index'))\n .join(' ')\n .split(' ')\n\n this.setAttribute('data-search-index', keywords.join(' '))\n})\n\n\n\n// WEBPACK FOOTER //\n// ./_js/behaviors/searchable-header.js","/**\n * remove : remove(el)\n * Removes an element from the DOM.\n *\n * var remove = require('dom101/remove');\n *\n * remove(el);\n */\n\nfunction remove (el) {\n el && el.parentNode && el.parentNode.removeChild(el)\n}\n\nmodule.exports = remove\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/dom101/remove.js\n// module id = wYegCzKWCG2ZRJZfGEZa\n// module chunks = 0","/* global define */\nvoid (function (root, factory) {\n if (typeof define === 'function' && define.amd) define(factory)\n else if (typeof exports === 'object') module.exports = factory()\n else {\n if (window.jQuery) window.jQuery.onmount = factory()\n else root.onmount = factory()\n }\n}(this, function ($) {\n /*\n * Internal: Registry.\n */\n\n var handlers, behaviors, selectors, log\n\n /*\n * Internal: IDs for auto-incrementing.\n */\n\n var bid = 0 /* behavior ID */\n var cid = 0 /* component ID */\n\n /**\n * (Module) Adds a behavior, or triggers behaviors.\n *\n * When no parameters are passed, it triggers all behaviors. When one\n * parameter is passed, it triggers the given behavior. Otherwise, it adds a\n * behavior.\n *\n * // define a behavior\n * $.onmount('.select-box', function () {\n * $(this).on('...')\n * })\n *\n * // define a behavior with exit\n * $.onmount('.select-box', function () {\n * $(document).on('...')\n * }, function () {\n * $(document).off('...')\n * })\n *\n * // retrigger a onmount\n * $.onmount('.select-box')\n *\n * // retriggers all behaviors\n * $.onmount()\n */\n\n function onmount (selector, init, exit, options) {\n if (typeof exit === 'object') {\n options = exit\n exit = undefined\n }\n\n if (arguments.length === 0 || isjQuery(selector) || isEvent(selector)) {\n // onmount() - trigger all behaviors. Also account for cases such as\n // $($.onmount), where it's triggered with a jQuery event object.\n onmount.poll()\n } else if (arguments.length === 1) {\n // onmount(selector) - trigger for a given selector.\n onmount.poll(selector)\n } else {\n // onmount(sel, fn, [fn]) - register a new behavior.\n var be = new Behavior(selector, init, exit, options)\n behaviors.push(be)\n be.register()\n }\n\n return this\n }\n\n /*\n * Use jQuery (or a jQuery-like) when available. This will allow\n * the use of jQuery selectors.\n */\n\n onmount.$ = window.jQuery || window.Zepto || window.Ender\n\n /*\n * Detect MutationObserver support for `onmount.observe()`.\n * You may even add a polyfill here via\n * `onmount.MutationObserver = require('mutation-observer')`.\n */\n\n onmount.MutationObserver =\n window.MutationObserver ||\n window.WebKitMutationObserver ||\n window.MozMutationObserver\n\n /**\n * Set this to true if you want to see debug messages.\n */\n\n onmount.debug = false\n\n /**\n * Internal: triggers behaviors for a selector or for all.\n *\n * onmount.poll()\n * onmount.poll('.js-button')\n */\n\n onmount.poll = function poll (selector) {\n if (selector) selector = onmount.selectify(selector)\n var functions = (selector ? selectors[selector] : handlers) || []\n each(functions, function (fn) { fn() })\n }\n\n /**\n * Observes automatically using MutationObserver events.\n *\n * onmount.observe()\n */\n\n onmount.observe = function observe () {\n var MutationObserver = onmount.MutationObserver\n if (typeof MutationObserver === 'undefined') return\n\n var obs = new MutationObserver(function (mutations) {\n each(behaviors, function (be) {\n each(mutations, function (mutation) {\n each(mutation.addedNodes, function (el) {\n if (matches(el, be.selector)) be.visitEnter(el)\n })\n\n each(mutation.removedNodes, function (el) {\n if (matches(el, be.selector)) be.doExit(el)\n })\n })\n })\n })\n\n obs.observe(document, { subtree: true, childList: true })\n onmount.observer = obs\n\n // trigger everything before going\n onmount()\n return true\n }\n\n /**\n * Turns off observation first issued by `onmount.observe()`.\n */\n\n onmount.unobserve = function unobserve () {\n if (!this.observer) return\n this.observer.disconnect()\n delete this.observer\n }\n\n /**\n * Forces teardown of all behaviors currently applied.\n */\n\n onmount.teardown = function teardown () {\n each(behaviors, function (be) {\n each(be.loaded, function (el, i) {\n if (el) be.doExit(el, i)\n })\n })\n }\n\n /**\n * Clears all behaviors. Useful for tests.\n * This will NOT call exit handlers.\n */\n\n onmount.reset = function reset () {\n handlers = onmount.handlers = []\n selectors = onmount.selectors = {}\n behaviors = onmount.behaviors = []\n }\n\n /**\n * Internal: Converts `@role` to `[role~=\"role\"]` if needed. You can override\n * this by reimplementing `onmount.selectify`.\n *\n * selectify('@hi') //=> '[role=\"hi\"]'\n * selectify('.btn') //=> '.btn'\n */\n\n onmount.selectify = function selectify (selector) {\n if (selector[0] === '@') {\n return '[role~=\"' + selector.substr(1).replace(/\"/g, '\\\\\"') + '\"]'\n }\n return selector\n }\n\n /**\n * Internal: behavior class\n */\n\n function Behavior (selector, init, exit, options) {\n this.id = 'b' + bid++\n this.init = init\n this.exit = exit\n this.selector = onmount.selectify(selector)\n this.loaded = [] // keep track of dom elements loaded for this behavior\n this.key = '__onmount:' + bid // leave the state in el['__onmount:12']\n this.detectMutate = options && options.detectMutate\n }\n\n /**\n * Internal: initialize this behavior by registering itself to the internal\n * `selectors` map. This allows you to call `onmount(selector)` later on.\n */\n\n Behavior.prototype.register = function () {\n var be = this\n var loaded = this.loaded\n var selector = this.selector\n\n register(selector, function () {\n var list = query(selector)\n\n // This is the function invoked on `onmount(selector)`.\n // Clean up old ones (if they're not in the DOM anymore).\n each(loaded, function (element, i) {\n be.visitExit(element, i, list)\n })\n\n // Clean up new ones (if they're not loaded yet).\n eachOf(list, function (element) {\n be.visitEnter(element)\n })\n })\n }\n\n /**\n * Internal: visits the element `el` and turns it on if applicable.\n */\n\n Behavior.prototype.visitEnter = function (el) {\n if (el[this.key]) return\n var options = { id: 'c' + cid, selector: this.selector }\n if (this.init.call(el, options) !== false) {\n if (onmount.debug) log('enter', this.selector, el)\n el[this.key] = options\n this.loaded.push(el)\n cid++\n }\n }\n\n /**\n * Internal: visits the element `el` and sees if it needs its exit handler\n * called.\n */\n\n Behavior.prototype.visitExit = function (el, i, list) {\n if (!el) return\n if (this.detectMutate) {\n if (!has(list, el)) return this.doExit(el, i)\n } else {\n if (!isAttached(el)) return this.doExit(el, i)\n }\n }\n\n /**\n * Internal: calls the exit handler for the behavior for element `el` (if\n * available), and marks the behavior/element as uninitialized.\n */\n\n Behavior.prototype.doExit = function (el, i) {\n if (typeof i === 'undefined') i = this.loaded.indexOf(el)\n this.loaded[i] = undefined\n if (this.exit && this.exit.call(el, el[this.key]) !== false) {\n if (onmount.debug) log('exit', this.selector, el)\n delete el[this.key]\n }\n }\n\n /**\n * Internal: check if an element is still attached to its document.\n */\n\n function isAttached (el) {\n while (el) {\n if (el === document.documentElement) return true\n el = el.parentElement\n }\n }\n\n /**\n * Internal: reimplementation of `$('...')`. If jQuery is available,\n * use it (I guess to preserve IE compatibility and to enable special jQuery\n * attribute selectors). Use with `eachOf()` or `has()`.\n */\n\n function query (selector, fn) {\n if (onmount.$) return onmount.$(selector)\n return document.querySelectorAll(selector)\n }\n\n /**\n * Internal: iterates through a `query()` result.\n */\n\n function eachOf (list, fn) {\n if (onmount.$) return list.each(function (i) { fn(this, i) })\n return each(list, fn)\n }\n\n /**\n * Interanl: checks if given element `el` is in the query result `list`.\n */\n\n function has (list, el) {\n if (onmount.$) return list.index(el) > -1\n return list.indexOf(el) > -1\n }\n\n /**\n * Internal: registers a behavior handler for a selector.\n */\n\n function register (selector, fn) {\n if (!selectors[selector]) selectors[selector] = []\n selectors[selector].push(fn)\n handlers.push(fn)\n }\n\n /**\n * Checks if a given element `el` matches `selector`.\n * Compare with [$.fn.is](http://api.jquery.com/is/).\n *\n * var matches = require('dom101/matches');\n *\n * matches(button, ':focus');\n */\n\n function matches (el, selector) {\n var _matches = el.matches ||\n el.matchesSelector ||\n el.msMatchesSelector ||\n el.mozMatchesSelector ||\n el.webkitMatchesSelector ||\n el.oMatchesSelector\n\n if (onmount.$) {\n return onmount.$(el).is(selector)\n } else if (_matches) {\n return _matches.call(el, selector)\n } else if (el.parentNode) {\n // IE8 and below\n var nodes = el.parentNode.querySelectorAll(selector)\n for (var i = nodes.length; i--; 0) {\n if (nodes[i] === el) return true\n }\n return false\n }\n }\n\n /**\n * Iterates through `list` (an array or an object). This is useful when dealing\n * with NodeLists like `document.querySelectorAll`.\n *\n * var each = require('dom101/each');\n * var qa = require('dom101/query-selector-all');\n *\n * each(qa('.button'), function (el) {\n * addClass('el', 'selected');\n * });\n */\n\n function each (list, fn) {\n var i\n var len = list.length\n\n if (len === +len) {\n for (i = 0; i < len; i++) { fn(list[i], i) }\n } else {\n for (i in list) {\n if (list.hasOwnProperty(i)) fn(list[i], i)\n }\n }\n\n return list\n }\n\n /**\n * Internal: Check if a given object is jQuery\n */\n\n function isjQuery ($) {\n return typeof $ === 'function' && $.fn && $.noConflict\n }\n\n function isEvent (e) {\n return typeof e === 'object' && e.target\n }\n\n /**\n * Internal: logging\n */\n\n var styles = {\n enter: 'background-color:#dfd;font-weight:bold;color:#141',\n exit: 'background-color:#fdd;font-weight:bold;color:#411'\n }\n\n if (~navigator.userAgent.indexOf('Mozilla')) {\n log = function (type, selector, el) {\n console.log('%c %s ', styles[type], selector, el)\n }\n } else {\n log = function (type, selector, el) {\n console.log('(onmount)', type, selector)\n }\n }\n\n /*\n * Export\n */\n\n onmount.reset()\n return onmount\n}))\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/onmount/index.js\n// module id = yfX/NEeqeNrvWENPWWKS\n// module chunks = 0","// 3rd party libs\nwindow.Prism = require('prismjs')\n\n// All the others\nfunction requireAll (r) { r.keys().forEach(r) }\nrequireAll(require.context('./initializers/', true, /\\.js$/))\nrequireAll(require.context('./behaviors/', true, /\\.js$/))\n\n\n\n// WEBPACK FOOTER //\n// ./_js/app.js","import onmount from 'onmount'\nimport * as Search from '../helpers/search'\nimport qs from '../helpers/qs'\nimport on from 'dom101/on'\n\nonmount('[data-js-search-input]', function () {\n on(this, 'input', () => {\n const val = this.value\n\n if (val === '') {\n Search.showAll()\n } else {\n Search.show(val)\n }\n })\n\n const query = (qs(window.location.search) || {}).q\n if (query && query.length) {\n this.value = query\n setTimeout(() => { Search.show(query) })\n }\n})\n\n\n\n// WEBPACK FOOTER //\n// ./_js/behaviors/search-input.js"],"sourceRoot":""} \ No newline at end of file