UNPKG

@hxui/angular

Version:

This README includes the steps that are necessary to import the HxUi-angular into a project or to contribute with development.

224 lines (223 loc) 17.4 kB
/** * @fileoverview added by tsickle * @suppress {checkTypes} checked by tsc */ import { Component, HostBinding, Input } from '@angular/core'; import { TabsetConfig } from './tabset.config'; export class TabsetComponent { /** * @param {?} config */ constructor(config) { this.clazn = true; this.tabs = []; this.classMap = {}; Object.assign(this, config); } /** * if true tabs will be placed vertically * @return {?} */ get vertical() { return this._vertical; } /** * @param {?} value * @return {?} */ set vertical(value) { this._vertical = value; this.setClassMap(); } /** * if true tabs fill the container and have a consistent width * @return {?} */ get justified() { return this._justified; } /** * @param {?} value * @return {?} */ set justified(value) { this._justified = value; this.setClassMap(); } /** * @return {?} */ get hasInfo() { return this._hasInfo; } /** * @param {?} value * @return {?} */ set hasInfo(value) { this._hasInfo = value; this.setClassMap(); } /** * navigation context class: 'tabs' or 'pills' * @return {?} */ get type() { return this._type; } /** * @param {?} value * @return {?} */ set type(value) { this._type = value; this.setClassMap(); } /** * @return {?} */ ngOnDestroy() { this.isDestroyed = true; } /** * @param {?} tab * @return {?} */ addTab(tab) { this.tabs.push(tab); tab.active = this.tabs.length === 1 && tab.active !== false; } /** * @param {?} tab * @param {?=} options * @return {?} */ removeTab(tab, options = { reselect: true, emit: true }) { const /** @type {?} */ index = this.tabs.indexOf(tab); if (index === -1 || this.isDestroyed) { return; } // Select a new tab if the tab to be removed is selected and not destroyed if (options.reselect && tab.active && this.hasAvailableTabs(index)) { const /** @type {?} */ newActiveIndex = this.getClosestTabIndex(index); this.tabs[newActiveIndex].active = true; } if (options.emit) { tab.removed.emit(tab); } this.tabs.splice(index, 1); if (tab.elementRef.nativeElement && tab.elementRef.nativeElement.remove) { tab.elementRef.nativeElement.remove(); } } /** * @param {?} index * @return {?} */ getClosestTabIndex(index) { const /** @type {?} */ tabsLength = this.tabs.length; if (!tabsLength) { return -1; } for (let /** @type {?} */ step = 1; step <= tabsLength; step += 1) { const /** @type {?} */ prevIndex = index - step; const /** @type {?} */ nextIndex = index + step; if (this.tabs[prevIndex] && !this.tabs[prevIndex].disabled) { return prevIndex; } if (this.tabs[nextIndex] && !this.tabs[nextIndex].disabled) { return nextIndex; } } return -1; } /** * @param {?} index * @return {?} */ hasAvailableTabs(index) { const /** @type {?} */ tabsLength = this.tabs.length; if (!tabsLength) { return false; } for (let /** @type {?} */ i = 0; i < tabsLength; i += 1) { if (!this.tabs[i].disabled && i !== index) { return true; } } return false; } /** * @return {?} */ setClassMap() { this.classMap = { 'is-vertical': this.vertical, 'is-justified': this.justified, 'has-info': this.hasInfo, [`hx-nav-${this.type}`]: true }; } } TabsetComponent.decorators = [ { type: Component, args: [{ selector: 'hx-tabset', template: ` <ul class="hx-nav" [ngClass]="classMap" (click)="$event.preventDefault()"> <li *ngFor="let tabz of tabs" [ngClass]="['hx-nav-item', tabz.customClass || '']" [class.is-active]="tabz.active" [class.is-disabled]="tabz.disabled"> <a href="javascript:void(0);" class="hx-nav-link" [class.is-active]="tabz.active" [class.is-disabled]="tabz.disabled" (click)="tabz.active = true"> <span [ngTransclude]="tabz.headingRef">{{tabz.heading}}</span> <span *ngIf="tabz.removable"> <span (click)="$event.preventDefault(); removeTab(tabz);" class="icon close-outline is-small"></span> </span> </a> </li> </ul> <div class="hx-tab-content"> <ng-content></ng-content> </div> ` },] }, ]; /** @nocollapse */ TabsetComponent.ctorParameters = () => [ { type: TabsetConfig, }, ]; TabsetComponent.propDecorators = { "vertical": [{ type: Input },], "justified": [{ type: Input },], "hasInfo": [{ type: Input },], "type": [{ type: Input },], "clazn": [{ type: HostBinding, args: ['class.hx-tab-container',] },], }; function TabsetComponent_tsickle_Closure_declarations() { /** @type {!Array<{type: !Function, args: (undefined|!Array<?>)}>} */ TabsetComponent.decorators; /** * @nocollapse * @type {function(): !Array<(null|{type: ?, decorators: (undefined|!Array<{type: !Function, args: (undefined|!Array<?>)}>)})>} */ TabsetComponent.ctorParameters; /** @type {!Object<string,!Array<{type: !Function, args: (undefined|!Array<?>)}>>} */ TabsetComponent.propDecorators; /** @type {?} */ TabsetComponent.prototype.clazn; /** @type {?} */ TabsetComponent.prototype.tabs; /** @type {?} */ TabsetComponent.prototype.classMap; /** @type {?} */ TabsetComponent.prototype.isDestroyed; /** @type {?} */ TabsetComponent.prototype._vertical; /** @type {?} */ TabsetComponent.prototype._justified; /** @type {?} */ TabsetComponent.prototype._hasInfo; /** @type {?} */ TabsetComponent.prototype._type; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFic2V0LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiJuZzovL0BoeHVpL2FuZ3VsYXIvIiwic291cmNlcyI6WyJsaWIvdGFicy90YWJzZXQuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7QUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLFdBQVcsRUFBRSxLQUFLLEVBQWEsTUFBTSxlQUFlLENBQUM7QUFHekUsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBdUIvQyxNQUFNOzs7O2dCQW1EZSxNQUFvQjtxQkFYZSxJQUFJO29CQUU1QixFQUFFO3dCQUNULEVBQUU7UUFTdkIsTUFBTSxDQUFDLE1BQU0sQ0FBQyxJQUFJLEVBQUUsTUFBTSxDQUFDLENBQUM7Ozs7OztRQWpEbkIsUUFBUTtRQUNqQixNQUFNLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQzs7Ozs7O1FBRWIsUUFBUSxDQUFDLEtBQWM7UUFDaEMsSUFBSSxDQUFDLFNBQVMsR0FBRyxLQUFLLENBQUM7UUFDdkIsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDOzs7Ozs7UUFLVixTQUFTO1FBQ2xCLE1BQU0sQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDOzs7Ozs7UUFFZCxTQUFTLENBQUMsS0FBYztRQUNqQyxJQUFJLENBQUMsVUFBVSxHQUFHLEtBQUssQ0FBQztRQUN4QixJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7Ozs7O1FBSVYsT0FBTztRQUNoQixNQUFNLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQzs7Ozs7O1FBRVosT0FBTyxDQUFDLEtBQWM7UUFDL0IsSUFBSSxDQUFDLFFBQVEsR0FBRyxLQUFLLENBQUM7UUFDdEIsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDOzs7Ozs7UUFLVixJQUFJO1FBQ2IsTUFBTSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUM7Ozs7OztRQUVULElBQUksQ0FBQyxLQUFhO1FBQzNCLElBQUksQ0FBQyxLQUFLLEdBQUcsS0FBSyxD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QyxJQUFJLENBQUMsTUFBTSxDQUFDO1FBQ3BDLEVBQUUsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQztZQUNoQixNQUFNLENBQUMsS0FBSyxDQUFDO1NBQ2Q7UUFFRCxHQUFHLENBQUMsQ0FBQyxxQkFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxVQUFVLEVBQUUsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDO1lBQ3ZDLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLElBQUksQ0FBQyxLQUFLLEtBQUssQ0FBQyxDQUFDLENBQUM7Z0JBQzFDLE1BQU0sQ0FBQyxJQUFJLENBQUM7YUFDYjtTQUNGO1FBQ0QsTUFBTSxDQUFDLEtBQUssQ0FBQztLQUNkOzs7O0lBRVMsV0FBVztRQUNuQixJQUFJLENBQUMsUUFBUSxHQUFHO1lBQ2QsYUFBYSxFQUFFLElBQUksQ0FBQyxRQUFRO1lBQzVCLGNBQWMsRUFBRSxJQUFJLENBQUMsU0FBUztZQUM5QixVQUFVLEVBQUUsSUFBSSxDQUFDLE9BQU87WUFDeEIsQ0FBQyxVQUFVLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQyxFQUFFLElBQUk7U0FDOUIsQ0FBQztLQUNIOzs7WUFoSkYsU0FBUyxTQUFDO2dCQUNULFFBQVEsRUFBRSxXQUFXO2dCQUNyQixRQUFRLEVBQUU7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBaUJUO2FBQ0Y7Ozs7WUF0QlEsWUFBWTs7O3lCQXlCbEIsS0FBSzswQkFVTCxLQUFLO3dCQVNMLEtBQUs7cUJBVUwsS0FBSztzQkFTTCxXQUFXLFNBQUMsd0JBQXdCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBIb3N0QmluZGluZywgSW5wdXQsIE9uRGVzdHJveSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5cclxuaW1wb3J0IHsgVGFiRGlyZWN0aXZlIH0gZnJvbSAnLi90YWIuZGlyZWN0aXZlJztcclxuaW1wb3J0IHsgVGFic2V0Q29uZmlnIH0gZnJvbSAnLi90YWJzZXQuY29uZmlnJztcclxuXHJcbkBDb21wb25lbnQoe1xyXG4gIHNlbGVjdG9yOiAnaHgtdGFic2V0JyxcclxuICB0ZW1wbGF0ZTogYFxyXG4gICAgPHVsIGNsYXNzPVwiaHgtbmF2XCIgW25nQ2xhc3NdPVwiY2xhc3NNYXBcIiAoY2xpY2spPVwiJGV2ZW50LnByZXZlbnREZWZhdWx0KClcIj5cclxuICAgICAgICA8bGkgKm5nRm9yPVwibGV0IHRhYnogb2YgdGFic1wiIFtuZ0NsYXNzXT1cIlsnaHgtbmF2LWl0ZW0nLCB0YWJ6LmN1c3RvbUNsYXNzIHx8ICcnXVwiXHJcbiAgICAgICAgICBbY2xhc3MuaXMtYWN0aXZlXT1cInRhYnouYWN0aXZlXCIgW2NsYXNzLmlzLWRpc2FibGVkXT1cInRhYnouZGlzYWJsZWRcIj5cclxuICAgICAgICAgIDxhIGhyZWY9XCJqYXZhc2NyaXB0OnZvaWQoMCk7XCIgY2xhc3M9XCJoeC1uYXYtbGlua1wiXHJcbiAgICAgICAgICAgIFtjbGFzcy5pcy1hY3RpdmVdPVwidGFiei5hY3RpdmVcIiBbY2xhc3MuaXMtZGlzYWJsZWRdPVwidGFiei5kaXNhYmxlZFwiXHJcbiAgICAgICAgICAgIChjbGljayk9XCJ0YWJ6LmFjdGl2ZSA9IHRydWVcIj5cclxuICAgICAgICAgICAgPHNwYW4gW25nVHJhbnNjbHVkZV09XCJ0YWJ6LmhlYWRpbmdSZWZcIj57e3RhYnouaGVhZGluZ319PC9zcGFuPlxyXG4gICAgICAgICAgICA8c3BhbiAqbmdJZj1cInRhYnoucmVtb3ZhYmxlXCI+XHJcbiAgICAgICAgICAgICAgPHNwYW4gKGNsaWNrKT1cIiRldmVudC5wcmV2ZW50RGVmYXVsdCgpOyByZW1vdmVUYWIodGFieik7XCIgY2xhc3M9XCJpY29uIGNsb3NlLW91dGxpbmUgaXMtc21hbGxcIj48L3NwYW4+XHJcbiAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgIDwvYT5cclxuICAgICAgICA8L2xpPlxyXG4gICAgPC91bD5cclxuICAgIDxkaXYgY2xhc3M9XCJoeC10YWItY29udGVudFwiPlxyXG4gICAgICA8bmctY29udGVudD48L25nLWNvbnRlbnQ+XHJcbiAgICA8L2Rpdj5cclxuICBgXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBUYWJzZXRDb21wb25lbnQgaW1wbGVtZW50cyBPbkRlc3Ryb3kge1xyXG4gIC8qKiBpZiB0cnVlIHRhYnMgd2lsbCBiZSBwbGFjZWQgdmVydGljYWxseSAqL1xyXG4gIEBJbnB1dCgpXHJcbiAgcHVibGljIGdldCB2ZXJ0aWNhbCgpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLl92ZXJ0aWNhbDtcclxuICB9XHJcbiAgcHVibGljIHNldCB2ZXJ0aWNhbCh2YWx1ZTogYm9vbGVhbikge1xyXG4gICAgdGhpcy5fdmVydGljYWwgPSB2YWx1ZTtcclxuICAgIHRoaXMuc2V0Q2xhc3NNYXAoKTtcclxuICB9XHJcblxyXG4gIC8qKiBpZiB0cnVlIHRhYnMgZmlsbCB0aGUgY29udGFpbmVyIGFuZCBoYXZlIGEgY29uc2lzdGVudCB3aWR0aCAqL1xyXG4gIEBJbnB1dCgpXHJcbiAgcHVibGljIGdldCBqdXN0aWZpZWQoKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5fanVzdGlmaWVkO1xyXG4gIH1cclxuICBwdWJsaWMgc2V0IGp1c3RpZmllZCh2YWx1ZTogYm9vbGVhbikge1xyXG4gICAgdGhpcy5fanVzdGlmaWVkID0gdmFsdWU7XHJcbiAgICB0aGlzLnNldENsYXNzTWFwKCk7XHJcbiAgfVxyXG5cclxuICBASW5wdXQoKVxyXG4gIHB1YmxpYyBnZXQgaGFzSW5mbygpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLl9oYXNJbmZvO1xyXG4gIH1cclxuICBwdWJsaWMgc2V0IGhhc0luZm8odmFsdWU6IGJvb2xlYW4pIHtcclxuICAgIHRoaXMuX2hhc0luZm8gPSB2YWx1ZTtcclxuICAgIHRoaXMuc2V0Q2xhc3NNYXAoKTtcclxuICB9XHJcblxyXG4gIC8qKiBuYXZpZ2F0aW9uIGNvbnRleHQgY2xhc3M6ICd0YWJzJyBvciAncGlsbHMnICovXHJcbiAgQElucHV0KClcclxuICBwdWJsaWMgZ2V0IHR5cGUoKTogc3RyaW5nIHtcclxuICAgIHJldHVybiB0aGlzLl90eXBlO1xyXG4gIH1cclxuICBwdWJsaWMgc2V0IHR5cGUodmFsdWU6IHN0cmluZykge1xyXG4gICAgdGhpcy5fdHlwZSA9IHZhbHVlO1xyXG4gICAgdGhpcy5zZXRDbGFzc01hcCgpO1xyXG4gIH1cclxuXHJcbiAgQEhvc3RCaW5kaW5nKCdjbGFzcy5oeC10YWItY29udGFpbmVyJykgcHVibGljIGNsYXpuID0gdHJ1ZTtcclxuXHJcbiAgcHVibGljIHRhYnM6IFRhYkRpcmVjdGl2ZVtdID0gW107XHJcbiAgcHVibGljIGNsYXNzTWFwOiBhbnkgPSB7fTtcclxuXHJcbiAgcHJvdGVjdGVkIGlzRGVzdHJveWVkOiBib29sZWFuO1xyXG4gIHByb3RlY3RlZCBfdmVydGljYWw6IGJvb2xlYW47XHJcbiAgcHJvdGVjdGVkIF9qdXN0aWZpZWQ6IGJvb2xlYW47XHJcbiAgcHJvdGVjdGVkIF9oYXNJbmZvOiBib29sZWFuO1xyXG4gIHByb3RlY3RlZCBfdHlwZTogc3RyaW5nO1xyXG5cclxuICBwdWJsaWMgY29uc3RydWN0b3IoY29uZmlnOiBUYWJzZXRDb25maWcpIHtcclxuICAgIE9iamVjdC5hc3NpZ24odGhpcywgY29uZmlnKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBuZ09uRGVzdHJveSgpOiB2b2lkIHtcclxuICAgIHRoaXMuaXNEZXN0cm95ZWQgPSB0cnVlO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGFkZFRhYih0YWI6IFRhYkRpcmVjdGl2ZSk6IHZvaWQge1xyXG4gICAgdGhpcy50YWJzLnB1c2godGFiKTtcclxuICAgIHRhYi5hY3RpdmUgPSB0aGlzLnRhYnMubGVuZ3RoID09PSAxICYmIHRhYi5hY3RpdmUgIT09IGZhbHNlO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHJlbW92ZVRhYih0YWI6IFRhYkRpcmVjdGl2ZSwgb3B0aW9ucyA9IHtyZXNlbGVjdDogdHJ1ZSwgZW1pdDogdHJ1ZX0pOiB2b2lkIHtcclxuICAgIGNvbnN0IGluZGV4ID0gdGhpcy50YWJzLmluZGV4T2YodGFiKTtcclxuICAgIGlmIChpbmRleCA9PT0gLTEgfHwgdGhpcy5pc0Rlc3Ryb3llZCkge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICAvLyBTZWxlY3QgYSBuZXcgdGFiIGlmIHRoZSB0YWIgdG8gYmUgcmVtb3ZlZCBpcyBzZWxlY3RlZCBhbmQgbm90IGRlc3Ryb3llZFxyXG4gICAgaWYgKG9wdGlvbnMucmVzZWxlY3QgJiYgdGFiLmFjdGl2ZSAmJiB0aGlzLmhhc0F2YWlsYWJsZVRhYnMoaW5kZXgpKSB7XHJcbiAgICAgIGNvbnN0IG5ld0FjdGl2ZUluZGV4ID0gdGhpcy5nZXRDbG9zZXN0VGFiSW5kZXgoaW5kZXgpO1xyXG4gICAgICB0aGlzLnRhYnNbbmV3QWN0aXZlSW5kZXhdLmFjdGl2ZSA9IHRydWU7XHJcbiAgICB9XHJcbiAgICBpZiAob3B0aW9ucy5lbWl0KSB7XHJcbiAgICAgIHRhYi5yZW1vdmVkLmVtaXQodGFiKTtcclxuICAgIH1cclxuICAgIHRoaXMudGFicy5zcGxpY2UoaW5kZXgsIDEpO1xyXG4gICAgaWYgKHRhYi5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQgJiYgdGFiLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudC5yZW1vdmUpIHtcclxuICAgICAgdGFiLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudC5yZW1vdmUoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByb3RlY3RlZCBnZXRDbG9zZXN0VGFiSW5kZXgoaW5kZXg6IG51bWJlcik6IG51bWJlciB7XHJcbiAgICBjb25zdCB0YWJzTGVuZ3RoID0gdGhpcy50YWJzLmxlbmd0aDtcclxuICAgIGlmICghdGFic0xlbmd0aCkge1xyXG4gICAgICByZXR1cm4gLTE7XHJcbiAgICB9XHJcblxyXG4gICAgZm9yIChsZXQgc3RlcCA9IDE7IHN0ZXAgPD0gdGFic0xlbmd0aDsgc3RlcCArPSAxKSB7XHJcbiAgICAgIGNvbnN0IHByZXZJbmRleCA9IGluZGV4IC0gc3RlcDtcclxuICAgICAgY29uc3QgbmV4dEluZGV4ID0gaW5kZXggKyBzdGVwO1xyXG4gICAgICBpZiAodGhpcy50YWJzW3ByZXZJbmRleF0gJiYgIXRoaXMudGFic1twcmV2SW5kZXhdLmRpc2FibGVkKSB7XHJcbiAgICAgICAgcmV0dXJuIHByZXZJbmRleDtcclxuICAgICAgfVxyXG4gICAgICBpZiAodGhpcy50YWJzW25leHRJbmRleF0gJiYgIXRoaXMudGFic1tuZXh0SW5kZXhdLmRpc2FibGVkKSB7XHJcbiAgICAgICAgcmV0dXJuIG5leHRJbmRleDtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIC0xO1xyXG4gIH1cclxuXHJcbiAgcHJvdGVjdGVkIGhhc0F2YWlsYWJsZVRhYnMoaW5kZXg6IG51bWJlcik6IGJvb2xlYW4ge1xyXG4gICAgY29uc3QgdGFic0xlbmd0aCA9IHRoaXMudGFicy5sZW5ndGg7XHJcbiAgICBpZiAoIXRhYnNMZW5ndGgpIHtcclxuICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG5cclxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGFic0xlbmd0aDsgaSArPSAxKSB7XHJcbiAgICAgIGlmICghdGhpcy50YWJzW2ldLmRpc2FibGVkICYmIGkgIT09IGluZGV4KSB7XHJcbiAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiBmYWxzZTtcclxuICB9XHJcblxyXG4gIHByb3RlY3RlZCBzZXRDbGFzc01hcCgpOiB2b2lkIHtcclxuICAgIHRoaXMuY2xhc3NNYXAgPSB7XHJcbiAgICAgICdpcy12ZXJ0aWNhbCc6IHRoaXMudmVydGljYWwsXHJcbiAgICAgICdpcy1qdXN0aWZpZWQnOiB0aGlzLmp1c3RpZmllZCxcclxuICAgICAgJ2hhcy1pbmZvJzogdGhpcy5oYXNJbmZvLFxyXG4gICAgICBbYGh4LW5hdi0ke3RoaXMudHlwZX1gXTogdHJ1ZVxyXG4gICAgfTtcclxuICB9XHJcbn1cclxuIl19