{"version":3,"file":"scrolling.js","sources":["../../../src/cdk/scrolling/viewport-ruler.ts","../../../src/cdk/scrolling/scrolling-module.ts","../../../src/cdk/scrolling/virtual-for-of.ts","../../../src/cdk/scrolling/virtual-scroll-viewport.ts","../../../src/cdk/scrolling/scrollable.ts","../../../src/cdk/scrolling/scroll-dispatcher.ts","../../../src/cdk/scrolling/fixed-size-virtual-scroll.ts","../../../src/cdk/scrolling/virtual-scroll-strategy.ts"],"sourcesContent":["/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n\nimport {Platform} from '@angular/cdk/platform';\nimport {Injectable, NgZone, OnDestroy, Optional, SkipSelf} from '@angular/core';\nimport {merge, of as observableOf, fromEvent, Observable, Subscription} from 'rxjs';\nimport {auditTime} from 'rxjs/operators';\n\n/** Time in ms to throttle the resize events by default. */\nexport const DEFAULT_RESIZE_TIME = 20;\n\n/** Object that holds the scroll position of the viewport in each direction. */\nexport interface ViewportScrollPosition {\n  top: number;\n  left: number;\n}\n\n/**\n * Simple utility for getting the bounds of the browser viewport.\n * @docs-private\n */\n@Injectable({providedIn: 'root'})\nexport class ViewportRuler implements OnDestroy {\n  /** Cached viewport dimensions. */\n  private _viewportSize: {width: number; height: number};\n\n  /** Stream of viewport change events. */\n  private _change: Observable<Event>;\n\n  /** Subscription to streams that invalidate the cached viewport dimensions. */\n  private _invalidateCache: Subscription;\n\n  constructor(private _platform: Platform, ngZone: NgZone) {\n    ngZone.runOutsideAngular(() => {\n      this._change = _platform.isBrowser ?\n          merge(fromEvent(window, 'resize'), fromEvent(window, 'orientationchange')) :\n          observableOf();\n\n      // Note that we need to do the subscription inside `runOutsideAngular`\n      // since subscribing is what causes the event listener to be added.\n      this._invalidateCache = this.change().subscribe(() => this._updateViewportSize());\n    });\n  }\n\n  ngOnDestroy() {\n    this._invalidateCache.unsubscribe();\n  }\n\n  /** Returns the viewport's width and height. */\n  getViewportSize(): Readonly<{width: number, height: number}> {\n    if (!this._viewportSize) {\n      this._updateViewportSize();\n    }\n\n    const output = {width: this._viewportSize.width, height: this._viewportSize.height};\n\n    // If we're not on a browser, don't cache the size since it'll be mocked out anyway.\n    if (!this._platform.isBrowser) {\n      this._viewportSize = null!;\n    }\n\n    return output;\n  }\n\n  /** Gets a ClientRect for the viewport's bounds. */\n  getViewportRect(): ClientRect {\n    // Use the document element's bounding rect rather than the window scroll properties\n    // (e.g. pageYOffset, scrollY) due to in issue in Chrome and IE where window scroll\n    // properties and client coordinates (boundingClientRect, clientX/Y, etc.) are in different\n    // conceptual viewports. Under most circumstances these viewports are equivalent, but they\n    // can disagree when the page is pinch-zoomed (on devices that support touch).\n    // See https://bugs.chromium.org/p/chromium/issues/detail?id=489206#c4\n    // We use the documentElement instead of the body because, by default (without a css reset)\n    // browsers typically give the document body an 8px margin, which is not included in\n    // getBoundingClientRect().\n    const scrollPosition = this.getViewportScrollPosition();\n    const {width, height} = this.getViewportSize();\n\n    return {\n      top: scrollPosition.top,\n      left: scrollPosition.left,\n      bottom: scrollPosition.top + height,\n      right: scrollPosition.left + width,\n      height,\n      width,\n    };\n  }\n\n  /** Gets the (top, left) scroll position of the viewport. */\n  getViewportScrollPosition(): ViewportScrollPosition {\n    // While we can get a reference to the fake document\n    // during SSR, it doesn't have getBoundingClientRect.\n    if (!this._platform.isBrowser) {\n      return {top: 0, left: 0};\n    }\n\n    // The top-left-corner of the viewport is determined by the scroll position of the document\n    // body, normally just (scrollLeft, scrollTop). However, Chrome and Firefox disagree about\n    // whether `document.body` or `document.documentElement` is the scrolled element, so reading\n    // `scrollTop` and `scrollLeft` is inconsistent. However, using the bounding rect of\n    // `document.documentElement` works consistently, where the `top` and `left` values will\n    // equal negative the scroll position.\n    const documentElement = document.documentElement!;\n    const documentRect = documentElement.getBoundingClientRect();\n\n    const top = -documentRect.top || document.body.scrollTop || window.scrollY ||\n                 documentElement.scrollTop || 0;\n\n    const left = -documentRect.left || document.body.scrollLeft || window.scrollX ||\n                  documentElement.scrollLeft || 0;\n\n    return {top, left};\n  }\n\n  /**\n   * Returns a stream that emits whenever the size of the viewport changes.\n   * @param throttleTime Time in milliseconds to throttle the stream.\n   */\n  change(throttleTime: number = DEFAULT_RESIZE_TIME): Observable<Event> {\n    return throttleTime > 0 ? this._change.pipe(auditTime(throttleTime)) : this._change;\n  }\n\n  /** Updates the cached viewport size. */\n  private _updateViewportSize() {\n    this._viewportSize = this._platform.isBrowser ?\n        {width: window.innerWidth, height: window.innerHeight} :\n        {width: 0, height: 0};\n  }\n}\n\n\n/** @docs-private @deprecated @breaking-change 8.0.0 */\nexport function VIEWPORT_RULER_PROVIDER_FACTORY(parentRuler: ViewportRuler,\n                                                platform: Platform,\n                                                ngZone: NgZone) {\n  return parentRuler || new ViewportRuler(platform, ngZone);\n}\n\n/** @docs-private @deprecated @breaking-change 8.0.0 */\nexport const VIEWPORT_RULER_PROVIDER = {\n  // If there is already a ViewportRuler available, use that. Otherwise, provide a new one.\n  provide: ViewportRuler,\n  deps: [[new Optional(), new SkipSelf(), ViewportRuler], Platform, NgZone],\n  useFactory: VIEWPORT_RULER_PROVIDER_FACTORY\n};\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n\nimport {BidiModule} from '@angular/cdk/bidi';\nimport {PlatformModule} from '@angular/cdk/platform';\nimport {NgModule} from '@angular/core';\nimport {CdkFixedSizeVirtualScroll} from './fixed-size-virtual-scroll';\nimport {CdkScrollable} from './scrollable';\nimport {CdkVirtualForOf} from './virtual-for-of';\nimport {CdkVirtualScrollViewport} from './virtual-scroll-viewport';\n\n@NgModule({\n  imports: [BidiModule, PlatformModule],\n  exports: [\n    BidiModule,\n    CdkFixedSizeVirtualScroll,\n    CdkScrollable,\n    CdkVirtualForOf,\n    CdkVirtualScrollViewport,\n  ],\n  declarations: [\n    CdkFixedSizeVirtualScroll,\n    CdkScrollable,\n    CdkVirtualForOf,\n    CdkVirtualScrollViewport,\n  ],\n})\nexport class ScrollingModule {}\n\n/**\n * @deprecated ScrollDispatchModule has been renamed to ScrollingModule.\n * @breaking-change 8.0.0 delete this alias\n */\n@NgModule({\n  imports: [ScrollingModule],\n  exports: [ScrollingModule],\n})\nexport class ScrollDispatchModule {}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n\nimport {\n  ArrayDataSource,\n  CollectionViewer,\n  DataSource,\n  ListRange,\n  isDataSource,\n} from '@angular/cdk/collections';\nimport {\n  Directive,\n  DoCheck,\n  EmbeddedViewRef,\n  Input,\n  IterableChangeRecord,\n  IterableChanges,\n  IterableDiffer,\n  IterableDiffers,\n  NgIterable,\n  NgZone,\n  OnDestroy,\n  SkipSelf,\n  TemplateRef,\n  TrackByFunction,\n  ViewContainerRef,\n} from '@angular/core';\nimport {Observable, Subject, of as observableOf} from 'rxjs';\nimport {pairwise, shareReplay, startWith, switchMap, takeUntil} from 'rxjs/operators';\nimport {CdkVirtualScrollViewport} from './virtual-scroll-viewport';\n\n\n/** The context for an item rendered by `CdkVirtualForOf` */\nexport type CdkVirtualForOfContext<T> = {\n  /** The item value. */\n  $implicit: T;\n  /** The DataSource, Observable, or NgIterable that was passed to *cdkVirtualFor. */\n  cdkVirtualForOf: DataSource<T> | Observable<T[]> | NgIterable<T>;\n  /** The index of the item in the DataSource. */\n  index: number;\n  /** The number of items in the DataSource. */\n  count: number;\n  /** Whether this is the first item in the DataSource. */\n  first: boolean;\n  /** Whether this is the last item in the DataSource. */\n  last: boolean;\n  /** Whether the index is even. */\n  even: boolean;\n  /** Whether the index is odd. */\n  odd: boolean;\n};\n\n\n/** Helper to extract size from a DOM Node. */\nfunction getSize(orientation: 'horizontal' | 'vertical', node: Node): number {\n  const el = node as Element;\n  if (!el.getBoundingClientRect) {\n    return 0;\n  }\n  const rect = el.getBoundingClientRect();\n  return orientation == 'horizontal' ? rect.width : rect.height;\n}\n\n\n/**\n * A directive similar to `ngForOf` to be used for rendering data inside a virtual scrolling\n * container.\n */\n@Directive({\n  selector: '[cdkVirtualFor][cdkVirtualForOf]',\n})\nexport class CdkVirtualForOf<T> implements CollectionViewer, DoCheck, OnDestroy {\n  /** Emits when the rendered view of the data changes. */\n  viewChange = new Subject<ListRange>();\n\n  /** Subject that emits when a new DataSource instance is given. */\n  private _dataSourceChanges = new Subject<DataSource<T>>();\n\n  /** The DataSource to display. */\n  @Input()\n  get cdkVirtualForOf(): DataSource<T> | Observable<T[]> | NgIterable<T> {\n    return this._cdkVirtualForOf;\n  }\n  set cdkVirtualForOf(value: DataSource<T> | Observable<T[]> | NgIterable<T>) {\n    this._cdkVirtualForOf = value;\n    const ds = isDataSource(value) ? value :\n        // Slice the value if its an NgIterable to ensure we're working with an array.\n        new ArrayDataSource<T>(\n            value instanceof Observable ? value : Array.prototype.slice.call(value || []));\n    this._dataSourceChanges.next(ds);\n  }\n  _cdkVirtualForOf: DataSource<T> | Observable<T[]> | NgIterable<T>;\n\n  /**\n   * The `TrackByFunction` to use for tracking changes. The `TrackByFunction` takes the index and\n   * the item and produces a value to be used as the item's identity when tracking changes.\n   */\n  @Input()\n  get cdkVirtualForTrackBy(): TrackByFunction<T> | undefined {\n    return this._cdkVirtualForTrackBy;\n  }\n  set cdkVirtualForTrackBy(fn: TrackByFunction<T> | undefined) {\n    this._needsUpdate = true;\n    this._cdkVirtualForTrackBy = fn ?\n        (index, item) => fn(index + (this._renderedRange ? this._renderedRange.start : 0), item) :\n        undefined;\n  }\n  private _cdkVirtualForTrackBy: TrackByFunction<T> | undefined;\n\n  /** The template used to stamp out new elements. */\n  @Input()\n  set cdkVirtualForTemplate(value: TemplateRef<CdkVirtualForOfContext<T>>) {\n    if (value) {\n      this._needsUpdate = true;\n      this._template = value;\n    }\n  }\n\n  /**\n   * The size of the cache used to store templates that are not being used for re-use later.\n   * Setting the cache size to `0` will disable caching. Defaults to 20 templates.\n   */\n  @Input() cdkVirtualForTemplateCacheSize: number = 20;\n\n  /** Emits whenever the data in the current DataSource changes. */\n  dataStream: Observable<T[] | ReadonlyArray<T>> = this._dataSourceChanges\n      .pipe(\n          // Start off with null `DataSource`.\n          startWith(null!),\n          // Bundle up the previous and current data sources so we can work with both.\n          pairwise(),\n          // Use `_changeDataSource` to disconnect from the previous data source and connect to the\n          // new one, passing back a stream of data changes which we run through `switchMap` to give\n          // us a data stream that emits the latest data from whatever the current `DataSource` is.\n          switchMap(([prev, cur]) => this._changeDataSource(prev, cur)),\n          // Replay the last emitted data when someone subscribes.\n          shareReplay(1));\n\n  /** The differ used to calculate changes to the data. */\n  private _differ: IterableDiffer<T> | null = null;\n\n  /** The most recent data emitted from the DataSource. */\n  private _data: T[] | ReadonlyArray<T>;\n\n  /** The currently rendered items. */\n  private _renderedItems: T[];\n\n  /** The currently rendered range of indices. */\n  private _renderedRange: ListRange;\n\n  /**\n   * The template cache used to hold on ot template instancess that have been stamped out, but don't\n   * currently need to be rendered. These instances will be reused in the future rather than\n   * stamping out brand new ones.\n   */\n  private _templateCache: EmbeddedViewRef<CdkVirtualForOfContext<T>>[] = [];\n\n  /** Whether the rendered data should be updated during the next ngDoCheck cycle. */\n  private _needsUpdate = false;\n\n  private _destroyed = new Subject<void>();\n\n  constructor(\n      /** The view container to add items to. */\n      private _viewContainerRef: ViewContainerRef,\n      /** The template to use when stamping out new items. */\n      private _template: TemplateRef<CdkVirtualForOfContext<T>>,\n      /** The set of available differs. */\n      private _differs: IterableDiffers,\n      /** The virtual scrolling viewport that these items are being rendered in. */\n      @SkipSelf() private _viewport: CdkVirtualScrollViewport,\n      ngZone: NgZone) {\n    this.dataStream.subscribe(data => {\n      this._data = data;\n      this._onRenderedDataChange();\n    });\n    this._viewport.renderedRangeStream.pipe(takeUntil(this._destroyed)).subscribe(range => {\n      this._renderedRange = range;\n      ngZone.run(() => this.viewChange.next(this._renderedRange));\n      this._onRenderedDataChange();\n    });\n    this._viewport.attach(this);\n  }\n\n  /**\n   * Measures the combined size (width for horizontal orientation, height for vertical) of all items\n   * in the specified range. Throws an error if the range includes items that are not currently\n   * rendered.\n   */\n  measureRangeSize(range: ListRange, orientation: 'horizontal' | 'vertical'): number {\n    if (range.start >= range.end) {\n      return 0;\n    }\n    if (range.start < this._renderedRange.start || range.end > this._renderedRange.end) {\n      throw Error(`Error: attempted to measure an item that isn't rendered.`);\n    }\n\n    // The index into the list of rendered views for the first item in the range.\n    const renderedStartIndex = range.start - this._renderedRange.start;\n    // The length of the range we're measuring.\n    const rangeLen = range.end - range.start;\n\n    // Loop over all root nodes for all items in the range and sum up their size.\n    let totalSize = 0;\n    let i = rangeLen;\n    while (i--) {\n      const view = this._viewContainerRef.get(i + renderedStartIndex) as\n          EmbeddedViewRef<CdkVirtualForOfContext<T>> | null;\n      let j = view ? view.rootNodes.length : 0;\n      while (j--) {\n        totalSize += getSize(orientation, view!.rootNodes[j]);\n      }\n    }\n\n    return totalSize;\n  }\n\n  ngDoCheck() {\n    if (this._differ && this._needsUpdate) {\n      // TODO(mmalerba): We should differentiate needs update due to scrolling and a new portion of\n      // this list being rendered (can use simpler algorithm) vs needs update due to data actually\n      // changing (need to do this diff).\n      const changes = this._differ.diff(this._renderedItems);\n      if (!changes) {\n        this._updateContext();\n      } else {\n        this._applyChanges(changes);\n      }\n      this._needsUpdate = false;\n    }\n  }\n\n  ngOnDestroy() {\n    this._viewport.detach();\n\n    this._dataSourceChanges.next();\n    this._dataSourceChanges.complete();\n    this.viewChange.complete();\n\n    this._destroyed.next();\n    this._destroyed.complete();\n\n    for (let view of this._templateCache) {\n      view.destroy();\n    }\n  }\n\n  /** React to scroll state changes in the viewport. */\n  private _onRenderedDataChange() {\n    if (!this._renderedRange) {\n      return;\n    }\n    this._renderedItems = this._data.slice(this._renderedRange.start, this._renderedRange.end);\n    if (!this._differ) {\n      this._differ = this._differs.find(this._renderedItems).create(this.cdkVirtualForTrackBy);\n    }\n    this._needsUpdate = true;\n  }\n\n  /** Swap out one `DataSource` for another. */\n  private _changeDataSource(oldDs: DataSource<T> | null, newDs: DataSource<T> | null):\n    Observable<T[] | ReadonlyArray<T>> {\n\n    if (oldDs) {\n      oldDs.disconnect(this);\n    }\n\n    this._needsUpdate = true;\n    return newDs ? newDs.connect(this) : observableOf();\n  }\n\n  /** Update the `CdkVirtualForOfContext` for all views. */\n  private _updateContext() {\n    const count = this._data.length;\n    let i = this._viewContainerRef.length;\n    while (i--) {\n      let view = this._viewContainerRef.get(i) as EmbeddedViewRef<CdkVirtualForOfContext<T>>;\n      view.context.index = this._renderedRange.start + i;\n      view.context.count = count;\n      this._updateComputedContextProperties(view.context);\n      view.detectChanges();\n    }\n  }\n\n  /** Apply changes to the DOM. */\n  private _applyChanges(changes: IterableChanges<T>) {\n    // Rearrange the views to put them in the right location.\n    changes.forEachOperation((record: IterableChangeRecord<T>,\n                              adjustedPreviousIndex: number | null,\n                              currentIndex: number | null) => {\n      if (record.previousIndex == null) {  // Item added.\n        const view = this._insertViewForNewItem(currentIndex!);\n        view.context.$implicit = record.item;\n      } else if (currentIndex == null) {  // Item removed.\n        this._cacheView(this._detachView(adjustedPreviousIndex !));\n      } else {  // Item moved.\n        const view = this._viewContainerRef.get(adjustedPreviousIndex!) as\n            EmbeddedViewRef<CdkVirtualForOfContext<T>>;\n        this._viewContainerRef.move(view, currentIndex);\n        view.context.$implicit = record.item;\n      }\n    });\n\n    // Update $implicit for any items that had an identity change.\n    changes.forEachIdentityChange((record: IterableChangeRecord<T>) => {\n      const view = this._viewContainerRef.get(record.currentIndex!) as\n          EmbeddedViewRef<CdkVirtualForOfContext<T>>;\n      view.context.$implicit = record.item;\n    });\n\n    // Update the context variables on all items.\n    const count = this._data.length;\n    let i = this._viewContainerRef.length;\n    while (i--) {\n      const view = this._viewContainerRef.get(i) as EmbeddedViewRef<CdkVirtualForOfContext<T>>;\n      view.context.index = this._renderedRange.start + i;\n      view.context.count = count;\n      this._updateComputedContextProperties(view.context);\n    }\n  }\n\n  /** Cache the given detached view. */\n  private _cacheView(view: EmbeddedViewRef<CdkVirtualForOfContext<T>>) {\n    if (this._templateCache.length < this.cdkVirtualForTemplateCacheSize) {\n      this._templateCache.push(view);\n    } else {\n      const index = this._viewContainerRef.indexOf(view);\n\n      // It's very unlikely that the index will ever be -1, but just in case,\n      // destroy the view on its own, otherwise destroy it through the\n      // container to ensure that all the references are removed.\n      if (index === -1) {\n        view.destroy();\n      } else {\n        this._viewContainerRef.remove(index);\n      }\n    }\n  }\n\n  /** Inserts a view for a new item, either from the cache or by creating a new one. */\n  private _insertViewForNewItem(index: number): EmbeddedViewRef<CdkVirtualForOfContext<T>> {\n    return this._insertViewFromCache(index) || this._createEmbeddedViewAt(index);\n  }\n\n  /** Update the computed properties on the `CdkVirtualForOfContext`. */\n  private _updateComputedContextProperties(context: CdkVirtualForOfContext<any>) {\n    context.first = context.index === 0;\n    context.last = context.index === context.count - 1;\n    context.even = context.index % 2 === 0;\n    context.odd = !context.even;\n  }\n\n  /** Creates a new embedded view and moves it to the given index */\n  private _createEmbeddedViewAt(index: number): EmbeddedViewRef<CdkVirtualForOfContext<T>> {\n    // Note that it's important that we insert the item directly at the proper index,\n    // rather than inserting it and the moving it in place, because if there's a directive\n    // on the same node that injects the `ViewContainerRef`, Angular will insert another\n    // comment node which can throw off the move when it's being repeated for all items.\n    return this._viewContainerRef.createEmbeddedView(this._template, {\n      $implicit: null!,\n      cdkVirtualForOf: this._cdkVirtualForOf,\n      index: -1,\n      count: -1,\n      first: false,\n      last: false,\n      odd: false,\n      even: false\n    }, index);\n  }\n\n  /** Inserts a recycled view from the cache at the given index. */\n  private _insertViewFromCache(index: number): EmbeddedViewRef<CdkVirtualForOfContext<T>>|null {\n    const cachedView = this._templateCache.pop();\n    if (cachedView) {\n      this._viewContainerRef.insert(cachedView, index);\n    }\n    return cachedView || null;\n  }\n\n  /** Detaches the embedded view at the given index. */\n  private _detachView(index: number): EmbeddedViewRef<CdkVirtualForOfContext<T>> {\n    return this._viewContainerRef.detach(index) as\n        EmbeddedViewRef<CdkVirtualForOfContext<T>>;\n  }\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n\nimport {Directionality} from '@angular/cdk/bidi';\nimport {ListRange} from '@angular/cdk/collections';\nimport {\n  ChangeDetectionStrategy,\n  ChangeDetectorRef,\n  Component,\n  ElementRef,\n  Inject,\n  Input,\n  NgZone,\n  OnDestroy,\n  OnInit,\n  Optional,\n  Output,\n  ViewChild,\n  ViewEncapsulation,\n} from '@angular/core';\nimport {animationFrameScheduler, asapScheduler, Observable, Subject, Observer} from 'rxjs';\nimport {auditTime, startWith, takeUntil} from 'rxjs/operators';\nimport {ScrollDispatcher} from './scroll-dispatcher';\nimport {CdkScrollable, ExtendedScrollToOptions} from './scrollable';\nimport {CdkVirtualForOf} from './virtual-for-of';\nimport {VIRTUAL_SCROLL_STRATEGY, VirtualScrollStrategy} from './virtual-scroll-strategy';\n\n\n/** Checks if the given ranges are equal. */\nfunction rangesEqual(r1: ListRange, r2: ListRange): boolean {\n  return r1.start == r2.start && r1.end == r2.end;\n}\n\n/**\n * Scheduler to be used for scroll events. Needs to fall back to\n * something that doesn't rely on requestAnimationFrame on environments\n * that don't support it (e.g. server-side rendering).\n */\nconst SCROLL_SCHEDULER =\n    typeof requestAnimationFrame !== 'undefined' ? animationFrameScheduler : asapScheduler;\n\n\n/** A viewport that virtualizes it's scrolling with the help of `CdkVirtualForOf`. */\n@Component({\n  moduleId: module.id,\n  selector: 'cdk-virtual-scroll-viewport',\n  templateUrl: 'virtual-scroll-viewport.html',\n  styleUrls: ['virtual-scroll-viewport.css'],\n  host: {\n    'class': 'cdk-virtual-scroll-viewport',\n    '[class.cdk-virtual-scroll-orientation-horizontal]': 'orientation === \"horizontal\"',\n    '[class.cdk-virtual-scroll-orientation-vertical]': 'orientation !== \"horizontal\"',\n  },\n  encapsulation: ViewEncapsulation.None,\n  changeDetection: ChangeDetectionStrategy.OnPush,\n  providers: [{\n    provide: CdkScrollable,\n    useExisting: CdkVirtualScrollViewport,\n  }]\n})\nexport class CdkVirtualScrollViewport extends CdkScrollable implements OnInit, OnDestroy {\n  /** Emits when the viewport is detached from a CdkVirtualForOf. */\n  private _detachedSubject = new Subject<void>();\n\n  /** Emits when the rendered range changes. */\n  private _renderedRangeSubject = new Subject<ListRange>();\n\n  /** The direction the viewport scrolls. */\n  @Input() orientation: 'horizontal' | 'vertical' = 'vertical';\n\n  // Note: we don't use the typical EventEmitter here because we need to subscribe to the scroll\n  // strategy lazily (i.e. only if the user is actually listening to the events). We do this because\n  // depending on how the strategy calculates the scrolled index, it may come at a cost to\n  // performance.\n  /** Emits when the index of the first element visible in the viewport changes. */\n  @Output() scrolledIndexChange: Observable<number> =\n      new Observable((observer: Observer<number>) =>\n        this._scrollStrategy.scrolledIndexChange.subscribe(index =>\n            Promise.resolve().then(() => this.ngZone.run(() => observer.next(index)))));\n\n  /** The element that wraps the rendered content. */\n  @ViewChild('contentWrapper', {static: true}) _contentWrapper: ElementRef<HTMLElement>;\n\n  /** A stream that emits whenever the rendered range changes. */\n  renderedRangeStream: Observable<ListRange> = this._renderedRangeSubject.asObservable();\n\n  /**\n   * The transform used to scale the spacer to the same size as all content, including content that\n   * is not currently rendered.\n   */\n  _totalContentSizeTransform = '';\n\n  /**\n   * The total size of all content (in pixels), including content that is not currently rendered.\n   */\n  private _totalContentSize = 0;\n\n  /**\n   * The CSS transform applied to the rendered subset of items so that they appear within the bounds\n   * of the visible viewport.\n   */\n  private _renderedContentTransform: string;\n\n  /** The currently rendered range of indices. */\n  private _renderedRange: ListRange = {start: 0, end: 0};\n\n  /** The length of the data bound to this viewport (in number of items). */\n  private _dataLength = 0;\n\n  /** The size of the viewport (in pixels). */\n  private _viewportSize = 0;\n\n  /** the currently attached CdkVirtualForOf. */\n  private _forOf: CdkVirtualForOf<any> | null;\n\n  /** The last rendered content offset that was set. */\n  private _renderedContentOffset = 0;\n\n  /**\n   * Whether the last rendered content offset was to the end of the content (and therefore needs to\n   * be rewritten as an offset to the start of the content).\n   */\n  private _renderedContentOffsetNeedsRewrite = false;\n\n  /** Whether there is a pending change detection cycle. */\n  private _isChangeDetectionPending = false;\n\n  /** A list of functions to run after the next change detection cycle. */\n  private _runAfterChangeDetection: Function[] = [];\n\n  constructor(public elementRef: ElementRef<HTMLElement>,\n              private _changeDetectorRef: ChangeDetectorRef,\n              ngZone: NgZone,\n              @Optional() @Inject(VIRTUAL_SCROLL_STRATEGY)\n                  private _scrollStrategy: VirtualScrollStrategy,\n              @Optional() dir: Directionality,\n              scrollDispatcher: ScrollDispatcher) {\n    super(elementRef, scrollDispatcher, ngZone, dir);\n\n    if (!_scrollStrategy) {\n      throw Error('Error: cdk-virtual-scroll-viewport requires the \"itemSize\" property to be set.');\n    }\n  }\n\n  ngOnInit() {\n    super.ngOnInit();\n\n    // It's still too early to measure the viewport at this point. Deferring with a promise allows\n    // the Viewport to be rendered with the correct size before we measure. We run this outside the\n    // zone to avoid causing more change detection cycles. We handle the change detection loop\n    // ourselves instead.\n    this.ngZone.runOutsideAngular(() => Promise.resolve().then(() => {\n      this._measureViewportSize();\n      this._scrollStrategy.attach(this);\n\n      this.elementScrolled()\n          .pipe(\n              // Start off with a fake scroll event so we properly detect our initial position.\n              startWith(null!),\n              // Collect multiple events into one until the next animation frame. This way if\n              // there are multiple scroll events in the same frame we only need to recheck\n              // our layout once.\n              auditTime(0, SCROLL_SCHEDULER))\n          .subscribe(() => this._scrollStrategy.onContentScrolled());\n\n      this._markChangeDetectionNeeded();\n    }));\n  }\n\n  ngOnDestroy() {\n    this.detach();\n    this._scrollStrategy.detach();\n\n    // Complete all subjects\n    this._renderedRangeSubject.complete();\n    this._detachedSubject.complete();\n\n    super.ngOnDestroy();\n  }\n\n  /** Attaches a `CdkVirtualForOf` to this viewport. */\n  attach(forOf: CdkVirtualForOf<any>) {\n    if (this._forOf) {\n      throw Error('CdkVirtualScrollViewport is already attached.');\n    }\n\n    // Subscribe to the data stream of the CdkVirtualForOf to keep track of when the data length\n    // changes. Run outside the zone to avoid triggering change detection, since we're managing the\n    // change detection loop ourselves.\n    this.ngZone.runOutsideAngular(() => {\n      this._forOf = forOf;\n      this._forOf.dataStream.pipe(takeUntil(this._detachedSubject)).subscribe(data => {\n        const newLength = data.length;\n        if (newLength !== this._dataLength) {\n          this._dataLength = newLength;\n          this._scrollStrategy.onDataLengthChanged();\n        }\n        this._doChangeDetection();\n      });\n    });\n  }\n\n  /** Detaches the current `CdkVirtualForOf`. */\n  detach() {\n    this._forOf = null;\n    this._detachedSubject.next();\n  }\n\n  /** Gets the length of the data bound to this viewport (in number of items). */\n  getDataLength(): number {\n    return this._dataLength;\n  }\n\n  /** Gets the size of the viewport (in pixels). */\n  getViewportSize(): number {\n    return this._viewportSize;\n  }\n\n  // TODO(mmalerba): This is technically out of sync with what's really rendered until a render\n  // cycle happens. I'm being careful to only call it after the render cycle is complete and before\n  // setting it to something else, but its error prone and should probably be split into\n  // `pendingRange` and `renderedRange`, the latter reflecting whats actually in the DOM.\n\n  /** Get the current rendered range of items. */\n  getRenderedRange(): ListRange {\n    return this._renderedRange;\n  }\n\n  /**\n   * Sets the total size of all content (in pixels), including content that is not currently\n   * rendered.\n   */\n  setTotalContentSize(size: number) {\n    if (this._totalContentSize !== size) {\n      this._totalContentSize = size;\n      const axis = this.orientation == 'horizontal' ? 'X' : 'Y';\n      this._totalContentSizeTransform = `scale${axis}(${this._totalContentSize})`;\n      this._markChangeDetectionNeeded();\n    }\n  }\n\n  /** Sets the currently rendered range of indices. */\n  setRenderedRange(range: ListRange) {\n    if (!rangesEqual(this._renderedRange, range)) {\n      this._renderedRangeSubject.next(this._renderedRange = range);\n      this._markChangeDetectionNeeded(() => this._scrollStrategy.onContentRendered());\n    }\n  }\n\n  /**\n   * Gets the offset from the start of the viewport to the start of the rendered data (in pixels).\n   */\n  getOffsetToRenderedContentStart(): number | null {\n    return this._renderedContentOffsetNeedsRewrite ? null : this._renderedContentOffset;\n  }\n\n  /**\n   * Sets the offset from the start of the viewport to either the start or end of the rendered data\n   * (in pixels).\n   */\n  setRenderedContentOffset(offset: number, to: 'to-start' | 'to-end' = 'to-start') {\n    // For a horizontal viewport in a right-to-left language we need to translate along the x-axis\n    // in the negative direction.\n    const isRtl = this.dir && this.dir.value == 'rtl';\n    const isHorizontal = this.orientation == 'horizontal';\n    const axis = isHorizontal ? 'X' : 'Y';\n    const axisDirection = isHorizontal && isRtl ? -1 : 1;\n    let transform = `translate${axis}(${Number(axisDirection * offset)}px)`;\n    this._renderedContentOffset = offset;\n    if (to === 'to-end') {\n      transform += ` translate${axis}(-100%)`;\n      // The viewport should rewrite this as a `to-start` offset on the next render cycle. Otherwise\n      // elements will appear to expand in the wrong direction (e.g. `mat-expansion-panel` would\n      // expand upward).\n      this._renderedContentOffsetNeedsRewrite = true;\n    }\n    if (this._renderedContentTransform != transform) {\n      // We know this value is safe because we parse `offset` with `Number()` before passing it\n      // into the string.\n      this._renderedContentTransform = transform;\n      this._markChangeDetectionNeeded(() => {\n        if (this._renderedContentOffsetNeedsRewrite) {\n          this._renderedContentOffset -= this.measureRenderedContentSize();\n          this._renderedContentOffsetNeedsRewrite = false;\n          this.setRenderedContentOffset(this._renderedContentOffset);\n        } else {\n          this._scrollStrategy.onRenderedOffsetChanged();\n        }\n      });\n    }\n  }\n\n  /**\n   * Scrolls to the given offset from the start of the viewport. Please note that this is not always\n   * the same as setting `scrollTop` or `scrollLeft`. In a horizontal viewport with right-to-left\n   * direction, this would be the equivalent of setting a fictional `scrollRight` property.\n   * @param offset The offset to scroll to.\n   * @param behavior The ScrollBehavior to use when scrolling. Default is behavior is `auto`.\n   */\n  scrollToOffset(offset: number, behavior: ScrollBehavior = 'auto') {\n    const options: ExtendedScrollToOptions = {behavior};\n    if (this.orientation === 'horizontal') {\n      options.start = offset;\n    } else {\n      options.top = offset;\n    }\n    this.scrollTo(options);\n  }\n\n  /**\n   * Scrolls to the offset for the given index.\n   * @param index The index of the element to scroll to.\n   * @param behavior The ScrollBehavior to use when scrolling. Default is behavior is `auto`.\n   */\n  scrollToIndex(index: number,  behavior: ScrollBehavior = 'auto') {\n    this._scrollStrategy.scrollToIndex(index, behavior);\n  }\n\n  /**\n   * Gets the current scroll offset from the start of the viewport (in pixels).\n   * @param from The edge to measure the offset from. Defaults to 'top' in vertical mode and 'start'\n   *     in horizontal mode.\n   */\n  measureScrollOffset(from?: 'top' | 'left' | 'right' | 'bottom' | 'start' | 'end'): number {\n    return super.measureScrollOffset(\n        from ? from : this.orientation === 'horizontal' ? 'start' : 'top');\n  }\n\n  /** Measure the combined size of all of the rendered items. */\n  measureRenderedContentSize(): number {\n    const contentEl = this._contentWrapper.nativeElement;\n    return this.orientation === 'horizontal' ? contentEl.offsetWidth : contentEl.offsetHeight;\n  }\n\n  /**\n   * Measure the total combined size of the given range. Throws if the range includes items that are\n   * not rendered.\n   */\n  measureRangeSize(range: ListRange): number {\n    if (!this._forOf) {\n      return 0;\n    }\n    return this._forOf.measureRangeSize(range, this.orientation);\n  }\n\n  /** Update the viewport dimensions and re-render. */\n  checkViewportSize() {\n    // TODO: Cleanup later when add logic for handling content resize\n    this._measureViewportSize();\n    this._scrollStrategy.onDataLengthChanged();\n  }\n\n  /** Measure the viewport size. */\n  private _measureViewportSize() {\n    const viewportEl = this.elementRef.nativeElement;\n    this._viewportSize = this.orientation === 'horizontal' ?\n        viewportEl.clientWidth : viewportEl.clientHeight;\n  }\n\n  /** Queue up change detection to run. */\n  private _markChangeDetectionNeeded(runAfter?: Function) {\n    if (runAfter) {\n      this._runAfterChangeDetection.push(runAfter);\n    }\n\n    // Use a Promise to batch together calls to `_doChangeDetection`. This way if we set a bunch of\n    // properties sequentially we only have to run `_doChangeDetection` once at the end.\n    if (!this._isChangeDetectionPending) {\n      this._isChangeDetectionPending = true;\n      this.ngZone.runOutsideAngular(() => Promise.resolve().then(() => {\n        this._doChangeDetection();\n      }));\n    }\n  }\n\n  /** Run change detection. */\n  private _doChangeDetection() {\n    this._isChangeDetectionPending = false;\n\n    // Apply changes to Angular bindings. Note: We must call `markForCheck` to run change detection\n    // from the root, since the repeated items are content projected in. Calling `detectChanges`\n    // instead does not properly check the projected content.\n    this.ngZone.run(() => this._changeDetectorRef.markForCheck());\n    // Apply the content transform. The transform can't be set via an Angular binding because\n    // bypassSecurityTrustStyle is banned in Google. However the value is safe, it's composed of\n    // string literals, a variable that can only be 'X' or 'Y', and user input that is run through\n    // the `Number` function first to coerce it to a numeric value.\n    this._contentWrapper.nativeElement.style.transform = this._renderedContentTransform;\n\n    const runAfterChangeDetection = this._runAfterChangeDetection;\n    this._runAfterChangeDetection = [];\n    for (const fn of runAfterChangeDetection) {\n      fn();\n    }\n  }\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n\nimport {Directionality} from '@angular/cdk/bidi';\nimport {\n  getRtlScrollAxisType,\n  RtlScrollAxisType,\n  supportsScrollBehavior\n} from '@angular/cdk/platform';\nimport {Directive, ElementRef, NgZone, OnDestroy, OnInit, Optional} from '@angular/core';\nimport {fromEvent, Observable, Subject, Observer} from 'rxjs';\nimport {takeUntil} from 'rxjs/operators';\nimport {ScrollDispatcher} from './scroll-dispatcher';\n\nexport type _Without<T> = {[P in keyof T]?: never};\nexport type _XOR<T, U> = (_Without<T> & U) | (_Without<U> & T);\nexport type _Top = {top?: number};\nexport type _Bottom = {bottom?: number};\nexport type _Left = {left?: number};\nexport type _Right = {right?: number};\nexport type _Start = {start?: number};\nexport type _End = {end?: number};\nexport type _XAxis = _XOR<_XOR<_Left, _Right>, _XOR<_Start, _End>>;\nexport type _YAxis = _XOR<_Top, _Bottom>;\n\n/**\n * An extended version of ScrollToOptions that allows expressing scroll offsets relative to the\n * top, bottom, left, right, start, or end of the viewport rather than just the top and left.\n * Please note: the top and bottom properties are mutually exclusive, as are the left, right,\n * start, and end properties.\n */\nexport type ExtendedScrollToOptions = _XAxis & _YAxis & ScrollOptions;\n\n/**\n * Sends an event when the directive's element is scrolled. Registers itself with the\n * ScrollDispatcher service to include itself as part of its collection of scrolling events that it\n * can be listened to through the service.\n */\n@Directive({\n  selector: '[cdk-scrollable], [cdkScrollable]'\n})\nexport class CdkScrollable implements OnInit, OnDestroy {\n  private _destroyed = new Subject();\n\n  private _elementScrolled: Observable<Event> = new Observable((observer: Observer<Event>) =>\n      this.ngZone.runOutsideAngular(() =>\n          fromEvent(this.elementRef.nativeElement, 'scroll').pipe(takeUntil(this._destroyed))\n              .subscribe(observer)));\n\n  constructor(protected elementRef: ElementRef<HTMLElement>,\n              protected scrollDispatcher: ScrollDispatcher,\n              protected ngZone: NgZone,\n              @Optional() protected dir?: Directionality) {}\n\n  ngOnInit() {\n    this.scrollDispatcher.register(this);\n  }\n\n  ngOnDestroy() {\n    this.scrollDispatcher.deregister(this);\n    this._destroyed.next();\n    this._destroyed.complete();\n  }\n\n  /** Returns observable that emits when a scroll event is fired on the host element. */\n  elementScrolled(): Observable<Event> {\n    return this._elementScrolled;\n  }\n\n  /** Gets the ElementRef for the viewport. */\n  getElementRef(): ElementRef<HTMLElement> {\n    return this.elementRef;\n  }\n\n  /**\n   * Scrolls to the specified offsets. This is a normalized version of the browser's native scrollTo\n   * method, since browsers are not consistent about what scrollLeft means in RTL. For this method\n   * left and right always refer to the left and right side of the scrolling container irrespective\n   * of the layout direction. start and end refer to left and right in an LTR context and vice-versa\n   * in an RTL context.\n   * @param options specified the offsets to scroll to.\n   */\n  scrollTo(options: ExtendedScrollToOptions): void {\n    const el = this.elementRef.nativeElement;\n    const isRtl = this.dir && this.dir.value == 'rtl';\n\n    // Rewrite start & end offsets as right or left offsets.\n    options.left = options.left == null ? (isRtl ? options.end : options.start) : options.left;\n    options.right = options.right == null ? (isRtl ? options.start : options.end) : options.right;\n\n    // Rewrite the bottom offset as a top offset.\n    if (options.bottom != null) {\n      (options as _Without<_Bottom> & _Top).top =\n          el.scrollHeight - el.clientHeight - options.bottom;\n    }\n\n    // Rewrite the right offset as a left offset.\n    if (isRtl && getRtlScrollAxisType() != RtlScrollAxisType.NORMAL) {\n      if (options.left != null) {\n        (options as _Without<_Left> & _Right).right =\n            el.scrollWidth - el.clientWidth - options.left;\n      }\n\n      if (getRtlScrollAxisType() == RtlScrollAxisType.INVERTED) {\n        options.left = options.right;\n      } else if (getRtlScrollAxisType() == RtlScrollAxisType.NEGATED) {\n        options.left = options.right ? -options.right : options.right;\n      }\n    } else {\n      if (options.right != null) {\n        (options as _Without<_Right> & _Left).left =\n            el.scrollWidth - el.clientWidth - options.right;\n      }\n    }\n\n    this._applyScrollToOptions(options);\n  }\n\n  private _applyScrollToOptions(options: ScrollToOptions): void {\n    const el = this.elementRef.nativeElement;\n\n    if (supportsScrollBehavior()) {\n      el.scrollTo(options);\n    } else {\n      if (options.top != null) {\n        el.scrollTop = options.top;\n      }\n      if (options.left != null) {\n        el.scrollLeft = options.left;\n      }\n    }\n  }\n\n  /**\n   * Measures the scroll offset relative to the specified edge of the viewport. This method can be\n   * used instead of directly checking scrollLeft or scrollTop, since browsers are not consistent\n   * about what scrollLeft means in RTL. The values returned by this method are normalized such that\n   * left and right always refer to the left and right side of the scrolling container irrespective\n   * of the layout direction. start and end refer to left and right in an LTR context and vice-versa\n   * in an RTL context.\n   * @param from The edge to measure from.\n   */\n  measureScrollOffset(from: 'top' | 'left' | 'right' | 'bottom' | 'start' | 'end'): number {\n    const LEFT = 'left';\n    const RIGHT = 'right';\n    const el = this.elementRef.nativeElement;\n    if (from == 'top') {\n      return el.scrollTop;\n    }\n    if (from == 'bottom') {\n      return el.scrollHeight - el.clientHeight - el.scrollTop;\n    }\n\n    // Rewrite start & end as left or right offsets.\n    const isRtl = this.dir && this.dir.value == 'rtl';\n    if (from == 'start') {\n      from = isRtl ? RIGHT : LEFT;\n    } else if (from == 'end') {\n      from = isRtl ? LEFT : RIGHT;\n    }\n\n    if (isRtl && getRtlScrollAxisType() == RtlScrollAxisType.INVERTED) {\n      // For INVERTED, scrollLeft is (scrollWidth - clientWidth) when scrolled all the way left and\n      // 0 when scrolled all the way right.\n      if (from == LEFT) {\n        return el.scrollWidth - el.clientWidth - el.scrollLeft;\n      } else {\n        return el.scrollLeft;\n      }\n    } else if (isRtl && getRtlScrollAxisType() == RtlScrollAxisType.NEGATED) {\n      // For NEGATED, scrollLeft is -(scrollWidth - clientWidth) when scrolled all the way left and\n      // 0 when scrolled all the way right.\n      if (from == LEFT) {\n        return el.scrollLeft + el.scrollWidth - el.clientWidth;\n      } else {\n        return -el.scrollLeft;\n      }\n    } else {\n      // For NORMAL, as well as non-RTL contexts, scrollLeft is 0 when scrolled all the way left and\n      // (scrollWidth - clientWidth) when scrolled all the way right.\n      if (from == LEFT) {\n        return el.scrollLeft;\n      } else {\n        return el.scrollWidth - el.clientWidth - el.scrollLeft;\n      }\n    }\n  }\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n\nimport {Platform} from '@angular/cdk/platform';\nimport {\n  ElementRef,\n  Injectable,\n  NgZone,\n  OnDestroy,\n  Optional,\n  SkipSelf,\n} from '@angular/core';\nimport {fromEvent, of as observableOf, Subject, Subscription, Observable, Observer} from 'rxjs';\nimport {auditTime, filter} from 'rxjs/operators';\nimport {CdkScrollable} from './scrollable';\n\n\n/** Time in ms to throttle the scrolling events by default. */\nexport const DEFAULT_SCROLL_TIME = 20;\n\n/**\n * Service contained all registered Scrollable references and emits an event when any one of the\n * Scrollable references emit a scrolled event.\n */\n@Injectable({providedIn: 'root'})\nexport class ScrollDispatcher implements OnDestroy {\n  constructor(private _ngZone: NgZone, private _platform: Platform) { }\n\n  /** Subject for notifying that a registered scrollable reference element has been scrolled. */\n  private _scrolled = new Subject<CdkScrollable|void>();\n\n  /** Keeps track of the global `scroll` and `resize` subscriptions. */\n  _globalSubscription: Subscription | null = null;\n\n  /** Keeps track of the amount of subscriptions to `scrolled`. Used for cleaning up afterwards. */\n  private _scrolledCount = 0;\n\n  /**\n   * Map of all the scrollable references that are registered with the service and their\n   * scroll event subscriptions.\n   */\n  scrollContainers: Map<CdkScrollable, Subscription> = new Map();\n\n  /**\n   * Registers a scrollable instance with the service and listens for its scrolled events. When the\n   * scrollable is scrolled, the service emits the event to its scrolled observable.\n   * @param scrollable Scrollable instance to be registered.\n   */\n  register(scrollable: CdkScrollable): void {\n    if (!this.scrollContainers.has(scrollable)) {\n      this.scrollContainers.set(scrollable, scrollable.elementScrolled()\n          .subscribe(() => this._scrolled.next(scrollable)));\n    }\n  }\n\n  /**\n   * Deregisters a Scrollable reference and unsubscribes from its scroll event observable.\n   * @param scrollable Scrollable instance to be deregistered.\n   */\n  deregister(scrollable: CdkScrollable): void {\n    const scrollableReference = this.scrollContainers.get(scrollable);\n\n    if (scrollableReference) {\n      scrollableReference.unsubscribe();\n      this.scrollContainers.delete(scrollable);\n    }\n  }\n\n  /**\n   * Returns an observable that emits an event whenever any of the registered Scrollable\n   * references (or window, document, or body) fire a scrolled event. Can provide a time in ms\n   * to override the default \"throttle\" time.\n   *\n   * **Note:** in order to avoid hitting change detection for every scroll event,\n   * all of the events emitted from this stream will be run outside the Angular zone.\n   * If you need to update any data bindings as a result of a scroll event, you have\n   * to run the callback using `NgZone.run`.\n   */\n  scrolled(auditTimeInMs: number = DEFAULT_SCROLL_TIME): Observable<CdkScrollable|void> {\n    if (!this._platform.isBrowser) {\n      return observableOf<void>();\n    }\n\n    return new Observable((observer: Observer<CdkScrollable|void>) => {\n      if (!this._globalSubscription) {\n        this._addGlobalListener();\n      }\n\n      // In the case of a 0ms delay, use an observable without auditTime\n      // since it does add a perceptible delay in processing overhead.\n      const subscription = auditTimeInMs > 0 ?\n        this._scrolled.pipe(auditTime(auditTimeInMs)).subscribe(observer) :\n        this._scrolled.subscribe(observer);\n\n      this._scrolledCount++;\n\n      return () => {\n        subscription.unsubscribe();\n        this._scrolledCount--;\n\n        if (!this._scrolledCount) {\n          this._removeGlobalListener();\n        }\n      };\n    });\n  }\n\n  ngOnDestroy() {\n    this._removeGlobalListener();\n    this.scrollContainers.forEach((_, container) => this.deregister(container));\n    this._scrolled.complete();\n  }\n\n  /**\n   * Returns an observable that emits whenever any of the\n   * scrollable ancestors of an element are scrolled.\n   * @param elementRef Element whose ancestors to listen for.\n   * @param auditTimeInMs Time to throttle the scroll events.\n   */\n  ancestorScrolled(elementRef: ElementRef, auditTimeInMs?: number): Observable<CdkScrollable|void> {\n    const ancestors = this.getAncestorScrollContainers(elementRef);\n\n    return this.scrolled(auditTimeInMs).pipe(filter(target => {\n      return !target || ancestors.indexOf(target) > -1;\n    }));\n  }\n\n  /** Returns all registered Scrollables that contain the provided element. */\n  getAncestorScrollContainers(elementRef: ElementRef): CdkScrollable[] {\n    const scrollingContainers: CdkScrollable[] = [];\n\n    this.scrollContainers.forEach((_subscription: Subscription, scrollable: CdkScrollable) => {\n      if (this._scrollableContainsElement(scrollable, elementRef)) {\n        scrollingContainers.push(scrollable);\n      }\n    });\n\n    return scrollingContainers;\n  }\n\n  /** Returns true if the element is contained within the provided Scrollable. */\n  private _scrollableContainsElement(scrollable: CdkScrollable, elementRef: ElementRef): boolean {\n    let element: HTMLElement | null = elementRef.nativeElement;\n    let scrollableElement = scrollable.getElementRef().nativeElement;\n\n    // Traverse through the element parents until we reach null, checking if any of the elements\n    // are the scrollable's element.\n    do {\n      if (element == scrollableElement) { return true; }\n    } while (element = element!.parentElement);\n\n    return false;\n  }\n\n  /** Sets up the global scroll listeners. */\n  private _addGlobalListener() {\n    this._globalSubscription = this._ngZone.runOutsideAngular(() => {\n      return fromEvent(window.document, 'scroll').subscribe(() => this._scrolled.next());\n    });\n  }\n\n  /** Cleans up the global scroll listener. */\n  private _removeGlobalListener() {\n    if (this._globalSubscription) {\n      this._globalSubscription.unsubscribe();\n      this._globalSubscription = null;\n    }\n  }\n}\n\n\n/** @docs-private @deprecated @breaking-change 8.0.0 */\nexport function SCROLL_DISPATCHER_PROVIDER_FACTORY(\n    parentDispatcher: ScrollDispatcher, ngZone: NgZone, platform: Platform) {\n  return parentDispatcher || new ScrollDispatcher(ngZone, platform);\n}\n\n/** @docs-private @deprecated @breaking-change 8.0.0 */\nexport const SCROLL_DISPATCHER_PROVIDER = {\n  // If there is already a ScrollDispatcher available, use that. Otherwise, provide a new one.\n  provide: ScrollDispatcher,\n  deps: [[new Optional(), new SkipSelf(), ScrollDispatcher], NgZone, Platform],\n  useFactory: SCROLL_DISPATCHER_PROVIDER_FACTORY\n};\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n\nimport {coerceNumberProperty} from '@angular/cdk/coercion';\nimport {Directive, forwardRef, Input, OnChanges} from '@angular/core';\nimport {Observable, Subject} from 'rxjs';\nimport {distinctUntilChanged} from 'rxjs/operators';\nimport {VIRTUAL_SCROLL_STRATEGY, VirtualScrollStrategy} from './virtual-scroll-strategy';\nimport {CdkVirtualScrollViewport} from './virtual-scroll-viewport';\n\n\n/** Virtual scrolling strategy for lists with items of known fixed size. */\nexport class FixedSizeVirtualScrollStrategy implements VirtualScrollStrategy {\n  private _scrolledIndexChange = new Subject<number>();\n\n  /** @docs-private Implemented as part of VirtualScrollStrategy. */\n  scrolledIndexChange: Observable<number> = this._scrolledIndexChange.pipe(distinctUntilChanged());\n\n  /** The attached viewport. */\n  private _viewport: CdkVirtualScrollViewport | null = null;\n\n  /** The size of the items in the virtually scrolling list. */\n  private _itemSize: number;\n\n  /** The minimum amount of buffer rendered beyond the viewport (in pixels). */\n  private _minBufferPx: number;\n\n  /** The number of buffer items to render beyond the edge of the viewport (in pixels). */\n  private _maxBufferPx: number;\n\n  /**\n   * @param itemSize The size of the items in the virtually scrolling list.\n   * @param minBufferPx The minimum amount of buffer (in pixels) before needing to render more\n   * @param maxBufferPx The amount of buffer (in pixels) to render when rendering more.\n   */\n  constructor(itemSize: number, minBufferPx: number, maxBufferPx: number) {\n    this._itemSize = itemSize;\n    this._minBufferPx = minBufferPx;\n    this._maxBufferPx = maxBufferPx;\n  }\n\n  /**\n   * Attaches this scroll strategy to a viewport.\n   * @param viewport The viewport to attach this strategy to.\n   */\n  attach(viewport: CdkVirtualScrollViewport) {\n    this._viewport = viewport;\n    this._updateTotalContentSize();\n    this._updateRenderedRange();\n  }\n\n  /** Detaches this scroll strategy from the currently attached viewport. */\n  detach() {\n    this._scrolledIndexChange.complete();\n    this._viewport = null;\n  }\n\n  /**\n   * Update the item size and buffer size.\n   * @param itemSize The size of the items in the virtually scrolling list.\n   * @param minBufferPx The minimum amount of buffer (in pixels) before needing to render more\n   * @param maxBufferPx The amount of buffer (in pixels) to render when rendering more.\n   */\n  updateItemAndBufferSize(itemSize: number, minBufferPx: number, maxBufferPx: number) {\n    if (maxBufferPx < minBufferPx) {\n      throw Error('CDK virtual scroll: maxBufferPx must be greater than or equal to minBufferPx');\n    }\n    this._itemSize = itemSize;\n    this._minBufferPx = minBufferPx;\n    this._maxBufferPx = maxBufferPx;\n    this._updateTotalContentSize();\n    this._updateRenderedRange();\n  }\n\n  /** @docs-private Implemented as part of VirtualScrollStrategy. */\n  onContentScrolled() {\n    this._updateRenderedRange();\n  }\n\n  /** @docs-private Implemented as part of VirtualScrollStrategy. */\n  onDataLengthChanged() {\n    this._updateTotalContentSize();\n    this._updateRenderedRange();\n  }\n\n  /** @docs-private Implemented as part of VirtualScrollStrategy. */\n  onContentRendered() { /* no-op */ }\n\n  /** @docs-private Implemented as part of VirtualScrollStrategy. */\n  onRenderedOffsetChanged() { /* no-op */ }\n\n  /**\n   * Scroll to the offset for the given index.\n   * @param index The index of the element to scroll to.\n   * @param behavior The ScrollBehavior to use when scrolling.\n   */\n  scrollToIndex(index: number, behavior: ScrollBehavior): void {\n    if (this._viewport) {\n      this._viewport.scrollToOffset(index * this._itemSize, behavior);\n    }\n  }\n\n  /** Update the viewport's total content size. */\n  private _updateTotalContentSize() {\n    if (!this._viewport) {\n      return;\n    }\n\n    this._viewport.setTotalContentSize(this._viewport.getDataLength() * this._itemSize);\n  }\n\n  /** Update the viewport's rendered range. */\n  private _updateRenderedRange() {\n    if (!this._viewport) {\n      return;\n    }\n\n    const scrollOffset = this._viewport.measureScrollOffset();\n    const firstVisibleIndex = scrollOffset / this._itemSize;\n    const renderedRange = this._viewport.getRenderedRange();\n    const newRange = {start: renderedRange.start, end: renderedRange.end};\n    const viewportSize = this._viewport.getViewportSize();\n    const dataLength = this._viewport.getDataLength();\n\n    const startBuffer = scrollOffset - newRange.start * this._itemSize;\n    if (startBuffer < this._minBufferPx && newRange.start != 0) {\n      const expandStart = Math.ceil((this._maxBufferPx - startBuffer) / this._itemSize);\n      newRange.start = Math.max(0, newRange.start - expandStart);\n      newRange.end = Math.min(dataLength,\n          Math.ceil(firstVisibleIndex + (viewportSize + this._minBufferPx) / this._itemSize));\n    } else {\n      const endBuffer = newRange.end * this._itemSize - (scrollOffset + viewportSize);\n      if (endBuffer < this._minBufferPx && newRange.end != dataLength) {\n        const expandEnd = Math.ceil((this._maxBufferPx - endBuffer) / this._itemSize);\n        if (expandEnd > 0) {\n          newRange.end = Math.min(dataLength, newRange.end + expandEnd);\n          newRange.start = Math.max(0,\n              Math.floor(firstVisibleIndex - this._minBufferPx / this._itemSize));\n        }\n      }\n    }\n\n    this._viewport.setRenderedRange(newRange);\n    this._viewport.setRenderedContentOffset(this._itemSize * newRange.start);\n    this._scrolledIndexChange.next(Math.floor(firstVisibleIndex));\n  }\n}\n\n\n/**\n * Provider factory for `FixedSizeVirtualScrollStrategy` that simply extracts the already created\n * `FixedSizeVirtualScrollStrategy` from the given directive.\n * @param fixedSizeDir The instance of `CdkFixedSizeVirtualScroll` to extract the\n *     `FixedSizeVirtualScrollStrategy` from.\n */\nexport function _fixedSizeVirtualScrollStrategyFactory(fixedSizeDir: CdkFixedSizeVirtualScroll) {\n  return fixedSizeDir._scrollStrategy;\n}\n\n\n/** A virtual scroll strategy that supports fixed-size items. */\n@Directive({\n  selector: 'cdk-virtual-scroll-viewport[itemSize]',\n  providers: [{\n    provide: VIRTUAL_SCROLL_STRATEGY,\n    useFactory: _fixedSizeVirtualScrollStrategyFactory,\n    deps: [forwardRef(() => CdkFixedSizeVirtualScroll)],\n  }],\n})\nexport class CdkFixedSizeVirtualScroll implements OnChanges {\n  /** The size of the items in the list (in pixels). */\n  @Input()\n  get itemSize(): number { return this._itemSize; }\n  set itemSize(value: number) { this._itemSize = coerceNumberProperty(value); }\n  _itemSize = 20;\n\n  /**\n   * The minimum amount of buffer rendered beyond the viewport (in pixels).\n   * If the amount of buffer dips below this number, more items will be rendered. Defaults to 100px.\n   */\n  @Input()\n  get minBufferPx(): number { return this._minBufferPx; }\n  set minBufferPx(value: number) { this._minBufferPx = coerceNumberProperty(value); }\n  _minBufferPx = 100;\n\n  /**\n   * The number of pixels worth of buffer to render for when rendering new items. Defaults to 200px.\n   */\n  @Input()\n  get maxBufferPx(): number { return this._maxBufferPx; }\n  set maxBufferPx(value: number) { this._maxBufferPx = coerceNumberProperty(value); }\n  _maxBufferPx = 200;\n\n  /** The scroll strategy used by this directive. */\n  _scrollStrategy =\n      new FixedSizeVirtualScrollStrategy(this.itemSize, this.minBufferPx, this.maxBufferPx);\n\n  ngOnChanges() {\n    this._scrollStrategy.updateItemAndBufferSize(this.itemSize, this.minBufferPx, this.maxBufferPx);\n  }\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n\nimport {InjectionToken} from '@angular/core';\nimport {Observable} from 'rxjs';\nimport {CdkVirtualScrollViewport} from './virtual-scroll-viewport';\n\n\n/** The injection token used to specify the virtual scrolling strategy. */\nexport const VIRTUAL_SCROLL_STRATEGY =\n    new InjectionToken<VirtualScrollStrategy>('VIRTUAL_SCROLL_STRATEGY');\n\n\n/** A strategy that dictates which items should be rendered in the viewport. */\nexport interface VirtualScrollStrategy {\n  /** Emits when the index of the first element visible in the viewport changes. */\n  scrolledIndexChange: Observable<number>;\n\n  /**\n   * Attaches this scroll strategy to a viewport.\n   * @param viewport The viewport to attach this strategy to.\n   */\n  attach(viewport: CdkVirtualScrollViewport): void;\n\n  /** Detaches this scroll strategy from the currently attached viewport. */\n  detach(): void;\n\n  /** Called when the viewport is scrolled (debounced using requestAnimationFrame). */\n  onContentScrolled(): void;\n\n  /** Called when the length of the data changes. */\n  onDataLengthChanged(): void;\n\n  /** Called when the range of items rendered in the DOM has changed. */\n  onContentRendered(): void;\n\n  /** Called when the offset of the rendered items changed. */\n  onRenderedOffsetChanged(): void;\n\n  /**\n   * Scroll to the offset for the given index.\n   * @param index The index of the element to scroll to.\n   * @param behavior The ScrollBehavior to use when scrolling.\n   */\n  scrollToIndex(index: number, behavior: ScrollBehavior): void;\n}\n"],"names":["observableOf"],"mappings":"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"}