UNPKG

@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>

285 lines 18.8 kB
/** * @fileoverview added by tsickle * @suppress {checkTypes,constantProperty,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc */ // tslint:disable: max-line-length import { Component, Input, Output, ViewChild, ElementRef, HostListener, EventEmitter, TemplateRef, forwardRef, } from '@angular/core'; import { NG_VALUE_ACCESSOR } from '@angular/forms'; export class Select { constructor() { this._value = ''; /** * `inline` or `default` select displays */ this.display = 'default'; /** * Sets the unique ID. Defaults to `select-${total count of selects instantiated}` */ this.id = `select-${Select.selectCount++}`; /** * Set to true to disable component. */ this.disabled = false; /** * Set to true for a loading select. */ this.skeleton = false; /** * Set to `true` for an invalid select component. */ this.invalid = false; /** * Set to `true` for an valid select component. */ this.valid = false; /** * emits the selected options `value` */ this.valueChange = new EventEmitter(); /** * placeholder declarations. Replaced by the functions provided to `registerOnChange` and `registerOnTouched` */ this.onChangeHandler = (/** * @param {?} _ * @return {?} */ (_) => { }); this.onTouchedHandler = (/** * @return {?} */ () => { }); } /** * @return {?} */ get value() { // return this._value; return this.select.nativeElement.value || this._value; } /** * @param {?} v * @return {?} */ set value(v) { this._value = v; this.select.nativeElement.value = v; } /** * Receives a value from the model. * @param {?} obj * @return {?} */ writeValue(obj) { this.value = obj; } /** * Registers a listener that notifies the model when the control updates * @param {?} fn * @return {?} */ registerOnChange(fn) { this.onChangeHandler = fn; } /** * Registers a listener that notifies the model when the control is blurred * @param {?} fn * @return {?} */ registerOnTouched(fn) { this.onTouchedHandler = fn; } /** * Sets the disabled state through the model * @param {?} isDisabled * @return {?} */ setDisabledState(isDisabled) { this.disabled = isDisabled; } /** * Handles the change event from the `select`. * Sends events to the change handler and emits a `selected` event. * @param {?} event * @return {?} */ onChange(event) { this.onChangeHandler(event.target.value); this.valueChange.emit(event.target.value); } /** * Listens for the host blurring, and notifies the model * @param {?} target * @return {?} */ onBlur(target) { this.onTouchedHandler(); } /** * @param {?} value * @return {?} */ isTemplate(value) { return value instanceof TemplateRef; } /** * @return {?} */ ngOnInit() { // console.log(this.select.nativeElement); this.value = this.select.nativeElement.value; } } /** * Tracks the total number of selects instantiated. Used to generate unique IDs */ Select.selectCount = 0; Select.decorators = [ { type: Component, args: [{ selector: 'suka-select', template: ` <div class="form-item"> <div [ngClass]="{ 'select--inline': display === 'inline', 'skeleton': skeleton }" class="select" > <label *ngIf="skeleton && label" [for]="id" class="label skeleton"></label> <label *ngIf="!skeleton && label" [for]="id" class="label"> <ng-container *ngIf="!isTemplate(label)">{{label}}</ng-container> <ng-template *ngIf="isTemplate(label)" [ngTemplateOutlet]="label"></ng-template> </label> <div *ngIf="helperText" class="form__helper-text"> <ng-container *ngIf="!isTemplate(helperText)">{{helperText}}</ng-container> <ng-template *ngIf="isTemplate(helperText)" [ngTemplateOutlet]="helperText"></ng-template> </div> <div class="select-input__wrapper" [attr.data-invalid]="(invalid ? true : null)" [attr.data-valid]="(valid ? true : null)"> <select #selectInput [attr.id]="id" [disabled]="disabled" (change)="onChange($event)" [value]="value" (blur)="onBlur($event)" class="select-input"> <ng-content></ng-content> </select> <suka-icon *ngIf="invalid" icon="alert-circle" class="select__invalid-icon"></suka-icon> <suka-icon *ngIf="valid" icon="check" class="select__valid-icon"></suka-icon> <suka-icon *ngIf="!skeleton" class="select__arrow" icon="chevron-down"></suka-icon> </div> <div *ngIf="invalid" class="form-requirement"> <ng-container *ngIf="!isTemplate(invalidText)">{{invalidText}}</ng-container> <ng-template *ngIf="isTemplate(invalidText)" [ngTemplateOutlet]="invalidText"></ng-template> </div> </div> </div> `, providers: [ { provide: NG_VALUE_ACCESSOR, useExisting: forwardRef((/** * @return {?} */ () => Select)), multi: true } ], styles: [` [data-invalid] ~ .select__arrow { bottom: 2.25rem; } `] }] } ]; Select.propDecorators = { display: [{ type: Input }], label: [{ type: Input }], helperText: [{ type: Input }], invalidText: [{ type: Input }], id: [{ type: Input }], disabled: [{ type: Input }], skeleton: [{ type: Input }], invalid: [{ type: Input }], valid: [{ type: Input }], valueChange: [{ type: Output }], select: [{ type: ViewChild, args: ['selectInput', { static: true },] }], onBlur: [{ type: HostListener, args: ['blur', ['$event.target'],] }] }; if (false) { /** * Tracks the total number of selects instantiated. Used to generate unique IDs * @type {?} */ Select.selectCount; /** * @type {?} * @private */ Select.prototype._value; /** * `inline` or `default` select displays * @type {?} */ Select.prototype.display; /** * Label for the select. Appears above the input. * @type {?} */ Select.prototype.label; /** * Optional helper text that appears under the label. * @type {?} */ Select.prototype.helperText; /** * Sets the invalid text. * @type {?} */ Select.prototype.invalidText; /** * Sets the unique ID. Defaults to `select-${total count of selects instantiated}` * @type {?} */ Select.prototype.id; /** * Set to true to disable component. * @type {?} */ Select.prototype.disabled; /** * Set to true for a loading select. * @type {?} */ Select.prototype.skeleton; /** * Set to `true` for an invalid select component. * @type {?} */ Select.prototype.invalid; /** * Set to `true` for an valid select component. * @type {?} */ Select.prototype.valid; /** * emits the selected options `value` * @type {?} */ Select.prototype.valueChange; /** @type {?} */ Select.prototype.select; /** * placeholder declarations. Replaced by the functions provided to `registerOnChange` and `registerOnTouched` * @type {?} * @protected */ Select.prototype.onChangeHandler; /** * @type {?} * @protected */ Select.prototype.onTouchedHandler; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VsZWN0LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiJuZzovL0BrdXNoa2kvbmctc3VrYS8iLCJzb3VyY2VzIjpbImxpYi9zZWxlY3Qvc2VsZWN0LmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUVBLE9BQU8sRUFDTCxTQUFTLEVBQ1QsS0FBSyxFQUNMLE1BQU0sRUFDTixTQUFTLEVBQ1QsVUFBVSxFQUNWLFlBQVksRUFDWixZQUFZLEVBQ1osV0FBVyxFQUNYLFVBQVUsR0FFWCxNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQXdCLGlCQUFpQixFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUF5RHpFLE1BQU0sT0FBTyxNQUFNO0lBdkRuQjtRQTZEVSxXQUFNLEdBQUcsRUFBRSxDQUFDOzs7O1FBS1gsWUFBTyxHQUF5QixTQUFTLENBQUM7Ozs7UUFnQjFDLE9BQUUsR0FBRyxVQUFVLE1BQU0sQ0FBQyxXQUFXLEVBQUUsRUFBRSxDQUFDOzs7O1FBSXRDLGFBQVEsR0FBRyxLQUFLLENBQUM7Ozs7UUFJakIsYUFBUSxHQUFHLEtBQUssQ0FBQzs7OztRQUlqQixZQUFPLEdBQUcsS0FBSyxDQUFDOzs7O1FBS2hCLFVBQUssR0FBRyxLQUFLLENBQUM7Ozs7UUFLYixnQkFBVyxHQUFHLElBQUksWUFBWSxFQUFFLENBQUM7Ozs7UUFrRWpDLG9CQUFlOzs7O1FBQUcsQ0FBQyxDQUFNLEVBQUUsRUFBRSxHQUFHLENBQUMsRUFBQztRQUNsQyxxQkFBZ0I7OztRQUFHLEdBQUcsRUFBRSxHQUFHLENBQUMsRUFBQztJQU16QyxDQUFDOzs7O0lBckVDLElBQUksS0FBSztRQUNQLHNCQUFzQjtRQUN0QixPQUFPLElBQUksQ0FBQyxNQUFNLENBQUMsYUFBYSxDQUFDLEtBQUssSUFBSSxJQUFJLENBQUMsTUFBTSxDQUFDO0lBQ3hELENBQUM7Ozs7O0lBRUQsSUFBSSxLQUFLLENBQUMsQ0FBQztRQUNULElBQUksQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDO1FBQ2hCLElBQUksQ0FBQyxNQUFNLENBQUMsYUFBYSxDQUFDLEtBQUssR0FBRyxDQUFDLENBQUM7SUFDdEMsQ0FBQzs7Ozs7O0lBS0QsVUFBVSxDQUFDLEdBQVE7UUFDakIsSUFBSSxDQUFDLEtBQUssR0FBRyxHQUFHLENBQUM7SUFDbkIsQ0FBQzs7Ozs7O0lBS0QsZ0JBQWdCLENBQUMsRUFBTztRQUN0QixJQUFJLENBQUMsZUFBZSxHQUFHLEVBQUUsQ0FBQztJQUM1QixDQUFDOzs7Ozs7SUFLRCxpQkFBaUIsQ0FBQyxFQUFPO1FBQ3ZCLElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxFQUFFLENBQUM7SUFDN0IsQ0FBQzs7Ozs7O0lBS0QsZ0JBQWdCLENBQUMsVUFBbUI7UUFDbEMsSUFBSSxDQUFDLFFBQVEsR0FBRyxVQUFVLENBQUM7SUFDN0IsQ0FBQzs7Ozs7OztJQU1ELFFBQVEsQ0FBQyxLQUFLO1FBQ1osSUFBSSxDQUFDLGVBQWUsQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ3pDLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDNUMsQ0FBQzs7Ozs7O0lBTUQsTUFBTSxDQUFDLE1BQU07UUFDWCxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQztJQUMxQixDQUFDOzs7OztJQUVNLFVBQVUsQ0FBQyxLQUFLO1FBQ3JCLE9BQU8sS0FBSyxZQUFZLFdBQVcsQ0FBQztJQUN0QyxDQUFDOzs7O0lBUUQsUUFBUTtRQUNOLDBDQUEwQztRQUMxQyxJQUFJLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsYUFBYSxDQUFDLEtBQUssQ0FBQztJQUMvQyxDQUFDOzs7OztBQXJITSxrQkFBVyxHQUFHLENBQUMsQ0FBQzs7WUEzRHhCLFNBQVMsU0FBQztnQkFDVCxRQUFRLEVBQUUsYUFBYTtnQkFDdkIsUUFBUSxFQUFFOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0F1Q1Q7Z0JBTUQsU0FBUyxFQUFFO29CQUNUO3dCQUNFLE9BQU8sRUFBRSxpQkFBaUI7d0JBQzFCLFdBQVcsRUFBRSxVQUFVOzs7d0JBQUMsR0FBRyxFQUFFLENBQUMsTUFBTSxFQUFDO3dCQUNyQyxLQUFLLEVBQUUsSUFBSTtxQkFDWjtpQkFDRjt5QkFYUTs7OztHQUlSO2FBUUY7OztzQkFZRSxLQUFLO29CQUlMLEtBQUs7eUJBSUwsS0FBSzswQkFJTCxLQUFLO2lCQUlMLEtBQUs7dUJBSUwsS0FBSzt1QkFJTCxLQUFLO3NCQUlMLEtBQUs7b0JBS0wsS0FBSzswQkFLTCxNQUFNO3FCQUVOLFNBQVMsU0FBQyxhQUFhLEVBQUUsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFO3FCQW9EekMsWUFBWSxTQUFDLE1BQU0sRUFBRSxDQUFDLGVBQWUsQ0FBQzs7Ozs7OztJQW5HdkMsbUJBQXVCOzs7OztJQUV2Qix3QkFBb0I7Ozs7O0lBS3BCLHlCQUFtRDs7Ozs7SUFJbkQsdUJBQTBDOzs7OztJQUkxQyw0QkFBK0M7Ozs7O0lBSS9DLDZCQUFnRDs7Ozs7SUFJaEQsb0JBQStDOzs7OztJQUkvQywwQkFBMEI7Ozs7O0lBSTFCLDBCQUEwQjs7Ozs7SUFJMUIseUJBQXlCOzs7OztJQUt6Qix1QkFBdUI7Ozs7O0lBS3ZCLDZCQUEyQzs7SUFFM0Msd0JBQStEOzs7Ozs7SUFnRS9ELGlDQUE0Qzs7Ozs7SUFDNUMsa0NBQXVDIiwic291cmNlc0NvbnRlbnQiOlsiLy8gdHNsaW50OmRpc2FibGU6IG1heC1saW5lLWxlbmd0aFxuXG5pbXBvcnQge1xuICBDb21wb25lbnQsXG4gIElucHV0LFxuICBPdXRwdXQsXG4gIFZpZXdDaGlsZCxcbiAgRWxlbWVudFJlZixcbiAgSG9zdExpc3RlbmVyLFxuICBFdmVudEVtaXR0ZXIsXG4gIFRlbXBsYXRlUmVmLFxuICBmb3J3YXJkUmVmLFxuICBPbkluaXQsXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQ29udHJvbFZhbHVlQWNjZXNzb3IsIE5HX1ZBTFVFX0FDQ0VTU09SIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdzdWthLXNlbGVjdCcsXG4gIHRlbXBsYXRlOiBgXG4gICAgPGRpdiBjbGFzcz1cImZvcm0taXRlbVwiPlxuICAgICAgPGRpdlxuICAgICAgICBbbmdDbGFzc109XCJ7XG4gICAgICAgICAgJ3NlbGVjdC0taW5saW5lJzogZGlzcGxheSA9PT0gJ2lubGluZScsXG4gICAgICAgICAgJ3NrZWxldG9uJzogc2tlbGV0b25cbiAgICAgICAgfVwiXG4gICAgICAgIGNsYXNzPVwic2VsZWN0XCJcbiAgICAgID5cbiAgICAgICAgPGxhYmVsICpuZ0lmPVwic2tlbGV0b24gJiYgbGFiZWxcIiBbZm9yXT1cImlkXCIgY2xhc3M9XCJsYWJlbCBza2VsZXRvblwiPjwvbGFiZWw+XG4gICAgICAgIDxsYWJlbCAqbmdJZj1cIiFza2VsZXRvbiAmJiBsYWJlbFwiIFtmb3JdPVwiaWRcIiBjbGFzcz1cImxhYmVsXCI+XG4gICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiFpc1RlbXBsYXRlKGxhYmVsKVwiPnt7bGFiZWx9fTwvbmctY29udGFpbmVyPlxuICAgICAgICAgIDxuZy10ZW1wbGF0ZSAqbmdJZj1cImlzVGVtcGxhdGUobGFiZWwpXCIgW25nVGVtcGxhdGVPdXRsZXRdPVwibGFiZWxcIj48L25nLXRlbXBsYXRlPlxuICAgICAgICA8L2xhYmVsPlxuICAgICAgICA8ZGl2ICpuZ0lmPVwiaGVscGVyVGV4dFwiIGNsYXNzPVwiZm9ybV9faGVscGVyLXRleHRcIj5cbiAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiIWlzVGVtcGxhdGUoaGVscGVyVGV4dClcIj57e2hlbHBlclRleHR9fTwvbmctY29udGFpbmVyPlxuICAgICAgICAgIDxuZy10ZW1wbGF0ZSAqbmdJZj1cImlzVGVtcGxhdGUoaGVscGVyVGV4dClcIiBbbmdUZW1wbGF0ZU91dGxldF09XCJoZWxwZXJUZXh0XCI+PC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJzZWxlY3QtaW5wdXRfX3dyYXBwZXJcIiBbYXR0ci5kYXRhLWludmFsaWRdPVwiKGludmFsaWQgPyB0cnVlIDogbnVsbClcIiBbYXR0ci5kYXRhLXZhbGlkXT1cIih2YWxpZCA/IHRydWUgOiBudWxsKVwiPlxuICAgICAgICAgIDxzZWxlY3RcbiAgICAgICAgICAgICNzZWxlY3RJbnB1dFxuICAgICAgICAgICAgW2F0dHIuaWRdPVwiaWRcIlxuICAgICAgICAgICAgW2Rpc2FibGVkXT1cImRpc2FibGVkXCJcbiAgICAgICAgICAgIChjaGFuZ2UpPVwib25DaGFuZ2UoJGV2ZW50KVwiXG4gICAgICAgICAgICBbdmFsdWVdPVwidmFsdWVcIlxuICAgICAgICAgICAgKGJsdXIpPVwib25CbHVyKCRldmVudClcIlxuICAgICAgICAgICAgY2xhc3M9XCJzZWxlY3QtaW5wdXRcIj5cbiAgICAgICAgICAgIDxuZy1jb250ZW50PjwvbmctY29udGVudD5cbiAgICAgICAgICA8L3NlbGVjdD5cbiAgICAgICAgICA8c3VrYS1pY29uICpuZ0lmPVwiaW52YWxpZFwiIGljb249XCJhbGVydC1jaXJjbGVcIiBjbGFzcz1cInNlbGVjdF9faW52YWxpZC1pY29uXCI+PC9zdWthLWljb24+XG4gICAgICAgICAgPHN1a2EtaWNvbiAqbmdJZj1cInZhbGlkXCIgaWNvbj1cImNoZWNrXCIgY2xhc3M9XCJzZWxlY3RfX3ZhbGlkLWljb25cIj48L3N1a2EtaWNvbj5cbiAgICAgICAgICA8c3VrYS1pY29uICpuZ0lmPVwiIXNrZWxldG9uXCIgY2xhc3M9XCJzZWxlY3RfX2Fycm93XCIgaWNvbj1cImNoZXZyb24tZG93blwiPjwvc3VrYS1pY29uPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdiAqbmdJZj1cImludmFsaWRcIiBjbGFzcz1cImZvcm0tcmVxdWlyZW1lbnRcIj5cbiAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiIWlzVGVtcGxhdGUoaW52YWxpZFRleHQpXCI+e3tpbnZhbGlkVGV4dH19PC9uZy1jb250YWluZXI+XG4gICAgICAgICAgPG5nLXRlbXBsYXRlICpuZ0lmPVwiaXNUZW1wbGF0ZShpbnZhbGlkVGV4dClcIiBbbmdUZW1wbGF0ZU91dGxldF09XCJpbnZhbGlkVGV4dFwiPjwvbmctdGVtcGxhdGU+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gIGAsXG4gIHN0eWxlczogW2BcbiAgICBbZGF0YS1pbnZhbGlkXSB+IC5zZWxlY3RfX2Fycm93IHtcbiAgICAgIGJvdHRvbTogMi4yNXJlbTtcbiAgICB9XG4gIGBdLFxuICBwcm92aWRlcnM6IFtcbiAgICB7XG4gICAgICBwcm92aWRlOiBOR19WQUxVRV9BQ0NFU1NPUixcbiAgICAgIHVzZUV4aXN0aW5nOiBmb3J3YXJkUmVmKCgpID0+IFNlbGVjdCksXG4gICAgICBtdWx0aTogdHJ1ZVxuICAgIH1cbiAgXVxufSlcbmV4cG9ydCBjbGFzcyBTZWxlY3QgaW1wbGVtZW50cyBDb250cm9sVmFsdWVBY2Nlc3NvciwgT25Jbml0IHtcbiAgLyoqXG4gICAqIFRyYWNrcyB0aGUgdG90YWwgbnVtYmVyIG9mIHNlbGVjdHMgaW5zdGFudGlhdGVkLiBVc2VkIHRvIGdlbmVyYXRlIHVuaXF1ZSBJRHNcbiAgICovXG4gIHN0YXRpYyBzZWxlY3RDb3VudCA9IDA7XG5cbiAgcHJpdmF0ZSBfdmFsdWUgPSAnJztcblxuICAvKipcbiAgICogYGlubGluZWAgb3IgYGRlZmF1bHRgIHNlbGVjdCBkaXNwbGF5c1xuICAgKi9cbiAgQElucHV0KCkgZGlzcGxheTogJ2lubGluZScgfCAnZGVmYXVsdCcgPSAnZGVmYXVsdCc7XG4gIC8qKlxuICAgKiBMYWJlbCBmb3IgdGhlIHNlbGVjdC4gQXBwZWFycyBhYm92ZSB0aGUgaW5wdXQuXG4gICAqL1xuICBASW5wdXQoKSBsYWJlbDogc3RyaW5nIHwgVGVtcGxhdGVSZWY8YW55PjtcbiAgLyoqXG4gICAqIE9wdGlvbmFsIGhlbHBlciB0ZXh0IHRoYXQgYXBwZWFycyB1bmRlciB0aGUgbGFiZWwuXG4gICAqL1xuICBASW5wdXQoKSBoZWxwZXJUZXh0OiBzdHJpbmcgfCBUZW1wbGF0ZVJlZjxhbnk+O1xuICAvKipcbiAgICogU2V0cyB0aGUgaW52YWxpZCB0ZXh0LlxuICAgKi9cbiAgQElucHV0KCkgaW52YWxpZFRleHQ6IHN0cmluZyB8IFRlbXBsYXRlUmVmPGFueT47XG4gIC8qKlxuICAgKiBTZXRzIHRoZSB1bmlxdWUgSUQuIERlZmF1bHRzIHRvIGBzZWxlY3QtJHt0b3RhbCBjb3VudCBvZiBzZWxlY3RzIGluc3RhbnRpYXRlZH1gXG4gICAqL1xuICBASW5wdXQoKSBpZCA9IGBzZWxlY3QtJHtTZWxlY3Quc2VsZWN0Q291bnQrK31gO1xuICAvKipcbiAgICogU2V0IHRvIHRydWUgdG8gZGlzYWJsZSBjb21wb25lbnQuXG4gICAqL1xuICBASW5wdXQoKSBkaXNhYmxlZCA9IGZhbHNlO1xuICAvKipcbiAgICogU2V0IHRvIHRydWUgZm9yIGEgbG9hZGluZyBzZWxlY3QuXG4gICAqL1xuICBASW5wdXQoKSBza2VsZXRvbiA9IGZhbHNlO1xuICAvKipcbiAgICogU2V0IHRvIGB0cnVlYCBmb3IgYW4gaW52YWxpZCBzZWxlY3QgY29tcG9uZW50LlxuICAgKi9cbiAgQElucHV0KCkgaW52YWxpZCA9IGZhbHNlO1xuXG4gIC8qKlxuICAgKiBTZXQgdG8gYHRydWVgIGZvciBhbiB2YWxpZCBzZWxlY3QgY29tcG9uZW50LlxuICAgKi9cbiAgQElucHV0KCkgdmFsaWQgPSBmYWxzZTtcblxuICAvKipcbiAgICogZW1pdHMgdGhlIHNlbGVjdGVkIG9wdGlvbnMgYHZhbHVlYFxuICAgKi9cbiAgQE91dHB1dCgpIHZhbHVlQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuXG4gIEBWaWV3Q2hpbGQoJ3NlbGVjdElucHV0JywgeyBzdGF0aWM6IHRydWUgfSkgc2VsZWN0OiBFbGVtZW50UmVmO1xuXG4gIGdldCB2YWx1ZSgpIHtcbiAgICAvLyByZXR1cm4gdGhpcy5fdmFsdWU7XG4gICAgcmV0dXJuIHRoaXMuc2VsZWN0Lm5hdGl2ZUVsZW1lbnQudmFsdWUgfHwgdGhpcy5fdmFsdWU7XG4gIH1cblxuICBzZXQgdmFsdWUodikge1xuICAgIHRoaXMuX3ZhbHVlID0gdjtcbiAgICB0aGlzLnNlbGVjdC5uYXRpdmVFbGVtZW50LnZhbHVlID0gdjtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWNlaXZlcyBhIHZhbHVlIGZyb20gdGhlIG1vZGVsLlxuICAgKi9cbiAgd3JpdGVWYWx1ZShvYmo6IGFueSkge1xuICAgIHRoaXMudmFsdWUgPSBvYmo7XG4gIH1cblxuICAvKipcbiAgICogUmVnaXN0ZXJzIGEgbGlzdGVuZXIgdGhhdCBub3RpZmllcyB0aGUgbW9kZWwgd2hlbiB0aGUgY29udHJvbCB1cGRhdGVzXG4gICAqL1xuICByZWdpc3Rlck9uQ2hhbmdlKGZuOiBhbnkpIHtcbiAgICB0aGlzLm9uQ2hhbmdlSGFuZGxlciA9IGZuO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlZ2lzdGVycyBhIGxpc3RlbmVyIHRoYXQgbm90aWZpZXMgdGhlIG1vZGVsIHdoZW4gdGhlIGNvbnRyb2wgaXMgYmx1cnJlZFxuICAgKi9cbiAgcmVnaXN0ZXJPblRvdWNoZWQoZm46IGFueSkge1xuICAgIHRoaXMub25Ub3VjaGVkSGFuZGxlciA9IGZuO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldHMgdGhlIGRpc2FibGVkIHN0YXRlIHRocm91Z2ggdGhlIG1vZGVsXG4gICAqL1xuICBzZXREaXNhYmxlZFN0YXRlKGlzRGlzYWJsZWQ6IGJvb2xlYW4pIHtcbiAgICB0aGlzLmRpc2FibGVkID0gaXNEaXNhYmxlZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBIYW5kbGVzIHRoZSBjaGFuZ2UgZXZlbnQgZnJvbSB0aGUgYHNlbGVjdGAuXG4gICAqIFNlbmRzIGV2ZW50cyB0byB0aGUgY2hhbmdlIGhhbmRsZXIgYW5kIGVtaXRzIGEgYHNlbGVjdGVkYCBldmVudC5cbiAgICovXG4gIG9uQ2hhbmdlKGV2ZW50KSB7XG4gICAgdGhpcy5vbkNoYW5nZUhhbmRsZXIoZXZlbnQudGFyZ2V0LnZhbHVlKTtcbiAgICB0aGlzLnZhbHVlQ2hhbmdlLmVtaXQoZXZlbnQudGFyZ2V0LnZhbHVlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBMaXN0ZW5zIGZvciB0aGUgaG9zdCBibHVycmluZywgYW5kIG5vdGlmaWVzIHRoZSBtb2RlbFxuICAgKi9cbiAgQEhvc3RMaXN0ZW5lcignYmx1cicsIFsnJGV2ZW50LnRhcmdldCddKVxuICBvbkJsdXIodGFyZ2V0KSB7XG4gICAgdGhpcy5vblRvdWNoZWRIYW5kbGVyKCk7XG4gIH1cblxuICBwdWJsaWMgaXNUZW1wbGF0ZSh2YWx1ZSkge1xuICAgIHJldHVybiB2YWx1ZSBpbnN0YW5jZW9mIFRlbXBsYXRlUmVmO1xuICB9XG5cbiAgLyoqXG4gICAqIHBsYWNlaG9sZGVyIGRlY2xhcmF0aW9ucy4gUmVwbGFjZWQgYnkgdGhlIGZ1bmN0aW9ucyBwcm92aWRlZCB0byBgcmVnaXN0ZXJPbkNoYW5nZWAgYW5kIGByZWdpc3Rlck9uVG91Y2hlZGBcbiAgICovXG4gIHByb3RlY3RlZCBvbkNoYW5nZUhhbmRsZXIgPSAoXzogYW55KSA9PiB7IH07XG4gIHByb3RlY3RlZCBvblRvdWNoZWRIYW5kbGVyID0gKCkgPT4geyB9O1xuXG4gIG5nT25Jbml0KCkge1xuICAgIC8vIGNvbnNvbGUubG9nKHRoaXMuc2VsZWN0Lm5hdGl2ZUVsZW1lbnQpO1xuICAgIHRoaXMudmFsdWUgPSB0aGlzLnNlbGVjdC5uYXRpdmVFbGVtZW50LnZhbHVlO1xuICB9XG59XG4iXX0=