UNPKG

fundamental-ngx

Version:

SAP Fiori Fundamentals, implemented in Angular

388 lines 28 kB
/** * @fileoverview added by tsickle * @suppress {checkTypes,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc */ import { Component, ElementRef, EventEmitter, forwardRef, HostBinding, HostListener, Input, Output, ViewChild, ViewEncapsulation } from '@angular/core'; import { NG_VALUE_ACCESSOR } from '@angular/forms'; import { PopoverComponent } from '../popover/popover.component'; /** * Input field with multiple selection enabled. Should be used when a user can select between a * limited number of pre-defined options with a filter-enabled context. * * Supports Angular Forms. */ export class MultiInputComponent { /** * @hidden * @param {?} elRef */ constructor(elRef) { this.elRef = elRef; /** * @hidden */ this.multiInputClass = true; /** * Placeholder for the input field. */ this.placeholder = ''; /** * Whether the input is disabled. */ this.disabled = false; /** * Whether the input is in compact mode. */ this.compact = false; /** * Max height of the popover. Any overflowing elements will be accessible through scrolling. */ this.maxHeight = '300px'; /** * Icon of the button on the right of the input field. */ this.glyph = 'navigation-down-arrow'; /** * Values to be displayed in the unfiltered dropdown. */ this.dropdownValues = []; /** * Whether the search term should be highlighted in results. */ this.highlight = true; /** * Selected dropdown items. */ this.selected = []; /** * Filter function. Accepts an array and a string as arguments, and outputs an array. * An arrow function can be used to access the *this* keyword in the calling component. * See multi input examples for details. */ this.filterFn = this.defaultFilter; /** * Display function. Accepts an object of the same type as the * items passed to dropdownValues as argument, and outputs a string. * An arrow function can be used to access the *this* keyword in the calling component. * See multi input examples for details. */ this.displayFn = this.defaultDisplay; /** * Aria label for the multi input body. */ this.multiInputBodyLabel = 'Multi input body'; /** * Event emitted when the search term changes. Use *$event* to access the new term. */ this.searchTermChange = new EventEmitter(); /** * Event emitted when the selected items change. Use *$event* to access the new selected array. */ this.selectedChange = new EventEmitter(); /** * @hidden */ this.displayedValues = []; /** * @hidden */ this.isOpen = false; /** * @hidden */ this.onChange = (/** * @return {?} */ () => { }); /** * @hidden */ this.onTouched = (/** * @return {?} */ () => { }); } /** * @hidden * @return {?} */ ngOnInit() { if (this.dropdownValues) { this.displayedValues = this.dropdownValues; } } /** * @hidden * @param {?} changes * @return {?} */ ngOnChanges(changes) { if (this.dropdownValues && (changes.dropdownValues || changes.searchTerm)) { if (this.searchTerm) { this.displayedValues = this.filterFn(this.dropdownValues, this.searchTerm); } else { this.displayedValues = this.dropdownValues; } } } /** * @hidden * @param {?} fn * @return {?} */ registerOnChange(fn) { this.onChange = fn; } /** * @hidden * @param {?} fn * @return {?} */ registerOnTouched(fn) { this.onTouched = fn; } /** * @hidden * @param {?} isDisabled * @return {?} */ setDisabledState(isDisabled) { this.disabled = isDisabled; } /** * @hidden * @param {?} selected * @return {?} */ writeValue(selected) { this.selected = selected; } /** * @hidden * @param {?} checked * @param {?} value * @return {?} */ handleSelect(checked, value) { /** @type {?} */ const previousLength = this.selected.length; if (checked) { this.selected.push(value); } else { this.selected.splice(this.selected.indexOf(value), 1); } // Handle popover placement update if ((previousLength === 0 && this.selected.length === 1) || (previousLength === 1 && this.selected.length === 0)) { this.popoverRef.updatePopover(); } this.onChange(this.selected); this.selectedChange.emit(this.selected); } /** * @hidden * @return {?} */ handleSearchTermChange() { this.searchTermChange.emit(this.searchTerm); this.displayedValues = this.filterFn(this.dropdownValues, this.searchTerm); } /** * @private * @param {?} contentArray * @param {?} searchTerm * @return {?} */ defaultFilter(contentArray, searchTerm) { /** @type {?} */ const searchLower = searchTerm.toLocaleLowerCase(); return contentArray.filter((/** * @param {?} item * @return {?} */ item => { if (item) { return this.displayFn(item).toLocaleLowerCase().includes(searchLower); } })); } /** * @private * @param {?} str * @return {?} */ defaultDisplay(str) { return str; } /** * @hidden * @param {?} event * @return {?} */ clickHandler(event) { event.stopPropagation(); if (!this.elRef.nativeElement.contains(event.target)) { this.isOpen = false; } } } MultiInputComponent.decorators = [ { type: Component, args: [{ selector: 'fd-multi-input', template: "<div class=\"fd-multi-input-field\">\n <fd-popover [(isOpen)]=\"isOpen\"\n [triggers]=\"[]\"\n [disabled]=\"disabled\"\n [fillControl]=\"true\"\n class=\"fd-multi-input-popover-custom\">\n <fd-popover-control>\n <div class=\"fd-combobox-control\"\n [attr.aria-label]=\"multiInputBodyLabel\"\n [attr.aria-expanded]=\"isOpen\">\n <div class=\"fd-input-group fd-input-group--after\" [ngClass]=\"{'fd-input-group--compact': compact}\">\n <input type=\"text\" class=\"fd-input\"\n [ngClass]=\"{'fd-input--compact': compact}\"\n [placeholder]=\"placeholder\"\n [disabled]=\"disabled\"\n [(ngModel)]=\"searchTerm\"\n (ngModelChange)=\"handleSearchTermChange()\"\n (keypress)=\"isOpen = true\"\n (click)=\"isOpen = !isOpen\">\n <span class=\"fd-input-group__addon fd-input-group__addon--after\n fd-input-group__addon--button\">\n <button class=\"fd-button--light\" type=\"button\"\n [ngClass]=\"('sap-icon--' + glyph)\"\n [disabled]=\"disabled\"\n (click)=\"isOpen = !isOpen\"></button>\n </span>\n </div>\n </div>\n </fd-popover-control>\n <fd-popover-body [attr.aria-hidden]=\"!isOpen\">\n <fd-menu class=\"fd-multi-input-menu-overflow\"\n *ngIf=\"displayedValues && displayedValues.length\"\n [style.maxHeight]=\"maxHeight\">\n <ul fd-menu-list>\n <li fd-menu-item *ngFor=\"let value of displayedValues\">\n <label class=\"fd-menu__item\">\n <input type=\"checkbox\" class=\"fd-checkbox\"\n [ngModel]=\"selected ? selected.indexOf(value) !== -1 : false\"\n (ngModelChange)=\"handleSelect($event, value)\">\n <span [innerHtml]=\"value | displayFnPipe:displayFn | highlight:searchTerm:highlight\"></span>\n </label>\n </li>\n </ul>\n </fd-menu>\n <ng-content></ng-content>\n </fd-popover-body>\n </fd-popover>\n</div>\n<div class=\"fd-multi-input-tags\">\n <fd-token *ngFor=\"let token of selected\"\n (onCloseClick)=\"handleSelect(false, token)\"\n class=\"fd-multi-input-token-spacing\">\n {{token | displayFnPipe:displayFn}}\n </fd-token>\n</div>\n\n", host: { '(blur)': 'onTouched()', '[class.fd-multi-input-custom]': 'true' }, providers: [ { provide: NG_VALUE_ACCESSOR, useExisting: forwardRef((/** * @return {?} */ () => MultiInputComponent)), multi: true } ], encapsulation: ViewEncapsulation.None, styles: [".fd-multi-input-custom{display:block}.fd-multi-input-custom .fd-multi-input-popover-size{overflow:auto;display:block}.fd-multi-input-custom .fd-multi-input-popover-custom{display:block}.fd-multi-input-custom .fd-multi-input-menu-overflow{overflow:auto}.fd-multi-input-custom .fd-multi-input-token-spacing{margin:0 4px 4px 0}.fd-multi-input-custom .fd-multi-input-token-spacing:last-child{margin-right:0}"] }] } ]; /** @nocollapse */ MultiInputComponent.ctorParameters = () => [ { type: ElementRef } ]; MultiInputComponent.propDecorators = { popoverRef: [{ type: ViewChild, args: [PopoverComponent,] }], multiInputClass: [{ type: HostBinding, args: ['class.fd-multi-input',] }], placeholder: [{ type: Input }], disabled: [{ type: Input }], compact: [{ type: Input }], maxHeight: [{ type: Input }], glyph: [{ type: Input }], dropdownValues: [{ type: Input }], searchTerm: [{ type: Input }], highlight: [{ type: Input }], selected: [{ type: Input }], filterFn: [{ type: Input }], displayFn: [{ type: Input }], multiInputBodyLabel: [{ type: Input }], searchTermChange: [{ type: Output }], selectedChange: [{ type: Output }], clickHandler: [{ type: HostListener, args: ['document:click', ['$event'],] }] }; if (false) { /** * @hidden * @type {?} */ MultiInputComponent.prototype.popoverRef; /** * @hidden * @type {?} */ MultiInputComponent.prototype.multiInputClass; /** * Placeholder for the input field. * @type {?} */ MultiInputComponent.prototype.placeholder; /** * Whether the input is disabled. * @type {?} */ MultiInputComponent.prototype.disabled; /** * Whether the input is in compact mode. * @type {?} */ MultiInputComponent.prototype.compact; /** * Max height of the popover. Any overflowing elements will be accessible through scrolling. * @type {?} */ MultiInputComponent.prototype.maxHeight; /** * Icon of the button on the right of the input field. * @type {?} */ MultiInputComponent.prototype.glyph; /** * Values to be displayed in the unfiltered dropdown. * @type {?} */ MultiInputComponent.prototype.dropdownValues; /** * Search term, or more specifically the value of the inner input field. * @type {?} */ MultiInputComponent.prototype.searchTerm; /** * Whether the search term should be highlighted in results. * @type {?} */ MultiInputComponent.prototype.highlight; /** * Selected dropdown items. * @type {?} */ MultiInputComponent.prototype.selected; /** * Filter function. Accepts an array and a string as arguments, and outputs an array. * An arrow function can be used to access the *this* keyword in the calling component. * See multi input examples for details. * @type {?} */ MultiInputComponent.prototype.filterFn; /** * Display function. Accepts an object of the same type as the * items passed to dropdownValues as argument, and outputs a string. * An arrow function can be used to access the *this* keyword in the calling component. * See multi input examples for details. * @type {?} */ MultiInputComponent.prototype.displayFn; /** * Aria label for the multi input body. * @type {?} */ MultiInputComponent.prototype.multiInputBodyLabel; /** * Event emitted when the search term changes. Use *$event* to access the new term. * @type {?} */ MultiInputComponent.prototype.searchTermChange; /** * Event emitted when the selected items change. Use *$event* to access the new selected array. * @type {?} */ MultiInputComponent.prototype.selectedChange; /** * @hidden * @type {?} */ MultiInputComponent.prototype.displayedValues; /** * @hidden * @type {?} */ MultiInputComponent.prototype.isOpen; /** * @hidden * @type {?} */ MultiInputComponent.prototype.onChange; /** * @hidden * @type {?} */ MultiInputComponent.prototype.onTouched; /** * @type {?} * @private */ MultiInputComponent.prototype.elRef; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibXVsdGktaW5wdXQuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6Im5nOi8vZnVuZGFtZW50YWwtbmd4LyIsInNvdXJjZXMiOlsibGliL211bHRpLWlucHV0L211bHRpLWlucHV0LmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7O0FBQUEsT0FBTyxFQUNILFNBQVMsRUFDVCxVQUFVLEVBQ1YsWUFBWSxFQUNaLFVBQVUsRUFDVixXQUFXLEVBQ1gsWUFBWSxFQUNaLEtBQUssRUFHTCxNQUFNLEVBRU4sU0FBUyxFQUNULGlCQUFpQixFQUNwQixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQXdCLGlCQUFpQixFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDekUsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sOEJBQThCLENBQUM7Ozs7Ozs7QUF5QmhFLE1BQU0sT0FBTyxtQkFBbUI7Ozs7O0lBb0Y1QixZQUFvQixLQUFpQjtRQUFqQixVQUFLLEdBQUwsS0FBSyxDQUFZOzs7O1FBNUVyQyxvQkFBZSxHQUFHLElBQUksQ0FBQzs7OztRQUl2QixnQkFBVyxHQUFXLEVBQUUsQ0FBQzs7OztRQUl6QixhQUFRLEdBQVksS0FBSyxDQUFDOzs7O1FBSTFCLFlBQU8sR0FBWSxLQUFLLENBQUM7Ozs7UUFJekIsY0FBUyxHQUFXLE9BQU8sQ0FBQzs7OztRQUk1QixVQUFLLEdBQVcsdUJBQXVCLENBQUM7Ozs7UUFJeEMsbUJBQWMsR0FBVSxFQUFFLENBQUM7Ozs7UUFRM0IsY0FBUyxHQUFZLElBQUksQ0FBQzs7OztRQUkxQixhQUFRLEdBQVUsRUFBRSxDQUFDOzs7Ozs7UUFNckIsYUFBUSxHQUFhLElBQUksQ0FBQyxhQUFhLENBQUM7Ozs7Ozs7UUFPeEMsY0FBUyxHQUFhLElBQUksQ0FBQyxjQUFjLENBQUM7Ozs7UUFJMUMsd0JBQW1CLEdBQVcsa0JBQWtCLENBQUM7Ozs7UUFJeEMscUJBQWdCLEdBQXlCLElBQUksWUFBWSxFQUFVLENBQUM7Ozs7UUFJ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TUFBTTs2QkFJTixNQUFNOzJCQStGTixZQUFZLFNBQUMsZ0JBQWdCLEVBQUUsQ0FBQyxRQUFRLENBQUM7Ozs7Ozs7SUFoSzFDLHlDQUM2Qjs7Ozs7SUFHN0IsOENBQ3VCOzs7OztJQUd2QiwwQ0FDeUI7Ozs7O0lBR3pCLHVDQUMwQjs7Ozs7SUFHMUIsc0NBQ3lCOzs7OztJQUd6Qix3Q0FDNEI7Ozs7O0lBRzVCLG9DQUN3Qzs7Ozs7SUFHeEMsNkNBQzJCOzs7OztJQUczQix5Q0FDbUI7Ozs7O0lBR25CLHdDQUMwQjs7Ozs7SUFHMUIsdUNBQ3FCOzs7Ozs7O0lBS3JCLHVDQUN3Qzs7Ozs7Ozs7SUFNeEMsd0NBQzBDOzs7OztJQUcxQyxrREFDaUQ7Ozs7O0lBR2pELCtDQUM2RTs7Ozs7SUFHN0UsNkNBQ3lFOzs7OztJQUd6RSw4Q0FBNEI7Ozs7O0lBRzVCLHFDQUFlOzs7OztJQUdmLHVDQUE4Qjs7Ozs7SUFHOUIsd0NBQStCOzs7OztJQUduQixvQ0FBeUIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICAgIENvbXBvbmVudCxcbiAgICBFbGVtZW50UmVmLFxuICAgIEV2ZW50RW1pdHRlcixcbiAgICBmb3J3YXJkUmVmLFxuICAgIEhvc3RCaW5kaW5nLFxuICAgIEhvc3RMaXN0ZW5lcixcbiAgICBJbnB1dCxcbiAgICBPbkNoYW5nZXMsXG4gICAgT25Jbml0LFxuICAgIE91dHB1dCxcbiAgICBTaW1wbGVDaGFuZ2VzLFxuICAgIFZpZXdDaGlsZCxcbiAgICBWaWV3RW5jYXBzdWxhdGlvblxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IENvbnRyb2xWYWx1ZUFjY2Vzc29yLCBOR19WQUxVRV9BQ0NFU1NPUiB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7IFBvcG92ZXJDb21wb25lbnQgfSBmcm9tICcuLi9wb3BvdmVyL3BvcG92ZXIuY29tcG9uZW50JztcblxuLyoqXG4gKiBJbnB1dCBmaWVsZCB3aXRoIG11bHRpcGxlIHNlbGVjdGlvbiBlbmFibGVkLiBTaG91bGQgYmUgdXNlZCB3aGVuIGEgdXNlciBjYW4gc2VsZWN0IGJldHdlZW4gYVxuICogbGltaXRlZCBudW1iZXIgb2YgcHJlLWRlZmluZWQgb3B0aW9ucyB3aXRoIGEgZmlsdGVyLWVuYWJsZWQgY29udGV4dC5cbiAqXG4gKiBTdXBwb3J0cyBBbmd1bGFyIEZvcm1zLlxuICovXG5AQ29tcG9uZW50KHtcbiAgICBzZWxlY3RvcjogJ2ZkLW11bHRpLWlucHV0JyxcbiAgICB0ZW1wbGF0ZVVybDogJy4vbXVsdGktaW5wdXQuY29tcG9uZW50Lmh0bWwnLFxuICAgIHN0eWxlVXJsczogWycuL211bHRpLWlucHV0LmNvbXBvbmVudC5zY3NzJ10sXG4gICAgaG9zdDoge1xuICAgICAgICAnKGJsdXIpJzogJ29uVG91Y2hlZCgpJyxcbiAgICAgICAgJ1tjbGFzcy5mZC1tdWx0aS1pbnB1dC1jdXN0b21dJzogJ3RydWUnXG4gICAgfSxcbiAgICBwcm92aWRlcnM6IFtcbiAgICAgICAge1xuICAgICAgICAgICAgcHJvdmlkZTogTkdfVkFMVUVfQUNDRVNTT1IsXG4gICAgICAgICAgICB1c2VFeGlzdGluZzogZm9yd2FyZFJlZigoKSA9PiBNdWx0aUlucHV0Q29tcG9uZW50KSxcbiAgICAgICAgICAgIG11bHRpOiB0cnVlXG4gICAgICAgIH1cbiAgICBdLFxuICAgIGVuY2Fwc3VsYXRpb246IFZpZXdFbmNhcHN1bGF0aW9uLk5vbmVcbn0pXG5leHBvcnQgY2xhc3MgTXVsdGlJbnB1dENvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgQ29udHJvbFZhbHVlQWNjZXNzb3IsIE9uQ2hhbmdlcyB7XG5cbiAgICAvKiogQGhpZGRlbiAqL1xuICAgIEBWaWV3Q2hpbGQoUG9wb3ZlckNvbXBvbmVudClcbiAgICBwb3BvdmVyUmVmOiBQb3BvdmVyQ29tcG9uZW50O1xuXG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICBASG9zdEJpbmRpbmcoJ2NsYXNzLmZkLW11bHRpLWlucHV0JylcbiAgICBtdWx0aUlucHV0Q2xhc3MgPSB0cnVlO1xuXG4gICAgLyoqIFBsYWNlaG9sZGVyIGZvciB0aGUgaW5wdXQgZmllbGQuICovXG4gICAgQElucHV0KClcbiAgICBwbGFjZWhvbGRlcjogc3RyaW5nID0gJyc7XG5cbiAgICAvKiogV2hldGhlciB0aGUgaW5wdXQgaXMgZGlzYWJsZWQuICovXG4gICAgQElucHV0KClcbiAgICBkaXNhYmxlZDogYm9vbGVhbiA9IGZhbHNlO1xuXG4gICAgLyoqIFdoZXRoZXIgdGhlIGlucHV0IGlzIGluIGNvbXBhY3QgbW9kZS4gKi9cbiAgICBASW5wdXQoKVxuICAgIGNvbXBhY3Q6IGJvb2xlYW4gPSBmYWxzZTtcblxuICAgIC8qKiBNYXggaGVpZ2h0IG9mIHRoZSBwb3BvdmVyLiBBbnkgb3ZlcmZsb3dpbmcgZWxlbWVudHMgd2lsbCBiZSBhY2Nlc3NpYmxlIHRocm91Z2ggc2Nyb2xsaW5nLiAqL1xuICAgIEBJbnB1dCgpXG4gICAgbWF4SGVpZ2h0OiBzdHJpbmcgPSAnMzAwcHgnO1xuXG4gICAgLyoqIEljb24gb2YgdGhlIGJ1dHRvbiBvbiB0aGUgcmlnaHQgb2YgdGhlIGlucHV0IGZpZWxkLiAqL1xuICAgIEBJbnB1dCgpXG4gICAgZ2x5cGg6IHN0cmluZyA9ICduYXZpZ2F0aW9uLWRvd24tYXJyb3cnO1xuXG4gICAgLyoqIFZhbHVlcyB0byBiZSBkaXNwbGF5ZWQgaW4gdGhlIHVuZmlsdGVyZWQgZHJvcGRvd24uICovXG4gICAgQElucHV0KClcbiAgICBkcm9wZG93blZhbHVlczogYW55W10gPSBbXTtcblxuICAgIC8qKiBTZWFyY2ggdGVybSwgb3IgbW9yZSBzcGVjaWZpY2FsbHkgdGhlIHZhbHVlIG9mIHRoZSBpbm5lciBpbnB1dCBmaWVsZC4gKi9cbiAgICBASW5wdXQoKVxuICAgIHNlYXJjaFRlcm06IHN0cmluZztcblxuICAgIC8qKiBXaGV0aGVyIHRoZSBzZWFyY2ggdGVybSBzaG91bGQgYmUgaGlnaGxpZ2h0ZWQgaW4gcmVzdWx0cy4gKi9cbiAgICBASW5wdXQoKVxuICAgIGhpZ2hsaWdodDogYm9vbGVhbiA9IHRydWU7XG5cbiAgICAvKiogU2VsZWN0ZWQgZHJvcGRvd24gaXRlbXMuICovXG4gICAgQElucHV0KClcbiAgICBzZWxlY3RlZDogYW55W10gPSBbXTtcblxuICAgIC8qKiBGaWx0ZXIgZnVuY3Rpb24uIEFjY2VwdHMgYW4gYXJyYXkgYW5kIGEgc3RyaW5nIGFzIGFyZ3VtZW50cywgYW5kIG91dHB1dHMgYW4gYXJyYXkuXG4gICAgICogQW4gYXJyb3cgZnVuY3Rpb24gY2FuIGJlIHVzZWQgdG8gYWNjZXNzIHRoZSAqdGhpcyoga2V5d29yZCBpbiB0aGUgY2FsbGluZyBjb21wb25lbnQuXG4gICAgICogU2VlIG11bHRpIGlucHV0IGV4YW1wbGVzIGZvciBkZXRhaWxzLiAqL1xuICAgIEBJbnB1dCgpXG4gICAgZmlsdGVyRm46IEZ1bmN0aW9uID0gdGhpcy5kZWZhdWx0RmlsdGVyO1xuXG4gICAgLyoqIERpc3BsYXkgZnVuY3Rpb24uIEFjY2VwdHMgYW4gb2JqZWN0IG9mIHRoZSBzYW1lIHR5cGUgYXMgdGhlXG4gICAgICogaXRlbXMgcGFzc2VkIHRvIGRyb3Bkb3duVmFsdWVzIGFzIGFyZ3VtZW50LCBhbmQgb3V0cHV0cyBhIHN0cmluZy5cbiAgICAgKiBBbiBhcnJvdyBmdW5jdGlvbiBjYW4gYmUgdXNlZCB0byBhY2Nlc3MgdGhlICp0aGlzKiBrZXl3b3JkIGluIHRoZSBjYWxsaW5nIGNvbXBvbmVudC5cbiAgICAgKiBTZWUgbXVsdGkgaW5wdXQgZXhhbXBsZXMgZm9yIGRldGFpbHMuICovXG4gICAgQElucHV0KClcbiAgICBkaXNwbGF5Rm46IEZ1bmN0aW9uID0gdGhpcy5kZWZhdWx0RGlzcGxheTtcblxuICAgIC8qKiBBcmlhIGxhYmVsIGZvciB0aGUgbXVsdGkgaW5wdXQgYm9keS4gKi9cbiAgICBASW5wdXQoKVxuICAgIG11bHRpSW5wdXRCb2R5TGFiZWw6IHN0cmluZyA9ICdNdWx0aSBpbnB1dCBib2R5JztcblxuICAgIC8qKiBFdmVudCBlbWl0dGVkIHdoZW4gdGhlIHNlYXJjaCB0ZXJtIGNoYW5nZXMuIFVzZSAqJGV2ZW50KiB0byBhY2Nlc3MgdGhlIG5ldyB0ZXJtLiAqL1xuICAgIEBPdXRwdXQoKVxuICAgIHJlYWRvbmx5IHNlYXJjaFRlcm1DaGFuZ2U6IEV2ZW50RW1pdHRlcjxzdHJpbmc+ID0gbmV3IEV2ZW50RW1pdHRlcjxzdHJpbmc+KCk7XG5cbiAgICAvKiogRXZlbnQgZW1pdHRlZCB3aGVuIHRoZSBzZWxlY3RlZCBpdGVtcyBjaGFuZ2UuIFVzZSAqJGV2ZW50KiB0byBhY2Nlc3MgdGhlIG5ldyBzZWxlY3RlZCBhcnJheS4gKi9cbiAgICBAT3V0cHV0KClcbiAgICByZWFkb25seSBzZWxlY3RlZENoYW5nZTogRXZlbnRFbWl0dGVyPGFueVtdPiA9IG5ldyBFdmVudEVtaXR0ZXI8YW55W10+KCk7XG5cbiAgICAvKiogQGhpZGRlbiAqL1xuICAgIGRpc3BsYXllZFZhbHVlczogYW55W10gPSBbXTtcblxuICAgIC8qKiBAaGlkZGVuICovXG4gICAgaXNPcGVuID0gZmFsc2U7XG5cbiAgICAvKiogQGhpZGRlbiAqL1xuICAgIG9uQ2hhbmdlOiBGdW5jdGlvbiA9ICgpID0+IHt9O1xuXG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICBvblRvdWNoZWQ6IEZ1bmN0aW9uID0gKCkgPT4ge307XG5cbiAgICAvKiogQGhpZGRlbiAqL1xuICAgIGNvbnN0cnVjdG9yKHByaXZhdGUgZWxSZWY6IEVsZW1lbnRSZWYpIHt9XG5cbiAgICAvKiogQGhpZGRlbiAqL1xuICAgIG5nT25Jbml0KCkge1xuICAgICAgICBpZiAodGhpcy5kcm9wZG93blZhbHVlcykge1xuICAgICAgICAgICAgdGhpcy5kaXNwbGF5ZWRWYWx1ZXMgPSB0aGlzLmRyb3Bkb3duVmFsdWVzO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKSB7XG4gICAgICAgIGlmICh0aGlzLmRyb3Bkb3duVmFsdWVzICYmIChjaGFuZ2VzLmRyb3Bkb3duVmFsdWVzIHx8IGNoYW5nZXMuc2VhcmNoVGVybSkpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLnNlYXJjaFRlcm0pIHtcbiAgICAgICAgICAgICAgICB0aGlzLmRpc3BsYXllZFZhbHVlcyA9IHRoaXMuZmlsdGVyRm4odGhpcy5kcm9wZG93blZhbHVlcywgdGhpcy5zZWFyY2hUZXJtKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy5kaXNwbGF5ZWRWYWx1ZXMgPSAgdGhpcy5kcm9wZG93blZhbHVlcztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKiBAaGlkZGVuICovXG4gICAgcmVnaXN0ZXJPbkNoYW5nZShmbjogYW55KTogdm9pZCB7XG4gICAgICAgIHRoaXMub25DaGFuZ2UgPSBmbjtcbiAgICB9XG5cbiAgICAvKiogQGhpZGRlbiAqL1xuICAgIHJlZ2lzdGVyT25Ub3VjaGVkKGZuOiBhbnkpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5vblRvdWNoZWQgPSBmbjtcbiAgICB9XG5cbiAgICAvKiogQGhpZGRlbiAqL1xuICAgIHNldERpc2FibGVkU3RhdGUoaXNEaXNhYmxlZDogYm9vbGVhbik6IHZvaWQge1xuICAgICAgICB0aGlzLmRpc2FibGVkID0gaXNEaXNhYmxlZDtcbiAgICB9XG5cbiAgICAvKiogQGhpZGRlbiAqL1xuICAgIHdyaXRlVmFsdWUoc2VsZWN0ZWQ6IGFueVtdKTogdm9pZCB7XG4gICAgICAgIHRoaXMuc2VsZWN0ZWQgPSBzZWxlY3RlZDtcbiAgICB9XG5cbiAgICAvKiogQGhpZGRlbiAqL1xuICAgIGhhbmRsZVNlbGVjdChjaGVja2VkOiBhbnksIHZhbHVlOiBhbnkpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgcHJldmlvdXNMZW5ndGggPSB0aGlzLnNlbGVjdGVkLmxlbmd0aDtcbiAgICAgICAgaWYgKGNoZWNrZWQpIHtcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWQucHVzaCh2YWx1ZSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLnNlbGVjdGVkLnNwbGljZSh0aGlzLnNlbGVjdGVkLmluZGV4T2YodmFsdWUpLCAxKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEhhbmRsZSBwb3BvdmVyIHBsYWNlbWVudCB1cGRhdGVcbiAgICAgICAgaWYgKChwcmV2aW91c0xlbmd0aCA9PT0gMCAmJiB0aGlzLnNlbGVjdGVkLmxlbmd0aCA9PT0gMSkgfHxcbiAgICAgICAgICAgIChwcmV2aW91c0xlbmd0aCA9PT0gMSAmJiB0aGlzLnNlbGVjdGVkLmxlbmd0aCA9PT0gMCkpIHtcbiAgICAgICAgICAgIHRoaXMucG9wb3ZlclJlZi51cGRhdGVQb3BvdmVyKCk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLm9uQ2hhbmdlKHRoaXMuc2VsZWN0ZWQpO1xuICAgICAgICB0aGlzLnNlbGVjdGVkQ2hhbmdlLmVtaXQodGhpcy5zZWxlY3RlZCk7XG4gICAgfVxuXG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICBoYW5kbGVTZWFyY2hUZXJtQ2hhbmdlKCk6IHZvaWQge1xuICAgICAgICB0aGlzLnNlYXJjaFRlcm1DaGFuZ2UuZW1pdCh0aGlzLnNlYXJjaFRlcm0pO1xuICAgICAgICB0aGlzLmRpc3BsYXllZFZhbHVlcyA9IHRoaXMuZmlsdGVyRm4odGhpcy5kcm9wZG93blZhbHVlcywgdGhpcy5zZWFyY2hUZXJtKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGRlZmF1bHRGaWx0ZXIoY29udGVudEFycmF5OiBhbnlbXSwgc2VhcmNoVGVybTogc3RyaW5nKTogYW55W10ge1xuICAgICAgICBjb25zdCBzZWFyY2hMb3dlciA9IHNlYXJjaFRlcm0udG9Mb2NhbGVMb3dlckNhc2UoKTtcbiAgICAgICAgcmV0dXJuIGNvbnRlbnRBcnJheS5maWx0ZXIoaXRlbSA9PiB7XG4gICAgICAgICAgICBpZiAoaXRlbSkge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmRpc3BsYXlGbihpdGVtKS50b0xvY2FsZUxvd2VyQ2FzZSgpLmluY2x1ZGVzKHNlYXJjaExvd2VyKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBkZWZhdWx0RGlzcGxheShzdHI6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiBzdHI7XG4gICAgfVxuXG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICBASG9zdExpc3RlbmVyKCdkb2N1bWVudDpjbGljaycsIFsnJGV2ZW50J10pXG4gICAgY2xpY2tIYW5kbGVyKGV2ZW50KSB7XG4gICAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICBpZiAoIXRoaXMuZWxSZWYubmF0aXZlRWxlbWVudC5jb250YWlucyhldmVudC50YXJnZXQpKSB7XG4gICAgICAgICAgICB0aGlzLmlzT3BlbiA9IGZhbHNlO1xuICAgICAgICB9XG4gICAgfVxuXG59XG4iXX0=