@true-directive/grid
Version:
Angular Data Grid from Yopsilon.
227 lines • 28.4 kB
JavaScript
import * as tslib_1 from "tslib";
/**
* Copyright (c) 2018-2019 Aleksey Melnikov, True Directive Company.
* @link https://truedirective.com/
* @license MIT
*/
import { Component, Output, EventEmitter, ViewChild, ElementRef, Renderer2 } from '@angular/core';
import { Keys } from '@true-directive/base';
import { Utils } from '@true-directive/base';
import { CalendarComponent } from '../controls/calendar.component';
import { PopupComponent } from '../controls/popup.component';
import { MaskDateDirective } from '../mask/mask-date.directive';
import { DOMUtils } from '../common/dom-utils.class';
var EditorTestComponent = /** @class */ (function () {
function EditorTestComponent(_renderer, _elementRef) {
this._renderer = _renderer;
this._elementRef = _elementRef;
this.ie = false;
this.valueTemp = false;
this.valueChanged = false;
this.height = 0;
this.datepickerInputClass = 'true-grid-input';
this._initialized = false;
this.commit = new EventEmitter();
this.change = new EventEmitter();
this.cancel = new EventEmitter();
}
Object.defineProperty(EditorTestComponent.prototype, "popupVisible", {
get: function () {
return this.popup.visible;
},
enumerable: true,
configurable: true
});
EditorTestComponent.prototype.getIcon = function () {
return 'true-icon-calendar-empty';
};
EditorTestComponent.prototype.datepickerChange = function (e) {
if (this._initialized) {
this.change.emit(this.purify(e));
}
};
EditorTestComponent.prototype.dateClick = function (e) {
this.inputChange(e);
this.popup.closePopup();
};
EditorTestComponent.prototype.togglePopup = function () {
var _this = this;
this.popup.toggle(this._elementRef.nativeElement, '');
setTimeout(function () {
if (_this.popupVisible) {
_this.focusPopup();
}
});
};
EditorTestComponent.prototype.btnClick = function (e) {
this.togglePopup();
};
EditorTestComponent.prototype.popupClose = function (e) {
var _this = this;
if (!Utils.detectMobile()) {
// We allow the user to set the focus on input.
this.input.nativeElement.focus();
setTimeout(function () {
var txt = _this.input.nativeElement.value;
if (txt !== undefined && _this._renderer) {
_this._renderer.setProperty(_this.input.nativeElement, 'selectionStart', 0);
_this._renderer.setProperty(_this.input.nativeElement, 'selectionEnd', txt.length);
}
});
}
};
EditorTestComponent.prototype.init = function (value, valueChanged, height, ie, wasShown) {
if (ie === void 0) { ie = false; }
if (wasShown === void 0) { wasShown = false; }
if (this.state.touchMode) {
this.popup.position = 'MODAL';
}
else {
this.popup.position = 'RELATIVE';
}
this.valueTemp = value;
this.valueChanged = valueChanged;
this.height = height;
this.ie = ie;
if (this.state.iOS) {
DOMUtils.focusAndOpenKeyboard(this.input.nativeElement, 50);
}
};
// Останавливаем propagation, чтобы не влиять на grid
EditorTestComponent.prototype.inputMouseDown = function (e) {
e.stopPropagation();
};
EditorTestComponent.prototype.inputChange = function (e) {
this.change.emit(e);
};
EditorTestComponent.prototype.inputKeyDown = function (e) {
if (e.defaultPrevented) {
return;
}
if (e.keyCode === Keys.DOWN && e.altKey && !this.popup.visible) {
this.togglePopup();
e.preventDefault();
e.stopPropagation();
return;
}
if (e.keyCode === Keys.UP ||
e.keyCode === Keys.DOWN ||
e.keyCode === Keys.PAGE_UP ||
e.keyCode === Keys.PAGE_DOWN ||
e.keyCode === Keys.TAB) {
// По идее просто их должен отработать грид
return;
}
e.stopPropagation();
if (e.keyCode === Keys.ESCAPE) {
this.cancel.emit();
return;
}
if (e.keyCode === Keys.ENTER) {
this.commit.emit(this.value);
return;
}
};
EditorTestComponent.prototype.escape = function (e) {
this.popup.closePopup();
};
EditorTestComponent.prototype.acceptKey = function (e) {
this.maskDateDirective.keyDown(Keys.generateEvent(this.input.nativeElement, -1, Keys.keyChar(e), e.shiftKey, e.ctrlKey));
};
EditorTestComponent.prototype.ngAfterContentInit = function () {
var _this = this;
if (!this.valueChanged) {
this.value = this.valueTemp;
// The pattern hasn't applied yet.
this.maskDateDirective.pattern = this.column.format;
this.maskDateDirective.writeValue(this.value);
setTimeout(function () {
if (!_this.state.touchMode) {
// Select all if not mobile device
_this.input.nativeElement.select();
}
_this.input.nativeElement.focus();
});
this._initialized = true;
}
else {
this.input.nativeElement.focus();
var txt_1 = this.valueTemp;
setTimeout(function () {
for (var i = 0; i < txt_1.length; i++) {
var e = Keys.generateEvent(null, 0, txt_1[i]);
_this.acceptKey(e);
}
_this._initialized = true;
});
}
};
EditorTestComponent.prototype.focusPopup = function () {
this.calendar.setFocus();
};
// Если у нас есть информация о высоте строки - берем её и не
// назначаем никакого класса
EditorTestComponent.prototype.getClass = function () {
if ((this.height !== null && this.height > 0)) {
return 'true-grid__input-container';
}
if (this.ie) {
return 'true-grid-editor-ie';
}
else {
return 'true-grid-editor-100p';
}
};
EditorTestComponent.prototype.getH = function () {
if (this.height !== null && this.height > 0) {
return this.height + 'px';
}
return '100%';
};
EditorTestComponent.prototype.purify = function (v) {
if (v === undefined || v === null || isNaN(v.getTime())) {
return null;
}
return v;
};
tslib_1.__decorate([
ViewChild('popup', { static: true }),
tslib_1.__metadata("design:type", PopupComponent)
], EditorTestComponent.prototype, "popup", void 0);
tslib_1.__decorate([
ViewChild('input', { static: true }),
tslib_1.__metadata("design:type", Object)
], EditorTestComponent.prototype, "input", void 0);
tslib_1.__decorate([
ViewChild('calendar', { static: true }),
tslib_1.__metadata("design:type", CalendarComponent)
], EditorTestComponent.prototype, "calendar", void 0);
tslib_1.__decorate([
ViewChild('input', { read: MaskDateDirective, static: true }),
tslib_1.__metadata("design:type", MaskDateDirective)
], EditorTestComponent.prototype, "maskDateDirective", void 0);
tslib_1.__decorate([
Output("commit"),
tslib_1.__metadata("design:type", EventEmitter)
], EditorTestComponent.prototype, "commit", void 0);
tslib_1.__decorate([
Output("change"),
tslib_1.__metadata("design:type", EventEmitter)
], EditorTestComponent.prototype, "change", void 0);
tslib_1.__decorate([
Output("cancel"),
tslib_1.__metadata("design:type", EventEmitter)
], EditorTestComponent.prototype, "cancel", void 0);
EditorTestComponent = tslib_1.__decorate([
Component({
selector: 'true-editor-test',
template: "<true-input-wrapper\n class=\"true-datepicker__input\"\n (btnClick)=\"btnClick($event)\"\n [ngClass]=\"getClass()\"\n [style.height]=\"getH()\"\n [icon]=\"getIcon()\"><input #input\n class=\"true-grid-input\"\n [true-mask-date]=\"column.format\"\n [(ngModel)]=\"value\"\n (ngModelChange)=\"inputChange($event)\"\n [style.height]=\"getH()\"\n (mousedown)=\"inputMouseDown($event)\"\n (keydown)=\"inputKeyDown($event)\" /></true-input-wrapper><true-popup #popup (close)=\"popupClose($event)\">\n <true-calendar #calendar\n *ngIf=\"popupVisible\"\n [(ngModel)]=\"value\"\n (escape)=\"escape($event)\"\n (dateClick)=\"dateClick($event)\">\n </true-calendar>\n </true-popup>",
styles: ["\n :host {\n padding: 0;\n }\n .true-datepicker__input {\n border: 0;\n }\n "]
}),
tslib_1.__metadata("design:paramtypes", [Renderer2,
ElementRef])
], EditorTestComponent);
return EditorTestComponent;
}());
export { EditorTestComponent };
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZWRpdG9yLXRlc3QuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6Im5nOi8vQHRydWUtZGlyZWN0aXZlL2dyaWQvIiwic291cmNlcyI6WyJzcmMvZWRpdG9ycy9lZGl0b3ItdGVzdC5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBOzs7O0VBSUU7QUFDRixPQUFPLEVBQUUsU0FBUyxFQUFTLE1BQU0sRUFBRSxZQUFZLEVBQUUsU0FBUyxFQUFFLFVBQVUsRUFDN0QsU0FBUyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBRzFDLE9BQU8sRUFBRSxJQUFJLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUM1QyxPQUFPLEVBQUUsS0FBSyxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFFN0MsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sZ0NBQWdDLENBQUM7QUFDbkUsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLDZCQUE2QixDQUFDO0FBQzdELE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFPLDZCQUE2QixDQUFDO0FBSWpFLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQWlDckQ7SUFzTkUsNkJBQXNCLFNBQW9CLEVBQ3BCLFdBQXVCO1FBRHZCLGNBQVMsR0FBVCxTQUFTLENBQVc7UUFDcEIsZ0JBQVcsR0FBWCxXQUFXLENBQVk7UUFyTnJDLE9BQUUsR0FBWSxLQUFLLENBQUM7UUFDcEIsY0FBUyxHQUFRLEtBQUssQ0FBQztRQUN2QixpQkFBWSxHQUFZLEtBQUssQ0FBQztRQUM5QixXQUFNLEdBQVcsQ0FBQyxDQUFDO1FBRzNCLHlCQUFvQixHQUFHLGlCQUFpQixDQUFDO1FBTWpDLGlCQUFZLEdBQUcsS0FBSyxDQUFDO1FBZTdCLFdBQU0sR0FBeUIsSUFBSSxZQUFZLEVBQUUsQ0FBQztRQUdsRCxXQUFNLEdBQXNCLElBQUksWUFBWSxFQUFFLENBQUM7UUFHL0MsV0FBTSxHQUF1QixJQUFJLFlBQVksRUFBRSxDQUFDO0lBb0xD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LENBQUMsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxFQUFFO1lBQ3ZELE9BQU8sSUFBSSxDQUFDO1NBQ2I7UUFDRCxPQUFPLENBQUMsQ0FBQztJQUNYLENBQUM7SUFuTUQ7UUFEQyxTQUFTLENBQUMsT0FBTyxFQUFFLEVBQUMsTUFBTSxFQUFFLElBQUksRUFBQyxDQUFDOzBDQUM1QixjQUFjO3NEQUFDO0lBR3RCO1FBREMsU0FBUyxDQUFDLE9BQU8sRUFBRSxFQUFDLE1BQU0sRUFBRSxJQUFJLEVBQUMsQ0FBQzs7c0RBQ3hCO0lBR1g7UUFEQyxTQUFTLENBQUMsVUFBVSxFQUFFLEVBQUMsTUFBTSxFQUFFLElBQUksRUFBQyxDQUFDOzBDQUM1QixpQkFBaUI7eURBQUM7SUFHNUI7UUFEQyxTQUFTLENBQUMsT0FBTyxFQUFFLEVBQUMsSUFBSSxFQUFFLGlCQUFpQixFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUMsQ0FBQzswQ0FDekMsaUJBQWlCO2tFQUFDO0lBR3JDO1FBREMsTUFBTSxDQUFDLFFBQVEsQ0FBQzswQ0FDVCxZQUFZO3VEQUE4QjtJQUdsRDtRQURDLE1BQU0sQ0FBQyxRQUFRLENBQUM7MENBQ1QsWUFBWTt1REFBMkI7SUFHL0M7UUFEQyxNQUFNLENBQUMsUUFBUSxDQUFDOzBDQUNULFlBQVk7dURBQTRCO0lBbkNyQyxtQkFBbUI7UUEvQi9CLFNBQVMsQ0FBQztZQUNULFFBQVEsRUFBRSxrQkFBa0I7WUFDNUIsUUFBUSxFQUFFLHc3QkFtQm9CO3FCQUNyQix1R0FPTjtTQUNGLENBQUM7aURBdU4rQixTQUFTO1lBQ1AsVUFBVTtPQXZObEMsbUJBQW1CLENBd04vQjtJQUFELDBCQUFDO0NBQUEsQUF4TkQsSUF3TkM7U0F4TlksbUJBQW1CIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXHJcbiAqIENvcHlyaWdodCAoYykgMjAxOC0yMDE5IEFsZWtzZXkgTWVsbmlrb3YsIFRydWUgRGlyZWN0aXZlIENvbXBhbnkuXHJcbiAqIEBsaW5rIGh0dHBzOi8vdHJ1ZWRpcmVjdGl2ZS5jb20vXHJcbiAqIEBsaWNlbnNlIE1JVFxyXG4qL1xyXG5pbXBvcnQgeyBDb21wb25lbnQsIElucHV0LCBPdXRwdXQsIEV2ZW50RW1pdHRlciwgVmlld0NoaWxkLCBFbGVtZW50UmVmLFxyXG4gICAgICAgICBSZW5kZXJlcjIgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuXHJcbmltcG9ydCB7IENvbHVtbiB9IGZyb20gJ0B0cnVlLWRpcmVjdGl2ZS9iYXNlJztcclxuaW1wb3J0IHsgS2V5cyB9IGZyb20gJ0B0cnVlLWRpcmVjdGl2ZS9iYXNlJztcclxuaW1wb3J0IHsgVXRpbHMgfSBmcm9tICdAdHJ1ZS1kaXJlY3RpdmUvYmFzZSc7XHJcblxyXG5pbXBvcnQgeyBDYWxlbmRhckNvbXBvbmVudCB9IGZyb20gJy4uL2NvbnRyb2xzL2NhbGVuZGFyLmNvbXBvbmVudCc7XHJcbmltcG9ydCB7IFBvcHVwQ29tcG9uZW50IH0gZnJvbSAnLi4vY29udHJvbHMvcG9wdXAuY29tcG9uZW50JztcclxuaW1wb3J0IHsgTWFza0RhdGVEaXJlY3RpdmUgfSBmcm9tICAnLi4vbWFzay9tYXNrLWRhdGUuZGlyZWN0aXZlJztcclxuXHJcbmltcG9ydCB7IEdyaWRTdGF0ZVNlcnZpY2UgfSBmcm9tICcuLi9ncmlkLXN0YXRlLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBJRWRpdG9yIH0gZnJvbSBcIi4vZWRpdG9yLmludGVyZmFjZVwiO1xyXG5pbXBvcnQgeyBET01VdGlscyB9IGZyb20gJy4uL2NvbW1vbi9kb20tdXRpbHMuY2xhc3MnO1xyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgc2VsZWN0b3I6ICd0cnVlLWVkaXRvci10ZXN0JyxcclxuICB0ZW1wbGF0ZTogYDx0cnVlLWlucHV0LXdyYXBwZXJcclxuICAgIGNsYXNzPVwidHJ1ZS1kYXRlcGlja2VyX19pbnB1dFwiXHJcbiAgICAoYnRuQ2xpY2spPVwiYnRuQ2xpY2soJGV2ZW50KVwiXHJcbiAgICBbbmdDbGFzc109XCJnZXRDbGFzcygpXCJcclxuICAgIFtzdHlsZS5oZWlnaHRdPVwiZ2V0SCgpXCJcclxuICAgIFtpY29uXT1cImdldEljb24oKVwiPjxpbnB1dCAjaW5wdXRcclxuICAgICAgICAgICAgICAgICAgY2xhc3M9XCJ0cnVlLWdyaWQtaW5wdXRcIlxyXG4gICAgICAgICAgICAgICAgICBbdHJ1ZS1tYXNrLWRhdGVdPVwiY29sdW1uLmZvcm1hdFwiXHJcbiAgICAgICAgICAgICAgICAgIFsobmdNb2RlbCldPVwidmFsdWVcIlxyXG4gICAgICAgICAgICAgICAgICAobmdNb2RlbENoYW5nZSk9XCJpbnB1dENoYW5nZSgkZXZlbnQpXCJcclxuICAgICAgICAgICAgICAgICAgW3N0eWxlLmhlaWdodF09XCJnZXRIKClcIlxyXG4gICAgICAgICAgICAgICAgICAobW91c2Vkb3duKT1cImlucHV0TW91c2VEb3duKCRldmVudClcIlxyXG4gICAgICAgICAgICAgICAgICAoa2V5ZG93bik9XCJpbnB1dEtleURvd24oJGV2ZW50KVwiIC8+PC90cnVlLWlucHV0LXdyYXBwZXI+PHRydWUtcG9wdXAgI3BvcHVwIChjbG9zZSk9XCJwb3B1cENsb3NlKCRldmVudClcIj5cclxuICAgICAgICAgICAgICAgICAgICA8dHJ1ZS1jYWxlbmRhciAjY2FsZW5kYXJcclxuICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJwb3B1cFZpc2libGVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBbKG5nTW9kZWwpXT1cInZhbHVlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgKGVzY2FwZSk9XCJlc2NhcGUoJGV2ZW50KVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIChkYXRlQ2xpY2spPVwiZGF0ZUNsaWNrKCRldmVudClcIj5cclxuICAgICAgICAgICAgICAgICAgICA8L3RydWUtY2FsZW5kYXI+XHJcbiAgICAgICAgICAgICAgICAgIDwvdHJ1ZS1wb3B1cD5gLFxyXG4gIHN0eWxlczogW2BcclxuICAgIDpob3N0IHtcclxuICAgICAgcGFkZGluZzogMDtcclxuICAgIH1cclxuICAgIC50cnVlLWRhdGVwaWNrZXJfX2lucHV0IHtcclxuICAgICAgYm9yZGVyOiAwO1xyXG4gICAgfVxyXG4gICAgYF1cclxuICB9KVxyXG5leHBvcnQgY2xhc3MgRWRpdG9yVGVzdENvbXBvbmVudCBpbXBsZW1lbnRzIElFZGl0b3Ige1xyXG5cclxuICBwcml2YXRlIGllOiBib29sZWFuID0gZmFsc2U7XHJcbiAgcHJpdmF0ZSB2YWx1ZVRlbXA6IGFueSA9IGZhbHNlO1xyXG4gIHByaXZhdGUgdmFsdWVDaGFuZ2VkOiBib29sZWFuID0gZmFsc2U7XHJcbiAgcHJpdmF0ZSBoZWlnaHQ6IG51bWJlciA9IDA7XHJcblxyXG4gIHB1YmxpYyB2YWx1ZTogYW55O1xyXG4gIGRhdGVwaWNrZXJJbnB1dENsYXNzID0gJ3RydWUtZ3JpZC1pbnB1dCc7XHJcblxyXG4gIHN0YXRlOiBHcmlkU3RhdGVTZXJ2aWNlO1xyXG4gIGNvbHVtbjogQ29sdW1uO1xyXG4gIHJvdzogYW55O1xyXG5cclxuICBwcml2YXRlIF9pbml0aWFsaXplZCA9IGZhbHNlO1xyXG5cclxuICBAVmlld0NoaWxkKCdwb3B1cCcsIHtzdGF0aWM6IHRydWV9KVxyXG4gIHBvcHVwOiBQb3B1cENvbXBvbmVudDtcclxuXHJcbiAgQFZpZXdDaGlsZCgnaW5wdXQnLCB7c3RhdGljOiB0cnVlfSlcclxuICBpbnB1dDogYW55O1xyXG5cclxuICBAVmlld0NoaWxkKCdjYWxlbmRhcicsIHtzdGF0aWM6IHRydWV9KVxyXG4gIGNhbGVuZGFyOiBDYWxlbmRhckNvbXBvbmVudDtcclxuXHJcbiAgQFZpZXdDaGlsZCgnaW5wdXQnLCB7cmVhZDogTWFza0RhdGVEaXJlY3RpdmUsIHN0YXRpYzogdHJ1ZX0pXHJcbiAgbWFza0RhdGVEaXJlY3RpdmU6IE1hc2tEYXRlRGlyZWN0aXZlO1xyXG5cclxuICBAT3V0cHV0KFwiY29tbWl0XCIpXHJcbiAgY29tbWl0OiBFdmVudEVtaXR0ZXI8c3RyaW5nPiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcclxuXHJcbiAgQE91dHB1dChcImNoYW5nZVwiKVxyXG4gIGNoYW5nZTogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XHJcblxyXG4gIEBPdXRwdXQoXCJjYW5jZWxcIilcclxuICBjYW5jZWw6IEV2ZW50RW1pdHRlcjx2b2lkPiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcclxuXHJcbiAgZ2V0IHBvcHVwVmlzaWJsZSgpIHtcclxuICAgIHJldHVybiB0aGlzLnBvcHVwLnZpc2libGU7XHJcbiAgfVxyXG5cclxuICBnZXRJY29uKCk6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gJ3RydWUtaWNvbi1jYWxlbmRhci1lbXB0eSc7XHJcbiAgfVxyXG5cclxuICBkYXRlcGlja2VyQ2hhbmdlKGU6IGFueSkge1xyXG4gICAgaWYgKHRoaXMuX2luaXRpYWxpemVkKSB7XHJcbiAgICAgIHRoaXMuY2hhbmdlLmVtaXQodGhpcy5wdXJpZnkoZSkpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgZGF0ZUNsaWNrKGU6IGFueSkge1xyXG4gICAgdGhpcy5pbnB1dENoYW5nZShlKTtcclxuICAgIHRoaXMucG9wdXAuY2xvc2VQb3B1cCgpO1xyXG4gIH1cclxuXHJcbiAgdG9nZ2xlUG9wdXAoKSB7XHJcbiAgICB0aGlzLnBvcHVwLnRvZ2dsZSh0aGlzLl9lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQsICcnKTtcclxuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICBpZiAodGhpcy5wb3B1cFZpc2libGUpIHtcclxuICAgICAgICB0aGlzLmZvY3VzUG9wdXAoKTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBidG5DbGljayhlOiBhbnkpIHtcclxuICAgIHRoaXMudG9nZ2xlUG9wdXAoKTtcclxuICB9XHJcblxyXG4gIHBvcHVwQ2xvc2UoZTogYW55KSB7XHJcblxyXG4gICAgaWYgKCFVdGlscy5kZXRlY3RNb2JpbGUoKSkge1xyXG4gICAgICAvLyBXZSBhbGxvdyB0aGUgdXNlciB0byBzZXQgdGhlIGZvY3VzIG9uIGlucHV0LlxyXG4gICAgICB0aGlzLmlucHV0Lm5hdGl2ZUVsZW1lbnQuZm9jdXMoKTtcclxuICAgICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgY29uc3QgdHh0ID0gdGhpcy5pbnB1dC5uYXRpdmVFbGVtZW50LnZhbHVlO1xyXG4gICAgICAgIGlmICh0eHQgIT09IHVuZGVmaW5lZCAmJiB0aGlzLl9yZW5kZXJlcikge1xyXG4gICAgICAgICAgdGhpcy5fcmVuZGVyZXIuc2V0UHJvcGVydHkodGhpcy5pbnB1dC5uYXRpdmVFbGVtZW50LCAnc2VsZWN0aW9uU3RhcnQnLCAwKTtcclxuICAgICAgICAgIHRoaXMuX3JlbmRlcmVyLnNldFByb3BlcnR5KHRoaXMuaW5wdXQubmF0aXZlRWxlbWVudCwgJ3NlbGVjdGlvbkVuZCcsIHR4dC5sZW5ndGgpO1xyXG4gICAgICAgIH1cclxuICAgICAgfSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBpbml0KHZhbHVlOiBhbnksIHZhbHVlQ2hhbmdlZDogYm9vbGVhbiwgaGVpZ2h0OiBudW1iZXIsIGllOiBib29sZWFuID0gZmFsc2UsIHdhc1Nob3duOiBib29sZWFuID0gZmFsc2UpIHtcclxuXHJcbiAgICBpZiAodGhpcy5zdGF0ZS50b3VjaE1vZGUpIHtcclxuICAgICAgdGhpcy5wb3B1cC5wb3NpdGlvbiA9ICdNT0RBTCc7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLnBvcHVwLnBvc2l0aW9uID0gJ1JFTEFUSVZFJztcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLnZhbHVlVGVtcCA9IHZhbHVlO1xyXG4gICAgdGhpcy52YWx1ZUNoYW5nZWQgPSB2YWx1ZUNoYW5nZWQ7XHJcbiAgICB0aGlzLmhlaWdodCA9IGhlaWdodDtcclxuICAgIHRoaXMuaWUgPSBpZTtcclxuICAgIGlmICh0aGlzLnN0YXRlLmlPUykge1xyXG4gICAgICBET01VdGlscy5mb2N1c0FuZE9wZW5LZXlib2FyZCh0aGlzLmlucHV0Lm5hdGl2ZUVsZW1lbnQsIDUwKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vINCe0YHRgtCw0L3QsNCy0LvQuNCy0LDQtdC8IHByb3BhZ2F0aW9uLCDRh9GC0L7QsdGLINC90LUg0LLQu9C40Y/RgtGMINC90LAgZ3JpZFxyXG4gIGlucHV0TW91c2VEb3duKGU6IGFueSkge1xyXG4gICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcclxuICB9XHJcblxyXG4gIGlucHV0Q2hhbmdlKGU6IGFueSkge1xyXG4gICAgdGhpcy5jaGFuZ2UuZW1pdChlKTtcclxuICB9XHJcblxyXG4gIGlucHV0S2V5RG93bihlOiBhbnkpIHtcclxuXHJcbiAgICBpZiAoZS5kZWZhdWx0UHJldmVudGVkKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoZS5rZXlDb2RlID09PSBLZXlzLkRPV04gJiYgZS5hbHRLZXkgJiYgIXRoaXMucG9wdXAudmlzaWJsZSkge1xyXG4gICAgICB0aGlzLnRvZ2dsZVBvcHVwKCk7XHJcbiAgICAgIGUucHJldmVudERlZmF1bHQoKTtcclxuICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIGlmIChlLmtleUNvZGUgPT09IEtleXMuVVAgfHxcclxuICAgICAgICBlLmtleUNvZGUgPT09IEtleXMuRE9XTiB8fFxyXG4gICAgICAgIGUua2V5Q29kZSA9PT0gS2V5cy5QQUdFX1VQIHx8XHJcbiAgICAgICAgZS5rZXlDb2RlID09PSBLZXlzLlBBR0VfRE9XTiB8fFxyXG4gICAgICAgIGUua2V5Q29kZSA9PT0gS2V5cy5UQUIpIHtcclxuICAgICAgLy8g0J/QviDQuNC00LXQtSDQv9GA0L7RgdGC0L4g0LjRhSDQtNC+0LvQttC10L0g0L7RgtGA0LDQsdC+0YLQsNGC0Ywg0LPRgNC40LRcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XHJcblxyXG4gICAgaWYgKGUua2V5Q29kZSA9PT0gS2V5cy5FU0NBUEUpIHtcclxuICAgICAgdGhpcy5jYW5jZWwuZW1pdCgpO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKGUua2V5Q29kZSA9PT0gS2V5cy5FTlRFUikge1xyXG4gICAgICB0aGlzLmNvbW1pdC5lbWl0KHRoaXMudmFsdWUpO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBlc2NhcGUoZTogYW55KSB7XHJcbiAgICB0aGlzLnBvcHVwLmNsb3NlUG9wdXAoKTtcclxuICB9XHJcblxyXG4gIGFjY2VwdEtleShlOiBhbnkpIHtcclxuICAgIHRoaXMubWFza0RhdGVEaXJlY3RpdmUua2V5RG93bihcclxuICAgICAgS2V5cy5nZW5lcmF0ZUV2ZW50KHRoaXMuaW5wdXQubmF0aXZlRWxlbWVudCwgLTEsIEtleXMua2V5Q2hhcihlKSwgZS5zaGlmdEtleSwgZS5jdHJsS2V5KVxyXG4gICAgKTtcclxuICB9XHJcblxyXG4gIG5nQWZ0ZXJDb250ZW50SW5pdCgpIHtcclxuXHJcbiAgICBpZighdGhpcy52YWx1ZUNoYW5nZWQpIHtcclxuICAgICAgdGhpcy52YWx1ZSA9IHRoaXMudmFsdWVUZW1wO1xyXG4gICAgICAvLyBUaGUgcGF0dGVybiBoYXNuJ3QgYXBwbGllZCB5ZXQuXHJcbiAgICAgIHRoaXMubWFza0RhdGVEaXJlY3RpdmUucGF0dGVybiA9IHRoaXMuY29sdW1uLmZvcm1hdDtcclxuICAgICAgdGhpcy5tYXNrRGF0ZURpcmVjdGl2ZS53cml0ZVZhbHVlKHRoaXMudmFsdWUpO1xyXG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICBpZiAoIXRoaXMuc3RhdGUudG91Y2hNb2RlKSB7XHJcbiAgICAgICAgICAvLyBTZWxlY3QgYWxsIGlmIG5vdCBtb2JpbGUgZGV2aWNlXHJcbiAgICAgICAgICB0aGlzLmlucHV0Lm5hdGl2ZUVsZW1lbnQuc2VsZWN0KClcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5pbnB1dC5uYXRpdmVFbGVtZW50LmZvY3VzKCk7XHJcbiAgICAgIH0pO1xyXG4gICAgICB0aGlzLl9pbml0aWFsaXplZCA9IHRydWU7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLmlucHV0Lm5hdGl2ZUVsZW1lbnQuZm9jdXMoKTtcclxuICAgICAgY29uc3QgdHh0ID0gdGhpcy52YWx1ZVRlbXA7XHJcbiAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdHh0Lmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICBjb25zdCBlID0gS2V5cy5nZW5lcmF0ZUV2ZW50KG51bGwsIDAsIHR4dFtpXSk7XHJcbiAgICAgICAgICB0aGlzLmFjY2VwdEtleShlKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5faW5pdGlhbGl6ZWQgPSB0cnVlO1xyXG4gICAgICB9KTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGZvY3VzUG9wdXAoKSB7XHJcbiAgICB0aGlzLmNhbGVuZGFyLnNldEZvY3VzKCk7XHJcbiAgfVxyXG5cclxuICAvLyDQldGB0LvQuCDRgyDQvdCw0YEg0LXRgdGC0Ywg0LjQvdGE0L7RgNC80LDRhtC40Y8g0L4g0LLRi9GB0L7RgtC1INGB0YLRgNC+0LrQuCAtINCx0LXRgNC10Lwg0LXRkSDQuCDQvdC1XHJcbiAgLy8g0L3QsNC30L3QsNGH0LDQtdC8INC90LjQutCw0LrQvtCz0L4g0LrQu9Cw0YHRgdCwXHJcbiAgZ2V0Q2xhc3MoKSB7XHJcbiAgICBpZiAoKHRoaXMuaGVpZ2h0ICE9PSBudWxsICYmIHRoaXMuaGVpZ2h0ID4gMCkpIHtcclxuICAgICAgcmV0dXJuICd0cnVlLWdyaWRfX2lucHV0LWNvbnRhaW5lcic7XHJcbiAgICB9XHJcbiAgICBpZiAodGhpcy5pZSkge1xyXG4gICAgICByZXR1cm4gJ3RydWUtZ3JpZC1lZGl0b3ItaWUnO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgcmV0dXJuICd0cnVlLWdyaWQtZWRpdG9yLTEwMHAnO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgZ2V0SCgpIHtcclxuICAgIGlmICh0aGlzLmhlaWdodCAhPT0gbnVsbCAmJiB0aGlzLmhlaWdodCA+IDApIHtcclxuICAgICAgcmV0dXJuIHRoaXMuaGVpZ2h0ICsgJ3B4JztcclxuICAgIH1cclxuICAgIHJldHVybiAnMTAwJSc7XHJcbiAgfVxyXG5cclxuICBwcm90ZWN0ZWQgcHVyaWZ5KHY6IGFueSk6IGFueSB7XHJcbiAgICBpZiAodiA9PT0gdW5kZWZpbmVkIHx8IHYgPT09IG51bGwgfHwgaXNOYU4odi5nZXRUaW1lKCkpKSB7XHJcbiAgICAgIHJldHVybiBudWxsO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHY7XHJcbiAgfVxyXG5cclxuICBjb25zdHJ1Y3Rvcihwcm90ZWN0ZWQgX3JlbmRlcmVyOiBSZW5kZXJlcjIsXHJcbiAgICAgICAgICAgICAgcHJvdGVjdGVkIF9lbGVtZW50UmVmOiBFbGVtZW50UmVmKSB7IH1cclxufVxyXG4iXX0=