@millieofzo/ion-selectable
Version:
Ionic selectable with extended features
108 lines • 43.7 kB
JavaScript
import { Component, ElementRef, HostBinding, HostListener, ViewChild, } from '@angular/core';
import { IonContent, IonInfiniteScroll, IonSearchbar, NavParams, IonicModule, } from '@ionic/angular';
import { FormsModule } from '@angular/forms';
import { NgIf, NgTemplateOutlet, NgFor, NgClass, NgStyle, } from '@angular/common';
import * as i0 from "@angular/core";
import * as i1 from "@ionic/angular";
import * as i2 from "@angular/forms";
export class IonSelectableModalComponent {
get _canClearCssClass() {
return this.selectComponent.canClear;
}
get _isMultipleCssClass() {
return this.selectComponent.isMultiple;
}
get _isSearchingCssClass() {
return this.selectComponent._isSearching;
}
get _isIos() {
return this.selectComponent._isIos;
}
_isMD() {
return this.selectComponent._isMD;
}
get _isAddItemTemplateVisibleCssClass() {
return this.selectComponent._isAddItemTemplateVisible;
}
onResize() {
// ion-footer inside the template might change its height when
// device orientation changes.
this.selectComponent._positionAddItemTemplate();
}
constructor(navParams, _element) {
this.navParams = navParams;
this._element = _element;
this._cssClass = true;
this.selectComponent = this.navParams.get('selectComponent');
this.selectComponent._modalComponent = this;
this.selectComponent._selectedItems = [];
if (!this.selectComponent._isNullOrWhiteSpace(this.selectComponent.value)) {
if (this.selectComponent.isMultiple) {
this.selectComponent.value.forEach((item) => {
this.selectComponent._selectedItems.push(item);
});
}
else {
this.selectComponent._selectedItems.push(this.selectComponent.value);
}
}
this.selectComponent._setItemsToConfirm(this.selectComponent._selectedItems);
}
ngAfterViewInit() {
this._header = this._element.nativeElement.querySelector('ion-header');
if (this._searchbarComponent && this.selectComponent.shouldFocusSearchbar) {
// Focus after a delay because focus doesn't work without it.
setTimeout(() => {
this._searchbarComponent.setFocus();
}, 1000);
}
}
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.2", ngImport: i0, type: IonSelectableModalComponent, deps: [{ token: i1.NavParams }, { token: i0.ElementRef }], target: i0.ɵɵFactoryTarget.Component }); }
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.2", type: IonSelectableModalComponent, isStandalone: true, selector: "ion-selectable-modal", host: { listeners: { "window:resize": "onResize()" }, properties: { "class.ionic-selectable-modal": "this._cssClass", "class.ionic-selectable-modal-can-clear": "this._canClearCssClass", "class.ionic-selectable-modal-is-multiple": "this._isMultipleCssClass", "class.ionic-selectable-modal-is-searching": "this._isSearchingCssClass", "class.ionic-selectable-modal-ios": "this._isIos", "class.ionic-selectable-modal-md": "this._isMD", "class.ionic-selectable-modal-is-add-item-template-visible": "this._isAddItemTemplateVisibleCssClass" } }, viewQueries: [{ propertyName: "_content", first: true, predicate: IonContent, descendants: true }, { propertyName: "_searchbarComponent", first: true, predicate: ["searchbarComponent"], descendants: true }, { propertyName: "_infiniteScroll", first: true, predicate: IonInfiniteScroll, descendants: true }], ngImport: i0, template: "<ion-header>\n <ion-toolbar *ngIf=\"!selectComponent.headerTemplate\"\n [color]=\"selectComponent.headerColor ? selectComponent.headerColor : null\">\n <ion-buttons [slot]=\"selectComponent.closeButtonSlot\">\n <ion-button (click)=\"selectComponent._close()\">\n <span *ngIf=\"selectComponent.closeButtonTemplate\" [ngTemplateOutlet]=\"selectComponent.closeButtonTemplate\">\n </span>\n <span *ngIf=\"!selectComponent.closeButtonTemplate\">\n {{selectComponent.closeButtonText}}\n </span>\n </ion-button>\n </ion-buttons>\n <ion-title>\n <!-- Need span for for text ellipsis. -->\n <span *ngIf=\"selectComponent.titleTemplate\" [ngTemplateOutlet]=\"selectComponent.titleTemplate\">\n </span>\n <span *ngIf=\"!selectComponent.titleTemplate\">\n {{selectComponent.label}}\n </span>\n </ion-title>\n </ion-toolbar>\n <div *ngIf=\"selectComponent.headerTemplate\" [ngTemplateOutlet]=\"selectComponent.headerTemplate\">\n </div>\n <ion-toolbar *ngIf=\"selectComponent.canSearch || selectComponent.messageTemplate\">\n <ion-searchbar *ngIf=\"selectComponent.canSearch\" #searchbarComponent [(ngModel)]=\"selectComponent._searchText\"\n (ionInput)=\"selectComponent._filterItems()\" (ionClear)=\"selectComponent._onSearchbarClear()\"\n [placeholder]=\"selectComponent.searchPlaceholder\" [debounce]=\"selectComponent.searchDebounce\">\n </ion-searchbar>\n <div class=\"ionic-selectable-message\" *ngIf=\"selectComponent.messageTemplate\">\n <div [ngTemplateOutlet]=\"selectComponent.messageTemplate\">\n </div>\n </div>\n </ion-toolbar>\n</ion-header>\n<ion-content>\n <div class=\"ionic-selectable-spinner\" *ngIf=\"selectComponent._isSearching\">\n <div class=\"ionic-selectable-spinner-background\"></div>\n <ion-spinner></ion-spinner>\n </div>\n <ion-list class=\"ion-no-margin\" *ngIf=\"selectComponent._hasFilteredItems\">\n <ion-item-group *ngFor=\"let group of selectComponent._filteredGroups\" class=\"ionic-selectable-group\">\n <ion-item-divider *ngIf=\"selectComponent._hasGroups\"\n [color]=\"selectComponent.groupColor ? selectComponent.groupColor : null\">\n <!-- Need span for for text ellipsis. -->\n <span *ngIf=\"selectComponent.groupTemplate\" [ngTemplateOutlet]=\"selectComponent.groupTemplate\"\n [ngTemplateOutletContext]=\"{ group: group }\">\n </span>\n <!-- Need ion-label for text ellipsis. -->\n <ion-label *ngIf=\"!selectComponent.groupTemplate\">\n {{group.text}}\n </ion-label>\n <div *ngIf=\"selectComponent.groupEndTemplate\" slot=\"end\">\n <div [ngTemplateOutlet]=\"selectComponent.groupEndTemplate\" [ngTemplateOutletContext]=\"{ group: group }\">\n </div>\n </div>\n </ion-item-divider>\n <ion-item button=\"true\" detail=\"false\" *ngFor=\"let item of group.items\" (click)=\"selectComponent._select(item)\"\n class=\"ionic-selectable-item\" [ngClass]=\"{\n 'ionic-selectable-item-is-selected': selectComponent._isItemSelected(item),\n 'ionic-selectable-item-is-disabled': selectComponent._isItemDisabled(item)\n }\" [disabled]=\"selectComponent._isItemDisabled(item)\">\n <!-- Need span for text ellipsis. -->\n <span *ngIf=\"selectComponent.itemTemplate\" [ngTemplateOutlet]=\"selectComponent.itemTemplate\"\n [ngTemplateOutletContext]=\"{ item: item, isItemSelected: selectComponent._isItemSelected(item) }\">\n </span>\n <!-- Need ion-label for text ellipsis. -->\n <ion-label *ngIf=\"!selectComponent.itemTemplate\">\n {{selectComponent._formatItem(item)}}\n </ion-label>\n <div *ngIf=\"selectComponent.itemEndTemplate\" slot=\"end\">\n <div [ngTemplateOutlet]=\"selectComponent.itemEndTemplate\"\n [ngTemplateOutletContext]=\"{ item: item, isItemSelected: selectComponent._isItemSelected(item) }\">\n </div>\n </div>\n <span *ngIf=\"selectComponent.itemIconTemplate\" [ngTemplateOutlet]=\"selectComponent.itemIconTemplate\"\n [ngTemplateOutletContext]=\"{ item: item, isItemSelected: selectComponent._isItemSelected(item) }\">\n </span>\n <ion-icon *ngIf=\"!selectComponent.itemIconTemplate\"\n [name]=\"selectComponent._isItemSelected(item) ? 'checkmark-circle' : 'radio-button-off'\"\n [color]=\"selectComponent._isItemSelected(item) ? 'primary' : null\" [slot]=\"selectComponent.itemIconSlot\">\n </ion-icon>\n <ion-button *ngIf=\"selectComponent.canSaveItem\" class=\"ionic-selectable-item-button\" slot=\"end\" fill=\"outline\"\n (click)=\"selectComponent._saveItem($event, item)\">\n <ion-icon slot=\"icon-only\" ios=\"create\" md=\"create-sharp\"></ion-icon>\n </ion-button>\n <ion-button *ngIf=\"selectComponent.canDeleteItem\" class=\"ionic-selectable-item-button\" slot=\"end\" fill=\"outline\"\n (click)=\"selectComponent._deleteItemClick($event, item)\">\n <ion-icon slot=\"icon-only\" ios=\"trash\" md=\"trash-sharp\"></ion-icon>\n </ion-button>\n </ion-item>\n </ion-item-group>\n </ion-list>\n <!-- Fail text should be above InfiniteScroll to avoid a gap when no items are found. -->\n <div *ngIf=\"!selectComponent._hasFilteredItems\">\n <span *ngIf=\"selectComponent.searchFailTemplate\" [ngTemplateOutlet]=\"selectComponent.searchFailTemplate\">\n </span>\n <div *ngIf=\"!selectComponent.searchFailTemplate\" class=\"ion-margin\">\n {{selectComponent.searchFailText}}\n </div>\n </div>\n <ion-infinite-scroll [disabled]=\"!selectComponent.hasInfiniteScroll\"\n (ionInfinite)=\"selectComponent._getMoreItems()\">\n <ion-infinite-scroll-content></ion-infinite-scroll-content>\n </ion-infinite-scroll>\n</ion-content>\n<div class=\"ionic-selectable-add-item-template\" *ngIf=\"selectComponent._isAddItemTemplateVisible\"\n [ngStyle]=\"{ 'top.px': _header.offsetHeight }\">\n <div class=\"ionic-selectable-add-item-template-inner\"\n [ngStyle]=\"{ 'height': selectComponent._addItemTemplateFooterHeight }\">\n <span [ngTemplateOutlet]=\"selectComponent.addItemTemplate\"\n [ngTemplateOutletContext]=\"{ item: selectComponent._itemToAdd, isAdd: selectComponent._itemToAdd === null }\">\n </span>\n </div>\n</div>\n<ion-footer *ngIf=\"selectComponent._footerButtonsCount > 0 || selectComponent.footerTemplate\"\n [ngStyle]=\"{ 'visibility': selectComponent._isFooterVisible ? 'initial' : 'hidden' }\">\n <ion-toolbar *ngIf=\"!selectComponent.footerTemplate\">\n <ion-row>\n <ion-col *ngIf=\"selectComponent.canClear\">\n <ion-button expand=\"full\" (click)=\"selectComponent._clear()\"\n [disabled]=\"!selectComponent._selectedItems.length\">\n {{selectComponent.clearButtonText}}\n </ion-button>\n </ion-col>\n <ion-col *ngIf=\"selectComponent.canAddItem\">\n <ion-button expand=\"full\" (click)=\"selectComponent._addItemClick()\">\n {{selectComponent.addButtonText}}\n </ion-button>\n </ion-col>\n <ion-col *ngIf=\"selectComponent.isMultiple || selectComponent.hasConfirmButton\">\n <ion-button expand=\"full\" (click)=\"selectComponent._confirm()\"\n [disabled]=\"!selectComponent.isConfirmButtonEnabled\">\n {{selectComponent.confirmButtonText}}\n </ion-button>\n </ion-col>\n </ion-row>\n </ion-toolbar>\n <div *ngIf=\"selectComponent.footerTemplate\" [ngTemplateOutlet]=\"selectComponent.footerTemplate\">\n </div>\n</ion-footer>", dependencies: [{ kind: "ngmodule", type: IonicModule }, { kind: "component", type: i1.IonButton, selector: "ion-button", inputs: ["buttonType", "color", "disabled", "download", "expand", "fill", "form", "href", "mode", "rel", "routerAnimation", "routerDirection", "shape", "size", "strong", "target", "type"] }, { kind: "component", type: i1.IonButtons, selector: "ion-buttons", inputs: ["collapse"] }, { kind: "component", type: i1.IonCol, selector: "ion-col", inputs: ["offset", "offsetLg", "offsetMd", "offsetSm", "offsetXl", "offsetXs", "pull", "pullLg", "pullMd", "pullSm", "pullXl", "pullXs", "push", "pushLg", "pushMd", "pushSm", "pushXl", "pushXs", "size", "sizeLg", "sizeMd", "sizeSm", "sizeXl", "sizeXs"] }, { kind: "component", type: i1.IonContent, selector: "ion-content", inputs: ["color", "forceOverscroll", "fullscreen", "scrollEvents", "scrollX", "scrollY"] }, { kind: "component", type: i1.IonFooter, selector: "ion-footer", inputs: ["collapse", "mode", "translucent"] }, { kind: "component", type: i1.IonHeader, selector: "ion-header", inputs: ["collapse", "mode", "translucent"] }, { kind: "component", type: i1.IonIcon, selector: "ion-icon", inputs: ["color", "flipRtl", "icon", "ios", "lazy", "md", "mode", "name", "sanitize", "size", "src"] }, { kind: "component", type: i1.IonInfiniteScroll, selector: "ion-infinite-scroll", inputs: ["disabled", "position", "threshold"] }, { kind: "component", type: i1.IonInfiniteScrollContent, selector: "ion-infinite-scroll-content", inputs: ["loadingSpinner", "loadingText"] }, { kind: "component", type: i1.IonItem, selector: "ion-item", inputs: ["button", "color", "counter", "counterFormatter", "detail", "detailIcon", "disabled", "download", "fill", "href", "lines", "mode", "rel", "routerAnimation", "routerDirection", "shape", "target", "type"] }, { kind: "component", type: i1.IonItemDivider, selector: "ion-item-divider", inputs: ["color", "mode", "sticky"] }, { kind: "component", type: i1.IonItemGroup, selector: "ion-item-group" }, { kind: "component", type: i1.IonLabel, selector: "ion-label", inputs: ["color", "mode", "position"] }, { kind: "component", type: i1.IonList, selector: "ion-list", inputs: ["inset", "lines", "mode"] }, { kind: "component", type: i1.IonRow, selector: "ion-row" }, { kind: "component", type: i1.IonSearchbar, selector: "ion-searchbar", inputs: ["animated", "autocapitalize", "autocomplete", "autocorrect", "cancelButtonIcon", "cancelButtonText", "clearIcon", "color", "debounce", "disabled", "enterkeyhint", "inputmode", "maxlength", "minlength", "mode", "name", "placeholder", "searchIcon", "showCancelButton", "showClearButton", "spellcheck", "type", "value"] }, { kind: "component", type: i1.IonSpinner, selector: "ion-spinner", inputs: ["color", "duration", "name", "paused"] }, { kind: "component", type: i1.IonTitle, selector: "ion-title", inputs: ["color", "size"] }, { kind: "component", type: i1.IonToolbar, selector: "ion-toolbar", inputs: ["color", "mode"] }, { kind: "directive", type: i1.TextValueAccessor, selector: "ion-input:not([type=number]),ion-textarea,ion-searchbar,ion-range" }, { kind: "directive", type: NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: NgFor, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }] }); }
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.2", ngImport: i0, type: IonSelectableModalComponent, decorators: [{
type: Component,
args: [{ selector: 'ion-selectable-modal', standalone: true, imports: [
IonicModule,
NgIf,
NgTemplateOutlet,
FormsModule,
NgFor,
NgClass,
NgStyle,
], template: "<ion-header>\n <ion-toolbar *ngIf=\"!selectComponent.headerTemplate\"\n [color]=\"selectComponent.headerColor ? selectComponent.headerColor : null\">\n <ion-buttons [slot]=\"selectComponent.closeButtonSlot\">\n <ion-button (click)=\"selectComponent._close()\">\n <span *ngIf=\"selectComponent.closeButtonTemplate\" [ngTemplateOutlet]=\"selectComponent.closeButtonTemplate\">\n </span>\n <span *ngIf=\"!selectComponent.closeButtonTemplate\">\n {{selectComponent.closeButtonText}}\n </span>\n </ion-button>\n </ion-buttons>\n <ion-title>\n <!-- Need span for for text ellipsis. -->\n <span *ngIf=\"selectComponent.titleTemplate\" [ngTemplateOutlet]=\"selectComponent.titleTemplate\">\n </span>\n <span *ngIf=\"!selectComponent.titleTemplate\">\n {{selectComponent.label}}\n </span>\n </ion-title>\n </ion-toolbar>\n <div *ngIf=\"selectComponent.headerTemplate\" [ngTemplateOutlet]=\"selectComponent.headerTemplate\">\n </div>\n <ion-toolbar *ngIf=\"selectComponent.canSearch || selectComponent.messageTemplate\">\n <ion-searchbar *ngIf=\"selectComponent.canSearch\" #searchbarComponent [(ngModel)]=\"selectComponent._searchText\"\n (ionInput)=\"selectComponent._filterItems()\" (ionClear)=\"selectComponent._onSearchbarClear()\"\n [placeholder]=\"selectComponent.searchPlaceholder\" [debounce]=\"selectComponent.searchDebounce\">\n </ion-searchbar>\n <div class=\"ionic-selectable-message\" *ngIf=\"selectComponent.messageTemplate\">\n <div [ngTemplateOutlet]=\"selectComponent.messageTemplate\">\n </div>\n </div>\n </ion-toolbar>\n</ion-header>\n<ion-content>\n <div class=\"ionic-selectable-spinner\" *ngIf=\"selectComponent._isSearching\">\n <div class=\"ionic-selectable-spinner-background\"></div>\n <ion-spinner></ion-spinner>\n </div>\n <ion-list class=\"ion-no-margin\" *ngIf=\"selectComponent._hasFilteredItems\">\n <ion-item-group *ngFor=\"let group of selectComponent._filteredGroups\" class=\"ionic-selectable-group\">\n <ion-item-divider *ngIf=\"selectComponent._hasGroups\"\n [color]=\"selectComponent.groupColor ? selectComponent.groupColor : null\">\n <!-- Need span for for text ellipsis. -->\n <span *ngIf=\"selectComponent.groupTemplate\" [ngTemplateOutlet]=\"selectComponent.groupTemplate\"\n [ngTemplateOutletContext]=\"{ group: group }\">\n </span>\n <!-- Need ion-label for text ellipsis. -->\n <ion-label *ngIf=\"!selectComponent.groupTemplate\">\n {{group.text}}\n </ion-label>\n <div *ngIf=\"selectComponent.groupEndTemplate\" slot=\"end\">\n <div [ngTemplateOutlet]=\"selectComponent.groupEndTemplate\" [ngTemplateOutletContext]=\"{ group: group }\">\n </div>\n </div>\n </ion-item-divider>\n <ion-item button=\"true\" detail=\"false\" *ngFor=\"let item of group.items\" (click)=\"selectComponent._select(item)\"\n class=\"ionic-selectable-item\" [ngClass]=\"{\n 'ionic-selectable-item-is-selected': selectComponent._isItemSelected(item),\n 'ionic-selectable-item-is-disabled': selectComponent._isItemDisabled(item)\n }\" [disabled]=\"selectComponent._isItemDisabled(item)\">\n <!-- Need span for text ellipsis. -->\n <span *ngIf=\"selectComponent.itemTemplate\" [ngTemplateOutlet]=\"selectComponent.itemTemplate\"\n [ngTemplateOutletContext]=\"{ item: item, isItemSelected: selectComponent._isItemSelected(item) }\">\n </span>\n <!-- Need ion-label for text ellipsis. -->\n <ion-label *ngIf=\"!selectComponent.itemTemplate\">\n {{selectComponent._formatItem(item)}}\n </ion-label>\n <div *ngIf=\"selectComponent.itemEndTemplate\" slot=\"end\">\n <div [ngTemplateOutlet]=\"selectComponent.itemEndTemplate\"\n [ngTemplateOutletContext]=\"{ item: item, isItemSelected: selectComponent._isItemSelected(item) }\">\n </div>\n </div>\n <span *ngIf=\"selectComponent.itemIconTemplate\" [ngTemplateOutlet]=\"selectComponent.itemIconTemplate\"\n [ngTemplateOutletContext]=\"{ item: item, isItemSelected: selectComponent._isItemSelected(item) }\">\n </span>\n <ion-icon *ngIf=\"!selectComponent.itemIconTemplate\"\n [name]=\"selectComponent._isItemSelected(item) ? 'checkmark-circle' : 'radio-button-off'\"\n [color]=\"selectComponent._isItemSelected(item) ? 'primary' : null\" [slot]=\"selectComponent.itemIconSlot\">\n </ion-icon>\n <ion-button *ngIf=\"selectComponent.canSaveItem\" class=\"ionic-selectable-item-button\" slot=\"end\" fill=\"outline\"\n (click)=\"selectComponent._saveItem($event, item)\">\n <ion-icon slot=\"icon-only\" ios=\"create\" md=\"create-sharp\"></ion-icon>\n </ion-button>\n <ion-button *ngIf=\"selectComponent.canDeleteItem\" class=\"ionic-selectable-item-button\" slot=\"end\" fill=\"outline\"\n (click)=\"selectComponent._deleteItemClick($event, item)\">\n <ion-icon slot=\"icon-only\" ios=\"trash\" md=\"trash-sharp\"></ion-icon>\n </ion-button>\n </ion-item>\n </ion-item-group>\n </ion-list>\n <!-- Fail text should be above InfiniteScroll to avoid a gap when no items are found. -->\n <div *ngIf=\"!selectComponent._hasFilteredItems\">\n <span *ngIf=\"selectComponent.searchFailTemplate\" [ngTemplateOutlet]=\"selectComponent.searchFailTemplate\">\n </span>\n <div *ngIf=\"!selectComponent.searchFailTemplate\" class=\"ion-margin\">\n {{selectComponent.searchFailText}}\n </div>\n </div>\n <ion-infinite-scroll [disabled]=\"!selectComponent.hasInfiniteScroll\"\n (ionInfinite)=\"selectComponent._getMoreItems()\">\n <ion-infinite-scroll-content></ion-infinite-scroll-content>\n </ion-infinite-scroll>\n</ion-content>\n<div class=\"ionic-selectable-add-item-template\" *ngIf=\"selectComponent._isAddItemTemplateVisible\"\n [ngStyle]=\"{ 'top.px': _header.offsetHeight }\">\n <div class=\"ionic-selectable-add-item-template-inner\"\n [ngStyle]=\"{ 'height': selectComponent._addItemTemplateFooterHeight }\">\n <span [ngTemplateOutlet]=\"selectComponent.addItemTemplate\"\n [ngTemplateOutletContext]=\"{ item: selectComponent._itemToAdd, isAdd: selectComponent._itemToAdd === null }\">\n </span>\n </div>\n</div>\n<ion-footer *ngIf=\"selectComponent._footerButtonsCount > 0 || selectComponent.footerTemplate\"\n [ngStyle]=\"{ 'visibility': selectComponent._isFooterVisible ? 'initial' : 'hidden' }\">\n <ion-toolbar *ngIf=\"!selectComponent.footerTemplate\">\n <ion-row>\n <ion-col *ngIf=\"selectComponent.canClear\">\n <ion-button expand=\"full\" (click)=\"selectComponent._clear()\"\n [disabled]=\"!selectComponent._selectedItems.length\">\n {{selectComponent.clearButtonText}}\n </ion-button>\n </ion-col>\n <ion-col *ngIf=\"selectComponent.canAddItem\">\n <ion-button expand=\"full\" (click)=\"selectComponent._addItemClick()\">\n {{selectComponent.addButtonText}}\n </ion-button>\n </ion-col>\n <ion-col *ngIf=\"selectComponent.isMultiple || selectComponent.hasConfirmButton\">\n <ion-button expand=\"full\" (click)=\"selectComponent._confirm()\"\n [disabled]=\"!selectComponent.isConfirmButtonEnabled\">\n {{selectComponent.confirmButtonText}}\n </ion-button>\n </ion-col>\n </ion-row>\n </ion-toolbar>\n <div *ngIf=\"selectComponent.footerTemplate\" [ngTemplateOutlet]=\"selectComponent.footerTemplate\">\n </div>\n</ion-footer>" }]
}], ctorParameters: () => [{ type: i1.NavParams }, { type: i0.ElementRef }], propDecorators: { _content: [{
type: ViewChild,
args: [IonContent]
}], _searchbarComponent: [{
type: ViewChild,
args: ['searchbarComponent']
}], _infiniteScroll: [{
type: ViewChild,
args: [IonInfiniteScroll]
}], _cssClass: [{
type: HostBinding,
args: ['class.ionic-selectable-modal']
}], _canClearCssClass: [{
type: HostBinding,
args: ['class.ionic-selectable-modal-can-clear']
}], _isMultipleCssClass: [{
type: HostBinding,
args: ['class.ionic-selectable-modal-is-multiple']
}], _isSearchingCssClass: [{
type: HostBinding,
args: ['class.ionic-selectable-modal-is-searching']
}], _isIos: [{
type: HostBinding,
args: ['class.ionic-selectable-modal-ios']
}], _isMD: [{
type: HostBinding,
args: ['class.ionic-selectable-modal-md']
}], _isAddItemTemplateVisibleCssClass: [{
type: HostBinding,
args: ['class.ionic-selectable-modal-is-add-item-template-visible']
}], onResize: [{
type: HostListener,
args: ['window:resize']
}] } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW9uLXNlbGVjdGFibGUtbW9kYWwuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vbGlicy9pb24tc2VsZWN0YWJsZS9zcmMvbGliL2lvbi1zZWxlY3RhYmxlL2lvbi1zZWxlY3RhYmxlLW1vZGFsLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL2xpYnMvaW9uLXNlbGVjdGFibGUvc3JjL2xpYi9pb24tc2VsZWN0YWJsZS9pb24tc2VsZWN0YWJsZS1tb2RhbC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBRUwsU0FBUyxFQUNULFVBQVUsRUFDVixXQUFXLEVBQ1gsWUFBWSxFQUNaLFNBQVMsR0FDVixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQ0wsVUFBVSxFQUNWLGlCQUFpQixFQUNqQixZQUFZLEVBQ1osU0FBUyxFQUNULFdBQVcsR0FDWixNQUFNLGdCQUFnQixDQUFDO0FBRXhCLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUM3QyxPQUFPLEVBQ0wsSUFBSSxFQUNKLGdCQUFnQixFQUNoQixLQUFLLEVBQ0wsT0FBTyxFQUNQLE9BQU8sR0FDUixNQUFNLGlCQUFpQixDQUFDOzs7O0FBZ0J6QixNQUFNLE9BQU8sMkJBQTJCO0lBV3RDLElBQ0ksaUJBQWlCO1FBQ25CLE9BQU8sSUFBSSxDQUFDLGVBQWUsQ0FBQyxRQUFRLENBQUM7SUFDdkMsQ0FBQztJQUNELElBQ0ksbUJBQW1CO1FBQ3JCLE9BQU8sSUFBSSxDQUFDLGVBQWUsQ0FBQyxVQUFVLENBQUM7SUFDekMsQ0FBQztJQUNELElBQ0ksb0JBQW9CO1FBQ3RCLE9BQU8sSUFBSSxDQUFDLGVBQWUsQ0FBQyxZQUFZLENBQUM7SUFDM0MsQ0FBQztJQUNELElBQ0ksTUFBTTtRQUNSLE9BQU8sSUFBSSxDQUFDLGVBQWUsQ0FBQyxNQUFNLENBQUM7SUFDckMsQ0FBQztJ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QUFvQjtzQkFEdkIsV0FBVzt1QkFBQywyQ0FBMkM7Z0JBS3BELE1BQU07c0JBRFQsV0FBVzt1QkFBQyxrQ0FBa0M7Z0JBSy9DLEtBQUs7c0JBREosV0FBVzt1QkFBQyxpQ0FBaUM7Z0JBSzFDLGlDQUFpQztzQkFEcEMsV0FBVzt1QkFBQywyREFBMkQ7Z0JBS3hFLFFBQVE7c0JBRFAsWUFBWTt1QkFBQyxlQUFlIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQWZ0ZXJWaWV3SW5pdCxcbiAgQ29tcG9uZW50LFxuICBFbGVtZW50UmVmLFxuICBIb3N0QmluZGluZyxcbiAgSG9zdExpc3RlbmVyLFxuICBWaWV3Q2hpbGQsXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHtcbiAgSW9uQ29udGVudCxcbiAgSW9uSW5maW5pdGVTY3JvbGwsXG4gIElvblNlYXJjaGJhcixcbiAgTmF2UGFyYW1zLFxuICBJb25pY01vZHVsZSxcbn0gZnJvbSAnQGlvbmljL2FuZ3VsYXInO1xuaW1wb3J0IHsgSW9uU2VsZWN0YWJsZUNvbXBvbmVudCB9IGZyb20gJy4vaW9uLXNlbGVjdGFibGUuY29tcG9uZW50JztcbmltcG9ydCB7IEZvcm1zTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHtcbiAgTmdJZixcbiAgTmdUZW1wbGF0ZU91dGxldCxcbiAgTmdGb3IsXG4gIE5nQ2xhc3MsXG4gIE5nU3R5bGUsXG59IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2lvbi1zZWxlY3RhYmxlLW1vZGFsJyxcbiAgdGVtcGxhdGVVcmw6ICcuL2lvbi1zZWxlY3RhYmxlLW1vZGFsLmNvbXBvbmVudC5odG1sJyxcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgaW1wb3J0czogW1xuICAgIElvbmljTW9kdWxlLFxuICAgIE5nSWYsXG4gICAgTmdUZW1wbGF0ZU91dGxldCxcbiAgICBGb3Jtc01vZHVsZSxcbiAgICBOZ0ZvcixcbiAgICBOZ0NsYXNzLFxuICAgIE5nU3R5bGUsXG4gIF0sXG59KVxuZXhwb3J0IGNsYXNzIElvblNlbGVjdGFibGVNb2RhbENvbXBvbmVudCBpbXBsZW1lbnRzIEFmdGVyVmlld0luaXQge1xuICBAVmlld0NoaWxkKElvbkNvbnRlbnQpXG4gIF9jb250ZW50ITogSW9uQ29udGVudDtcbiAgX2hlYWRlciE6IEhUTUxFbGVtZW50O1xuICBzZWxlY3RDb21wb25lbnQ6IElvblNlbGVjdGFibGVDb21wb25lbnQ7XG4gIEBWaWV3Q2hpbGQoJ3NlYXJjaGJhckNvbXBvbmVudCcpXG4gIF9zZWFyY2hiYXJDb21wb25lbnQhOiBJb25TZWFyY2hiYXI7XG4gIEBWaWV3Q2hpbGQoSW9uSW5maW5pdGVTY3JvbGwpXG4gIF9pbmZpbml0ZVNjcm9sbCE6IElvbkluZmluaXRlU2Nyb2xsO1xuICBASG9zdEJpbmRpbmcoJ2NsYXNzLmlvbmljLXNlbGVjdGFibGUtbW9kYWwnKVxuICBfY3NzQ2xhc3MgPSB0cnVlO1xuICBASG9zdEJpbmRpbmcoJ2NsYXNzLmlvbmljLXNlbGVjdGFibGUtbW9kYWwtY2FuLWNsZWFyJylcbiAgZ2V0IF9jYW5DbGVhckNzc0NsYXNzKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLnNlbGVjdENvbXBvbmVudC5jYW5DbGVhcjtcbiAgfVxuICBASG9zdEJpbmRpbmcoJ2NsYXNzLmlvbmljLXNlbGVjdGFibGUtbW9kYWwtaXMtbXVsdGlwbGUnKVxuICBnZXQgX2lzTXVsdGlwbGVDc3NDbGFzcygpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5zZWxlY3RDb21wb25lbnQuaXNNdWx0aXBsZTtcbiAgfVxuICBASG9zdEJpbmRpbmcoJ2NsYXNzLmlvbmljLXNlbGVjdGFibGUtbW9kYWwtaXMtc2VhcmNoaW5nJylcbiAgZ2V0IF9pc1NlYXJjaGluZ0Nzc0NsYXNzKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLnNlbGVjdENvbXBvbmVudC5faXNTZWFyY2hpbmc7XG4gIH1cbiAgQEhvc3RCaW5kaW5nKCdjbGFzcy5pb25pYy1zZWxlY3RhYmxlLW1vZGFsLWlvcycpXG4gIGdldCBfaXNJb3MoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuc2VsZWN0Q29tcG9uZW50Ll9pc0lvcztcbiAgfVxuICBASG9zdEJpbmRpbmcoJ2NsYXNzLmlvbmljLXNlbGVjdGFibGUtbW9kYWwtbWQnKVxuICBfaXNNRCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5zZWxlY3RDb21wb25lbnQuX2lzTUQ7XG4gIH1cbiAgQEhvc3RCaW5kaW5nKCdjbGFzcy5pb25pYy1zZWxlY3RhYmxlLW1vZGFsLWlzLWFkZC1pdGVtLXRlbXBsYXRlLXZpc2libGUnKVxuICBnZXQgX2lzQWRkSXRlbVRlbXBsYXRlVmlzaWJsZUNzc0NsYXNzKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLnNlbGVjdENvbXBvbmVudC5faXNBZGRJdGVtVGVtcGxhdGVWaXNpYmxlO1xuICB9XG4gIEBIb3N0TGlzdGVuZXIoJ3dpbmRvdzpyZXNpemUnKVxuICBvblJlc2l6ZSgpIHtcbiAgICAvLyBpb24tZm9vdGVyIGluc2lkZSB0aGUgdGVtcGxhdGUgbWlnaHQgY2hhbmdlIGl0cyBoZWlnaHQgd2hlblxuICAgIC8vIGRldmljZSBvcmllbnRhdGlvbiBjaGFuZ2VzLlxuICAgIHRoaXMuc2VsZWN0Q29tcG9uZW50Ll9wb3NpdGlvbkFkZEl0ZW1UZW1wbGF0ZSgpO1xuICB9XG5cbiAgY29uc3RydWN0b3IocHJpdmF0ZSBuYXZQYXJhbXM6IE5hdlBhcmFtcywgcHVibGljIF9lbGVtZW50OiBFbGVtZW50UmVmKSB7XG4gICAgdGhpcy5zZWxlY3RDb21wb25lbnQgPSB0aGlzLm5hdlBhcmFtcy5nZXQoJ3NlbGVjdENvbXBvbmVudCcpO1xuICAgIHRoaXMuc2VsZWN0Q29tcG9uZW50Ll9tb2RhbENvbXBvbmVudCA9IHRoaXM7XG4gICAgdGhpcy5zZWxlY3RDb21wb25lbnQuX3NlbGVjdGVkSXRlbXMgPSBbXTtcblxuICAgIGlmICghdGhpcy5zZWxlY3RDb21wb25lbnQuX2lzTnVsbE9yV2hpdGVTcGFjZSh0aGlzLnNlbGVjdENvbXBvbmVudC52YWx1ZSkpIHtcbiAgICAgIGlmICh0aGlzLnNlbGVjdENvbXBvbmVudC5pc011bHRpcGxlKSB7XG4gICAgICAgIHRoaXMuc2VsZWN0Q29tcG9uZW50LnZhbHVlLmZvckVhY2goKGl0ZW06IGFueSkgPT4ge1xuICAgICAgICAgIHRoaXMuc2VsZWN0Q29tcG9uZW50Ll9zZWxlY3RlZEl0ZW1zLnB1c2goaXRlbSk7XG4gICAgICAgIH0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5zZWxlY3RDb21wb25lbnQuX3NlbGVjdGVkSXRlbXMucHVzaCh0aGlzLnNlbGVjdENvbXBvbmVudC52YWx1ZSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdGhpcy5zZWxlY3RDb21wb25lbnQuX3NldEl0ZW1zVG9Db25maXJtKFxuICAgICAgdGhpcy5zZWxlY3RDb21wb25lbnQuX3NlbGVjdGVkSXRlbXNcbiAgICApO1xuICB9XG5cbiAgbmdBZnRlclZpZXdJbml0KCkge1xuICAgIHRoaXMuX2hlYWRlciA9IHRoaXMuX2VsZW1lbnQubmF0aXZlRWxlbWVudC5xdWVyeVNlbGVjdG9yKCdpb24taGVhZGVyJyk7XG5cbiAgICBpZiAodGhpcy5fc2VhcmNoYmFyQ29tcG9uZW50ICYmIHRoaXMuc2VsZWN0Q29tcG9uZW50LnNob3VsZEZvY3VzU2VhcmNoYmFyKSB7XG4gICAgICAvLyBGb2N1cyBhZnRlciBhIGRlbGF5IGJlY2F1c2UgZm9jdXMgZG9lc24ndCB3b3JrIHdpdGhvdXQgaXQuXG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgdGhpcy5fc2VhcmNoYmFyQ29tcG9uZW50LnNldEZvY3VzKCk7XG4gICAgICB9LCAxMDAwKTtcbiAgICB9XG4gIH1cbn1cbiIsIjxpb24taGVhZGVyPlxuICA8aW9uLXRvb2xiYXIgKm5nSWY9XCIhc2VsZWN0Q29tcG9uZW50LmhlYWRlclRlbXBsYXRlXCJcbiAgICBbY29sb3JdPVwic2VsZWN0Q29tcG9uZW50LmhlYWRlckNvbG9yID8gc2VsZWN0Q29tcG9uZW50LmhlYWRlckNvbG9yIDogbnVsbFwiPlxuICAgIDxpb24tYnV0dG9ucyBbc2xvdF09XCJzZWxlY3RDb21wb25lbnQuY2xvc2VCdXR0b25TbG90XCI+XG4gICAgICA8aW9uLWJ1dHRvbiAoY2xpY2spPVwic2VsZWN0Q29tcG9uZW50Ll9jbG9zZSgpXCI+XG4gICAgICAgIDxzcGFuICpuZ0lmPVwic2VsZWN0Q29tcG9uZW50LmNsb3NlQnV0dG9uVGVtcGxhdGVcIiBbbmdUZW1wbGF0ZU91dGxldF09XCJzZWxlY3RDb21wb25lbnQuY2xvc2VCdXR0b25UZW1wbGF0ZVwiPlxuICAgICAgICA8L3NwYW4+XG4gICAgICAgIDxzcGFuICpuZ0lmPVwiIXNlbGVjdENvbXBvbmVudC5jbG9zZUJ1dHRvblRlbXBsYXRlXCI+XG4gICAgICAgICAge3tzZWxlY3RDb21wb25lbnQuY2xvc2VCdXR0b25UZXh0fX1cbiAgICAgICAgPC9zcGFuPlxuICAgICAgPC9pb24tYnV0dG9uPlxuICAgIDwvaW9uLWJ1dHRvbnM+XG4gICAgPGlvbi10aXRsZT5cbiAgICAgIDwhLS0gTmVlZCBzcGFuIGZvciBmb3IgdGV4dCBlbGxpcHNpcy4gLS0+XG4gICAgICA8c3BhbiAqbmdJZj1cInNlbGVjdENvbXBvbmVudC50aXRsZVRlbXBsYXRlXCIgW25nVGVtcGxhdGVPdXRsZXRdPVwic2VsZWN0Q29tcG9uZW50LnRpdGxlVGVtcGxhdGVcIj5cbiAgICAgIDwvc3Bhbj5cbiAgICAgIDxzcGFuICpuZ0lmPVwiIXNlbGVjdENvbXBvbmVudC50aXRsZVRlbXBsYXRlXCI+XG4gICAgICAgIHt7c2VsZWN0Q29tcG9uZW50LmxhYmVsfX1cbiAgICAgIDwvc3Bhbj5cbiAgICA8L2lvbi10aXRsZT5cbiAgPC9pb24tdG9vbGJhcj5cbiAgPGRpdiAqbmdJZj1cInNlbGVjdENvbXBvbmVudC5oZWFkZXJUZW1wbGF0ZVwiIFtuZ1RlbXBsYXRlT3V0bGV0XT1cInNlbGVjdENvbXBvbmVudC5oZWFkZXJUZW1wbGF0ZVwiPlxuICA8L2Rpdj5cbiAgPGlvbi10b29sYmFyICpuZ0lmPVwic2VsZWN0Q29tcG9uZW50LmNhblNlYXJjaCB8fCBzZWxlY3RDb21wb25lbnQubWVzc2FnZVRlbXBsYXRlXCI+XG4gICAgPGlvbi1zZWFyY2hiYXIgKm5nSWY9XCJzZWxlY3RDb21wb25lbnQuY2FuU2VhcmNoXCIgI3NlYXJjaGJhckNvbXBvbmVudCBbKG5nTW9kZWwpXT1cInNlbGVjdENvbXBvbmVudC5fc2VhcmNoVGV4dFwiXG4gICAgICAoaW9uSW5wdXQpPVwic2VsZWN0Q29tcG9uZW50Ll9maWx0ZXJJdGVtcygpXCIgKGlvbkNsZWFyKT1cInNlbGVjdENvbXBvbmVudC5fb25TZWFyY2hiYXJDbGVhcigpXCJcbiAgICAgIFtwbGFjZWhvbGRlcl09XCJzZWxlY3RDb21wb25lbnQuc2VhcmNoUGxhY2Vob2xkZXJcIiBbZGVib3VuY2VdPVwic2VsZWN0Q29tcG9uZW50LnNlYXJjaERlYm91bmNlXCI+XG4gICAgPC9pb24tc2VhcmNoYmFyPlxuICAgIDxkaXYgY2xhc3M9XCJpb25pYy1zZWxlY3RhYmxlLW1lc3NhZ2VcIiAqbmdJZj1cInNlbGVjdENvbXBvbmVudC5tZXNzYWdlVGVtcGxhdGVcIj5cbiAgICAgIDxkaXYgW25nVGVtcGxhdGVPdXRsZXRdPVwic2VsZWN0Q29tcG9uZW50Lm1lc3NhZ2VUZW1wbGF0ZVwiPlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gIDwvaW9uLXRvb2xiYXI+XG48L2lvbi1oZWFkZXI+XG48aW9uLWNvbnRlbnQ+XG4gIDxkaXYgY2xhc3M9XCJpb25pYy1zZWxlY3RhYmxlLXNwaW5uZXJcIiAqbmdJZj1cInNlbGVjdENvbXBvbmVudC5faXNTZWFyY2hpbmdcIj5cbiAgICA8ZGl2IGNsYXNzPVwiaW9uaWMtc2VsZWN0YWJsZS1zcGlubmVyLWJhY2tncm91bmRcIj48L2Rpdj5cbiAgICA8aW9uLXNwaW5uZXI+PC9pb24tc3Bpbm5lcj5cbiAgPC9kaXY+XG4gIDxpb24tbGlzdCBjbGFzcz1cImlvbi1uby1tYXJnaW5cIiAqbmdJZj1cInNlbGVjdENvbXBvbmVudC5faGFzRmlsdGVyZWRJdGVtc1wiPlxuICAgIDxpb24taXRlbS1ncm91cCAqbmdGb3I9XCJsZXQgZ3JvdXAgb2Ygc2VsZWN0Q29tcG9uZW50Ll9maWx0ZXJlZEdyb3Vwc1wiIGNsYXNzPVwiaW9uaWMtc2VsZWN0YWJsZS1ncm91cFwiPlxuICAgICAgPGlvbi1pdGVtLWRpdmlkZXIgKm5nSWY9XCJzZWxlY3RDb21wb25lbnQuX2hhc0dyb3Vwc1wiXG4gICAgICAgIFtjb2xvcl09XCJzZWxlY3RDb21wb25lbnQuZ3JvdXBDb2xvciA/IHNlbGVjdENvbXBvbmVudC5ncm91cENvbG9yIDogbnVsbFwiPlxuICAgICAgICA8IS0tIE5lZWQgc3BhbiBmb3IgZm9yIHRleHQgZWxsaXBzaXMuIC0tPlxuICAgICAgICA8c3BhbiAqbmdJZj1cInNlbGVjdENvbXBvbmVudC5ncm91cFRlbXBsYXRlXCIgW25nVGVtcGxhdGVPdXRsZXRdPVwic2VsZWN0Q29tcG9uZW50Lmdyb3VwVGVtcGxhdGVcIlxuICAgICAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0Q29udGV4dF09XCJ7IGdyb3VwOiBncm91cCB9XCI+XG4gICAgICAgIDwvc3Bhbj5cbiAgICAgICAgPCEtLSBOZWVkIGlvbi1sYWJlbCBmb3IgdGV4dCBlbGxpcHNpcy4gLS0+XG4gICAgICAgIDxpb24tbGFiZWwgKm5nSWY9XCIhc2VsZWN0Q29tcG9uZW50Lmdyb3VwVGVtcGxhdGVcIj5cbiAgICAgICAgICB7e2dyb3VwLnRleHR9fVxuICAgICAgICA8L2lvbi1sYWJlbD5cbiAgICAgICAgPGRpdiAqbmdJZj1cInNlbGVjdENvbXBvbmVudC5ncm91cEVuZFRlbXBsYXRlXCIgc2xvdD1cImVuZFwiPlxuICAgICAgICAgIDxkaXYgW25nVGVtcGxhdGVPdXRsZXRdPVwic2VsZWN0Q29tcG9uZW50Lmdyb3VwRW5kVGVtcGxhdGVcIiBbbmdUZW1wbGF0ZU91dGxldENvbnRleHRdPVwieyBncm91cDogZ3JvdXAgfVwiPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvaW9uLWl0ZW0tZGl2aWRlcj5cbiAgICAgIDxpb24taXRlbSBidXR0b249XCJ0cnVlXCIgZGV0YWlsPVwiZmFsc2VcIiAqbmdGb3I9XCJsZXQgaXRlbSBvZiBncm91cC5pdGVtc1wiIChjbGljayk9XCJzZWxlY3RDb21wb25lbnQuX3NlbGVjdChpdGVtKVwiXG4gICAgICAgIGNsYXNzPVwiaW9uaWMtc2VsZWN0YWJsZS1pdGVtXCIgW25nQ2xhc3NdPVwie1xuICAgICAgICAgICdpb25pYy1zZWxlY3RhYmxlLWl0ZW0taXMtc2VsZWN0ZWQnOiBzZWxlY3RDb21wb25lbnQuX2lzSXRlbVNlbGVjdGVkKGl0ZW0pLFxuICAgICAgICAgICdpb25pYy1zZWxlY3RhYmxlLWl0ZW0taXMtZGlzYWJsZWQnOiBzZWxlY3RDb21wb25lbnQuX2lzSXRlbURpc2FibGVkKGl0ZW0pXG4gICAgICAgIH1cIiBbZGlzYWJsZWRdPVwic2VsZWN0Q29tcG9uZW50Ll9pc0l0ZW1EaXNhYmxlZChpdGVtKVwiPlxuICAgICAgICA8IS0tIE5lZWQgc3BhbiBmb3IgdGV4dCBlbGxpcHNpcy4gLS0+XG4gICAgICAgIDxzcGFuICpuZ0lmPVwic2VsZWN0Q29tcG9uZW50Lml0ZW1UZW1wbGF0ZVwiIFtuZ1RlbXBsYXRlT3V0bGV0XT1cInNlbGVjdENvbXBvbmVudC5pdGVtVGVtcGxhdGVcIlxuICAgICAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0Q29udGV4dF09XCJ7IGl0ZW06IGl0ZW0sIGlzSXRlbVNlbGVjdGVkOiBzZWxlY3RDb21wb25lbnQuX2lzSXRlbVNlbGVjdGVkKGl0ZW0pIH1cIj5cbiAgICAgICAgPC9zcGFuPlxuICAgICAgICA8IS0tIE5lZWQgaW9uLWxhYmVsIGZvciB0ZXh0IGVsbGlwc2lzLiAtLT5cbiAgICAgICAgPGlvbi1sYWJlbCAqbmdJZj1cIiFzZWxlY3RDb21wb25lbnQuaXRlbVRlbXBsYXRlXCI+XG4gICAgICAgICAge3tzZWxlY3RDb21wb25lbnQuX2Zvcm1hdEl0ZW0oaXRlbSl9fVxuICAgICAgICA8L2lvbi1sYWJlbD5cbiAgICAgICAgPGRpdiAqbmdJZj1cInNlbGVjdENvbXBvbmVudC5pdGVtRW5kVGVtcGxhdGVcIiBzbG90PVwiZW5kXCI+XG4gICAgICAgICAgPGRpdiBbbmdUZW1wbGF0ZU91dGxldF09XCJzZWxlY3RDb21wb25lbnQuaXRlbUVuZFRlbXBsYXRlXCJcbiAgICAgICAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0Q29udGV4dF09XCJ7IGl0ZW06IGl0ZW0sIGlzSXRlbVNlbGVjdGVkOiBzZWxlY3RDb21wb25lbnQuX2lzSXRlbVNlbGVjdGVkKGl0ZW0pIH1cIj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxzcGFuICpuZ0lmPVwic2VsZWN0Q29tcG9uZW50Lml0ZW1JY29uVGVtcGxhdGVcIiBbbmdUZW1wbGF0ZU91dGxldF09XCJzZWxlY3RDb21wb25lbnQuaXRlbUljb25UZW1wbGF0ZVwiXG4gICAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRDb250ZXh0XT1cInsgaXRlbTogaXRlbSwgaXNJdGVtU2VsZWN0ZWQ6IHNlbGVjdENvbXBvbmVudC5faXNJdGVtU2VsZWN0ZWQoaXRlbSkgfVwiPlxuICAgICAgICA8L3NwYW4+XG4gICAgICAgIDxpb24taWNvbiAqbmdJZj1cIiFzZWxlY3RDb21wb25lbnQuaXRlbUljb25UZW1wbGF0ZVwiXG4gICAgICAgICAgW25hbWVdPVwic2VsZWN0Q29tcG9uZW50Ll9pc0l0ZW1TZWxlY3RlZChpdGVtKSA/ICdjaGVja21hcmstY2lyY2xlJyA6ICdyYWRpby1idXR0b24tb2ZmJ1wiXG4gICAgICAgICAgW2NvbG9yXT1cInNlbGVjdENvbXBvbmVudC5faXNJdGVtU2VsZWN0ZWQoaXRlbSkgPyAncHJpbWFyeScgOiBudWxsXCIgW3Nsb3RdPVwic2VsZWN0Q29tcG9uZW50Lml0ZW1JY29uU2xvdFwiPlxuICAgICAgICA8L2lvbi1pY29uPlxuICAgICAgICA8aW9uLWJ1dHRvbiAqbmdJZj1cInNlbGVjdENvbXBvbmVudC5jYW5TYXZlSXRlbVwiIGNsYXNzPVwiaW9uaWMtc2VsZWN0YWJsZS1pdGVtLWJ1dHRvblwiIHNsb3Q9XCJlbmRcIiBmaWxsPVwib3V0bGluZVwiXG4gICAgICAgICAgKGNsaWNrKT1cInNlbGVjdENvbXBvbmVudC5fc2F2ZUl0ZW0oJGV2ZW50LCBpdGVtKVwiPlxuICAgICAgICAgIDxpb24taWNvbiBzbG90PVwiaWNvbi1vbmx5XCIgaW9zPVwiY3JlYXRlXCIgbWQ9XCJjcmVhdGUtc2hhcnBcIj48L2lvbi1pY29uPlxuICAgICAgICA8L2lvbi1idXR0b24+XG4gICAgICAgIDxpb24tYnV0dG9uICpuZ0lmPVwic2VsZWN0Q29tcG9uZW50LmNhbkRlbGV0ZUl0ZW1cIiBjbGFzcz1cImlvbmljLXNlbGVjdGFibGUtaXRlbS1idXR0b25cIiBzbG90PVwiZW5kXCIgZmlsbD1cIm91dGxpbmVcIlxuICAgICAgICAgIChjbGljayk9XCJzZWxlY3RDb21wb25lbnQuX2RlbGV0ZUl0ZW1DbGljaygkZXZlbnQsIGl0ZW0pXCI+XG4gICAgICAgICAgPGlvbi1pY29uIHNsb3Q9XCJpY29uLW9ubHlcIiBpb3M9XCJ0cmFzaFwiIG1kPVwidHJhc2gtc2hhcnBcIj48L2lvbi1pY29uPlxuICAgICAgICA8L2lvbi1idXR0b24+XG4gICAgICA8L2lvbi1pdGVtPlxuICAgIDwvaW9uLWl0ZW0tZ3JvdXA+XG4gIDwvaW9uLWxpc3Q+XG4gIDwhLS0gRmFpbCB0ZXh0IHNob3VsZCBiZSBhYm92ZSBJbmZpbml0ZVNjcm9sbCB0byBhdm9pZCBhIGdhcCB3aGVuIG5vIGl0ZW1zIGFyZSBmb3VuZC4gLS0+XG4gIDxkaXYgKm5nSWY9XCIhc2VsZWN0Q29tcG9uZW50Ll9oYXNGaWx0ZXJlZEl0ZW1zXCI+XG4gICAgPHNwYW4gKm5nSWY9XCJzZWxlY3RDb21wb25lbnQuc2VhcmNoRmFpbFRlbXBsYXRlXCIgW25nVGVtcGxhdGVPdXRsZXRdPVwic2VsZWN0Q29tcG9uZW50LnNlYXJjaEZhaWxUZW1wbGF0ZVwiPlxuICAgIDwvc3Bhbj5cbiAgICA8ZGl2ICpuZ0lmPVwiIXNlbGVjdENvbXBvbmVudC5zZWFyY2hGYWlsVGVtcGxhdGVcIiBjbGFzcz1cImlvbi1tYXJnaW5cIj5cbiAgICAgIHt7c2VsZWN0Q29tcG9uZW50LnNlYXJjaEZhaWxUZXh0fX1cbiAgICA8L2Rpdj5cbiAgPC9kaXY+XG4gIDxpb24taW5maW5pdGUtc2Nyb2xsIFtkaXNhYmxlZF09XCIhc2VsZWN0Q29tcG9uZW50Lmhhc0luZmluaXRlU2Nyb2xsXCJcbiAgICAoaW9uSW5maW5pdGUpPVwic2VsZWN0Q29tcG9uZW50Ll9nZXRNb3JlSXRlbXMoKVwiPlxuICAgIDxpb24taW5maW5pdGUtc2Nyb2xsLWNvbnRlbnQ+PC9pb24taW5maW5pdGUtc2Nyb2xsLWNvbnRlbnQ+XG4gIDwvaW9uLWluZmluaXRlLXNjcm9sbD5cbjwvaW9uLWNvbnRlbnQ+XG48ZGl2IGNsYXNzPVwiaW9uaWMtc2VsZWN0YWJsZS1hZGQtaXRlbS10ZW1wbGF0ZVwiICpuZ0lmPVwic2VsZWN0Q29tcG9uZW50Ll9pc0FkZEl0ZW1UZW1wbGF0ZVZpc2libGVcIlxuICBbbmdTdHlsZV09XCJ7ICd0b3AucHgnOiBfaGVhZGVyLm9mZnNldEhlaWdodCB9XCI+XG4gIDxkaXYgY2xhc3M9XCJpb25pYy1zZWxlY3RhYmxlLWFkZC1pdGVtLXRlbXBsYXRlLWlubmVyXCJcbiAgICBbbmdTdHlsZV09XCJ7ICdoZWlnaHQnOiBzZWxlY3RDb21wb25lbnQuX2FkZEl0ZW1UZW1wbGF0ZUZvb3RlckhlaWdodCB9XCI+XG4gICAgPHNwYW4gW25nVGVtcGxhdGVPdXRsZXRdPVwic2VsZWN0Q29tcG9uZW50LmFkZEl0ZW1UZW1wbGF0ZVwiXG4gICAgICBbbmdUZW1wbGF0ZU91dGxldENvbnRleHRdPVwieyBpdGVtOiBzZWxlY3RDb21wb25lbnQuX2l0ZW1Ub0FkZCwgaXNBZGQ6IHNlbGVjdENvbXBvbmVudC5faXRlbVRvQWRkID09PSBudWxsIH1cIj5cbiAgICA8L3NwYW4+XG4gIDwvZGl2PlxuPC9kaXY+XG48aW9uLWZvb3RlciAqbmdJZj1cInNlbGVjdENvbXBvbmVudC5fZm9vdGVyQnV0dG9uc0NvdW50ID4gMCB8fCBzZWxlY3RDb21wb25lbnQuZm9vdGVyVGVtcGxhdGVcIlxuICBbbmdTdHlsZV09XCJ7ICd2aXNpYmlsaXR5Jzogc2VsZWN0Q29tcG9uZW50Ll9pc0Zvb3RlclZpc2libGUgPyAnaW5pdGlhbCcgOiAnaGlkZGVuJyB9XCI+XG4gIDxpb24tdG9vbGJhciAqbmdJZj1cIiFzZWxlY3RDb21wb25lbnQuZm9vdGVyVGVtcGxhdGVcIj5cbiAgICA8aW9uLXJvdz5cbiAgICAgIDxpb24tY29sICpuZ0lmPVwic2VsZWN0Q29tcG9uZW50LmNhbkNsZWFyXCI+XG4gICAgICAgIDxpb24tYnV0dG9uIGV4cGFuZD1cImZ1bGxcIiAoY2xpY2spPVwic2VsZWN0Q29tcG9uZW50Ll9jbGVhcigpXCJcbiAgICAgICAgICBbZGlzYWJsZWRdPVwiIXNlbGVjdENvbXBvbmVudC5fc2VsZWN0ZWRJdGVtcy5sZW5ndGhcIj5cbiAgICAgICAgICB7e3NlbGVjdENvbXBvbmVudC5jbGVhckJ1dHRvblRleHR9fVxuICAgICAgICA8L2lvbi1idXR0b24+XG4gICAgICA8L2lvbi1jb2w+XG4gICAgICA8aW9uLWNvbCAqbmdJZj1cInNlbGVjdENvbXBvbmVudC5jYW5BZGRJdGVtXCI+XG4gICAgICAgIDxpb24tYnV0dG9uIGV4cGFuZD1cImZ1bGxcIiAoY2xpY2spPVwic2VsZWN0Q29tcG9uZW50Ll9hZGRJdGVtQ2xpY2soKVwiPlxuICAgICAgICAgIHt7c2VsZWN0Q29tcG9uZW50LmFkZEJ1dHRvblRleHR9fVxuICAgICAgICA8L2lvbi1idXR0b24+XG4gICAgICA8L2lvbi1jb2w+XG4gICAgICA8aW9uLWNvbCAqbmdJZj1cInNlbGVjdENvbXBvbmVudC5pc011bHRpcGxlIHx8IHNlbGVjdENvbXBvbmVudC5oYXNDb25maXJtQnV0dG9uXCI+XG4gICAgICAgIDxpb24tYnV0dG9uIGV4cGFuZD1cImZ1bGxcIiAoY2xpY2spPVwic2VsZWN0Q29tcG9uZW50Ll9jb25maXJtKClcIlxuICAgICAgICAgIFtkaXNhYmxlZF09XCIhc2VsZWN0Q29tcG9uZW50LmlzQ29uZmlybUJ1dHRvbkVuYWJsZWRcIj5cbiAgICAgICAgICB7e3NlbGVjdENvbXBvbmVudC5jb25maXJtQnV0dG9uVGV4dH19XG4gICAgICAgIDwvaW9uLWJ1dHRvbj5cbiAgICAgIDwvaW9uLWNvbD5cbiAgICA8L2lvbi1yb3c+XG4gIDwvaW9uLXRvb2xiYXI+XG4gIDxkaXYgKm5nSWY9XCJzZWxlY3RDb21wb25lbnQuZm9vdGVyVGVtcGxhdGVcIiBbbmdUZW1wbGF0ZU91dGxldF09XCJzZWxlY3RDb21wb25lbnQuZm9vdGVyVGVtcGxhdGVcIj5cbiAgPC9kaXY+XG48L2lvbi1mb290ZXI+Il19