ngx-gem-spaas
Version:
This library contains services, components, images and styles to provide a unified look and way-of-working throughout GEM SPaaS.
160 lines • 20.1 kB
JavaScript
import { Directive, EventEmitter, HostListener, Input, Output } from '@angular/core';
import { Subject } from 'rxjs';
import * as i0 from "@angular/core";
export class TableSelectionRowDirective {
constructor() {
this.rowSelectionMatrix = [];
this.multiSelect = false;
this.selectionChanged = new EventEmitter(); // will emit last selected row index
this.isSelecting = false;
this.selectionId = 1;
// set the from/to variables to public because it's very handy to be able to access these directly in the template
this.fromRow = 0;
this.toRow = 0;
this.onDestroy = new Subject();
}
mouseDown(e) {
const mouseData = this.checkMouseData(e);
if (mouseData.valid) {
this.onClickCell(e, mouseData.rowIdx);
}
}
mouseMove(e) {
const mouseData = this.checkMouseData(e);
if (this.isSelecting && mouseData.valid && mouseData.rowIdx !== this.toRow) {
this.onSelecting(mouseData.rowIdx);
}
}
mouseUp() {
this.onStopSelect('mouseup');
}
mouseLeave() {
this.onStopSelect('mouseleave');
}
sort() {
this.resetSelectionRange(true, true);
this.emitNewSelection();
}
ngOnDestroy() {
this.onDestroy.next();
this.onDestroy.complete();
}
checkMouseData(e) {
const target = (e.target);
let dataset = target?.dataset;
if (!dataset?.rowIdx) {
// also check the offsetParent, for cells with sub-divs
dataset = (target?.offsetParent).dataset;
}
let rowIdx = -1;
if (dataset?.rowIdx) {
rowIdx = Number.isNaN((Number(dataset.rowIdx))) ? -1 : Number(dataset.rowIdx);
}
return {
valid: rowIdx > -1,
rowIdx: rowIdx,
};
}
onClickCell(e, rowIdx) {
if (!e) {
return;
}
this.isSelecting = true;
if (!e.shiftKey && !e.ctrlKey) {
// normal click: update all selection variables
++this.selectionId;
this.fromRow = rowIdx;
this.toRow = rowIdx;
this.resetSelectionRange(true);
}
else if (e.shiftKey && this.multiSelect) {
// shift click: set last variables for range selection
document.getSelection()?.removeAllRanges();
this.toRow = rowIdx;
this.updateSelectionRange();
}
else if (e.ctrlKey && this.multiSelect) {
// ctrl key: just set for row itself
++this.selectionId;
this.rowSelectionMatrix[rowIdx] = !this.rowSelectionMatrix[rowIdx] ? this.selectionId : 0;
if (this.rowSelectionMatrix[rowIdx]) {
this.fromRow = rowIdx;
this.toRow = rowIdx;
}
else {
// it's a deselection: search for last selected row to put focus on
for (let row = 0; row < this.rowSelectionMatrix.length; row++) {
if (this.rowSelectionMatrix[row]) {
this.toRow = row;
}
}
}
}
}
onSelecting(rowIdx) {
if (this.isSelecting && this.multiSelect) {
document.getSelection()?.removeAllRanges();
this.toRow = rowIdx;
this.resetSelectionRange();
this.updateSelectionRange();
}
}
onStopSelect(fromMouseEvent) {
if (this.isSelecting) {
this.isSelecting = false;
if (fromMouseEvent === 'mouseup') {
this.emitNewSelection();
}
}
}
emitNewSelection() {
this.selectionChanged.emit(this.rowSelectionMatrix[this.toRow] > 0 ? this.toRow : -1);
}
resetSelectionRange(fullReset = false, fromSort = false) {
const wasSelected = this.rowSelectionMatrix[this.toRow] > 0;
for (let rowIdx = 0; rowIdx < this.rowSelectionMatrix.length; rowIdx++) {
if (fullReset || this.rowSelectionMatrix[rowIdx] === this.selectionId) {
this.rowSelectionMatrix[rowIdx] = 0;
}
}
this.rowSelectionMatrix[this.toRow] = fromSort || wasSelected ? 0 : this.selectionId;
}
updateSelectionRange() {
const fromRow = Math.min(this.fromRow, this.toRow);
const toRow = Math.max(this.fromRow, this.toRow);
for (let rowIdx = fromRow; rowIdx <= toRow; rowIdx++) {
this.rowSelectionMatrix[rowIdx] = this.selectionId;
}
}
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: TableSelectionRowDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "17.3.12", type: TableSelectionRowDirective, selector: "[spaasTableSelectionRow]", inputs: { rowSelectionMatrix: "rowSelectionMatrix", multiSelect: "multiSelect" }, outputs: { selectionChanged: "selectionChanged" }, host: { listeners: { "mousedown": "mouseDown($event)", "mousemove": "mouseMove($event)", "mouseup": "mouseUp($event)", "mouseleave": "mouseLeave($event)", "tableSortedOrFiltered": "sort($event)" } }, exportAs: ["spaasTableSelectionRow"], ngImport: i0 }); }
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: TableSelectionRowDirective, decorators: [{
type: Directive,
args: [{
selector: '[spaasTableSelectionRow]',
exportAs: 'spaasTableSelectionRow'
}]
}], propDecorators: { rowSelectionMatrix: [{
type: Input
}], multiSelect: [{
type: Input
}], selectionChanged: [{
type: Output
}], mouseDown: [{
type: HostListener,
args: ['mousedown', ['$event']]
}], mouseMove: [{
type: HostListener,
args: ['mousemove', ['$event']]
}], mouseUp: [{
type: HostListener,
args: ['mouseup', ['$event']]
}], mouseLeave: [{
type: HostListener,
args: ['mouseleave', ['$event']]
}], sort: [{
type: HostListener,
args: ['tableSortedOrFiltered', ['$event']]
}] } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFibGUtc2VsZWN0aW9uLXJvdy5kaXJlY3RpdmUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZ3gtZ2VtLXNwYWFzL3RhYmxlL3NyYy9fZGlyZWN0aXZlcy90YWJsZS1zZWxlY3Rpb24tcm93LmRpcmVjdGl2ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUMsU0FBUyxFQUFFLFlBQVksRUFBRSxZQUFZLEVBQUUsS0FBSyxFQUFhLE1BQU0sRUFBQyxNQUFNLGVBQWUsQ0FBQztBQUM5RixPQUFPLEVBQUMsT0FBTyxFQUFDLE1BQU0sTUFBTSxDQUFDOztBQU03QixNQUFNLE9BQU8sMEJBQTBCO0lBSnZDO1FBTVcsdUJBQWtCLEdBQWEsRUFBRSxDQUFDO1FBQ2xDLGdCQUFXLEdBQVksS0FBSyxDQUFDO1FBQzVCLHFCQUFnQixHQUFHLElBQUksWUFBWSxFQUFVLENBQUMsQ0FBQyxvQ0FBb0M7UUFFN0YsZ0JBQVcsR0FBRyxLQUFLLENBQUM7UUFDWixnQkFBVyxHQUFHLENBQUMsQ0FBQztRQUV4QixrSEFBa0g7UUFDbEgsWUFBTyxHQUFHLENBQUMsQ0FBQztRQUNaLFVBQUssR0FBVyxDQUFDLENBQUM7UUFFVixjQUFTLEdBQUcsSUFBSSxPQUFPLEVBQVEsQ0FBQztLQWtJekM7SUEvSEMsU0FBUyxDQUFDLENBQWE7UUFDckIsTUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUN6QyxJQUFJLFNBQVMsQ0FBQyxLQUFLLEVBQUUsQ0FBQztZQUNwQixJQUFJLENBQUMsV0FBVyxDQUFDLENBQUMsRUFBRSxTQUFTLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDeEMsQ0FBQztJQUNILENBQUM7SUFHRCxTQUFTLENBQUMsQ0FBYTtRQUNyQixNQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ3pDLElBQUksSUFB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QUFFLE1BQU0sRUFBRSxFQUFFLENBQUM7WUFDckQsSUFBSSxDQUFDLGtCQUFrQixDQUFDLE1BQU0sQ0FBQyxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUM7UUFDckQsQ0FBQztJQUNILENBQUM7K0dBN0lVLDBCQUEwQjttR0FBMUIsMEJBQTBCOzs0RkFBMUIsMEJBQTBCO2tCQUp0QyxTQUFTO21CQUFDO29CQUNULFFBQVEsRUFBRSwwQkFBMEI7b0JBQ3BDLFFBQVEsRUFBRSx3QkFBd0I7aUJBQ25DOzhCQUdVLGtCQUFrQjtzQkFBMUIsS0FBSztnQkFDRyxXQUFXO3NCQUFuQixLQUFLO2dCQUNJLGdCQUFnQjtzQkFBekIsTUFBTTtnQkFZUCxTQUFTO3NCQURSLFlBQVk7dUJBQUMsV0FBVyxFQUFFLENBQUMsUUFBUSxDQUFDO2dCQVNyQyxTQUFTO3NCQURSLFlBQVk7dUJBQUMsV0FBVyxFQUFFLENBQUMsUUFBUSxDQUFDO2dCQVNyQyxPQUFPO3NCQUROLFlBQVk7dUJBQUMsU0FBUyxFQUFFLENBQUMsUUFBUSxDQUFDO2dCQU1uQyxVQUFVO3NCQURULFlBQVk7dUJBQUMsWUFBWSxFQUFFLENBQUMsUUFBUSxDQUFDO2dCQU10QyxJQUFJO3NCQURILFlBQVk7dUJBQUMsdUJBQXVCLEVBQUUsQ0FBQyxRQUFRLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge0RpcmVjdGl2ZSwgRXZlbnRFbWl0dGVyLCBIb3N0TGlzdGVuZXIsIElucHV0LCBPbkRlc3Ryb3ksIE91dHB1dH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7U3ViamVjdH0gZnJvbSAncnhqcyc7XHJcblxyXG5ARGlyZWN0aXZlKHtcclxuICBzZWxlY3RvcjogJ1tzcGFhc1RhYmxlU2VsZWN0aW9uUm93XScsXHJcbiAgZXhwb3J0QXM6ICdzcGFhc1RhYmxlU2VsZWN0aW9uUm93J1xyXG59KVxyXG5leHBvcnQgY2xhc3MgVGFibGVTZWxlY3Rpb25Sb3dEaXJlY3RpdmUgaW1wbGVtZW50cyBPbkRlc3Ryb3kge1xyXG5cclxuICBASW5wdXQoKSByb3dTZWxlY3Rpb25NYXRyaXg6IG51bWJlcltdID0gW107XHJcbiAgQElucHV0KCkgbXVsdGlTZWxlY3Q6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBAT3V0cHV0KCkgc2VsZWN0aW9uQ2hhbmdlZCA9IG5ldyBFdmVudEVtaXR0ZXI8bnVtYmVyPigpOyAvLyB3aWxsIGVtaXQgbGFzdCBzZWxlY3RlZCByb3cgaW5kZXhcclxuXHJcbiAgaXNTZWxlY3RpbmcgPSBmYWxzZTtcclxuICBwcml2YXRlIHNlbGVjdGlvbklkID0gMTtcclxuXHJcbiAgLy8gc2V0IHRoZSBmcm9tL3RvIHZhcmlhYmxlcyB0byBwdWJsaWMgYmVjYXVzZSBpdCdzIHZlcnkgaGFuZHkgdG8gYmUgYWJsZSB0byBhY2Nlc3MgdGhlc2UgZGlyZWN0bHkgaW4gdGhlIHRlbXBsYXRlXHJcbiAgZnJvbVJvdyA9IDA7XHJcbiAgdG9Sb3c6IG51bWJlciA9IDA7XHJcblxyXG4gIHByaXZhdGUgb25EZXN0cm95ID0gbmV3IFN1YmplY3Q8dm9pZD4oKTtcclxuXHJcbiAgQEhvc3RMaXN0ZW5lcignbW91c2Vkb3duJywgWyckZXZlbnQnXSlcclxuICBtb3VzZURvd24oZTogTW91c2VFdmVudCkge1xyXG4gICAgY29uc3QgbW91c2VEYXRhID0gdGhpcy5jaGVja01vdXNlRGF0YShlKTtcclxuICAgIGlmIChtb3VzZURhdGEudmFsaWQpIHtcclxuICAgICAgdGhpcy5vbkNsaWNrQ2VsbChlLCBtb3VzZURhdGEucm93SWR4KTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIEBIb3N0TGlzdGVuZXIoJ21vdXNlbW92ZScsIFsnJGV2ZW50J10pXHJcbiAgbW91c2VNb3ZlKGU6IE1vdXNlRXZlbnQpIHtcclxuICAgIGNvbnN0IG1vdXNlRGF0YSA9IHRoaXMuY2hlY2tNb3VzZURhdGEoZSk7XHJcbiAgICBpZiAodGhpcy5pc1NlbGVjdGluZyAmJiBtb3VzZURhdGEudmFsaWQgJiYgbW91c2VEYXRhLnJvd0lkeCAhPT0gdGhpcy50b1Jvdykge1xyXG4gICAgICB0aGlzLm9uU2VsZWN0aW5nKG1vdXNlRGF0YS5yb3dJZHgpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgQEhvc3RMaXN0ZW5lcignbW91c2V1cCcsIFsnJGV2ZW50J10pXHJcbiAgbW91c2VVcCgpIHtcclxuICAgIHRoaXMub25TdG9wU2VsZWN0KCdtb3VzZXVwJyk7XHJcbiAgfVxyXG5cclxuICBASG9zdExpc3RlbmVyKCdtb3VzZWxlYXZlJywgWyckZXZlbnQnXSlcclxuICBtb3VzZUxlYXZlKCkge1xyXG4gICAgdGhpcy5vblN0b3BTZWxlY3QoJ21vdXNlbGVhdmUnKTtcclxuICB9XHJcblxyXG4gIEBIb3N0TGlzdGVuZXIoJ3RhYmxlU29ydGVkT3JGaWx0ZXJlZCcsIFsnJGV2ZW50J10pXHJcbiAgc29ydCgpIHtcclxuICAgIHRoaXMucmVzZXRTZWxlY3Rpb25SYW5nZSh0cnVlLCB0cnVlKTtcclxuICAgIHRoaXMuZW1pdE5ld1NlbGVjdGlvbigpO1xyXG4gIH1cclxuXHJcbiAgbmdPbkRlc3Ryb3koKSB7XHJcbiAgICB0aGlzLm9uRGVzdHJveS5uZXh0KCk7XHJcbiAgICB0aGlzLm9uRGVzdHJveS5jb21wbGV0ZSgpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBjaGVja01vdXNlRGF0YShlOiBNb3VzZUV2ZW50KTogeyB2YWxpZDogYm9vbGVhbiwgcm93SWR4OiBudW1iZXIgfSB7XHJcbiAgICBjb25zdCB0YXJnZXQgPSAoZS50YXJnZXQpIGFzIEhUTUxFbGVtZW50O1xyXG4gICAgbGV0IGRhdGFzZXQ6IGFueSA9IHRhcmdldD8uZGF0YXNldDtcclxuICAgIGlmICghZGF0YXNldD8ucm93SWR4KSB7XHJcbiAgICAgIC8vIGFsc28gY2hlY2sgdGhlIG9mZnNldFBhcmVudCwgZm9yIGNlbGxzIHdpdGggc3ViLWRpdnNcclxuICAgICAgZGF0YXNldCA9ICgodGFyZ2V0Py5vZmZzZXRQYXJlbnQpIGFzIEhUTUxFbGVtZW50KS5kYXRhc2V0O1xyXG4gICAgfVxyXG4gICAgbGV0IHJvd0lkeCA9IC0xO1xyXG4gICAgaWYgKGRhdGFzZXQ/LnJvd0lkeCkge1xyXG4gICAgICByb3dJZHggPSBOdW1iZXIuaXNOYU4oKE51bWJlcihkYXRhc2V0LnJvd0lkeCkpKSA/IC0xIDogTnVtYmVyKGRhdGFzZXQucm93SWR4KTtcclxuICAgIH1cclxuICAgIHJldHVybiB7XHJcbiAgICAgIHZhbGlkOiByb3dJZHggPiAtMSxcclxuICAgICAgcm93SWR4OiByb3dJZHgsXHJcbiAgICB9O1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBvbkNsaWNrQ2VsbChlOiBNb3VzZUV2ZW50LCByb3dJZHg6IG51bWJlcik6IHZvaWQge1xyXG4gICAgaWYgKCFlKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIHRoaXMuaXNTZWxlY3RpbmcgPSB0cnVlO1xyXG4gICAgaWYgKCFlLnNoaWZ0S2V5ICYmICFlLmN0cmxLZXkpIHtcclxuICAgICAgLy8gbm9ybWFsIGNsaWNrOiB1cGRhdGUgYWxsIHNlbGVjdGlvbiB2YXJpYWJsZXNcclxuICAgICAgKyt0aGlzLnNlbGVjdGlvbklkO1xyXG4gICAgICB0aGlzLmZyb21Sb3cgPSByb3dJZHg7XHJcbiAgICAgIHRoaXMudG9Sb3cgPSByb3dJZHg7XHJcbiAgICAgIHRoaXMucmVzZXRTZWxlY3Rpb25SYW5nZSh0cnVlKTtcclxuICAgIH0gZWxzZSBpZiAoZS5zaGlmdEtleSAmJiB0aGlzLm11bHRpU2VsZWN0KSB7XHJcbiAgICAgIC8vIHNoaWZ0IGNsaWNrOiBzZXQgbGFzdCB2YXJpYWJsZXMgZm9yIHJhbmdlIHNlbGVjdGlvblxyXG4gICAgICBkb2N1bWVudC5nZXRTZWxlY3Rpb24oKT8ucmVtb3ZlQWxsUmFuZ2VzKCk7XHJcbiAgICAgIHRoaXMudG9Sb3cgPSByb3dJZHg7XHJcbiAgICAgIHRoaXMudXBkYXRlU2VsZWN0aW9uUmFuZ2UoKTtcclxuICAgIH0gZWxzZSBpZiAoZS5jdHJsS2V5ICYmIHRoaXMubXVsdGlTZWxlY3QpIHtcclxuICAgICAgLy8gY3RybCBrZXk6IGp1c3Qgc2V0IGZvciByb3cgaXRzZWxmXHJcbiAgICAgICsrdGhpcy5zZWxlY3Rpb25JZDtcclxuICAgICAgdGhpcy5yb3dTZWxlY3Rpb25NYXRyaXhbcm93SWR4XSA9ICF0aGlzLnJvd1NlbGVjdGlvbk1hdHJpeFtyb3dJZHhdID8gdGhpcy5zZWxlY3Rpb25JZCA6IDA7XHJcbiAgICAgIGlmICh0aGlzLnJvd1NlbGVjdGlvbk1hdHJpeFtyb3dJZHhdKSB7XHJcbiAgICAgICAgdGhpcy5mcm9tUm93ID0gcm93SWR4O1xyXG4gICAgICAgIHRoaXMudG9Sb3cgPSByb3dJZHg7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgLy8gaXQncyBhIGRlc2VsZWN0aW9uOiBzZWFyY2ggZm9yIGxhc3Qgc2VsZWN0ZWQgcm93IHRvIHB1dCBmb2N1cyBvblxyXG4gICAgICAgIGZvciAobGV0IHJvdyA9IDA7IHJvdyA8IHRoaXMucm93U2VsZWN0aW9uTWF0cml4Lmxlbmd0aDsgcm93KyspIHtcclxuICAgICAgICAgIGlmICh0aGlzLnJvd1NlbGVjdGlvbk1hdHJpeFtyb3ddKSB7XHJcbiAgICAgICAgICAgIHRoaXMudG9Sb3cgPSByb3c7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIG9uU2VsZWN0aW5nKHJvd0lkeDogbnVtYmVyKTogdm9pZCB7XHJcbiAgICBpZiAodGhpcy5pc1NlbGVjdGluZyAmJiB0aGlzLm11bHRpU2VsZWN0KSB7XHJcbiAgICAgIGRvY3VtZW50LmdldFNlbGVjdGlvbigpPy5yZW1vdmVBbGxSYW5nZXMoKTtcclxuICAgICAgdGhpcy50b1JvdyA9IHJvd0lkeDtcclxuICAgICAgdGhpcy5yZXNldFNlbGVjdGlvblJhbmdlKCk7XHJcbiAgICAgIHRoaXMudXBkYXRlU2VsZWN0aW9uUmFuZ2UoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgb25TdG9wU2VsZWN0KGZyb21Nb3VzZUV2ZW50OiAnbW91c2V1cCcgfCAnbW91c2VsZWF2ZScpOiB2b2lkIHtcclxuICAgIGlmICh0aGlzLmlzU2VsZWN0aW5nKSB7XHJcbiAgICAgIHRoaXMuaXNTZWxlY3RpbmcgPSBmYWxzZTtcclxuICAgICAgaWYgKGZyb21Nb3VzZUV2ZW50ID09PSAnbW91c2V1cCcpIHtcclxuICAgICAgICB0aGlzLmVtaXROZXdTZWxlY3Rpb24oKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBlbWl0TmV3U2VsZWN0aW9uKCk6IHZvaWQge1xyXG4gICAgdGhpcy5zZWxlY3Rpb25DaGFuZ2VkLmVtaXQodGhpcy5yb3dTZWxlY3Rpb25NYXRyaXhbdGhpcy50b1Jvd10gPiAwID8gdGhpcy50b1JvdyA6IC0xKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgcmVzZXRTZWxlY3Rpb25SYW5nZShmdWxsUmVzZXQgPSBmYWxzZSwgZnJvbVNvcnQgPSBmYWxzZSk6IHZvaWQge1xyXG4gICAgY29uc3Qgd2FzU2VsZWN0ZWQgPSB0aGlzLnJvd1NlbGVjdGlvbk1hdHJpeFt0aGlzLnRvUm93XSA+IDA7XHJcbiAgICBmb3IgKGxldCByb3dJZHggPSAwOyByb3dJZHggPCB0aGlzLnJvd1NlbGVjdGlvbk1hdHJpeC5sZW5ndGg7IHJvd0lkeCsrKSB7XHJcbiAgICAgIGlmIChmdWxsUmVzZXQgfHwgdGhpcy5yb3dTZWxlY3Rpb25NYXRyaXhbcm93SWR4XSA9PT0gdGhpcy5zZWxlY3Rpb25JZCkge1xyXG4gICAgICAgIHRoaXMucm93U2VsZWN0aW9uTWF0cml4W3Jvd0lkeF0gPSAwO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICB0aGlzLnJvd1NlbGVjdGlvbk1hdHJpeFt0aGlzLnRvUm93XSA9IGZyb21Tb3J0IHx8IHdhc1NlbGVjdGVkID8gMCA6IHRoaXMuc2VsZWN0aW9uSWQ7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHVwZGF0ZVNlbGVjdGlvblJhbmdlKCk6IHZvaWQge1xyXG4gICAgY29uc3QgZnJvbVJvdyA9IE1hdGgubWluKHRoaXMuZnJvbVJvdywgdGhpcy50b1Jvdyk7XHJcbiAgICBjb25zdCB0b1JvdyA9IE1hdGgubWF4KHRoaXMuZnJvbVJvdywgdGhpcy50b1Jvdyk7XHJcbiAgICBmb3IgKGxldCByb3dJZHggPSBmcm9tUm93OyByb3dJZHggPD0gdG9Sb3c7IHJvd0lkeCsrKSB7XHJcbiAgICAgIHRoaXMucm93U2VsZWN0aW9uTWF0cml4W3Jvd0lkeF0gPSB0aGlzLnNlbGVjdGlvbklkO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbn1cclxuIl19