angular2gridsterv3
Version:
298 lines • 38.4 kB
JavaScript
export class GridListItem {
get $element() {
return this.getItem().$element;
}
get x() {
const item = this.getItem();
const breakpoint = item.gridster ? item.gridster.options.breakpoint : null;
return this.getValueX(breakpoint);
}
set x(value) {
const item = this.getItem();
const breakpoint = item.gridster ? item.gridster.options.breakpoint : null;
this.setValueX(value, breakpoint);
}
get y() {
const item = this.getItem();
const breakpoint = item.gridster ? item.gridster.options.breakpoint : null;
return this.getValueY(breakpoint);
}
set y(value) {
const item = this.getItem();
const breakpoint = item.gridster ? item.gridster.options.breakpoint : null;
this.setValueY(value, breakpoint);
}
get w() {
const item = this.getItem();
const breakpoint = item.gridster ? item.gridster.options.breakpoint : null;
return this.getValueW(breakpoint);
}
set w(value) {
const item = this.getItem();
const breakpoint = item.gridster ? item.gridster.options.breakpoint : null;
this.setValueW(value, breakpoint);
}
get h() {
const item = this.getItem();
const breakpoint = item.gridster ? item.gridster.options.breakpoint : null;
return this.getValueH(breakpoint);
}
set h(value) {
const item = this.getItem();
const breakpoint = item.gridster ? item.gridster.options.breakpoint : null;
this.setValueH(value, breakpoint);
}
get autoSize() {
return this.getItem().autoSize;
}
set autoSize(value) {
this.getItem().autoSize = value;
}
get dragAndDrop() {
return !!this.getItem().dragAndDrop;
}
get resizable() {
return !!this.getItem().resizable;
}
get positionX() {
const item = this.itemComponent || this.itemPrototype;
if (!item) {
return null;
}
return item.positionX;
}
get positionY() {
const item = this.itemComponent || this.itemPrototype;
if (!item) {
return null;
}
return item.positionY;
}
setFromGridsterItem(item) {
if (this.isItemSet()) {
throw new Error('GridListItem is already set.');
}
this.itemComponent = item;
return this;
}
setFromGridsterItemPrototype(item) {
if (this.isItemSet()) {
throw new Error('GridListItem is already set.');
}
this.itemPrototype = item;
return this;
}
setFromObjectLiteral(item) {
if (this.isItemSet()) {
throw new Error('GridListItem is already set.');
}
this.itemObject = item;
return this;
}
copy() {
const itemCopy = new GridListItem();
return itemCopy.setFromObjectLiteral({
$element: this.$element,
x: this.x,
y: this.y,
w: this.w,
h: this.h,
autoSize: this.autoSize,
dragAndDrop: this.dragAndDrop,
resizable: this.resizable
});
}
copyForBreakpoint(breakpoint) {
const itemCopy = new GridListItem();
return itemCopy.setFromObjectLiteral({
$element: this.$element,
x: this.getValueX(breakpoint),
y: this.getValueY(breakpoint),
w: this.getValueW(breakpoint),
h: this.getValueH(breakpoint),
autoSize: this.autoSize,
dragAndDrop: this.dragAndDrop,
resizable: this.resizable
});
}
getValueX(breakpoint) {
const item = this.getItem();
return item[this.getXProperty(breakpoint)];
}
getValueY(breakpoint) {
const item = this.getItem();
return item[this.getYProperty(breakpoint)];
}
getValueW(breakpoint) {
const item = this.getItem();
return item[this.getWProperty(breakpoint)] || 1;
}
getValueH(breakpoint) {
const item = this.getItem();
return item[this.getHProperty(breakpoint)] || 1;
}
setValueX(value, breakpoint) {
const item = this.getItem();
item[this.getXProperty(breakpoint)] = value;
}
setValueY(value, breakpoint) {
const item = this.getItem();
item[this.getYProperty(breakpoint)] = value;
}
setValueW(value, breakpoint) {
const item = this.getItem();
item[this.getWProperty(breakpoint)] = value;
}
setValueH(value, breakpoint) {
const item = this.getItem();
item[this.getHProperty(breakpoint)] = value;
}
triggerChangeX(breakpoint) {
const item = this.itemComponent;
if (item) {
item[this.getXProperty(breakpoint) + 'Change'].emit(this.getValueX(breakpoint));
}
}
triggerChangeY(breakpoint) {
const item = this.itemComponent;
if (item) {
item[this.getYProperty(breakpoint) + 'Change'].emit(this.getValueY(breakpoint));
}
}
triggerChangeW(breakpoint) {
const item = this.itemComponent;
if (item) {
item[this.getWProperty(breakpoint) + 'Change'].emit(this.getValueW(breakpoint));
}
}
triggerChangeH(breakpoint) {
const item = this.itemComponent;
if (item) {
item[this.getHProperty(breakpoint) + 'Change'].emit(this.getValueH(breakpoint));
}
}
hasPositions(breakpoint) {
const x = this.getValueX(breakpoint);
const y = this.getValueY(breakpoint);
return (x || x === 0) && (y || y === 0);
}
applyPosition(gridster) {
const position = this.calculatePosition(gridster);
this.itemComponent.positionX = position.left;
this.itemComponent.positionY = position.top;
this.itemComponent.updateElemenetPosition();
}
calculatePosition(gridster) {
if (!gridster && !this.itemComponent) {
return { left: 0, top: 0 };
}
gridster = gridster || this.itemComponent.gridster;
return {
left: this.x * gridster.cellWidth,
top: this.y * gridster.cellHeight
};
}
applySize(gridster) {
const size = this.calculateSize(gridster);
this.$element.style.width = size.width + 'px';
this.$element.style.height = size.height + 'px';
}
calculateSize(gridster) {
if (!gridster && !this.itemComponent) {
return { width: 0, height: 0 };
}
gridster = gridster || this.itemComponent.gridster;
let width = this.getValueW(gridster.options.breakpoint);
let height = this.getValueH(gridster.options.breakpoint);
if (gridster.options.direction === 'vertical') {
width = Math.min(width, gridster.options.lanes);
}
if (gridster.options.direction === 'horizontal') {
height = Math.min(height, gridster.options.lanes);
}
return {
width: width * gridster.cellWidth,
height: height * gridster.cellHeight
};
}
getXProperty(breakpoint) {
if (breakpoint && this.itemComponent) {
return GridListItem.X_PROPERTY_MAP[breakpoint];
}
else {
return 'x';
}
}
getYProperty(breakpoint) {
if (breakpoint && this.itemComponent) {
return GridListItem.Y_PROPERTY_MAP[breakpoint];
}
else {
return 'y';
}
}
getWProperty(breakpoint) {
if (this.itemPrototype) {
return this.itemPrototype[GridListItem.W_PROPERTY_MAP[breakpoint]] ?
GridListItem.W_PROPERTY_MAP[breakpoint] : 'w';
}
const item = this.getItem();
const responsiveSizes = item.gridster && item.gridster.options.responsiveSizes;
if (breakpoint && responsiveSizes) {
return GridListItem.W_PROPERTY_MAP[breakpoint];
}
else {
return 'w';
}
}
getHProperty(breakpoint) {
if (this.itemPrototype) {
return this.itemPrototype[GridListItem.H_PROPERTY_MAP[breakpoint]] ?
GridListItem.H_PROPERTY_MAP[breakpoint] : 'h';
}
const item = this.getItem();
const responsiveSizes = item.gridster && item.gridster.options.responsiveSizes;
if (breakpoint && responsiveSizes) {
return GridListItem.H_PROPERTY_MAP[breakpoint];
}
else {
return 'h';
}
}
getItem() {
const item = this.itemComponent || this.itemPrototype || this.itemObject;
if (!item) {
throw new Error('GridListItem is not set.');
}
return item;
}
isItemSet() {
return this.itemComponent || this.itemPrototype || this.itemObject;
}
}
GridListItem.BREAKPOINTS = ['sm', 'md', 'lg', 'xl'];
GridListItem.X_PROPERTY_MAP = {
sm: 'xSm',
md: 'xMd',
lg: 'xLg',
xl: 'xXl'
};
GridListItem.Y_PROPERTY_MAP = {
sm: 'ySm',
md: 'yMd',
lg: 'yLg',
xl: 'yXl'
};
GridListItem.W_PROPERTY_MAP = {
sm: 'wSm',
md: 'wMd',
lg: 'wLg',
xl: 'wXl'
};
GridListItem.H_PROPERTY_MAP = {
sm: 'hSm',
md: 'hMd',
lg: 'hLg',
xl: 'hXl'
};
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiR3JpZExpc3RJdGVtLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvYW5ndWxhcjJncmlkc3RlcnYzL3NyYy9saWIvZ3JpZExpc3QvR3JpZExpc3RJdGVtLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUlBLE1BQU0sT0FBTyxZQUFZO0lBa0NyQixJQUFJLFFBQVE7UUFDUixPQUFPLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQyxRQUFRLENBQUM7SUFDbkMsQ0FBQztJQUVELElBQUksQ0FBQztRQUNELE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQztRQUM1QixNQUFNLFVBQVUsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQztRQUUzRSxPQUFPLElBQUksQ0FBQyxTQUFTLENBQUMsVUFBVSxDQUFDLENBQUM7SUFDdEMsQ0FBQztJQUNELElBQUksQ0FBQyxDQUFFLEtBQWE7UUFDaEIsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO1FBQzVCLE1BQU0sVUFBVSxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDO1FBRTNFLElBQUksQ0FBQyxTQUFTLENBQUMsS0FBSyxFQUFFLFVBQVUsQ0FBQyxDQUFDO0lBQ3RDLENBQUM7SUFFRCxJQUFJLENBQUM7UUFDRCxNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7UUFDNUIsTUFBTSxVQUFVLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7UUFFM0UsT0FBTyxJQUFJLENBQUMsU0FBUyxDQUFDLFVBQVUsQ0FBQyxDQUFDO0lBQ3RDLENBQUM7SUFDRCxJQUFJLENBQUMsQ0FBRSxLQUFhO1FBQ2hCLE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQztRQUM1QixNQUFNLFVBQVUsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQztRQUUzRSxJQUFJLENBQUMsU0FBUyxDQUFDLEtBQUssRUFBRSxVQUFVLENBQUMsQ0FBQztJQUN0QyxDQUFDO0lBRUQsSUFBSSxDQUFDO1FBQ0QsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO1FBQzVCLE1BQU0sVUFBVSxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDO1FBRTNFLE9BQU8sSUFBSSxDQUFDLFNBQVMsQ0FBQyxVQUFVLENBQUMsQ0FBQztJQUN0QyxDQUFDO0lBQ0QsSUFBSSxDQUFDLENBQUUsS0FBYTtRQUNoQixNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7UUFDNUIsTUFBTSxVQUFVLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7UUFFM0UsSUFBSSxDQUFDLFNBQVMsQ0FBQyxLQUFLLEVBQUUsVUFBVSxDQUFDLENBQUM7SUFDdEMsQ0FBQztJQUVELElBQUksQ0FBQztRQUNELE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQztRQUM1QixNQUFNLFVBQVUsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsUUFB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WUFBWSxDQUFDLFVBQVUsQ0FBQyxHQUFHLFFBQVEsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUM7U0FDbkY7SUFDTCxDQUFDO0lBRU0sY0FBYyxDQUFDLFVBQVc7UUFDN0IsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQztRQUNoQyxJQUFJLElBQUksRUFBRTtZQUNOLElBQUksQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLFVBQVUsQ0FBQyxHQUFHLFFBQVEsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUM7U0FDbkY7SUFDTCxDQUFDO0lBRU0sY0FBYyxDQUFDLFVBQVc7UUFDN0IsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQztRQUNoQyxJQUFJLElBQUksRUFBRTtZQUNOLElBQUksQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLFVBQVUsQ0FBQyxHQUFHLFFBQVEsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUM7U0FDbkY7SUFDTCxDQUFDO0lBRU0sY0FBYyxDQUFDLFVBQVc7UUFDN0IsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQztRQUNoQyxJQUFJLElBQUksRUFBRTtZQUNOLElBQUksQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLFVBQVUsQ0FBQyxHQUFHLFFBQVEsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUM7U0FDbkY7SUFDTCxDQUFDO0lBRU0sWUFBWSxDQUFDLFVBQVc7UUFDM0IsTUFBTSxDQUFDLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUNyQyxNQUFNLENBQUMsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBRXJDLE9BQU8sQ0FBQyxDQUFDLElB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Q1osQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEdyaWRzdGVySXRlbUNvbXBvbmVudCB9IGZyb20gJy4uL2dyaWRzdGVyLWl0ZW0vZ3JpZHN0ZXItaXRlbS5jb21wb25lbnQnO1xyXG5pbXBvcnQgeyBHcmlkc3Rlckl0ZW1Qcm90b3R5cGVEaXJlY3RpdmUgfSBmcm9tICcuLi9ncmlkc3Rlci1wcm90b3R5cGUvZ3JpZHN0ZXItaXRlbS1wcm90b3R5cGUuZGlyZWN0aXZlJztcclxuaW1wb3J0IHsgR3JpZHN0ZXJTZXJ2aWNlIH0gZnJvbSAnLi4vZ3JpZHN0ZXIuc2VydmljZSc7XHJcblxyXG5leHBvcnQgY2xhc3MgR3JpZExpc3RJdGVtIHtcclxuICAgIHN0YXRpYyBCUkVBS1BPSU5UUzogQXJyYXk8c3RyaW5nPiA9IFsnc20nLCAnbWQnLCAnbGcnLCAneGwnXTtcclxuICAgIHN0YXRpYyBYX1BST1BFUlRZX01BUDogYW55ID0ge1xyXG4gICAgICAgIHNtOiAneFNtJyxcclxuICAgICAgICBtZDogJ3hNZCcsXHJcbiAgICAgICAgbGc6ICd4TGcnLFxyXG4gICAgICAgIHhsOiAneFhsJ1xyXG4gICAgfTtcclxuXHJcbiAgICBzdGF0aWMgWV9QUk9QRVJUWV9NQVA6IGFueSA9IHtcclxuICAgICAgICBzbTogJ3lTbScsXHJcbiAgICAgICAgbWQ6ICd5TWQnLFxyXG4gICAgICAgIGxnOiAneUxnJyxcclxuICAgICAgICB4bDogJ3lYbCdcclxuICAgIH07XHJcblxyXG4gICAgc3RhdGljIFdfUFJPUEVSVFlfTUFQOiBhbnkgPSB7XHJcbiAgICAgICAgc206ICd3U20nLFxyXG4gICAgICAgIG1kOiAnd01kJyxcclxuICAgICAgICBsZzogJ3dMZycsXHJcbiAgICAgICAgeGw6ICd3WGwnXHJcbiAgICB9O1xyXG5cclxuICAgIHN0YXRpYyBIX1BST1BFUlRZX01BUDogYW55ID0ge1xyXG4gICAgICAgIHNtOiAnaFNtJyxcclxuICAgICAgICBtZDogJ2hNZCcsXHJcbiAgICAgICAgbGc6ICdoTGcnLFxyXG4gICAgICAgIHhsOiAnaFhsJ1xyXG4gICAgfTtcclxuXHJcbiAgICBpdGVtQ29tcG9uZW50OiBHcmlkc3Rlckl0ZW1Db21wb25lbnQ7XHJcbiAgICBpdGVtUHJvdG90eXBlOiBHcmlkc3Rlckl0ZW1Qcm90b3R5cGVEaXJlY3RpdmU7XHJcbiAgICBpdGVtT2JqZWN0OiBhbnk7XHJcblxyXG4gICAgZ2V0ICRlbGVtZW50ICgpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5nZXRJdGVtKCkuJGVsZW1lbnQ7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0IHggKCkge1xyXG4gICAgICAgIGNvbnN0IGl0ZW0gPSB0aGlzLmdldEl0ZW0oKTtcclxuICAgICAgICBjb25zdCBicmVha3BvaW50ID0gaXRlbS5ncmlkc3RlciA/IGl0ZW0uZ3JpZHN0ZXIub3B0aW9ucy5icmVha3BvaW50IDogbnVsbDtcclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0VmFsdWVYKGJyZWFrcG9pbnQpO1xyXG4gICAgfVxyXG4gICAgc2V0IHggKHZhbHVlOiBudW1iZXIpIHtcclxuICAgICAgICBjb25zdCBpdGVtID0gdGhpcy5nZXRJdGVtKCk7XHJcbiAgICAgICAgY29uc3QgYnJlYWtwb2ludCA9IGl0ZW0uZ3JpZHN0ZXIgPyBpdGVtLmdyaWRzdGVyLm9wdGlvbnMuYnJlYWtwb2ludCA6IG51bGw7XHJcblxyXG4gICAgICAgIHRoaXMuc2V0VmFsdWVYKHZhbHVlLCBicmVha3BvaW50KTtcclxuICAgIH1cclxuXHJcbiAgICBnZXQgeSAoKSB7XHJcbiAgICAgICAgY29uc3QgaXRlbSA9IHRoaXMuZ2V0SXRlbSgpO1xyXG4gICAgICAgIGNvbnN0IGJyZWFrcG9pbnQgPSBpdGVtLmdyaWRzdGVyID8gaXRlbS5ncmlkc3Rlci5vcHRpb25zLmJyZWFrcG9pbnQgOiBudWxsO1xyXG5cclxuICAgICAgICByZXR1cm4gdGhpcy5nZXRWYWx1ZVkoYnJlYWtwb2ludCk7XHJcbiAgICB9XHJcbiAgICBzZXQgeSAodmFsdWU6IG51bWJlcikge1xyXG4gICAgICAgIGNvbnN0IGl0ZW0gPSB0aGlzLmdldEl0ZW0oKTtcclxuICAgICAgICBjb25zdCBicmVha3BvaW50ID0gaXRlbS5ncmlkc3RlciA/IGl0ZW0uZ3JpZHN0ZXIub3B0aW9ucy5icmVha3BvaW50IDogbnVsbDtcclxuXHJcbiAgICAgICAgdGhpcy5zZXRWYWx1ZVkodmFsdWUsIGJyZWFrcG9pbnQpO1xyXG4gICAgfVxyXG5cclxuICAgIGdldCB3ICgpIHtcclxuICAgICAgICBjb25zdCBpdGVtID0gdGhpcy5nZXRJdGVtKCk7XHJcbiAgICAgICAgY29uc3QgYnJlYWtwb2ludCA9IGl0ZW0uZ3JpZHN0ZXIgPyBpdGVtLmdyaWRzdGVyLm9wdGlvbnMuYnJlYWtwb2ludCA6IG51bGw7XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzLmdldFZhbHVlVyhicmVha3BvaW50KTtcclxuICAgIH1cclxuICAgIHNldCB3ICh2YWx1ZTogbnVtYmVyKSB7XHJcbiAgICAgICAgY29uc3QgaXRlbSA9IHRoaXMuZ2V0SXRlbSgpO1xyXG4gICAgICAgIGNvbnN0IGJyZWFrcG9pbnQgPSBpdGVtLmdyaWRzdGVyID8gaXRlbS5ncmlkc3Rlci5vcHRpb25zLmJyZWFrcG9pbnQgOiBudWxsO1xyXG5cclxuICAgICAgICB0aGlzLnNldFZhbHVlVyh2YWx1ZSwgYnJlYWtwb2ludCk7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0IGggKCkge1xyXG4gICAgICAgIGNvbnN0IGl0ZW0gPSB0aGlzLmdldEl0ZW0oKTtcclxuICAgICAgICBjb25zdCBicmVha3BvaW50ID0gaXRlbS5ncmlkc3RlciA/IGl0ZW0uZ3JpZHN0ZXIub3B0aW9ucy5icmVha3BvaW50IDogbnVsbDtcclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0VmFsdWVIKGJyZWFrcG9pbnQpO1xyXG4gICAgfVxyXG4gICAgc2V0IGggKHZhbHVlOiBudW1iZXIpIHtcclxuICAgICAgICBjb25zdCBpdGVtID0gdGhpcy5nZXRJdGVtKCk7XHJcbiAgICAgICAgY29uc3QgYnJlYWtwb2ludCA9IGl0ZW0uZ3JpZHN0ZXIgPyBpdGVtLmdyaWRzdGVyLm9wdGlvbnMuYnJlYWtwb2ludCA6IG51bGw7XHJcblxyXG4gICAgICAgIHRoaXMuc2V0VmFsdWVIKHZhbHVlLCBicmVha3BvaW50KTtcclxuICAgIH1cclxuXHJcbiAgICBnZXQgYXV0b1NpemUgKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmdldEl0ZW0oKS5hdXRvU2l6ZTtcclxuICAgIH1cclxuICAgIHNldCBhdXRvU2l6ZSAodmFsdWU6IGJvb2xlYW4pIHtcclxuICAgICAgICB0aGlzLmdldEl0ZW0oKS5hdXRvU2l6ZSA9IHZhbHVlO1xyXG4gICAgfVxyXG5cclxuICAgIGdldCBkcmFnQW5kRHJvcCgpIHtcclxuICAgICAgICByZXR1cm4gISF0aGlzLmdldEl0ZW0oKS5kcmFnQW5kRHJvcDtcclxuICAgIH1cclxuXHJcbiAgICBnZXQgcmVzaXphYmxlKCkge1xyXG4gICAgICAgIHJldHVybiAhIXRoaXMuZ2V0SXRlbSgpLnJlc2l6YWJsZTtcclxuICAgIH1cclxuXHJcbiAgICBnZXQgcG9zaXRpb25YKCkge1xyXG4gICAgICAgIGNvbnN0IGl0ZW0gPSB0aGlzLml0ZW1Db21wb25lbnQgfHwgdGhpcy5pdGVtUHJvdG90eXBlO1xyXG5cclxuICAgICAgICBpZiAoIWl0ZW0pIHtcclxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gaXRlbS5wb3NpdGlvblg7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0IHBvc2l0aW9uWSgpIHtcclxuICAgICAgICBjb25zdCBpdGVtID0gdGhpcy5pdGVtQ29tcG9uZW50IHx8IHRoaXMuaXRlbVByb3RvdHlwZTtcclxuXHJcbiAgICAgICAgaWYgKCFpdGVtKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIGl0ZW0ucG9zaXRpb25ZO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBzZXRGcm9tR3JpZHN0ZXJJdGVtIChpdGVtOiBHcmlkc3Rlckl0ZW1Db21wb25lbnQpOiBHcmlkTGlzdEl0ZW0ge1xyXG4gICAgICAgIGlmICh0aGlzLmlzSXRlbVNldCgpKSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignR3JpZExpc3RJdGVtIGlzIGFscmVhZHkgc2V0LicpO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLml0ZW1Db21wb25lbnQgPSBpdGVtO1xyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBzZXRGcm9tR3JpZHN0ZXJJdGVtUHJvdG90eXBlIChpdGVtOiBHcmlkc3Rlckl0ZW1Qcm90b3R5cGVEaXJlY3RpdmUpOiBHcmlkTGlzdEl0ZW0ge1xyXG4gICAgICAgIGlmICh0aGlzLmlzSXRlbVNldCgpKSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignR3JpZExpc3RJdGVtIGlzIGFscmVhZHkgc2V0LicpO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLml0ZW1Qcm90b3R5cGUgPSBpdGVtO1xyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBzZXRGcm9tT2JqZWN0TGl0ZXJhbCAoaXRlbTogT2JqZWN0KTogR3JpZExpc3RJdGVtIHtcclxuICAgICAgICBpZiAodGhpcy5pc0l0ZW1TZXQoKSkge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0dyaWRMaXN0SXRlbSBpcyBhbHJlYWR5IHNldC4nKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5pdGVtT2JqZWN0ID0gaXRlbTtcclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgY29weSgpIHtcclxuICAgICAgICBjb25zdCBpdGVtQ29weSA9IG5ldyBHcmlkTGlzdEl0ZW0oKTtcclxuXHJcbiAgICAgICAgcmV0dXJuIGl0ZW1Db3B5LnNldEZyb21PYmplY3RMaXRlcmFsKHtcclxuICAgICAgICAgICAgJGVsZW1lbnQ6IHRoaXMuJGVsZW1lbnQsXHJcbiAgICAgICAgICAgIHg6IHRoaXMueCxcclxuICAgICAgICAgICAgeTogdGhpcy55LFxyXG4gICAgICAgICAgICB3OiB0aGlzLncsXHJcbiAgICAgICAgICAgIGg6IHRoaXMuaCxcclxuICAgICAgICAgICAgYXV0b1NpemU6IHRoaXMuYXV0b1NpemUsXHJcbiAgICAgICAgICAgIGRyYWdBbmREcm9wOiB0aGlzLmRyYWdBbmREcm9wLFxyXG4gICAgICAgICAgICByZXNpemFibGU6IHRoaXMucmVzaXphYmxlXHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGNvcHlGb3JCcmVha3BvaW50KGJyZWFrcG9pbnQ/KSB7XHJcbiAgICAgICAgY29uc3QgaXRlbUNvcHkgPSBuZXcgR3JpZExpc3RJdGVtKCk7XHJcblxyXG4gICAgICAgIHJldHVybiBpdGVtQ29weS5zZXRGcm9tT2JqZWN0TGl0ZXJhbCh7XHJcbiAgICAgICAgICAgICRlbGVtZW50OiB0aGlzLiRlbGVtZW50LFxyXG4gICAgICAgICAgICB4OiB0aGlzLmdldFZhbHVlWChicmVha3BvaW50KSxcclxuICAgICAgICAgICAgeTogdGhpcy5nZXRWYWx1ZVkoYnJlYWtwb2ludCksXHJcbiAgICAgICAgICAgIHc6IHRoaXMuZ2V0VmFsdWVXKGJyZWFrcG9pbnQpLFxyXG4gICAgICAgICAgICBoOiB0aGlzLmdldFZhbHVlSChicmVha3BvaW50KSxcclxuICAgICAgICAgICAgYXV0b1NpemU6IHRoaXMuYXV0b1NpemUsXHJcbiAgICAgICAgICAgIGRyYWdBbmREcm9wOiB0aGlzLmRyYWdBbmREcm9wLFxyXG4gICAgICAgICAgICByZXNpemFibGU6IHRoaXMucmVzaXphYmxlXHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGdldFZhbHVlWChicmVha3BvaW50Pykge1xyXG4gICAgICAgIGNvbnN0IGl0ZW0gPSB0aGlzLmdldEl0ZW0oKTtcclxuXHJcbiAgICAgICAgcmV0dXJuIGl0ZW1bdGhpcy5nZXRYUHJvcGVydHkoYnJlYWtwb2ludCldO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBnZXRWYWx1ZVkoYnJlYWtwb2ludD8pIHtcclxuICAgICAgICBjb25zdCBpdGVtID0gdGhpcy5nZXRJdGVtKCk7XHJcblxyXG4gICAgICAgIHJldHVybiBpdGVtW3RoaXMuZ2V0WVByb3BlcnR5KGJyZWFrcG9pbnQpXTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZ2V0VmFsdWVXKGJyZWFrcG9pbnQ/KSB7XHJcbiAgICAgICAgY29uc3QgaXRlbSA9IHRoaXMuZ2V0SXRlbSgpO1xyXG5cclxuICAgICAgICByZXR1cm4gaXRlbVt0aGlzLmdldFdQcm9wZXJ0eShicmVha3BvaW50KV0gfHwgMTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZ2V0VmFsdWVIKGJyZWFrcG9pbnQ/KSB7XHJcbiAgICAgICAgY29uc3QgaXRlbSA9IHRoaXMuZ2V0SXRlbSgpO1xyXG5cclxuICAgICAgICByZXR1cm4gaXRlbVt0aGlzLmdldEhQcm9wZXJ0eShicmVha3BvaW50KV0gfHwgMTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgc2V0VmFsdWVYKHZhbHVlOiBudW1iZXIsIGJyZWFrcG9pbnQ/KSB7XHJcbiAgICAgICAgY29uc3QgaXRlbSA9IHRoaXMuZ2V0SXRlbSgpO1xyXG5cclxuICAgICAgICBpdGVtW3RoaXMuZ2V0WFByb3BlcnR5KGJyZWFrcG9pbnQpXSA9IHZhbHVlO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBzZXRWYWx1ZVkodmFsdWU6IG51bWJlciwgYnJlYWtwb2ludD8pIHtcclxuICAgICAgICBjb25zdCBpdGVtID0gdGhpcy5nZXRJdGVtKCk7XHJcblxyXG4gICAgICAgIGl0ZW1bdGhpcy5nZXRZUHJvcGVydHkoYnJlYWtwb2ludCldID0gdmFsdWU7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHNldFZhbHVlVyh2YWx1ZTogbnVtYmVyLCBicmVha3BvaW50Pykge1xyXG4gICAgICAgIGNvbnN0IGl0ZW0gPSB0aGlzLmdldEl0ZW0oKTtcclxuXHJcbiAgICAgICAgaXRlbVt0aGlzLmdldFdQcm9wZXJ0eShicmVha3BvaW50KV0gPSB2YWx1ZTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgc2V0VmFsdWVIKHZhbHVlOiBudW1iZXIsIGJyZWFrcG9pbnQ/KSB7XHJcbiAgICAgICAgY29uc3QgaXRlbSA9IHRoaXMuZ2V0SXRlbSgpO1xyXG5cclxuICAgICAgICBpdGVtW3RoaXMuZ2V0SFByb3BlcnR5KGJyZWFrcG9pbnQpXSA9IHZhbHVlO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyB0cmlnZ2VyQ2hhbmdlWChicmVha3BvaW50Pykge1xyXG4gICAgICAgIGNvbnN0IGl0ZW0gPSB0aGlzLml0ZW1Db21wb25lbnQ7XHJcbiAgICAgICAgaWYgKGl0ZW0pIHtcclxuICAgICAgICAgICAgaXRlbVt0aGlzLmdldFhQcm9wZXJ0eShicmVha3BvaW50KSArICdDaGFuZ2UnXS5lbWl0KHRoaXMuZ2V0VmFsdWVYKGJyZWFrcG9pbnQpKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHRyaWdnZXJDaGFuZ2VZKGJyZWFrcG9pbnQ/KSB7XHJcbiAgICAgICAgY29uc3QgaXRlbSA9IHRoaXMuaXRlbUNvbXBvbmVudDtcclxuICAgICAgICBpZiAoaXRlbSkge1xyXG4gICAgICAgICAgICBpdGVtW3RoaXMuZ2V0WVByb3BlcnR5KGJyZWFrcG9pbnQpICsgJ0NoYW5nZSddLmVtaXQodGhpcy5nZXRWYWx1ZVkoYnJlYWtwb2ludCkpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgdHJpZ2dlckNoYW5nZVcoYnJlYWtwb2ludD8pIHtcclxuICAgICAgICBjb25zdCBpdGVtID0gdGhpcy5pdGVtQ29tcG9uZW50O1xyXG4gICAgICAgIGlmIChpdGVtKSB7XHJcbiAgICAgICAgICAgIGl0ZW1bdGhpcy5nZXRXUHJvcGVydHkoYnJlYWtwb2ludCkgKyAnQ2hhbmdlJ10uZW1pdCh0aGlzLmdldFZhbHVlVyhicmVha3BvaW50KSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyB0cmlnZ2VyQ2hhbmdlSChicmVha3BvaW50Pykge1xyXG4gICAgICAgIGNvbnN0IGl0ZW0gPSB0aGlzLml0ZW1Db21wb25lbnQ7XHJcbiAgICAgICAgaWYgKGl0ZW0pIHtcclxuICAgICAgICAgICAgaXRlbVt0aGlzLmdldEhQcm9wZXJ0eShicmVha3BvaW50KSArICdDaGFuZ2UnXS5lbWl0KHRoaXMuZ2V0VmFsdWVIKGJyZWFrcG9pbnQpKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGhhc1Bvc2l0aW9ucyhicmVha3BvaW50Pykge1xyXG4gICAgICAgIGNvbnN0IHggPSB0aGlzLmdldFZhbHVlWChicmVha3BvaW50KTtcclxuICAgICAgICBjb25zdCB5ID0gdGhpcy5nZXRWYWx1ZVkoYnJlYWtwb2ludCk7XHJcblxyXG4gICAgICAgIHJldHVybiAoeCB8fCB4ID09PSAwKSAmJiAoeSB8fCB5ID09PSAwKTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgYXBwbHlQb3NpdGlvbihncmlkc3Rlcj86IEdyaWRzdGVyU2VydmljZSkge1xyXG4gICAgICAgIGNvbnN0IHBvc2l0aW9uID0gdGhpcy5jYWxjdWxhdGVQb3NpdGlvbihncmlkc3Rlcik7XHJcblxyXG4gICAgICAgIHRoaXMuaXRlbUNvbXBvbmVudC5wb3NpdGlvblggPSBwb3NpdGlvbi5sZWZ0O1xyXG4gICAgICAgIHRoaXMuaXRlbUNvbXBvbmVudC5wb3NpdGlvblkgPSBwb3NpdGlvbi50b3A7XHJcbiAgICAgICAgdGhpcy5pdGVtQ29tcG9uZW50LnVwZGF0ZUVsZW1lbmV0UG9zaXRpb24oKTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgY2FsY3VsYXRlUG9zaXRpb24oZ3JpZHN0ZXI/OiBHcmlkc3RlclNlcnZpY2UpOiB7bGVmdDogbnVtYmVyLCB0b3A6IG51bWJlcn0ge1xyXG4gICAgICAgIGlmICghZ3JpZHN0ZXIgJiYgIXRoaXMuaXRlbUNvbXBvbmVudCkge1xyXG4gICAgICAgICAgICByZXR1cm4ge2xlZnQ6IDAsIHRvcDogMH07XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGdyaWRzdGVyID0gZ3JpZHN0ZXIgfHwgdGhpcy5pdGVtQ29tcG9uZW50LmdyaWRzdGVyO1xyXG5cclxuICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICBsZWZ0OiB0aGlzLnggKiBncmlkc3Rlci5jZWxsV2lkdGgsXHJcbiAgICAgICAgICAgIHRvcDogdGhpcy55ICogZ3JpZHN0ZXIuY2VsbEhlaWdodFxyXG4gICAgICAgIH07XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGFwcGx5U2l6ZShncmlkc3Rlcj86IEdyaWRzdGVyU2VydmljZSk6IHZvaWQge1xyXG4gICAgICAgIGNvbnN0IHNpemUgPSB0aGlzLmNhbGN1bGF0ZVNpemUoZ3JpZHN0ZXIpO1xyXG5cclxuICAgICAgICB0aGlzLiRlbGVtZW50LnN0eWxlLndpZHRoID0gc2l6ZS53aWR0aCArICdweCc7XHJcbiAgICAgICAgdGhpcy4kZWxlbWVudC5zdHlsZS5oZWlnaHQgPSBzaXplLmhlaWdodCArICdweCc7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGNhbGN1bGF0ZVNpemUoZ3JpZHN0ZXI/OiBHcmlkc3RlclNlcnZpY2UpOiB7d2lkdGg6IG51bWJlciwgaGVpZ2h0OiBudW1iZXJ9IHtcclxuICAgICAgICBpZiAoIWdyaWRzdGVyICYmICF0aGlzLml0ZW1Db21wb25lbnQpIHtcclxuICAgICAgICAgICAgcmV0dXJuIHt3aWR0aDogMCwgaGVpZ2h0OiAwfTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZ3JpZHN0ZXIgPSBncmlkc3RlciB8fCB0aGlzLml0ZW1Db21wb25lbnQuZ3JpZHN0ZXI7XHJcblxyXG4gICAgICAgIGxldCB3aWR0aCA9IHRoaXMuZ2V0VmFsdWVXKGdyaWRzdGVyLm9wdGlvbnMuYnJlYWtwb2ludCk7XHJcbiAgICAgICAgbGV0IGhlaWdodCA9IHRoaXMuZ2V0VmFsdWVIKGdyaWRzdGVyLm9wdGlvbnMuYnJlYWtwb2ludCk7XHJcblxyXG4gICAgICAgIGlmIChncmlkc3Rlci5vcHRpb25zLmRpcmVjdGlvbiA9PT0gJ3ZlcnRpY2FsJykge1xyXG4gICAgICAgICAgICB3aWR0aCA9IE1hdGgubWluKHdpZHRoLCBncmlkc3Rlci5vcHRpb25zLmxhbmVzKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKGdyaWRzdGVyLm9wdGlvbnMuZGlyZWN0aW9uID09PSAnaG9yaXpvbnRhbCcpIHtcclxuICAgICAgICAgICAgaGVpZ2h0ID0gTWF0aC5taW4oaGVpZ2h0LCBncmlkc3Rlci5vcHRpb25zLmxhbmVzKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgIHdpZHRoOiB3aWR0aCAqIGdyaWRzdGVyLmNlbGxXaWR0aCxcclxuICAgICAgICAgICAgaGVpZ2h0OiBoZWlnaHQgKiBncmlkc3Rlci5jZWxsSGVpZ2h0XHJcbiAgICAgICAgfTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGdldFhQcm9wZXJ0eShicmVha3BvaW50Pzogc3RyaW5nKSB7XHJcblxyXG4gICAgICAgIGlmIChicmVha3BvaW50ICYmIHRoaXMuaXRlbUNvbXBvbmVudCkge1xyXG4gICAgICAgICAgICByZXR1cm4gR3JpZExpc3RJdGVtLlhfUFJPUEVSVFlfTUFQW2JyZWFrcG9pbnRdO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHJldHVybiAneCc7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgZ2V0WVByb3BlcnR5KGJyZWFrcG9pbnQ/OiBzdHJpbmcpIHtcclxuXHJcbiAgICAgICAgaWYgKGJyZWFrcG9pbnQgJiYgdGhpcy5pdGVtQ29tcG9uZW50KSB7XHJcbiAgICAgICAgICAgIHJldHVybiBHcmlkTGlzdEl0ZW0uWV9QUk9QRVJUWV9NQVBbYnJlYWtwb2ludF07XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgcmV0dXJuICd5JztcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBnZXRXUHJvcGVydHkoYnJlYWtwb2ludD86IHN0cmluZykge1xyXG4gICAgICAgIGlmICh0aGlzLml0ZW1Qcm90b3R5cGUpIHtcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuaXRlbVByb3RvdHlwZVtHcmlkTGlzdEl0ZW0uV19QUk9QRVJUWV9NQVBbYnJlYWtwb2ludF1dID9cclxuICAgICAgICAgICAgICAgIEdyaWRMaXN0SXRlbS5XX1BST1BFUlRZX01BUFticmVha3BvaW50XSA6ICd3JztcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGNvbnN0IGl0ZW0gPSB0aGlzLmdldEl0ZW0oKTtcclxuICAgICAgICBjb25zdCByZXNwb25zaXZlU2l6ZXMgPSBpdGVtLmdyaWRzdGVyICYmIGl0ZW0uZ3JpZHN0ZXIub3B0aW9ucy5yZXNwb25zaXZlU2l6ZXM7XHJcblxyXG4gICAgICAgIGlmIChicmVha3BvaW50ICYmIHJlc3BvbnNpdmVTaXplcykge1xyXG4gICAgICAgICAgICByZXR1cm4gR3JpZExpc3RJdGVtLldfUFJPUEVSVFlfTUFQW2JyZWFrcG9pbnRdO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHJldHVybiAndyc7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgZ2V0SFByb3BlcnR5KGJyZWFrcG9pbnQ/OiBzdHJpbmcpIHtcclxuICAgICAgICBpZiAodGhpcy5pdGVtUHJvdG90eXBlKSB7XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLml0ZW1Qcm90b3R5cGVbR3JpZExpc3RJdGVtLkhfUFJPUEVSVFlfTUFQW2JyZWFrcG9pbnRdXSA/XHJcbiAgICAgICAgICAgICAgICBHcmlkTGlzdEl0ZW0uSF9QUk9QRVJUWV9NQVBbYnJlYWtwb2ludF0gOiAnaCc7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBjb25zdCBpdGVtID0gdGhpcy5nZXRJdGVtKCk7XHJcbiAgICAgICAgY29uc3QgcmVzcG9uc2l2ZVNpemVzID0gaXRlbS5ncmlkc3RlciAmJiBpdGVtLmdyaWRzdGVyLm9wdGlvbnMucmVzcG9uc2l2ZVNpemVzO1xyXG5cclxuICAgICAgICBpZiAoYnJlYWtwb2ludCAmJiByZXNwb25zaXZlU2l6ZXMpIHtcclxuICAgICAgICAgICAgcmV0dXJuIEdyaWRMaXN0SXRlbS5IX1BST1BFUlRZX01BUFticmVha3BvaW50XTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICByZXR1cm4gJ2gnO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGdldEl0ZW0oKTogYW55IHtcclxuICAgICAgICBjb25zdCBpdGVtID0gdGhpcy5pdGVtQ29tcG9uZW50IHx8IHRoaXMuaXRlbVByb3RvdHlwZSB8fCB0aGlzLml0ZW1PYmplY3Q7XHJcblxyXG4gICAgICAgIGlmICghaXRlbSkge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0dyaWRMaXN0SXRlbSBpcyBub3Qgc2V0LicpO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gaXRlbTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGlzSXRlbVNldCgpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5pdGVtQ29tcG9uZW50IHx8IHRoaXMuaXRlbVByb3RvdHlwZSB8fCB0aGlzLml0ZW1PYmplY3Q7XHJcbiAgICB9XHJcbn1cclxuIl19