UNPKG

@catull/igniteui-angular

Version:

Ignite UI for Angular is a dependency-free Angular toolkit for building modern web apps

153 lines 22.3 kB
import { __extends } from "tslib"; import { VerticalAlignment, HorizontalAlignment } from './../utilities'; import { BaseFitPositionStrategy } from './base-fit-position-strategy'; /** * Positions the element as in **Connected** positioning strategy and re-positions the element in * the view port (calculating a different start point) in case the element is partially getting out of view */ var AutoPositionStrategy = /** @class */ (function (_super) { __extends(AutoPositionStrategy, _super); function AutoPositionStrategy() { return _super !== null && _super.apply(this, arguments) || this; } /** @inheritdoc */ AutoPositionStrategy.prototype.fitInViewport = function (element, connectedFit) { var transformString = []; if (connectedFit.fitHorizontal.back < 0 || connectedFit.fitHorizontal.forward < 0) { if (this.canFlipHorizontal(connectedFit)) { this.flipHorizontal(); } else { var horizontalPush = this.horizontalPush(connectedFit); transformString.push("translateX(" + horizontalPush + "px)"); } } if (connectedFit.fitVertical.back < 0 || connectedFit.fitVertical.forward < 0) { if (this.canFlipVertical(connectedFit)) { this.flipVertical(); } else { var verticalPush = this.verticalPush(connectedFit); transformString.push("translateY(" + verticalPush + "px)"); } } element.style.transform = transformString.join(' ').trim(); }; /** * Checks if element can be flipped without get off the viewport * @param connectedFit connectedFit object containing all necessary parameters * @returns true if element can be flipped and stain in viewport */ AutoPositionStrategy.prototype.canFlipHorizontal = function (connectedFit) { // HorizontalAlignment can be Left = -1; Center = -0.5 or Right = 0. // To virtually flip direction and start point (both are HorizontalAlignment) we can do this: // flippedAlignment = (-1) * (HorizontalAlignment + 1) // this way: // (-1) * (Left + 1) = 0 = Right // (-1) * (Center + 1) = -0.5 = Center // (-1) * (Right + 1) = -1 = Left var flippedStartPoint = (-1) * (this.settings.horizontalStartPoint + 1); var flippedDirection = (-1) * (this.settings.horizontalDirection + 1); var leftBorder = this.calculateLeft(connectedFit.targetRect, connectedFit.contentElementRect, flippedStartPoint, flippedDirection, 0); var rightBorder = leftBorder + connectedFit.contentElementRect.width; return connectedFit.viewPortRect.left < leftBorder && rightBorder < connectedFit.viewPortRect.right; }; /** * Checks if element can be flipped without get off the viewport * @param connectedFit connectedFit object containing all necessary parameters * @returns true if element can be flipped and stain in viewport */ AutoPositionStrategy.prototype.canFlipVertical = function (connectedFit) { var flippedStartPoint = (-1) * (this.settings.verticalStartPoint + 1); var flippedDirection = (-1) * (this.settings.verticalDirection + 1); var topBorder = this.calculateTop(connectedFit.targetRect, connectedFit.contentElementRect, flippedStartPoint, flippedDirection, 0); var bottomBorder = topBorder + connectedFit.contentElementRect.height; return connectedFit.viewPortRect.top < topBorder && bottomBorder < connectedFit.viewPortRect.bottom; }; /** * Flips direction and start point of the position settings */ AutoPositionStrategy.prototype.flipHorizontal = function () { switch (this.settings.horizontalDirection) { case HorizontalAlignment.Left: this.settings.horizontalDirection = HorizontalAlignment.Right; break; case HorizontalAlignment.Right: this.settings.horizontalDirection = HorizontalAlignment.Left; break; } switch (this.settings.horizontalStartPoint) { case HorizontalAlignment.Left: this.settings.horizontalStartPoint = HorizontalAlignment.Right; break; case HorizontalAlignment.Right: this.settings.horizontalStartPoint = HorizontalAlignment.Left; break; } }; /** * Flips direction and start point of the position settings */ AutoPositionStrategy.prototype.flipVertical = function () { switch (this.settings.verticalDirection) { case VerticalAlignment.Top: this.settings.verticalDirection = VerticalAlignment.Bottom; break; case VerticalAlignment.Bottom: this.settings.verticalDirection = VerticalAlignment.Top; break; } switch (this.settings.verticalStartPoint) { case VerticalAlignment.Top: this.settings.verticalStartPoint = VerticalAlignment.Bottom; break; case VerticalAlignment.Bottom: this.settings.verticalStartPoint = VerticalAlignment.Top; break; } }; /** * Calculates necessary horizontal push according to provided connectedFit * @param connectedFit connectedFit object containing all necessary parameters * @returns amount of necessary translation which will push the element into viewport */ AutoPositionStrategy.prototype.horizontalPush = function (connectedFit) { var leftExtend = connectedFit.left; var rightExtend = connectedFit.right - connectedFit.viewPortRect.right; // if leftExtend < 0 overlay goes beyond left end of the screen. We should push it back with exactly // as much as it is beyond the screen. // if rightExtend > 0 overlay goes beyond right end of the screen. We should push it back with the // extend but with amount not bigger than what left between left border of screen and left border of // overlay, e.g. leftExtend if (leftExtend < 0) { return Math.abs(leftExtend); } else if (rightExtend > 0) { return -Math.min(rightExtend, leftExtend); } else { return 0; } }; /** * Calculates necessary vertical push according to provided connectedFit * @param connectedFit connectedFit object containing all necessary parameters * @returns amount of necessary translation which will push the element into viewport */ AutoPositionStrategy.prototype.verticalPush = function (connectedFit) { var topExtend = connectedFit.top; var bottomExtend = connectedFit.bottom - connectedFit.viewPortRect.bottom; if (topExtend < 0) { return Math.abs(topExtend); } else if (bottomExtend > 0) { return -Math.min(bottomExtend, topExtend); } else { return 0; } }; return AutoPositionStrategy; }(BaseFitPositionStrategy)); export { AutoPositionStrategy }; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXV0by1wb3NpdGlvbi1zdHJhdGVneS5qcyIsInNvdXJjZVJvb3QiOiJuZzovL2lnbml0ZXVpLWFuZ3VsYXIvIiwic291cmNlcyI6WyJsaWIvc2VydmljZXMvb3ZlcmxheS9wb3NpdGlvbi9hdXRvLXBvc2l0aW9uLXN0cmF0ZWd5LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsbUJBQW1CLEVBQWdCLE1BQU0sZ0JBQWdCLENBQUM7QUFDdEYsT0FBTyxFQUFFLHVCQUF1QixFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFFdkU7OztHQUdHO0FBQ0g7SUFBMEMsd0NBQXVCO0lBQWpFOztJQWlKQSxDQUFDO0lBL0lHLGtCQUFrQjtJQUNSLDRDQUFhLEdBQXZCLFVBQXdCLE9BQW9CLEVBQUUsWUFBMEI7UUFDcEUsSUFBTSxlQUFlLEdBQWEsRUFBRSxDQUFDO1FBQ3JDLElBQUksWUFBWSxDQUFDLGFBQWEsQ0FBQyxJQUFJLEdBQUcsQ0FBQyxJQUFJLFlBQVksQ0FBQyxhQUFhLENBQUMsT0FBTyxHQUFHLENBQUMsRUFBRTtZQUMvRSxJQUFJLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxZQUFZLENBQUMsRUFBRTtnQkFDdEMsSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDO2FBQ3pCO2lCQUFNO2dCQUNILElBQU0sY0FBYyxHQUFHLElBQUksQ0FBQyxjQUFjLENBQUMsWUFBWSxDQUFDLENBQUM7Z0JBQ3pELGVBQWUsQ0FBQyxJQUFJLENBQUMsZ0JBQWMsY0FBYyxRQUFLLENBQUMsQ0FBQzthQUMzRDtTQUNKO1FBRUQsSUFBSSxZQUFZLENBQUMsV0FBVyxDQUFDLElBQUksR0FBRyxDQUFDLElBQUksWUFBWSxDQUFDLFdBQVcsQ0FBQyxPQUFPLEdBQUcsQ0FBQyxFQUFFO1lBQzNFLElBQUksSUFBSSxDQUFDLGVBQWUsQ0FBQyxZQUFZLENBQUMsRUFBRTtnQkFDcEMsSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDO2FBQ3ZCO2lCQUFNO2dC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QyxHQUFHLENBQUMsVUFBVSxDQUFDLENBQUM7U0FDL0I7YUFBTSxJQUFJLFdBQVcsR0FBRyxDQUFDLEVBQUU7WUFDeEIsT0FBTyxDQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsV0FBVyxFQUFFLFVBQVUsQ0FBQyxDQUFDO1NBQzlDO2FBQU07WUFDSCxPQUFPLENBQUMsQ0FBQztTQUNaO0lBQ0wsQ0FBQztJQUVEOzs7O09BSUc7SUFDSywyQ0FBWSxHQUFwQixVQUFxQixZQUEwQjtRQUMzQyxJQUFNLFNBQVMsR0FBRyxZQUFZLENBQUMsR0FBRyxDQUFDO1FBQ25DLElBQU0sWUFBWSxHQUFHLFlBQVksQ0FBQyxNQUFNLEdBQUcsWUFBWSxDQUFDLFlBQVksQ0FBQyxNQUFNLENBQUM7UUFDNUUsSUFBSSxTQUFTLEdBQUcsQ0FBQyxFQUFFO1lBQ2YsT0FBTyxJQUFJLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxDQUFDO1NBQzlCO2FBQU0sSUFBSSxZQUFZLEdBQUcsQ0FBQyxFQUFFO1lBQ3pCLE9BQU8sQ0FBRSxJQUFJLENBQUMsR0FBRyxDQUFDLFlBQVksRUFBRSxTQUFTLENBQUMsQ0FBQztTQUM5QzthQUFNO1lBQ0gsT0FBTyxDQUFDLENBQUM7U0FDWjtJQUNMLENBQUM7SUFDTCwyQkFBQztBQUFELENBQUMsQUFqSkQsQ0FBMEMsdUJBQXVCLEdBaUpoRSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFZlcnRpY2FsQWxpZ25tZW50LCBIb3Jpem9udGFsQWxpZ25tZW50LCBDb25uZWN0ZWRGaXQgfSBmcm9tICcuLy4uL3V0aWxpdGllcyc7XG5pbXBvcnQgeyBCYXNlRml0UG9zaXRpb25TdHJhdGVneSB9IGZyb20gJy4vYmFzZS1maXQtcG9zaXRpb24tc3RyYXRlZ3knO1xuXG4vKipcbiAqIFBvc2l0aW9ucyB0aGUgZWxlbWVudCBhcyBpbiAqKkNvbm5lY3RlZCoqIHBvc2l0aW9uaW5nIHN0cmF0ZWd5IGFuZCByZS1wb3NpdGlvbnMgdGhlIGVsZW1lbnQgaW5cbiAqIHRoZSB2aWV3IHBvcnQgKGNhbGN1bGF0aW5nIGEgZGlmZmVyZW50IHN0YXJ0IHBvaW50KSBpbiBjYXNlIHRoZSBlbGVtZW50IGlzIHBhcnRpYWxseSBnZXR0aW5nIG91dCBvZiB2aWV3XG4gKi9cbmV4cG9ydCBjbGFzcyBBdXRvUG9zaXRpb25TdHJhdGVneSBleHRlbmRzIEJhc2VGaXRQb3NpdGlvblN0cmF0ZWd5IHtcblxuICAgIC8qKiBAaW5oZXJpdGRvYyAqL1xuICAgIHByb3RlY3RlZCBmaXRJblZpZXdwb3J0KGVsZW1lbnQ6IEhUTUxFbGVtZW50LCBjb25uZWN0ZWRGaXQ6IENvbm5lY3RlZEZpdCkge1xuICAgICAgICBjb25zdCB0cmFuc2Zvcm1TdHJpbmc6IHN0cmluZ1tdID0gW107XG4gICAgICAgIGlmIChjb25uZWN0ZWRGaXQuZml0SG9yaXpvbnRhbC5iYWNrIDwgMCB8fCBjb25uZWN0ZWRGaXQuZml0SG9yaXpvbnRhbC5mb3J3YXJkIDwgMCkge1xuICAgICAgICAgICAgaWYgKHRoaXMuY2FuRmxpcEhvcml6b250YWwoY29ubmVjdGVkRml0KSkge1xuICAgICAgICAgICAgICAgIHRoaXMuZmxpcEhvcml6b250YWwoKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgY29uc3QgaG9yaXpvbnRhbFB1c2ggPSB0aGlzLmhvcml6b250YWxQdXNoKGNvbm5lY3RlZEZpdCk7XG4gICAgICAgICAgICAgICAgdHJhbnNmb3JtU3RyaW5nLnB1c2goYHRyYW5zbGF0ZVgoJHtob3Jpem9udGFsUHVzaH1weClgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChjb25uZWN0ZWRGaXQuZml0VmVydGljYWwuYmFjayA8IDAgfHwgY29ubmVjdGVkRml0LmZpdFZlcnRpY2FsLmZvcndhcmQgPCAwKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5jYW5GbGlwVmVydGljYWwoY29ubmVjdGVkRml0KSkge1xuICAgICAgICAgICAgICAgIHRoaXMuZmxpcFZlcnRpY2FsKCk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGNvbnN0IHZlcnRpY2FsUHVzaCA9IHRoaXMudmVydGljYWxQdXNoKGNvbm5lY3RlZEZpdCk7XG4gICAgICAgICAgICAgICAgdHJhbnNmb3JtU3RyaW5nLnB1c2goYHRyYW5zbGF0ZVkoJHt2ZXJ0aWNhbFB1c2h9cHgpYCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBlbGVtZW50LnN0eWxlLnRyYW5zZm9ybSA9IHRyYW5zZm9ybVN0cmluZy5qb2luKCcgJykudHJpbSgpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENoZWNrcyBpZiBlbGVtZW50IGNhbiBiZSBmbGlwcGVkIHdpdGhvdXQgZ2V0IG9mZiB0aGUgdmlld3BvcnRcbiAgICAgKiBAcGFyYW0gY29ubmVjdGVkRml0IGNvbm5lY3RlZEZpdCBvYmplY3QgY29udGFpbmluZyBhbGwgbmVjZXNzYXJ5IHBhcmFtZXRlcnNcbiAgICAgKiBAcmV0dXJucyB0cnVlIGlmIGVsZW1lbnQgY2FuIGJlIGZsaXBwZWQgYW5kIHN0YWluIGluIHZpZXdwb3J0XG4gICAgICovXG4gICAgcHJpdmF0ZSBjYW5GbGlwSG9yaXpvbnRhbChjb25uZWN0ZWRGaXQ6IENvbm5lY3RlZEZpdCk6IGJvb2xlYW4ge1xuICAgICAgICAvLyAgSG9yaXpvbnRhbEFsaWdubWVudCBjYW4gYmUgTGVmdCA9IC0xOyBDZW50ZXIgPSAtMC41IG9yIFJpZ2h0ID0gMC5cbiAgICAgICAgLy8gIFRvIHZpcnR1YWxseSBmbGlwIGRpcmVjdGlvbiBhbmQgc3RhcnQgcG9pbnQgKGJvdGggYXJlIEhvcml6b250YWxBbGlnbm1lbnQpIHdlIGNhbiBkbyB0aGlzOlxuICAgICAgICAvLyAgZmxpcHBlZEFsaWdubWVudCA9ICgtMSkgKiAoSG9yaXpvbnRhbEFsaWdubWVudCArIDEpXG4gICAgICAgIC8vICB0aGlzIHdheTpcbiAgICAgICAgLy8gICgtMSkgKiAoTGVmdCArIDEpID0gMCA9IFJpZ2h0XG4gICAgICAgIC8vICAoLTEpICogKENlbnRlciArIDEpID0gLTAuNSA9IENlbnRlclxuICAgICAgICAvLyAgKC0xKSAqIChSaWdodCArIDEpID0gLTEgPSBMZWZ0XG4gICAgICAgIGNvbnN0IGZsaXBwZWRTdGFydFBvaW50ID0gKC0xKSAqICh0aGlzLnNldHRpbmdzLmhvcml6b250YWxTdGFydFBvaW50ICsgMSk7XG4gICAgICAgIGNvbnN0IGZsaXBwZWREaXJlY3Rpb24gPSAoLTEpICogKHRoaXMuc2V0dGluZ3MuaG9yaXpvbnRhbERpcmVjdGlvbiArIDEpO1xuXG4gICAgICAgIGNvbnN0IGxlZnRCb3JkZXIgPSB0aGlzLmNhbGN1bGF0ZUxlZnQoXG4gICAgICAgICAgICBjb25uZWN0ZWRGaXQudGFyZ2V0UmVjdCwgY29ubmVjdGVkRml0LmNvbnRlbnRFbGVtZW50UmVjdCwgZmxpcHBlZFN0YXJ0UG9pbnQsIGZsaXBwZWREaXJlY3Rpb24sIDApO1xuICAgICAgICBjb25zdCByaWdodEJvcmRlciA9IGxlZnRCb3JkZXIgKyBjb25uZWN0ZWRGaXQuY29udGVudEVsZW1lbnRSZWN0LndpZHRoO1xuICAgICAgICByZXR1cm4gY29ubmVjdGVkRml0LnZpZXdQb3J0UmVjdC5sZWZ0IDwgbGVmdEJvcmRlciAmJiByaWdodEJvcmRlciA8IGNvbm5lY3RlZEZpdC52aWV3UG9ydFJlY3QucmlnaHQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2hlY2tzIGlmIGVsZW1lbnQgY2FuIGJlIGZsaXBwZWQgd2l0aG91dCBnZXQgb2ZmIHRoZSB2aWV3cG9ydFxuICAgICAqIEBwYXJhbSBjb25uZWN0ZWRGaXQgY29ubmVjdGVkRml0IG9iamVjdCBjb250YWluaW5nIGFsbCBuZWNlc3NhcnkgcGFyYW1ldGVyc1xuICAgICAqIEByZXR1cm5zIHRydWUgaWYgZWxlbWVudCBjYW4gYmUgZmxpcHBlZCBhbmQgc3RhaW4gaW4gdmlld3BvcnRcbiAgICAgKi9cbiAgICBwcml2YXRlIGNhbkZsaXBWZXJ0aWNhbChjb25uZWN0ZWRGaXQ6IENvbm5lY3RlZEZpdCk6IGJvb2xlYW4ge1xuICAgICAgICBjb25zdCBmbGlwcGVkU3RhcnRQb2ludCA9ICgtMSkgKiAodGhpcy5zZXR0aW5ncy52ZXJ0aWNhbFN0YXJ0UG9pbnQgKyAxKTtcbiAgICAgICAgY29uc3QgZmxpcHBlZERpcmVjdGlvbiA9ICgtMSkgKiAodGhpcy5zZXR0aW5ncy52ZXJ0aWNhbERpcmVjdGlvbiArIDEpO1xuXG4gICAgICAgIGNvbnN0IHRvcEJvcmRlciA9IHRoaXMuY2FsY3VsYXRlVG9wKFxuICAgICAgICAgICAgY29ubmVjdGVkRml0LnRhcmdldFJlY3QsIGNvbm5lY3RlZEZpdC5jb250ZW50RWxlbWVudFJlY3QsIGZsaXBwZWRTdGFydFBvaW50LCBmbGlwcGVkRGlyZWN0aW9uLCAwKTtcbiAgICAgICAgY29uc3QgYm90dG9tQm9yZGVyID0gdG9wQm9yZGVyICsgY29ubmVjdGVkRml0LmNvbnRlbnRFbGVtZW50UmVjdC5oZWlnaHQ7XG4gICAgICAgIHJldHVybiBjb25uZWN0ZWRGaXQudmlld1BvcnRSZWN0LnRvcCA8IHRvcEJvcmRlciAmJiBib3R0b21Cb3JkZXIgPCBjb25uZWN0ZWRGaXQudmlld1BvcnRSZWN0LmJvdHRvbTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBGbGlwcyBkaXJlY3Rpb24gYW5kIHN0YXJ0IHBvaW50IG9mIHRoZSBwb3NpdGlvbiBzZXR0aW5nc1xuICAgICAqL1xuICAgIHByaXZhdGUgZmxpcEhvcml6b250YWwoKSB7XG4gICAgICAgIHN3aXRjaCAodGhpcy5zZXR0aW5ncy5ob3Jpem9udGFsRGlyZWN0aW9uKSB7XG4gICAgICAgICAgICBjYXNlIEhvcml6b250YWxBbGlnbm1lbnQuTGVmdDpcbiAgICAgICAgICAgICAgICB0aGlzLnNldHRpbmdzLmhvcml6b250YWxEaXJlY3Rpb24gPSBIb3Jpem9udGFsQWxpZ25tZW50LlJpZ2h0O1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBIb3Jpem9udGFsQWxpZ25tZW50LlJpZ2h0OlxuICAgICAgICAgICAgICAgIHRoaXMuc2V0dGluZ3MuaG9yaXpvbnRhbERpcmVjdGlvbiA9IEhvcml6b250YWxBbGlnbm1lbnQuTGVmdDtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBzd2l0Y2ggKHRoaXMuc2V0dGluZ3MuaG9yaXpvbnRhbFN0YXJ0UG9pbnQpIHtcbiAgICAgICAgICAgIGNhc2UgSG9yaXpvbnRhbEFsaWdubWVudC5MZWZ0OlxuICAgICAgICAgICAgICAgIHRoaXMuc2V0dGluZ3MuaG9yaXpvbnRhbFN0YXJ0UG9pbnQgPSBIb3Jpem9udGFsQWxpZ25tZW50LlJpZ2h0O1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBIb3Jpem9udGFsQWxpZ25tZW50LlJpZ2h0OlxuICAgICAgICAgICAgICAgIHRoaXMuc2V0dGluZ3MuaG9yaXpvbnRhbFN0YXJ0UG9pbnQgPSBIb3Jpem9udGFsQWxpZ25tZW50LkxlZnQ7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBGbGlwcyBkaXJlY3Rpb24gYW5kIHN0YXJ0IHBvaW50IG9mIHRoZSBwb3NpdGlvbiBzZXR0aW5nc1xuICAgICAqL1xuICAgIHByaXZhdGUgZmxpcFZlcnRpY2FsKCkge1xuICAgICAgICBzd2l0Y2ggKHRoaXMuc2V0dGluZ3MudmVydGljYWxEaXJlY3Rpb24pIHtcbiAgICAgICAgICAgIGNhc2UgVmVydGljYWxBbGlnbm1lbnQuVG9wOlxuICAgICAgICAgICAgICAgIHRoaXMuc2V0dGluZ3MudmVydGljYWxEaXJlY3Rpb24gPSBWZXJ0aWNhbEFsaWdubWVudC5Cb3R0b207XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIFZlcnRpY2FsQWxpZ25tZW50LkJvdHRvbTpcbiAgICAgICAgICAgICAgICB0aGlzLnNldHRpbmdzLnZlcnRpY2FsRGlyZWN0aW9uID0gVmVydGljYWxBbGlnbm1lbnQuVG9wO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIHN3aXRjaCAodGhpcy5zZXR0aW5ncy52ZXJ0aWNhbFN0YXJ0UG9pbnQpIHtcbiAgICAgICAgICAgIGNhc2UgVmVydGljYWxBbGlnbm1lbnQuVG9wOlxuICAgICAgICAgICAgICAgIHRoaXMuc2V0dGluZ3MudmVydGljYWxTdGFydFBvaW50ID0gVmVydGljYWxBbGlnbm1lbnQuQm90dG9tO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBWZXJ0aWNhbEFsaWdubWVudC5Cb3R0b206XG4gICAgICAgICAgICAgICAgdGhpcy5zZXR0aW5ncy52ZXJ0aWNhbFN0YXJ0UG9pbnQgPSBWZXJ0aWNhbEFsaWdubWVudC5Ub3A7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDYWxjdWxhdGVzIG5lY2Vzc2FyeSBob3Jpem9udGFsIHB1c2ggYWNjb3JkaW5nIHRvIHByb3ZpZGVkIGNvbm5lY3RlZEZpdFxuICAgICAqIEBwYXJhbSBjb25uZWN0ZWRGaXQgY29ubmVjdGVkRml0IG9iamVjdCBjb250YWluaW5nIGFsbCBuZWNlc3NhcnkgcGFyYW1ldGVyc1xuICAgICAqIEByZXR1cm5zIGFtb3VudCBvZiBuZWNlc3NhcnkgdHJhbnNsYXRpb24gd2hpY2ggd2lsbCBwdXNoIHRoZSBlbGVtZW50IGludG8gdmlld3BvcnRcbiAgICAgKi9cbiAgICBwcml2YXRlIGhvcml6b250YWxQdXNoKGNvbm5lY3RlZEZpdDogQ29ubmVjdGVkRml0KTogbnVtYmVyIHtcbiAgICAgICAgY29uc3QgbGVmdEV4dGVuZCA9IGNvbm5lY3RlZEZpdC5sZWZ0O1xuICAgICAgICBjb25zdCByaWdodEV4dGVuZCA9IGNvbm5lY3RlZEZpdC5yaWdodCAtIGNvbm5lY3RlZEZpdC52aWV3UG9ydFJlY3QucmlnaHQ7XG4gICAgICAgIC8vICBpZiBsZWZ0RXh0ZW5kIDwgMCBvdmVybGF5IGdvZXMgYmV5b25kIGxlZnQgZW5kIG9mIHRoZSBzY3JlZW4uIFdlIHNob3VsZCBwdXNoIGl0IGJhY2sgd2l0aCBleGFjdGx5XG4gICAgICAgIC8vICBhcyBtdWNoIGFzIGl0IGlzIGJleW9uZCB0aGUgc2NyZWVuLlxuICAgICAgICAvLyAgaWYgcmlnaHRFeHRlbmQgPiAwIG92ZXJsYXkgZ29lcyBiZXlvbmQgcmlnaHQgZW5kIG9mIHRoZSBzY3JlZW4uIFdlIHNob3VsZCBwdXNoIGl0IGJhY2sgd2l0aCB0aGVcbiAgICAgICAgLy8gIGV4dGVuZCBidXQgd2l0aCBhbW91bnQgbm90IGJpZ2dlciB0aGFuIHdoYXQgbGVmdCBiZXR3ZWVuIGxlZnQgYm9yZGVyIG9mIHNjcmVlbiBhbmQgbGVmdCBib3JkZXIgb2ZcbiAgICAgICAgLy8gIG92ZXJsYXksIGUuZy4gbGVmdEV4dGVuZFxuICAgICAgICBpZiAobGVmdEV4dGVuZCA8IDApIHtcbiAgICAgICAgICAgIHJldHVybiBNYXRoLmFicyhsZWZ0RXh0ZW5kKTtcbiAgICAgICAgfSBlbHNlIGlmIChyaWdodEV4dGVuZCA+IDApIHtcbiAgICAgICAgICAgIHJldHVybiAtIE1hdGgubWluKHJpZ2h0RXh0ZW5kLCBsZWZ0RXh0ZW5kKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiAwO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2FsY3VsYXRlcyBuZWNlc3NhcnkgdmVydGljYWwgcHVzaCBhY2NvcmRpbmcgdG8gcHJvdmlkZWQgY29ubmVjdGVkRml0XG4gICAgICogQHBhcmFtIGNvbm5lY3RlZEZpdCBjb25uZWN0ZWRGaXQgb2JqZWN0IGNvbnRhaW5pbmcgYWxsIG5lY2Vzc2FyeSBwYXJhbWV0ZXJzXG4gICAgICogQHJldHVybnMgYW1vdW50IG9mIG5lY2Vzc2FyeSB0cmFuc2xhdGlvbiB3aGljaCB3aWxsIHB1c2ggdGhlIGVsZW1lbnQgaW50byB2aWV3cG9ydFxuICAgICAqL1xuICAgIHByaXZhdGUgdmVydGljYWxQdXNoKGNvbm5lY3RlZEZpdDogQ29ubmVjdGVkRml0KTogbnVtYmVyIHtcbiAgICAgICAgY29uc3QgdG9wRXh0ZW5kID0gY29ubmVjdGVkRml0LnRvcDtcbiAgICAgICAgY29uc3QgYm90dG9tRXh0ZW5kID0gY29ubmVjdGVkRml0LmJvdHRvbSAtIGNvbm5lY3RlZEZpdC52aWV3UG9ydFJlY3QuYm90dG9tO1xuICAgICAgICBpZiAodG9wRXh0ZW5kIDwgMCkge1xuICAgICAgICAgICAgcmV0dXJuIE1hdGguYWJzKHRvcEV4dGVuZCk7XG4gICAgICAgIH0gZWxzZSBpZiAoYm90dG9tRXh0ZW5kID4gMCkge1xuICAgICAgICAgICAgcmV0dXJuIC0gTWF0aC5taW4oYm90dG9tRXh0ZW5kLCB0b3BFeHRlbmQpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIDA7XG4gICAgICAgIH1cbiAgICB9XG59XG4iXX0=