angular-gridster2
Version:
187 lines • 37.1 kB
JavaScript
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
var core_1 = require("@angular/core");
var gridster_component_1 = require("./gridster.component");
var gridsterDraggable_service_1 = require("./gridsterDraggable.service");
var gridsterResizable_service_1 = require("./gridsterResizable.service");
var gridsterUtils_service_1 = require("./gridsterUtils.service");
var GridsterItemComponent = (function () {
function GridsterItemComponent(el, gridster, renderer) {
this.renderer = renderer;
this.el = el.nativeElement;
this.$item = {
cols: -1,
rows: -1,
x: -1,
y: -1,
};
this.gridster = gridster;
this.drag = new gridsterDraggable_service_1.GridsterDraggable(this, gridster);
this.resize = new gridsterResizable_service_1.GridsterResizable(this, gridster);
}
GridsterItemComponent.prototype.ngOnInit = function () {
this.updateOptions();
this.gridster.addItem(this);
};
GridsterItemComponent.prototype.updateOptions = function () {
this.$item = gridsterUtils_service_1.GridsterUtils.merge(this.$item, this.item, {
cols: undefined,
rows: undefined,
x: undefined,
y: undefined,
dragEnabled: undefined,
resizeEnabled: undefined,
compactEnabled: undefined,
maxItemRows: undefined,
minItemRows: undefined,
maxItemCols: undefined,
minItemCols: undefined,
maxItemArea: undefined,
minItemArea: undefined,
});
};
GridsterItemComponent.prototype.ngOnDestroy = function () {
this.gridster.removeItem(this);
delete this.gridster;
this.drag.destroy();
delete this.drag;
this.resize.destroy();
delete this.resize;
};
GridsterItemComponent.prototype.setSize = function (noCheck) {
if (this.gridster.mobile) {
this.top = 0;
this.left = 0;
if (this.gridster.$options.keepFixedWidthInMobile) {
this.width = this.$item.cols * this.gridster.$options.fixedColWidth;
}
else {
this.width = this.gridster.curWidth - (this.gridster.$options.outerMargin ? 2 * this.gridster.$options.margin : 0);
}
if (this.gridster.$options.keepFixedHeightInMobile) {
this.height = this.$item.rows * this.gridster.$options.fixedRowHeight;
}
else {
this.height = this.width / 2;
}
}
else {
this.top = this.$item.y * this.gridster.curRowHeight;
this.left = this.$item.x * this.gridster.curColWidth;
this.width = this.$item.cols * this.gridster.curColWidth - this.gridster.$options.margin;
this.height = this.$item.rows * this.gridster.curRowHeight - this.gridster.$options.margin;
}
if (!noCheck && this.top === this.itemTop && this.left === this.itemLeft &&
this.width === this.itemWidth && this.height === this.itemHeight) {
return;
}
if (this.gridster.$options.outerMargin) {
if (this.gridster.$options.outerMarginTop !== null) {
this.itemMargin = this.gridster.$options.outerMarginTop + 'px ';
}
else {
this.itemMargin = this.gridster.$options.margin + 'px ';
}
if (this.gridster.$options.outerMarginRight !== null) {
this.itemMargin += this.gridster.$options.outerMarginRight + 'px ';
}
else {
this.itemMargin += this.gridster.$options.margin + 'px ';
}
if (this.gridster.$options.outerMarginBottom !== null) {
this.itemMargin += this.gridster.$options.outerMarginBottom + 'px ';
}
else {
this.itemMargin += this.gridster.$options.margin + 'px ';
}
if (this.gridster.$options.outerMarginLeft !== null) {
this.itemMargin += this.gridster.$options.outerMarginLeft + 'px';
}
else {
this.itemMargin += this.gridster.$options.margin + 'px';
}
}
else {
this.itemMargin = 0 + 'px';
}
this.renderer.setStyle(this.el, 'display', this.notPlaced ? 'none' : 'block');
this.renderer.setStyle(this.el, 'top', this.top + 'px');
this.renderer.setStyle(this.el, 'left', this.left + 'px');
this.renderer.setStyle(this.el, 'width', this.width + 'px');
this.renderer.setStyle(this.el, 'height', this.height + 'px');
this.renderer.setStyle(this.el, 'margin', this.itemMargin);
if (!this.init && this.width > 0 && this.height > 0) {
this.init = true;
if (this.item.initCallback) {
this.item.initCallback(this.item, this);
}
if (this.gridster.options.itemInitCallback) {
this.gridster.options.itemInitCallback(this.item, this);
}
if (this.gridster.$options.scrollToNewItems) {
this.el.scrollIntoView(false);
}
}
if (this.width !== this.itemWidth || this.height !== this.itemHeight) {
if (this.gridster.options.itemResizeCallback) {
this.gridster.options.itemResizeCallback(this.item, this);
}
}
this.itemTop = this.top;
this.itemLeft = this.left;
this.itemWidth = this.width;
this.itemHeight = this.height;
};
GridsterItemComponent.prototype.itemChanged = function () {
if (this.gridster.options.itemChangeCallback) {
this.gridster.options.itemChangeCallback(this.item, this);
}
};
GridsterItemComponent.prototype.checkItemChanges = function (newValue, oldValue) {
if (newValue.rows === oldValue.rows && newValue.cols === oldValue.cols && newValue.x === oldValue.x && newValue.y === oldValue.y) {
return;
}
if (this.gridster.checkCollision(this.$item)) {
this.$item.x = oldValue.x || 0;
this.$item.y = oldValue.y || 0;
this.$item.cols = oldValue.cols || 1;
this.$item.rows = oldValue.rows || 1;
}
else {
this.item.cols = this.$item.cols;
this.item.rows = this.$item.rows;
this.item.x = this.$item.x;
this.item.y = this.$item.y;
this.gridster.calculateLayout();
this.itemChanged();
}
};
GridsterItemComponent.prototype.canBeDragged = function () {
return !this.gridster.mobile &&
(this.$item.dragEnabled === undefined ? this.gridster.$options.draggable.enabled : this.$item.dragEnabled);
};
GridsterItemComponent.prototype.canBeResized = function () {
return !this.gridster.mobile &&
(this.$item.resizeEnabled === undefined ? this.gridster.$options.resizable.enabled : this.$item.resizeEnabled);
};
return GridsterItemComponent;
}());
GridsterItemComponent.decorators = [
{ type: core_1.Component, args: [{
selector: 'gridster-item',
template: "<ng-content></ng-content> <div (mousedown)=\"resize.dragStartDelay($event)\" (touchstart)=\"resize.dragStartDelay($event)\" [hidden]=\"!gridster.$options.resizable.handles.s || !resize.resizeEnabled\" class=\"gridster-item-resizable-handler handle-s\"></div> <div (mousedown)=\"resize.dragStartDelay($event)\" (touchstart)=\"resize.dragStartDelay($event)\" [hidden]=\"!gridster.$options.resizable.handles.e || !resize.resizeEnabled\" class=\"gridster-item-resizable-handler handle-e\"></div> <div (mousedown)=\"resize.dragStartDelay($event)\" (touchstart)=\"resize.dragStartDelay($event)\" [hidden]=\"!gridster.$options.resizable.handles.n || !resize.resizeEnabled\" class=\"gridster-item-resizable-handler handle-n\"></div> <div (mousedown)=\"resize.dragStartDelay($event)\" (touchstart)=\"resize.dragStartDelay($event)\" [hidden]=\"!gridster.$options.resizable.handles.w || !resize.resizeEnabled\" class=\"gridster-item-resizable-handler handle-w\"></div> <div (mousedown)=\"resize.dragStartDelay($event)\" (touchstart)=\"resize.dragStartDelay($event)\" [hidden]=\"!gridster.$options.resizable.handles.se || !resize.resizeEnabled\" class=\"gridster-item-resizable-handler handle-se\"></div> <div (mousedown)=\"resize.dragStartDelay($event)\" (touchstart)=\"resize.dragStartDelay($event)\" [hidden]=\"!gridster.$options.resizable.handles.ne || !resize.resizeEnabled\" class=\"gridster-item-resizable-handler handle-ne\"></div> <div (mousedown)=\"resize.dragStartDelay($event)\" (touchstart)=\"resize.dragStartDelay($event)\" [hidden]=\"!gridster.$options.resizable.handles.sw || !resize.resizeEnabled\" class=\"gridster-item-resizable-handler handle-sw\"></div> <div (mousedown)=\"resize.dragStartDelay($event)\" (touchstart)=\"resize.dragStartDelay($event)\" [hidden]=\"!gridster.$options.resizable.handles.nw || !resize.resizeEnabled\" class=\"gridster-item-resizable-handler handle-nw\"></div>",
styles: ["gridster-item { box-sizing: border-box; z-index: 1; position: absolute; overflow: hidden; transition: .3s; display: none; background: white; user-select: text; } gridster-item.gridster-item-moving { cursor: move; } gridster-item.gridster-item-resizing, gridster-item.gridster-item-moving { transition: 0s; z-index: 2; box-shadow: 0 0 5px 5px rgba(0, 0, 0, .2), 0 6px 10px 0 rgba(0, 0, 0, .14), 0 1px 18px 0 rgba(0, 0, 0, .12); } .gridster-item-resizable-handler { position: absolute; z-index: 2; } .gridster-item-resizable-handler.handle-n { cursor: n-resize; height: 10px; right: 0; top: 0; left: 0; } .gridster-item-resizable-handler.handle-e { cursor: e-resize; width: 10px; bottom: 0; right: 0; top: 0; } .gridster-item-resizable-handler.handle-s { cursor: s-resize; height: 10px; right: 0; bottom: 0; left: 0; } .gridster-item-resizable-handler.handle-w { cursor: w-resize; width: 10px; left: 0; top: 0; bottom: 0; } .gridster-item-resizable-handler.handle-ne { cursor: ne-resize; width: 10px; height: 10px; right: 0; top: 0; } .gridster-item-resizable-handler.handle-nw { cursor: nw-resize; width: 10px; height: 10px; left: 0; top: 0; } .gridster-item-resizable-handler.handle-se { cursor: se-resize; width: 0; height: 0; right: 0; bottom: 0; border-style: solid; border-width: 0 0 10px 10px; border-color: transparent; } .gridster-item-resizable-handler.handle-sw { cursor: sw-resize; width: 10px; height: 10px; left: 0; bottom: 0; } gridster-item:hover .gridster-item-resizable-handler.handle-se { border-color: transparent transparent #ccc }"],
encapsulation: core_1.ViewEncapsulation.None
},] },
];
/** @nocollapse */
GridsterItemComponent.ctorParameters = function () { return [
{ type: core_1.ElementRef, },
{ type: gridster_component_1.GridsterComponent, decorators: [{ type: core_1.Host },] },
{ type: core_1.Renderer2, },
]; };
GridsterItemComponent.propDecorators = {
'item': [{ type: core_1.Input },],
};
exports.GridsterItemComponent = GridsterItemComponent;
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy50bXAvZ3JpZHN0ZXJJdGVtLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUFBLHNDQUFrSDtBQUdsSCwyREFBdUQ7QUFDdkQseUVBQThEO0FBQzlELHlFQUE4RDtBQUM5RCxpRUFBc0Q7QUFLdEQ7SUFtQkUsK0JBQVksRUFBYyxFQUFHLFFBQTJCLEVBQVMsUUFBbUI7UUFBbkIsYUFBUSxHQUFSLFFBQVEsQ0FBVztRQUNsRixJQUFJLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxhQUFhLENBQUM7UUFDM0IsSUFBSSxDQUFDLEtBQUssR0FBRztZQUNYLElBQUksRUFBRSxDQUFDLENBQUM7WUFDUixJQUFJLEVBQUUsQ0FBQyxDQUFDO1lBQ1IsQ0FBQyxFQUFFLENBQUMsQ0FBQztZQUNMLENBQUMsRUFBRSxDQUFDLENBQUM7U0FDTixDQUFDO1FBQ0YsSUFBSSxDQUFDLFFBQVEsR0FBRyxRQUFRLENBQUM7UUFDekIsSUFBSSxDQUFDLElBQUksR0FBRyxJQUFJLDZDQUFpQixDQUFDLElBQUksRUFBRSxRQUFRLENBQUMsQ0FBQztRQUNsRCxJQUFJLENBQUMsTUFBTSxHQUFHLElBQUksNkNBQWlCLENBQUMsSUFBSSxFQUFFLFFBQVEsQ0FBQyxDQUFDO0lBQ3RELENBQUM7SUFFRCx3Q0FBUSxHQUFSO1FBQ0UsSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDO1FBQ3JCLElBQUksQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQzlCLENBQUM7SUFFRCw2Q0FBYSxHQUFiO1FBQ0UsSUFBSSxDQUFDLEtBQUssR0FBRyxxQ0FBYSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxJQUFJLEVBQUU7WUFDdEQsSUFBSSxFQUFFLFNBQVM7WUFDZixJQUFJLEVBQUUsU0FBUztZQUNmLENBQUMsRUFBRSxTQUFTO1lBQ1osQ0FBQyxFQUFFLFNBQVM7WUFDWixXQUFXLEVBQUUsU0FBUztZQUN0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LElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDN0MsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLEdBQUcsUUFBUSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDL0IsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLEdBQUcsUUFBUSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDL0IsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLEdBQUcsUUFBUSxDQUFDLElBQUksSUFBSSxDQUFDLENBQUM7WUFDckMsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLEdBQUcsUUFBUSxDQUFDLElBQUksSUFBSSxDQUFDLENBQUM7UUFDdkMsQ0FBQztRQUFDLElBQUksQ0FBQyxDQUFDO1lBQ04sSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUM7WUFDakMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUM7WUFDakMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7WUFDM0IsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7WUFDM0IsSUFBSSxDQUFDLFFBQVEsQ0FBQyxlQUFlLEVBQUUsQ0FBQztZQUNoQyxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7UUFDckIsQ0FBQztJQUNILENBQUM7SUFFRCw0Q0FBWSxHQUFaO1FBQ0UsTUFBTSxDQUFDLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNO1lBQzFCLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxXQUFXLEtBQUssU0FBUyxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxXQUFXLENBQUMsQ0FBQztJQUMvRyxDQUFDO0lBRUQsNENBQVksR0FBWjtRQUNFLE1BQU0sQ0FBQyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTTtZQUMxQixDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsYUFBYSxLQUFLLFNBQVMsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsYUFBYSxDQUFDLENBQUM7SUFDbkgsQ0FBQztJQW1CSCw0QkFBQztBQUFELENBbk1BLEFBbU1DO0FBakJNLGdDQUFVLEdBQTBCO0lBQzNDLEVBQUUsSUFBSSxFQUFFLGdCQUFTLEVBQUUsSUFBSSxFQUFFLENBQUM7Z0JBQ3hCLFFBQVEsRUFBRSxlQUFlO2dCQUN6QixRQUFRLEVBQUUsMjdEQUEyM0Q7Z0JBQ3I0RCxNQUFNLEVBQUUsQ0FBQyxncERBQWdwRCxDQUFDO2dCQUMxcEQsYUFBYSxFQUFFLHdCQUFpQixDQUFDLElBQUk7YUFDdEMsRUFBRyxFQUFFO0NBQ0wsQ0FBQztBQUNGLGtCQUFrQjtBQUNYLG9DQUFjLEdBQW1FLGNBQU0sT0FBQTtJQUM5RixFQUFDLElBQUksRUFBRSxpQkFBVSxHQUFHO0lBQ3BCLEVBQUMsSUFBSSxFQUFFLHNDQUFpQixFQUFFLFVBQVUsRUFBRSxDQUFDLEVBQUUsSUFBSSxFQUFFLFdBQUksRUFBRSxFQUFHLEVBQUM7SUFDekQsRUFBQyxJQUFJLEVBQUUsZ0JBQVMsR0FBRztDQUNsQixFQUo2RixDQUk3RixDQUFDO0FBQ0ssb0NBQWMsR0FBMkM7SUFDaEUsTUFBTSxFQUFFLENBQUMsRUFBRSxJQUFJLEVBQUUsWUFBSyxFQUFFLEVBQUU7Q0FDekIsQ0FBQztBQWxNVyxzREFBcUIiLCJmaWxlIjoiZ3JpZHN0ZXJJdGVtLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge0NvbXBvbmVudCwgRWxlbWVudFJlZiwgSG9zdCwgSW5wdXQsIE9uRGVzdHJveSwgT25Jbml0LCBSZW5kZXJlcjIsIFZpZXdFbmNhcHN1bGF0aW9ufSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxuaW1wb3J0IHtHcmlkc3Rlckl0ZW19IGZyb20gJy4vZ3JpZHN0ZXJJdGVtLmludGVyZmFjZSc7XG5pbXBvcnQge0dyaWRzdGVyQ29tcG9uZW50fSBmcm9tICcuL2dyaWRzdGVyLmNvbXBvbmVudCc7XG5pbXBvcnQge0dyaWRzdGVyRHJhZ2dhYmxlfSBmcm9tICcuL2dyaWRzdGVyRHJhZ2dhYmxlLnNlcnZpY2UnO1xuaW1wb3J0IHtHcmlkc3RlclJlc2l6YWJsZX0gZnJvbSAnLi9ncmlkc3RlclJlc2l6YWJsZS5zZXJ2aWNlJztcbmltcG9ydCB7R3JpZHN0ZXJVdGlsc30gZnJvbSAnLi9ncmlkc3RlclV0aWxzLnNlcnZpY2UnO1xuaW1wb3J0IHtHcmlkc3Rlckl0ZW1TfSBmcm9tICcuL2dyaWRzdGVySXRlbVMuaW50ZXJmYWNlJztcbmltcG9ydCB7R3JpZHN0ZXJJdGVtQ29tcG9uZW50SW50ZXJmYWNlfSBmcm9tICcuL2dyaWRzdGVySXRlbUNvbXBvbmVudC5pbnRlcmZhY2UnO1xuXG5cbmV4cG9ydCBjbGFzcyBHcmlkc3Rlckl0ZW1Db21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIE9uRGVzdHJveSwgR3JpZHN0ZXJJdGVtQ29tcG9uZW50SW50ZXJmYWNlIHtcbiAgIGl0ZW06IEdyaWRzdGVySXRlbTtcbiAgJGl0ZW06IEdyaWRzdGVySXRlbVM7XG4gIGVsOiBhbnk7XG4gIGdyaWRzdGVyOiBHcmlkc3RlckNvbXBvbmVudDtcbiAgaXRlbVRvcDogbnVtYmVyO1xuICBpdGVtTGVmdDogbnVtYmVyO1xuICBpdGVtV2lkdGg6IG51bWJlcjtcbiAgaXRlbUhlaWdodDogbnVtYmVyO1xuICB0b3A6IG51bWJlcjtcbiAgbGVmdDogbnVtYmVyO1xuICB3aWR0aDogbnVtYmVyO1xuICBoZWlnaHQ6IG51bWJlcjtcbiAgaXRlbU1hcmdpbjogc3RyaW5nO1xuICBkcmFnOiBHcmlkc3RlckRyYWdnYWJsZTtcbiAgcmVzaXplOiBHcmlkc3RlclJlc2l6YWJsZTtcbiAgbm90UGxhY2VkOiBib29sZWFuO1xuICBpbml0OiBib29sZWFuO1xuXG4gIGNvbnN0cnVjdG9yKGVsOiBFbGVtZW50UmVmLCAgZ3JpZHN0ZXI6IEdyaWRzdGVyQ29tcG9uZW50LCBwdWJsaWMgcmVuZGVyZXI6IFJlbmRlcmVyMikge1xuICAgIHRoaXMuZWwgPSBlbC5uYXRpdmVFbGVtZW50O1xuICAgIHRoaXMuJGl0ZW0gPSB7XG4gICAgICBjb2xzOiAtMSxcbiAgICAgIHJvd3M6IC0xLFxuICAgICAgeDogLTEsXG4gICAgICB5OiAtMSxcbiAgICB9O1xuICAgIHRoaXMuZ3JpZHN0ZXIgPSBncmlkc3RlcjtcbiAgICB0aGlzLmRyYWcgPSBuZXcgR3JpZHN0ZXJEcmFnZ2FibGUodGhpcywgZ3JpZHN0ZXIpO1xuICAgIHRoaXMucmVzaXplID0gbmV3IEdyaWRzdGVyUmVzaXphYmxlKHRoaXMsIGdyaWRzdGVyKTtcbiAgfVxuXG4gIG5nT25Jbml0KCk6IHZvaWQge1xuICAgIHRoaXMudXBkYXRlT3B0aW9ucygpO1xuICAgIHRoaXMuZ3JpZHN0ZXIuYWRkSXRlbSh0aGlzKTtcbiAgfVxuXG4gIHVwZGF0ZU9wdGlvbnMoKTogdm9pZCB7XG4gICAgdGhpcy4kaXRlbSA9IEdyaWRzdGVyVXRpbHMubWVyZ2UodGhpcy4kaXRlbSwgdGhpcy5pdGVtLCB7XG4gICAgICBjb2xzOiB1bmRlZmluZWQsXG4gICAgICByb3dzOiB1bmRlZmluZWQsXG4gICAgICB4OiB1bmRlZmluZWQsXG4gICAgICB5OiB1bmRlZmluZWQsXG4gICAgICBkcmFnRW5hYmxlZDogdW5kZWZpbmVkLFxuICAgICAgcmVzaXplRW5hYmxlZDogdW5kZWZpbmVkLFxuICAgICAgY29tcGFjdEVuYWJsZWQ6IHVuZGVmaW5lZCxcbiAgICAgIG1heEl0ZW1Sb3dzOiB1bmRlZmluZWQsXG4gICAgICBtaW5JdGVtUm93czogdW5kZWZpbmVkLFxuICAgICAgbWF4SXRlbUNvbHM6IHVuZGVmaW5lZCxcbiAgICAgIG1pbkl0ZW1Db2xzOiB1bmRlZmluZWQsXG4gICAgICBtYXhJdGVtQXJlYTogdW5kZWZpbmVkLFxuICAgICAgbWluSXRlbUFyZWE6IHVuZGVmaW5lZCxcbiAgICB9KTtcbiAgfVxuXG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgIHRoaXMuZ3JpZHN0ZXIucmVtb3ZlSXRlbSh0aGlzKTtcbiAgICBkZWxldGUgdGhpcy5ncmlkc3RlcjtcbiAgICB0aGlzLmRyYWcuZGVzdHJveSgpO1xuICAgIGRlbGV0ZSB0aGlzLmRyYWc7XG4gICAgdGhpcy5yZXNpemUuZGVzdHJveSgpO1xuICAgIGRlbGV0ZSB0aGlzLnJlc2l6ZTtcbiAgfVxuXG4gIHNldFNpemUobm9DaGVjazogQm9vbGVhbik6IHZvaWQge1xuICAgIGlmICh0aGlzLmdyaWRzdGVyLm1vYmlsZSkge1xuICAgICAgdGhpcy50b3AgPSAwO1xuICAgICAgdGhpcy5sZWZ0ID0gMDtcbiAgICAgIGlmICh0aGlzLmdyaWRzdGVyLiRvcHRpb25zLmtlZXBGaXhlZFdpZHRoSW5Nb2JpbGUpIHtcbiAgICAgICAgdGhpcy53aWR0aCA9IHRoaXMuJGl0ZW0uY29scyAqIHRoaXMuZ3JpZHN0ZXIuJG9wdGlvbnMuZml4ZWRDb2xXaWR0aDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMud2lkdGggPSB0aGlzLmdyaWRzdGVyLmN1cldpZHRoIC0gKHRoaXMuZ3JpZHN0ZXIuJG9wdGlvbnMub3V0ZXJNYXJnaW4gPyAyICogdGhpcy5ncmlkc3Rlci4kb3B0aW9ucy5tYXJnaW4gOiAwKTtcbiAgICAgIH1cbiAgICAgIGlmICh0aGlzLmdyaWRzdGVyLiRvcHRpb25zLmtlZXBGaXhlZEhlaWdodEluTW9iaWxlKSB7XG4gICAgICAgIHRoaXMuaGVpZ2h0ID0gdGhpcy4kaXRlbS5yb3dzICogdGhpcy5ncmlkc3Rlci4kb3B0aW9ucy5maXhlZFJvd0hlaWdodDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuaGVpZ2h0ID0gdGhpcy53aWR0aCAvIDI7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMudG9wID0gdGhpcy4kaXRlbS55ICogdGhpcy5ncmlkc3Rlci5jdXJSb3dIZWlnaHQ7XG4gICAgICB0aGlzLmxlZnQgPSB0aGlzLiRpdGVtLnggKiB0aGlzLmdyaWRzdGVyLmN1ckNvbFdpZHRoO1xuICAgICAgdGhpcy53aWR0aCA9IHRoaXMuJGl0ZW0uY29scyAqIHRoaXMuZ3JpZHN0ZXIuY3VyQ29sV2lkdGggLSB0aGlzLmdyaWRzdGVyLiRvcHRpb25zLm1hcmdpbjtcbiAgICAgIHRoaXMuaGVpZ2h0ID0gdGhpcy4kaXRlbS5yb3dzICogdGhpcy5ncmlkc3Rlci5jdXJSb3dIZWlnaHQgLSB0aGlzLmdyaWRzdGVyLiRvcHRpb25zLm1hcmdpbjtcbiAgICB9XG4gICAgaWYgKCFub0NoZWNrICYmIHRoaXMudG9wID09PSB0aGlzLml0ZW1Ub3AgJiYgdGhpcy5sZWZ0ID09PSB0aGlzLml0ZW1MZWZ0ICYmXG4gICAgICB0aGlzLndpZHRoID09PSB0aGlzLml0ZW1XaWR0aCAmJiB0aGlzLmhlaWdodCA9PT0gdGhpcy5pdGVtSGVpZ2h0KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmICh0aGlzLmdyaWRzdGVyLiRvcHRpb25zLm91dGVyTWFyZ2luKSB7XG4gICAgICBpZiAodGhpcy5ncmlkc3Rlci4kb3B0aW9ucy5vdXRlck1hcmdpblRvcCAhPT0gbnVsbCkge1xuICAgICAgICB0aGlzLml0ZW1NYXJnaW4gPSB0aGlzLmdyaWRzdGVyLiRvcHRpb25zLm91dGVyTWFyZ2luVG9wICsgJ3B4ICc7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLml0ZW1NYXJnaW4gPSB0aGlzLmdyaWRzdGVyLiRvcHRpb25zLm1hcmdpbiArICdweCAnO1xuICAgICAgfVxuICAgICAgaWYgKHRoaXMuZ3JpZHN0ZXIuJG9wdGlvbnMub3V0ZXJNYXJnaW5SaWdodCAhPT0gbnVsbCkge1xuICAgICAgICB0aGlzLml0ZW1NYXJnaW4gKz0gdGhpcy5ncmlkc3Rlci4kb3B0aW9ucy5vdXRlck1hcmdpblJpZ2h0ICsgJ3B4ICc7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLml0ZW1NYXJnaW4gKz0gdGhpcy5ncmlkc3Rlci4kb3B0aW9ucy5tYXJnaW4gKyAncHggJztcbiAgICAgIH1cbiAgICAgIGlmICh0aGlzLmdyaWRzdGVyLiRvcHRpb25zLm91dGVyTWFyZ2luQm90dG9tICE9PSBudWxsKSB7XG4gICAgICAgIHRoaXMuaXRlbU1hcmdpbiArPSB0aGlzLmdyaWRzdGVyLiRvcHRpb25zLm91dGVyTWFyZ2luQm90dG9tICsgJ3B4ICc7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLml0ZW1NYXJnaW4gKz0gdGhpcy5ncmlkc3Rlci4kb3B0aW9ucy5tYXJnaW4gKyAncHggJztcbiAgICAgIH1cbiAgICAgIGlmICh0aGlzLmdyaWRzdGVyLiRvcHRpb25zLm91dGVyTWFyZ2luTGVmdCAhPT0gbnVsbCkge1xuICAgICAgICB0aGlzLml0ZW1NYXJnaW4gKz0gdGhpcy5ncmlkc3Rlci4kb3B0aW9ucy5vdXRlck1hcmdpbkxlZnQgKyAncHgnO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5pdGVtTWFyZ2luICs9IHRoaXMuZ3JpZHN0ZXIuJG9wdGlvbnMubWFyZ2luICsgJ3B4JztcbiAgICAgIH1cblxuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLml0ZW1NYXJnaW4gPSAwICsgJ3B4JztcbiAgICB9XG5cbiAgICB0aGlzLnJlbmRlcmVyLnNldFN0eWxlKHRoaXMuZWwsICdkaXNwbGF5JywgdGhpcy5ub3RQbGFjZWQgPyAnbm9uZScgOiAnYmxvY2snKTtcbiAgICB0aGlzLnJlbmRlcmVyLnNldFN0eWxlKHRoaXMuZWwsICd0b3AnLCB0aGlzLnRvcCArICdweCcpO1xuICAgIHRoaXMucmVuZGVyZXIuc2V0U3R5bGUodGhpcy5lbCwgJ2xlZnQnLCB0aGlzLmxlZnQgKyAncHgnKTtcbiAgICB0aGlzLnJlbmRlcmVyLnNldFN0eWxlKHRoaXMuZWwsICd3aWR0aCcsIHRoaXMud2lkdGggKyAncHgnKTtcbiAgICB0aGlzLnJlbmRlcmVyLnNldFN0eWxlKHRoaXMuZWwsICdoZWlnaHQnLCB0aGlzLmhlaWdodCArICdweCcpO1xuICAgIHRoaXMucmVuZGVyZXIuc2V0U3R5bGUodGhpcy5lbCwgJ21hcmdpbicsIHRoaXMuaXRlbU1hcmdpbik7XG4gICAgaWYgKCF0aGlzLmluaXQgJiYgdGhpcy53aWR0aCA+IDAgJiYgdGhpcy5oZWlnaHQgPiAwKSB7XG4gICAgICB0aGlzLmluaXQgPSB0cnVlO1xuICAgICAgaWYgKHRoaXMuaXRlbS5pbml0Q2FsbGJhY2spIHtcbiAgICAgICAgdGhpcy5pdGVtLmluaXRDYWxsYmFjayh0aGlzLml0ZW0sIHRoaXMpO1xuICAgICAgfVxuICAgICAgaWYgKHRoaXMuZ3JpZHN0ZXIub3B0aW9ucy5pdGVtSW5pdENhbGxiYWNrKSB7XG4gICAgICAgIHRoaXMuZ3JpZHN0ZXIub3B0aW9ucy5pdGVtSW5pdENhbGxiYWNrKHRoaXMuaXRlbSwgdGhpcyk7XG4gICAgICB9XG4gICAgICBpZiAodGhpcy5ncmlkc3Rlci4kb3B0aW9ucy5zY3JvbGxUb05ld0l0ZW1zKSB7XG4gICAgICAgIHRoaXMuZWwuc2Nyb2xsSW50b1ZpZXcoZmFsc2UpO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAodGhpcy53aWR0aCAhPT0gdGhpcy5pdGVtV2lkdGggfHwgdGhpcy5oZWlnaHQgIT09IHRoaXMuaXRlbUhlaWdodCkge1xuICAgICAgaWYgKHRoaXMuZ3JpZHN0ZXIub3B0aW9ucy5pdGVtUmVzaXplQ2FsbGJhY2spIHtcbiAgICAgICAgdGhpcy5ncmlkc3Rlci5vcHRpb25zLml0ZW1SZXNpemVDYWxsYmFjayh0aGlzLml0ZW0sIHRoaXMpO1xuICAgICAgfVxuICAgIH1cbiAgICB0aGlzLml0ZW1Ub3AgPSB0aGlzLnRvcDtcbiAgICB0aGlzLml0ZW1MZWZ0ID0gdGhpcy5sZWZ0O1xuICAgIHRoaXMuaXRlbVdpZHRoID0gdGhpcy53aWR0aDtcbiAgICB0aGlzLml0ZW1IZWlnaHQgPSB0aGlzLmhlaWdodDtcbiAgfVxuXG4gIGl0ZW1DaGFuZ2VkKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmdyaWRzdGVyLm9wdGlvbnMuaXRlbUNoYW5nZUNhbGxiYWNrKSB7XG4gICAgICB0aGlzLmdyaWRzdGVyLm9wdGlvbnMuaXRlbUNoYW5nZUNhbGxiYWNrKHRoaXMuaXRlbSwgdGhpcyk7XG4gICAgfVxuICB9XG5cbiAgY2hlY2tJdGVtQ2hhbmdlcyhuZXdWYWx1ZTogR3JpZHN0ZXJJdGVtLCBvbGRWYWx1ZTogR3JpZHN0ZXJJdGVtKTogdm9pZCB7XG4gICAgaWYgKG5ld1ZhbHVlLnJvd3MgPT09IG9sZFZhbHVlLnJvd3MgJiYgbmV3VmFsdWUuY29scyA9PT0gb2xkVmFsdWUuY29scyAmJiBuZXdWYWx1ZS54ID09PSBvbGRWYWx1ZS54ICYmIG5ld1ZhbHVlLnkgPT09IG9sZFZhbHVlLnkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKHRoaXMuZ3JpZHN0ZXIuY2hlY2tDb2xsaXNpb24odGhpcy4kaXRlbSkpIHtcbiAgICAgIHRoaXMuJGl0ZW0ueCA9IG9sZFZhbHVlLnggfHwgMDtcbiAgICAgIHRoaXMuJGl0ZW0ueSA9IG9sZFZhbHVlLnkgfHwgMDtcbiAgICAgIHRoaXMuJGl0ZW0uY29scyA9IG9sZFZhbHVlLmNvbHMgfHwgMTtcbiAgICAgIHRoaXMuJGl0ZW0ucm93cyA9IG9sZFZhbHVlLnJvd3MgfHwgMTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5pdGVtLmNvbHMgPSB0aGlzLiRpdGVtLmNvbHM7XG4gICAgICB0aGlzLml0ZW0ucm93cyA9IHRoaXMuJGl0ZW0ucm93cztcbiAgICAgIHRoaXMuaXRlbS54ID0gdGhpcy4kaXRlbS54O1xuICAgICAgdGhpcy5pdGVtLnkgPSB0aGlzLiRpdGVtLnk7XG4gICAgICB0aGlzLmdyaWRzdGVyLmNhbGN1bGF0ZUxheW91dCgpO1xuICAgICAgdGhpcy5pdGVtQ2hhbmdlZCgpO1xuICAgIH1cbiAgfVxuXG4gIGNhbkJlRHJhZ2dlZCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gIXRoaXMuZ3JpZHN0ZXIubW9iaWxlICYmXG4gICAgICAodGhpcy4kaXRlbS5kcmFnRW5hYmxlZCA9PT0gdW5kZWZpbmVkID8gdGhpcy5ncmlkc3Rlci4kb3B0aW9ucy5kcmFnZ2FibGUuZW5hYmxlZCA6IHRoaXMuJGl0ZW0uZHJhZ0VuYWJsZWQpO1xuICB9XG5cbiAgY2FuQmVSZXNpemVkKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAhdGhpcy5ncmlkc3Rlci5tb2JpbGUgJiZcbiAgICAgICh0aGlzLiRpdGVtLnJlc2l6ZUVuYWJsZWQgPT09IHVuZGVmaW5lZCA/IHRoaXMuZ3JpZHN0ZXIuJG9wdGlvbnMucmVzaXphYmxlLmVuYWJsZWQgOiB0aGlzLiRpdGVtLnJlc2l6ZUVuYWJsZWQpO1xuICB9XG5cbnN0YXRpYyBkZWNvcmF0b3JzOiBEZWNvcmF0b3JJbnZvY2F0aW9uW10gPSBbXG57IHR5cGU6IENvbXBvbmVudCwgYXJnczogW3tcbiAgc2VsZWN0b3I6ICdncmlkc3Rlci1pdGVtJyxcbiAgdGVtcGxhdGU6IGA8bmctY29udGVudD48L25nLWNvbnRlbnQ+IDxkaXYgKG1vdXNlZG93bik9XCJyZXNpemUuZHJhZ1N0YXJ0RGVsYXkoJGV2ZW50KVwiICh0b3VjaHN0YXJ0KT1cInJlc2l6ZS5kcmFnU3RhcnREZWxheSgkZXZlbnQpXCIgICAgICBbaGlkZGVuXT1cIiFncmlkc3Rlci4kb3B0aW9ucy5yZXNpemFibGUuaGFuZGxlcy5zIHx8ICFyZXNpemUucmVzaXplRW5hYmxlZFwiICAgICAgY2xhc3M9XCJncmlkc3Rlci1pdGVtLXJlc2l6YWJsZS1oYW5kbGVyIGhhbmRsZS1zXCI+PC9kaXY+IDxkaXYgKG1vdXNlZG93bik9XCJyZXNpemUuZHJhZ1N0YXJ0RGVsYXkoJGV2ZW50KVwiICh0b3VjaHN0YXJ0KT1cInJlc2l6ZS5kcmFnU3RhcnREZWxheSgkZXZlbnQpXCIgICAgICBbaGlkZGVuXT1cIiFncmlkc3Rlci4kb3B0aW9ucy5yZXNpemFibGUuaGFuZGxlcy5lIHx8ICFyZXNpemUucmVzaXplRW5hYmxlZFwiICAgICAgY2xhc3M9XCJncmlkc3Rlci1pdGVtLXJlc2l6YWJsZS1oYW5kbGVyIGhhbmRsZS1lXCI+PC9kaXY+IDxkaXYgKG1vdXNlZG93bik9XCJyZXNpemUuZHJhZ1N0YXJ0RGVsYXkoJGV2ZW50KVwiICh0b3VjaHN0YXJ0KT1cInJlc2l6ZS5kcmFnU3RhcnREZWxheSgkZXZlbnQpXCIgICAgICBbaGlkZGVuXT1cIiFncmlkc3Rlci4kb3B0aW9ucy5yZXNpemFibGUuaGFuZGxlcy5uIHx8ICFyZXNpemUucmVzaXplRW5hYmxlZFwiICAgICAgY2xhc3M9XCJncmlkc3Rlci1pdGVtLXJlc2l6YWJsZS1oYW5kbGVyIGhhbmRsZS1uXCI+PC9kaXY+IDxkaXYgKG1vdXNlZG93bik9XCJyZXNpemUuZHJhZ1N0YXJ0RGVsYXkoJGV2ZW50KVwiICh0b3VjaHN0YXJ0KT1cInJlc2l6ZS5kcmFnU3RhcnREZWxheSgkZXZlbnQpXCIgICAgICBbaGlkZGVuXT1cIiFncmlkc3Rlci4kb3B0aW9ucy5yZXNpemFibGUuaGFuZGxlcy53IHx8ICFyZXNpemUucmVzaXplRW5hYmxlZFwiICAgICAgY2xhc3M9XCJncmlkc3Rlci1pdGVtLXJlc2l6YWJsZS1oYW5kbGVyIGhhbmRsZS13XCI+PC9kaXY+IDxkaXYgKG1vdXNlZG93bik9XCJyZXNpemUuZHJhZ1N0YXJ0RGVsYXkoJGV2ZW50KVwiICh0b3VjaHN0YXJ0KT1cInJlc2l6ZS5kcmFnU3RhcnREZWxheSgkZXZlbnQpXCIgICAgICBbaGlkZGVuXT1cIiFncmlkc3Rlci4kb3B0aW9ucy5yZXNpemFibGUuaGFuZGxlcy5zZSB8fCAhcmVzaXplLnJlc2l6ZUVuYWJsZWRcIiAgICAgIGNsYXNzPVwiZ3JpZHN0ZXItaXRlbS1yZXNpemFibGUtaGFuZGxlciBoYW5kbGUtc2VcIj48L2Rpdj4gPGRpdiAobW91c2Vkb3duKT1cInJlc2l6ZS5kcmFnU3RhcnREZWxheSgkZXZlbnQpXCIgKHRvdWNoc3RhcnQpPVwicmVzaXplLmRyYWdTdGFydERlbGF5KCRldmVudClcIiAgICAgIFtoaWRkZW5dPVwiIWdyaWRzdGVyLiRvcHRpb25zLnJlc2l6YWJsZS5oYW5kbGVzLm5lIHx8ICFyZXNpemUucmVzaXplRW5hYmxlZFwiICAgICAgY2xhc3M9XCJncmlkc3Rlci1pdGVtLXJlc2l6YWJsZS1oYW5kbGVyIGhhbmRsZS1uZVwiPjwvZGl2PiA8ZGl2IChtb3VzZWRvd24pPVwicmVzaXplLmRyYWdTdGFydERlbGF5KCRldmVudClcIiAodG91Y2hzdGFydCk9XCJyZXNpemUuZHJhZ1N0YXJ0RGVsYXkoJGV2ZW50KVwiICAgICAgW2hpZGRlbl09XCIhZ3JpZHN0ZXIuJG9wdGlvbnMucmVzaXphYmxlLmhhbmRsZXMuc3cgfHwgIXJlc2l6ZS5yZXNpemVFbmFibGVkXCIgICAgICBjbGFzcz1cImdyaWRzdGVyLWl0ZW0tcmVzaXphYmxlLWhhbmRsZXIgaGFuZGxlLXN3XCI+PC9kaXY+IDxkaXYgKG1vdXNlZG93bik9XCJyZXNpemUuZHJhZ1N0YXJ0RGVsYXkoJGV2ZW50KVwiICh0b3VjaHN0YXJ0KT1cInJlc2l6ZS5kcmFnU3RhcnREZWxheSgkZXZlbnQpXCIgICAgICBbaGlkZGVuXT1cIiFncmlkc3Rlci4kb3B0aW9ucy5yZXNpemFibGUuaGFuZGxlcy5udyB8fCAhcmVzaXplLnJlc2l6ZUVuYWJsZWRcIiAgICAgIGNsYXNzPVwiZ3JpZHN0ZXItaXRlbS1yZXNpemFibGUtaGFuZGxlciBoYW5kbGUtbndcIj48L2Rpdj5gLFxuICBzdHlsZXM6IFtgZ3JpZHN0ZXItaXRlbSB7ICAgYm94LXNpemluZzogYm9yZGVyLWJveDsgICB6LWluZGV4OiAxOyAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsgICBvdmVyZmxvdzogaGlkZGVuOyAgIHRyYW5zaXRpb246IC4zczsgICBkaXNwbGF5OiBub25lOyAgIGJhY2tncm91bmQ6IHdoaXRlOyAgIHVzZXItc2VsZWN0OiB0ZXh0OyB9ICBncmlkc3Rlci1pdGVtLmdyaWRzdGVyLWl0ZW0tbW92aW5nIHsgICBjdXJzb3I6IG1vdmU7IH0gIGdyaWRzdGVyLWl0ZW0uZ3JpZHN0ZXItaXRlbS1yZXNpemluZywgZ3JpZHN0ZXItaXRlbS5ncmlkc3Rlci1pdGVtLW1vdmluZyB7ICAgdHJhbnNpdGlvbjogMHM7ICAgei1pbmRleDogMjsgICBib3gtc2hhZG93OiAwIDAgNXB4IDVweCByZ2JhKDAsIDAsIDAsIC4yKSwgMCA2cHggMTBweCAwIHJnYmEoMCwgMCwgMCwgLjE0KSwgMCAxcHggMThweCAwIHJnYmEoMCwgMCwgMCwgLjEyKTsgfSAgLmdyaWRzdGVyLWl0ZW0tcmVzaXphYmxlLWhhbmRsZXIgeyAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsgICB6LWluZGV4OiAyOyB9ICAuZ3JpZHN0ZXItaXRlbS1yZXNpemFibGUtaGFuZGxlci5oYW5kbGUtbiB7ICAgY3Vyc29yOiBuLXJlc2l6ZTsgICBoZWlnaHQ6IDEwcHg7ICAgcmlnaHQ6IDA7ICAgdG9wOiAwOyAgIGxlZnQ6IDA7IH0gIC5ncmlkc3Rlci1pdGVtLXJlc2l6YWJsZS1oYW5kbGVyLmhhbmRsZS1lIHsgICBjdXJzb3I6IGUtcmVzaXplOyAgIHdpZHRoOiAxMHB4OyAgIGJvdHRvbTogMDsgICByaWdodDogMDsgICB0b3A6IDA7IH0gIC5ncmlkc3Rlci1pdGVtLXJlc2l6YWJsZS1oYW5kbGVyLmhhbmRsZS1zIHsgICBjdXJzb3I6IHMtcmVzaXplOyAgIGhlaWdodDogMTBweDsgICByaWdodDogMDsgICBib3R0b206IDA7ICAgbGVmdDogMDsgfSAgLmdyaWRzdGVyLWl0ZW0tcmVzaXphYmxlLWhhbmRsZXIuaGFuZGxlLXcgeyAgIGN1cnNvcjogdy1yZXNpemU7ICAgd2lkdGg6IDEwcHg7ICAgbGVmdDogMDsgICB0b3A6IDA7ICAgYm90dG9tOiAwOyB9ICAuZ3JpZHN0ZXItaXRlbS1yZXNpemFibGUtaGFuZGxlci5oYW5kbGUtbmUgeyAgIGN1cnNvcjogbmUtcmVzaXplOyAgIHdpZHRoOiAxMHB4OyAgIGhlaWdodDogMTBweDsgICByaWdodDogMDsgICB0b3A6IDA7IH0gIC5ncmlkc3Rlci1pdGVtLXJlc2l6YWJsZS1oYW5kbGVyLmhhbmRsZS1udyB7ICAgY3Vyc29yOiBudy1yZXNpemU7ICAgd2lkdGg6IDEwcHg7ICAgaGVpZ2h0OiAxMHB4OyAgIGxlZnQ6IDA7ICAgdG9wOiAwOyB9ICAuZ3JpZHN0ZXItaXRlbS1yZXNpemFibGUtaGFuZGxlci5oYW5kbGUtc2UgeyAgIGN1cnNvcjogc2UtcmVzaXplOyAgIHdpZHRoOiAwOyAgIGhlaWdodDogMDsgICByaWdodDogMDsgICBib3R0b206IDA7ICAgYm9yZGVyLXN0eWxlOiBzb2xpZDsgICBib3JkZXItd2lkdGg6IDAgMCAxMHB4IDEwcHg7ICAgYm9yZGVyLWNvbG9yOiB0cmFuc3BhcmVudDsgfSAgLmdyaWRzdGVyLWl0ZW0tcmVzaXphYmxlLWhhbmRsZXIuaGFuZGxlLXN3IHsgICBjdXJzb3I6IHN3LXJlc2l6ZTsgICB3aWR0aDogMTBweDsgICBoZWlnaHQ6IDEwcHg7ICAgbGVmdDogMDsgICBib3R0b206IDA7IH0gIGdyaWRzdGVyLWl0ZW06aG92ZXIgLmdyaWRzdGVyLWl0ZW0tcmVzaXphYmxlLWhhbmRsZXIuaGFuZGxlLXNlIHsgICBib3JkZXItY29sb3I6IHRyYW5zcGFyZW50IHRyYW5zcGFyZW50ICNjY2MgfWBdLFxuICBlbmNhcHN1bGF0aW9uOiBWaWV3RW5jYXBzdWxhdGlvbi5Ob25lXG59LCBdIH0sXG5dO1xuLyoqIEBub2NvbGxhcHNlICovXG5zdGF0aWMgY3RvclBhcmFtZXRlcnM6ICgpID0+ICh7dHlwZTogYW55LCBkZWNvcmF0b3JzPzogRGVjb3JhdG9ySW52b2NhdGlvbltdfXxudWxsKVtdID0gKCkgPT4gW1xue3R5cGU6IEVsZW1lbnRSZWYsIH0sXG57dHlwZTogR3JpZHN0ZXJDb21wb25lbnQsIGRlY29yYXRvcnM6IFt7IHR5cGU6IEhvc3QgfSwgXX0sXG57dHlwZTogUmVuZGVyZXIyLCB9LFxuXTtcbnN0YXRpYyBwcm9wRGVjb3JhdG9yczoge1trZXk6IHN0cmluZ106IERlY29yYXRvckludm9jYXRpb25bXX0gPSB7XG4naXRlbSc6IFt7IHR5cGU6IElucHV0IH0sXSxcbn07XG59XG5cbmludGVyZmFjZSBEZWNvcmF0b3JJbnZvY2F0aW9uIHtcbiAgdHlwZTogRnVuY3Rpb247XG4gIGFyZ3M/OiBhbnlbXTtcbn1cbiJdfQ==