UNPKG

@taiga-ui/kit

Version:

Taiga UI Angular main components kit

97 lines 19.9 kB
import { NgTemplateOutlet } from '@angular/common'; import { ChangeDetectionStrategy, Component, inject, Input, signal, ViewChildren, } from '@angular/core'; import { takeUntilDestroyed, toSignal } from '@angular/core/rxjs-interop'; import { FormsModule } from '@angular/forms'; import { MutationObserverService, WA_MUTATION_OBSERVER_INIT, } from '@ng-web-apis/mutation-observer'; import { TuiRepeatTimes } from '@taiga-ui/cdk/directives/repeat-times'; import { tuiWatch } from '@taiga-ui/cdk/observables'; import { delay, map } from 'rxjs'; import * as i0 from "@angular/core"; class TuiPager { constructor() { this.start = 0; this.end = 0; this.left = signal(0); this.maxWidth = toSignal(inject(MutationObserverService, { self: true }).pipe(delay(0), map(() => this.visibleWidth), tuiWatch(), takeUntilDestroyed())); this.max = 6; this.count = this.max; this.size = 'm'; this.index = 0; } ngOnChanges() { this.move(); } ngAfterViewInit() { this.move(); } get gap() { return this.size === 'm' ? 9 : 7; } get visibleRange() { const max = this.max > this.count ? this.count : this.max; const start = Math.min(Math.max(this.index - Math.floor(max / 2), 0), this.count - max); return [start, start + (max - 1)]; } get visibleWidth() { return ((this.items?.map((item) => item.nativeElement.offsetWidth ?? 0) ?? []) .slice(this.start, this.end + 1) .reduce((sum, item) => sum + item + this.gap, 0) - this.gap); } move() { const [start, end] = this.visibleRange; this.start = start; this.end = end; let left = this.start * this.gap; for (let i = 0; i < this.start; i++) { left += this.items?.get(i)?.nativeElement.offsetWidth ?? 0; } this.left.set(-1 * left); } static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: TuiPager, deps: [], target: i0.ɵɵFactoryTarget.Component }); } static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: TuiPager, isStandalone: true, selector: "tui-pager", inputs: { max: "max", count: "count", size: "size", valueContent: "valueContent", index: "index" }, host: { properties: { "attr.data-size": "size", "style.--t-gap.px": "gap", "style.max-width.px": "maxWidth()" } }, providers: [ MutationObserverService, { provide: WA_MUTATION_OBSERVER_INIT, useValue: { attributeOldValue: true, characterData: true, childList: true, subtree: true, }, }, ], viewQueries: [{ propertyName: "items", predicate: ["item"], descendants: true }], usesOnChanges: true, ngImport: i0, template: "<div\n class=\"t-items\"\n [style.transform]=\"'translateX(' + left() + 'px)'\"\n>\n <div\n *tuiRepeatTimes=\"let i of count\"\n #item\n class=\"t-item\"\n [attr.data-index]=\"i\"\n [class._active]=\"i === index\"\n [class._last]=\"i === count - 1\"\n [class._post-active]=\"i === index + 1\"\n [class._pre-active]=\"i === index - 1\"\n [class._pre-last]=\"i === count - 2\"\n [class._visible]=\"i >= start && i <= end\"\n >\n <ng-container *ngTemplateOutlet=\"valueContent || null; context: {$implicit: i}\" />\n </div>\n</div>\n", styles: [":host{--t-size: .5rem;display:flex;align-items:center;overflow:hidden}:host :host-context(tui-root._mobile){--t-size: .375rem}:host[data-size=m]{min-block-size:1.25rem;--t-small-dot: scale(.75);--t-super-small-dot: scale(.5);--t-icon-size: 1rem}:host-context(tui-root._mobile) :host[data-size=m]{--t-icon-size: .875rem}:host[data-size=s]{min-block-size:1rem;--t-small-dot: scale(.5);--t-super-small-dot: scale(.25);--t-icon-size: .875rem}:host-context(tui-root._mobile) :host[data-size=s]{--t-icon-size: .6875rem}.t-items{display:flex;gap:var(--t-gap);transition:transform var(--tui-duration-fast, .15s) var(--tui-curve-productive-standard, cubic-bezier(.2, 0, .4, .9))}.t-item{display:flex;align-self:center;align-items:center;justify-content:center;color:var(--tui-background-neutral-2)}.t-item._active{color:var(--tui-background-accent-1)}.t-item:empty:before{content:\"\";display:flex;min-inline-size:var(--t-size);min-block-size:var(--t-size);border-radius:100%;background:currentColor;transition:inherit}.t-item:empty:not(._visible):before,.t-item:empty:not(._visible)+.t-item:not(._active):not(._pre-active):empty:before,.t-item:empty:not(._last):not(._post-active):not(._active):nth-last-child(1 of._visible):before{transform:var(--t-super-small-dot)!important}.t-item:empty:not(._last)._post-active:nth-last-child(1 of._visible):before,.t-item:empty:not(._visible)+.t-item._pre-active:empty:before,.t-item:empty:not(._visible)+.t-item:empty+.t-item:not(._active):empty:before,.t-item:empty:not(._pre-last):nth-last-child(2 of._visible):not(._active):before{transform:var(--t-small-dot)}.t-item:empty+.t-item:not(:empty)._pre-last{transform:scale(.64)}.t-item:empty+.t-item:not(:empty)._pre-last:nth-last-child(2 of._visible){transform:scale(1)}.t-item::ng-deep>tui-icon{inline-size:var(--t-icon-size);block-size:var(--t-icon-size)}.t-item,.t-item::ng-deep>tui-icon{transition:all var(--tui-duration-fast, .15s) var(--tui-curve-productive-standard, cubic-bezier(.2, 0, .4, .9))}\n"], dependencies: [{ kind: "ngmodule", type: FormsModule }, { kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: TuiRepeatTimes, selector: "[tuiRepeatTimes][tuiRepeatTimesOf]", inputs: ["tuiRepeatTimesOf"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); } } export { TuiPager }; i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: TuiPager, decorators: [{ type: Component, args: [{ standalone: true, selector: 'tui-pager', imports: [FormsModule, NgTemplateOutlet, TuiRepeatTimes], changeDetection: ChangeDetectionStrategy.OnPush, providers: [ MutationObserverService, { provide: WA_MUTATION_OBSERVER_INIT, useValue: { attributeOldValue: true, characterData: true, childList: true, subtree: true, }, }, ], host: { '[attr.data-size]': 'size', '[style.--t-gap.px]': 'gap', '[style.max-width.px]': 'maxWidth()', }, template: "<div\n class=\"t-items\"\n [style.transform]=\"'translateX(' + left() + 'px)'\"\n>\n <div\n *tuiRepeatTimes=\"let i of count\"\n #item\n class=\"t-item\"\n [attr.data-index]=\"i\"\n [class._active]=\"i === index\"\n [class._last]=\"i === count - 1\"\n [class._post-active]=\"i === index + 1\"\n [class._pre-active]=\"i === index - 1\"\n [class._pre-last]=\"i === count - 2\"\n [class._visible]=\"i >= start && i <= end\"\n >\n <ng-container *ngTemplateOutlet=\"valueContent || null; context: {$implicit: i}\" />\n </div>\n</div>\n", styles: [":host{--t-size: .5rem;display:flex;align-items:center;overflow:hidden}:host :host-context(tui-root._mobile){--t-size: .375rem}:host[data-size=m]{min-block-size:1.25rem;--t-small-dot: scale(.75);--t-super-small-dot: scale(.5);--t-icon-size: 1rem}:host-context(tui-root._mobile) :host[data-size=m]{--t-icon-size: .875rem}:host[data-size=s]{min-block-size:1rem;--t-small-dot: scale(.5);--t-super-small-dot: scale(.25);--t-icon-size: .875rem}:host-context(tui-root._mobile) :host[data-size=s]{--t-icon-size: .6875rem}.t-items{display:flex;gap:var(--t-gap);transition:transform var(--tui-duration-fast, .15s) var(--tui-curve-productive-standard, cubic-bezier(.2, 0, .4, .9))}.t-item{display:flex;align-self:center;align-items:center;justify-content:center;color:var(--tui-background-neutral-2)}.t-item._active{color:var(--tui-background-accent-1)}.t-item:empty:before{content:\"\";display:flex;min-inline-size:var(--t-size);min-block-size:var(--t-size);border-radius:100%;background:currentColor;transition:inherit}.t-item:empty:not(._visible):before,.t-item:empty:not(._visible)+.t-item:not(._active):not(._pre-active):empty:before,.t-item:empty:not(._last):not(._post-active):not(._active):nth-last-child(1 of._visible):before{transform:var(--t-super-small-dot)!important}.t-item:empty:not(._last)._post-active:nth-last-child(1 of._visible):before,.t-item:empty:not(._visible)+.t-item._pre-active:empty:before,.t-item:empty:not(._visible)+.t-item:empty+.t-item:not(._active):empty:before,.t-item:empty:not(._pre-last):nth-last-child(2 of._visible):not(._active):before{transform:var(--t-small-dot)}.t-item:empty+.t-item:not(:empty)._pre-last{transform:scale(.64)}.t-item:empty+.t-item:not(:empty)._pre-last:nth-last-child(2 of._visible){transform:scale(1)}.t-item::ng-deep>tui-icon{inline-size:var(--t-icon-size);block-size:var(--t-icon-size)}.t-item,.t-item::ng-deep>tui-icon{transition:all var(--tui-duration-fast, .15s) var(--tui-curve-productive-standard, cubic-bezier(.2, 0, .4, .9))}\n"] }] }], propDecorators: { items: [{ type: ViewChildren, args: ['item'] }], max: [{ type: Input }], count: [{ type: Input }], size: [{ type: Input }], valueContent: [{ type: Input }], index: [{ type: Input }] } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGFnZXIuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMva2l0L2NvbXBvbmVudHMvcGFnZXIvcGFnZXIuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMva2l0L2NvbXBvbmVudHMvcGFnZXIvcGFnZXIuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFDLGdCQUFnQixFQUFDLE1BQU0saUJBQWlCLENBQUM7QUFRakQsT0FBTyxFQUNILHVCQUF1QixFQUN2QixTQUFTLEVBQ1QsTUFBTSxFQUNOLEtBQUssRUFDTCxNQUFNLEVBQ04sWUFBWSxHQUNmLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBQyxrQkFBa0IsRUFBRSxRQUFRLEVBQUMsTUFBTSw0QkFBNEIsQ0FBQztBQUN4RSxPQUFPLEVBQUMsV0FBVyxFQUFDLE1BQU0sZ0JBQWdCLENBQUM7QUFDM0MsT0FBTyxFQUNILHVCQUF1QixFQUN2Qix5QkFBeUIsR0FDNUIsTUFBTSxnQ0FBZ0MsQ0FBQztBQUN4QyxPQUFPLEVBQUMsY0FBYyxFQUFDLE1BQU0sdUNBQXVDLENBQUM7QUFDckUsT0FBTyxFQUFDLFFBQVEsRUFBQyxNQUFNLDJCQUEyQixDQUFDO0FBRW5ELE9BQU8sRUFBQyxLQUFLLEVBQUUsR0FBRyxFQUFDLE1BQU0sTUFBTSxDQUFDOztBQUVoQyxNQXlCYSxRQUFRO0lBekJyQjtRQTZCYyxVQUFLLEdBQUcsQ0FBQyxDQUFDO1FBQ1YsUUFBRyxHQUFHLENBQUMsQ0FBQztRQUNSLFNBQUksR0FBRyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDUixhQUFRLEdBQUcsUUFBUSxDQUNsQyxNQUFNLENBQUMsdUJBQXVCLEVBQUUsRUFBQyxJQUFJLEVBQUUsSUFBSSxFQUFDLENBQUMsQ0FBQyxJQUFJLENBQzlDLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFDUixHQUFHLENB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QUNoQjthQUNKO1NBQ0osaUlDN0NMLGduQkFtQkEsNi9ERFdjLFdBQVcsK0JBQUUsZ0JBQWdCLG9KQUFFLGNBQWM7O1NBc0I5QyxRQUFROzRGQUFSLFFBQVE7a0JBekJwQixTQUFTO2lDQUNNLElBQUksWUFDTixXQUFXLFdBQ1osQ0FBQyxXQUFXLEVBQUUsZ0JBQWdCLEVBQUUsY0FBYyxDQUFDLG1CQUd2Qyx1QkFBdUIsQ0FBQyxNQUFNLGFBQ3BDO3dCQUNQLHVCQUF1Qjt3QkFDdkI7NEJBQ0ksT0FBTyxFQUFFLHlCQUF5Qjs0QkFDbEMsUUFBUSxFQUFFO2dDQUNOLGlCQUFpQixFQUFFLElBQUk7Z0NBQ3ZCLGFBQWEsRUFBRSxJQUFJO2dDQUNuQixTQUFTLEVBQUUsSUFBSTtnQ0FDZixPQUFPLEVBQUUsSUFBSTs2QkFDaEI7eUJBQ0o7cUJBQ0osUUFDSzt3QkFDRixrQkFBa0IsRUFBRSxNQUFNO3dCQUMxQixvQkFBb0IsRUFBRSxLQUFLO3dCQUMzQixzQkFBc0IsRUFBRSxZQUFZO3FCQUN2Qzs4QkFJUyxLQUFLO3NCQURkLFlBQVk7dUJBQUMsTUFBTTtnQkFnQmIsR0FBRztzQkFEVCxLQUFLO2dCQUlDLEtBQUs7c0JBRFgsS0FBSztnQkFJQyxJQUFJO3NCQURWLEtBQUs7Z0JBSUMsWUFBWTtzQkFEbEIsS0FBSztnQkFJQyxLQUFLO3NCQURYLEtBQUsiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge05nVGVtcGxhdGVPdXRsZXR9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQgdHlwZSB7XG4gICAgQWZ0ZXJWaWV3SW5pdCxcbiAgICBFbGVtZW50UmVmLFxuICAgIE9uQ2hhbmdlcyxcbiAgICBRdWVyeUxpc3QsXG4gICAgVGVtcGxhdGVSZWYsXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHtcbiAgICBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSxcbiAgICBDb21wb25lbnQsXG4gICAgaW5qZWN0LFxuICAgIElucHV0LFxuICAgIHNpZ25hbCxcbiAgICBWaWV3Q2hpbGRyZW4sXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHt0YWtlVW50aWxEZXN0cm95ZWQsIHRvU2lnbmFsfSBmcm9tICdAYW5ndWxhci9jb3JlL3J4anMtaW50ZXJvcCc7XG5pbXBvcnQge0Zvcm1zTW9kdWxlfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQge1xuICAgIE11dGF0aW9uT2JzZXJ2ZXJTZXJ2aWNlLFxuICAgIFdBX01VVEFUSU9OX09CU0VSVkVSX0lOSVQsXG59IGZyb20gJ0BuZy13ZWItYXBpcy9tdXRhdGlvbi1vYnNlcnZlcic7XG5pbXBvcnQge1R1aVJlcGVhdFRpbWVzfSBmcm9tICdAdGFpZ2EtdWkvY2RrL2RpcmVjdGl2ZXMvcmVwZWF0LXRpbWVzJztcbmltcG9ydCB7dHVpV2F0Y2h9IGZyb20gJ0B0YWlnYS11aS9jZGsvb2JzZXJ2YWJsZXMnO1xuaW1wb3J0IHR5cGUge1R1aVNpemVTfSBmcm9tICdAdGFpZ2EtdWkvY29yZS90eXBlcyc7XG5pbXBvcnQge2RlbGF5LCBtYXB9IGZyb20gJ3J4anMnO1xuXG5AQ29tcG9uZW50KHtcbiAgICBzdGFuZGFsb25lOiB0cnVlLFxuICAgIHNlbGVjdG9yOiAndHVpLXBhZ2VyJyxcbiAgICBpbXBvcnRzOiBbRm9ybXNNb2R1bGUsIE5nVGVtcGxhdGVPdXRsZXQsIFR1aVJlcGVhdFRpbWVzXSxcbiAgICB0ZW1wbGF0ZVVybDogJy4vcGFnZXIuY29tcG9uZW50Lmh0bWwnLFxuICAgIHN0eWxlVXJsczogWycuL3BhZ2VyLnN0eWxlcy5sZXNzJ10sXG4gICAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG4gICAgcHJvdmlkZXJzOiBbXG4gICAgICAgIE11dGF0aW9uT2JzZXJ2ZXJTZXJ2aWNlLFxuICAgICAgICB7XG4gICAgICAgICAgICBwcm92aWRlOiBXQV9NVVRBVElPTl9PQlNFUlZFUl9JTklULFxuICAgICAgICAgICAgdXNlVmFsdWU6IHtcbiAgICAgICAgICAgICAgICBhdHRyaWJ1dGVPbGRWYWx1ZTogdHJ1ZSxcbiAgICAgICAgICAgICAgICBjaGFyYWN0ZXJEYXRhOiB0cnVlLFxuICAgICAgICAgICAgICAgIGNoaWxkTGlzdDogdHJ1ZSxcbiAgICAgICAgICAgICAgICBzdWJ0cmVlOiB0cnVlLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICBdLFxuICAgIGhvc3Q6IHtcbiAgICAgICAgJ1thdHRyLmRhdGEtc2l6ZV0nOiAnc2l6ZScsXG4gICAgICAgICdbc3R5bGUuLS10LWdhcC5weF0nOiAnZ2FwJyxcbiAgICAgICAgJ1tzdHlsZS5tYXgtd2lkdGgucHhdJzogJ21heFdpZHRoKCknLFxuICAgIH0sXG59KVxuZXhwb3J0IGNsYXNzIFR1aVBhZ2VyIGltcGxlbWVudHMgT25DaGFuZ2VzLCBBZnRlclZpZXdJbml0IHtcbiAgICBAVmlld0NoaWxkcmVuKCdpdGVtJylcbiAgICBwcm90ZWN0ZWQgaXRlbXM/OiBRdWVyeUxpc3Q8RWxlbWVudFJlZjxIVE1MRWxlbWVudD4+O1xuXG4gICAgcHJvdGVjdGVkIHN0YXJ0ID0gMDtcbiAgICBwcm90ZWN0ZWQgZW5kID0gMDtcbiAgICBwcm90ZWN0ZWQgbGVmdCA9IHNpZ25hbCgwKTtcbiAgICBwcm90ZWN0ZWQgcmVhZG9ubHkgbWF4V2lkdGggPSB0b1NpZ25hbChcbiAgICAgICAgaW5qZWN0KE11dGF0aW9uT2JzZXJ2ZXJTZXJ2aWNlLCB7c2VsZjogdHJ1ZX0pLnBpcGUoXG4gICAgICAgICAgICBkZWxheSgwKSxcbiAgICAgICAgICAgIG1hcCgoKSA9PiB0aGlzLnZpc2libGVXaWR0aCksXG4gICAgICAgICAgICB0dWlXYXRjaCgpLFxuICAgICAgICAgICAgdGFrZVVudGlsRGVzdHJveWVkKCksXG4gICAgICAgICksXG4gICAgKTtcblxuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIG1heCA9IDY7XG5cbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyBjb3VudCA9IHRoaXMubWF4O1xuXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgc2l6ZTogVHVpU2l6ZVMgPSAnbSc7XG5cbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyB2YWx1ZUNvbnRlbnQ/OiBUZW1wbGF0ZVJlZjx1bmtub3duPjtcblxuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIGluZGV4ID0gMDtcblxuICAgIHB1YmxpYyBuZ09uQ2hhbmdlcygpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5tb3ZlKCk7XG4gICAgfVxuXG4gICAgcHVibGljIG5nQWZ0ZXJWaWV3SW5pdCgpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5tb3ZlKCk7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIGdldCBnYXAoKTogbnVtYmVyIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc2l6ZSA9PT0gJ20nID8gOSA6IDc7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBnZXQgdmlzaWJsZVJhbmdlKCk6IFtzdGFydDogbnVtYmVyLCBlbmQ6IG51bWJlcl0ge1xuICAgICAgICBjb25zdCBtYXggPSB0aGlzLm1heCA+IHRoaXMuY291bnQgPyB0aGlzLmNvdW50IDogdGhpcy5tYXg7XG5cbiAgICAgICAgY29uc3Qgc3RhcnQgPSBNYXRoLm1pbihcbiAgICAgICAgICAgIE1hdGgubWF4KHRoaXMuaW5kZXggLSBNYXRoLmZsb29yKG1heCAvIDIpLCAwKSxcbiAgICAgICAgICAgIHRoaXMuY291bnQgLSBtYXgsXG4gICAgICAgICk7XG5cbiAgICAgICAgcmV0dXJuIFtzdGFydCwgc3RhcnQgKyAobWF4IC0gMSldO1xuICAgIH1cblxuICAgIHByaXZhdGUgZ2V0IHZpc2libGVXaWR0aCgpOiBudW1iZXIge1xuICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgKHRoaXMuaXRlbXM/Lm1hcCgoaXRlbSkgPT4gaXRlbS5uYXRpdmVFbGVtZW50Lm9mZnNldFdpZHRoID8/IDApID8/IFtdKVxuICAgICAgICAgICAgICAgIC5zbGljZSh0aGlzLnN0YXJ0LCB0aGlzLmVuZCArIDEpXG4gICAgICAgICAgICAgICAgLnJlZHVjZSgoc3VtLCBpdGVtKSA9PiBzdW0gKyBpdGVtICsgdGhpcy5nYXAsIDApIC0gdGhpcy5nYXBcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIG1vdmUoKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IFtzdGFydCwgZW5kXSA9IHRoaXMudmlzaWJsZVJhbmdlO1xuXG4gICAgICAgIHRoaXMuc3RhcnQgPSBzdGFydDtcbiAgICAgICAgdGhpcy5lbmQgPSBlbmQ7XG5cbiAgICAgICAgbGV0IGxlZnQgPSB0aGlzLnN0YXJ0ICogdGhpcy5nYXA7XG5cbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLnN0YXJ0OyBpKyspIHtcbiAgICAgICAgICAgIGxlZnQgKz0gdGhpcy5pdGVtcz8uZ2V0KGkpPy5uYXRpdmVFbGVtZW50Lm9mZnNldFdpZHRoID8/IDA7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmxlZnQuc2V0KC0xICogbGVmdCk7XG4gICAgfVxufVxuIiwiPGRpdlxuICAgIGNsYXNzPVwidC1pdGVtc1wiXG4gICAgW3N0eWxlLnRyYW5zZm9ybV09XCIndHJhbnNsYXRlWCgnICsgbGVmdCgpICsgJ3B4KSdcIlxuPlxuICAgIDxkaXZcbiAgICAgICAgKnR1aVJlcGVhdFRpbWVzPVwibGV0IGkgb2YgY291bnRcIlxuICAgICAgICAjaXRlbVxuICAgICAgICBjbGFzcz1cInQtaXRlbVwiXG4gICAgICAgIFthdHRyLmRhdGEtaW5kZXhdPVwiaVwiXG4gICAgICAgIFtjbGFzcy5fYWN0aXZlXT1cImkgPT09IGluZGV4XCJcbiAgICAgICAgW2NsYXNzLl9sYXN0XT1cImkgPT09IGNvdW50IC0gMVwiXG4gICAgICAgIFtjbGFzcy5fcG9zdC1hY3RpdmVdPVwiaSA9PT0gaW5kZXggKyAxXCJcbiAgICAgICAgW2NsYXNzLl9wcmUtYWN0aXZlXT1cImkgPT09IGluZGV4IC0gMVwiXG4gICAgICAgIFtjbGFzcy5fcHJlLWxhc3RdPVwiaSA9PT0gY291bnQgLSAyXCJcbiAgICAgICAgW2NsYXNzLl92aXNpYmxlXT1cImkgPj0gc3RhcnQgJiYgaSA8PSBlbmRcIlxuICAgID5cbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cInZhbHVlQ29udGVudCB8fCBudWxsOyBjb250ZXh0OiB7JGltcGxpY2l0OiBpfVwiIC8+XG4gICAgPC9kaXY+XG48L2Rpdj5cbiJdfQ==