@tangential/input-widgets
Version:
Input Widgets with persistable, dynamic configuration.
226 lines (220 loc) • 23 kB
JavaScript
import { ChangeDetectorRef, Component, EventEmitter, forwardRef, HostBinding, Input, Output, ViewEncapsulation } from '@angular/core';
import { NG_VALUE_ACCESSOR } from '@angular/forms';
import { MatDialog } from '@angular/material/dialog';
import { Hacks, TimeUnits } from '@tangential/core';
import moment from 'moment';
import { DurationPickerDialog } from './duration-picker-dialog';
import { DurationPickerState } from './duration-picker-state';
import * as i0 from "@angular/core";
import * as i1 from "@angular/material/dialog";
import * as i2 from "@angular/common";
/**
* Provider Expression that allows this widget to register as a ControlValueAccessor.
* This allows it to support [(ngModel)].
* @docs-private
*/
export const TANJ_DURATION_PICKER_WIDGET_VIEW_CONTROL_VALUE_ACCESSOR = {
provide: NG_VALUE_ACCESSOR,
useExisting: forwardRef(() => DurationPickerWidgetComponent),
multi: true
};
export class DurationPickerWidgetChange {
constructor(source, value) {
this.source = source;
this.value = value;
}
}
export class DurationPickerWidgetComponent {
constructor(changeDetectorRef, dialog) {
this.changeDetectorRef = changeDetectorRef;
this.dialog = dialog;
// turn this into a class
this.flex = '';
this.flexLayout = 'column';
this.flexLayoutAlign = 'start';
this.value = 0;
this.valueChange = new EventEmitter(false);
this.labelPosition = 'before';
this.disabled = false;
this.hideLabel = false;
this.onlyLabel = false;
/**
* Configuration Fields
*/
this.label = '';
this.defaultValue = 0;
/* end Configuration Fields */
this.max = 10;
this.showDays = false;
this.showHours = false;
this.showMinutes = false;
this.showSeconds = false;
this.showMilliseconds = false;
this.change = new EventEmitter(false);
this.state = new DurationPickerState();
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);
}
}
showEditDialog() {
const dialogRef = this.dialog.open(DurationPickerDialog, {
disableClose: true,
data: { state: this.state }
});
dialogRef.afterClosed().subscribe((result) => {
if (result.success) {
this.value = result.millis;
this.changeDetectorRef.detectChanges();
this.emitChangeEvent();
}
});
}
emitChangeEvent() {
this.controlValueAccessorChangeFn(this.value);
this.change.emit(new DurationPickerWidgetChange(this, this.value));
this.valueChange.emit(this.value);
console.log('DurationPickerWidgetComponent', 'emitChangeEvent');
}
/**
* 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;
}
}
DurationPickerWidgetComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.2.10", ngImport: i0, type: DurationPickerWidgetComponent, deps: [{ token: i0.ChangeDetectorRef }, { token: i1.MatDialog }], target: i0.ɵɵFactoryTarget.Component });
DurationPickerWidgetComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.2.10", type: DurationPickerWidgetComponent, selector: "tanj-duration-picker-widget", inputs: { value: "value", labelPosition: "labelPosition", disabled: "disabled", hideLabel: "hideLabel", onlyLabel: "onlyLabel", label: "label", defaultValue: "defaultValue", max: "max", showDays: "showDays", showHours: "showHours", showMinutes: "showMinutes", showSeconds: "showSeconds", showMilliseconds: "showMilliseconds" }, outputs: { valueChange: "valueChange", change: "change" }, host: { properties: { "attr.flex": "this.flex", "attr.layout": "this.flexLayout", "attr.layout-align": "this.flexLayoutAlign" } }, providers: [TANJ_DURATION_PICKER_WIDGET_VIEW_CONTROL_VALUE_ACCESSOR], usesOnChanges: true, ngImport: i0, template: `<!-- -->
<div flex
class="tanj-input-template tanj-mode-edit"
[ngClass]="{'tanj-disabled': disabled}"
layout="row"
layout-align="start center"
(click)="showEditDialog()">
<span *ngIf="!hideLabel && labelPosition == 'before'"
class="tanj-label tanj-icon-rating-widget-label">{{label}}</span>
<div flex class="tanj-widget-input" layout="column" layout-align="start center">
<div *ngIf="!onlyLabel"
class="tanj-widget-input"
layout="row"
layout-align="start">
<ng-container *ngFor="let field of state.fields">
<span *ngIf="field.selected">{{field.value | number:'2.0-0'}}<span
*ngIf="field.next?.selected">{{field.separator || ':'}}</span></span>
</ng-container>
</div>
<span *ngIf="!hideLabel && labelPosition == 'below'" class="tanj-label tanj-below">{{label}}</span>
</div>
<span *ngIf="!hideLabel && labelPosition == 'after'" class="tanj-label tanj-after tanj-icon-rating-widget-label">{{label}}</span>
</div>
`, isInline: true, dependencies: [{ kind: "directive", type: i2.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "pipe", type: i2.DecimalPipe, name: "number" }], encapsulation: i0.ViewEncapsulation.None });
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.10", ngImport: i0, type: DurationPickerWidgetComponent, decorators: [{
type: Component,
args: [{
selector: 'tanj-duration-picker-widget',
template: `<!-- -->
<div flex
class="tanj-input-template tanj-mode-edit"
[ngClass]="{'tanj-disabled': disabled}"
layout="row"
layout-align="start center"
(click)="showEditDialog()">
<span *ngIf="!hideLabel && labelPosition == 'before'"
class="tanj-label tanj-icon-rating-widget-label">{{label}}</span>
<div flex class="tanj-widget-input" layout="column" layout-align="start center">
<div *ngIf="!onlyLabel"
class="tanj-widget-input"
layout="row"
layout-align="start">
<ng-container *ngFor="let field of state.fields">
<span *ngIf="field.selected">{{field.value | number:'2.0-0'}}<span
*ngIf="field.next?.selected">{{field.separator || ':'}}</span></span>
</ng-container>
</div>
<span *ngIf="!hideLabel && labelPosition == 'below'" class="tanj-label tanj-below">{{label}}</span>
</div>
<span *ngIf="!hideLabel && labelPosition == 'after'" class="tanj-label tanj-after tanj-icon-rating-widget-label">{{label}}</span>
</div>
`,
providers: [TANJ_DURATION_PICKER_WIDGET_VIEW_CONTROL_VALUE_ACCESSOR],
encapsulation: ViewEncapsulation.None
}]
}], ctorParameters: function () { return [{ type: i0.ChangeDetectorRef }, { type: i1.MatDialog }]; }, 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
}], hideLabel: [{
type: Input
}], onlyLabel: [{
type: Input
}], label: [{
type: Input
}], defaultValue: [{
type: Input
}], max: [{
type: Input
}], showDays: [{
type: Input
}], showHours: [{
type: Input
}], showMinutes: [{
type: Input
}], showSeconds: [{
type: Input
}], showMilliseconds: [{
type: Input
}], change: [{
type: Output
}] } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZHVyYXRpb24tcGlja2VyLXdpZGdldC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy90YW5nZW50aWFsL2lucHV0LXdpZGdldHMvc3JjL2xpYi9kdXJhdGlvbi1waWNrZXItd2lkZ2V0L2R1cmF0aW9uLXBpY2tlci13aWRnZXQuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTCxpQkFBaUIsRUFDakIsU0FBUyxFQUNULFlBQVksRUFDWixVQUFVLEVBQ1YsV0FBVyxFQUNYLEtBQUssRUFHTCxNQUFNLEVBRU4saUJBQWlCLEVBQ2xCLE1BQU0sZUFBZSxDQUFBO0FBQ3RCLE9BQU8sRUFFTCxpQkFBaUIsRUFDbEIsTUFBTSxnQkFBZ0IsQ0FBQTtBQUN2QixPQUFPLEVBQUMsU0FBUyxFQUFDLE1BQU0sMEJBQTBCLENBQUM7QUFDbkQsT0FBTyxFQUNMLEtBQUssRUFDTCxTQUFTLEVBQ1YsTUFBTSxrQkFBa0IsQ0FBQTtBQUN6QixPQUFPLE1BQU0sTUFBTSxRQUFRLENBQUE7QUFDM0IsT0FBTyxFQUNMLG9CQUFvQixFQUVyQixNQUFNLDBCQUEwQixDQUFBO0FBQ2pDLE9BQU8sRUFBQyxtQkFBbUIsRUFBQyxNQUFNLHlCQUF5QixDQUFBOzs7O0FBRzNEOzs7O0dBSUc7QUFDSCxNQUFNLENBQUMsTUFBTSx1REFBdUQsR0FBUTtJQUMxRSxPQUFPLEVBQU0saUJBQWlCO0lBQzlCLFdBQVcsRUFBRSxVQUFVLENBQUMsR0FBRyxFQUFFLENBQUMsNkJBQTZCLENBQUM7SUFDNUQsS0FBSyxFQUFRLElBQUk7Q0FDbEIsQ0FBQztBQUVGLE1BQU0sT0FBTywwQkFBMEI7SUFFckMsWUFBbUIsTUFBcUMsRUFBUyxLQUFhO1FBQTNELFdBQU0sR0FBTixNQUFNLENBQStCO1FBQVMsVUFBSyxHQUFMLEtBQUssQ0FBUTtJQUM5RSxDQUFDO0NBQ0Y7QUE0Q0QsTUFBTSxPQUFP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LDZCQUE2QjtvQkFDNUMsUUFBUSxFQUFPOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztrQkEwQkM7b0JBQ2hCLFNBQVMsRUFBTSxDQUFDLHVEQUF1RCxDQUFDO29CQUN4RSxhQUFhLEVBQUUsaUJBQWlCLENBQUMsSUFBSTtpQkFDdEM7Z0lBSTJCLElBQUk7c0JBQTdCLFdBQVc7dUJBQUMsV0FBVztnQkFDSSxVQUFVO3NCQUFyQyxXQUFXO3VCQUFDLGFBQWE7Z0JBQ1EsZUFBZTtzQkFBaEQsV0FBVzt1QkFBQyxtQkFBbUI7Z0JBRXZCLEtBQUs7c0JBQWIsS0FBSztnQkFDSSxXQUFXO3NCQUFwQixNQUFNO2dCQUVFLGFBQWE7c0JBQXJCLEtBQUs7Z0JBQ0csUUFBUTtzQkFBaEIsS0FBSztnQkFDRyxTQUFTO3NCQUFqQixLQUFLO2dCQUNHLFNBQVM7c0JBQWpCLEtBQUs7Z0JBS0csS0FBSztzQkFBYixLQUFLO2dCQUNHLFlBQVk7c0JBQXBCLEtBQUs7Z0JBR0csR0FBRztzQkFBWCxLQUFLO2dCQUVHLFFBQVE7c0JBQWhCLEtBQUs7Z0JBQ0csU0FBUztzQkFBakIsS0FBSztnQkFDRyxXQUFXO3NCQUFuQixLQUFLO2dCQUNHLFdBQVc7c0JBQW5CLEtBQUs7Z0JBQ0csZ0JBQWdCO3NCQUF4QixLQUFLO2dCQUVJLE1BQU07c0JBQWYsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIENoYW5nZURldGVjdG9yUmVmLFxuICBDb21wb25lbnQsXG4gIEV2ZW50RW1pdHRlcixcbiAgZm9yd2FyZFJlZixcbiAgSG9zdEJpbmRpbmcsXG4gIElucHV0LFxuICBPbkNoYW5nZXMsXG4gIE9uSW5pdCxcbiAgT3V0cHV0LFxuICBTaW1wbGVDaGFuZ2UsXG4gIFZpZXdFbmNhcHN1bGF0aW9uXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnXG5pbXBvcnQge1xuICBDb250cm9sVmFsdWVBY2Nlc3NvcixcbiAgTkdfVkFMVUVfQUNDRVNTT1Jcbn0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnXG5pbXBvcnQge01hdERpYWxvZ30gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvZGlhbG9nJztcbmltcG9ydCB7XG4gIEhhY2tzLFxuICBUaW1lVW5pdHNcbn0gZnJvbSAnQHRhbmdlbnRpYWwvY29yZSdcbmltcG9ydCBtb21lbnQgZnJvbSAnbW9tZW50J1xuaW1wb3J0IHtcbiAgRHVyYXRpb25QaWNrZXJEaWFsb2csXG4gIER1cmF0aW9uUGlja2VyRGlhbG9nUmVzdWx0XG59IGZyb20gJy4vZHVyYXRpb24tcGlja2VyLWRpYWxvZydcbmltcG9ydCB7RHVyYXRpb25QaWNrZXJTdGF0ZX0gZnJvbSAnLi9kdXJhdGlvbi1waWNrZXItc3RhdGUnXG5cblxuLyoqXG4gKiBQcm92aWRlciBFeHByZXNzaW9uIHRoYXQgYWxsb3dzIHRoaXMgd2lkZ2V0IHRvIHJlZ2lzdGVyIGFzIGEgQ29udHJvbFZhbHVlQWNjZXNzb3IuXG4gKiBUaGlzIGFsbG93cyBpdCB0byBzdXBwb3J0IFsobmdNb2RlbCldLlxuICogQGRvY3MtcHJpdmF0ZVxuICovXG5leHBvcnQgY29uc3QgVEFOSl9EVVJBVElPTl9QSUNLRVJfV0lER0VUX1ZJRVdfQ09OVFJPTF9WQUxVRV9BQ0NFU1NPUjogYW55ID0ge1xuICBwcm92aWRlOiAgICAgTkdfVkFMVUVfQUNDRVNTT1IsXG4gIHVzZUV4aXN0aW5nOiBmb3J3YXJkUmVmKCgpID0+IER1cmF0aW9uUGlja2VyV2lkZ2V0Q29tcG9uZW50KSxcbiAgbXVsdGk6ICAgICAgIHRydWVcbn07XG5cbmV4cG9ydCBjbGFzcyBEdXJhdGlvblBpY2tlcldpZGdldENoYW5nZSB7XG5cbiAgY29uc3RydWN0b3IocHVibGljIHNvdXJjZTogRHVyYXRpb25QaWNrZXJXaWRnZXRDb21wb25lbnQsIHB1YmxpYyB2YWx1ZTogbnVtYmVyKSB7XG4gIH1cbn1cblxuXG5leHBvcnQgaW50ZXJmYWNlIER1cmF0aW9uRmllbGRDb25maWcge1xuICB1bml0S2V5OiBzdHJpbmdcbiAgc2hvd2luZzogYm9vbGVhblxuICBzaG93aW5nTmV4dDogYm9vbGVhblxuICBzZXBhcmF0b3I/OiBzdHJpbmdcbiAgbGFiZWw6IHN0cmluZ1xuICBtYXg6IG51bWJlclxuICB2YWx1ZTogbnVtYmVyXG59XG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICAgICAgJ3RhbmotZHVyYXRpb24tcGlja2VyLXdpZGdldCcsXG4gIHRlbXBsYXRlOiAgICAgIGA8IS0tIC0tPlxuICA8ZGl2IGZsZXhcbiAgICAgICBjbGFzcz1cInRhbmotaW5wdXQtdGVtcGxhdGUgdGFuai1tb2RlLWVkaXRcIlxuICAgICAgIFtuZ0NsYXNzXT1cInsndGFuai1kaXNhYmxlZCc6IGRpc2FibGVkfVwiXG4gICAgICAgbGF5b3V0PVwicm93XCJcbiAgICAgICBsYXlvdXQtYWxpZ249XCJzdGFydCBjZW50ZXJcIlxuICAgICAgIChjbGljayk9XCJzaG93RWRpdERpYWxvZygpXCI+XG4gICAgICA8c3BhbiAqbmdJZj1cIiFoaWRlTGFiZWwgJiYgbGFiZWxQb3NpdGlvbiA9PSAnYmVmb3JlJ1wiXG4gICAgICAgICAgICBjbGFzcz1cInRhbmotbGFiZWwgdGFuai1pY29uLXJhdGluZy13aWRnZXQtbGFiZWxcIj57e2xhYmVsfX08L3NwYW4+XG4gICAgPGRpdiBmbGV4IGNsYXNzPVwidGFuai13aWRnZXQtaW5wdXRcIiBsYXlvdXQ9XCJjb2x1bW5cIiBsYXlvdXQtYWxpZ249XCJzdGFydCBjZW50ZXJcIj5cbiAgICAgIDxkaXYgKm5nSWY9XCIhb25seUxhYmVsXCJcbiAgICAgICAgICAgY2xhc3M9XCJ0YW5qLXdpZGdldC1pbnB1dFwiXG4gICAgICAgICAgIGxheW91dD1cInJvd1wiXG4gICAgICAgICAgIGxheW91dC1hbGlnbj1cInN0YXJ0XCI+XG5cbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgZmllbGQgb2Ygc3RhdGUuZmllbGRzXCI+XG4gICAgICAgICAgPHNwYW4gKm5nSWY9XCJmaWVsZC5zZWxlY3RlZFwiPnt7ZmllbGQudmFsdWUgfCBudW1iZXI6JzIuMC0wJ319PHNwYW5cbiAgICAgICAgICAgICpuZ0lmPVwiZmllbGQubmV4dD8uc2VsZWN0ZWRcIj57e2ZpZWxkLnNlcGFyYXRvciB8fCAnOid9fTwvc3Bhbj48L3NwYW4+XG4gICAgICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgICA8L2Rpdj5cbiAgICAgIDxzcGFuICpuZ0lmPVwiIWhpZGVMYWJlbCAmJiBsYWJlbFBvc2l0aW9uID09ICdiZWxvdydcIiBjbGFzcz1cInRhbmotbGFiZWwgdGFuai1iZWxvd1wiPnt7bGFiZWx9fTwvc3Bhbj5cbiAgICA8L2Rpdj5cbiAgICA8c3BhbiAqbmdJZj1cIiFoaWRlTGFiZWwgJiYgbGFiZWxQb3NpdGlvbiA9PSAnYWZ0ZXInXCIgY2xhc3M9XCJ0YW5qLWxhYmVsIHRhbmotYWZ0ZXIgdGFuai1pY29uLXJhdGluZy13aWRnZXQtbGFiZWxcIj57e2xhYmVsfX08L3NwYW4+XG4gIDwvZGl2PlxuXG4gICAgICAgICAgICAgICAgIGAsXG4gIHByb3ZpZGVyczogICAgIFtUQU5KX0RVUkFUSU9OX1BJQ0tFUl9XSURHRVRfVklFV19DT05UUk9MX1ZBTFVFX0FDQ0VTU09SXSxcbiAgZW5jYXBzdWxhdGlvbjogVmlld0VuY2Fwc3VsYXRpb24uTm9uZVxufSlcbmV4cG9ydCBjbGFzcyBEdXJhdGlvblBpY2tlcldpZGdldENvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgT25DaGFuZ2VzLCBDb250cm9sVmFsdWVBY2Nlc3NvciB7XG5cbiAgLy8gdHVybiB0aGlzIGludG8gYSBjbGFzc1xuICBASG9zdEJpbmRpbmcoJ2F0dHIuZmxleCcpIGZsZXggPSAnJztcbiAgQEhvc3RCaW5kaW5nKCdhdHRyLmxheW91dCcpIGZsZXhMYXlvdXQgPSAnY29sdW1uJztcbiAgQEhvc3RCaW5kaW5nKCdhdHRyLmxheW91dC1hbGlnbicpIGZsZXhMYXlvdXRBbGlnbiA9ICdzdGFydCc7XG5cbiAgQElucHV0KCkgdmFsdWU6IG51bWJlciA9IDBcbiAgQE91dHB1dCgpIHZhbHVlQ2hhbmdlOiBFdmVudEVtaXR0ZXI8bnVtYmVyPiA9IG5ldyBFdmVudEVtaXR0ZXIoZmFsc2UpXG5cbiAgQElucHV0KCkgbGFiZWxQb3NpdGlvbjogJ2JlZm9yZScgfCAnYWZ0ZXInIHwgJ2JlbG93JyA9ICdiZWZvcmUnXG4gIEBJbnB1dCgpIGRpc2FibGVkOiBib29sZWFuID0gZmFsc2VcbiAgQElucHV0KCkgaGlkZUxhYmVsOiBib29sZWFuID0gZmFsc2VcbiAgQElucHV0KCkgb25seUxhYmVsOiBib29sZWFuID0gZmFsc2VcblxuICAvKipcbiAgICogQ29uZmlndXJhdGlvbiBGaWVsZHNcbiAgICovXG4gIEBJbnB1dCgpIGxhYmVsOiBzdHJpbmcgPSAnJ1xuICBASW5wdXQoKSBkZWZhdWx0VmFsdWU6IG51bWJlciA9IDBcbiAgLyogZW5kIENvbmZpZ3VyYXRpb24gRmllbGRzICovXG5cbiAgQElucHV0KCkgbWF4OiBudW1iZXIgPSAxMFxuXG4gIEBJbnB1dCgpIHNob3dEYXlzOiBib29sZWFuID0gZmFsc2VcbiAgQElucHV0KCkgc2hvd0hvdXJzOiBib29sZWFuID0gZmFsc2VcbiAgQElucHV0KCkgc2hvd01pbnV0ZXM6IGJvb2xlYW4gPSBmYWxzZVxuICBASW5wdXQoKSBzaG93U2Vjb25kczogYm9vbGVhbiA9IGZhbHNlXG4gIEBJbnB1dCgpIHNob3dNaWxsaXNlY29uZHM6IGJvb2xlYW4gPSBmYWxzZVxuXG4gIEBPdXRwdXQoKSBjaGFuZ2U6IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcihmYWxzZSlcblxuICBzdGF0ZTogRHVyYXRpb25QaWNrZXJTdGF0ZSA9IG5ldyBEdXJhdGlvblBpY2tlclN0YXRlKClcblxuICBvblRvdWNoZWQ6ICgpID0+IGFueSA9ICgpID0+IHsgfTtcbiAgcHJpdmF0ZSBjb250cm9sVmFsdWVBY2Nlc3NvckNoYW5nZUZuOiAodmFsdWU6IGFueSkgPT4gdm9pZCA9ICh2YWx1ZSkgPT4geyB9O1xuXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgY2hhbmdlRGV0ZWN0b3JSZWY6IENoYW5nZURldGVjdG9yUmVmLCBwcml2YXRlIGRpYWxvZzogTWF0RGlhbG9nKSB7XG4gIH1cblxuICBuZ09uSW5pdCgpIHtcbiAgICBIYWNrcy5tYXRlcmlhbERlc2lnblBsYWNlaG9sZGVyVGV4dCh0aGlzLmNoYW5nZURldGVjdG9yUmVmKVxuICB9XG5cblxuICBwdWJsaWMgbmdPbkNoYW5nZXMoY2hhbmdlczogeyB2YWx1ZTogU2ltcGxlQ2hhbmdlIH0pOiB2b2lkIHtcbiAgICBpZiAoY2hhbmdlcy52YWx1ZSkge1xuICAgICAgdGhpcy5zdGF0ZS5zZXREdXJhdGlvbihtb21lbnQuZHVyYXRpb24odGhpcy52YWx1ZSkpXG4gICAgfVxuICAgIHRoaXMudXBkYXRlRmllbGRzKClcbiAgfVxuXG4gIHByaXZhdGUgdXBkYXRlRmllbGRzKCkge1xuICAgIGlmICh0aGlzLnNob3dEYXlzKSB7XG4gICAgICB0aGlzLnN0YXRlLnNlbGVjdChUaW1lVW5pdHMuZGF5KVxuICAgIH1cbiAgICBpZiAodGhpcy5zaG93SG91cnMpIHtcbiAgICAgIHRoaXMuc3RhdGUuc2VsZWN0KFRpbWVVbml0cy5oKVxuICAgIH1cbiAgICBpZiAodGhpcy5zaG93TWludXRlcykge1xuICAgICAgdGhpcy5zdGF0ZS5zZWxlY3QoVGltZVVuaXRzLm1pbilcbiAgICB9XG4gICAgaWYgKHRoaXMuc2hvd1NlY29uZHMpIHtcbiAgICAgIHRoaXMuc3RhdGUuc2VsZWN0KFRpbWVVbml0cy5zKVxuICAgIH1cbiAgICBpZiAodGhpcy5zaG93TWlsbGlzZWNvbmRzKSB7XG4gICAgICB0aGlzLnN0YXRlLnNlbGVjdChUaW1lVW5pdHMubXMpXG4gICAgfVxuICB9XG5cblxuICBzaG93RWRpdERpYWxvZygpIHtcbiAgICBjb25zdCBkaWFsb2dSZWYgPSB0aGlzLmRpYWxvZy5vcGVuKER1cmF0aW9uUGlja2VyRGlhbG9nLCB7XG4gICAgICBkaXNhYmxlQ2xvc2U6IHRydWUsXG4gICAgICBkYXRhOiAgICAgICAgIHtzdGF0ZTogdGhpcy5zdGF0ZX1cbiAgICB9KVxuICAgIGRpYWxvZ1JlZi5hZnRlckNsb3NlZCgpLnN1YnNjcmliZSgocmVzdWx0OiBEdXJhdGlvblBpY2tlckRpYWxvZ1Jlc3VsdCkgPT4ge1xuICAgICAgaWYgKHJlc3VsdC5zdWNjZXNzKSB7XG4gICAgICAgIHRoaXMudmFsdWUgPSByZXN1bHQubWlsbGlzXG4gICAgICAgIHRoaXMuY2hhbmdlRGV0ZWN0b3JSZWYuZGV0ZWN0Q2hhbmdlcygpXG4gICAgICAgIHRoaXMuZW1pdENoYW5nZUV2ZW50KClcbiAgICAgIH1cbiAgICB9KVxuICB9XG5cblxuICBwcml2YXRlIGVtaXRDaGFuZ2VFdmVudCgpIHtcbiAgICB0aGlzLmNvbnRyb2xWYWx1ZUFjY2Vzc29yQ2hhbmdlRm4odGhpcy52YWx1ZSk7XG4gICAgdGhpcy5jaGFuZ2UuZW1pdChuZXcgRHVyYXRpb25QaWNrZXJXaWRnZXRDaGFuZ2UodGhpcywgdGhpcy52YWx1ZSkpXG4gICAgdGhpcy52YWx1ZUNoYW5nZS5lbWl0KHRoaXMudmFsdWUpXG4gICAgY29uc29sZS5sb2coJ0R1cmF0aW9uUGlja2VyV2lkZ2V0Q29tcG9uZW50JywgJ2VtaXRDaGFuZ2VFdmVudCcpXG4gIH1cblxuICAvKipcbiAgICogQm9pbGVycGxhdGUgLyByZXF1aXJlZCBmb3IgQW5ndWxhclxuICAgKlxuICAgKi9cbiAgcHVibGljIHdyaXRlVmFsdWUodmFsdWU6IG51bWJlcik6IHZvaWQge1xuICAgIHRoaXMudmFsdWUgPSB2YWx1ZVxuICB9XG5cbiAgcHVibGljIHJlZ2lzdGVyT25DaGFuZ2UoZm46IGFueSk6IHZvaWQge1xuICAgIHRoaXMuY29udHJvbFZhbHVlQWNjZXNzb3JDaGFuZ2VGbiA9IGZuO1xuICB9XG5cbiAgcHVibGljIHJlZ2lzdGVyT25Ub3VjaGVkKGZuOiBhbnkpOiB2b2lkIHtcbiAgICB0aGlzLm9uVG91Y2hlZCA9IGZuO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldHMgdGhlIGlucHV0J3MgZGlzYWJsZWQgc3RhdGUuIEltcGxlbWVudGVkIGFzIGEgcGFydCBvZiBDb250cm9sVmFsdWVBY2Nlc3Nvci5cbiAgICogQHBhcmFtIGlzRGlzYWJsZWQgV2hldGhlciB0aGUgaW5wdXQgc2hvdWxkIGJlIGRpc2FibGVkLlxuICAgKi9cbiAgc2V0RGlzYWJsZWRTdGF0ZShpc0Rpc2FibGVkOiBib29sZWFuKSB7XG4gICAgdGhpcy5kaXNhYmxlZCA9IGlzRGlzYWJsZWQ7XG4gIH1cbn1cblxuIl19