angular-fixed-header-table
Version:
angular-Fixed-Header-table is A simple solution for fixed header in any table.
221 lines (220 loc) • 30.2 kB
JavaScript
import { Directive, Input } from '@angular/core';
import * as i0 from "@angular/core";
/*
- in constactor, to detect change with RouteReuseStrategy
- then add in subscribe pageUpdated
private router: Router
router.events.subscribe((evt) => {
if (!(evt instanceof NavigationEnd)) {
return;
}
this.pageUpdated = !this.pageUpdated;
});
*/
export class BassFixedHeaderDirective {
constructor(el, renderer) {
this.el = el;
this.renderer = renderer;
this.stopFixed = false;
this.theadPaddingTopBottom = '0.45rem';
this.theadPaddingLeftRight = '1rem';
this.onBodyscroll = (e) => {
this.scroll();
};
}
ngOnInit() {
if (!this.stopFixed) {
setTimeout(() => {
this.inIt();
}, 1000);
}
}
ngOnChanges(changes) {
if (this.z2table && !this.stopFixed) {
setTimeout(() => {
this.changes(changes);
}, 1000);
}
}
ngOnDestroy() {
if (!this.stopFixed) {
this.removeTheadToFixedItems();
window.removeEventListener('scroll', this.onBodyscroll, true);
}
}
inIt() {
this.z2tableinit();
// get event on body/window scroll
window.addEventListener('scroll', this.onBodyscroll, true);
// called 2 times because the wired behavie of table wjen style attr added to Element
this.checkPaddingAndTHSize();
this.checkPaddingAndTHSize();
this.scroll();
}
changes(changes) {
if (changes.pageDestored) {
this.removeTheadToFixedItems();
this.scroll();
}
else {
this.checkPaddingAndTHSize();
this.scroll();
}
}
checkPaddingAndTHSize() {
const scrollFound = this.containerHasHorizontalScrollbar();
if (!scrollFound) {
// no scroll,,, small caoumns
setTimeout(() => {
this.changeThSizes();
}, 500);
this.z2table.style.tableLayout = 'fixed';
}
else {
// tslint:disable-next-line:prefer-for-of
for (let index = 0; index < this.z2tableTHeadTr.children.length; index++) {
const oldTh = this.z2tableTHeadTr.children[index];
oldTh.removeAttribute('style');
}
}
}
containerHasHorizontalScrollbar() {
const hasHorizontalScrollbar = this.el.nativeElement.scrollWidth > this.el.nativeElement.clientWidth;
if (hasHorizontalScrollbar === false) {
return false;
}
else {
return true;
}
}
z2tableinit() {
this.z2table = document.querySelector('#' + this.tableId);
this.z2tableTHead = document.querySelector('#' + this.tableTHeadId);
this.z2tableTHeadTr = document.querySelector('#' + this.tableTHeadTrId);
this.z2tableTBody = document.querySelector('#' + this.tableTBodyId);
if (!this.z2table) {
console.log('loooook table id not found..........');
}
else {
this.z2table.style.tableLayout = 'fixed';
this.z2table.style.width = 'max-content';
}
if (!this.z2tableTHead) {
console.log('loooook table thead id not found..........');
}
if (!this.z2tableTHeadTr) {
console.log('loooook table thead tr not found..........');
}
}
scroll() {
// tthis check because of tabs cache
const table = document.querySelector('#' + this.tableId);
if (this.z2table && table) {
const bounding = this.z2table.getBoundingClientRect();
const tableOffsetTop = this.z2table.offsetTop;
const windowOffset = window.pageYOffset;
const tHeadHeight = this.z2tableTHead.clientHeight;
const pos2 = document.documentElement.scrollTop;
if (this.z2tableTHead) {
// page at end
// console.log('nnn', (window.innerHeight + window.scrollY) >= document.body.offsetHeight);
if ((windowOffset + tHeadHeight) > (tableOffsetTop)) {
if ((window.scrollY) > (tableOffsetTop)) {
this.z2tableTHead.classList.add('z2TblScroll');
this.addTheadToFixedItems();
}
}
else {
this.z2tableTHead.classList.remove('z2TblScroll');
this.removeTheadToFixedItems();
}
}
}
}
changeThSizes() {
if (this.z2tableTBody && this.z2tableTBody.children && this.z2tableTBody.children.length >= 1) {
// tslint:disable-next-line:prefer-for-of
for (let index = 0; index < this.z2tableTHeadTr.children.length; index++) {
const oldTd = this.z2tableTBody.children[0].children[index];
const oldTh = this.z2tableTHeadTr.children[index];
if (!oldTh.hasAttribute('hidden')) {
let orPadding = 0; // beacause border-right
const elStyles = window.getComputedStyle(oldTh);
orPadding = orPadding
+ Number(elStyles.paddingLeft.replace('px', ''))
+ Number(elStyles.paddingRight.replace('px', ''))
+ Number(elStyles.marginLeft.replace('px', ''))
+ Number(elStyles.marginRight.replace('px', ''));
if (oldTd && oldTd.clientWidth) {
const newWeidth = oldTd.clientWidth - orPadding;
if (newWeidth !== 0) {
const styles = 'min-width: ' + newWeidth + 'px !important;';
oldTh.setAttribute('style', styles);
}
}
}
}
}
}
addTheadToFixedItems() {
const fixedItems = document.getElementById('fixedItems');
const fixedItemsStyle = 'height:0px;display: block;';
fixedItems?.setAttribute('style', fixedItemsStyle);
const itemsEl = fixedItems?.querySelector('#' + this.tableId);
if (!itemsEl) {
const containerDiv = this.renderer.createElement('div');
containerDiv.id = this.tableId;
containerDiv.classList.add('z2table-container');
const containerDivStyle = 'width: ' + this.el.nativeElement.clientWidth + 'px';
containerDiv.setAttribute('style', containerDivStyle);
const tableDiv = this.renderer.createElement('div');
const tableDivStyle = 'width: inherit';
tableDiv.setAttribute('style', tableDivStyle);
this.renderer.appendChild(tableDiv, this.z2tableTHead);
this.renderer.appendChild(containerDiv, tableDiv);
this.renderer.appendChild(fixedItems, containerDiv);
this.z2tableTHead.scrollLeft = this.el.nativeElement.scrollLeft;
}
else {
const containerDiv = itemsEl;
containerDiv.style.display = 'block';
this.renderer.appendChild(containerDiv.lastChild, this.z2tableTHead);
this.z2tableTHead.scrollLeft = this.el.nativeElement.scrollLeft;
}
}
removeTheadToFixedItems() {
const fixedItems = document.getElementById('fixedItems');
if (fixedItems && fixedItems.firstChild) {
this.renderer.appendChild(this.z2table, this.z2tableTHead);
// tslint:disable-next-line:prefer-for-of
for (let index = 0; index < fixedItems.children.length; index++) {
const element = fixedItems.children[index];
element.remove();
}
fixedItems.setAttribute('style', 'display: none;overflow:hidden !important');
}
}
}
BassFixedHeaderDirective.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.0.3", ngImport: i0, type: BassFixedHeaderDirective, deps: [{ token: i0.ElementRef }, { token: i0.Renderer2 }], target: i0.ɵɵFactoryTarget.Directive });
BassFixedHeaderDirective.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "12.0.0", version: "13.0.3", type: BassFixedHeaderDirective, selector: "[bassFixedHeader]", inputs: { tableId: "tableId", tableTHeadId: "tableTHeadId", tableTBodyId: "tableTBodyId", tableTHeadTrId: "tableTHeadTrId", pageUpdated: "pageUpdated", pageDestored: "pageDestored", stopFixed: "stopFixed" }, usesOnChanges: true, ngImport: i0 });
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.0.3", ngImport: i0, type: BassFixedHeaderDirective, decorators: [{
type: Directive,
args: [{
selector: '[bassFixedHeader]'
}]
}], ctorParameters: function () { return [{ type: i0.ElementRef }, { type: i0.Renderer2 }]; }, propDecorators: { tableId: [{
type: Input
}], tableTHeadId: [{
type: Input
}], tableTBodyId: [{
type: Input
}], tableTHeadTrId: [{
type: Input
}], pageUpdated: [{
type: Input
}], pageDestored: [{
type: Input
}], stopFixed: [{
type: Input
}] } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQmFzc0ZpeGVkSGVhZGVyLmRpcmVjdGl2ZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL2FuZ3VsYXItZml4ZWQtaGVhZGVyLXRhYmxlL3NyYy9saWIvQmFzc0ZpeGVkSGVhZGVyLmRpcmVjdGl2ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0wsU0FBUyxFQUNULEtBQUssRUFNVSxNQUFNLGVBQWUsQ0FBQzs7QUFLdkM7Ozs7Ozs7Ozs7O0VBV0U7QUFDRixNQUFNLE9BQU8sd0JBQXdCO0lBaUJuQyxZQUFvQixFQUFjLEVBQVUsUUFBbUI7UUFBM0MsT0FBRSxHQUFGLEVBQUUsQ0FBWTtRQUFVLGFBQVEsR0FBUixRQUFRLENBQVc7UUFWdEQsY0FBUyxHQUFZLEtBQUssQ0FBQztRQU9wQywwQkFBcUIsR0FBRyxTQUFTLENBQUM7UUFDbEMsMEJBQXFCLEdBQUcsTUFBTSxDQUFDO1FBbUcvQixpQkFBWSxHQUFHLENBQUMsQ0FBTSxFQUFRLEVBQUU7WUFDOUIsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO1FBQ2hCLENBQUMsQ0FBQTtJQW5Ha0UsQ0FBQztJQUVwRSxRQUFRO1FBQ04sSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUU7WUFDbkIsVUFBVSxDQUFDLEdBQUcsRUFBRTtnQkFDWixJQUFJLENBQUMsSUFBSSxFQUFFLENBQUM7WUFDaEIsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDO1NBQ1Y7SUFDSCxDQUFDO0lBRUQsV0FBVyxDQUFDLE9BQXNCO1FBQ2hDLElBQUksSUFBSSxDQUFDLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUU7WUFDbkMsVUFBVSxDQUFDLEdBQUcsRUFBRTtnQkFDZCxJQUFJLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1lBQ3hCLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQztTQUNWO0lBQ0gsQ0FBQztJQUdELFdBQVc7UUFDVCxJQUFJ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O1lBRTNELHlDQUF5QztZQUN6QyxLQUFLLElBQUksS0FBSyxHQUFHLENBQUMsRUFBRSxLQUFLLEdBQUcsVUFBVSxDQUFDLFFBQVEsQ0FBQyxNQUFNLEVBQUUsS0FBSyxFQUFFLEVBQUU7Z0JBQy9ELE1BQU0sT0FBTyxHQUFHLFVBQVUsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUM7Z0JBQzNDLE9BQU8sQ0FBQyxNQUFNLEVBQUUsQ0FBQzthQUNsQjtZQUVELFVBQVUsQ0FBQyxZQUFZLENBQUMsT0FBTyxFQUFFLDBDQUEwQyxDQUFDLENBQUM7U0FDOUU7SUFDSCxDQUFDOztxSEFqT1Usd0JBQXdCO3lHQUF4Qix3QkFBd0I7MkZBQXhCLHdCQUF3QjtrQkFmcEMsU0FBUzttQkFBQztvQkFDVCxRQUFRLEVBQUUsbUJBQW1CO2lCQUM5Qjt5SEFjVSxPQUFPO3NCQUFmLEtBQUs7Z0JBQ0csWUFBWTtzQkFBcEIsS0FBSztnQkFDRyxZQUFZO3NCQUFwQixLQUFLO2dCQUNHLGNBQWM7c0JBQXRCLEtBQUs7Z0JBQ0csV0FBVztzQkFBbkIsS0FBSztnQkFDRyxZQUFZO3NCQUFwQixLQUFLO2dCQUNHLFNBQVM7c0JBQWpCLEtBQUsiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xyXG4gIERpcmVjdGl2ZSxcclxuICBJbnB1dCxcclxuICBFbGVtZW50UmVmLFxyXG4gIFJlbmRlcmVyMixcclxuICBPbkluaXQsXHJcbiAgT25EZXN0cm95LFxyXG4gIE9uQ2hhbmdlcyxcclxuICBTaW1wbGVDaGFuZ2VzIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcblxyXG5ARGlyZWN0aXZlKHtcclxuICBzZWxlY3RvcjogJ1tiYXNzRml4ZWRIZWFkZXJdJ1xyXG59KVxyXG4vKlxyXG4tIGluIGNvbnN0YWN0b3IsIHRvIGRldGVjdCBjaGFuZ2Ugd2l0aCBSb3V0ZVJldXNlU3RyYXRlZ3lcclxuLSB0aGVuIGFkZCBpbiBzdWJzY3JpYmUgcGFnZVVwZGF0ZWRcclxuXHJcbnByaXZhdGUgcm91dGVyOiBSb3V0ZXJcclxucm91dGVyLmV2ZW50cy5zdWJzY3JpYmUoKGV2dCkgPT4ge1xyXG4gIGlmICghKGV2dCBpbnN0YW5jZW9mIE5hdmlnYXRpb25FbmQpKSB7XHJcbiAgICAgIHJldHVybjtcclxuICB9XHJcbiAgdGhpcy5wYWdlVXBkYXRlZCA9ICF0aGlzLnBhZ2VVcGRhdGVkO1xyXG59KTtcclxuKi9cclxuZXhwb3J0IGNsYXNzIEJhc3NGaXhlZEhlYWRlckRpcmVjdGl2ZSBpbXBsZW1lbnRzIE9uSW5pdCwgT25EZXN0cm95LCBPbkNoYW5nZXMge1xyXG4gIEBJbnB1dCgpIHRhYmxlSWQ6IHN0cmluZztcclxuICBASW5wdXQoKSB0YWJsZVRIZWFkSWQ6IHN0cmluZztcclxuICBASW5wdXQoKSB0YWJsZVRCb2R5SWQ6IHN0cmluZztcclxuICBASW5wdXQoKSB0YWJsZVRIZWFkVHJJZDogc3RyaW5nO1xyXG4gIEBJbnB1dCgpIHBhZ2VVcGRhdGVkOiBib29sZWFuOyAvLyBmaXJlIHRvIHJlc2l6ZSBzY3JvbGwgdWVzIChwYWdlVXBkYXRlZCA9ICFwYWdlVXBkYXRlZClcclxuICBASW5wdXQoKSBwYWdlRGVzdG9yZWQ6IGJvb2xlYW47IC8vIGZpcmUgdG8gcmVtb3ZlIGhlYWRlciB3aGVuIHRhYiBjaGFuZ2UgPT4gKFwid2l0aCBjYWNoZVwiKVxyXG4gIEBJbnB1dCgpIHN0b3BGaXhlZDogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICB6MnRhYmxlOiBIVE1MRWxlbWVudDtcclxuICB6MnRhYmxlVEhlYWRUcjogSFRNTEVsZW1lbnQ7XHJcbiAgejJ0YWJsZVRIZWFkOiBIVE1MRWxlbWVudDtcclxuICB6MnRhYmxlVEJvZHk6IEhUTUxFbGVtZW50O1xyXG5cclxuICB0aGVhZFBhZGRpbmdUb3BCb3R0b20gPSAnMC40NXJlbSc7XHJcbiAgdGhlYWRQYWRkaW5nTGVmdFJpZ2h0ID0gJzFyZW0nO1xyXG5cclxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIGVsOiBFbGVtZW50UmVmLCBwcml2YXRlIHJlbmRlcmVyOiBSZW5kZXJlcjIpIHsgfVxyXG5cclxuICBuZ09uSW5pdCgpIHtcclxuICAgIGlmICghdGhpcy5zdG9wRml4ZWQpIHtcclxuICAgICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgICB0aGlzLmluSXQoKTtcclxuICAgICAgfSwgMTAwMCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKSB7XHJcbiAgICBpZiAodGhpcy56MnRhYmxlICYmICF0aGlzLnN0b3BGaXhlZCkge1xyXG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICB0aGlzLmNoYW5nZXMoY2hhbmdlcyk7XHJcbiAgICAgIH0sIDEwMDApO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcblxyXG4gIG5nT25EZXN0cm95KCkge1xyXG4gICAgaWYgKCF0aGlzLnN0b3BGaXhlZCkge1xyXG4gICAgICB0aGlzLnJlbW92ZVRoZWFkVG9GaXhlZEl0ZW1zKCk7XHJcbiAgICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCdzY3JvbGwnLCB0aGlzLm9uQm9keXNjcm9sbCwgdHJ1ZSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBpbkl0KCkge1xyXG5cclxuICAgIHRoaXMuejJ0YWJsZWluaXQoKTtcclxuXHJcbiAgICAvLyBnZXQgZXZlbnQgb24gYm9keS93aW5kb3cgc2Nyb2xsXHJcbiAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcignc2Nyb2xsJywgdGhpcy5vbkJvZHlzY3JvbGwsIHRydWUpO1xyXG5cclxuICAgIC8vIGNhbGxlZCAyIHRpbWVzIGJlY2F1c2UgdGhlIHdpcmVkIGJlaGF2aWUgb2YgdGFibGUgd2plbiBzdHlsZSBhdHRyIGFkZGVkIHRvIEVsZW1lbnRcclxuICAgIHRoaXMuY2hlY2tQYWRkaW5nQW5kVEhTaXplKCk7XHJcbiAgICB0aGlzLmNoZWNrUGFkZGluZ0FuZFRIU2l6ZSgpO1xyXG4gICAgdGhpcy5zY3JvbGwoKTtcclxuICB9XHJcblxyXG4gIGNoYW5nZXMoY2hhbmdlczogYW55KSB7XHJcbiAgICBpZiAoY2hhbmdlcy5wYWdlRGVzdG9yZWQpIHtcclxuICAgICAgdGhpcy5yZW1vdmVUaGVhZFRvRml4ZWRJdGVtcygpO1xyXG4gICAgICB0aGlzLnNjcm9sbCgpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5jaGVja1BhZGRpbmdBbmRUSFNpemUoKTtcclxuICAgICAgdGhpcy5zY3JvbGwoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGNoZWNrUGFkZGluZ0FuZFRIU2l6ZSgpIHtcclxuICAgIGNvbnN0IHNjcm9sbEZvdW5kID0gdGhpcy5jb250YWluZXJIYXNIb3Jpem9udGFsU2Nyb2xsYmFyKCk7XHJcbiAgICBpZiAoIXNjcm9sbEZvdW5kKSB7XHJcbiAgICAgIC8vIG5vIHNjcm9sbCwsLCBzbWFsbCBjYW91bW5zXHJcbiAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgIHRoaXMuY2hhbmdlVGhTaXplcygpO1xyXG4gICAgICB9LCA1MDApO1xyXG4gICAgICB0aGlzLnoydGFibGUuc3R5bGUudGFibGVMYXlvdXQgPSAnZml4ZWQnO1xyXG4gICAgfSBlbHNlIHtcclxuICAgIFxyXG4gICAgICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTpwcmVmZXItZm9yLW9mXHJcbiAgICAgICAgZm9yIChsZXQgaW5kZXggPSAwOyBpbmRleCA8IHRoaXMuejJ0YWJsZVRIZWFkVHIuY2hpbGRyZW4ubGVuZ3RoOyBpbmRleCsrKSB7XHJcbiAgICAgICAgICBjb25zdCBvbGRUaCA9IHRoaXMuejJ0YWJsZVRIZWFkVHIuY2hpbGRyZW5baW5kZXhdIGFzIEhUTUxFbGVtZW50O1xyXG4gICAgICAgICAgb2xkVGgucmVtb3ZlQXR0cmlidXRlKCdzdHlsZScpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIGNvbnRhaW5lckhhc0hvcml6b250YWxTY3JvbGxiYXIoKTogYm9vbGVhbiB7XHJcbiAgICBjb25zdCBoYXNIb3Jpem9udGFsU2Nyb2xsYmFyID0gdGhpcy5lbC5uYXRpdmVFbGVtZW50LnNjcm9sbFdpZHRoID4gdGhpcy5lbC5uYXRpdmVFbGVtZW50LmNsaWVudFdpZHRoO1xyXG4gICAgaWYgKGhhc0hvcml6b250YWxTY3JvbGxiYXIgPT09IGZhbHNlKSB7XHJcbiAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgejJ0YWJsZWluaXQoKSB7XHJcbiAgICB0aGlzLnoydGFibGUgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcjJyArIHRoaXMudGFibGVJZCkgYXMgSFRNTEVsZW1lbnQ7XHJcbiAgICB0aGlzLnoydGFibGVUSGVhZCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJyMnICsgdGhpcy50YWJsZVRIZWFkSWQpIGFzIEhUTUxFbGVtZW50O1xyXG4gICAgdGhpcy56MnRhYmxlVEhlYWRUciA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJyMnICsgdGhpcy50YWJsZVRIZWFkVHJJZCkgYXMgSFRNTEVsZW1lbnQ7XHJcbiAgICB0aGlzLnoydGFibGVUQm9keSA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJyMnICsgdGhpcy50YWJsZVRCb2R5SWQpIGFzIEhUTUxFbGVtZW50O1xyXG5cclxuICAgIGlmICghdGhpcy56MnRhYmxlKSB7XHJcbiAgICAgIGNvbnNvbGUubG9nKCdsb29vb29rIHRhYmxlIGlkIG5vdCBmb3VuZC4uLi4uLi4uLi4nKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMuejJ0YWJsZS5zdHlsZS50YWJsZUxheW91dCA9ICdmaXhlZCc7XHJcbiAgICAgIHRoaXMuejJ0YWJsZS5zdHlsZS53aWR0aCA9ICdtYXgtY29udGVudCc7XHJcbiAgICB9XHJcbiAgICBcclxuICAgIGlmICghdGhpcy56MnRhYmxlVEhlYWQpIHtcclxuICAgICAgY29uc29sZS5sb2coJ2xvb29vb2sgdGFibGUgdGhlYWQgaWQgbm90IGZvdW5kLi4uLi4uLi4uLicpO1xyXG4gICAgfVxyXG4gICAgaWYgKCF0aGlzLnoydGFibGVUSGVhZFRyKSB7XHJcbiAgICAgIGNvbnNvbGUubG9nKCdsb29vb29rIHRhYmxlIHRoZWFkIHRyIG5vdCBmb3VuZC4uLi4uLi4uLi4nKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIG9uQm9keXNjcm9sbCA9IChlOiBhbnkpOiB2b2lkID0+IHtcclxuICAgIHRoaXMuc2Nyb2xsKCk7XHJcbiAgfVxyXG5cclxuICBzY3JvbGwoKSB7XHJcbiAgICAvLyB0dGhpcyBjaGVjayBiZWNhdXNlIG9mIHRhYnMgY2FjaGVcclxuICAgIGNvbnN0IHRhYmxlID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignIycgKyB0aGlzLnRhYmxlSWQpO1xyXG4gICAgaWYgKHRoaXMuejJ0YWJsZSAmJiB0YWJsZSkge1xyXG5cclxuICAgICAgY29uc3QgYm91bmRpbmcgPSB0aGlzLnoydGFibGUuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XHJcbiAgICAgIGNvbnN0IHRhYmxlT2Zmc2V0VG9wID0gdGhpcy56MnRhYmxlLm9mZnNldFRvcDtcclxuICAgICAgY29uc3Qgd2luZG93T2Zmc2V0ID0gd2luZG93LnBhZ2VZT2Zmc2V0O1xyXG4gICAgICBjb25zdCB0SGVhZEhlaWdodCA9IHRoaXMuejJ0YWJsZVRIZWFkLmNsaWVudEhlaWdodDtcclxuICAgICAgY29uc3QgcG9zMiA9IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5zY3JvbGxUb3A7XHJcblxyXG4gICAgICBpZiAodGhpcy56MnRhYmxlVEhlYWQpIHtcclxuXHJcbiAgICAgICAgLy8gcGFnZSBhdCBlbmRcclxuICAgICAgICAvLyBjb25zb2xlLmxvZygnbm5uJywgKHdpbmRvdy5pbm5lckhlaWdodCArIHdpbmRvdy5zY3JvbGxZKSA+PSBkb2N1bWVudC5ib2R5Lm9mZnNldEhlaWdodCk7XHJcblxyXG4gICAgICAgIGlmICgod2luZG93T2Zmc2V0ICsgdEhlYWRIZWlnaHQpID4gKCB0YWJsZU9mZnNldFRvcCApKSB7XHJcbiAgICAgICAgICBpZiAoKHdpbmRvdy5zY3JvbGxZKSA+ICggdGFibGVPZmZzZXRUb3AgKSkge1xyXG4gICAgICAgICAgICAgIHRoaXMuejJ0YWJsZVRIZWFkLmNsYXNzTGlzdC5hZGQoJ3oyVGJsU2Nyb2xsJyk7XHJcbiAgICAgICAgICAgICAgdGhpcy5hZGRUaGVhZFRvRml4ZWRJdGVtcygpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICB0aGlzLnoydGFibGVUSGVhZC5jbGFzc0xpc3QucmVtb3ZlKCd6MlRibFNjcm9sbCcpO1xyXG4gICAgICAgICAgdGhpcy5yZW1vdmVUaGVhZFRvRml4ZWRJdGVtcygpO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgY2hhbmdlVGhTaXplcygpIHtcclxuICAgICAgaWYgKHRoaXMuejJ0YWJsZVRCb2R5ICYmIHRoaXMuejJ0YWJsZVRCb2R5LmNoaWxkcmVuICYmIHRoaXMuejJ0YWJsZVRCb2R5LmNoaWxkcmVuLmxlbmd0aCA+PSAxKSB7XHJcbiAgICAgICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOnByZWZlci1mb3Itb2ZcclxuICAgICAgICBmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwgdGhpcy56MnRhYmxlVEhlYWRUci5jaGlsZHJlbi5sZW5ndGg7IGluZGV4KyspIHtcclxuICAgICAgICAgIGNvbnN0IG9sZFRkID0gdGhpcy56MnRhYmxlVEJvZHkuY2hpbGRyZW5bMF0uY2hpbGRyZW5baW5kZXhdIGFzIEhUTUxFbGVtZW50O1xyXG4gICAgICAgICAgY29uc3Qgb2xkVGggPSB0aGlzLnoydGFibGVUSGVhZFRyLmNoaWxkcmVuW2luZGV4XSBhcyBIVE1MRWxlbWVudDtcclxuICAgICAgICAgIGlmICghb2xkVGguaGFzQXR0cmlidXRlKCdoaWRkZW4nKSkge1xyXG5cclxuICAgICAgICAgICAgbGV0IG9yUGFkZGluZyA9IDA7IC8vIGJlYWNhdXNlIGJvcmRlci1yaWdodFxyXG4gICAgICAgICAgICBjb25zdCBlbFN0eWxlcyA9IHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKG9sZFRoKTtcclxuICAgICAgICAgICAgb3JQYWRkaW5nID0gb3JQYWRkaW5nXHJcbiAgICAgICAgICAgICsgTnVtYmVyKGVsU3R5bGVzLnBhZGRpbmdMZWZ0LnJlcGxhY2UoJ3B4JywgJycpKVxyXG4gICAgICAgICAgICArIE51bWJlcihlbFN0eWxlcy5wYWRkaW5nUmlnaHQucmVwbGFjZSgncHgnLCAnJykpXHJcbiAgICAgICAgICAgICsgTnVtYmVyKGVsU3R5bGVzLm1hcmdpbkxlZnQucmVwbGFjZSgncHgnLCAnJykpXHJcbiAgICAgICAgICAgICsgTnVtYmVyKGVsU3R5bGVzLm1hcmdpblJpZ2h0LnJlcGxhY2UoJ3B4JywgJycpKTtcclxuXHJcbiAgICAgICAgICAgIGlmIChvbGRUZCAmJiBvbGRUZC5jbGllbnRXaWR0aCkge1xyXG4gICAgICAgICAgICAgIGNvbnN0IG5ld1dlaWR0aCA9IG9sZFRkLmNsaWVudFdpZHRoICAtIG9yUGFkZGluZztcclxuICAgICAgICAgICAgICBpZiAobmV3V2VpZHRoICE9PSAwKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBzdHlsZXMgPSAnbWluLXdpZHRoOiAnICsgbmV3V2VpZHRoICsgJ3B4ICFpbXBvcnRhbnQ7JztcclxuICAgICAgICAgICAgICAgIG9sZFRoLnNldEF0dHJpYnV0ZSgnc3R5bGUnLCBzdHlsZXMpO1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBhZGRUaGVhZFRvRml4ZWRJdGVtcygpIHtcclxuICAgIGNvbnN0IGZpeGVkSXRlbXMgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZml4ZWRJdGVtcycpO1xyXG4gICAgY29uc3QgZml4ZWRJdGVtc1N0eWxlID0gJ2hlaWdodDowcHg7ZGlzcGxheTogYmxvY2s7JztcclxuICAgIGZpeGVkSXRlbXM/LnNldEF0dHJpYnV0ZSgnc3R5bGUnLCBmaXhlZEl0ZW1zU3R5bGUpO1xyXG5cclxuICAgIGNvbnN0IGl0ZW1zRWwgPSBmaXhlZEl0ZW1zPy5xdWVyeVNlbGVjdG9yKCcjJyArIHRoaXMudGFibGVJZCk7XHJcbiAgICBpZiAoIWl0ZW1zRWwpIHtcclxuXHJcbiAgICAgIGNvbnN0IGNvbnRhaW5lckRpdiA9IHRoaXMucmVuZGVyZXIuY3JlYXRlRWxlbWVudCgnZGl2JykgYXMgSFRNTEVsZW1lbnQ7XHJcbiAgICAgIGNvbnRhaW5lckRpdi5pZCA9ICB0aGlzLnRhYmxlSWQ7XHJcbiAgICAgIGNvbnRhaW5lckRpdi5jbGFzc0xpc3QuYWRkKCd6MnRhYmxlLWNvbnRhaW5lcicpO1xyXG4gICAgICBjb25zdCBjb250YWluZXJEaXZTdHlsZSA9ICAnd2lkdGg6ICcgKyB0aGlzLmVsLm5hdGl2ZUVsZW1lbnQuY2xpZW50V2lkdGggKyAncHgnO1xyXG4gICAgICBjb250YWluZXJEaXYuc2V0QXR0cmlidXRlKCdzdHlsZScsIGNvbnRhaW5lckRpdlN0eWxlKTtcclxuXHJcbiAgICAgIGNvbnN0IHRhYmxlRGl2ID0gdGhpcy5yZW5kZXJlci5jcmVhdGVFbGVtZW50KCdkaXYnKSBhcyBIVE1MRWxlbWVudDtcclxuXHJcbiAgICAgIGNvbnN0IHRhYmxlRGl2U3R5bGUgPSAgJ3dpZHRoOiBpbmhlcml0JztcclxuICAgICAgdGFibGVEaXYuc2V0QXR0cmlidXRlKCdzdHlsZScsIHRhYmxlRGl2U3R5bGUpO1xyXG5cclxuICAgICAgdGhpcy5yZW5kZXJlci5hcHBlbmRDaGlsZCh0YWJsZURpdiwgdGhpcy56MnRhYmxlVEhlYWQpO1xyXG4gICAgICB0aGlzLnJlbmRlcmVyLmFwcGVuZENoaWxkKGNvbnRhaW5lckRpdiwgdGFibGVEaXYpO1xyXG4gICAgICB0aGlzLnJlbmRlcmVyLmFwcGVuZENoaWxkKGZpeGVkSXRlbXMsIGNvbnRhaW5lckRpdik7XHJcblxyXG4gICAgICB0aGlzLnoydGFibGVUSGVhZC5zY3JvbGxMZWZ0ID0gdGhpcy5lbC5uYXRpdmVFbGVtZW50LnNjcm9sbExlZnQ7XHJcblxyXG4gICAgIH0gZWxzZSB7XHJcbiAgICAgIGNvbnN0IGNvbnRhaW5lckRpdiA9IGl0ZW1zRWw7XHJcbiAgICAgIChjb250YWluZXJEaXYgYXMgSFRNTEVsZW1lbnQpLnN0eWxlLmRpc3BsYXkgPSAnYmxvY2snO1xyXG4gICAgICB0aGlzLnJlbmRlcmVyLmFwcGVuZENoaWxkKGNvbnRhaW5lckRpdi5sYXN0Q2hpbGQsIHRoaXMuejJ0YWJsZVRIZWFkKTtcclxuXHJcbiAgICAgIHRoaXMuejJ0YWJsZVRIZWFkLnNjcm9sbExlZnQgPSB0aGlzLmVsLm5hdGl2ZUVsZW1lbnQuc2Nyb2xsTGVmdDtcclxuICAgICB9XHJcblxyXG4gIH1cclxuXHJcbiAgcmVtb3ZlVGhlYWRUb0ZpeGVkSXRlbXMoKSB7XHJcbiAgICBjb25zdCBmaXhlZEl0ZW1zID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2ZpeGVkSXRlbXMnKTtcclxuICAgIGlmIChmaXhlZEl0ZW1zICYmIGZpeGVkSXRlbXMuZmlyc3RDaGlsZCkge1xyXG5cclxuICAgICAgdGhpcy5yZW5kZXJlci5hcHBlbmRDaGlsZCh0aGlzLnoydGFibGUsIHRoaXMuejJ0YWJsZVRIZWFkKTtcclxuXHJcbiAgICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTpwcmVmZXItZm9yLW9mXHJcbiAgICAgIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCBmaXhlZEl0ZW1zLmNoaWxkcmVuLmxlbmd0aDsgaW5kZXgrKykge1xyXG4gICAgICAgIGNvbnN0IGVsZW1lbnQgPSBmaXhlZEl0ZW1zLmNoaWxkcmVuW2luZGV4XTtcclxuICAgICAgICBlbGVtZW50LnJlbW92ZSgpO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBmaXhlZEl0ZW1zLnNldEF0dHJpYnV0ZSgnc3R5bGUnLCAnZGlzcGxheTogbm9uZTtvdmVyZmxvdzpoaWRkZW4gIWltcG9ydGFudCcpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbn1cclxuXHJcbiJdfQ==