@taiga-ui/addon-table
Version:
A library to display tabled data with filters, search, group actions, etc.
87 lines • 21.4 kB
JavaScript
/// <reference types="@taiga-ui/tsconfig/ng-dev-mode" />
/// <reference types="@taiga-ui/tsconfig/ng-dev-mode" />
import { AsyncPipe, NgIf, NgTemplateOutlet } from '@angular/common';
import { ChangeDetectionStrategy, Component, forwardRef, inject, Input, } from '@angular/core';
import { tuiDefaultSort } from '@taiga-ui/cdk/utils/miscellaneous';
import { TuiIcon } from '@taiga-ui/core/components/icon';
import { TuiTableHead } from '../directives/head.directive';
import { TuiTableResized } from '../directives/resized.directive';
import { TuiTableDirective } from '../directives/table.directive';
import { TUI_TABLE_OPTIONS, TuiSortDirection } from '../table.options';
import * as i0 from "@angular/core";
class TuiTableTh {
constructor() {
this.options = inject(TUI_TABLE_OPTIONS);
this.head = inject(TuiTableHead, {
optional: true,
});
this.width = null;
this.table = inject(forwardRef(() => TuiTableDirective), { optional: true });
this.minWidth = -Infinity;
this.maxWidth = Infinity;
this.sorter = this.head
? (a, b) => tuiDefaultSort(a[this.key], b[this.key])
: null;
this.resizable = this.options.resizable;
this.sticky = this.options.sticky;
this.requiredSort = this.options.requiredSort;
}
get key() {
if (!this.head) {
throw new TuiTableSortKeyException();
}
return this.head.tuiHead;
}
get isCurrent() {
return !!this.sorter && !!this.table && this.sorter === this.table.sorter;
}
get icon() {
if (this.isCurrent) {
return this.table?.direction === TuiSortDirection.Asc
? this.options.sortIcons.asc
: this.options.sortIcons.desc;
}
return this.options.sortIcons.off;
}
updateSorterAndDirection() {
const sorter = this.requiredSort ? this.sorter : null;
this.table?.updateSorterAndDirection(this.isCurrentAndDescDirection ? sorter : this.sorter);
}
onResized(width) {
this.width = Math.min(Math.max(width, this.minWidth), this.maxWidth);
}
get isCurrentAndDescDirection() {
return (this.sorter === this.table?.sorter &&
this.table?.direction === TuiSortDirection.Desc);
}
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: TuiTableTh, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: TuiTableTh, isStandalone: true, selector: "th[tuiTh]", inputs: { minWidth: "minWidth", maxWidth: "maxWidth", sorter: "sorter", resizable: "resizable", sticky: "sticky", requiredSort: "requiredSort" }, host: { properties: { "style.min-width.px": "width || minWidth", "style.width.px": "width || minWidth", "style.max-width.px": "width || maxWidth", "class._sticky": "sticky" } }, ngImport: i0, template: "<button\n *ngIf=\"sorter && table; else content\"\n type=\"button\"\n class=\"t-sort\"\n [class.t-sort_sorted]=\"isCurrent\"\n (click)=\"updateSorterAndDirection()\"\n>\n <ng-container [ngTemplateOutlet]=\"content\" />\n {{ table && table.change$ | async }}\n <tui-icon\n class=\"t-icon\"\n [icon]=\"icon\"\n />\n</button>\n<ng-template #content>\n <ng-content />\n</ng-template>\n<div\n *ngIf=\"resizable\"\n class=\"t-bar\"\n (tuiResized)=\"onResized($event)\"\n></div>\n", styles: [":host{transition-property:box-shadow;transition-duration:var(--tui-duration, .3s);transition-timing-function:ease-in-out;position:relative;top:0;block-size:var(--tui-height-m);font:var(--tui-font-text-s);text-align:start;font-weight:700;color:var(--tui-text-secondary);background:var(--tui-background-base);cursor:default;padding:0 .75rem;box-sizing:border-box;box-shadow:0 .3125rem #ededed00;border:1px solid var(--tui-border-normal);filter:opacity(1)}@supports (-webkit-hyphens: none){:host{transform:translateZ(0)}}:host:not(:first-child){border-inline-start:none}:host._sticky,:host-context(._stuck) :host._sticky{position:sticky;z-index:30}:host._sticky:first-child,:host-context(._stuck) :host._sticky:first-child{left:0}:host._sticky:after,:host-context(._stuck) :host._sticky:after{transition-property:opacity;transition-duration:var(--tui-duration, .3s);transition-timing-function:ease-in-out;content:\"\";position:absolute;top:0;left:100%;bottom:0;inline-size:.3125rem;pointer-events:none;background:#edededb3;opacity:0}:host-context(._stuck) :host{z-index:20}:host-context(tr:not(:first-child)){border-block-start:none}:host-context(table[data-size=\"l\"]){block-size:var(--tui-height-l);font:var(--tui-font-text-m);font-weight:700;padding:0 1rem}:host-context(table[data-size=\"s\"]){block-size:var(--tui-height-s);font:var(--tui-font-text-s);font-weight:700;padding:0 .5rem}:host-context(thead[tuiThead]){position:sticky}:host-context(table._stuck)._sticky:after{opacity:1}:host-context(thead[tuiThead]._stuck){box-shadow:0 .3125rem #edededb3}:host-context([tuiTheme=\"dark\"])._sticky:after{background:#3c3c3ce6}:host-context([tuiTheme=\"dark\"] thead[tuiThead]._stuck){box-shadow:0 .3125rem #3c3c3ce6}:host-context([tuiTheme=\"dark\"] thead[tuiThead]._stuck):first-child{box-shadow:.0625rem .3125rem #3c3c3ce6}:host-context(table[data-size=\"l\"] thead[tuiThead] tr:nth-child(2)){top:var(--tui-height-l)}:host-context(table[data-size=\"m\"] thead[tuiThead] tr:nth-child(2)){top:var(--tui-height-m)}:host-context(table[data-size=\"s\"] thead[tuiThead] tr:nth-child(2)){top:var(--tui-height-s)}.t-sort{transition-property:color;transition-duration:var(--tui-duration, .3s);transition-timing-function:ease-in-out;-webkit-appearance:none;appearance:none;padding:0;border:0;background:none;line-height:inherit;text-decoration:none;display:inline-flex;vertical-align:top;flex-direction:inherit;align-items:center;outline:none;font:inherit;text-transform:inherit;color:inherit;cursor:pointer}.t-sort_sorted{color:var(--tui-text-primary)}.t-sort:focus-visible{background:var(--tui-service-selection-background)}.t-sort:hover{color:var(--tui-text-primary)}.t-bar{transition-property:opacity;transition-duration:var(--tui-duration, .3s);transition-timing-function:ease-in-out;position:absolute;top:0;bottom:0;right:-1px;inline-size:.1875rem;justify-self:flex-end;border-inline-start:2px solid transparent;background:var(--tui-status-warning);background-clip:content-box;cursor:ew-resize;opacity:0}.t-bar:hover,.t-bar:active{opacity:1}.t-icon{border-width:.25rem}\n"], dependencies: [{ kind: "pipe", type: AsyncPipe, name: "async" }, { kind: "directive", type: NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: TuiIcon, selector: "tui-icon", inputs: ["icon", "background"] }, { kind: "directive", type: TuiTableResized, selector: "[tuiResized]", outputs: ["tuiResized"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
}
export { TuiTableTh };
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: TuiTableTh, decorators: [{
type: Component,
args: [{ standalone: true, selector: 'th[tuiTh]', imports: [AsyncPipe, NgIf, NgTemplateOutlet, TuiIcon, TuiTableResized], changeDetection: ChangeDetectionStrategy.OnPush, host: {
'[style.min-width.px]': 'width || minWidth',
'[style.width.px]': 'width || minWidth',
'[style.max-width.px]': 'width || maxWidth',
'[class._sticky]': 'sticky',
}, template: "<button\n *ngIf=\"sorter && table; else content\"\n type=\"button\"\n class=\"t-sort\"\n [class.t-sort_sorted]=\"isCurrent\"\n (click)=\"updateSorterAndDirection()\"\n>\n <ng-container [ngTemplateOutlet]=\"content\" />\n {{ table && table.change$ | async }}\n <tui-icon\n class=\"t-icon\"\n [icon]=\"icon\"\n />\n</button>\n<ng-template #content>\n <ng-content />\n</ng-template>\n<div\n *ngIf=\"resizable\"\n class=\"t-bar\"\n (tuiResized)=\"onResized($event)\"\n></div>\n", styles: [":host{transition-property:box-shadow;transition-duration:var(--tui-duration, .3s);transition-timing-function:ease-in-out;position:relative;top:0;block-size:var(--tui-height-m);font:var(--tui-font-text-s);text-align:start;font-weight:700;color:var(--tui-text-secondary);background:var(--tui-background-base);cursor:default;padding:0 .75rem;box-sizing:border-box;box-shadow:0 .3125rem #ededed00;border:1px solid var(--tui-border-normal);filter:opacity(1)}@supports (-webkit-hyphens: none){:host{transform:translateZ(0)}}:host:not(:first-child){border-inline-start:none}:host._sticky,:host-context(._stuck) :host._sticky{position:sticky;z-index:30}:host._sticky:first-child,:host-context(._stuck) :host._sticky:first-child{left:0}:host._sticky:after,:host-context(._stuck) :host._sticky:after{transition-property:opacity;transition-duration:var(--tui-duration, .3s);transition-timing-function:ease-in-out;content:\"\";position:absolute;top:0;left:100%;bottom:0;inline-size:.3125rem;pointer-events:none;background:#edededb3;opacity:0}:host-context(._stuck) :host{z-index:20}:host-context(tr:not(:first-child)){border-block-start:none}:host-context(table[data-size=\"l\"]){block-size:var(--tui-height-l);font:var(--tui-font-text-m);font-weight:700;padding:0 1rem}:host-context(table[data-size=\"s\"]){block-size:var(--tui-height-s);font:var(--tui-font-text-s);font-weight:700;padding:0 .5rem}:host-context(thead[tuiThead]){position:sticky}:host-context(table._stuck)._sticky:after{opacity:1}:host-context(thead[tuiThead]._stuck){box-shadow:0 .3125rem #edededb3}:host-context([tuiTheme=\"dark\"])._sticky:after{background:#3c3c3ce6}:host-context([tuiTheme=\"dark\"] thead[tuiThead]._stuck){box-shadow:0 .3125rem #3c3c3ce6}:host-context([tuiTheme=\"dark\"] thead[tuiThead]._stuck):first-child{box-shadow:.0625rem .3125rem #3c3c3ce6}:host-context(table[data-size=\"l\"] thead[tuiThead] tr:nth-child(2)){top:var(--tui-height-l)}:host-context(table[data-size=\"m\"] thead[tuiThead] tr:nth-child(2)){top:var(--tui-height-m)}:host-context(table[data-size=\"s\"] thead[tuiThead] tr:nth-child(2)){top:var(--tui-height-s)}.t-sort{transition-property:color;transition-duration:var(--tui-duration, .3s);transition-timing-function:ease-in-out;-webkit-appearance:none;appearance:none;padding:0;border:0;background:none;line-height:inherit;text-decoration:none;display:inline-flex;vertical-align:top;flex-direction:inherit;align-items:center;outline:none;font:inherit;text-transform:inherit;color:inherit;cursor:pointer}.t-sort_sorted{color:var(--tui-text-primary)}.t-sort:focus-visible{background:var(--tui-service-selection-background)}.t-sort:hover{color:var(--tui-text-primary)}.t-bar{transition-property:opacity;transition-duration:var(--tui-duration, .3s);transition-timing-function:ease-in-out;position:absolute;top:0;bottom:0;right:-1px;inline-size:.1875rem;justify-self:flex-end;border-inline-start:2px solid transparent;background:var(--tui-status-warning);background-clip:content-box;cursor:ew-resize;opacity:0}.t-bar:hover,.t-bar:active{opacity:1}.t-icon{border-width:.25rem}\n"] }]
}], propDecorators: { minWidth: [{
type: Input
}], maxWidth: [{
type: Input
}], sorter: [{
type: Input
}], resizable: [{
type: Input
}], sticky: [{
type: Input
}], requiredSort: [{
type: Input
}] } });
export class TuiTableSortKeyException extends Error {
constructor() {
super(ngDevMode ? 'Trying to sort with no key' : '');
}
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGguY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvYWRkb24tdGFibGUvY29tcG9uZW50cy90YWJsZS90aC90aC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9hZGRvbi10YWJsZS9jb21wb25lbnRzL3RhYmxlL3RoL3RoLnRlbXBsYXRlLmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsd0RBQXdEO0FBQXhELHdEQUF3RDtBQUN4RCxPQUFPLEVBQUMsU0FBUyxFQUFFLElBQUksRUFBRSxnQkFBZ0IsRUFBQyxNQUFNLGlCQUFpQixDQUFDO0FBQ2xFLE9BQU8sRUFDSCx1QkFBdUIsRUFDdkIsU0FBUyxFQUNULFVBQVUsRUFDVixNQUFNLEVBQ04sS0FBSyxHQUNSLE1BQU0sZUFBZSxDQUFDO0FBRXZCLE9BQU8sRUFBQyxjQUFjLEVBQUMsTUFBTSxtQ0FBbUMsQ0FBQztBQUNqRSxPQUFPLEVBQUMsT0FBTyxFQUFDLE1BQU0sZ0NBQWdDLENBQUM7QUFFdkQsT0FBTyxFQUFDLFlBQVksRUFBQyxNQUFNLDhCQUE4QixDQUFDO0FBQzFELE9BQU8sRUFBQyxlQUFlLEVBQUMsTUFBTSxpQ0FBaUMsQ0FBQztBQUNoRSxPQUFPLEVBQUMsaUJBQWlCLEVBQUMsTUFBTSwrQkFBK0IsQ0FBQztBQUNoRSxPQUFPLEVBQUMsaUJBQWlCLEVBQUUsZ0JBQWdCLEVBQUMsTUFBTSxrQkFBa0IsQ0FBQzs7QUFFckUsTUFjYSxVQUFVO0lBZHZCO1FBZXFCLFlBQU8sR0FBRyxNQUFNLENBQUMsaUJBQWlCLENBQUMsQ0FBQztRQUVwQyxTQUFJLEdBQUcsTUFBTSxDQUFrQixZQUFZLEVBQUU7WUFDMUQsUUFBUSxFQUFFLElBQUk7U0FDakIsQ0FBQyxDQUFDO1FBRU8sVUFBSyxHQUFrQixJQUFJLENBQUM7UUFFbkIsVUFBSyxHQUFHLE1BQU0sQ0FDN0IsVUFBVSxDQUFDLEdBQUcs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QUN6Qzt3QkFDRixzQkFBc0IsRUFBRSxtQkFBbUI7d0JBQzNDLGtCQUFrQixFQUFFLG1CQUFtQjt3QkFDdkMsc0JBQXNCLEVBQUUsbUJBQW1CO3dCQUMzQyxpQkFBaUIsRUFBRSxRQUFRO3FCQUM5Qjs4QkFpQk0sUUFBUTtzQkFEZCxLQUFLO2dCQUlDLFFBQVE7c0JBRGQsS0FBSztnQkFJQyxNQUFNO3NCQURaLEtBQUs7Z0JBTUMsU0FBUztzQkFEZixLQUFLO2dCQUlDLE1BQU07c0JBRFosS0FBSztnQkFJQyxZQUFZO3NCQURsQixLQUFLOztBQTZDVixNQUFNLE9BQU8sd0JBQXlCLFNBQVEsS0FBSztJQUMvQztRQUNJLEtBQUssQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLDRCQUE0QixDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQztJQUN6RCxDQUFDO0NBQ0oiLCJzb3VyY2VzQ29udGVudCI6WyIvLy8gPHJlZmVyZW5jZSB0eXBlcz1cIkB0YWlnYS11aS90c2NvbmZpZy9uZy1kZXYtbW9kZVwiIC8+XG5pbXBvcnQge0FzeW5jUGlwZSwgTmdJZiwgTmdUZW1wbGF0ZU91dGxldH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7XG4gICAgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksXG4gICAgQ29tcG9uZW50LFxuICAgIGZvcndhcmRSZWYsXG4gICAgaW5qZWN0LFxuICAgIElucHV0LFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7dHlwZSBUdWlDb21wYXJhdG9yfSBmcm9tICdAdGFpZ2EtdWkvYWRkb24tdGFibGUvdHlwZXMnO1xuaW1wb3J0IHt0dWlEZWZhdWx0U29ydH0gZnJvbSAnQHRhaWdhLXVpL2Nkay91dGlscy9taXNjZWxsYW5lb3VzJztcbmltcG9ydCB7VHVpSWNvbn0gZnJvbSAnQHRhaWdhLXVpL2NvcmUvY29tcG9uZW50cy9pY29uJztcblxuaW1wb3J0IHtUdWlUYWJsZUhlYWR9IGZyb20gJy4uL2RpcmVjdGl2ZXMvaGVhZC5kaXJlY3RpdmUnO1xuaW1wb3J0IHtUdWlUYWJsZVJlc2l6ZWR9IGZyb20gJy4uL2RpcmVjdGl2ZXMvcmVzaXplZC5kaXJlY3RpdmUnO1xuaW1wb3J0IHtUdWlUYWJsZURpcmVjdGl2ZX0gZnJvbSAnLi4vZGlyZWN0aXZlcy90YWJsZS5kaXJlY3RpdmUnO1xuaW1wb3J0IHtUVUlfVEFCTEVfT1BUSU9OUywgVHVpU29ydERpcmVjdGlvbn0gZnJvbSAnLi4vdGFibGUub3B0aW9ucyc7XG5cbkBDb21wb25lbnQoe1xuICAgIHN0YW5kYWxvbmU6IHRydWUsXG4gICAgc2VsZWN0b3I6ICd0aFt0dWlUaF0nLFxuICAgIGltcG9ydHM6IFtBc3luY1BpcGUsIE5nSWYsIE5nVGVtcGxhdGVPdXRsZXQsIFR1aUljb24sIFR1aVRhYmxlUmVzaXplZF0sXG4gICAgdGVtcGxhdGVVcmw6ICcuL3RoLnRlbXBsYXRlLmh0bWwnLFxuICAgIHN0eWxlVXJsczogWycuL3RoLnN0eWxlLmxlc3MnXSxcbiAgICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbiAgICBob3N0OiB7XG4gICAgICAgICdbc3R5bGUubWluLXdpZHRoLnB4XSc6ICd3aWR0aCB8fCBtaW5XaWR0aCcsXG4gICAgICAgICdbc3R5bGUud2lkdGgucHhdJzogJ3dpZHRoIHx8IG1pbldpZHRoJyxcbiAgICAgICAgJ1tzdHlsZS5tYXgtd2lkdGgucHhdJzogJ3dpZHRoIHx8IG1heFdpZHRoJyxcbiAgICAgICAgJ1tjbGFzcy5fc3RpY2t5XSc6ICdzdGlja3knLFxuICAgIH0sXG59KVxuZXhwb3J0IGNsYXNzIFR1aVRhYmxlVGg8VCBleHRlbmRzIFBhcnRpYWw8UmVjb3JkPGtleW9mIFQsIHVua25vd24+Pj4ge1xuICAgIHByaXZhdGUgcmVhZG9ubHkgb3B0aW9ucyA9IGluamVjdChUVUlfVEFCTEVfT1BUSU9OUyk7XG5cbiAgICBwcml2YXRlIHJlYWRvbmx5IGhlYWQgPSBpbmplY3Q8VHVpVGFibGVIZWFkPFQ+PihUdWlUYWJsZUhlYWQsIHtcbiAgICAgICAgb3B0aW9uYWw6IHRydWUsXG4gICAgfSk7XG5cbiAgICBwcm90ZWN0ZWQgd2lkdGg6IG51bWJlciB8IG51bGwgPSBudWxsO1xuXG4gICAgcHJvdGVjdGVkIHJlYWRvbmx5IHRhYmxlID0gaW5qZWN0PFR1aVRhYmxlRGlyZWN0aXZlPFQ+PihcbiAgICAgICAgZm9yd2FyZFJlZigoKSA9PiBUdWlUYWJsZURpcmVjdGl2ZSksXG4gICAgICAgIHtvcHRpb25hbDogdHJ1ZX0sXG4gICAgKTtcblxuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIG1pbldpZHRoID0gLUluZmluaXR5O1xuXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgbWF4V2lkdGggPSBJbmZpbml0eTtcblxuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIHNvcnRlcjogVHVpQ29tcGFyYXRvcjxUPiB8IG51bGwgPSB0aGlzLmhlYWRcbiAgICAgICAgPyAoYSwgYikgPT4gdHVpRGVmYXVsdFNvcnQoYVt0aGlzLmtleV0sIGJbdGhpcy5rZXldKVxuICAgICAgICA6IG51bGw7XG5cbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyByZXNpemFibGUgPSB0aGlzLm9wdGlvbnMucmVzaXphYmxlO1xuXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgc3RpY2t5ID0gdGhpcy5vcHRpb25zLnN0aWNreTtcblxuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIHJlcXVpcmVkU29ydCA9IHRoaXMub3B0aW9ucy5yZXF1aXJlZFNvcnQ7XG5cbiAgICBwdWJsaWMgZ2V0IGtleSgpOiBrZXlvZiBUIHtcbiAgICAgICAgaWYgKCF0aGlzLmhlYWQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBUdWlUYWJsZVNvcnRLZXlFeGNlcHRpb24oKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0aGlzLmhlYWQudHVpSGVhZCBhcyBrZXlvZiBUO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBnZXQgaXNDdXJyZW50KCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gISF0aGlzLnNvcnRlciAmJiAhIXRoaXMudGFibGUgJiYgdGhpcy5zb3J0ZXIgPT09IHRoaXMudGFibGUuc29ydGVyO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBnZXQgaWNvbigpOiBzdHJpbmcge1xuICAgICAgICBpZiAodGhpcy5pc0N1cnJlbnQpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnRhYmxlPy5kaXJlY3Rpb24gPT09IFR1aVNvcnREaXJlY3Rpb24uQXNjXG4gICAgICAgICAgICAgICAgPyB0aGlzLm9wdGlvbnMuc29ydEljb25zLmFzY1xuICAgICAgICAgICAgICAgIDogdGhpcy5vcHRpb25zLnNvcnRJY29ucy5kZXNjO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRoaXMub3B0aW9ucy5zb3J0SWNvbnMub2ZmO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCB1cGRhdGVTb3J0ZXJBbmREaXJlY3Rpb24oKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IHNvcnRlciA9IHRoaXMucmVxdWlyZWRTb3J0ID8gdGhpcy5zb3J0ZXIgOiBudWxsO1xuXG4gICAgICAgIHRoaXMudGFibGU/LnVwZGF0ZVNvcnRlckFuZERpcmVjdGlvbihcbiAgICAgICAgICAgIHRoaXMuaXNDdXJyZW50QW5kRGVzY0RpcmVjdGlvbiA/IHNvcnRlciA6IHRoaXMuc29ydGVyLFxuICAgICAgICApO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBvblJlc2l6ZWQod2lkdGg6IG51bWJlcik6IHZvaWQge1xuICAgICAgICB0aGlzLndpZHRoID0gTWF0aC5taW4oTWF0aC5tYXgod2lkdGgsIHRoaXMubWluV2lkdGgpLCB0aGlzLm1heFdpZHRoKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGdldCBpc0N1cnJlbnRBbmREZXNjRGlyZWN0aW9uKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgdGhpcy5zb3J0ZXIgPT09IHRoaXMudGFibGU/LnNvcnRlciAmJlxuICAgICAgICAgICAgdGhpcy50YWJsZT8uZGlyZWN0aW9uID09PSBUdWlTb3J0RGlyZWN0aW9uLkRlc2NcbiAgICAgICAgKTtcbiAgICB9XG59XG5cbmV4cG9ydCBjbGFzcyBUdWlUYWJsZVNvcnRLZXlFeGNlcHRpb24gZXh0ZW5kcyBFcnJvciB7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHN1cGVyKG5nRGV2TW9kZSA/ICdUcnlpbmcgdG8gc29ydCB3aXRoIG5vIGtleScgOiAnJyk7XG4gICAgfVxufVxuIiwiPGJ1dHRvblxuICAgICpuZ0lmPVwic29ydGVyICYmIHRhYmxlOyBlbHNlIGNvbnRlbnRcIlxuICAgIHR5cGU9XCJidXR0b25cIlxuICAgIGNsYXNzPVwidC1zb3J0XCJcbiAgICBbY2xhc3MudC1zb3J0X3NvcnRlZF09XCJpc0N1cnJlbnRcIlxuICAgIChjbGljayk9XCJ1cGRhdGVTb3J0ZXJBbmREaXJlY3Rpb24oKVwiXG4+XG4gICAgPG5nLWNvbnRhaW5lciBbbmdUZW1wbGF0ZU91dGxldF09XCJjb250ZW50XCIgLz5cbiAgICB7eyB0YWJsZSAmJiB0YWJsZS5jaGFuZ2UkIHwgYXN5bmMgfX1cbiAgICA8dHVpLWljb25cbiAgICAgICAgY2xhc3M9XCJ0LWljb25cIlxuICAgICAgICBbaWNvbl09XCJpY29uXCJcbiAgICAvPlxuPC9idXR0b24+XG48bmctdGVtcGxhdGUgI2NvbnRlbnQ+XG4gICAgPG5nLWNvbnRlbnQgLz5cbjwvbmctdGVtcGxhdGU+XG48ZGl2XG4gICAgKm5nSWY9XCJyZXNpemFibGVcIlxuICAgIGNsYXNzPVwidC1iYXJcIlxuICAgICh0dWlSZXNpemVkKT1cIm9uUmVzaXplZCgkZXZlbnQpXCJcbj48L2Rpdj5cbiJdfQ==