UNPKG

design-angular-kit-lombardia

Version:

Un toolkit Angular conforme alle linee guida di design per i servizi web della Regione Lombardia

178 lines 26.7 kB
import { ChangeDetectionStrategy, Component, EventEmitter, Input, Output, ViewChild, } from '@angular/core'; import { ItAbstractFormComponent } from '../../../abstracts/abstract-form.component'; import { AsyncPipe } from '@angular/common'; import { ReactiveFormsModule } from '@angular/forms'; import { SelectAutocomplete } from 'bootstrap-lombardia'; import * as i0 from "@angular/core"; export class ItAutocompleteComponent extends ItAbstractFormComponent { constructor() { super(...arguments); /** * Autocomplete elements. * @default [] */ this.source = []; /** * Autocomplete if required. * @default false */ this.required = false; /** * Prevents suggestions from appearing if fewer than N characters are typed * @default 0 */ this.minLength = 0; /** * Default value */ this.defaultValue = ''; /** * Function to set assistive hint label. For more information https://github.com/alphagov/accessible-autocomplete?tab=readme-ov-file#internationalization */ this.assistiveHintLabel = () => 'Quando i risultati del completamento automatico sono disponibili, usa le frecce su e giù per rivedere e Invio per selezionare. Utenti di dispositivi touch, esplora tramite tocco o con gesti di scorrimento'; /** * Function to set label in case of no result. For more information https://github.com/alphagov/accessible-autocomplete?tab=readme-ov-file#internationalization */ this.noResultsLabel = () => 'Nessun risultato trovato'; /** * Function to set label that alerts you that query's too short. For more information https://github.com/alphagov/accessible-autocomplete?tab=readme-ov-file#internationalization */ this.statusQueryTooShortLabel = minQueryLength => `Digita ${minQueryLength} o più caratteri per mostrare le opzioni di ricerca`; /** * Function to set no results label. For more information https://github.com/alphagov/accessible-autocomplete?tab=readme-ov-file#internationalization */ this.statusNoResultsLabel = () => 'Nessun risultato di ricerca'; /** * Function to set selected option label. For more information https://github.com/alphagov/accessible-autocomplete?tab=readme-ov-file#internationalization */ this.statusSelectedOptionLabel = (selectedOption, length, index) => `${selectedOption} ${index + 1} di ${length} è sottolineato`; /** * Function to set status results label. For more information https://github.com/alphagov/accessible-autocomplete?tab=readme-ov-file#internationalization */ this.statusResultsLabel = (length, contentSelectedOption) => { const words = { result: length === 1 ? 'risultato' : 'risultati', is: length === 1 ? 'è' : 'sono', available: length === 1 ? 'disponibile' : 'disponibili', }; return `${length} ${words.result} ${words.is} ${words.available}. ${contentSelectedOption}`; }; /** * Fired when value changes */ this.selected = new EventEmitter(); this.value = ''; this._interval = 0; this._inputEl = null; } ngOnInit() { super.ngOnInit(); if (!this.control.value && !!this.value) { this.writeValue(this.value); this.onChange(this.value); } } clear() { this._inputEl.value = ''; } _findInput() { this._interval = setInterval(() => { this._inputEl = document.getElementById(this.id); if (this._inputEl) { clearInterval(this._interval); this._initInputEl(); } }, 500); } _setAndCheck(value) { this.value = value == '' ? undefined : value; if (this.control.touched) { this.writeValue(this.value); this.onChange(this.value); } if (this.isValid == false && this.isInvalid == false) { this._inputEl?.classList.remove('just-validate-success-field'); this._inputEl?.classList.remove('is-invalid'); } else if (this.isValid == true) { this._inputEl?.classList.add('just-validate-success-field'); this._inputEl?.classList.remove('is-invalid'); } else if (this.isInvalid == true) { this._inputEl?.classList.add('is-invalid'); this._inputEl?.classList.remove('just-validate-success-field'); } } _initInputEl() { if (this._inputEl) { this._inputEl.onfocus = (ev) => this._setAndCheck(ev.target.value); this._inputEl.onblur = (ev) => this._setAndCheck(ev.target.value); this._inputEl.oninput = (ev) => { this.markAsTouched(); this._setAndCheck(ev.target.value); }; } } ngAfterViewInit() { if (this.selectAutocompleteEl) { super.ngAfterViewInit(); const element = this.selectAutocompleteEl.nativeElement; this.selectAutocomplete = new SelectAutocomplete(element, { id: this.id, name: this.name || this.id, source: this.source, required: this.required, minLength: this.minLength, defaultValue: this.defaultValue, tAssistiveHint: this.assistiveHintLabel, tNoResults: this.noResultsLabel, tStatusQueryTooShort: this.statusQueryTooShortLabel, tStatusNoResults: this.statusNoResultsLabel, tStatusSelectedOption: this.statusSelectedOptionLabel, tStatusResults: this.statusResultsLabel, onConfirm: (selectedElement) => { this.markAsTouched(); this._setAndCheck(selectedElement); this.selected.emit(selectedElement); }, }); this._findInput(); } } static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.0.6", ngImport: i0, type: ItAutocompleteComponent, deps: null, target: i0.ɵɵFactoryTarget.Component }); } static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.0.6", type: ItAutocompleteComponent, isStandalone: true, selector: "it-autocomplete", inputs: { source: "source", required: "required", name: "name", description: "description", minLength: "minLength", defaultValue: "defaultValue", assistiveHintLabel: "assistiveHintLabel", noResultsLabel: "noResultsLabel", statusQueryTooShortLabel: "statusQueryTooShortLabel", statusNoResultsLabel: "statusNoResultsLabel", statusSelectedOptionLabel: "statusSelectedOptionLabel", statusResultsLabel: "statusResultsLabel" }, outputs: { selected: "selected" }, viewQueries: [{ propertyName: "selectAutocompleteEl", first: true, predicate: ["selectAutocomplete"], descendants: true }], usesInheritance: true, ngImport: i0, template: "<div class=\"form-group\">\n @if (label) {\n <label [for]=\"id\" [class.active]=\"!!control.value\">{{ label }}</label>\n }\n <div #selectAutocomplete name=\"region\" [id]=\"id + 'Wrapper'\" class=\"autocomplete-wrapper\"></div>\n\n @if (description) {\n <small [id]=\"id + '-description'\" class=\"form-text\">{{ description }}</small>\n }\n @if (isInvalid) {\n <div class=\"form-feedback just-validate-error-label\" [id]=\"id + '-error'\">\n <div #customError><ng-content select=\"[error]\"></ng-content></div>\n @if (!customError.hasChildNodes()) {\n {{ invalidMessage | async }}\n }\n </div>\n }\n</div>\n", dependencies: [{ kind: "ngmodule", type: ReactiveFormsModule }, { kind: "pipe", type: AsyncPipe, name: "async" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); } } i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.0.6", ngImport: i0, type: ItAutocompleteComponent, decorators: [{ type: Component, args: [{ standalone: true, selector: 'it-autocomplete', changeDetection: ChangeDetectionStrategy.OnPush, imports: [ReactiveFormsModule, AsyncPipe], template: "<div class=\"form-group\">\n @if (label) {\n <label [for]=\"id\" [class.active]=\"!!control.value\">{{ label }}</label>\n }\n <div #selectAutocomplete name=\"region\" [id]=\"id + 'Wrapper'\" class=\"autocomplete-wrapper\"></div>\n\n @if (description) {\n <small [id]=\"id + '-description'\" class=\"form-text\">{{ description }}</small>\n }\n @if (isInvalid) {\n <div class=\"form-feedback just-validate-error-label\" [id]=\"id + '-error'\">\n <div #customError><ng-content select=\"[error]\"></ng-content></div>\n @if (!customError.hasChildNodes()) {\n {{ invalidMessage | async }}\n }\n </div>\n }\n</div>\n" }] }], propDecorators: { source: [{ type: Input }], required: [{ type: Input }], name: [{ type: Input }], description: [{ type: Input }], minLength: [{ type: Input }], defaultValue: [{ type: Input }], assistiveHintLabel: [{ type: Input }], noResultsLabel: [{ type: Input }], statusQueryTooShortLabel: [{ type: Input }], statusNoResultsLabel: [{ type: Input }], statusSelectedOptionLabel: [{ type: Input }], statusResultsLabel: [{ type: Input }], selected: [{ type: Output }], selectAutocompleteEl: [{ type: ViewChild, args: ['selectAutocomplete'] }] } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXV0b2NvbXBsZXRlLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2Rlc2lnbi1hbmd1bGFyLWtpdC9zcmMvbGliL2NvbXBvbmVudHMvZm9ybS9hdXRvY29tcGxldGUvYXV0b2NvbXBsZXRlLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2Rlc2lnbi1hbmd1bGFyLWtpdC9zcmMvbGliL2NvbXBvbmVudHMvZm9ybS9hdXRvY29tcGxldGUvYXV0b2NvbXBsZXRlLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTCx1QkFBdUIsRUFDdkIsU0FBUyxFQUVULFlBQVksRUFDWixLQUFLLEVBQ0wsTUFBTSxFQUNOLFNBQVMsR0FHVixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSw0Q0FBNEMsQ0FBQztBQUNyRixPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDNUMsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDckQsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0scUJBQXFCLENBQUM7O0FBV3pELE1BQU0sT0FBTyx1QkFBd0IsU0FBUSx1QkFBa0Q7SUFQL0Y7O1FBUUU7OztXQUdHO1FBQ00sV0FBTSxHQUE4QixFQUFFLENBQUM7UUFFaEQ7OztXQUdHO1FBQ00sYUFBUSxHQUFZLEtBQUssQ0FBQztRQVluQzs7O1dBR0c7UUFDTSxjQUFTLEdBQVcsQ0FBQyxDQUFDO1FBRS9COztXQUVHO1FBQ00saUJBQVksR0FBa0IsRUFBRSxDQUFDO1FBRTFDOztXQUVHO1FBQ00sdUJBQWtCLEdBQWlCLEdBQUcsRUFBRSxDQUMvQyw4TUFBOE0sQ0FBQztRQUVqTjs7V0FFRztRQUNNLG1CQUFjLEdBQWlCLEdBQUcsRUFBRSxDQUFDLDBCQUEwQixDQUFDO1FBRXpFOztXQUVHO1FBQ00sNkJBQXdCLEdBQXVDLGNBQWMsQ0FBQyxFQUFFLENBQ3ZGLFVBQVUsY0FBYyxxREFBcUQsQ0FBQztRQUVoRjs7V0FFRztRQUNNLHlCQUFvQixHQUFpQixHQUFHLEVBQUUsQ0FBQyw2QkFBNkIsQ0FBQztRQUVsRjs7V0FFRztRQUNNLDhCQUF5QixHQUFzRSxDQUFDLGNBQWMsRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFLEVBQUUsQ0FDeEksR0FBRyxjQUFjLElBQUksS0FBSyxHQUFHLENBQUMsT0FBTyxNQUFNLGlCQUFpQixDQUFDO1FBRS9EOztXQUVHO1FBQ00sdUJBQWtCLEdBQThELENBQUMsTUFBTSxFQUFFLHFCQUFxQixFQUFFLEVBQUU7WUFDekgsTUFBTSxLQUFLLEdBQUc7Z0JBQ1osTUFBTSxFQUFFLE1BQU0sS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsV0FBVztnQkFDaEQsRUFBRSxFQUFFLE1BQU0sS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsTUFBTTtnQkFDL0IsU0FBUyxFQUFFLE1BQU0sS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsYUFBYTthQUN4RCxDQUFDO1lBRUYsT0FBTyxHQUFHLE1BQU0sSUFBSSxLQUFLLENBQUMsTUFBTSxJQUFJLEtBQUssQ0FBQyxFQUFFLElBQUksS0FBSyxDQUFDLFNBQVMsS0FBSyxxQkFBcUIsRUFBRSxDQUFDO1FBQzlGLENBQUMsQ0FBQztRQUVGOztXQUVHO1FBQ08sYUFBUSxHQUFHLElBQUksWUFBWSxFQUFFLENBQUM7UUFNaEMsVUFBSyxHQUF1QixFQUFFLENBQUM7UUFDL0IsY0FBUyxHQUFRLENBQUMsQ0FBQztRQUNuQixhQUFRLEdBQXVCLElBQUksQ0FBQztLQStFN0M7SUE3RVUsUUFBUTtRQUNmLEtBQUssQ0FBQyxRQUFRLEVBQUUsQ0FBQztRQUNqQixJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxLQUFLLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQztZQUN4QyxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUM1QixJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUM1QixDQUFDO0lBQ0gsQ0FBQztJQUVELEtBQUs7UUFDRixJQUFJLENBQUMsUUFBNkIsQ0FBQyxLQUFLLEdBQUcsRUFBRSxDQUFDO0lBQ2pELENBQUM7SUFFRCxVQUFVO1FBQ1IsSUFBSSxDQUFDLFNBQVMsR0FBRyxXQUFXLENBQUMsR0FBRyxFQUFFO1lBQ2hDLElBQUksQ0FBQyxRQUFRLEdBQUcsUUFBUSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUM7WUFDakQsSUFBSSxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7Z0JBQ2xCLGFBQWEsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUM7Z0JBQzlCLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQztZQUN0QixDQUFDO1FBQ0gsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDO0lBQ1YsQ0FBQztJQUVPLFlBQVksQ0FBQyxLQUFhO1FBQ2hDLElBQUksQ0FBQyxLQUFLLEdBQUcsS0FBSyxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUM7UUFDN0MsSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLE9BQU8sRUFBRSxDQUFDO1lBQ3pCLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQzVCLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQzVCLENBQUM7UUFDRCxJQUFJLElBQUksQ0FBQyxPQUFPLElBQUksS0FBSyxJQUFJLElBQUksQ0FBQyxTQUFTLElBQUksS0FBSyxFQUFFLENBQUM7WUFDckQsSUFBSSxDQUFDLFFBQVEsRUFBRSxTQUFTLENBQUMsTUFBTSxDQUFDLDZCQUE2QixDQUFDLENBQUM7WUFDL0QsSUFBSSxDQUFDLFFBQVEsRUFBRSxTQUFTLENBQUMsTUFBTSxDQUFDLFlBQVksQ0FBQyxDQUFDO1FBQ2hELENBQUM7YUFBTSxJQUFJLElBQUksQ0FBQyxPQUFPLElBQUksSUFBSSxFQUFFLENBQUM7WUFDaEMsSUFBSSxDQUFDLFFBQVEsRUFBRSxTQUFTLENBQUMsR0FBRyxDQUFDLDZCQUE2QixDQUFDLENBQUM7WUFDNUQsSUFBSSxDQUFDLFFBQVEsRUFBRSxTQUFTLENBQUMsTUFBTSxDQUFDLFlBQVksQ0FBQyxDQUFDO1FBQ2hELENBQUM7YUFBTSxJQUFJLElBQUksQ0FBQyxTQUFTLElBQUksSUFBSSxFQUFFLENBQUM7WUFDbEMsSUFBSSxDQUFDLFFBQVEsRUFBRSxTQUFTLENBQUMsR0FBRyxDQUFDLFlBQVksQ0FBQyxDQUFDO1lBQzNDLElBQUksQ0FBQyxRQUFRLEVBQUUsU0FBUyxDQUFDLE1BQU0sQ0FBQyw2QkFBNkIsQ0FBQyxDQUFDO1FBQ2pFLENBQUM7SUFDSCxDQUFDO0lBRU8sWUFBWTtRQUNsQixJQUFJLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztZQUNsQixJQUFJLENBQUMsUUFBUSxDQUFDLE9BQU8sR0FBRyxDQUFDLEVBQVMsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBRSxFQUFFLENBQUMsTUFBMkIsQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUNoRyxJQUFJLENBQUMsUUFBUSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQVMsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBRSxFQUFFLENBQUMsTUFBMkIsQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUMvRixJQUFJLENBQUMsUUFBUSxDQUFDLE9BQU8sR0FBRyxDQUFDLEVBQVMsRUFBRSxFQUFFO2dCQUNwQyxJQUFJLENBQUMsYUFBYSxFQUFFLENBQUM7Z0JBQ3JCLElBQUksQ0FBQyxZQUFZLENBQUUsRUFBRSxDQUFDLE1BQTJCLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDM0QsQ0FBQyxDQUFDO1FBQ0osQ0FBQztJQUNILENBQUM7SUFFUSxlQUFlO1FBQ3RCLElBQUksSUFBSSxDQUFDLG9CQUFvQixFQUFFLENBQUM7WUFDOUIsS0FBSyxDQUFDLGVBQWUsRUFBRSxDQUFDO1lBQ3hCLE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxhQUFhLENBQUM7WUFDeEQsSUFBSSxDQUFDLGtCQUFrQixHQUFHLElBQUksa0JBQWtCLENBQUMsT0FBTyxFQUFFO2dCQUN4RCxFQUFFLEVBQUUsSUFBSSxDQUFDLEVBQUU7Z0JBQ1gsSUFBSSxFQUFFLElBQUksQ0FBQyxJQUFJLElBQUksSUFBSSxDQUFDLEVBQUU7Z0JBQzFCLE1BQU0sRUFBRSxJQUFJLENBQUMsTUFBTTtnQkFDbkIsUUFBUSxFQUFFLElBQUksQ0FBQyxRQUFRO2dCQUN2QixTQUFTLEVBQUUsSUFBSSxDQUFDLFNBQVM7Z0JBQ3pCLFlBQVksRUFBRSxJQUFJLENBQUMsWUFBWTtnQkFDL0IsY0FBYyxFQUFFLElBQUksQ0FBQyxrQkFBa0I7Z0JBQ3ZDLFVBQVUsRUFBRSxJQUFJLENBQUMsY0FBYztnQkFDL0Isb0JBQW9CLEVBQUUsSUFBSSxDQUFDLHdCQUF3QjtnQkFDbkQsZ0JBQWdCLEVBQUUsSUFBSSxDQUFDLG9CQUFvQjtnQkFDM0MscUJBQXFCLEVBQUUsSUFBSSxDQUFDLHlCQUF5QjtnQkFDckQsY0FBYyxFQUFFLElBQUksQ0FBQyxrQkFBa0I7Z0JBQ3ZDLFNBQVMsRUFBRSxDQUFDLGVBQXVCLEVBQUUsRUFBRTtvQkFDckMsSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDO29CQUNyQixJQUFJLENBQUMsWUFBWSxDQUFDLGVBQWUsQ0FBQyxDQUFDO29CQUNuQyxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsQ0FBQztnQkFDdEMsQ0FBQzthQUNGLENBQUMsQ0FBQztZQUNILElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztRQUNwQixDQUFDO0lBQ0gsQ0FBQzs4R0FwS1UsdUJBQXVCO2tHQUF2Qix1QkFBdUIsdXFCQ3pCcEMsNG9CQWtCQSwyQ0RLWSxtQkFBbUIsMEJBQUUsU0FBUzs7MkZBRTdCLHVCQUF1QjtrQkFQbkMsU0FBUztpQ0FDSSxJQUFJLFlBQ04saUJBQWlCLG1CQUVWLHVCQUF1QixDQUFDLE1BQU0sV0FDdEMsQ0FBQyxtQkFBbUIsRUFBRSxTQUFTLENBQUM7OEJBT2hDLE1BQU07c0JBQWQsS0FBSztnQkFNRyxRQUFRO3NCQUFoQixLQUFLO2dCQUtHLElBQUk7c0JBQVosS0FBSztnQkFLRyxXQUFXO3NCQUFuQixLQUFLO2dCQU1HLFNBQVM7c0JBQWpCLEtBQUs7Z0JBS0csWUFBWTtzQkFBcEIsS0FBSztnQkFLRyxrQkFBa0I7c0JBQTFCLEtBQUs7Z0JBTUcsY0FBYztzQkFBdEIsS0FBSztnQkFLRyx3QkFBd0I7c0JBQWhDLEtBQUs7Z0JBTUcsb0JBQW9CO3NCQUE1QixLQUFLO2dCQUtHLHlCQUF5QjtzQkFBakMsS0FBSztnQkFNRyxrQkFBa0I7c0JBQTFCLEtBQUs7Z0JBYUksUUFBUTtzQkFBakIsTUFBTTtnQkFFa0Msb0JBQW9CO3NCQUE1RCxTQUFTO3VCQUFDLG9CQUFvQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LFxuICBDb21wb25lbnQsXG4gIEVsZW1lbnRSZWYsXG4gIEV2ZW50RW1pdHRlcixcbiAgSW5wdXQsXG4gIE91dHB1dCxcbiAgVmlld0NoaWxkLFxuICBPbkluaXQsXG4gIEFmdGVyVmlld0luaXQsXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgSXRBYnN0cmFjdEZvcm1Db21wb25lbnQgfSBmcm9tICcuLi8uLi8uLi9hYnN0cmFjdHMvYWJzdHJhY3QtZm9ybS5jb21wb25lbnQnO1xuaW1wb3J0IHsgQXN5bmNQaXBlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7IFJlYWN0aXZlRm9ybXNNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQgeyBTZWxlY3RBdXRvY29tcGxldGUgfSBmcm9tICdib290c3RyYXAtbG9tYmFyZGlhJztcblxudHlwZSBmdW5jdGlvblNvdXJjZSA9IChxdWVyeTogc3RyaW5nLCBwb3B1bGF0ZVJlc3VsdHM6IChyZXN1bHRzOiBzdHJpbmdbXSkgPT4gdm9pZCkgPT4gdm9pZDtcblxuQENvbXBvbmVudCh7XG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gIHNlbGVjdG9yOiAnaXQtYXV0b2NvbXBsZXRlJyxcbiAgdGVtcGxhdGVVcmw6ICcuL2F1dG9jb21wbGV0ZS5jb21wb25lbnQuaHRtbCcsXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxuICBpbXBvcnRzOiBbUmVhY3RpdmVGb3Jtc01vZHVsZSwgQXN5bmNQaXBlXSxcbn0pXG5leHBvcnQgY2xhc3MgSXRBdXRvY29tcGxldGVDb21wb25lbnQgZXh0ZW5kcyBJdEFic3RyYWN0Rm9ybUNvbXBvbmVudDxzdHJpbmcgfCBudWxsIHwgdW5kZWZpbmVkPiBpbXBsZW1lbnRzIE9uSW5pdCwgQWZ0ZXJWaWV3SW5pdCB7XG4gIC8qKlxuICAgKiBBdXRvY29tcGxldGUgZWxlbWVudHMuXG4gICAqIEBkZWZhdWx0IFtdXG4gICAqL1xuICBASW5wdXQoKSBzb3VyY2U6IHN0cmluZ1tdIHwgZnVuY3Rpb25Tb3VyY2UgPSBbXTtcblxuICAvKipcbiAgICogQXV0b2NvbXBsZXRlIGlmIHJlcXVpcmVkLlxuICAgKiBAZGVmYXVsdCBmYWxzZVxuICAgKi9cbiAgQElucHV0KCkgcmVxdWlyZWQ6IGJvb2xlYW4gPSBmYWxzZTtcblxuICAvKipcbiAgICogSW5wdXQgZmllbGQgbmFtZVxuICAgKi9cbiAgQElucHV0KCkgbmFtZTogc3RyaW5nIHwgdW5kZWZpbmVkO1xuXG4gIC8qKlxuICAgKiBUaGUgaW5wdXQgZGVzY3JpcHRpb25cbiAgICovXG4gIEBJbnB1dCgpIGRlc2NyaXB0aW9uOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG5cbiAgLyoqXG4gICAqIFByZXZlbnRzIHN1Z2dlc3Rpb25zIGZyb20gYXBwZWFyaW5nIGlmIGZld2VyIHRoYW4gTiBjaGFyYWN0ZXJzIGFyZSB0eXBlZFxuICAgKiBAZGVmYXVsdCAwXG4gICAqL1xuICBASW5wdXQoKSBtaW5MZW5ndGg6IG51bWJlciA9IDA7XG5cbiAgLyoqXG4gICAqIERlZmF1bHQgdmFsdWVcbiAgICovXG4gIEBJbnB1dCgpIGRlZmF1bHRWYWx1ZTogc3RyaW5nIHwgbnVsbCA9ICcnO1xuXG4gIC8qKlxuICAgKiBGdW5jdGlvbiB0byBzZXQgYXNzaXN0aXZlIGhpbnQgbGFiZWwuIEZvciBtb3JlIGluZm9ybWF0aW9uIGh0dHBzOi8vZ2l0aHViLmNvbS9hbHBoYWdvdi9hY2Nlc3NpYmxlLWF1dG9jb21wbGV0ZT90YWI9cmVhZG1lLW92LWZpbGUjaW50ZXJuYXRpb25hbGl6YXRpb25cbiAgICovXG4gIEBJbnB1dCgpIGFzc2lzdGl2ZUhpbnRMYWJlbDogKCkgPT4gc3RyaW5nID0gKCkgPT5cbiAgICAnUXVhbmRvIGkgcmlzdWx0YXRpIGRlbCBjb21wbGV0YW1lbnRvIGF1dG9tYXRpY28gc29ubyBkaXNwb25pYmlsaSwgdXNhIGxlIGZyZWNjZSBzdSBlIGdpw7kgcGVyIHJpdmVkZXJlIGUgSW52aW8gcGVyIHNlbGV6aW9uYXJlLiBVdGVudGkgZGkgZGlzcG9zaXRpdmkgdG91Y2gsIGVzcGxvcmEgdHJhbWl0ZSB0b2NjbyBvIGNvbiBnZXN0aSBkaSBzY29ycmltZW50byc7XG5cbiAgLyoqXG4gICAqIEZ1bmN0aW9uIHRvIHNldCBsYWJlbCBpbiBjYXNlIG9mIG5vIHJlc3VsdC4gRm9yIG1vcmUgaW5mb3JtYXRpb24gaHR0cHM6Ly9naXRodWIuY29tL2FscGhhZ292L2FjY2Vzc2libGUtYXV0b2NvbXBsZXRlP3RhYj1yZWFkbWUtb3YtZmlsZSNpbnRlcm5hdGlvbmFsaXphdGlvblxuICAgKi9cbiAgQElucHV0KCkgbm9SZXN1bHRzTGFiZWw6ICgpID0+IHN0cmluZyA9ICgpID0+ICdOZXNzdW4gcmlzdWx0YXRvIHRyb3ZhdG8nO1xuXG4gIC8qKlxuICAgKiBGdW5jdGlvbiB0byBzZXQgbGFiZWwgdGhhdCBhbGVydHMgeW91IHRoYXQgcXVlcnkncyB0b28gc2hvcnQuIEZvciBtb3JlIGluZm9ybWF0aW9uIGh0dHBzOi8vZ2l0aHViLmNvbS9hbHBoYWdvdi9hY2Nlc3NpYmxlLWF1dG9jb21wbGV0ZT90YWI9cmVhZG1lLW92LWZpbGUjaW50ZXJuYXRpb25hbGl6YXRpb25cbiAgICovXG4gIEBJbnB1dCgpIHN0YXR1c1F1ZXJ5VG9vU2hvcnRMYWJlbDogKG1pblF1ZXJ5TGVuZ3RoOiBudW1iZXIpID0+IHN0cmluZyA9IG1pblF1ZXJ5TGVuZ3RoID0+XG4gICAgYERpZ2l0YSAke21pblF1ZXJ5TGVuZ3RofSBvIHBpw7kgY2FyYXR0ZXJpIHBlciBtb3N0cmFyZSBsZSBvcHppb25pIGRpIHJpY2VyY2FgO1xuXG4gIC8qKlxuICAgKiBGdW5jdGlvbiB0byBzZXQgbm8gcmVzdWx0cyBsYWJlbC4gRm9yIG1vcmUgaW5mb3JtYXRpb24gaHR0cHM6Ly9naXRodWIuY29tL2FscGhhZ292L2FjY2Vzc2libGUtYXV0b2NvbXBsZXRlP3RhYj1yZWFkbWUtb3YtZmlsZSNpbnRlcm5hdGlvbmFsaXphdGlvblxuICAgKi9cbiAgQElucHV0KCkgc3RhdHVzTm9SZXN1bHRzTGFiZWw6ICgpID0+IHN0cmluZyA9ICgpID0+ICdOZXNzdW4gcmlzdWx0YXRvIGRpIHJpY2VyY2EnO1xuXG4gIC8qKlxuICAgKiBGdW5jdGlvbiB0byBzZXQgc2VsZWN0ZWQgb3B0aW9uIGxhYmVsLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBodHRwczovL2dpdGh1Yi5jb20vYWxwaGFnb3YvYWNjZXNzaWJsZS1hdXRvY29tcGxldGU/dGFiPXJlYWRtZS1vdi1maWxlI2ludGVybmF0aW9uYWxpemF0aW9uXG4gICAqL1xuICBASW5wdXQoKSBzdGF0dXNTZWxlY3RlZE9wdGlvbkxhYmVsOiAoc2VsZWN0ZWRPcHRpb246IHN0cmluZywgbGVuZ3RoOiBudW1iZXIsIGluZGV4OiBudW1iZXIpID0+IHN0cmluZyA9IChzZWxlY3RlZE9wdGlvbiwgbGVuZ3RoLCBpbmRleCkgPT5cbiAgICBgJHtzZWxlY3RlZE9wdGlvbn0gJHtpbmRleCArIDF9IGRpICR7bGVuZ3RofSDDqCBzb3R0b2xpbmVhdG9gO1xuXG4gIC8qKlxuICAgKiBGdW5jdGlvbiB0byBzZXQgc3RhdHVzIHJlc3VsdHMgbGFiZWwuIEZvciBtb3JlIGluZm9ybWF0aW9uIGh0dHBzOi8vZ2l0aHViLmNvbS9hbHBoYWdvdi9hY2Nlc3NpYmxlLWF1dG9jb21wbGV0ZT90YWI9cmVhZG1lLW92LWZpbGUjaW50ZXJuYXRpb25hbGl6YXRpb25cbiAgICovXG4gIEBJbnB1dCgpIHN0YXR1c1Jlc3VsdHNMYWJlbDogKGxlbmd0aDogbnVtYmVyLCBjb250ZW50U2VsZWN0ZWRPcHRpb246IHN0cmluZykgPT4gc3RyaW5nID0gKGxlbmd0aCwgY29udGVudFNlbGVjdGVkT3B0aW9uKSA9PiB7XG4gICAgY29uc3Qgd29yZHMgPSB7XG4gICAgICByZXN1bHQ6IGxlbmd0aCA9PT0gMSA/ICdyaXN1bHRhdG8nIDogJ3Jpc3VsdGF0aScsXG4gICAgICBpczogbGVuZ3RoID09PSAxID8gJ8OoJyA6ICdzb25vJyxcbiAgICAgIGF2YWlsYWJsZTogbGVuZ3RoID09PSAxID8gJ2Rpc3BvbmliaWxlJyA6ICdkaXNwb25pYmlsaScsXG4gICAgfTtcblxuICAgIHJldHVybiBgJHtsZW5ndGh9ICR7d29yZHMucmVzdWx0fSAke3dvcmRzLmlzfSAke3dvcmRzLmF2YWlsYWJsZX0uICR7Y29udGVudFNlbGVjdGVkT3B0aW9ufWA7XG4gIH07XG5cbiAgLyoqXG4gICAqIEZpcmVkIHdoZW4gdmFsdWUgY2hhbmdlc1xuICAgKi9cbiAgQE91dHB1dCgpIHNlbGVjdGVkID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuXG4gIEBWaWV3Q2hpbGQoJ3NlbGVjdEF1dG9jb21wbGV0ZScpIHByaXZhdGUgc2VsZWN0QXV0b2NvbXBsZXRlRWw/OiBFbGVtZW50UmVmPEhUTUxCdXR0b25FbGVtZW50PjtcblxuICBwcml2YXRlIHNlbGVjdEF1dG9jb21wbGV0ZT86IFNlbGVjdEF1dG9jb21wbGV0ZTtcblxuICBwcml2YXRlIHZhbHVlOiBzdHJpbmcgfCB1bmRlZmluZWQgPSAnJztcbiAgcHJpdmF0ZSBfaW50ZXJ2YWw6IGFueSA9IDA7XG4gIHByaXZhdGUgX2lucHV0RWw6IEhUTUxFbGVtZW50IHwgbnVsbCA9IG51bGw7XG5cbiAgb3ZlcnJpZGUgbmdPbkluaXQoKSB7XG4gICAgc3VwZXIubmdPbkluaXQoKTtcbiAgICBpZiAoIXRoaXMuY29udHJvbC52YWx1ZSAmJiAhIXRoaXMudmFsdWUpIHtcbiAgICAgIHRoaXMud3JpdGVWYWx1ZSh0aGlzLnZhbHVlKTtcbiAgICAgIHRoaXMub25DaGFuZ2UodGhpcy52YWx1ZSk7XG4gICAgfVxuICB9XG5cbiAgY2xlYXIoKSB7XG4gICAgKHRoaXMuX2lucHV0RWwgYXMgSFRNTElucHV0RWxlbWVudCkudmFsdWUgPSAnJztcbiAgfVxuXG4gIF9maW5kSW5wdXQoKSB7XG4gICAgdGhpcy5faW50ZXJ2YWwgPSBzZXRJbnRlcnZhbCgoKSA9PiB7XG4gICAgICB0aGlzLl9pbnB1dEVsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5pZCk7XG4gICAgICBpZiAodGhpcy5faW5wdXRFbCkge1xuICAgICAgICBjbGVhckludGVydmFsKHRoaXMuX2ludGVydmFsKTtcbiAgICAgICAgdGhpcy5faW5pdElucHV0RWwoKTtcbiAgICAgIH1cbiAgICB9LCA1MDApO1xuICB9XG5cbiAgcHJpdmF0ZSBfc2V0QW5kQ2hlY2sodmFsdWU6IHN0cmluZykge1xuICAgIHRoaXMudmFsdWUgPSB2YWx1ZSA9PSAnJyA/IHVuZGVmaW5lZCA6IHZhbHVlO1xuICAgIGlmICh0aGlzLmNvbnRyb2wudG91Y2hlZCkge1xuICAgICAgdGhpcy53cml0ZVZhbHVlKHRoaXMudmFsdWUpO1xuICAgICAgdGhpcy5vbkNoYW5nZSh0aGlzLnZhbHVlKTtcbiAgICB9XG4gICAgaWYgKHRoaXMuaXNWYWxpZCA9PSBmYWxzZSAmJiB0aGlzLmlzSW52YWxpZCA9PSBmYWxzZSkge1xuICAgICAgdGhpcy5faW5wdXRFbD8uY2xhc3NMaXN0LnJlbW92ZSgnanVzdC12YWxpZGF0ZS1zdWNjZXNzLWZpZWxkJyk7XG4gICAgICB0aGlzLl9pbnB1dEVsPy5jbGFzc0xpc3QucmVtb3ZlKCdpcy1pbnZhbGlkJyk7XG4gICAgfSBlbHNlIGlmICh0aGlzLmlzVmFsaWQgPT0gdHJ1ZSkge1xuICAgICAgdGhpcy5faW5wdXRFbD8uY2xhc3NMaXN0LmFkZCgnanVzdC12YWxpZGF0ZS1zdWNjZXNzLWZpZWxkJyk7XG4gICAgICB0aGlzLl9pbnB1dEVsPy5jbGFzc0xpc3QucmVtb3ZlKCdpcy1pbnZhbGlkJyk7XG4gICAgfSBlbHNlIGlmICh0aGlzLmlzSW52YWxpZCA9PSB0cnVlKSB7XG4gICAgICB0aGlzLl9pbnB1dEVsPy5jbGFzc0xpc3QuYWRkKCdpcy1pbnZhbGlkJyk7XG4gICAgICB0aGlzLl9pbnB1dEVsPy5jbGFzc0xpc3QucmVtb3ZlKCdqdXN0LXZhbGlkYXRlLXN1Y2Nlc3MtZmllbGQnKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIF9pbml0SW5wdXRFbCgpIHtcbiAgICBpZiAodGhpcy5faW5wdXRFbCkge1xuICAgICAgdGhpcy5faW5wdXRFbC5vbmZvY3VzID0gKGV2OiBFdmVudCkgPT4gdGhpcy5fc2V0QW5kQ2hlY2soKGV2LnRhcmdldCBhcyBIVE1MSW5wdXRFbGVtZW50KS52YWx1ZSk7XG4gICAgICB0aGlzLl9pbnB1dEVsLm9uYmx1ciA9IChldjogRXZlbnQpID0+IHRoaXMuX3NldEFuZENoZWNrKChldi50YXJnZXQgYXMgSFRNTElucHV0RWxlbWVudCkudmFsdWUpO1xuICAgICAgdGhpcy5faW5wdXRFbC5vbmlucHV0ID0gKGV2OiBFdmVudCkgPT4ge1xuICAgICAgICB0aGlzLm1hcmtBc1RvdWNoZWQoKTtcbiAgICAgICAgdGhpcy5fc2V0QW5kQ2hlY2soKGV2LnRhcmdldCBhcyBIVE1MSW5wdXRFbGVtZW50KS52YWx1ZSk7XG4gICAgICB9O1xuICAgIH1cbiAgfVxuXG4gIG92ZXJyaWRlIG5nQWZ0ZXJWaWV3SW5pdCgpIHtcbiAgICBpZiAodGhpcy5zZWxlY3RBdXRvY29tcGxldGVFbCkge1xuICAgICAgc3VwZXIubmdBZnRlclZpZXdJbml0KCk7XG4gICAgICBjb25zdCBlbGVtZW50ID0gdGhpcy5zZWxlY3RBdXRvY29tcGxldGVFbC5uYXRpdmVFbGVtZW50O1xuICAgICAgdGhpcy5zZWxlY3RBdXRvY29tcGxldGUgPSBuZXcgU2VsZWN0QXV0b2NvbXBsZXRlKGVsZW1lbnQsIHtcbiAgICAgICAgaWQ6IHRoaXMuaWQsXG4gICAgICAgIG5hbWU6IHRoaXMubmFtZSB8fCB0aGlzLmlkLFxuICAgICAgICBzb3VyY2U6IHRoaXMuc291cmNlLFxuICAgICAgICByZXF1aXJlZDogdGhpcy5yZXF1aXJlZCxcbiAgICAgICAgbWluTGVuZ3RoOiB0aGlzLm1pbkxlbmd0aCxcbiAgICAgICAgZGVmYXVsdFZhbHVlOiB0aGlzLmRlZmF1bHRWYWx1ZSxcbiAgICAgICAgdEFzc2lzdGl2ZUhpbnQ6IHRoaXMuYXNzaXN0aXZlSGludExhYmVsLFxuICAgICAgICB0Tm9SZXN1bHRzOiB0aGlzLm5vUmVzdWx0c0xhYmVsLFxuICAgICAgICB0U3RhdHVzUXVlcnlUb29TaG9ydDogdGhpcy5zdGF0dXNRdWVyeVRvb1Nob3J0TGFiZWwsXG4gICAgICAgIHRTdGF0dXNOb1Jlc3VsdHM6IHRoaXMuc3RhdHVzTm9SZXN1bHRzTGFiZWwsXG4gICAgICAgIHRTdGF0dXNTZWxlY3RlZE9wdGlvbjogdGhpcy5zdGF0dXNTZWxlY3RlZE9wdGlvbkxhYmVsLFxuICAgICAgICB0U3RhdHVzUmVzdWx0czogdGhpcy5zdGF0dXNSZXN1bHRzTGFiZWwsXG4gICAgICAgIG9uQ29uZmlybTogKHNlbGVjdGVkRWxlbWVudDogc3RyaW5nKSA9PiB7XG4gICAgICAgICAgdGhpcy5tYXJrQXNUb3VjaGVkKCk7XG4gICAgICAgICAgdGhpcy5fc2V0QW5kQ2hlY2soc2VsZWN0ZWRFbGVtZW50KTtcbiAgICAgICAgICB0aGlzLnNlbGVjdGVkLmVtaXQoc2VsZWN0ZWRFbGVtZW50KTtcbiAgICAgICAgfSxcbiAgICAgIH0pO1xuICAgICAgdGhpcy5fZmluZElucHV0KCk7XG4gICAgfVxuICB9XG59XG4iLCI8ZGl2IGNsYXNzPVwiZm9ybS1ncm91cFwiPlxuICBAaWYgKGxhYmVsKSB7XG4gICAgPGxhYmVsIFtmb3JdPVwiaWRcIiBbY2xhc3MuYWN0aXZlXT1cIiEhY29udHJvbC52YWx1ZVwiPnt7IGxhYmVsIH19PC9sYWJlbD5cbiAgfVxuICA8ZGl2ICNzZWxlY3RBdXRvY29tcGxldGUgbmFtZT1cInJlZ2lvblwiIFtpZF09XCJpZCArICdXcmFwcGVyJ1wiIGNsYXNzPVwiYXV0b2NvbXBsZXRlLXdyYXBwZXJcIj48L2Rpdj5cblxuICBAaWYgKGRlc2NyaXB0aW9uKSB7XG4gICAgPHNtYWxsIFtpZF09XCJpZCArICctZGVzY3JpcHRpb24nXCIgY2xhc3M9XCJmb3JtLXRleHRcIj57eyBkZXNjcmlwdGlvbiB9fTwvc21hbGw+XG4gIH1cbiAgQGlmIChpc0ludmFsaWQpIHtcbiAgICA8ZGl2IGNsYXNzPVwiZm9ybS1mZWVkYmFjayBqdXN0LXZhbGlkYXRlLWVycm9yLWxhYmVsXCIgW2lkXT1cImlkICsgJy1lcnJvcidcIj5cbiAgICAgIDxkaXYgI2N1c3RvbUVycm9yPjxuZy1jb250ZW50IHNlbGVjdD1cIltlcnJvcl1cIj48L25nLWNvbnRlbnQ+PC9kaXY+XG4gICAgICBAaWYgKCFjdXN0b21FcnJvci5oYXNDaGlsZE5vZGVzKCkpIHtcbiAgICAgICAge3sgaW52YWxpZE1lc3NhZ2UgfCBhc3luYyB9fVxuICAgICAgfVxuICAgIDwvZGl2PlxuICB9XG48L2Rpdj5cbiJdfQ==