UNPKG

angular-responsive-carousel-ng16

Version:

Carousel for Angular. A simple solution for horizontal scrolling images with lazy loading.

397 lines 50.5 kB
export class Slide { get fullCellWidth() { return this.carouselProperties.cellWidth + this.carouselProperties.margin; } get margin() { return this.carouselProperties.margin; } get minSwipeDistance() { return this.carouselProperties.minSwipeDistance; } get numberOfVisibleCells() { return this.utils.numberOfVisibleCells; } get visibleCellsOverflowContainer() { return this.utils.visibleCellsOverflowContainer; } /* The position to which the container returns after each slide * in the light DUM tree mode. */ get fixedContainerPosition() { return -(this.overflowCellsLimit * this.fullCellWidth); } get overflowCellsLimit() { return this.utils.overflowCellsLimit; } get images() { return this.carouselProperties.images; } /* Number of cell elements in the DUM tree */ get cellLength() { if (this.isLightDOM) { return this.cells.cellLengthInLightDOMMode; } else { if (this.images) { return this.images.length; } else { return this.cells.cellLength; } } } get isLightDOM() { return this.carouselProperties.lightDOM || this.carouselProperties.loop; } constructor(carouselProperties, utils, cells, container) { this.carouselProperties = carouselProperties; this.utils = utils; this.cells = cells; this.container = container; this.slideLength = 0; this.isSlideInProgress = false; this.counter = 0; this._counter = 0; this.distance = 0; this.distanceAbs = 0; this.isNotClickOnArrow = false; this.initialPositionX = 0; this.currentPositionX = 0; /* The slide length has been limited by the limitSlideLength() method */ this.isSlideLengthLimited = false; this.init(); } updateProperties(carouselProperties) { this.carouselProperties = carouselProperties; this.setVisibleWidth(); } init() { this.visibleWidth = this.carouselProperties.visibleWidth || this.carouselProperties.hostElement.clientWidth; } handleTouchstart() { /* Touchstart event is not called for arrow */ this.isNotClickOnArrow = true; this.isSlideLengthLimited = false; if (!this.isSlideInProgress) { this.initialPositionX = this.container.getCurrentPositionX(); } } handleTouchend() { if (!this.isNotClickOnArrow) { return; } this.currentPositionX = this.container.getCurrentPositionX(); this.distanceAbs = Math.abs(this.initialPositionX - this.currentPositionX); this.distance = this.initialPositionX - this.currentPositionX; this.direction = this.getDirection(); this.isNotClickOnArrow = false; this.handleSlide(); } handleTransitionend() { this.setCounter(); this.isSlideInProgress = false; if (this.isLightDOM) { this.alignContainerFast(); } } handleSlide(customSlideLength = undefined) { let isUsingButton = customSlideLength; let newPositionX; if (isUsingButton && this.isSlideInProgress || !this.direction) { return; } /* Custom slide length is used in arrows */ if (customSlideLength) { this.slideLength = this.limitSlideLength(customSlideLength); if (!this.isSlideInProgress) { this.initialPositionX = this.container.getCurrentPositionX(); } } else { this.slideLength = this.getSlideLength(this.distanceAbs); } /* Store intermediate counter value */ this._counter = this.getPreliminaryCounter(); if (this.direction === 'left') { if (!customSlideLength) { this.slideLength = this.limitSlideLength(this.getSlideLength(this.distanceAbs)); } this._counter = this.getPreliminaryCounter(); let isSlidesEnd = this.isSlidesEnd(this._counter); newPositionX = this.getPositionByIndex(this._counter); if (isSlidesEnd) { this._counter = this.counter; newPositionX = this.getPositionByIndex(this.counter); this.slideLength = 0; } } if (this.direction === 'right') { if (!customSlideLength) { this.slideLength = this.getSlideLength(this.distanceAbs); } if (this._counter < 0) { this._counter = this.counter; this.slideLength = this.counter; } newPositionX = this.getPositionByIndex(this.counter - this.slideLength); } if (this.container.getCurrentPositionX() !== newPositionX) { this.isSlideInProgress = true; this.container.transformPositionX(newPositionX); } } next(length = 1) { this.direction = 'left'; this.handleSlide(length); } prev(length = 1) { this.direction = 'right'; this.handleSlide(length); } select(index) { if (index > this.cellLength - 1) { return; } if (index > this.counter) { let length = index - this.counter; this.next(length); } if (index < this.counter) { let length = this.counter - index; this.prev(length); } } getPreliminaryCounter() { if (this.direction === 'left') { return this.counter + this.slideLength; } if (this.direction === 'right') { return this.counter - this.slideLength; } return 0; } /* * Limits the length of the slide during calls to the next() and prev() * methods if the specified position is outside the cell length */ limitSlideLength(slideLength) { if (slideLength > 1) { for (var i = 0; i < slideLength; i++) { let newCounter = this.counter + (slideLength - i); if (!this.isSlidesEnd(newCounter)) { slideLength = slideLength - i; this.isSlideLengthLimited = i > 0; break; } } } return slideLength; } /* Offset the container to show the last cell completely */ getPositionCorrection(counter) { let correction = 0; let isLastSlide = this.isLastSlide(counter); if (this.carouselProperties.loop || this.direction === "right") { return 0; } if (this.isSlideLengthLimited || isLastSlide) { let cellsWidth = this.cells.cellLengthInLightDOMMode * this.fullCellWidth; if (this.visibleWidth < cellsWidth) { correction = -(this.numberOfVisibleCells * this.fullCellWidth - this.visibleWidth - this.margin); } if (correction >= -this.margin) { correction = 0; } } return correction; } getSlideLength(distanceAbs) { let isLastSlide = this.isLastSlide(this.counter); /* If the last cell does not fit entirely, then the * length of the swipe to the left, from the extreme * right position, may be shorter than usual. */ if (isLastSlide && this.direction === "right") { distanceAbs = distanceAbs + this.visibleWidth % this.fullCellWidth; } let length = Math.floor(distanceAbs / this.fullCellWidth); if (distanceAbs % this.fullCellWidth >= this.minSwipeDistance) { length++; } return length; } getDistanceAbs() { return Math.abs(this.initialPositionX - this.currentPositionX); } getDirection() { const direction = Math.sign(this.initialPositionX - this.currentPositionX); if (direction === -1) { return 'right'; } if (direction === 1) { return 'left'; } return undefined; } isSlidesEnd(counter) { let margin = this.visibleCellsOverflowContainer ? 1 : 0; let imageLength = this.images ? this.images.length : this.cells.cellLength; if (this.carouselProperties.loop) { return false; } else { return (imageLength - counter + margin) < this.numberOfVisibleCells; } } isLastSlide(counter) { return this.isSlidesEnd(counter + 1); } setCounter() { if (this.direction === 'left') { this.counter = this.counter + this.slideLength; } if (this.direction === 'right') { this.counter = this.counter - this.slideLength; } } getPositionByIndex(_counter) { let correction = this.getPositionCorrection(this.counter + this.slideLength); let position; if (correction !== 0) { correction = correction + this.fullCellWidth; } if (this.direction === 'right') { correction = 0; } if (this.isLightDOM && this.isLightDOMMode(_counter) || this.isLightDOM && this.ifLeftDOMModeAtEnd(_counter)) { let initialPosition = this.getPositionWithoutCorrection(this.initialPositionX); let counterDifference = _counter - this.counter; position = initialPosition - ((counterDifference * this.fullCellWidth) - correction); } else { position = -((_counter * this.fullCellWidth) - correction); } position = this.provideSafePosition(position); return position; } provideSafePosition(position) { const endPosition = this.container.getEndPosition(); if (this.direction === 'left') { if (position > 0) { position = 0; } } if (this.direction === 'right') { if (position < endPosition) { position = endPosition; } } return position; } getPositionWithoutCorrection(value) { let remainder = Math.round(value) % this.fullCellWidth; if (remainder !== 0) { return value - (this.fullCellWidth + remainder); } else { return value; } } isNextArrowDisabled() { return this.isLastSlide(this.counter) || (!this.visibleCellsOverflowContainer && this.cellLength <= this.numberOfVisibleCells) || (this.visibleCellsOverflowContainer && this.cellLength < this.numberOfVisibleCells); } isPrevArrowDisabled() { return this.counter === 0; } alignContainerFast() { if (this.isLightDOMMode(this.counter)) { let positionX = this.fixedContainerPosition; this.container.transformPositionX(positionX, 0); this.cells.setCounter(this.counter); this.cells.lineUp(); } else if (this.ifLeftDOMModeToBeginning(this.counter)) { /* If we have already exited the light DOM mode but * the cells are still out of place */ if (this.cells.ifSequenceOfCellsIsChanged()) { let positionX = -(this.counter * this.fullCellWidth); this.container.transformPositionX(positionX, 0); this.cells.setCounter(this.counter); this.cells.lineUp(); } } else if (this.ifLeftDOMModeAtEnd(this.counter)) { let containerPositionX = this.container.getCurrentPositionX(); let containerWidth = this.container.getWidth(); this.visibleWidth; if (this.isLastSlide(this.counter) && containerWidth + containerPositionX >= this.visibleWidth) { return; } let correction = this.getPositionCorrection(this.counter); if (correction !== 0) { correction = correction + this.fullCellWidth; } if (this.direction === 'right') { correction = 0; } let positionX = this.fixedContainerPosition + correction; this.container.transformPositionX(positionX, 0); this.cells.setCounter(this.counter); this.cells.lineUp(); } } isLightDOMMode(counter) { let flag; let remainderOfCells = this.images.length - this.overflowCellsLimit - this.numberOfVisibleCells; if (!this.isLightDOM) { return false; } if (counter > this.overflowCellsLimit && this.direction === "left" && counter <= remainderOfCells) { flag = true; } if (counter >= this.overflowCellsLimit && this.direction === "right" && counter < remainderOfCells) { flag = true; } if (this.counter > this.overflowCellsLimit && this.direction === "left" && this.counter <= remainderOfCells) { flag = true; } if (this.counter >= this.overflowCellsLimit && this.direction === "right" && this.counter < remainderOfCells) { flag = true; } return flag; } ifLeftDOMModeAtEnd(counter) { let flag; let remainderOfCells = this.images.length - this.overflowCellsLimit - this.numberOfVisibleCells; if (counter >= remainderOfCells) { flag = true; } if (this.counter >= remainderOfCells) { flag = true; } return flag; } ifLeftDOMModeToBeginning(counter) { let flag; if (counter <= this.overflowCellsLimit) { flag = true; } if (this.counter <= this.overflowCellsLimit) { flag = true; } return flag; } setVisibleWidth() { this.visibleWidth = this.carouselProperties.visibleWidth || this.carouselProperties.hostElement.clientWidth; } } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2xpZGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wcm9qZWN0cy9hbmd1bGFyLXJlc3BvbnNpdmUtY2Fyb3VzZWwtbmcxNi9zcmMvbGliL3NsaWRlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQU1BLE1BQU0sT0FBTyxLQUFLO0lBZ0JkLElBQUksYUFBYTtRQUNiLE9BQU8sSUFBSSxDQUFDLGtCQUFrQixDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUMsa0JBQWtCLENBQUMsTUFBTSxDQUFDO0lBQzlFLENBQUM7SUFFRCxJQUFJLE1BQU07UUFDTixPQUFPLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxNQUFNLENBQUM7SUFDMUMsQ0FBQztJQUVELElBQUksZ0JBQWdCO1FBQ2hCLE9BQU8sSUFBSSxDQUFDLGtCQUFrQixDQUFDLGdCQUFnQixDQUFDO0lBQ3BELENBQUM7SUFFRCxJQUFJLG9CQUFvQjtRQUNwQixPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsb0JBQW9CLENBQUM7SUFDM0MsQ0FBQztJQUVELElBQUksNkJBQTZCO1FBQzdCLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyw2QkFBNkIsQ0FBQztJQUNwRCxDQUFDO0lBRUQ7O09BRUc7SUFDSCxJQUFJLHNCQUFzQjtRQUN0QixPQUFPLENBQUMsQ0FBQyxJQUFJLENBQUMsa0JBQWtCLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDO0lBQzNELENBQUM7SUFFRCxJQUFJLGtCQUFrQjtRQUNsQixPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsa0JBQWtCLENBQUM7SUFDekMsQ0FBQztJQUVELElBQUksTUFBTTtRQUNOLE9BQU8sSUFBSSxDQUFDLGtCQUFrQixDQUFDLE1BQU0sQ0FBQztJQUMxQyxDQUFDO0lBRUQsNkNBQTZDO0lBQzdDLElBQUksVUFBVTtRQUNWLElBQUksSUFBSSxDQUFDLFVBQVUsRUFBRTtZQUNqQixPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsd0JBQXdC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QUFPLElBQUksZ0JBQWdCLEVBQUU7WUFDbEMsSUFBSSxHQUFHLElBQUksQ0FBQztTQUNmO1FBRUQsT0FBTyxJQUFJLENBQUM7SUFDaEIsQ0FBQztJQUVELHdCQUF3QixDQUFDLE9BQWU7UUFDcEMsSUFBSSxJQUFJLENBQUM7UUFFVCxJQUFJLE9BQU8sSUFBSSxJQUFJLENBQUMsa0JBQWtCLEVBQUU7WUFDcEMsSUFBSSxHQUFHLElBQUksQ0FBQztTQUNmO1FBRUQsSUFBSSxJQUFJLENBQUMsT0FBTyxJQUFJLElBQUksQ0FBQyxrQkFBa0IsRUFBRTtZQUN6QyxJQUFJLEdBQUcsSUFBSSxDQUFDO1NBQ2Y7UUFFRCxPQUFPLElBQUksQ0FBQztJQUNoQixDQUFDO0lBRUQsZUFBZTtRQUNYLElBQUksQ0FBQyxZQUFZLEdBQUcsSUFBSSxDQUFDLGtCQUFrQixDQUFDLFlBQVksSUFBSSxJQUFJLENBQUMsa0JBQWtCLENBQUMsV0FBVyxDQUFDLFdBQVcsQ0FBQztJQUNoSCxDQUFDO0NBQ0oiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1Byb3BlcnRpZXMgYXMgQ2Fyb3VzZWxQcm9wZXJ0aWVzfSBmcm9tICcuL2ludGVyZmFjZXMnO1xuXG5leHBvcnQgaW50ZXJmYWNlIFByb3BlcnRpZXMge1xuICAgIGNhcm91c2VsUHJvcGVydGllczogQ2Fyb3VzZWxQcm9wZXJ0aWVzO1xufVxuXG5leHBvcnQgY2xhc3MgU2xpZGUge1xuICAgIHNsaWRlTGVuZ3RoOiBudW1iZXIgPSAwO1xuICAgIGlzU2xpZGVJblByb2dyZXNzOiBib29sZWFuID0gZmFsc2U7XG4gICAgZGlyZWN0aW9uOiAnbGVmdCcgfCAncmlnaHQnIHwgdW5kZWZpbmVkO1xuICAgIGNvdW50ZXI6IG51bWJlciA9IDA7XG4gICAgX2NvdW50ZXI6IG51bWJlciA9IDA7XG4gICAgZGlzdGFuY2U6IG51bWJlciA9IDA7XG4gICAgZGlzdGFuY2VBYnM6IG51bWJlciA9IDA7XG4gICAgdmlzaWJsZVdpZHRoITogbnVtYmVyO1xuICAgIGlzTm90Q2xpY2tPbkFycm93OiBib29sZWFuID0gZmFsc2U7XG4gICAgaW5pdGlhbFBvc2l0aW9uWDogbnVtYmVyID0gMDtcbiAgICBjdXJyZW50UG9zaXRpb25YOiBudW1iZXIgPSAwO1xuXG4gICAgLyogVGhlIHNsaWRlIGxlbmd0aCBoYXMgYmVlbiBsaW1pdGVkIGJ5IHRoZSBsaW1pdFNsaWRlTGVuZ3RoKCkgbWV0aG9kICovXG4gICAgaXNTbGlkZUxlbmd0aExpbWl0ZWQ6IGJvb2xlYW4gPSBmYWxzZTtcblxuICAgIGdldCBmdWxsQ2VsbFdpZHRoKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5jYXJvdXNlbFByb3BlcnRpZXMuY2VsbFdpZHRoICsgdGhpcy5jYXJvdXNlbFByb3BlcnRpZXMubWFyZ2luO1xuICAgIH1cblxuICAgIGdldCBtYXJnaW4oKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmNhcm91c2VsUHJvcGVydGllcy5tYXJnaW47XG4gICAgfVxuXG4gICAgZ2V0IG1pblN3aXBlRGlzdGFuY2UoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmNhcm91c2VsUHJvcGVydGllcy5taW5Td2lwZURpc3RhbmNlO1xuICAgIH1cblxuICAgIGdldCBudW1iZXJPZlZpc2libGVDZWxscygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudXRpbHMubnVtYmVyT2ZWaXNpYmxlQ2VsbHM7XG4gICAgfVxuXG4gICAgZ2V0IHZpc2libGVDZWxsc092ZXJmbG93Q29udGFpbmVyKCkge1xuICAgICAgICByZXR1cm4gdGhpcy51dGlscy52aXNpYmxlQ2VsbHNPdmVyZmxvd0NvbnRhaW5lcjtcbiAgICB9XG5cbiAgICAvKiBUaGUgcG9zaXRpb24gdG8gd2hpY2ggdGhlIGNvbnRhaW5lciByZXR1cm5zIGFmdGVyIGVhY2ggc2xpZGUgXG4gICAgICogaW4gdGhlIGxpZ2h0IERVTSB0cmVlIG1vZGUuIFxuICAgICAqL1xuICAgIGdldCBmaXhlZENvbnRhaW5lclBvc2l0aW9uKCkge1xuICAgICAgICByZXR1cm4gLSh0aGlzLm92ZXJmbG93Q2VsbHNMaW1pdCAqIHRoaXMuZnVsbENlbGxXaWR0aCk7XG4gICAgfVxuXG4gICAgZ2V0IG92ZXJmbG93Q2VsbHNMaW1pdCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudXRpbHMub3ZlcmZsb3dDZWxsc0xpbWl0O1xuICAgIH1cblxuICAgIGdldCBpbWFnZXMoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmNhcm91c2VsUHJvcGVydGllcy5pbWFnZXM7XG4gICAgfVxuXG4gICAgLyogTnVtYmVyIG9mIGNlbGwgZWxlbWVudHMgaW4gdGhlIERVTSB0cmVlICovXG4gICAgZ2V0IGNlbGxMZW5ndGgoKSB7XG4gICAgICAgIGlmICh0aGlzLmlzTGlnaHRET00pIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmNlbGxzLmNlbGxMZW5ndGhJbkxpZ2h0RE9NTW9kZTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGlmICh0aGlzLmltYWdlcykge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmltYWdlcy5sZW5ndGg7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmNlbGxzLmNlbGxMZW5ndGg7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBnZXQgaXNMaWdodERPTSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY2Fyb3VzZWxQcm9wZXJ0aWVzLmxpZ2h0RE9NIHx8IHRoaXMuY2Fyb3VzZWxQcm9wZXJ0aWVzLmxvb3A7XG4gICAgfVxuXG4gICAgY29uc3RydWN0b3IocHJpdmF0ZSBjYXJvdXNlbFByb3BlcnRpZXM6IENhcm91c2VsUHJvcGVydGllcyxcbiAgICAgICAgcHJpdmF0ZSB1dGlsczogYW55LFxuICAgICAgICBwcml2YXRlIGNlbGxzOiBhbnksXG4gICAgICAgIHByaXZhdGUgY29udGFpbmVyOiBhbnkpIHtcblxuICAgICAgICB0aGlzLmluaXQoKTtcbiAgICB9XG5cbiAgICB1cGRhdGVQcm9wZXJ0aWVzKGNhcm91c2VsUHJvcGVydGllczogQ2Fyb3VzZWxQcm9wZXJ0aWVzKSB7XG4gICAgICAgIHRoaXMuY2Fyb3VzZWxQcm9wZXJ0aWVzID0gY2Fyb3VzZWxQcm9wZXJ0aWVzO1xuICAgICAgICB0aGlzLnNldFZpc2libGVXaWR0aCgpO1xuICAgIH1cblxuICAgIGluaXQoKSB7XG4gICAgICAgIHRoaXMudmlzaWJsZVdpZHRoID0gdGhpcy5jYXJvdXNlbFByb3BlcnRpZXMudmlzaWJsZVdpZHRoIHx8IHRoaXMuY2Fyb3VzZWxQcm9wZXJ0aWVzLmhvc3RFbGVtZW50LmNsaWVudFdpZHRoO1xuICAgIH1cblxuICAgIGhhbmRsZVRvdWNoc3RhcnQoKSB7XG4gICAgICAgIC8qIFRvdWNoc3RhcnQgZXZlbnQgaXMgbm90IGNhbGxlZCBmb3IgYXJyb3cgKi9cbiAgICAgICAgdGhpcy5pc05vdENsaWNrT25BcnJvdyA9IHRydWU7XG4gICAgICAgIHRoaXMuaXNTbGlkZUxlbmd0aExpbWl0ZWQgPSBmYWxzZTtcblxuICAgICAgICBpZiAoIXRoaXMuaXNTbGlkZUluUHJvZ3Jlc3MpIHtcbiAgICAgICAgICAgIHRoaXMuaW5pdGlhbFBvc2l0aW9uWCA9IHRoaXMuY29udGFpbmVyLmdldEN1cnJlbnRQb3NpdGlvblgoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGhhbmRsZVRvdWNoZW5kKCkge1xuICAgICAgICBpZiAoIXRoaXMuaXNOb3RDbGlja09uQXJyb3cpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmN1cnJlbnRQb3NpdGlvblggPSB0aGlzLmNvbnRhaW5lci5nZXRDdXJyZW50UG9zaXRpb25YKCk7XG4gICAgICAgIHRoaXMuZGlzdGFuY2VBYnMgPSBNYXRoLmFicyh0aGlzLmluaXRpYWxQb3NpdGlvblggLSB0aGlzLmN1cnJlbnRQb3NpdGlvblgpO1xuICAgICAgICB0aGlzLmRpc3RhbmNlID0gdGhpcy5pbml0aWFsUG9zaXRpb25YIC0gdGhpcy5jdXJyZW50UG9zaXRpb25YO1xuICAgICAgICB0aGlzLmRpcmVjdGlvbiA9IHRoaXMuZ2V0RGlyZWN0aW9uKCk7XG4gICAgICAgIHRoaXMuaXNOb3RDbGlja09uQXJyb3cgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5oYW5kbGVTbGlkZSgpO1xuICAgIH1cblxuICAgIGhhbmRsZVRyYW5zaXRpb25lbmQoKSB7XG4gICAgICAgIHRoaXMuc2V0Q291bnRlcigpO1xuICAgICAgICB0aGlzLmlzU2xpZGVJblByb2dyZXNzID0gZmFsc2U7XG5cbiAgICAgICAgaWYgKHRoaXMuaXNMaWdodERPTSkge1xuICAgICAgICAgICAgdGhpcy5hbGlnbkNvbnRhaW5lckZhc3QoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGhhbmRsZVNsaWRlKGN1c3RvbVNsaWRlTGVuZ3RoOiBudW1iZXIgfCB1bmRlZmluZWQgPSB1bmRlZmluZWQpIHtcbiAgICAgICAgbGV0IGlzVXNpbmdCdXR0b24gPSBjdXN0b21TbGlkZUxlbmd0aDtcbiAgICAgICAgbGV0IG5ld1Bvc2l0aW9uWDtcblxuICAgICAgICBpZiAoaXNVc2luZ0J1dHRvbiAmJiB0aGlzLmlzU2xpZGVJblByb2dyZXNzIHx8ICF0aGlzLmRpcmVjdGlvbikge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgLyogQ3VzdG9tIHNsaWRlIGxlbmd0aCBpcyB1c2VkIGluIGFycm93cyAqL1xuICAgICAgICBpZiAoY3VzdG9tU2xpZGVMZW5ndGgpIHtcbiAgICAgICAgICAgIHRoaXMuc2xpZGVMZW5ndGggPSB0aGlzLmxpbWl0U2xpZGVMZW5ndGgoY3VzdG9tU2xpZGVMZW5ndGgpO1xuXG4gICAgICAgICAgICBpZiAoIXRoaXMuaXNTbGlkZUluUHJvZ3Jlc3MpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmluaXRpYWxQb3NpdGlvblggPSB0aGlzLmNvbnRhaW5lci5nZXRDdXJyZW50UG9zaXRpb25YKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLnNsaWRlTGVuZ3RoID0gdGhpcy5nZXRTbGlkZUxlbmd0aCh0aGlzLmRpc3RhbmNlQWJzKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8qIFN0b3JlIGludGVybWVkaWF0ZSBjb3VudGVyIHZhbHVlICovXG4gICAgICAgIHRoaXMuX2NvdW50ZXIgPSB0aGlzLmdldFByZWxpbWluYXJ5Q291bnRlcigpO1xuXG4gICAgICAgIGlmICh0aGlzLmRpcmVjdGlvbiA9PT0gJ2xlZnQnKSB7XG4gICAgICAgICAgICBpZiAoIWN1c3RvbVNsaWRlTGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5zbGlkZUxlbmd0aCA9IHRoaXMubGltaXRTbGlkZUxlbmd0aCh0aGlzLmdldFNsaWRlTGVuZ3RoKHRoaXMuZGlzdGFuY2VBYnMpKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdGhpcy5fY291bnRlciA9IHRoaXMuZ2V0UHJlbGltaW5hcnlDb3VudGVyKCk7XG4gICAgICAgICAgICBsZXQgaXNTbGlkZXNFbmQgPSB0aGlzLmlzU2xpZGVzRW5kKHRoaXMuX2NvdW50ZXIpO1xuICAgICAgICAgICAgbmV3UG9zaXRpb25YID0gdGhpcy5nZXRQb3NpdGlvbkJ5SW5kZXgodGhpcy5fY291bnRlcik7XG5cbiAgICAgICAgICAgIGlmIChpc1NsaWRlc0VuZCkge1xuICAgICAgICAgICAgICAgIHRoaXMuX2NvdW50ZXIgPSB0aGlzLmNvdW50ZXI7XG5cbiAgICAgICAgICAgICAgICBuZXdQb3NpdGlvblggPSB0aGlzLmdldFBvc2l0aW9uQnlJbmRleCh0aGlzLmNvdW50ZXIpO1xuICAgICAgICAgICAgICAgIHRoaXMuc2xpZGVMZW5ndGggPSAwO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMuZGlyZWN0aW9uID09PSAncmlnaHQnKSB7XG4gICAgICAgICAgICBpZiAoIWN1c3RvbVNsaWRlTGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5zbGlkZUxlbmd0aCA9IHRoaXMuZ2V0U2xpZGVMZW5ndGgodGhpcy5kaXN0YW5jZUFicyk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmICh0aGlzLl9jb3VudGVyIDwgMCkge1xuICAgICAgICAgICAgICAgIHRoaXMuX2NvdW50ZXIgPSB0aGlzLmNvdW50ZXI7XG4gICAgICAgICAgICAgICAgdGhpcy5zbGlkZUxlbmd0aCA9IHRoaXMuY291bnRlcjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgbmV3UG9zaXRpb25YID0gdGhpcy5nZXRQb3NpdGlvbkJ5SW5kZXgodGhpcy5jb3VudGVyIC0gdGhpcy5zbGlkZUxlbmd0aCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5jb250YWluZXIuZ2V0Q3VycmVudFBvc2l0aW9uWCgpICE9PSBuZXdQb3NpdGlvblgpIHtcbiAgICAgICAgICAgIHRoaXMuaXNTbGlkZUluUHJvZ3Jlc3MgPSB0cnVlO1xuICAgICAgICAgICAgdGhpcy5jb250YWluZXIudHJhbnNmb3JtUG9zaXRpb25YKG5ld1Bvc2l0aW9uWCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBuZXh0KGxlbmd0aDogbnVtYmVyID0gMSkge1xuICAgICAgICB0aGlzLmRpcmVjdGlvbiA9ICdsZWZ0JztcbiAgICAgICAgdGhpcy5oYW5kbGVTbGlkZShsZW5ndGgpO1xuICAgIH1cblxuICAgIHByZXYobGVuZ3RoOiBudW1iZXIgPSAxKSB7XG4gICAgICAgIHRoaXMuZGlyZWN0aW9uID0gJ3JpZ2h0JztcbiAgICAgICAgdGhpcy5oYW5kbGVTbGlkZShsZW5ndGgpO1xuICAgIH1cblxuICAgIHNlbGVjdChpbmRleDogbnVtYmVyKSB7XG4gICAgICAgIGlmIChpbmRleCA+IHRoaXMuY2VsbExlbmd0aCAtIDEpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChpbmRleCA+IHRoaXMuY291bnRlcikge1xuICAgICAgICAgICAgbGV0IGxlbmd0aCA9IGluZGV4IC0gdGhpcy5jb3VudGVyO1xuICAgICAgICAgICAgdGhpcy5uZXh0KGxlbmd0aCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoaW5kZXggPCB0aGlzLmNvdW50ZXIpIHtcbiAgICAgICAgICAgIGxldCBsZW5ndGggPSB0aGlzLmNvdW50ZXIgLSBpbmRleDtcbiAgICAgICAgICAgIHRoaXMucHJldihsZW5ndGgpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZ2V0UHJlbGltaW5hcnlDb3VudGVyKCkge1xuICAgICAgICBpZiAodGhpcy5kaXJlY3Rpb24gPT09ICdsZWZ0Jykge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuY291bnRlciArIHRoaXMuc2xpZGVMZW5ndGg7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5kaXJlY3Rpb24gPT09ICdyaWdodCcpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmNvdW50ZXIgLSB0aGlzLnNsaWRlTGVuZ3RoO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIDA7XG4gICAgfVxuXG4gICAgLyogIFxuICAgICAqIExpbWl0cyB0aGUgbGVuZ3RoIG9mIHRoZSBzbGlkZSBkdXJpbmcgY2FsbHMgdG8gdGhlIG5leHQoKSBhbmQgcHJldigpIFxuICAgICAqIG1ldGhvZHMgaWYgdGhlIHNwZWNpZmllZCBwb3NpdGlvbiBpcyBvdXRzaWRlIHRoZSBjZWxsIGxlbmd0aCBcbiAgICAgKi9cbiAgICBsaW1pdFNsaWRlTGVuZ3RoKHNsaWRlTGVuZ3RoOiBudW1iZXIpIHtcbiAgICAgICAgaWYgKHNsaWRlTGVuZ3RoID4gMSkge1xuICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzbGlkZUxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgbGV0IG5ld0NvdW50ZXIgPSB0aGlzLmNvdW50ZXIgKyAoc2xpZGVMZW5ndGggLSBpKTtcblxuICAgICAgICAgICAgICAgIGlmICghdGhpcy5pc1NsaWRlc0VuZChuZXdDb3VudGVyKSkge1xuICAgICAgICAgICAgICAgICAgICBzbGlkZUxlbmd0aCA9IHNsaWRlTGVuZ3RoIC0gaTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5pc1NsaWRlTGVuZ3RoTGltaXRlZCA9IGkgPiAwO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHNsaWRlTGVuZ3RoO1xuICAgIH1cblxuICAgIC8qIE9mZnNldCB0aGUgY29udGFpbmVyIHRvIHNob3cgdGhlIGxhc3QgY2VsbCBjb21wbGV0ZWx5ICovXG4gICAgZ2V0UG9zaXRpb25Db3JyZWN0aW9uKGNvdW50ZXI6bnVtYmVyKSB7XG4gICAgICAgIGxldCBjb3JyZWN0aW9uID0gMDtcbiAgICAgICAgbGV0IGlzTGFzdFNsaWRlID0gdGhpcy5pc0xhc3RTbGlkZShjb3VudGVyKTtcblxuICAgICAgICBpZiAodGhpcy5jYXJvdXNlbFByb3BlcnRpZXMubG9vcCB8fCB0aGlzLmRpcmVjdGlvbiA9PT0gXCJyaWdodFwiKSB7XG4gICAgICAgICAgICByZXR1cm4gMDtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLmlzU2xpZGVMZW5ndGhMaW1pdGVkIHx8IGlzTGFzdFNsaWRlKSB7XG4gICAgICAgICAgICBsZXQgY2VsbHNXaWR0aCA9IHRoaXMuY2VsbHMuY2VsbExlbmd0aEluTGlnaHRET01Nb2RlICogdGhpcy5mdWxsQ2VsbFdpZHRoO1xuXG4gICAgICAgICAgICBpZiAodGhpcy52aXNpYmxlV2lkdGggPCBjZWxsc1dpZHRoKSB7XG4gICAgICAgICAgICAgICAgY29ycmVjdGlvbiA9IC0odGhpcy5udW1iZXJPZlZpc2libGVDZWxscyAqIHRoaXMuZnVsbENlbGxXaWR0aCAtIHRoaXMudmlzaWJsZVdpZHRoIC0gdGhpcy5tYXJnaW4pO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoY29ycmVjdGlvbiA+PSAtdGhpcy5tYXJnaW4pIHtcbiAgICAgICAgICAgICAgICBjb3JyZWN0aW9uID0gMDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBjb3JyZWN0aW9uO1xuICAgIH1cblxuICAgIGdldFNsaWRlTGVuZ3RoKGRpc3RhbmNlQWJzOiBudW1iZXIpIHtcbiAgICAgICAgbGV0IGlzTGFzdFNsaWRlID0gdGhpcy5pc0xhc3RTbGlkZSh0aGlzLmNvdW50ZXIpO1xuXG4gICAgICAgIC8qIElmIHRoZSBsYXN0IGNlbGwgZG9lcyBub3QgZml0IGVudGlyZWx5LCB0aGVuIHRoZSBcbiAgICAgICAgICogbGVuZ3RoIG9mIHRoZSBzd2lwZSB0byB0aGUgbGVmdCwgZnJvbSB0aGUgZXh0cmVtZSBcbiAgICAgICAgICogcmlnaHQgcG9zaXRpb24sIG1heSBiZSBzaG9ydGVyIHRoYW4gdXN1YWwuIFxuICAgICAgICAgKi9cbiAgICAgICAgaWYgKGlzTGFzdFNsaWRlICYmIHRoaXMuZGlyZWN0aW9uID09PSBcInJpZ2h0XCIpIHtcbiAgICAgICAgICAgIGRpc3RhbmNlQWJzID0gZGlzdGFuY2VBYnMgKyB0aGlzLnZpc2libGVXaWR0aCAlIHRoaXMuZnVsbENlbGxXaWR0aDtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBsZW5ndGggPSBNYXRoLmZsb29yKGRpc3RhbmNlQWJzIC8gdGhpcy5mdWxsQ2VsbFdpZHRoKTtcblxuICAgICAgICBpZiAoZGlzdGFuY2VBYnMgJSB0aGlzLmZ1bGxDZWxsV2lkdGggPj0gdGhpcy5taW5Td2lwZURpc3RhbmNlKSB7XG4gICAgICAgICAgICBsZW5ndGgrKztcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBsZW5ndGg7XG4gICAgfVxuXG4gICAgZ2V0RGlzdGFuY2VBYnMoKSB7XG4gICAgICAgIHJldHVybiBNYXRoLmFicyh0aGlzLmluaXRpYWxQb3NpdGlvblggLSB0aGlzLmN1cnJlbnRQb3NpdGlvblgpO1xuICAgIH1cblxuICAgIGdldERpcmVjdGlvbigpIHtcbiAgICAgICAgY29uc3QgZGlyZWN0aW9uID0gTWF0aC5zaWduKHRoaXMuaW5pdGlhbFBvc2l0aW9uWCAtIHRoaXMuY3VycmVudFBvc2l0aW9uWCk7XG5cbiAgICAgICAgaWYgKGRpcmVjdGlvbiA9PT0gLTEpIHtcbiAgICAgICAgICAgIHJldHVybiAncmlnaHQnO1xuICAgICAgICB9XG4gICAgICAgIGlmIChkaXJlY3Rpb24gPT09IDEpIHtcbiAgICAgICAgICAgIHJldHVybiAnbGVmdCc7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIGlzU2xpZGVzRW5kKGNvdW50ZXI6IG51bWJlcikge1xuICAgICAgICBsZXQgbWFyZ2luID0gdGhpcy52aXNpYmxlQ2VsbHNPdmVyZmxvd0NvbnRhaW5lciA/IDEgOiAwO1xuICAgICAgICBsZXQgaW1hZ2VMZW5ndGggPSB0aGlzLmltYWdlcyA/IHRoaXMuaW1hZ2VzLmxlbmd0aCA6IHRoaXMuY2VsbHMuY2VsbExlbmd0aDtcblxuICAgICAgICBpZiAodGhpcy5jYXJvdXNlbFByb3BlcnRpZXMubG9vcCkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIChpbWFnZUxlbmd0aCAtIGNvdW50ZXIgKyBtYXJnaW4pIDwgdGhpcy5udW1iZXJPZlZpc2libGVDZWxscztcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGlzTGFzdFNsaWRlKGNvdW50ZXI6IG51bWJlcikge1xuICAgICAgICByZXR1cm4gdGhpcy5pc1NsaWRlc0VuZChjb3VudGVyICsgMSlcbiAgICB9XG5cbiAgICBzZXRDb3VudGVyKCkge1xuICAgICAgICBpZiAodGhpcy5kaXJlY3Rpb24gPT09ICdsZWZ0Jykge1xuICAgICAgICAgICAgdGhpcy5jb3VudGVyID0gdGhpcy5jb3VudGVyICsgdGhpcy5zbGlkZUxlbmd0aDtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLmRpcmVjdGlvbiA9PT0gJ3JpZ2h0Jykge1xuICAgICAgICAgICAgdGhpcy5jb3VudGVyID0gdGhpcy5jb3VudGVyIC0gdGhpcy5zbGlkZUxlbmd0aDtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGdldFBvc2l0aW9uQnlJbmRleChfY291bnRlcjogbnVtYmVyKSB7XG4gICAgICAgIGxldCBjb3JyZWN0aW9uID0gdGhpcy5nZXRQb3NpdGlvbkNvcnJlY3Rpb24odGhpcy5jb3VudGVyICsgdGhpcy5zbGlkZUxlbmd0aCk7XG4gICAgICAgIGxldCBwb3NpdGlvbjtcblxuICAgICAgICBpZiAoY29ycmVjdGlvbiAhPT0gMCkge1xuICAgICAgICAgICAgY29ycmVjdGlvbiA9IGNvcnJlY3Rpb24gKyB0aGlzLmZ1bGxDZWxsV2lkdGhcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLmRpcmVjdGlvbiA9PT0gJ3JpZ2h0Jykge1xuICAgICAgICAgICAgY29ycmVjdGlvbiA9IDA7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5pc0xpZ2h0RE9NICYmIHRoaXMuaXNMaWdodERPTU1vZGUoX2NvdW50ZXIpIHx8XG4gICAgICAgICAgICB0aGlzLmlzTGlnaHRET00gJiYgdGhpcy5pZkxlZnRET01Nb2RlQXRFbmQoX2NvdW50ZXIpKSB7XG5cbiAgICAgICAgICAgIGxldCBpbml0aWFsUG9zaXRpb24gPSB0aGlzLmdldFBvc2l0aW9uV2l0aG91dENvcnJlY3Rpb24odGhpcy5pbml0aWFsUG9zaXRpb25YKTtcbiAgICAgICAgICAgIGxldCBjb3VudGVyRGlmZmVyZW5jZSA9IF9jb3VudGVyIC0gdGhpcy5jb3VudGVyO1xuICAgICAgICAgICAgcG9zaXRpb24gPSBpbml0aWFsUG9zaXRpb24gLSAoKGNvdW50ZXJEaWZmZXJlbmNlICogdGhpcy5mdWxsQ2VsbFdpZHRoKSAtIGNvcnJlY3Rpb24pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcG9zaXRpb24gPSAtKChfY291bnRlciAqIHRoaXMuZnVsbENlbGxXaWR0aCkgLSBjb3JyZWN0aW9uKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHBvc2l0aW9uID0gdGhpcy5wcm92aWRlU2FmZVBvc2l0aW9uKHBvc2l0aW9uKTtcblxuICAgICAgICByZXR1cm4gcG9zaXRpb247XG4gICAgfVxuXG4gICAgcHJvdmlkZVNhZmVQb3NpdGlvbihwb3NpdGlvbjogbnVtYmVyKSB7XG4gICAgICAgIGNvbnN0IGVuZFBvc2l0aW9uID0gdGhpcy5jb250YWluZXIuZ2V0RW5kUG9zaXRpb24oKTtcblxuICAgICAgICBpZiAodGhpcy5kaXJlY3Rpb24gPT09ICdsZWZ0Jykge1xuICAgICAgICAgICAgaWYgKHBvc2l0aW9uID4gMCkge1xuICAgICAgICAgICAgICAgIHBvc2l0aW9uID0gMDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLmRpcmVjdGlvbiA9PT0gJ3JpZ2h0Jykge1xuICAgICAgICAgICAgaWYgKHBvc2l0aW9uIDwgZW5kUG9zaXRpb24pIHtcbiAgICAgICAgICAgICAgICBwb3NpdGlvbiA9IGVuZFBvc2l0aW9uO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHBvc2l0aW9uO1xuICAgIH1cblxuICAgIGdldFBvc2l0aW9uV2l0aG91dENvcnJlY3Rpb24odmFsdWU6IG51bWJlcikge1xuICAgICAgICBsZXQgcmVtYWluZGVyID0gTWF0aC5yb3VuZCh2YWx1ZSkgJSB0aGlzLmZ1bGxDZWxsV2lkdGg7XG5cbiAgICAgICAgaWYgKHJlbWFpbmRlciAhPT0gMCkge1xuICAgICAgICAgICAgcmV0dXJuIHZhbHVlIC0gKHRoaXMuZnVsbENlbGxXaWR0aCArIHJlbWFpbmRlcik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBpc05leHRBcnJvd0Rpc2FibGVkKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5pc0xhc3RTbGlkZSh0aGlzLmNvdW50ZXIpIHx8IFxuICAgICAgICAoIXRoaXMudmlzaWJsZUNlbGxzT3ZlcmZsb3dDb250YWluZXIgJiYgdGhpcy5jZWxsTGVuZ3RoIDw9IHRoaXMubnVtYmVyT2ZWaXNpYmxlQ2VsbHMpIHx8XG4gICAgICAgICh0aGlzLnZpc2libGVDZWxsc092ZXJmbG93Q29udGFpbmVyICYmIHRoaXMuY2VsbExlbmd0aCA8IHRoaXMubnVtYmVyT2ZWaXNpYmxlQ2VsbHMpXG4gICAgfVxuXG4gICAgaXNQcmV2QXJyb3dEaXNhYmxlZCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY291bnRlciA9PT0gMDtcbiAgICB9XG5cbiAgICBhbGlnbkNvbnRhaW5lckZhc3QoKSB7XG4gICAgICAgIGlmICh0aGlzLmlzTGlnaHRET01Nb2RlKHRoaXMuY291bnRlcikpIHtcbiAgICAgICAgICAgIGxldCBwb3NpdGlvblggPSB0aGlzLmZpeGVkQ29udGFpbmVyUG9zaXRpb247XG4gICAgICAgICAgICB0aGlzLmNvbnRhaW5lci50cmFuc2Zvcm1Qb3NpdGlvblgocG9zaXRpb25YLCAwKTtcblxuICAgICAgICAgICAgdGhpcy5jZWxscy5zZXRDb3VudGVyKHRoaXMuY291bnRlcik7XG4gICAgICAgICAgICB0aGlzLmNlbGxzLmxpbmVVcCgpO1xuICAgICAgICB9IGVsc2UgaWYgKHRoaXMuaWZMZWZ0RE9NTW9kZVRvQmVnaW5uaW5nKHRoaXMuY291bnRlcikpIHtcbiAgICAgICAgICAgIC8qIElmIHdlIGhhdmUgYWxyZWFkeSBleGl0ZWQgdGhlIGxpZ2h0IERPTSBtb2RlIGJ1dCBcbiAgICAgICAgICAgICAqIHRoZSBjZWxscyBhcmUgc3RpbGwgb3V0IG9mIHBsYWNlIFxuICAgICAgICAgICAgICovXG4gICAgICAgICAgICBpZiAodGhpcy5jZWxscy5pZlNlcXVlbmNlT2ZDZWxsc0lzQ2hhbmdlZCgpKSB7XG4gICAgICAgICAgICAgICAgbGV0IHBvc2l0aW9uWCA9IC0odGhpcy5jb3VudGVyICogdGhpcy5mdWxsQ2VsbFdpZHRoKTtcbiAgICAgICAgICAgICAgICB0aGlzLmNvbnRhaW5lci50cmFuc2Zvcm1Qb3NpdGlvblgocG9zaXRpb25YLCAwKTtcblxuICAgICAgICAgICAgICAgIHRoaXMuY2VsbHMuc2V0Q291bnRlcih0aGlzLmNvdW50ZXIpO1xuICAgICAgICAgICAgICAgIHRoaXMuY2VsbHMubGluZVVwKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5pZkxlZnRET01Nb2RlQXRFbmQodGhpcy5jb3VudGVyKSkge1xuICAgICAgICAgICAgbGV0IGNvbnRhaW5lclBvc2l0aW9uWCA9IHRoaXMuY29udGFpbmVyLmdldEN1cnJlbnRQb3NpdGlvblgoKTtcbiAgICAgICAgICAgIGxldCBjb250YWluZXJXaWR0aCA9IHRoaXMuY29udGFpbmVyLmdldFdpZHRoKCk7XG4gICAgICAgICAgICB0aGlzLnZpc2libGVXaWR0aDtcblxuICAgICAgICAgICAgaWYgKHRoaXMuaXNMYXN0U2xpZGUodGhpcy5jb3VudGVyKSAmJlxuICAgICAgICAgICAgICAgIGNvbnRhaW5lcldpZHRoICsgY29udGFpbmVyUG9zaXRpb25YID49IHRoaXMudmlzaWJsZVdpZHRoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBsZXQgY29ycmVjdGlvbiA9IHRoaXMuZ2V0UG9zaXRpb25Db3JyZWN0aW9uKHRoaXMuY291bnRlcik7XG5cbiAgICAgICAgICAgIGlmIChjb3JyZWN0aW9uICE9PSAwKSB7XG4gICAgICAgICAgICAgICAgY29ycmVjdGlvbiA9IGNvcnJlY3Rpb24gKyB0aGlzLmZ1bGxDZWxsV2lkdGhcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHRoaXMuZGlyZWN0aW9uID09PSAncmlnaHQnKSB7XG4gICAgICAgICAgICAgICAgY29ycmVjdGlvbiA9IDA7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGxldCBwb3NpdGlvblggPSB0aGlzLmZpeGVkQ29udGFpbmVyUG9zaXRpb24gKyBjb3JyZWN0aW9uO1xuXG4gICAgICAgICAgICB0aGlzLmNvbnRhaW5lci50cmFuc2Zvcm1Qb3NpdGlvblgocG9zaXRpb25YLCAwKTtcbiAgICAgICAgICAgIHRoaXMuY2VsbHMuc2V0Q291bnRlcih0aGlzLmNvdW50ZXIpO1xuICAgICAgICAgICAgdGhpcy5jZWxscy5saW5lVXAoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGlzTGlnaHRET01Nb2RlKGNvdW50ZXI6IG51bWJlcikge1xuICAgICAgICBsZXQgZmxhZztcbiAgICAgICAgbGV0IHJlbWFpbmRlck9mQ2VsbHMgPSB0aGlzLmltYWdlcy5sZW5ndGggLSB0aGlzLm92ZXJmbG93Q2VsbHNMaW1pdCAtIHRoaXMubnVtYmVyT2ZWaXNpYmxlQ2VsbHM7XG5cbiAgICAgICAgaWYgKCF0aGlzLmlzTGlnaHRET00pIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChjb3VudGVyID4gdGhpcy5vdmVyZmxvd0NlbGxzTGltaXQgJiYgdGhpcy5kaXJlY3Rpb24gPT09IFwibGVmdFwiICYmXG4gICAgICAgICAgICBjb3VudGVyIDw9IHJlbWFpbmRlck9mQ2VsbHMpIHtcbiAgICAgICAgICAgIGZsYWcgPSB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGNvdW50ZXIgPj0gdGhpcy5vdmVyZmxvd0NlbGxzTGltaXQgJiYgdGhpcy5kaXJlY3Rpb24gPT09IFwicmlnaHRcIiAmJlxuICAgICAgICAgICAgY291bnRlciA8IHJlbWFpbmRlck9mQ2VsbHMpIHtcbiAgICAgICAgICAgIGZsYWcgPSB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMuY291bnRlciA+IHRoaXMub3ZlcmZsb3dDZWxsc0xpbWl0ICYmIHRoaXMuZGlyZWN0aW9uID09PSBcImxlZnRcIiAmJlxuICAgICAgICAgICAgdGhpcy5jb3VudGVyIDw9IHJlbWFpbmRlck9mQ2VsbHMpIHtcbiAgICAgICAgICAgIGZsYWcgPSB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMuY291bnRlciA+PSB0aGlzLm92ZXJmbG93Q2VsbHNMaW1pdCAmJiB0aGlzLmRpcmVjdGlvbiA9PT0gXCJyaWdodFwiICYmXG4gICAgICAgICAgICB0aGlzLmNvdW50ZXIgPCByZW1haW5kZXJPZkNlbGxzKSB7XG4gICAgICAgICAgICBmbGFnID0gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBmbGFnO1xuICAgIH1cblxuICAgIGlmTGVmdERPTU1vZGVBdEVuZChjb3VudGVyOiBudW1iZXIpIHtcbiAgICAgICAgbGV0IGZsYWc7XG4gICAgICAgIGxldCByZW1haW5kZXJPZkNlbGxzID0gdGhpcy5pbWFnZXMubGVuZ3RoIC0gdGhpcy5vdmVyZmxvd0NlbGxzTGltaXQgLSB0aGlzLm51bWJlck9mVmlzaWJsZUNlbGxzO1xuXG4gICAgICAgIGlmIChjb3VudGVyID49IHJlbWFpbmRlck9mQ2VsbHMpIHtcbiAgICAgICAgICAgIGZsYWcgPSB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMuY291bnRlciA+PSByZW1haW5kZXJPZkNlbGxzKSB7XG4gICAgICAgICAgICBmbGFnID0gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBmbGFnO1xuICAgIH1cblxuICAgIGlmTGVmdERPTU1vZGVUb0JlZ2lubmluZyhjb3VudGVyOiBudW1iZXIpIHtcbiAgICAgICAgbGV0IGZsYWc7XG5cbiAgICAgICAgaWYgKGNvdW50ZXIgPD0gdGhp