http://git-wip-us.apache.org/repos/asf/nifi-fds/blob/eec354e6/node_modules/@angular/cdk/esm2015/overlay.js.map
----------------------------------------------------------------------
diff --git a/node_modules/@angular/cdk/esm2015/overlay.js.map 
b/node_modules/@angular/cdk/esm2015/overlay.js.map
new file mode 100644
index 0000000..c6d2aed
--- /dev/null
+++ b/node_modules/@angular/cdk/esm2015/overlay.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"overlay.js","sources":["../../../src/cdk/overlay/index.ts","../../../src/cdk/overlay/public-api.ts","../../../src/cdk/overlay/fullscreen-overlay-container.ts","../../../src/cdk/overlay/overlay-module.ts","../../../src/cdk/overlay/overlay-directives.ts","../../../src/cdk/overlay/overlay.ts","../../../src/cdk/overlay/overlay-container.ts","../../../src/cdk/overlay/keyboard/overlay-keyboard-dispatcher.ts","../../../src/cdk/overlay/position/overlay-position-builder.ts","../../../src/cdk/overlay/position/global-position-strategy.ts","../../../src/cdk/overlay/position/connected-position-strategy.ts","../../../src/cdk/overlay/overlay-ref.ts","../../../src/cdk/overlay/scroll/index.ts","../../../src/cdk/overlay/scroll/scroll-strategy-options.ts","../../../src/cdk/overlay/scroll/reposition-scroll-strategy.ts","../../../src/cdk/overlay/position/scroll-clip.ts","../../../src/cdk/overlay/scroll/block-scroll-strategy.ts","../../../src/cdk/overlay/scroll/close-scroll-strategy.
 
ts","../../../src/cdk/overlay/scroll/scroll-strategy.ts","../../../src/cdk/overlay/position/connected-position.ts","../../../src/cdk/overlay/overlay-config.ts","../../../src/cdk/overlay/scroll/noop-scroll-strategy.ts"],"sourcesContent":["/**\n
 * Generated bundle index. Do not edit.\n */\n\nexport * from 
'./public-api';\n\nexport {OVERLAY_KEYBOARD_DISPATCHER_PROVIDER as 
ɵg,OVERLAY_KEYBOARD_DISPATCHER_PROVIDER_FACTORY as ɵf} from 
'./keyboard/overlay-keyboard-dispatcher';\nexport {OVERLAY_CONTAINER_PROVIDER 
as ɵb,OVERLAY_CONTAINER_PROVIDER_FACTORY as ɵa} from 
'./overlay-container';\nexport {CDK_CONNECTED_OVERLAY_SCROLL_STRATEGY as 
ɵc,CDK_CONNECTED_OVERLAY_SCROLL_STRATEGY_PROVIDER as 
ɵe,CDK_CONNECTED_OVERLAY_SCROLL_STRATEGY_PROVIDER_FACTORY as ɵd} from 
'./overlay-directives';","/**\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\nexport * from './overlay-config';\nexport * from 
'./position/connected-position';\nexport * from './scroll/index';\nexport * 
from './overlay-module';\nexport {Overlay} from './overlay';\nexport 
{OverlayContainer} from './overlay-container';\nexport {CdkOverlayOrigin, 
CdkConnectedOverlay} from './overlay-directives';\nexport 
{FullscreenOverlayContainer} from './fullscreen-overlay-container';\nexport 
{OverlayRef, OverlaySizeConfig} from './overlay-ref';\nexport {ViewportRuler} 
from '@angular/cdk/scrolling';\nexport {ComponentType} from 
'@angular/cdk/portal';\nexport {OverlayKeyboardDispatcher} from 
'./keyboard/overlay-keyboard-dispatcher';\nexport {OverlayPositionBuilder} from 
'./position/overlay-position-builder';\n\n// Export pre-defined position 
strategies and interface to build custom ones.\nexport {PositionStrategy} from 
'./position/position-strategy';\nexport {GlobalPositionStrategy} from 
'./position/global-position-strategy';\nexport {ConnectedPositionStrategy} from 
'./po
 sition/connected-position-strategy';\nexport {VIEWPORT_RULER_PROVIDER} from 
'@angular/cdk/scrolling';\n\n/**\n * @deprecated Use CdkConnectedOverlay\n * 
@deletion-target 6.0.0\n */\nexport {CdkConnectedOverlay as 
ConnectedOverlayDirective} from './overlay-directives';\n\n/**\n * @deprecated 
Use CdkOverlayOrigin\n * @deletion-target 6.0.0\n */\nexport {CdkOverlayOrigin 
as OverlayOrigin} from './overlay-directives';\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 {Injectable} from 
'@angular/core';\nimport {OverlayContainer} from 
'./overlay-container';\n\n/**\n * Alternative to OverlayContainer that supports 
correct displaying of overlay elements in\n * Fullscreen mode\n * 
https://developer.mozilla.org/en-US/docs/Web/API/Element/requestFullScreen\n 
*\n * Should be provided in the root component.\n */\n@Injectable()
 \nexport class FullscreenOverlayContainer extends OverlayContainer {\n  
protected _createContainer(): void {\n    super._createContainer();\n    
this._adjustParentForFullscreenChange();\n    
this._addFullscreenChangeListener(() => 
this._adjustParentForFullscreenChange());\n  }\n\n  private 
_adjustParentForFullscreenChange(): void {\n    if (!this._containerElement) 
{\n      return;\n    }\n    let fullscreenElement = 
this.getFullscreenElement();\n    let parent = fullscreenElement || 
document.body;\n    parent.appendChild(this._containerElement);\n  }\n\n  
private _addFullscreenChangeListener(fn: () => void) {\n    if 
(document.fullscreenEnabled) {\n      
document.addEventListener('fullscreenchange', fn);\n    } else if 
(document.webkitFullscreenEnabled) {\n      
document.addEventListener('webkitfullscreenchange', fn);\n    } else if 
((document as any).mozFullScreenEnabled) {\n      
document.addEventListener('mozfullscreenchange', fn);\n    } else if ((document 
as any).msFullscreenE
 nabled) {\n      document.addEventListener('MSFullscreenChange', fn);\n    }\n 
 }\n\n  /**\n   * When the page is put into fullscreen mode, a specific element 
is specified.\n   * Only that element and its children are visible when in 
fullscreen mode.\n   */\n  getFullscreenElement(): Element {\n    return 
document.fullscreenElement ||\n        document.webkitFullscreenElement ||\n    
    (document as any).mozFullScreenElement ||\n        (document as 
any).msFullscreenElement ||\n        null;\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 {BidiModule} from 
'@angular/cdk/bidi';\nimport {PortalModule} from '@angular/cdk/portal';\nimport 
{ScrollDispatchModule, VIEWPORT_RULER_PROVIDER} from 
'@angular/cdk/scrolling';\nimport {NgModule, Provider} from 
'@angular/core';\nimport {Overlay} from './overlay';\nimpo
 rt {OVERLAY_CONTAINER_PROVIDER} from './overlay-container';\nimport {\n  
CdkConnectedOverlay,\n  CDK_CONNECTED_OVERLAY_SCROLL_STRATEGY_PROVIDER,\n  
CdkOverlayOrigin,\n} from './overlay-directives';\nimport 
{OverlayPositionBuilder} from './position/overlay-position-builder';\nimport 
{OVERLAY_KEYBOARD_DISPATCHER_PROVIDER} from 
'./keyboard/overlay-keyboard-dispatcher';\nimport {ScrollStrategyOptions} from 
'./scroll/scroll-strategy-options';\n\nexport const OVERLAY_PROVIDERS: 
Provider[] = [\n  Overlay,\n  OverlayPositionBuilder,\n  
OVERLAY_KEYBOARD_DISPATCHER_PROVIDER,\n  VIEWPORT_RULER_PROVIDER,\n  
OVERLAY_CONTAINER_PROVIDER,\n  
CDK_CONNECTED_OVERLAY_SCROLL_STRATEGY_PROVIDER,\n];\n\n@NgModule({\n  imports: 
[BidiModule, PortalModule, ScrollDispatchModule],\n  exports: 
[CdkConnectedOverlay, CdkOverlayOrigin, ScrollDispatchModule],\n  declarations: 
[CdkConnectedOverlay, CdkOverlayOrigin],\n  providers: [OVERLAY_PROVIDERS, 
ScrollStrategyOptions],\n})\nexport class OverlayModule {}\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 {Direction, 
Directionality} from '@angular/cdk/bidi';\nimport {coerceBooleanProperty} from 
'@angular/cdk/coercion';\nimport {ESCAPE} from '@angular/cdk/keycodes';\nimport 
{TemplatePortal} from '@angular/cdk/portal';\nimport {\n  Directive,\n  
ElementRef,\n  EventEmitter,\n  Inject,\n  InjectionToken,\n  Input,\n  
OnChanges,\n  OnDestroy,\n  Optional,\n  Output,\n  SimpleChanges,\n  
TemplateRef,\n  ViewContainerRef,\n} from '@angular/core';\nimport 
{Subscription} from 'rxjs/Subscription';\nimport {Overlay} from 
'./overlay';\nimport {OverlayConfig} from './overlay-config';\nimport 
{OverlayRef} from './overlay-ref';\nimport {\n  
ConnectedOverlayPositionChange,\n  ConnectionPositionPair,\n} from 
'./position/connected-position';\nimport {ConnectedPositionStrategy} from 
'./posit
 ion/connected-position-strategy';\nimport {RepositionScrollStrategy, 
ScrollStrategy} from './scroll/index';\n\n\n/** Default set of positions for 
the overlay. Follows the behavior of a dropdown. */\nconst defaultPositionList 
= [\n  new ConnectionPositionPair(\n      {originX: 'start', originY: 
'bottom'},\n      {overlayX: 'start', overlayY: 'top'}),\n  new 
ConnectionPositionPair(\n      {originX: 'start', originY: 'top'},\n      
{overlayX: 'start', overlayY: 'bottom'}),\n  new ConnectionPositionPair(\n    
{originX: 'end', originY: 'top'},\n    {overlayX: 'end', overlayY: 
'bottom'}),\n  new ConnectionPositionPair(\n    {originX: 'end', originY: 
'bottom'},\n    {overlayX: 'end', overlayY: 'top'}),\n];\n\n/** Injection token 
that determines the scroll handling while the connected overlay is open. 
*/\nexport const CDK_CONNECTED_OVERLAY_SCROLL_STRATEGY =\n    new 
InjectionToken<() => 
ScrollStrategy>('cdk-connected-overlay-scroll-strategy');\n\n/** @docs-private 
*/\nexport function CDK_CO
 NNECTED_OVERLAY_SCROLL_STRATEGY_PROVIDER_FACTORY(overlay: Overlay):\n    () => 
RepositionScrollStrategy {\n  return () => 
overlay.scrollStrategies.reposition();\n}\n\n/** @docs-private */\nexport const 
CDK_CONNECTED_OVERLAY_SCROLL_STRATEGY_PROVIDER = {\n  provide: 
CDK_CONNECTED_OVERLAY_SCROLL_STRATEGY,\n  deps: [Overlay],\n  useFactory: 
CDK_CONNECTED_OVERLAY_SCROLL_STRATEGY_PROVIDER_FACTORY,\n};\n\n\n/**\n * 
Directive applied to an element to make it usable as an origin for an Overlay 
using a\n * ConnectedPositionStrategy.\n */\n@Directive({\n  selector: 
'[cdk-overlay-origin], [overlay-origin], [cdkOverlayOrigin]',\n  exportAs: 
'cdkOverlayOrigin',\n})\nexport class CdkOverlayOrigin {\n  constructor(\n      
/** Reference to the element on which the directive is applied. */\n      
public elementRef: ElementRef) { }\n}\n\n\n/**\n * Directive to facilitate 
declarative creation of an Overlay using a ConnectedPositionStrategy.\n 
*/\n@Directive({\n  selector: '[cdk-connected-overlay], [con
 nected-overlay], [cdkConnectedOverlay]',\n  exportAs: 
'cdkConnectedOverlay'\n})\nexport class CdkConnectedOverlay implements 
OnDestroy, OnChanges {\n  private _overlayRef: OverlayRef;\n  private 
_templatePortal: TemplatePortal;\n  private _hasBackdrop = false;\n  private 
_backdropSubscription = Subscription.EMPTY;\n  private _offsetX: number = 0;\n  
private _offsetY: number = 0;\n  private _position: 
ConnectedPositionStrategy;\n\n  /** Origin for the connected overlay. */\n  
@Input('cdkConnectedOverlayOrigin') origin: CdkOverlayOrigin;\n\n  /** 
Registered connected position pairs. */\n  
@Input('cdkConnectedOverlayPositions') positions: ConnectionPositionPair[];\n\n 
 /** The offset in pixels for the overlay connection point on the x-axis */\n  
@Input('cdkConnectedOverlayOffsetX')\n  get offsetX(): number { return 
this._offsetX; }\n  set offsetX(offsetX: number) {\n    this._offsetX = 
offsetX;\n    if (this._position) {\n      
this._position.withOffsetX(offsetX);\n    }\n  }\n\n  /** 
 The offset in pixels for the overlay connection point on the y-axis */\n  
@Input('cdkConnectedOverlayOffsetY')\n  get offsetY() { return this._offsetY; 
}\n  set offsetY(offsetY: number) {\n    this._offsetY = offsetY;\n    if 
(this._position) {\n      this._position.withOffsetY(offsetY);\n    }\n  }\n\n  
/** The width of the overlay panel. */\n  @Input('cdkConnectedOverlayWidth') 
width: number | string;\n\n  /** The height of the overlay panel. */\n  
@Input('cdkConnectedOverlayHeight') height: number | string;\n\n  /** The min 
width of the overlay panel. */\n  @Input('cdkConnectedOverlayMinWidth') 
minWidth: number | string;\n\n  /** The min height of the overlay panel. */\n  
@Input('cdkConnectedOverlayMinHeight') minHeight: number | string;\n\n  /** The 
custom class to be set on the backdrop element. */\n  
@Input('cdkConnectedOverlayBackdropClass') backdropClass: string;\n\n  /** 
Strategy to be used when handling scroll events while the overlay is open. */\n 
 @Input('cdkConnectedOve
 rlayScrollStrategy') scrollStrategy: ScrollStrategy =\n      
this._scrollStrategy();\n\n  /** Whether the overlay is open. */\n  
@Input('cdkConnectedOverlayOpen') open: boolean = false;\n\n  /** Whether or 
not the overlay should attach a backdrop. */\n  
@Input('cdkConnectedOverlayHasBackdrop')\n  get hasBackdrop() { return 
this._hasBackdrop; }\n  set hasBackdrop(value: any) { this._hasBackdrop = 
coerceBooleanProperty(value); }\n\n  /**\n   * @deprecated\n   * 
@deletion-target 6.0.0\n   */\n  @Input('origin')\n  get _deprecatedOrigin(): 
CdkOverlayOrigin { return this.origin; }\n  set _deprecatedOrigin(_origin: 
CdkOverlayOrigin) { this.origin = _origin; }\n\n  /**\n   * @deprecated\n   * 
@deletion-target 6.0.0\n   */\n  @Input('positions')\n  get 
_deprecatedPositions(): ConnectionPositionPair[] { return this.positions; }\n  
set _deprecatedPositions(_positions: ConnectionPositionPair[]) { this.positions 
= _positions; }\n\n  /**\n   * @deprecated\n   * @deletion-target 6.0.0\n   
*/\n  @
 Input('offsetX')\n  get _deprecatedOffsetX(): number { return this.offsetX; 
}\n  set _deprecatedOffsetX(_offsetX: number) { this.offsetX = _offsetX; }\n\n  
/**\n   * @deprecated\n   * @deletion-target 6.0.0\n   */\n  
@Input('offsetY')\n  get _deprecatedOffsetY(): number { return this.offsetY; 
}\n  set _deprecatedOffsetY(_offsetY: number) { this.offsetY = _offsetY; }\n\n  
/**\n   * @deprecated\n   * @deletion-target 6.0.0\n   */\n  @Input('width')\n  
get _deprecatedWidth(): number | string { return this.width; }\n  set 
_deprecatedWidth(_width: number | string) { this.width = _width; }\n\n  /**\n   
* @deprecated\n   * @deletion-target 6.0.0\n   */\n  @Input('height')\n  get 
_deprecatedHeight(): number | string { return this.height; }\n  set 
_deprecatedHeight(_height: number | string) { this.height = _height; }\n\n  
/**\n   * @deprecated\n   * @deletion-target 6.0.0\n   */\n  
@Input('minWidth')\n  get _deprecatedMinWidth(): number | string { return 
this.minWidth; }\n  set _deprecatedMi
 nWidth(_minWidth: number | string) { this.minWidth = _minWidth; }\n\n  /**\n   
* @deprecated\n   * @deletion-target 6.0.0\n   */\n  @Input('minHeight')\n  get 
_deprecatedMinHeight(): number | string { return this.minHeight; }\n  set 
_deprecatedMinHeight(_minHeight: number | string) { this.minHeight = 
_minHeight; }\n\n  /**\n   * @deprecated\n   * @deletion-target 6.0.0\n   */\n  
@Input('backdropClass')\n  get _deprecatedBackdropClass(): string { return 
this.backdropClass; }\n  set _deprecatedBackdropClass(_backdropClass: string) { 
this.backdropClass = _backdropClass; }\n\n  /**\n   * @deprecated\n   * 
@deletion-target 6.0.0\n   */\n  @Input('scrollStrategy')\n  get 
_deprecatedScrollStrategy(): ScrollStrategy { return this.scrollStrategy; }\n  
set _deprecatedScrollStrategy(_scrollStrategy: ScrollStrategy) {\n    
this.scrollStrategy = _scrollStrategy;\n  }\n\n  /**\n   * @deprecated\n   * 
@deletion-target 6.0.0\n   */\n  @Input('open')\n  get _deprecatedOpen(): 
boolean { return this.o
 pen; }\n  set _deprecatedOpen(_open: boolean) { this.open = _open; }\n\n  
/**\n   * @deprecated\n   * @deletion-target 6.0.0\n   */\n  
@Input('hasBackdrop')\n  get _deprecatedHasBackdrop() { return 
this.hasBackdrop; }\n  set _deprecatedHasBackdrop(_hasBackdrop: any) { 
this.hasBackdrop = _hasBackdrop; }\n\n  /** Event emitted when the backdrop is 
clicked. */\n  @Output() backdropClick = new EventEmitter<void>();\n\n  /** 
Event emitted when the position has changed. */\n  @Output() positionChange = 
new EventEmitter<ConnectedOverlayPositionChange>();\n\n  /** Event emitted when 
the overlay has been attached. */\n  @Output() attach = new 
EventEmitter<void>();\n\n  /** Event emitted when the overlay has been 
detached. */\n  @Output() detach = new EventEmitter<void>();\n\n  // 
TODO(jelbourn): inputs for size, scroll behavior, animation, etc.\n\n  
constructor(\n      private _overlay: Overlay,\n      templateRef: 
TemplateRef<any>,\n      viewContainerRef: ViewContainerRef,\n      @Inject(C
 DK_CONNECTED_OVERLAY_SCROLL_STRATEGY) private _scrollStrategy,\n      
@Optional() private _dir: Directionality) {\n    this._templatePortal = new 
TemplatePortal(templateRef, viewContainerRef);\n  }\n\n  /** The associated 
overlay reference. */\n  get overlayRef(): OverlayRef {\n    return 
this._overlayRef;\n  }\n\n  /** The element's layout direction. */\n  get 
dir(): Direction {\n    return this._dir ? this._dir.value : 'ltr';\n  }\n\n  
ngOnDestroy() {\n    this._destroyOverlay();\n  }\n\n  ngOnChanges(changes: 
SimpleChanges) {\n    if (this._position) {\n      if (changes['positions'] || 
changes['_deprecatedPositions']) {\n        
this._position.withPositions(this.positions);\n      }\n\n      if 
(changes['origin'] || changes['_deprecatedOrigin']) {\n        
this._position.setOrigin(this.origin.elementRef);\n\n        if (this.open) {\n 
         this._position.apply();\n        }\n      }\n    }\n\n    if 
(changes['open'] || changes['_deprecatedOpen']) {\n      this.open ? this._a
 ttachOverlay() : this._detachOverlay();\n    }\n  }\n\n  /** Creates an 
overlay */\n  private _createOverlay() {\n    if (!this.positions || 
!this.positions.length) {\n      this.positions = defaultPositionList;\n    
}\n\n    this._overlayRef = this._overlay.create(this._buildConfig());\n  }\n\n 
 /** Builds the overlay config based on the directive's inputs */\n  private 
_buildConfig(): OverlayConfig {\n    const positionStrategy = this._position = 
this._createPositionStrategy();\n    const overlayConfig = new 
OverlayConfig({\n      positionStrategy,\n      scrollStrategy: 
this.scrollStrategy,\n      hasBackdrop: this.hasBackdrop\n    });\n\n    if 
(this.width || this.width === 0) {\n      overlayConfig.width = this.width;\n   
 }\n\n    if (this.height || this.height === 0) {\n      overlayConfig.height = 
this.height;\n    }\n\n    if (this.minWidth || this.minWidth === 0) {\n      
overlayConfig.minWidth = this.minWidth;\n    }\n\n    if (this.minHeight || 
this.minHeight === 0) {\n 
      overlayConfig.minHeight = this.minHeight;\n    }\n\n    if 
(this.backdropClass) {\n      overlayConfig.backdropClass = 
this.backdropClass;\n    }\n\n    return overlayConfig;\n  }\n\n  /** Returns 
the position strategy of the overlay to be set on the overlay config */\n  
private _createPositionStrategy(): ConnectedPositionStrategy {\n    const 
primaryPosition = this.positions[0];\n    const originPoint = {originX: 
primaryPosition.originX, originY: primaryPosition.originY};\n    const 
overlayPoint = {overlayX: primaryPosition.overlayX, overlayY: 
primaryPosition.overlayY};\n    const strategy = this._overlay.position()\n     
 .connectedTo(this.origin.elementRef, originPoint, overlayPoint)\n      
.withOffsetX(this.offsetX)\n      .withOffsetY(this.offsetY);\n\n    for (let i 
= 1; i < this.positions.length; i++) {\n      strategy.withFallbackPosition(\n  
        {originX: this.positions[i].originX, originY: 
this.positions[i].originY},\n          {overlayX: this.positions[i].overlay
 X, overlayY: this.positions[i].overlayY}\n      );\n    }\n\n    
strategy.onPositionChange.subscribe(pos => this.positionChange.emit(pos));\n\n  
  return strategy;\n  }\n\n  /** Attaches the overlay and subscribes to 
backdrop clicks if backdrop exists */\n  private _attachOverlay() {\n    if 
(!this._overlayRef) {\n      this._createOverlay();\n\n      
this._overlayRef!.keydownEvents().subscribe((event: KeyboardEvent) => {\n       
 if (event.keyCode === ESCAPE) {\n          this._detachOverlay();\n        }\n 
     });\n    }\n\n    this._position.withDirection(this.dir);\n    
this._overlayRef.setDirection(this.dir);\n\n    if 
(!this._overlayRef.hasAttached()) {\n      
this._overlayRef.attach(this._templatePortal);\n      this.attach.emit();\n    
}\n\n    if (this.hasBackdrop) {\n      this._backdropSubscription = 
this._overlayRef.backdropClick().subscribe(() => {\n        
this.backdropClick.emit();\n      });\n    }\n  }\n\n  /** Detaches the overlay 
and unsubscribes to backdrop clic
 ks if backdrop exists */\n  private _detachOverlay() {\n    if 
(this._overlayRef) {\n      this._overlayRef.detach();\n      
this.detach.emit();\n    }\n\n    this._backdropSubscription.unsubscribe();\n  
}\n\n  /** Destroys the overlay created by this directive. */\n  private 
_destroyOverlay() {\n    if (this._overlayRef) {\n      
this._overlayRef.dispose();\n    }\n\n    
this._backdropSubscription.unsubscribe();\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 {\n  ComponentFactoryResolver,\n  
Injectable,\n  ApplicationRef,\n  Injector,\n  NgZone,\n  Inject,\n} from 
'@angular/core';\nimport {DomPortalOutlet} from '@angular/cdk/portal';\nimport 
{OverlayConfig} from './overlay-config';\nimport {OverlayRef} from 
'./overlay-ref';\nimport {OverlayPositionBuilder} from 
'./position/overlay-position-builder';\ni
 mport {OverlayKeyboardDispatcher} from 
'./keyboard/overlay-keyboard-dispatcher';\nimport {OverlayContainer} from 
'./overlay-container';\nimport {ScrollStrategyOptions} from 
'./scroll/index';\nimport {DOCUMENT} from '@angular/common';\n\n\n/** Next 
overlay unique ID. */\nlet nextUniqueId = 0;\n\n/**\n * Service to create 
Overlays. Overlays are dynamically added pieces of floating UI, meant to be\n * 
used as a low-level building building block for other components. Dialogs, 
tooltips, menus,\n * selects, etc. can all be built using overlays. The service 
should primarily be used by authors\n * of re-usable components rather than 
developers building end-user applications.\n *\n * An overlay *is* a 
PortalOutlet, so any kind of Portal can be loaded into one.\n 
*/\n@Injectable()\nexport class Overlay {\n  constructor(\n              /** 
Scrolling strategies that can be used when creating an overlay. */\n            
  public scrollStrategies: ScrollStrategyOptions,\n              private _ov
 erlayContainer: OverlayContainer,\n              private 
_componentFactoryResolver: ComponentFactoryResolver,\n              private 
_positionBuilder: OverlayPositionBuilder,\n              private 
_keyboardDispatcher: OverlayKeyboardDispatcher,\n              private _appRef: 
ApplicationRef,\n              private _injector: Injector,\n              
private _ngZone: NgZone,\n              @Inject(DOCUMENT) private _document: 
any) { }\n\n  /**\n   * Creates an overlay.\n   * @param config Configuration 
applied to the overlay.\n   * @returns Reference to the created overlay.\n   
*/\n  create(config?: OverlayConfig): OverlayRef {\n    const pane = 
this._createPaneElement();\n    const portalOutlet = 
this._createPortalOutlet(pane);\n\n    return new OverlayRef(\n      
portalOutlet,\n      pane,\n      new OverlayConfig(config),\n      
this._ngZone,\n      this._keyboardDispatcher,\n      this._document\n    );\n  
}\n\n  /**\n   * Gets a position builder that can be used, via fluent API
 ,\n   * to construct and configure a position strategy.\n   * @returns An 
overlay position builder.\n   */\n  position(): OverlayPositionBuilder {\n    
return this._positionBuilder;\n  }\n\n  /**\n   * Creates the DOM element for 
an overlay and appends it to the overlay container.\n   * @returns 
Newly-created pane element\n   */\n  private _createPaneElement(): HTMLElement 
{\n    const pane = this._document.createElement('div');\n\n    pane.id = 
`cdk-overlay-${nextUniqueId++}`;\n    pane.classList.add('cdk-overlay-pane');\n 
   this._overlayContainer.getContainerElement().appendChild(pane);\n\n    
return pane;\n  }\n\n  /**\n   * Create a DomPortalOutlet into which the 
overlay content can be loaded.\n   * @param pane The DOM element to turn into a 
portal outlet.\n   * @returns A portal outlet for the given DOM element.\n   
*/\n  private _createPortalOutlet(pane: HTMLElement): DomPortalOutlet {\n    
return new DomPortalOutlet(pane, this._componentFactoryResolver, this._appRef, 
this._i
 njector);\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 {Injectable, InjectionToken, Inject, Optional, SkipSelf, 
OnDestroy} from '@angular/core';\nimport {DOCUMENT} from 
'@angular/common';\n\n\n/** Container inside which all overlays will render. 
*/\n@Injectable()\nexport class OverlayContainer implements OnDestroy {\n  
protected _containerElement: HTMLElement;\n\n  constructor(@Inject(DOCUMENT) 
private _document: any) {}\n\n  ngOnDestroy() {\n    if (this._containerElement 
&& this._containerElement.parentNode) {\n      
this._containerElement.parentNode.removeChild(this._containerElement);\n    }\n 
 }\n\n  /**\n   * This method returns the overlay container element. It will 
lazily\n   * create the element the first time  it is called to facilitate 
using\n   * the container in non-browser environments
 .\n   * @returns the container element\n   */\n  getContainerElement(): 
HTMLElement {\n    if (!this._containerElement) { this._createContainer(); }\n  
  return this._containerElement;\n  }\n\n  /**\n   * Create the overlay 
container element, which is simply a div\n   * with the 'cdk-overlay-container' 
class on the document body.\n   */\n  protected _createContainer(): void {\n    
const container = this._document.createElement('div');\n\n    
container.classList.add('cdk-overlay-container');\n    
this._document.body.appendChild(container);\n    this._containerElement = 
container;\n  }\n}\n\n/** @docs-private */\nexport function 
OVERLAY_CONTAINER_PROVIDER_FACTORY(parentContainer: OverlayContainer,\n  
_document: any) {\n  return parentContainer || new 
OverlayContainer(_document);\n}\n\n/** @docs-private */\nexport const 
OVERLAY_CONTAINER_PROVIDER = {\n  // If there is already an OverlayContainer 
available, use that. Otherwise, provide a new one.\n  provide: 
OverlayContainer,\n  deps: [
 \n    [new Optional(), new SkipSelf(), OverlayContainer],\n    DOCUMENT as 
InjectionToken<any> // We need to use the InjectionToken somewhere to keep TS 
happy\n  ],\n  useFactory: OVERLAY_CONTAINER_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 {Injectable, Inject, 
InjectionToken, Optional, SkipSelf, OnDestroy} from '@angular/core';\nimport 
{OverlayRef} from '../overlay-ref';\nimport {Subscription} from 
'rxjs/Subscription';\nimport {filter} from 'rxjs/operators/filter';\nimport 
{fromEvent} from 'rxjs/observable/fromEvent';\nimport {DOCUMENT} from 
'@angular/common';\n\n/**\n * Service for dispatching keyboard events that land 
on the body to appropriate overlay ref,\n * if any. It maintains a list of 
attached overlays to determine best suited overlay based\n * on event target 
and order of ove
 rlay opens.\n */\n@Injectable()\nexport class OverlayKeyboardDispatcher 
implements OnDestroy {\n\n  /** Currently attached overlays in the order they 
were attached. */\n  _attachedOverlays: OverlayRef[] = [];\n\n  private 
_keydownEventSubscription: Subscription | null;\n\n  
constructor(@Inject(DOCUMENT) private _document: any) {}\n\n  ngOnDestroy() {\n 
   this._unsubscribeFromKeydownEvents();\n  }\n\n  /** Add a new overlay to the 
list of attached overlay refs. */\n  add(overlayRef: OverlayRef): void {\n    
// Lazily start dispatcher once first overlay is added\n    if 
(!this._keydownEventSubscription) {\n      this._subscribeToKeydownEvents();\n  
  }\n\n    this._attachedOverlays.push(overlayRef);\n  }\n\n  /** Remove an 
overlay from the list of attached overlay refs. */\n  remove(overlayRef: 
OverlayRef): void {\n    const index = 
this._attachedOverlays.indexOf(overlayRef);\n\n    if (index > -1) {\n      
this._attachedOverlays.splice(index, 1);\n    }\n\n    // Remove the global l
 istener once there are no more overlays.\n    if 
(this._attachedOverlays.length === 0) {\n      
this._unsubscribeFromKeydownEvents();\n    }\n  }\n\n  /**\n   * Subscribe to 
keydown events that land on the body and dispatch those\n   * events to the 
appropriate overlay.\n   */\n  private _subscribeToKeydownEvents(): void {\n    
const bodyKeydownEvents = fromEvent<KeyboardEvent>(this._document.body, 
'keydown', true);\n\n    this._keydownEventSubscription = 
bodyKeydownEvents.pipe(\n      filter(() => !!this._attachedOverlays.length)\n  
  ).subscribe(event => {\n      // Dispatch keydown event to the correct 
overlay.\n      
this._selectOverlayFromEvent(event)._keydownEvents.next(event);\n    });\n  
}\n\n  /** Removes the global keydown subscription. */\n  private 
_unsubscribeFromKeydownEvents(): void {\n    if 
(this._keydownEventSubscription) {\n      
this._keydownEventSubscription.unsubscribe();\n      
this._keydownEventSubscription = null;\n    }\n  }\n\n  /** Select the 
appropriate 
 overlay from a keydown event. */\n  private _selectOverlayFromEvent(event: 
KeyboardEvent): OverlayRef {\n    // Check if any overlays contain the event\n  
  const targetedOverlay = this._attachedOverlays.find(overlay => {\n      
return overlay.overlayElement === event.target ||\n          
overlay.overlayElement.contains(event.target as HTMLElement);\n    });\n\n    
// Use the overlay if it exists, otherwise choose the most recently attached 
one\n    return targetedOverlay || 
this._attachedOverlays[this._attachedOverlays.length - 1];\n  }\n\n}\n\n/** 
@docs-private */\nexport function 
OVERLAY_KEYBOARD_DISPATCHER_PROVIDER_FACTORY(\n    dispatcher: 
OverlayKeyboardDispatcher, _document: any) {\n  return dispatcher || new 
OverlayKeyboardDispatcher(_document);\n}\n\n/** @docs-private */\nexport const 
OVERLAY_KEYBOARD_DISPATCHER_PROVIDER = {\n  // If there is already an 
OverlayKeyboardDispatcher available, use that.\n  // Otherwise, provide a new 
one.\n  provide: OverlayKeyboardDispatcher,\
 n  deps: [\n    [new Optional(), new SkipSelf(), 
OverlayKeyboardDispatcher],\n\n    // Coerce to `InjectionToken` so that the 
`deps` match the \"shape\"\n    // of the type expected by Angular\n    
DOCUMENT as InjectionToken<any>\n  ],\n  useFactory: 
OVERLAY_KEYBOARD_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 {ElementRef, Injectable, Inject} from 
'@angular/core';\nimport {ViewportRuler} from '@angular/cdk/scrolling';\nimport 
{ConnectedPositionStrategy} from './connected-position-strategy';\nimport 
{GlobalPositionStrategy} from './global-position-strategy';\nimport 
{OverlayConnectionPosition, OriginConnectionPosition} from 
'./connected-position';\nimport {DOCUMENT} from '@angular/common';\n\n\n/** 
Builder for overlay position strategy. */\n@Injectable()\nexport class OverlayPo
 sitionBuilder {\n  constructor(private _viewportRuler: ViewportRuler,\n        
      @Inject(DOCUMENT) private _document: any) { }\n\n  /**\n   * Creates a 
global position strategy.\n   */\n  global(): GlobalPositionStrategy {\n    
return new GlobalPositionStrategy(this._document);\n  }\n\n  /**\n   * Creates 
a relative position strategy.\n   * @param elementRef\n   * @param originPos\n  
 * @param overlayPos\n   */\n  connectedTo(\n      elementRef: ElementRef,\n    
  originPos: OriginConnectionPosition,\n      overlayPos: 
OverlayConnectionPosition): ConnectedPositionStrategy {\n\n    return new 
ConnectedPositionStrategy(originPos, overlayPos, elementRef,\n        
this._viewportRuler, this._document);\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 {PositionStrategy} from 
'./position-strategy';\nimport {
 OverlayRef} from '../overlay-ref';\n\n\n/**\n * A strategy for positioning 
overlays. Using this strategy, an overlay is given an\n * explicit position 
relative to the browser's viewport. We use flexbox, instead of\n * transforms, 
in order to avoid issues with subpixel rendering which can cause the\n * 
element to become blurry.\n */\nexport class GlobalPositionStrategy implements 
PositionStrategy {\n  /** The overlay to which this strategy is attached. */\n  
private _overlayRef: OverlayRef;\n\n  private _cssPosition: string = 
'static';\n  private _topOffset: string = '';\n  private _bottomOffset: string 
= '';\n  private _leftOffset: string = '';\n  private _rightOffset: string = 
'';\n  private _alignItems: string = '';\n  private _justifyContent: string = 
'';\n  private _width: string = '';\n  private _height: string = '';\n\n  /** A 
lazily-created wrapper for the overlay element that is used as a flex 
container. */\n  private _wrapper: HTMLElement | null = null;\n\n  
constructor(pri
 vate _document: any) {}\n\n  attach(overlayRef: OverlayRef): void {\n    
this._overlayRef = overlayRef;\n  }\n\n  /**\n   * Sets the top position of the 
overlay. Clears any previously set vertical position.\n   * @param value New 
top offset.\n   */\n  top(value: string = ''): this {\n    this._bottomOffset = 
'';\n    this._topOffset = value;\n    this._alignItems = 'flex-start';\n    
return this;\n  }\n\n  /**\n   * Sets the left position of the overlay. Clears 
any previously set horizontal position.\n   * @param value New left offset.\n   
*/\n  left(value: string = ''): this {\n    this._rightOffset = '';\n    
this._leftOffset = value;\n    this._justifyContent = 'flex-start';\n    return 
this;\n  }\n\n  /**\n   * Sets the bottom position of the overlay. Clears any 
previously set vertical position.\n   * @param value New bottom offset.\n   
*/\n  bottom(value: string = ''): this {\n    this._topOffset = '';\n    
this._bottomOffset = value;\n    this._alignItems = 'flex-end';\n    re
 turn this;\n  }\n\n  /**\n   * Sets the right position of the overlay. Clears 
any previously set horizontal position.\n   * @param value New right offset.\n  
 */\n  right(value: string = ''): this {\n    this._leftOffset = '';\n    
this._rightOffset = value;\n    this._justifyContent = 'flex-end';\n    return 
this;\n  }\n\n  /**\n   * Sets the overlay width and clears any previously set 
width.\n   * @param value New width for the overlay\n   */\n  width(value: 
string = ''): this {\n    this._width = value;\n\n    // When the width is 
100%, we should reset the `left` and the offset,\n    // in order to ensure 
that the element is flush against the viewport edge.\n    if (value === '100%') 
{\n      this.left('0px');\n    }\n\n    return this;\n  }\n\n  /**\n   * Sets 
the overlay height and clears any previously set height.\n   * @param value New 
height for the overlay\n   */\n  height(value: string = ''): this {\n    
this._height = value;\n\n    // When the height is 100%, we should re
 set the `top` and the offset,\n    // in order to ensure that the element is 
flush against the viewport edge.\n    if (value === '100%') {\n      
this.top('0px');\n    }\n\n    return this;\n  }\n\n  /**\n   * Centers the 
overlay horizontally with an optional offset.\n   * Clears any previously set 
horizontal position.\n   *\n   * @param offset Overlay offset from the 
horizontal center.\n   */\n  centerHorizontally(offset: string = ''): this {\n  
  this.left(offset);\n    this._justifyContent = 'center';\n    return this;\n  
}\n\n  /**\n   * Centers the overlay vertically with an optional offset.\n   * 
Clears any previously set vertical position.\n   *\n   * @param offset Overlay 
offset from the vertical center.\n   */\n  centerVertically(offset: string = 
''): this {\n    this.top(offset);\n    this._alignItems = 'center';\n    
return this;\n  }\n\n  /**\n   * Apply the position to the element.\n   * 
@docs-private\n   *\n   * @returns Resolved when the styles have been 
applied.\n   
 */\n  apply(): void {\n    // Since the overlay ref applies the strategy 
asynchronously, it could\n    // have been disposed before it ends up being 
applied. If that is the\n    // case, we shouldn't do anything.\n    if 
(!this._overlayRef.hasAttached()) {\n      return;\n    }\n\n    const element 
= this._overlayRef.overlayElement;\n\n    if (!this._wrapper && 
element.parentNode) {\n      this._wrapper = 
this._document.createElement('div');\n      
this._wrapper!.classList.add('cdk-global-overlay-wrapper');\n      
element.parentNode.insertBefore(this._wrapper!, element);\n      
this._wrapper!.appendChild(element);\n    }\n\n    let styles = 
element.style;\n    let parentStyles = (element.parentNode as 
HTMLElement).style;\n\n    styles.position = this._cssPosition;\n    
styles.marginTop = this._topOffset;\n    styles.marginLeft = 
this._leftOffset;\n    styles.marginBottom = this._bottomOffset;\n    
styles.marginRight = this._rightOffset;\n    styles.width = this._width;\n    
styles.h
 eight = this._height;\n\n    parentStyles.justifyContent = 
this._justifyContent;\n    parentStyles.alignItems = this._alignItems;\n  }\n\n 
 /** Removes the wrapper element from the DOM. */\n  dispose(): void {\n    if 
(this._wrapper && this._wrapper.parentNode) {\n      
this._wrapper.parentNode.removeChild(this._wrapper);\n      this._wrapper = 
null;\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 {PositionStrategy} from './position-strategy';\nimport 
{ElementRef} from '@angular/core';\nimport {ViewportRuler} from 
'@angular/cdk/scrolling';\nimport {\n  ConnectionPositionPair,\n  
OriginConnectionPosition,\n  OverlayConnectionPosition,\n  
ConnectedOverlayPositionChange,\n  ScrollingVisibility,\n} from 
'./connected-position';\nimport {Subject} from 'rxjs/Subject';\nimport 
{Subscription} from 'rxjs/Su
 bscription';\nimport {Observable} from 'rxjs/Observable';\nimport 
{CdkScrollable} from '@angular/cdk/scrolling';\nimport 
{isElementScrolledOutsideView, isElementClippedByScrolling} from 
'./scroll-clip';\nimport {OverlayRef} from '../overlay-ref';\n\n\n\n/**\n * A 
strategy for positioning overlays. Using this strategy, an overlay is given 
an\n * implicit position relative some origin element. The relative position is 
defined in terms of\n * a point on the origin element that is connected to a 
point on the overlay element. For example,\n * a basic dropdown is connecting 
the bottom-left corner of the origin to the top-left corner\n * of the 
overlay.\n */\nexport class ConnectedPositionStrategy implements 
PositionStrategy {\n  /** The overlay to which this strategy is attached. */\n  
private _overlayRef: OverlayRef;\n\n  /** Layout direction of the position 
strategy. */\n  private _dir = 'ltr';\n\n  /** The offset in pixels for the 
overlay connection point on the x-axis */\n  private _o
 ffsetX: number = 0;\n\n  /** The offset in pixels for the overlay connection 
point on the y-axis */\n  private _offsetY: number = 0;\n\n  /** The Scrollable 
containers used to check scrollable view properties on position change. */\n  
private scrollables: CdkScrollable[] = [];\n\n  /** Subscription to viewport 
resize events. */\n  private _resizeSubscription = Subscription.EMPTY;\n\n  /** 
Whether the we're dealing with an RTL context */\n  get _isRtl() {\n    return 
this._dir === 'rtl';\n  }\n\n  /** Ordered list of preferred positions, from 
most to least desirable. */\n  _preferredPositions: ConnectionPositionPair[] = 
[];\n\n  /** The origin element against which the overlay will be positioned. 
*/\n  private _origin: HTMLElement;\n\n  /** The overlay pane element. */\n  
private _pane: HTMLElement;\n\n  /** The last position to have been calculated 
as the best fit position. */\n  private _lastConnectedPosition: 
ConnectionPositionPair;\n\n  /** Whether the position strategy is applie
 d currently. */\n  private _applied = false;\n\n  /** Whether the overlay 
position is locked. */\n  private _positionLocked = false;\n\n  private 
_onPositionChange = new Subject<ConnectedOverlayPositionChange>();\n\n  /** 
Emits an event when the connection point changes. */\n  get onPositionChange(): 
Observable<ConnectedOverlayPositionChange> {\n    return 
this._onPositionChange.asObservable();\n  }\n\n  constructor(\n      originPos: 
OriginConnectionPosition,\n      overlayPos: OverlayConnectionPosition,\n      
private _connectedTo: ElementRef,\n      private _viewportRuler: 
ViewportRuler,\n      private _document: any) {\n    this._origin = 
this._connectedTo.nativeElement;\n    this.withFallbackPosition(originPos, 
overlayPos);\n  }\n\n  /** Ordered list of preferred positions, from most to 
least desirable. */\n  get positions(): ConnectionPositionPair[] {\n    return 
this._preferredPositions;\n  }\n\n  /** Attach this position strategy to an 
overlay. */\n  attach(overlayRef: Overl
 ayRef): void {\n    this._overlayRef = overlayRef;\n    this._pane = 
overlayRef.overlayElement;\n    this._resizeSubscription.unsubscribe();\n    
this._resizeSubscription = this._viewportRuler.change().subscribe(() => 
this.apply());\n  }\n\n  /** Disposes all resources used by the position 
strategy. */\n  dispose() {\n    this._applied = false;\n    
this._resizeSubscription.unsubscribe();\n    
this._onPositionChange.complete();\n  }\n\n  /** @docs-private */\n  detach() 
{\n    this._applied = false;\n    this._resizeSubscription.unsubscribe();\n  
}\n\n  /**\n   * Updates the position of the overlay element, using whichever 
preferred position relative\n   * to the origin fits on-screen.\n   * 
@docs-private\n   */\n  apply(): void {\n    // If the position has been 
applied already (e.g. when the overlay was opened) and the\n    // consumer 
opted into locking in the position, re-use the  old position, in order to\n    
// prevent the overlay from jumping around.\n    if (this._applied &
 & this._positionLocked && this._lastConnectedPosition) {\n      
this.recalculateLastPosition();\n      return;\n    }\n\n    this._applied = 
true;\n\n    // We need the bounding rects for the origin and the overlay to 
determine how to position\n    // the overlay relative to the origin.\n    
const element = this._pane;\n    const originRect = 
this._origin.getBoundingClientRect();\n    const overlayRect = 
element.getBoundingClientRect();\n\n    // We use the viewport size to 
determine whether a position would go off-screen.\n    const viewportSize = 
this._viewportRuler.getViewportSize();\n\n    // Fallback point if none of the 
fallbacks fit into the viewport.\n    let fallbackPoint: OverlayPoint | 
undefined;\n    let fallbackPosition: ConnectionPositionPair | undefined;\n\n   
 // We want to place the overlay in the first of the preferred positions such 
that the\n    // overlay fits on-screen.\n    for (let pos of 
this._preferredPositions) {\n      // Get the (x, y) point of connectio
 n on the origin, and then use that to get the\n      // (top, left) coordinate 
for the overlay at `pos`.\n      let originPoint = 
this._getOriginConnectionPoint(originRect, pos);\n      let overlayPoint = 
this._getOverlayPoint(originPoint, overlayRect, viewportSize, pos);\n\n      // 
If the overlay in the calculated position fits on-screen, put it there and 
we're done.\n      if (overlayPoint.fitsInViewport) {\n        
this._setElementPosition(element, overlayRect, overlayPoint, pos);\n\n        
// Save the last connected position in case the position needs to be 
re-calculated.\n        this._lastConnectedPosition = pos;\n\n        return;\n 
     } else if (!fallbackPoint || fallbackPoint.visibleArea < 
overlayPoint.visibleArea) {\n        fallbackPoint = overlayPoint;\n        
fallbackPosition = pos;\n      }\n    }\n\n    // If none of the preferred 
positions were in the viewport, take the one\n    // with the largest visible 
area.\n    this._setElementPosition(element, overlayRect
 , fallbackPoint!, fallbackPosition!);\n  }\n\n  /**\n   * Re-positions the 
overlay element with the trigger in its last calculated position,\n   * even if 
a position higher in the \"preferred positions\" list would now fit. This\n   * 
allows one to re-align the panel without changing the orientation of the 
panel.\n   */\n  recalculateLastPosition(): void {\n    // If the overlay has 
never been positioned before, do nothing.\n    if 
(!this._lastConnectedPosition) {\n      return;\n    }\n\n    const originRect 
= this._origin.getBoundingClientRect();\n    const overlayRect = 
this._pane.getBoundingClientRect();\n    const viewportSize = 
this._viewportRuler.getViewportSize();\n    const lastPosition = 
this._lastConnectedPosition || this._preferredPositions[0];\n\n    let 
originPoint = this._getOriginConnectionPoint(originRect, lastPosition);\n    
let overlayPoint = this._getOverlayPoint(originPoint, overlayRect, 
viewportSize, lastPosition);\n    this._setElementPosition(this._pane, over
 layRect, overlayPoint, lastPosition);\n  }\n\n  /**\n   * Sets the list of 
Scrollable containers that host the origin element so that\n   * on reposition 
we can evaluate if it or the overlay has been clipped or outside view. Every\n  
 * Scrollable must be an ancestor element of the strategy's origin element.\n   
*/\n  withScrollableContainers(scrollables: CdkScrollable[]) {\n    
this.scrollables = scrollables;\n  }\n\n  /**\n   * Adds a new preferred 
fallback position.\n   * @param originPos\n   * @param overlayPos\n   */\n  
withFallbackPosition(\n      originPos: OriginConnectionPosition,\n      
overlayPos: OverlayConnectionPosition,\n      offsetX?: number,\n      
offsetY?: number): this {\n\n    const position = new 
ConnectionPositionPair(originPos, overlayPos, offsetX, offsetY);\n    
this._preferredPositions.push(position);\n    return this;\n  }\n\n  /**\n   * 
Sets the layout direction so the overlay's position can be adjusted to match.\n 
  * @param dir New layout direction.\n 
   */\n  withDirection(dir: 'ltr' | 'rtl'): this {\n    this._dir = dir;\n    
return this;\n  }\n\n  /**\n   * Sets an offset for the overlay's connection 
point on the x-axis\n   * @param offset New offset in the X axis.\n   */\n  
withOffsetX(offset: number): this {\n    this._offsetX = offset;\n    return 
this;\n  }\n\n  /**\n   * Sets an offset for the overlay's connection point on 
the y-axis\n   * @param  offset New offset in the Y axis.\n   */\n  
withOffsetY(offset: number): this {\n    this._offsetY = offset;\n    return 
this;\n  }\n\n  /**\n   * Sets whether the overlay's position should be locked 
in after it is positioned\n   * initially. When an overlay is locked in, it 
won't attempt to reposition itself\n   * when the position is re-applied (e.g. 
when the user scrolls away).\n   * @param isLocked Whether the overlay should 
locked in.\n   */\n  withLockedPosition(isLocked: boolean): this {\n    
this._positionLocked = isLocked;\n    return this;\n  }\n\n  /**\n   * 
Overwrites 
 the current set of positions with an array of new ones.\n   * @param positions 
Position pairs to be set on the strategy.\n   */\n  withPositions(positions: 
ConnectionPositionPair[]): this {\n    this._preferredPositions = 
positions.slice();\n    return this;\n  }\n\n  /**\n   * Sets the origin 
element, relative to which to position the overlay.\n   * @param origin 
Reference to the new origin element.\n   */\n  setOrigin(origin: ElementRef): 
this {\n    this._origin = origin.nativeElement;\n    return this;\n  }\n\n  
/**\n   * Gets the horizontal (x) \"start\" dimension based on whether the 
overlay is in an RTL context.\n   * @param rect\n   */\n  private 
_getStartX(rect: ClientRect): number {\n    return this._isRtl ? rect.right : 
rect.left;\n  }\n\n  /**\n   * Gets the horizontal (x) \"end\" dimension based 
on whether the overlay is in an RTL context.\n   * @param rect\n   */\n  
private _getEndX(rect: ClientRect): number {\n    return this._isRtl ? 
rect.left : rect.right;\n  }\n\n\
 n  /**\n   * Gets the (x, y) coordinate of a connection point on the origin 
based on a relative position.\n   * @param originRect\n   * @param pos\n   */\n 
 private _getOriginConnectionPoint(originRect: ClientRect, pos: 
ConnectionPositionPair): Point {\n    const originStartX = 
this._getStartX(originRect);\n    const originEndX = 
this._getEndX(originRect);\n\n    let x: number;\n    if (pos.originX == 
'center') {\n      x = originStartX + (originRect.width / 2);\n    } else {\n   
   x = pos.originX == 'start' ? originStartX : originEndX;\n    }\n\n    let y: 
number;\n    if (pos.originY == 'center') {\n      y = originRect.top + 
(originRect.height / 2);\n    } else {\n      y = pos.originY == 'top' ? 
originRect.top : originRect.bottom;\n    }\n\n    return {x, y};\n  }\n\n\n  
/**\n   * Gets the (x, y) coordinate of the top-left corner of the overlay 
given a given position and\n   * origin point to which the overlay should be 
connected, as well as how much of the element\n   * would 
 be inside the viewport at that position.\n   */\n  private _getOverlayPoint(\n 
     originPoint: Point,\n      overlayRect: ClientRect,\n      viewportSize: 
{width: number; height: number},\n      pos: ConnectionPositionPair): 
OverlayPoint {\n    // Calculate the (overlayStartX, overlayStartY), the start 
of the potential overlay position\n    // relative to the origin point.\n    
let overlayStartX: number;\n    if (pos.overlayX == 'center') {\n      
overlayStartX = -overlayRect.width / 2;\n    } else if (pos.overlayX === 
'start') {\n      overlayStartX = this._isRtl ? -overlayRect.width : 0;\n    } 
else {\n      overlayStartX = this._isRtl ? 0 : -overlayRect.width;\n    }\n\n  
  let overlayStartY: number;\n    if (pos.overlayY == 'center') {\n      
overlayStartY = -overlayRect.height / 2;\n    } else {\n      overlayStartY = 
pos.overlayY == 'top' ? 0 : -overlayRect.height;\n    }\n\n    // The (x, y) 
offsets of the overlay based on the current position.\n    let offsetX = typeof 
pos
 .offsetX === 'undefined' ? this._offsetX : pos.offsetX;\n    let offsetY = 
typeof pos.offsetY === 'undefined' ? this._offsetY : pos.offsetY;\n\n    // The 
(x, y) coordinates of the overlay.\n    let x = originPoint.x + overlayStartX + 
offsetX;\n    let y = originPoint.y + overlayStartY + offsetY;\n\n    // How 
much the overlay would overflow at this position, on each side.\n    let 
leftOverflow = 0 - x;\n    let rightOverflow = (x + overlayRect.width) - 
viewportSize.width;\n    let topOverflow = 0 - y;\n    let bottomOverflow = (y 
+ overlayRect.height) - viewportSize.height;\n\n    // Visible parts of the 
element on each axis.\n    let visibleWidth = 
this._subtractOverflows(overlayRect.width, leftOverflow, rightOverflow);\n    
let visibleHeight = this._subtractOverflows(overlayRect.height, topOverflow, 
bottomOverflow);\n\n    // The area of the element that's within the 
viewport.\n    let visibleArea = visibleWidth * visibleHeight;\n    let 
fitsInViewport = (overlayRect.width * over
 layRect.height) === visibleArea;\n\n    return {x, y, fitsInViewport, 
visibleArea};\n  }\n\n  /**\n   * Gets the view properties of the trigger and 
overlay, including whether they are clipped\n   * or completely outside the 
view of any of the strategy's scrollables.\n   */\n  private 
_getScrollVisibility(overlay: HTMLElement): ScrollingVisibility {\n    const 
originBounds = this._origin.getBoundingClientRect();\n    const overlayBounds = 
overlay.getBoundingClientRect();\n    const scrollContainerBounds =\n        
this.scrollables.map(s => 
s.getElementRef().nativeElement.getBoundingClientRect());\n\n    return {\n     
 isOriginClipped: isElementClippedByScrolling(originBounds, 
scrollContainerBounds),\n      isOriginOutsideView: 
isElementScrolledOutsideView(originBounds, scrollContainerBounds),\n      
isOverlayClipped: isElementClippedByScrolling(overlayBounds, 
scrollContainerBounds),\n      isOverlayOutsideView: 
isElementScrolledOutsideView(overlayBounds, scrollContainerBounds),\n   
  };\n  }\n\n  /** Physically positions the overlay element to the given 
coordinate. */\n  private _setElementPosition(\n      element: HTMLElement,\n   
   overlayRect: ClientRect,\n      overlayPoint: Point,\n      pos: 
ConnectionPositionPair) {\n\n    // We want to set either `top` or `bottom` 
based on whether the overlay wants to appear above\n    // or below the origin 
and the direction in which the element will expand.\n    let 
verticalStyleProperty = pos.overlayY === 'bottom' ? 'bottom' : 'top';\n\n    // 
When using `bottom`, we adjust the y position such that it is the distance\n    
// from the bottom of the viewport rather than the top.\n    let y = 
verticalStyleProperty === 'top' ?\n        overlayPoint.y :\n        
this._document.documentElement.clientHeight - (overlayPoint.y + 
overlayRect.height);\n\n    // We want to set either `left` or `right` based on 
whether the overlay wants to appear \"before\"\n    // or \"after\" the origin, 
which determines the direction in which
  the element will expand.\n    // For the horizontal axis, the meaning of 
\"before\" and \"after\" change based on whether the\n    // page is in RTL or 
LTR.\n    let horizontalStyleProperty: string;\n    if (this._dir === 'rtl') 
{\n      horizontalStyleProperty = pos.overlayX === 'end' ? 'left' : 'right';\n 
   } else {\n      horizontalStyleProperty = pos.overlayX === 'end' ? 'right' : 
'left';\n    }\n\n    // When we're setting `right`, we adjust the x position 
such that it is the distance\n    // from the right edge of the viewport rather 
than the left edge.\n    let x = horizontalStyleProperty === 'left' ?\n      
overlayPoint.x :\n      this._document.documentElement.clientWidth - 
(overlayPoint.x + overlayRect.width);\n\n\n    // Reset any existing styles. 
This is necessary in case the preferred position has\n    // changed since the 
last `apply`.\n    ['top', 'bottom', 'left', 'right'].forEach(p => 
element.style[p] = null);\n\n    element.style[verticalStyleProperty] = `${y}px`
 ;\n    element.style[horizontalStyleProperty] = `${x}px`;\n\n    // Notify 
that the position has been changed along with its change properties.\n    const 
scrollableViewProperties = this._getScrollVisibility(element);\n    const 
positionChange = new ConnectedOverlayPositionChange(pos, 
scrollableViewProperties);\n    this._onPositionChange.next(positionChange);\n  
}\n\n  /**\n   * Subtracts the amount that an element is overflowing on an axis 
from it's length.\n   */\n  private _subtractOverflows(length: number, 
...overflows: number[]): number {\n    return overflows.reduce((currentValue: 
number, currentOverflow: number) => {\n      return currentValue - 
Math.max(currentOverflow, 0);\n    }, length);\n  }\n}\n\n/** A simple (x, y) 
coordinate. */\ninterface Point {\n  x: number;\n  y: number;\n}\n\n/**\n * 
Expands the simple (x, y) coordinate by adding info about whether the\n * 
element would fit inside the viewport at that position, as well as\n * how much 
of the element would be vis
 ible.\n */\ninterface OverlayPoint extends Point {\n  visibleArea: number;\n  
fitsInViewport: boolean;\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 {Direction} from 
'@angular/cdk/bidi';\nimport {ComponentPortal, Portal, PortalOutlet, 
TemplatePortal} from '@angular/cdk/portal';\nimport {ComponentRef, 
EmbeddedViewRef, NgZone} from '@angular/core';\nimport {Observable} from 
'rxjs/Observable';\nimport {take} from 'rxjs/operators/take';\nimport {Subject} 
from 'rxjs/Subject';\nimport {OverlayKeyboardDispatcher} from 
'./keyboard/overlay-keyboard-dispatcher';\nimport {OverlayConfig} from 
'./overlay-config';\n\n\n/** An object where all of its properties cannot be 
written. */\nexport type ImmutableObject<T> = {\n  readonly [P in keyof T]: 
T[P];\n};\n\n/**\n * Reference to an overlay that has been created with the O
 verlay service.\n * Used to manipulate or dispose of said overlay.\n 
*/\nexport class OverlayRef implements PortalOutlet {\n  private 
_backdropElement: HTMLElement | null = null;\n  private _backdropClick: 
Subject<MouseEvent> = new Subject();\n  private _attachments = new 
Subject<void>();\n  private _detachments = new Subject<void>();\n\n  /** Stream 
of keydown events dispatched to this overlay. */\n  _keydownEvents = new 
Subject<KeyboardEvent>();\n\n  constructor(\n      private _portalOutlet: 
PortalOutlet,\n      private _pane: HTMLElement,\n      private _config: 
ImmutableObject<OverlayConfig>,\n      private _ngZone: NgZone,\n      private 
_keyboardDispatcher: OverlayKeyboardDispatcher,\n      private _document: 
Document) {\n\n    if (_config.scrollStrategy) {\n      
_config.scrollStrategy.attach(this);\n    }\n  }\n\n  /** The overlay's HTML 
element */\n  get overlayElement(): HTMLElement {\n    return this._pane;\n  
}\n\n  /** The overlay's backdrop HTML element. */\n  get bac
 kdropElement(): HTMLElement | null {\n    return this._backdropElement;\n  
}\n\n  attach<T>(portal: ComponentPortal<T>): ComponentRef<T>;\n  
attach<T>(portal: TemplatePortal<T>): EmbeddedViewRef<T>;\n  attach(portal: 
any): any;\n\n  /**\n   * Attaches content, given via a Portal, to the 
overlay.\n   * If the overlay is configured to have a backdrop, it will be 
created.\n   *\n   * @param portal Portal instance to which to attach the 
overlay.\n   * @returns The portal attachment result.\n   */\n  attach(portal: 
Portal<any>): any {\n    let attachResult = 
this._portalOutlet.attach(portal);\n\n    if (this._config.positionStrategy) 
{\n      this._config.positionStrategy.attach(this);\n    }\n\n    // Update 
the pane element with the given configuration.\n    
this._updateStackingOrder();\n    this._updateElementSize();\n    
this._updateElementDirection();\n\n    if (this._config.scrollStrategy) {\n     
 this._config.scrollStrategy.enable();\n    }\n\n    // Update the position 
once the 
 zone is stable so that the overlay will be fully rendered\n    // before 
attempting to position it, as the position may depend on the size of the 
rendered\n    // content.\n    
this._ngZone.onStable.asObservable().pipe(take(1)).subscribe(() => {\n      // 
The overlay could've been detached before the zone has stabilized.\n      if 
(this.hasAttached()) {\n        this.updatePosition();\n      }\n    });\n\n    
// Enable pointer events for the overlay pane element.\n    
this._togglePointerEvents(true);\n\n    if (this._config.hasBackdrop) {\n      
this._attachBackdrop();\n    }\n\n    if (this._config.panelClass) {\n      // 
We can't do a spread here, because IE doesn't support setting multiple 
classes.\n      if (Array.isArray(this._config.panelClass)) {\n        
this._config.panelClass.forEach(cls => this._pane.classList.add(cls));\n      } 
else {\n        this._pane.classList.add(this._config.panelClass);\n      }\n   
 }\n\n    // Only emit the `attachments` event once all other se
 tup is done.\n    this._attachments.next();\n\n    // Track this overlay by 
the keyboard dispatcher\n    this._keyboardDispatcher.add(this);\n\n    return 
attachResult;\n  }\n\n  /**\n   * Detaches an overlay from a portal.\n   * 
@returns The portal detachment result.\n   */\n  detach(): any {\n    if 
(!this.hasAttached()) {\n      return;\n    }\n\n    this.detachBackdrop();\n\n 
   // When the overlay is detached, the pane element should disable pointer 
events.\n    // This is necessary because otherwise the pane element will cover 
the page and disable\n    // pointer events therefore. Depends on the position 
strategy and the applied pane boundaries.\n    
this._togglePointerEvents(false);\n\n    if (this._config.positionStrategy && 
this._config.positionStrategy.detach) {\n      
this._config.positionStrategy.detach();\n    }\n\n    if 
(this._config.scrollStrategy) {\n      this._config.scrollStrategy.disable();\n 
   }\n\n    const detachmentResult = this._portalOutlet.detach();\n\n 
    // Only emit after everything is detached.\n    
this._detachments.next();\n\n    // Remove this overlay from keyboard 
dispatcher tracking\n    this._keyboardDispatcher.remove(this);\n\n    return 
detachmentResult;\n  }\n\n  /** Cleans up the overlay from the DOM. */\n  
dispose(): void {\n    const isAttached = this.hasAttached();\n\n    if 
(this._config.positionStrategy) {\n      
this._config.positionStrategy.dispose();\n    }\n\n    if 
(this._config.scrollStrategy) {\n      this._config.scrollStrategy.disable();\n 
   }\n\n    this.detachBackdrop();\n    
this._keyboardDispatcher.remove(this);\n    this._portalOutlet.dispose();\n    
this._attachments.complete();\n    this._backdropClick.complete();\n    
this._keydownEvents.complete();\n\n    if (isAttached) {\n      
this._detachments.next();\n    }\n\n    this._detachments.complete();\n  }\n\n  
/** Whether the overlay has attached content. */\n  hasAttached(): boolean {\n  
  return this._portalOutlet.hasAttached();\n  }\n\n  /** G
 ets an observable that emits when the backdrop has been clicked. */\n  
backdropClick(): Observable<MouseEvent> {\n    return 
this._backdropClick.asObservable();\n  }\n\n  /** Gets an observable that emits 
when the overlay has been attached. */\n  attachments(): Observable<void> {\n   
 return this._attachments.asObservable();\n  }\n\n  /** Gets an observable that 
emits when the overlay has been detached. */\n  detachments(): Observable<void> 
{\n    return this._detachments.asObservable();\n  }\n\n  /** Gets an 
observable of keydown events targeted to this overlay. */\n  keydownEvents(): 
Observable<KeyboardEvent> {\n    return this._keydownEvents.asObservable();\n  
}\n\n  /** Gets the the current overlay configuration, which is immutable. */\n 
 getConfig(): OverlayConfig {\n    return this._config;\n  }\n\n  /** Updates 
the position of the overlay based on the position strategy. */\n  
updatePosition() {\n    if (this._config.positionStrategy) {\n      
this._config.positionStrategy.app
 ly();\n    }\n  }\n\n  /** Update the size properties of the overlay. */\n  
updateSize(sizeConfig: OverlaySizeConfig) {\n    this._config = 
{...this._config, ...sizeConfig};\n    this._updateElementSize();\n  }\n\n  /** 
Sets the LTR/RTL direction for the overlay. */\n  setDirection(dir: Direction) 
{\n    this._config = {...this._config, direction: dir};\n    
this._updateElementDirection();\n  }\n\n  /** Updates the text direction of the 
overlay panel. */\n  private _updateElementDirection() {\n    
this._pane.setAttribute('dir', this._config.direction!);\n  }\n\n  /** Updates 
the size of the overlay element based on the overlay config. */\n  private 
_updateElementSize() {\n    if (this._config.width || this._config.width === 0) 
{\n      this._pane.style.width = formatCssUnit(this._config.width);\n    }\n\n 
   if (this._config.height || this._config.height === 0) {\n      
this._pane.style.height = formatCssUnit(this._config.height);\n    }\n\n    if 
(this._config.minWidth || this._con
 fig.minWidth === 0) {\n      this._pane.style.minWidth = 
formatCssUnit(this._config.minWidth);\n    }\n\n    if (this._config.minHeight 
|| this._config.minHeight === 0) {\n      this._pane.style.minHeight = 
formatCssUnit(this._config.minHeight);\n    }\n\n    if (this._config.maxWidth 
|| this._config.maxWidth === 0) {\n      this._pane.style.maxWidth = 
formatCssUnit(this._config.maxWidth);\n    }\n\n    if (this._config.maxHeight 
|| this._config.maxHeight === 0) {\n      this._pane.style.maxHeight = 
formatCssUnit(this._config.maxHeight);\n    }\n  }\n\n  /** Toggles the pointer 
events for the overlay pane element. */\n  private 
_togglePointerEvents(enablePointer: boolean) {\n    
this._pane.style.pointerEvents = enablePointer ? 'auto' : 'none';\n  }\n\n  /** 
Attaches a backdrop for this overlay. */\n  private _attachBackdrop() {\n    
const showingClass = 'cdk-overlay-backdrop-showing';\n\n    
this._backdropElement = this._document.createElement('div');\n    
this._backdropElement.clas
 sList.add('cdk-overlay-backdrop');\n\n    if (this._config.backdropClass) {\n  
    this._backdropElement.classList.add(this._config.backdropClass);\n    }\n\n 
   // Insert the backdrop before the pane in the DOM order,\n    // in order to 
handle stacked overlays properly.\n    
this._pane.parentElement!.insertBefore(this._backdropElement, this._pane);\n\n  
  // Forward backdrop clicks such that the consumer of the overlay can perform 
whatever\n    // action desired when such a click occurs (usually closing the 
overlay).\n    this._backdropElement.addEventListener('click',\n        (event: 
MouseEvent) => this._backdropClick.next(event));\n\n    // Add class to fade-in 
the backdrop after one frame.\n    if (typeof requestAnimationFrame !== 
'undefined') {\n      this._ngZone.runOutsideAngular(() => {\n        
requestAnimationFrame(() => {\n          if (this._backdropElement) {\n         
   this._backdropElement.classList.add(showingClass);\n          }\n        
});\n      });\n    } el
 se {\n      this._backdropElement.classList.add(showingClass);\n    }\n  }\n\n 
 /**\n   * Updates the stacking order of the element, moving it to the top if 
necessary.\n   * This is required in cases where one overlay was detached, 
while another one,\n   * that should be behind it, was destroyed. The next time 
both of them are opened,\n   * the stacking will be wrong, because the detached 
element's pane will still be\n   * in its original DOM position.\n   */\n  
private _updateStackingOrder() {\n    if (this._pane.nextSibling) {\n      
this._pane.parentNode!.appendChild(this._pane);\n    }\n  }\n\n  /** Detaches 
the backdrop (if any) associated with the overlay. */\n  detachBackdrop(): void 
{\n    let backdropToDetach = this._backdropElement;\n\n    if 
(backdropToDetach) {\n      let finishDetach = () => {\n        // It may not 
be attached to anything in certain cases (e.g. unit tests).\n        if 
(backdropToDetach && backdropToDetach.parentNode) {\n          
backdropToDetach.pare
 ntNode.removeChild(backdropToDetach);\n        }\n\n        // It is possible 
that a new portal has been attached to this overlay since we started\n        
// removing the backdrop. If that is the case, only clear the backdrop 
reference if it\n        // is still the same instance that we started to 
remove.\n        if (this._backdropElement == backdropToDetach) {\n          
this._backdropElement = null;\n        }\n      };\n\n      
backdropToDetach.classList.remove('cdk-overlay-backdrop-showing');\n\n      if 
(this._config.backdropClass) {\n        
backdropToDetach.classList.remove(this._config.backdropClass);\n      }\n\n     
 backdropToDetach.addEventListener('transitionend', finishDetach);\n\n      // 
If the backdrop doesn't have a transition, the `transitionend` event won't 
fire.\n      // In this case we make it unclickable and we try to remove it 
after a delay.\n      backdropToDetach.style.pointerEvents = 'none';\n\n      
// Run this outside the Angular zone because there's
  nothing that Angular cares about.\n      // If it were to run inside the 
Angular zone, every test that used Overlay would have to be\n      // either 
async or fakeAsync.\n      this._ngZone.runOutsideAngular(() => {\n        
setTimeout(finishDetach, 500);\n      });\n    }\n  }\n}\n\nfunction 
formatCssUnit(value: number | string) {\n  return typeof value === 'string' ? 
value as string : `${value}px`;\n}\n\n\n/** Size properties for an overlay. 
*/\nexport interface OverlaySizeConfig {\n  width?: number | string;\n  
height?: number | string;\n  minWidth?: number | string;\n  minHeight?: number 
| string;\n  maxWidth?: number | string;\n  maxHeight?: number | 
string;\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\nexport 
{CdkScrollable, ScrollDispatcher} from '@angular/cdk/scrolling';\n\n// Export 
pre-defined scroll st
 rategies and interface to build custom ones.\nexport {ScrollStrategy} from 
'./scroll-strategy';\nexport {ScrollStrategyOptions} from 
'./scroll-strategy-options';\nexport {RepositionScrollStrategy} from 
'./reposition-scroll-strategy';\nexport {CloseScrollStrategy} from 
'./close-scroll-strategy';\nexport {NoopScrollStrategy} from 
'./noop-scroll-strategy';\nexport {BlockScrollStrategy} from 
'./block-scroll-strategy';\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 */\nimport {Injectable, NgZone, Inject} from 
'@angular/core';\nimport {CloseScrollStrategy, CloseScrollStrategyConfig} from 
'./close-scroll-strategy';\nimport {NoopScrollStrategy} from 
'./noop-scroll-strategy';\nimport {BlockScrollStrategy} from 
'./block-scroll-strategy';\nimport {ScrollDispatcher} from 
'@angular/cdk/scrolling';\nimport {ViewportRuler} from '@angular/
 cdk/scrolling';\nimport {DOCUMENT} from '@angular/common';\nimport {\n  
RepositionScrollStrategy,\n  RepositionScrollStrategyConfig,\n} from 
'./reposition-scroll-strategy';\n\n\n/**\n * Options for how an overlay will 
handle scrolling.\n *\n * Users can provide a custom value for 
`ScrollStrategyOptions` to replace the default\n * behaviors. This class 
primarily acts as a factory for ScrollStrategy instances.\n 
*/\n@Injectable()\nexport class ScrollStrategyOptions {\n  private _document: 
Document;\n\n  constructor(\n    private _scrollDispatcher: ScrollDispatcher,\n 
   private _viewportRuler: ViewportRuler,\n    private _ngZone: NgZone,\n    
@Inject(DOCUMENT) document: any) {\n      this._document = document;\n    }\n\n 
 /** Do nothing on scroll. */\n  noop = () => new NoopScrollStrategy();\n\n  
/**\n   * Close the overlay as soon as the user scrolls.\n   * @param config 
Configuration to be used inside the scroll strategy.\n   */\n  close = 
(config?: CloseScrollStrategyConfig) => new
  CloseScrollStrategy(this._scrollDispatcher,\n      this._ngZone, 
this._viewportRuler, config)\n\n  /** Block scrolling. */\n  block = () => new 
BlockScrollStrategy(this._viewportRuler, this._document);\n\n  /**\n   * Update 
the overlay's position on scroll.\n   * @param config Configuration to be used 
inside the scroll strategy.\n   * Allows debouncing the reposition calls.\n   
*/\n  reposition = (config?: RepositionScrollStrategyConfig) => new 
RepositionScrollStrategy(\n      this._scrollDispatcher, this._viewportRuler, 
this._ngZone, config)\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 {NgZone} from 
'@angular/core';\nimport {Subscription} from 'rxjs/Subscription';\nimport 
{ScrollStrategy, getMatScrollStrategyAlreadyAttachedError} from 
'./scroll-strategy';\nimport {OverlayRef} from '../overlay-ref';\nimpo
 rt {ScrollDispatcher, ViewportRuler} from '@angular/cdk/scrolling';\nimport 
{isElementScrolledOutsideView} from '../position/scroll-clip';\n\n/**\n * 
Config options for the RepositionScrollStrategy.\n */\nexport interface 
RepositionScrollStrategyConfig {\n  /** Time in milliseconds to throttle the 
scroll events. */\n  scrollThrottle?: number;\n\n  /** Whether to close the 
overlay once the user has scrolled away completely. */\n  autoClose?: 
boolean;\n}\n\n/**\n * Strategy that will update the element position as the 
user is scrolling.\n */\nexport class RepositionScrollStrategy implements 
ScrollStrategy {\n  private _scrollSubscription: Subscription|null = null;\n  
private _overlayRef: OverlayRef;\n\n  constructor(\n    private 
_scrollDispatcher: ScrollDispatcher,\n    private _viewportRuler: 
ViewportRuler,\n    private _ngZone: NgZone,\n    private _config?: 
RepositionScrollStrategyConfig) { }\n\n  /** Attaches this scroll strategy to 
an overlay. */\n  attach(overlayRef: OverlayRef
 ) {\n    if (this._overlayRef) {\n      throw 
getMatScrollStrategyAlreadyAttachedError();\n    }\n\n    this._overlayRef = 
overlayRef;\n  }\n\n  /** Enables repositioning of the attached overlay on 
scroll. */\n  enable() {\n    if (!this._scrollSubscription) {\n      const 
throttle = this._config ? this._config.scrollThrottle : 0;\n\n      
this._scrollSubscription = 
this._scrollDispatcher.scrolled(throttle).subscribe(() => {\n        
this._overlayRef.updatePosition();\n\n        // TODO(crisbeto): make `close` 
on by default once all components can handle it.\n        if (this._config && 
this._config.autoClose) {\n          const overlayRect = 
this._overlayRef.overlayElement.getBoundingClientRect();\n          const 
{width, height} = this._viewportRuler.getViewportSize();\n\n          // 
TODO(crisbeto): include all ancestor scroll containers here once\n          // 
we have a way of exposing the trigger element to the scroll strategy.\n         
 const parentRects = [{width, height, bo
 ttom: height, right: width, top: 0, left: 0}];\n\n          if 
(isElementScrolledOutsideView(overlayRect, parentRects)) {\n            
this.disable();\n            this._ngZone.run(() => 
this._overlayRef.detach());\n          }\n        }\n      });\n    }\n  }\n\n  
/** Disables repositioning of the attached overlay on scroll. */\n  disable() 
{\n    if (this._scrollSubscription) {\n      
this._scrollSubscription.unsubscribe();\n      this._scrollSubscription = 
null;\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\n// TODO(jelbourn): move this to live with the rest of the scrolling 
code\n// TODO(jelbourn): someday replace this with 
IntersectionObservers\n\n/**\n * Gets whether an element is scrolled outside of 
view by any of its parent scrolling containers.\n * @param element Dimensions 
of the element (fro
 m getBoundingClientRect)\n * @param scrollContainers Dimensions of element's 
scrolling containers (from getBoundingClientRect)\n * @returns Whether the 
element is scrolled out of view\n * @docs-private\n */\nexport function 
isElementScrolledOutsideView(element: ClientRect, scrollContainers: 
ClientRect[]) {\n  return scrollContainers.some(containerBounds => {\n    const 
outsideAbove = element.bottom < containerBounds.top;\n    const outsideBelow = 
element.top > containerBounds.bottom;\n    const outsideLeft = element.right < 
containerBounds.left;\n    const outsideRight = element.left > 
containerBounds.right;\n\n    return outsideAbove || outsideBelow || 
outsideLeft || outsideRight;\n  });\n}\n\n\n/**\n * Gets whether an element is 
clipped by any of its scrolling containers.\n * @param element Dimensions of 
the element (from getBoundingClientRect)\n * @param scrollContainers Dimensions 
of element's scrolling containers (from getBoundingClientRect)\n * @returns 
Whether the element is 
 clipped\n * @docs-private\n */\nexport function 
isElementClippedByScrolling(element: ClientRect, scrollContainers: 
ClientRect[]) {\n  return scrollContainers.some(scrollContainerRect => {\n    
const clippedAbove = element.top < scrollContainerRect.top;\n    const 
clippedBelow = element.bottom > scrollContainerRect.bottom;\n    const 
clippedLeft = element.left < scrollContainerRect.left;\n    const clippedRight 
= element.right > scrollContainerRect.right;\n\n    return clippedAbove || 
clippedBelow || clippedLeft || clippedRight;\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 {ScrollStrategy} from 
'./scroll-strategy';\nimport {ViewportRuler} from 
'@angular/cdk/scrolling';\n\n/**\n * Strategy that will prevent the user from 
scrolling while the overlay is visible.\n */\nexport class BlockScrollStrategy 
im
 plements ScrollStrategy {\n  private _previousHTMLStyles = { top: '', left: '' 
};\n  private _previousScrollPosition: { top: number, left: number };\n  
private _isEnabled = false;\n  private _document: Document;\n\n  
constructor(private _viewportRuler: ViewportRuler, document: any) {\n    
this._document = document;\n  }\n\n  /** Attaches this scroll strategy to an 
overlay. */\n  attach() { }\n\n  /** Blocks page-level scroll while the 
attached overlay is open. */\n  enable() {\n    if (this._canBeEnabled()) {\n   
   const root = this._document.documentElement;\n\n      
this._previousScrollPosition = 
this._viewportRuler.getViewportScrollPosition();\n\n      // Cache the previous 
inline styles in case the user had set them.\n      
this._previousHTMLStyles.left = root.style.left || '';\n      
this._previousHTMLStyles.top = root.style.top || '';\n\n      // Note: we're 
using the `html` node, instead of the `body`, because the `body` may\n      // 
have the user agent margin, whereas the 
 `html` is guaranteed not to have one.\n      root.style.left = 
`${-this._previousScrollPosition.left}px`;\n      root.style.top = 
`${-this._previousScrollPosition.top}px`;\n      
root.classList.add('cdk-global-scrollblock');\n      this._isEnabled = true;\n  
  }\n  }\n\n  /** Unblocks page-level scroll while the attached overlay is 
open. */\n  disable() {\n    if (this._isEnabled) {\n      const html = 
this._document.documentElement;\n      const body = this._document.body;\n      
const previousHtmlScrollBehavior = html.style['scrollBehavior'] || '';\n      
const previousBodyScrollBehavior = body.style['scrollBehavior'] || '';\n\n      
this._isEnabled = false;\n\n      html.style.left = 
this._previousHTMLStyles.left;\n      html.style.top = 
this._previousHTMLStyles.top;\n      
html.classList.remove('cdk-global-scrollblock');\n\n      // Disable 
user-defined smooth scrolling temporarily while we restore the scroll 
position.\n      // See https://developer.mozilla.org/en-US/docs/Web/C
 SS/scroll-behavior\n      html.style['scrollBehavior'] = 
body.style['scrollBehavior'] = 'auto';\n\n      
window.scroll(this._previousScrollPosition.left, 
this._previousScrollPosition.top);\n\n      html.style['scrollBehavior'] = 
previousHtmlScrollBehavior;\n      body.style['scrollBehavior'] = 
previousBodyScrollBehavior;\n    }\n  }\n\n  private _canBeEnabled(): boolean 
{\n    // Since the scroll strategies can't be singletons, we have to use a 
global CSS class\n    // (`cdk-global-scrollblock`) to make sure that we don't 
try to disable global\n    // scrolling multiple times.\n    const html = 
this._document.documentElement;\n\n    if 
(html.classList.contains('cdk-global-scrollblock') || this._isEnabled) {\n      
return false;\n    }\n\n    const body = this._document.body;\n    const 
viewport = this._viewportRuler.getViewportSize();\n    return body.scrollHeight 
> viewport.height || body.scrollWidth > viewport.width;\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 
*/\nimport {NgZone} from '@angular/core';\nimport {ScrollStrategy, 
getMatScrollStrategyAlreadyAttachedError} from './scroll-strategy';\nimport 
{OverlayRef} from '../overlay-ref';\nimport {Subscription} from 
'rxjs/Subscription';\nimport {ScrollDispatcher, ViewportRuler} from 
'@angular/cdk/scrolling';\n\n/**\n * Config options for the 
CloseScrollStrategy.\n */\nexport interface CloseScrollStrategyConfig {\n  /** 
Amount of pixels the user has to scroll before the overlay is closed. */\n  
threshold?: number;\n}\n\n/**\n * Strategy that will close the overlay as soon 
as the user starts scrolling.\n */\nexport class CloseScrollStrategy implements 
ScrollStrategy {\n  private _scrollSubscription: Subscription|null = null;\n  
private _overlayRef: OverlayRef;\n  private _initialScrollPosition: number;\n\n 
 constructor(\n    private _scrollDis
 patcher: ScrollDispatcher,\n    private _ngZone: NgZone,\n    private 
_viewportRuler: ViewportRuler,\n    private _config?: 
CloseScrollStrategyConfig) {}\n\n  /** Attaches this scroll strategy to an 
overlay. */\n  attach(overlayRef: OverlayRef) {\n    if (this._overlayRef) {\n  
    throw getMatScrollStrategyAlreadyAttachedError();\n    }\n\n    
this._overlayRef = overlayRef;\n  }\n\n  /** Enables the closing of the 
attached overlay on scroll. */\n  enable() {\n    if (this._scrollSubscription) 
{\n      return;\n    }\n\n    const stream = 
this._scrollDispatcher.scrolled(0);\n\n    if (this._config && 
this._config.threshold && this._config.threshold > 1) {\n      
this._initialScrollPosition = 
this._viewportRuler.getViewportScrollPosition().top;\n\n      
this._scrollSubscription = stream.subscribe(() => {\n        const 
scrollPosition = this._viewportRuler.getViewportScrollPosition().top;\n\n       
 if (Math.abs(scrollPosition - this._initialScrollPosition) > 
this._config!.threshold!)
  {\n          this._detach();\n        } else {\n          
this._overlayRef.updatePosition();\n        }\n      });\n    } else {\n      
this._scrollSubscription = stream.subscribe(this._detach);\n    }\n  }\n\n  /** 
Disables the closing the attached overlay on scroll. */\n  disable() {\n    if 
(this._scrollSubscription) {\n      this._scrollSubscription.unsubscribe();\n   
   this._scrollSubscription = null;\n    }\n  }\n\n  /** Detaches the overlay 
ref and disables the scroll strategy. */\n  private _detach = () => {\n    
this.disable();\n\n    if (this._overlayRef.hasAttached()) {\n      
this._ngZone.run(() => this._overlayRef.detach());\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 {OverlayRef} from 
'../overlay-ref';\n\n/**\n * Describes a strategy that will be used by an 
overlay to handle sc
 roll events while it is open.\n */\nexport interface ScrollStrategy {\n  /** 
Enable this scroll strategy (called when the attached overlay is attached to a 
portal). */\n  enable: () => void;\n\n  /** Disable this scroll strategy 
(called when the attached overlay is detached from a portal). */\n  disable: () 
=> void;\n\n  /** Attaches this `ScrollStrategy` to an overlay. */\n  attach: 
(overlayRef: OverlayRef) => void;\n}\n\n/**\n * Returns an error to be thrown 
when attempting to attach an already-attached scroll strategy.\n */\nexport 
function getMatScrollStrategyAlreadyAttachedError(): Error {\n  return 
Error(`Scroll strategy has already been attached.`);\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/** Horizontal dimension of a connection 
point on the perimeter of the origin or overlay element. */\nimport {Opti
 onal} from '@angular/core';\nexport type HorizontalConnectionPos = 'start' | 
'center' | 'end';\n\n/** Vertical dimension of a connection point on the 
perimeter of the origin or overlay element. */\nexport type 
VerticalConnectionPos = 'top' | 'center' | 'bottom';\n\n\n/** A connection 
point on the origin element. */\nexport interface OriginConnectionPosition {\n  
originX: HorizontalConnectionPos;\n  originY: VerticalConnectionPos;\n}\n\n/** 
A connection point on the overlay element. */\nexport interface 
OverlayConnectionPosition {\n  overlayX: HorizontalConnectionPos;\n  overlayY: 
VerticalConnectionPos;\n}\n\n/** The points of the origin element and the 
overlay element to connect. */\nexport class ConnectionPositionPair {\n  /** 
X-axis attachment point for connected overlay origin. Can be 'start', 'end', or 
'center'. */\n  originX: HorizontalConnectionPos;\n  /** Y-axis attachment 
point for connected overlay origin. Can be 'top', 'bottom', or 'center'. */\n  
originY: VerticalConnecti
 onPos;\n  /** X-axis attachment point for connected overlay. Can be 'start', 
'end', or 'center'. */\n  overlayX: HorizontalConnectionPos;\n  /** Y-axis 
attachment point for connected overlay. Can be 'top', 'bottom', or 'center'. 
*/\n  overlayY: VerticalConnectionPos;\n\n  constructor(\n    origin: 
OriginConnectionPosition,\n    overlay: OverlayConnectionPosition,\n    public 
offsetX?: number,\n    public offsetY?: number) {\n\n    this.originX = 
origin.originX;\n    this.originY = origin.originY;\n    this.overlayX = 
overlay.overlayX;\n    this.overlayY = overlay.overlayY;\n  }\n}\n\n/**\n * Set 
of properties regarding the position of the origin and overlay relative to the 
viewport\n * with respect to the containing Scrollable elements.\n *\n * The 
overlay and origin are clipped if any part of their bounding client rectangle 
exceeds the\n * bounds of any one of the strategy's Scrollable's bounding 
client rectangle.\n *\n * The overlay and origin are outside view if there is 
no overl
 ap between their bounding client\n * rectangle and any one of the strategy's 
Scrollable's bounding client rectangle.\n *\n *       -----------               
     -----------\n *       | outside |                    | clipped |\n *       
|  view   |              --------------------------\n *       |         |       
       |     |         |        |\n *       ----------               |     
-----------        |\n *  --------------------------    |                       
 |\n *  |                        |    |      Scrollable        |\n *  |         
               |    |                        |\n *  |                        |  
   --------------------------\n *  |      Scrollable        |\n *  |            
            |\n *  --------------------------\n *\n *  @docs-private\n 
*/\nexport class ScrollingVisibility {\n  isOriginClipped: boolean;\n  
isOriginOutsideView: boolean;\n  isOverlayClipped: boolean;\n  
isOverlayOutsideView: boolean;\n}\n\n/** The change event emitted by the strateg
 y when a fallback position is used. */\nexport class 
ConnectedOverlayPositionChange {\n  constructor(\n      /** The position used 
as a result of this change. */\n      public connectionPair: 
ConnectionPositionPair,\n      /** @docs-private */\n      @Optional() public 
scrollableViewProperties: ScrollingVisibility) {}\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 {PositionStrategy} from 
'./position/position-strategy';\nimport {Direction} from 
'@angular/cdk/bidi';\nimport {ScrollStrategy} from 
'./scroll/scroll-strategy';\nimport {NoopScrollStrategy} from 
'./scroll/noop-scroll-strategy';\n\n\n/** Initial configuration used when 
creating an overlay. */\nexport class OverlayConfig {\n  /** Strategy with 
which to position the overlay. */\n  positionStrategy?: PositionStrategy;\n\n  
/** Strategy to be used when h
 andling scroll events while the overlay is open. */\n  scrollStrategy?: 
ScrollStrategy = new NoopScrollStrategy();\n\n  /** Custom class to add to the 
overlay pane. */\n  panelClass?: string | string[] = '';\n\n  /** Whether the 
overlay has a backdrop. */\n  hasBackdrop?: boolean = false;\n\n  /** Custom 
class to add to the backdrop */\n  backdropClass?: string = 
'cdk-overlay-dark-backdrop';\n\n  /** The width of the overlay panel. If a 
number is provided, pixel units are assumed. */\n  width?: number | string;\n\n 
 /** The height of the overlay panel. If a number is provided, pixel units are 
assumed. */\n  height?: number | string;\n\n  /** The min-width of the overlay 
panel. If a number is provided, pixel units are assumed. */\n  minWidth?: 
number | string;\n\n  /** The min-height of the overlay panel. If a number is 
provided, pixel units are assumed. */\n  minHeight?: number | string;\n\n  /** 
The max-width of the overlay panel. If a number is provided, pixel units are 
assumed. *
 /\n  maxWidth?: number | string;\n\n  /** The max-height of the overlay panel. 
If a number is provided, pixel units are assumed. */\n  maxHeight?: number | 
string;\n\n  /** The direction of the text in the overlay panel. */\n  
direction?: Direction = 'ltr';\n\n  constructor(config?: OverlayConfig) {\n    
if (config) {\n      Object.keys(config)\n        .filter(key => typeof 
config[key] !== 'undefined')\n        .forEach(key => this[key] = 
config[key]);\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 {ScrollStrategy} from 
'./scroll-strategy';\n\n/** Scroll strategy that doesn't do anything. 
*/\nexport class NoopScrollStrategy implements ScrollStrategy {\n  /** Does 
nothing, as this scroll strategy is a no-op. */\n  enable() { }\n  /** Does 
nothing, as this scroll strategy is a no-op. */\n  disable
 () { }\n  /** Does nothing, as this scroll strategy is a no-op. */\n  attach() 
{ 
}\n}\n"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;AqBWA,AAAA,MAAA,kBAAA,CAAA;;;;;IAEE,MAAM,GAAR,GAAc;;;;;IAEZ,OAAO,GAAT,GAAe;;;;;IAEb,MAAM,GAAR,GAAc;CACb;;;;;;;ADPD;;;AAIA,AAAA,MAAA,aAAA,CAAA;;;;IAqCE,WAAF,CAAc,MAAsB,EAApC;;;;QAhCA,IAAA,CAAA,cAAA,G

<TRUNCATED>

Reply via email to