@tangential/input-widgets
Version:
Input Widgets with persistable, dynamic configuration.
267 lines (261 loc) • 26.8 kB
JavaScript
import { ChangeDetectorRef, Component, EventEmitter, forwardRef, HostBinding, Input, Output, ViewEncapsulation } from '@angular/core';
import { NG_VALUE_ACCESSOR } from '@angular/forms';
import { Hacks, TimeUnits } from '@tangential/core';
import moment from 'moment';
import { DurationPickerState } from './duration-picker-state';
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 "@angular/material/checkbox";
import * as i6 from "./duration-picker-widget.component";
/**
* Provider Expression that allows IconRatingWidget to register as a ControlValueAccessor.
* This allows it to support [(ngModel)].
* @docs-private
*/
export const TANJ_DURATION_WIDGET_CONFIG_CONTROL_VALUE_ACCESSOR = {
provide: NG_VALUE_ACCESSOR,
useExisting: forwardRef(() => DurationPickerWidgetConfigureComponent),
multi: true
};
export class DurationPickerWidgetConfigureChange {
constructor(source, value) {
this.source = source;
this.value = value;
}
}
export class DurationPickerWidgetConfigureComponent {
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.labelChange = new EventEmitter(false);
this.defaultValue = 0;
this.defaultValueChange = new EventEmitter(false);
this.max = 100;
this.maxChange = new EventEmitter(false);
this.showDays = false;
this.showDaysChange = new EventEmitter(false);
this.showHours = false;
this.showHoursChange = new EventEmitter(false);
this.showMinutes = false;
this.showMinutesChange = new EventEmitter(false);
this.showSeconds = false;
this.showSecondsChange = new EventEmitter(false);
this.showMilliseconds = false;
this.showMillisecondsChange = new EventEmitter(false);
/* end Configuration Fields */
this.state = new DurationPickerState();
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);
}
ngOnChanges(changes) {
if (changes.value) {
this.state.setDuration(moment.duration(this.value));
}
this.updateFields();
}
updateFields() {
if (this.showDays) {
this.state.select(TimeUnits.day);
}
if (this.showHours) {
this.state.select(TimeUnits.h);
}
if (this.showMinutes) {
this.state.select(TimeUnits.min);
}
if (this.showSeconds) {
this.state.select(TimeUnits.s);
}
if (this.showMilliseconds) {
this.state.select(TimeUnits.ms);
}
}
emitChangeEvent() {
this.controlValueAccessorChangeFn(this.value);
this.change.emit(new DurationPickerWidgetConfigureChange(this, this.value));
}
/**
* 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;
}
}
DurationPickerWidgetConfigureComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.2.10", ngImport: i0, type: DurationPickerWidgetConfigureComponent, deps: [{ token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component });
DurationPickerWidgetConfigureComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.2.10", type: DurationPickerWidgetConfigureComponent, selector: "tanj-duration-picker-widget-configure", inputs: { value: "value", labelPosition: "labelPosition", disabled: "disabled", label: "label", defaultValue: "defaultValue", max: "max", showDays: "showDays", showHours: "showHours", showMinutes: "showMinutes", showSeconds: "showSeconds", showMilliseconds: "showMilliseconds" }, outputs: { valueChange: "valueChange", labelChange: "labelChange", defaultValueChange: "defaultValueChange", maxChange: "maxChange", showDaysChange: "showDaysChange", showHoursChange: "showHoursChange", showMinutesChange: "showMinutesChange", showSecondsChange: "showSecondsChange", showMillisecondsChange: "showMillisecondsChange", change: "change" }, host: { properties: { "attr.flex": "this.flex", "attr.layout": "this.flexLayout", "attr.layout-align": "this.flexLayoutAlign" } }, providers: [TANJ_DURATION_WIDGET_CONFIG_CONTROL_VALUE_ACCESSOR], usesOnChanges: true, 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">
<fieldset flex layout="row" layout-align="start">
<legend>For:</legend>
<div flex class="tanj-choose-duration-fields-container" layout="column" layout-align="start">
<mat-checkbox *ngFor="let field of state.fields"
layout="row" layout-align="start"
[disabled]="!field.canToggleSelection()"
[labelPosition]="'before'"
[checked]="field.selected"
(change)="field.selected = $event.checked">
{{field.unit.fullLabel}}
</mat-checkbox>
</div>
</fieldset>
<tanj-duration-picker-widget
[(value)]="defaultValue"
(valueChange)="value = defaultValue; valueChange.emit(value); defaultValueChange.emit(defaultValue)"
[defaultValue]="defaultValue"
[showDays]="showDays"
[showHours]="showHours"
[showMinutes]="showMinutes"
[showSeconds]="showSeconds"
[showMilliseconds]="showMilliseconds"
[max]="max"
label="Default Value"
[labelPosition]="'before'">
</tanj-duration-picker-widget>
</ng-container>
</div>
`, isInline: true, dependencies: [{ kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { 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.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.MaxLengthValidator, selector: "[maxlength][formControlName],[maxlength][formControl],[maxlength][ngModel]", inputs: ["maxlength"] }, { 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.MatCheckbox, selector: "mat-checkbox", inputs: ["disableRipple", "color", "tabIndex"], exportAs: ["matCheckbox"] }, { kind: "component", type: i6.DurationPickerWidgetComponent, selector: "tanj-duration-picker-widget", inputs: ["value", "labelPosition", "disabled", "hideLabel", "onlyLabel", "label", "defaultValue", "max", "showDays", "showHours", "showMinutes", "showSeconds", "showMilliseconds"], outputs: ["valueChange", "change"] }], encapsulation: i0.ViewEncapsulation.None });
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.10", ngImport: i0, type: DurationPickerWidgetConfigureComponent, decorators: [{
type: Component,
args: [{
selector: 'tanj-duration-picker-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">
<fieldset flex layout="row" layout-align="start">
<legend>For:</legend>
<div flex class="tanj-choose-duration-fields-container" layout="column" layout-align="start">
<mat-checkbox *ngFor="let field of state.fields"
layout="row" layout-align="start"
[disabled]="!field.canToggleSelection()"
[labelPosition]="'before'"
[checked]="field.selected"
(change)="field.selected = $event.checked">
{{field.unit.fullLabel}}
</mat-checkbox>
</div>
</fieldset>
<tanj-duration-picker-widget
[(value)]="defaultValue"
(valueChange)="value = defaultValue; valueChange.emit(value); defaultValueChange.emit(defaultValue)"
[defaultValue]="defaultValue"
[showDays]="showDays"
[showHours]="showHours"
[showMinutes]="showMinutes"
[showSeconds]="showSeconds"
[showMilliseconds]="showMilliseconds"
[max]="max"
label="Default Value"
[labelPosition]="'before'">
</tanj-duration-picker-widget>
</ng-container>
</div>
`,
providers: [TANJ_DURATION_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
}], labelChange: [{
type: Output
}], defaultValue: [{
type: Input
}], defaultValueChange: [{
type: Output
}], max: [{
type: Input
}], maxChange: [{
type: Output
}], showDays: [{
type: Input
}], showDaysChange: [{
type: Output
}], showHours: [{
type: Input
}], showHoursChange: [{
type: Output
}], showMinutes: [{
type: Input
}], showMinutesChange: [{
type: Output
}], showSeconds: [{
type: Input
}], showSecondsChange: [{
type: Output
}], showMilliseconds: [{
type: Input
}], showMillisecondsChange: [{
type: Output
}], change: [{
type: Output
}] } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZHVyYXRpb24tcGlja2VyLXdpZGdldC1jb25maWd1cmUuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvdGFuZ2VudGlhbC9pbnB1dC13aWRnZXRzL3NyYy9saWIvZHVyYXRpb24tcGlja2VyLXdpZGdldC9kdXJhdGlvbi1waWNrZXItd2lkZ2V0LWNvbmZpZ3VyZS5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNMLGlCQUFpQixFQUNqQixTQUFTLEVBQ1QsWUFBWSxFQUNaLFVBQVUsRUFDVixXQUFXLEVBQ1gsS0FBSyxFQUdMLE1BQU0sRUFFTixpQkFBaUIsRUFDbEIsTUFBTSxlQUFlLENBQUE7QUFDdEIsT0FBTyxFQUVMLGlCQUFpQixFQUNsQixNQUFNLGdCQUFnQixDQUFBO0FBQ3ZCLE9BQU8sRUFDTCxLQUFLLEVBQ0wsU0FBUyxFQUNWLE1BQU0sa0JBQWtCLENBQUE7QUFDekIsT0FBTyxNQUFNLE1BQU0sUUFBUSxDQUFBO0FBQzNCLE9BQU8sRUFBQyxtQkFBbUIsRUFBQyxNQUFNLHlCQUF5QixDQUFBOzs7Ozs7OztBQUczRDs7OztHQUlHO0FBQ0gsTUFBTSxDQUFDLE1BQU0sa0RBQWtELEdBQVE7SUFDckUsT0FBTyxFQUFNLGlCQUFpQjtJQUM5QixXQUFXLEVBQUUsVUFBVSxDQUFDLEdBQUcsRUFBRSxDQUFDLHNDQUFzQyxDQUFDO0lBQ3JFLEtBQUssRUFBUSxJQUFJO0NBQ2xCLENBQUM7QUFFRixNQUFNLE9BQU8sbUNBQW1DO0lBQzlDLFlBQW1CLE1BQThDLEVBQVMsS0FBYTtRQUFwRSxXQUFNLEdBQU4sTUFBTSxDQUF3QztRQUFTLFVBQUssR0FBTCxLQUFLLENBQVE7SUFDdkYsQ0FBQztDQUNGO0FBb0RELE1BQU0sT0FBTyxzQ0FBc0M7SUFxRGpELFlBQW9CLGlCQUFvQztRQUFwQyxzQkFBaUIsR0FBakIsaUJBQWlCLENBQW1CO1FBbEQ5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Z0JBQ0ksV0FBVztzQkFBcEIsTUFBTTtnQkFFRSxhQUFhO3NCQUFyQixLQUFLO2dCQUNHLFFBQVE7c0JBQWhCLEtBQUs7Z0JBS0csS0FBSztzQkFBYixLQUFLO2dCQUNJLFdBQVc7c0JBQXBCLE1BQU07Z0JBRUUsWUFBWTtzQkFBcEIsS0FBSztnQkFDSSxrQkFBa0I7c0JBQTNCLE1BQU07Z0JBRUUsR0FBRztzQkFBWCxLQUFLO2dCQUNJLFNBQVM7c0JBQWxCLE1BQU07Z0JBRUUsUUFBUTtzQkFBaEIsS0FBSztnQkFDSSxjQUFjO3NCQUF2QixNQUFNO2dCQUVFLFNBQVM7c0JBQWpCLEtBQUs7Z0JBQ0ksZUFBZTtzQkFBeEIsTUFBTTtnQkFFRSxXQUFXO3NCQUFuQixLQUFLO2dCQUNJLGlCQUFpQjtzQkFBMUIsTUFBTTtnQkFFRSxXQUFXO3NCQUFuQixLQUFLO2dCQUNJLGlCQUFpQjtzQkFBMUIsTUFBTTtnQkFFRSxnQkFBZ0I7c0JBQXhCLEtBQUs7Z0JBQ0ksc0JBQXNCO3NCQUEvQixNQUFNO2dCQU1HLE1BQU07c0JBQWYsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIENoYW5nZURldGVjdG9yUmVmLFxuICBDb21wb25lbnQsXG4gIEV2ZW50RW1pdHRlcixcbiAgZm9yd2FyZFJlZixcbiAgSG9zdEJpbmRpbmcsXG4gIElucHV0LFxuICBPbkNoYW5nZXMsXG4gIE9uSW5pdCxcbiAgT3V0cHV0LFxuICBTaW1wbGVDaGFuZ2UsXG4gIFZpZXdFbmNhcHN1bGF0aW9uXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnXG5pbXBvcnQge1xuICBDb250cm9sVmFsdWVBY2Nlc3NvcixcbiAgTkdfVkFMVUVfQUNDRVNTT1Jcbn0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnXG5pbXBvcnQge1xuICBIYWNrcyxcbiAgVGltZVVuaXRzXG59IGZyb20gJ0B0YW5nZW50aWFsL2NvcmUnXG5pbXBvcnQgbW9tZW50IGZyb20gJ21vbWVudCdcbmltcG9ydCB7RHVyYXRpb25QaWNrZXJTdGF0ZX0gZnJvbSAnLi9kdXJhdGlvbi1waWNrZXItc3RhdGUnXG5cblxuLyoqXG4gKiBQcm92aWRlciBFeHByZXNzaW9uIHRoYXQgYWxsb3dzIEljb25SYXRpbmdXaWRnZXQgdG8gcmVnaXN0ZXIgYXMgYSBDb250cm9sVmFsdWVBY2Nlc3Nvci5cbiAqIFRoaXMgYWxsb3dzIGl0IHRvIHN1cHBvcnQgWyhuZ01vZGVsKV0uXG4gKiBAZG9jcy1wcml2YXRlXG4gKi9cbmV4cG9ydCBjb25zdCBUQU5KX0RVUkFUSU9OX1dJREdFVF9DT05GSUdfQ09OVFJPTF9WQUxVRV9BQ0NFU1NPUjogYW55ID0ge1xuICBwcm92aWRlOiAgICAgTkdfVkFMVUVfQUNDRVNTT1IsXG4gIHVzZUV4aXN0aW5nOiBmb3J3YXJkUmVmKCgpID0+IER1cmF0aW9uUGlja2VyV2lkZ2V0Q29uZmlndXJlQ29tcG9uZW50KSxcbiAgbXVsdGk6ICAgICAgIHRydWVcbn07XG5cbmV4cG9ydCBjbGFzcyBEdXJhdGlvblBpY2tlcldpZGdldENvbmZpZ3VyZUNoYW5nZSB7XG4gIGNvbnN0cnVjdG9yKHB1YmxpYyBzb3VyY2U6IER1cmF0aW9uUGlja2VyV2lkZ2V0Q29uZmlndXJlQ29tcG9uZW50LCBwdWJsaWMgdmFsdWU6IG51bWJlcikge1xuICB9XG59XG5cblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAgICAgICd0YW5qLWR1cmF0aW9uLXBpY2tlci13aWRnZXQtY29uZmlndXJlJyxcbiAgdGVtcGxhdGU6ICAgICAgYDwhLS0gIC0tPlxuICA8ZGl2IGNsYXNzPVwidGFuai1pbnB1dC10ZW1wbGF0ZSB0YW5qLW1vZGUtY29uZmlndXJlXCIgZmxleCBsYXlvdXQ9XCJjb2x1bW5cIiBsYXlvdXQtYWxpZ249XCJzdGFydFwiPlxuICAgIDxtYXQtZm9ybS1maWVsZCBkaXZpZGVyQ29sb3I9XCJhY2NlbnRcIj5cbiAgICAgIDxpbnB1dCBtYXRJbnB1dFxuICAgICAgICAgICAgIGNsYXNzPVwidGFuai1pbnB1dFwiXG4gICAgICAgICAgICAgdHlwZT1cInRleHRcIlxuICAgICAgICAgICAgIG1heGxlbmd0aD1cIjUwXCJcbiAgICAgICAgICAgICBwbGFjZWhvbGRlcj1cIkVudGVyIGEgbGFiZWwgZm9yIHRoaXMgaW5wdXRcIlxuICAgICAgICAgICAgIChjaGFuZ2UpPVwibGFiZWxDaGFuZ2UuZW1pdChsYWJlbClcIlxuICAgICAgICAgICAgIFsobmdNb2RlbCldPVwibGFiZWxcIi8+XG4gICAgPC9tYXQtZm9ybS1maWVsZD5cblxuICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJsYWJlbFwiPlxuICAgICAgPGZpZWxkc2V0IGZsZXggbGF5b3V0PVwicm93XCIgbGF5b3V0LWFsaWduPVwic3RhcnRcIj5cbiAgICAgICAgPGxlZ2VuZD5Gb3I6PC9sZWdlbmQ+XG4gICAgICAgIDxkaXYgZmxleCBjbGFzcz1cInRhbmotY2hvb3NlLWR1cmF0aW9uLWZpZWxkcy1jb250YWluZXJcIiBsYXlvdXQ9XCJjb2x1bW5cIiBsYXlvdXQtYWxpZ249XCJzdGFydFwiPlxuICAgICAgICAgIDxtYXQtY2hlY2tib3ggKm5nRm9yPVwibGV0IGZpZWxkIG9mIHN0YXRlLmZpZWxkc1wiXG4gICAgICAgICAgICAgICAgICAgICAgIGxheW91dD1cInJvd1wiIGxheW91dC1hbGlnbj1cInN0YXJ0XCJcbiAgICAgICAgICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cIiFmaWVsZC5jYW5Ub2dnbGVTZWxlY3Rpb24oKVwiXG4gICAgICAgICAgICAgICAgICAgICAgIFtsYWJlbFBvc2l0aW9uXT1cIidiZWZvcmUnXCJcbiAgICAgICAgICAgICAgICAgICAgICAgW2NoZWNrZWRdPVwiZmllbGQuc2VsZWN0ZWRcIlxuICAgICAgICAgICAgICAgICAgICAgICAoY2hhbmdlKT1cImZpZWxkLnNlbGVjdGVkID0gJGV2ZW50LmNoZWNrZWRcIj5cbiAgICAgICAgICAgIHt7ZmllbGQudW5pdC5mdWxsTGFiZWx9fVxuICAgICAgICAgIDwvbWF0LWNoZWNrYm94PlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZmllbGRzZXQ+XG5cbiAgICAgIDx0YW5qLWR1cmF0aW9uLXBpY2tlci13aWRnZXRcbiAgICAgICAgWyh2YWx1ZSldPVwiZGVmYXVsdFZhbHVlXCJcbiAgICAgICAgKHZhbHVlQ2hhbmdlKT1cInZhbHVlID0gZGVmYXVsdFZhbHVlOyB2YWx1ZUNoYW5nZS5lbWl0KHZhbHVlKTsgZGVmYXVsdFZhbHVlQ2hhbmdlLmVtaXQoZGVmYXVsdFZhbHVlKVwiXG4gICAgICAgIFtkZWZhdWx0VmFsdWVdPVwiZGVmYXVsdFZhbHVlXCJcbiAgICAgICAgW3Nob3dEYXlzXT1cInNob3dEYXlzXCJcbiAgICAgICAgW3Nob3dIb3Vyc109XCJzaG93SG91cnNcIlxuICAgICAgICBbc2hvd01pbnV0ZXNdPVwic2hvd01pbnV0ZXNcIlxuICAgICAgICBbc2hvd1NlY29uZHNdPVwic2hvd1NlY29uZHNcIlxuICAgICAgICBbc2hvd01pbGxpc2Vjb25kc109XCJzaG93TWlsbGlzZWNvbmRzXCJcbiAgICAgICAgW21heF09XCJtYXhcIlxuICAgICAgICBsYWJlbD1cIkRlZmF1bHQgVmFsdWVcIlxuICAgICAgICBbbGFiZWxQb3NpdGlvbl09XCInYmVmb3JlJ1wiPlxuICAgICAgPC90YW5qLWR1cmF0aW9uLXBpY2tlci13aWRnZXQ+XG4gICAgPC9uZy1jb250YWluZXI+XG5cbiAgPC9kaXY+XG4gICAgICAgICAgICAgICAgIGAsXG4gIHByb3ZpZGVyczogICAgIFtUQU5KX0RVUkFUSU9OX1dJREdFVF9DT05GSUdfQ09OVFJPTF9WQUxVRV9BQ0NFU1NPUl0sXG4gIGVuY2Fwc3VsYXRpb246IFZpZXdFbmNhcHN1bGF0aW9uLk5vbmVcbn0pXG5leHBvcnQgY2xhc3MgRHVyYXRpb25QaWNrZXJXaWRnZXRDb25maWd1cmVDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIE9uQ2hhbmdlcywgQ29udHJvbFZhbHVlQWNjZXNzb3Ige1xuXG5cbiAgQEhvc3RCaW5kaW5nKCdhdHRyLmZsZXgnKSBmbGV4ID0gJyc7XG4gIEBIb3N0QmluZGluZygnYXR0ci5sYXlvdXQnKSBmbGV4TGF5b3V0ID0gJ2NvbHVtbic7XG4gIEBIb3N0QmluZGluZygnYXR0ci5sYXlvdXQtYWxpZ24nKSBmbGV4TGF5b3V0QWxpZ24gPSAnc3RhcnQnO1xuXG4gIEBJbnB1dCgpIHZhbHVlOiBudW1iZXIgPSAwXG4gIEBPdXRwdXQoKSB2YWx1ZUNoYW5nZTogRXZlbnRFbWl0dGVyPG51bWJlcj4gPSBuZXcgRXZlbnRFbWl0dGVyKGZhbHNlKVxuXG4gIEBJbnB1dCgpIGxhYmVsUG9zaXRpb246ICdiZWZvcmUnIHwgJ2FmdGVyJyB8ICdiZWxvdycgPSAnYmVmb3JlJ1xuICBASW5wdXQoKSBkaXNhYmxlZDogYm9vbGVhbiA9IGZhbHNlXG5cbiAgLyoqXG4gICAqIENvbmZpZ3VyYXRpb24gRmllbGRzXG4gICAqL1xuICBASW5wdXQoKSBsYWJlbDogc3RyaW5nID0gJydcbiAgQE91dHB1dCgpIGxhYmVsQ2hhbmdlOiBFdmVudEVtaXR0ZXI8c3RyaW5nPiA9IG5ldyBFdmVudEVtaXR0ZXIoZmFsc2UpXG5cbiAgQElucHV0KCkgZGVmYXVsdFZhbHVlOiBudW1iZXIgPSAwXG4gIEBPdXRwdXQoKSBkZWZhdWx0VmFsdWVDaGFuZ2U6IEV2ZW50RW1pdHRlcjxudW1iZXI+ID0gbmV3IEV2ZW50RW1pdHRlcihmYWxzZSlcblxuICBASW5wdXQoKSBtYXg6IG51bWJlciA9IDEwMFxuICBAT3V0cHV0KCkgbWF4Q2hhbmdlOiBFdmVudEVtaXR0ZXI8bnVtYmVyPiA9IG5ldyBFdmVudEVtaXR0ZXIoZmFsc2UpXG5cbiAgQElucHV0KCkgc2hvd0RheXM6IGJvb2xlYW4gPSBmYWxzZVxuICBAT3V0cHV0KCkgc2hvd0RheXNDaGFuZ2U6IEV2ZW50RW1pdHRlcjxib29sZWFuPiA9IG5ldyBFdmVudEVtaXR0ZXIoZmFsc2UpXG5cbiAgQElucHV0KCkgc2hvd0hvdXJzOiBib29sZWFuID0gZmFsc2VcbiAgQE91dHB1dCgpIHNob3dIb3Vyc0NoYW5nZTogRXZlbnRFbWl0dGVyPGJvb2xlYW4+ID0gbmV3IEV2ZW50RW1pdHRlcihmYWxzZSlcblxuICBASW5wdXQoKSBzaG93TWludXRlczogYm9vbGVhbiA9IGZhbHNlXG4gIEBPdXRwdXQoKSBzaG93TWludXRlc0NoYW5nZTogRXZlbnRFbWl0dGVyPGJvb2xlYW4+ID0gbmV3IEV2ZW50RW1pdHRlcihmYWxzZSlcblxuICBASW5wdXQoKSBzaG93U2Vjb25kczogYm9vbGVhbiA9IGZhbHNlXG4gIEBPdXRwdXQoKSBzaG93U2Vjb25kc0NoYW5nZTogRXZlbnRFbWl0dGVyPGJvb2xlYW4+ID0gbmV3IEV2ZW50RW1pdHRlcihmYWxzZSlcblxuICBASW5wdXQoKSBzaG93TWlsbGlzZWNvbmRzOiBib29sZWFuID0gZmFsc2VcbiAgQE91dHB1dCgpIHNob3dNaWxsaXNlY29uZHNDaGFuZ2U6IEV2ZW50RW1pdHRlcjxib29sZWFuPiA9IG5ldyBFdmVudEVtaXR0ZXIoZmFsc2UpXG5cbiAgLyogZW5kIENvbmZpZ3VyYXRpb24gRmllbGRzICovXG5cbiAgc3RhdGU6IER1cmF0aW9uUGlja2VyU3RhdGUgPSBuZXcgRHVyYXRpb25QaWNrZXJTdGF0ZSgpXG5cbiAgQE91dHB1dCgpIGNoYW5nZTogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyKGZhbHNlKVxuXG4gIC8qKlxuICAgKiBDYWxsZWQgd2hlbiB0aGUgc3Bpbm5lciBpcyBibHVycmVkLiBOZWVkZWQgdG8gcHJvcGVybHkgaW1wbGVtZW50IENvbnRyb2xWYWx1ZUFjY2Vzc29yLlxuICAgKiBAZG9jcy1wcml2YXRlXG4gICAqL1xuICBvblRvdWNoZWQ6ICgpID0+IGFueSA9ICgpID0+IHsgfTtcbiAgcHJpdmF0ZSBjb250cm9sVmFsdWVBY2Nlc3NvckNoYW5nZUZuOiAodmFsdWU6IGFueSkgPT4gdm9pZCA9ICh2YWx1ZSkgPT4geyB9O1xuXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgY2hhbmdlRGV0ZWN0b3JSZWY6IENoYW5nZURldGVjdG9yUmVmKSB7XG4gIH1cblxuXG4gIG5nT25Jbml0KCkge1xuICAgIEhhY2tzLm1hdGVyaWFsRGVzaWduUGxhY2Vob2xkZXJUZXh0KHRoaXMuY2hhbmdlRGV0ZWN0b3JSZWYpXG4gIH1cblxuICBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiB7IHZhbHVlOiBTaW1wbGVDaGFuZ2UgfSkge1xuICAgIGlmIChjaGFuZ2VzLnZhbHVlKSB7XG4gICAgICB0aGlzLnN0YXRlLnNldER1cmF0aW9uKG1vbWVudC5kdXJhdGlvbih0aGlzLnZhbHVlKSlcbiAgICB9XG4gICAgdGhpcy51cGRhdGVGaWVsZHMoKVxuICB9XG5cbiAgcHJpdmF0ZSB1cGRhdGVGaWVsZHMoKSB7XG4gICAgaWYgKHRoaXMuc2hvd0RheXMpIHtcbiAgICAgIHRoaXMuc3RhdGUuc2VsZWN0KFRpbWVVbml0cy5kYXkpXG4gICAgfVxuICAgIGlmICh0aGlzLnNob3dIb3Vycykge1xuICAgICAgdGhpcy5zdGF0ZS5zZWxlY3QoVGltZVVuaXRzLmgpXG4gICAgfVxuICAgIGlmICh0aGlzLnNob3dNaW51dGVzKSB7XG4gICAgICB0aGlzLnN0YXRlLnNlbGVjdChUaW1lVW5pdHMubWluKVxuICAgIH1cbiAgICBpZiAodGhpcy5zaG93U2Vjb25kcykge1xuICAgICAgdGhpcy5zdGF0ZS5zZWxlY3QoVGltZVVuaXRzLnMpXG4gICAgfVxuICAgIGlmICh0aGlzLnNob3dNaWxsaXNlY29uZHMpIHtcbiAgICAgIHRoaXMuc3RhdGUuc2VsZWN0KFRpbWVVbml0cy5tcylcbiAgICB9XG4gIH1cblxuXG4gIGVtaXRDaGFuZ2VFdmVudCgpIHtcbiAgICB0aGlzLmNvbnRyb2xWYWx1ZUFjY2Vzc29yQ2hhbmdlRm4odGhpcy52YWx1ZSk7XG4gICAgdGhpcy5jaGFuZ2UuZW1pdChuZXcgRHVyYXRpb25QaWNrZXJXaWRnZXRDb25maWd1cmVDaGFuZ2UodGhpcywgdGhpcy52YWx1ZSkpXG4gIH1cblxuICAvKipcbiAgICogQm9pbGVycGxhdGUgLyByZXF1aXJlZCBmb3IgQW5ndWxhclxuICAgKlxuICAgKi9cbiAgcHVibGljIHdyaXRlVmFsdWUodmFsdWU6IG51bWJlcik6IHZvaWQge1xuICAgIHRoaXMudmFsdWUgPSB2YWx1ZVxuICB9XG5cbiAgcHVibGljIHJlZ2lzdGVyT25DaGFuZ2UoZm46IGFueSk6IHZvaWQge1xuICAgIHRoaXMuY29udHJvbFZhbHVlQWNjZXNzb3JDaGFuZ2VGbiA9IGZuO1xuICB9XG5cbiAgcHVibGljIHJlZ2lzdGVyT25Ub3VjaGVkKGZuOiBhbnkpOiB2b2lkIHtcbiAgICB0aGlzLm9uVG91Y2hlZCA9IGZuO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldHMgdGhlIGlucHV0J3MgZGlzYWJsZWQgc3RhdGUuIEltcGxlbWVudGVkIGFzIGEgcGFydCBvZiBDb250cm9sVmFsdWVBY2Nlc3Nvci5cbiAgICogQHBhcmFtIGlzRGlzYWJsZWQgV2hldGhlciB0aGUgaW5wdXQgc2hvdWxkIGJlIGRpc2FibGVkLlxuICAgKi9cbiAgc2V0RGlzYWJsZWRTdGF0ZShpc0Rpc2FibGVkOiBib29sZWFuKSB7XG4gICAgdGhpcy5kaXNhYmxlZCA9IGlzRGlzYWJsZWQ7XG4gIH1cbn1cblxuIl19