angular-bootstrap-md
Version:
Bootstrap 4 & Angular 15 UI KIT - 700+ components, MIT license, simple installation.
206 lines • 27.1 kB
JavaScript
import { coerceBooleanProperty } from '@angular/cdk/coercion';
import { Directive, EventEmitter, HostListener, Input, Output, } from '@angular/core';
import * as i0 from "@angular/core";
var SortDirection;
(function (SortDirection) {
SortDirection["ASC"] = "ascending";
SortDirection["DESC"] = "descending";
SortDirection["CONST"] = "constant";
})(SortDirection || (SortDirection = {}));
export class MdbTableSortDirective {
constructor(el, renderer) {
this.el = el;
this.renderer = renderer;
this.data = [];
this.sortedInto = true;
this.order = SortDirection.CONST;
this.dataSource = [];
this._sortIcon = false;
this._resetSortDirection = false;
this.sortEnd = new EventEmitter();
this.sorted = new EventEmitter();
}
get sortIcon() {
return this._sortIcon;
}
set sortIcon(value) {
this._sortIcon = coerceBooleanProperty(value);
}
get resetSortDirection() {
return this._resetSortDirection;
}
set resetSortDirection(value) {
this._resetSortDirection = coerceBooleanProperty(value);
}
onclick() {
this.sortDataBy(this.trimWhiteSigns(this.sortBy.toString()));
this.sortEnd.emit(this.dataSource);
this.sorted.emit({
data: this.dataSource,
sortOrder: this.order,
sortBy: this.sortBy,
});
this.removeSort();
}
trimWhiteSigns(headElement) {
return headElement.replace(/ /g, '');
}
moveArrayItem(arr, oldIndex, newIndex) {
while (oldIndex < 0) {
oldIndex += arr.length;
}
while (newIndex < 0) {
newIndex += arr.length;
}
if (newIndex >= arr.length) {
let k = newIndex - arr.length;
while (k-- + 1) {
arr.push(null);
}
}
arr.splice(newIndex, 0, arr.splice(oldIndex, 1)[0]);
return arr;
}
sortDataBy(key) {
let ariaPass = true;
const setAria = (sort, id) => {
if (ariaPass) {
let nextSortType = '';
if (this.resetSortDirection) {
if (sort === SortDirection.CONST) {
nextSortType = SortDirection.DESC;
}
else if (sort === SortDirection.DESC) {
nextSortType = SortDirection.ASC;
}
else if (sort === SortDirection.ASC) {
nextSortType = SortDirection.CONST;
}
}
else {
if (sort === SortDirection.DESC) {
nextSortType = SortDirection.ASC;
}
else if (sort === SortDirection.ASC) {
nextSortType = SortDirection.DESC;
}
}
this.renderer.setAttribute(this.el.nativeElement, 'aria-sort', sort);
this.renderer.setAttribute(this.el.nativeElement, 'aria-label', `${id}: activate to sort column ${nextSortType}`);
ariaPass = false;
}
};
key = key.split('.');
if (this.resetSortDirection) {
const sortFn = (a, b) => {
a = a[key];
b = b[key];
return a > b ? -1 : 1;
};
if (this.order === SortDirection.CONST) {
setAria(SortDirection.DESC, key);
this.order = SortDirection.DESC;
this.dataSource.sort(sortFn);
}
else if (this.order === SortDirection.DESC) {
setAria(SortDirection.ASC, key);
this.order = SortDirection.ASC;
this.dataSource.sort(sortFn).reverse();
}
else if (this.order === SortDirection.ASC) {
setAria(SortDirection.CONST, key);
this.order = SortDirection.CONST;
this.data.map((el, index) => {
this.dataSource[index] = el;
});
}
}
else {
this.dataSource.sort((a, b) => {
let i = 0;
while (i < key.length) {
a = a[key[i]];
b = b[key[i]];
i++;
}
if (a < b) {
setAria(SortDirection.ASC, key);
this.order = SortDirection.ASC;
return this.sortedInto ? 1 : -1;
}
else if (a > b) {
setAria(SortDirection.DESC, key);
this.order = SortDirection.DESC;
return this.sortedInto ? -1 : 1;
}
else if (a == null || b == null) {
this.order = SortDirection.CONST;
return 1;
}
else {
this.order = SortDirection.CONST;
return 0;
}
});
this.sortedInto = !this.sortedInto;
}
}
ngOnInit() {
const key = this.trimWhiteSigns(this.sortBy.toString()).split('.');
this.renderer.setAttribute(this.el.nativeElement, 'aria-label', `${key}: activate to sort column descending`);
if (this.data.length === 0) {
// this.dataSource.map((element: any) => {
// this.data.push(element);
// })
this.data = Array.from(this.dataSource);
}
}
ngAfterViewInit() {
if (this.sortIcon) {
this.createIcon();
}
}
createIcon() {
// eslint-disable-next-line max-len
const iconUp = `<svg aria-hidden="true" focusable="false" data-prefix="fas" data-icon="arrow-up" class="svg-inline--fa fa-arrow-up fa-w-14 ascending" role="img" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 448 512"><path fill="currentColor" d="M34.9 289.5l-22.2-22.2c-9.4-9.4-9.4-24.6 0-33.9L207 39c9.4-9.4 24.6-9.4 33.9 0l194.3 194.3c9.4 9.4 9.4 24.6 0 33.9L413 289.4c-9.5 9.5-25 9.3-34.3-.4L264 168.6V456c0 13.3-10.7 24-24 24h-32c-13.3 0-24-10.7-24-24V168.6L69.2 289.1c-9.3 9.8-24.8 10-34.3.4z"></path></svg>`;
// eslint-disable-next-line max-len
const iconDown = `<svg aria-hidden="true" focusable="false" data-prefix="fas" data-icon="arrow-down" class="svg-inline--fa fa-arrow-down fa-w-14 descending" role="img" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 448 512"><path fill="currentColor" d="M413.1 222.5l22.2 22.2c9.4 9.4 9.4 24.6 0 33.9L241 473c-9.4 9.4-24.6 9.4-33.9 0L12.7 278.6c-9.4-9.4-9.4-24.6 0-33.9l22.2-22.2c9.5-9.5 25-9.3 34.3.4L184 343.4V56c0-13.3 10.7-24 24-24h32c13.3 0 24 10.7 24 24v287.4l114.8-120.5c9.3-9.8 24.8-10 34.3-.4z"></path></svg>`;
const title = this.el.nativeElement.innerHTML;
this.el.nativeElement.innerHTML = `${title} ${iconUp} ${iconDown}`;
}
removeSort() {
const nodes = this.el.nativeElement.parentElement.childNodes;
if (nodes) {
Array.from(nodes).map((node) => {
if (node !== this.el.nativeElement && node.nodeName !== '#comment') {
this.renderer.removeAttribute(node, 'aria-sort');
}
});
}
}
}
MdbTableSortDirective.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.1.1", ngImport: i0, type: MdbTableSortDirective, deps: [{ token: i0.ElementRef }, { token: i0.Renderer2 }], target: i0.ɵɵFactoryTarget.Directive });
MdbTableSortDirective.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "15.1.1", type: MdbTableSortDirective, selector: "[mdbTableSort]", inputs: { dataSource: ["mdbTableSort", "dataSource"], sortBy: "sortBy", sortIcon: "sortIcon", resetSortDirection: "resetSortDirection" }, outputs: { sortEnd: "sortEnd", sorted: "sorted" }, host: { listeners: { "click": "onclick()" } }, ngImport: i0 });
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.1.1", ngImport: i0, type: MdbTableSortDirective, decorators: [{
type: Directive,
args: [{
selector: '[mdbTableSort]',
}]
}], ctorParameters: function () { return [{ type: i0.ElementRef }, { type: i0.Renderer2 }]; }, propDecorators: { dataSource: [{
type: Input,
args: ['mdbTableSort']
}], sortBy: [{
type: Input
}], sortIcon: [{
type: Input
}], resetSortDirection: [{
type: Input
}], sortEnd: [{
type: Output
}], sorted: [{
type: Output
}], onclick: [{
type: HostListener,
args: ['click']
}] } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWRiLXRhYmxlLXNvcnQuZGlyZWN0aXZlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvYW5ndWxhci1ib290c3RyYXAtbWQvc3JjL2xpYi9mcmVlL3RhYmxlcy9kaXJlY3RpdmVzL21kYi10YWJsZS1zb3J0LmRpcmVjdGl2ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQWdCLHFCQUFxQixFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFDNUUsT0FBTyxFQUVMLFNBQVMsRUFFVCxZQUFZLEVBQ1osWUFBWSxFQUNaLEtBQUssRUFFTCxNQUFNLEdBRVAsTUFBTSxlQUFlLENBQUM7O0FBRXZCLElBQUssYUFJSjtBQUpELFdBQUssYUFBYTtJQUNoQixrQ0FBaUIsQ0FBQTtJQUNqQixvQ0FBbUIsQ0FBQTtJQUNuQixtQ0FBa0IsQ0FBQTtBQUNwQixDQUFDLEVBSkksYUFBYSxLQUFiLGFBQWEsUUFJakI7QUFXRCxNQUFNLE9BQU8scUJBQXFCO0lBNkJoQyxZQUFvQixFQUFjLEVBQVUsUUFBbUI7UUFBM0MsT0FBRSxHQUFGLEVBQUUsQ0FBWTtRQUFVLGFBQVEsR0FBUixRQUFRLENBQVc7UUE1Qi9ELFNBQUksR0FBVSxFQUFFLENBQUM7UUFDakIsZUFBVSxHQUFHLElBQUksQ0FBQztRQUNsQixVQUFLLEdBQWlFLGFBQWEsQ0FBQyxLQUFLLENBQUM7UUFFbkUsZUFBVSxHQUFlLEVBQUUsQ0FBQztRQVUzQyxjQUFTLEdBQUcsS0FBSyxDQUFDO1FBU2xCLHdCQUFtQixHQUFHLEtBQUssQ0FBQztRQUUxQixZQUFPLEdBQXdCLElBQUksWUFBWSxFQUFTLENBQUM7UUFDekQsV0FBTSxHQUE2QixJQUFJLFlBQVksRUFBYyxDQUFDO0lBRVYsQ0FBQztJQXJCbkUsSUFDSSxRQUFRO1FBQ1YsT0FBTyxJQUFJLENBQUMsU0FBUyxDQUFDO0lBQ3hCLENBQUM7SUFDRCxJQUFJLFFBQVEsQ0FBQyxLQUFt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O3NCQUFoQixNQUFNO2dCQUNHLE1BQU07c0JBQWYsTUFBTTtnQkFJZ0IsT0FBTztzQkFBN0IsWUFBWTt1QkFBQyxPQUFPIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQm9vbGVhbklucHV0LCBjb2VyY2VCb29sZWFuUHJvcGVydHkgfSBmcm9tICdAYW5ndWxhci9jZGsvY29lcmNpb24nO1xuaW1wb3J0IHtcbiAgQWZ0ZXJWaWV3SW5pdCxcbiAgRGlyZWN0aXZlLFxuICBFbGVtZW50UmVmLFxuICBFdmVudEVtaXR0ZXIsXG4gIEhvc3RMaXN0ZW5lcixcbiAgSW5wdXQsXG4gIE9uSW5pdCxcbiAgT3V0cHV0LFxuICBSZW5kZXJlcjIsXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuXG5lbnVtIFNvcnREaXJlY3Rpb24ge1xuICBBU0MgPSAnYXNjZW5kaW5nJyxcbiAgREVTQyA9ICdkZXNjZW5kaW5nJyxcbiAgQ09OU1QgPSAnY29uc3RhbnQnLFxufVxuXG5leHBvcnQgaW50ZXJmYWNlIFNvcnRlZERhdGEge1xuICBkYXRhOiBhbnlbXTtcbiAgc29ydE9yZGVyOiBzdHJpbmc7XG4gIHNvcnRCeTogc3RyaW5nO1xufVxuXG5ARGlyZWN0aXZlKHtcbiAgc2VsZWN0b3I6ICdbbWRiVGFibGVTb3J0XScsXG59KVxuZXhwb3J0IGNsYXNzIE1kYlRhYmxlU29ydERpcmVjdGl2ZSBpbXBsZW1lbnRzIE9uSW5pdCwgQWZ0ZXJWaWV3SW5pdCB7XG4gIGRhdGE6IGFueVtdID0gW107XG4gIHNvcnRlZEludG8gPSB0cnVlO1xuICBvcmRlcjogU29ydERpcmVjdGlvbi5BU0MgfCBTb3J0RGlyZWN0aW9uLkRFU0MgfCBTb3J0RGlyZWN0aW9uLkNPTlNUID0gU29ydERpcmVjdGlvbi5DT05TVDtcblxuICBASW5wdXQoJ21kYlRhYmxlU29ydCcpIGRhdGFTb3VyY2U6IEFycmF5PGFueT4gPSBbXTtcbiAgQElucHV0KCkgc29ydEJ5OiBzdHJpbmc7XG5cbiAgQElucHV0KClcbiAgZ2V0IHNvcnRJY29uKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl9zb3J0SWNvbjtcbiAgfVxuICBzZXQgc29ydEljb24odmFsdWU6IEJvb2xlYW5JbnB1dCkge1xuICAgIHRoaXMuX3NvcnRJY29uID0gY29lcmNlQm9vbGVhblByb3BlcnR5KHZhbHVlKTtcbiAgfVxuICBwcml2YXRlIF9zb3J0SWNvbiA9IGZhbHNlO1xuXG4gIEBJbnB1dCgpXG4gIGdldCByZXNldFNvcnREaXJlY3Rpb24oKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX3Jlc2V0U29ydERpcmVjdGlvbjtcbiAgfVxuICBzZXQgcmVzZXRTb3J0RGlyZWN0aW9uKHZhbHVlOiBCb29sZWFuSW5wdXQpIHtcbiAgICB0aGlzLl9yZXNldFNvcnREaXJlY3Rpb24gPSBjb2VyY2VCb29sZWFuUHJvcGVydHkodmFsdWUpO1xuICB9XG4gIHByaXZhdGUgX3Jlc2V0U29ydERpcmVjdGlvbiA9IGZhbHNlO1xuXG4gIEBPdXRwdXQoKSBzb3J0RW5kOiBFdmVudEVtaXR0ZXI8YW55W10+ID0gbmV3IEV2ZW50RW1pdHRlcjxhbnlbXT4oKTtcbiAgQE91dHB1dCgpIHNvcnRlZDogRXZlbnRFbWl0dGVyPFNvcnRlZERhdGE+ID0gbmV3IEV2ZW50RW1pdHRlcjxTb3J0ZWREYXRhPigpO1xuXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgZWw6IEVsZW1lbnRSZWYsIHByaXZhdGUgcmVuZGVyZXI6IFJlbmRlcmVyMikge31cblxuICBASG9zdExpc3RlbmVyKCdjbGljaycpIG9uY2xpY2soKSB7XG4gICAgdGhpcy5zb3J0RGF0YUJ5KHRoaXMudHJpbVdoaXRlU2lnbnModGhpcy5zb3J0QnkudG9TdHJpbmcoKSkpO1xuICAgIHRoaXMuc29ydEVuZC5lbWl0KHRoaXMuZGF0YVNvdXJjZSk7XG4gICAgdGhpcy5zb3J0ZWQuZW1pdCh7XG4gICAgICBkYXRhOiB0aGlzLmRhdGFTb3VyY2UsXG4gICAgICBzb3J0T3JkZXI6IHRoaXMub3JkZXIsXG4gICAgICBzb3J0Qnk6IHRoaXMuc29ydEJ5LFxuICAgIH0pO1xuXG4gICAgdGhpcy5yZW1vdmVTb3J0KCk7XG4gIH1cblxuICB0cmltV2hpdGVTaWducyhoZWFkRWxlbWVudDogYW55KTogc3RyaW5nIHtcbiAgICByZXR1cm4gaGVhZEVsZW1lbnQucmVwbGFjZSgvIC9nLCAnJyk7XG4gIH1cblxuICBwdWJsaWMgbW92ZUFycmF5SXRlbShhcnI6IGFueSwgb2xkSW5kZXg6IG51bWJlciwgbmV3SW5kZXg6IG51bWJlcikge1xuICAgIHdoaWxlIChvbGRJbmRleCA8IDApIHtcbiAgICAgIG9sZEluZGV4ICs9IGFyci5sZW5ndGg7XG4gICAgfVxuICAgIHdoaWxlIChuZXdJbmRleCA8IDApIHtcbiAgICAgIG5ld0luZGV4ICs9IGFyci5sZW5ndGg7XG4gICAgfVxuICAgIGlmIChuZXdJbmRleCA+PSBhcnIubGVuZ3RoKSB7XG4gICAgICBsZXQgayA9IG5ld0luZGV4IC0gYXJyLmxlbmd0aDtcbiAgICAgIHdoaWxlIChrLS0gKyAxKSB7XG4gICAgICAgIGFyci5wdXNoKG51bGwpO1xuICAgICAgfVxuICAgIH1cbiAgICBhcnIuc3BsaWNlKG5ld0luZGV4LCAwLCBhcnIuc3BsaWNlKG9sZEluZGV4LCAxKVswXSk7XG4gICAgcmV0dXJuIGFycjtcbiAgfVxuXG4gIHNvcnREYXRhQnkoa2V5OiBzdHJpbmcgfCBhbnkpIHtcbiAgICBsZXQgYXJpYVBhc3MgPSB0cnVlO1xuXG4gICAgY29uc3Qgc2V0QXJpYSA9IChcbiAgICAgIHNvcnQ6IFNvcnREaXJlY3Rpb24uQVNDIHwgU29ydERpcmVjdGlvbi5DT05TVCB8IFNvcnREaXJlY3Rpb24uREVTQyxcbiAgICAgIGlkOiBhbnlcbiAgICApID0+IHtcbiAgICAgIGlmIChhcmlhUGFzcykge1xuICAgICAgICBsZXQgbmV4dFNvcnRUeXBlID0gJyc7XG5cbiAgICAgICAgaWYgKHRoaXMucmVzZXRTb3J0RGlyZWN0aW9uKSB7XG4gICAgICAgICAgaWYgKHNvcnQgPT09IFNvcnREaXJlY3Rpb24uQ09OU1QpIHtcbiAgICAgICAgICAgIG5leHRTb3J0VHlwZSA9IFNvcnREaXJlY3Rpb24uREVTQztcbiAgICAgICAgICB9IGVsc2UgaWYgKHNvcnQgPT09IFNvcnREaXJlY3Rpb24uREVTQykge1xuICAgICAgICAgICAgbmV4dFNvcnRUeXBlID0gU29ydERpcmVjdGlvbi5BU0M7XG4gICAgICAgICAgfSBlbHNlIGlmIChzb3J0ID09PSBTb3J0RGlyZWN0aW9uLkFTQykge1xuICAgICAgICAgICAgbmV4dFNvcnRUeXBlID0gU29ydERpcmVjdGlvbi5DT05TVDtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgaWYgKHNvcnQgPT09IFNvcnREaXJlY3Rpb24uREVTQykge1xuICAgICAgICAgICAgbmV4dFNvcnRUeXBlID0gU29ydERpcmVjdGlvbi5BU0M7XG4gICAgICAgICAgfSBlbHNlIGlmIChzb3J0ID09PSBTb3J0RGlyZWN0aW9uLkFTQykge1xuICAgICAgICAgICAgbmV4dFNvcnRUeXBlID0gU29ydERpcmVjdGlvbi5ERVNDO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMucmVuZGVyZXIuc2V0QXR0cmlidXRlKHRoaXMuZWwubmF0aXZlRWxlbWVudCwgJ2FyaWEtc29ydCcsIHNvcnQpO1xuICAgICAgICB0aGlzLnJlbmRlcmVyLnNldEF0dHJpYnV0ZShcbiAgICAgICAgICB0aGlzLmVsLm5hdGl2ZUVsZW1lbnQsXG4gICAgICAgICAgJ2FyaWEtbGFiZWwnLFxuICAgICAgICAgIGAke2lkfTogYWN0aXZhdGUgdG8gc29ydCBjb2x1bW4gJHtuZXh0U29ydFR5cGV9YFxuICAgICAgICApO1xuICAgICAgICBhcmlhUGFzcyA9IGZhbHNlO1xuICAgICAgfVxuICAgIH07XG5cbiAgICBrZXkgPSBrZXkuc3BsaXQoJy4nKTtcblxuICAgIGlmICh0aGlzLnJlc2V0U29ydERpcmVjdGlvbikge1xuICAgICAgY29uc3Qgc29ydEZuID0gKGE6IGFueSwgYjogYW55KSA9PiB7XG4gICAgICAgIGEgPSBhW2tleV07XG4gICAgICAgIGIgPSBiW2tleV07XG5cbiAgICAgICAgcmV0dXJuIGEgPiBiID8gLTEgOiAxO1xuICAgICAgfTtcbiAgICAgIGlmICh0aGlzLm9yZGVyID09PSBTb3J0RGlyZWN0aW9uLkNPTlNUKSB7XG4gICAgICAgIHNldEFyaWEoU29ydERpcmVjdGlvbi5ERVNDLCBrZXkpO1xuICAgICAgICB0aGlzLm9yZGVyID0gU29ydERpcmVjdGlvbi5ERVNDO1xuICAgICAgICB0aGlzLmRhdGFTb3VyY2Uuc29ydChzb3J0Rm4pO1xuICAgICAgfSBlbHNlIGlmICh0aGlzLm9yZGVyID09PSBTb3J0RGlyZWN0aW9uLkRFU0MpIHtcbiAgICAgICAgc2V0QXJpYShTb3J0RGlyZWN0aW9uLkFTQywga2V5KTtcbiAgICAgICAgdGhpcy5vcmRlciA9IFNvcnREaXJlY3Rpb24uQVNDO1xuICAgICAgICB0aGlzLmRhdGFTb3VyY2Uuc29ydChzb3J0Rm4pLnJldmVyc2UoKTtcbiAgICAgIH0gZWxzZSBpZiAodGhpcy5vcmRlciA9PT0gU29ydERpcmVjdGlvbi5BU0MpIHtcbiAgICAgICAgc2V0QXJpYShTb3J0RGlyZWN0aW9uLkNPTlNULCBrZXkpO1xuICAgICAgICB0aGlzLm9yZGVyID0gU29ydERpcmVjdGlvbi5DT05TVDtcbiAgICAgICAgdGhpcy5kYXRhLm1hcCgoZWw6IGFueSwgaW5kZXg6IG51bWJlcikgPT4ge1xuICAgICAgICAgIHRoaXMuZGF0YVNvdXJjZVtpbmRleF0gPSBlbDtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuZGF0YVNvdXJjZS5zb3J0KChhOiBhbnksIGI6IGFueSkgPT4ge1xuICAgICAgICBsZXQgaSA9IDA7XG4gICAgICAgIHdoaWxlIChpIDwga2V5Lmxlbmd0aCkge1xuICAgICAgICAgIGEgPSBhW2tleVtpXV07XG4gICAgICAgICAgYiA9IGJba2V5W2ldXTtcbiAgICAgICAgICBpKys7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoYSA8IGIpIHtcbiAgICAgICAgICBzZXRBcmlhKFNvcnREaXJlY3Rpb24uQVNDLCBrZXkpO1xuICAgICAgICAgIHRoaXMub3JkZXIgPSBTb3J0RGlyZWN0aW9uLkFTQztcblxuICAgICAgICAgIHJldHVybiB0aGlzLnNvcnRlZEludG8gPyAxIDogLTE7XG4gICAgICAgIH0gZWxzZSBpZiAoYSA+IGIpIHtcbiAgICAgICAgICBzZXRBcmlhKFNvcnREaXJlY3Rpb24uREVTQywga2V5KTtcbiAgICAgICAgICB0aGlzLm9yZGVyID0gU29ydERpcmVjdGlvbi5ERVNDO1xuXG4gICAgICAgICAgcmV0dXJuIHRoaXMuc29ydGVkSW50byA/IC0xIDogMTtcbiAgICAgICAgfSBlbHNlIGlmIChhID09IG51bGwgfHwgYiA9PSBudWxsKSB7XG4gICAgICAgICAgdGhpcy5vcmRlciA9IFNvcnREaXJlY3Rpb24uQ09OU1Q7XG4gICAgICAgICAgcmV0dXJuIDE7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy5vcmRlciA9IFNvcnREaXJlY3Rpb24uQ09OU1Q7XG4gICAgICAgICAgcmV0dXJuIDA7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgICB0aGlzLnNvcnRlZEludG8gPSAhdGhpcy5zb3J0ZWRJbnRvO1xuICAgIH1cbiAgfVxuXG4gIG5nT25Jbml0KCkge1xuICAgIGNvbnN0IGtleSA9IHRoaXMudHJpbVdoaXRlU2lnbnModGhpcy5zb3J0QnkudG9TdHJpbmcoKSkuc3BsaXQoJy4nKTtcblxuICAgIHRoaXMucmVuZGVyZXIuc2V0QXR0cmlidXRlKFxuICAgICAgdGhpcy5lbC5uYXRpdmVFbGVtZW50LFxuICAgICAgJ2FyaWEtbGFiZWwnLFxuICAgICAgYCR7a2V5fTogYWN0aXZhdGUgdG8gc29ydCBjb2x1bW4gZGVzY2VuZGluZ2BcbiAgICApO1xuXG4gICAgaWYgKHRoaXMuZGF0YS5sZW5ndGggPT09IDApIHtcbiAgICAgIC8vIHRoaXMuZGF0YVNvdXJjZS5tYXAoKGVsZW1lbnQ6IGFueSkgPT4ge1xuICAgICAgLy8gICB0aGlzLmRhdGEucHVzaChlbGVtZW50KTtcbiAgICAgIC8vIH0pXG5cbiAgICAgIHRoaXMuZGF0YSA9IEFycmF5LmZyb20odGhpcy5kYXRhU291cmNlKTtcbiAgICB9XG4gIH1cblxuICBuZ0FmdGVyVmlld0luaXQoKSB7XG4gICAgaWYgKHRoaXMuc29ydEljb24pIHtcbiAgICAgIHRoaXMuY3JlYXRlSWNvbigpO1xuICAgIH1cbiAgfVxuXG4gIGNyZWF0ZUljb24oKSB7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG1heC1sZW5cbiAgICBjb25zdCBpY29uVXAgPSBgPHN2ZyBhcmlhLWhpZGRlbj1cInRydWVcIiBmb2N1c2FibGU9XCJmYWxzZVwiIGRhdGEtcHJlZml4PVwiZmFzXCIgZGF0YS1pY29uPVwiYXJyb3ctdXBcIiBjbGFzcz1cInN2Zy1pbmxpbmUtLWZhIGZhLWFycm93LXVwIGZhLXctMTQgYXNjZW5kaW5nXCIgcm9sZT1cImltZ1wiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB2aWV3Qm94PVwiMCAwIDQ0OCA1MTJcIj48cGF0aCBmaWxsPVwiY3VycmVudENvbG9yXCIgZD1cIk0zNC45IDI4OS41bC0yMi4yLTIyLjJjLTkuNC05LjQtOS40LTI0LjYgMC0zMy45TDIwNyAzOWM5LjQtOS40IDI0LjYtOS40IDMzLjkgMGwxOTQuMyAxOTQuM2M5LjQgOS40IDkuNCAyNC42IDAgMzMuOUw0MTMgMjg5LjRjLTkuNSA5LjUtMjUgOS4zLTM0LjMtLjRMMjY0IDE2OC42VjQ1NmMwIDEzLjMtMTAuNyAyNC0yNCAyNGgtMzJjLTEzLjMgMC0yNC0xMC43LTI0LTI0VjE2OC42TDY5LjIgMjg5LjFjLTkuMyA5LjgtMjQuOCAxMC0zNC4zLjR6XCI+PC9wYXRoPjwvc3ZnPmA7XG5cbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbWF4LWxlblxuICAgIGNvbnN0IGljb25Eb3duID0gYDxzdmcgYXJpYS1oaWRkZW49XCJ0cnVlXCIgZm9jdXNhYmxlPVwiZmFsc2VcIiBkYXRhLXByZWZpeD1cImZhc1wiIGRhdGEtaWNvbj1cImFycm93LWRvd25cIiBjbGFzcz1cInN2Zy1pbmxpbmUtLWZhIGZhLWFycm93LWRvd24gZmEtdy0xNCBkZXNjZW5kaW5nXCIgcm9sZT1cImltZ1wiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB2aWV3Qm94PVwiMCAwIDQ0OCA1MTJcIj48cGF0aCBmaWxsPVwiY3VycmVudENvbG9yXCIgZD1cIk00MTMuMSAyMjIuNWwyMi4yIDIyLjJjOS40IDkuNCA5LjQgMjQuNiAwIDMzLjlMMjQxIDQ3M2MtOS40IDkuNC0yNC42IDkuNC0zMy45IDBMMTIuNyAyNzguNmMtOS40LTkuNC05LjQtMjQuNiAwLTMzLjlsMjIuMi0yMi4yYzkuNS05LjUgMjUtOS4zIDM0LjMuNEwxODQgMzQzLjRWNTZjMC0xMy4zIDEwLjctMjQgMjQtMjRoMzJjMTMuMyAwIDI0IDEwLjcgMjQgMjR2Mjg3LjRsMTE0LjgtMTIwLjVjOS4zLTkuOCAyNC44LTEwIDM0LjMtLjR6XCI+PC9wYXRoPjwvc3ZnPmA7XG5cbiAgICBjb25zdCB0aXRsZSA9IHRoaXMuZWwubmF0aXZlRWxlbWVudC5pbm5lckhUTUw7XG4gICAgdGhpcy5lbC5uYXRpdmVFbGVtZW50LmlubmVySFRNTCA9IGAke3RpdGxlfSAke2ljb25VcH0gJHtpY29uRG93bn1gO1xuICB9XG5cbiAgcmVtb3ZlU29ydCgpIHtcbiAgICBjb25zdCBub2RlcyA9IHRoaXMuZWwubmF0aXZlRWxlbWVudC5wYXJlbnRFbGVtZW50LmNoaWxkTm9kZXM7XG4gICAgaWYgKG5vZGVzKSB7XG4gICAgICBBcnJheS5mcm9tKG5vZGVzKS5tYXAoKG5vZGU6IEhUTUxFbGVtZW50KSA9PiB7XG4gICAgICAgIGlmIChub2RlICE9PSB0aGlzLmVsLm5hdGl2ZUVsZW1lbnQgJiYgbm9kZS5ub2RlTmFtZSAhPT0gJyNjb21tZW50Jykge1xuICAgICAgICAgIHRoaXMucmVuZGVyZXIucmVtb3ZlQXR0cmlidXRlKG5vZGUsICdhcmlhLXNvcnQnKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuICB9XG59XG4iXX0=