@blare/angular2gridster
Version:
[](https://badge.fury.io/js/angular2gridster)
665 lines • 71.2 kB
JavaScript
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,missingReturn,uselessCode} checked by tsc
*/
import { Injectable } from '@angular/core';
import { Subject } from 'rxjs';
import { debounceTime } from 'rxjs/operators';
import { GridList } from './gridList/gridList';
export class GridsterService {
constructor() {
this.items = [];
this._items = [];
this._itemsMap = {};
this.disabledItems = [];
this.debounceRenderSubject = new Subject();
this.itemRemoveSubject = new Subject();
this.isInit = false;
this.itemRemoveSubject.pipe(debounceTime(0)).subscribe(() => {
this.gridList.pullItemsToLeft();
this.render();
this.updateCachedItems();
});
this.debounceRenderSubject.pipe(debounceTime(0)).subscribe(() => this.render());
}
/**
* @return {?}
*/
isInitialized() {
return this.isInit;
}
/**
* Must be called before init
* @param {?} item
* @return {?}
*/
registerItem(item) {
this.items.push(item);
return item;
}
/**
* @param {?} gridsterComponent
* @return {?}
*/
init(gridsterComponent) {
this.gridsterComponent = gridsterComponent;
this.draggableOptions = gridsterComponent.draggableOptions;
this.gridsterOptions = gridsterComponent.gridsterOptions;
}
/**
* @return {?}
*/
start() {
this.updateMaxItemSize();
// Used to highlight a position an element will land on upon drop
if (this.$positionHighlight) {
this.removePositionHighlight();
}
this.initGridList();
this.isInit = true;
setTimeout(() => {
this.copyItems();
this.fixItemsPositions();
this.gridsterComponent.reflowGridster(true);
this.gridsterComponent.setReady();
});
}
/**
* @return {?}
*/
initGridList() {
// Create instance of GridList (decoupled lib for handling the grid
// positioning and sorting post-drag and dropping)
this.gridList = new GridList(this.items, this.options);
}
/**
* @return {?}
*/
render() {
this.updateMaxItemSize();
this.gridList.generateGrid();
this.applySizeToItems();
this.applyPositionToItems();
this.refreshLines();
}
/**
* @return {?}
*/
reflow() {
this.calculateCellSize();
this.render();
}
/**
* @return {?}
*/
fixItemsPositions() {
if (this.options.responsiveSizes) {
this.gridList.fixItemsPositions(this.options);
}
else {
this.gridList.fixItemsPositions(this.gridsterOptions.basicOptions);
this.gridsterOptions.responsiveOptions.forEach((options) => {
this.gridList.fixItemsPositions(options);
});
}
this.updateCachedItems();
}
/**
* @param {?} item
* @return {?}
*/
removeItem(item) {
/** @type {?} */
const idx = this.items.indexOf(item);
if (idx >= 0) {
this.items.splice(this.items.indexOf(item), 1);
}
this.gridList.deleteItemPositionFromGrid(item);
this.removeItemFromCache(item);
}
/**
* @param {?} item
* @return {?}
*/
onResizeStart(item) {
this.currentElement = item.$element;
this.copyItems();
this._maxGridCols = this.gridList.grid.length;
this.highlightPositionForItem(item);
this.gridsterComponent.isResizing = true;
this.refreshLines();
}
/**
* @param {?} item
* @return {?}
*/
onResizeDrag(item) {
/** @type {?} */
const newSize = this.snapItemSizeToGrid(item);
/** @type {?} */
const sizeChanged = this.dragSizeChanged(newSize);
/** @type {?} */
const newPosition = this.snapItemPositionToGrid(item);
/** @type {?} */
const positionChanged = this.dragPositionChanged(newPosition);
if (sizeChanged || positionChanged) {
// Regenerate the grid with the positions from when the drag started
this.restoreCachedItems();
this.gridList.generateGrid();
this.previousDragPosition = newPosition;
this.previousDragSize = newSize;
this.gridList.moveAndResize(item, newPosition, { w: newSize[0], h: newSize[1] });
// Visually update item positions and highlight shape
this.applyPositionToItems(true);
this.highlightPositionForItem(item);
}
}
/**
* @param {?} item
* @return {?}
*/
onResizeStop(item) {
this.currentElement = undefined;
this.updateCachedItems();
this.previousDragSize = null;
this.removePositionHighlight();
this.gridsterComponent.isResizing = false;
this.gridList.pullItemsToLeft(item);
this.debounceRenderSubject.next();
this.fixItemsPositions();
}
/**
* @param {?} item
* @return {?}
*/
onStart(item) {
this.currentElement = item.$element;
// itemCtrl.isDragging = true;
// Create a deep copy of the items; we use them to revert the item
// positions after each drag change, making an entire drag operation less
// distructable
this.copyItems();
// Since dragging actually alters the grid, we need to establish the number
// of cols (+1 extra) before the drag starts
this._maxGridCols = this.gridList.grid.length;
this.gridsterComponent.isDragging = true;
this.gridsterComponent.updateGridsterElementData();
this.refreshLines();
}
/**
* @param {?} item
* @return {?}
*/
onDrag(item) {
/** @type {?} */
const newPosition = this.snapItemPositionToGrid(item);
if (this.dragPositionChanged(newPosition)) {
// Regenerate the grid with the positions from when the drag started
this.restoreCachedItems();
this.gridList.generateGrid();
this.previousDragPosition = newPosition;
if (this.options.direction === 'none' &&
!this.gridList.checkItemAboveEmptyArea(item, { x: newPosition[0], y: newPosition[1] })) {
return;
}
// Since the items list is a deep copy, we need to fetch the item
// corresponding to this drag action again
this.gridList.moveItemToPosition(item, newPosition);
// Visually update item positions and highlight shape
this.applyPositionToItems(true);
this.highlightPositionForItem(item);
}
}
/**
* @return {?}
*/
cancel() {
this.restoreCachedItems();
this.previousDragPosition = null;
this.updateMaxItemSize();
this.applyPositionToItems();
this.removePositionHighlight();
this.currentElement = undefined;
this.gridsterComponent.isDragging = false;
}
/**
* @param {?} item
* @return {?}
*/
onDragOut(item) {
this.cancel();
/** @type {?} */
const idx = this.items.indexOf(item);
if (idx >= 0) {
this.items.splice(idx, 1);
}
this.gridList.pullItemsToLeft();
this.render();
}
/**
* @param {?} item
* @return {?}
*/
onStop(item) {
this.currentElement = undefined;
this.updateCachedItems();
this.previousDragPosition = null;
this.removePositionHighlight();
this.gridList.pullItemsToLeft(item);
this.gridsterComponent.isDragging = false;
this.refreshLines();
}
/**
* @return {?}
*/
calculateCellSize() {
if (this.options.direction === 'horizontal') {
this.cellHeight = this.calculateCellHeight();
this.cellWidth = this.options.cellWidth || this.cellHeight * this.options.widthHeightRatio;
}
else {
this.cellWidth = this.calculateCellWidth();
this.cellHeight = this.options.cellHeight || this.cellWidth / this.options.widthHeightRatio;
}
if (this.options.heightToFontSizeRatio) {
this._fontSize = this.cellHeight * this.options.heightToFontSizeRatio;
}
}
/**
* @param {?=} increaseGridsterSize
* @return {?}
*/
applyPositionToItems(increaseGridsterSize) {
if (!this.options.shrink) {
increaseGridsterSize = true;
}
// TODO: Implement group separators
for (let i = 0; i < this.items.length; i++) {
// Don't interfere with the positions of the dragged items
if (this.isCurrentElement(this.items[i].$element)) {
continue;
}
this.items[i].applyPosition(this);
}
/** @type {?} */
const child = (/** @type {?} */ (this.gridsterComponent.$element.firstChild));
// Update the width of the entire grid container with enough room on the
// right to allow dragging items to the end of the grid.
if (this.options.direction === 'horizontal') {
/** @type {?} */
const increaseWidthWith = (increaseGridsterSize) ? this.maxItemWidth : 0;
child.style.height = '';
child.style.width = ((this.gridList.grid.length + increaseWidthWith) * this.cellWidth) + 'px';
}
else if (this.gridList.grid.length) {
/** @type {?} */
const increaseHeightWith = (increaseGridsterSize) ? this.maxItemHeight : 0;
child.style.height = ((this.gridList.grid.length + increaseHeightWith) * this.cellHeight) + 'px';
child.style.width = '';
}
}
/**
* @return {?}
*/
refreshLines() {
/** @type {?} */
const gridsterContainer = (/** @type {?} */ (this.gridsterComponent.$element.firstChild));
if (this.options.lines && this.options.lines.visible &&
(this.gridsterComponent.isDragging || this.gridsterComponent.isResizing || this.options.lines.always)) {
/** @type {?} */
const linesColor = this.options.lines.color || '#d8d8d8';
/** @type {?} */
const linesBgColor = this.options.lines.backgroundColor || 'transparent';
/** @type {?} */
const linesWidth = this.options.lines.width || 1;
/** @type {?} */
const bgPosition = linesWidth / 2;
gridsterContainer.style.backgroundSize = `${this.cellWidth}px ${this.cellHeight}px`;
gridsterContainer.style.backgroundPosition = `-${bgPosition}px -${bgPosition}px`;
gridsterContainer.style.backgroundImage = `
linear-gradient(to right, ${linesColor} ${linesWidth}px, ${linesBgColor} ${linesWidth}px),
linear-gradient(to bottom, ${linesColor} ${linesWidth}px, ${linesBgColor} ${linesWidth}px)
`;
}
else {
gridsterContainer.style.backgroundSize = '';
gridsterContainer.style.backgroundPosition = '';
gridsterContainer.style.backgroundImage = '';
}
}
/**
* @param {?} item
* @return {?}
*/
removeItemFromCache(item) {
this._items = this._items
.filter(cachedItem => cachedItem.$element !== item.$element);
Object.keys(this._itemsMap)
.forEach((breakpoint) => {
this._itemsMap[breakpoint] = this._itemsMap[breakpoint]
.filter(cachedItem => cachedItem.$element !== item.$element);
});
}
/**
* @return {?}
*/
copyItems() {
this._items = this.items
.filter(item => this.isValidGridItem(item))
.map((item) => {
return item.copyForBreakpoint(null);
});
this.gridsterOptions.responsiveOptions.forEach((options) => {
this._itemsMap[options.breakpoint] = this.items
.filter(item => this.isValidGridItem(item))
.map((item) => {
return item.copyForBreakpoint(options.breakpoint);
});
});
}
/**
* Update maxItemWidth and maxItemHeight vales according to current state of items
* @return {?}
*/
updateMaxItemSize() {
this.maxItemWidth = Math.max.apply(null, this.items.map((item) => {
return item.w;
}));
this.maxItemHeight = Math.max.apply(null, this.items.map((item) => {
return item.h;
}));
}
/**
* Update items properties of previously cached items
* @return {?}
*/
restoreCachedItems() {
/** @type {?} */
const items = this.options.breakpoint ? this._itemsMap[this.options.breakpoint] : this._items;
this.items
.filter(item => this.isValidGridItem(item))
.forEach((item) => {
/** @type {?} */
const cachedItem = items.filter(cachedItm => {
return cachedItm.$element === item.$element;
})[0];
item.x = cachedItem.x;
item.y = cachedItem.y;
item.w = cachedItem.w;
item.h = cachedItem.h;
item.autoSize = cachedItem.autoSize;
});
}
/**
* If item should react on grid
* @param {?} item
* @return {?} boolean
*/
isValidGridItem(item) {
if (this.options.direction === 'none') {
return !!item.itemComponent;
}
return true;
}
/**
* @return {?}
*/
calculateCellWidth() {
/** @type {?} */
const gridsterWidth = parseFloat(window.getComputedStyle(this.gridsterComponent.$element).width);
return Math.floor(gridsterWidth / this.options.lanes);
}
/**
* @return {?}
*/
calculateCellHeight() {
/** @type {?} */
const gridsterHeight = parseFloat(window.getComputedStyle(this.gridsterComponent.$element).height);
return Math.floor(gridsterHeight / this.options.lanes);
}
/**
* @return {?}
*/
applySizeToItems() {
for (let i = 0; i < this.items.length; i++) {
this.items[i].applySize();
if (this.options.heightToFontSizeRatio) {
this.items[i].$element.style['font-size'] = this._fontSize;
}
}
}
/**
* @param {?} element
* @return {?}
*/
isCurrentElement(element) {
if (!this.currentElement) {
return false;
}
return element === this.currentElement;
}
/**
* @param {?} item
* @return {?}
*/
snapItemSizeToGrid(item) {
/** @type {?} */
const itemSize = {
width: parseInt(item.$element.style.width, 10) - 1,
height: parseInt(item.$element.style.height, 10) - 1
};
/** @type {?} */
let colSize = Math.round(itemSize.width / this.cellWidth);
/** @type {?} */
let rowSize = Math.round(itemSize.height / this.cellHeight);
// Keep item minimum 1
colSize = Math.max(colSize, 1);
rowSize = Math.max(rowSize, 1);
// check if element is pinned
if (this.gridList.isOverFixedArea(item.x, item.y, colSize, rowSize, item)) {
return [item.w, item.h];
}
return [colSize, rowSize];
}
/**
* @param {?} item
* @return {?}
*/
generateItemPosition(item) {
/** @type {?} */
let position;
if (item.itemPrototype) {
/** @type {?} */
const coords = item.itemPrototype.getPositionToGridster(this);
position = {
x: Math.round(coords.x / this.cellWidth),
y: Math.round(coords.y / this.cellHeight)
};
}
else {
position = {
x: Math.round(item.positionX / this.cellWidth),
y: Math.round(item.positionY / this.cellHeight)
};
}
return position;
}
/**
* @param {?} item
* @return {?}
*/
snapItemPositionToGrid(item) {
/** @type {?} */
const position = this.generateItemPosition(item);
/** @type {?} */
let col = position.x;
/** @type {?} */
let row = position.y;
// Keep item position within the grid and don't let the item create more
// than one extra column
col = Math.max(col, 0);
row = Math.max(row, 0);
if (this.options.direction === 'horizontal') {
col = Math.min(col, this._maxGridCols);
}
else {
col = Math.min(col, Math.max(0, this.options.lanes - item.w));
}
// check if element is pinned
if (this.gridList.isOverFixedArea(col, row, item.w, item.h)) {
return [item.x, item.y];
}
return [col, row];
}
/**
* @param {?} newSize
* @return {?}
*/
dragSizeChanged(newSize) {
if (!this.previousDragSize) {
return true;
}
return (newSize[0] !== this.previousDragSize[0] ||
newSize[1] !== this.previousDragSize[1]);
}
/**
* @param {?} newPosition
* @return {?}
*/
dragPositionChanged(newPosition) {
if (!this.previousDragPosition) {
return true;
}
return (newPosition[0] !== this.previousDragPosition[0] ||
newPosition[1] !== this.previousDragPosition[1]);
}
/**
* @param {?} item
* @return {?}
*/
highlightPositionForItem(item) {
/** @type {?} */
const size = item.calculateSize(this);
/** @type {?} */
const position = item.calculatePosition(this);
this.$positionHighlight.style.width = size.width + 'px';
this.$positionHighlight.style.height = size.height + 'px';
this.$positionHighlight.style.left = position.left + 'px';
this.$positionHighlight.style.top = position.top + 'px';
this.$positionHighlight.style.display = '';
if (this.options.heightToFontSizeRatio) {
this.$positionHighlight.style['font-size'] = this._fontSize;
}
}
/**
* @return {?}
*/
updateCachedItems() {
// Notify the user with the items that changed since the previous snapshot
this.triggerOnChange(null);
this.gridsterOptions.responsiveOptions.forEach((options) => {
this.triggerOnChange(options.breakpoint);
});
this.copyItems();
}
/**
* @param {?=} breakpoint
* @return {?}
*/
triggerOnChange(breakpoint) {
/** @type {?} */
const items = breakpoint ? this._itemsMap[breakpoint] : this._items;
/** @type {?} */
const changeItems = this.gridList.getChangedItems(items || [], breakpoint);
changeItems
.filter((itemChange) => {
return itemChange.item.itemComponent;
})
.forEach((itemChange) => {
if (itemChange.changes.indexOf('x') >= 0) {
itemChange.item.triggerChangeX(breakpoint);
}
if (itemChange.changes.indexOf('y') >= 0) {
itemChange.item.triggerChangeY(breakpoint);
}
if (itemChange.changes.indexOf('w') >= 0) {
itemChange.item.triggerChangeW(breakpoint);
}
if (itemChange.changes.indexOf('h') >= 0) {
itemChange.item.triggerChangeH(breakpoint);
}
// should be called only once (not for each breakpoint)
itemChange.item.itemComponent.change.emit({
item: itemChange.item,
oldValues: itemChange.oldValues || {},
isNew: itemChange.isNew,
changes: itemChange.changes,
breakpoint: breakpoint
});
});
}
/**
* @return {?}
*/
removePositionHighlight() {
this.$positionHighlight.style.display = 'none';
}
}
GridsterService.decorators = [
{ type: Injectable }
];
/** @nocollapse */
GridsterService.ctorParameters = () => [];
if (false) {
/** @type {?} */
GridsterService.prototype.$element;
/** @type {?} */
GridsterService.prototype.gridList;
/** @type {?} */
GridsterService.prototype.items;
/** @type {?} */
GridsterService.prototype._items;
/** @type {?} */
GridsterService.prototype._itemsMap;
/** @type {?} */
GridsterService.prototype.disabledItems;
/** @type {?} */
GridsterService.prototype.options;
/** @type {?} */
GridsterService.prototype.draggableOptions;
/** @type {?} */
GridsterService.prototype.gridsterRect;
/** @type {?} */
GridsterService.prototype.gridsterScrollData;
/** @type {?} */
GridsterService.prototype.gridsterOptions;
/** @type {?} */
GridsterService.prototype.gridsterComponent;
/** @type {?} */
GridsterService.prototype.debounceRenderSubject;
/** @type {?} */
GridsterService.prototype.$positionHighlight;
/** @type {?} */
GridsterService.prototype.maxItemWidth;
/** @type {?} */
GridsterService.prototype.maxItemHeight;
/** @type {?} */
GridsterService.prototype.cellWidth;
/** @type {?} */
GridsterService.prototype.cellHeight;
/** @type {?} */
GridsterService.prototype.itemRemoveSubject;
/** @type {?} */
GridsterService.prototype._fontSize;
/** @type {?} */
GridsterService.prototype.previousDragPosition;
/** @type {?} */
GridsterService.prototype.previousDragSize;
/** @type {?} */
GridsterService.prototype.currentElement;
/** @type {?} */
GridsterService.prototype._maxGridCols;
/** @type {?} */
GridsterService.prototype.isInit;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ3JpZHN0ZXIuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiJuZzovL0BibGFyZS9hbmd1bGFyMmdyaWRzdGVyLyIsInNvdXJjZXMiOlsibGliL2dyaWRzdGVyLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7OztBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDM0MsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUMvQixPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFFOUMsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBUS9DLE1BQU0sT0FBTyxlQUFlO0lBMkN4QjtRQXRDQSxVQUFLLEdBQXdCLEVBQUUsQ0FBQztRQUNoQyxXQUFNLEdBQXdCLEVBQUUsQ0FBQztRQUNqQyxjQUFTLEdBQWtELEVBQUUsQ0FBQztRQUM5RCxrQkFBYSxHQUF3QixFQUFFLENBQUM7UUFZeEMsMEJBQXFCLEdBQUcsSUFBSSxPQUFPLEVBQUUsQ0FBQztRQVUvQixzQkFBaUIsR0FBMEIsSUFBSSxPQUFPLEVBQUUsQ0FBQztRQVd4RCxXQUFNLEdBQUcsS0FBSyxDQUFDO1FBR25CLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLEdBQUcsRUFBRTtZQUN4RCxJQUFJLENBQUMsUUFBUSxDQUFDLGVBQWUsRUFBRSxDQUFDO1lBQ2hDLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQztZQUNkLElBQUksQ0FBQyxpQkFBaUIsRUFBRSxDQUFDO1FBQzdCLENBQUMsQ0FBQyxDQUFDO1FBRUgsSUFBSSxDQUFDLHFCQUFxQixDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUM7SUFDcEYs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QUFDLE9BQU87Z0JBQzNCLFVBQVUsRUFBRSxVQUFVO2FBQ3pCLENBQUMsQ0FBQztRQUNQLENBQUMsQ0FBQyxDQUFDO0lBQ1gsQ0FBQzs7OztJQUVPLHVCQUF1QjtRQUMzQixJQUFJLENBQUMsa0JBQWtCLENBQUMsS0FBSyxDQUFDLE9BQU8sR0FBRyxNQUFNLENBQUM7SUFDbkQsQ0FBQzs7O1lBcmtCSixVQUFVOzs7Ozs7SUFFUCxtQ0FBc0I7O0lBRXRCLG1DQUFtQjs7SUFFbkIsZ0NBQWdDOztJQUNoQyxpQ0FBaUM7O0lBQ2pDLG9DQUE4RDs7SUFDOUQsd0NBQXdDOztJQUV4QyxrQ0FBMEI7O0lBQzFCLDJDQUE0Qzs7SUFFNUMsdUNBQXlCOztJQUN6Qiw2Q0FBOEQ7O0lBRTlELDBDQUFpQzs7SUFFakMsNENBQXFDOztJQUVyQyxnREFBc0M7O0lBRXRDLDZDQUF1Qzs7SUFFdkMsdUNBQTRCOztJQUM1Qix3Q0FBNkI7O0lBRTdCLG9DQUF5Qjs7SUFDekIscUNBQTBCOztJQUUxQiw0Q0FBZ0U7O0lBRWhFLG9DQUEwQjs7SUFFMUIsK0NBQTRDOztJQUM1QywyQ0FBd0M7O0lBRXhDLHlDQUFvQzs7SUFFcEMsdUNBQTZCOztJQUU3QixpQ0FBdUIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBTdWJqZWN0IH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBkZWJvdW5jZVRpbWUgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5cbmltcG9ydCB7IEdyaWRMaXN0IH0gZnJvbSAnLi9ncmlkTGlzdC9ncmlkTGlzdCc7XG5pbXBvcnQgeyBJR3JpZHN0ZXJPcHRpb25zIH0gZnJvbSAnLi9JR3JpZHN0ZXJPcHRpb25zJztcbmltcG9ydCB7IElHcmlkc3RlckRyYWdnYWJsZU9wdGlvbnMgfSBmcm9tICcuL0lHcmlkc3RlckRyYWdnYWJsZU9wdGlvbnMnO1xuaW1wb3J0IHsgR3JpZExpc3RJdGVtIH0gZnJvbSAnLi9ncmlkTGlzdC9HcmlkTGlzdEl0ZW0nO1xuaW1wb3J0IHsgR3JpZHN0ZXJDb21wb25lbnQgfSBmcm9tICcuL2dyaWRzdGVyLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBHcmlkc3Rlck9wdGlvbnMgfSBmcm9tICcuL0dyaWRzdGVyT3B0aW9ucyc7XG5cbkBJbmplY3RhYmxlKClcbmV4cG9ydCBjbGFzcyBHcmlkc3RlclNlcnZpY2Uge1xuICAgICRlbGVtZW50OiBIVE1MRWxlbWVudDtcblxuICAgIGdyaWRMaXN0OiBHcmlkTGlzdDtcblxuICAgIGl0ZW1zOiBBcnJheTxHcmlkTGlzdEl0ZW0+ID0gW107XG4gICAgX2l0ZW1zOiBBcnJheTxHcmlkTGlzdEl0ZW0+ID0gW107XG4gICAgX2l0ZW1zTWFwOiB7IFticmVha3BvaW50OiBzdHJpbmddOiBBcnJheTxHcmlkTGlzdEl0ZW0+IH0gPSB7fTtcbiAgICBkaXNhYmxlZEl0ZW1zOiBBcnJheTxHcmlkTGlzdEl0ZW0+ID0gW107XG5cbiAgICBvcHRpb25zOiBJR3JpZHN0ZXJPcHRpb25zO1xuICAgIGRyYWdnYWJsZU9wdGlvbnM6IElHcmlkc3RlckRyYWdnYWJsZU9wdGlvbnM7XG5cbiAgICBncmlkc3RlclJlY3Q6IENsaWVudFJlY3Q7XG4gICAgZ3JpZHN0ZXJTY3JvbGxEYXRhOiB7IHNjcm9sbFRvcDogbnVtYmVyLCBzY3JvbGxMZWZ0OiBudW1iZXIgfTtcblxuICAgIGdyaWRzdGVyT3B0aW9uczogR3JpZHN0ZXJPcHRpb25zO1xuXG4gICAgZ3JpZHN0ZXJDb21wb25lbnQ6IEdyaWRzdGVyQ29tcG9uZW50O1xuXG4gICAgZGVib3VuY2VSZW5kZXJTdWJqZWN0ID0gbmV3IFN1YmplY3QoKTtcblxuICAgIHB1YmxpYyAkcG9zaXRpb25IaWdobGlnaHQ6IEhUTUxFbGVtZW50O1xuXG4gICAgcHVibGljIG1heEl0ZW1XaWR0aDogbnVtYmVyO1xuICAgIHB1YmxpYyBtYXhJdGVtSGVpZ2h0OiBudW1iZXI7XG5cbiAgICBwdWJsaWMgY2VsbFdpZHRoOiBudW1iZXI7XG4gICAgcHVibGljIGNlbGxIZWlnaHQ6IG51bWJlcjtcblxuICAgIHB1YmxpYyBpdGVtUmVtb3ZlU3ViamVjdDogU3ViamVjdDxHcmlkTGlzdEl0ZW0+ID0gbmV3IFN1YmplY3QoKTtcblxuICAgIHByaXZhdGUgX2ZvbnRTaXplOiBudW1iZXI7XG5cbiAgICBwcml2YXRlIHByZXZpb3VzRHJhZ1Bvc2l0aW9uOiBBcnJheTxudW1iZXI+O1xuICAgIHByaXZhdGUgcHJldmlvdXNEcmFnU2l6ZTogQXJyYXk8bnVtYmVyPjtcblxuICAgIHByaXZhdGUgY3VycmVudEVsZW1lbnQ6IEhUTUxFbGVtZW50O1xuXG4gICAgcHJpdmF0ZSBfbWF4R3JpZENvbHM6IG51bWJlcjtcblxuICAgIHByaXZhdGUgaXNJbml0ID0gZmFsc2U7XG5cbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgdGhpcy5pdGVtUmVtb3ZlU3ViamVjdC5waXBlKGRlYm91bmNlVGltZSgwKSkuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuZ3JpZExpc3QucHVsbEl0ZW1zVG9MZWZ0KCk7XG4gICAgICAgICAgICB0aGlzLnJlbmRlcigpO1xuICAgICAgICAgICAgdGhpcy51cGRhdGVDYWNoZWRJdGVtcygpO1xuICAgICAgICB9KTtcblxuICAgICAgICB0aGlzLmRlYm91bmNlUmVuZGVyU3ViamVjdC5waXBlKGRlYm91bmNlVGltZSgwKSkuc3Vic2NyaWJlKCgpID0+IHRoaXMucmVuZGVyKCkpO1xuICAgIH1cblxuICAgIGlzSW5pdGlhbGl6ZWQoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLmlzSW5pdDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBNdXN0IGJlIGNhbGxlZCBiZWZvcmUgaW5pdFxuICAgICAqIEBwYXJhbSBpdGVtXG4gICAgICovXG4gICAgcmVnaXN0ZXJJdGVtKGl0ZW06IEdyaWRMaXN0SXRlbSkge1xuXG4gICAgICAgIHRoaXMuaXRlbXMucHVzaChpdGVtKTtcbiAgICAgICAgcmV0dXJuIGl0ZW07XG4gICAgfVxuXG4gICAgaW5pdChncmlkc3RlckNvbXBvbmVudDogR3JpZHN0ZXJDb21wb25lbnQpIHtcblxuICAgICAgICB0aGlzLmdyaWRzdGVyQ29tcG9uZW50ID0gZ3JpZHN0ZXJDb21wb25lbnQ7XG5cbiAgICAgICAgdGhpcy5kcmFnZ2FibGVPcHRpb25zID0gZ3JpZHN0ZXJDb21wb25lbnQuZHJhZ2dhYmxlT3B0aW9ucztcblxuICAgICAgICB0aGlzLmdyaWRzdGVyT3B0aW9ucyA9IGdyaWRzdGVyQ29tcG9uZW50LmdyaWRzdGVyT3B0aW9ucztcbiAgICB9XG5cbiAgICBzdGFydCgpIHtcbiAgICAgICAgdGhpcy51cGRhdGVNYXhJdGVtU2l6ZSgpO1xuXG4gICAgICAgIC8vIFVzZWQgdG8gaGlnaGxpZ2h0IGEgcG9zaXRpb24gYW4gZWxlbWVudCB3aWxsIGxhbmQgb24gdXBvbiBkcm9wXG4gICAgICAgIGlmICh0aGlzLiRwb3NpdGlvbkhpZ2hsaWdodCkge1xuICAgICAgICAgICAgdGhpcy5yZW1vdmVQb3NpdGlvbkhpZ2hsaWdodCgpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5pbml0R3JpZExpc3QoKTtcblxuICAgICAgICB0aGlzLmlzSW5pdCA9IHRydWU7XG5cbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLmNvcHlJdGVtcygpO1xuICAgICAgICAgICAgdGhpcy5maXhJdGVtc1Bvc2l0aW9ucygpO1xuXG4gICAgICAgICAgICB0aGlzLmdyaWRzdGVyQ29tcG9uZW50LnJlZmxvd0dyaWRzdGVyKHRydWUpO1xuICAgICAgICAgICAgdGhpcy5ncmlkc3RlckNvbXBvbmVudC5zZXRSZWFkeSgpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBpbml0R3JpZExpc3QoKSB7XG4gICAgICAgIC8vIENyZWF0ZSBpbnN0YW5jZSBvZiBHcmlkTGlzdCAoZGVjb3VwbGVkIGxpYiBmb3IgaGFuZGxpbmcgdGhlIGdyaWRcbiAgICAgICAgLy8gcG9zaXRpb25pbmcgYW5kIHNvcnRpbmcgcG9zdC1kcmFnIGFuZCBkcm9wcGluZylcbiAgICAgICAgdGhpcy5ncmlkTGlzdCA9IG5ldyBHcmlkTGlzdCh0aGlzLml0ZW1zLCB0aGlzLm9wdGlvbnMpO1xuICAgIH1cblxuICAgIHJlbmRlcigpIHtcbiAgICAgICAgdGhpcy51cGRhdGVNYXhJdGVtU2l6ZSgpO1xuICAgICAgICB0aGlzLmdyaWRMaXN0LmdlbmVyYXRlR3JpZCgpO1xuICAgICAgICB0aGlzLmFwcGx5U2l6ZVRvSXRlbXMoKTtcbiAgICAgICAgdGhpcy5hcHBseVBvc2l0aW9uVG9JdGVtcygpO1xuICAgICAgICB0aGlzLnJlZnJlc2hMaW5lcygpO1xuICAgIH1cblxuICAgIHJlZmxvdygpIHtcbiAgICAgICAgdGhpcy5jYWxjdWxhdGVDZWxsU2l6ZSgpO1xuICAgICAgICB0aGlzLnJlbmRlcigpO1xuICAgIH1cblxuICAgIGZpeEl0ZW1zUG9zaXRpb25zKCkge1xuICAgICAgICBpZiAodGhpcy5vcHRpb25zLnJlc3BvbnNpdmVTaXplcykge1xuICAgICAgICAgICAgdGhpcy5ncmlkTGlzdC5maXhJdGVtc1Bvc2l0aW9ucyh0aGlzLm9wdGlvbnMpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5ncmlkTGlzdC5maXhJdGVtc1Bvc2l0aW9ucyh0aGlzLmdyaWRzdGVyT3B0aW9ucy5iYXNpY09wdGlvbnMpO1xuICAgICAgICAgICAgdGhpcy5ncmlkc3Rlck9wdGlvbnMucmVzcG9uc2l2ZU9wdGlvbnMuZm9yRWFjaCgob3B0aW9uczogSUdyaWRzdGVyT3B0aW9ucykgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuZ3JpZExpc3QuZml4SXRlbXNQb3NpdGlvbnMob3B0aW9ucyk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMudXBkYXRlQ2FjaGVkSXRlbXMoKTtcbiAgICB9XG5cbiAgICByZW1vdmVJdGVtKGl0ZW06IEdyaWRMaXN0SXRlbSkge1xuICAgICAgICBjb25zdCBpZHggPSB0aGlzLml0ZW1zLmluZGV4T2YoaXRlbSk7XG5cbiAgICAgICAgaWYgKGlkeCA+PSAwKSB7XG4gICAgICAgICAgICB0aGlzLml0ZW1zLnNwbGljZSh0aGlzLml0ZW1zLmluZGV4T2YoaXRlbSksIDEpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5ncmlkTGlzdC5kZWxldGVJdGVtUG9zaXRpb25Gcm9tR3JpZChpdGVtKTtcbiAgICAgICAgdGhpcy5yZW1vdmVJdGVtRnJvbUNhY2hlKGl0Z