@kushki/ng-suka
Version:
<p align="center"> <h1 align="center">Suka Components Angular</h1> <p align="center"> An Angular implementation of the Suka Design System </p> </p>
365 lines (363 loc) • 22.5 kB
JavaScript
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,constantProperty,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
*/
import { Component, Input, EventEmitter, Output, HostBinding, ElementRef, HostListener, ViewChild } from '@angular/core';
import { NG_VALUE_ACCESSOR } from '@angular/forms';
// tslint:disable-next-line: component-class-suffix
export class Search {
/**
* Creates an instance of `Search`.
* @param {?} elementRef
*/
constructor(elementRef) {
this.elementRef = elementRef;
/**
* Set to `true` for a disabled search input.
*/
this.disabled = false;
/**
* Set to `true` for a toolbar search component.
*/
this.toolbar = false;
/**
* Set to `true` for a loading search component.
*/
this.skeleton = false;
/**
* Set to `true` to expand the toolbar search component.
*/
this.active = false;
/**
* Specifies whether the search component is used in the table toolbar.
*/
this.tableSearch = false;
/**
* The unique id for the search component.
*/
this.id = `search-${Search.searchCount}`;
/**
* Sets the value attribute on the `input` element.
*/
this.value = '';
/**
* Sets the autocomplete attribute on the `input` element.
* For reference: https://developer.mozilla.org/en-US/docs/Web/HTML/Attributes/autocomplete#Values
*/
this.autocomplete = 'on';
/**
* Sets the text inside the `label` tag.
*/
this.label = 'Búsqueda'; // TODO: i18n
// TODO: i18n
/**
* Sets the placeholder attribute on the `input` element.
*/
this.placeholder = 'Buscar'; // TODO: i18n
// TODO: i18n
/**
* Used to set the `title` attribute of the clear button.
*/
this.clearButtonTitle = 'Limpiar'; // TODO: i18n
// TODO: i18n
/**
* Emits an event when value is changed.
*/
this.valueChange = new EventEmitter();
/**
* Emits an event when the clear button is clicked.
*/
this.clear = new EventEmitter();
/**
* Called when search input is blurred. Needed to properly implement `ControlValueAccessor`.
*/
this.onTouched = (/**
* @return {?}
*/
() => { });
/**
* Method set in `registerOnChange` to propagate changes back to the form.
*/
this.propagateChange = (/**
* @param {?} _
* @return {?}
*/
(_) => { });
Search.searchCount++;
}
/**
* @return {?}
*/
get containerClass() { return !this.toolbar; }
/**
* This is the initial value set to the component
* @param {?} value The input value.
* @return {?}
*/
writeValue(value) {
this.value = value;
}
/**
* Sets a method in order to propagate changes back to the form.
* @param {?} fn
* @return {?}
*/
registerOnChange(fn) {
this.propagateChange = fn;
}
/**
* Registers a callback to be triggered when the control has been touched.
* @param {?} fn Callback to be triggered when the search input is touched.
* @return {?}
*/
registerOnTouched(fn) {
this.onTouched = fn;
}
/**
* Called when text is written in the input.
* @param {?} search The input text.
* @return {?}
*/
onSearch(search) {
this.value = search;
this.doValueChange();
}
/**
* Called when clear button is clicked.
* @return {?}
*/
clearSearch() {
this.value = '';
this.clear.emit();
this.propagateChange(this.value);
}
/**
* @return {?}
*/
doValueChange() {
this.valueChange.emit(this.value);
this.propagateChange(this.value);
}
/**
* @return {?}
*/
openSearch() {
this.active = true;
setTimeout((/**
* @return {?}
*/
() => this.inputRef.nativeElement.focus()));
}
/**
* @param {?} event
* @return {?}
*/
keyDown(event) {
if (this.toolbar) {
if (event.key === 'Escape') {
this.active = false;
}
else if (event.key === 'Enter') {
this.openSearch();
}
}
}
/**
* @param {?} event
* @return {?}
*/
focusOut(event) {
if (this.toolbar &&
this.inputRef.nativeElement.value === '' &&
event.relatedTarget === null) {
this.active = false;
}
}
}
/**
* Variable used for creating unique ids for search components.
*/
Search.searchCount = 0;
Search.decorators = [
{ type: Component, args: [{
selector: 'suka-search',
template: `
<div
class="search"
[ngClass]="{
'skeleton': skeleton,
'toolbar-search': toolbar,
'toolbar-search--active': toolbar && active
}"
role="search"
>
<label class="label" [for]="id">{{label}}</label>
<div *ngIf="skeleton; else enableInput" class="search-input"></div>
<ng-template #enableInput>
<input
#input
*ngIf="!toolbar || active || value !== ''"
class="search-input"
[type]="tableSearch || !toolbar ? 'text' : 'search'"
role="search"
[id]="id"
[value]="value"
[autocomplete]="autocomplete"
[placeholder]="placeholder"
[disabled]="disabled"
[required]="required"
(input)="onSearch($event.target.value)"/>
<button *ngIf="!tableSearch && toolbar" class="toolbar-search__btn" (click)="openSearch()">
<suka-icon icon="search"></suka-icon>
</button>
<suka-icon icon="search" *ngIf="tableSearch || !toolbar" (click)="openSearch()" class="search-magnifier"></suka-icon>
</ng-template>
<button
*ngIf="tableSearch || !toolbar"
class="search-close"
[ngClass]="{
'search-close--hidden': !value || value.length === 0
}"
[title]="clearButtonTitle"
[attr.aria-label]="clearButtonTitle"
(click)="clearSearch()"
>
<suka-icon icon="x-circle"></suka-icon>
</button>
</div>
`,
providers: [
{
provide: NG_VALUE_ACCESSOR,
useExisting: Search,
multi: true
}
]
}] }
];
/** @nocollapse */
Search.ctorParameters = () => [
{ type: ElementRef }
];
Search.propDecorators = {
containerClass: [{ type: HostBinding, args: ['class.form-item',] }],
disabled: [{ type: Input }],
toolbar: [{ type: Input }],
skeleton: [{ type: Input }],
active: [{ type: Input }],
tableSearch: [{ type: Input }],
name: [{ type: Input }],
id: [{ type: Input }],
required: [{ type: Input }],
value: [{ type: Input }],
autocomplete: [{ type: Input }],
label: [{ type: Input }],
placeholder: [{ type: Input }],
clearButtonTitle: [{ type: Input }],
valueChange: [{ type: Output }],
clear: [{ type: Output }],
inputRef: [{ type: ViewChild, args: ['input', { static: false },] }],
keyDown: [{ type: HostListener, args: ['keydown', ['$event'],] }],
focusOut: [{ type: HostListener, args: ['focusout', ['$event'],] }]
};
if (false) {
/**
* Variable used for creating unique ids for search components.
* @type {?}
*/
Search.searchCount;
/**
* Set to `true` for a disabled search input.
* @type {?}
*/
Search.prototype.disabled;
/**
* Set to `true` for a toolbar search component.
* @type {?}
*/
Search.prototype.toolbar;
/**
* Set to `true` for a loading search component.
* @type {?}
*/
Search.prototype.skeleton;
/**
* Set to `true` to expand the toolbar search component.
* @type {?}
*/
Search.prototype.active;
/**
* Specifies whether the search component is used in the table toolbar.
* @type {?}
*/
Search.prototype.tableSearch;
/**
* Sets the name attribute on the `input` element.
* @type {?}
*/
Search.prototype.name;
/**
* The unique id for the search component.
* @type {?}
*/
Search.prototype.id;
/**
* Reflects the required attribute of the `input` element.
* @type {?}
*/
Search.prototype.required;
/**
* Sets the value attribute on the `input` element.
* @type {?}
*/
Search.prototype.value;
/**
* Sets the autocomplete attribute on the `input` element.
* For reference: https://developer.mozilla.org/en-US/docs/Web/HTML/Attributes/autocomplete#Values
* @type {?}
*/
Search.prototype.autocomplete;
/**
* Sets the text inside the `label` tag.
* @type {?}
*/
Search.prototype.label;
/**
* Sets the placeholder attribute on the `input` element.
* @type {?}
*/
Search.prototype.placeholder;
/**
* Used to set the `title` attribute of the clear button.
* @type {?}
*/
Search.prototype.clearButtonTitle;
/**
* Emits an event when value is changed.
* @type {?}
*/
Search.prototype.valueChange;
/**
* Emits an event when the clear button is clicked.
* @type {?}
*/
Search.prototype.clear;
/** @type {?} */
Search.prototype.inputRef;
/**
* Called when search input is blurred. Needed to properly implement `ControlValueAccessor`.
* @type {?}
*/
Search.prototype.onTouched;
/**
* Method set in `registerOnChange` to propagate changes back to the form.
* @type {?}
*/
Search.prototype.propagateChange;
/**
* @type {?}
* @protected
*/
Search.prototype.elementRef;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VhcmNoLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiJuZzovL0BrdXNoa2kvbmctc3VrYS8iLCJzb3VyY2VzIjpbImxpYi9zZWFyY2gvc2VhcmNoLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7O0FBQUEsT0FBTyxFQUNMLFNBQVMsRUFDVCxLQUFLLEVBQ0wsWUFBWSxFQUNaLE1BQU0sRUFDTixXQUFXLEVBQ1gsVUFBVSxFQUNWLFlBQVksRUFDWixTQUFTLEVBQ1YsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLGlCQUFpQixFQUF3QixNQUFNLGdCQUFnQixDQUFDO0FBMkR6RSxtREFBbUQ7QUFDbkQsTUFBTSxPQUFPLE1BQU07Ozs7O0lBMkVqQixZQUFzQixVQUFzQjtRQUF0QixlQUFVLEdBQVYsVUFBVSxDQUFZOzs7O1FBaEVuQyxhQUFRLEdBQUcsS0FBSyxDQUFDOzs7O1FBSWpCLFlBQU8sR0FBRyxLQUFLLENBQUM7Ozs7UUFJaEIsYUFBUSxHQUFHLEtBQUssQ0FBQzs7OztRQUlqQixXQUFNLEdBQUcsS0FBSyxDQUFDOzs7O1FBSWYsZ0JBQVcsR0FBRyxLQUFLLENBQUM7Ozs7UUFRcEIsT0FBRSxHQUFHLFVBQVUsTUFBTSxDQUFDLFdBQVcsRUFBRSxDQUFDOzs7O1FBUXBDLFVBQUssR0FBRyxFQUFFLENBQUM7Ozs7O1FBS1gsaUJBQVksR0FBRyxJQUFJLENBQUM7Ozs7UUFJcEIsVUFBSyxHQUFHLFVBQVUsQ0FBQyxDQUFDLGFBQWE7Ozs7O1FBSWpDLGdCQUFXLEdBQUcsUUFBUSxDQUFDLENBQUMsYUFBYTs7Ozs7UUFJckMscUJBQWdCLEdBQUcsU0FBUyxDQUFDLENBQUMsYUFBYTs7Ozs7UUFJMUMsZ0JBQVcsR0FBRyxJQUFJLFlBQVksRUFBVSxDQUFDOzs7O1FBSXpDLFVBQUssR0FBRyxJQUFJLFlBQVksRUFBRSxDQUFDOzs7O1FBcUNyQyxjQUFTOzs7UUFBYyxHQUFHLEVBQUUsR0FBRyxDQUFDLEVBQUM7Ozs7UUFL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QyxPQUFPLEVBQUUsRUFBQyxNQUFNLEVBQUUsS0FBSyxFQUFDO3NCQXNFbEMsWUFBWSxTQUFDLFNBQVMsRUFBRSxDQUFDLFFBQVEsQ0FBQzt1QkFXbEMsWUFBWSxTQUFDLFVBQVUsRUFBRSxDQUFDLFFBQVEsQ0FBQzs7Ozs7OztJQW5KcEMsbUJBQXVCOzs7OztJQU92QiwwQkFBMEI7Ozs7O0lBSTFCLHlCQUF5Qjs7Ozs7SUFJekIsMEJBQTBCOzs7OztJQUkxQix3QkFBd0I7Ozs7O0lBSXhCLDZCQUE2Qjs7Ozs7SUFJN0Isc0JBQXNCOzs7OztJQUl0QixvQkFBNkM7Ozs7O0lBSTdDLDBCQUEyQjs7Ozs7SUFJM0IsdUJBQW9COzs7Ozs7SUFLcEIsOEJBQTZCOzs7OztJQUk3Qix1QkFBNEI7Ozs7O0lBSTVCLDZCQUFnQzs7Ozs7SUFJaEMsa0NBQXNDOzs7OztJQUl0Qyw2QkFBbUQ7Ozs7O0lBSW5ELHVCQUFxQzs7SUFFckMsMEJBQTBEOzs7OztJQW1DMUQsMkJBQWlDOzs7OztJQUtqQyxpQ0FBa0M7Ozs7O0lBbkN0Qiw0QkFBZ0MiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBDb21wb25lbnQsXG4gIElucHV0LFxuICBFdmVudEVtaXR0ZXIsXG4gIE91dHB1dCxcbiAgSG9zdEJpbmRpbmcsXG4gIEVsZW1lbnRSZWYsXG4gIEhvc3RMaXN0ZW5lcixcbiAgVmlld0NoaWxkXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgTkdfVkFMVUVfQUNDRVNTT1IsIENvbnRyb2xWYWx1ZUFjY2Vzc29yIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdzdWthLXNlYXJjaCcsXG4gIHRlbXBsYXRlOiBgXG4gIDxkaXZcbiAgICBjbGFzcz1cInNlYXJjaFwiXG4gICAgW25nQ2xhc3NdPVwie1xuICAgICAgJ3NrZWxldG9uJzogc2tlbGV0b24sXG4gICAgICAndG9vbGJhci1zZWFyY2gnOiB0b29sYmFyLFxuICAgICAgJ3Rvb2xiYXItc2VhcmNoLS1hY3RpdmUnOiB0b29sYmFyICYmIGFjdGl2ZVxuICAgIH1cIlxuICAgIHJvbGU9XCJzZWFyY2hcIlxuICA+XG4gICAgPGxhYmVsIGNsYXNzPVwibGFiZWxcIiBbZm9yXT1cImlkXCI+e3tsYWJlbH19PC9sYWJlbD5cblxuICAgIDxkaXYgKm5nSWY9XCJza2VsZXRvbjsgZWxzZSBlbmFibGVJbnB1dFwiIGNsYXNzPVwic2VhcmNoLWlucHV0XCI+PC9kaXY+XG4gICAgPG5nLXRlbXBsYXRlICNlbmFibGVJbnB1dD5cbiAgICAgIDxpbnB1dFxuICAgICAgICAjaW5wdXRcbiAgICAgICAgKm5nSWY9XCIhdG9vbGJhciB8fCBhY3RpdmUgfHwgdmFsdWUgIT09ICcnXCJcbiAgICAgICAgY2xhc3M9XCJzZWFyY2gtaW5wdXRcIlxuICAgICAgICBbdHlwZV09XCJ0YWJsZVNlYXJjaCB8fCAhdG9vbGJhciA/ICd0ZXh0JyA6ICdzZWFyY2gnXCJcbiAgICAgICAgcm9sZT1cInNlYXJjaFwiXG4gICAgICAgIFtpZF09XCJpZFwiXG4gICAgICAgIFt2YWx1ZV09XCJ2YWx1ZVwiXG4gICAgICAgIFthdXRvY29tcGxldGVdPVwiYXV0b2NvbXBsZXRlXCJcbiAgICAgICAgW3BsYWNlaG9sZGVyXT1cInBsYWNlaG9sZGVyXCJcbiAgICAgICAgW2Rpc2FibGVkXT1cImRpc2FibGVkXCJcbiAgICAgICAgW3JlcXVpcmVkXT1cInJlcXVpcmVkXCJcbiAgICAgICAgKGlucHV0KT1cIm9uU2VhcmNoKCRldmVudC50YXJnZXQudmFsdWUpXCIvPlxuICAgICAgPGJ1dHRvbiAqbmdJZj1cIiF0YWJsZVNlYXJjaCAmJiB0b29sYmFyXCIgY2xhc3M9XCJ0b29sYmFyLXNlYXJjaF9fYnRuXCIgKGNsaWNrKT1cIm9wZW5TZWFyY2goKVwiPlxuICAgICAgICA8c3VrYS1pY29uIGljb249XCJzZWFyY2hcIj48L3N1a2EtaWNvbj5cbiAgICAgIDwvYnV0dG9uPlxuICAgICAgPHN1a2EtaWNvbiBpY29uPVwic2VhcmNoXCIgICpuZ0lmPVwidGFibGVTZWFyY2ggfHwgIXRvb2xiYXJcIiAoY2xpY2spPVwib3BlblNlYXJjaCgpXCIgY2xhc3M9XCJzZWFyY2gtbWFnbmlmaWVyXCI+PC9zdWthLWljb24+XG4gICAgPC9uZy10ZW1wbGF0ZT5cblxuICAgIDxidXR0b25cbiAgICAgICpuZ0lmPVwidGFibGVTZWFyY2ggfHwgIXRvb2xiYXJcIlxuICAgICAgY2xhc3M9XCJzZWFyY2gtY2xvc2VcIlxuICAgICAgW25nQ2xhc3NdPVwie1xuICAgICAgICAnc2VhcmNoLWNsb3NlLS1oaWRkZW4nOiAhdmFsdWUgfHwgdmFsdWUubGVuZ3RoID09PSAwXG4gICAgICB9XCJcbiAgICAgIFt0aXRsZV09XCJjbGVhckJ1dHRvblRpdGxlXCJcbiAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwiY2xlYXJCdXR0b25UaXRsZVwiXG4gICAgICAoY2xpY2spPVwiY2xlYXJTZWFyY2goKVwiXG4gICAgPlxuICAgICAgPHN1a2EtaWNvbiBpY29uPVwieC1jaXJjbGVcIj48L3N1a2EtaWNvbj5cbiAgICA8L2J1dHRvbj5cbiAgPC9kaXY+XG4gIGAsXG4gIHByb3ZpZGVyczogW1xuICAgIHtcbiAgICAgIHByb3ZpZGU6IE5HX1ZBTFVFX0FDQ0VTU09SLFxuICAgICAgdXNlRXhpc3Rpbmc6IFNlYXJjaCxcbiAgICAgIG11bHRpOiB0cnVlXG4gICAgfVxuICBdXG59KVxuLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOiBjb21wb25lbnQtY2xhc3Mtc3VmZml4XG5leHBvcnQgY2xhc3MgU2VhcmNoIGltcGxlbWVudHMgQ29udHJvbFZhbHVlQWNjZXNzb3Ige1xuICAvKipcbiAgICogVmFyaWFibGUgdXNlZCBmb3IgY3JlYXRpbmcgdW5pcXVlIGlkcyBmb3Igc2VhcmNoIGNvbXBvbmVudHMuXG4gICAqL1xuICBzdGF0aWMgc2VhcmNoQ291bnQgPSAwO1xuXG4gIEBIb3N0QmluZGluZygnY2xhc3MuZm9ybS1pdGVtJykgZ2V0IGNvbnRhaW5lckNsYXNzKCkgeyByZXR1cm4gIXRoaXMudG9vbGJhcjsgfVxuXG4gIC8qKlxuICAgKiBTZXQgdG8gYHRydWVgIGZvciBhIGRpc2FibGVkIHNlYXJjaCBpbnB1dC5cbiAgICovXG4gIEBJbnB1dCgpIGRpc2FibGVkID0gZmFsc2U7XG4gIC8qKlxuICAgKiBTZXQgdG8gYHRydWVgIGZvciBhIHRvb2xiYXIgc2VhcmNoIGNvbXBvbmVudC5cbiAgICovXG4gIEBJbnB1dCgpIHRvb2xiYXIgPSBmYWxzZTtcbiAgLyoqXG4gICAqIFNldCB0byBgdHJ1ZWAgZm9yIGEgbG9hZGluZyBzZWFyY2ggY29tcG9uZW50LlxuICAgKi9cbiAgQElucHV0KCkgc2tlbGV0b24gPSBmYWxzZTtcbiAgLyoqXG4gICAqIFNldCB0byBgdHJ1ZWAgdG8gZXhwYW5kIHRoZSB0b29sYmFyIHNlYXJjaCBjb21wb25lbnQuXG4gICAqL1xuICBASW5wdXQoKSBhY3RpdmUgPSBmYWxzZTtcbiAgLyoqXG4gICAqIFNwZWNpZmllcyB3aGV0aGVyIHRoZSBzZWFyY2ggY29tcG9uZW50IGlzIHVzZWQgaW4gdGhlIHRhYmxlIHRvb2xiYXIuXG4gICAqL1xuICBASW5wdXQoKSB0YWJsZVNlYXJjaCA9IGZhbHNlO1xuICAvKipcbiAgICogU2V0cyB0aGUgbmFtZSBhdHRyaWJ1dGUgb24gdGhlIGBpbnB1dGAgZWxlbWVudC5cbiAgICovXG4gIEBJbnB1dCgpIG5hbWU6IHN0cmluZztcbiAgLyoqXG4gICAqIFRoZSB1bmlxdWUgaWQgZm9yIHRoZSBzZWFyY2ggY29tcG9uZW50LlxuICAgKi9cbiAgQElucHV0KCkgaWQgPSBgc2VhcmNoLSR7U2VhcmNoLnNlYXJjaENvdW50fWA7XG4gIC8qKlxuICAgKiBSZWZsZWN0cyB0aGUgcmVxdWlyZWQgYXR0cmlidXRlIG9mIHRoZSBgaW5wdXRgIGVsZW1lbnQuXG4gICAqL1xuICBASW5wdXQoKSByZXF1aXJlZDogYm9vbGVhbjtcbiAgLyoqXG4gICAqIFNldHMgdGhlIHZhbHVlIGF0dHJpYnV0ZSBvbiB0aGUgYGlucHV0YCBlbGVtZW50LlxuICAgKi9cbiAgQElucHV0KCkgdmFsdWUgPSAnJztcbiAgLyoqXG4gICAqIFNldHMgdGhlIGF1dG9jb21wbGV0ZSBhdHRyaWJ1dGUgb24gdGhlIGBpbnB1dGAgZWxlbWVudC5cbiAgICogRm9yIHJlZmVyZW5jZTogaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvSFRNTC9BdHRyaWJ1dGVzL2F1dG9jb21wbGV0ZSNWYWx1ZXNcbiAgICovXG4gIEBJbnB1dCgpIGF1dG9jb21wbGV0ZSA9ICdvbic7XG4gIC8qKlxuICAgKiBTZXRzIHRoZSB0ZXh0IGluc2lkZSB0aGUgYGxhYmVsYCB0YWcuXG4gICAqL1xuICBASW5wdXQoKSBsYWJlbCA9ICdCw7pzcXVlZGEnOyAvLyBUT0RPOiBpMThuXG4gIC8qKlxuICAgKiBTZXRzIHRoZSBwbGFjZWhvbGRlciBhdHRyaWJ1dGUgb24gdGhlIGBpbnB1dGAgZWxlbWVudC5cbiAgICovXG4gIEBJbnB1dCgpIHBsYWNlaG9sZGVyID0gJ0J1c2Nhcic7IC8vIFRPRE86IGkxOG5cbiAgLyoqXG4gICAqIFVzZWQgdG8gc2V0IHRoZSBgdGl0bGVgIGF0dHJpYnV0ZSBvZiB0aGUgY2xlYXIgYnV0dG9uLlxuICAgKi9cbiAgQElucHV0KCkgY2xlYXJCdXR0b25UaXRsZSA9ICdMaW1waWFyJzsgLy8gVE9ETzogaTE4blxuICAvKipcbiAgICogRW1pdHMgYW4gZXZlbnQgd2hlbiB2YWx1ZSBpcyBjaGFuZ2VkLlxuICAgKi9cbiAgQE91dHB1dCgpIHZhbHVlQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxzdHJpbmc+KCk7XG4gIC8qKlxuICAgKiBFbWl0cyBhbiBldmVudCB3aGVuIHRoZSBjbGVhciBidXR0b24gaXMgY2xpY2tlZC5cbiAgICovXG4gIEBPdXRwdXQoKSBjbGVhciA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcblxuICBAVmlld0NoaWxkKCdpbnB1dCcsIHtzdGF0aWM6IGZhbHNlfSkgaW5wdXRSZWY6IEVsZW1lbnRSZWY7XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgYFNlYXJjaGAuXG4gICAqL1xuICBjb25zdHJ1Y3Rvcihwcm90ZWN0ZWQgZWxlbWVudFJlZjogRWxlbWVudFJlZikge1xuICAgIFNlYXJjaC5zZWFyY2hDb3VudCsrO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoaXMgaXMgdGhlIGluaXRpYWwgdmFsdWUgc2V0IHRvIHRoZSBjb21wb25lbnRcbiAgICogQHBhcmFtIHZhbHVlIFRoZSBpbnB1dCB2YWx1ZS5cbiAgICovXG4gIHB1YmxpYyB3cml0ZVZhbHVlKHZhbHVlOiBhbnkpIHtcbiAgICB0aGlzLnZhbHVlID0gdmFsdWU7XG4gIH1cblxuICAvKipcbiAgICogU2V0cyBhIG1ldGhvZCBpbiBvcmRlciB0byBwcm9wYWdhdGUgY2hhbmdlcyBiYWNrIHRvIHRoZSBmb3JtLlxuICAgKi9cbiAgcHVibGljIHJlZ2lzdGVyT25DaGFuZ2UoZm46IGFueSkge1xuICAgIHRoaXMucHJvcGFnYXRlQ2hhbmdlID0gZm47XG4gIH1cblxuICAvKipcbiAgICogUmVnaXN0ZXJzIGEgY2FsbGJhY2sgdG8gYmUgdHJpZ2dlcmVkIHdoZW4gdGhlIGNvbnRyb2wgaGFzIGJlZW4gdG91Y2hlZC5cbiAgICogQHBhcmFtIGZuIENhbGxiYWNrIHRvIGJlIHRyaWdnZXJlZCB3aGVuIHRoZSBzZWFyY2ggaW5wdXQgaXMgdG91Y2hlZC5cbiAgICovXG4gIHB1YmxpYyByZWdpc3Rlck9uVG91Y2hlZChmbjogYW55KSB7XG4gICAgdGhpcy5vblRvdWNoZWQgPSBmbjtcbiAgfVxuXG4gIC8qKlxuICAgKiBDYWxsZWQgd2hlbiBzZWFyY2ggaW5wdXQgaXMgYmx1cnJlZC4gTmVlZGVkIHRvIHByb3Blcmx5IGltcGxlbWVudCBgQ29udHJvbFZhbHVlQWNjZXNzb3JgLlxuICAgKi9cbiAgb25Ub3VjaGVkOiAoKSA9PiBhbnkgPSAoKSA9PiB7IH07XG5cbiAgLyoqXG4gICAqIE1ldGhvZCBzZXQgaW4gYHJlZ2lzdGVyT25DaGFuZ2VgIHRvIHByb3BhZ2F0ZSBjaGFuZ2VzIGJhY2sgdG8gdGhlIGZvcm0uXG4gICAqL1xuICBwcm9wYWdhdGVDaGFuZ2UgPSAoXzogYW55KSA9PiB7IH07XG5cbiAgLyoqXG4gICAqIENhbGxlZCB3aGVuIHRleHQgaXMgd3JpdHRlbiBpbiB0aGUgaW5wdXQuXG4gICAqIEBwYXJhbSBzZWFyY2ggVGhlIGlucHV0IHRleHQuXG4gICAqL1xuICBvblNlYXJjaChzZWFyY2g6IHN0cmluZykge1xuICAgIHRoaXMudmFsdWUgPSBzZWFyY2g7XG4gICAgdGhpcy5kb1ZhbHVlQ2hhbmdlKCk7XG4gIH1cblxuICAvKipcbiAgICogQ2FsbGVkIHdoZW4gY2xlYXIgYnV0dG9uIGlzIGNsaWNrZWQuXG4gICAqL1xuICBjbGVhclNlYXJjaCgpOiB2b2lkIHtcbiAgICB0aGlzLnZhbHVlID0gJyc7XG4gICAgdGhpcy5jbGVhci5lbWl0KCk7XG4gICAgdGhpcy5wcm9wYWdhdGVDaGFuZ2UodGhpcy52YWx1ZSk7XG4gIH1cblxuICBkb1ZhbHVlQ2hhbmdlKCkge1xuICAgIHRoaXMudmFsdWVDaGFuZ2UuZW1pdCh0aGlzLnZhbHVlKTtcbiAgICB0aGlzLnByb3BhZ2F0ZUNoYW5nZSh0aGlzLnZhbHVlKTtcbiAgfVxuXG4gIG9wZW5TZWFyY2goKSB7XG4gICAgdGhpcy5hY3RpdmUgPSB0cnVlO1xuICAgIHNldFRpbWVvdXQoKCkgPT4gdGhpcy5pbnB1dFJlZi5uYXRpdmVFbGVtZW50LmZvY3VzKCkpO1xuICB9XG5cbiAgQEhvc3RMaXN0ZW5lcigna2V5ZG93bicsIFsnJGV2ZW50J10pXG4gIGtleURvd24oZXZlbnQ6IEtleWJvYXJkRXZlbnQpIHtcbiAgICBpZiAodGhpcy50b29sYmFyKSB7XG4gICAgICBpZiAoZXZlbnQua2V5ID09PSAnRXNjYXBlJykge1xuICAgICAgICB0aGlzLmFjdGl2ZSA9IGZhbHNlO1xuICAgICAgfSBlbHNlIGlmIChldmVudC5rZXkgPT09ICdFbnRlcicpIHtcbiAgICAgICAgdGhpcy5vcGVuU2VhcmNoKCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgQEhvc3RMaXN0ZW5lcignZm9jdXNvdXQnLCBbJyRldmVudCddKVxuICBmb2N1c091dChldmVudCkge1xuICAgIGlmICh0aGlzLnRvb2xiYXIgJiZcbiAgICAgIHRoaXMuaW5wdXRSZWYubmF0aXZlRWxlbWVudC52YWx1ZSA9PT0gJycgJiZcbiAgICAgIGV2ZW50LnJlbGF0ZWRUYXJnZXQgPT09IG51bGwpIHtcbiAgICAgIHRoaXMuYWN0aXZlID0gZmFsc2U7XG4gICAgfVxuICB9XG59XG4iXX0=