@nova-ui/bits
Version:
SolarWinds Nova Framework
223 lines • 31.8 kB
JavaScript
import { Injectable } from "@angular/core";
import { PopoverOverlayPosition } from "./public-api";
import { OVERLAY_ARROW_SIZE } from "../overlay/constants";
import * as i0 from "@angular/core";
var PopoverOverlayPlacement;
(function (PopoverOverlayPlacement) {
PopoverOverlayPlacement["Left"] = "left";
PopoverOverlayPlacement["Right"] = "right";
PopoverOverlayPlacement["Top"] = "top";
PopoverOverlayPlacement["Bottom"] = "bottom";
})(PopoverOverlayPlacement || (PopoverOverlayPlacement = {}));
var PanelClass;
(function (PanelClass) {
PanelClass["overlayLeftTop"] = "overlay-left-top";
PanelClass["overlayLeftBottom"] = "overlay-left-bottom";
PanelClass["overlayRightTop"] = "overlay-right-top";
PanelClass["overlayRightBottom"] = "overlay-right-bottom";
PanelClass["overlayTopLeft"] = "overlay-top-left";
PanelClass["overlayTopRight"] = "overlay-top-right";
PanelClass["overlayBottomLeft"] = "overlay-bottom-left";
PanelClass["overlayBottomRight"] = "overlay-bottom-right";
})(PanelClass || (PanelClass = {}));
export class PopoverPositionService {
constructor() {
this.popoverPositions = getPopoverPositions();
}
setPopoverOffset(panelClass, elRefHeight, overlayRefElement) {
const ARROW_SIZE = OVERLAY_ARROW_SIZE;
const popoverOffsetY = this.calculateOffsetY(elRefHeight);
if (Array.isArray(panelClass)) {
panelClass = this.getPopoverPositionPanelClass(panelClass);
}
if (!panelClass) {
return;
}
overlayRefElement.style.marginLeft = "";
overlayRefElement.style.marginTop = "";
overlayRefElement.style.marginBottom = "";
overlayRefElement.style.marginRight = "";
switch (panelClass) {
case PanelClass.overlayLeftTop:
overlayRefElement.style.marginRight = ARROW_SIZE + "px";
overlayRefElement.style.marginBottom = -popoverOffsetY + "px";
break;
case PanelClass.overlayLeftBottom:
overlayRefElement.style.marginRight = ARROW_SIZE + "px";
overlayRefElement.style.marginTop = -popoverOffsetY + "px";
break;
case PanelClass.overlayRightTop:
overlayRefElement.style.marginLeft = ARROW_SIZE + "px";
overlayRefElement.style.marginBottom = -popoverOffsetY + "px";
break;
case PanelClass.overlayRightBottom:
overlayRefElement.style.marginLeft = ARROW_SIZE + "px";
overlayRefElement.style.marginTop = -popoverOffsetY + "px";
break;
case PanelClass.overlayTopLeft:
overlayRefElement.style.marginRight = -2 * ARROW_SIZE + "px";
overlayRefElement.style.marginBottom = ARROW_SIZE + "px";
break;
case PanelClass.overlayTopRight:
overlayRefElement.style.marginLeft = -2 * ARROW_SIZE + "px";
overlayRefElement.style.marginBottom = ARROW_SIZE + "px";
break;
case PanelClass.overlayBottomLeft:
overlayRefElement.style.marginRight = -2 * ARROW_SIZE + "px";
overlayRefElement.style.marginTop = ARROW_SIZE + "px";
break;
case PanelClass.overlayBottomRight:
overlayRefElement.style.marginLeft = -2 * ARROW_SIZE + "px";
overlayRefElement.style.marginTop = ARROW_SIZE + "px";
break;
}
}
possiblePositionsForPlacement(placement) {
const possiblePositions = [];
switch (placement) {
case PopoverOverlayPlacement.Left:
possiblePositions.push(...this.getPositionsForPlacement(PopoverOverlayPlacement.Left));
break;
case PopoverOverlayPlacement.Right:
possiblePositions.push(...this.getPositionsForPlacement(PopoverOverlayPlacement.Right));
break;
case PopoverOverlayPlacement.Top:
possiblePositions.push(...this.getPositionsForPlacement(PopoverOverlayPlacement.Top));
break;
case PopoverOverlayPlacement.Bottom:
possiblePositions.push(...this.getPositionsForPlacement(PopoverOverlayPlacement.Bottom));
break;
}
return possiblePositions;
}
getConnectedPositions(positions) {
return positions.map((positionName) => this.popoverPositions[positionName]);
}
/**
* Returns all possible positions for a placement
* Eg: left => [OVERLAY_POSITIONS[centerLeft], OVERLAY_POSITIONS[topLeft], OVERLAY_POSITIONS[bottomLeft]]
*
* @param placement
* @returns ConnectedPosition[]
*/
getPositionsForPlacement(placement) {
let possiblePositionNames = [];
switch (placement) {
case PopoverOverlayPlacement.Left:
possiblePositionNames = [
PopoverOverlayPosition.leftBottom,
PopoverOverlayPosition.leftTop,
PopoverOverlayPosition.rightBottom,
PopoverOverlayPosition.rightTop,
];
break;
case PopoverOverlayPlacement.Right:
possiblePositionNames = [
PopoverOverlayPosition.rightBottom,
PopoverOverlayPosition.rightTop,
PopoverOverlayPosition.leftBottom,
PopoverOverlayPosition.leftTop,
];
break;
case PopoverOverlayPlacement.Top:
possiblePositionNames = [
PopoverOverlayPosition.topRight,
PopoverOverlayPosition.topLeft,
PopoverOverlayPosition.bottomRight,
PopoverOverlayPosition.bottomLeft,
];
break;
case PopoverOverlayPlacement.Bottom:
possiblePositionNames = [
PopoverOverlayPosition.bottomRight,
PopoverOverlayPosition.bottomLeft,
PopoverOverlayPosition.topRight,
PopoverOverlayPosition.topLeft,
];
break;
}
return this.getConnectedPositions(possiblePositionNames);
}
getPopoverPositionPanelClass(panelClass) {
let result;
for (const panelClassKey in PanelClass) {
if (PanelClass.hasOwnProperty(panelClassKey)) {
result = panelClass.find((i) => i === panelClassKey);
}
}
return result || "";
}
calculateOffsetY(elRefHeight) {
const ARROW_CENTER_POSITION_PX = 20;
if (!elRefHeight) {
return 5;
}
return ARROW_CENTER_POSITION_PX - elRefHeight / 2;
}
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: PopoverPositionService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: PopoverPositionService }); }
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: PopoverPositionService, decorators: [{
type: Injectable
}], ctorParameters: () => [] });
export function getPopoverPositions() {
return {
[PopoverOverlayPosition.topLeft]: {
panelClass: "overlay-top-left",
originX: "center",
originY: "top",
overlayX: "end",
overlayY: "bottom",
},
[PopoverOverlayPosition.bottomLeft]: {
panelClass: "overlay-bottom-left",
originX: "center",
originY: "bottom",
overlayX: "end",
overlayY: "top",
},
[PopoverOverlayPosition.topRight]: {
panelClass: "overlay-top-right",
originX: "center",
originY: "top",
overlayX: "start",
overlayY: "bottom",
},
[PopoverOverlayPosition.bottomRight]: {
panelClass: "overlay-bottom-right",
originX: "center",
originY: "bottom",
overlayX: "start",
overlayY: "top",
},
[PopoverOverlayPosition.leftTop]: {
panelClass: "overlay-left-top",
originX: "start",
originY: "bottom",
overlayX: "end",
overlayY: "bottom",
},
[PopoverOverlayPosition.leftBottom]: {
panelClass: "overlay-left-bottom",
originX: "start",
originY: "top",
overlayX: "end",
overlayY: "top",
},
[PopoverOverlayPosition.rightTop]: {
panelClass: "overlay-right-top",
originX: "end",
originY: "bottom",
overlayX: "start",
overlayY: "bottom",
},
[PopoverOverlayPosition.rightBottom]: {
panelClass: "overlay-right-bottom",
originX: "end",
originY: "top",
overlayX: "start",
overlayY: "top",
},
};
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicG9wb3Zlci1wb3NpdGlvbi5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2xpYi9wb3BvdmVyL3BvcG92ZXItcG9zaXRpb24uc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFxQkEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUUzQyxPQUFPLEVBQUUsc0JBQXNCLEVBQW9CLE1BQU0sY0FBYyxDQUFDO0FBQ3hFLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLHNCQUFzQixDQUFDOztBQUUxRCxJQUFLLHVCQUtKO0FBTEQsV0FBSyx1QkFBdUI7SUFDeEIsd0NBQWEsQ0FBQTtJQUNiLDBDQUFlLENBQUE7SUFDZixzQ0FBVyxDQUFBO0lBQ1gsNENBQWlCLENBQUE7QUFDckIsQ0FBQyxFQUxJLHVCQUF1QixLQUF2Qix1QkFBdUIsUUFLM0I7QUFFRCxJQUFLLFVBU0o7QUFURCxXQUFLLFVBQVU7SUFDWCxpREFBbUMsQ0FBQTtJQUNuQyx1REFBeUMsQ0FBQTtJQUN6QyxtREFBcUMsQ0FBQTtJQUNyQyx5REFBMkMsQ0FBQTtJQUMzQyxpREFBbUMsQ0FBQTtJQUNuQyxtREFBcUMsQ0FBQTtJQUNyQyx1REFBeUMsQ0FBQTtJQUN6Qyx5REFBMkMsQ0FBQTtBQUMvQyxDQUFDLEVBVEksVUFBVSxLQUFWLFVBQVUsUUFTZDtBQUdELE1BQU0sT0FBTyxzQkFBc0I7SUFNL0I7UUFDSSxJQUFJLENBQUMsZ0JBQWdCLEdBQUcsbUJBQW1CLEVBQUUsQ0FBQztJQUNsRCxDQUFDO0lBRU0sZ0JBQWdCLENBQ25CLFVBQTZCLEVBQzdCLFdBQW1CLEVBQ25CLGlCQUE4QjtRQUU5QixNQUFNLFVBQVUsR0FBRyxrQkFBa0IsQ0FBQztRQUN0QyxNQUFNLGNBQWMsR0FBRyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsV0FBVyxDQUFDLENBQUM7UUFFMUQsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLFVBQVUs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LFFBQVE7U0FDckI7UUFDRCxDQUFDLHNCQUFzQixDQUFDLFVBQVUsQ0FBQyxFQUFFO1lBQ2pDLFVBQVUsRUFBRSxxQkFBcUI7WUFDakMsT0FBTyxFQUFFLE9BQU87WUFDaEIsT0FBTyxFQUFFLEtBQUs7WUFDZCxRQUFRLEVBQUUsS0FBSztZQUNmLFFBQVEsRUFBRSxLQUFLO1NBQ2xCO1FBQ0QsQ0FBQyxzQkFBc0IsQ0FBQyxRQUFRLENBQUMsRUFBRTtZQUMvQixVQUFVLEVBQUUsbUJBQW1CO1lBQy9CLE9BQU8sRUFBRSxLQUFLO1lBQ2QsT0FBTyxFQUFFLFFBQVE7WUFDakIsUUFBUSxFQUFFLE9BQU87WUFDakIsUUFBUSxFQUFFLFFBQVE7U0FDckI7UUFDRCxDQUFDLHNCQUFzQixDQUFDLFdBQVcsQ0FBQyxFQUFFO1lBQ2xDLFVBQVUsRUFBRSxzQkFBc0I7WUFDbEMsT0FBTyxFQUFFLEtBQUs7WUFDZCxPQUFPLEVBQUUsS0FBSztZQUNkLFFBQVEsRUFBRSxPQUFPO1lBQ2pCLFFBQVEsRUFBRSxLQUFLO1NBQ2xCO0tBQ0osQ0FBQztBQUNOLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyDCqSAyMDIyIFNvbGFyV2luZHMgV29ybGR3aWRlLCBMTEMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4vL1xuLy8gUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weVxuLy8gIG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlIFwiU29mdHdhcmVcIiksIHRvXG4vLyAgZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGVcbi8vICByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Jcbi8vICBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpc1xuLy8gIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6XG4vL1xuLy8gVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW5cbi8vICBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS5cbi8vXG4vLyBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgXCJBUyBJU1wiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SXG4vLyAgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksXG4vLyAgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFXG4vLyAgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUlxuLy8gIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sXG4vLyAgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTlxuLy8gIFRIRSBTT0ZUV0FSRS5cblxuaW1wb3J0IHsgQ29ubmVjdGVkUG9zaXRpb24gfSBmcm9tIFwiQGFuZ3VsYXIvY2RrL292ZXJsYXlcIjtcbmltcG9ydCB7IEluamVjdGFibGUgfSBmcm9tIFwiQGFuZ3VsYXIvY29yZVwiO1xuXG5pbXBvcnQgeyBQb3BvdmVyT3ZlcmxheVBvc2l0aW9uLCBQb3BvdmVyUGxhY2VtZW50IH0gZnJvbSBcIi4vcHVibGljLWFwaVwiO1xuaW1wb3J0IHsgT1ZFUkxBWV9BUlJPV19TSVpFIH0gZnJvbSBcIi4uL292ZXJsYXkvY29uc3RhbnRzXCI7XG5cbmVudW0gUG9wb3Zlck92ZXJsYXlQbGFjZW1lbnQge1xuICAgIExlZnQgPSBcImxlZnRcIixcbiAgICBSaWdodCA9IFwicmlnaHRcIixcbiAgICBUb3AgPSBcInRvcFwiLFxuICAgIEJvdHRvbSA9IFwiYm90dG9tXCIsXG59XG5cbmVudW0gUGFuZWxDbGFzcyB7XG4gICAgb3ZlcmxheUxlZnRUb3AgPSBcIm92ZXJsYXktbGVmdC10b3BcIixcbiAgICBvdmVybGF5TGVmdEJvdHRvbSA9IFwib3ZlcmxheS1sZWZ0LWJvdHRvbVwiLFxuICAgIG92ZXJsYXlSaWdodFRvcCA9IFwib3ZlcmxheS1yaWdodC10b3BcIixcbiAgICBvdmVybGF5UmlnaHRCb3R0b20gPSBcIm92ZXJsYXktcmlnaHQtYm90dG9tXCIsXG4gICAgb3ZlcmxheVRvcExlZnQgPSBcIm92ZXJsYXktdG9wLWxlZnRcIixcbiAgICBvdmVybGF5VG9wUmlnaHQgPSBcIm92ZXJsYXktdG9wLXJpZ2h0XCIsXG4gICAgb3ZlcmxheUJvdHRvbUxlZnQgPSBcIm92ZXJsYXktYm90dG9tLWxlZnRcIixcbiAgICBvdmVybGF5Qm90dG9tUmlnaHQgPSBcIm92ZXJsYXktYm90dG9tLXJpZ2h0XCIsXG59XG5cbkBJbmplY3RhYmxlKClcbmV4cG9ydCBjbGFzcyBQb3BvdmVyUG9zaXRpb25TZXJ2aWNlIHtcbiAgICBwcml2YXRlIHJlYWRvbmx5IHBvcG92ZXJQb3NpdGlvbnM6IFJlY29yZDxcbiAgICAgICAgUG9wb3Zlck92ZXJsYXlQb3NpdGlvbixcbiAgICAgICAgQ29ubmVjdGVkUG9zaXRpb25cbiAgICA+O1xuXG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHRoaXMucG9wb3ZlclBvc2l0aW9ucyA9IGdldFBvcG92ZXJQb3NpdGlvbnMoKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgc2V0UG9wb3Zlck9mZnNldChcbiAgICAgICAgcGFuZWxDbGFzczogc3RyaW5nIHwgc3RyaW5nW10sXG4gICAgICAgIGVsUmVmSGVpZ2h0OiBudW1iZXIsXG4gICAgICAgIG92ZXJsYXlSZWZFbGVtZW50OiBIVE1MRWxlbWVudFxuICAgICk6IHZvaWQge1xuICAgICAgICBjb25zdCBBUlJPV19TSVpFID0gT1ZFUkxBWV9BUlJPV19TSVpFO1xuICAgICAgICBjb25zdCBwb3BvdmVyT2Zmc2V0WSA9IHRoaXMuY2FsY3VsYXRlT2Zmc2V0WShlbFJlZkhlaWdodCk7XG5cbiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkocGFuZWxDbGFzcykpIHtcbiAgICAgICAgICAgIHBhbmVsQ2xhc3MgPSB0aGlzLmdldFBvcG92ZXJQb3NpdGlvblBhbmVsQ2xhc3MocGFuZWxDbGFzcyk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIXBhbmVsQ2xhc3MpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIG92ZXJsYXlSZWZFbGVtZW50LnN0eWxlLm1hcmdpbkxlZnQgPSBcIlwiO1xuICAgICAgICBvdmVybGF5UmVmRWxlbWVudC5zdHlsZS5tYXJnaW5Ub3AgPSBcIlwiO1xuICAgICAgICBvdmVybGF5UmVmRWxlbWVudC5zdHlsZS5tYXJnaW5Cb3R0b20gPSBcIlwiO1xuICAgICAgICBvdmVybGF5UmVmRWxlbWVudC5zdHlsZS5tYXJnaW5SaWdodCA9IFwiXCI7XG5cbiAgICAgICAgc3dpdGNoIChwYW5lbENsYXNzKSB7XG4gICAgICAgICAgICBjYXNlIFBhbmVsQ2xhc3Mub3ZlcmxheUxlZnRUb3A6XG4gICAgICAgICAgICAgICAgb3ZlcmxheVJlZkVsZW1lbnQuc3R5bGUubWFyZ2luUmlnaHQgPSBBUlJPV19TSVpFICsgXCJweFwiO1xuICAgICAgICAgICAgICAgIG92ZXJsYXlSZWZFbGVtZW50LnN0eWxlLm1hcmdpbkJvdHRvbSA9IC1wb3BvdmVyT2Zmc2V0WSArIFwicHhcIjtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgUGFuZWxDbGFzcy5vdmVybGF5TGVmdEJvdHRvbTpcbiAgICAgICAgICAgICAgICBvdmVybGF5UmVmRWxlbWVudC5zdHlsZS5tYXJnaW5SaWdodCA9IEFSUk9XX1NJWkUgKyBcInB4XCI7XG4gICAgICAgICAgICAgICAgb3ZlcmxheVJlZkVsZW1lbnQuc3R5bGUubWFyZ2luVG9wID0gLXBvcG92ZXJPZmZzZXRZICsgXCJweFwiO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBQYW5lbENsYXNzLm92ZXJsYXlSaWdodFRvcDpcbiAgICAgICAgICAgICAgICBvdmVybGF5UmVmRWxlbWVudC5zdHlsZS5tYXJnaW5MZWZ0ID0gQVJST1dfU0laRSArIFwicHhcIjtcbiAgICAgICAgICAgICAgICBvdmVybGF5UmVmRWxlbWVudC5zdHlsZS5tYXJnaW5Cb3R0b20gPSAtcG9wb3Zlck9mZnNldFkgKyBcInB4XCI7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIFBhbmVsQ2xhc3Mub3ZlcmxheVJpZ2h0Qm90dG9tOlxuICAgICAgICAgICAgICAgIG92ZXJsYXlSZWZFbGVtZW50LnN0eWxlLm1hcmdpbkxlZnQgPSBBUlJPV19TSVpFICsgXCJweFwiO1xuICAgICAgICAgICAgICAgIG92ZXJsYXlSZWZFbGVtZW50LnN0eWxlLm1hcmdpblRvcCA9IC1wb3BvdmVyT2Zmc2V0WSArIFwicHhcIjtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgUGFuZWxDbGFzcy5vdmVybGF5VG9wTGVmdDpcbiAgICAgICAgICAgICAgICBvdmVybGF5UmVmRWxlbWVudC5zdHlsZS5tYXJnaW5SaWdodCA9IC0yICogQVJST1dfU0laRSArIFwicHhcIjtcbiAgICAgICAgICAgICAgICBvdmVybGF5UmVmRWxlbWVudC5zdHlsZS5tYXJnaW5Cb3R0b20gPSBBUlJPV19TSVpFICsgXCJweFwiO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBQYW5lbENsYXNzLm92ZXJsYXlUb3BSaWdodDpcbiAgICAgICAgICAgICAgICBvdmVybGF5UmVmRWxlbWVudC5zdHlsZS5tYXJnaW5MZWZ0ID0gLTIgKiBBUlJPV19TSVpFICsgXCJweFwiO1xuICAgICAgICAgICAgICAgIG92ZXJsYXlSZWZFbGVtZW50LnN0eWxlLm1hcmdpbkJvdHRvbSA9IEFSUk9XX1NJWkUgKyBcInB4XCI7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIFBhbmVsQ2xhc3Mub3ZlcmxheUJvdHRvbUxlZnQ6XG4gICAgICAgICAgICAgICAgb3ZlcmxheVJlZkVsZW1lbnQuc3R5bGUubWFyZ2luUmlnaHQgPSAtMiAqIEFSUk9XX1NJWkUgKyBcInB4XCI7XG4gICAgICAgICAgICAgICAgb3ZlcmxheVJlZkVsZW1lbnQuc3R5bGUubWFyZ2luVG9wID0gQVJST1dfU0laRSArIFwicHhcIjtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgUGFuZWxDbGFzcy5vdmVybGF5Qm90dG9tUmlnaHQ6XG4gICAgICAgICAgICAgICAgb3ZlcmxheVJlZkVsZW1lbnQuc3R5bGUubWFyZ2luTGVmdCA9IC0yICogQVJST1dfU0laRSArIFwicHhcIjtcbiAgICAgICAgICAgICAgICBvdmVybGF5UmVmRWxlbWVudC5zdHlsZS5tYXJnaW5Ub3AgPSBBUlJPV19TSVpFICsgXCJweFwiO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIHBvc3NpYmxlUG9zaXRpb25zRm9yUGxhY2VtZW50KFxuICAgICAgICBwbGFjZW1lbnQ6IFBvcG92ZXJQbGFjZW1lbnRcbiAgICApOiBDb25uZWN0ZWRQb3NpdGlvbltdIHtcbiAgICAgICAgY29uc3QgcG9zc2libGVQb3NpdGlvbnM6IENvbm5lY3RlZFBvc2l0aW9uW10gPSBbXTtcblxuICAgICAgICBzd2l0Y2ggKHBsYWNlbWVudCkge1xuICAgICAgICAgICAgY2FzZSBQb3BvdmVyT3ZlcmxheVBsYWNlbWVudC5MZWZ0OlxuICAgICAgICAgICAgICAgIHBvc3NpYmxlUG9zaXRpb25zLnB1c2goXG4gICAgICAgICAgICAgICAgICAgIC4uLnRoaXMuZ2V0UG9zaXRpb25zRm9yUGxhY2VtZW50KFxuICAgICAgICAgICAgICAgICAgICAgICAgUG9wb3Zlck92ZXJsYXlQbGFjZW1lbnQuTGVmdFxuICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgUG9wb3Zlck92ZXJsYXlQbGFjZW1lbnQuUmlnaHQ6XG4gICAgICAgICAgICAgICAgcG9zc2libGVQb3NpdGlvbnMucHVzaChcbiAgICAgICAgICAgICAgICAgICAgLi4udGhpcy5nZXRQb3NpdGlvbnNGb3JQbGFjZW1lbnQoXG4gICAgICAgICAgICAgICAgICAgICAgICBQb3BvdmVyT3ZlcmxheVBsYWNlbWVudC5SaWdodFxuICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgUG9wb3Zlck92ZXJsYXlQbGFjZW1lbnQuVG9wOlxuICAgICAgICAgICAgICAgIHBvc3NpYmxlUG9zaXRpb25zLnB1c2goXG4gICAgICAgICAgICAgICAgICAgIC4uLnRoaXMuZ2V0UG9zaXRpb25zRm9yUGxhY2VtZW50KFxuICAgICAgICAgICAgICAgICAgICAgICAgUG9wb3Zlck92ZXJsYXlQbGFjZW1lbnQuVG9wXG4gICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBQb3BvdmVyT3ZlcmxheVBsYWNlbWVudC5Cb3R0b206XG4gICAgICAgICAgICAgICAgcG9zc2libGVQb3NpdGlvbnMucHVzaChcbiAgICAgICAgICAgICAgICAgICAgLi4udGhpcy5nZXRQb3NpdGlvbnNGb3JQbGFjZW1lbnQoXG4gICAgICAgICAgICAgICAgICAgICAgICBQb3BvdmVyT3ZlcmxheVBsYWNlbWVudC5Cb3R0b21cbiAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gcG9zc2libGVQb3NpdGlvbnM7XG4gICAgfVxuXG4gICAgcHVibGljIGdldENvbm5lY3RlZFBvc2l0aW9ucyhcbiAgICAgICAgcG9zaXRpb25zOiBQb3BvdmVyT3ZlcmxheVBvc2l0aW9uW11cbiAgICApOiBDb25uZWN0ZWRQb3NpdGlvbltdIHtcbiAgICAgICAgcmV0dXJuIHBvc2l0aW9ucy5tYXAoXG4gICAgICAgICAgICAocG9zaXRpb25OYW1lOiBQb3BvdmVyT3ZlcmxheVBvc2l0aW9uKSA9PlxuICAgICAgICAgICAgICAgIHRoaXMucG9wb3ZlclBvc2l0aW9uc1twb3NpdGlvbk5hbWVdXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyBhbGwgcG9zc2libGUgcG9zaXRpb25zIGZvciBhIHBsYWNlbWVudFxuICAgICAqIEVnOiBsZWZ0ID0+IFtPVkVSTEFZX1BPU0lUSU9OU1tjZW50ZXJMZWZ0XSwgT1ZFUkxBWV9QT1NJVElPTlNbdG9wTGVmdF0sIE9WRVJMQVlfUE9TSVRJT05TW2JvdHRvbUxlZnRdXVxuICAgICAqXG4gICAgICogQHBhcmFtIHBsYWNlbWVudFxuICAgICAqIEByZXR1cm5zIENvbm5lY3RlZFBvc2l0aW9uW11cbiAgICAgKi9cbiAgICBwcml2YXRlIGdldFBvc2l0aW9uc0ZvclBsYWNlbWVudChcbiAgICAgICAgcGxhY2VtZW50OiBQb3BvdmVyT3ZlcmxheVBsYWNlbWVudFxuICAgICk6IENvbm5lY3RlZFBvc2l0aW9uW10ge1xuICAgICAgICBsZXQgcG9zc2libGVQb3NpdGlvbk5hbWVzOiBQb3BvdmVyT3ZlcmxheVBvc2l0aW9uW10gPSBbXTtcbiAgICAgICAgc3dpdGNoIChwbGFjZW1lbnQpIHtcbiAgICAgICAgICAgIGNhc2UgUG9wb3Zlck92ZXJsYXlQbGFjZW1lbnQuTGVmdDpcbiAgICAgICAgICAgICAgICBwb3NzaWJsZVBvc2l0aW9uTmFtZXMgPSBbXG4gICAgICAgICAgICAgICAgICAgIFBvcG92ZXJPdmVybGF5UG9zaXRpb24ubGVmdEJvdHRvbSxcbiAgICAgICAgICAgICAgICAgICAgUG9wb3Zlck92ZXJsYXlQb3NpdGlvbi5sZWZ0VG9wLFxuICAgICAgICAgICAgICAgICAgICBQb3BvdmVyT3ZlcmxheVBvc2l0aW9uLnJpZ2h0Qm90dG9tLFxuICAgICAgICAgICAgICAgICAgICBQb3BvdmVyT3ZlcmxheVBvc2l0aW9uLnJpZ2h0VG9wLFxuICAgICAgICAgICAgICAgIF07XG4gICAgICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICAgIGNhc2UgUG9wb3Zlck92ZXJsYXlQbGFjZW1lbnQuUmlnaHQ6XG4gICAgICAgICAgICAgICAgcG9zc2libGVQb3NpdGlvbk5hbWVzID0gW1xuICAgICAgICAgICAgICAgICAgICBQb3BvdmVyT3ZlcmxheVBvc2l0aW9uLnJpZ2h0Qm90dG9tLFxuICAgICAgICAgICAgICAgICAgICBQb3BvdmVyT3ZlcmxheVBvc2l0aW9uLnJpZ2h0VG9wLFxuICAgICAgICAgICAgICAgICAgICBQb3BvdmVyT3ZlcmxheVBvc2l0aW9uLmxlZnRCb3R0b20sXG4gICAgICAgICAgICAgICAgICAgIFBvcG92ZXJPdmVybGF5UG9zaXRpb24ubGVmdFRvcCxcbiAgICAgICAgICAgICAgICBdO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgICBjYXNlIFBvcG92ZXJPdmVybGF5UGxhY2VtZW50LlRvcDpcbiAgICAgICAgICAgICAgICBwb3NzaWJsZVBvc2l0aW9uTmFtZXMgPSBbXG4gICAgICAgICAgICAgICAgICAgIFBvcG92ZXJPdmVybGF5UG9zaXRpb24udG9wUmlnaHQsXG4gICAgICAgICAgICAgICAgICAgIFBvcG92ZXJPdmVybGF5UG9zaXRpb24udG9wTGVmdCxcbiAgICAgICAgICAgICAgICAgICAgUG9wb3Zlck92ZXJsYXlQb3NpdGlvbi5ib3R0b21SaWdodCxcbiAgICAgICAgICAgICAgICAgICAgUG9wb3Zlck92ZXJsYXlQb3NpdGlvbi5ib3R0b21MZWZ0LFxuICAgICAgICAgICAgICAgIF07XG4gICAgICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICAgIGNhc2UgUG9wb3Zlck92ZXJsYXlQbGFjZW1lbnQuQm90dG9tOlxuICAgICAgICAgICAgICAgIHBvc3NpYmxlUG9zaXRpb25OYW1lcyA9IFtcbiAgICAgICAgICAgICAgICAgICAgUG9wb3Zlck92ZXJsYXlQb3NpdGlvbi5ib3R0b21SaWdodCxcbiAgICAgICAgICAgICAgICAgICAgUG9wb3Zlck92ZXJsYXlQb3NpdGlvbi5ib3R0b21MZWZ0LFxuICAgICAgICAgICAgICAgICAgICBQb3BvdmVyT3ZlcmxheVBvc2l0aW9uLnRvcFJpZ2h0LFxuICAgICAgICAgICAgICAgICAgICBQb3BvdmVyT3ZlcmxheVBvc2l0aW9uLnRvcExlZnQsXG4gICAgICAgICAgICAgICAgXTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0aGlzLmdldENvbm5lY3RlZFBvc2l0aW9ucyhwb3NzaWJsZVBvc2l0aW9uTmFtZXMpO1xuICAgIH1cblxuICAgIHByaXZhdGUgZ2V0UG9wb3ZlclBvc2l0aW9uUGFuZWxDbGFzcyhwYW5lbENsYXNzOiBzdHJpbmdbXSk6IHN0cmluZyB7XG4gICAgICAgIGxldCByZXN1bHQ7XG4gICAgICAgIGZvciAoY29uc3QgcGFuZWxDbGFzc0tleSBpbiBQYW5lbENsYXNzKSB7XG4gICAgICAgICAgICBpZiAoUGFuZWxDbGFzcy5oYXNPd25Qcm9wZXJ0eShwYW5lbENsYXNzS2V5KSkge1xuICAgICAgICAgICAgICAgIHJlc3VsdCA9IHBhbmVsQ2xhc3MuZmluZCgoaSkgPT4gaSA9PT0gcGFuZWxDbGFzc0tleSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdCB8fCBcIlwiO1xuICAgIH1cblxuICAgIHByaXZhdGUgY2FsY3VsYXRlT2Zmc2V0WShlbFJlZkhlaWdodDogbnVtYmVyKTogbnVtYmVyIHtcbiAgICAgICAgY29uc3QgQVJST1dfQ0VOVEVSX1BPU0lUSU9OX1BYID0gMjA7XG4gICAgICAgIGlmICghZWxSZWZIZWlnaHQpIHtcbiAgICAgICAgICAgIHJldHVybiA1O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBBUlJPV19DRU5URVJfUE9TSVRJT05fUFggLSBlbFJlZkhlaWdodCAvIDI7XG4gICAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0UG9wb3ZlclBvc2l0aW9ucygpOiBSZWNvcmQ8XG4gICAgUG9wb3Zlck92ZXJsYXlQb3NpdGlvbixcbiAgICBDb25uZWN0ZWRQb3NpdGlvblxuPiB7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgW1BvcG92ZXJPdmVybGF5UG9zaXRpb24udG9wTGVmdF06IHtcbiAgICAgICAgICAgIHBhbmVsQ2xhc3M6IFwib3ZlcmxheS10b3AtbGVmdFwiLFxuICAgICAgICAgICAgb3JpZ2luWDogXCJjZW50ZXJcIixcbiAgICAgICAgICAgIG9yaWdpblk6IFwidG9wXCIsXG4gICAgICAgICAgICBvdmVybGF5WDogXCJlbmRcIixcbiAgICAgICAgICAgIG92ZXJsYXlZOiBcImJvdHRvbVwiLFxuICAgICAgICB9LFxuICAgICAgICBbUG9wb3Zlck92ZXJsYXlQb3NpdGlvbi5ib3R0b21MZWZ0XToge1xuICAgICAgICAgICAgcGFuZWxDbGFzczogXCJvdmVybGF5LWJvdHRvbS1sZWZ0XCIsXG4gICAgICAgICAgICBvcmlnaW5YOiBcImNlbnRlclwiLFxuICAgICAgICAgICAgb3JpZ2luWTogXCJib3R0b21cIixcbiAgICAgICAgICAgIG92ZXJsYXlYOiBcImVuZFwiLFxuICAgICAgICAgICAgb3ZlcmxheVk6IFwidG9wXCIsXG4gICAgICAgIH0sXG4gICAgICAgIFtQb3BvdmVyT3ZlcmxheVBvc2l0aW9uLnRvcFJpZ2h0XToge1xuICAgICAgICAgICAgcGFuZWxDbGFzczogXCJvdmVybGF5LXRvcC1yaWdodFwiLFxuICAgICAgICAgICAgb3JpZ2luWDogXCJjZW50ZXJcIixcbiAgICAgICAgICAgIG9yaWdpblk6IFwidG9wXCIsXG4gICAgICAgICAgICBvdmVybGF5WDogXCJzdGFydFwiLFxuICAgICAgICAgICAgb3ZlcmxheVk6IFwiYm90dG9tXCIsXG4gICAgICAgIH0sXG4gICAgICAgIFtQb3BvdmVyT3ZlcmxheVBvc2l0aW9uLmJvdHRvbVJpZ2h0XToge1xuICAgICAgICAgICAgcGFuZWxDbGFzczogXCJvdmVybGF5LWJvdHRvbS1yaWdodFwiLFxuICAgICAgICAgICAgb3JpZ2luWDogXCJjZW50ZXJcIixcbiAgICAgICAgICAgIG9yaWdpblk6IFwiYm90dG9tXCIsXG4gICAgICAgICAgICBvdmVybGF5WDogXCJzdGFydFwiLFxuICAgICAgICAgICAgb3ZlcmxheVk6IFwidG9wXCIsXG4gICAgICAgIH0sXG4gICAgICAgIFtQb3BvdmVyT3ZlcmxheVBvc2l0aW9uLmxlZnRUb3BdOiB7XG4gICAgICAgICAgICBwYW5lbENsYXNzOiBcIm92ZXJsYXktbGVmdC10b3BcIixcbiAgICAgICAgICAgIG9yaWdpblg6IFwic3RhcnRcIixcbiAgICAgICAgICAgIG9yaWdpblk6IFwiYm90dG9tXCIsXG4gICAgICAgICAgICBvdmVybGF5WDogXCJlbmRcIixcbiAgICAgICAgICAgIG92ZXJsYXlZOiBcImJvdHRvbVwiLFxuICAgICAgICB9LFxuICAgICAgICBbUG9wb3Zlck92ZXJsYXlQb3NpdGlvbi5sZWZ0Qm90dG9tXToge1xuICAgICAgICAgICAgcGFuZWxDbGFzczogXCJvdmVybGF5LWxlZnQtYm90dG9tXCIsXG4gICAgICAgICAgICBvcmlnaW5YOiBcInN0YXJ0XCIsXG4gICAgICAgICAgICBvcmlnaW5ZOiBcInRvcFwiLFxuICAgICAgICAgICAgb3ZlcmxheVg6IFwiZW5kXCIsXG4gICAgICAgICAgICBvdmVybGF5WTogXCJ0b3BcIixcbiAgICAgICAgfSxcbiAgICAgICAgW1BvcG92ZXJPdmVybGF5UG9zaXRpb24ucmlnaHRUb3BdOiB7XG4gICAgICAgICAgICBwYW5lbENsYXNzOiBcIm92ZXJsYXktcmlnaHQtdG9wXCIsXG4gICAgICAgICAgICBvcmlnaW5YOiBcImVuZFwiLFxuICAgICAgICAgICAgb3JpZ2luWTogXCJib3R0b21cIixcbiAgICAgICAgICAgIG92ZXJsYXlYOiBcInN0YXJ0XCIsXG4gICAgICAgICAgICBvdmVybGF5WTogXCJib3R0b21cIixcbiAgICAgICAgfSxcbiAgICAgICAgW1BvcG92ZXJPdmVybGF5UG9zaXRpb24ucmlnaHRCb3R0b21dOiB7XG4gICAgICAgICAgICBwYW5lbENsYXNzOiBcIm92ZXJsYXktcmlnaHQtYm90dG9tXCIsXG4gICAgICAgICAgICBvcmlnaW5YOiBcImVuZFwiLFxuICAgICAgICAgICAgb3JpZ2luWTogXCJ0b3BcIixcbiAgICAgICAgICAgIG92ZXJsYXlYOiBcInN0YXJ0XCIsXG4gICAgICAgICAgICBvdmVybGF5WTogXCJ0b3BcIixcbiAgICAgICAgfSxcbiAgICB9O1xufVxuIl19