{"version":3,"file":"bernhardb-ngx-virtual-scroller.mjs","sources":["../../../projects/ngx-virtual-scroller/src/lib/ngx-virtual-scroller.component.ts","../../../projects/ngx-virtual-scroller/src/lib/ngx-virtual-scroller.module.ts","../../../projects/ngx-virtual-scroller/src/public-api.ts","../../../projects/ngx-virtual-scroller/src/bernhardb-ngx-virtual-scroller.ts"],"sourcesContent":["import {\n    ChangeDetectorRef,\n    Component,\n    ContentChild,\n    ElementRef,\n    EventEmitter,\n    Inject,\n    Input,\n    NgModule,\n    NgZone,\n    OnChanges,\n    OnDestroy,\n    OnInit,\n    Optional,\n    Output,\n    Renderer2,\n    ViewChild,\n} from '@angular/core';\n\nimport {PLATFORM_ID} from '@angular/core';\nimport {isPlatformServer} from '@angular/common';\n\nimport {CommonModule} from '@angular/common';\n\nimport * as tween from '@tweenjs/tween.js'\n\nexport interface VirtualScrollerDefaultOptions {\n    checkResizeInterval: number\n    modifyOverflowStyleOfParentScroll: boolean,\n    resizeBypassRefreshThreshold: number,\n    scrollAnimationTime: number;\n    scrollDebounceTime: number;\n    scrollThrottlingTime: number;\n    scrollbarHeight?: number;\n    scrollbarWidth?: number;\n    stripedTable: boolean\n}\n\nexport function VIRTUAL_SCROLLER_DEFAULT_OPTIONS_FACTORY(): VirtualScrollerDefaultOptions {\n    return {\n        checkResizeInterval: 1000,\n        modifyOverflowStyleOfParentScroll: true,\n        resizeBypassRefreshThreshold: 5,\n        scrollAnimationTime: 750,\n        scrollDebounceTime: 0,\n        scrollThrottlingTime: 0,\n        stripedTable: false\n    };\n}\n\nexport interface WrapGroupDimensions {\n    maxChildSizePerWrapGroup: WrapGroupDimension[];\n    numberOfKnownWrapGroupChildSizes: number;\n    sumOfKnownWrapGroupChildHeights: number;\n    sumOfKnownWrapGroupChildWidths: number;\n}\n\nexport interface WrapGroupDimension {\n    childHeight: number;\n    childWidth: number;\n    items: any[];\n}\n\nexport interface IDimensions {\n    childHeight: number;\n    childWidth: number;\n    itemCount: number;\n    itemsPerPage: number;\n    itemsPerWrapGroup: number;\n    maxScrollPosition: number;\n    pageCount_fractional: number;\n    scrollLength: number;\n    viewportLength: number;\n    wrapGroupsPerPage: number;\n}\n\nexport interface IPageInfo {\n    endIndex: number;\n    endIndexWithBuffer: number;\n    maxScrollPosition: number;\n    scrollEndPosition: number;\n    scrollStartPosition: number;\n    startIndex: number;\n    startIndexWithBuffer: number;\n}\n\nexport interface IViewport extends IPageInfo {\n    padding: number;\n    scrollLength: number;\n    scrollbarLength: number;\n}\n\n\n@Component({\n    selector: 'virtual-scroller,[virtualScroller]',\n    exportAs: 'virtualScroller',\n    template: `\n        <div class=\"total-padding\" #invisiblePadding></div>\n        <div class=\"scrollable-content\" #content>\n            <ng-content></ng-content>\n        </div>\n    `,\n    host: {\n        '[class.horizontal]': 'horizontal',\n        '[class.vertical]': '!horizontal',\n        '[class.selfScroll]': '!parentScroll',\n        '[class.rtl]': 'RTL'\n    },\n    styles: [`\n        :host {\n            position: relative;\n            display: block;\n            -webkit-overflow-scrolling: touch;\n        }\n\n        :host.horizontal.selfScroll {\n            overflow-y: visible;\n            overflow-x: auto;\n        }\n\n        :host.horizontal.selfScroll.rtl {\n            transform: scaleX(-1);\n        }\n\n        :host.vertical.selfScroll {\n            overflow-y: auto;\n            overflow-x: visible;\n        }\n\n        .scrollable-content {\n            top: 0;\n            left: 0;\n            width: 100%;\n            height: 100%;\n            max-width: 100vw;\n            max-height: 100vh;\n            position: absolute;\n        }\n\n        .scrollable-content ::ng-deep > * {\n            box-sizing: border-box;\n        }\n\n        :host.horizontal {\n            white-space: nowrap;\n        }\n\n        :host.horizontal .scrollable-content {\n            display: flex;\n        }\n\n        :host.horizontal .scrollable-content ::ng-deep > * {\n            flex-shrink: 0;\n            flex-grow: 0;\n            white-space: initial;\n        }\n\n        :host.horizontal.rtl .scrollable-content ::ng-deep > * {\n            transform: scaleX(-1);\n        }\n\n        .total-padding {\n            width: 1px;\n            opacity: 0;\n        }\n\n        :host.horizontal .total-padding {\n            height: 100%;\n        }\n    `]\n})\nexport class VirtualScrollerComponent implements OnInit, OnChanges, OnDestroy {\n    public viewPortItems: any[];\n    public window = window;\n\n    public get viewPortInfo(): IPageInfo {\n        let pageInfo: IViewport = this.previousViewPort || <any>{};\n        return {\n            startIndex: pageInfo.startIndex || 0,\n            endIndex: pageInfo.endIndex || 0,\n            scrollStartPosition: pageInfo.scrollStartPosition || 0,\n            scrollEndPosition: pageInfo.scrollEndPosition || 0,\n            maxScrollPosition: pageInfo.maxScrollPosition || 0,\n            startIndexWithBuffer: pageInfo.startIndexWithBuffer || 0,\n            endIndexWithBuffer: pageInfo.endIndexWithBuffer || 0\n        };\n    }\n\n    @Input()\n    public executeRefreshOutsideAngularZone: boolean = false;\n\n    protected _enableUnequalChildrenSizes: boolean = false;\n    @Input()\n    public get enableUnequalChildrenSizes(): boolean {\n        return this._enableUnequalChildrenSizes;\n    }\n\n    public set enableUnequalChildrenSizes(value: boolean) {\n        if (this._enableUnequalChildrenSizes === value) {\n            return;\n        }\n\n        this._enableUnequalChildrenSizes = value;\n        this.minMeasuredChildWidth = undefined;\n        this.minMeasuredChildHeight = undefined;\n    }\n\n    @Input()\n    public RTL: boolean = false;\n\n    @Input()\n    public useMarginInsteadOfTranslate: boolean = false;\n\n    @Input()\n    public modifyOverflowStyleOfParentScroll: boolean;\n\n    @Input()\n    public stripedTable: boolean;\n\n    @Input()\n    public scrollbarWidth: number;\n\n    @Input()\n    public scrollbarHeight: number;\n\n    @Input()\n    public childWidth: number;\n\n    @Input()\n    public childHeight: number;\n\n    @Input()\n    public ssrChildWidth: number;\n\n    @Input()\n    public ssrChildHeight: number;\n\n    @Input()\n    public ssrViewportWidth: number = 1920;\n\n    @Input()\n    public ssrViewportHeight: number = 1080;\n\n    protected _bufferAmount: number;\n    @Input()\n    public get bufferAmount(): number {\n        if (typeof (this._bufferAmount) === 'number' && this._bufferAmount >= 0) {\n            return this._bufferAmount;\n        } else {\n            return this.enableUnequalChildrenSizes ? 5 : 0;\n        }\n    }\n\n    public set bufferAmount(value: number) {\n        this._bufferAmount = value;\n    }\n\n    @Input()\n    public scrollAnimationTime: number;\n\n    @Input()\n    public resizeBypassRefreshThreshold: number;\n\n    protected _scrollThrottlingTime: number;\n    @Input()\n    public get scrollThrottlingTime(): number {\n        return this._scrollThrottlingTime;\n    }\n\n    public set scrollThrottlingTime(value: number) {\n        this._scrollThrottlingTime = value;\n        this.updateOnScrollFunction();\n    }\n\n    protected _scrollDebounceTime: number;\n    @Input()\n    public get scrollDebounceTime(): number {\n        return this._scrollDebounceTime;\n    }\n\n    public set scrollDebounceTime(value: number) {\n        this._scrollDebounceTime = value;\n        this.updateOnScrollFunction();\n    }\n\n    protected onScroll: () => void;\n\n    protected updateOnScrollFunction(): void {\n        if (this.scrollDebounceTime) {\n            this.onScroll = <any>this.debounce(() => {\n                this.refresh_internal(false);\n            }, this.scrollDebounceTime);\n        } else if (this.scrollThrottlingTime) {\n            this.onScroll = <any>this.throttleTrailing(() => {\n                this.refresh_internal(false);\n            }, this.scrollThrottlingTime);\n        } else {\n            this.onScroll = () => {\n                this.refresh_internal(false);\n            };\n        }\n    }\n\n    protected checkScrollElementResizedTimer: number;\n    protected _checkResizeInterval: number;\n    @Input()\n    public get checkResizeInterval(): number {\n        return this._checkResizeInterval;\n    }\n\n    public set checkResizeInterval(value: number) {\n        if (this._checkResizeInterval === value) {\n            return;\n        }\n\n        this._checkResizeInterval = value;\n        this.addScrollEventHandlers();\n    }\n\n    protected _items: any[] = [];\n    @Input()\n    public get items(): any[] {\n        return this._items;\n    }\n\n    public set items(value: any[]) {\n        if (value === this._items) {\n            return;\n        }\n\n        this._items = value || [];\n        this.refresh_internal(true);\n    }\n\n    @Input()\n    public compareItems: (item1: any, item2: any) => boolean = (item1: any, item2: any) => item1 === item2;\n\n    protected _horizontal: boolean;\n    @Input()\n    public get horizontal(): boolean {\n        return this._horizontal;\n    }\n\n    public set horizontal(value: boolean) {\n        this._horizontal = value;\n        this.updateDirection();\n    }\n\n    protected revertParentOverscroll(): void {\n        const scrollElement = this.getScrollElement();\n        if (scrollElement && this.oldParentScrollOverflow) {\n            scrollElement.style['overflow-y'] = this.oldParentScrollOverflow.y;\n            scrollElement.style['overflow-x'] = this.oldParentScrollOverflow.x;\n        }\n\n        this.oldParentScrollOverflow = undefined;\n    }\n\n    protected oldParentScrollOverflow: { x: string, y: string };\n    protected _parentScroll: Element | Window;\n    @Input()\n    public get parentScroll(): Element | Window {\n        return this._parentScroll;\n    }\n\n    public set parentScroll(value: Element | Window) {\n        if (this._parentScroll === value) {\n            return;\n        }\n\n        this.revertParentOverscroll();\n        this._parentScroll = value;\n        this.addScrollEventHandlers();\n\n        const scrollElement = this.getScrollElement();\n        if (this.modifyOverflowStyleOfParentScroll && scrollElement !== this.element.nativeElement) {\n            this.oldParentScrollOverflow = {x: scrollElement.style['overflow-x'], y: scrollElement.style['overflow-y']};\n            scrollElement.style['overflow-y'] = this.horizontal ? 'visible' : 'auto';\n            scrollElement.style['overflow-x'] = this.horizontal ? 'auto' : 'visible';\n        }\n    }\n\n    @Output()\n    public vsUpdate: EventEmitter<any[]> = new EventEmitter<any[]>();\n\n    @Output()\n    public vsChange: EventEmitter<IPageInfo> = new EventEmitter<IPageInfo>();\n\n    @Output()\n    public vsStart: EventEmitter<IPageInfo> = new EventEmitter<IPageInfo>();\n\n    @Output()\n    public vsEnd: EventEmitter<IPageInfo> = new EventEmitter<IPageInfo>();\n\n    @ViewChild('content', {read: ElementRef, static: true})\n    protected contentElementRef: ElementRef;\n\n    @ViewChild('invisiblePadding', {read: ElementRef, static: true})\n    protected invisiblePaddingElementRef: ElementRef;\n\n    @ContentChild('header', {read: ElementRef, static: false})\n    protected headerElementRef: ElementRef;\n\n    @ContentChild('container', {read: ElementRef, static: false})\n    protected containerElementRef: ElementRef;\n\n    public ngOnInit(): void {\n        this.addScrollEventHandlers();\n    }\n\n    public ngOnDestroy(): void {\n        this.removeScrollEventHandlers();\n        this.revertParentOverscroll();\n    }\n\n    public ngOnChanges(changes: any): void {\n        let indexLengthChanged = this.cachedItemsLength !== this.items.length;\n        this.cachedItemsLength = this.items.length;\n\n        const firstRun: boolean = !changes.items || !changes.items.previousValue || changes.items.previousValue.length === 0;\n        this.refresh_internal(indexLengthChanged || firstRun);\n    }\n\n    public ngDoCheck(): void {\n        if (this.cachedItemsLength !== this.items.length) {\n            this.cachedItemsLength = this.items.length;\n            this.refresh_internal(true);\n            return;\n        }\n\n        if (this.previousViewPort && this.viewPortItems && this.viewPortItems.length > 0) {\n            let itemsArrayChanged = false;\n            for (let i = 0; i < this.viewPortItems.length; ++i) {\n                if (!this.compareItems(this.items[this.previousViewPort.startIndexWithBuffer + i], this.viewPortItems[i])) {\n                    itemsArrayChanged = true;\n                    break;\n                }\n            }\n            if (itemsArrayChanged) {\n                this.refresh_internal(true);\n            }\n        }\n    }\n\n    public refresh(): void {\n        this.refresh_internal(true);\n    }\n\n    public invalidateAllCachedMeasurements(): void {\n        this.wrapGroupDimensions = {\n            maxChildSizePerWrapGroup: [],\n            numberOfKnownWrapGroupChildSizes: 0,\n            sumOfKnownWrapGroupChildWidths: 0,\n            sumOfKnownWrapGroupChildHeights: 0\n        };\n\n        this.minMeasuredChildWidth = undefined;\n        this.minMeasuredChildHeight = undefined;\n\n        this.refresh_internal(false);\n    }\n\n    public invalidateCachedMeasurementForItem(item: any): void {\n        if (this.enableUnequalChildrenSizes) {\n            let index = this.items && this.items.indexOf(item);\n            if (index >= 0) {\n                this.invalidateCachedMeasurementAtIndex(index);\n            }\n        } else {\n            this.minMeasuredChildWidth = undefined;\n            this.minMeasuredChildHeight = undefined;\n        }\n\n        this.refresh_internal(false);\n    }\n\n    public invalidateCachedMeasurementAtIndex(index: number): void {\n        if (this.enableUnequalChildrenSizes) {\n            let cachedMeasurement = this.wrapGroupDimensions.maxChildSizePerWrapGroup[index];\n            if (cachedMeasurement) {\n                this.wrapGroupDimensions.maxChildSizePerWrapGroup[index] = undefined;\n                --this.wrapGroupDimensions.numberOfKnownWrapGroupChildSizes;\n                this.wrapGroupDimensions.sumOfKnownWrapGroupChildWidths -= cachedMeasurement.childWidth || 0;\n                this.wrapGroupDimensions.sumOfKnownWrapGroupChildHeights -= cachedMeasurement.childHeight || 0;\n            }\n        } else {\n            this.minMeasuredChildWidth = undefined;\n            this.minMeasuredChildHeight = undefined;\n        }\n\n        this.refresh_internal(false);\n    }\n\n    public scrollInto(item: any, alignToBeginning: boolean = true, additionalOffset: number = 0, animationMilliseconds: number = undefined, animationCompletedCallback: () => void = undefined): void {\n        let index: number = this.items.indexOf(item);\n        if (index === -1) {\n            return;\n        }\n\n        this.scrollToIndex(index, alignToBeginning, additionalOffset, animationMilliseconds, animationCompletedCallback);\n    }\n\n    public scrollToIndex(index: number, alignToBeginning: boolean = true, additionalOffset: number = 0, animationMilliseconds: number = undefined, animationCompletedCallback: () => void = undefined): void {\n        let maxRetries: number = 5;\n\n        let retryIfNeeded = () => {\n            --maxRetries;\n            if (maxRetries <= 0) {\n                if (animationCompletedCallback) {\n                    animationCompletedCallback();\n                }\n                return;\n            }\n\n            let dimensions = this.calculateDimensions();\n            let desiredStartIndex = Math.min(Math.max(index, 0), dimensions.itemCount - 1);\n            if (this.previousViewPort.startIndex === desiredStartIndex) {\n                if (animationCompletedCallback) {\n                    animationCompletedCallback();\n                }\n                return;\n            }\n\n            this.scrollToIndex_internal(index, alignToBeginning, additionalOffset, 0, retryIfNeeded);\n        };\n\n        this.scrollToIndex_internal(index, alignToBeginning, additionalOffset, animationMilliseconds, retryIfNeeded);\n    }\n\n    protected scrollToIndex_internal(index: number, alignToBeginning: boolean = true, additionalOffset: number = 0, animationMilliseconds: number = undefined, animationCompletedCallback: () => void = undefined): void {\n        animationMilliseconds = animationMilliseconds === undefined ? this.scrollAnimationTime : animationMilliseconds;\n\n        let dimensions = this.calculateDimensions();\n        let scroll = this.calculatePadding(index, dimensions) + additionalOffset;\n        if (!alignToBeginning) {\n            scroll -= dimensions.wrapGroupsPerPage * dimensions[this._childScrollDim];\n        }\n\n        this.scrollToPosition(scroll, animationMilliseconds, animationCompletedCallback);\n    }\n\n    public scrollToPosition(scrollPosition: number, animationMilliseconds: number = undefined, animationCompletedCallback: () => void = undefined): void {\n        scrollPosition += this.getElementsOffset();\n\n        animationMilliseconds = animationMilliseconds === undefined ? this.scrollAnimationTime : animationMilliseconds;\n\n        let scrollElement = this.getScrollElement();\n\n        let animationRequest: number;\n\n        if (this.currentTween) {\n            this.currentTween.stop();\n            this.currentTween = undefined;\n        }\n\n        if (!animationMilliseconds) {\n            this.renderer.setProperty(scrollElement, this._scrollType, scrollPosition);\n            this.refresh_internal(false, animationCompletedCallback);\n            return;\n        }\n\n        const tweenConfigObj = {scrollPosition: scrollElement[this._scrollType]};\n\n        let newTween = new tween.Tween(tweenConfigObj)\n            .to({scrollPosition}, animationMilliseconds)\n            .easing(tween.Easing.Quadratic.Out)\n            .onUpdate((data) => {\n                if (isNaN(data.scrollPosition)) {\n                    return;\n                }\n                this.renderer.setProperty(scrollElement, this._scrollType, data.scrollPosition);\n                this.refresh_internal(false);\n            })\n            .onStop(() => {\n                cancelAnimationFrame(animationRequest);\n            })\n            .start();\n\n        const animate = (time?: number) => {\n            if (!newTween['isPlaying']()) {\n                return;\n            }\n\n            newTween.update(time);\n            if (tweenConfigObj.scrollPosition === scrollPosition) {\n                this.refresh_internal(false, animationCompletedCallback);\n                return;\n            }\n\n            this.zone.runOutsideAngular(() => {\n                animationRequest = requestAnimationFrame(animate);\n            });\n        };\n\n        animate();\n        this.currentTween = newTween;\n    }\n\n    protected isAngularUniversalSSR: boolean;\n\n    constructor(\n        protected readonly element: ElementRef,\n        protected readonly renderer: Renderer2,\n        protected readonly zone: NgZone,\n        protected changeDetectorRef: ChangeDetectorRef,\n        @Inject(PLATFORM_ID) platformId: Object,\n        @Optional() @Inject('virtual-scroller-default-options')\n            options: VirtualScrollerDefaultOptions\n    ) {\n\n        this.isAngularUniversalSSR = isPlatformServer(platformId);\n\n        this.checkResizeInterval = options.checkResizeInterval;\n        this.modifyOverflowStyleOfParentScroll = options.modifyOverflowStyleOfParentScroll;\n        this.resizeBypassRefreshThreshold = options.resizeBypassRefreshThreshold;\n        this.scrollAnimationTime = options.scrollAnimationTime;\n        this.scrollDebounceTime = options.scrollDebounceTime;\n        this.scrollThrottlingTime = options.scrollThrottlingTime;\n        this.scrollbarHeight = options.scrollbarHeight;\n        this.scrollbarWidth = options.scrollbarWidth;\n        this.stripedTable = options.stripedTable;\n\n        this.horizontal = false;\n        this.resetWrapGroupDimensions();\n    }\n\n    protected getElementSize(element: HTMLElement): any {\n        let result = element.getBoundingClientRect();\n        let styles = getComputedStyle(element);\n        let marginTop = parseInt(styles['margin-top'], 10) || 0;\n        let marginBottom = parseInt(styles['margin-bottom'], 10) || 0;\n        let marginLeft = parseInt(styles['margin-left'], 10) || 0;\n        let marginRight = parseInt(styles['margin-right'], 10) || 0;\n\n        return {\n            top: result.top + marginTop,\n            bottom: result.bottom + marginBottom,\n            left: result.left + marginLeft,\n            right: result.right + marginRight,\n            width: result.width + marginLeft + marginRight,\n            height: result.height + marginTop + marginBottom\n        };\n    }\n\n    protected previousScrollBoundingRect: ClientRect;\n\n    protected checkScrollElementResized(): void {\n        let boundingRect = this.getElementSize(this.getScrollElement());\n\n        let sizeChanged: boolean;\n        if (!this.previousScrollBoundingRect) {\n            sizeChanged = true;\n        } else {\n            let widthChange = Math.abs(boundingRect.width - this.previousScrollBoundingRect.width);\n            let heightChange = Math.abs(boundingRect.height - this.previousScrollBoundingRect.height);\n            sizeChanged = widthChange > this.resizeBypassRefreshThreshold || heightChange > this.resizeBypassRefreshThreshold;\n        }\n\n        if (sizeChanged) {\n            this.previousScrollBoundingRect = boundingRect;\n            if (boundingRect.width > 0 && boundingRect.height > 0) {\n                this.refresh_internal(false);\n            }\n        }\n    }\n\n    protected _invisiblePaddingProperty;\n    protected _offsetType;\n    protected _scrollType;\n    protected _pageOffsetType;\n    protected _childScrollDim;\n    protected _translateDir;\n    protected _marginDir;\n\n    protected updateDirection(): void {\n        if (this.horizontal) {\n            this._childScrollDim = 'childWidth';\n            this._invisiblePaddingProperty = 'width';\n            this._marginDir = 'margin-left';\n            this._offsetType = 'offsetLeft';\n            this._pageOffsetType = 'pageXOffset';\n            this._scrollType = 'scrollLeft';\n            this._translateDir = 'translateX';\n        } else {\n            this._childScrollDim = 'childHeight';\n            this._invisiblePaddingProperty = 'height';\n            this._marginDir = 'margin-top';\n            this._offsetType = 'offsetTop';\n            this._pageOffsetType = 'pageYOffset';\n            this._scrollType = 'scrollTop';\n            this._translateDir = 'translateY';\n        }\n    }\n\n    protected debounce(func: Function, wait: number): Function {\n        const throttled = this.throttleTrailing(func, wait);\n        const result = function () {\n            throttled['cancel']();\n            throttled.apply(this, arguments);\n        };\n        result['cancel'] = function () {\n            throttled['cancel']();\n        };\n\n        return result;\n    }\n\n    protected throttleTrailing(func: Function, wait: number): Function {\n        let timeout = undefined;\n        let _arguments = arguments;\n        const result = function () {\n            const _this = this;\n            _arguments = arguments\n\n            if (timeout) {\n                return;\n            }\n\n            if (wait <= 0) {\n                func.apply(_this, _arguments);\n            } else {\n                timeout = setTimeout(function () {\n                    timeout = undefined;\n                    func.apply(_this, _arguments);\n                }, wait);\n            }\n        };\n        result['cancel'] = function () {\n            if (timeout) {\n                clearTimeout(timeout);\n                timeout = undefined;\n            }\n        };\n\n        return result;\n    }\n\n    protected calculatedScrollbarWidth: number = 0;\n    protected calculatedScrollbarHeight: number = 0;\n\n    protected padding: number = 0;\n    protected previousViewPort: IViewport = <any>{};\n    protected currentTween: tween.Tween<any>;\n    protected cachedItemsLength: number;\n\n    protected disposeScrollHandler: () => void | undefined;\n    protected disposeResizeHandler: () => void | undefined;\n\n    protected refresh_internal(itemsArrayModified: boolean, refreshCompletedCallback: () => void = undefined, maxRunTimes: number = 2): void {\n        //note: maxRunTimes is to force it to keep recalculating if the previous iteration caused a re-render (different sliced items in viewport or scrollPosition changed).\n        //The default of 2x max will probably be accurate enough without causing too large a performance bottleneck\n        //The code would typically quit out on the 2nd iteration anyways. The main time it'd think more than 2 runs would be necessary would be for vastly different sized child items or if this is the 1st time the items array was initialized.\n        //Without maxRunTimes, If the user is actively scrolling this code would become an infinite loop until they stopped scrolling. This would be okay, except each scroll event would start an additional infinte loop. We want to short-circuit it to prevent this.\n\n        if (itemsArrayModified && this.previousViewPort && this.previousViewPort.scrollStartPosition > 0) {\n            //if items were prepended, scroll forward to keep same items visible\n            let oldViewPort = this.previousViewPort;\n            let oldViewPortItems = this.viewPortItems;\n\n            let oldRefreshCompletedCallback = refreshCompletedCallback;\n            refreshCompletedCallback = () => {\n                let scrollLengthDelta = this.previousViewPort.scrollLength - oldViewPort.scrollLength;\n                if (scrollLengthDelta > 0 && this.viewPortItems) {\n                    let oldStartItem = oldViewPortItems[0];\n                    let oldStartItemIndex = this.items.findIndex(x => this.compareItems(oldStartItem, x));\n                    if (oldStartItemIndex > this.previousViewPort.startIndexWithBuffer) {\n                        let itemOrderChanged = false;\n                        for (let i = 1; i < this.viewPortItems.length; ++i) {\n                            if (!this.compareItems(this.items[oldStartItemIndex + i], oldViewPortItems[i])) {\n                                itemOrderChanged = true;\n                                break;\n                            }\n                        }\n\n                        if (!itemOrderChanged) {\n                            this.scrollToPosition(this.previousViewPort.scrollStartPosition + scrollLengthDelta, 0, oldRefreshCompletedCallback);\n                            return;\n                        }\n                    }\n                }\n\n                if (oldRefreshCompletedCallback) {\n                    oldRefreshCompletedCallback();\n                }\n            };\n        }\n\n        this.zone.runOutsideAngular(() => {\n            requestAnimationFrame(() => {\n\n                if (itemsArrayModified) {\n                    this.resetWrapGroupDimensions();\n                }\n                let viewport = this.calculateViewport();\n\n                let startChanged = itemsArrayModified || viewport.startIndex !== this.previousViewPort.startIndex;\n                let endChanged = itemsArrayModified || viewport.endIndex !== this.previousViewPort.endIndex;\n                let scrollbarLengthChanged = viewport.scrollbarLength !== this.previousViewPort.scrollbarLength;\n                let paddingChanged = viewport.padding !== this.previousViewPort.padding;\n                let scrollPositionChanged = viewport.scrollStartPosition !== this.previousViewPort.scrollStartPosition || viewport.scrollEndPosition !== this.previousViewPort.scrollEndPosition || viewport.maxScrollPosition !== this.previousViewPort.maxScrollPosition;\n\n                this.previousViewPort = viewport;\n\n                if (scrollbarLengthChanged) {\n                    this.renderer.setStyle(this.invisiblePaddingElementRef.nativeElement, this._invisiblePaddingProperty, `${viewport.scrollLength}px`);\n                }\n\n                if (paddingChanged) {\n                    if (this.useMarginInsteadOfTranslate) {\n                        this.renderer.setStyle(this.contentElementRef.nativeElement, this._marginDir, `${viewport.padding}px`);\n                    } else {\n                        this.renderer.setStyle(this.contentElementRef.nativeElement, 'transform', `${this._translateDir}(${viewport.padding}px)`);\n                        this.renderer.setStyle(this.contentElementRef.nativeElement, 'webkitTransform', `${this._translateDir}(${viewport.padding}px)`);\n                    }\n                }\n\n                if (this.headerElementRef) {\n                    let scrollPosition = this.getScrollElement()[this._scrollType];\n                    let containerOffset = this.getElementsOffset();\n                    let offset = Math.max(scrollPosition - viewport.padding - containerOffset + this.headerElementRef.nativeElement.clientHeight, 0);\n                    this.renderer.setStyle(this.headerElementRef.nativeElement, 'transform', `${this._translateDir}(${offset}px)`);\n                    this.renderer.setStyle(this.headerElementRef.nativeElement, 'webkitTransform', `${this._translateDir}(${offset}px)`);\n                }\n\n                const changeEventArg: IPageInfo = (startChanged || endChanged) ? {\n                    startIndex: viewport.startIndex,\n                    endIndex: viewport.endIndex,\n                    scrollStartPosition: viewport.scrollStartPosition,\n                    scrollEndPosition: viewport.scrollEndPosition,\n                    startIndexWithBuffer: viewport.startIndexWithBuffer,\n                    endIndexWithBuffer: viewport.endIndexWithBuffer,\n                    maxScrollPosition: viewport.maxScrollPosition\n                } : undefined;\n\n\n                if (startChanged || endChanged || scrollPositionChanged) {\n                    const handleChanged = () => {\n                        // update the scroll list to trigger re-render of components in viewport\n                        this.viewPortItems = viewport.startIndexWithBuffer >= 0 && viewport.endIndexWithBuffer >= 0 ? this.items.slice(viewport.startIndexWithBuffer, viewport.endIndexWithBuffer + 1) : [];\n                        this.vsUpdate.emit(this.viewPortItems);\n\n                        if (startChanged) {\n                            this.vsStart.emit(changeEventArg);\n                        }\n\n                        if (endChanged) {\n                            this.vsEnd.emit(changeEventArg);\n                        }\n\n                        if (startChanged || endChanged) {\n                            this.changeDetectorRef.markForCheck();\n                            this.vsChange.emit(changeEventArg);\n                        }\n\n                        if (maxRunTimes > 0) {\n                            this.refresh_internal(false, refreshCompletedCallback, maxRunTimes - 1);\n                            return;\n                        }\n\n                        if (refreshCompletedCallback) {\n                            refreshCompletedCallback();\n                        }\n                    };\n\n\n                    if (this.executeRefreshOutsideAngularZone) {\n                        handleChanged();\n                    } else {\n                        this.zone.run(handleChanged);\n                    }\n                } else {\n                    if (maxRunTimes > 0 && (scrollbarLengthChanged || paddingChanged)) {\n                        this.refresh_internal(false, refreshCompletedCallback, maxRunTimes - 1);\n                        return;\n                    }\n\n                    if (refreshCompletedCallback) {\n                        refreshCompletedCallback();\n                    }\n                }\n            });\n        });\n    }\n\n    protected getScrollElement(): HTMLElement {\n        return this.parentScroll instanceof Window ? document.scrollingElement || document.documentElement || document.body : this.parentScroll || this.element.nativeElement;\n    }\n\n    protected addScrollEventHandlers(): void {\n        if (this.isAngularUniversalSSR) {\n            return;\n        }\n\n        let scrollElement = this.getScrollElement();\n\n        this.removeScrollEventHandlers();\n\n        this.zone.runOutsideAngular(() => {\n            if (this.parentScroll instanceof Window) {\n                this.disposeScrollHandler = this.renderer.listen('window', 'scroll', this.onScroll);\n                this.disposeResizeHandler = this.renderer.listen('window', 'resize', this.onScroll);\n            } else {\n                this.disposeScrollHandler = this.renderer.listen(scrollElement, 'scroll', this.onScroll);\n                if (this._checkResizeInterval > 0) {\n                    this.checkScrollElementResizedTimer = <any>setInterval(() => {\n                        this.checkScrollElementResized();\n                    }, this._checkResizeInterval);\n                }\n            }\n        });\n    }\n\n    protected removeScrollEventHandlers(): void {\n        if (this.checkScrollElementResizedTimer) {\n            clearInterval(this.checkScrollElementResizedTimer);\n        }\n\n        if (this.disposeScrollHandler) {\n            this.disposeScrollHandler();\n            this.disposeScrollHandler = undefined;\n        }\n\n        if (this.disposeResizeHandler) {\n            this.disposeResizeHandler();\n            this.disposeResizeHandler = undefined;\n        }\n    }\n\n    protected getElementsOffset(): number {\n        if (this.isAngularUniversalSSR) {\n            return 0;\n        }\n\n        let offset = 0;\n\n        if (this.containerElementRef && this.containerElementRef.nativeElement) {\n            offset += this.containerElementRef.nativeElement[this._offsetType];\n        }\n\n        if (this.parentScroll) {\n            let scrollElement = this.getScrollElement();\n            let elementClientRect = this.getElementSize(this.element.nativeElement);\n            let scrollClientRect = this.getElementSize(scrollElement);\n            if (this.horizontal) {\n                offset += elementClientRect.left - scrollClientRect.left;\n            } else {\n                offset += elementClientRect.top - scrollClientRect.top;\n            }\n\n            if (!(this.parentScroll instanceof Window)) {\n                offset += scrollElement[this._scrollType];\n            }\n        }\n\n        return offset;\n    }\n\n    protected countItemsPerWrapGroup(): number {\n        if (this.isAngularUniversalSSR) {\n            return Math.round(this.horizontal ? this.ssrViewportHeight / this.ssrChildHeight : this.ssrViewportWidth / this.ssrChildWidth);\n        }\n\n        let propertyName = this.horizontal ? 'offsetLeft' : 'offsetTop';\n        let children = ((this.containerElementRef && this.containerElementRef.nativeElement) || this.contentElementRef.nativeElement).children;\n\n        let childrenLength = children ? children.length : 0;\n        if (childrenLength === 0) {\n            return 1;\n        }\n\n        let firstOffset = children[0][propertyName];\n        let result = 1;\n        while (result < childrenLength && firstOffset === children[result][propertyName]) {\n            ++result;\n        }\n\n        return result;\n    }\n\n    protected getScrollStartPosition(): number {\n        let windowScrollValue = undefined;\n        if (this.parentScroll instanceof Window) {\n            windowScrollValue = window[this._pageOffsetType];\n        }\n\n        return windowScrollValue || this.getScrollElement()[this._scrollType] || 0;\n    }\n\n    protected minMeasuredChildWidth: number;\n    protected minMeasuredChildHeight: number;\n\n    protected wrapGroupDimensions: WrapGroupDimensions;\n\n    protected resetWrapGroupDimensions(): void {\n        const oldWrapGroupDimensions = this.wrapGroupDimensions;\n        this.invalidateAllCachedMeasurements();\n\n        if (!this.enableUnequalChildrenSizes || !oldWrapGroupDimensions || oldWrapGroupDimensions.numberOfKnownWrapGroupChildSizes === 0) {\n            return;\n        }\n\n        const itemsPerWrapGroup: number = this.countItemsPerWrapGroup();\n        for (let wrapGroupIndex = 0; wrapGroupIndex < oldWrapGroupDimensions.maxChildSizePerWrapGroup.length; ++wrapGroupIndex) {\n            const oldWrapGroupDimension: WrapGroupDimension = oldWrapGroupDimensions.maxChildSizePerWrapGroup[wrapGroupIndex];\n            if (!oldWrapGroupDimension || !oldWrapGroupDimension.items || !oldWrapGroupDimension.items.length) {\n                continue;\n            }\n\n            if (oldWrapGroupDimension.items.length !== itemsPerWrapGroup) {\n                return;\n            }\n\n            let itemsChanged = false;\n            let arrayStartIndex = itemsPerWrapGroup * wrapGroupIndex;\n            for (let i = 0; i < itemsPerWrapGroup; ++i) {\n                if (!this.compareItems(oldWrapGroupDimension.items[i], this.items[arrayStartIndex + i])) {\n                    itemsChanged = true;\n                    break;\n                }\n            }\n\n            if (!itemsChanged) {\n                ++this.wrapGroupDimensions.numberOfKnownWrapGroupChildSizes;\n                this.wrapGroupDimensions.sumOfKnownWrapGroupChildWidths += oldWrapGroupDimension.childWidth || 0;\n                this.wrapGroupDimensions.sumOfKnownWrapGroupChildHeights += oldWrapGroupDimension.childHeight || 0;\n                this.wrapGroupDimensions.maxChildSizePerWrapGroup[wrapGroupIndex] = oldWrapGroupDimension;\n            }\n        }\n    }\n\n    protected calculateDimensions(): IDimensions {\n        let scrollElement = this.getScrollElement();\n\n        const maxCalculatedScrollBarSize: number = 25; // Note: Formula to auto-calculate doesn't work for ParentScroll, so we default to this if not set by consuming application\n        this.calculatedScrollbarHeight = Math.max(Math.min(scrollElement.offsetHeight - scrollElement.clientHeight, maxCalculatedScrollBarSize), this.calculatedScrollbarHeight);\n        this.calculatedScrollbarWidth = Math.max(Math.min(scrollElement.offsetWidth - scrollElement.clientWidth, maxCalculatedScrollBarSize), this.calculatedScrollbarWidth);\n\n        let viewportWidth = scrollElement.offsetWidth - (this.scrollbarWidth || this.calculatedScrollbarWidth || (this.horizontal ? 0 : maxCalculatedScrollBarSize));\n        let viewportHeight = scrollElement.offsetHeight - (this.scrollbarHeight || this.calculatedScrollbarHeight || (this.horizontal ? maxCalculatedScrollBarSize : 0));\n\n        let content = (this.containerElementRef && this.containerElementRef.nativeElement) || this.contentElementRef.nativeElement;\n\n        let itemsPerWrapGroup = this.countItemsPerWrapGroup();\n        let wrapGroupsPerPage;\n\n        let defaultChildWidth;\n        let defaultChildHeight;\n\n        if (this.isAngularUniversalSSR) {\n            viewportWidth = this.ssrViewportWidth;\n            viewportHeight = this.ssrViewportHeight;\n            defaultChildWidth = this.ssrChildWidth;\n            defaultChildHeight = this.ssrChildHeight;\n            let itemsPerRow = Math.max(Math.ceil(viewportWidth / defaultChildWidth), 1);\n            let itemsPerCol = Math.max(Math.ceil(viewportHeight / defaultChildHeight), 1);\n            wrapGroupsPerPage = this.horizontal ? itemsPerRow : itemsPerCol;\n        } else if (!this.enableUnequalChildrenSizes) {\n            if (content.children.length > 0) {\n                if (!this.childWidth || !this.childHeight) {\n                    if (!this.minMeasuredChildWidth && viewportWidth > 0) {\n                        this.minMeasuredChildWidth = viewportWidth;\n                    }\n                    if (!this.minMeasuredChildHeight && viewportHeight > 0) {\n                        this.minMeasuredChildHeight = viewportHeight;\n                    }\n                }\n\n                let child = content.children[0];\n                let clientRect = this.getElementSize(child);\n                this.minMeasuredChildWidth = Math.min(this.minMeasuredChildWidth, clientRect.width);\n                this.minMeasuredChildHeight = Math.min(this.minMeasuredChildHeight, clientRect.height);\n            }\n\n            defaultChildWidth = this.childWidth || this.minMeasuredChildWidth || viewportWidth;\n            defaultChildHeight = this.childHeight || this.minMeasuredChildHeight || viewportHeight;\n            let itemsPerRow = Math.max(Math.ceil(viewportWidth / defaultChildWidth), 1);\n            let itemsPerCol = Math.max(Math.ceil(viewportHeight / defaultChildHeight), 1);\n            wrapGroupsPerPage = this.horizontal ? itemsPerRow : itemsPerCol;\n        } else {\n            let scrollOffset = scrollElement[this._scrollType] - (this.previousViewPort ? this.previousViewPort.padding : 0);\n\n            let arrayStartIndex = this.previousViewPort.startIndexWithBuffer || 0;\n            let wrapGroupIndex = Math.ceil(arrayStartIndex / itemsPerWrapGroup);\n\n            let maxWidthForWrapGroup = 0;\n            let maxHeightForWrapGroup = 0;\n            let sumOfVisibleMaxWidths = 0;\n            let sumOfVisibleMaxHeights = 0;\n            wrapGroupsPerPage = 0;\n\n            for (let i = 0; i < content.children.length; ++i) {\n                ++arrayStartIndex;\n                let child = content.children[i];\n                let clientRect = this.getElementSize(child);\n\n                maxWidthForWrapGroup = Math.max(maxWidthForWrapGroup, clientRect.width);\n                maxHeightForWrapGroup = Math.max(maxHeightForWrapGroup, clientRect.height);\n\n                if (arrayStartIndex % itemsPerWrapGroup === 0) {\n                    let oldValue = this.wrapGroupDimensions.maxChildSizePerWrapGroup[wrapGroupIndex];\n                    if (oldValue) {\n                        --this.wrapGroupDimensions.numberOfKnownWrapGroupChildSizes;\n                        this.wrapGroupDimensions.sumOfKnownWrapGroupChildWidths -= oldValue.childWidth || 0;\n                        this.wrapGroupDimensions.sumOfKnownWrapGroupChildHeights -= oldValue.childHeight || 0;\n                    }\n\n                    ++this.wrapGroupDimensions.numberOfKnownWrapGroupChildSizes;\n                    const items = this.items.slice(arrayStartIndex - itemsPerWrapGroup, arrayStartIndex);\n                    this.wrapGroupDimensions.maxChildSizePerWrapGroup[wrapGroupIndex] = {\n                        childWidth: maxWidthForWrapGroup,\n                        childHeight: maxHeightForWrapGroup,\n                        items: items\n                    };\n                    this.wrapGroupDimensions.sumOfKnownWrapGroupChildWidths += maxWidthForWrapGroup;\n                    this.wrapGroupDimensions.sumOfKnownWrapGroupChildHeights += maxHeightForWrapGroup;\n\n                    if (this.horizontal) {\n                        let maxVisibleWidthForWrapGroup = Math.min(maxWidthForWrapGroup, Math.max(viewportWidth - sumOfVisibleMaxWidths, 0));\n                        if (scrollOffset > 0) {\n                            let scrollOffsetToRemove = Math.min(scrollOffset, maxVisibleWidthForWrapGroup);\n                            maxVisibleWidthForWrapGroup -= scrollOffsetToRemove;\n                            scrollOffset -= scrollOffsetToRemove;\n                        }\n\n                        sumOfVisibleMaxWidths += maxVisibleWidthForWrapGroup;\n                        if (maxVisibleWidthForWrapGroup > 0 && viewportWidth >= sumOfVisibleMaxWidths) {\n                            ++wrapGroupsPerPage;\n                        }\n                    } else {\n                        let maxVisibleHeightForWrapGroup = Math.min(maxHeightForWrapGroup, Math.max(viewportHeight - sumOfVisibleMaxHeights, 0));\n                        if (scrollOffset > 0) {\n                            let scrollOffsetToRemove = Math.min(scrollOffset, maxVisibleHeightForWrapGroup);\n                            maxVisibleHeightForWrapGroup -= scrollOffsetToRemove;\n                            scrollOffset -= scrollOffsetToRemove;\n                        }\n\n                        sumOfVisibleMaxHeights += maxVisibleHeightForWrapGroup;\n                        if (maxVisibleHeightForWrapGroup > 0 && viewportHeight >= sumOfVisibleMaxHeights) {\n                            ++wrapGroupsPerPage;\n                        }\n                    }\n\n                    ++wrapGroupIndex;\n\n                    maxWidthForWrapGroup = 0;\n                    maxHeightForWrapGroup = 0;\n                }\n            }\n\n            let averageChildWidth = this.wrapGroupDimensions.sumOfKnownWrapGroupChildWidths / this.wrapGroupDimensions.numberOfKnownWrapGroupChildSizes;\n            let averageChildHeight = this.wrapGroupDimensions.sumOfKnownWrapGroupChildHeights / this.wrapGroupDimensions.numberOfKnownWrapGroupChildSizes;\n            defaultChildWidth = this.childWidth || averageChildWidth || viewportWidth;\n            defaultChildHeight = this.childHeight || averageChildHeight || viewportHeight;\n\n            if (this.horizontal) {\n                if (viewportWidth > sumOfVisibleMaxWidths) {\n                    wrapGroupsPerPage += Math.ceil((viewportWidth - sumOfVisibleMaxWidths) / defaultChildWidth);\n                }\n            } else {\n                if (viewportHeight > sumOfVisibleMaxHeights) {\n                    wrapGroupsPerPage += Math.ceil((viewportHeight - sumOfVisibleMaxHeights) / defaultChildHeight);\n                }\n            }\n        }\n\n        let itemCount = this.items.length;\n        let itemsPerPage = itemsPerWrapGroup * wrapGroupsPerPage;\n        let pageCount_fractional = itemCount / itemsPerPage;\n        let numberOfWrapGroups = Math.ceil(itemCount / itemsPerWrapGroup);\n\n        let scrollLength = 0;\n\n        let defaultScrollLengthPerWrapGroup = this.horizontal ? defaultChildWidth : defaultChildHeight;\n        if (this.enableUnequalChildrenSizes) {\n            let numUnknownChildSizes = 0;\n            for (let i = 0; i < numberOfWrapGroups; ++i) {\n                let childSize = this.wrapGroupDimensions.maxChildSizePerWrapGroup[i] && this.wrapGroupDimensions.maxChildSizePerWrapGroup[i][this._childScrollDim];\n                if (childSize) {\n                    scrollLength += childSize;\n                } else {\n                    ++numUnknownChildSizes;\n                }\n            }\n\n            scrollLength += Math.round(numUnknownChildSizes * defaultScrollLengthPerWrapGroup);\n        } else {\n            scrollLength = numberOfWrapGroups * defaultScrollLengthPerWrapGroup;\n        }\n\n        if (this.headerElementRef) {\n            scrollLength += this.headerElementRef.nativeElement.clientHeight;\n        }\n\n        let viewportLength = this.horizontal ? viewportWidth : viewportHeight;\n        let maxScrollPosition = Math.max(scrollLength - viewportLength, 0);\n\n        return {\n            childHeight: defaultChildHeight,\n            childWidth: defaultChildWidth,\n            itemCount: itemCount,\n            itemsPerPage: itemsPerPage,\n            itemsPerWrapGroup: itemsPerWrapGroup,\n            maxScrollPosition: maxScrollPosition,\n            pageCount_fractional: pageCount_fractional,\n            scrollLength: scrollLength,\n            viewportLength: viewportLength,\n            wrapGroupsPerPage: wrapGroupsPerPage,\n        };\n    }\n\n    protected cachedPageSize: number = 0;\n    protected previousScrollNumberElements: number = 0;\n\n    protected calculatePadding(arrayStartIndexWithBuffer: number, dimensions: IDimensions): number {\n        if (dimensions.itemCount === 0) {\n            return 0;\n        }\n\n        let defaultScrollLengthPerWrapGroup = dimensions[this._childScrollDim];\n        let startingWrapGroupIndex = Math.floor(arrayStartIndexWithBuffer / dimensions.itemsPerWrapGroup) || 0;\n\n        if (!this.enableUnequalChildrenSizes) {\n            return defaultScrollLengthPerWrapGroup * startingWrapGroupIndex;\n        }\n\n        let numUnknownChildSizes = 0;\n        let result = 0;\n        for (let i = 0; i < startingWrapGroupIndex; ++i) {\n            let childSize = this.wrapGroupDimensions.maxChildSizePerWrapGroup[i] && this.wrapGroupDimensions.maxChildSizePerWrapGroup[i][this._childScrollDim];\n            if (childSize) {\n                result += childSize;\n            } else {\n                ++numUnknownChildSizes;\n            }\n        }\n        result += Math.round(numUnknownChildSizes * defaultScrollLengthPerWrapGroup);\n\n        return result;\n    }\n\n    protected calculatePageInfo(scrollPosition: number, dimensions: IDimensions): IPageInfo {\n        let scrollPercentage = 0;\n        let scrollBottomPercentage = 1;\n        let arrayStartIndex = 0;\n        let arrayEndIndex = 0;\n        if (this.enableUnequalChildrenSizes) {\n            const numberOfWrapGroups = Math.ceil(dimensions.itemCount / dimensions.itemsPerWrapGroup);\n            let totalScrolledLength = 0;\n            let defaultScrollLengthPerWrapGroup = dimensions[this._childScrollDim];\n            let i = 0;\n            for (; i < numberOfWrapGroups; ++i) {\n                let childSize = this.wrapGroupDimensions.maxChildSizePerWrapGroup[i] && this.wrapGroupDimensions.maxChildSizePerWrapGroup[i][this._childScrollDim];\n                if (childSize) {\n                    totalScrolledLength += childSize;\n                } else {\n                    totalScrolledLength += defaultScrollLengthPerWrapGroup;\n                }\n\n                if (scrollPosition < totalScrolledLength) {\n                    scrollPercentage = i / numberOfWrapGroups;\n                    break;\n                }\n            }\n            let j = i + 1;\n            for (; j < numberOfWrapGroups; ++j) {\n                let childSize = this.wrapGroupDimensions.maxChildSizePerWrapGroup[j] && this.wrapGroupDimensions.maxChildSizePerWrapGroup[j][this._childScrollDim];\n                if (childSize) {\n                    totalScrolledLength += childSize;\n                }\n                else {\n                    totalScrolledLength += defaultScrollLengthPerWrapGroup;\n                }\n                if (scrollPosition + dimensions.viewportLength < totalScrolledLength) {\n                    scrollBottomPercentage = j / numberOfWrapGroups;\n                    break;\n                }\n            }\n            \n            arrayStartIndex = i;\n            arrayEndIndex = j\n        } else {\n            scrollPercentage = scrollPosition / dimensions.scrollLength;\n\n            let startingArrayIndex_fractional = Math.min(Math.max(scrollPercentage * dimensions.pageCount_fractional, 0), dimensions.pageCount_fractional) * dimensions.itemsPerPage;\n            let maxStart = dimensions.itemCount - dimensions.itemsPerPage - 1;\n            arrayStartIndex = Math.min(Math.floor(startingArrayIndex_fractional), maxStart);\n            arrayEndIndex = Math.ceil(startingArrayIndex_fractional) + dimensions.itemsPerPage - 1;\n        }\n\n        arrayStartIndex -= arrayStartIndex % dimensions.itemsPerWrapGroup; // round down to start of wrapGroup\n\n        if (this.stripedTable) {\n            let bufferBoundary = 2 * dimensions.itemsPerWrapGroup;\n            if (arrayStartIndex % bufferBoundary !== 0) {\n                arrayStartIndex = Math.max(arrayStartIndex - arrayStartIndex % bufferBoundary, 0);\n            }\n        }\n\n        let endIndexWithinWrapGroup = (arrayEndIndex + 1) % dimensions.itemsPerWrapGroup;\n        if (endIndexWithinWrapGroup > 0) {\n            arrayEndIndex += dimensions.itemsPerWrapGroup - endIndexWithinWrapGroup; // round up to end of wrapGroup\n        }\n\n        if (isNaN(arrayStartIndex)) {\n            arrayStartIndex = 0;\n        }\n        if (isNaN(arrayEndIndex)) {\n            arrayEndIndex = 0;\n        }\n\n        arrayStartIndex = Math.min(Math.max(arrayStartIndex, 0), dimensions.itemCount - 1);\n        arrayEndIndex = Math.min(Math.max(arrayEndIndex, 0), dimensions.itemCount - 1);\n\n        let bufferSize = this.bufferAmount * dimensions.itemsPerWrapGroup;\n        let startIndexWithBuffer = Math.min(Math.max(arrayStartIndex - bufferSize, 0), dimensions.itemCount - 1);\n        let endIndexWithBuffer = Math.min(Math.max(arrayEndIndex + bufferSize, 0), dimensions.itemCount - 1);\n\n        return {\n            startIndex: arrayStartIndex,\n            endIndex: arrayEndIndex,\n            startIndexWithBuffer: startIndexWithBuffer,\n            endIndexWithBuffer: endIndexWithBuffer,\n            scrollStartPosition: scrollPosition,\n            scrollEndPosition: scrollPosition + dimensions.viewportLength,\n            maxScrollPosition: dimensions.maxScrollPosition\n        };\n    }\n\n    protected calculateViewport(): IViewport {\n        let dimensions = this.calculateDimensions();\n        let offset = this.getElementsOffset();\n\n        let scrollStartPosition = this.getScrollStartPosition();\n        if (scrollStartPosition > (dimensions.scrollLength + offset) && !(this.parentScroll instanceof Window)) {\n            scrollStartPosition = dimensions.scrollLength;\n        } else {\n            scrollStartPosition -= offset;\n        }\n        scrollStartPosition = Math.max(0, scrollStartPosition);\n\n        let pageInfo = this.calculatePageInfo(scrollStartPosition, dimensions);\n        let newPadding = this.calculatePadding(pageInfo.startIndexWithBuffer, dimensions);\n        let newScrollLength = Math.round(dimensions.scrollLength);\n\n        return {\n            startIndex: pageInfo.startIndex,\n            endIndex: pageInfo.endIndex,\n            startIndexWithBuffer: pageInfo.startIndexWithBuffer,\n            endIndexWithBuffer: pageInfo.endIndexWithBuffer,\n            padding: Math.round(newPadding),\n            scrollLength: newScrollLength,\n            scrollbarLength: newScrollLength + offset,\n            scrollStartPosition: pageInfo.scrollStartPosition,\n            scrollEndPosition: pageInfo.scrollEndPosition,\n            maxScrollPosition: pageInfo.maxScrollPosition\n        };\n    }\n}\n\n\n\n","import { NgModule } from '@angular/core';\nimport {\n  VIRTUAL_SCROLLER_DEFAULT_OPTIONS_FACTORY,\n  VirtualScrollerComponent\n} from './ngx-virtual-scroller.component';\nimport {CommonModule} from \"@angular/common\";\n\n@NgModule({\n  exports: [VirtualScrollerComponent],\n  declarations: [VirtualScrollerComponent],\n  imports: [CommonModule],\n  providers: [\n    {\n      provide: 'virtual-scroller-default-options',\n      useFactory: VIRTUAL_SCROLLER_DEFAULT_OPTIONS_FACTORY\n    }\n  ]\n})\nexport class VirtualScrollerModule { }\n","/*\n * Public API Surface of ngx-virtual-scroller\n */\n\nexport * from './lib/ngx-virtual-scroller.module';\nexport * from './lib/ngx-virtual-scroller.component';\n\n\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}