!function(t,e){"object"==typeof exports&&"undefined"!=typeof module?e(exports,require("@angular/core"),require("@angular/cdk/coercion"),require("rxjs"),require("rxjs/operators"),require("@angular/cdk/platform")):"function"==typeof define&&define.amd?define("@angular/cdk/layout",["exports","@angular/core","@angular/cdk/coercion","rxjs","rxjs/operators","@angular/cdk/platform"],e):e(((t=t||self).ng=t.ng||{},t.ng.cdk=t.ng.cdk||{},t.ng.cdk.layout={}),t.ng.core,t.ng.cdk.coercion,t.rxjs,t.rxjs.operators,t.ng.cdk.platform)}(this,(function(t,e,n,r,a,i){"use strict";
/**
     * @license
     * Copyright Google LLC All Rights Reserved.
     *
     * Use of this source code is governed by an MIT-style license that can be
     * found in the LICENSE file at https://angular.io/license
     */var o;(o=function o(){}).decorators=[{type:e.NgModule,args:[{}]}];
/**
     * @license
     * Copyright Google LLC All Rights Reserved.
     *
     * Use of this source code is governed by an MIT-style license that can be
     * found in the LICENSE file at https://angular.io/license
     */
var d,c=new Set,s=function(){function t(t){this._platform=t,this._matchMedia=this._platform.isBrowser&&window.matchMedia?window.matchMedia.bind(window):u}return t.prototype.matchMedia=function(t){return this._platform.WEBKIT&&function e(t){if(!c.has(t))try{d||((d=document.createElement("style")).setAttribute("type","text/css"),document.head.appendChild(d)),d.sheet&&(d.sheet.insertRule("@media "+t+" {.fx-query-test{ }}",0),c.add(t))}catch(t){console.error(t)}}(t),this._matchMedia(t)},t}();function u(t){return{matches:"all"===t||""===t,media:t,addListener:function(){},removeListener:function(){}}}
/**
     * @license
     * Copyright Google LLC All Rights Reserved.
     *
     * Use of this source code is governed by an MIT-style license that can be
     * found in the LICENSE file at https://angular.io/license
     */s.ɵprov=e.ɵɵdefineInjectable({factory:function t(){return new s(e.ɵɵinject(i.Platform))},token:s,providedIn:"root"}),s.decorators=[{type:e.Injectable,args:[{providedIn:"root"}]}],s.ctorParameters=function(){return[{type:i.Platform}]};var p=function(){function t(t,e){this._mediaMatcher=t,this._zone=e,this._queries=new Map,this._destroySubject=new r.Subject}return t.prototype.ngOnDestroy=function(){this._destroySubject.next(),this._destroySubject.complete()},t.prototype.isMatched=function(t){var e=this;return m(n.coerceArray(t)).some((function(t){return e._registerQuery(t).mql.matches}))},t.prototype.observe=function(t){var e=this,i=m(n.coerceArray(t)).map((function(t){return e._registerQuery(t).observable})),o=r.combineLatest(i);return(o=r.concat(o.pipe(a.take(1)),o.pipe(a.skip(1),a.debounceTime(0)))).pipe(a.map((function(t){var e={matches:!1,breakpoints:{}};return t.forEach((function(t){var n=t.matches,r=t.query;e.matches=e.matches||n,e.breakpoints[r]=n})),e})))},t.prototype._registerQuery=function(t){var e=this;if(this._queries.has(t))return this._queries.get(t);var n=this._mediaMatcher.matchMedia(t),i={observable:new r.Observable((function(t){var r=function(n){return e._zone.run((function(){return t.next(n)}))};return n.addListener(r),function(){n.removeListener(r)}})).pipe(a.startWith(n),a.map((function(e){return{query:t,matches:e.matches}})),a.takeUntil(this._destroySubject)),mql:n};return this._queries.set(t,i),i},t}();function m(t){return t.map((function(t){return t.split(",")})).reduce((function(t,e){return t.concat(e)})).map((function(t){return t.trim()}))}
/**
     * @license
     * Copyright Google LLC All Rights Reserved.
     *
     * Use of this source code is governed by an MIT-style license that can be
     * found in the LICENSE file at https://angular.io/license
     */p.ɵprov=e.ɵɵdefineInjectable({factory:function t(){return new p(e.ɵɵinject(s),e.ɵɵinject(e.NgZone))},token:p,providedIn:"root"}),p.decorators=[{type:e.Injectable,args:[{providedIn:"root"}]}],p.ctorParameters=function(){return[{type:s},{type:e.NgZone}]},
/**
     * @license
     * Copyright Google LLC All Rights Reserved.
     *
     * Use of this source code is governed by an MIT-style license that can be
     * found in the LICENSE file at https://angular.io/license
     */
t.BreakpointObserver=p,t.Breakpoints={XSmall:"(max-width: 599.98px)",Small:"(min-width: 600px) and (max-width: 959.98px)",Medium:"(min-width: 960px) and (max-width: 1279.98px)",Large:"(min-width: 1280px) and (max-width: 1919.98px)",XLarge:"(min-width: 1920px)",Handset:"(max-width: 599.98px) and (orientation: portrait), (max-width: 959.98px) and (orientation: landscape)",Tablet:"(min-width: 600px) and (max-width: 839.98px) and (orientation: portrait), (min-width: 960px) and (max-width: 1279.98px) and (orientation: landscape)",Web:"(min-width: 840px) and (orientation: portrait), (min-width: 1280px) and (orientation: landscape)",HandsetPortrait:"(max-width: 599.98px) and (orientation: portrait)",TabletPortrait:"(min-width: 600px) and (max-width: 839.98px) and (orientation: portrait)",WebPortrait:"(min-width: 840px) and (orientation: portrait)",HandsetLandscape:"(max-width: 959.98px) and (orientation: landscape)",TabletLandscape:"(min-width: 960px) and (max-width: 1279.98px) and (orientation: landscape)",WebLandscape:"(min-width: 1280px) and (orientation: landscape)"},t.LayoutModule=o,t.MediaMatcher=s,Object.defineProperty(t,"__esModule",{value:!0})}));