angular-horizontal-scroll-table
Version:
angular-horizontal-scroll-table is A simple solution for horizontal scroll in any table.
182 lines • 24.4 kB
JavaScript
import { Directive, Input, HostListener } from '@angular/core';
import * as i0 from "@angular/core";
export class BassHorizontalScrollDirective {
constructor(el, renderer) {
this.el = el;
this.renderer = renderer;
this.fristtime = true;
this.onBodyscroll = () => {
if (this.z2table) {
const scrollFound = this.containerHasHorizontalScrollbar();
if (scrollFound) {
this.showOrHideScroll();
}
this.hideBodyScroll();
}
};
}
onScroll(e) {
this.changeScrollOfBarWrap(e.scrollLeft);
}
ngOnInit() {
setTimeout(() => {
this.inIt();
}, 1000);
}
ngOnChanges(changes) {
if (this.z2table) {
setTimeout(() => {
this.changes(changes);
}, 1000);
}
}
ngOnDestroy() {
window.removeEventListener('scroll', this.onBodyscroll, true);
}
inIt() {
this.z2tableinit();
this.addScrollBars();
// get event on body/window scroll
window.addEventListener('scroll', this.onBodyscroll, true);
this.addZ2ScrollEvents();
const scrollFound = this.containerHasHorizontalScrollbar();
if (scrollFound) {
this.showOrHideScroll();
}
this.hideBodyScroll();
}
changes(changes) {
if (changes.pageDestored) {
// // check if table in small or table in smaller than the window width
this.containerHasHorizontalScrollbar();
setTimeout(() => {
window.scroll({
top: 2,
left: 0,
behavior: 'smooth'
});
window.scroll({
top: 0,
left: 0,
behavior: 'smooth'
});
}, 1000);
}
else {
this.resizeZ2Table();
const scrollFound = this.containerHasHorizontalScrollbar();
if (scrollFound) {
this.showOrHideScroll();
}
}
}
containerHasHorizontalScrollbar() {
const hasHorizontalScrollbar = this.el.nativeElement.scrollWidth > this.el.nativeElement.clientWidth;
if (hasHorizontalScrollbar === false) {
this.scrollBarWrap.style.visibility = 'hidden';
return false;
}
else {
this.scrollBarWrap.style.visibility = 'visible';
return true;
}
}
resizeZ2Table() {
// tslint:disable-next-line:max-line-length
const scrollBarHeight = (window.innerWidth - document.documentElement.clientWidth) === 0 ? 17 : window.innerWidth - document.documentElement.clientWidth;
// resize z2table
const scrollBarContainerStyle = 'width: ' + (this.z2table.offsetWidth) + 'px;height: 1px';
this.scrollBarContainer.setAttribute('style', scrollBarContainerStyle);
// tslint:disable-next-line:max-line-length
const scrollBarWrapStyle = 'width: ' + (this.el.nativeElement.offsetWidth) + 'px;height:' + scrollBarHeight + 'px;position: fixed;overflow-x: scroll;visibility: visible;bottom: 0;z-index: 2;';
this.scrollBarWrap.setAttribute('style', scrollBarWrapStyle);
}
z2tableinit() {
this.z2table = document.querySelector('#' + this.tableId);
this.z2tableTHead = document.querySelector('#' + this.tableTHeadId);
this.z2tableTHeadTr = document.querySelector('#' + this.tableTHeadTrId);
this.el.nativeElement.classList.add('BassBarContainer');
this.el.nativeElement.style.overflow = 'auto';
this.hideBodyScroll();
if (!this.z2table) {
console.log('loooook table id not found..........');
}
if (!this.z2tableTHead) {
console.log('loooook table thead id not found..........');
}
if (!this.z2tableTHeadTr) {
console.log('loooook table thead tr not found..........');
}
}
addScrollBars() {
// add elements of scroll
this.scrollBarContainer = this.renderer.createElement('div');
this.scrollBarWrap = this.renderer.createElement('div');
this.scrollBarWrap.id = 'BassScrollBar';
this.resizeZ2Table();
}
showOrHideScroll() {
// get heigt of thead
const theadHeight = this.z2tableTHead.clientHeight;
const fixedNavbarHeight = theadHeight;
// Current container's top position
const bottomPosition = window.pageYOffset + window.innerHeight - theadHeight + fixedNavbarHeight;
// Detect Current container's top is in the table scope
if (this.z2table.offsetTop - 1 <= bottomPosition && (this.z2table.offsetTop + this.z2table.clientHeight - 1) >= bottomPosition) {
this.scrollBarWrap.style.visibility = 'visible';
}
else {
this.scrollBarWrap.style.visibility = 'hidden';
}
}
addZ2ScrollEvents() {
// tslint:disable-next-line:max-line-length
if (this.z2table) {
// add events on elements
this.scrollBarWrap.onscroll = (e) => {
this.changeScrollOfContainer(e.target.scrollLeft);
};
// add elements beyond table
this.renderer.appendChild(this.scrollBarWrap, this.scrollBarContainer);
this.renderer.appendChild(this.el.nativeElement, this.scrollBarWrap);
}
}
// change Scroll Of container when BarWrap scroll move
changeScrollOfContainer(leftPosition) {
this.el.nativeElement.scrollLeft = leftPosition;
this.z2tableTHead.scrollLeft = leftPosition;
}
// change Scroll Of BarWrap when container scroll move
changeScrollOfBarWrap(leftPosition) {
this.scrollBarWrap.scrollLeft = leftPosition;
this.z2tableTHead.scrollLeft = leftPosition;
}
hideBodyScroll() {
const bodyEl = document.getElementsByTagName('body')[0];
if (bodyEl) {
bodyEl.setAttribute('style', 'overflow-y: scroll;overflow-x: hidden;');
}
}
}
BassHorizontalScrollDirective.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.0.3", ngImport: i0, type: BassHorizontalScrollDirective, deps: [{ token: i0.ElementRef }, { token: i0.Renderer2 }], target: i0.ɵɵFactoryTarget.Directive });
BassHorizontalScrollDirective.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "12.0.0", version: "13.0.3", type: BassHorizontalScrollDirective, selector: "[bassHorizontalScroll]", inputs: { tableId: "tableId", tableTHeadId: "tableTHeadId", tableTHeadTrId: "tableTHeadTrId", pageUpdated: "pageUpdated", pageDestored: "pageDestored" }, host: { listeners: { "scroll": "onScroll($event.target)" } }, usesOnChanges: true, ngImport: i0 });
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.0.3", ngImport: i0, type: BassHorizontalScrollDirective, decorators: [{
type: Directive,
args: [{
selector: '[bassHorizontalScroll]'
}]
}], ctorParameters: function () { return [{ type: i0.ElementRef }, { type: i0.Renderer2 }]; }, propDecorators: { tableId: [{
type: Input
}], tableTHeadId: [{
type: Input
}], tableTHeadTrId: [{
type: Input
}], pageUpdated: [{
type: Input
}], pageDestored: [{
type: Input
}], onScroll: [{
type: HostListener,
args: ['scroll', ['$event.target']]
}] } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQmFzc0hvcml6b250YWxTY3JvbGwuZGlyZWN0aXZlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcHJvamVjdHMvYW5ndWxhci1ob3Jpem9udGFsLXNjcm9sbC10YWJsZS9zcmMvbGliL0Jhc3NIb3Jpem9udGFsU2Nyb2xsLmRpcmVjdGl2ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0wsU0FBUyxFQUNULEtBQUssRUFPTCxZQUFZLEVBQUMsTUFBTSxlQUFlLENBQUM7O0FBS3JDLE1BQU0sT0FBTyw2QkFBNkI7SUFrQnhDLFlBQW9CLEVBQWMsRUFBVSxRQUFtQjtRQUEzQyxPQUFFLEdBQUYsRUFBRSxDQUFZO1FBQVUsYUFBUSxHQUFSLFFBQVEsQ0FBVztRQVAvRCxjQUFTLEdBQUcsSUFBSSxDQUFDO1FBZ0lqQixpQkFBWSxHQUFHLEdBQVMsRUFBRTtZQUN4QixJQUFJLElBQUksQ0FBQyxPQUFPLEVBQUU7Z0JBQ2hCLE1BQU0sV0FBVyxHQUFHLElBQUksQ0FBQywrQkFBK0IsRUFBRSxDQUFDO2dCQUMzRCxJQUFJLFdBQVcsRUFBRTtvQkFDZixJQUFJLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQztpQkFDekI7Z0JBQ0QsSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDO2FBQ3ZCO1FBQ0gsQ0FBQyxDQUFBO0lBaklrRSxDQUFDO0lBSnBFLFFBQVEsQ0FBQyxDQUFNO1FBQ2IsSUFBSSxDQUFDLHFCQUFxQixDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQztJQUMzQyxDQUFDO0lBSUQsUUFBUTtRQUNOLFVBQVUsQ0FBQyxHQUFHLEVBQUU7WUFDWixJQUFJLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDaEIsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDO0lBQ1gsQ0FBQztJQUVELFdBQVcsQ0FBQyxPQUFzQjtRQUNoQyxJQUFJLElBQUksQ0FBQyxPQUFPLEVBQUU7WUFDaEIsVUFBVSxDQUFDLEdBQUcsRUFBRTtnQkFD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QUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xyXG4gIERpcmVjdGl2ZSxcclxuICBJbnB1dCxcclxuICBFbGVtZW50UmVmLFxyXG4gIFJlbmRlcmVyMixcclxuICBPbkluaXQsXHJcbiAgT25EZXN0cm95LFxyXG4gIE9uQ2hhbmdlcyxcclxuICBTaW1wbGVDaGFuZ2VzLFxyXG4gIEhvc3RMaXN0ZW5lcn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcblxyXG5ARGlyZWN0aXZlKHtcclxuICBzZWxlY3RvcjogJ1tiYXNzSG9yaXpvbnRhbFNjcm9sbF0nXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBCYXNzSG9yaXpvbnRhbFNjcm9sbERpcmVjdGl2ZSBpbXBsZW1lbnRzIE9uSW5pdCwgT25EZXN0cm95LCBPbkNoYW5nZXMge1xyXG4gIEBJbnB1dCgpIHRhYmxlSWQ6IHN0cmluZztcclxuICBASW5wdXQoKSB0YWJsZVRIZWFkSWQ6IHN0cmluZztcclxuICBASW5wdXQoKSB0YWJsZVRIZWFkVHJJZDogc3RyaW5nO1xyXG4gIEBJbnB1dCgpIHBhZ2VVcGRhdGVkOiBib29sZWFuOyAvLyBmaXJlIHRvIHJlc2l6ZSBzY3JvbGwgdWVzIChwYWdlVXBkYXRlZCA9ICFwYWdlVXBkYXRlZClcclxuICBASW5wdXQoKSBwYWdlRGVzdG9yZWQ6IGJvb2xlYW47IC8vIGZpcmUgdG8gcmVtb3ZlIGhlYWRlciB3aGVuIHRhYiBjaGFuZ2UgPT4gKFwid2l0aCBjYWNoZVwiKVxyXG4gIHoydGFibGU6IEhUTUxFbGVtZW50O1xyXG4gIHoydGFibGVUSGVhZFRyOiBIVE1MRWxlbWVudDtcclxuICB6MnRhYmxlVEhlYWQ6IEhUTUxFbGVtZW50O1xyXG4gIHNjcm9sbEJhckNvbnRhaW5lcjogSFRNTEVsZW1lbnQ7XHJcbiAgc2Nyb2xsQmFyV3JhcDogSFRNTEVsZW1lbnQ7XHJcbiAgZnJpc3R0aW1lID0gdHJ1ZTtcclxuXHJcbiAgQEhvc3RMaXN0ZW5lcignc2Nyb2xsJywgWyckZXZlbnQudGFyZ2V0J10pXHJcbiAgb25TY3JvbGwoZTogYW55KSB7XHJcbiAgICB0aGlzLmNoYW5nZVNjcm9sbE9mQmFyV3JhcChlLnNjcm9sbExlZnQpO1xyXG4gIH1cclxuXHJcbiAgY29uc3RydWN0b3IocHJpdmF0ZSBlbDogRWxlbWVudFJlZiwgcHJpdmF0ZSByZW5kZXJlcjogUmVuZGVyZXIyKSB7IH1cclxuXHJcbiAgbmdPbkluaXQoKSB7XHJcbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICB0aGlzLmluSXQoKTtcclxuICAgIH0sIDEwMDApO1xyXG4gIH1cclxuXHJcbiAgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcykge1xyXG4gICAgaWYgKHRoaXMuejJ0YWJsZSkge1xyXG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICB0aGlzLmNoYW5nZXMoY2hhbmdlcyk7XHJcbiAgICAgIH0sIDEwMDApO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgbmdPbkRlc3Ryb3koKSB7XHJcbiAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcignc2Nyb2xsJywgdGhpcy5vbkJvZHlzY3JvbGwsIHRydWUpO1xyXG4gIH1cclxuXHJcbiAgaW5JdCgpIHtcclxuICAgIHRoaXMuejJ0YWJsZWluaXQoKTtcclxuICAgIHRoaXMuYWRkU2Nyb2xsQmFycygpO1xyXG5cclxuICAgIC8vIGdldCBldmVudCBvbiBib2R5L3dpbmRvdyBzY3JvbGxcclxuICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdzY3JvbGwnLCB0aGlzLm9uQm9keXNjcm9sbCwgdHJ1ZSk7XHJcblxyXG4gICAgdGhpcy5hZGRaMlNjcm9sbEV2ZW50cygpO1xyXG5cclxuICAgIGNvbnN0IHNjcm9sbEZvdW5kID0gdGhpcy5jb250YWluZXJIYXNIb3Jpem9udGFsU2Nyb2xsYmFyKCk7XHJcbiAgICBpZiAoc2Nyb2xsRm91bmQpIHtcclxuICAgICAgdGhpcy5zaG93T3JIaWRlU2Nyb2xsKCk7XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5oaWRlQm9keVNjcm9sbCgpO1xyXG4gIH1cclxuXHJcbiAgY2hhbmdlcyhjaGFuZ2VzOiBhbnkpIHtcclxuICAgIGlmIChjaGFuZ2VzLnBhZ2VEZXN0b3JlZCkge1xyXG4gICAgICAvLyAvLyBjaGVjayBpZiB0YWJsZSBpbiBzbWFsbCBvciB0YWJsZSBpbiBzbWFsbGVyIHRoYW4gdGhlIHdpbmRvdyB3aWR0aFxyXG4gICAgICB0aGlzLmNvbnRhaW5lckhhc0hvcml6b250YWxTY3JvbGxiYXIoKTtcclxuXHJcbiAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgXHJcbiAgICAgICAgd2luZG93LnNjcm9sbCh7XHJcbiAgICAgICAgICB0b3A6IDIsXHJcbiAgICAgICAgICBsZWZ0OiAwLFxyXG4gICAgICAgICAgYmVoYXZpb3I6ICdzbW9vdGgnXHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgd2luZG93LnNjcm9sbCh7XHJcbiAgICAgICAgICB0b3A6IDAsXHJcbiAgICAgICAgICBsZWZ0OiAwLFxyXG4gICAgICAgICAgYmVoYXZpb3I6ICdzbW9vdGgnXHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgXHJcbiAgICAgIH0sIDEwMDApO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5yZXNpemVaMlRhYmxlKCk7XHJcblxyXG4gICAgICBjb25zdCBzY3JvbGxGb3VuZCA9IHRoaXMuY29udGFpbmVySGFzSG9yaXpvbnRhbFNjcm9sbGJhcigpO1xyXG4gICAgICBpZiAoc2Nyb2xsRm91bmQpIHtcclxuICAgICAgICB0aGlzLnNob3dPckhpZGVTY3JvbGwoKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgY29udGFpbmVySGFzSG9yaXpvbnRhbFNjcm9sbGJhcigpOiBib29sZWFuIHtcclxuICAgIGNvbnN0IGhhc0hvcml6b250YWxTY3JvbGxiYXIgPSB0aGlzLmVsLm5hdGl2ZUVsZW1lbnQuc2Nyb2xsV2lkdGggPiB0aGlzLmVsLm5hdGl2ZUVsZW1lbnQuY2xpZW50V2lkdGg7XHJcbiAgICBpZiAoaGFzSG9yaXpvbnRhbFNjcm9sbGJhciA9PT0gZmFsc2UpIHtcclxuICAgICAgdGhpcy5zY3JvbGxCYXJXcmFwLnN0eWxlLnZpc2liaWxpdHkgPSAnaGlkZGVuJztcclxuICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5zY3JvbGxCYXJXcmFwLnN0eWxlLnZpc2liaWxpdHkgPSAndmlzaWJsZSc7XHJcbiAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcmVzaXplWjJUYWJsZSgpIHtcclxuICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTptYXgtbGluZS1sZW5ndGhcclxuICAgIGNvbnN0IHNjcm9sbEJhckhlaWdodCA9ICggd2luZG93LmlubmVyV2lkdGggLSBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50V2lkdGggKSA9PT0gMCA/IDE3IDogd2luZG93LmlubmVyV2lkdGggLSBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50V2lkdGg7XHJcblxyXG4gICAgLy8gcmVzaXplIHoydGFibGVcclxuICAgIGNvbnN0IHNjcm9sbEJhckNvbnRhaW5lclN0eWxlID0gJ3dpZHRoOiAnICsgKHRoaXMuejJ0YWJsZS5vZmZzZXRXaWR0aCkgKyAncHg7aGVpZ2h0OiAxcHgnO1xyXG4gICAgdGhpcy5zY3JvbGxCYXJDb250YWluZXIuc2V0QXR0cmlidXRlKCdzdHlsZScsIHNjcm9sbEJhckNvbnRhaW5lclN0eWxlKTtcclxuXHJcbiAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6bWF4LWxpbmUtbGVuZ3RoXHJcbiAgICBjb25zdCBzY3JvbGxCYXJXcmFwU3R5bGUgPSAnd2lkdGg6ICcgKyAodGhpcy5lbC5uYXRpdmVFbGVtZW50Lm9mZnNldFdpZHRoKSArICdweDtoZWlnaHQ6JyArIHNjcm9sbEJhckhlaWdodCArICdweDtwb3NpdGlvbjogZml4ZWQ7b3ZlcmZsb3cteDogc2Nyb2xsO3Zpc2liaWxpdHk6IHZpc2libGU7Ym90dG9tOiAwO3otaW5kZXg6IDI7JztcclxuICAgIHRoaXMuc2Nyb2xsQmFyV3JhcC5zZXRBdHRyaWJ1dGUoJ3N0eWxlJywgc2Nyb2xsQmFyV3JhcFN0eWxlKTtcclxuICB9XHJcblxyXG4gIHoydGFibGVpbml0KCkge1xyXG4gICAgdGhpcy56MnRhYmxlID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignIycgKyB0aGlzLnRhYmxlSWQpIGFzIEhUTUxFbGVtZW50O1xyXG4gICAgdGhpcy56MnRhYmxlVEhlYWQgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcjJyArIHRoaXMudGFibGVUSGVhZElkKSBhcyBIVE1MRWxlbWVudDtcclxuICAgIHRoaXMuejJ0YWJsZVRIZWFkVHIgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcjJyArIHRoaXMudGFibGVUSGVhZFRySWQpIGFzIEhUTUxFbGVtZW50O1xyXG5cclxuICAgIHRoaXMuZWwubmF0aXZlRWxlbWVudC5jbGFzc0xpc3QuYWRkKCdCYXNzQmFyQ29udGFpbmVyJyk7XHJcbiAgICB0aGlzLmVsLm5hdGl2ZUVsZW1lbnQuc3R5bGUub3ZlcmZsb3cgPSAnYXV0byc7XHJcblxyXG4gICAgdGhpcy5oaWRlQm9keVNjcm9sbCgpO1xyXG5cclxuICAgIGlmICghdGhpcy56MnRhYmxlKSB7XHJcbiAgICAgIGNvbnNvbGUubG9nKCdsb29vb29rIHRhYmxlIGlkIG5vdCBmb3VuZC4uLi4uLi4uLi4nKTtcclxuICAgIH1cclxuICAgIGlmICghdGhpcy56MnRhYmxlVEhlYWQpIHtcclxuICAgICAgY29uc29sZS5sb2coJ2xvb29vb2sgdGFibGUgdGhlYWQgaWQgbm90IGZvdW5kLi4uLi4uLi4uLicpO1xyXG4gICAgfVxyXG4gICAgaWYgKCF0aGlzLnoydGFibGVUSGVhZFRyKSB7XHJcbiAgICAgIGNvbnNvbGUubG9nKCdsb29vb29rIHRhYmxlIHRoZWFkIHRyIG5vdCBmb3VuZC4uLi4uLi4uLi4nKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGFkZFNjcm9sbEJhcnMoKSB7XHJcbiAgICAvLyBhZGQgZWxlbWVudHMgb2Ygc2Nyb2xsXHJcbiAgICB0aGlzLnNjcm9sbEJhckNvbnRhaW5lciA9IHRoaXMucmVuZGVyZXIuY3JlYXRlRWxlbWVudCgnZGl2JykgYXMgSFRNTEVsZW1lbnQ7XHJcbiAgICB0aGlzLnNjcm9sbEJhcldyYXAgPSB0aGlzLnJlbmRlcmVyLmNyZWF0ZUVsZW1lbnQoJ2RpdicpIGFzIEhUTUxFbGVtZW50O1xyXG4gICAgdGhpcy5zY3JvbGxCYXJXcmFwLmlkID0gJ0Jhc3NTY3JvbGxCYXInO1xyXG5cclxuICAgIHRoaXMucmVzaXplWjJUYWJsZSgpO1xyXG5cclxuICB9XHJcblxyXG4gIG9uQm9keXNjcm9sbCA9ICgpOiB2b2lkID0+IHtcclxuICAgIGlmICh0aGlzLnoydGFibGUpIHtcclxuICAgICAgY29uc3Qgc2Nyb2xsRm91bmQgPSB0aGlzLmNvbnRhaW5lckhhc0hvcml6b250YWxTY3JvbGxiYXIoKTtcclxuICAgICAgaWYgKHNjcm9sbEZvdW5kKSB7XHJcbiAgICAgICAgdGhpcy5zaG93T3JIaWRlU2Nyb2xsKCk7XHJcbiAgICAgIH1cclxuICAgICAgdGhpcy5oaWRlQm9keVNjcm9sbCgpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgc2hvd09ySGlkZVNjcm9sbCgpIHtcclxuICAgIC8vIGdldCBoZWlndCBvZiB0aGVhZFxyXG4gICAgY29uc3QgdGhlYWRIZWlnaHQgPSB0aGlzLnoydGFibGVUSGVhZC5jbGllbnRIZWlnaHQ7XHJcbiAgICBjb25zdCBmaXhlZE5hdmJhckhlaWdodCA9IHRoZWFkSGVpZ2h0O1xyXG4gICAgLy8gQ3VycmVudCBjb250YWluZXIncyB0b3AgcG9zaXRpb25cclxuICAgIGNvbnN0IGJvdHRvbVBvc2l0aW9uID0gd2luZG93LnBhZ2VZT2Zmc2V0ICArIHdpbmRvdy5pbm5lckhlaWdodCAtIHRoZWFkSGVpZ2h0ICsgZml4ZWROYXZiYXJIZWlnaHQ7XHJcblxyXG4gICAgLy8gRGV0ZWN0IEN1cnJlbnQgY29udGFpbmVyJ3MgdG9wIGlzIGluIHRoZSB0YWJsZSBzY29wZVxyXG4gICAgaWYgKHRoaXMuejJ0YWJsZS5vZmZzZXRUb3AgLSAxIDw9IGJvdHRvbVBvc2l0aW9uICYmICh0aGlzLnoydGFibGUub2Zmc2V0VG9wICsgdGhpcy56MnRhYmxlLmNsaWVudEhlaWdodCAtIDEpID49IGJvdHRvbVBvc2l0aW9uKSB7XHJcbiAgICAgIHRoaXMuc2Nyb2xsQmFyV3JhcC5zdHlsZS52aXNpYmlsaXR5ID0gJ3Zpc2libGUnO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5zY3JvbGxCYXJXcmFwLnN0eWxlLnZpc2liaWxpdHkgPSAnaGlkZGVuJztcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGFkZFoyU2Nyb2xsRXZlbnRzKCkge1xyXG4gICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOm1heC1saW5lLWxlbmd0aFxyXG4gICAgaWYgKHRoaXMuejJ0YWJsZSkge1xyXG5cclxuICAgICAgLy8gYWRkIGV2ZW50cyBvbiBlbGVtZW50c1xyXG4gICAgICB0aGlzLnNjcm9sbEJhcldyYXAub25zY3JvbGwgPSAoZTogYW55KSA9PiB7XHJcbiAgICAgICAgdGhpcy5jaGFuZ2VTY3JvbGxPZkNvbnRhaW5lcihlLnRhcmdldC5zY3JvbGxMZWZ0KTtcclxuICAgICAgfTtcclxuXHJcbiAgICAgIC8vIGFkZCBlbGVtZW50cyBiZXlvbmQgdGFibGVcclxuICAgICAgdGhpcy5yZW5kZXJlci5hcHBlbmRDaGlsZChcclxuICAgICAgICB0aGlzLnNjcm9sbEJhcldyYXAsXHJcbiAgICAgICAgdGhpcy5zY3JvbGxCYXJDb250YWluZXJcclxuICAgICAgKTtcclxuXHJcbiAgICAgIHRoaXMucmVuZGVyZXIuYXBwZW5kQ2hpbGQoXHJcbiAgICAgICAgdGhpcy5lbC5uYXRpdmVFbGVtZW50LFxyXG4gICAgICAgIHRoaXMuc2Nyb2xsQmFyV3JhcFxyXG4gICAgICApO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8gY2hhbmdlIFNjcm9sbCBPZiBjb250YWluZXIgd2hlbiBCYXJXcmFwIHNjcm9sbCBtb3ZlXHJcbiAgY2hhbmdlU2Nyb2xsT2ZDb250YWluZXIobGVmdFBvc2l0aW9uOiBudW1iZXIpIHtcclxuICAgIHRoaXMuZWwubmF0aXZlRWxlbWVudC5zY3JvbGxMZWZ0ID0gbGVmdFBvc2l0aW9uO1xyXG4gICAgdGhpcy56MnRhYmxlVEhlYWQuc2Nyb2xsTGVmdCA9IGxlZnRQb3NpdGlvbjtcclxuICB9XHJcblxyXG4gIC8vIGNoYW5nZSBTY3JvbGwgT2YgQmFyV3JhcCB3aGVuIGNvbnRhaW5lciBzY3JvbGwgbW92ZVxyXG4gIGNoYW5nZVNjcm9sbE9mQmFyV3JhcChsZWZ0UG9zaXRpb246IG51bWJlcikge1xyXG4gICAgdGhpcy5zY3JvbGxCYXJXcmFwLnNjcm9sbExlZnQgPSBsZWZ0UG9zaXRpb247XHJcbiAgICB0aGlzLnoydGFibGVUSGVhZC5zY3JvbGxMZWZ0ID0gbGVmdFBvc2l0aW9uO1xyXG4gIH1cclxuXHJcbiAgaGlkZUJvZHlTY3JvbGwoKSB7XHJcbiAgICBjb25zdCBib2R5RWwgPSBkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgnYm9keScpWzBdO1xyXG4gICAgaWYgKGJvZHlFbCkge1xyXG4gICAgICBib2R5RWwuc2V0QXR0cmlidXRlKCdzdHlsZScsICdvdmVyZmxvdy15OiBzY3JvbGw7b3ZlcmZsb3cteDogaGlkZGVuOycpO1xyXG4gICAgfVxyXG4gIH1cclxufVxyXG4iXX0=