UNPKG

ninja-splitter

Version:

Convenient and easy to use splitter component for Angular 9+

166 lines 21.4 kB
import { Component, ViewChild, ElementRef, HostListener, EventEmitter, Input, Output, Self, } from '@angular/core'; export class NinjaSplitterComponent { constructor(self) { this.self = self; this.initialRatio = 0.5; this.primaryMinSize = 0; this.secondaryMinSize = 0; this.separatorThickness = 5; this.primaryToggledOff = false; this.secondaryToggledOff = false; this.localStorageKey = null; this.notifySizeDidChange = new EventEmitter(); this.notifyBeginResizing = new EventEmitter(); this.notifyEndedResizing = new EventEmitter(); this.dividerSize = 8.0; this.isResizing = false; } get isHorizontal() { return this.self.nativeElement.nodeName === 'HORIZONTAL-NINJA'; } get sizePropertyName() { if (this.self.nativeElement.nodeName.toUpperCase() === 'HORIZONTAL-NINJA') { return 'offsetHeight'; } else { return 'offsetWidth'; } } ngAfterViewInit() { this.checkBothToggledOff(); if (!this.primaryToggledOff && !this.secondaryToggledOff) { let ratio = this.initialRatio; if (this.localStorageKey != null) { const ratioStr = localStorage.getItem(this.localStorageKey); if (ratioStr != null) { ratio = +ratioStr; } } const size = ratio * this.self.nativeElement[this.sizePropertyName]; this.applySizeChange(size); } } ngOnChanges(changes) { this.checkBothToggledOff(); if (changes.primaryToggledOff) { if (changes.primaryToggledOff.currentValue === true) { this.primarySizeBeforeTogglingOff = this.getPrimarySize(); this.applySizeChange(0); } else { this.applySizeChange(this.primarySizeBeforeTogglingOff); } } else if (changes.secondaryToggledOff) { if (changes.secondaryToggledOff.currentValue === true) { this.primarySizeBeforeTogglingOff = this.getPrimarySize(); this.applySizeChange(this.self.nativeElement[this.sizePropertyName]); } else { this.applySizeChange(this.primarySizeBeforeTogglingOff); } } } getPrimarySize() { throw new Error("NinjaSplitterComponent shouldn't be instantiated. Override this method."); } getSecondarySize() { throw new Error("NinjaSplitterComponent shouldn't be instantiated. Override this method."); } dividerPosition(size) { throw new Error("NinjaSplitterComponent shouldn't be instantiated. Override this method."); } getAvailableSize() { return this.self.nativeElement[this.sizePropertyName] - this.dividerSize; } applySizeChange(size) { let primarySize = this.checkValidBounds(size, this.primaryMinSize, this.getAvailableSize() - this.secondaryMinSize); if (this.primaryToggledOff) { primarySize = 0; } else if (this.secondaryToggledOff) { primarySize = this.self.nativeElement[this.sizePropertyName]; } this.dividerPosition(primarySize); this.notifySizeDidChange.emit({ primary: this.getPrimarySize(), secondary: this.getSecondarySize(), }); } notifyWillChangeSize(resizing) { this.isResizing = resizing; this.notifyBeginResizing.emit(); } checkValidBounds(newSize, minSize, maxSize) { if (newSize >= minSize && newSize <= maxSize) { return newSize; } else if (maxSize - newSize > 0) { return minSize; } else { return maxSize; } } checkBothToggledOff() { if (this.primaryToggledOff && this.secondaryToggledOff) { throw new Error('You cannot toggle off both the primary and secondary component'); } } stopResizing() { this.isResizing = false; this.primaryComponent.nativeElement.style.cursor = 'auto'; this.secondaryComponent.nativeElement.style.cursor = 'auto'; if (this.localStorageKey != null) { const ratio = this.getPrimarySize() / this.self.nativeElement[this.sizePropertyName]; localStorage.setItem(this.localStorageKey, JSON.stringify(ratio)); } this.notifyEndedResizing.emit(); } onMouseup() { if (this.isResizing) { this.stopResizing(); } } onDocumentLeave(event) { if (this.isResizing) { event = event ? event : window.event; const from = event.relatedTarget || event.toElement; if (!from || from.nodeName === 'HTML') { this.stopResizing(); } } } } NinjaSplitterComponent.decorators = [ { type: Component, args: [{ selector: 'ninja-splitter', template: '', styles: [` :host { height: 100%; } `] },] } ]; NinjaSplitterComponent.ctorParameters = () => [ { type: ElementRef, decorators: [{ type: Self }] } ]; NinjaSplitterComponent.propDecorators = { primaryComponent: [{ type: ViewChild, args: ['primaryComponent', { static: true },] }], secondaryComponent: [{ type: ViewChild, args: ['secondaryComponent', { static: true },] }], initialRatio: [{ type: Input, args: ['primary-component-initialratio',] }], primaryMinSize: [{ type: Input, args: ['primary-minsize',] }], secondaryMinSize: [{ type: Input, args: ['secondary-minsize',] }], separatorThickness: [{ type: Input, args: ['separator-width-px',] }], primaryToggledOff: [{ type: Input, args: ['primary-component-toggle',] }], secondaryToggledOff: [{ type: Input, args: ['secondary-component-toggle',] }], localStorageKey: [{ type: Input, args: ['local-storage-key',] }], notifySizeDidChange: [{ type: Output, args: ['on-change',] }], notifyBeginResizing: [{ type: Output, args: ['on-begin-resizing',] }], notifyEndedResizing: [{ type: Output, args: ['on-ended-resizing',] }], onMouseup: [{ type: HostListener, args: ['mouseup',] }, { type: HostListener, args: ['touchend',] }], onDocumentLeave: [{ type: HostListener, args: ['document:mouseout', ['$event'],] }] }; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmluamEtc3BsaXR0ZXIuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcHJvamVjdHMvbmluamEtc3BsaXQvc3JjL2xpYi9uaW5qYS1zcGxpdHRlci5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNMLFNBQVMsRUFDVCxTQUFTLEVBQ1QsVUFBVSxFQUNWLFlBQVksRUFDWixZQUFZLEVBQ1osS0FBSyxFQUNMLE1BQU0sRUFJTixJQUFJLEdBQ0wsTUFBTSxlQUFlLENBQUM7QUFhdkIsTUFBTSxPQUFPLHNCQUFzQjtJQXVCakMsWUFBOEIsSUFBZ0I7UUFBaEIsU0FBSSxHQUFKLElBQUksQ0FBWTtRQWxCTCxpQkFBWSxHQUFHLEdBQUcsQ0FBQztRQUNsQyxtQkFBYyxHQUFHLENBQUMsQ0FBQztRQUNqQixxQkFBZ0IsR0FBRyxDQUFDLENBQUM7UUFDcEIsdUJBQWtCLEdBQUcsQ0FBQyxDQUFDO1FBQ2pCLHNCQUFpQixHQUFHLEtBQUssQ0FBQztRQUN4Qix3QkFBbUIsR0FBRyxLQUFLLENBQUM7UUFDckMsb0JBQWUsR0FBa0IsSUFBSSxDQUFDO1FBRWxFLHdCQUFtQixHQUF1RCxJQUFJLFlBQVksRUFBd0MsQ0FBQztRQUVuSSx3QkFBbUIsR0FBdUIsSUFBSSxZQUFZLEVBQVEsQ0FBQztRQUVuRSx3QkFBbUIsR0FBdUIsSUFBSSxZQUFZLEVBQVEsQ0FBQztRQVNuRSxnQkFBVyxHQUFHLEdBQUcsQ0FBQztRQUNsQixlQUFVLEdBQUcsS0FBSyxDQUFDO0lBSitCLENBQUM7SUFKbkQsSUFBVyxZQUFZO1FBQ3JCLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsUUFBUSxLQUFLLGtCQUFrQixDQUFDO0lBQ2pFLENBQUM7SUFPRCxJQUFjLGdCQUFnQjtRQUM1QixJQUNHLElBQUksQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLFFBQW1CLENBQUMsV0FBVyxFQUFFO1lBQzFE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QyxtQkFBbUI7aUNBQ3pCLEtBQUssU0FBQyxvQkFBb0I7Z0NBQzFCLEtBQUssU0FBQywwQkFBMEI7a0NBQ2hDLEtBQUssU0FBQyw0QkFBNEI7OEJBQ2xDLEtBQUssU0FBQyxtQkFBbUI7a0NBQ3pCLE1BQU0sU0FBQyxXQUFXO2tDQUVsQixNQUFNLFNBQUMsbUJBQW1CO2tDQUUxQixNQUFNLFNBQUMsbUJBQW1CO3dCQTJJMUIsWUFBWSxTQUFDLFNBQVMsY0FDdEIsWUFBWSxTQUFDLFVBQVU7OEJBT3ZCLFlBQVksU0FBQyxtQkFBbUIsRUFBRSxDQUFDLFFBQVEsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XHJcbiAgQ29tcG9uZW50LFxyXG4gIFZpZXdDaGlsZCxcclxuICBFbGVtZW50UmVmLFxyXG4gIEhvc3RMaXN0ZW5lcixcclxuICBFdmVudEVtaXR0ZXIsXHJcbiAgSW5wdXQsXHJcbiAgT3V0cHV0LFxyXG4gIE9uQ2hhbmdlcyxcclxuICBTaW1wbGVDaGFuZ2VzLFxyXG4gIEFmdGVyVmlld0luaXQsXHJcbiAgU2VsZixcclxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuXHJcbkBDb21wb25lbnQoe1xyXG4gIHNlbGVjdG9yOiAnbmluamEtc3BsaXR0ZXInLFxyXG4gIHRlbXBsYXRlOiAnJyxcclxuICBzdHlsZXM6IFtcclxuICAgIGBcclxuICAgICAgOmhvc3Qge1xyXG4gICAgICAgIGhlaWdodDogMTAwJTtcclxuICAgICAgfVxyXG4gICAgYCxcclxuICBdLFxyXG59KVxyXG5leHBvcnQgY2xhc3MgTmluamFTcGxpdHRlckNvbXBvbmVudCBpbXBsZW1lbnRzIE9uQ2hhbmdlcywgQWZ0ZXJWaWV3SW5pdCB7XHJcbiAgQFZpZXdDaGlsZCgncHJpbWFyeUNvbXBvbmVudCcsIHsgc3RhdGljOiB0cnVlIH0pIHByaW1hcnlDb21wb25lbnQ6IEVsZW1lbnRSZWY7XHJcbiAgQFZpZXdDaGlsZCgnc2Vjb25kYXJ5Q29tcG9uZW50JywgeyBzdGF0aWM6IHRydWUgfSlcclxuICBzZWNvbmRhcnlDb21wb25lbnQ6IEVsZW1lbnRSZWY7XHJcblxyXG4gIEBJbnB1dCgncHJpbWFyeS1jb21wb25lbnQtaW5pdGlhbHJhdGlvJykgaW5pdGlhbFJhdGlvID0gMC41O1xyXG4gIEBJbnB1dCgncHJpbWFyeS1taW5zaXplJykgcHJpbWFyeU1pblNpemUgPSAwO1xyXG4gIEBJbnB1dCgnc2Vjb25kYXJ5LW1pbnNpemUnKSBzZWNvbmRhcnlNaW5TaXplID0gMDtcclxuICBASW5wdXQoJ3NlcGFyYXRvci13aWR0aC1weCcpIHNlcGFyYXRvclRoaWNrbmVzcyA9IDU7XHJcbiAgQElucHV0KCdwcmltYXJ5LWNvbXBvbmVudC10b2dnbGUnKSBwcmltYXJ5VG9nZ2xlZE9mZiA9IGZhbHNlO1xyXG4gIEBJbnB1dCgnc2Vjb25kYXJ5LWNvbXBvbmVudC10b2dnbGUnKSBzZWNvbmRhcnlUb2dnbGVkT2ZmID0gZmFsc2U7XHJcbiAgQElucHV0KCdsb2NhbC1zdG9yYWdlLWtleScpIGxvY2FsU3RvcmFnZUtleTogc3RyaW5nIHwgbnVsbCA9IG51bGw7XHJcbiAgQE91dHB1dCgnb24tY2hhbmdlJylcclxuICBub3RpZnlTaXplRGlkQ2hhbmdlOiBFdmVudEVtaXR0ZXI8e3ByaW1hcnk6IG51bWJlciwgc2Vjb25kYXJ5OiBudW1iZXJ9PiA9IG5ldyBFdmVudEVtaXR0ZXI8e3ByaW1hcnk6IG51bWJlciwgc2Vjb25kYXJ5OiBudW1iZXJ9PigpO1xyXG4gIEBPdXRwdXQoJ29uLWJlZ2luLXJlc2l6aW5nJylcclxuICBub3RpZnlCZWdpblJlc2l6aW5nOiBFdmVudEVtaXR0ZXI8dm9pZD4gPSBuZXcgRXZlbnRFbWl0dGVyPHZvaWQ+KCk7XHJcbiAgQE91dHB1dCgnb24tZW5kZWQtcmVzaXppbmcnKVxyXG4gIG5vdGlmeUVuZGVkUmVzaXppbmc6IEV2ZW50RW1pdHRlcjx2b2lkPiA9IG5ldyBFdmVudEVtaXR0ZXI8dm9pZD4oKTtcclxuXHJcbiAgcHVibGljIGdldCBpc0hvcml6b250YWwoKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5zZWxmLm5hdGl2ZUVsZW1lbnQubm9kZU5hbWUgPT09ICdIT1JJWk9OVEFMLU5JTkpBJztcclxuICB9XHJcblxyXG4gIGNvbnN0cnVjdG9yKEBTZWxmKCkgcHJvdGVjdGVkIHNlbGY6IEVsZW1lbnRSZWYpIHsgfVxyXG5cclxuICBwcmltYXJ5U2l6ZUJlZm9yZVRvZ2dsaW5nT2ZmOiBudW1iZXI7XHJcbiAgZGl2aWRlclNpemUgPSA4LjA7XHJcbiAgaXNSZXNpemluZyA9IGZhbHNlO1xyXG4gIHByb3RlY3RlZCBnZXQgc2l6ZVByb3BlcnR5TmFtZSgpOiAnb2Zmc2V0V2lkdGgnIHwgJ29mZnNldEhlaWdodCcge1xyXG4gICAgaWYgKFxyXG4gICAgICAodGhpcy5zZWxmLm5hdGl2ZUVsZW1lbnQubm9kZU5hbWUgYXMgc3RyaW5nKS50b1VwcGVyQ2FzZSgpID09PVxyXG4gICAgICAnSE9SSVpPTlRBTC1OSU5KQSdcclxuICAgICkge1xyXG4gICAgICByZXR1cm4gJ29mZnNldEhlaWdodCc7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICByZXR1cm4gJ29mZnNldFdpZHRoJztcclxuICAgIH1cclxuICB9XHJcblxyXG4gIG5nQWZ0ZXJWaWV3SW5pdCgpOiB2b2lkIHtcclxuICAgIHRoaXMuY2hlY2tCb3RoVG9nZ2xlZE9mZigpO1xyXG5cclxuICAgIGlmICghdGhpcy5wcmltYXJ5VG9nZ2xlZE9mZiAmJiAhdGhpcy5zZWNvbmRhcnlUb2dnbGVkT2ZmKSB7XHJcbiAgICAgIGxldCByYXRpbzogbnVtYmVyID0gdGhpcy5pbml0aWFsUmF0aW87XHJcbiAgICAgIGlmICh0aGlzLmxvY2FsU3RvcmFnZUtleSAhPSBudWxsKSB7XHJcbiAgICAgICAgY29uc3QgcmF0aW9TdHIgPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbSh0aGlzLmxvY2FsU3RvcmFnZUtleSk7XHJcbiAgICAgICAgaWYgKHJhdGlvU3RyICE9IG51bGwpIHtcclxuICAgICAgICAgIHJhdGlvID0gK3JhdGlvU3RyO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG5cclxuICAgICAgY29uc3Qgc2l6ZSA9IHJhdGlvICogdGhpcy5zZWxmLm5hdGl2ZUVsZW1lbnRbdGhpcy5zaXplUHJvcGVydHlOYW1lXTtcclxuICAgICAgdGhpcy5hcHBseVNpemVDaGFuZ2Uoc2l6ZSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKTogdm9pZCB7XHJcbiAgICB0aGlzLmNoZWNrQm90aFRvZ2dsZWRPZmYoKTtcclxuXHJcbiAgICBpZiAoY2hhbmdlcy5wcmltYXJ5VG9nZ2xlZE9mZikge1xyXG4gICAgICBpZiAoY2hhbmdlcy5wcmltYXJ5VG9nZ2xlZE9mZi5jdXJyZW50VmFsdWUgPT09IHRydWUpIHtcclxuICAgICAgICB0aGlzLnByaW1hcnlTaXplQmVmb3JlVG9nZ2xpbmdPZmYgPSB0aGlzLmdldFByaW1hcnlTaXplKCk7XHJcbiAgICAgICAgdGhpcy5hcHBseVNpemVDaGFuZ2UoMCk7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgdGhpcy5hcHBseVNpemVDaGFuZ2UodGhpcy5wcmltYXJ5U2l6ZUJlZm9yZVRvZ2dsaW5nT2ZmKTtcclxuICAgICAgfVxyXG4gICAgfSBlbHNlIGlmIChjaGFuZ2VzLnNlY29uZGFyeVRvZ2dsZWRPZmYpIHtcclxuICAgICAgaWYgKGNoYW5nZXMuc2Vjb25kYXJ5VG9nZ2xlZE9mZi5jdXJyZW50VmFsdWUgPT09IHRydWUpIHtcclxuICAgICAgICB0aGlzLnByaW1hcnlTaXplQmVmb3JlVG9nZ2xpbmdPZmYgPSB0aGlzLmdldFByaW1hcnlTaXplKCk7XHJcbiAgICAgICAgdGhpcy5hcHBseVNpemVDaGFuZ2UodGhpcy5zZWxmLm5hdGl2ZUVsZW1lbnRbdGhpcy5zaXplUHJvcGVydHlOYW1lXSk7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgdGhpcy5hcHBseVNpemVDaGFuZ2UodGhpcy5wcmltYXJ5U2l6ZUJlZm9yZVRvZ2dsaW5nT2ZmKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgZ2V0UHJpbWFyeVNpemUoKTogbnVtYmVyIHtcclxuICAgIHRocm93IG5ldyBFcnJvcihcclxuICAgICAgXCJOaW5qYVNwbGl0dGVyQ29tcG9uZW50IHNob3VsZG4ndCBiZSBpbnN0YW50aWF0ZWQuIE92ZXJyaWRlIHRoaXMgbWV0aG9kLlwiXHJcbiAgICApO1xyXG4gIH1cclxuXHJcbiAgZ2V0U2Vjb25kYXJ5U2l6ZSgpOiBudW1iZXIge1xyXG4gICAgdGhyb3cgbmV3IEVycm9yKFxyXG4gICAgICBcIk5pbmphU3BsaXR0ZXJDb21wb25lbnQgc2hvdWxkbid0IGJlIGluc3RhbnRpYXRlZC4gT3ZlcnJpZGUgdGhpcyBtZXRob2QuXCJcclxuICAgICk7XHJcbiAgfVxyXG5cclxuICBkaXZpZGVyUG9zaXRpb24oc2l6ZTogbnVtYmVyKTogdm9pZCB7XHJcbiAgICB0aHJvdyBuZXcgRXJyb3IoXHJcbiAgICAgIFwiTmluamFTcGxpdHRlckNvbXBvbmVudCBzaG91bGRuJ3QgYmUgaW5zdGFudGlhdGVkLiBPdmVycmlkZSB0aGlzIG1ldGhvZC5cIlxyXG4gICAgKTtcclxuICB9XHJcblxyXG4gIGdldEF2YWlsYWJsZVNpemUoKTogbnVtYmVyIHtcclxuICAgIHJldHVybiB0aGlzLnNlbGYubmF0aXZlRWxlbWVudFt0aGlzLnNpemVQcm9wZXJ0eU5hbWVdIC0gdGhpcy5kaXZpZGVyU2l6ZTtcclxuICB9XHJcblxyXG4gIGFwcGx5U2l6ZUNoYW5nZShzaXplOiBudW1iZXIpOiB2b2lkIHtcclxuICAgIGxldCBwcmltYXJ5U2l6ZSA9IHRoaXMuY2hlY2tWYWxpZEJvdW5kcyhcclxuICAgICAgc2l6ZSxcclxuICAgICAgdGhpcy5wcmltYXJ5TWluU2l6ZSxcclxuICAgICAgdGhpcy5nZXRBdmFpbGFibGVTaXplKCkgLSB0aGlzLnNlY29uZGFyeU1pblNpemVcclxuICAgICk7XHJcblxyXG4gICAgaWYgKHRoaXMucHJpbWFyeVRvZ2dsZWRPZmYpIHtcclxuICAgICAgcHJpbWFyeVNpemUgPSAwO1xyXG4gICAgfSBlbHNlIGlmICh0aGlzLnNlY29uZGFyeVRvZ2dsZWRPZmYpIHtcclxuICAgICAgcHJpbWFyeVNpemUgPSB0aGlzLnNlbGYubmF0aXZlRWxlbWVudFt0aGlzLnNpemVQcm9wZXJ0eU5hbWVdO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuZGl2aWRlclBvc2l0aW9uKHByaW1hcnlTaXplKTtcclxuICAgIHRoaXMubm90aWZ5U2l6ZURpZENoYW5nZS5lbWl0KHtcclxuICAgICAgcHJpbWFyeTogdGhpcy5nZXRQcmltYXJ5U2l6ZSgpLFxyXG4gICAgICBzZWNvbmRhcnk6IHRoaXMuZ2V0U2Vjb25kYXJ5U2l6ZSgpLFxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBub3RpZnlXaWxsQ2hhbmdlU2l6ZShyZXNpemluZzogYm9vbGVhbik6IHZvaWQge1xyXG4gICAgdGhpcy5pc1Jlc2l6aW5nID0gcmVzaXppbmc7XHJcbiAgICB0aGlzLm5vdGlmeUJlZ2luUmVzaXppbmcuZW1pdCgpO1xyXG4gIH1cclxuXHJcbiAgY2hlY2tWYWxpZEJvdW5kcyhuZXdTaXplOiBudW1iZXIsIG1pblNpemU6IG51bWJlciwgbWF4U2l6ZTogbnVtYmVyKTogbnVtYmVyIHtcclxuICAgIGlmIChuZXdTaXplID49IG1pblNpemUgJiYgbmV3U2l6ZSA8PSBtYXhTaXplKSB7XHJcbiAgICAgIHJldHVybiBuZXdTaXplO1xyXG4gICAgfSBlbHNlIGlmIChtYXhTaXplIC0gbmV3U2l6ZSA+IDApIHtcclxuICAgICAgcmV0dXJuIG1pblNpemU7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICByZXR1cm4gbWF4U2l6ZTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGNoZWNrQm90aFRvZ2dsZWRPZmYoKTogdm9pZCB7XHJcbiAgICBpZiAodGhpcy5wcmltYXJ5VG9nZ2xlZE9mZiAmJiB0aGlzLnNlY29uZGFyeVRvZ2dsZWRPZmYpIHtcclxuICAgICAgdGhyb3cgbmV3IEVycm9yKFxyXG4gICAgICAgICdZb3UgY2Fubm90IHRvZ2dsZSBvZmYgYm90aCB0aGUgcHJpbWFyeSBhbmQgc2Vjb25kYXJ5IGNvbXBvbmVudCdcclxuICAgICAgKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHN0b3BSZXNpemluZygpOiB2b2lkIHtcclxuICAgIHRoaXMuaXNSZXNpemluZyA9IGZhbHNlO1xyXG4gICAgdGhpcy5wcmltYXJ5Q29tcG9uZW50Lm5hdGl2ZUVsZW1lbnQuc3R5bGUuY3Vyc29yID0gJ2F1dG8nO1xyXG4gICAgdGhpcy5zZWNvbmRhcnlDb21wb25lbnQubmF0aXZlRWxlbWVudC5zdHlsZS5jdXJzb3IgPSAnYXV0byc7XHJcblxyXG4gICAgaWYgKHRoaXMubG9jYWxTdG9yYWdlS2V5ICE9IG51bGwpIHtcclxuICAgICAgY29uc3QgcmF0aW8gPVxyXG4gICAgICAgIHRoaXMuZ2V0UHJpbWFyeVNpemUoKSAvIHRoaXMuc2VsZi5uYXRpdmVFbGVtZW50W3RoaXMuc2l6ZVByb3BlcnR5TmFtZV07XHJcbiAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKHRoaXMubG9jYWxTdG9yYWdlS2V5LCBKU09OLnN0cmluZ2lmeShyYXRpbykpO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMubm90aWZ5RW5kZWRSZXNpemluZy5lbWl0KCk7XHJcbiAgfVxyXG5cclxuICBASG9zdExpc3RlbmVyKCdtb3VzZXVwJylcclxuICBASG9zdExpc3RlbmVyKCd0b3VjaGVuZCcpXHJcbiAgb25Nb3VzZXVwKCk6IHZvaWQge1xyXG4gICAgaWYgKHRoaXMuaXNSZXNpemluZykge1xyXG4gICAgICB0aGlzLnN0b3BSZXNpemluZygpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgQEhvc3RMaXN0ZW5lcignZG9jdW1lbnQ6bW91c2VvdXQnLCBbJyRldmVudCddKVxyXG4gIG9uRG9jdW1lbnRMZWF2ZShldmVudCk6IHZvaWQge1xyXG4gICAgaWYgKHRoaXMuaXNSZXNpemluZykge1xyXG4gICAgICBldmVudCA9IGV2ZW50ID8gZXZlbnQgOiB3aW5kb3cuZXZlbnQ7XHJcbiAgICAgIGNvbnN0IGZyb20gPSBldmVudC5yZWxhdGVkVGFyZ2V0IHx8IGV2ZW50LnRvRWxlbWVudDtcclxuICAgICAgaWYgKCFmcm9tIHx8IGZyb20ubm9kZU5hbWUgPT09ICdIVE1MJykge1xyXG4gICAgICAgIHRoaXMuc3RvcFJlc2l6aW5nKCk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcbn1cclxuIl19