@engie-group/fluid-design-system-angular
Version:
Fluid Design System Angular
105 lines • 17.2 kB
JavaScript
import { CommonModule } from '@angular/common';
import { ChangeDetectionStrategy, Component, EventEmitter, Input, Output } from '@angular/core';
import { IconButtonComponent } from '../icon-button/icon-button.component';
import { IconComponent } from '../icon/icon.component';
import * as i0 from "@angular/core";
import * as i1 from "@angular/common";
export class PaginationComponent {
constructor(cdr) {
this.cdr = cdr;
/**
* Current page
*/
this.currentItem = 1;
/**
* Whether pagination should minify
*/
this.shouldMinify = true;
/**
* Emits selected item on change
*/
this.selectedItem = new EventEmitter();
}
/**
* @ignore
*/
getItems() {
return Array.from({ length: this.count }, (_, i) => i + 1);
}
/**
* @ignore
*/
goToNext() {
if (this.currentItem === this.count) {
return;
}
this.currentItem = this.currentItem + 1;
this.selectedItem?.emit(this.currentItem);
this.cdr.markForCheck();
}
/**
* @ignore
*/
goToPrevious() {
if (this.currentItem === 1) {
return;
}
this.currentItem = this.currentItem - 1;
this.selectedItem?.emit(this.currentItem);
this.cdr.markForCheck();
}
/**
* @ignore
*/
goToItem(item) {
if (item > this.count || this.currentItem < 1) {
return;
}
this.currentItem = item;
this.selectedItem?.emit(this.currentItem);
this.cdr.markForCheck();
}
/**
* @ignore
*/
isItemVisible(item) {
// Always show first, last and selected item
if (item === 1 || item === this.count || item === this.currentItem) {
return true;
}
// Always show previous and next values of selected value
if (item >= this.currentItem - 1 && item <= this.currentItem + 1) {
return true;
}
if (item < 6 && this.currentItem < 4) {
return true;
}
return item >= this.count - 4 && this.currentItem >= this.count - 2;
}
/**
* @ignore
*/
showMoreHorizontal(item) {
// We want to show on 2nd item if currentItem > 3 or in penultimate if currentItem is in last 3
return (item === 2 && this.currentItem > 3) || (item === this.count - 1 && this.currentItem <= this.count - 3);
}
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: PaginationComponent, deps: [{ token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component }); }
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: PaginationComponent, isStandalone: true, selector: "nj-pagination", inputs: { ariaLabelNext: "ariaLabelNext", ariaLabelPrevious: "ariaLabelPrevious", count: "count", currentItem: "currentItem", shouldMinify: "shouldMinify" }, outputs: { selectedItem: "selectedItem" }, ngImport: i0, template: "<nav>\n <ul class=\"nj-pagination\">\n <li class=\"nj-pagination__item\">\n <nj-icon-button size=\"sm\"\n icon=\"chevron_left\"\n [label]=\"ariaLabelPrevious\"\n (buttonClick)=\"goToPrevious()\"\n [isDisabled]=\"currentItem === 1\">\n </nj-icon-button>\n </li>\n <ng-container *ngFor=\"let item of getItems()\">\n <li *ngIf=\"!shouldMinify || isItemVisible(item)\" class=\"nj-pagination__item\"\n [ngClass]=\"{'nj-pagination__item--active': currentItem === item}\">\n <button class=\"nj-pagination__link\"\n (click)=\"goToItem(item)\"\n [attr.aria-current]=\"currentItem === item ? 'true' : null\">\n {{item}}\n </button>\n </li>\n <li class=\"nj-pagination__item\"\n *ngIf=\"shouldMinify && showMoreHorizontal(item)\">\n <nj-icon name=\"more_horiz\" class=\"nj-pagination__more\" variant=\"inherit\"></nj-icon>\n <span class=\"nj-sr-only\">...</span>\n </li>\n </ng-container>\n\n <li class=\"nj-pagination__item\">\n <nj-icon-button size=\"sm\"\n icon=\"chevron_right\"\n [label]=\"ariaLabelNext\"\n (buttonClick)=\"goToNext()\"\n [isDisabled]=\"currentItem === count\">\n </nj-icon-button>\n </li>\n </ul>\n</nav>\n", dependencies: [{ kind: "component", type: IconComponent, selector: "nj-icon", inputs: ["size", "variant"] }, { kind: "component", type: IconButtonComponent, selector: "nj-icon-button", inputs: ["type", "ariaPressed", "ariaDescribedby", "isDisabled", "tabIndex", "variant", "size", "hasCustomIcon", "icon", "label", "additionalClass"], outputs: ["buttonClick"] }, { kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: PaginationComponent, decorators: [{
type: Component,
args: [{ selector: 'nj-pagination', changeDetection: ChangeDetectionStrategy.OnPush, standalone: true, imports: [IconComponent, IconButtonComponent, CommonModule], template: "<nav>\n <ul class=\"nj-pagination\">\n <li class=\"nj-pagination__item\">\n <nj-icon-button size=\"sm\"\n icon=\"chevron_left\"\n [label]=\"ariaLabelPrevious\"\n (buttonClick)=\"goToPrevious()\"\n [isDisabled]=\"currentItem === 1\">\n </nj-icon-button>\n </li>\n <ng-container *ngFor=\"let item of getItems()\">\n <li *ngIf=\"!shouldMinify || isItemVisible(item)\" class=\"nj-pagination__item\"\n [ngClass]=\"{'nj-pagination__item--active': currentItem === item}\">\n <button class=\"nj-pagination__link\"\n (click)=\"goToItem(item)\"\n [attr.aria-current]=\"currentItem === item ? 'true' : null\">\n {{item}}\n </button>\n </li>\n <li class=\"nj-pagination__item\"\n *ngIf=\"shouldMinify && showMoreHorizontal(item)\">\n <nj-icon name=\"more_horiz\" class=\"nj-pagination__more\" variant=\"inherit\"></nj-icon>\n <span class=\"nj-sr-only\">...</span>\n </li>\n </ng-container>\n\n <li class=\"nj-pagination__item\">\n <nj-icon-button size=\"sm\"\n icon=\"chevron_right\"\n [label]=\"ariaLabelNext\"\n (buttonClick)=\"goToNext()\"\n [isDisabled]=\"currentItem === count\">\n </nj-icon-button>\n </li>\n </ul>\n</nav>\n" }]
}], ctorParameters: function () { return [{ type: i0.ChangeDetectorRef }]; }, propDecorators: { ariaLabelNext: [{
type: Input
}], ariaLabelPrevious: [{
type: Input
}], count: [{
type: Input
}], currentItem: [{
type: Input
}], shouldMinify: [{
type: Input
}], selectedItem: [{
type: Output
}] } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGFnaW5hdGlvbi5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvY29tcG9uZW50cy9wYWdpbmF0aW9uL3BhZ2luYXRpb24uY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vc3JjL2NvbXBvbmVudHMvcGFnaW5hdGlvbi9wYWdpbmF0aW9uLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMvQyxPQUFPLEVBQUUsdUJBQXVCLEVBQXFCLFNBQVMsRUFBRSxZQUFZLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNuSCxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxzQ0FBc0MsQ0FBQztBQUMzRSxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sd0JBQXdCLENBQUM7OztBQVN2RCxNQUFNLE9BQU8sbUJBQW1CO0lBaUM5QixZQUFvQixHQUFzQjtRQUF0QixRQUFHLEdBQUgsR0FBRyxDQUFtQjtRQWYxQzs7V0FFRztRQUNNLGdCQUFXLEdBQVcsQ0FBQyxDQUFDO1FBRWpDOztXQUVHO1FBQ00saUJBQVksR0FBRyxJQUFJLENBQUM7UUFFN0I7O1dBRUc7UUFDTyxpQkFBWSxHQUFHLElBQUksWUFBWSxFQUFVLENBQUM7SUFFUCxDQUFDO0lBRTlDOztPQUVHO0lBQ0gsUUFBUTtRQUNOLE9BQU8sS0FBSyxDQUFDLElBQUksQ0FBQyxFQUFFLE1BQU0sRUFBRSxJQUFJLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7SUFDN0QsQ0FBQztJQUVEOztPQUVHO0lBQ0gsUUFBUTtRQUNOLElBQUksSUFBSSxDQUFDLFdBQVcsS0FBSyxJQUFJLENBQUMsS0FBSyxFQUFFO1lBQ25DLE9BQU87U0FDUjtRQUNELElBQUksQ0FBQyxXQUFXLEdBQUcsSUFBSSxDQUFDLFdBQVcsR0FBRyxDQUFDLENBQUM7UUFDeEMsSUFBSSxDQUFDLFlBQVksRUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDO1FBQzFDLElBQUksQ0FBQyxHQUFHLENBQUMsWUFBWSxFQUFFLENBQUM7SUFDMUIsQ0FBQztJQUVEOztPQUVHO0lBQ0gsWUFBWTtRQUNWLElBQUksSUFBSSxDQUFDLFdBQVcsS0FBSyxDQUFDLEVBQUU7WUFDMUIsT0FBTztTQUNSO1FBQ0QsSUFBSSxDQUFDLFdBQVcsR0FBRyxJQUFJLENBQUMsV0FBVyxHQUFHLENBQUMsQ0FBQztRQUN4QyxJQUFJLENBQUMsWUFBWSxFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUM7UUFDMUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxZQUFZLEVBQUUsQ0FBQztJQUMxQixDQUFDO0lBRUQ7O09BRUc7SUFDSCxRQUFRLENBQUMsSUFBWTtRQUNuQixJQUFJLElBQUksR0FBRyxJQUFJLENBQUMsS0FBSyxJQUFJLElBQUksQ0FBQyxXQUFXLEdBQUcsQ0FBQyxFQUFFO1lBQzdDLE9BQU87U0FDUjtRQUNELElBQUksQ0FBQyxXQUFXLEdBQUcsSUFBSSxDQUFDO1FBQ3hCLElBQUksQ0FBQyxZQUFZLEVBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQztRQUMxQyxJQUFJLENBQUMsR0FBRyxDQUFDLFlBQVksRUFBRSxDQUFDO0lBQzFCLENBQUM7SUFFRDs7T0FFRztJQUNILGFBQWEsQ0FBQyxJQUFZO1FBQ3hCLDRDQUE0QztRQUM1QyxJQUFJLElBQUksS0FBSyxDQUFDLElBQUksSUFBSSxLQUFLLElBQUksQ0FBQyxLQUFLLElBQUksSUFBSSxLQUFLLElBQUksQ0FBQyxXQUFXLEVBQUU7WUFDbEUsT0FBTyxJQUFJLENBQUM7U0FDYjtRQUNELHlEQUF5RDtRQUN6RCxJQUFJLElBQUksSUFBSSxJQUFJLENBQUMsV0FBVyxHQUFHLENBQUMsSUFBSSxJQUFJLElBQUksSUFBSSxDQUFDLFdBQVcsR0FBRyxDQUFDLEVBQUU7WUFDaEUsT0FBTyxJQUFJLENBQUM7U0FDYjtRQUNELElBQUksSUFBSSxHQUFHLENBQUMsSUFBSSxJQUFJLENBQUMsV0FBVyxHQUFHLENBQUMsRUFBRTtZQUNwQyxPQUFPLElBQUksQ0FBQztTQUNiO1FBQ0QsT0FBTyxJQUFJLElBQUksSUFBSSxDQUFDLEtBQUssR0FBRyxDQUFDLElBQUksSUFBSSxDQUFDLFdBQVcsSUFBSSxJQUFJLENBQUMsS0FBSyxHQUFHLENBQUMsQ0FBQztJQUN0RSxDQUFDO0lBRUQ7O09BRUc7SUFDSCxrQkFBa0IsQ0FBQyxJQUFZO1FBQzdCLCtGQUErRjtRQUMvRixPQUFPLENBQUMsSUFBSSxLQUFLLENBQUMsSUFBSSxJQUFJLENBQUMsV0FBVyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxLQUFLLElBQUksQ0FBQyxLQUFLLEdBQUcsQ0FBQyxJQUFJLElBQUksQ0FBQyxXQUFXLElBQUksSUFBSSxDQUFDLEtBQUssR0FBRyxDQUFDLENBQUMsQ0FBQztJQUNqSCxDQUFDOytHQXRHVSxtQkFBbUI7bUdBQW5CLG1CQUFtQixrUkNaaEMseTVDQW9DQSw0Q0QxQlksYUFBYSxpRkFBRSxtQkFBbUIsME9BQUUsWUFBWTs7NEZBRS9DLG1CQUFtQjtrQkFQL0IsU0FBUzsrQkFDRSxlQUFlLG1CQUVSLHVCQUF1QixDQUFDLE1BQU0sY0FDbkMsSUFBSSxXQUNQLENBQUMsYUFBYSxFQUFFLG1CQUFtQixFQUFFLFlBQVksQ0FBQzt3R0FPbEQsYUFBYTtzQkFBckIsS0FBSztnQkFNRyxpQkFBaUI7c0JBQXpCLEtBQUs7Z0JBS0csS0FBSztzQkFBYixLQUFLO2dCQUtHLFdBQVc7c0JBQW5CLEtBQUs7Z0JBS0csWUFBWTtzQkFBcEIsS0FBSztnQkFLSSxZQUFZO3NCQUFyQixNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tbW9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7IENoYW5nZURldGVjdGlvblN0cmF0ZWd5LCBDaGFuZ2VEZXRlY3RvclJlZiwgQ29tcG9uZW50LCBFdmVudEVtaXR0ZXIsIElucHV0LCBPdXRwdXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEljb25CdXR0b25Db21wb25lbnQgfSBmcm9tICcuLi9pY29uLWJ1dHRvbi9pY29uLWJ1dHRvbi5jb21wb25lbnQnO1xuaW1wb3J0IHsgSWNvbkNvbXBvbmVudCB9IGZyb20gJy4uL2ljb24vaWNvbi5jb21wb25lbnQnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICduai1wYWdpbmF0aW9uJyxcbiAgdGVtcGxhdGVVcmw6ICcuL3BhZ2luYXRpb24uY29tcG9uZW50Lmh0bWwnLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgaW1wb3J0czogW0ljb25Db21wb25lbnQsIEljb25CdXR0b25Db21wb25lbnQsIENvbW1vbk1vZHVsZV1cbn0pXG5leHBvcnQgY2xhc3MgUGFnaW5hdGlvbkNvbXBvbmVudCB7XG4gIC8qKlxuICAgKiBUZXh0IGFsdGVybmF0aXZlIGZvciBhc3Npc3RpdmUgdGVjaG5vbG9naWVzIGZvciBwcmV2aW91cyBidXR0b25cbiAgICogQHNlZSBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9BY2Nlc3NpYmlsaXR5L0FSSUEvQXR0cmlidXRlcy9hcmlhLWxhYmVsXG4gICAqL1xuICBASW5wdXQoKSBhcmlhTGFiZWxOZXh0OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRleHQgYWx0ZXJuYXRpdmUgZm9yIGFzc2lzdGl2ZSB0ZWNobm9sb2dpZXMgZm9yIG5leHQgYnV0dG9uXG4gICAqIEBzZWUgaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQWNjZXNzaWJpbGl0eS9BUklBL0F0dHJpYnV0ZXMvYXJpYS1sYWJlbFxuICAgKi9cbiAgQElucHV0KCkgYXJpYUxhYmVsUHJldmlvdXM6IHN0cmluZztcblxuICAvKipcbiAgICogVG90YWwgbnVtYmVyIG9mIHBhZ2VzXG4gICAqL1xuICBASW5wdXQoKSBjb3VudDogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBDdXJyZW50IHBhZ2VcbiAgICovXG4gIEBJbnB1dCgpIGN1cnJlbnRJdGVtOiBudW1iZXIgPSAxO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHBhZ2luYXRpb24gc2hvdWxkIG1pbmlmeVxuICAgKi9cbiAgQElucHV0KCkgc2hvdWxkTWluaWZ5ID0gdHJ1ZTtcblxuICAvKipcbiAgICogRW1pdHMgc2VsZWN0ZWQgaXRlbSBvbiBjaGFuZ2VcbiAgICovXG4gIEBPdXRwdXQoKSBzZWxlY3RlZEl0ZW0gPSBuZXcgRXZlbnRFbWl0dGVyPG51bWJlcj4oKTtcblxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIGNkcjogQ2hhbmdlRGV0ZWN0b3JSZWYpIHt9XG5cbiAgLyoqXG4gICAqIEBpZ25vcmVcbiAgICovXG4gIGdldEl0ZW1zKCkge1xuICAgIHJldHVybiBBcnJheS5mcm9tKHsgbGVuZ3RoOiB0aGlzLmNvdW50IH0sIChfLCBpKSA9PiBpICsgMSk7XG4gIH1cblxuICAvKipcbiAgICogQGlnbm9yZVxuICAgKi9cbiAgZ29Ub05leHQoKSB7XG4gICAgaWYgKHRoaXMuY3VycmVudEl0ZW0gPT09IHRoaXMuY291bnQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5jdXJyZW50SXRlbSA9IHRoaXMuY3VycmVudEl0ZW0gKyAxO1xuICAgIHRoaXMuc2VsZWN0ZWRJdGVtPy5lbWl0KHRoaXMuY3VycmVudEl0ZW0pO1xuICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBpZ25vcmVcbiAgICovXG4gIGdvVG9QcmV2aW91cygpIHtcbiAgICBpZiAodGhpcy5jdXJyZW50SXRlbSA9PT0gMSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLmN1cnJlbnRJdGVtID0gdGhpcy5jdXJyZW50SXRlbSAtIDE7XG4gICAgdGhpcy5zZWxlY3RlZEl0ZW0/LmVtaXQodGhpcy5jdXJyZW50SXRlbSk7XG4gICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gIH1cblxuICAvKipcbiAgICogQGlnbm9yZVxuICAgKi9cbiAgZ29Ub0l0ZW0oaXRlbTogbnVtYmVyKSB7XG4gICAgaWYgKGl0ZW0gPiB0aGlzLmNvdW50IHx8IHRoaXMuY3VycmVudEl0ZW0gPCAxKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuY3VycmVudEl0ZW0gPSBpdGVtO1xuICAgIHRoaXMuc2VsZWN0ZWRJdGVtPy5lbWl0KHRoaXMuY3VycmVudEl0ZW0pO1xuICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBpZ25vcmVcbiAgICovXG4gIGlzSXRlbVZpc2libGUoaXRlbTogbnVtYmVyKTogYm9vbGVhbiB7XG4gICAgLy8gQWx3YXlzIHNob3cgZmlyc3QsIGxhc3QgYW5kIHNlbGVjdGVkIGl0ZW1cbiAgICBpZiAoaXRlbSA9PT0gMSB8fCBpdGVtID09PSB0aGlzLmNvdW50IHx8IGl0ZW0gPT09IHRoaXMuY3VycmVudEl0ZW0pIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICAvLyBBbHdheXMgc2hvdyBwcmV2aW91cyBhbmQgbmV4dCB2YWx1ZXMgb2Ygc2VsZWN0ZWQgdmFsdWVcbiAgICBpZiAoaXRlbSA+PSB0aGlzLmN1cnJlbnRJdGVtIC0gMSAmJiBpdGVtIDw9IHRoaXMuY3VycmVudEl0ZW0gKyAxKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgaWYgKGl0ZW0gPCA2ICYmIHRoaXMuY3VycmVudEl0ZW0gPCA0KSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuIGl0ZW0gPj0gdGhpcy5jb3VudCAtIDQgJiYgdGhpcy5jdXJyZW50SXRlbSA+PSB0aGlzLmNvdW50IC0gMjtcbiAgfVxuXG4gIC8qKlxuICAgKiBAaWdub3JlXG4gICAqL1xuICBzaG93TW9yZUhvcml6b250YWwoaXRlbTogbnVtYmVyKTogYm9vbGVhbiB7XG4gICAgLy8gV2Ugd2FudCB0byBzaG93IG9uIDJuZCBpdGVtIGlmIGN1cnJlbnRJdGVtID4gMyBvciBpbiBwZW51bHRpbWF0ZSBpZiBjdXJyZW50SXRlbSBpcyBpbiBsYXN0IDNcbiAgICByZXR1cm4gKGl0ZW0gPT09IDIgJiYgdGhpcy5jdXJyZW50SXRlbSA+IDMpIHx8IChpdGVtID09PSB0aGlzLmNvdW50IC0gMSAmJiB0aGlzLmN1cnJlbnRJdGVtIDw9IHRoaXMuY291bnQgLSAzKTtcbiAgfVxufVxuIiwiPG5hdj5cbiAgPHVsIGNsYXNzPVwibmotcGFnaW5hdGlvblwiPlxuICAgIDxsaSBjbGFzcz1cIm5qLXBhZ2luYXRpb25fX2l0ZW1cIj5cbiAgICAgIDxuai1pY29uLWJ1dHRvbiBzaXplPVwic21cIlxuICAgICAgICAgICAgICAgICAgICAgIGljb249XCJjaGV2cm9uX2xlZnRcIlxuICAgICAgICAgICAgICAgICAgICAgIFtsYWJlbF09XCJhcmlhTGFiZWxQcmV2aW91c1wiXG4gICAgICAgICAgICAgICAgICAgICAgKGJ1dHRvbkNsaWNrKT1cImdvVG9QcmV2aW91cygpXCJcbiAgICAgICAgICAgICAgICAgICAgICBbaXNEaXNhYmxlZF09XCJjdXJyZW50SXRlbSA9PT0gMVwiPlxuICAgICAgPC9uai1pY29uLWJ1dHRvbj5cbiAgICA8L2xpPlxuICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IGl0ZW0gb2YgZ2V0SXRlbXMoKVwiPlxuICAgICAgPGxpICpuZ0lmPVwiIXNob3VsZE1pbmlmeSB8fCBpc0l0ZW1WaXNpYmxlKGl0ZW0pXCIgY2xhc3M9XCJuai1wYWdpbmF0aW9uX19pdGVtXCJcbiAgICAgICAgICBbbmdDbGFzc109XCJ7J25qLXBhZ2luYXRpb25fX2l0ZW0tLWFjdGl2ZSc6IGN1cnJlbnRJdGVtID09PSBpdGVtfVwiPlxuICAgICAgICA8YnV0dG9uIGNsYXNzPVwibmotcGFnaW5hdGlvbl9fbGlua1wiXG4gICAgICAgICAgICAgICAgKGNsaWNrKT1cImdvVG9JdGVtKGl0ZW0pXCJcbiAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLWN1cnJlbnRdPVwiY3VycmVudEl0ZW0gPT09IGl0ZW0gPyAndHJ1ZScgOiBudWxsXCI+XG4gICAgICAgICAge3tpdGVtfX1cbiAgICAgICAgPC9idXR0b24+XG4gICAgICA8L2xpPlxuICAgICAgPGxpIGNsYXNzPVwibmotcGFnaW5hdGlvbl9faXRlbVwiXG4gICAgICAgICAgKm5nSWY9XCJzaG91bGRNaW5pZnkgJiYgc2hvd01vcmVIb3Jpem9udGFsKGl0ZW0pXCI+XG4gICAgICAgIDxuai1pY29uIG5hbWU9XCJtb3JlX2hvcml6XCIgY2xhc3M9XCJuai1wYWdpbmF0aW9uX19tb3JlXCIgdmFyaWFudD1cImluaGVyaXRcIj48L25qLWljb24+XG4gICAgICAgIDxzcGFuIGNsYXNzPVwibmotc3Itb25seVwiPi4uLjwvc3Bhbj5cbiAgICAgIDwvbGk+XG4gICAgPC9uZy1jb250YWluZXI+XG5cbiAgICA8bGkgY2xhc3M9XCJuai1wYWdpbmF0aW9uX19pdGVtXCI+XG4gICAgICA8bmotaWNvbi1idXR0b24gc2l6ZT1cInNtXCJcbiAgICAgICAgICAgICAgICAgICAgICBpY29uPVwiY2hldnJvbl9yaWdodFwiXG4gICAgICAgICAgICAgICAgICAgICAgW2xhYmVsXT1cImFyaWFMYWJlbE5leHRcIlxuICAgICAgICAgICAgICAgICAgICAgIChidXR0b25DbGljayk9XCJnb1RvTmV4dCgpXCJcbiAgICAgICAgICAgICAgICAgICAgICBbaXNEaXNhYmxlZF09XCJjdXJyZW50SXRlbSA9PT0gY291bnRcIj5cbiAgICAgIDwvbmotaWNvbi1idXR0b24+XG4gICAgPC9saT5cbiAgPC91bD5cbjwvbmF2PlxuIl19