UNPKG

carbon-components-angular

Version:
324 lines 30.2 kB
import { Component, Input, Output, EventEmitter, HostBinding, ViewChild } from "@angular/core"; import { map } from "rxjs/operators"; import * as i0 from "@angular/core"; import * as i1 from "carbon-components-angular/i18n"; import * as i2 from "@angular/common"; import * as i3 from "carbon-components-angular/icon"; import * as i4 from "./table-head-cell-label.directive"; export class TableHeadCell { constructor(i18n) { this.i18n = i18n; this.skeleton = false; this.sortable = true; /** * Notifies that the column should be sorted */ this.sort = new EventEmitter(); this.theadAction = false; this._sortDescendingLabel = this.i18n.getOverridable("TABLE.SORT_DESCENDING"); this._sortAscendingLabel = this.i18n.getOverridable("TABLE.SORT_ASCENDING"); this._filterTitle = this.i18n.getOverridable("TABLE.FILTER"); } set sortDescendingLabel(value) { this._sortDescendingLabel.override(value); } get sortDescendingLabel() { return this._sortDescendingLabel.value; } set sortAscendingLabel(value) { this._sortAscendingLabel.override(value); } get sortAscendingLabel() { return this._sortAscendingLabel.value; } set filterTitle(value) { this._filterTitle.override(value); } get filterTitle() { return this._filterTitle.value; } get sortHeaderHost() { return this.sortable && this.sort.observers.length > 0 && this.column?.sortable; } get sortHeaderAILabelHost() { return this.column?.hasAILabelHeader && this.sortHeaderHost; } get sortHeaderDecoratorHost() { return this.column?.hasAILabelHeader && this.column?.template && this.sortHeaderHost; } /** * When the column uses a separate template for the slug/AI: label text + sort icons + `cds--table-header-label--decorator-inner`. */ get headerAILabelDecoratorLayout() { return !!(this.column?.hasAILabelHeader && this.column?.template); } ngOnChanges() { this.theadAction = !!(this.column && this.column.filterTemplate) || this.sort.observers.length > 0; } /** * Text label for the column when `hasAILabelHeader` uses a separate `template` for the slug. */ getHeaderLabelText() { if (!this.column) { return ""; } const d = this.column.data; if (d != null && typeof d === "object" && "label" in d && d.label != null) { return String(d.label); } if (typeof d === "string") { return d; } return ""; } getSortDescendingLabel() { return this._sortDescendingLabel.subject.pipe(this.sortLabelMap()); } getSortAscendingLabel() { return this._sortAscendingLabel.subject.pipe(this.sortLabelMap()); } /** * Prevent focus from moving to parent button when click on decorator */ onDecoratorRegionClick(event) { event.preventDefault(); event.stopPropagation(); } onClick(event) { if (this.skeleton) { return; } if (this.column?.hasAILabelHeader && this.decoratorInnerRef?.nativeElement?.contains(event.target)) { return; } this.sort.emit(); } sortLabelMap() { return map((str) => { if (this.column.ariaSortLabel) { return this.column.ariaSortLabel; } if (this.column.formatSortLabel) { return this.column.formatSortLabel(str, this.column.ariaSortLabel); } const header = this.getHeaderLabelText() || (typeof this.column.data === "string" ? this.column.data : ""); return `${header} - ${str}`; }); } } TableHeadCell.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: TableHeadCell, deps: [{ token: i1.I18n }], target: i0.ɵɵFactoryTarget.Component }); TableHeadCell.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.3.0", type: TableHeadCell, selector: "[cdsTableHeadCell], [ibmTableHeadCell]", inputs: { column: "column", skeleton: "skeleton", sortable: "sortable", sortDescendingLabel: "sortDescendingLabel", sortAscendingLabel: "sortAscendingLabel", filterTitle: "filterTitle" }, outputs: { sort: "sort" }, host: { properties: { "class.thead_action": "this.theadAction", "class.cds--table-sort__header": "this.sortHeaderHost", "class.cds--table-sort__header--ai-label": "this.sortHeaderAILabelHost", "class.cds--table-sort__header--decorator": "this.sortHeaderDecoratorHost" } }, viewQueries: [{ propertyName: "decoratorInnerRef", first: true, predicate: ["decoratorInner"], descendants: true }], usesOnChanges: true, ngImport: i0, template: ` <button class="cds--table-sort" *ngIf="sortable && this.sort.observers.length > 0 && column.sortable" [attr.aria-label]="(column.sorted && column.ascending ? getSortDescendingLabel() : getSortAscendingLabel()) | async" aria-live="polite" [ngClass]="{ 'cds--table-sort--active': column.sorted, 'cds--table-sort--descending': column.ascending }" (click)="onClick($event)"> <span *ngIf="headerAILabelDecoratorLayout" class="cds--table-sort__flex" [title]="column.title" tabindex="-1"> <div cdsTableHeadCellLabel>{{ getHeaderLabelText() }}</div> <svg *ngIf="!skeleton" class="cds--table-sort__icon" cdsIcon="arrow--down"></svg> <svg *ngIf="!skeleton" class="cds--table-sort__icon-unsorted" cdsIcon="arrows--vertical"></svg> <div #decoratorInner class="cds--table-header-label--decorator-inner" (click)="onDecoratorRegionClick($event)"> <ng-template [ngTemplateOutlet]="column.template" [ngTemplateOutletContext]="{data: column.data}"> </ng-template> </div> </span> <span *ngIf="!headerAILabelDecoratorLayout" class="cds--table-sort__flex" [title]="column.title" tabindex="-1"> <div *ngIf="!skeleton && !column.template" cdsTableHeadCellLabel [class.cds--table-header-label--ai-label]="column.hasAILabelHeader" [class.cds--table-header-label--slug]="column.hasAILabelHeader"> {{column.data}} </div> <div *ngIf="!skeleton && column.template" cdsTableHeadCellLabel [class.cds--table-header-label--ai-label]="column.hasAILabelHeader" [class.cds--table-header-label--slug]="column.hasAILabelHeader"> <ng-template [ngTemplateOutlet]="column.template" [ngTemplateOutletContext]="{data: column.data}"> </ng-template> </div> <svg *ngIf="!skeleton" class="cds--table-sort__icon" cdsIcon="arrow--down"></svg> <svg *ngIf="!skeleton" class="cds--table-sort__icon-unsorted" cdsIcon="arrows--vertical"></svg> </span> </button> <div *ngIf="headerAILabelDecoratorLayout && ((!skeleton && sort.observers.length === 0) || (sort.observers.length > 0 && !column.sortable) || !sortable)" class="cds--table-header-label" [ngClass]="{ 'cds--table-header-label--ai-label': column.hasAILabelHeader, 'cds--table-header-label--slug': column.hasAILabelHeader, 'cds--table-header-label--decorator': column.hasAILabelHeader }"> <span *ngIf="getHeaderLabelText()">{{ getHeaderLabelText() }}</span> <div class="cds--table-header-label--decorator-inner"> <ng-template [ngTemplateOutlet]="column.template" [ngTemplateOutletContext]="{data: column.data}"> </ng-template> </div> </div> <div class="cds--table-header-label" *ngIf="!headerAILabelDecoratorLayout && ((!skeleton && sort.observers.length === 0) || (sort.observers.length > 0 && !column.sortable) || !sortable)" [ngClass]="{ 'cds--table-header-label--ai-label': column.hasAILabelHeader, 'cds--table-header-label--slug': column.hasAILabelHeader }"> <span *ngIf="!column.template" [title]="column.data"> <ng-container *ngIf="!skeleton"> {{column.data}} </ng-container> </span> <ng-template [ngTemplateOutlet]="column.template" [ngTemplateOutletContext]="{data: column.data}"> </ng-template> </div> `, isInline: true, dependencies: [{ kind: "directive", type: i2.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i2.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i3.IconDirective, selector: "[cdsIcon], [ibmIcon]", inputs: ["ibmIcon", "cdsIcon", "size", "title", "ariaLabel", "ariaLabelledBy", "ariaHidden", "isFocusable"] }, { kind: "directive", type: i4.TableHeadCellLabel, selector: "[cdsTableHeadCellLabel], [ibmTableHeadCellLabel]" }, { kind: "pipe", type: i2.AsyncPipe, name: "async" }] }); i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: TableHeadCell, decorators: [{ type: Component, args: [{ // tslint:disable-next-line: component-selector selector: "[cdsTableHeadCell], [ibmTableHeadCell]", template: ` <button class="cds--table-sort" *ngIf="sortable && this.sort.observers.length > 0 && column.sortable" [attr.aria-label]="(column.sorted && column.ascending ? getSortDescendingLabel() : getSortAscendingLabel()) | async" aria-live="polite" [ngClass]="{ 'cds--table-sort--active': column.sorted, 'cds--table-sort--descending': column.ascending }" (click)="onClick($event)"> <span *ngIf="headerAILabelDecoratorLayout" class="cds--table-sort__flex" [title]="column.title" tabindex="-1"> <div cdsTableHeadCellLabel>{{ getHeaderLabelText() }}</div> <svg *ngIf="!skeleton" class="cds--table-sort__icon" cdsIcon="arrow--down"></svg> <svg *ngIf="!skeleton" class="cds--table-sort__icon-unsorted" cdsIcon="arrows--vertical"></svg> <div #decoratorInner class="cds--table-header-label--decorator-inner" (click)="onDecoratorRegionClick($event)"> <ng-template [ngTemplateOutlet]="column.template" [ngTemplateOutletContext]="{data: column.data}"> </ng-template> </div> </span> <span *ngIf="!headerAILabelDecoratorLayout" class="cds--table-sort__flex" [title]="column.title" tabindex="-1"> <div *ngIf="!skeleton && !column.template" cdsTableHeadCellLabel [class.cds--table-header-label--ai-label]="column.hasAILabelHeader" [class.cds--table-header-label--slug]="column.hasAILabelHeader"> {{column.data}} </div> <div *ngIf="!skeleton && column.template" cdsTableHeadCellLabel [class.cds--table-header-label--ai-label]="column.hasAILabelHeader" [class.cds--table-header-label--slug]="column.hasAILabelHeader"> <ng-template [ngTemplateOutlet]="column.template" [ngTemplateOutletContext]="{data: column.data}"> </ng-template> </div> <svg *ngIf="!skeleton" class="cds--table-sort__icon" cdsIcon="arrow--down"></svg> <svg *ngIf="!skeleton" class="cds--table-sort__icon-unsorted" cdsIcon="arrows--vertical"></svg> </span> </button> <div *ngIf="headerAILabelDecoratorLayout && ((!skeleton && sort.observers.length === 0) || (sort.observers.length > 0 && !column.sortable) || !sortable)" class="cds--table-header-label" [ngClass]="{ 'cds--table-header-label--ai-label': column.hasAILabelHeader, 'cds--table-header-label--slug': column.hasAILabelHeader, 'cds--table-header-label--decorator': column.hasAILabelHeader }"> <span *ngIf="getHeaderLabelText()">{{ getHeaderLabelText() }}</span> <div class="cds--table-header-label--decorator-inner"> <ng-template [ngTemplateOutlet]="column.template" [ngTemplateOutletContext]="{data: column.data}"> </ng-template> </div> </div> <div class="cds--table-header-label" *ngIf="!headerAILabelDecoratorLayout && ((!skeleton && sort.observers.length === 0) || (sort.observers.length > 0 && !column.sortable) || !sortable)" [ngClass]="{ 'cds--table-header-label--ai-label': column.hasAILabelHeader, 'cds--table-header-label--slug': column.hasAILabelHeader }"> <span *ngIf="!column.template" [title]="column.data"> <ng-container *ngIf="!skeleton"> {{column.data}} </ng-container> </span> <ng-template [ngTemplateOutlet]="column.template" [ngTemplateOutletContext]="{data: column.data}"> </ng-template> </div> ` }] }], ctorParameters: function () { return [{ type: i1.I18n }]; }, propDecorators: { column: [{ type: Input }], skeleton: [{ type: Input }], sortable: [{ type: Input }], sortDescendingLabel: [{ type: Input }], sortAscendingLabel: [{ type: Input }], filterTitle: [{ type: Input }], sort: [{ type: Output }], decoratorInnerRef: [{ type: ViewChild, args: ["decoratorInner"] }], theadAction: [{ type: HostBinding, args: ["class.thead_action"] }], sortHeaderHost: [{ type: HostBinding, args: ["class.cds--table-sort__header"] }], sortHeaderAILabelHost: [{ type: HostBinding, args: ["class.cds--table-sort__header--ai-label"] }], sortHeaderDecoratorHost: [{ type: HostBinding, args: ["class.cds--table-sort__header--decorator"] }] } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFibGUtaGVhZC1jZWxsLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy90YWJsZS9oZWFkL3RhYmxlLWhlYWQtY2VsbC5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNOLFNBQVMsRUFFVCxLQUFLLEVBQ0wsTUFBTSxFQUNOLFlBQVksRUFDWixXQUFXLEVBRVgsU0FBUyxFQUNULE1BQU0sZUFBZSxDQUFDO0FBR3ZCLE9BQU8sRUFBRSxHQUFHLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQzs7Ozs7O0FBK0ZyQyxNQUFNLE9BQU8sYUFBYTtJQWtFekIsWUFBc0IsSUFBVTtRQUFWLFNBQUksR0FBSixJQUFJLENBQU07UUEvRHZCLGFBQVEsR0FBRyxLQUFLLENBQUM7UUFFakIsYUFBUSxHQUFHLElBQUksQ0FBQztRQTZCekI7O1dBRUc7UUFDTyxTQUFJLEdBQUcsSUFBSSxZQUFZLEVBQUUsQ0FBQztRQUlELGdCQUFXLEdBQUcsS0FBSyxDQUFDO1FBcUI3Qyx5QkFBb0IsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyx1QkFBdUIsQ0FBQyxDQUFDO1FBQ3pFLHdCQUFtQixHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLHNCQUFzQixDQUFDLENBQUM7UUFDdkUsaUJBQVksR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxjQUFjLENBQUMsQ0FBQztJQUU5QixDQUFDO0lBM0RyQyxJQUNJLG1CQUFtQixDQUFDLEtBQWtDO1FBQ3pELElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDM0MsQ0FBQztJQUVELElBQUksbUJBQW1CO1FBQ3RCLE9BQU8sSUFBSSxDQUFDLG9CQUFvQixDQUFDLEtBQUssQ0FBQztJQUN4QyxDQUFDO0lBRUQsSUFDSSxrQkFBa0IsQ0FBQyxLQUFrQztRQUN4RCxJQUFJLENB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TTtzQkFBZCxLQUFLO2dCQUVHLFFBQVE7c0JBQWhCLEtBQUs7Z0JBRUcsUUFBUTtzQkFBaEIsS0FBSztnQkFHRixtQkFBbUI7c0JBRHRCLEtBQUs7Z0JBVUYsa0JBQWtCO3NCQURyQixLQUFLO2dCQVVGLFdBQVc7c0JBRGQsS0FBSztnQkFZSSxJQUFJO3NCQUFiLE1BQU07Z0JBRXNCLGlCQUFpQjtzQkFBN0MsU0FBUzt1QkFBQyxnQkFBZ0I7Z0JBRVEsV0FBVztzQkFBN0MsV0FBVzt1QkFBQyxvQkFBb0I7Z0JBRWlCLGNBQWM7c0JBQS9ELFdBQVc7dUJBQUMsK0JBQStCO2dCQUlnQixxQkFBcUI7c0JBQWhGLFdBQVc7dUJBQUMseUNBQXlDO2dCQUlPLHVCQUF1QjtzQkFBbkYsV0FBVzt1QkFBQywwQ0FBMEMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuXHRDb21wb25lbnQsXG5cdEVsZW1lbnRSZWYsXG5cdElucHV0LFxuXHRPdXRwdXQsXG5cdEV2ZW50RW1pdHRlcixcblx0SG9zdEJpbmRpbmcsXG5cdE9uQ2hhbmdlcyxcblx0Vmlld0NoaWxkXG59IGZyb20gXCJAYW5ndWxhci9jb3JlXCI7XG5pbXBvcnQgeyBPYnNlcnZhYmxlLCBPcGVyYXRvckZ1bmN0aW9uIH0gZnJvbSBcInJ4anNcIjtcbmltcG9ydCB7IEkxOG4sIE92ZXJyaWRhYmxlIH0gZnJvbSBcImNhcmJvbi1jb21wb25lbnRzLWFuZ3VsYXIvaTE4blwiO1xuaW1wb3J0IHsgbWFwIH0gZnJvbSBcInJ4anMvb3BlcmF0b3JzXCI7XG5pbXBvcnQgeyBUYWJsZUhlYWRlckl0ZW0gfSBmcm9tIFwiLi4vdGFibGUtaGVhZGVyLWl0ZW0uY2xhc3NcIjtcblxuQENvbXBvbmVudCh7XG5cdC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTogY29tcG9uZW50LXNlbGVjdG9yXG5cdHNlbGVjdG9yOiBcIltjZHNUYWJsZUhlYWRDZWxsXSwgW2libVRhYmxlSGVhZENlbGxdXCIsXG5cdHRlbXBsYXRlOiBgXG5cdFx0PGJ1dHRvblxuXHRcdFx0Y2xhc3M9XCJjZHMtLXRhYmxlLXNvcnRcIlxuXHRcdFx0Km5nSWY9XCJzb3J0YWJsZSAmJiB0aGlzLnNvcnQub2JzZXJ2ZXJzLmxlbmd0aCA+IDAgJiYgY29sdW1uLnNvcnRhYmxlXCJcblx0XHRcdFthdHRyLmFyaWEtbGFiZWxdPVwiKGNvbHVtbi5zb3J0ZWQgJiYgY29sdW1uLmFzY2VuZGluZyA/IGdldFNvcnREZXNjZW5kaW5nTGFiZWwoKSA6IGdldFNvcnRBc2NlbmRpbmdMYWJlbCgpKSB8IGFzeW5jXCJcblx0XHRcdGFyaWEtbGl2ZT1cInBvbGl0ZVwiXG5cdFx0XHRbbmdDbGFzc109XCJ7XG5cdFx0XHRcdCdjZHMtLXRhYmxlLXNvcnQtLWFjdGl2ZSc6IGNvbHVtbi5zb3J0ZWQsXG5cdFx0XHRcdCdjZHMtLXRhYmxlLXNvcnQtLWRlc2NlbmRpbmcnOiBjb2x1bW4uYXNjZW5kaW5nXG5cdFx0XHR9XCJcblx0XHRcdChjbGljayk9XCJvbkNsaWNrKCRldmVudClcIj5cblx0XHRcdDxzcGFuXG5cdFx0XHRcdCpuZ0lmPVwiaGVhZGVyQUlMYWJlbERlY29yYXRvckxheW91dFwiXG5cdFx0XHRcdGNsYXNzPVwiY2RzLS10YWJsZS1zb3J0X19mbGV4XCJcblx0XHRcdFx0W3RpdGxlXT1cImNvbHVtbi50aXRsZVwiXG5cdFx0XHRcdHRhYmluZGV4PVwiLTFcIj5cblx0XHRcdFx0PGRpdiBjZHNUYWJsZUhlYWRDZWxsTGFiZWw+e3sgZ2V0SGVhZGVyTGFiZWxUZXh0KCkgfX08L2Rpdj5cblx0XHRcdFx0PHN2ZyAqbmdJZj1cIiFza2VsZXRvblwiIGNsYXNzPVwiY2RzLS10YWJsZS1zb3J0X19pY29uXCIgY2RzSWNvbj1cImFycm93LS1kb3duXCI+PC9zdmc+XG5cdFx0XHRcdDxzdmcgKm5nSWY9XCIhc2tlbGV0b25cIiBjbGFzcz1cImNkcy0tdGFibGUtc29ydF9faWNvbi11bnNvcnRlZFwiIGNkc0ljb249XCJhcnJvd3MtLXZlcnRpY2FsXCI+PC9zdmc+XG5cdFx0XHQ8ZGl2XG5cdFx0XHRcdCNkZWNvcmF0b3JJbm5lclxuXHRcdFx0XHRjbGFzcz1cImNkcy0tdGFibGUtaGVhZGVyLWxhYmVsLS1kZWNvcmF0b3ItaW5uZXJcIlxuXHRcdFx0XHQoY2xpY2spPVwib25EZWNvcmF0b3JSZWdpb25DbGljaygkZXZlbnQpXCI+XG5cdFx0XHRcdDxuZy10ZW1wbGF0ZVxuXHRcdFx0XHRcdFtuZ1RlbXBsYXRlT3V0bGV0XT1cImNvbHVtbi50ZW1wbGF0ZVwiXG5cdFx0XHRcdFx0W25nVGVtcGxhdGVPdXRsZXRDb250ZXh0XT1cIntkYXRhOiBjb2x1bW4uZGF0YX1cIj5cblx0XHRcdFx0PC9uZy10ZW1wbGF0ZT5cblx0XHRcdDwvZGl2PlxuXHRcdFx0PC9zcGFuPlxuXHRcdFx0PHNwYW5cblx0XHRcdFx0Km5nSWY9XCIhaGVhZGVyQUlMYWJlbERlY29yYXRvckxheW91dFwiXG5cdFx0XHRcdGNsYXNzPVwiY2RzLS10YWJsZS1zb3J0X19mbGV4XCJcblx0XHRcdFx0W3RpdGxlXT1cImNvbHVtbi50aXRsZVwiXG5cdFx0XHRcdHRhYmluZGV4PVwiLTFcIj5cblx0XHRcdFx0PGRpdlxuXHRcdFx0XHRcdCpuZ0lmPVwiIXNrZWxldG9uICYmICFjb2x1bW4udGVtcGxhdGVcIlxuXHRcdFx0XHRcdGNkc1RhYmxlSGVhZENlbGxMYWJlbFxuXHRcdFx0XHRcdFtjbGFzcy5jZHMtLXRhYmxlLWhlYWRlci1sYWJlbC0tYWktbGFiZWxdPVwiY29sdW1uLmhhc0FJTGFiZWxIZWFkZXJcIlxuXHRcdFx0XHRcdFtjbGFzcy5jZHMtLXRhYmxlLWhlYWRlci1sYWJlbC0tc2x1Z109XCJjb2x1bW4uaGFzQUlMYWJlbEhlYWRlclwiPlxuXHRcdFx0XHRcdHt7Y29sdW1uLmRhdGF9fVxuXHRcdFx0XHQ8L2Rpdj5cblx0XHRcdFx0PGRpdlxuXHRcdFx0XHRcdCpuZ0lmPVwiIXNrZWxldG9uICYmIGNvbHVtbi50ZW1wbGF0ZVwiXG5cdFx0XHRcdFx0Y2RzVGFibGVIZWFkQ2VsbExhYmVsXG5cdFx0XHRcdFx0W2NsYXNzLmNkcy0tdGFibGUtaGVhZGVyLWxhYmVsLS1haS1sYWJlbF09XCJjb2x1bW4uaGFzQUlMYWJlbEhlYWRlclwiXG5cdFx0XHRcdFx0W2NsYXNzLmNkcy0tdGFibGUtaGVhZGVyLWxhYmVsLS1zbHVnXT1cImNvbHVtbi5oYXNBSUxhYmVsSGVhZGVyXCI+XG5cdFx0XHRcdFx0PG5nLXRlbXBsYXRlXG5cdFx0XHRcdFx0XHRbbmdUZW1wbGF0ZU91dGxldF09XCJjb2x1bW4udGVtcGxhdGVcIlxuXHRcdFx0XHRcdFx0W25nVGVtcGxhdGVPdXRsZXRDb250ZXh0XT1cIntkYXRhOiBjb2x1bW4uZGF0YX1cIj5cblx0XHRcdFx0XHQ8L25nLXRlbXBsYXRlPlxuXHRcdFx0XHQ8L2Rpdj5cblx0XHRcdFx0PHN2ZyAqbmdJZj1cIiFza2VsZXRvblwiIGNsYXNzPVwiY2RzLS10YWJsZS1zb3J0X19pY29uXCIgY2RzSWNvbj1cImFycm93LS1kb3duXCI+PC9zdmc+XG5cdFx0XHRcdDxzdmcgKm5nSWY9XCIhc2tlbGV0b25cIiBjbGFzcz1cImNkcy0tdGFibGUtc29ydF9faWNvbi11bnNvcnRlZFwiIGNkc0ljb249XCJhcnJvd3MtLXZlcnRpY2FsXCI+PC9zdmc+XG5cdFx0XHQ8L3NwYW4+XG5cdFx0PC9idXR0b24+XG5cdFx0PGRpdlxuXHRcdFx0Km5nSWY9XCJoZWFkZXJBSUxhYmVsRGVjb3JhdG9yTGF5b3V0ICYmICgoIXNrZWxldG9uICYmIHNvcnQub2JzZXJ2ZXJzLmxlbmd0aCA9PT0gMCkgfHwgKHNvcnQub2JzZXJ2ZXJzLmxlbmd0aCA+IDAgJiYgIWNvbHVtbi5zb3J0YWJsZSkgfHwgIXNvcnRhYmxlKVwiXG5cdFx0XHRjbGFzcz1cImNkcy0tdGFibGUtaGVhZGVyLWxhYmVsXCJcblx0XHRcdFtuZ0NsYXNzXT1cIntcblx0XHRcdFx0J2Nkcy0tdGFibGUtaGVhZGVyLWxhYmVsLS1haS1sYWJlbCc6IGNvbHVtbi5oYXNBSUxhYmVsSGVhZGVyLFxuXHRcdFx0XHQnY2RzLS10YWJsZS1oZWFkZXItbGFiZWwtLXNsdWcnOiBjb2x1bW4uaGFzQUlMYWJlbEhlYWRlcixcblx0XHRcdFx0J2Nkcy0tdGFibGUtaGVhZGVyLWxhYmVsLS1kZWNvcmF0b3InOiBjb2x1bW4uaGFzQUlMYWJlbEhlYWRlclxuXHRcdFx0fVwiPlxuXHRcdFx0PHNwYW4gKm5nSWY9XCJnZXRIZWFkZXJMYWJlbFRleHQoKVwiPnt7IGdldEhlYWRlckxhYmVsVGV4dCgpIH19PC9zcGFuPlxuXHRcdFx0PGRpdiBjbGFzcz1cImNkcy0tdGFibGUtaGVhZGVyLWxhYmVsLS1kZWNvcmF0b3ItaW5uZXJcIj5cblx0XHRcdFx0PG5nLXRlbXBsYXRlXG5cdFx0XHRcdFx0W25nVGVtcGxhdGVPdXRsZXRdPVwiY29sdW1uLnRlbXBsYXRlXCJcblx0XHRcdFx0XHRbbmdUZW1wbGF0ZU91dGxldENvbnRleHRdPVwie2RhdGE6IGNvbHVtbi5kYXRhfVwiPlxuXHRcdFx0XHQ8L25nLXRlbXBsYXRlPlxuXHRcdFx0PC9kaXY+XG5cdFx0PC9kaXY+XG5cdFx0PGRpdlxuXHRcdFx0Y2xhc3M9XCJjZHMtLXRhYmxlLWhlYWRlci1sYWJlbFwiXG5cdFx0XHQqbmdJZj1cIiFoZWFkZXJBSUxhYmVsRGVjb3JhdG9yTGF5b3V0ICYmICgoIXNrZWxldG9uICYmIHNvcnQub2JzZXJ2ZXJzLmxlbmd0aCA9PT0gMCkgfHwgKHNvcnQub2JzZXJ2ZXJzLmxlbmd0aCA+IDAgJiYgIWNvbHVtbi5zb3J0YWJsZSkgfHwgIXNvcnRhYmxlKVwiXG5cdFx0XHRbbmdDbGFzc109XCJ7XG5cdFx0XHRcdCdjZHMtLXRhYmxlLWhlYWRlci1sYWJlbC0tYWktbGFiZWwnOiBjb2x1bW4uaGFzQUlMYWJlbEhlYWRlcixcblx0XHRcdFx0J2Nkcy0tdGFibGUtaGVhZGVyLWxhYmVsLS1zbHVnJzogY29sdW1uLmhhc0FJTGFiZWxIZWFkZXJcblx0XHRcdH1cIj5cblx0XHRcdDxzcGFuICpuZ0lmPVwiIWNvbHVtbi50ZW1wbGF0ZVwiIFt0aXRsZV09XCJjb2x1bW4uZGF0YVwiPlxuXHRcdFx0XHQ8bmctY29udGFpbmVyICpuZ0lmPVwiIXNrZWxldG9uXCI+XG5cdFx0XHRcdFx0e3tjb2x1bW4uZGF0YX19XG5cdFx0XHRcdDwvbmctY29udGFpbmVyPlxuXHRcdFx0PC9zcGFuPlxuXHRcdFx0PG5nLXRlbXBsYXRlXG5cdFx0XHRcdFtuZ1RlbXBsYXRlT3V0bGV0XT1cImNvbHVtbi50ZW1wbGF0ZVwiIFtuZ1RlbXBsYXRlT3V0bGV0Q29udGV4dF09XCJ7ZGF0YTogY29sdW1uLmRhdGF9XCI+XG5cdFx0XHQ8L25nLXRlbXBsYXRlPlxuXHRcdDwvZGl2PlxuXHRgXG59KVxuZXhwb3J0IGNsYXNzIFRhYmxlSGVhZENlbGwgaW1wbGVtZW50cyBPbkNoYW5nZXMge1xuXHRASW5wdXQoKSBjb2x1bW46IFRhYmxlSGVhZGVySXRlbTtcblxuXHRASW5wdXQoKSBza2VsZXRvbiA9IGZhbHNlO1xuXG5cdEBJbnB1dCgpIHNvcnRhYmxlID0gdHJ1ZTtcblxuXHRASW5wdXQoKVxuXHRzZXQgc29ydERlc2NlbmRpbmdMYWJlbCh2YWx1ZTogc3RyaW5nIHwgT2JzZXJ2YWJsZTxzdHJpbmc+KSB7XG5cdFx0dGhpcy5fc29ydERlc2NlbmRpbmdMYWJlbC5vdmVycmlkZSh2YWx1ZSk7XG5cdH1cblxuXHRnZXQgc29ydERlc2NlbmRpbmdMYWJlbCgpIHtcblx0XHRyZXR1cm4gdGhpcy5fc29ydERlc2NlbmRpbmdMYWJlbC52YWx1ZTtcblx0fVxuXG5cdEBJbnB1dCgpXG5cdHNldCBzb3J0QXNjZW5kaW5nTGFiZWwodmFsdWU6IHN0cmluZyB8IE9ic2VydmFibGU8c3RyaW5nPikge1xuXHRcdHRoaXMuX3NvcnRBc2NlbmRpbmdMYWJlbC5vdmVycmlkZSh2YWx1ZSk7XG5cdH1cblxuXHRnZXQgc29ydEFzY2VuZGluZ0xhYmVsKCkge1xuXHRcdHJldHVybiB0aGlzLl9zb3J0QXNjZW5kaW5nTGFiZWwudmFsdWU7XG5cdH1cblxuXHRASW5wdXQoKVxuXHRzZXQgZmlsdGVyVGl0bGUodmFsdWU6IHN0cmluZyB8IE9ic2VydmFibGU8c3RyaW5nPikge1xuXHRcdHRoaXMuX2ZpbHRlclRpdGxlLm92ZXJyaWRlKHZhbHVlKTtcblx0fVxuXG5cdGdldCBmaWx0ZXJUaXRsZSgpIHtcblx0XHRyZXR1cm4gdGhpcy5fZmlsdGVyVGl0bGUudmFsdWU7XG5cdH1cblxuXHQvKipcblx0ICogTm90aWZpZXMgdGhhdCB0aGUgY29sdW1uIHNob3VsZCBiZSBzb3J0ZWRcblx0ICovXG5cdEBPdXRwdXQoKSBzb3J0ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuXG5cdEBWaWV3Q2hpbGQoXCJkZWNvcmF0b3JJbm5lclwiKSBkZWNvcmF0b3JJbm5lclJlZjogRWxlbWVudFJlZjtcblxuXHRASG9zdEJpbmRpbmcoXCJjbGFzcy50aGVhZF9hY3Rpb25cIikgdGhlYWRBY3Rpb24gPSBmYWxzZTtcblxuXHRASG9zdEJpbmRpbmcoXCJjbGFzcy5jZHMtLXRhYmxlLXNvcnRfX2hlYWRlclwiKSBnZXQgc29ydEhlYWRlckhvc3QoKSB7XG5cdFx0cmV0dXJuIHRoaXMuc29ydGFibGUgJiYgdGhpcy5zb3J0Lm9ic2VydmVycy5sZW5ndGggPiAwICYmIHRoaXMuY29sdW1uPy5zb3J0YWJsZTtcblx0fVxuXG5cdEBIb3N0QmluZGluZyhcImNsYXNzLmNkcy0tdGFibGUtc29ydF9faGVhZGVyLS1haS1sYWJlbFwiKSBnZXQgc29ydEhlYWRlckFJTGFiZWxIb3N0KCkge1xuXHRcdHJldHVybiB0aGlzLmNvbHVtbj8uaGFzQUlMYWJlbEhlYWRlciAmJiB0aGlzLnNvcnRIZWFkZXJIb3N0O1xuXHR9XG5cblx0QEhvc3RCaW5kaW5nKFwiY2xhc3MuY2RzLS10YWJsZS1zb3J0X19oZWFkZXItLWRlY29yYXRvclwiKSBnZXQgc29ydEhlYWRlckRlY29yYXRvckhvc3QoKSB7XG5cdFx0cmV0dXJuIHRoaXMuY29sdW1uPy5oYXNBSUxhYmVsSGVhZGVyICYmIHRoaXMuY29sdW1uPy50ZW1wbGF0ZSAmJiB0aGlzLnNvcnRIZWFkZXJIb3N0O1xuXHR9XG5cblx0LyoqXG5cdCAqIFdoZW4gdGhlIGNvbHVtbiB1c2VzIGEgc2VwYXJhdGUgdGVtcGxhdGUgZm9yIHRoZSBzbHVnL0FJOiBsYWJlbCB0ZXh0ICsgc29ydCBpY29ucyArIGBjZHMtLXRhYmxlLWhlYWRlci1sYWJlbC0tZGVjb3JhdG9yLWlubmVyYC5cblx0ICovXG5cdGdldCBoZWFkZXJBSUxhYmVsRGVjb3JhdG9yTGF5b3V0KCk6IGJvb2xlYW4ge1xuXHRcdHJldHVybiAhISh0aGlzLmNvbHVtbj8uaGFzQUlMYWJlbEhlYWRlciAmJiB0aGlzLmNvbHVtbj8udGVtcGxhdGUpO1xuXHR9XG5cblx0cHJvdGVjdGVkIF9zb3J0RGVzY2VuZGluZ0xhYmVsID0gdGhpcy5pMThuLmdldE92ZXJyaWRhYmxlKFwiVEFCTEUuU09SVF9ERVNDRU5ESU5HXCIpO1xuXHRwcm90ZWN0ZWQgX3NvcnRBc2NlbmRpbmdMYWJlbCA9IHRoaXMuaTE4bi5nZXRPdmVycmlkYWJsZShcIlRBQkxFLlNPUlRfQVNDRU5ESU5HXCIpO1xuXHRwcm90ZWN0ZWQgX2ZpbHRlclRpdGxlID0gdGhpcy5pMThuLmdldE92ZXJyaWRhYmxlKFwiVEFCTEUuRklMVEVSXCIpO1xuXG5cdGNvbnN0cnVjdG9yKHByb3RlY3RlZCBpMThuOiBJMThuKSB7IH1cblxuXHRuZ09uQ2hhbmdlcygpIHtcblx0XHR0aGlzLnRoZWFkQWN0aW9uID0gISEodGhpcy5jb2x1bW4gJiYgdGhpcy5jb2x1bW4uZmlsdGVyVGVtcGxhdGUpIHx8IHRoaXMuc29ydC5vYnNlcnZlcnMubGVuZ3RoID4gMDtcblx0fVxuXG5cdC8qKlxuXHQgKiBUZXh0IGxhYmVsIGZvciB0aGUgY29sdW1uIHdoZW4gYGhhc0FJTGFiZWxIZWFkZXJgIHVzZXMgYSBzZXBhcmF0ZSBgdGVtcGxhdGVgIGZvciB0aGUgc2x1Zy5cblx0ICovXG5cdGdldEhlYWRlckxhYmVsVGV4dCgpOiBzdHJpbmcge1xuXHRcdGlmICghdGhpcy5jb2x1bW4pIHtcblx0XHRcdHJldHVybiBcIlwiO1xuXHRcdH1cblx0XHRjb25zdCBkID0gdGhpcy5jb2x1bW4uZGF0YTtcblx0XHRpZiAoZCAhPSBudWxsICYmIHR5cGVvZiBkID09PSBcIm9iamVjdFwiICYmIFwibGFiZWxcIiBpbiBkICYmIChkIGFzIHsgbGFiZWw/OiB1bmtub3duIH0pLmxhYmVsICE9IG51bGwpIHtcblx0XHRcdHJldHVybiBTdHJpbmcoKGQgYXMgeyBsYWJlbDogdW5rbm93biB9KS5sYWJlbCk7XG5cdFx0fVxuXHRcdGlmICh0eXBlb2YgZCA9PT0gXCJzdHJpbmdcIikge1xuXHRcdFx0cmV0dXJuIGQ7XG5cdFx0fVxuXHRcdHJldHVybiBcIlwiO1xuXHR9XG5cblx0Z2V0U29ydERlc2NlbmRpbmdMYWJlbCgpOiBPYnNlcnZhYmxlPHN0cmluZz4ge1xuXHRcdHJldHVybiB0aGlzLl9zb3J0RGVzY2VuZGluZ0xhYmVsLnN1YmplY3QucGlwZSh0aGlzLnNvcnRMYWJlbE1hcCgpKTtcblx0fVxuXG5cdGdldFNvcnRBc2NlbmRpbmdMYWJlbCgpOiBPYnNlcnZhYmxlPHN0cmluZz4ge1xuXHRcdHJldHVybiB0aGlzLl9zb3J0QXNjZW5kaW5nTGFiZWwuc3ViamVjdC5waXBlKHRoaXMuc29ydExhYmVsTWFwKCkpO1xuXHR9XG5cblx0LyoqXG5cdCAqIFByZXZlbnQgZm9jdXMgZnJvbSBtb3ZpbmcgdG8gcGFyZW50IGJ1dHRvbiB3aGVuIGNsaWNrIG9uIGRlY29yYXRvclxuXHQgKi9cblx0b25EZWNvcmF0b3JSZWdpb25DbGljayhldmVudDogTW91c2VFdmVudCkge1xuXHRcdGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG5cdFx0ZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG5cdH1cblxuXHRvbkNsaWNrKGV2ZW50OiBNb3VzZUV2ZW50KSB7XG5cdFx0aWYgKHRoaXMuc2tlbGV0b24pIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cdFx0aWYgKFxuXHRcdFx0dGhpcy5jb2x1bW4/Lmhhc0FJTGFiZWxIZWFkZXIgJiZcblx0XHRcdHRoaXMuZGVjb3JhdG9ySW5uZXJSZWY/Lm5hdGl2ZUVsZW1lbnQ/LmNvbnRhaW5zKGV2ZW50LnRhcmdldClcblx0XHQpIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cdFx0dGhpcy5zb3J0LmVtaXQoKTtcblx0fVxuXG5cdHByb3RlY3RlZCBzb3J0TGFiZWxNYXAoKTogT3BlcmF0b3JGdW5jdGlvbjxzdHJpbmcsIHN0cmluZz4ge1xuXHRcdHJldHVybiBtYXAoKHN0cjogc3RyaW5nKSA9PiB7XG5cdFx0XHRpZiAodGhpcy5jb2x1bW4uYXJpYVNvcnRMYWJlbCkge1xuXHRcdFx0XHRyZXR1cm4gdGhpcy5jb2x1bW4uYXJpYVNvcnRMYWJlbDtcblx0XHRcdH1cblx0XHRcdGlmICh0aGlzLmNvbHVtbi5mb3JtYXRTb3J0TGFiZWwpIHtcblx0XHRcdFx0cmV0dXJuIHRoaXMuY29sdW1uLmZvcm1hdFNvcnRMYWJlbChzdHIsIHRoaXMuY29sdW1uLmFyaWFTb3J0TGFiZWwpO1xuXHRcdFx0fVxuXHRcdFx0Y29uc3QgaGVhZGVyID1cblx0XHRcdFx0dGhpcy5nZXRIZWFkZXJMYWJlbFRleHQoKSB8fFxuXHRcdFx0XHQodHlwZW9mIHRoaXMuY29sdW1uLmRhdGEgPT09IFwic3RyaW5nXCIgPyB0aGlzLmNvbHVtbi5kYXRhIDogXCJcIik7XG5cdFx0XHRyZXR1cm4gYCR7aGVhZGVyfSAtICR7c3RyfWA7XG5cdFx0fSk7XG5cdH1cbn1cbiJdfQ==