UNPKG

@stratio/egeo

Version:
495 lines 39.5 kB
/** * @fileoverview added by tsickle * Generated from: lib/st-search/st-search.component.ts * @suppress {checkTypes,constantProperty,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc */ /* * © 2017 Stratio Big Data Inc., Sucursal en España. * * This software is licensed under the Apache License, Version 2.0. * This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * See the terms of the License for more details. * * SPDX-License-Identifier: Apache-2.0. */ import { ChangeDetectionStrategy, ChangeDetectorRef, Component, ElementRef, EventEmitter, Input, Output, Renderer2, ViewChild } from '@angular/core'; import { FormControl } from '@angular/forms'; import { EventWindowManager } from '../utils/event-window-manager'; import { debounceTime } from 'rxjs/operators'; import { StSearchEventOrigin } from './st-search.model'; /** * \@description {Component} [Search] * * The search component has been designed to allow user to find a specific content according to his needs. * * \@example * * {html} * * ``` * Search without filters * <st-search [placeholder]="placeholder" [qaTag]="qaTag" * [value]="searched" [debounce]="debounceTime" [minLength]="minLength" * (search)="onSearchResult($event)"></st-search> * * * Search with filters * <st-search [placeholder]="placeholder" [qaTag]="qaTag" * [value]="searched" [debounce]="debounceTime" [minLength]="minLength" [filterOptions]="[ * { label: 'All', value: 1 }, * { label: 'Type ', value: 2 }, * { label: 'Color', value: 3 } * ]" (search)="onSearchResult($event)"></st-search> * ``` * */ export class StSearchComponent extends EventWindowManager { /** * @param {?} _render * @param {?} cd * @param {?} buttonElement */ constructor(_render, cd, buttonElement) { super(_render, cd, buttonElement); this._render = _render; this.cd = cd; this.buttonElement = buttonElement; /** * \@Input {number} [debounce=0] Time elapsed in milliseconds before displaying the autocomplete list */ this.debounce = 0; /** * \@Input {boolean} [liveSearch=true] Boolean to enable or disable the automatic search while the user is typing */ this.liveSearch = true; /** * \@Input {number} [minLength=0] Minimum of characters typed by the user before launching the search */ this.minLength = 0; /** * \@Input {string} [placeholder='Search'] Text displayed in the search input */ this.placeholder = 'Search'; /** * \@Input {boolean} [disabled=false] Boolean to enable or disable the search */ this.disabled = false; /** * \@Input {boolean} [withAutocomplete=false] Enable or disable the autocomplete list when user is typing */ this.withAutocomplete = false; /** * \@Input {StDropDownMenuItem[]} [autocompleteList=''] List of items displayed in the autocomplete list when user is typing */ this.autocompleteList = []; /** * \@Input {boolean} [showIcon=true] Boolean to hide/show the loupe icon */ this.showIcon = true; /** * \@Input {string} [emptyAutocompleteListMessage=''] Message displayed when the autocomplete list is enabled but * there are not any item with the typed text */ this.emptyAutocompleteListMessage = ''; /** * \@Output { Object(filter?: string, text: string)} [search=''] Event emitted when search is launched. It contains * the text typed by the user and the filter value selected (only if filter is displayed) */ this.search = new EventEmitter(); /** * \@Output {any} [value=''] Event emitted when filter is changed. It contains * the filter value selected */ this.selectFilter = new EventEmitter(); /** * \@Input {boolean} [keyBoardMove=false] It is needed to activate navigation through options using the keyboard */ this.keyBoardMove = false; this.searchBox = new FormControl(); this.subscriptionSearch = undefined; this.subscriptionSearchClearButton = undefined; this.lastEmittedText = undefined; } /** * @return {?} */ get menuId() { return this.qaTag ? this.qaTag + '-autocomplete-menu' : null; } /** * @return {?} */ ngOnInit() { if (this.value) { this.searchBox.setValue(this.value); } // Show clear button if have text this.subscriptionSearchClearButton = this.searchBox.valueChanges.subscribe((/** * @param {?} val * @return {?} */ (val) => this.showClear = (val && val.length > 0))); this.checkDisabled(); this.manageSubscription(); if (this.filterOptions) { this.filter = this.filterOptions[0].value; } } /** * @param {?} changes * @return {?} */ ngOnChanges(changes) { this.checkDebounceChange(changes); this.checkValueChange(changes); this.checkDisableChange(changes); this.checkAutoCompleteMenuChange(changes); } /** * @param {?} value * @return {?} */ onChangeFilter(value) { this.selectFilter.emit(value); this.emitValue(false, StSearchEventOrigin.FILTER); } /** * @return {?} */ ngOnDestroy() { if (this.subscriptionSearch !== undefined) { this.subscriptionSearch.unsubscribe(); } if (this.subscriptionSearchClearButton !== undefined) { this.subscriptionSearchClearButton.unsubscribe(); } this.closeElement(); } /** * @param {?} force * @param {?} origin * @return {?} */ launchSearch(force, origin) { if (this.canSearch()) { this.showAutoCompleteMenu(); this.emitValue(force, origin); } else { this.closeElement(); } } /** * @param {?} event * @return {?} */ onKeyPress(event) { /** @type {?} */ let key = event.keyCode || event.which; if (key === 13) { this.launchSearch(true, StSearchEventOrigin.ENTER); } } /** * @param {?} item * @return {?} */ changeOption(item) { if (item && item.label) { this.subscriptionSearch.unsubscribe(); this.searchBox.setValue(item.value); this.cd.markForCheck(); this.closeElement(); this.emitValue(true, StSearchEventOrigin.LIST); this.manageSubscription(); } } /** * @return {?} */ clearInput() { this.searchBox.setValue(''); this.closeElement(); this.emitValue(true, StSearchEventOrigin.INPUT); } /** * @return {?} */ showAutoCompleteMenu() { if (this.withAutocomplete && !this.isActive) { this.openElement(); } if (this.searchBox.value === '') { this.closeElement(); } this.cd.markForCheck(); } /** * @private * @param {?} force * @param {?} origin * @return {?} */ emitValue(force, origin) { if (this.isEqualPrevious(force)) { this.lastEmittedText = this.searchBox.value; /** @type {?} */ let newSearch = { text: this.lastEmittedText || '', origin: origin }; if (this.filter) { newSearch.filter = this.filter; } this.search.emit(newSearch); } } /** * @private * @return {?} */ checkDisabled() { if (this.disabled) { this.searchBox.disable(); } else { this.searchBox.enable(); } } /** * @private * @return {?} */ canSearch() { return this.isDefined() && !this.disabled && this.checkMins(); } /** * @private * @return {?} */ isDefined() { return this.searchBox && this.searchBox.value !== null && this.searchBox.value !== undefined; } /** * @private * @return {?} */ checkMins() { return this.minLength <= (this.searchBox && this.searchBox.value && this.searchBox.value.length) || this.searchBox.value.trim().length === 0; } /** * @private * @param {?} force * @return {?} */ isEqualPrevious(force) { return this.lastEmittedText !== this.searchBox.value || force; } /** * @private * @param {?} changes * @return {?} */ checkValueChange(changes) { if (changes && changes.value) { if (this.subscriptionSearch) { this.subscriptionSearch.unsubscribe(); } this.searchBox.setValue(changes.value.currentValue); this.manageSubscription(); } } /** * @private * @param {?} changes * @return {?} */ checkDebounceChange(changes) { if (changes && changes.debounce) { this.manageSubscription(); } } /** * @private * @param {?} changes * @return {?} */ checkDisableChange(changes) { if (changes && changes.disabled) { this.checkDisabled(); } } /** * @private * @param {?} changes * @return {?} */ checkAutoCompleteMenuChange(changes) { if (changes && changes.autocompleteList) { this.cd.markForCheck(); } } /** * @private * @return {?} */ manageSubscription() { if (this.subscriptionSearch !== undefined) { this.subscriptionSearch.unsubscribe(); } if (this.liveSearch) { this.subscriptionSearch = this.searchBox .valueChanges.pipe(debounceTime(this.debounce)) .subscribe((/** * @param {?} event * @return {?} */ (event) => this.launchSearch(false, StSearchEventOrigin.INPUT))); } } } StSearchComponent.decorators = [ { type: Component, args: [{ selector: 'st-search', template: "<!--\n\n \u00A9 2017 Stratio Big Data Inc., Sucursal en Espa\u00F1a.\n\n This software is licensed under the Apache License, Version 2.0.\n This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;\n without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n See the terms of the License for more details.\n\n SPDX-License-Identifier: Apache-2.0.\n\n-->\n<div class=\"st-search sth-search\">\n <st-select\n *ngIf=\"filterOptions && filterOptions.length > 0\"\n [options]=\"filterOptions\"\n [(ngModel)]=\"filter\"\n [disabled]=\"disabled\"\n name=\"search-filter\"\n (select)=\"onChangeFilter($event)\"\n class=\"sth-search-filter st-search-filter\"\n [ngClass]=\"{'disabled': disabled}\"\n ></st-select>\n\n <st-dropdown-menu [items]=\"autocompleteList\" [attr.id]=\"menuId\" class=\"st-search-box\" (change)=\"changeOption($event)\"\n [active]=\"isActive && (autocompleteList && autocompleteList.length || emptyAutocompleteListMessage !== '')\"\n [placement]=\"'bottom-start'\" [emptyListMessage]=\"emptyAutocompleteListMessage\"\n [keyBoardMove]=\"keyBoardMove\">\n <div #buttonId>\n <input [attr.id]=\"qaTag\" [formControl]=\"searchBox\" [placeholder]=\"placeholder\" (keypress)=\"onKeyPress($event)\"\n (focus)=\"showAutoCompleteMenu()\"\n class=\"st-search-input sth-search-input\"/>\n <i class=\"st-search-icon sth-search-icon icon-search\" tabindex=\"0\" *ngIf=\"!showClear && showIcon\"></i>\n <i class=\"st-search-icon sth-search-icon icon-cross\" tabindex=\"0\" *ngIf=\"showClear\" (mousedown)=\"clearInput()\"\n (keyup.enter)=\"clearInput()\"></i>\n </div>\n </st-dropdown-menu>\n\n</div>\n", changeDetection: ChangeDetectionStrategy.OnPush, styles: ["@charset \"UTF-8\";input{outline:0;border:none;padding:0;height:40px}.st-search{position:relative;display:flex;min-width:100%}.st-search :invalid{box-shadow:none}.st-search-box{display:flex;flex:2 0}.st-search-input{padding-left:12px;padding-right:40px;width:100%}.st-search-filter{flex:auto 1;height:40px;padding:0;max-width:37%}.st-search-icon{position:absolute;right:10px;top:13px;cursor:pointer}.st-search-icon:focus{outline:0}"] }] } ]; /** @nocollapse */ StSearchComponent.ctorParameters = () => [ { type: Renderer2 }, { type: ChangeDetectorRef }, { type: ElementRef, decorators: [{ type: ViewChild, args: ['buttonId', { static: false },] }] } ]; StSearchComponent.propDecorators = { debounce: [{ type: Input }], liveSearch: [{ type: Input }], minLength: [{ type: Input }], placeholder: [{ type: Input }], qaTag: [{ type: Input }], value: [{ type: Input }], disabled: [{ type: Input }], withAutocomplete: [{ type: Input }], autocompleteList: [{ type: Input }], showIcon: [{ type: Input }], emptyAutocompleteListMessage: [{ type: Input }], filterOptions: [{ type: Input }], search: [{ type: Output }], selectFilter: [{ type: Output }], keyBoardMove: [{ type: Input }] }; if (false) { /** * \@Input {number} [debounce=0] Time elapsed in milliseconds before displaying the autocomplete list * @type {?} */ StSearchComponent.prototype.debounce; /** * \@Input {boolean} [liveSearch=true] Boolean to enable or disable the automatic search while the user is typing * @type {?} */ StSearchComponent.prototype.liveSearch; /** * \@Input {number} [minLength=0] Minimum of characters typed by the user before launching the search * @type {?} */ StSearchComponent.prototype.minLength; /** * \@Input {string} [placeholder='Search'] Text displayed in the search input * @type {?} */ StSearchComponent.prototype.placeholder; /** * \@Input {string} [qaTag=''] Label used as id * @type {?} */ StSearchComponent.prototype.qaTag; /** * \@Input {string} [value=''] Initial value of the search text * @type {?} */ StSearchComponent.prototype.value; /** * \@Input {boolean} [disabled=false] Boolean to enable or disable the search * @type {?} */ StSearchComponent.prototype.disabled; /** * \@Input {boolean} [withAutocomplete=false] Enable or disable the autocomplete list when user is typing * @type {?} */ StSearchComponent.prototype.withAutocomplete; /** * \@Input {StDropDownMenuItem[]} [autocompleteList=''] List of items displayed in the autocomplete list when user is typing * @type {?} */ StSearchComponent.prototype.autocompleteList; /** * \@Input {boolean} [showIcon=true] Boolean to hide/show the loupe icon * @type {?} */ StSearchComponent.prototype.showIcon; /** * \@Input {string} [emptyAutocompleteListMessage=''] Message displayed when the autocomplete list is enabled but * there are not any item with the typed text * @type {?} */ StSearchComponent.prototype.emptyAutocompleteListMessage; /** * \@Input {StDropDownMenuItem[]} [filterOptions=''] Options displayed at the filter select. If it is not introduced, * filter will not be displayed * @type {?} */ StSearchComponent.prototype.filterOptions; /** * \@Output { Object(filter?: string, text: string)} [search=''] Event emitted when search is launched. It contains * the text typed by the user and the filter value selected (only if filter is displayed) * @type {?} */ StSearchComponent.prototype.search; /** * \@Output {any} [value=''] Event emitted when filter is changed. It contains * the filter value selected * @type {?} */ StSearchComponent.prototype.selectFilter; /** * \@Input {boolean} [keyBoardMove=false] It is needed to activate navigation through options using the keyboard * @type {?} */ StSearchComponent.prototype.keyBoardMove; /** @type {?} */ StSearchComponent.prototype.searchBox; /** @type {?} */ StSearchComponent.prototype.showClear; /** @type {?} */ StSearchComponent.prototype.filter; /** * @type {?} * @private */ StSearchComponent.prototype.subscriptionSearch; /** * @type {?} * @private */ StSearchComponent.prototype.subscriptionSearchClearButton; /** * @type {?} * @private */ StSearchComponent.prototype.lastEmittedText; /** * @type {?} * @private */ StSearchComponent.prototype._render; /** * @type {?} * @private */ StSearchComponent.prototype.cd; /** @type {?} */ StSearchComponent.prototype.buttonElement; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3Qtc2VhcmNoLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiJuZzovL0BzdHJhdGlvL2VnZW8vIiwic291cmNlcyI6WyJsaWIvc3Qtc2VhcmNoL3N0LXNlYXJjaC5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7O0FBVUEsT0FBTyxFQUNKLHVCQUF1QixFQUN2QixpQkFBaUIsRUFDakIsU0FBUyxFQUNULFVBQVUsRUFDVixZQUFZLEVBQ1osS0FBSyxFQUlMLE1BQU0sRUFDTixTQUFTLEVBRVQsU0FBUyxFQUNYLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUk3QyxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSwrQkFBK0IsQ0FBQztBQUNuRSxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDOUMsT0FBTyxFQUFpQixtQkFBbUIsRUFBRSxNQUFNLG1CQUFtQixDQUFDOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFrQ3ZFLE1BQU0sT0FBTyxpQkFBa0IsU0FBUSxrQkFBa0I7Ozs7OztJQStEdEQsWUFBb0IsT0FBa0IsRUFDbEIsRUFBcUIsRUFDa0IsYUFBeUI7UUFDakYsS0FBSyxDQUFDLE9BQU8sRUFBRSxFQUFFLEVBQUUsYUFBYSxDQUFDLENBQUM7UUFIakIsWUFBTyxHQUFQLE9BQU8sQ0FBVztRQUNsQixPQUFFLEdBQUYsRUFBRSxDQUFtQjtRQUNrQixrQkFBYSxHQUFiLGFBQWEsQ0FBWTs7OztRQS9EM0UsYUFBUSxHQUFXLENBQUMsQ0FBQzs7OztRQUdyQixlQUFVLEdBQVksSUFBSSxDQUFDOzs7O1FBRzNCLGNBQVMsR0FBVyxDQUFDLENBQUM7Ozs7UUFHdEIsZ0JBQVcsR0FBVyxRQUFRLENBQUM7Ozs7UUFTL0IsYUFBUSxHQUFZLEtBQUssQ0FBQzs7OztRQUcxQixxQkFBZ0IsR0FBWSxLQUFLLENBQUM7Ozs7UUFHbEMs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OztJQUV2QyxzQ0FBa0Q7O0lBQ2xELHNDQUEwQjs7SUFDMUIsbUNBQXNCOzs7OztJQUV0QiwrQ0FBaUU7Ozs7O0lBQ2pFLDBEQUE0RTs7Ozs7SUFDNUUsNENBQXdEOzs7OztJQUU1QyxvQ0FBMEI7Ozs7O0lBQzFCLCtCQUE2Qjs7SUFDN0IsMENBQXdFIiwic291cmNlc0NvbnRlbnQiOlsiLypcbiAqIMKpIDIwMTcgU3RyYXRpbyBCaWcgRGF0YSBJbmMuLCBTdWN1cnNhbCBlbiBFc3Bhw7FhLlxuICpcbiAqIFRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMC5cbiAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7XG4gKiB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLlxuICogU2VlIHRoZSB0ZXJtcyBvZiB0aGUgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLlxuICpcbiAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wLlxuICovXG5pbXBvcnQge1xuICAgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksXG4gICBDaGFuZ2VEZXRlY3RvclJlZixcbiAgIENvbXBvbmVudCxcbiAgIEVsZW1lbnRSZWYsXG4gICBFdmVudEVtaXR0ZXIsXG4gICBJbnB1dCxcbiAgIE9uQ2hhbmdlcyxcbiAgIE9uRGVzdHJveSxcbiAgIE9uSW5pdCxcbiAgIE91dHB1dCxcbiAgIFJlbmRlcmVyMixcbiAgIFNpbXBsZUNoYW5nZXMsXG4gICBWaWV3Q2hpbGRcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBGb3JtQ29udHJvbCB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7IFN1YnNjcmlwdGlvbiB9IGZyb20gJ3J4anMnO1xuXG5pbXBvcnQgeyBTdERyb3BEb3duTWVudUl0ZW0gfSBmcm9tICcuLi9zdC1kcm9wZG93bi1tZW51L3N0LWRyb3Bkb3duLW1lbnUuaW50ZXJmYWNlJztcbmltcG9ydCB7IEV2ZW50V2luZG93TWFuYWdlciB9IGZyb20gJy4uL3V0aWxzL2V2ZW50LXdpbmRvdy1tYW5hZ2VyJztcbmltcG9ydCB7IGRlYm91bmNlVGltZSB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcbmltcG9ydCB7IFN0U2VhcmNoRXZlbnQsIFN0U2VhcmNoRXZlbnRPcmlnaW4gfSBmcm9tICcuL3N0LXNlYXJjaC5tb2RlbCc7XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIHtDb21wb25lbnR9IFtTZWFyY2hdXG4gKlxuICogVGhlIHNlYXJjaCBjb21wb25lbnQgaGFzIGJlZW4gZGVzaWduZWQgdG8gYWxsb3cgdXNlciB0byBmaW5kIGEgc3BlY2lmaWMgY29udGVudCBhY2NvcmRpbmcgdG8gaGlzIG5lZWRzLlxuICpcbiAqIEBleGFtcGxlXG4gKlxuICoge2h0bWx9XG4gKlxuICogYGBgXG4gKiBTZWFyY2ggd2l0aG91dCBmaWx0ZXJzXG4gKiAgPHN0LXNlYXJjaCBbcGxhY2Vob2xkZXJdPVwicGxhY2Vob2xkZXJcIiBbcWFUYWddPVwicWFUYWdcIlxuICogIFt2YWx1ZV09XCJzZWFyY2hlZFwiIFtkZWJvdW5jZV09XCJkZWJvdW5jZVRpbWVcIiBbbWluTGVuZ3RoXT1cIm1pbkxlbmd0aFwiXG4gKiAgKHNlYXJjaCk9XCJvblNlYXJjaFJlc3VsdCgkZXZlbnQpXCI+PC9zdC1zZWFyY2g+XG4gKlxuICpcbiAqIFNlYXJjaCB3aXRoIGZpbHRlcnNcbiAqICA8c3Qtc2VhcmNoIFtwbGFjZWhvbGRlcl09XCJwbGFjZWhvbGRlclwiIFtxYVRhZ109XCJxYVRhZ1wiXG4gKiAgW3ZhbHVlXT1cInNlYXJjaGVkXCIgW2RlYm91bmNlXT1cImRlYm91bmNlVGltZVwiIFttaW5MZW5ndGhdPVwibWluTGVuZ3RoXCIgW2ZpbHRlck9wdGlvbnNdPVwiW1xuICogIHsgbGFiZWw6ICdBbGwnLCB2YWx1ZTogMSB9LFxuICogIHsgbGFiZWw6ICdUeXBlICcsIHZhbHVlOiAyIH0sXG4gKiAgeyBsYWJlbDogJ0NvbG9yJywgdmFsdWU6IDMgfVxuICogIF1cIiAoc2VhcmNoKT1cIm9uU2VhcmNoUmVzdWx0KCRldmVudClcIj48L3N0LXNlYXJjaD5cbiAqIGBgYFxuICpcbiAqL1xuQENvbXBvbmVudCh7XG4gICBzZWxlY3RvcjogJ3N0LXNlYXJjaCcsXG4gICB0ZW1wbGF0ZVVybDogJy4vc3Qtc2VhcmNoLmNvbXBvbmVudC5odG1sJyxcbiAgIHN0eWxlVXJsczogWycuL3N0LXNlYXJjaC5jb21wb25lbnQuc2NzcyddLFxuICAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2hcbn0pXG5leHBvcnQgY2xhc3MgU3RTZWFyY2hDb21wb25lbnQgZXh0ZW5kcyBFdmVudFdpbmRvd01hbmFnZXIgaW1wbGVtZW50cyBPbkNoYW5nZXMsIE9uRGVzdHJveSwgT25Jbml0IHtcbiAgIC8qKiBASW5wdXQge251bWJlcn0gW2RlYm91bmNlPTBdIFRpbWUgZWxhcHNlZCBpbiBtaWxsaXNlY29uZHMgYmVmb3JlIGRpc3BsYXlpbmcgdGhlIGF1dG9jb21wbGV0ZSBsaXN0ICovXG4gICBASW5wdXQoKSBkZWJvdW5jZTogbnVtYmVyID0gMDtcblxuICAgLyoqIEBJbnB1dCB7Ym9vbGVhbn0gW2xpdmVTZWFyY2g9dHJ1ZV0gQm9vbGVhbiB0byBlbmFibGUgb3IgZGlzYWJsZSB0aGUgYXV0b21hdGljIHNlYXJjaCB3aGlsZSB0aGUgdXNlciBpcyB0eXBpbmcgKi9cbiAgIEBJbnB1dCgpIGxpdmVTZWFyY2g6IGJvb2xlYW4gPSB0cnVlO1xuXG4gICAvKiogQElucHV0IHtudW1iZXJ9IFttaW5MZW5ndGg9MF0gTWluaW11bSBvZiBjaGFyYWN0ZXJzIHR5cGVkIGJ5IHRoZSB1c2VyIGJlZm9yZSBsYXVuY2hpbmcgdGhlIHNlYXJjaCAqL1xuICAgQElucHV0KCkgbWluTGVuZ3RoOiBudW1iZXIgPSAwO1xuXG4gICAvKiogQElucHV0IHtzdHJpbmd9IFtwbGFjZWhvbGRlcj0nU2VhcmNoJ10gVGV4dCBkaXNwbGF5ZWQgaW4gdGhlIHNlYXJjaCBpbnB1dCAqL1xuICAgQElucHV0KCkgcGxhY2Vob2xkZXI6IHN0cmluZyA9ICdTZWFyY2gnO1xuXG4gICAvKiogQElucHV0IHtzdHJpbmd9IFtxYVRhZz0nJ10gTGFiZWwgdXNlZCBhcyBpZCAqL1xuICAgQElucHV0KCkgcWFUYWc6IHN0cmluZztcblxuICAgLyoqIEBJbnB1dCB7c3RyaW5nfSBbdmFsdWU9JyddIEluaXRpYWwgdmFsdWUgb2YgdGhlIHNlYXJjaCB0ZXh0ICovXG4gICBASW5wdXQoKSB2YWx1ZTogc3RyaW5nO1xuXG4gICAvKiogQElucHV0IHtib29sZWFufSBbZGlzYWJsZWQ9ZmFsc2VdIEJvb2xlYW4gdG8gZW5hYmxlIG9yIGRpc2FibGUgdGhlIHNlYXJjaCAqL1xuICAgQElucHV0KCkgZGlzYWJsZWQ6IGJvb2xlYW4gPSBmYWxzZTtcblxuICAgLyoqIEBJbnB1dCB7Ym9vbGVhbn0gW3dpdGhBdXRvY29tcGxldGU9ZmFsc2VdIEVuYWJsZSBvciBkaXNhYmxlIHRoZSBhdXRvY29tcGxldGUgbGlzdCB3aGVuIHVzZXIgaXMgdHlwaW5nICovXG4gICBASW5wdXQoKSB3aXRoQXV0b2NvbXBsZXRlOiBib29sZWFuID0gZmFsc2U7XG5cbiAgIC8qKiBASW5wdXQge1N0RHJvcERvd25NZW51SXRlbVtdfSBbYXV0b2NvbXBsZXRlTGlzdD0nJ10gTGlzdCBvZiBpdGVtcyBkaXNwbGF5ZWQgaW4gdGhlIGF1dG9jb21wbGV0ZSBsaXN0IHdoZW4gdXNlciBpcyB0eXBpbmcgKi9cbiAgIEBJbnB1dCgpIGF1dG9jb21wbGV0ZUxpc3Q6IFN0RHJvcERvd25NZW51SXRlbVtdID0gW107XG5cbiAgIC8qKiBASW5wdXQge2Jvb2xlYW59IFtzaG93SWNvbj10cnVlXSBCb29sZWFuIHRvIGhpZGUvc2hvdyB0aGUgbG91cGUgaWNvbiAqL1xuICAgQElucHV0KCkgc2hvd0ljb246IGJvb2xlYW4gPSAgdHJ1ZTtcblxuICAgLyoqIEBJbnB1dCB7c3RyaW5nfSBbZW1wdHlBdXRvY29tcGxldGVMaXN0TWVzc2FnZT0nJ10gTWVzc2FnZSBkaXNwbGF5ZWQgd2hlbiB0aGUgYXV0b2NvbXBsZXRlIGxpc3QgaXMgZW5hYmxlZCBidXRcbiAgICAqIHRoZXJlIGFyZSBub3QgYW55IGl0ZW0gd2l0aCB0aGUgdHlwZWQgdGV4dFxuICAgICovXG4gICBASW5wdXQoKSBlbXB0eUF1dG9jb21wbGV0ZUxpc3RNZXNzYWdlOiBzdHJpbmcgPSAnJztcblxuICAgLyoqIEBJbnB1dCB7U3REcm9wRG93bk1lbnVJdGVtW119IFtmaWx0ZXJPcHRpb25zPScnXSBPcHRpb25zIGRpc3BsYXllZCBhdCB0aGUgZmlsdGVyIHNlbGVjdC4gSWYgaXQgaXMgbm90IGludHJvZHVjZWQsXG4gICAgKiBmaWx0ZXIgd2lsbCBub3QgYmUgZGlzcGxheWVkXG4gICAgKi9cbiAgIEBJbnB1dCgpIGZpbHRlck9wdGlvbnM6IFN0RHJvcERvd25NZW51SXRlbVtdO1xuXG4gICAvKiogQE91dHB1dCB7IE9iamVjdChmaWx0ZXI/OiBzdHJpbmcsIHRleHQ6IHN0cmluZyl9IFtzZWFyY2g9JyddIEV2ZW50IGVtaXR0ZWQgd2hlbiBzZWFyY2ggaXMgbGF1bmNoZWQuIEl0IGNvbnRhaW5zXG4gICAgKiB0aGUgdGV4dCB0eXBlZCBieSB0aGUgdXNlciBhbmQgdGhlIGZpbHRlciB2YWx1ZSBzZWxlY3RlZCAob25seSBpZiBmaWx0ZXIgaXMgZGlzcGxheWVkKVxuICAgICovXG4gICBAT3V0cHV0KCkgc2VhcmNoOiBFdmVudEVtaXR0ZXI8U3RTZWFyY2hFdmVudD4gPSBuZXcgRXZlbnRFbWl0dGVyPFN0U2VhcmNoRXZlbnQ+KCk7XG5cbiAgIC8qKiBAT3V0cHV0IHthbnl9IFt2YWx1ZT0nJ10gRXZlbnQgZW1pdHRlZCB3aGVuIGZpbHRlciBpcyBjaGFuZ2VkLiBJdCBjb250YWluc1xuICAgICogdGhlIGZpbHRlciB2YWx1ZSBzZWxlY3RlZFxuICAgICovXG4gICBAT3V0cHV0KCkgc2VsZWN0RmlsdGVyOiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xuXG4gICAvKiogQElucHV0IHtib29sZWFufSBba2V5Qm9hcmRNb3ZlPWZhbHNlXSBJdCBpcyBuZWVkZWQgdG8gYWN0aXZhdGUgbmF2aWdhdGlvbiB0aHJvdWdoIG9wdGlvbnMgdXNpbmcgdGhlIGtleWJvYXJkXG4gICAgKi9cbiAgIEBJbnB1dCgpIGtleUJvYXJkTW92ZTogYm9vbGVhbiA9IGZhbHNlO1xuXG4gICBwdWJsaWMgc2VhcmNoQm94OiBGb3JtQ29udHJvbCA9IG5ldyBGb3JtQ29udHJvbCgpO1xuICAgcHVibGljIHNob3dDbGVhcjogYm9vbGVhbjtcbiAgIHB1YmxpYyBmaWx0ZXI6IHN0cmluZztcblxuICAgcHJpdmF0ZSBzdWJzY3JpcHRpb25TZWFyY2g6IFN1YnNjcmlwdGlvbiB8IHVuZGVmaW5lZCA9IHVuZGVmaW5lZDtcbiAgIHByaXZhdGUgc3Vic2NyaXB0aW9uU2VhcmNoQ2xlYXJCdXR0b246IFN1YnNjcmlwdGlvbiB8IHVuZGVmaW5lZCA9IHVuZGVmaW5lZDtcbiAgIHByaXZhdGUgbGFzdEVtaXR0ZWRUZXh0OiBzdHJpbmcgfCB1bmRlZmluZWQgPSB1bmRlZmluZWQ7XG5cbiAgIGNvbnN0cnVjdG9yKHByaXZhdGUgX3JlbmRlcjogUmVuZGVyZXIyLFxuICAgICAgICAgICAgICAgcHJpdmF0ZSBjZDogQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gICAgICAgICAgICAgICBAVmlld0NoaWxkKCdidXR0b25JZCcsIHtzdGF0aWM6IGZhbHNlfSkgcHVibGljIGJ1dHRvbkVsZW1lbnQ6IEVsZW1lbnRSZWYpIHtcbiAgICAgIHN1cGVyKF9yZW5kZXIsIGNkLCBidXR0b25FbGVtZW50KTtcbiAgIH1cblxuICAgZ2V0IG1lbnVJZCgpOiBzdHJpbmcge1xuICAgICAgcmV0dXJuIHRoaXMucWFUYWcgPyB0aGlzLnFhVGFnICsgJy1hdXRvY29tcGxldGUtbWVudScgOiBudWxsO1xuICAgfVxuXG4gICBwdWJsaWMgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgICBpZiAodGhpcy52YWx1ZSkge1xuICAgICAgICAgdGhpcy5zZWFyY2hCb3guc2V0VmFsdWUodGhpcy52YWx1ZSk7XG4gICAgICB9XG4gICAgICAvLyBTaG93IGNsZWFyIGJ1dHRvbiBpZiBoYXZlIHRleHRcbiAgICAgIHRoaXMuc3Vic2NyaXB0aW9uU2VhcmNoQ2xlYXJCdXR0b24gPSB0aGlzLnNlYXJjaEJveC52YWx1ZUNoYW5nZXMuc3Vic2NyaWJlKCh2YWwpID0+IHRoaXMuc2hvd0NsZWFyID0gKHZhbCAmJiB2YWwubGVuZ3RoID4gMCkpO1xuICAgICAgdGhpcy5jaGVja0Rpc2FibGVkKCk7XG4gICAgICB0aGlzLm1hbmFnZVN1YnNjcmlwdGlvbigpO1xuICAgICAgaWYgKHRoaXMuZmlsdGVyT3B0aW9ucykge1xuICAgICAgICAgdGhpcy5maWx0ZXIgPSB0aGlzLmZpbHRlck9wdGlvbnNbMF0udmFsdWU7XG4gICAgICB9XG4gICB9XG5cbiAgIHB1YmxpYyBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKTogdm9pZCB7XG4gICAgICB0aGlzLmNoZWNrRGVib3VuY2VDaGFuZ2UoY2hhbmdlcyk7XG4gICAgICB0aGlzLmNoZWNrVmFsdWVDaGFuZ2UoY2hhbmdlcyk7XG4gICAgICB0aGlzLmNoZWNrRGlzYWJsZUNoYW5nZShjaGFuZ2VzKTtcbiAgICAgIHRoaXMuY2hlY2tBdXRvQ29tcGxldGVNZW51Q2hhbmdlKGNoYW5nZXMpO1xuICAgfVxuXG4gICBwdWJsaWMgb25DaGFuZ2VGaWx0ZXIodmFsdWU6IGFueSk6IHZvaWQge1xuICAgICAgdGhpcy5zZWxlY3RGaWx0ZXIuZW1pdCh2YWx1ZSk7XG4gICAgICB0aGlzLmVtaXRWYWx1ZShmYWxzZSwgU3RTZWFyY2hFdmVudE9yaWdpbi5GSUxURVIpO1xuICAgfVxuXG4gICBwdWJsaWMgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgICBpZiAodGhpcy5zdWJzY3JpcHRpb25TZWFyY2ggIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgdGhpcy5zdWJzY3JpcHRpb25TZWFyY2gudW5zdWJzY3JpYmUoKTtcbiAgICAgIH1cbiAgICAgIGlmICh0aGlzLnN1YnNjcmlwdGlvblNlYXJjaENsZWFyQnV0dG9uICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgIHRoaXMuc3Vic2NyaXB0aW9uU2VhcmNoQ2xlYXJCdXR0b24udW5zdWJzY3JpYmUoKTtcbiAgICAgIH1cbiAgICAgIHRoaXMuY2xvc2VFbGVtZW50KCk7XG4gICB9XG5cbiAgIHB1YmxpYyBsYXVuY2hTZWFyY2goZm9yY2U6IGJvb2xlYW4sIG9yaWdpbjogU3RTZWFyY2hFdmVudE9yaWdpbik6IHZvaWQge1xuICAgICAgaWYgKHRoaXMuY2FuU2VhcmNoKCkpIHtcbiAgICAgICAgIHRoaXMuc2hvd0F1dG9Db21wbGV0ZU1lbnUoKTtcbiAgICAgICAgIHRoaXMuZW1pdFZhbHVlKGZvcmNlLCBvcmlnaW4pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgIHRoaXMuY2xvc2VFbGVtZW50KCk7XG4gICAgICB9XG4gICB9XG5cbiAgIHB1YmxpYyBvbktleVByZXNzKGV2ZW50OiBLZXlib2FyZEV2ZW50KTogdm9pZCB7XG4gICAgICBsZXQga2V5OiBudW1iZXIgPSBldmVudC5rZXlDb2RlIHx8IGV2ZW50LndoaWNoO1xuICAgICAgaWYgKGtleSA9PT0gMTMpIHtcbiAgICAgICAgIHRoaXMubGF1bmNoU2VhcmNoKHRydWUsIFN0U2VhcmNoRXZlbnRPcmlnaW4uRU5URVIpO1xuICAgICAgfVxuICAgfVxuXG4gICBwdWJsaWMgY2hhbmdlT3B0aW9uKGl0ZW06IFN0RHJvcERvd25NZW51SXRlbSk6IHZvaWQge1xuICAgICAgaWYgKGl0ZW0gJiYgaXRlbS5sYWJlbCkge1xuICAgICAgICAgdGhpcy5zdWJzY3JpcHRpb25TZWFyY2gudW5zdWJzY3JpYmUoKTtcbiAgICAgICAgIHRoaXMuc2VhcmNoQm94LnNldFZhbHVlKGl0ZW0udmFsdWUpO1xuICAgICAgICAgdGhpcy5jZC5tYXJrRm9yQ2hlY2soKTtcbiAgICAgICAgIHRoaXMuY2xvc2VFbGVtZW50KCk7XG4gICAgICAgICB0aGlzLmVtaXRWYWx1ZSh0cnVlLCBTdFNlYXJjaEV2ZW50T3JpZ2luLkxJU1QpO1xuICAgICAgICAgdGhpcy5tYW5hZ2VTdWJzY3JpcHRpb24oKTtcbiAgICAgIH1cbiAgIH1cblxuICAgcHVibGljIGNsZWFySW5wdXQoKTogdm9pZCB7XG4gICAgICB0aGlzLnNlYXJjaEJveC5zZXRWYWx1ZSgnJyk7XG4gICAgICB0aGlzLmNsb3NlRWxlbWVudCgpO1xuICAgICAgdGhpcy5lbWl0VmFsdWUodHJ1ZSwgU3RTZWFyY2hFdmVudE9yaWdpbi5JTlBVVCk7XG4gICB9XG5cbiAgIHB1YmxpYyBzaG93QXV0b0NvbXBsZXRlTWVudSgpOiB2b2lkIHtcbiAgICAgIGlmICh0aGlzLndpdGhBdXRvY29tcGxldGUgJiYgIXRoaXMuaXNBY3RpdmUpIHtcbiAgICAgICAgIHRoaXMub3BlbkVsZW1lbnQoKTtcbiAgICAgIH1cbiAgICAgIGlmICh0aGlzLnNlYXJjaEJveC52YWx1ZSA9PT0gJycpIHtcbiAgICAgICAgIHRoaXMuY2xvc2VFbGVtZW50KCk7XG4gICAgICB9XG4gICAgICB0aGlzLmNkLm1hcmtGb3JDaGVjaygpO1xuICAgfVxuXG4gICBwcml2YXRlIGVtaXRWYWx1ZShmb3JjZTogYm9vbGVhbiwgb3JpZ2luOiBTdFNlYXJjaEV2ZW50T3JpZ2luKTogdm9pZCB7XG4gICAgICBpZiAodGhpcy5pc0VxdWFsUHJldmlvdXMoZm9yY2UpKSB7XG4gICAgICAgICB0aGlzLmxhc3RFbWl0dGVkVGV4dCA9IHRoaXMuc2VhcmNoQm94LnZhbHVlO1xuICAgICAgICAgbGV0IG5ld1NlYXJjaDogU3RTZWFyY2hFdmVudCA9IHt0ZXh0OiB0aGlzLmxhc3RFbWl0dGVkVGV4dCB8fCAnJywgb3JpZ2luOiBvcmlnaW59O1xuICAgICAgICAgaWYgKHRoaXMuZmlsdGVyKSB7XG4gICAgICAgICAgICBuZXdTZWFyY2guZmlsdGVyID0gdGhpcy5maWx0ZXI7XG4gICAgICAgICB9XG4gICAgICAgICB0aGlzLnNlYXJjaC5lbWl0KG5ld1NlYXJjaCk7XG4gICAgICB9XG4gICB9XG5cblxuXG4gICBwcml2YXRlIGNoZWNrRGlzYWJsZWQoKTogdm9pZCB7XG4gICAgICBpZiAodGhpcy5kaXNhYmxlZCkge1xuICAgICAgICAgdGhpcy5zZWFyY2hCb3guZGlzYWJsZSgpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgIHRoaXMuc2VhcmNoQm94LmVuYWJsZSgpO1xuICAgICAgfVxuICAgfVxuXG4gICBwcml2YXRlIGNhblNlYXJjaCgpOiBib29sZWFuIHtcbiAgICAgIHJldHVybiB0aGlzLmlzRGVmaW5lZCgpICYmICF0aGlzLmRpc2FibGVkICYmIHRoaXMuY2hlY2tNaW5zKCk7XG4gICB9XG5cbiAgIHByaXZhdGUgaXNEZWZpbmVkKCk6IGJvb2xlYW4ge1xuICAgICAgcmV0dXJuIHRoaXMuc2VhcmNoQm94ICYmIHRoaXMuc2VhcmNoQm94LnZhbHVlICE9PSBudWxsICYmIHRoaXMuc2VhcmNoQm94LnZhbHVlICE9PSB1bmRlZmluZWQ7XG4gICB9XG5cbiAgIHByaXZhdGUgY2hlY2tNaW5zKCk6IGJvb2xlYW4ge1xuICAgICAgcmV0dXJuIHRoaXMubWluTGVuZ3RoIDw9ICh0aGlzLnNlYXJjaEJveCAmJiB0aGlzLnNlYXJjaEJveC52YWx1ZSAmJiB0aGlzLnNlYXJjaEJveC52YWx1ZS5sZW5ndGgpIHx8XG4gICAgICAgICB0aGlzLnNlYXJjaEJveC52YWx1ZS50cmltKCkubGVuZ3RoID09PSAwO1xuICAgfVxuXG4gICBwcml2YXRlIGlzRXF1YWxQcmV2aW91cyhmb3JjZTogYm9vbGVhbik6IGJvb2xlYW4ge1xuICAgICAgcmV0dXJuIHRoaXMubGFzdEVtaXR0ZWRUZXh0ICE9PSB0aGlzLnNlYXJjaEJveC52YWx1ZSB8fCBmb3JjZTtcbiAgIH1cblxuICAgcHJpdmF0ZSBjaGVja1ZhbHVlQ2hhbmdlKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpOiB2b2lkIHtcbiAgICAgIGlmIChjaGFuZ2VzICYmIGNoYW5nZXMudmFsdWUpIHtcbiAgICAgICAgIGlmICh0aGlzLnN1YnNjcmlwdGlvblNlYXJjaCkge1xuICAgICAgICAgICAgdGhpcy5zdWJzY3JpcHRpb25TZWFyY2gudW5zdWJzY3JpYmUoKTtcbiAgICAgICAgIH1cbiAgICAgICAgIHRoaXMuc2VhcmNoQm94LnNldFZhbHVlKGNoYW5nZXMudmFsdWUuY3VycmVudFZhbHVlKTtcbiAgICAgICAgIHRoaXMubWFuYWdlU3Vic2NyaXB0aW9uKCk7XG4gICAgICB9XG4gICB9XG5cbiAgIHByaXZhdGUgY2hlY2tEZWJvdW5jZUNoYW5nZShjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKTogdm9pZCB7XG4gICAgICBpZiAoY2hhbmdlcyAmJiBjaGFuZ2VzLmRlYm91bmNlKSB7XG4gICAgICAgICB0aGlzLm1hbmFnZVN1YnNjcmlwdGlvbigpO1xuICAgICAgfVxuICAgfVxuXG4gICBwcml2YXRlIGNoZWNrRGlzYWJsZUNoYW5nZShjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKTogdm9pZCB7XG4gICAgICBpZiAoY2hhbmdlcyAmJiBjaGFuZ2VzLmRpc2FibGVkKSB7XG4gICAgICAgICB0aGlzLmNoZWNrRGlzYWJsZWQoKTtcbiAgICAgIH1cbiAgIH1cblxuICAgcHJpdmF0ZSBjaGVja0F1dG9Db21wbGV0ZU1lbnVDaGFuZ2UoY2hhbmdlczogU2ltcGxlQ2hhbmdlcyk6IHZvaWQge1xuICAgICAgaWYgKGNoYW5nZXMgJiYgY2hhbmdlcy5hdXRvY29tcGxldGVMaXN0KSB7XG4gICAgICAgICB0aGlzLmNkLm1hcmtGb3JDaGVjaygpO1xuICAgICAgfVxuICAgfVxuXG4gICBwcml2YXRlIG1hbmFnZVN1YnNjcmlwdGlvbigpOiB2b2lkIHtcbiAgICAgIGlmICh0aGlzLnN1YnNjcmlwdGlvblNlYXJjaCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICB0aGlzLnN1YnNjcmlwdGlvblNlYXJjaC51bnN1YnNjcmliZSgpO1xuICAgICAgfVxuICAgICAgaWYgKHRoaXMubGl2ZVNlYXJjaCkge1xuICAgICAgICAgdGhpcy5zdWJzY3JpcHRpb25TZWFyY2ggPSB0aGlzLnNlYXJjaEJveFxuICAgICAgICAgICAgLnZhbHVlQ2hhbmdlcy5waXBlKFxuICAgICAgICAgICAgZGVib3VuY2VUaW1lKHRoaXMuZGVib3VuY2UpKVxuICAgICAgICAgICAgLnN1YnNjcmliZSgoZXZlbnQpID0+IHRoaXMubGF1bmNoU2VhcmNoKGZhbHNlLCAgU3RTZWFyY2hFdmVudE9yaWdpbi5JTlBVVCkpO1xuICAgICAgfVxuICAgfVxufVxuIl19