{"version":3,"file":"a11y.es5.js","sources":["../../../src/cdk/a11y/a11y-module.ts","../../../src/cdk/a11y/fake-mousedown.ts","../../../src/cdk/a11y/focus-monitor/focus-monitor.ts","../../../src/cdk/a11y/live-announcer/live-announcer.ts","../../../src/cdk/a11y/live-announcer/live-announcer-tokens.ts","../../../src/cdk/a11y/focus-trap/focus-trap.ts","../../../src/cdk/a11y/interactivity-checker/interactivity-checker.ts","../../../src/cdk/a11y/key-manager/focus-key-manager.ts","../../../src/cdk/a11y/key-manager/activedescendant-key-manager.ts","../../../src/cdk/a11y/key-manager/list-key-manager.ts","../../../src/cdk/a11y/aria-describer/aria-describer.ts","../../../src/cdk/a11y/aria-describer/aria-reference.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 {ObserversModule} from '@angular/cdk/observers';\nimport {PlatformModule} from '@angular/cdk/platform';\nimport {CommonModule} from '@angular/common';\nimport {NgModule} from '@angular/core';\nimport {CdkMonitorFocus} from './focus-monitor/focus-monitor';\nimport {CdkTrapFocus} from './focus-trap/focus-trap';\nimport {CdkAriaLive} from './live-announcer/live-announcer';\n\n@NgModule({\n  imports: [CommonModule, PlatformModule, ObserversModule],\n  declarations: [CdkAriaLive, CdkTrapFocus, CdkMonitorFocus],\n  exports: [CdkAriaLive, CdkTrapFocus, CdkMonitorFocus],\n})\nexport class A11yModule {}\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\n/**\n * Screenreaders will often fire fake mousedown events when a focusable element\n * is activated using the keyboard. We can typically distinguish between these faked\n * mousedown events and real mousedown events using the \"buttons\" property. While\n * real mousedowns will indicate the mouse button that was pressed (e.g. \"1\" for\n * the left mouse button), faked mousedowns will usually set the property value to 0.\n */\nexport function isFakeMousedownFromScreenReader(event: MouseEvent): boolean {\n  return event.buttons === 0;\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, normalizePassiveListenerOptions} from '@angular/cdk/platform';\nimport {\n  Directive,\n  ElementRef,\n  EventEmitter,\n  Injectable,\n  NgZone,\n  OnDestroy,\n  Optional,\n  Output,\n  SkipSelf,\n} from '@angular/core';\nimport {Observable, of as observableOf, Subject, Subscription} from 'rxjs';\nimport {coerceElement} from '@angular/cdk/coercion';\n\n\n// This is the value used by AngularJS Material. Through trial and error (on iPhone 6S) they found\n// that a value of around 650ms seems appropriate.\nexport const TOUCH_BUFFER_MS = 650;\n\n\nexport type FocusOrigin = 'touch' | 'mouse' | 'keyboard' | 'program' | null;\n\n/**\n * Corresponds to the options that can be passed to the native `focus` event.\n * via https://developer.mozilla.org/en-US/docs/Web/API/HTMLElement/focus\n */\nexport interface FocusOptions {\n  /** Whether the browser should scroll to the element when it is focused. */\n  preventScroll?: boolean;\n}\n\ntype MonitoredElementInfo = {\n  unlisten: Function,\n  checkChildren: boolean,\n  subject: Subject<FocusOrigin>\n};\n\n/**\n * Event listener options that enable capturing and also\n * mark the listener as passive if the browser supports it.\n */\nconst captureEventListenerOptions = normalizePassiveListenerOptions({\n  passive: true,\n  capture: true\n});\n\n\n/** Monitors mouse and keyboard events to determine the cause of focus events. */\n@Injectable({providedIn: 'root'})\nexport class FocusMonitor implements OnDestroy {\n  /** The focus origin that the next focus event is a result of. */\n  private _origin: FocusOrigin = null;\n\n  /** The FocusOrigin of the last focus event tracked by the FocusMonitor. */\n  private _lastFocusOrigin: FocusOrigin;\n\n  /** Whether the window has just been focused. */\n  private _windowFocused = false;\n\n  /** The target of the last touch event. */\n  private _lastTouchTarget: EventTarget | null;\n\n  /** The timeout id of the touch timeout, used to cancel timeout later. */\n  private _touchTimeoutId: number;\n\n  /** The timeout id of the window focus timeout. */\n  private _windowFocusTimeoutId: number;\n\n  /** The timeout id of the origin clearing timeout. */\n  private _originTimeoutId: number;\n\n  /** Map of elements being monitored to their info. */\n  private _elementInfo = new Map<HTMLElement, MonitoredElementInfo>();\n\n  /** The number of elements currently being monitored. */\n  private _monitoredElementCount = 0;\n\n  /**\n   * Event listener for `keydown` events on the document.\n   * Needs to be an arrow function in order to preserve the context when it gets bound.\n   */\n  private _documentKeydownListener = () => {\n    // On keydown record the origin and clear any touch event that may be in progress.\n    this._lastTouchTarget = null;\n    this._setOriginForCurrentEventQueue('keyboard');\n  }\n\n  /**\n   * Event listener for `mousedown` events on the document.\n   * Needs to be an arrow function in order to preserve the context when it gets bound.\n   */\n  private _documentMousedownListener = () => {\n    // On mousedown record the origin only if there is not touch\n    // target, since a mousedown can happen as a result of a touch event.\n    if (!this._lastTouchTarget) {\n      this._setOriginForCurrentEventQueue('mouse');\n    }\n  }\n\n  /**\n   * Event listener for `touchstart` events on the document.\n   * Needs to be an arrow function in order to preserve the context when it gets bound.\n   */\n  private _documentTouchstartListener = (event: TouchEvent) => {\n    // When the touchstart event fires the focus event is not yet in the event queue. This means\n    // we can't rely on the trick used above (setting timeout of 1ms). Instead we wait 650ms to\n    // see if a focus happens.\n    if (this._touchTimeoutId != null) {\n      clearTimeout(this._touchTimeoutId);\n    }\n    this._lastTouchTarget = event.target;\n    this._touchTimeoutId = setTimeout(() => this._lastTouchTarget = null, TOUCH_BUFFER_MS);\n  }\n\n  /**\n   * Event listener for `focus` events on the window.\n   * Needs to be an arrow function in order to preserve the context when it gets bound.\n   */\n  private _windowFocusListener = () => {\n    // Make a note of when the window regains focus, so we can\n    // restore the origin info for the focused element.\n    this._windowFocused = true;\n    this._windowFocusTimeoutId = setTimeout(() => this._windowFocused = false);\n  }\n\n  constructor(private _ngZone: NgZone, private _platform: Platform) {}\n\n  /**\n   * Monitors focus on an element and applies appropriate CSS classes.\n   * @param element The element to monitor\n   * @param checkChildren Whether to count the element as focused when its children are focused.\n   * @returns An observable that emits when the focus state of the element changes.\n   *     When the element is blurred, null will be emitted.\n   */\n  monitor(element: HTMLElement, checkChildren?: boolean): Observable<FocusOrigin>;\n\n  /**\n   * Monitors focus on an element and applies appropriate CSS classes.\n   * @param element The element to monitor\n   * @param checkChildren Whether to count the element as focused when its children are focused.\n   * @returns An observable that emits when the focus state of the element changes.\n   *     When the element is blurred, null will be emitted.\n   */\n  monitor(element: ElementRef<HTMLElement>, checkChildren?: boolean): Observable<FocusOrigin>;\n\n  monitor(element: HTMLElement | ElementRef<HTMLElement>,\n          checkChildren: boolean = false): Observable<FocusOrigin> {\n    // Do nothing if we're not on the browser platform.\n    if (!this._platform.isBrowser) {\n      return observableOf(null);\n    }\n\n    const nativeElement = coerceElement(element);\n\n    // Check if we're already monitoring this element.\n    if (this._elementInfo.has(nativeElement)) {\n      let cachedInfo = this._elementInfo.get(nativeElement);\n      cachedInfo!.checkChildren = checkChildren;\n      return cachedInfo!.subject.asObservable();\n    }\n\n    // Create monitored element info.\n    let info: MonitoredElementInfo = {\n      unlisten: () => {},\n      checkChildren: checkChildren,\n      subject: new Subject<FocusOrigin>()\n    };\n    this._elementInfo.set(nativeElement, info);\n    this._incrementMonitoredElementCount();\n\n    // Start listening. We need to listen in capture phase since focus events don't bubble.\n    let focusListener = (event: FocusEvent) => this._onFocus(event, nativeElement);\n    let blurListener = (event: FocusEvent) => this._onBlur(event, nativeElement);\n    this._ngZone.runOutsideAngular(() => {\n      nativeElement.addEventListener('focus', focusListener, true);\n      nativeElement.addEventListener('blur', blurListener, true);\n    });\n\n    // Create an unlisten function for later.\n    info.unlisten = () => {\n      nativeElement.removeEventListener('focus', focusListener, true);\n      nativeElement.removeEventListener('blur', blurListener, true);\n    };\n\n    return info.subject.asObservable();\n  }\n\n  /**\n   * Stops monitoring an element and removes all focus classes.\n   * @param element The element to stop monitoring.\n   */\n  stopMonitoring(element: HTMLElement): void;\n\n  /**\n   * Stops monitoring an element and removes all focus classes.\n   * @param element The element to stop monitoring.\n   */\n  stopMonitoring(element: ElementRef<HTMLElement>): void;\n\n  stopMonitoring(element: HTMLElement | ElementRef<HTMLElement>): void {\n    const nativeElement = coerceElement(element);\n    const elementInfo = this._elementInfo.get(nativeElement);\n\n    if (elementInfo) {\n      elementInfo.unlisten();\n      elementInfo.subject.complete();\n\n      this._setClasses(nativeElement);\n      this._elementInfo.delete(nativeElement);\n      this._decrementMonitoredElementCount();\n    }\n  }\n\n  /**\n   * Focuses the element via the specified focus origin.\n   * @param element Element to focus.\n   * @param origin Focus origin.\n   * @param options Options that can be used to configure the focus behavior.\n   */\n  focusVia(element: HTMLElement, origin: FocusOrigin, options?: FocusOptions): void;\n\n  /**\n   * Focuses the element via the specified focus origin.\n   * @param element Element to focus.\n   * @param origin Focus origin.\n   * @param options Options that can be used to configure the focus behavior.\n   */\n  focusVia(element: ElementRef<HTMLElement>, origin: FocusOrigin, options?: FocusOptions): void;\n\n  focusVia(element: HTMLElement | ElementRef<HTMLElement>,\n          origin: FocusOrigin,\n          options?: FocusOptions): void {\n\n    const nativeElement = coerceElement(element);\n\n    this._setOriginForCurrentEventQueue(origin);\n\n    // `focus` isn't available on the server\n    if (typeof nativeElement.focus === 'function') {\n      // Cast the element to `any`, because the TS typings don't have the `options` parameter yet.\n      (nativeElement as any).focus(options);\n    }\n  }\n\n  ngOnDestroy() {\n    this._elementInfo.forEach((_info, element) => this.stopMonitoring(element));\n  }\n\n  private _toggleClass(element: Element, className: string, shouldSet: boolean) {\n    if (shouldSet) {\n      element.classList.add(className);\n    } else {\n      element.classList.remove(className);\n    }\n  }\n\n  /**\n   * Sets the focus classes on the element based on the given focus origin.\n   * @param element The element to update the classes on.\n   * @param origin The focus origin.\n   */\n  private _setClasses(element: HTMLElement, origin?: FocusOrigin): void {\n    const elementInfo = this._elementInfo.get(element);\n\n    if (elementInfo) {\n      this._toggleClass(element, 'cdk-focused', !!origin);\n      this._toggleClass(element, 'cdk-touch-focused', origin === 'touch');\n      this._toggleClass(element, 'cdk-keyboard-focused', origin === 'keyboard');\n      this._toggleClass(element, 'cdk-mouse-focused', origin === 'mouse');\n      this._toggleClass(element, 'cdk-program-focused', origin === 'program');\n    }\n  }\n\n  /**\n   * Sets the origin and schedules an async function to clear it at the end of the event queue.\n   * @param origin The origin to set.\n   */\n  private _setOriginForCurrentEventQueue(origin: FocusOrigin): void {\n    this._ngZone.runOutsideAngular(() => {\n      this._origin = origin;\n      // Sometimes the focus origin won't be valid in Firefox because Firefox seems to focus *one*\n      // tick after the interaction event fired. To ensure the focus origin is always correct,\n      // the focus origin will be determined at the beginning of the next tick.\n      this._originTimeoutId = setTimeout(() => this._origin = null, 1);\n    });\n  }\n\n  /**\n   * Checks whether the given focus event was caused by a touchstart event.\n   * @param event The focus event to check.\n   * @returns Whether the event was caused by a touch.\n   */\n  private _wasCausedByTouch(event: FocusEvent): boolean {\n    // Note(mmalerba): This implementation is not quite perfect, there is a small edge case.\n    // Consider the following dom structure:\n    //\n    // <div #parent tabindex=\"0\" cdkFocusClasses>\n    //   <div #child (click)=\"#parent.focus()\"></div>\n    // </div>\n    //\n    // If the user touches the #child element and the #parent is programmatically focused as a\n    // result, this code will still consider it to have been caused by the touch event and will\n    // apply the cdk-touch-focused class rather than the cdk-program-focused class. This is a\n    // relatively small edge-case that can be worked around by using\n    // focusVia(parentEl, 'program') to focus the parent element.\n    //\n    // If we decide that we absolutely must handle this case correctly, we can do so by listening\n    // for the first focus event after the touchstart, and then the first blur event after that\n    // focus event. When that blur event fires we know that whatever follows is not a result of the\n    // touchstart.\n    let focusTarget = event.target;\n    return this._lastTouchTarget instanceof Node && focusTarget instanceof Node &&\n        (focusTarget === this._lastTouchTarget || focusTarget.contains(this._lastTouchTarget));\n  }\n\n  /**\n   * Handles focus events on a registered element.\n   * @param event The focus event.\n   * @param element The monitored element.\n   */\n  private _onFocus(event: FocusEvent, element: HTMLElement) {\n    // NOTE(mmalerba): We currently set the classes based on the focus origin of the most recent\n    // focus event affecting the monitored element. If we want to use the origin of the first event\n    // instead we should check for the cdk-focused class here and return if the element already has\n    // it. (This only matters for elements that have includesChildren = true).\n\n    // If we are not counting child-element-focus as focused, make sure that the event target is the\n    // monitored element itself.\n    const elementInfo = this._elementInfo.get(element);\n    if (!elementInfo || (!elementInfo.checkChildren && element !== event.target)) {\n      return;\n    }\n\n    // If we couldn't detect a cause for the focus event, it's due to one of three reasons:\n    // 1) The window has just regained focus, in which case we want to restore the focused state of\n    //    the element from before the window blurred.\n    // 2) It was caused by a touch event, in which case we mark the origin as 'touch'.\n    // 3) The element was programmatically focused, in which case we should mark the origin as\n    //    'program'.\n    let origin = this._origin;\n    if (!origin) {\n      if (this._windowFocused && this._lastFocusOrigin) {\n        origin = this._lastFocusOrigin;\n      } else if (this._wasCausedByTouch(event)) {\n        origin = 'touch';\n      } else {\n        origin = 'program';\n      }\n    }\n\n    this._setClasses(element, origin);\n    this._emitOrigin(elementInfo.subject, origin);\n    this._lastFocusOrigin = origin;\n  }\n\n  /**\n   * Handles blur events on a registered element.\n   * @param event The blur event.\n   * @param element The monitored element.\n   */\n  _onBlur(event: FocusEvent, element: HTMLElement) {\n    // If we are counting child-element-focus as focused, make sure that we aren't just blurring in\n    // order to focus another child of the monitored element.\n    const elementInfo = this._elementInfo.get(element);\n\n    if (!elementInfo || (elementInfo.checkChildren && event.relatedTarget instanceof Node &&\n        element.contains(event.relatedTarget))) {\n      return;\n    }\n\n    this._setClasses(element);\n    this._emitOrigin(elementInfo.subject, null);\n  }\n\n  private _emitOrigin(subject: Subject<FocusOrigin>, origin: FocusOrigin) {\n    this._ngZone.run(() => subject.next(origin));\n  }\n\n  private _incrementMonitoredElementCount() {\n    // Register global listeners when first element is monitored.\n    if (++this._monitoredElementCount == 1 && this._platform.isBrowser) {\n      // Note: we listen to events in the capture phase so we\n      // can detect them even if the user stops propagation.\n      this._ngZone.runOutsideAngular(() => {\n        document.addEventListener('keydown', this._documentKeydownListener,\n          captureEventListenerOptions);\n        document.addEventListener('mousedown', this._documentMousedownListener,\n          captureEventListenerOptions);\n        document.addEventListener('touchstart', this._documentTouchstartListener,\n          captureEventListenerOptions);\n        window.addEventListener('focus', this._windowFocusListener);\n      });\n    }\n  }\n\n  private _decrementMonitoredElementCount() {\n    // Unregister global listeners when last element is unmonitored.\n    if (!--this._monitoredElementCount) {\n      document.removeEventListener('keydown', this._documentKeydownListener,\n        captureEventListenerOptions);\n      document.removeEventListener('mousedown', this._documentMousedownListener,\n        captureEventListenerOptions);\n      document.removeEventListener('touchstart', this._documentTouchstartListener,\n        captureEventListenerOptions);\n      window.removeEventListener('focus', this._windowFocusListener);\n\n      // Clear timeouts for all potentially pending timeouts to prevent the leaks.\n      clearTimeout(this._windowFocusTimeoutId);\n      clearTimeout(this._touchTimeoutId);\n      clearTimeout(this._originTimeoutId);\n    }\n  }\n}\n\n\n/**\n * Directive that determines how a particular element was focused (via keyboard, mouse, touch, or\n * programmatically) and adds corresponding classes to the element.\n *\n * There are two variants of this directive:\n * 1) cdkMonitorElementFocus: does not consider an element to be focused if one of its children is\n *    focused.\n * 2) cdkMonitorSubtreeFocus: considers an element focused if it or any of its children are focused.\n */\n@Directive({\n  selector: '[cdkMonitorElementFocus], [cdkMonitorSubtreeFocus]',\n})\nexport class CdkMonitorFocus implements OnDestroy {\n  private _monitorSubscription: Subscription;\n  @Output() cdkFocusChange = new EventEmitter<FocusOrigin>();\n\n  constructor(private _elementRef: ElementRef<HTMLElement>, private _focusMonitor: FocusMonitor) {\n    this._monitorSubscription = this._focusMonitor.monitor(\n        this._elementRef,\n        this._elementRef.nativeElement.hasAttribute('cdkMonitorSubtreeFocus'))\n        .subscribe(origin => this.cdkFocusChange.emit(origin));\n  }\n\n  ngOnDestroy() {\n    this._focusMonitor.stopMonitoring(this._elementRef);\n    this._monitorSubscription.unsubscribe();\n  }\n}\n\n/** @docs-private @deprecated @breaking-change 8.0.0 */\nexport function FOCUS_MONITOR_PROVIDER_FACTORY(\n    parentDispatcher: FocusMonitor, ngZone: NgZone, platform: Platform) {\n  return parentDispatcher || new FocusMonitor(ngZone, platform);\n}\n\n/** @docs-private @deprecated @breaking-change 8.0.0 */\nexport const FOCUS_MONITOR_PROVIDER = {\n  // If there is already a FocusMonitor available, use that. Otherwise, provide a new one.\n  provide: FocusMonitor,\n  deps: [[new Optional(), new SkipSelf(), FocusMonitor], NgZone, Platform],\n  useFactory: FOCUS_MONITOR_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 {ContentObserver} from '@angular/cdk/observers';\nimport {DOCUMENT} from '@angular/common';\nimport {\n  Directive,\n  ElementRef,\n  Inject,\n  Injectable,\n  Input,\n  NgZone,\n  OnDestroy,\n  Optional,\n  Provider,\n  SkipSelf,\n} from '@angular/core';\nimport {Subscription} from 'rxjs';\nimport {\n  AriaLivePoliteness,\n  LiveAnnouncerDefaultOptions,\n  LIVE_ANNOUNCER_ELEMENT_TOKEN,\n  LIVE_ANNOUNCER_DEFAULT_OPTIONS,\n} from './live-announcer-tokens';\n\n\n@Injectable({providedIn: 'root'})\nexport class LiveAnnouncer implements OnDestroy {\n  private _liveElement: HTMLElement;\n  private _document: Document;\n  private _previousTimeout?: number;\n\n  constructor(\n      @Optional() @Inject(LIVE_ANNOUNCER_ELEMENT_TOKEN) elementToken: any,\n      private _ngZone: NgZone,\n      @Inject(DOCUMENT) _document: any,\n      @Optional() @Inject(LIVE_ANNOUNCER_DEFAULT_OPTIONS)\n      private _defaultOptions?: LiveAnnouncerDefaultOptions) {\n\n    // We inject the live element and document as `any` because the constructor signature cannot\n    // reference browser globals (HTMLElement, Document) on non-browser environments, since having\n    // a class decorator causes TypeScript to preserve the constructor signature types.\n    this._document = _document;\n    this._liveElement = elementToken || this._createLiveElement();\n  }\n\n  /**\n   * Announces a message to screenreaders.\n   * @param message Message to be announced to the screenreader.\n   * @returns Promise that will be resolved when the message is added to the DOM.\n   */\n  announce(message: string): Promise<void>;\n\n  /**\n   * Announces a message to screenreaders.\n   * @param message Message to be announced to the screenreader.\n   * @param politeness The politeness of the announcer element.\n   * @returns Promise that will be resolved when the message is added to the DOM.\n   */\n  announce(message: string, politeness?: AriaLivePoliteness): Promise<void>;\n\n  /**\n   * Announces a message to screenreaders.\n   * @param message Message to be announced to the screenreader.\n   * @param duration Time in milliseconds after which to clear out the announcer element. Note\n   *   that this takes effect after the message has been added to the DOM, which can be up to\n   *   100ms after `announce` has been called.\n   * @returns Promise that will be resolved when the message is added to the DOM.\n   */\n  announce(message: string, duration?: number): Promise<void>;\n\n  /**\n   * Announces a message to screenreaders.\n   * @param message Message to be announced to the screenreader.\n   * @param politeness The politeness of the announcer element.\n   * @param duration Time in milliseconds after which to clear out the announcer element. Note\n   *   that this takes effect after the message has been added to the DOM, which can be up to\n   *   100ms after `announce` has been called.\n   * @returns Promise that will be resolved when the message is added to the DOM.\n   */\n  announce(message: string, politeness?: AriaLivePoliteness, duration?: number): Promise<void>;\n\n  announce(message: string, ...args: any[]): Promise<void> {\n    const defaultOptions = this._defaultOptions;\n    let politeness: AriaLivePoliteness | undefined;\n    let duration: number | undefined;\n\n    if (args.length === 1 && typeof args[0] === 'number') {\n      duration = args[0];\n    } else {\n      [politeness, duration] = args;\n    }\n\n    this.clear();\n    clearTimeout(this._previousTimeout);\n\n    if (!politeness) {\n      politeness =\n          (defaultOptions && defaultOptions.politeness) ? defaultOptions.politeness : 'polite';\n    }\n\n    if (duration == null && defaultOptions) {\n      duration = defaultOptions.duration;\n    }\n\n    // TODO: ensure changing the politeness works on all environments we support.\n    this._liveElement.setAttribute('aria-live', politeness);\n\n    // This 100ms timeout is necessary for some browser + screen-reader combinations:\n    // - Both JAWS and NVDA over IE11 will not announce anything without a non-zero timeout.\n    // - With Chrome and IE11 with NVDA or JAWS, a repeated (identical) message won't be read a\n    //   second time without clearing and then using a non-zero delay.\n    // (using JAWS 17 at time of this writing).\n    return this._ngZone.runOutsideAngular(() => {\n      return new Promise(resolve => {\n        clearTimeout(this._previousTimeout);\n        this._previousTimeout = setTimeout(() => {\n          this._liveElement.textContent = message;\n          resolve();\n\n          if (typeof duration === 'number') {\n            this._previousTimeout = setTimeout(() => this.clear(), duration);\n          }\n        }, 100);\n      });\n    });\n  }\n\n  /**\n   * Clears the current text from the announcer element. Can be used to prevent\n   * screen readers from reading the text out again while the user is going\n   * through the page landmarks.\n   */\n  clear() {\n    if (this._liveElement) {\n      this._liveElement.textContent = '';\n    }\n  }\n\n  ngOnDestroy() {\n    clearTimeout(this._previousTimeout);\n\n    if (this._liveElement && this._liveElement.parentNode) {\n      this._liveElement.parentNode.removeChild(this._liveElement);\n      this._liveElement = null!;\n    }\n  }\n\n  private _createLiveElement(): HTMLElement {\n    const elementClass = 'cdk-live-announcer-element';\n    const previousElements = this._document.getElementsByClassName(elementClass);\n    const liveEl = this._document.createElement('div');\n\n    // Remove any old containers. This can happen when coming in from a server-side-rendered page.\n    for (let i = 0; i < previousElements.length; i++) {\n      previousElements[i].parentNode!.removeChild(previousElements[i]);\n    }\n\n    liveEl.classList.add(elementClass);\n    liveEl.classList.add('cdk-visually-hidden');\n\n    liveEl.setAttribute('aria-atomic', 'true');\n    liveEl.setAttribute('aria-live', 'polite');\n\n    this._document.body.appendChild(liveEl);\n\n    return liveEl;\n  }\n\n}\n\n\n/**\n * A directive that works similarly to aria-live, but uses the LiveAnnouncer to ensure compatibility\n * with a wider range of browsers and screen readers.\n */\n@Directive({\n  selector: '[cdkAriaLive]',\n  exportAs: 'cdkAriaLive',\n})\nexport class CdkAriaLive implements OnDestroy {\n  /** The aria-live politeness level to use when announcing messages. */\n  @Input('cdkAriaLive')\n  get politeness(): AriaLivePoliteness { return this._politeness; }\n  set politeness(value: AriaLivePoliteness) {\n    this._politeness = value === 'polite' || value === 'assertive' ? value : 'off';\n    if (this._politeness === 'off') {\n      if (this._subscription) {\n        this._subscription.unsubscribe();\n        this._subscription = null;\n      }\n    } else if (!this._subscription) {\n      this._subscription = this._ngZone.runOutsideAngular(() => {\n        return this._contentObserver\n          .observe(this._elementRef)\n          .subscribe(() => {\n            // Note that we use textContent here, rather than innerText, in order to avoid a reflow.\n            const elementText = this._elementRef.nativeElement.textContent;\n\n            // The `MutationObserver` fires also for attribute\n            // changes which we don't want to announce.\n            if (elementText !== this._previousAnnouncedText) {\n              this._liveAnnouncer.announce(elementText, this._politeness);\n              this._previousAnnouncedText = elementText;\n            }\n          });\n      });\n    }\n  }\n  private _politeness: AriaLivePoliteness = 'off';\n\n  private _previousAnnouncedText?: string;\n  private _subscription: Subscription | null;\n\n  constructor(private _elementRef: ElementRef, private _liveAnnouncer: LiveAnnouncer,\n              private _contentObserver: ContentObserver, private _ngZone: NgZone) {}\n\n  ngOnDestroy() {\n    if (this._subscription) {\n      this._subscription.unsubscribe();\n    }\n  }\n}\n\n\n/** @docs-private @deprecated @breaking-change 8.0.0 */\nexport function LIVE_ANNOUNCER_PROVIDER_FACTORY(\n    parentAnnouncer: LiveAnnouncer, liveElement: any, _document: any, ngZone: NgZone) {\n  return parentAnnouncer || new LiveAnnouncer(liveElement, ngZone, _document);\n}\n\n\n/** @docs-private @deprecated @breaking-change 8.0.0 */\nexport const LIVE_ANNOUNCER_PROVIDER: Provider = {\n  // If there is already a LiveAnnouncer available, use that. Otherwise, provide a new one.\n  provide: LiveAnnouncer,\n  deps: [\n    [new Optional(), new SkipSelf(), LiveAnnouncer],\n    [new Optional(), new Inject(LIVE_ANNOUNCER_ELEMENT_TOKEN)],\n    DOCUMENT,\n    NgZone,\n  ],\n  useFactory: LIVE_ANNOUNCER_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 {InjectionToken} from '@angular/core';\n\n// The tokens for the live announcer are defined in a separate file from LiveAnnouncer\n// as a workaround for https://github.com/angular/angular/issues/22559\n\n/** Possible politeness levels. */\nexport type AriaLivePoliteness = 'off' | 'polite' | 'assertive';\n\nexport const LIVE_ANNOUNCER_ELEMENT_TOKEN =\n    new InjectionToken<HTMLElement | null>('liveAnnouncerElement', {\n      providedIn: 'root',\n      factory: LIVE_ANNOUNCER_ELEMENT_TOKEN_FACTORY,\n    });\n\n/** @docs-private */\nexport function LIVE_ANNOUNCER_ELEMENT_TOKEN_FACTORY(): null {\n  return null;\n}\n\n/** Object that can be used to configure the default options for the LiveAnnouncer. */\nexport interface LiveAnnouncerDefaultOptions {\n  /** Default politeness for the announcements. */\n  politeness?: AriaLivePoliteness;\n\n  /** Default duration for the announcement messages. */\n  duration?: number;\n}\n\n/** Injection token that can be used to configure the default options for the LiveAnnouncer. */\nexport const LIVE_ANNOUNCER_DEFAULT_OPTIONS =\n    new InjectionToken<LiveAnnouncerDefaultOptions>('LIVE_ANNOUNCER_DEFAULT_OPTIONS');\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 {coerceBooleanProperty} from '@angular/cdk/coercion';\nimport {DOCUMENT} from '@angular/common';\nimport {\n  AfterContentInit,\n  Directive,\n  ElementRef,\n  Inject,\n  Injectable,\n  Input,\n  NgZone,\n  OnDestroy,\n  DoCheck,\n  isDevMode,\n} from '@angular/core';\nimport {take} from 'rxjs/operators';\nimport {InteractivityChecker} from '../interactivity-checker/interactivity-checker';\n\n\n/**\n * Class that allows for trapping focus within a DOM element.\n *\n * This class currently uses a relatively simple approach to focus trapping.\n * It assumes that the tab order is the same as DOM order, which is not necessarily true.\n * Things like `tabIndex > 0`, flex `order`, and shadow roots can cause to two to misalign.\n */\nexport class FocusTrap {\n  private _startAnchor: HTMLElement | null;\n  private _endAnchor: HTMLElement | null;\n  private _hasAttached = false;\n\n  // Event listeners for the anchors. Need to be regular functions so that we can unbind them later.\n  protected startAnchorListener = () => this.focusLastTabbableElement();\n  protected endAnchorListener = () => this.focusFirstTabbableElement();\n\n  /** Whether the focus trap is active. */\n  get enabled(): boolean { return this._enabled; }\n  set enabled(value: boolean) {\n    this._enabled = value;\n\n    if (this._startAnchor && this._endAnchor) {\n      this._toggleAnchorTabIndex(value, this._startAnchor);\n      this._toggleAnchorTabIndex(value, this._endAnchor);\n    }\n  }\n  private _enabled: boolean = true;\n\n  constructor(\n    private _element: HTMLElement,\n    private _checker: InteractivityChecker,\n    private _ngZone: NgZone,\n    private _document: Document,\n    deferAnchors = false) {\n\n    if (!deferAnchors) {\n      this.attachAnchors();\n    }\n  }\n\n  /** Destroys the focus trap by cleaning up the anchors. */\n  destroy() {\n    const startAnchor = this._startAnchor;\n    const endAnchor = this._endAnchor;\n\n    if (startAnchor) {\n      startAnchor.removeEventListener('focus', this.startAnchorListener);\n\n      if (startAnchor.parentNode) {\n        startAnchor.parentNode.removeChild(startAnchor);\n      }\n    }\n\n    if (endAnchor) {\n      endAnchor.removeEventListener('focus', this.endAnchorListener);\n\n      if (endAnchor.parentNode) {\n        endAnchor.parentNode.removeChild(endAnchor);\n      }\n    }\n\n    this._startAnchor = this._endAnchor = null;\n  }\n\n  /**\n   * Inserts the anchors into the DOM. This is usually done automatically\n   * in the constructor, but can be deferred for cases like directives with `*ngIf`.\n   * @returns Whether the focus trap managed to attach successfuly. This may not be the case\n   * if the target element isn't currently in the DOM.\n   */\n  attachAnchors(): boolean {\n    // If we're not on the browser, there can be no focus to trap.\n    if (this._hasAttached) {\n      return true;\n    }\n\n    this._ngZone.runOutsideAngular(() => {\n      if (!this._startAnchor) {\n        this._startAnchor = this._createAnchor();\n        this._startAnchor!.addEventListener('focus', this.startAnchorListener);\n      }\n\n      if (!this._endAnchor) {\n        this._endAnchor = this._createAnchor();\n        this._endAnchor!.addEventListener('focus', this.endAnchorListener);\n      }\n    });\n\n    if (this._element.parentNode) {\n      this._element.parentNode.insertBefore(this._startAnchor!, this._element);\n      this._element.parentNode.insertBefore(this._endAnchor!, this._element.nextSibling);\n      this._hasAttached = true;\n    }\n\n    return this._hasAttached;\n  }\n\n  /**\n   * Waits for the zone to stabilize, then either focuses the first element that the\n   * user specified, or the first tabbable element.\n   * @returns Returns a promise that resolves with a boolean, depending\n   * on whether focus was moved successfuly.\n   */\n  focusInitialElementWhenReady(): Promise<boolean> {\n    return new Promise<boolean>(resolve => {\n      this._executeOnStable(() => resolve(this.focusInitialElement()));\n    });\n  }\n\n  /**\n   * Waits for the zone to stabilize, then focuses\n   * the first tabbable element within the focus trap region.\n   * @returns Returns a promise that resolves with a boolean, depending\n   * on whether focus was moved successfuly.\n   */\n  focusFirstTabbableElementWhenReady(): Promise<boolean> {\n    return new Promise<boolean>(resolve => {\n      this._executeOnStable(() => resolve(this.focusFirstTabbableElement()));\n    });\n  }\n\n  /**\n   * Waits for the zone to stabilize, then focuses\n   * the last tabbable element within the focus trap region.\n   * @returns Returns a promise that resolves with a boolean, depending\n   * on whether focus was moved successfuly.\n   */\n  focusLastTabbableElementWhenReady(): Promise<boolean> {\n    return new Promise<boolean>(resolve => {\n      this._executeOnStable(() => resolve(this.focusLastTabbableElement()));\n    });\n  }\n\n  /**\n   * Get the specified boundary element of the trapped region.\n   * @param bound The boundary to get (start or end of trapped region).\n   * @returns The boundary element.\n   */\n  private _getRegionBoundary(bound: 'start' | 'end'): HTMLElement | null {\n    // Contains the deprecated version of selector, for temporary backwards comparability.\n    let markers = this._element.querySelectorAll(`[cdk-focus-region-${bound}], ` +\n                                                 `[cdkFocusRegion${bound}], ` +\n                                                 `[cdk-focus-${bound}]`) as NodeListOf<HTMLElement>;\n\n    for (let i = 0; i < markers.length; i++) {\n      // @breaking-change 8.0.0\n      if (markers[i].hasAttribute(`cdk-focus-${bound}`)) {\n        console.warn(`Found use of deprecated attribute 'cdk-focus-${bound}', ` +\n                     `use 'cdkFocusRegion${bound}' instead. The deprecated ` +\n                     `attribute will be removed in 8.0.0.`, markers[i]);\n      } else if (markers[i].hasAttribute(`cdk-focus-region-${bound}`)) {\n        console.warn(`Found use of deprecated attribute 'cdk-focus-region-${bound}', ` +\n                     `use 'cdkFocusRegion${bound}' instead. The deprecated attribute ` +\n                     `will be removed in 8.0.0.`, markers[i]);\n      }\n    }\n\n    if (bound == 'start') {\n      return markers.length ? markers[0] : this._getFirstTabbableElement(this._element);\n    }\n    return markers.length ?\n        markers[markers.length - 1] : this._getLastTabbableElement(this._element);\n  }\n\n  /**\n   * Focuses the element that should be focused when the focus trap is initialized.\n   * @returns Whether focus was moved successfuly.\n   */\n  focusInitialElement(): boolean {\n    // Contains the deprecated version of selector, for temporary backwards comparability.\n    const redirectToElement = this._element.querySelector(`[cdk-focus-initial], ` +\n                                                          `[cdkFocusInitial]`) as HTMLElement;\n\n    if (redirectToElement) {\n      // @breaking-change 8.0.0\n      if (redirectToElement.hasAttribute(`cdk-focus-initial`)) {\n        console.warn(`Found use of deprecated attribute 'cdk-focus-initial', ` +\n                    `use 'cdkFocusInitial' instead. The deprecated attribute ` +\n                    `will be removed in 8.0.0`, redirectToElement);\n      }\n\n      // Warn the consumer if the element they've pointed to\n      // isn't focusable, when not in production mode.\n      if (isDevMode() && !this._checker.isFocusable(redirectToElement)) {\n        console.warn(`Element matching '[cdkFocusInitial]' is not focusable.`, redirectToElement);\n      }\n\n      redirectToElement.focus();\n      return true;\n    }\n\n    return this.focusFirstTabbableElement();\n  }\n\n  /**\n   * Focuses the first tabbable element within the focus trap region.\n   * @returns Whether focus was moved successfuly.\n   */\n  focusFirstTabbableElement(): boolean {\n    const redirectToElement = this._getRegionBoundary('start');\n\n    if (redirectToElement) {\n      redirectToElement.focus();\n    }\n\n    return !!redirectToElement;\n  }\n\n  /**\n   * Focuses the last tabbable element within the focus trap region.\n   * @returns Whether focus was moved successfuly.\n   */\n  focusLastTabbableElement(): boolean {\n    const redirectToElement = this._getRegionBoundary('end');\n\n    if (redirectToElement) {\n      redirectToElement.focus();\n    }\n\n    return !!redirectToElement;\n  }\n\n  /**\n   * Checks whether the focus trap has successfuly been attached.\n   */\n  hasAttached(): boolean {\n    return this._hasAttached;\n  }\n\n  /** Get the first tabbable element from a DOM subtree (inclusive). */\n  private _getFirstTabbableElement(root: HTMLElement): HTMLElement | null {\n    if (this._checker.isFocusable(root) && this._checker.isTabbable(root)) {\n      return root;\n    }\n\n    // Iterate in DOM order. Note that IE doesn't have `children` for SVG so we fall\n    // back to `childNodes` which includes text nodes, comments etc.\n    let children = root.children || root.childNodes;\n\n    for (let i = 0; i < children.length; i++) {\n      let tabbableChild = children[i].nodeType === this._document.ELEMENT_NODE ?\n        this._getFirstTabbableElement(children[i] as HTMLElement) :\n        null;\n\n      if (tabbableChild) {\n        return tabbableChild;\n      }\n    }\n\n    return null;\n  }\n\n  /** Get the last tabbable element from a DOM subtree (inclusive). */\n  private _getLastTabbableElement(root: HTMLElement): HTMLElement | null {\n    if (this._checker.isFocusable(root) && this._checker.isTabbable(root)) {\n      return root;\n    }\n\n    // Iterate in reverse DOM order.\n    let children = root.children || root.childNodes;\n\n    for (let i = children.length - 1; i >= 0; i--) {\n      let tabbableChild = children[i].nodeType === this._document.ELEMENT_NODE ?\n        this._getLastTabbableElement(children[i] as HTMLElement) :\n        null;\n\n      if (tabbableChild) {\n        return tabbableChild;\n      }\n    }\n\n    return null;\n  }\n\n  /** Creates an anchor element. */\n  private _createAnchor(): HTMLElement {\n    const anchor = this._document.createElement('div');\n    this._toggleAnchorTabIndex(this._enabled, anchor);\n    anchor.classList.add('cdk-visually-hidden');\n    anchor.classList.add('cdk-focus-trap-anchor');\n    anchor.setAttribute('aria-hidden', 'true');\n    return anchor;\n  }\n\n  /**\n   * Toggles the `tabindex` of an anchor, based on the enabled state of the focus trap.\n   * @param isEnabled Whether the focus trap is enabled.\n   * @param anchor Anchor on which to toggle the tabindex.\n   */\n  private _toggleAnchorTabIndex(isEnabled: boolean, anchor: HTMLElement) {\n    // Remove the tabindex completely, rather than setting it to -1, because if the\n    // element has a tabindex, the user might still hit it when navigating with the arrow keys.\n    isEnabled ? anchor.setAttribute('tabindex', '0') : anchor.removeAttribute('tabindex');\n  }\n\n  /** Executes a function when the zone is stable. */\n  private _executeOnStable(fn: () => any): void {\n    if (this._ngZone.isStable) {\n      fn();\n    } else {\n      this._ngZone.onStable.asObservable().pipe(take(1)).subscribe(fn);\n    }\n  }\n}\n\n\n/** Factory that allows easy instantiation of focus traps. */\n@Injectable({providedIn: 'root'})\nexport class FocusTrapFactory {\n  private _document: Document;\n\n  constructor(\n      private _checker: InteractivityChecker,\n      private _ngZone: NgZone,\n      @Inject(DOCUMENT) _document: any) {\n\n    this._document = _document;\n  }\n\n  /**\n   * Creates a focus-trapped region around the given element.\n   * @param element The element around which focus will be trapped.\n   * @param deferCaptureElements Defers the creation of focus-capturing elements to be done\n   *     manually by the user.\n   * @returns The created focus trap instance.\n   */\n  create(element: HTMLElement, deferCaptureElements: boolean = false): FocusTrap {\n    return new FocusTrap(\n        element, this._checker, this._ngZone, this._document, deferCaptureElements);\n  }\n}\n\n/** Directive for trapping focus within a region. */\n@Directive({\n  selector: '[cdkTrapFocus]',\n  exportAs: 'cdkTrapFocus',\n})\nexport class CdkTrapFocus implements OnDestroy, AfterContentInit, DoCheck {\n  private _document: Document;\n\n  /** Underlying FocusTrap instance. */\n  focusTrap: FocusTrap;\n\n  /** Previously focused element to restore focus to upon destroy when using autoCapture. */\n  private _previouslyFocusedElement: HTMLElement | null = null;\n\n  /** Whether the focus trap is active. */\n  @Input('cdkTrapFocus')\n  get enabled(): boolean { return this.focusTrap.enabled; }\n  set enabled(value: boolean) { this.focusTrap.enabled = coerceBooleanProperty(value); }\n\n  /**\n   * Whether the directive should automatially move focus into the trapped region upon\n   * initialization and return focus to the previous activeElement upon destruction.\n   */\n  @Input('cdkTrapFocusAutoCapture')\n  get autoCapture(): boolean { return this._autoCapture; }\n  set autoCapture(value: boolean) { this._autoCapture = coerceBooleanProperty(value); }\n  private _autoCapture: boolean;\n\n  constructor(\n      private _elementRef: ElementRef<HTMLElement>,\n      private _focusTrapFactory: FocusTrapFactory,\n      @Inject(DOCUMENT) _document: any) {\n\n    this._document = _document;\n    this.focusTrap = this._focusTrapFactory.create(this._elementRef.nativeElement, true);\n  }\n\n  ngOnDestroy() {\n    this.focusTrap.destroy();\n\n    // If we stored a previously focused element when using autoCapture, return focus to that\n    // element now that the trapped region is being destroyed.\n    if (this._previouslyFocusedElement) {\n      this._previouslyFocusedElement.focus();\n      this._previouslyFocusedElement = null;\n    }\n  }\n\n  ngAfterContentInit() {\n    this.focusTrap.attachAnchors();\n\n    if (this.autoCapture) {\n      this._previouslyFocusedElement = this._document.activeElement as HTMLElement;\n      this.focusTrap.focusInitialElementWhenReady();\n    }\n  }\n\n  ngDoCheck() {\n    if (!this.focusTrap.hasAttached()) {\n      this.focusTrap.attachAnchors();\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 {Injectable} from '@angular/core';\n\n\n// The InteractivityChecker leans heavily on the ally.js accessibility utilities.\n// Methods like `isTabbable` are only covering specific edge-cases for the browsers which are\n// supported.\n\n/**\n * Utility for checking the interactivity of an element, such as whether is is focusable or\n * tabbable.\n */\n@Injectable({providedIn: 'root'})\nexport class InteractivityChecker {\n\n  constructor(private _platform: Platform) {}\n\n  /**\n   * Gets whether an element is disabled.\n   *\n   * @param element Element to be checked.\n   * @returns Whether the element is disabled.\n   */\n  isDisabled(element: HTMLElement): boolean {\n    // This does not capture some cases, such as a non-form control with a disabled attribute or\n    // a form control inside of a disabled form, but should capture the most common cases.\n    return element.hasAttribute('disabled');\n  }\n\n  /**\n   * Gets whether an element is visible for the purposes of interactivity.\n   *\n   * This will capture states like `display: none` and `visibility: hidden`, but not things like\n   * being clipped by an `overflow: hidden` parent or being outside the viewport.\n   *\n   * @returns Whether the element is visible.\n   */\n  isVisible(element: HTMLElement): boolean {\n    return hasGeometry(element) && getComputedStyle(element).visibility === 'visible';\n  }\n\n  /**\n   * Gets whether an element can be reached via Tab key.\n   * Assumes that the element has already been checked with isFocusable.\n   *\n   * @param element Element to be checked.\n   * @returns Whether the element is tabbable.\n   */\n  isTabbable(element: HTMLElement): boolean {\n    // Nothing is tabbable on the server 😎\n    if (!this._platform.isBrowser) {\n      return false;\n    }\n\n    const frameElement = getFrameElement(getWindow(element));\n\n    if (frameElement) {\n      const frameType = frameElement && frameElement.nodeName.toLowerCase();\n\n      // Frame elements inherit their tabindex onto all child elements.\n      if (getTabIndexValue(frameElement) === -1) {\n        return false;\n      }\n\n      // Webkit and Blink consider anything inside of an <object> element as non-tabbable.\n      if ((this._platform.BLINK || this._platform.WEBKIT) && frameType === 'object') {\n        return false;\n      }\n\n      // Webkit and Blink disable tabbing to an element inside of an invisible frame.\n      if ((this._platform.BLINK || this._platform.WEBKIT) && !this.isVisible(frameElement)) {\n        return false;\n      }\n\n    }\n\n    let nodeName = element.nodeName.toLowerCase();\n    let tabIndexValue = getTabIndexValue(element);\n\n    if (element.hasAttribute('contenteditable')) {\n      return tabIndexValue !== -1;\n    }\n\n    if (nodeName === 'iframe') {\n      // The frames may be tabbable depending on content, but it's not possibly to reliably\n      // investigate the content of the frames.\n      return false;\n    }\n\n    if (nodeName === 'audio') {\n      if (!element.hasAttribute('controls')) {\n        // By default an <audio> element without the controls enabled is not tabbable.\n        return false;\n      } else if (this._platform.BLINK) {\n        // In Blink <audio controls> elements are always tabbable.\n        return true;\n      }\n    }\n\n    if (nodeName === 'video') {\n      if (!element.hasAttribute('controls') && this._platform.TRIDENT) {\n        // In Trident a <video> element without the controls enabled is not tabbable.\n        return false;\n      } else if (this._platform.BLINK || this._platform.FIREFOX) {\n        // In Chrome and Firefox <video controls> elements are always tabbable.\n        return true;\n      }\n    }\n\n    if (nodeName === 'object' && (this._platform.BLINK || this._platform.WEBKIT)) {\n      // In all Blink and WebKit based browsers <object> elements are never tabbable.\n      return false;\n    }\n\n    // In iOS the browser only considers some specific elements as tabbable.\n    if (this._platform.WEBKIT && this._platform.IOS && !isPotentiallyTabbableIOS(element)) {\n      return false;\n    }\n\n    return element.tabIndex >= 0;\n  }\n\n  /**\n   * Gets whether an element can be focused by the user.\n   *\n   * @param element Element to be checked.\n   * @returns Whether the element is focusable.\n   */\n  isFocusable(element: HTMLElement): boolean {\n    // Perform checks in order of left to most expensive.\n    // Again, naive approach that does not capture many edge cases and browser quirks.\n    return isPotentiallyFocusable(element) && !this.isDisabled(element) && this.isVisible(element);\n  }\n\n}\n\n/**\n * Returns the frame element from a window object. Since browsers like MS Edge throw errors if\n * the frameElement property is being accessed from a different host address, this property\n * should be accessed carefully.\n */\nfunction getFrameElement(window: Window) {\n  try {\n    return window.frameElement as HTMLElement;\n  } catch {\n    return null;\n  }\n}\n\n/** Checks whether the specified element has any geometry / rectangles. */\nfunction hasGeometry(element: HTMLElement): boolean {\n  // Use logic from jQuery to check for an invisible element.\n  // See https://github.com/jquery/jquery/blob/master/src/css/hiddenVisibleSelectors.js#L12\n  return !!(element.offsetWidth || element.offsetHeight ||\n      (typeof element.getClientRects === 'function' && element.getClientRects().length));\n}\n\n/** Gets whether an element's  */\nfunction isNativeFormElement(element: Node) {\n  let nodeName = element.nodeName.toLowerCase();\n  return nodeName === 'input' ||\n      nodeName === 'select' ||\n      nodeName === 'button' ||\n      nodeName === 'textarea';\n}\n\n/** Gets whether an element is an `<input type=\"hidden\">`. */\nfunction isHiddenInput(element: HTMLElement): boolean {\n  return isInputElement(element) && element.type == 'hidden';\n}\n\n/** Gets whether an element is an anchor that has an href attribute. */\nfunction isAnchorWithHref(element: HTMLElement): boolean {\n  return isAnchorElement(element) && element.hasAttribute('href');\n}\n\n/** Gets whether an element is an input element. */\nfunction isInputElement(element: HTMLElement): element is HTMLInputElement {\n  return element.nodeName.toLowerCase() == 'input';\n}\n\n/** Gets whether an element is an anchor element. */\nfunction isAnchorElement(element: HTMLElement): element is HTMLAnchorElement {\n  return element.nodeName.toLowerCase() == 'a';\n}\n\n/** Gets whether an element has a valid tabindex. */\nfunction hasValidTabIndex(element: HTMLElement): boolean {\n  if (!element.hasAttribute('tabindex') || element.tabIndex === undefined) {\n    return false;\n  }\n\n  let tabIndex = element.getAttribute('tabindex');\n\n  // IE11 parses tabindex=\"\" as the value \"-32768\"\n  if (tabIndex == '-32768') {\n    return false;\n  }\n\n  return !!(tabIndex && !isNaN(parseInt(tabIndex, 10)));\n}\n\n/**\n * Returns the parsed tabindex from the element attributes instead of returning the\n * evaluated tabindex from the browsers defaults.\n */\nfunction getTabIndexValue(element: HTMLElement): number | null {\n  if (!hasValidTabIndex(element)) {\n    return null;\n  }\n\n  // See browser issue in Gecko https://bugzilla.mozilla.org/show_bug.cgi?id=1128054\n  const tabIndex = parseInt(element.getAttribute('tabindex') || '', 10);\n\n  return isNaN(tabIndex) ? -1 : tabIndex;\n}\n\n/** Checks whether the specified element is potentially tabbable on iOS */\nfunction isPotentiallyTabbableIOS(element: HTMLElement): boolean {\n  let nodeName = element.nodeName.toLowerCase();\n  let inputType = nodeName === 'input' && (element as HTMLInputElement).type;\n\n  return inputType === 'text'\n      || inputType === 'password'\n      || nodeName === 'select'\n      || nodeName === 'textarea';\n}\n\n/**\n * Gets whether an element is potentially focusable without taking current visible/disabled state\n * into account.\n */\nfunction isPotentiallyFocusable(element: HTMLElement): boolean {\n  // Inputs are potentially focusable *unless* they're type=\"hidden\".\n  if (isHiddenInput(element)) {\n    return false;\n  }\n\n  return isNativeFormElement(element) ||\n      isAnchorWithHref(element) ||\n      element.hasAttribute('contenteditable') ||\n      hasValidTabIndex(element);\n}\n\n/** Gets the parent window of a DOM node with regards of being inside of an iframe. */\nfunction getWindow(node: HTMLElement): Window {\n  // ownerDocument is null if `node` itself *is* a document.\n  return node.ownerDocument && node.ownerDocument.defaultView || window;\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 {ListKeyManager, ListKeyManagerOption} from './list-key-manager';\nimport {FocusOrigin} from '../focus-monitor/focus-monitor';\n\n/**\n * This is the interface for focusable items (used by the FocusKeyManager).\n * Each item must know how to focus itself, whether or not it is currently disabled\n * and be able to supply it's label.\n */\nexport interface FocusableOption extends ListKeyManagerOption {\n  /** Focuses the `FocusableOption`. */\n  focus(origin?: FocusOrigin): void;\n}\n\nexport class FocusKeyManager<T> extends ListKeyManager<FocusableOption & T> {\n  private _origin: FocusOrigin = 'program';\n\n  /**\n   * Sets the focus origin that will be passed in to the items for any subsequent `focus` calls.\n   * @param origin Focus origin to be used when focusing items.\n   */\n  setFocusOrigin(origin: FocusOrigin): this {\n    this._origin = origin;\n    return this;\n  }\n\n  /**\n   * Sets the active item to the item at the specified\n   * index and focuses the newly active item.\n   * @param index Index of the item to be set as active.\n   */\n  setActiveItem(index: number): void;\n\n  /**\n   * Sets the active item to the item that is specified and focuses it.\n   * @param item Item to be set as active.\n   */\n  setActiveItem(item: T): void;\n\n  setActiveItem(item: any): void {\n    super.setActiveItem(item);\n\n    if (this.activeItem) {\n      this.activeItem.focus(this._origin);\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 {ListKeyManager, ListKeyManagerOption} from './list-key-manager';\n\n/**\n * This is the interface for highlightable items (used by the ActiveDescendantKeyManager).\n * Each item must know how to style itself as active or inactive and whether or not it is\n * currently disabled.\n */\nexport interface Highlightable extends ListKeyManagerOption {\n  /** Applies the styles for an active item to this item. */\n  setActiveStyles(): void;\n\n  /** Applies the styles for an inactive item to this item. */\n  setInactiveStyles(): void;\n}\n\nexport class ActiveDescendantKeyManager<T> extends ListKeyManager<Highlightable & T> {\n\n  /**\n   * Sets the active item to the item at the specified index and adds the\n   * active styles to the newly active item. Also removes active styles\n   * from the previously active item.\n   * @param index Index of the item to be set as active.\n   */\n  setActiveItem(index: number): void;\n\n  /**\n   * Sets the active item to the item to the specified one and adds the\n   * active styles to the it. Also removes active styles from the\n   * previously active item.\n   * @param item Item to be set as active.\n   */\n  setActiveItem(item: T): void;\n\n  setActiveItem(index: any): void {\n    if (this.activeItem) {\n      this.activeItem.setInactiveStyles();\n    }\n    super.setActiveItem(index);\n    if (this.activeItem) {\n      this.activeItem.setActiveStyles();\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 {QueryList} from '@angular/core';\nimport {Subject, Subscription} from 'rxjs';\nimport {\n  UP_ARROW,\n  DOWN_ARROW,\n  LEFT_ARROW,\n  RIGHT_ARROW,\n  TAB,\n  A,\n  Z,\n  ZERO,\n  NINE,\n  hasModifierKey,\n} from '@angular/cdk/keycodes';\nimport {debounceTime, filter, map, tap} from 'rxjs/operators';\n\n/** This interface is for items that can be passed to a ListKeyManager. */\nexport interface ListKeyManagerOption {\n  /** Whether the option is disabled. */\n  disabled?: boolean;\n\n  /** Gets the label for this option. */\n  getLabel?(): string;\n}\n\n/** Modifier keys handled by the ListKeyManager. */\nexport type ListKeyManagerModifierKey = 'altKey' | 'ctrlKey' | 'metaKey' | 'shiftKey';\n\n/**\n * This class manages keyboard events for selectable lists. If you pass it a query list\n * of items, it will set the active item correctly when arrow events occur.\n */\nexport class ListKeyManager<T extends ListKeyManagerOption> {\n  private _activeItemIndex = -1;\n  private _activeItem: T | null = null;\n  private _wrap = false;\n  private _letterKeyStream = new Subject<string>();\n  private _typeaheadSubscription = Subscription.EMPTY;\n  private _vertical = true;\n  private _horizontal: 'ltr' | 'rtl' | null;\n  private _allowedModifierKeys: ListKeyManagerModifierKey[] = [];\n\n  /**\n   * Predicate function that can be used to check whether an item should be skipped\n   * by the key manager. By default, disabled items are skipped.\n   */\n  private _skipPredicateFn = (item: T) => item.disabled;\n\n  // Buffer for the letters that the user has pressed when the typeahead option is turned on.\n  private _pressedLetters: string[] = [];\n\n  constructor(private _items: QueryList<T> | T[]) {\n    // We allow for the items to be an array because, in some cases, the consumer may\n    // not have access to a QueryList of the items they want to manage (e.g. when the\n    // items aren't being collected via `ViewChildren` or `ContentChildren`).\n    if (_items instanceof QueryList) {\n      _items.changes.subscribe((newItems: QueryList<T>) => {\n        if (this._activeItem) {\n          const itemArray = newItems.toArray();\n          const newIndex = itemArray.indexOf(this._activeItem);\n\n          if (newIndex > -1 && newIndex !== this._activeItemIndex) {\n            this._activeItemIndex = newIndex;\n          }\n        }\n      });\n    }\n  }\n\n  /**\n   * Stream that emits any time the TAB key is pressed, so components can react\n   * when focus is shifted off of the list.\n   */\n  tabOut: Subject<void> = new Subject<void>();\n\n  /** Stream that emits whenever the active item of the list manager changes. */\n  change = new Subject<number>();\n\n  /**\n   * Sets the predicate function that determines which items should be skipped by the\n   * list key manager.\n   * @param predicate Function that determines whether the given item should be skipped.\n   */\n  skipPredicate(predicate: (item: T) => boolean): this {\n    this._skipPredicateFn = predicate;\n    return this;\n  }\n\n  /**\n   * Configures wrapping mode, which determines whether the active item will wrap to\n   * the other end of list when there are no more items in the given direction.\n   * @param shouldWrap Whether the list should wrap when reaching the end.\n   */\n  withWrap(shouldWrap = true): this {\n    this._wrap = shouldWrap;\n    return this;\n  }\n\n  /**\n   * Configures whether the key manager should be able to move the selection vertically.\n   * @param enabled Whether vertical selection should be enabled.\n   */\n  withVerticalOrientation(enabled: boolean = true): this {\n    this._vertical = enabled;\n    return this;\n  }\n\n  /**\n   * Configures the key manager to move the selection horizontally.\n   * Passing in `null` will disable horizontal movement.\n   * @param direction Direction in which the selection can be moved.\n   */\n  withHorizontalOrientation(direction: 'ltr' | 'rtl' | null): this {\n    this._horizontal = direction;\n    return this;\n  }\n\n  /**\n   * Modifier keys which are allowed to be held down and whose default actions will be prevented\n   * as the user is pressing the arrow keys. Defaults to not allowing any modifier keys.\n   */\n  withAllowedModifierKeys(keys: ListKeyManagerModifierKey[]): this {\n    this._allowedModifierKeys = keys;\n    return this;\n  }\n\n  /**\n   * Turns on typeahead mode which allows users to set the active item by typing.\n   * @param debounceInterval Time to wait after the last keystroke before setting the active item.\n   */\n  withTypeAhead(debounceInterval: number = 200): this {\n    if (this._items.length && this._items.some(item => typeof item.getLabel !== 'function')) {\n      throw Error('ListKeyManager items in typeahead mode must implement the `getLabel` method.');\n    }\n\n    this._typeaheadSubscription.unsubscribe();\n\n    // Debounce the presses of non-navigational keys, collect the ones that correspond to letters\n    // and convert those letters back into a string. Afterwards find the first item that starts\n    // with that string and select it.\n    this._typeaheadSubscription = this._letterKeyStream.pipe(\n      tap(keyCode => this._pressedLetters.push(keyCode)),\n      debounceTime(debounceInterval),\n      filter(() => this._pressedLetters.length > 0),\n      map(() => this._pressedLetters.join(''))\n    ).subscribe(inputString => {\n      const items = this._getItemsArray();\n\n      // Start at 1 because we want to start searching at the item immediately\n      // following the current active item.\n      for (let i = 1; i < items.length + 1; i++) {\n        const index = (this._activeItemIndex + i) % items.length;\n        const item = items[index];\n\n        if (!this._skipPredicateFn(item) &&\n            item.getLabel!().toUpperCase().trim().indexOf(inputString) === 0) {\n\n          this.setActiveItem(index);\n          break;\n        }\n      }\n\n      this._pressedLetters = [];\n    });\n\n    return this;\n  }\n\n  /**\n   * Sets the active item to the item at the index specified.\n   * @param index The index of the item to be set as active.\n   */\n  setActiveItem(index: number): void;\n\n  /**\n   * Sets the active item to the specified item.\n   * @param item The item to be set as active.\n   */\n  setActiveItem(item: T): void;\n\n  setActiveItem(item: any): void {\n    const previousIndex = this._activeItemIndex;\n\n    this.updateActiveItem(item);\n\n    if (this._activeItemIndex !== previousIndex) {\n      this.change.next(this._activeItemIndex);\n    }\n  }\n\n  /**\n   * Sets the active item depending on the key event passed in.\n   * @param event Keyboard event to be used for determining which element should be active.\n   */\n  onKeydown(event: KeyboardEvent): void {\n    const keyCode = event.keyCode;\n    const modifiers: ListKeyManagerModifierKey[] = ['altKey', 'ctrlKey', 'metaKey', 'shiftKey'];\n    const isModifierAllowed = modifiers.every(modifier => {\n      return !event[modifier] || this._allowedModifierKeys.indexOf(modifier) > -1;\n    });\n\n    switch (keyCode) {\n      case TAB:\n        this.tabOut.next();\n        return;\n\n      case DOWN_ARROW:\n        if (this._vertical && isModifierAllowed) {\n          this.setNextItemActive();\n          break;\n        } else {\n          return;\n        }\n\n      case UP_ARROW:\n        if (this._vertical && isModifierAllowed) {\n          this.setPreviousItemActive();\n          break;\n        } else {\n          return;\n        }\n\n      case RIGHT_ARROW:\n        if (this._horizontal && isModifierAllowed) {\n          this._horizontal === 'rtl' ? this.setPreviousItemActive() : this.setNextItemActive();\n          break;\n        } else {\n          return;\n        }\n\n      case LEFT_ARROW:\n        if (this._horizontal && isModifierAllowed) {\n          this._horizontal === 'rtl' ? this.setNextItemActive() : this.setPreviousItemActive();\n          break;\n        } else {\n          return;\n        }\n\n      default:\n      if (isModifierAllowed || hasModifierKey(event, 'shiftKey')) {\n          // Attempt to use the `event.key` which also maps it to the user's keyboard language,\n          // otherwise fall back to resolving alphanumeric characters via the keyCode.\n          if (event.key && event.key.length === 1) {\n            this._letterKeyStream.next(event.key.toLocaleUpperCase());\n          } else if ((keyCode >= A && keyCode <= Z) || (keyCode >= ZERO && keyCode <= NINE)) {\n            this._letterKeyStream.next(String.fromCharCode(keyCode));\n          }\n        }\n\n        // Note that we return here, in order to avoid preventing\n        // the default action of non-navigational keys.\n        return;\n    }\n\n    this._pressedLetters = [];\n    event.preventDefault();\n  }\n\n  /** Index of the currently active item. */\n  get activeItemIndex(): number | null {\n    return this._activeItemIndex;\n  }\n\n  /** The active item. */\n  get activeItem(): T | null {\n    return this._activeItem;\n  }\n\n  /** Sets the active item to the first enabled item in the list. */\n  setFirstItemActive(): void {\n    this._setActiveItemByIndex(0, 1);\n  }\n\n  /** Sets the active item to the last enabled item in the list. */\n  setLastItemActive(): void {\n    this._setActiveItemByIndex(this._items.length - 1, -1);\n  }\n\n  /** Sets the active item to the next enabled item in the list. */\n  setNextItemActive(): void {\n    this._activeItemIndex < 0 ? this.setFirstItemActive() : this._setActiveItemByDelta(1);\n  }\n\n  /** Sets the active item to a previous enabled item in the list. */\n  setPreviousItemActive(): void {\n    this._activeItemIndex < 0 && this._wrap ? this.setLastItemActive()\n                                            : this._setActiveItemByDelta(-1);\n  }\n\n  /**\n   * Allows setting the active without any other effects.\n   * @param index Index of the item to be set as active.\n   */\n  updateActiveItem(index: number): void;\n\n  /**\n   * Allows setting the active item without any other effects.\n   * @param item Item to be set as active.\n   */\n  updateActiveItem(item: T): void;\n\n  updateActiveItem(item: any): void {\n    const itemArray = this._getItemsArray();\n    const index = typeof item === 'number' ? item : itemArray.indexOf(item);\n    const activeItem = itemArray[index];\n\n    // Explicitly check for `null` and `undefined` because other falsy values are valid.\n    this._activeItem = activeItem == null ? null : activeItem;\n    this._activeItemIndex = index;\n  }\n\n  /**\n   * Allows setting of the activeItemIndex without any other effects.\n   * @param index The new activeItemIndex.\n   * @deprecated Use `updateActiveItem` instead.\n   * @breaking-change 8.0.0\n   */\n  updateActiveItemIndex(index: number): void {\n    this.updateActiveItem(index);\n  }\n\n  /**\n   * This method sets the active item, given a list of items and the delta between the\n   * currently active item and the new active item. It will calculate differently\n   * depending on whether wrap mode is turned on.\n   */\n  private _setActiveItemByDelta(delta: -1 | 1): void {\n    this._wrap ? this._setActiveInWrapMode(delta) : this._setActiveInDefaultMode(delta);\n  }\n\n  /**\n   * Sets the active item properly given \"wrap\" mode. In other words, it will continue to move\n   * down the list until it finds an item that is not disabled, and it will wrap if it\n   * encounters either end of the list.\n   */\n  private _setActiveInWrapMode(delta: -1 | 1): void {\n    const items = this._getItemsArray();\n\n    for (let i = 1; i <= items.length; i++) {\n      const index = (this._activeItemIndex + (delta * i) + items.length) % items.length;\n      const item = items[index];\n\n      if (!this._skipPredicateFn(item)) {\n        this.setActiveItem(index);\n        return;\n      }\n    }\n  }\n\n  /**\n   * Sets the active item properly given the default mode. In other words, it will\n   * continue to move down the list until it finds an item that is not disabled. If\n   * it encounters either end of the list, it will stop and not wrap.\n   */\n  private _setActiveInDefaultMode(delta: -1 | 1): void {\n    this._setActiveItemByIndex(this._activeItemIndex + delta, delta);\n  }\n\n  /**\n   * Sets the active item to the first enabled item starting at the index specified. If the\n   * item is disabled, it will move in the fallbackDelta direction until it either\n   * finds an enabled item or encounters the end of the list.\n   */\n  private _setActiveItemByIndex(index: number, fallbackDelta: -1 | 1): void {\n    const items = this._getItemsArray();\n\n    if (!items[index]) {\n      return;\n    }\n\n    while (this._skipPredicateFn(items[index])) {\n      index += fallbackDelta;\n\n      if (!items[index]) {\n        return;\n      }\n    }\n\n    this.setActiveItem(index);\n  }\n\n  /** Returns the items as an array. */\n  private _getItemsArray(): T[] {\n    return this._items instanceof QueryList ? this._items.toArray() : this._items;\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 {DOCUMENT} from '@angular/common';\nimport {\n  Inject,\n  Injectable,\n  InjectionToken,\n  OnDestroy,\n  Optional,\n  SkipSelf,\n} from '@angular/core';\nimport {addAriaReferencedId, getAriaReferenceIds, removeAriaReferencedId} from './aria-reference';\n\n\n/**\n * Interface used to register message elements and keep a count of how many registrations have\n * the same message and the reference to the message element used for the `aria-describedby`.\n */\nexport interface RegisteredMessage {\n  /** The element containing the message. */\n  messageElement: Element;\n\n  /** The number of elements that reference this message element via `aria-describedby`. */\n  referenceCount: number;\n}\n\n/** ID used for the body container where all messages are appended. */\nexport const MESSAGES_CONTAINER_ID = 'cdk-describedby-message-container';\n\n/** ID prefix used for each created message element. */\nexport const CDK_DESCRIBEDBY_ID_PREFIX = 'cdk-describedby-message';\n\n/** Attribute given to each host element that is described by a message element. */\nexport const CDK_DESCRIBEDBY_HOST_ATTRIBUTE = 'cdk-describedby-host';\n\n/** Global incremental identifier for each registered message element. */\nlet nextId = 0;\n\n/** Global map of all registered message elements that have been placed into the document. */\nconst messageRegistry = new Map<string|HTMLElement, RegisteredMessage>();\n\n/** Container for all registered messages. */\nlet messagesContainer: HTMLElement | null = null;\n\n/**\n * Utility that creates visually hidden elements with a message content. Useful for elements that\n * want to use aria-describedby to further describe themselves without adding additional visual\n * content.\n */\n@Injectable({providedIn: 'root'})\nexport class AriaDescriber implements OnDestroy {\n  private _document: Document;\n\n  constructor(@Inject(DOCUMENT) _document: any) {\n    this._document = _document;\n  }\n\n  /**\n   * Adds to the host element an aria-describedby reference to a hidden element that contains\n   * the message. If the same message has already been registered, then it will reuse the created\n   * message element.\n   */\n  describe(hostElement: Element, message: string|HTMLElement) {\n    if (!this._canBeDescribed(hostElement, message)) {\n      return;\n    }\n\n    if (typeof message !== 'string') {\n      // We need to ensure that the element has an ID.\n      this._setMessageId(message);\n      messageRegistry.set(message, {messageElement: message, referenceCount: 0});\n    } else if (!messageRegistry.has(message)) {\n      this._createMessageElement(message);\n    }\n\n    if (!this._isElementDescribedByMessage(hostElement, message)) {\n      this._addMessageReference(hostElement, message);\n    }\n  }\n\n  /** Removes the host element's aria-describedby reference to the message element. */\n  removeDescription(hostElement: Element, message: string|HTMLElement) {\n    if (!this._isElementNode(hostElement)) {\n      return;\n    }\n\n    if (this._isElementDescribedByMessage(hostElement, message)) {\n      this._removeMessageReference(hostElement, message);\n    }\n\n    // If the message is a string, it means that it's one that we created for the\n    // consumer so we can remove it safely, otherwise we should leave it in place.\n    if (typeof message === 'string') {\n      const registeredMessage = messageRegistry.get(message);\n      if (registeredMessage && registeredMessage.referenceCount === 0) {\n        this._deleteMessageElement(message);\n      }\n    }\n\n    if (messagesContainer && messagesContainer.childNodes.length === 0) {\n      this._deleteMessagesContainer();\n    }\n  }\n\n  /** Unregisters all created message elements and removes the message container. */\n  ngOnDestroy() {\n    const describedElements =\n        this._document.querySelectorAll(`[${CDK_DESCRIBEDBY_HOST_ATTRIBUTE}]`);\n\n    for (let i = 0; i < describedElements.length; i++) {\n      this._removeCdkDescribedByReferenceIds(describedElements[i]);\n      describedElements[i].removeAttribute(CDK_DESCRIBEDBY_HOST_ATTRIBUTE);\n    }\n\n    if (messagesContainer) {\n      this._deleteMessagesContainer();\n    }\n\n    messageRegistry.clear();\n  }\n\n  /**\n   * Creates a new element in the visually hidden message container element with the message\n   * as its content and adds it to the message registry.\n   */\n  private _createMessageElement(message: string) {\n    const messageElement = this._document.createElement('div');\n    this._setMessageId(messageElement);\n    messageElement.textContent = message;\n\n    this._createMessagesContainer();\n    messagesContainer!.appendChild(messageElement);\n\n    messageRegistry.set(message, {messageElement, referenceCount: 0});\n  }\n\n  /** Assigns a unique ID to an element, if it doesn't have one already. */\n  private _setMessageId(element: HTMLElement) {\n    if (!element.id) {\n      element.id = `${CDK_DESCRIBEDBY_ID_PREFIX}-${nextId++}`;\n    }\n  }\n\n  /** Deletes the message element from the global messages container. */\n  private _deleteMessageElement(message: string) {\n    const registeredMessage = messageRegistry.get(message);\n    const messageElement = registeredMessage && registeredMessage.messageElement;\n    if (messagesContainer && messageElement) {\n      messagesContainer.removeChild(messageElement);\n    }\n    messageRegistry.delete(message);\n  }\n\n  /** Creates the global container for all aria-describedby messages. */\n  private _createMessagesContainer() {\n    if (!messagesContainer) {\n      const preExistingContainer = this._document.getElementById(MESSAGES_CONTAINER_ID);\n\n      // When going from the server to the client, we may end up in a situation where there's\n      // already a container on the page, but we don't have a reference to it. Clear the\n      // old container so we don't get duplicates. Doing this, instead of emptying the previous\n      // container, should be slightly faster.\n      if (preExistingContainer) {\n        preExistingContainer.parentNode!.removeChild(preExistingContainer);\n      }\n\n      messagesContainer = this._document.createElement('div');\n      messagesContainer.id = MESSAGES_CONTAINER_ID;\n      messagesContainer.setAttribute('aria-hidden', 'true');\n      messagesContainer.style.display = 'none';\n      this._document.body.appendChild(messagesContainer);\n    }\n  }\n\n  /** Deletes the global messages container. */\n  private _deleteMessagesContainer() {\n    if (messagesContainer && messagesContainer.parentNode) {\n      messagesContainer.parentNode.removeChild(messagesContainer);\n      messagesContainer = null;\n    }\n  }\n\n  /** Removes all cdk-describedby messages that are hosted through the element. */\n  private _removeCdkDescribedByReferenceIds(element: Element) {\n    // Remove all aria-describedby reference IDs that are prefixed by CDK_DESCRIBEDBY_ID_PREFIX\n    const originalReferenceIds = getAriaReferenceIds(element, 'aria-describedby')\n        .filter(id => id.indexOf(CDK_DESCRIBEDBY_ID_PREFIX) != 0);\n    element.setAttribute('aria-describedby', originalReferenceIds.join(' '));\n  }\n\n  /**\n   * Adds a message reference to the element using aria-describedby and increments the registered\n   * message's reference count.\n   */\n  private _addMessageReference(element: Element, message: string|HTMLElement) {\n    const registeredMessage = messageRegistry.get(message)!;\n\n    // Add the aria-describedby reference and set the\n    // describedby_host attribute to mark the element.\n    addAriaReferencedId(element, 'aria-describedby', registeredMessage.messageElement.id);\n    element.setAttribute(CDK_DESCRIBEDBY_HOST_ATTRIBUTE, '');\n\n    registeredMessage.referenceCount++;\n  }\n\n  /**\n   * Removes a message reference from the element using aria-describedby\n   * and decrements the registered message's reference count.\n   */\n  private _removeMessageReference(element: Element, message: string|HTMLElement) {\n    const registeredMessage = messageRegistry.get(message)!;\n    registeredMessage.referenceCount--;\n\n    removeAriaReferencedId(element, 'aria-describedby', registeredMessage.messageElement.id);\n    element.removeAttribute(CDK_DESCRIBEDBY_HOST_ATTRIBUTE);\n  }\n\n  /** Returns true if the element has been described by the provided message ID. */\n  private _isElementDescribedByMessage(element: Element, message: string|HTMLElement): boolean {\n    const referenceIds = getAriaReferenceIds(element, 'aria-describedby');\n    const registeredMessage = messageRegistry.get(message);\n    const messageId = registeredMessage && registeredMessage.messageElement.id;\n\n    return !!messageId && referenceIds.indexOf(messageId) != -1;\n  }\n\n  /** Determines whether a message can be described on a particular element. */\n  private _canBeDescribed(element: Element, message: string|HTMLElement|void): boolean {\n    if (!this._isElementNode(element)) {\n      return false;\n    }\n\n    if (message && typeof message === 'object') {\n      // We'd have to make some assumptions about the description element's text, if the consumer\n      // passed in an element. Assume that if an element is passed in, the consumer has verified\n      // that it can be used as a description.\n      return true;\n    }\n\n    const trimmedMessage = message == null ? '' : `${message}`.trim();\n    const ariaLabel = element.getAttribute('aria-label');\n\n    // We shouldn't set descriptions if they're exactly the same as the `aria-label` of the\n    // element, because screen readers will end up reading out the same text twice in a row.\n    return trimmedMessage ? (!ariaLabel || ariaLabel.trim() !== trimmedMessage) : false;\n  }\n\n  /** Checks whether a node is an Element node. */\n  private _isElementNode(element: Node): element is Element {\n    return element.nodeType === this._document.ELEMENT_NODE;\n  }\n}\n\n\n/** @docs-private @deprecated @breaking-change 8.0.0 */\nexport function ARIA_DESCRIBER_PROVIDER_FACTORY(parentDispatcher: AriaDescriber, _document: any) {\n  return parentDispatcher || new AriaDescriber(_document);\n}\n\n/** @docs-private @deprecated @breaking-change 8.0.0 */\nexport const ARIA_DESCRIBER_PROVIDER = {\n  // If there is already an AriaDescriber available, use that. Otherwise, provide a new one.\n  provide: AriaDescriber,\n  deps: [\n    [new Optional(), new SkipSelf(), AriaDescriber],\n    DOCUMENT as InjectionToken<any>\n  ],\n  useFactory: ARIA_DESCRIBER_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\n/** IDs are deliminated by an empty space, as per the spec. */\nconst ID_DELIMINATOR = ' ';\n\n/**\n * Adds the given ID to the specified ARIA attribute on an element.\n * Used for attributes such as aria-labelledby, aria-owns, etc.\n */\nexport function addAriaReferencedId(el: Element, attr: string, id: string) {\n  const ids = getAriaReferenceIds(el, attr);\n  if (ids.some(existingId => existingId.trim() == id.trim())) { return; }\n  ids.push(id.trim());\n\n  el.setAttribute(attr, ids.join(ID_DELIMINATOR));\n}\n\n/**\n * Removes the given ID from the specified ARIA attribute on an element.\n * Used for attributes such as aria-labelledby, aria-owns, etc.\n */\nexport function removeAriaReferencedId(el: Element, attr: string, id: string) {\n  const ids = getAriaReferenceIds(el, attr);\n  const filteredIds = ids.filter(val => val != id.trim());\n\n  el.setAttribute(attr, filteredIds.join(ID_DELIMINATOR));\n}\n\n/**\n * Gets the list of IDs referenced by the given ARIA attribute on an element.\n * Used for attributes such as aria-labelledby, aria-owns, etc.\n */\nexport function getAriaReferenceIds(el: Element, attr: string): string[] {\n  // Get string array of all individual ids (whitespace deliminated) in the attribute value\n  return (el.getAttribute(attr) || '').match(/\\S+/g) || [];\n}\n"],"names":["observableOf","tslib_1.__extends"],"mappings":"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"}