@tangential/input-widgets
Version:
Input Widgets with persistable, dynamic configuration.
215 lines (213 loc) • 21.2 kB
JavaScript
import { ChangeDetectorRef, Component, EventEmitter, forwardRef, HostBinding, Input, Output, ViewEncapsulation } from '@angular/core';
import { NG_VALUE_ACCESSOR } from '@angular/forms';
import { Hacks } from '@tangential/core';
import * as i0 from "@angular/core";
import * as i1 from "@angular/common";
import * as i2 from "@angular/forms";
import * as i3 from "@angular/material/form-field";
import * as i4 from "@angular/material/input";
import * as i5 from "./icon-rating-widget.component";
/**
* Provider Expression that allows IconRatingWidget to register as a ControlValueAccessor.
* This allows it to support [(ngModel)].
* @docs-private
*/
export const TANJ_ICON_RATING_WIDGET_CONFIG_CONTROL_VALUE_ACCESSOR = {
provide: NG_VALUE_ACCESSOR,
useExisting: forwardRef(() => IconRatingWidgetConfigureComponent),
multi: true
};
export class IconRatingWidgetConfigureChange {
constructor(source, value) {
this.source = source;
this.value = value;
}
}
export class IconRatingWidgetConfigureComponent {
constructor(changeDetectorRef) {
this.changeDetectorRef = changeDetectorRef;
this.flex = '';
this.flexLayout = 'column';
this.flexLayoutAlign = 'start';
this.value = 0;
this.valueChange = new EventEmitter(false);
this.labelPosition = 'before';
this.disabled = false;
/**
* Configuration Fields
*/
this.label = '';
this.defaultValue = 0;
this.max = 5;
this.offIconNames = [];
this.onIconNames = [];
this.labelChange = new EventEmitter(false);
this.defaultValueChange = new EventEmitter(false);
this.maxChange = new EventEmitter(false);
this.iconFontChange = new EventEmitter(false);
this.offIconNamesChange = new EventEmitter(false);
this.onIconNamesChange = new EventEmitter(false);
/* end Configuration Fields */
this.change = new EventEmitter(false);
/**
* Called when the spinner is blurred. Needed to properly implement ControlValueAccessor.
* @docs-private
*/
this.onTouched = () => { };
this.controlValueAccessorChangeFn = (value) => { };
}
ngOnInit() {
Hacks.materialDesignPlaceholderText(this.changeDetectorRef);
}
emitChangeEvent() {
this.controlValueAccessorChangeFn(this.value);
this.change.emit(new IconRatingWidgetConfigureChange(this, this.value));
}
swipeRight(event) {
}
swipeLeft(event) {
}
/**
* Boilerplate / required for Angular
*
*/
writeValue(value) {
this.value = value;
}
registerOnChange(fn) {
this.controlValueAccessorChangeFn = fn;
}
registerOnTouched(fn) {
this.onTouched = fn;
}
/**
* Sets the input's disabled state. Implemented as a part of ControlValueAccessor.
* @param isDisabled Whether the input should be disabled.
*/
setDisabledState(isDisabled) {
this.disabled = isDisabled;
}
}
IconRatingWidgetConfigureComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.2.10", ngImport: i0, type: IconRatingWidgetConfigureComponent, deps: [{ token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component });
IconRatingWidgetConfigureComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.2.10", type: IconRatingWidgetConfigureComponent, selector: "tanj-icon-rating-widget-configure", inputs: { value: "value", labelPosition: "labelPosition", disabled: "disabled", label: "label", defaultValue: "defaultValue", max: "max", iconFont: "iconFont", offIconNames: "offIconNames", onIconNames: "onIconNames" }, outputs: { valueChange: "valueChange", labelChange: "labelChange", defaultValueChange: "defaultValueChange", maxChange: "maxChange", iconFontChange: "iconFontChange", offIconNamesChange: "offIconNamesChange", onIconNamesChange: "onIconNamesChange", change: "change" }, host: { properties: { "attr.flex": "this.flex", "attr.layout": "this.flexLayout", "attr.layout-align": "this.flexLayoutAlign" } }, providers: [TANJ_ICON_RATING_WIDGET_CONFIG_CONTROL_VALUE_ACCESSOR], ngImport: i0, template: `<!-- -->
<div class="tanj-input-template tanj-mode-configure" flex layout="column" layout-align="start">
<mat-form-field dividerColor="accent">
<input matInput
class="tanj-input"
type="text"
maxlength="50"
placeholder="Enter a label for this input"
(change)="labelChange.emit(label)"
[(ngModel)]="label"/>
</mat-form-field>
<ng-container *ngIf="label">
<tanj-icon-rating-widget
[(value)]="defaultValue"
(valueChange)="value = defaultValue; valueChange.emit(value); defaultValueChange.emit(defaultValue)"
[defaultValue]="defaultValue"
[max]="max"
[iconFont]="iconFont"
[offIconNames]="offIconNames"
[onIconNames]="onIconNames"
label="Default Value"
[labelPosition]="'before'">
</tanj-icon-rating-widget>
<mat-form-field dividerColor="accent">
<input matInput
class="tanj-input"
type="number"
placeholder="Max Rating"
max="10"
(change)="maxChange.emit(max)"
[(ngModel)]="max"/>
</mat-form-field>
</ng-container>
</div>
`, isInline: true, dependencies: [{ kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i2.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i2.NumberValueAccessor, selector: "input[type=number][formControlName],input[type=number][formControl],input[type=number][ngModel]" }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.MaxLengthValidator, selector: "[maxlength][formControlName],[maxlength][formControl],[maxlength][ngModel]", inputs: ["maxlength"] }, { kind: "directive", type: i2.MaxValidator, selector: "input[type=number][max][formControlName],input[type=number][max][formControl],input[type=number][max][ngModel]", inputs: ["max"] }, { kind: "directive", type: i2.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: i3.MatFormField, selector: "mat-form-field", inputs: ["color", "appearance", "hideRequiredMarker", "hintLabel", "floatLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i4.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly"], exportAs: ["matInput"] }, { kind: "component", type: i5.IconRatingWidgetComponent, selector: "tanj-icon-rating-widget", inputs: ["value", "labelPosition", "disabled", "hideLabel", "onlyLabel", "label", "defaultValue", "max", "iconFont", "offIconNames", "onIconNames"], outputs: ["valueChange", "change"] }], encapsulation: i0.ViewEncapsulation.None });
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.10", ngImport: i0, type: IconRatingWidgetConfigureComponent, decorators: [{
type: Component,
args: [{
selector: 'tanj-icon-rating-widget-configure',
template: `<!-- -->
<div class="tanj-input-template tanj-mode-configure" flex layout="column" layout-align="start">
<mat-form-field dividerColor="accent">
<input matInput
class="tanj-input"
type="text"
maxlength="50"
placeholder="Enter a label for this input"
(change)="labelChange.emit(label)"
[(ngModel)]="label"/>
</mat-form-field>
<ng-container *ngIf="label">
<tanj-icon-rating-widget
[(value)]="defaultValue"
(valueChange)="value = defaultValue; valueChange.emit(value); defaultValueChange.emit(defaultValue)"
[defaultValue]="defaultValue"
[max]="max"
[iconFont]="iconFont"
[offIconNames]="offIconNames"
[onIconNames]="onIconNames"
label="Default Value"
[labelPosition]="'before'">
</tanj-icon-rating-widget>
<mat-form-field dividerColor="accent">
<input matInput
class="tanj-input"
type="number"
placeholder="Max Rating"
max="10"
(change)="maxChange.emit(max)"
[(ngModel)]="max"/>
</mat-form-field>
</ng-container>
</div>
`,
providers: [TANJ_ICON_RATING_WIDGET_CONFIG_CONTROL_VALUE_ACCESSOR],
encapsulation: ViewEncapsulation.None
}]
}], ctorParameters: function () { return [{ type: i0.ChangeDetectorRef }]; }, propDecorators: { flex: [{
type: HostBinding,
args: ['attr.flex']
}], flexLayout: [{
type: HostBinding,
args: ['attr.layout']
}], flexLayoutAlign: [{
type: HostBinding,
args: ['attr.layout-align']
}], value: [{
type: Input
}], valueChange: [{
type: Output
}], labelPosition: [{
type: Input
}], disabled: [{
type: Input
}], label: [{
type: Input
}], defaultValue: [{
type: Input
}], max: [{
type: Input
}], iconFont: [{
type: Input
}], offIconNames: [{
type: Input
}], onIconNames: [{
type: Input
}], labelChange: [{
type: Output
}], defaultValueChange: [{
type: Output
}], maxChange: [{
type: Output
}], iconFontChange: [{
type: Output
}], offIconNamesChange: [{
type: Output
}], onIconNamesChange: [{
type: Output
}], change: [{
type: Output
}] } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaWNvbi1yYXRpbmctd2lkZ2V0LWNvbmZpZ3VyZS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy90YW5nZW50aWFsL2lucHV0LXdpZGdldHMvc3JjL2xpYi9pY29uLXJhdGluZy13aWRnZXQvaWNvbi1yYXRpbmctd2lkZ2V0LWNvbmZpZ3VyZS5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNMLGlCQUFpQixFQUNqQixTQUFTLEVBQ1QsWUFBWSxFQUNaLFVBQVUsRUFDVixXQUFXLEVBQ1gsS0FBSyxFQUVMLE1BQU0sRUFDTixpQkFBaUIsRUFDbEIsTUFBTSxlQUFlLENBQUE7QUFDdEIsT0FBTyxFQUVMLGlCQUFpQixFQUNsQixNQUFNLGdCQUFnQixDQUFBO0FBQ3ZCLE9BQU8sRUFBQyxLQUFLLEVBQUMsTUFBTSxrQkFBa0IsQ0FBQTs7Ozs7OztBQUd0Qzs7OztHQUlHO0FBQ0gsTUFBTSxDQUFDLE1BQU0scURBQXFELEdBQVE7SUFDeEUsT0FBTyxFQUFNLGlCQUFpQjtJQUM5QixXQUFXLEVBQUUsVUFBVSxDQUFDLEdBQUcsRUFBRSxDQUFDLGtDQUFrQyxDQUFDO0lBQ2pFLEtBQUssRUFBUSxJQUFJO0NBQ2xCLENBQUM7QUFFRixNQUFNLE9BQU8sK0JBQStCO0lBQzFDLFlBQW1CLE1BQTBDLEVBQVMsS0FBYTtRQUFoRSxXQUFNLEdBQU4sTUFBTSxDQUFvQztRQUFTLFVBQUssR0FBTCxLQUFLLENBQVE7SUFDbkYsQ0FBQztDQUNGO0FBNENELE1BQU0sT0FBTyxrQ0FBa0M7SUF1QzdDLFlBQW9CLGlCQUFvQztRQUFwQyxzQkFBaUIsR0FBakIsaUJBQWlCLENBQW1CO1FBckM5QixTQUFJLEdBQUcsRUFBRSxDQUFDO1FBQ1IsZUFBVSxHQUFHLFFBQVEsQ0FBQztRQUNoQixvQkFBZSxHQUFHLE9BQU8sQ0FBQztRQUVuRCxVQUFLLEdBQVcsQ0FBQyxDQUFB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LEtBQUs7Z0JBS0csS0FBSztzQkFBYixLQUFLO2dCQUNHLFlBQVk7c0JBQXBCLEtBQUs7Z0JBQ0csR0FBRztzQkFBWCxLQUFLO2dCQUNHLFFBQVE7c0JBQWhCLEtBQUs7Z0JBQ0csWUFBWTtzQkFBcEIsS0FBSztnQkFDRyxXQUFXO3NCQUFuQixLQUFLO2dCQUVJLFdBQVc7c0JBQXBCLE1BQU07Z0JBQ0csa0JBQWtCO3NCQUEzQixNQUFNO2dCQUNHLFNBQVM7c0JBQWxCLE1BQU07Z0JBQ0csY0FBYztzQkFBdkIsTUFBTTtnQkFDRyxrQkFBa0I7c0JBQTNCLE1BQU07Z0JBQ0csaUJBQWlCO3NCQUExQixNQUFNO2dCQUdHLE1BQU07c0JBQWYsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIENoYW5nZURldGVjdG9yUmVmLFxuICBDb21wb25lbnQsXG4gIEV2ZW50RW1pdHRlcixcbiAgZm9yd2FyZFJlZixcbiAgSG9zdEJpbmRpbmcsXG4gIElucHV0LFxuICBPbkluaXQsXG4gIE91dHB1dCxcbiAgVmlld0VuY2Fwc3VsYXRpb25cbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSdcbmltcG9ydCB7XG4gIENvbnRyb2xWYWx1ZUFjY2Vzc29yLFxuICBOR19WQUxVRV9BQ0NFU1NPUlxufSBmcm9tICdAYW5ndWxhci9mb3JtcydcbmltcG9ydCB7SGFja3N9IGZyb20gJ0B0YW5nZW50aWFsL2NvcmUnXG5cblxuLyoqXG4gKiBQcm92aWRlciBFeHByZXNzaW9uIHRoYXQgYWxsb3dzIEljb25SYXRpbmdXaWRnZXQgdG8gcmVnaXN0ZXIgYXMgYSBDb250cm9sVmFsdWVBY2Nlc3Nvci5cbiAqIFRoaXMgYWxsb3dzIGl0IHRvIHN1cHBvcnQgWyhuZ01vZGVsKV0uXG4gKiBAZG9jcy1wcml2YXRlXG4gKi9cbmV4cG9ydCBjb25zdCBUQU5KX0lDT05fUkFUSU5HX1dJREdFVF9DT05GSUdfQ09OVFJPTF9WQUxVRV9BQ0NFU1NPUjogYW55ID0ge1xuICBwcm92aWRlOiAgICAgTkdfVkFMVUVfQUNDRVNTT1IsXG4gIHVzZUV4aXN0aW5nOiBmb3J3YXJkUmVmKCgpID0+IEljb25SYXRpbmdXaWRnZXRDb25maWd1cmVDb21wb25lbnQpLFxuICBtdWx0aTogICAgICAgdHJ1ZVxufTtcblxuZXhwb3J0IGNsYXNzIEljb25SYXRpbmdXaWRnZXRDb25maWd1cmVDaGFuZ2Uge1xuICBjb25zdHJ1Y3RvcihwdWJsaWMgc291cmNlOiBJY29uUmF0aW5nV2lkZ2V0Q29uZmlndXJlQ29tcG9uZW50LCBwdWJsaWMgdmFsdWU6IG51bWJlcikge1xuICB9XG59XG5cblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAgICAgICd0YW5qLWljb24tcmF0aW5nLXdpZGdldC1jb25maWd1cmUnLFxuICB0ZW1wbGF0ZTogICAgICBgPCEtLSAtLT5cbiAgPGRpdiBjbGFzcz1cInRhbmotaW5wdXQtdGVtcGxhdGUgdGFuai1tb2RlLWNvbmZpZ3VyZVwiIGZsZXggbGF5b3V0PVwiY29sdW1uXCIgbGF5b3V0LWFsaWduPVwic3RhcnRcIj5cbiAgICA8bWF0LWZvcm0tZmllbGQgZGl2aWRlckNvbG9yPVwiYWNjZW50XCI+XG4gICAgICA8aW5wdXQgbWF0SW5wdXRcbiAgICAgICAgICAgICBjbGFzcz1cInRhbmotaW5wdXRcIlxuICAgICAgICAgICAgIHR5cGU9XCJ0ZXh0XCJcbiAgICAgICAgICAgICBtYXhsZW5ndGg9XCI1MFwiXG4gICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCJFbnRlciBhIGxhYmVsIGZvciB0aGlzIGlucHV0XCJcbiAgICAgICAgICAgICAoY2hhbmdlKT1cImxhYmVsQ2hhbmdlLmVtaXQobGFiZWwpXCJcbiAgICAgICAgICAgICBbKG5nTW9kZWwpXT1cImxhYmVsXCIvPlxuICAgIDwvbWF0LWZvcm0tZmllbGQ+XG4gICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImxhYmVsXCI+XG4gICAgICA8dGFuai1pY29uLXJhdGluZy13aWRnZXRcbiAgICAgICAgWyh2YWx1ZSldPVwiZGVmYXVsdFZhbHVlXCJcbiAgICAgICAgKHZhbHVlQ2hhbmdlKT1cInZhbHVlID0gZGVmYXVsdFZhbHVlOyB2YWx1ZUNoYW5nZS5lbWl0KHZhbHVlKTsgZGVmYXVsdFZhbHVlQ2hhbmdlLmVtaXQoZGVmYXVsdFZhbHVlKVwiXG4gICAgICAgIFtkZWZhdWx0VmFsdWVdPVwiZGVmYXVsdFZhbHVlXCJcbiAgICAgICAgW21heF09XCJtYXhcIlxuICAgICAgICBbaWNvbkZvbnRdPVwiaWNvbkZvbnRcIlxuICAgICAgICBbb2ZmSWNvbk5hbWVzXT1cIm9mZkljb25OYW1lc1wiXG4gICAgICAgIFtvbkljb25OYW1lc109XCJvbkljb25OYW1lc1wiXG4gICAgICAgIGxhYmVsPVwiRGVmYXVsdCBWYWx1ZVwiXG4gICAgICAgIFtsYWJlbFBvc2l0aW9uXT1cIidiZWZvcmUnXCI+XG5cbiAgICAgIDwvdGFuai1pY29uLXJhdGluZy13aWRnZXQ+XG4gICAgICA8bWF0LWZvcm0tZmllbGQgZGl2aWRlckNvbG9yPVwiYWNjZW50XCI+XG4gICAgICAgIDxpbnB1dCBtYXRJbnB1dFxuICAgICAgICAgICAgICAgY2xhc3M9XCJ0YW5qLWlucHV0XCJcbiAgICAgICAgICAgICAgIHR5cGU9XCJudW1iZXJcIlxuICAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCJNYXggUmF0aW5nXCJcbiAgICAgICAgICAgICAgIG1heD1cIjEwXCJcbiAgICAgICAgICAgICAgIChjaGFuZ2UpPVwibWF4Q2hhbmdlLmVtaXQobWF4KVwiXG4gICAgICAgICAgICAgICBbKG5nTW9kZWwpXT1cIm1heFwiLz5cbiAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XG4gICAgPC9uZy1jb250YWluZXI+XG4gIDwvZGl2PlxuICAgICAgICAgICAgICAgICBgLFxuICBwcm92aWRlcnM6ICAgICBbVEFOSl9JQ09OX1JBVElOR19XSURHRVRfQ09ORklHX0NPTlRST0xfVkFMVUVfQUNDRVNTT1JdLFxuICBlbmNhcHN1bGF0aW9uOiBWaWV3RW5jYXBzdWxhdGlvbi5Ob25lXG59KVxuZXhwb3J0IGNsYXNzIEljb25SYXRpbmdXaWRnZXRDb25maWd1cmVDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIENvbnRyb2xWYWx1ZUFjY2Vzc29yIHtcblxuICBASG9zdEJpbmRpbmcoJ2F0dHIuZmxleCcpIGZsZXggPSAnJztcbiAgQEhvc3RCaW5kaW5nKCdhdHRyLmxheW91dCcpIGZsZXhMYXlvdXQgPSAnY29sdW1uJztcbiAgQEhvc3RCaW5kaW5nKCdhdHRyLmxheW91dC1hbGlnbicpIGZsZXhMYXlvdXRBbGlnbiA9ICdzdGFydCc7XG5cbiAgQElucHV0KCkgdmFsdWU6IG51bWJlciA9IDBcbiAgQE91dHB1dCgpIHZhbHVlQ2hhbmdlOiBFdmVudEVtaXR0ZXI8bnVtYmVyPiA9IG5ldyBFdmVudEVtaXR0ZXIoZmFsc2UpXG5cbiAgQElucHV0KCkgbGFiZWxQb3NpdGlvbjogJ2JlZm9yZScgfCAnYWZ0ZXInIHwgJ2JlbG93JyA9ICdiZWZvcmUnXG4gIEBJbnB1dCgpIGRpc2FibGVkOiBib29sZWFuID0gZmFsc2VcblxuICAvKipcbiAgICogQ29uZmlndXJhdGlvbiBGaWVsZHNcbiAgICovXG4gIEBJbnB1dCgpIGxhYmVsOiBzdHJpbmcgPSAnJ1xuICBASW5wdXQoKSBkZWZhdWx0VmFsdWU6IG51bWJlciA9IDBcbiAgQElucHV0KCkgbWF4OiBudW1iZXIgPSA1XG4gIEBJbnB1dCgpIGljb25Gb250OiBzdHJpbmcgfCB1bmRlZmluZWRcbiAgQElucHV0KCkgb2ZmSWNvbk5hbWVzOiBzdHJpbmdbXSA9IFtdXG4gIEBJbnB1dCgpIG9uSWNvbk5hbWVzOiBzdHJpbmdbXSA9IFtdXG5cbiAgQE91dHB1dCgpIGxhYmVsQ2hhbmdlOiBFdmVudEVtaXR0ZXI8c3RyaW5nPiA9IG5ldyBFdmVudEVtaXR0ZXIoZmFsc2UpXG4gIEBPdXRwdXQoKSBkZWZhdWx0VmFsdWVDaGFuZ2U6IEV2ZW50RW1pdHRlcjxudW1iZXI+ID0gbmV3IEV2ZW50RW1pdHRlcihmYWxzZSlcbiAgQE91dHB1dCgpIG1heENoYW5nZTogRXZlbnRFbWl0dGVyPG51bWJlcj4gPSBuZXcgRXZlbnRFbWl0dGVyKGZhbHNlKVxuICBAT3V0cHV0KCkgaWNvbkZvbnRDaGFuZ2U6IEV2ZW50RW1pdHRlcjxudW1iZXI+ID0gbmV3IEV2ZW50RW1pdHRlcihmYWxzZSlcbiAgQE91dHB1dCgpIG9mZkljb25OYW1lc0NoYW5nZTogRXZlbnRFbWl0dGVyPG51bWJlcj4gPSBuZXcgRXZlbnRFbWl0dGVyKGZhbHNlKVxuICBAT3V0cHV0KCkgb25JY29uTmFtZXNDaGFuZ2U6IEV2ZW50RW1pdHRlcjxudW1iZXI+ID0gbmV3IEV2ZW50RW1pdHRlcihmYWxzZSlcbiAgLyogZW5kIENvbmZpZ3VyYXRpb24gRmllbGRzICovXG5cbiAgQE91dHB1dCgpIGNoYW5nZTogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyKGZhbHNlKVxuXG4gIC8qKlxuICAgKiBDYWxsZWQgd2hlbiB0aGUgc3Bpbm5lciBpcyBibHVycmVkLiBOZWVkZWQgdG8gcHJvcGVybHkgaW1wbGVtZW50IENvbnRyb2xWYWx1ZUFjY2Vzc29yLlxuICAgKiBAZG9jcy1wcml2YXRlXG4gICAqL1xuICBvblRvdWNoZWQ6ICgpID0+IGFueSA9ICgpID0+IHsgfTtcbiAgcHJpdmF0ZSBjb250cm9sVmFsdWVBY2Nlc3NvckNoYW5nZUZuOiAodmFsdWU6IGFueSkgPT4gdm9pZCA9ICh2YWx1ZSkgPT4geyB9O1xuXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgY2hhbmdlRGV0ZWN0b3JSZWY6IENoYW5nZURldGVjdG9yUmVmKSB7XG4gIH1cblxuICBuZ09uSW5pdCgpIHtcbiAgICBIYWNrcy5tYXRlcmlhbERlc2lnblBsYWNlaG9sZGVyVGV4dCh0aGlzLmNoYW5nZURldGVjdG9yUmVmKVxuICB9XG5cbiAgZW1pdENoYW5nZUV2ZW50KCkge1xuICAgIHRoaXMuY29udHJvbFZhbHVlQWNjZXNzb3JDaGFuZ2VGbih0aGlzLnZhbHVlKTtcbiAgICB0aGlzLmNoYW5nZS5lbWl0KG5ldyBJY29uUmF0aW5nV2lkZ2V0Q29uZmlndXJlQ2hhbmdlKHRoaXMsIHRoaXMudmFsdWUpKVxuICB9XG5cblxuICBzd2lwZVJpZ2h0KGV2ZW50OiBhbnkpIHtcbiAgfVxuXG4gIHN3aXBlTGVmdChldmVudDogYW55KSB7XG4gIH1cblxuICAvKipcbiAgICogQm9pbGVycGxhdGUgLyByZXF1aXJlZCBmb3IgQW5ndWxhclxuICAgKlxuICAgKi9cbiAgcHVibGljIHdyaXRlVmFsdWUodmFsdWU6IG51bWJlcik6IHZvaWQge1xuICAgIHRoaXMudmFsdWUgPSB2YWx1ZVxuICB9XG5cbiAgcHVibGljIHJlZ2lzdGVyT25DaGFuZ2UoZm46IGFueSk6IHZvaWQge1xuICAgIHRoaXMuY29udHJvbFZhbHVlQWNjZXNzb3JDaGFuZ2VGbiA9IGZuO1xuICB9XG5cbiAgcHVibGljIHJlZ2lzdGVyT25Ub3VjaGVkKGZuOiBhbnkpOiB2b2lkIHtcbiAgICB0aGlzLm9uVG91Y2hlZCA9IGZuO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldHMgdGhlIGlucHV0J3MgZGlzYWJsZWQgc3RhdGUuIEltcGxlbWVudGVkIGFzIGEgcGFydCBvZiBDb250cm9sVmFsdWVBY2Nlc3Nvci5cbiAgICogQHBhcmFtIGlzRGlzYWJsZWQgV2hldGhlciB0aGUgaW5wdXQgc2hvdWxkIGJlIGRpc2FibGVkLlxuICAgKi9cbiAgc2V0RGlzYWJsZWRTdGF0ZShpc0Rpc2FibGVkOiBib29sZWFuKSB7XG4gICAgdGhpcy5kaXNhYmxlZCA9IGlzRGlzYWJsZWQ7XG4gIH1cbn1cbiJdfQ==