@true-directive/grid
Version:
Angular Data Grid from Yopsilon.
216 lines • 27.8 kB
JavaScript
import * as tslib_1 from "tslib";
/**
* Copyright (c) 2018-2019 Aleksey Melnikov, True Directive Company.
* @link https://truedirective.com/
* @license MIT
*/
import { Output, Directive, ElementRef, Renderer2, EventEmitter } from '@angular/core';
import { Mask } from '@true-directive/base';
import { Keys } from '@true-directive/base';
import { MaskSectionAction, MaskResult } from '@true-directive/base';
import { InternationalizationService } from '../internationalization/internationalization.service';
let MaskBaseDirective = class MaskBaseDirective {
constructor(_renderer, _elementRef, intl) {
this._renderer = _renderer;
this._elementRef = _elementRef;
this.intl = intl;
this._undo = [];
this._redo = [];
// Current text value
this._txtValue = '';
this._mask = new Mask();
this.android_behavior = false;
// On state change
this.stateChange = new EventEmitter();
this.maskValueChanged = new EventEmitter();
// Fetching mask state
this._state = null;
this._localeSubscription = this.intl.onLocaleChanged.subscribe(locale => this.setLocale(locale));
}
get state() {
return this._state;
}
set state(v) {
if (this._state !== v) {
this._state = v;
this.stateChange.emit(this._state); // Emitting event
}
}
updateState() {
//
}
processAndroid(txt) {
const res = this.currentRes();
// Possibly we have carriage position
const key = Keys.whichKeyHasBeenPressed(this.last_res.newValue, txt, this.last_res.selStart, res.selStart, this.last_res.selLength);
const r = this.processKey({
keyCode: -1,
key: key.code,
char: key.char,
shiftKey: false,
ctrlKey: false,
target: { selectionStart: this.last_res.selStart, selectionEnd: 0 },
preventDefault: (_) => { }
});
if (!r) {
this.setRes(this.last_res); // Reversing, value has not been accepted
}
this.android_behavior = false;
return;
}
doInput(txt) {
if (this.android_behavior) {
this.processAndroid(txt);
return;
}
// Thus we're trying to apply a mask to value entered
const masked = this._mask.applyMask(txt);
if (masked !== this._txtValue) {
this.setText(masked, true);
}
}
processKey(e) {
if (e.keyCode === 229 || e.keyCode === 0 || e.keyCode === undefined) {
// Android detected
this.android_behavior = true;
this.last_res = this.currentRes();
return;
}
let c = e.char;
if (c === undefined) {
c = e.key;
}
let selStart = e.target.selectionStart;
let selEnd = e.target.selectionEnd;
let s = this._txtValue;
if (Keys.isFunctional(e.keyCode)) {
return true;
}
if (e.keyCode === Keys.TAB || e.keyCode === Keys.ESCAPE) {
return true;
}
if (e.keyCode === Keys.HOME || e.keyCode === Keys.END) {
return true;
}
if (e.shiftKey && (e.keyCode === Keys.DELETE || e.keyCode === Keys.INSERT)) {
return true;
}
if (e.altKey && (e.keyCode === Keys.DOWN || e.keyCode === Keys.UP)) {
return true;
}
if (e.ctrlKey && e.keyCode === Keys.Z) {
// UNDO
const undoRes = this._undo.pop();
if (undoRes) {
this._redo.push(this.getRes(s, selStart, selEnd));
this.setRes(undoRes);
}
e.preventDefault();
return false;
}
if (e.ctrlKey && e.keyCode === Keys.Y) {
// REDO
const redoRes = this._redo.pop();
if (redoRes) {
this._undo.push(this.getRes(s, selStart, selEnd));
this.setRes(redoRes);
}
e.preventDefault();
return false;
}
// Остальные Ctrl+* нас не интересуют
if (e.ctrlKey) {
return true;
}
// If everything is selected
if (selStart === 0 && selEnd === this._txtValue.length) {
if (e.keyCode === Keys.DELETE || e.keyCode === Keys.BACKSPACE) {
return true;
}
// If ArrowLeft key has been pressed, result should equal to pressing of Home
if (e.keyCode === Keys.LEFT) {
return true;
}
if (e.keyCode === Keys.RIGHT) {
return true;
}
}
if (selStart === 0 && selEnd === this._txtValue.length) {
s = '';
selStart = 0;
selEnd = 0;
}
// Applying everything that's left
const res = this._mask.applyKeyAtPos(s, e.keyCode, c, selStart, selEnd);
if (res !== null && res.action === MaskSectionAction.APPLY) {
// If value has been changed we'll add it to UNDO stack
if (res.newValue !== s) {
this._undo.push(this.getRes(s, selStart, selEnd));
this._redo = [];
}
this.setRes(res);
if (this.android_behavior) {
return true;
}
e.preventDefault();
}
return false;
}
// Setting value and carriage position
setRes(res) {
if (this.android_behavior) {
res.selLength = 0;
}
this.setText(res.newValue);
this._renderer.setProperty(this._elementRef.nativeElement, 'selectionStart', res.selStart);
this._renderer.setProperty(this._elementRef.nativeElement, 'selectionEnd', res.selStart + res.selLength);
}
currentRes() {
const res = new MaskResult(this._txtValue, MaskSectionAction.APPLY, 0);
res.selStart = this._elementRef.nativeElement.selectionStart;
res.selLength = this._elementRef.nativeElement.selectionEnd - res.selStart;
return res;
}
// Retrieving current mask value and carriage position
getRes(s, selStart, selEnd) {
const res = new MaskResult(s, MaskSectionAction.APPLY, 0);
res.selStart = selStart;
res.selLength = selEnd - selStart;
return res;
}
// Following method should be overridden
toModel() {
}
// Writing a text to control
setText(displayedValue, toModel = true) {
// Displaying
this._txtValue = displayedValue;
this._renderer.setProperty(this._elementRef.nativeElement, 'value', this._txtValue);
// Sending to model
if (toModel) {
this.toModel();
}
}
setLocale(locale) {
this._mask.setLocale(locale);
}
ngOnDestroy() {
this._localeSubscription.unsubscribe();
}
};
tslib_1.__decorate([
Output('stateChange'),
tslib_1.__metadata("design:type", Object)
], MaskBaseDirective.prototype, "stateChange", void 0);
tslib_1.__decorate([
Output('maskValueChanged'),
tslib_1.__metadata("design:type", Object)
], MaskBaseDirective.prototype, "maskValueChanged", void 0);
MaskBaseDirective = tslib_1.__decorate([
Directive({
selector: 'true-mask-base'
}),
tslib_1.__metadata("design:paramtypes", [Renderer2, ElementRef, InternationalizationService])
], MaskBaseDirective);
export { MaskBaseDirective };
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWFzay1iYXNlLmRpcmVjdGl2ZS5qcyIsInNvdXJjZVJvb3QiOiJuZzovL0B0cnVlLWRpcmVjdGl2ZS9ncmlkLyIsInNvdXJjZXMiOlsic3JjL21hc2svbWFzay1iYXNlLmRpcmVjdGl2ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUE7Ozs7RUFJRTtBQUNGLE9BQU8sRUFBRSxNQUFNLEVBQUUsU0FBUyxFQUFFLFVBQVUsRUFBRSxTQUFTLEVBQUUsWUFBWSxFQUFhLE1BQU0sZUFBZSxDQUFDO0FBQ2xHLE9BQU8sRUFBRSxJQUFJLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUM1QyxPQUFPLEVBQUUsSUFBSSxFQUFXLE1BQU0sc0JBQXNCLENBQUM7QUFDckQsT0FBTyxFQUFFLGlCQUFpQixFQUFFLFVBQVUsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBSXJFLE9BQU8sRUFBRSwyQkFBMkIsRUFBRSxNQUFNLHNEQUFzRCxDQUFDO0FBTW5HLElBQWEsaUJBQWlCLEdBQTlCLE1BQWEsaUJBQWlCO0lBZ1AxQixZQUFzQixTQUFvQixFQUFZLFdBQXVCLEVBQVksSUFBaUM7UUFBcEcsY0FBUyxHQUFULFNBQVMsQ0FBVztRQUFZLGdCQUFXLEdBQVgsV0FBVyxDQUFZO1FBQVksU0FBSSxHQUFKLElBQUksQ0FBNkI7UUE5T2xILFVBQUssR0FBc0IsRUFBRSxDQUFDO1FBQzlCLFVBQUssR0FBc0IsRUFBRSxDQUFDO1FBRXRDLHFCQUFxQjtRQUNYLGNBQVMsR0FBRyxFQUFFLENBQUM7UUFDTixVQUFLLEdBQVMsSUFBSSxJQUFJLEVBQUUsQ0FBQztRQUlsQyxxQkFBZ0IsR0FBRyxLQUFLLENBQUM7UUFHbkMsa0JBQWtCO1FBRWxCLGdCQUFXLEdBQUcsSUFBSSxZQUFZLEVBQWEsQ0FBQztRQUc1QyxxQkFBZ0IsR0FBRyxJQUFJLFlBQVksRUFBTyxDQUFDO1FBRTNDLHNCQUFzQjtRQUNkLFdBQU0sR0FBYyxJQUFJLENBQUM7UUEyTi9CLElBQUksQ0FBQyxtQkFBbUIsR0FB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LFNBQVMsR0FBRyxjQUFjLENBQUM7UUFDaEMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxhQUFhLEVBQUUsT0FBTyxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUVwRixtQkFBbUI7UUFDbkIsSUFBSSxPQUFPLEVBQUU7WUFDWCxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7U0FDaEI7SUFDSCxDQUFDO0lBRVMsU0FBUyxDQUFDLE1BQWM7UUFDaEMsSUFBSSxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDL0IsQ0FBQztJQUVELFdBQVc7UUFDVCxJQUFJLENBQUMsbUJBQW1CLENBQUMsV0FBVyxFQUFFLENBQUM7SUFDekMsQ0FBQztDQUtKLENBQUE7QUFuT0c7SUFEQyxNQUFNLENBQUMsYUFBYSxDQUFDOztzREFDc0I7QUFHNUM7SUFEQyxNQUFNLENBQUMsa0JBQWtCLENBQUM7OzJEQUNnQjtBQW5CbEMsaUJBQWlCO0lBSDdCLFNBQVMsQ0FBQztRQUNULFFBQVEsRUFBRSxnQkFBZ0I7S0FDM0IsQ0FBQzs2Q0FpUG1DLFNBQVMsRUFBeUIsVUFBVSxFQUFrQiwyQkFBMkI7R0FoUGpILGlCQUFpQixDQW1QN0I7U0FuUFksaUJBQWlCIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXHJcbiAqIENvcHlyaWdodCAoYykgMjAxOC0yMDE5IEFsZWtzZXkgTWVsbmlrb3YsIFRydWUgRGlyZWN0aXZlIENvbXBhbnkuXHJcbiAqIEBsaW5rIGh0dHBzOi8vdHJ1ZWRpcmVjdGl2ZS5jb20vXHJcbiAqIEBsaWNlbnNlIE1JVFxyXG4qL1xyXG5pbXBvcnQgeyBPdXRwdXQsIERpcmVjdGl2ZSwgRWxlbWVudFJlZiwgUmVuZGVyZXIyLCBFdmVudEVtaXR0ZXIsIE9uRGVzdHJveSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBNYXNrIH0gZnJvbSAnQHRydWUtZGlyZWN0aXZlL2Jhc2UnO1xyXG5pbXBvcnQgeyBLZXlzLCBLZXlJbmZvIH0gZnJvbSAnQHRydWUtZGlyZWN0aXZlL2Jhc2UnO1xyXG5pbXBvcnQgeyBNYXNrU2VjdGlvbkFjdGlvbiwgTWFza1Jlc3VsdCB9IGZyb20gJ0B0cnVlLWRpcmVjdGl2ZS9iYXNlJztcclxuaW1wb3J0IHsgTWFza1NldHRpbmdzIH0gZnJvbSAnQHRydWUtZGlyZWN0aXZlL2Jhc2UnO1xyXG5pbXBvcnQgeyBNYXNrU3RhdGUgfSBmcm9tICdAdHJ1ZS1kaXJlY3RpdmUvYmFzZSc7XHJcblxyXG5pbXBvcnQgeyBJbnRlcm5hdGlvbmFsaXphdGlvblNlcnZpY2UgfSBmcm9tICcuLi9pbnRlcm5hdGlvbmFsaXphdGlvbi9pbnRlcm5hdGlvbmFsaXphdGlvbi5zZXJ2aWNlJztcclxuaW1wb3J0IHsgTG9jYWxlIH0gZnJvbSAnQHRydWUtZGlyZWN0aXZlL2Jhc2UnO1xyXG5cclxuQERpcmVjdGl2ZSh7XHJcbiAgc2VsZWN0b3I6ICd0cnVlLW1hc2stYmFzZSdcclxufSlcclxuZXhwb3J0IGNsYXNzIE1hc2tCYXNlRGlyZWN0aXZlIGltcGxlbWVudHMgT25EZXN0cm95IHtcclxuXHJcbiAgICBwcml2YXRlIF91bmRvOiBBcnJheTxNYXNrUmVzdWx0PiA9IFtdO1xyXG4gICAgcHJpdmF0ZSBfcmVkbzogQXJyYXk8TWFza1Jlc3VsdD4gPSBbXTtcclxuXHJcbiAgICAvLyBDdXJyZW50IHRleHQgdmFsdWVcclxuICAgIHByb3RlY3RlZCBfdHh0VmFsdWUgPSAnJztcclxuICAgIHByb3RlY3RlZCByZWFkb25seSBfbWFzazogTWFzayA9IG5ldyBNYXNrKCk7XHJcblxyXG4gICAgcHJpdmF0ZSBfbG9jYWxlU3Vic2NyaXB0aW9uOiBhbnk7XHJcblxyXG4gICAgcHJvdGVjdGVkIGFuZHJvaWRfYmVoYXZpb3IgPSBmYWxzZTtcclxuICAgIHByb3RlY3RlZCBsYXN0X3JlczogTWFza1Jlc3VsdDtcclxuXHJcbiAgICAvLyBPbiBzdGF0ZSBjaGFuZ2VcclxuICAgIEBPdXRwdXQoJ3N0YXRlQ2hhbmdlJylcclxuICAgIHN0YXRlQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxNYXNrU3RhdGU+KCk7XHJcblxyXG4gICAgQE91dHB1dCgnbWFza1ZhbHVlQ2hhbmdlZCcpXHJcbiAgICBtYXNrVmFsdWVDaGFuZ2VkID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XHJcblxyXG4gICAgLy8gRmV0Y2hpbmcgbWFzayBzdGF0ZVxyXG4gICAgcHJpdmF0ZSBfc3RhdGU6IE1hc2tTdGF0ZSA9IG51bGw7XHJcblxyXG4gICAgcHVibGljIGdldCBzdGF0ZSgpOiBNYXNrU3RhdGUge1xyXG4gICAgICByZXR1cm4gdGhpcy5fc3RhdGU7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHNldCBzdGF0ZSh2OiBNYXNrU3RhdGUpIHtcclxuICAgICAgaWYgKHRoaXMuX3N0YXRlICE9PSB2KSB7XHJcbiAgICAgICAgdGhpcy5fc3RhdGUgPSB2O1xyXG4gICAgICAgIHRoaXMuc3RhdGVDaGFuZ2UuZW1pdCh0aGlzLl9zdGF0ZSk7IC8vIEVtaXR0aW5nIGV2ZW50XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwcm90ZWN0ZWQgdXBkYXRlU3RhdGUoKSB7XHJcbiAgICAgIC8vXHJcbiAgICB9XHJcblxyXG4gICAgcHJvdGVjdGVkIHByb2Nlc3NBbmRyb2lkKHR4dDogYW55KTogdm9pZCB7XHJcblxyXG4gICAgICBjb25zdCByZXMgPSB0aGlzLmN1cnJlbnRSZXMoKTtcclxuXHJcbiAgICAgIC8vIFBvc3NpYmx5IHdlIGhhdmUgY2FycmlhZ2UgcG9zaXRpb25cclxuICAgICAgY29uc3Qga2V5OiBLZXlJbmZvID0gS2V5cy53aGljaEtleUhhc0JlZW5QcmVzc2VkKHRoaXMubGFzdF9yZXMubmV3VmFsdWUsIHR4dCxcclxuICAgICAgICAgIHRoaXMubGFzdF9yZXMuc2VsU3RhcnQsIHJlcy5zZWxTdGFydCwgdGhpcy5sYXN0X3Jlcy5zZWxMZW5ndGgpO1xyXG5cclxuICAgICAgY29uc3QgciA9IHRoaXMucHJvY2Vzc0tleShcclxuICAgICAgICB7XHJcbiAgICAgICAgICBrZXlDb2RlOiAtMSxcclxuICAgICAgICAgIGtleToga2V5LmNvZGUsXHJcbiAgICAgICAgICBjaGFyOiBrZXkuY2hhcixcclxuICAgICAgICAgIHNoaWZ0S2V5OiBmYWxzZSxcclxuICAgICAgICAgIGN0cmxLZXk6IGZhbHNlLFxyXG4gICAgICAgICAgdGFyZ2V0OiB7IHNlbGVjdGlvblN0YXJ0OiB0aGlzLmxhc3RfcmVzLnNlbFN0YXJ0LCBzZWxlY3Rpb25FbmQ6IDAgfSxcclxuICAgICAgICAgIHByZXZlbnREZWZhdWx0OiAoXzogYW55KSA9PiB7fVxyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgaWYgKCFyKSB7XHJcbiAgICAgICAgdGhpcy5zZXRSZXModGhpcy5sYXN0X3Jlcyk7IC8vIFJldmVyc2luZywgdmFsdWUgaGFzIG5vdCBiZWVuIGFjY2VwdGVkXHJcbiAgICAgIH1cclxuXHJcbiAgICAgIHRoaXMuYW5kcm9pZF9iZWhhdmlvciA9IGZhbHNlO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgcHJvdGVjdGVkIGRvSW5wdXQodHh0OiBhbnkpIHtcclxuICAgICAgaWYgKHRoaXMuYW5kcm9pZF9iZWhhdmlvcikge1xyXG4gICAgICAgIHRoaXMucHJvY2Vzc0FuZHJvaWQodHh0KTtcclxuICAgICAgICByZXR1cm47XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIC8vIFRodXMgd2UncmUgdHJ5aW5nIHRvIGFwcGx5IGEgbWFzayB0byB2YWx1ZSBlbnRlcmVkXHJcbiAgICAgIGNvbnN0IG1hc2tlZCA9IHRoaXMuX21hc2suYXBwbHlNYXNrKHR4dCk7XHJcbiAgICAgIGlmIChtYXNrZWQgIT09IHRoaXMuX3R4dFZhbHVlKSB7XHJcbiAgICAgICAgdGhpcy5zZXRUZXh0KG1hc2tlZCwgdHJ1ZSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgcHJvY2Vzc0tleShlOiBhbnkpOiBib29sZWFuIHtcclxuXHJcbiAgICAgIGlmIChlLmtleUNvZGUgPT09IDIyOSB8fCBlLmtleUNvZGUgPT09IDAgfHwgZS5rZXlDb2RlID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAvLyBBbmRyb2lkIGRldGVjdGVkXHJcbiAgICAgICAgdGhpcy5hbmRyb2lkX2JlaGF2aW9yID0gdHJ1ZTtcclxuICAgICAgICB0aGlzLmxhc3RfcmVzID0gdGhpcy5jdXJyZW50UmVzKCk7XHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBsZXQgYzogc3RyaW5nID0gZS5jaGFyO1xyXG4gICAgICBpZiAoYyA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgYyA9IGUua2V5O1xyXG4gICAgICB9XHJcblxyXG4gICAgICBsZXQgc2VsU3RhcnQ6IG51bWJlciA9IGUudGFyZ2V0LnNlbGVjdGlvblN0YXJ0O1xyXG4gICAgICBsZXQgc2VsRW5kOiBudW1iZXIgPSBlLnRhcmdldC5zZWxlY3Rpb25FbmQ7XHJcbiAgICAgIGxldCBzID0gdGhpcy5fdHh0VmFsdWU7XHJcblxyXG4gICAgICBpZiAoS2V5cy5pc0Z1bmN0aW9uYWwoZS5rZXlDb2RlKSkge1xyXG4gICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBpZiAoZS5rZXlDb2RlID09PSBLZXlzLlRBQiB8fCBlLmtleUNvZGUgPT09IEtleXMuRVNDQVBFKSB7XHJcbiAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGlmIChlLmtleUNvZGUgPT09IEtleXMuSE9NRSB8fCBlLmtleUNvZGUgPT09IEtleXMuRU5EKSB7XHJcbiAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGlmIChlLnNoaWZ0S2V5ICYmIChlLmtleUNvZGUgPT09IEtleXMuREVMRVRFIHx8IGUua2V5Q29kZSA9PT0gS2V5cy5JTlNFUlQpKSB7XHJcbiAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGlmIChlLmFsdEtleSAmJiAoZS5rZXlDb2RlID09PSBLZXlzLkRPV04gfHwgZS5rZXlDb2RlID09PSBLZXlzLlVQKSkge1xyXG4gICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBpZiAoZS5jdHJsS2V5ICYmIGUua2V5Q29kZSA9PT0gS2V5cy5aKSB7XHJcbiAgICAgICAgLy8gVU5ET1xyXG4gICAgICAgIGNvbnN0IHVuZG9SZXMgPSB0aGlzLl91bmRvLnBvcCgpO1xyXG4gICAgICAgIGlmICh1bmRvUmVzKSB7XHJcbiAgICAgICAgICB0aGlzLl9yZWRvLnB1c2godGhpcy5nZXRSZXMocywgc2VsU3RhcnQsIHNlbEVuZCkpO1xyXG4gICAgICAgICAgdGhpcy5zZXRSZXModW5kb1Jlcyk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcclxuICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGlmIChlLmN0cmxLZXkgJiYgZS5rZXlDb2RlID09PSBLZXlzLlkpIHtcclxuICAgICAgICAvLyBSRURPXHJcbiAgICAgICAgY29uc3QgcmVkb1JlcyA9IHRoaXMuX3JlZG8ucG9wKCk7XHJcbiAgICAgICAgaWYgKHJlZG9SZXMpIHtcclxuICAgICAgICAgIHRoaXMuX3VuZG8ucHVzaCh0aGlzLmdldFJlcyhzLCBzZWxTdGFydCwgc2VsRW5kKSk7XHJcbiAgICAgICAgICB0aGlzLnNldFJlcyhyZWRvUmVzKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgfVxyXG5cclxuICAgICAgLy8g0J7RgdGC0LDQu9GM0L3Ri9C1IEN0cmwrKiDQvdCw0YEg0L3QtSDQuNC90YLQtdGA0LXRgdGD0Y7RglxyXG4gICAgICBpZiAoZS5jdHJsS2V5KSB7XHJcbiAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIC8vIElmIGV2ZXJ5dGhpbmcgaXMgc2VsZWN0ZWRcclxuICAgICAgaWYgKHNlbFN0YXJ0ID09PSAwICYmIHNlbEVuZCA9PT0gdGhpcy5fdHh0VmFsdWUubGVuZ3RoKSB7XHJcbiAgICAgICAgaWYgKGUua2V5Q29kZSA9PT0gS2V5cy5ERUxFVEUgfHwgZS5rZXlDb2RlID09PSBLZXlzLkJBQ0tTUEFDRSkge1xyXG4gICAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyBJZiBBcnJvd0xlZnQga2V5IGhhcyBiZWVuIHByZXNzZWQsIHJlc3VsdCBzaG91bGQgZXF1YWwgdG8gcHJlc3Npbmcgb2YgSG9tZVxyXG4gICAgICAgIGlmIChlLmtleUNvZGUgPT09IEtleXMuTEVGVCkge1xyXG4gICAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoZS5rZXlDb2RlID09PSBLZXlzLlJJR0hUKSB7XHJcbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGlmIChzZWxTdGFydCA9PT0gMCAmJiBzZWxFbmQgPT09IHRoaXMuX3R4dFZhbHVlLmxlbmd0aCkge1xyXG4gICAgICAgIHMgPSAnJztcclxuICAgICAgICBzZWxTdGFydCA9IDA7XHJcbiAgICAgICAgc2VsRW5kID0gMDtcclxuICAgICAgfVxyXG5cclxuICAgICAgLy8gQXBwbHlpbmcgZXZlcnl0aGluZyB0aGF0J3MgbGVmdFxyXG4gICAgICBjb25zdCByZXM6IE1hc2tSZXN1bHQgPSB0aGlzLl9tYXNrLmFwcGx5S2V5QXRQb3MocywgZS5rZXlDb2RlLCBjLCBzZWxTdGFydCwgc2VsRW5kKTtcclxuICAgICAgaWYgKHJlcyAhPT0gbnVsbCAmJiByZXMuYWN0aW9uID09PSBNYXNrU2VjdGlvbkFjdGlvbi5BUFBMWSkge1xyXG4gICAgICAgIC8vIElmIHZhbHVlIGhhcyBiZWVuIGNoYW5nZWQgd2UnbGwgYWRkIGl0IHRvIFVORE8gc3RhY2tcclxuICAgICAgICBpZiAocmVzLm5ld1ZhbHVlICE9PSBzKSB7XHJcbiAgICAgICAgICB0aGlzLl91bmRvLnB1c2godGhpcy5nZXRSZXMocywgc2VsU3RhcnQsIHNlbEVuZCkpO1xyXG4gICAgICAgICAgdGhpcy5fcmVkbyA9IFtdO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5zZXRSZXMocmVzKTtcclxuXHJcbiAgICAgICAgaWYgKHRoaXMuYW5kcm9pZF9iZWhhdmlvcikge1xyXG4gICAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH1cclxuXHJcbiAgICAvLyBTZXR0aW5nIHZhbHVlIGFuZCBjYXJyaWFnZSBwb3NpdGlvblxyXG4gICAgcHJvdGVjdGVkIHNldFJlcyhyZXM6IE1hc2tSZXN1bHQpIHtcclxuXHJcbiAgICAgIGlmICh0aGlzLmFuZHJvaWRfYmVoYXZpb3IpIHtcclxuICAgICAgICByZXMuc2VsTGVuZ3RoID0gMDtcclxuICAgICAgfVxyXG5cclxuICAgICAgdGhpcy5zZXRUZXh0KHJlcy5uZXdWYWx1ZSk7XHJcbiAgICAgIHRoaXMuX3JlbmRlcmVyLnNldFByb3BlcnR5KHRoaXMuX2VsZW1lbnRSZWYubmF0aXZlRWxlbWVudCwgJ3NlbGVjdGlvblN0YXJ0JywgcmVzLnNlbFN0YXJ0KTtcclxuICAgICAgdGhpcy5fcmVuZGVyZXIuc2V0UHJvcGVydHkodGhpcy5fZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LCAnc2VsZWN0aW9uRW5kJywgcmVzLnNlbFN0YXJ0ICsgcmVzLnNlbExlbmd0aCk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJvdGVjdGVkIGN1cnJlbnRSZXMoKSB7XHJcbiAgICAgIGNvbnN0IHJlcyA9IG5ldyBNYXNrUmVzdWx0KHRoaXMuX3R4dFZhbHVlLCBNYXNrU2VjdGlvbkFjdGlvbi5BUFBMWSwgMCk7XHJcbiAgICAgIHJlcy5zZWxTdGFydCA9IHRoaXMuX2VsZW1lbnRSZWYubmF0aXZlRWxlbWVudC5zZWxlY3Rpb25TdGFydDtcclxuICAgICAgcmVzLnNlbExlbmd0aCA9IHRoaXMuX2VsZW1lbnRSZWYubmF0aXZlRWxlbWVudC5zZWxlY3Rpb25FbmQgLSByZXMuc2VsU3RhcnQ7XHJcbiAgICAgIHJldHVybiByZXM7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gUmV0cmlldmluZyBjdXJyZW50IG1hc2sgdmFsdWUgYW5kIGNhcnJpYWdlIHBvc2l0aW9uXHJcbiAgICBwcm90ZWN0ZWQgZ2V0UmVzKHM6IHN0cmluZywgc2VsU3RhcnQ6IG51bWJlciwgc2VsRW5kOiBudW1iZXIpOiBNYXNrUmVzdWx0IHtcclxuICAgICAgY29uc3QgcmVzID0gbmV3IE1hc2tSZXN1bHQocywgTWFza1NlY3Rpb25BY3Rpb24uQVBQTFksIDApO1xyXG4gICAgICByZXMuc2VsU3RhcnQgPSBzZWxTdGFydDtcclxuICAgICAgcmVzLnNlbExlbmd0aCA9IHNlbEVuZCAtIHNlbFN0YXJ0O1xyXG4gICAgICByZXR1cm4gcmVzO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIEZvbGxvd2luZyBtZXRob2Qgc2hvdWxkIGJlIG92ZXJyaWRkZW5cclxuICAgIHByb3RlY3RlZCB0b01vZGVsKCk6IHZvaWQge1xyXG4gICAgICBcclxuICAgIH1cclxuXHJcbiAgICAvLyBXcml0aW5nIGEgdGV4dCB0byBjb250cm9sXHJcbiAgICBwcm90ZWN0ZWQgc2V0VGV4dChkaXNwbGF5ZWRWYWx1ZTogc3RyaW5nLCB0b01vZGVsOiBib29sZWFuID0gdHJ1ZSkge1xyXG5cclxuICAgICAgLy8gRGlzcGxheWluZ1xyXG4gICAgICB0aGlzLl90eHRWYWx1ZSA9IGRpc3BsYXllZFZhbHVlO1xyXG4gICAgICB0aGlzLl9yZW5kZXJlci5zZXRQcm9wZXJ0eSh0aGlzLl9lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQsICd2YWx1ZScsIHRoaXMuX3R4dFZhbHVlKTtcclxuXHJcbiAgICAgIC8vIFNlbmRpbmcgdG8gbW9kZWxcclxuICAgICAgaWYgKHRvTW9kZWwpIHtcclxuICAgICAgICB0aGlzLnRvTW9kZWwoKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHByb3RlY3RlZCBzZXRMb2NhbGUobG9jYWxlOiBMb2NhbGUpIHtcclxuICAgICAgdGhpcy5fbWFzay5zZXRMb2NhbGUobG9jYWxlKTtcclxuICAgIH1cclxuXHJcbiAgICBuZ09uRGVzdHJveSgpIHtcclxuICAgICAgdGhpcy5fbG9jYWxlU3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3RydWN0b3IocHJvdGVjdGVkIF9yZW5kZXJlcjogUmVuZGVyZXIyLCBwcm90ZWN0ZWQgX2VsZW1lbnRSZWY6IEVsZW1lbnRSZWYsIHByb3RlY3RlZCBpbnRsOiBJbnRlcm5hdGlvbmFsaXphdGlvblNlcnZpY2UpIHtcclxuICAgICAgdGhpcy5fbG9jYWxlU3Vic2NyaXB0aW9uID0gdGhpcy5pbnRsLm9uTG9jYWxlQ2hhbmdlZC5zdWJzY3JpYmUobG9jYWxlID0+IHRoaXMuc2V0TG9jYWxlKGxvY2FsZSkpO1xyXG4gICAgfVxyXG59XHJcbiJdfQ==