UNPKG

carbon-components-angular

Version:
312 lines 26.1 kB
import { Component, Input, ContentChildren, Optional, Output, EventEmitter } from "@angular/core"; import { BreadcrumbItemComponent } from "./breadcrumb-item.component"; import * as i0 from "@angular/core"; import * as i1 from "carbon-components-angular/i18n"; import * as i2 from "@angular/router"; import * as i3 from "@angular/common"; import * as i4 from "carbon-components-angular/dialog"; import * as i5 from "carbon-components-angular/icon"; import * as i6 from "./breadcrumb-item.component"; const MINIMUM_OVERFLOW_THRESHOLD = 4; /** * Get started with importing the module: * * ```typescript * import { BreadcrumbModule } from 'carbon-components-angular'; * ``` * * [See demo](../../?path=/story/components-breadcrumb--basic) */ export class Breadcrumb { constructor(i18n, router) { this.i18n = i18n; this.router = router; this.noTrailingSlash = false; this.ariaLabel = this.i18n.get().BREADCRUMB.LABEL; /** * **Experimental**: Auto align menu tooltip position */ this.autoAlign = false; this.description = this.i18n.get().BREADCRUMB.OVERFLOW_MENU_DESCRIPTION; /** * Emits the navigation status promise when the link is activated */ this.navigation = new EventEmitter(); this._skeleton = false; } set skeleton(value) { this._skeleton = value; this.updateChildren(); } get skeleton() { return this._skeleton; } set threshold(threshold) { this._threshold = threshold; if (isNaN(threshold) || threshold < MINIMUM_OVERFLOW_THRESHOLD) { this._threshold = MINIMUM_OVERFLOW_THRESHOLD; } } get threshold() { return this._threshold; } get shouldShowContent() { return !this.items; } get shouldShowOverflow() { if (!this.items) { return false; } return this.items.length > this.threshold; } get first() { return this.shouldShowOverflow ? this.items[0] : null; } get overflowItems() { return this.shouldShowOverflow ? this.items.slice(1, this.items.length - 2) : []; } get secondLast() { return this.shouldShowOverflow ? this.items[this.items.length - 2] : null; } get last() { return this.shouldShowOverflow ? this.items[this.items.length - 1] : null; } ngAfterContentInit() { this.updateChildren(); } navigate(event, item) { if (this.router && item.route) { event.preventDefault(); const status = this.router.navigate(item.route, item.routeExtras); this.navigation.emit(status); } } updateChildren() { if (this.children) { this.children.toArray().forEach(child => child.skeleton = this.skeleton); } } } Breadcrumb.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: Breadcrumb, deps: [{ token: i1.I18n }, { token: i2.Router, optional: true }], target: i0.ɵɵFactoryTarget.Component }); Breadcrumb.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.3.0", type: Breadcrumb, selector: "cds-breadcrumb, ibm-breadcrumb", inputs: { items: "items", noTrailingSlash: "noTrailingSlash", ariaLabel: "ariaLabel", skeleton: "skeleton", threshold: "threshold", autoAlign: "autoAlign", description: "description" }, outputs: { navigation: "navigation" }, queries: [{ propertyName: "children", predicate: BreadcrumbItemComponent }], ngImport: i0, template: ` <nav #nav class="cds--breadcrumb" [ngClass]="{ 'cds--skeleton' : skeleton, 'cds--breadcrumb--no-trailing-slash' : noTrailingSlash }" [attr.aria-label]="ariaLabel"> <ng-template [ngIf]="shouldShowContent"> <ng-content></ng-content> </ng-template> <ng-template [ngIf]="!shouldShowOverflow"> <cds-breadcrumb-item *ngFor="let item of items" [href]="item.href" [route]="item.route" [routeExtras]="item.routeExtras" [current]="item.current" [ariaCurrent]="item.ariaCurrent" (navigation)="navigation.emit($event)"> <ng-container *ngIf="!item.template">{{item.content}}</ng-container> <ng-template *ngIf="item.template" [ngTemplateOutlet]="item.template" [ngTemplateOutletContext]="{ $implicit: item }"> </ng-template> </cds-breadcrumb-item> </ng-template> <ng-template [ngIf]="shouldShowOverflow"> <cds-breadcrumb-item [href]="first?.href" [route]="first?.route" [routeExtras]="first?.routeExtras" [current]="first?.current" [ariaCurrent]="first?.ariaCurrent" (navigation)="navigation.emit($event)"> <ng-container *ngIf="!first?.template">{{first?.content}}</ng-container> <ng-template *ngIf="first?.template" [ngTemplateOutlet]="first?.template" [ngTemplateOutletContext]="{ $implicit: first }"> </ng-template> </cds-breadcrumb-item> <cds-breadcrumb-item> <ng-template #overflowMenuTrigger> <svg class="cds--overflow-menu__icon" cdsIcon="overflow-menu--horizontal" size="16"></svg> </ng-template> <cds-overflow-menu [customTrigger]="overflowMenuTrigger" triggerClass="cds--btn--icon-only" [description]="description" [autoAlign]="autoAlign"> <li class="cds--overflow-menu-options__option" *ngFor="let item of overflowItems"> <a class="cds--overflow-menu-options__btn" href="{{item?.href}}" (click)="navigate($event, item)" style="text-decoration: none;"> <ng-container *ngIf="!item?.template">{{item?.content}}</ng-container> <ng-template *ngIf="item?.template" [ngTemplateOutlet]="item?.template" [ngTemplateOutletContext]="{ $implicit: item }"> </ng-template> </a> </li> </cds-overflow-menu> </cds-breadcrumb-item> <cds-breadcrumb-item [href]="secondLast?.href" [route]="secondLast?.route" [routeExtras]="secondLast?.routeExtras" [current]="secondLast?.current" [ariaCurrent]="secondLast?.ariaCurrent" (navigation)="navigation.emit($event)"> <ng-container *ngIf="!secondLast?.template">{{secondLast?.content}}</ng-container> <ng-template *ngIf="secondLast?.template" [ngTemplateOutlet]="secondLast?.template" [ngTemplateOutletContext]="{ $implicit: secondLast }"> </ng-template> </cds-breadcrumb-item> <cds-breadcrumb-item [href]="last?.href" [route]="last?.route" [routeExtras]="last?.routeExtras" [current]="last?.current" [ariaCurrent]="last?.ariaCurrent" (navigation)="navigation.emit($event)"> <ng-container *ngIf="!last?.template">{{last?.content}}</ng-container> <ng-template *ngIf="last?.template" [ngTemplateOutlet]="last?.template" [ngTemplateOutletContext]="{ $implicit: last }"> </ng-template> </cds-breadcrumb-item> </ng-template> </nav>`, isInline: true, dependencies: [{ kind: "directive", type: i3.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i3.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i3.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: i4.OverflowMenu, selector: "cds-overflow-menu, ibm-overflow-menu", inputs: ["buttonLabel", "description", "flip", "placement", "open", "customTrigger", "offset", "wrapperClass", "triggerClass"], outputs: ["openChange"] }, { kind: "directive", type: i5.IconDirective, selector: "[cdsIcon], [ibmIcon]", inputs: ["ibmIcon", "cdsIcon", "size", "title", "ariaLabel", "ariaLabelledBy", "ariaHidden", "isFocusable"] }, { kind: "component", type: i6.BreadcrumbItemComponent, selector: "cds-breadcrumb-item, ibm-breadcrumb-item", inputs: ["href", "route", "routeExtras", "skeleton", "ariaCurrent", "current"], outputs: ["navigation"] }] }); i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: Breadcrumb, decorators: [{ type: Component, args: [{ selector: "cds-breadcrumb, ibm-breadcrumb", template: ` <nav #nav class="cds--breadcrumb" [ngClass]="{ 'cds--skeleton' : skeleton, 'cds--breadcrumb--no-trailing-slash' : noTrailingSlash }" [attr.aria-label]="ariaLabel"> <ng-template [ngIf]="shouldShowContent"> <ng-content></ng-content> </ng-template> <ng-template [ngIf]="!shouldShowOverflow"> <cds-breadcrumb-item *ngFor="let item of items" [href]="item.href" [route]="item.route" [routeExtras]="item.routeExtras" [current]="item.current" [ariaCurrent]="item.ariaCurrent" (navigation)="navigation.emit($event)"> <ng-container *ngIf="!item.template">{{item.content}}</ng-container> <ng-template *ngIf="item.template" [ngTemplateOutlet]="item.template" [ngTemplateOutletContext]="{ $implicit: item }"> </ng-template> </cds-breadcrumb-item> </ng-template> <ng-template [ngIf]="shouldShowOverflow"> <cds-breadcrumb-item [href]="first?.href" [route]="first?.route" [routeExtras]="first?.routeExtras" [current]="first?.current" [ariaCurrent]="first?.ariaCurrent" (navigation)="navigation.emit($event)"> <ng-container *ngIf="!first?.template">{{first?.content}}</ng-container> <ng-template *ngIf="first?.template" [ngTemplateOutlet]="first?.template" [ngTemplateOutletContext]="{ $implicit: first }"> </ng-template> </cds-breadcrumb-item> <cds-breadcrumb-item> <ng-template #overflowMenuTrigger> <svg class="cds--overflow-menu__icon" cdsIcon="overflow-menu--horizontal" size="16"></svg> </ng-template> <cds-overflow-menu [customTrigger]="overflowMenuTrigger" triggerClass="cds--btn--icon-only" [description]="description" [autoAlign]="autoAlign"> <li class="cds--overflow-menu-options__option" *ngFor="let item of overflowItems"> <a class="cds--overflow-menu-options__btn" href="{{item?.href}}" (click)="navigate($event, item)" style="text-decoration: none;"> <ng-container *ngIf="!item?.template">{{item?.content}}</ng-container> <ng-template *ngIf="item?.template" [ngTemplateOutlet]="item?.template" [ngTemplateOutletContext]="{ $implicit: item }"> </ng-template> </a> </li> </cds-overflow-menu> </cds-breadcrumb-item> <cds-breadcrumb-item [href]="secondLast?.href" [route]="secondLast?.route" [routeExtras]="secondLast?.routeExtras" [current]="secondLast?.current" [ariaCurrent]="secondLast?.ariaCurrent" (navigation)="navigation.emit($event)"> <ng-container *ngIf="!secondLast?.template">{{secondLast?.content}}</ng-container> <ng-template *ngIf="secondLast?.template" [ngTemplateOutlet]="secondLast?.template" [ngTemplateOutletContext]="{ $implicit: secondLast }"> </ng-template> </cds-breadcrumb-item> <cds-breadcrumb-item [href]="last?.href" [route]="last?.route" [routeExtras]="last?.routeExtras" [current]="last?.current" [ariaCurrent]="last?.ariaCurrent" (navigation)="navigation.emit($event)"> <ng-container *ngIf="!last?.template">{{last?.content}}</ng-container> <ng-template *ngIf="last?.template" [ngTemplateOutlet]="last?.template" [ngTemplateOutletContext]="{ $implicit: last }"> </ng-template> </cds-breadcrumb-item> </ng-template> </nav>` }] }], ctorParameters: function () { return [{ type: i1.I18n }, { type: i2.Router, decorators: [{ type: Optional }] }]; }, propDecorators: { children: [{ type: ContentChildren, args: [BreadcrumbItemComponent] }], items: [{ type: Input }], noTrailingSlash: [{ type: Input }], ariaLabel: [{ type: Input }], skeleton: [{ type: Input }], threshold: [{ type: Input }], autoAlign: [{ type: Input }], description: [{ type: Input }], navigation: [{ type: Output }] } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYnJlYWRjcnVtYi5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvYnJlYWRjcnVtYi9icmVhZGNydW1iLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ04sU0FBUyxFQUNULEtBQUssRUFDTCxlQUFlLEVBSWYsUUFBUSxFQUNSLE1BQU0sRUFDTixZQUFZLEVBQ1osTUFBTSxlQUFlLENBQUM7QUFHdkIsT0FBTyxFQUFFLHVCQUF1QixFQUFFLE1BQU0sNkJBQTZCLENBQUM7Ozs7Ozs7O0FBSXRFLE1BQU0sMEJBQTBCLEdBQUcsQ0FBQyxDQUFDO0FBRXJDOzs7Ozs7OztHQVFHO0FBcUdILE1BQU0sT0FBTyxVQUFVO0lBd0V0QixZQUFzQixJQUFVLEVBQXdCLE1BQWM7UUFBaEQsU0FBSSxHQUFKLElBQUksQ0FBTTtRQUF3QixXQUFNLEdBQU4sTUFBTSxDQUFRO1FBbkU3RCxvQkFBZSxHQUFHLEtBQUssQ0FBQztRQUV4QixjQUFTLEdBQVcsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQyxVQUFVLENBQUMsS0FBSyxDQUFDO1FBd0I5RDs7V0FFRztRQUNNLGNBQVMsR0FBRyxLQUFLLENBQUM7UUFDbEIsZ0JBQVcsR0FBVyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDLFVBQVUsQ0FBQyx5QkFBeUIsQ0FBQztRQUVwRjs7V0FFRztRQUNPLGVBQVUsR0FBRyxJQUFJLFlBQVksRUFBb0IsQ0FBQztRQThCbEQsY0FBUyxHQUFHLEtBQUssQ0FBQztJQUU4QyxDQUFDO0lBL0QzRSxJQUNJLFFBQVEsQ0FBQyxLQUFVO1FBQ3RCLElBQUksQ0FBQyxTQUFTLEdBQUcsS0FBSyxDQUFDO1FBQ3ZCLElBQUksQ0FBQyxjQUFjLEVBQUUsQ0FBQztJQUN2QixDQUFDO0lBRUQsSUFBSSxRQUFRO1FBQ1gsT0FBTyxJQUFJLENBQUMsU0FBUyxDQUFDO0lBQ3ZCLENBQUM7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Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O1FBZ0dIO2lCQUNQOzswQkF5RW1DLFFBQVE7NENBdkVELFFBQVE7c0JBQWpELGVBQWU7dUJBQUMsdUJBQXVCO2dCQUUvQixLQUFLO3NCQUFiLEtBQUs7Z0JBRUcsZUFBZTtzQkFBdkIsS0FBSztnQkFFRyxTQUFTO3NCQUFqQixLQUFLO2dCQUdGLFFBQVE7c0JBRFgsS0FBSztnQkFXRixTQUFTO3NCQURaLEtBQUs7Z0JBZUcsU0FBUztzQkFBakIsS0FBSztnQkFDRyxXQUFXO3NCQUFuQixLQUFLO2dCQUtJLFVBQVU7c0JBQW5CLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuXHRDb21wb25lbnQsXG5cdElucHV0LFxuXHRDb250ZW50Q2hpbGRyZW4sXG5cdFF1ZXJ5TGlzdCxcblx0QWZ0ZXJDb250ZW50SW5pdCxcblx0VGVtcGxhdGVSZWYsXG5cdE9wdGlvbmFsLFxuXHRPdXRwdXQsXG5cdEV2ZW50RW1pdHRlclxufSBmcm9tIFwiQGFuZ3VsYXIvY29yZVwiO1xuXG5pbXBvcnQgeyBCcmVhZGNydW1iSXRlbSB9IGZyb20gXCIuL2JyZWFkY3J1bWItaXRlbS5pbnRlcmZhY2VcIjtcbmltcG9ydCB7IEJyZWFkY3J1bWJJdGVtQ29tcG9uZW50IH0gZnJvbSBcIi4vYnJlYWRjcnVtYi1pdGVtLmNvbXBvbmVudFwiO1xuaW1wb3J0IHsgUm91dGVyIH0gZnJvbSBcIkBhbmd1bGFyL3JvdXRlclwiO1xuaW1wb3J0IHsgSTE4biB9IGZyb20gXCJjYXJib24tY29tcG9uZW50cy1hbmd1bGFyL2kxOG5cIjtcblxuY29uc3QgTUlOSU1VTV9PVkVSRkxPV19USFJFU0hPTEQgPSA0O1xuXG4vKipcbiAqIEdldCBzdGFydGVkIHdpdGggaW1wb3J0aW5nIHRoZSBtb2R1bGU6XG4gKlxuICogYGBgdHlwZXNjcmlwdFxuICogaW1wb3J0IHsgQnJlYWRjcnVtYk1vZHVsZSB9IGZyb20gJ2NhcmJvbi1jb21wb25lbnRzLWFuZ3VsYXInO1xuICogYGBgXG4gKlxuICogW1NlZSBkZW1vXSguLi8uLi8/cGF0aD0vc3RvcnkvY29tcG9uZW50cy1icmVhZGNydW1iLS1iYXNpYylcbiAqL1xuQENvbXBvbmVudCh7XG5cdHNlbGVjdG9yOiBcImNkcy1icmVhZGNydW1iLCBpYm0tYnJlYWRjcnVtYlwiLFxuXHR0ZW1wbGF0ZTogYFxuXHQ8bmF2ICNuYXYgY2xhc3M9XCJjZHMtLWJyZWFkY3J1bWJcIlxuXHRcdFtuZ0NsYXNzXT1cIntcblx0XHRcdCdjZHMtLXNrZWxldG9uJyA6IHNrZWxldG9uLFxuXHRcdFx0J2Nkcy0tYnJlYWRjcnVtYi0tbm8tdHJhaWxpbmctc2xhc2gnIDogbm9UcmFpbGluZ1NsYXNoXG5cdFx0fVwiXG5cdFx0W2F0dHIuYXJpYS1sYWJlbF09XCJhcmlhTGFiZWxcIj5cblx0XHQ8bmctdGVtcGxhdGUgW25nSWZdPVwic2hvdWxkU2hvd0NvbnRlbnRcIj5cblx0XHRcdDxuZy1jb250ZW50PjwvbmctY29udGVudD5cblx0XHQ8L25nLXRlbXBsYXRlPlxuXHRcdDxuZy10ZW1wbGF0ZSBbbmdJZl09XCIhc2hvdWxkU2hvd092ZXJmbG93XCI+XG5cdFx0XHQ8Y2RzLWJyZWFkY3J1bWItaXRlbVxuXHRcdFx0XHQqbmdGb3I9XCJsZXQgaXRlbSBvZiBpdGVtc1wiXG5cdFx0XHRcdFtocmVmXT1cIml0ZW0uaHJlZlwiXG5cdFx0XHRcdFtyb3V0ZV09XCJpdGVtLnJvdXRlXCJcblx0XHRcdFx0W3JvdXRlRXh0cmFzXT1cIml0ZW0ucm91dGVFeHRyYXNcIlxuXHRcdFx0XHRbY3VycmVudF09XCJpdGVtLmN1cnJlbnRcIlxuXHRcdFx0XHRbYXJpYUN1cnJlbnRdPVwiaXRlbS5hcmlhQ3VycmVudFwiXG5cdFx0XHRcdChuYXZpZ2F0aW9uKT1cIm5hdmlnYXRpb24uZW1pdCgkZXZlbnQpXCI+XG5cdFx0XHRcdDxuZy1jb250YWluZXIgKm5nSWY9XCIhaXRlbS50ZW1wbGF0ZVwiPnt7aXRlbS5jb250ZW50fX08L25nLWNvbnRhaW5lcj5cblx0XHRcdFx0PG5nLXRlbXBsYXRlXG5cdFx0XHRcdFx0Km5nSWY9XCJpdGVtLnRlbXBsYXRlXCJcblx0XHRcdFx0XHRbbmdUZW1wbGF0ZU91dGxldF09XCJpdGVtLnRlbXBsYXRlXCJcblx0XHRcdFx0XHRbbmdUZW1wbGF0ZU91dGxldENvbnRleHRdPVwieyAkaW1wbGljaXQ6IGl0ZW0gfVwiPlxuXHRcdFx0XHQ8L25nLXRlbXBsYXRlPlxuXHRcdFx0PC9jZHMtYnJlYWRjcnVtYi1pdGVtPlxuXHRcdDwvbmctdGVtcGxhdGU+XG5cdFx0PG5nLXRlbXBsYXRlIFtuZ0lmXT1cInNob3VsZFNob3dPdmVyZmxvd1wiPlxuXHRcdFx0PGNkcy1icmVhZGNydW1iLWl0ZW1cblx0XHRcdFx0W2hyZWZdPVwiZmlyc3Q/LmhyZWZcIlxuXHRcdFx0XHRbcm91dGVdPVwiZmlyc3Q/LnJvdXRlXCJcblx0XHRcdFx0W3JvdXRlRXh0cmFzXT1cImZpcnN0Py5yb3V0ZUV4dHJhc1wiXG5cdFx0XHRcdFtjdXJyZW50XT1cImZpcnN0Py5jdXJyZW50XCJcblx0XHRcdFx0W2FyaWFDdXJyZW50XT1cImZpcnN0Py5hcmlhQ3VycmVudFwiXG5cdFx0XHRcdChuYXZpZ2F0aW9uKT1cIm5hdmlnYXRpb24uZW1pdCgkZXZlbnQpXCI+XG5cdFx0XHRcdDxuZy1jb250YWluZXIgKm5nSWY9XCIhZmlyc3Q/LnRlbXBsYXRlXCI+e3tmaXJzdD8uY29udGVudH19PC9uZy1jb250YWluZXI+XG5cdFx0XHRcdDxuZy10ZW1wbGF0ZVxuXHRcdFx0XHRcdCpuZ0lmPVwiZmlyc3Q/LnRlbXBsYXRlXCJcblx0XHRcdFx0XHRbbmdUZW1wbGF0ZU91dGxldF09XCJmaXJzdD8udGVtcGxhdGVcIlxuXHRcdFx0XHRcdFtuZ1RlbXBsYXRlT3V0bGV0Q29udGV4dF09XCJ7ICRpbXBsaWNpdDogZmlyc3QgfVwiPlxuXHRcdFx0XHQ8L25nLXRlbXBsYXRlPlxuXHRcdFx0PC9jZHMtYnJlYWRjcnVtYi1pdGVtPlxuXHRcdFx0PGNkcy1icmVhZGNydW1iLWl0ZW0+XG5cdFx0XHRcdDxuZy10ZW1wbGF0ZSAjb3ZlcmZsb3dNZW51VHJpZ2dlcj5cblx0XHRcdFx0XHQ8c3ZnIGNsYXNzPVwiY2RzLS1vdmVyZmxvdy1tZW51X19pY29uXCIgY2RzSWNvbj1cIm92ZXJmbG93LW1lbnUtLWhvcml6b250YWxcIiBzaXplPVwiMTZcIj48L3N2Zz5cblx0XHRcdFx0PC9uZy10ZW1wbGF0ZT5cblx0XHRcdFx0PGNkcy1vdmVyZmxvdy1tZW51XG5cdFx0XHRcdFx0W2N1c3RvbVRyaWdnZXJdPVwib3ZlcmZsb3dNZW51VHJpZ2dlclwiXG5cdFx0XHRcdFx0dHJpZ2dlckNsYXNzPVwiY2RzLS1idG4tLWljb24tb25seVwiXG5cdFx0XHRcdFx0W2Rlc2NyaXB0aW9uXT1cImRlc2NyaXB0aW9uXCJcblx0XHRcdFx0XHRbYXV0b0FsaWduXT1cImF1dG9BbGlnblwiPlxuXHRcdFx0XHRcdDxsaSBjbGFzcz1cImNkcy0tb3ZlcmZsb3ctbWVudS1vcHRpb25zX19vcHRpb25cIlxuXHRcdFx0XHRcdFx0Km5nRm9yPVwibGV0IGl0ZW0gb2Ygb3ZlcmZsb3dJdGVtc1wiPlxuXHRcdFx0XHRcdFx0PGEgY2xhc3M9XCJjZHMtLW92ZXJmbG93LW1lbnUtb3B0aW9uc19fYnRuXCJcblx0XHRcdFx0XHRcdFx0aHJlZj1cInt7aXRlbT8uaHJlZn19XCJcblx0XHRcdFx0XHRcdFx0KGNsaWNrKT1cIm5hdmlnYXRlKCRldmVudCwgaXRlbSlcIlxuXHRcdFx0XHRcdFx0XHRzdHlsZT1cInRleHQtZGVjb3JhdGlvbjogbm9uZTtcIj5cblx0XHRcdFx0XHRcdFx0PG5nLWNvbnRhaW5lciAqbmdJZj1cIiFpdGVtPy50ZW1wbGF0ZVwiPnt7aXRlbT8uY29udGVudH19PC9uZy1jb250YWluZXI+XG5cdFx0XHRcdFx0XHRcdDxuZy10ZW1wbGF0ZVxuXHRcdFx0XHRcdFx0XHRcdCpuZ0lmPVwiaXRlbT8udGVtcGxhdGVcIlxuXHRcdFx0XHRcdFx0XHRcdFtuZ1RlbXBsYXRlT3V0bGV0XT1cIml0ZW0/LnRlbXBsYXRlXCJcblx0XHRcdFx0XHRcdFx0XHRbbmdUZW1wbGF0ZU91dGxldENvbnRleHRdPVwieyAkaW1wbGljaXQ6IGl0ZW0gfVwiPlxuXHRcdFx0XHRcdFx0XHQ8L25nLXRlbXBsYXRlPlxuXHRcdFx0XHRcdFx0PC9hPlxuXHRcdFx0XHRcdDwvbGk+XG5cdFx0XHRcdDwvY2RzLW92ZXJmbG93LW1lbnU+XG5cdFx0XHQ8L2Nkcy1icmVhZGNydW1iLWl0ZW0+XG5cdFx0XHQ8Y2RzLWJyZWFkY3J1bWItaXRlbVxuXHRcdFx0XHRbaHJlZl09XCJzZWNvbmRMYXN0Py5ocmVmXCJcblx0XHRcdFx0W3JvdXRlXT1cInNlY29uZExhc3Q/LnJvdXRlXCJcblx0XHRcdFx0W3JvdXRlRXh0cmFzXT1cInNlY29uZExhc3Q/LnJvdXRlRXh0cmFzXCJcblx0XHRcdFx0W2N1cnJlbnRdPVwic2Vjb25kTGFzdD8uY3VycmVudFwiXG5cdFx0XHRcdFthcmlhQ3VycmVudF09XCJzZWNvbmRMYXN0Py5hcmlhQ3VycmVudFwiXG5cdFx0XHRcdChuYXZpZ2F0aW9uKT1cIm5hdmlnYXRpb24uZW1pdCgkZXZlbnQpXCI+XG5cdFx0XHRcdDxuZy1jb250YWluZXIgKm5nSWY9XCIhc2Vjb25kTGFzdD8udGVtcGxhdGVcIj57e3NlY29uZExhc3Q/LmNvbnRlbnR9fTwvbmctY29udGFpbmVyPlxuXHRcdFx0XHQ8bmctdGVtcGxhdGVcblx0XHRcdFx0XHQqbmdJZj1cInNlY29uZExhc3Q/LnRlbXBsYXRlXCJcblx0XHRcdFx0XHRbbmdUZW1wbGF0ZU91dGxldF09XCJzZWNvbmRMYXN0Py50ZW1wbGF0ZVwiXG5cdFx0XHRcdFx0W25nVGVtcGxhdGVPdXRsZXRDb250ZXh0XT1cInsgJGltcGxpY2l0OiBzZWNvbmRMYXN0IH1cIj5cblx0XHRcdFx0PC9uZy10ZW1wbGF0ZT5cblx0XHRcdDwvY2RzLWJyZWFkY3J1bWItaXRlbT5cblx0XHRcdDxjZHMtYnJlYWRjcnVtYi1pdGVtXG5cdFx0XHRcdFtocmVmXT1cImxhc3Q/LmhyZWZcIlxuXHRcdFx0XHRbcm91dGVdPVwibGFzdD8ucm91dGVcIlxuXHRcdFx0XHRbcm91dGVFeHRyYXNdPVwibGFzdD8ucm91dGVFeHRyYXNcIlxuXHRcdFx0XHRbY3VycmVudF09XCJsYXN0Py5jdXJyZW50XCJcblx0XHRcdFx0W2FyaWFDdXJyZW50XT1cImxhc3Q/LmFyaWFDdXJyZW50XCJcblx0XHRcdFx0KG5hdmlnYXRpb24pPVwibmF2aWdhdGlvbi5lbWl0KCRldmVudClcIj5cblx0XHRcdFx0PG5nLWNvbnRhaW5lciAqbmdJZj1cIiFsYXN0Py50ZW1wbGF0ZVwiPnt7bGFzdD8uY29udGVudH19PC9uZy1jb250YWluZXI+XG5cdFx0XHRcdDxuZy10ZW1wbGF0ZVxuXHRcdFx0XHRcdCpuZ0lmPVwibGFzdD8udGVtcGxhdGVcIlxuXHRcdFx0XHRcdFtuZ1RlbXBsYXRlT3V0bGV0XT1cImxhc3Q/LnRlbXBsYXRlXCJcblx0XHRcdFx0XHRbbmdUZW1wbGF0ZU91dGxldENvbnRleHRdPVwieyAkaW1wbGljaXQ6IGxhc3QgfVwiPlxuXHRcdFx0XHQ8L25nLXRlbXBsYXRlPlxuXHRcdFx0PC9jZHMtYnJlYWRjcnVtYi1pdGVtPlxuXHRcdDwvbmctdGVtcGxhdGU+XG5cdDwvbmF2PmBcbn0pXG5leHBvcnQgY2xhc3MgQnJlYWRjcnVtYiBpbXBsZW1lbnRzIEFmdGVyQ29udGVudEluaXQge1xuXHRAQ29udGVudENoaWxkcmVuKEJyZWFkY3J1bWJJdGVtQ29tcG9uZW50KSBjaGlsZHJlbjogUXVlcnlMaXN0PEJyZWFkY3J1bWJJdGVtQ29tcG9uZW50PjtcblxuXHRASW5wdXQoKSBpdGVtczogQXJyYXk8QnJlYWRjcnVtYkl0ZW0+O1xuXG5cdEBJbnB1dCgpIG5vVHJhaWxpbmdTbGFzaCA9IGZhbHNlO1xuXG5cdEBJbnB1dCgpIGFyaWFMYWJlbDogc3RyaW5nID0gdGhpcy5pMThuLmdldCgpLkJSRUFEQ1JVTUIuTEFCRUw7XG5cblx0QElucHV0KClcblx0c2V0IHNrZWxldG9uKHZhbHVlOiBhbnkpIHtcblx0XHR0aGlzLl9za2VsZXRvbiA9IHZhbHVlO1xuXHRcdHRoaXMudXBkYXRlQ2hpbGRyZW4oKTtcblx0fVxuXG5cdGdldCBza2VsZXRvbigpOiBhbnkge1xuXHRcdHJldHVybiB0aGlzLl9za2VsZXRvbjtcblx0fVxuXG5cdEBJbnB1dCgpXG5cdHNldCB0aHJlc2hvbGQodGhyZXNob2xkOiBudW1iZXIpIHtcblx0XHR0aGlzLl90aHJlc2hvbGQgPSB0aHJlc2hvbGQ7XG5cdFx0aWYgKGlzTmFOKHRocmVzaG9sZCkgfHwgdGhyZXNob2xkIDwgTUlOSU1VTV9PVkVSRkxPV19USFJFU0hPTEQpIHtcblx0XHRcdHRoaXMuX3RocmVzaG9sZCA9IE1JTklNVU1fT1ZFUkZMT1dfVEhSRVNIT0xEO1xuXHRcdH1cblx0fVxuXG5cdGdldCB0aHJlc2hvbGQoKTogbnVtYmVyIHtcblx0XHRyZXR1cm4gdGhpcy5fdGhyZXNob2xkO1xuXHR9XG5cblx0LyoqXG5cdCAqICoqRXhwZXJpbWVudGFsKio6IEF1dG8gYWxpZ24gbWVudSB0b29sdGlwIHBvc2l0aW9uXG5cdCAqL1xuXHRASW5wdXQoKSBhdXRvQWxpZ24gPSBmYWxzZTtcblx0QElucHV0KCkgZGVzY3JpcHRpb246IHN0cmluZyA9IHRoaXMuaTE4bi5nZXQoKS5CUkVBRENSVU1CLk9WRVJGTE9XX01FTlVfREVTQ1JJUFRJT047XG5cblx0LyoqXG5cdCAqIEVtaXRzIHRoZSBuYXZpZ2F0aW9uIHN0YXR1cyBwcm9taXNlIHdoZW4gdGhlIGxpbmsgaXMgYWN0aXZhdGVkXG5cdCAqL1xuXHRAT3V0cHV0KCkgbmF2aWdhdGlvbiA9IG5ldyBFdmVudEVtaXR0ZXI8UHJvbWlzZTxib29sZWFuPj4oKTtcblxuXHRnZXQgc2hvdWxkU2hvd0NvbnRlbnQoKTogYm9vbGVhbiB7XG5cdFx0cmV0dXJuICF0aGlzLml0ZW1zO1xuXHR9XG5cblx0Z2V0IHNob3VsZFNob3dPdmVyZmxvdygpOiBib29sZWFuIHtcblx0XHRpZiAoIXRoaXMuaXRlbXMpIHtcblx0XHRcdHJldHVybiBmYWxzZTtcblx0XHR9XG5cdFx0cmV0dXJuIHRoaXMuaXRlbXMubGVuZ3RoID4gdGhpcy50aHJlc2hvbGQ7XG5cdH1cblxuXHRnZXQgZmlyc3QoKTogQnJlYWRjcnVtYkl0ZW0ge1xuXHRcdHJldHVybiB0aGlzLnNob3VsZFNob3dPdmVyZmxvdyA/IHRoaXMuaXRlbXNbMF0gOiBudWxsO1xuXHR9XG5cblx0Z2V0IG92ZXJmbG93SXRlbXMoKTogQXJyYXk8QnJlYWRjcnVtYkl0ZW0+IHtcblx0XHRyZXR1cm4gdGhpcy5zaG91bGRTaG93T3ZlcmZsb3cgPyB0aGlzLml0ZW1zLnNsaWNlKDEsIHRoaXMuaXRlbXMubGVuZ3RoIC0gMikgOiBbXTtcblx0fVxuXG5cdGdldCBzZWNvbmRMYXN0KCk6IEJyZWFkY3J1bWJJdGVtIHtcblx0XHRyZXR1cm4gdGhpcy5zaG91bGRTaG93T3ZlcmZsb3cgPyB0aGlzLml0ZW1zW3RoaXMuaXRlbXMubGVuZ3RoIC0gMl0gOiBudWxsO1xuXHR9XG5cblx0Z2V0IGxhc3QoKTogQnJlYWRjcnVtYkl0ZW0ge1xuXHRcdHJldHVybiB0aGlzLnNob3VsZFNob3dPdmVyZmxvdyA/IHRoaXMuaXRlbXNbdGhpcy5pdGVtcy5sZW5ndGggLSAxXSA6IG51bGw7XG5cdH1cblxuXHRwcm90ZWN0ZWQgX3RocmVzaG9sZDogbnVtYmVyO1xuXHRwcm90ZWN0ZWQgX3NrZWxldG9uID0gZmFsc2U7XG5cblx0Y29uc3RydWN0b3IocHJvdGVjdGVkIGkxOG46IEkxOG4sIEBPcHRpb25hbCgpIHByb3RlY3RlZCByb3V0ZXI6IFJvdXRlcikgeyB9XG5cblx0bmdBZnRlckNvbnRlbnRJbml0KCkge1xuXHRcdHRoaXMudXBkYXRlQ2hpbGRyZW4oKTtcblx0fVxuXG5cdG5hdmlnYXRlKGV2ZW50LCBpdGVtOiBCcmVhZGNydW1iSXRlbSkge1xuXHRcdGlmICh0aGlzLnJvdXRlciAmJiBpdGVtLnJvdXRlKSB7XG5cdFx0XHRldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuXHRcdFx0Y29uc3Qgc3RhdHVzID0gdGhpcy5yb3V0ZXIubmF2aWdhdGUoaXRlbS5yb3V0ZSwgaXRlbS5yb3V0ZUV4dHJhcyk7XG5cdFx0XHR0aGlzLm5hdmlnYXRpb24uZW1pdChzdGF0dXMpO1xuXHRcdH1cblx0fVxuXG5cdHByb3RlY3RlZCB1cGRhdGVDaGlsZHJlbigpIHtcblx0XHRpZiAodGhpcy5jaGlsZHJlbikge1xuXHRcdFx0dGhpcy5jaGlsZHJlbi50b0FycmF5KCkuZm9yRWFjaChjaGlsZCA9PiBjaGlsZC5za2VsZXRvbiA9IHRoaXMuc2tlbGV0b24pO1xuXHRcdH1cblx0fVxufVxuIl19