UNPKG

@true-directive/grid

Version:

Angular Data Grid from Yopsilon.

454 lines 59.9 kB
import * as tslib_1 from "tslib"; /** * Copyright (c) 2018-2019 Aleksey Melnikov, True Directive Company. * @link https://truedirective.com/ * @license MIT */ import { Component, Input, Output, ViewChild, ViewChildren, Renderer2, EventEmitter, QueryList, ElementRef, Inject } from '@angular/core'; // Теперь наше import { GridPart } from '@true-directive/base'; import { UIAction, UIActionType } from '@true-directive/base'; import { Column } from '@true-directive/base'; import { ColumnBand } from '@true-directive/base'; import { GridLayout } from '@true-directive/base'; import { BaseComponent } from './base.component'; import { ScrollerComponent } from './scroller.component'; import { GridStateService } from './grid-state.service'; import { GridHeaderCellComponent } from './grid-header-cell.component'; import { GridHeaderBandComponent } from './grid-header-band.component'; var GridHeaderComponent = /** @class */ (function (_super) { tslib_1.__extends(GridHeaderComponent, _super); function GridHeaderComponent(state, elementRef, renderer) { var _this = _super.call(this) || this; _this.state = state; _this.elementRef = elementRef; _this.renderer = renderer; _this.resizeColumn = new EventEmitter(); _this.toggleCheckColumn = new EventEmitter(); _this._scrollerClientRect = null; _this._touches = false; _this._markerVisible = false; return _this; } GridHeaderComponent.prototype.resizeInProcess = function (value) { if (!this.gridHeaderTable) { return; } if (value) { this.gridHeaderTable.nativeElement.classList.add('true-resize-in-process'); } else { this.gridHeaderTable.nativeElement.classList.remove('true-resize-in-process'); } }; GridHeaderComponent.prototype.dragInProcess = function (value) { if (!this.gridHeaderTable) { return; } if (value) { this.gridHeaderTable.nativeElement.classList.add('true-drag-in-process'); } else { this.gridHeaderTable.nativeElement.classList.remove('true-drag-in-process'); } }; GridHeaderComponent.prototype.trackCol = function (i, c) { return c; }; Object.defineProperty(GridHeaderComponent.prototype, "isAutoScroll", { // get: function () { if (this.scroller) { return this.scroller.isAutoScroll; } return false; }, enumerable: true, configurable: true }); GridHeaderComponent.prototype.resizeMouseUp = function (e) { }; GridHeaderComponent.prototype.toggleCheck = function (e, col) { this.toggleCheckColumn.emit(col); }; GridHeaderComponent.prototype.headerCellMouseDown = function (e, col) { if (e.button != 0) { return; } var rr = e.target.getBoundingClientRect(); var xx = Math.round(e.clientX); if (xx < rr.left + rr.width / 2) { // На самом деле это не перетаскивание, а изменение ширины предыдущей колонки.. this.resizeMouseDownPrev(e, col); return; } if (xx > rr.left + rr.width / 2) { // На самом деле это не перетаскивание, а изменение ширины.. this.resizeMouseDown(e, col); return; } }; GridHeaderComponent.prototype.captionTouchMove = function (e, col) { // e.stopPropagation(); var touches = e.changedTouches; if (touches.length === 1 && this.uiAction.target === col) { var xx = touches[0].clientX; var yy = touches[0].clientY; if (this.checkReordering(xx, yy)) { // Перемещение только инициализировано return; } if (this.uiAction.action === UIActionType.REORDER_COLUMN) { this.proceedReordering(xx, yy); } } }; GridHeaderComponent.prototype.captionTouchEnd = function (e) { this.removeTouchMoveListeners(); if (this.scroller) { this.scroller.stopAutoScroll(); } if (!this.uiAction) { return; } if (this.uiAction && this.uiAction.action === UIActionType.REORDER_COLUMN) { this.stopReordering(); } e.stopPropagation(); if (e.cancelable) { e.preventDefault(); } }; GridHeaderComponent.prototype.captionStartDrag = function (e, col) { var _this = this; if (col.isCheckbox) { return; } var xx; var yy; if (e.touches) { if (!e.changedTouches || e.changedTouches.length !== 1) { return; } xx = e.changedTouches[0].clientX; yy = e.changedTouches[0].clientY; this.removeTouchMoveListeners(); this.touchMoveListenFunc = this.renderer.listen(event.target, 'touchmove', function (e) { _this.captionTouchMove(e, col); }); this.touchEndListenFunc = this.renderer.listen(event.target, 'touchend', function (e) { _this.captionTouchEnd(e); }); this.touchCancelListenFunc = this.renderer.listen(event.target, 'touchcancel', function (e) { _this.captionTouchEnd(e); }); } else { // Mouse event this.addDocumentMouseListeners(); if (e.button != 0) { return; } xx = e.clientX; yy = e.clientY; } var rr = e.target.parentElement.getBoundingClientRect(); this.uiAction = new UIAction(UIActionType.CLICK, col, xx, yy); this.uiAction.targetOffsetX = rr.left - xx; this.uiAction.targetOffsetY = rr.top - yy; e.stopPropagation(); }; GridHeaderComponent.prototype.captionSort = function (e, col) { if (e.touches) { if (!e.changedTouches || e.changedTouches.length !== 1) { return; } } else { if (e.button != 0) { return; } } if (!this.uiAction) { return; } if (e.defaultPrevented) { return; } if (this.uiAction.target === col && this.uiAction.action === UIActionType.CLICK) { if (!col.isCheckbox && col.allowSorting) { this.state.sortByColumn(col, e.shiftKey); e.stopPropagation(); e.preventDefault(); } this.uiAction = null; } }; GridHeaderComponent.prototype.resizeMouseDown = function (e, col) { if (col.canResize) { this.initResizing(e, col); } e.stopPropagation(); }; GridHeaderComponent.prototype.resizeMouseDownPrev = function (e, col) { var realCol = null; var ii = this.layout.columns.indexOf(col); if (ii > 0) { realCol = this.layout.columns[ii - 1]; this.initResizing(e, realCol); } e.stopPropagation(); }; GridHeaderComponent.prototype.showHeaderBtn = function (fieldName) { if (!this.columnElements) { return; } this.columnElements.forEach(function (el) { if (el.column.fieldName === fieldName) { el.setState('btn-visible'); } }); }; GridHeaderComponent.prototype.hideHeaderBtns = function () { if (!this.columnElements) { return; } this.columnElements.forEach(function (el) { return el.removeState('btn-visible'); }); }; Object.defineProperty(GridHeaderComponent.prototype, "renderedColumns", { get: function () { var renderedColumns = []; this.columnElements.forEach(function (el) { renderedColumns.push({ boundingRect: el.elementRef.nativeElement.getBoundingClientRect(), item: el.column }); }); return renderedColumns; }, enumerable: true, configurable: true }); Object.defineProperty(GridHeaderComponent.prototype, "renderedBands", { get: function () { var renderedBands = []; this.bandElements.forEach(function (el) { renderedBands.push({ boundingRect: el.elementRef.nativeElement.getBoundingClientRect(), item: el.band }); }); return renderedBands; }, enumerable: true, configurable: true }); /** * Проверка позиции при перетаскивании заголовка колонки или бэнда * @param mouseAction Позиция мыши * @param show Показывать ли маркер * @return [description] */ GridHeaderComponent.prototype.canDrop = function (mouseAction, show) { //Здесь нужен прямоугольник родителя.. if (!this._scrollerClientRect) this._scrollerClientRect = this.scroller.clientRect; var r0 = this._scrollerClientRect; var hasL = false; // имеется более левая составляющая заголовка var hasR = false; // имеется более правая составляющая if (this.layout.place === GridPart.CENTER) { r0 = this.scroller.headerRect; hasL = this.state.showFixedLeft; hasR = this.state.showFixedRight; } if (this.layout.place === GridPart.LEFT) { r0 = this.scroller.headerRectLeft; hasL = false; hasR = true; } if (this.layout.place === GridPart.RIGHT) { r0 = this.scroller.headerRectRight; hasL = true; hasR = false; } var tg = mouseAction.target; var isColumn = tg instanceof Column; var isBand = tg instanceof ColumnBand; var renderedItems; if (isColumn) { renderedItems = this.renderedColumns; } else { renderedItems = this.renderedBands; } return this.layout.canDrop(mouseAction, renderedItems, r0, hasL, hasR, this.state.columnCollection); }; GridHeaderComponent.prototype.autoScrollX = function (dx) { if (this.uiAction) { this.uiAction.x -= dx; } }; // Начинаем изменение ширины колонки GridHeaderComponent.prototype.initResizing = function (e, col) { if (this.state && !this.state.settings.columnResize) { return; } if (col.columnResize === false) { return; } this.addDocumentMouseListeners(); this.uiAction = new UIAction(UIActionType.RESIZE_COLUMN, col, e.clientX, e.clientY); }; GridHeaderComponent.prototype.startResizing = function () { this.uiAction.initialized = true; this.scroller.startAutoScroll(); this.resizeColumn.emit({ action: 'start', ui: this.uiAction }); }; GridHeaderComponent.prototype.initReordering = function (x, y) { this.uiAction.action = UIActionType.REORDER_COLUMN; var ww = this.uiAction.target.headerWidth; if (this.uiAction.target instanceof ColumnBand) { ww = 0; this.uiAction.target.columns.forEach(function (c) { return ww += c.displayedWidth; }); } if (ww > 300) { if (this.uiAction.targetOffsetX < -250) this.uiAction.targetOffsetX = -150; ww = 300; } this.uiAction.targetWidth = ww; this.uiAction.initialized = true; this.uiAction.move(x, y); this.state.dragDrop.drag(this.uiAction); }; GridHeaderComponent.prototype.proceedReordering = function (xx, yy) { this.uiAction.move(xx, yy); this.state.dragDrop.drag(this.uiAction); }; GridHeaderComponent.prototype.stopReordering = function () { var _this = this; setTimeout(function () { _this.state.dragDrop.drop(_this.uiAction); _this.uiAction = null; }); }; GridHeaderComponent.prototype.stopActions = function () { if (this.uiAction && this.uiAction.action === UIActionType.REORDER_COLUMN) { this.stopReordering(); } }; /** * Проверка необходимости инициализации перестановки колонки * @param xx [description] * @param yy [description] * @return True, если перестановка колонки инициализирована. False - если * инициализация не нужна. */ GridHeaderComponent.prototype.checkReordering = function (xx, yy) { if (this.uiAction.action === UIActionType.CLICK && this.state.settings.columnReorder) { if (Math.abs(xx - this.uiAction.x) > 6 || Math.abs(yy - this.uiAction.y) > 6) { if (this.uiAction.target instanceof Column && this.uiAction.target.canReorder) { this.initReordering(xx, yy); return true; } if (this.uiAction.target instanceof ColumnBand && this.state.settings.bandReorder) { this.initReordering(xx, yy); return true; } } } return false; }; GridHeaderComponent.prototype.documentMouseMove = function (e) { _super.prototype.documentMouseMove.call(this, e); if (!this.uiAction) { // если что-то началось.. return; } var xx = e.clientX; var yy = e.clientY; if (this.checkReordering(xx, yy)) { return; } if (this.uiAction.action === UIActionType.REORDER_COLUMN) { this.proceedReordering(xx, yy); } if (!this.uiAction.initialized && this.uiAction.action === UIActionType.RESIZE_COLUMN && this.state.settings.columnResize) { this.startResizing(); return; } if (this.uiAction.action === UIActionType.RESIZE_COLUMN) { this.uiAction.move(xx, yy); this.resizeColumn.emit({ action: '', ui: this.uiAction }); } }; GridHeaderComponent.prototype.documentMouseUp = function (e) { var _this = this; _super.prototype.documentMouseUp.call(this, e); if (this.scroller) { this.scroller.stopAutoScroll(); } var xx = e.clientX; var yy = e.clientY; if (this.uiAction && this.uiAction.action === UIActionType.REORDER_COLUMN) { this.stopReordering(); e.stopPropagation(); e.preventDefault(); } if (this.uiAction && this.uiAction.action === UIActionType.RESIZE_COLUMN) { var x0 = this.uiAction.x0; var x1 = xx; var newWidth = this.uiAction.target.width + x1 - x0; if (newWidth < this.state.settings.minColumnWidthOnResize) { newWidth = this.state.settings.minColumnWidthOnResize; } this.state.resizeColumn(this.uiAction.target, newWidth); setTimeout(function () { _this.resizeColumn.emit({ action: 'end', ui: _this.uiAction }); _this.scroller.fixScroll(); // Прокрутка может встать в неудобное положение. Чиним. _this.uiAction = null; }); e.stopPropagation(); e.preventDefault(); } }; tslib_1.__decorate([ Input('layout'), tslib_1.__metadata("design:type", GridLayout) ], GridHeaderComponent.prototype, "layout", void 0); tslib_1.__decorate([ Input('scroller'), tslib_1.__metadata("design:type", ScrollerComponent) ], GridHeaderComponent.prototype, "scroller", void 0); tslib_1.__decorate([ Output('resizeColumn'), tslib_1.__metadata("design:type", Object) ], GridHeaderComponent.prototype, "resizeColumn", void 0); tslib_1.__decorate([ Output('toggleCheckColumn'), tslib_1.__metadata("design:type", Object) ], GridHeaderComponent.prototype, "toggleCheckColumn", void 0); tslib_1.__decorate([ ViewChild('gridHeaderTable', { static: true }), tslib_1.__metadata("design:type", Object) ], GridHeaderComponent.prototype, "gridHeaderTable", void 0); tslib_1.__decorate([ ViewChild('dropMarker', { static: true }), tslib_1.__metadata("design:type", Object) ], GridHeaderComponent.prototype, "dropMarker", void 0); tslib_1.__decorate([ ViewChildren('headerCell', { read: GridHeaderCellComponent }), tslib_1.__metadata("design:type", QueryList) ], GridHeaderComponent.prototype, "columnElements", void 0); tslib_1.__decorate([ ViewChildren('headerBand', { read: GridHeaderBandComponent }), tslib_1.__metadata("design:type", QueryList) ], GridHeaderComponent.prototype, "bandElements", void 0); GridHeaderComponent = tslib_1.__decorate([ Component({ selector: 'true-grid-header', template: "<div #gridHeaderTable class=\"true-grid-header\"\r\n [ngClass]=\"state.settings.appearance.getHeaderClass()\">\r\n <table [style.width]=\"layout.headerWidth\">\r\n <colgroup>\r\n <col *ngFor=\"let c of layout.columns\" [style.width]=\"layout.displayedHeaderWidth(c)\" /> <!--layout.columnHeaderWidth(c)-->\r\n <col *ngIf=\"layout.isCenter\" class=\"true-grid-re\" [style.width]=\"state.st.hdWidth\" />\r\n </colgroup>\r\n <thead>\r\n <tr\r\n *ngIf=\"layout.bands.length > 0 && state.settings.showBands\"\r\n [style.height.px]=\"state.settings.rowHeight\">\r\n <td *ngFor=\"let b of layout.bands\"\r\n [attr.colspan]=\"b.columns.length\"\r\n class=\"band\">\r\n <true-grid-header-band\r\n [band]=\"b\"\r\n (bandTouchstart)=\"captionStartDrag($event, b)\"\r\n (mousedown)=\"captionStartDrag($event, b)\"\r\n #headerBand>\r\n </true-grid-header-band>\r\n </td>\r\n <td *ngIf=\"layout.isCenter\" style=\"border:0;\"></td>\r\n </tr>\r\n <tr>\r\n <td *ngFor=\"let c of layout.columns; trackBy: trackCol;\"\r\n [ngClass]=\"state.settings.headerCellClass(c)\"\r\n [style.height.px]=\"state.settings.rowHeight\"\r\n (mousedown)=\"headerCellMouseDown($event, c)\">\r\n <true-grid-header-cell #headerCell\r\n [column]=\"c\"\r\n (toggleCheckColumn)=\"toggleCheck($event, c)\"\r\n (captionTouchStart)=\"captionStartDrag($event, c)\"\r\n (captionMouseDown)=\"captionStartDrag($event, c)\"\r\n (captionMouseUp)=\"captionSort($event, c)\">\r\n </true-grid-header-cell>\r\n </td>\r\n <td *ngIf=\"layout.isCenter\" class=\"true-tt\" style=\"border:0;\"></td>\r\n </tr>\r\n </thead>\r\n </table>\r\n</div>\r\n", styles: [".true-grid-drag-item>table,.true-grid-header>table{box-sizing:border-box;table-layout:fixed;border-spacing:0;border-collapse:collapse;outline:0}td.true-column-resizable{cursor:ew-resize}td:not(.true-column-resizable){cursor:default}td:not(.true-column-resizable)+td.true-column-resizable{padding-left:0!important}::ng-deep .true-grid-header td:not(.true-column-resizable):not(.true-column-nobtn):not(.true-header-cell__checkbox){padding-right:0!important}::ng-deep .true-grid-header td:not(.true-column-resizable):not(.true-column-nobtn):not(.true-header-cell__checkbox) .true-header-cell{padding-right:0!important}"] }), tslib_1.__param(0, Inject('gridState')), tslib_1.__metadata("design:paramtypes", [GridStateService, ElementRef, Renderer2]) ], GridHeaderComponent); return GridHeaderComponent; }(BaseComponent)); export { GridHeaderComponent }; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ3JpZC1oZWFkZXIuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6Im5nOi8vQHRydWUtZGlyZWN0aXZlL2dyaWQvIiwic291cmNlcyI6WyJzcmMvZ3JpZC1oZWFkZXIuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQTs7OztFQUlFO0FBQ0YsT0FBTyxFQUFZLFNBQVMsRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLFNBQVMsRUFBRSxZQUFZLEVBQzNELFNBQVMsRUFDVCxZQUFZLEVBQUUsU0FBUyxFQUFFLFVBQVUsRUFBRSxNQUFNLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFFNUUsY0FBYztBQUNkLE9BQU8sRUFBYyxRQUFRLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUM1RCxPQUFPLEVBQUUsUUFBUSxFQUFFLFlBQVksRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBRTlELE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUM5QyxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFFakQsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBRW5ELE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUNqRCxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUV6RCxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUV4RCxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQztBQUN2RSxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQztBQU92RTtJQUF5QywrQ0FBYTtJQTBkcEQsNkJBQzhCLEtBQXVCLEVBQzNDLFVBQXNCLEVBQ3RCLFFBQW1CO1FBSDdCLFlBS0ksaUJBQU8sU0FDUjtRQUwyQixXQUFLLEdBQUwsS0FBSyxDQUFrQjtRQUMzQyxnQkFBVSxHQUFWLFVBQVUsQ0FBWTtRQUN0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Qzs7U0FFNUMsQ0FBQztRQTRkRyxtQkFBQSxNQUFNLENBQUMsV0FBVyxDQUFDLENBQUE7aURBQWUsZ0JBQWdCO1lBQy9CLFVBQVU7WUFDWixTQUFTO09BN2RsQixtQkFBbUIsQ0FpZS9CO0lBQUQsMEJBQUM7Q0FBQSxBQWplRCxDQUF5QyxhQUFhLEdBaWVyRDtTQWplWSxtQkFBbUIiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcclxuICogQ29weXJpZ2h0IChjKSAyMDE4LTIwMTkgQWxla3NleSBNZWxuaWtvdiwgVHJ1ZSBEaXJlY3RpdmUgQ29tcGFueS5cclxuICogQGxpbmsgaHR0cHM6Ly90cnVlZGlyZWN0aXZlLmNvbS9cclxuICogQGxpY2Vuc2UgTUlUXHJcbiovXHJcbmltcG9ydCB7IE5nTW9kdWxlLCBDb21wb25lbnQsIElucHV0LCBPdXRwdXQsIFZpZXdDaGlsZCwgVmlld0NoaWxkcmVuLCBPbkRlc3Ryb3ksXHJcbiAgICAgICAgIFJlbmRlcmVyMixcclxuICAgICAgICAgRXZlbnRFbWl0dGVyLCBRdWVyeUxpc3QsIEVsZW1lbnRSZWYsIEluamVjdCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5cclxuLy8g0KLQtdC/0LXRgNGMINC90LDRiNC1XHJcbmltcG9ydCB7IENvbHVtblR5cGUsIEdyaWRQYXJ0IH0gZnJvbSAnQHRydWUtZGlyZWN0aXZlL2Jhc2UnO1xyXG5pbXBvcnQgeyBVSUFjdGlvbiwgVUlBY3Rpb25UeXBlIH0gZnJvbSAnQHRydWUtZGlyZWN0aXZlL2Jhc2UnO1xyXG5cclxuaW1wb3J0IHsgQ29sdW1uIH0gZnJvbSAnQHRydWUtZGlyZWN0aXZlL2Jhc2UnO1xyXG5pbXBvcnQgeyBDb2x1bW5CYW5kIH0gZnJvbSAnQHRydWUtZGlyZWN0aXZlL2Jhc2UnO1xyXG5cclxuIGltcG9ydCB7IEdyaWRMYXlvdXQgfSBmcm9tICdAdHJ1ZS1kaXJlY3RpdmUvYmFzZSc7XHJcblxyXG5pbXBvcnQgeyBCYXNlQ29tcG9uZW50IH0gZnJvbSAnLi9iYXNlLmNvbXBvbmVudCc7XHJcbmltcG9ydCB7IFNjcm9sbGVyQ29tcG9uZW50IH0gZnJvbSAnLi9zY3JvbGxlci5jb21wb25lbnQnO1xyXG5cclxuaW1wb3J0IHsgR3JpZFN0YXRlU2VydmljZSB9IGZyb20gJy4vZ3JpZC1zdGF0ZS5zZXJ2aWNlJztcclxuXHJcbmltcG9ydCB7IEdyaWRIZWFkZXJDZWxsQ29tcG9uZW50IH0gZnJvbSAnLi9ncmlkLWhlYWRlci1jZWxsLmNvbXBvbmVudCc7XHJcbmltcG9ydCB7IEdyaWRIZWFkZXJCYW5kQ29tcG9uZW50IH0gZnJvbSAnLi9ncmlkLWhlYWRlci1iYW5kLmNvbXBvbmVudCc7XHJcblxyXG5AQ29tcG9uZW50KHtcclxuICBzZWxlY3RvcjogJ3RydWUtZ3JpZC1oZWFkZXInLFxyXG4gIHRlbXBsYXRlVXJsOiAnLi9ncmlkLWhlYWRlci5jb21wb25lbnQuaHRtbCcsXHJcbiAgc3R5bGVVcmxzOiBbJy4vc3R5bGVzL2dyaWQtaGVhZGVyLmJlaGF2aW9yLnNjc3MnXVxyXG59KVxyXG5leHBvcnQgY2xhc3MgR3JpZEhlYWRlckNvbXBvbmVudCBleHRlbmRzIEJhc2VDb21wb25lbnQge1xyXG5cclxuICBASW5wdXQoJ2xheW91dCcpXHJcbiAgbGF5b3V0OiBHcmlkTGF5b3V0O1xyXG5cclxuICBASW5wdXQoJ3Njcm9sbGVyJylcclxuICBzY3JvbGxlcjogU2Nyb2xsZXJDb21wb25lbnQ7XHJcblxyXG4gIEBPdXRwdXQoJ3Jlc2l6ZUNvbHVtbicpXHJcbiAgcmVzaXplQ29sdW1uID0gbmV3IEV2ZW50RW1pdHRlcjx7IGFjdGlvbjogc3RyaW5nLCB1aTogVUlBY3Rpb24gfT4oKTtcclxuXHJcbiAgQE91dHB1dCgndG9nZ2xlQ2hlY2tDb2x1bW4nKVxyXG4gIHRvZ2dsZUNoZWNrQ29sdW1uID0gbmV3IEV2ZW50RW1pdHRlcjxDb2x1bW4+KCk7XHJcblxyXG4gIEBWaWV3Q2hpbGQoJ2dyaWRIZWFkZXJUYWJsZScsIHtzdGF0aWM6IHRydWV9KVxyXG4gIGdyaWRIZWFkZXJUYWJsZTogYW55O1xyXG5cclxuICAvLyDQnNCw0YDQutC10YAsINGD0LrQsNC30YvQstCw0Y7RidC40Lkg0L3QvtCy0YPRjiDQv9C+0LfQuNGG0LjRjiDQv9C10YDQtdGC0LDRgdC60LjQstCw0LXQvNC+0LPQviDRgdGC0L7Qu9Cx0YbQsFxyXG4gIEBWaWV3Q2hpbGQoJ2Ryb3BNYXJrZXInLCB7c3RhdGljOiB0cnVlfSlcclxuICBkcm9wTWFya2VyOiBhbnk7ICAvLyDQn9C+0LrQsCDQvdC1INC40YHQv9C+0LvRjNC30YPQtdGC0YHRjywg0YIu0LouINC80Ysg0L3QsCDQu9C10YLRgyDQv9C10YDQtdGB0YLQsNCy0LvRj9C10Lwg0LrQvtC70L7QvdC60YMg0L/RgNC4INC00LLQuNC20LXQvdC40LhcclxuXHJcbiAgQFZpZXdDaGlsZHJlbignaGVhZGVyQ2VsbCcsIHtyZWFkOiBHcmlkSGVhZGVyQ2VsbENvbXBvbmVudH0pIGNvbHVtbkVsZW1lbnRzOiBRdWVyeUxpc3Q8R3JpZEhlYWRlckNlbGxDb21wb25lbnQ+O1xyXG4gIEBWaWV3Q2hpbGRyZW4oJ2hlYWRlckJhbmQnLCB7cmVhZDogR3JpZEhlYWRlckJhbmRDb21wb25lbnR9KSBiYW5kRWxlbWVudHM6IFF1ZXJ5TGlzdDxHcmlkSGVhZGVyQmFuZENvbXBvbmVudD47XHJcblxyXG4gIHByaXZhdGUgX3Njcm9sbGVyQ2xpZW50UmVjdDogYW55ID0gbnVsbDtcclxuXHJcbiAgX3RvdWNoZXMgPSBmYWxzZTtcclxuICBfbWFya2VyVmlzaWJsZSA9IGZhbHNlO1xyXG5cclxuICBwdWJsaWMgcmVzaXplSW5Qcm9jZXNzKHZhbHVlOiBib29sZWFuKSB7XHJcbiAgICBpZiAoIXRoaXMuZ3JpZEhlYWRlclRhYmxlKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICBpZiAodmFsdWUpIHtcclxuICAgICAgdGhpcy5ncmlkSGVhZGVyVGFibGUubmF0aXZlRWxlbWVudC5jbGFzc0xpc3QuYWRkKCd0cnVlLXJlc2l6ZS1pbi1wcm9jZXNzJyk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLmdyaWRIZWFkZXJUYWJsZS5uYXRpdmVFbGVtZW50LmNsYXNzTGlzdC5yZW1vdmUoJ3RydWUtcmVzaXplLWluLXByb2Nlc3MnKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHB1YmxpYyBkcmFnSW5Qcm9jZXNzKHZhbHVlOiBib29sZWFuKSB7XHJcbiAgICBpZiAoIXRoaXMuZ3JpZEhlYWRlclRhYmxlKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICBpZiAodmFsdWUpIHtcclxuICAgICAgdGhpcy5ncmlkSGVhZGVyVGFibGUubmF0aXZlRWxlbWVudC5jbGFzc0xpc3QuYWRkKCd0cnVlLWRyYWctaW4tcHJvY2VzcycpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5ncmlkSGVhZGVyVGFibGUubmF0aXZlRWxlbWVudC5jbGFzc0xpc3QucmVtb3ZlKCd0cnVlLWRyYWctaW4tcHJvY2VzcycpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHVibGljIHRyYWNrQ29sKGk6IG51bWJlciwgYzogQ29sdW1uKSB7XHJcbiAgICByZXR1cm4gYztcclxuICB9XHJcblxyXG4gIC8vXHJcbiAgZ2V0IGlzQXV0b1Njcm9sbCgpIHtcclxuICAgIGlmICh0aGlzLnNjcm9sbGVyKSB7XHJcbiAgICAgIHJldHVybiB0aGlzLnNjcm9sbGVyLmlzQXV0b1Njcm9sbDtcclxuICAgIH1cclxuICAgIHJldHVybiBmYWxzZTtcclxuICB9XHJcblxyXG4gIHJlc2l6ZU1vdXNlVXAoZTogYW55KSB7IH1cclxuXHJcbiAgdG9nZ2xlQ2hlY2soZTogYW55LCBjb2w6IENvbHVtbikge1xyXG4gICAgdGhpcy50b2dnbGVDaGVja0NvbHVtbi5lbWl0KGNvbCk7XHJcbiAgfVxyXG5cclxuICBoZWFkZXJDZWxsTW91c2VEb3duKGU6IGFueSwgY29sOiBDb2x1bW4pIHtcclxuICAgIGlmIChlLmJ1dHRvbiAhPSAwKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCByciA9IGUudGFyZ2V0LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xyXG4gICAgY29uc3QgeHggPSBNYXRoLnJvdW5kKGUuY2xpZW50WCk7XHJcblxyXG4gICAgaWYgKHh4IDwgcnIubGVmdCArIHJyLndpZHRoIC8gMikge1xyXG4gICAgICAvLyDQndCwINGB0LDQvNC+0Lwg0LTQtdC70LUg0Y3RgtC+INC90LUg0L/QtdGA0LXRgtCw0YHQutC40LLQsNC90LjQtSwg0LAg0LjQt9C80LXQvdC10L3QuNC1INGI0LjRgNC40L3RiyDQv9GA0LXQtNGL0LTRg9GJ0LXQuSDQutC+0LvQvtC90LrQuC4uXHJcbiAgICAgIHRoaXMucmVzaXplTW91c2VEb3duUHJldihlLCBjb2wpO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHh4ID4gcnIubGVmdCArIHJyLndpZHRoIC8gMikge1xyXG4gICAgICAvLyDQndCwINGB0LDQvNC+0Lwg0LTQtdC70LUg0Y3RgtC+INC90LUg0L/QtdGA0LXRgtCw0YHQutC40LLQsNC90LjQtSwg0LAg0LjQt9C80LXQvdC10L3QuNC1INGI0LjRgNC40L3Riy4uXHJcbiAgICAgIHRoaXMucmVzaXplTW91c2VEb3duKGUsIGNvbCk7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGNhcHRpb25Ub3VjaE1vdmUoZTogYW55LCBjb2w6IENvbHVtbikge1xyXG4gICAgLy9cclxuICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XHJcblxyXG4gICAgY29uc3QgdG91Y2hlcyA9IGUuY2hhbmdlZFRvdWNoZXM7XHJcbiAgICBpZiAodG91Y2hlcy5sZW5ndGggPT09IDEgJiYgdGhpcy51aUFjdGlvbi50YXJnZXQgPT09IGNvbCkge1xyXG5cclxuICAgICAgY29uc3QgeHggPSB0b3VjaGVzWzBdLmNsaWVudFg7XHJcbiAgICAgIGNvbnN0IHl5ID0gdG91Y2hlc1swXS5jbGllbnRZO1xyXG5cclxuICAgICAgaWYgKHRoaXMuY2hlY2tSZW9yZGVyaW5nKHh4LCB5eSkpIHtcclxuICAgICAgICAvLyDQn9C10YDQtdC80LXRidC10L3QuNC1INGC0L7Qu9GM0LrQviDQuNC90LjRhtC40LDQu9C40LfQuNGA0L7QstCw0L3QvlxyXG4gICAgICAgIHJldHVybjtcclxuICAgICAgfVxyXG5cclxuICAgICAgaWYgKHRoaXMudWlBY3Rpb24uYWN0aW9uID09PSBVSUFjdGlvblR5cGUuUkVPUkRFUl9DT0xVTU4pIHtcclxuICAgICAgICB0aGlzLnByb2NlZWRSZW9yZGVyaW5nKHh4LCB5eSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIGNhcHRpb25Ub3VjaEVuZChlOiBhbnkpIHtcclxuXHJcbiAgICB0aGlzLnJlbW92ZVRvdWNoTW92ZUxpc3RlbmVycygpO1xyXG5cclxuICAgIGlmICh0aGlzLnNjcm9sbGVyKSB7XHJcbiAgICAgIHRoaXMuc2Nyb2xsZXIuc3RvcEF1dG9TY3JvbGwoKTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoIXRoaXMudWlBY3Rpb24pIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICh0aGlzLnVpQWN0aW9uICYmIHRoaXMudWlBY3Rpb24uYWN0aW9uID09PSBVSUFjdGlvblR5cGUuUkVPUkRFUl9DT0xVTU4pIHtcclxuICAgICAgdGhpcy5zdG9wUmVvcmRlcmluZygpO1xyXG4gICAgfVxyXG5cclxuICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XHJcbiAgICBpZiAoZS5jYW5jZWxhYmxlKSB7XHJcbiAgICAgIGUucHJldmVudERlZmF1bHQoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGNhcHRpb25TdGFydERyYWcoZTogYW55LCBjb2w6IENvbHVtbikge1xyXG5cclxuICAgIGlmIChjb2wuaXNDaGVja2JveCkge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgbGV0IHh4OiBudW1iZXI7XHJcbiAgICBsZXQgeXk6IG51bWJlcjtcclxuXHJcbiAgICBpZiAoZS50b3VjaGVzKSB7XHJcbiAgICAgIGlmICghZS5jaGFuZ2VkVG91Y2hlcyB8fCBlLmNoYW5nZWRUb3VjaGVzLmxlbmd0aCAhPT0gMSkge1xyXG4gICAgICAgIHJldHVybjtcclxuICAgICAgfVxyXG5cclxuICAgICAgeHggPSBlLmNoYW5nZWRUb3VjaGVzWzBdLmNsaWVudFg7XHJcbiAgICAgIHl5ID0gZS5jaGFuZ2VkVG91Y2hlc1swXS5jbGllbnRZO1xyXG5cclxuICAgICAgdGhpcy5yZW1vdmVUb3VjaE1vdmVMaXN0ZW5lcnMoKTtcclxuICAgICAgdGhpcy50b3VjaE1vdmVMaXN0ZW5GdW5jID0gdGhpcy5yZW5kZXJlci5saXN0ZW4oZXZlbnQudGFyZ2V0LCAndG91Y2htb3ZlJywgKGU6IGFueSkgPT4ge1xyXG4gICAgICAgIHRoaXMuY2FwdGlvblRvdWNoTW92ZShlLCBjb2wpO1xyXG4gICAgICB9KTtcclxuICAgICAgdGhpcy50b3VjaEVuZExpc3RlbkZ1bmMgPSB0aGlzLnJlbmRlcmVyLmxpc3RlbihldmVudC50YXJnZXQsICd0b3VjaGVuZCcsIChlOiBhbnkpID0+IHtcclxuICAgICAgICB0aGlzLmNhcHRpb25Ub3VjaEVuZChlKTtcclxuICAgICAgfSk7XHJcbiAgICAgIHRoaXMudG91Y2hDYW5jZWxMaXN0ZW5GdW5jID0gdGhpcy5yZW5kZXJlci5saXN0ZW4oZXZlbnQudGFyZ2V0LCAndG91Y2hjYW5jZWwnLCAoZTogYW55KSA9PiB7XHJcbiAgICAgICAgdGhpcy5jYXB0aW9uVG91Y2hFbmQoZSk7XHJcbiAgICAgIH0pO1xyXG5cclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIC8vIE1vdXNlIGV2ZW50XHJcbiAgICAgIHRoaXMuYWRkRG9jdW1lbnRNb3VzZUxpc3RlbmVycygpO1xyXG4gICAgICBpZiAoZS5idXR0b24gIT0gMCkge1xyXG4gICAgICAgIHJldHVybjtcclxuICAgICAgfVxyXG5cclxuICAgICAgeHggPSBlLmNsaWVudFg7XHJcbiAgICAgIHl5ID0gZS5jbGllbnRZO1xyXG4gICAgfVxyXG5cclxuICAgIGxldCByciA9IGUudGFyZ2V0LnBhcmVudEVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XHJcblxyXG4gICAgdGhpcy51aUFjdGlvbiA9IG5ldyBVSUFjdGlvbihVSUFjdGlvblR5cGUuQ0xJQ0ssIGNvbCwgeHgsIHl5KTtcclxuICAgIHRoaXMudWlBY3Rpb24udGFyZ2V0T2Zmc2V0WCA9IHJyLmxlZnQgLSB4eDtcclxuICAgIHRoaXMudWlBY3Rpb24udGFyZ2V0T2Zmc2V0WSA9IHJyLnRvcCAtIHl5O1xyXG5cclxuICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XHJcbiAgfVxyXG5cclxuICBjYXB0aW9uU29ydChlOiBhbnksIGNvbDogQ29sdW1uKSB7XHJcblxyXG4gICAgaWYgKGUudG91Y2hlcykge1xyXG4gICAgICBpZiAoIWUuY2hhbmdlZFRvdWNoZXMgfHwgZS5jaGFuZ2VkVG91Y2hlcy5sZW5ndGggIT09IDEpIHtcclxuICAgICAgICByZXR1cm47XHJcbiAgICAgIH1cclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGlmIChlLmJ1dHRvbiAhPSAwKSB7XHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKCF0aGlzLnVpQWN0aW9uKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoZS5kZWZhdWx0UHJldmVudGVkKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICBpZiAodGhpcy51aUFjdGlvbi50YXJnZXQgPT09IGNvbCAmJiB0aGlzLnVpQWN0aW9uLmFjdGlvbiA9PT0gVUlBY3Rpb25UeXBlLkNMSUNLKSB7XHJcbiAgICAgIGlmICghY29sLmlzQ2hlY2tib3ggJiYgY29sLmFsbG93U29ydGluZykge1xyXG4gICAgICAgIHRoaXMuc3RhdGUuc29ydEJ5Q29sdW1uKGNvbCwgZS5zaGlmdEtleSk7XHJcbiAgICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcclxuICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICAgIH1cclxuICAgICAgdGhpcy51aUFjdGlvbiA9IG51bGw7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICByZXNpemVNb3VzZURvd24oZTogYW55LCBjb2w6IENvbHVtbikge1xyXG4gICAgaWYgKGNvbC5jYW5SZXNpemUpIHtcclxuICAgICAgdGhpcy5pbml0UmVzaXppbmcoZSwgY29sKTtcclxuICAgIH1cclxuICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XHJcbiAgfVxyXG5cclxuICByZXNpemVNb3VzZURvd25QcmV2KGU6IGFueSwgY29sOiBDb2x1bW4pIHtcclxuICAgIGxldCByZWFsQ29sID0gbnVsbDtcclxuICAgIGNvbnN0IGlpID0gdGhpcy5sYXlvdXQuY29sdW1ucy5pbmRleE9mKGNvbCk7XHJcblxyXG4gICAgaWYgKGlpID4gMCkge1xyXG4gICAgICByZWFsQ29sID0gdGhpcy5sYXlvdXQuY29sdW1uc1tpaSAtIDFdO1xyXG4gICAgICB0aGlzLmluaXRSZXNpemluZyhlLCByZWFsQ29sKTtcclxuICAgIH1cclxuICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgc2hvd0hlYWRlckJ0bihmaWVsZE5hbWU6IHN0cmluZykge1xyXG4gICAgaWYgKCF0aGlzLmNvbHVtbkVsZW1lbnRzKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLmNvbHVtbkVsZW1lbnRzLmZvckVhY2goZWwgPT4ge1xyXG4gICAgICBpZiAoZWwuY29sdW1uLmZpZWxkTmFtZSA9PT0gZmllbGROYW1lKSB7XHJcbiAgICAgICAgZWwuc2V0U3RhdGUoJ2J0bi12aXNpYmxlJyk7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGhpZGVIZWFkZXJCdG5zKCkge1xyXG4gICAgaWYgKCF0aGlzLmNvbHVtbkVsZW1lbnRzKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIHRoaXMuY29sdW1uRWxlbWVudHMuZm9yRWFjaChlbCA9PiBlbC5yZW1vdmVTdGF0ZSgnYnRuLXZpc2libGUnKSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGdldCByZW5kZXJlZENvbHVtbnMoKTogYW55W10ge1xyXG4gICAgY29uc3QgcmVuZGVyZWRDb2x1bW5zOiBhbnlbXSA9IFtdO1xyXG4gICAgdGhpcy5jb2x1bW5FbGVtZW50cy5mb3JFYWNoKGVsID0+IHtcclxuICAgICAgcmVuZGVyZWRDb2x1bW5zLnB1c2goeyBib3VuZGluZ1JlY3Q6IGVsLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSwgaXRlbTogZWwuY29sdW1uIH0pO1xyXG4gICAgfSk7XHJcbiAgICByZXR1cm4gcmVuZGVyZWRDb2x1bW5zO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBnZXQgcmVuZGVyZWRCYW5kcygpOiBhbnlbXSB7XHJcbiAgICBjb25zdCByZW5kZXJlZEJhbmRzOiBhbnlbXSA9IFtdO1xyXG4gICAgdGhpcy5iYW5kRWxlbWVudHMuZm9yRWFjaChlbCA9PiB7XHJcbiAgICAgIHJlbmRlcmVkQmFuZHMucHVzaCh7IGJvdW5kaW5nUmVjdDogZWwuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LmdldEJvdW5kaW