diff --git a/node_modules/mdl-ext/lib/mdl-ext.min.js b/node_modules/mdl-ext/lib/mdl-ext.min.js
new file mode 100644
index 0000000..c972548
--- /dev/null
+++ b/node_modules/mdl-ext/lib/mdl-ext.min.js
@@ -0,0 +1,4 @@
+!function(e,t){"object"==typeof exports&&"object"==typeof module?module.exports=t():"function"==typeof define&&define.amd?define("mdl-ext",[],t):"object"==typeof exports?exports["mdl-ext"]=t():e["mdl-ext"]=t()}(this,function(){return function(e){function t(i){if(n[i])return n[i].exports;var r=n[i]={exports:{},id:i,loaded:!1};return e[i].call(r.exports,r,r.exports,t),r.loaded=!0,r.exports}var n={};return t.m=e,t.c=n,t.p="",t(0)}([function(e,t,n){n(113),e.exports=n(53)},function(e,t){var n=e.exports={version:"2.4.0"};"number"==typeof __e&&(__e=n)},function(e,t){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var n=9,i=13,r=27,o=32,s=33,a=34,l=35,c=36,u=37,d=38,f=39,h=40,p="aria-expanded",m="aria-hidden",_="aria-multiselectable",v="aria-selected",g="is-dirty",b="is-disabled",E="is-expanded",y="is-focused",A="is-invalid",w="is-upgraded",L="data-upgraded",S="mdl-ripple",x="MaterialRipple",k="mdl-js-ripple-effect",D="mdl-js-ripple-effect--ignore-events";t.VK_TAB=n,t.VK_ENTER=i,t.VK_ESC=r,t.VK_SPACE=o,t.VK_PAGE_UP=s,t.VK_PAGE_DOWN=a,t.VK_END=l,t.VK_HOME=c,t.VK_ARROW_LEFT=u,t.VK_ARROW_UP=d,t.VK_ARROW_RIGHT=f,t.VK_ARROW_DOWN=h,t.ARIA_EXPANDED=p,t.ARIA_HIDDEN=m,t.ARIA_MULTISELECTABLE=_,t.ARIA_SELECTED=v,t.IS_DIRTY=g,t.IS_DISABLED=b,t.IS_EXPANDED=E,t.IS_FOCUSED=y,t.IS_INVALID=A,t.IS_UPGRADED=w,t.DATA_UPGRADED=L,t.MDL_RIPPLE=S,t.MDL_RIPPLE_COMPONENT=x,t.MDL_RIPPLE_EFFECT=k,t.MDL_RIPPLE_EFFECT_IGNORE_EVENTS=D},function(e,t,n){var i=n(5),r=n(1),o=n(37),s=n(11),a="prototype",l=function(e,t,n){var c,u,d,f=e&l.F,h=e&l.G,p=e&l.S,m=e&l.P,_=e&l.B,v=e&l.W,g=h?r:r[t]||(r[t]={}),b=g[a],E=h?i:p?i[t]:(i[t]||{})[a];h&&(n=t);for(c in n)u=!f&&E&&void 0!==E[c],u&&c in g||(d=u?E[c]:n[c],g[c]=h&&"function"!=typeof E[c]?n[c]:_&&u?o(d,i):v&&E[c]==d?function(e){var t=function(t,n,i){if(this instanceof e){switch(arguments.length){case 0:return new e;case 1:return new e(t);case 2:return new e(t,n)}return new e(t,n,i)}return e.apply(this,arguments)};return t[a]=e[a],t}(d):m&&"function"==typeof d?o(Function.call,d):d,m&&((g.virtual||(g.virtual={}))[c]=d,e&l.R&&b&&!b[c]&&s(b,c,d)))};l.F=1,l.G=2,l.S=4,l.P=8,l.B=16,l.W=32,l.U=64,l.R=128,e.exports=l},function(e,t,n){var i=n(44)("wks"),r=n(46),o=n(5).Symbol,s="function"==typeof o,a=e.exports=function(e){return i[e]||(i[e]=s&&o[e]||(s?o:r)("Symbol."+e))};a.store=i},function(e,t){var n=e.exports="undefined"!=typeof window&&window.Math==Math?window:"undefined"!=typeof self&&self.Math==Math?self:Function("return this")();"number"==typeof __g&&(__g=n)},function(e,t,n){var i=n(17);e.exports=function(e){if(!i(e))throw TypeError(e+" is not an object!");return e}},function(e,t){e.exports={}},function(e,t,n){"use strict";function i(e){return e&&e.__esModule?e:{default:e}}t.__esModule=!0;var r=n(60),o=i(r);t.default=function(e){if(Array.isArray(e)){for(var t=0,n=Array(e.length);t<e.length;t++)n[t]=e[t];return n}return(0,o.default)(e)}},function(e,t,n){e.exports=!n(10)(function(){return 7!=Object.defineProperty({},"a",{get:function(){return 7}}).a})},function(e,t){e.exports=function(e){try{return!!e()}catch(e){return!0}}},function(e,t,n){var i=n(12),r=n(25);e.exports=n(9)?function(e,t,n){return i.f(e,t,r(1,n))}:function(e,t,n){return e[t]=n,e}},function(e,t,n){var i=n(6),r=n(82),o=n(101),s=Object.defineProperty;t.f=n(9)?Object.defineProperty:function(e,t,n){if(i(e),t=o(t,!0),i(n),r)try{return s(e,t,n)}catch(e){}if("get"in n||"set"in n)throw TypeError("Accessors not supported!");return"value"in n&&(e[t]=n.value),e}},function(e,t,n){"use strict";function i(e){return e&&e.__esModule?e:{default:e}}Object.defineProperty(t,"__esModule",{value:!0});var r=n(66),o=i(r),s=function(e,t){t||(t=window);var n=!1;return function(){for(var i=arguments.length,r=Array(i),s=0;s<i;s++)r[s]=arguments[s];n||(n=!0,window.requestAnimationFrame(function(){return n=!1,(0,o.default)(e,t,r)}))}};t.default=s,e.exports=t.default},function(e,t,n){"use strict";function i(e){return e&&e.__esModule?e:{default:e}}Object.defineProperty(t,"__esModule",{value:!0}),t.jsonStringToObject=void 0;var r=n(33),o=i(r),s=function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},n=e.replace(/'/g,'"');try{return(0,o.default)(t,JSON.parse(n))}catch(e){throw new Error("Failed to parse json string: "+n+". Error: "+e.message)}};t.jsonStringToObject=s},function(e,t,n){"use strict";function i(e){return e&&e.__esModule?e:{default:e}}Object.defineProperty(t,"__esModule",{value:!0}),t.stringList=t.randomString=t.joinStrings=void 0;var r=n(65),o=i(r),s=function(){for(var e=arguments.length,t=Array(e),n=0;n<e;n++)t[n]=arguments[n];var i=function(e){return null!=e&&"string"==typeof e},r=function e(t){return t.reduce(function(t,n){return t.concat(Array.isArray(n)?e(n):n)},[])},s=function(e){return(0,o.default)(e).filter(function(t){return e[t]}).map(function(e){return e})};return t.filter(function(e){return!!e}).map(function(e){return i(e)?e:s(e)}).reduce(function(e,t){return e.concat(Array.isArray(t)?r(t):t)},[])},a=function(){for(var e=arguments.length,t=Array(e>1?e-1:0),n=1;n<e;n++)t[n-1]=arguments[n];var i=arguments.length>0&&void 0!==arguments[0]?arguments[0]:" ";return s.apply(void 0,t).join(i)},l=function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:12;return Array(e+1).join((Math.random().toString(36)+"00000000000000000").slice(2,18)).slice(0,e)};t.joinStrings=a,t.randomString=l,t.stringList=s},function(e,t){var n={}.hasOwnProperty;e.exports=function(e,t){return n.call(e,t)}},function(e,t){e.exports=function(e){return"object"==typeof e?null!==e:"function"==typeof e}},function(e,t,n){var i=n(95),r=n(39);e.exports=Object.keys||function(e){return i(e,r)}},function(e,t,n){var i=n(40),r=n(24);e.exports=function(e){return i(r(e))}},function(e,t,n){var i=n(24);e.exports=function(e){return Object(i(e))}},function(e,t,n){"use strict";function i(e){return e&&e.__esModule?e:{default:e}}Object.defineProperty(t,"__esModule",{value:!0}),t.tether=t.removeChildElements=t.moveElements=t.isRectInsideWindowViewport=t.isFocusable=t.getScrollParents=t.getParentElements=t.getWindowViewport=void 0;var r=n(62),o=i(r),s=function(e){for(var t=!(arguments.length>1&&void 0!==arguments[1])||arguments[1];e.lastChild;)e.removeChild(e.lastChild);if(t){var n=e.style.display;e.style.display="none",e.style.display=n}},a=function(e,t){for(t||(t=e.ownerDocument.createDocumentFragment());e.firstChild;)t.appendChild(e.firstChild);return t},l=function(){return{viewportWidth:Math.max(document.documentElement.clientWidth||0,window.innerWidth||0),viewportHeight:Math.max(document.documentElement.clientHeight||0,window.innerHeight||0)}},c=function(e){var t=e.top,n=e.left,i=e.bottom,r=e.right,o=l(),s=o.viewportWidth,a=o.viewportHeight;return t>=0&&n>=0&&i<=a&&r<=s},u=function(e){for(var t=[],n=e.parentNode;n;){var i=window.getComputedStyle(n);if("hidden"===i.overflowY&&"hidden"===i.overflowX||t.unshift(n),n===document.body)break;n=n.parentNode}return t},d=function(e,t){for(var n=[],i=e.parentNode;i&&i!==t;)n.unshift(i),i=i.parentNode;return n},f=function(e,t){var n=e.getBoundingClientRect(),i=l(),r=i.viewportWidth,o=i.viewportHeight;t.style.height="auto",t.offsetHeight>o&&(t.style.height=o+"px",t.style.overflowY="auto"),t.style.width="auto",t.offsetWidth>r&&(t.style.width=r+"px");var s=t.getBoundingClientRect(),a=n.top-s.top,u=n.left-s.left,d=s.top+a,f=s.left+u,h=d+s.height,p=f+s.width,m=a,_=u;if(c({top:d+n.height,left:f,bottom:h+n.height,right:p}))m=n.height+a;else if(c({top:d+n.height,left:f+n.width-s.width,bottom:h+n.height,right:f+n.width}))m=n.height+a,_=u+n.width-s.width;else if(c({top:d-s.height,left:f,bottom:h-s.height,right:p}))m=a-s.height;else if(c({top:d-s.height,left:f+n.width-s.width,bottom:h-s.height,right:f+n.width}))m=a-s.height,_=u+n.width-s.width;else if(c({top:d,left:f+n.width,bottom:h,right:p+n.width}))_=n.width+u;else if(c({top:d,left:f-n.width,bottom:h,right:p-n.width}))_=u-s.width;else if(m=a-h+o,d+n.height>=0&&h+n.height<=o?m=n.height+a:d-s.height>=0&&h-s.height<=o&&(m=a-s.height),f+s.width+n.width<=r)_=n.width+u;else if(f-s.width>=0)_=u-s.width;else{var v=f+s.width-r;_=u-v}t.style.top=t.offsetTop+m+"px",t.style.left=t.offsetLeft+_+"px"},h=function(e){if(e.hasAttribute("tabindex")){var t=e.getAttribute("tabindex");if(!(0,o.default)(t))return parseInt(t)>-1}if(e.hasAttribute("contenteditable")&&"false"!==e.getAttribute("contenteditable"))return!0;var n=/input|select|textarea|button|details/i,i=e.nodeName;if(n.test(i))return"hidden"!==e.type.toLowerCase()&&!e.disabled;if("A"===i||"AREA"===i)return!!e.href;if("IFRAME"===i){var r=window.getComputedStyle(e);return"none"!==r.getPropertyValue("display").toLowerCase()}return!1};t.getWindowViewport=l,t.getParentElements=d,t.getScrollParents=u,t.isFocusable=h,t.isRectInsideWindowViewport=c,t.moveElements=a,t.removeChildElements=s,t.tether=f},function(e,t){"use strict";t.__esModule=!0,t.default=function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}},function(e,t,n){"use strict";function i(e){return e&&e.__esModule?e:{default:e}}t.__esModule=!0;var r=n(63),o=i(r);t.default=function(){function e(e,t){for(var n=0;n<t.length;n++){var i=t[n];i.enumerable=i.enumerable||!1,i.configurable=!0,"value"in i&&(i.writable=!0),(0,o.default)(e,i.key,i)}}return function(t,n,i){return n&&e(t.prototype,n),i&&e(t,i),t}}()},function(e,t){e.exports=function(e){if(void 0==e)throw TypeError("Can't call method on  "+e);return e}},function(e,t){e.exports=function(e,t){return{enumerable:!(1&e),configurable:!(2&e),writable:!(4&e),value:t}}},function(e,t,n){var i=n(44)("keys"),r=n(46);e.exports=function(e){return i[e]||(i[e]=r(e))}},function(e,t){var n=Math.ceil,i=Math.floor;e.exports=function(e){return isNaN(e=+e)?0:(e>0?i:n)(e)}},function(e,t,n){"use strict";var i=n(99)(!0);n(41)(String,"String",function(e){this._t=String(e),this._i=0},function(){var e,t=this._t,n=this._i;return n>=t.length?{value:void 0,done:!0}:(e=i(t,n),this._i+=e.length,{value:e,done:!1})})},function(e,t){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var n=function(e,t,n,i){return e/=i/2,e<1?n/2*e*e+t:(e--,-n/2*(e*(e-2)-1)+t)},i=function(e,t,n,i){var r=(e/=i)*e,o=r*e;return t+n*(6*o*r+-15*r*r+10*o)};t.easeInOutQuad=n,t.inOutQuintic=i},function(e,t){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var n=1e3/60,i=function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:n,t=e<n?n:e,i=void 0,r=null,o=0,s=function(){var e=i(o);e||a()},a=function(){r&&window.cancelAnimationFrame(r),r=null,o=0},l=function(){var e=Date.now(),n=function n(i){r&&(r=window.requestAnimationFrame(function(){return n(Date.now())}),o+=i-e,o>=t&&(s(),(o-=t)>t&&(o=0)),e=i)};r=1,n(e)};return{get started(){return null!=r},get interval(){return t},set interval(e){t=e<n?n:e},start:function(e){if("function"!=typeof e)throw new TypeError("callback parameter must be a function");i=e,l()},immediate:function(){if(!i)throw new ReferenceError("callback parameter is not defined. Call start before immediate.");s()},stop:function(){return a()}}};t.default=i,e.exports=t.default},function(e,t,n){e.exports={default:n(69),__esModule:!0}},function(e,t,n){e.exports={default:n(71),__esModule:!0}},function(e,t,n){e.exports={default:n(73),__esModule:!0}},function(e,t){e.exports=function(e){if("function"!=typeof e)throw TypeError(e+" is not a function!");return e}},function(e,t,n){var i=n(36),r=n(4)("toStringTag"),o="Arguments"==i(function(){return arguments}()),s=function(e,t){try{return e[t]}catch(e){}};e.exports=function(e){var t,n,a;return void 0===e?"Undefined":null===e?"Null":"string"==typeof(n=s(t=Object(e),r))?n:o?i(t):"Object"==(a=i(t))&&"function"==typeof t.callee?"Arguments":a}},function(e,t){var n={}.toString;e.exports=function(e){return n.call(e).slice(8,-1)}},function(e,t,n){var i=n(34);e.exports=function(e,t,n){if(i(e),void 0===t)return e;switch(n){case 1:return function(n){return e.call(t,n)};case 2:return function(n,i){return e.call(t,n,i)};case 3:return function(n,i,r){return e.call(t,n,i,r)}}return function(){return e.apply(t,arguments)}}},function(e,t,n){var i=n(17),r=n(5).document,o=i(r)&&i(r.createElement);e.exports=function(e){return o?r.createElement(e):{}}},function(e,t){e.exports="constructor,hasOwnProperty,isPrototypeOf,propertyIsEnumerable,toLocaleString,toString,valueOf".split(",")},function(e,t,n){var i=n(36);e.exports=Object("z").propertyIsEnumerable(0)?Object:function(e){return"String"==i(e)?e.split(""):Object(e)}},function(e,t,n){"use strict";var i=n(89),r=n(3),o=n(98),s=n(11),a=n(16),l=n(7),c=n(86),u=n(43),d=n(94),f=n(4)("iterator"),h=!([].keys&&"next"in[].keys()),p="@@iterator",m="keys",_="values",v=function(){return this};e.exports=function(e,t,n,g,b,E,y){c(n,t,g);var A,w,L,S=function(e){if(!h&&e in C)return C[e];switch(e){case m:return function(){return new n(this,e)};case _:return function(){return new n(this,e)}}return function(){return new n(this,e)}},x=t+" Iterator",k=b==_,D=!1,C=e.prototype,R=C[f]||C[p]||b&&C[b],I=R||S(b),O=b?k?S("entries"):I:void 0,M="Array"==t?C.entries||R:R;if(M&&(L=d(M.call(new e)),L!==Object.prototype&&(u(L,x,!0),i||a(L,f)||s(L,f,v))),k&&R&&R.name!==_&&(D=!0,I=function(){return R.call(this)}),i&&!y||!h&&!D&&C[f]||s(C,f,I),l[t]=I,l[x]=v,b)if(A={values:k?I:S(_),keys:E?I:S(m),entries:O},y)for(w in A)w in C||o(C,w,A[w]);else r(r.P+r.F*(h||D),t,A);return A}},function(e,t){t.f={}.propertyIsEnumerable},function(e,t,n){var i=n(12).f,r=n(16),o=n(4)("toStringTag");e.exports=function(e,t,n){e&&!r(e=n?e:e.prototype,o)&&i(e,o,{configurable:!0,value:t})}},function(e,t,n){var i=n(5),r="__core-js_shared__",o=i[r]||(i[r]={});e.exports=function(e){return o[e]||(o[e]={})}},function(e,t,n){var i=n(27),r=Math.min;e.exports=function(e){return e>0?r(i(e),9007199254740991):0}},function(e,t){var n=0,i=Math.random();e.exports=function(e){return"Symbol(".concat(void 0===e?"":e,")_",(++n+i).toString(36))}},function(e,t,n){var i=n(35),r=n(4)("iterator"),o=n(7);e.exports=n(1).getIteratorMethod=function(e){if(void 0!=e)return e[r]||e["@@iterator"]||o[i(e)]}},function(e,t,n){n(105);for(var i=n(5),r=n(11),o=n(7),s=n(4)("toStringTag"),a=["NodeList","DOMTokenList","MediaList","StyleSheetList","CSSRuleList"],l=0;l<5;l++){var c=a[l],u=i[c],d=u&&u.prototype;d&&!d[s]&&r(d,s,c),o[c]=o.Array}},function(e,t,n){"use strict";function i(e){return e&&e.__esModule?e:{default:e}}var r=n(8),o=i(r),s=n(2);!function(){var e="mdlext-accordion",t="mdlext-accordion--vertical",n="mdlext-accordion--horizontal",i="mdlext-accordion__panel",r="presentation",a="mdlext-accordion__tab",l="mdlext-accordion__tab__caption",c="tab",u="mdlext-accordion__tabpanel",d="tabpanel",f="mdlext-js-ripple-effect",h="mdlext-accordion__tab--ripple",p="mdlext-js-animation-effect",m="mdlext-accordion__tabpanel--animation",_=function(e){this.element_=e,this.init()};window.MaterialExtAccordion=_;var v=function(e){return e?e.classList.contains(i)?{panel:e,tab:e.querySelector("."+a),tabpanel:e.querySelector("."+u)}:{panel:e.parentNode,tab:e.parentNode.querySelector("."+a),tabpanel:e.parentNode.querySelector("."+u)}:{panel:null,tab:null,tabpanel:null}};_.prototype.commandHandler_=function(e){e.preventDefault(),e.stopPropagation(),e&&e.detail&&this.command(e.detail)},_.prototype.dispatchToggleEvent_=function(e,t,n){var i=new CustomEvent("toggle",{bubbles:!0,cancelable:!0,detail:{state:e,tab:t,tabpanel:n}});this.element_.dispatchEvent(i)},_.prototype.openTab_=function(e,t,n){e.classList.add(s.IS_EXPANDED),t.setAttribute(s.ARIA_EXPANDED,"true"),n.removeAttribute("hidden"),n.setAttribute(s.ARIA_HIDDEN,"false"),this.dispatchToggleEvent_("open",t,n)},_.prototype.closeTab_=function(e,t,n){e.classList.remove(s.IS_EXPANDED),t.setAttribute(s.ARIA_EXPANDED,"false"),n.setAttribute("hidden",""),n.setAttribute(s.ARIA_HIDDEN,"true"),this.dispatchToggleEvent_("close",t,n)},_.prototype.toggleTab_=function(e,t,n){this.element_.hasAttribute("disabled")||t.hasAttribute("disabled")||("true"===t.getAttribute(s.ARIA_EXPANDED).toLowerCase()?this.closeTab_(e,t,n):("true"!==this.element_.getAttribute(s.ARIA_MULTISELECTABLE).toLowerCase()&&this.closeTabs_(),this.openTab_(e,t,n)))},_.prototype.openTabs_=function(){var t=this;"true"===this.element_.getAttribute(s.ARIA_MULTISELECTABLE).toLowerCase()&&[].concat((0,o.default)(this.element_.querySelectorAll("."+e+" > ."+i))).filter(function(e){return!e.classList.contains(s.IS_EXPANDED)}).forEach(function(e){var n=e.querySelector("."+a);n.hasAttribute("disabled")||t.openTab_(e,n,e.querySelector("."+u))})},_.prototype.closeTabs_=function(){var t=this;[].concat((0,o.default)(this.element_.querySelectorAll("."+e+" > ."+i+"."+s.IS_EXPANDED))).forEach(function(e){var n=e.querySelector("."+a);n.hasAttribute("disabled")||t.closeTab_(e,n,e.querySelector("."+u))})},_.prototype.upgradeTab=function(e){var t=this,u=v(e),_=u.panel,g=u.tab,b=u.tabpanel,E=function(){_.classList.remove(s.IS_EXPANDED),g.setAttribute("tabindex","-1"),g.setAttribute(s.ARIA_EXPANDED,"false"),b.setAttribute("hidden",""),b.setAttribute(s.ARIA_HIDDEN,"true")},y=function(){g.hasAttribute(s.ARIA_EXPANDED)||g.setAttribute(s.ARIA_EXPANDED,"false"),g.setAttribute("tabindex","0"),"true"===g.getAttribute(s.ARIA_EXPANDED).toLowerCase()?(_.classList.add(s.IS_EXPANDED),b.removeAttribute("hidden"),b.setAttribute(s.ARIA_HIDDEN,"false")):(_.classList.remove(s.IS_EXPANDED),b.setAttribute("hidden",""),b.setAttribute(s.ARIA_HIDDEN,"true"))},A=function(){var e=g.querySelector("."+l);if(null!==e){var t=[].concat((0,o.default)(g.children)).filter(function(e){return e.classList&&!e.classList.contains(l)}).reduce(function(e,t){return e+t.offsetWidth},0),n=g.clientHeight-t;n>0&&(e.style["max-width"]=n+"px")}},w=function(){g.hasAttribute(s.ARIA_SELECTED)||([].concat((0,o.default)(t.element_.querySelectorAll("."+a+'[aria-selected="true"]'))).forEach(function(e){return e.removeAttribute(s.ARIA_SELECTED)}),g.setAttribute(s.ARIA_SELECTED,"true"))},L=function(){t.toggleTab_(_,g,b),w()},S=function(){w()},x=function(){w()},k=function(){w()},D=function(e){if(!t.element_.hasAttribute("disabled"))if(e.keyCode===s.VK_END||e.keyCode===s.VK_HOME||e.keyCode===s.VK_ARROW_UP||e.keyCode===s.VK_ARROW_LEFT||e.keyCode===s.VK_ARROW_DOWN||e.keyCode===s.VK_ARROW_RIGHT){var n=null,r=e.keyCode;if(r===s.VK_HOME?(n=t.element_.querySelector("."+i+":first-child > ."+a),n&&n.hasAttribute("disabled")&&(n=null,r=s.VK_ARROW_DOWN)):r===s.VK_END&&(n=t.element_.querySelector("."+i+":last-child > ."+a),n&&n.hasAttribute("disabled")&&(n=null,r=s.VK_ARROW_UP)),!n){var l=_;do{if(r===s.VK_ARROW_UP||r===s.VK_ARROW_LEFT?(l=l.previousElementSibling,l||(l=t.element_.querySelector("."+i+":last-child")),l&&(n=l.querySelector("."+i+" > ."+a))):r!==s.VK_ARROW_DOWN&&r!==s.VK_ARROW_RIGHT||(l=l.nextElementSibling,l||(l=t.element_.querySelector("."+i+":first-child")),l&&(n=l.querySelector("."+i+" > ."+a))),!n||!n.hasAttribute("disabled"))break;n=null}while(l!==_)}n&&(e.preventDefault(),e.stopPropagation(),n.focus(),n.hasAttribute(s.ARIA_SELECTED)||([].concat((0,o.default)(t.element_.querySelectorAll("."+a+'[aria-selected="true"]'))).forEach(function(e){return e.removeAttribute(s.ARIA_SELECTED)}),n.setAttribute(s.ARIA_SELECTED,"true")))}else e.keyCode!==s.VK_ENTER&&e.keyCode!==s.VK_SPACE||(e.preventDefault(),e.stopPropagation(),t.toggleTab_(_,g,b))};if(null===g)throw new Error("There must be a tab element for each accordion panel.");if(null===b)throw new Error("There must be a tabpanel element for each accordion panel.");_.setAttribute("role",r),g.setAttribute("role",c),b.setAttribute("role",d),g.hasAttribute("disabled")?E():y(),this.element_.classList.contains(n)&&A(),this.element_.classList.contains(f)&&g.classList.add(h),this.element_.classList.contains(p)&&b.classList.add(m),g.removeEventListener("click",L),g.removeEventListener("focus",S),g.removeEventListener("keydown",D),b.removeEventListener("click",x),b.removeEventListener("focus",k),g.addEventListener("click",L),g.addEventListener("focus",S),g.addEventListener("keydown",D),b.addEventListener("click",x,!0),b.addEventListener("focus",k,!0)},_.prototype.upgradeTab=_.prototype.upgradeTab,_.prototype.command=function(e){var t=this,n=function(e){if(void 0===e)t.openTabs_();else if(null!==e){var n=v(e),i=n.panel,r=n.tab,o=n.tabpanel;"true"!==r.getAttribute(s.ARIA_EXPANDED).toLowerCase()&&t.toggleTab_(i,r,o)}},i=function(e){if(void 0===e)t.closeTabs_();else if(null!==e){var n=v(e),i=n.panel,r=n.tab,o=n.tabpanel;"true"===r.getAttribute(s.ARIA_EXPANDED).toLowerCase()&&t.toggleTab_(i,r,o)}},r=function(e){if(e){var n=v(e),i=n.panel,r=n.tab,o=n.tabpanel;t.toggleTab_(i,r,o)}};if(e&&e.action){var o=e.action,a=e.target;switch(o.toLowerCase()){case"open":n(a);break;case"close":i(a);break;case"toggle":r(a);break;case"upgrade":a&&this.upgradeTab(a);break;default:throw new Error('Unknown action "'+o+'". Action must be one of "open", "close", "toggle" or "upgrade"')}}},_.prototype.command=_.prototype.command,_.prototype.init=function(){var r=this;if(this.element_){if(!this.element_.classList.contains(n)&&!this.element_.classList.contains(t))throw new Error('Accordion must have one of the classes "'+n+'" or "'+t+'"');this.element_.setAttribute("role","tablist"),this.element_.hasAttribute(s.ARIA_MULTISELECTABLE)||this.element_.setAttribute(s.ARIA_MULTISELECTABLE,"false"),this.element_.removeEventListener("command",this.commandHandler_),this.element_.addEventListener("command",this.commandHandler_.bind(this),!1),[].concat((0,o.default)(this.element_.querySelectorAll("."+e+" > ."+i))).forEach(function(e){return r.upgradeTab(e)}),this.element_.classList.add(s.IS_UPGRADED)}},componentHandler.register({constructor:_,classAsString:"MaterialExtAccordion",cssClass:"mdlext-js-accordion",widget:!0})}()},function(e,t,n){"use strict";function i(e){return e&&e.__esModule?e:{default:e}}var r=n(32),o=i(r),s=n(8),a=i(s),l=n(33),c=i(l),u=n(30),d=i(u),f=n(29),h=n(14),p=n(2),m="mdlext-carousel__slide__ripple-container";!function(){var e="mdlext-carousel__slide",t="list",n="listitem",i=function(e){this.element_=e,this.config_={interactive:!0,autostart:!1,type:"slide",interval:1e3,animationLoop:(0,d.default)(1e3)},this.scrollAnimation_=(0,d.default)(33),this.init()};window.MaterialExtCarousel=i,i.prototype.startSlideShow_=function(){var t=this,n=function(){var n=t.element_.querySelector("."+e+"[aria-selected]");return n&&(n.removeAttribute("aria-selected"),n=n.nextElementSibling),n||(n=t.element_.querySelector("."+e+":first-child"),t.animateScroll_(0)),!!n&&(t.moveSlideIntoViewport_(n),n.setAttribute("aria-selected",""),t.emitSelectEvent_("next",null,n),!0)},i=function(e){var n=e;"next"===e&&t.element_.scrollLeft===t.element_.scrollWidth-t.element_.clientWidth?n="prev":0===t.element_.scrollLeft&&(n="next");var i="next"===n?Math.min(t.element_.scrollLeft+t.element_.clientWidth,t.element_.scrollWidth-t.element_.clientWidth):Math.max(t.element_.scrollLeft-t.element_.clientWidth,0);return t.animateScroll_(i,1e3),n};this.config_.animationLoop.started||!function(){t.config_.animationLoop.interval=t.config_.interval;var e="next";"scroll"===t.config_.type?t.config_.animationLoop.start(function(){return e=i(e),!0}):(n(),t.config_.animationLoop.start(function(){return n()}))}()},i.prototype.cancelSlideShow_=function(){this.config_.animationLoop.started&&(this.config_.animationLoop.stop(),this.emitSelectEvent_("pause",p.VK_ESC,this.element_.querySelector("."+e+"[aria-selected]")))},i.prototype.animateScroll_=function(e,t,n){var i=this,r=this.element_.scrollLeft,o=e-r;0!==o?!function(){var s=Math.max(Math.min(Math.abs(o),t||400),100),a=0;i.scrollAnimation_.stop(),i.scrollAnimation_.start(function(t){return a+=t,a<s?(i.element_.scrollLeft=(0,f.inOutQuintic)(a,r,o,s),!0):(i.element_.scrollLeft=e,n&&n(),!1)})}():n&&n()},i.prototype.command_=function(t){var n=this,i=0,r=null,o=t.detail.action.toLowerCase();switch(this.cancelSlideShow_(),o){case"first":r=this.element_.querySelector("."+e+":first-child");break;case"last":i=this.element_.scrollWidth-this.element_.clientWidth,r=this.element_.querySelector("."+e+":last-child");break;case"scroll-prev":i=Math.max(this.element_.scrollLeft-this.element_.clientWidth,0);break;case"scroll-next":i=Math.min(this.element_.scrollLeft+this.element_.clientWidth,this.element_.scrollWidth-this.element_.clientWidth);break;case"next":case"prev":return r=this.element_.querySelector("."+e+"[aria-selected]"),void(r&&(r="next"===o?r.nextElementSibling:r.previousElementSibling,this.setAriaSelected_(r),this.emitSelectEvent_(o,null,r)));case"play":return(0,c.default)(this.config_,t.detail),void this.startSlideShow_();case"pause":return;default:return}this.animateScroll_(i,void 0,function(){if("scroll-next"===o||"scroll-prev"===o){var e=n.getSlidesInViewport_();e.length>0&&(r="scroll-next"===o?e[0]:e[e.length-1])}n.setAriaSelected_(r),n.emitSelectEvent_(o,null,r)})},i.prototype.commandHandler_=function(e){e.preventDefault(),e.stopPropagation(),e.detail&&e.detail.action&&this.command_(e)},i.prototype.keyDownHandler_=function(e){if(e&&e.target&&e.target!==this.element_){var t="first";if(e.keyCode===p.VK_HOME||e.keyCode===p.VK_END||e.keyCode===p.VK_PAGE_UP||e.keyCode===p.VK_PAGE_DOWN){e.preventDefault(),e.keyCode===p.VK_END?t="last":e.keyCode===p.VK_PAGE_UP?t="scroll-prev":e.keyCode===p.VK_PAGE_DOWN&&(t="scroll-next");var n=new CustomEvent("select",{detail:{action:t}});this.command_(n)}else if(e.keyCode===p.VK_TAB||e.keyCode===p.VK_ENTER||e.keyCode===p.VK_SPACE||e.keyCode===p.VK_ARROW_UP||e.keyCode===p.VK_ARROW_LEFT||e.keyCode===p.VK_ARROW_DOWN||e.keyCode===p.VK_ARROW_RIGHT){var i=r(e.target);if(!i)return;switch(this.cancelSlideShow_(),e.keyCode){case p.VK_ARROW_UP:case p.VK_ARROW_LEFT:t="prev",i=i.previousElementSibling;break;case p.VK_ARROW_DOWN:case p.VK_ARROW_RIGHT:t="next",i=i.nextElementSibling;break;case p.VK_TAB:e.shiftKey?(t="prev",i=i.previousElementSibling):(t="next",i=i.nextElementSibling);break;case p.VK_SPACE:case p.VK_ENTER:t="select"}i&&(e.preventDefault(),s(i),this.emitSelectEvent_(t,e.keyCode,i))}}},i.prototype.dragHandler_=function(e){var t=this;e.preventDefault(),this.cancelSlideShow_();var n=!1,i=0,o=e.clientX||(void 0!==e.touches?e.touches[0].clientX:0),a=o,l=e.target,c=function(e){var i=e.clientX||(void 0!==e.touches?e.touches[0].clientX:0),r=a-i;r<0?t.element_.scrollLeft=Math.max(t.element_.scrollLeft+r,0):r>0&&(t.element_.scrollLeft=Math.min(t.element_.scrollLeft+r,t.element_.scrollWidth-t.element_.clientWidth)),a=i,n=!1},u=function(e){e.preventDefault(),n||(i=window.requestAnimationFrame(function(){return c(e)}),n=!0)},d=function e(n){n.preventDefault(),t.element_.removeEventListener("mousemove",u),t.element_.removeEventListener("touchmove",u),window.removeEventListener("mouseup",e),window.removeEventListener("touchend",e),window.cancelAnimationFrame(i);var o=r(l);s(o),t.emitSelectEvent_("click",null,o)};this.element_.addEventListener("mousemove",u),this.element_.addEventListener("touchmove",u),window.addEventListener("mouseup",d),window.addEventListener("touchend",d)},i.prototype.clickHandler_=function(e){e.preventDefault()},i.prototype.focusHandler_=function(e){var t=r(e.target);t&&(this.setAriaSelected_(t),t.classList.add(p.IS_FOCUSED))},i.prototype.blurHandler_=function(e){var t=r(e.target);t&&t.classList.remove(p.IS_FOCUSED)},i.prototype.emitSelectEvent_=function(e,t,n){if(n){this.moveSlideIntoViewport_(n);var i=new CustomEvent("select",{bubbles:!0,cancelable:!0,detail:{command:e,keyCode:t,source:n}});this.element_.dispatchEvent(i)}},i.prototype.getSlidesInViewport_=function(){var t=this.element_.getBoundingClientRect(),n=[].concat((0,a.default)(this.element_.querySelectorAll("."+e))).filter(function(e){var n=e.getBoundingClientRect();return n.left>=t.left&&n.right<=t.right});return n},i.prototype.moveSlideIntoViewport_=function(e){var t=this.element_.getBoundingClientRect(),n=e.getBoundingClientRect();if(n.left<t.left){var i=this.element_.scrollLeft-(t.left-n.left);this.animateScroll_(i)}else if(n.right>t.right){var r=this.element_.scrollLeft-(t.right-n.right);this.animateScroll_(r)}},i.prototype.setAriaSelected_=function(t){t&&([].concat((0,a.default)(this.element_.querySelectorAll("."+e+"[aria-selected]"))).forEach(function(e){return e.removeAttribute("aria-selected")}),t.setAttribute("aria-selected",""))},i.prototype.removeListeners_=function(){this.element_.removeEventListener("focus",this.focusHandler_),this.element_.removeEventListener("blur",this.blurHandler_),this.element_.removeEventListener("keydown",this.keyDownHandler_),this.element_.removeEventListener("mousedown",this.dragHandler_),this.element_.removeEventListener("touchstart",this.dragHandler_),this.element_.removeEventListener("click",this.clickHandler_,!1),this.element_.removeEventListener("command",this.commandHandler_),this.element_.removeEventListener("mdl-componentdowngraded",this.mdlDowngrade_)};var r=function(t){return t.closest("."+e)},s=function(e){e&&e.focus()},l=function(e){if(!e.querySelector("."+m)){var t=document.createElement("span");t.classList.add(m),t.classList.add(p.MDL_RIPPLE_EFFECT);var n=document.createElement("span");n.classList.add(p.MDL_RIPPLE),t.appendChild(n);var i=e.querySelector("img");i&&(t.title=i.title),e.appendChild(t),componentHandler.upgradeElement(t,p.MDL_RIPPLE_COMPONENT)}};i.prototype.stopAnimation=function(){this.config_.animationLoop.stop()},i.prototype.stopAnimation=i.prototype.stopAnimation,i.prototype.upgradeSlides=function(){var t=this,i=this.element_.classList.contains(p.MDL_RIPPLE_EFFECT);[].concat((0,a.default)(this.element_.querySelectorAll("."+e))).forEach(function(e){e.setAttribute("role",n),t.config_.interactive?(e.getAttribute("tabindex")||e.setAttribute("tabindex","0"),i&&l(e)):e.setAttribute("tabindex","-1")})},i.prototype.upgradeSlides=i.prototype.upgradeSlides,i.prototype.getConfig=function(){return this.config_},i.prototype.getConfig=i.prototype.getConfig,i.prototype.init=function(){if(this.element_){if(this.element_.hasAttribute("data-config")&&(this.config_=(0,h.jsonStringToObject)(this.element_.getAttribute("data-config"),this.config_)),this.element_.setAttribute("role",t),(0,o.default)(this.element_.getAttribute("tabindex"))||this.element_.setAttribute("tabindex",-1),this.removeListeners_(),this.config_.interactive){var e=this.element_.classList.contains(p.MDL_RIPPLE_EFFECT);e&&this.element_.classList.add(p.MDL_RIPPLE_EFFECT_IGNORE_EVENTS),this.element_.addEventListener("focus",this.focusHandler_.bind(this),!0),this.element_.addEventListener("blur",this.blurHandler_.bind(this),!0),this.element_.addEventListener("keydown",this.keyDownHandler_.bind(this),!1),this.element_.addEventListener("mousedown",this.dragHandler_.bind(this),!1),this.element_.addEventListener("touchstart",this.dragHandler_.bind(this),!1),this.element_.addEventListener("click",this.clickHandler_.bind(this),!1)}this.element_.addEventListener("command",this.commandHandler_.bind(this),!1),this.element_.addEventListener("mdl-componentdowngraded",this.mdlDowngrade_.bind(this)),this.upgradeSlides(),this.element_.classList.add(p.IS_UPGRADED),this.config_.autostart&&this.startSlideShow_()}},i.prototype.mdlDowngrade_=function(){this.stopAnimation(),this.removeListeners_()},componentHandler.register({constructor:i,classAsString:"MaterialExtCarousel",cssClass:"mdlext-js-carousel",widget:!0})}()},function(e,t,n){"use strict";function i(e){return e&&e.__esModule?e:{default:e}}var r=n(22),o=i(r),s=n(23),a=i(s),l=n(2),c=n(15),u=n(21),d="mdlext-js-collapsible",f="mdlext-collapsible",h="mdlext-collapsible-group",p="mdlext-collapsible-region",m=function(){function e(t){var n=this;(0,o.default)(this,e),this.element_=null,this.controlElement_=null,this.keyDownHandler=function(e){e.keyCode!==l.VK_ENTER&&e.keyCode!==l.VK_SPACE||(e.preventDefault(),(e.target||n.controlElement).dispatchEvent(new MouseEvent("click",{bubbles:!0,cancelable:!0,view:window})))},this.clickHandler=function(e){if(!n.isDisabled){if(e.target!==n.controlElement){var t=(0,u.getParentElements)(e.target,n.controlElement);if(t.push(e.target),
+t.find(function(e){return(0,u.isFocusable)(e)}))return}n.toggle()}},this.element_=t,this.init()}return(0,a.default)(e,[{key:"collapse",value:function(){if(!this.isDisabled&&this.isExpanded&&this.dispatchToggleEvent("collapse")){this.controlElement.setAttribute("aria-expanded","false");for(var e=this.regionElements.slice(0),t=e.length-1;t>=0;--t)e[t].setAttribute("hidden","")}}},{key:"expand",value:function(){this.isDisabled||this.isExpanded||this.dispatchToggleEvent("expand")&&(this.controlElement.setAttribute("aria-expanded","true"),this.regionElements.forEach(function(e){return e.removeAttribute("hidden")}))}},{key:"toggle",value:function(){this.isExpanded?this.collapse():this.expand()}},{key:"dispatchToggleEvent",value:function(e){return this.element.dispatchEvent(new CustomEvent("toggle",{bubbles:!0,cancelable:!0,detail:{action:e}}))}},{key:"disableToggle",value:function(){this.controlElement.setAttribute("aria-disabled",!0)}},{key:"enableToggle",value:function(){this.controlElement.removeAttribute("aria-disabled")}},{key:"addRegionId",value:function(e){var t=this.regionIds;t.find(function(t){return e===t})||(t.push(e),this.controlElement.setAttribute("aria-controls",t.join(" ")))}},{key:"addRegionElement",value:function(e){if(e.classList.contains(h)||e.classList.contains(p)||e.classList.add(h),!e.hasAttribute("role")){var t=e.classList.contains(h)?"group":"region";e.setAttribute("role",t)}e.hasAttribute("id")||(e.id=e.getAttribute("role")+"-"+(0,c.randomString)()),this.isExpanded?e.removeAttribute("hidden"):e.setAttribute("hidden",""),this.addRegionId(e.id)}},{key:"removeRegionElement",value:function(e){if(e&&e.id){var t=this.regionIds.filter(function(t){return t===e.id});this.controlElement.setAttribute("aria-controls",t.join(" "))}}},{key:"removeListeners",value:function(){this.controlElement.removeEventListener("keydown",this.keyDownHandler),this.controlElement.removeEventListener("click",this.clickHandler)}},{key:"init",value:function(){var e=this,t=function(){e.controlElement_=e.element.querySelector("."+f)||e.element,e.controlElement.hasAttribute("aria-expanded")||e.controlElement.setAttribute("aria-expanded","false"),"button"!==e.controlElement.nodeName.toLowerCase()&&e.controlElement.setAttribute("role","button"),(0,u.isFocusable)(e.controlElement)||e.controlElement.hasAttribute("tabindex")||e.controlElement.setAttribute("tabindex","0")},n=function(){var t=[];if(e.controlElement.hasAttribute("aria-controls"))t=e.regionElements;else for(var n=e.element.nextElementSibling;n;){if(n.classList.contains(h)||n.classList.contains(p))t.push(n);else if(n.classList.contains(d))break;n=n.nextElementSibling}t.forEach(function(t){return e.addRegionElement(t)})},i=function(){e.controlElement.addEventListener("keydown",e.keyDownHandler),e.controlElement.addEventListener("click",e.clickHandler)};t(),n(),this.removeListeners(),i()}},{key:"downgrade",value:function(){this.removeListeners()}},{key:"element",get:function(){return this.element_}},{key:"controlElement",get:function(){return this.controlElement_}},{key:"isDisabled",get:function(){return this.controlElement.hasAttribute("disabled")&&"false"!==this.controlElement.getAttribute("disabled").toLowerCase()||this.controlElement.hasAttribute("aria-disabled")&&"false"!==this.controlElement.getAttribute("aria-disabled").toLowerCase()}},{key:"isExpanded",get:function(){return this.controlElement.hasAttribute("aria-expanded")&&"true"===this.controlElement.getAttribute("aria-expanded").toLowerCase()}},{key:"regionIds",get:function(){return this.controlElement.hasAttribute("aria-controls")?this.controlElement.getAttribute("aria-controls").split(" "):[]}},{key:"regionElements",get:function(){return this.regionIds.map(function(e){return document.querySelector("#"+e)}).filter(function(e){return null!=e})}}]),e}();!function(){var e=function(e){this.element_=e,this.collapsible=null,this.init()};window.MaterialExtCollapsible=e,e.prototype.init=function(){this.element_&&(this.collapsible=new m(this.element_),this.element_.classList.add(l.IS_UPGRADED),this.element_.addEventListener("mdl-componentdowngraded",this.mdlDowngrade_.bind(this)))},e.prototype.mdlDowngrade_=function(){this.collapsible.downgrade()},e.prototype.getControlElement=function(){return this.collapsible.controlElement},e.prototype.getControlElement=e.prototype.getControlElement,e.prototype.getRegionElements=function(){return this.collapsible.regionElements},e.prototype.getRegionElements=e.prototype.getRegionElements,e.prototype.addRegionElements=function(){for(var e=this,t=arguments.length,n=Array(t),i=0;i<t;i++)n[i]=arguments[i];n.forEach(function(t){return e.collapsible.addRegionElement(t)})},e.prototype.addRegionElements=e.prototype.addRegionElements,e.prototype.removeRegionElements=function(){for(var e=this,t=arguments.length,n=Array(t),i=0;i<t;i++)n[i]=arguments[i];n.forEach(function(t){return e.collapsible.removeRegionElement(t)})},e.prototype.removeRegionElements=e.prototype.removeRegionElements,e.prototype.expand=function(){this.collapsible.expand()},e.prototype.expand=e.prototype.expand,e.prototype.collapse=function(){this.collapsible.collapse()},e.prototype.collapse=e.prototype.collapse,e.prototype.toggle=function(){this.collapsible.toggle()},e.prototype.toggle=e.prototype.toggle,e.prototype.isExpanded=function(){return this.collapsible.isExpanded},e.prototype.isExpanded=e.prototype.isExpanded,e.prototype.isDisabled=function(){return this.collapsible.isDisabled},e.prototype.isDisabled=e.prototype.isDisabled,e.prototype.disableToggle=function(){this.collapsible.disableToggle()},e.prototype.disableToggle=e.prototype.disableToggle,e.prototype.enableToggle=function(){this.collapsible.enableToggle()},e.prototype.enableToggle=e.prototype.enableToggle,componentHandler.register({constructor:e,classAsString:"MaterialExtCollapsible",cssClass:d,widget:!0})}()},function(e,t,n){"use strict";function i(e){return e&&e.__esModule?e:{default:e}}var r,o,s=n(22),a=i(s),l=n(23),c=i(l),u=n(14),d=n(2),f="mdlext-js-formatfield",h="MaterialExtFormatfield",p=function(){return navigator.languages?navigator.languages[0]:navigator.language||navigator.userLanguage},m=(o=r=function(){function e(t){var n=this;(0,a.default)(this,e),this.options_={},this.clickHandler=function(){clearTimeout(e.timer)},this.focusInHandler=function(){n.input.readOnly||n.input.disabled||(n.input.value=n.unformatInput(),e.timer=setTimeout(function(){return n.input.select()},200))},this.focusOutHandler=function(){clearTimeout(e.timer),n.input.readOnly||n.input.disabled||n.formatValue()},this.element_=t,this.init()}return(0,c.default)(e,[{key:"stripSeparatorsFromValue",value:function(){var e=this,t=function(){return e.input.value.replace(/\s/g,"").replace(new RegExp(e.options.groupSeparator,"g"),"").replace(e.options.decimalSeparator,".")};return this.input.value?t():this.input.value}},{key:"fixSeparators",value:function(e){var t=this,n=function(){return e.replace(new RegExp(t.intlGroupSeparator_,"g"),t.options.groupSeparator).replace(t.intlDecimalSeparator_,t.options.decimalSeparator)};return e?n():e}},{key:"formatValue",value:function(){if(this.input.value){var e=new Intl.NumberFormat(this.options.locales,this.options).format(this.stripSeparatorsFromValue());"NaN"!==e&&(this.input.value=this.fixSeparators(e))}}},{key:"unformat",value:function(){var e=this,t=function(){return e.input.value.replace(/\s/g,"").replace(new RegExp(e.options.groupSeparator,"g"),"").replace(e.options.decimalSeparator,".")};return this.input.value?t():this.input.value}},{key:"unformatInput",value:function(){var e=this,t=function(){return e.input.value.replace(/\s/g,"").replace(new RegExp(e.options.groupSeparator,"g"),"")};return this.input.value?t():this.input.value}},{key:"removeListeners",value:function(){this.input.removeEventListener("click",this.clickHandler),this.input.removeEventListener("focusin",this.focusInHandler),this.input.removeEventListener("focusout",this.focusOutHandler)}},{key:"init",value:function(){var e=this,t=function(){e.input.addEventListener("click",e.clickHandler),e.input.addEventListener("focusin",e.focusInHandler),e.input.addEventListener("focusout",e.focusOutHandler)},n=function(){var t=e.element.getAttribute("data-formatfield-options")||e.input.getAttribute("data-formatfield-options");t&&(e.options_=(0,u.jsonStringToObject)(t,e.options))},i=function(){e.options.locales||(e.options.locales=p()||"en-US")},r=function(){var t=1234.5.toLocaleString(e.options.locales,{style:"decimal",useGrouping:!0,minimumFractionDigits:1,maximumFractionDigits:1});if(e.intlGroupSeparator_=t.charAt(1),e.intlDecimalSeparator_=t.charAt(t.length-2),e.options.groupSeparator=e.options.groupSeparator||e.intlGroupSeparator_,e.options.decimalSeparator=e.options.decimalSeparator||e.intlDecimalSeparator_,e.options.groupSeparator===e.options.decimalSeparator){var n='Error! options.groupSeparator, "'+e.options.groupSeparator+'" and options.decimalSeparator, '+('"'+e.options.decimalSeparator+'" should not be equal');throw new Error(n)}};this.input_=this.element.querySelector("input")||this.element,n(),i(),r(),this.formatValue(),t()}},{key:"downgrade",value:function(){this.removeListeners()}},{key:"element",get:function(){return this.element_}},{key:"input",get:function(){return this.input_}},{key:"options",get:function(){return this.options_}}]),e}(),r.timer=null,o);!function(){var e=function(e){this.element_=e,this.formatField_=null,this.init()};window.MaterialExtFormatfield=e,e.prototype.init=function(){this.element_&&(this.element_.classList.add(d.IS_UPGRADED),this.formatField_=new m(this.element_),this.element_.addEventListener("mdl-componentdowngraded",this.mdlDowngrade_.bind(this)))},e.prototype.getOptions=function(){return this.formatField_.options},e.prototype.getOptions=e.prototype.getOptions,e.prototype.getUnformattedValue=function(){return this.formatField_.unformat()},e.prototype.getUnformattedValue=e.prototype.getUnformattedValue,e.prototype.mdlDowngrade_=function(){this.formatField_.downgrade()},componentHandler.register({constructor:e,classAsString:h,cssClass:f,widget:!0})}()},function(e,t,n){"use strict";n(59),n(49),n(51),n(50),n(54),n(55),n(56),n(57),n(52),n(58)},function(e,t,n){"use strict";function i(e){return e&&e.__esModule?e:{default:e}}var r=n(8),o=i(r),s=n(2),a="mdlext-lightboard__slide__ripple-container";!function(){var e="grid",t="mdlext-lightboard__slide",n="gridcell",i="mdlext-lightboard__slide__frame",r=function(e){this.element_=e,this.init()};window.MaterialExtLightboard=r;var l=function(e){return e?e.closest("."+t):null};r.prototype.selectSlide_=function(e){var n=l(e);n&&!n.hasAttribute("aria-selected")&&([].concat((0,o.default)(this.element_.querySelectorAll("."+t+'[aria-selected="true"]'))).forEach(function(e){return e.removeAttribute("aria-selected")}),n.setAttribute("aria-selected","true"))},r.prototype.dispatchSelectEvent_=function(e){this.element_.dispatchEvent(new CustomEvent("select",{bubbles:!0,cancelable:!0,detail:{source:e}}))},r.prototype.commandHandler_=function(e){e.preventDefault(),e.stopPropagation(),e&&e.detail&&this.command(e.detail)},r.prototype.upgradeSlides=function(){var e=function(e){if(!e.querySelector("."+a)){var t=e.querySelector("."+i);if(t){var n=t;n.classList.add(a),n.classList.add(s.MDL_RIPPLE_EFFECT);var r=document.createElement("span");r.classList.add(s.MDL_RIPPLE),n.appendChild(r),componentHandler.upgradeElement(n,s.MDL_RIPPLE_COMPONENT)}}},r=this.element_.classList.contains(s.MDL_RIPPLE_EFFECT);[].concat((0,o.default)(this.element_.querySelectorAll("."+t))).forEach(function(t){t.setAttribute("role",n),t.querySelector("a")||t.setAttribute("tabindex","0"),r&&e(t)})},r.prototype.upgradeSlides=r.prototype.upgradeSlides,r.prototype.command=function(e){var n=this,i=function(){return n.element_.querySelector("."+t+":first-child")},r=function(){return n.element_.querySelector("."+t+":last-child")},o=function(){var e=n.element_.querySelector("."+t+'[aria-selected="true"]').nextElementSibling;return e?e:i()},s=function(){var e=n.element_.querySelector("."+t+'[aria-selected="true"]').previousElementSibling;return e?e:r()};if(e&&e.action){var a=e.action,c=e.target,u=void 0;switch(a.toLowerCase()){case"select":u=l(c),this.dispatchSelectEvent_(u);break;case"first":u=i();break;case"next":u=o();break;case"prev":u=s();break;case"last":u=r();break;case"upgrade":this.upgradeSlides();break;default:throw new Error('Unknown action "'+a+'". Action must be one of "first", "next", "prev", "last", "select" or "upgrade"')}if(u){var d=u.querySelector("a");d?d.focus():u.focus(),u.hasAttribute("aria-selected")||this.selectSlide_(u)}}},r.prototype.command=r.prototype.command,r.prototype.init=function(){var t=this,n=function(e){if(e.target!==t.element_){var n=void 0,i=void 0;switch(e.keyCode){case s.VK_HOME:n="first";break;case s.VK_END:n="last";break;case s.VK_ARROW_UP:case s.VK_ARROW_LEFT:n="prev";break;case s.VK_ARROW_DOWN:case s.VK_ARROW_RIGHT:n="next";break;case s.VK_ENTER:case s.VK_SPACE:n="select",i=e.target}n&&(e.preventDefault(),e.stopPropagation(),t.command({action:n,target:i}))}},i=function(e){e.preventDefault(),e.stopPropagation(),e.target!==t.element_&&t.command({action:"select",target:e.target})},r=function(e){e.preventDefault(),e.stopPropagation(),e.target!==t.element_&&t.selectSlide_(e.target)};this.element_&&(this.element_.setAttribute("role",e),this.element_.classList.contains(s.MDL_RIPPLE_EFFECT)&&this.element_.classList.add(s.MDL_RIPPLE_EFFECT_IGNORE_EVENTS),this.element_.removeEventListener("command",this.commandHandler_),this.element_.removeEventListener("keydown",n),this.element_.removeEventListener("click",i),this.element_.removeEventListener("focus",r),this.element_.addEventListener("command",this.commandHandler_.bind(this),!1),this.element_.addEventListener("keydown",n,!0),this.element_.addEventListener("click",i,!0),this.element_.addEventListener("focus",r,!0),this.upgradeSlides(),this.element_.classList.add(s.IS_UPGRADED))},componentHandler.register({constructor:r,classAsString:"MaterialExtLightboard",cssClass:"mdlext-js-lightboard",widget:!0})}()},function(e,t,n){"use strict";function i(e){return e&&e.__esModule?e:{default:e}}var r=n(8),o=i(r),s=n(32),a=i(s),l=n(67),c=i(l),u=n(64),d=i(u),f=n(31),h=i(f),p=n(13),m=i(p),_=n(2);!function(){var e="mdlext-lightbox",t="mdlext-lightbox__slider",n="mdlext-lightbox__slider__slide",i="mdlext-lightbox--sticky-footer",r="mdl-button",s=function(e){this.element_=e,this.init()};window.MaterialExtLightbox=s,s.prototype.keyDownHandler_=function(e){if(e&&(e.keyCode===_.VK_ESC||e.keyCode===_.VK_SPACE||e.keyCode===_.VK_END||e.keyCode===_.VK_HOME||e.keyCode===_.VK_ARROW_UP||e.keyCode===_.VK_ARROW_LEFT||e.keyCode===_.VK_ARROW_DOWN||e.keyCode===_.VK_ARROW_RIGHT)){e.keyCode!==_.VK_ESC&&(e.preventDefault(),e.stopPropagation());var t="first";e.keyCode===_.VK_END?t="last":e.keyCode===_.VK_ARROW_UP||e.keyCode===_.VK_ARROW_LEFT?t="prev":e.keyCode===_.VK_ARROW_DOWN||e.keyCode===_.VK_ARROW_RIGHT?t="next":e.keyCode===_.VK_SPACE?t="select":e.keyCode===_.VK_ESC&&(t="cancel"),l(t,this)}},s.prototype.buttonClickHandler_=function(t){if(t){t.preventDefault(),t.stopPropagation(),l(this.getAttribute("data-action")||"",this);var n=this.closest("."+e);n&&n.focus()}};var l=function(e,t){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:t;n.dispatchEvent(new CustomEvent("action",{bubbles:!0,cancelable:!0,detail:{action:e||"",source:t}}))},u=function(e){var t=function(e,t){return t&&e?e.offsetHeight:0},n=function(e,t){if("absolute"===window.getComputedStyle(e).position){var n=document.body.scrollTop||document.documentElement.scrollTop,i=n+(window.innerHeight-e.offsetHeight-t)/2;e.style.top=Math.max(n,i)+"px"}},r=e.parentNode,o=r&&"DIALOG"===r.nodeName?r:null;if(o&&o.hasAttribute("open")){e.style.width="auto",e.style.maxWidth="100%";var s=e.querySelector("img");s&&(e.style.maxWidth=void 0!==s.naturalWidth?s.naturalWidth+"px":s.width+"px"||"100%");var a=t(e.querySelector("footer"),e.classList.contains(i)),l=Math.max(document.documentElement.clientHeight,window.innerHeight||0)-a;if(o.offsetHeight>l)for(var c=0;o.offsetHeight>l&&++c<4;)e.style.width=e.offsetWidth*l/e.offsetHeight+"px";n(o,a)}};s.prototype.imgLoadHandler_=function(){u(this)},s.prototype.imgDragHandler_=function(e){var i=function(e,t){var n=!0,i=!1,r=void 0;try{for(var o,s=(0,h.default)((0,d.default)(t));!(n=(o=s.next()).done);n=!0){var a=(0,c.default)(o.value,2),l=a[0],u=a[1];e.style[l]=u}}catch(e){i=!0,r=e}finally{try{!n&&s.return&&s.return()}finally{if(i)throw r}}};e.preventDefault();var r=e.clientX||(void 0!==e.touches?e.touches[0].clientX:0),o=this;o.style.opacity="0.2";var s=document.createElement("div");s.classList.add(t),i(s,{width:o.offsetWidth+"px",height:o.offsetHeight+"px"});var a=document.createElement("div");a.classList.add(n),a.textContent=">",i(a,{width:o.offsetWidth+"px",height:o.offsetHeight+"px","line-height":o.offsetHeight+"px","font-size":o.offsetHeight/4+"px","text-align":"right","background-image":'url("'+(o.getAttribute("data-img-url-prev")||"")+'")'}),s.appendChild(a),a=document.createElement("div"),a.classList.add(n),i(a,{width:o.offsetWidth+"px",height:o.offsetHeight+"px","background-image":'url("'+o.src+'")'}),s.appendChild(a),a=document.createElement("div"),a.classList.add(n),a.textContent="<",i(a,{width:o.offsetWidth+"px",height:o.offsetHeight+"px","line-height":o.offsetHeight+"px","font-size":o.offsetHeight/4+"px","text-align":"left","background-image":'url("'+(o.getAttribute("data-img-url-next")||"")+'")'}),s.appendChild(a),o.parentNode.appendChild(s);var u=function(e){e.preventDefault();var t=(e.clientX||(void 0!==e.touches?e.touches[0].clientX:0))-r;s.offsetWidth-Math.abs(t)>19&&(s.style.left=t+"px")},f=function e(t){t.preventDefault(),window.removeEventListener("mousemove",u),window.removeEventListener("touchmove",u),window.removeEventListener("mouseup",e),window.removeEventListener("touchend",e);var n=s.offsetLeft;o.parentNode.removeChild(s),o.style.opacity="1.0",Math.abs(n)>19&&l(n>0?"prev":"next",o)};window.addEventListener("mousemove",u),window.addEventListener("touchmove",u),window.addEventListener("mouseup",f),window.addEventListener("touchend",f)},s.prototype.init=function(){var e=this;if(this.element_){this.element_.addEventListener("keydown",this.keyDownHandler_.bind(this.element_),!0),(0,a.default)(this.element_.getAttribute("tabindex"))||this.element_.setAttribute("tabindex",1),[].concat((0,o.default)(this.element_.querySelectorAll("."+r))).forEach(function(t){return t.addEventListener("click",e.buttonClickHandler_.bind(t),!1)});var t=this.element_.querySelector("figcaption");t&&t.addEventListener("click",this.buttonClickHandler_.bind(t),!1);var n=this.element_.querySelector("footer");n&&n.addEventListener("click",this.buttonClickHandler_.bind(n),!1);var i=this.element_.querySelector("img");i&&(i.addEventListener("load",this.imgLoadHandler_.bind(this.element_),!1),i.addEventListener("click",function(e){return e.preventDefault()},!0),i.addEventListener("mousedown",this.imgDragHandler_.bind(i),!0),i.addEventListener("touchstart",this.imgDragHandler_.bind(i),!0)),window.addEventListener("resize",(0,m.default)(function(){return u(e.element_)})),window.addEventListener("orientationchange",function(){return u(e.element_)}),this.element_.classList.add(_.IS_UPGRADED)}},componentHandler.register({constructor:s,classAsString:"MaterialExtLightbox",cssClass:"mdlext-js-lightbox"})}()},function(e,t,n){"use strict";function i(e){return e&&e.__esModule?e:{default:e}}var r=n(22),o=i(r),s=n(23),a=i(s),l=n(8),c=i(l),u=n(15),d=n(13),f=i(d),h=n(2),p=n(21),m="mdlext-js-menu-button",_="mdlext-menu",v="mdlext-menu__item",g="mdlext-menu__item-separator",b=function(e){var t=null,n=null,i=function(){[].concat((0,c.default)(e.querySelectorAll("."+v+'[aria-selected="true"]'))).forEach(function(e){return e.removeAttribute("aria-selected")})},r=function(e){var t=arguments.length>1&&void 0!==arguments[1]&&arguments[1];(t||e&&!e.hasAttribute("aria-selected"))&&(i(),e&&e.setAttribute("aria-selected","true"))},o=function(){return e.querySelector("."+v+'[aria-selected="true"]')},s=function(e){return e&&e.hasAttribute("disabled")},a=function(e){return e&&e.classList.contains(g)},l=function(e){e&&(e=e.closest("."+v)),e&&e.focus()},d=function(t){var n=t.nextElementSibling;if(n||(n=e.firstElementChild),s(n)||a(n))for(var i=e.children.length;n&&i-- >0;){if(!s(n)&&!a(n)){l(n);break}n=n.nextElementSibling,n||(n=e.firstElementChild)}else l(n)},f=function(t){var n=t.previousElementSibling;if(n||(n=e.lastElementChild),s(n)||a(n))for(var i=e.children.length;n&&i-- >0;){if(!s(n)&&!a(n)){l(n);break}n=n.previousElementSibling,n||(n=e.lastElementChild)}else l(n)},b=function(){var t=e.firstElementChild;s(t)||a(t)?d(t):l(t)},E=function(){var t=e.lastElementChild;s(t)||a(t)?f(t):l(t)},y=function(e){!e||s(e)||a(e)||(r(e),R(!0,e))},A=function(e){var t=e.target.closest("."+v);switch(e.keyCode){case h.VK_ARROW_UP:case h.VK_ARROW_LEFT:t?f(t):b();break;case h.VK_ARROW_DOWN:case h.VK_ARROW_RIGHT:t?d(t):E();break;case h.VK_HOME:b();break;case h.VK_END:E();break;case h.VK_SPACE:case h.VK_ENTER:y(t);break;case h.VK_ESC:R(!0);break;case h.VK_TAB:R(!0);break;default:return}e.preventDefault()},w=function(t){var n=t.relatedTarget||t.explicitOriginalTarget||document.activeElement;try{n?n.closest("."+_)!==e&&C(n)&&R():R()}catch(e){R()}},L=function(t){t.preventDefault();var n=t.target;if(n&&n.closest("."+_)===e){var i=n.closest("."+v);i&&y(i)}else C(n)&&R()},S=function(t){var n=t.target;n&&n.closest("."+_)===e||("touchstart"===t.type&&t.preventDefault(),R())},x=function(){e.addEventListener("keydown",A,!1),e.addEventListener("blur",w,!0),e.addEventListener("click",L,!0),document.documentElement.addEventListener("touchstart",S,!0)},k=function(){e.removeEventListener("keydown",A,!1),e.removeEventListener("blur",w,!0),e.removeEventListener("click",L,!0),document.documentElement.removeEventListener("touchstart",S,!0)},D=function(n){var i=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"first";t=n.closest("."+m),e.style["min-width"]=Math.max(124,n.getBoundingClientRect().width)+"px",e.removeAttribute("hidden"),(0,p.tether)(n,e);var r=void 0;switch(i.toLowerCase()){case"first":b();break;case"last":E();break;case"selected":r=o(),r&&!r.hasAttribute("disabled")?l(r):b()}x()},C=function(n){var i=!1,r=n&&n.closest("."+m)||null;return r&&r.getAttribute("aria-controls")===e.id?r!==t&&(i=!0):i=!0,i},R=function(){var t=arguments.length>0&&void 0!==arguments[0]&&arguments[0],n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:null;k(),e.dispatchEvent(new CustomEvent("_closemenu",{bubbles:!0,cancelable:!0,detail:{forceFocus:t,item:n}}))},I=function(){e.hasAttribute("id")||(e.id="menu-button-"+(0,u.randomString)()),e.setAttribute("tabindex","-1"),e.setAttribute("role","menu"),e.setAttribute("hidden",""),[].concat((0,c.default)(e.querySelectorAll("."+v))).forEach(function(e){e.setAttribute("tabindex","-1"),e.setAttribute("role","menuitem")}),[].concat((0,c.default)(e.querySelectorAll("."+g))).forEach(function(e){e.setAttribute("role","separator")})},O=function(){I(),n=e.parentNode,e.classList.add("is-upgraded")},M=function(){k(),e.parentNode!==n&&n.appendChild(e),e.classList.remove("is-upgraded")};return O(),{get element(){return e},set selected(e){r(e,!0)},open:function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"first";return D(e,t)},removeListeners:function(){return k()},downgrade:function(){return M()}}},E=function(){function e(t){var n=this;(0,o.default)(this,e),this.keyDownHandler=function(e){if(!n.isDisabled())switch(e.keyCode){case h.VK_ARROW_UP:n.openMenu("last");break;case h.VK_ARROW_DOWN:n.openMenu();break;case h.VK_SPACE:case h.VK_ENTER:n.openMenu("selected");break;case h.VK_ESC:n.closeMenu();break;case h.VK_TAB:return void n.closeMenu();default:return}e.preventDefault()},this.clickHandler=function(){n.isDisabled()||("true"===n.element.getAttribute("aria-expanded").toLowerCase()?n.closeMenu(!0):n.openMenu("selected"))},this.recalcMenuPosition=(0,f.default)(function(){var e=n.focusElement.getBoundingClientRect(),t=n.focusElementLastScrollPosition.left-e.left,i=n.focusElementLastScrollPosition.top-e.top,r=(parseFloat(n.menu.element.style.left)||0)-t,o=(parseFloat(n.menu.element.style.top)||0)-i;n.menu.element.style.left=r+"px",n.menu.element.style.top=o+"px",n.focusElementLastScrollPosition=e}),this.positionChangeHandler=function(){n.recalcMenuPosition(n)},this.closeMenuHandler=function(e){e&&e.detail&&(e.detail.item&&e.detail.item!==n.selectedItem&&(n.selectedItem=e.detail.item,n.dispatchMenuSelect()),n.closeMenu(e.detail.forceFocus))},this.element=t,this.focusElement=void 0,this.focusElementLastScrollPosition=void 0,this.scrollElements=[],this.menu=void 0,this.selectedItem=null,this.init()}return(0,a.default)(e,[{key:"dispatchMenuSelect",value:function(){this.element.dispatchEvent(new CustomEvent("menuselect",{bubbles:!0,cancelable:!0,detail:{source:this.selectedItem}}))}},{key:"isDisabled",value:function(){return this.element.hasAttribute("disabled")}},{key:"removeListeners",value:function(){this.element.removeEventListener("keydown",this.keyDownHandler),this.element.removeEventListener("click",this.clickHandler)}},{key:"openMenu",value:function(){var e=this,t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"first";!this.isDisabled()&&this.menu&&(this.scrollElements=(0,p.getScrollParents)(this.element),this.scrollElements.forEach(function(t){return t.addEventListener("scroll",e.positionChangeHandler)}),window.addEventListener("resize",this.positionChangeHandler),window.addEventListener("orientationchange",this.positionChangeHandler),this.menu.element.addEventListener("_closemenu",this.closeMenuHandler),this.menu.selected=this.selectedItem,this.menu.open(this.focusElement,t),this.element.setAttribute("aria-expanded","true"),this.focusElementLastScrollPosition=this.focusElement.getBoundingClientRect())}},{key:"closeMenu",value:function(){var e=this,t=arguments.length>0&&void 0!==arguments[0]&&arguments[0];this.menu&&(this.menu.removeListeners(),this.scrollElements.forEach(function(t){return t.removeEventListener("scroll",e.positionChangeHandler)}),window.removeEventListener("resize",this.positionChangeHandler),window.removeEventListener("orientationchange",this.positionChangeHandler),this.menu.element.removeEventListener("_closemenu",this.closeMenuHandler),t&&this.focus(),this.element.setAttribute("aria-expanded","false"),this.menu.element.setAttribute("hidden",""))}},{key:"focus",value:function(){this.isDisabled()||this.focusElement.focus()}},{key:"init",value:function(){var e=this,t=function(){e.element.addEventListener("keydown",e.keyDownHandler),e.element.addEventListener("click",e.clickHandler)},n=function(){e.element.setAttribute("role","button"),e.element.setAttribute("aria-expanded","false"),e.element.setAttribute("aria-haspopup","true")},i=function(){e.focusElement=e.element.querySelector('input[type="text"]'),e.focusElement||(e.focusElement=e.element,"button"!==e.focusElement.tagName.toLowerCase()&&"input"!==e.focusElement.tagName.toLowerCase()&&(e.focusElement.hasAttribute("tabindex")||e.focusElement.setAttribute("tabindex","0")))},r=function(e){return e.parentNode!==document.body?document.body.appendChild(e):e},o=function(){var t=void 0,n=e.element.getAttribute("aria-controls");return t=null!==n?document.querySelector("#"+n):e.element.parentNode.querySelector("."+_)},s=function(){var t=o();t&&(t.componentInstance?e.menu=t.componentInstance:(e.menu=b(t),t.componentInstance=e.menu,r(t)),e.element.setAttribute("aria-controls",e.menu.element.id))};i(),n(),s(),this.removeListeners(),t()}},{key:"downgrade",value:function(){var e=this;if(this.menu){var t=[].concat((0,c.default)(document.querySelectorAll("."+m+'[aria-controls="'+this.element.getAttribute("aria-controls")+'"]')));0===t.filter(function(t){return t!==e.element&&t.getAttribute("data-upgraded").indexOf("MaterialExtMenuButton")>=0}).length&&this.menu.downgrade()}this.removeListeners()}}]),e}();!function(){var e=function(e){this.element_=e,this.menuButton_=null,this.init()};window.MaterialExtMenuButton=e,e.prototype.getMenuElement=function(){return this.menuButton_.menu?this.menuButton_.menu.element:null},e.prototype.getMenuElement=e.prototype.getMenuElement,e.prototype.openMenu=function(e){this.menuButton_.openMenu(e)},e.prototype.openMenu=e.prototype.openMenu,e.prototype.closeMenu=function(){this.menuButton_.closeMenu(!0)},e.prototype.closeMenu=e.prototype.closeMenu,e.prototype.getSelectedMenuItem=function(){return this.menuButton_.selectedItem},e.prototype.getSelectedMenuItem=e.prototype.getSelectedMenuItem,e.prototype.setSelectedMenuItem=function(e){this.menuButton_.selectedItem=e},e.prototype.setSelectedMenuItem=e.prototype.setSelectedMenuItem,e.prototype.init=function(){this.element_&&(this.menuButton_=new E(this.element_),this.element_.addEventListener("mdl-componentdowngraded",this.mdlDowngrade_.bind(this)),this.element_.classList.add(h.IS_UPGRADED))},e.prototype.mdlDowngrade_=function(){this.menuButton_.downgrade()},componentHandler.register({constructor:e,classAsString:"MaterialExtMenuButton",cssClass:m,widget:!0})}()},function(e,t,n){"use strict";var i=n(15),r=n(2);!function(){var e="mdlext-selectfield__label",t="mdlext-selectfield__select",n=function(e){this.element_=e,this.init()};window.MaterialExtSelectfield=n,n.prototype.onFocus_=function(){this.element_.classList.add(r.IS_FOCUSED)},n.prototype.onBlur_=function(){this.element_.classList.remove(r.IS_FOCUSED)},n.prototype.onReset_=function(){this.updateClasses_()},n.prototype.updateClasses_=function(){this.checkDisabled(),this.checkValidity(),this.checkDirty(),this.checkFocus()},n.prototype.checkDisabled=function(){this.select_.disabled?this.element_.classList.add(r.IS_DISABLED):this.element_.classList.remove(r.IS_DISABLED)},n.prototype.checkDisabled=n.prototype.checkDisabled,n.prototype.checkFocus=function(){Boolean(this.element_.querySelector(":focus"))?this.element_.classList.add(r.IS_FOCUSED):this.element_.classList.remove(r.IS_FOCUSED)},n.prototype.checkFocus=n.prototype.checkFocus,n.prototype.checkValidity=function(){},n.prototype.checkValidity=n.prototype.checkValidity,n.prototype.checkDirty=function(){this.select_.value&&this.select_.value.length>0?this.element_.classList.add(r.IS_DIRTY):this.element_.classList.remove(r.IS_DIRTY)},n.prototype.checkDirty=n.prototype.checkDirty,n.prototype.disable=function(){this.select_.disabled=!0,this.updateClasses_()},n.prototype.disable=n.prototype.disable,n.prototype.enable=function(){this.select_.disabled=!1,this.updateClasses_()},n.prototype.enable=n.prototype.enable,n.prototype.change=function(e){this.select_.value=e||"",this.updateClasses_()},n.prototype.change=n.prototype.change,n.prototype.init=function(){if(this.element_&&(this.label_=this.element_.querySelector("."+e),this.select_=this.element_.querySelector("."+t))){if(this.select_.removeEventListener("change",this.updateClasses_),this.select_.removeEventListener("focus",this.onFocus_),this.select_.removeEventListener("blur",this.onBlur_),this.select_.removeEventListener("reset",this.onReset_),this.select_.addEventListener("change",this.updateClasses_.bind(this)),this.select_.addEventListener("focus",this.onFocus_.bind(this)),this.select_.addEventListener("blur",this.onBlur_.bind(this)),this.select_.addEventListener("reset",this.onReset_.bind(this)),this.label_){var n=void 0;this.select_.hasAttribute("id")?n=this.select_.id:(n="select-"+(0,i.randomString)(),this.select_.id=n),this.label_.hasAttribute("for")||this.label_.setAttribute("for",n)}var o=this.element_.classList.contains(r.IS_INVALID);this.updateClasses_(),this.element_.classList.add(r.IS_UPGRADED),o&&this.element_.classList.add(r.IS_INVALID),this.select_.hasAttribute("autofocus")&&(this.element_.focus(),this.checkFocus())}},componentHandler.register({constructor:n,classAsString:"MaterialExtSelectfield",cssClass:"mdlext-js-selectfield",
+widget:!0})}()},function(e,t,n){"use strict";function i(e){return e&&e.__esModule?e:{default:e}}var r=n(13),o=i(r),s=n(14),a=n(2);!function(){var e="mdl-layout__content",t="mdlext-is-scroll",n=function(e){this.header_=e,this.content_=null,this.lastScrollTop_=0,this.config_={visibleAtScrollEnd:!1},this.mutationObserver_=null,this.drawing_=!1,this.init()};window.MaterialExtStickyHeader=n,n.prototype.recalcWidth_=function(){this.header_.style.width=this.content_.clientWidth+"px"};var i=(0,o.default)(function(e){return e.recalcWidth_()});n.prototype.resizeHandler_=function(){i(this)},n.prototype.reposition_=function(){var e=this.content_.scrollTop,n=this.lastScrollTop_-e;if(e<=0)this.header_.style.top="0",this.header_.classList.remove(t);else{if(n>0){if(n>=this.header_.offsetHeight){var i=parseInt(window.getComputedStyle(this.header_).getPropertyValue("top"))||0;0!=i&&(this.header_.style.top="0",this.header_.classList.add(t)),this.lastScrollTop_=e}return}if(n<0){this.header_.classList.add(t);var r=parseInt(window.getComputedStyle(this.header_).getPropertyValue("top"))||0;if(this.content_.scrollHeight-this.content_.scrollTop<=this.content_.offsetHeight)0!=r&&(this.header_.style.top=this.config_.visibleAtScrollEnd?"0":"-"+this.header_.offsetHeight+"px");else{r+=n;var o=this.header_.offsetHeight;this.header_.style.top=(Math.abs(r)>o?-o:r)+"px"}}}this.lastScrollTop_=e};var r=(0,o.default)(function(e){return e.reposition_()});n.prototype.scrollHandler_=function(){r(this)},n.prototype.updatePosition_=function(){this.recalcWidth_(),this.reposition_()},n.prototype.addMutationObserver_=function(){var e=this;this.mutationObserver_=new MutationObserver(function(){e.updatePosition_()}),this.mutationObserver_.observe(this.content_,{attributes:!1,childList:!0,characterData:!1,subtree:!0})},n.prototype.removeListeners_=function(){window.removeEventListener("resize",this.resizeHandler_),window.removeEventListener("orientationchange",this.resizeHandler_),this.content_&&this.content_.removeEventListener("scroll",this.scrollHandler_),this.mutationObserver_&&(this.mutationObserver_.disconnect(),this.mutationObserver_=null)},n.prototype.init=function(){this.header_&&(this.removeListeners_(),this.header_.hasAttribute("data-config")&&(this.config_=(0,s.jsonStringToObject)(this.header_.getAttribute("data-config"))),this.content_=this.header_.parentNode.querySelector("."+e)||null,this.content_&&(this.content_.style.paddingTop=this.header_.offsetHeight+"px",this.lastScrollTop_=this.content_.scrollTop,this.content_.addEventListener("scroll",this.scrollHandler_.bind(this)),window.addEventListener("resize",this.resizeHandler_.bind(this)),window.addEventListener("orientationchange",this.resizeHandler_.bind(this)),this.addMutationObserver_(),this.updatePosition_(),this.header_.classList.add(a.IS_UPGRADED)))},componentHandler.register({constructor:n,classAsString:"MaterialExtStickyHeader",cssClass:"mdlext-js-sticky-header"})}()},function(e,t,n){"use strict";n(2),n(21),n(15),n(14),n(13),n(29),n(30)},function(e,t,n){e.exports={default:n(68),__esModule:!0}},function(e,t,n){e.exports={default:n(70),__esModule:!0}},function(e,t,n){e.exports={default:n(72),__esModule:!0}},function(e,t,n){e.exports={default:n(74),__esModule:!0}},function(e,t,n){e.exports={default:n(75),__esModule:!0}},function(e,t,n){e.exports={default:n(76),__esModule:!0}},function(e,t,n){e.exports={default:n(77),__esModule:!0}},function(e,t,n){"use strict";function i(e){return e&&e.__esModule?e:{default:e}}t.__esModule=!0;var r=n(61),o=i(r),s=n(31),a=i(s);t.default=function(){function e(e,t){var n=[],i=!0,r=!1,o=void 0;try{for(var s,l=(0,a.default)(e);!(i=(s=l.next()).done)&&(n.push(s.value),!t||n.length!==t);i=!0);}catch(e){r=!0,o=e}finally{try{!i&&l.return&&l.return()}finally{if(r)throw o}}return n}return function(t,n){if(Array.isArray(t))return t;if((0,o.default)(Object(t)))return e(t,n);throw new TypeError("Invalid attempt to destructure non-iterable instance")}}()},function(e,t,n){n(28),n(104),e.exports=n(1).Array.from},function(e,t,n){n(48),n(28),e.exports=n(102)},function(e,t,n){n(48),n(28),e.exports=n(103)},function(e,t,n){n(106),e.exports=n(1).Number.isInteger},function(e,t,n){n(107),e.exports=n(1).Number.isNaN},function(e,t,n){n(108),e.exports=n(1).Object.assign},function(e,t,n){n(109);var i=n(1).Object;e.exports=function(e,t,n){return i.defineProperty(e,t,n)}},function(e,t,n){n(112),e.exports=n(1).Object.entries},function(e,t,n){n(110),e.exports=n(1).Object.keys},function(e,t,n){n(111),e.exports=n(1).Reflect.apply},function(e,t){e.exports=function(){}},function(e,t,n){var i=n(19),r=n(45),o=n(100);e.exports=function(e){return function(t,n,s){var a,l=i(t),c=r(l.length),u=o(s,c);if(e&&n!=n){for(;c>u;)if(a=l[u++],a!=a)return!0}else for(;c>u;u++)if((e||u in l)&&l[u]===n)return e||u||0;return!e&&-1}}},function(e,t,n){"use strict";var i=n(12),r=n(25);e.exports=function(e,t,n){t in e?i.f(e,t,r(0,n)):e[t]=n}},function(e,t,n){e.exports=n(5).document&&document.documentElement},function(e,t,n){e.exports=!n(9)&&!n(10)(function(){return 7!=Object.defineProperty(n(38)("div"),"a",{get:function(){return 7}}).a})},function(e,t,n){var i=n(7),r=n(4)("iterator"),o=Array.prototype;e.exports=function(e){return void 0!==e&&(i.Array===e||o[r]===e)}},function(e,t,n){var i=n(17),r=Math.floor;e.exports=function(e){return!i(e)&&isFinite(e)&&r(e)===e}},function(e,t,n){var i=n(6);e.exports=function(e,t,n,r){try{return r?t(i(n)[0],n[1]):t(n)}catch(t){var o=e.return;throw void 0!==o&&i(o.call(e)),t}}},function(e,t,n){"use strict";var i=n(91),r=n(25),o=n(43),s={};n(11)(s,n(4)("iterator"),function(){return this}),e.exports=function(e,t,n){e.prototype=i(s,{next:r(1,n)}),o(e,t+" Iterator")}},function(e,t,n){var i=n(4)("iterator"),r=!1;try{var o=[7][i]();o.return=function(){r=!0},Array.from(o,function(){throw 2})}catch(e){}e.exports=function(e,t){if(!t&&!r)return!1;var n=!1;try{var o=[7],s=o[i]();s.next=function(){return{done:n=!0}},o[i]=function(){return s},e(o)}catch(e){}return n}},function(e,t){e.exports=function(e,t){return{value:t,done:!!e}}},function(e,t){e.exports=!0},function(e,t,n){"use strict";var i=n(18),r=n(93),o=n(42),s=n(20),a=n(40),l=Object.assign;e.exports=!l||n(10)(function(){var e={},t={},n=Symbol(),i="abcdefghijklmnopqrst";return e[n]=7,i.split("").forEach(function(e){t[e]=e}),7!=l({},e)[n]||Object.keys(l({},t)).join("")!=i})?function(e,t){for(var n=s(e),l=arguments.length,c=1,u=r.f,d=o.f;l>c;)for(var f,h=a(arguments[c++]),p=u?i(h).concat(u(h)):i(h),m=p.length,_=0;m>_;)d.call(h,f=p[_++])&&(n[f]=h[f]);return n}:l},function(e,t,n){var i=n(6),r=n(92),o=n(39),s=n(26)("IE_PROTO"),a=function(){},l="prototype",c=function(){var e,t=n(38)("iframe"),i=o.length,r="<",s=">";for(t.style.display="none",n(81).appendChild(t),t.src="javascript:",e=t.contentWindow.document,e.open(),e.write(r+"script"+s+"document.F=Object"+r+"/script"+s),e.close(),c=e.F;i--;)delete c[l][o[i]];return c()};e.exports=Object.create||function(e,t){var n;return null!==e?(a[l]=i(e),n=new a,a[l]=null,n[s]=e):n=c(),void 0===t?n:r(n,t)}},function(e,t,n){var i=n(12),r=n(6),o=n(18);e.exports=n(9)?Object.defineProperties:function(e,t){r(e);for(var n,s=o(t),a=s.length,l=0;a>l;)i.f(e,n=s[l++],t[n]);return e}},function(e,t){t.f=Object.getOwnPropertySymbols},function(e,t,n){var i=n(16),r=n(20),o=n(26)("IE_PROTO"),s=Object.prototype;e.exports=Object.getPrototypeOf||function(e){return e=r(e),i(e,o)?e[o]:"function"==typeof e.constructor&&e instanceof e.constructor?e.constructor.prototype:e instanceof Object?s:null}},function(e,t,n){var i=n(16),r=n(19),o=n(79)(!1),s=n(26)("IE_PROTO");e.exports=function(e,t){var n,a=r(e),l=0,c=[];for(n in a)n!=s&&i(a,n)&&c.push(n);for(;t.length>l;)i(a,n=t[l++])&&(~o(c,n)||c.push(n));return c}},function(e,t,n){var i=n(3),r=n(1),o=n(10);e.exports=function(e,t){var n=(r.Object||{})[e]||Object[e],s={};s[e]=t(n),i(i.S+i.F*o(function(){n(1)}),"Object",s)}},function(e,t,n){var i=n(18),r=n(19),o=n(42).f;e.exports=function(e){return function(t){for(var n,s=r(t),a=i(s),l=a.length,c=0,u=[];l>c;)o.call(s,n=a[c++])&&u.push(e?[n,s[n]]:s[n]);return u}}},function(e,t,n){e.exports=n(11)},function(e,t,n){var i=n(27),r=n(24);e.exports=function(e){return function(t,n){var o,s,a=String(r(t)),l=i(n),c=a.length;return l<0||l>=c?e?"":void 0:(o=a.charCodeAt(l),o<55296||o>56319||l+1===c||(s=a.charCodeAt(l+1))<56320||s>57343?e?a.charAt(l):o:e?a.slice(l,l+2):(o-55296<<10)+(s-56320)+65536)}}},function(e,t,n){var i=n(27),r=Math.max,o=Math.min;e.exports=function(e,t){return e=i(e),e<0?r(e+t,0):o(e,t)}},function(e,t,n){var i=n(17);e.exports=function(e,t){if(!i(e))return e;var n,r;if(t&&"function"==typeof(n=e.toString)&&!i(r=n.call(e)))return r;if("function"==typeof(n=e.valueOf)&&!i(r=n.call(e)))return r;if(!t&&"function"==typeof(n=e.toString)&&!i(r=n.call(e)))return r;throw TypeError("Can't convert object to primitive value")}},function(e,t,n){var i=n(6),r=n(47);e.exports=n(1).getIterator=function(e){var t=r(e);if("function"!=typeof t)throw TypeError(e+" is not iterable!");return i(t.call(e))}},function(e,t,n){var i=n(35),r=n(4)("iterator"),o=n(7);e.exports=n(1).isIterable=function(e){var t=Object(e);return void 0!==t[r]||"@@iterator"in t||o.hasOwnProperty(i(t))}},function(e,t,n){"use strict";var i=n(37),r=n(3),o=n(20),s=n(85),a=n(83),l=n(45),c=n(80),u=n(47);r(r.S+r.F*!n(87)(function(e){Array.from(e)}),"Array",{from:function(e){var t,n,r,d,f=o(e),h="function"==typeof this?this:Array,p=arguments.length,m=p>1?arguments[1]:void 0,_=void 0!==m,v=0,g=u(f);if(_&&(m=i(m,p>2?arguments[2]:void 0,2)),void 0==g||h==Array&&a(g))for(t=l(f.length),n=new h(t);t>v;v++)c(n,v,_?m(f[v],v):f[v]);else for(d=g.call(f),n=new h;!(r=d.next()).done;v++)c(n,v,_?s(d,m,[r.value,v],!0):r.value);return n.length=v,n}})},function(e,t,n){"use strict";var i=n(78),r=n(88),o=n(7),s=n(19);e.exports=n(41)(Array,"Array",function(e,t){this._t=s(e),this._i=0,this._k=t},function(){var e=this._t,t=this._k,n=this._i++;return!e||n>=e.length?(this._t=void 0,r(1)):"keys"==t?r(0,n):"values"==t?r(0,e[n]):r(0,[n,e[n]])},"values"),o.Arguments=o.Array,i("keys"),i("values"),i("entries")},function(e,t,n){var i=n(3);i(i.S,"Number",{isInteger:n(84)})},function(e,t,n){var i=n(3);i(i.S,"Number",{isNaN:function(e){return e!=e}})},function(e,t,n){var i=n(3);i(i.S+i.F,"Object",{assign:n(90)})},function(e,t,n){var i=n(3);i(i.S+i.F*!n(9),"Object",{defineProperty:n(12).f})},function(e,t,n){var i=n(20),r=n(18);n(96)("keys",function(){return function(e){return r(i(e))}})},function(e,t,n){var i=n(3),r=n(34),o=n(6),s=(n(5).Reflect||{}).apply,a=Function.apply;i(i.S+i.F*!n(10)(function(){s(function(){})}),"Reflect",{apply:function(e,t,n){var i=r(e),l=o(n);return s?s(i,t,l):a.call(i,t,l)}})},function(e,t,n){var i=n(3),r=n(97)(!0);i(i.S,"Object",{entries:function(e){return r(e)}})},function(e,t){}])});
+//# sourceMappingURL=mdl-ext.min.js.map
\ No newline at end of file
