@skyux/datetime 5.7.1 → 6.0.0-beta.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/esm2020/index.mjs +28 -0
- package/esm2020/lib/modules/date-pipe/date-format-utility.mjs +46 -0
- package/esm2020/lib/modules/date-pipe/date-pipe.module.mjs +21 -0
- package/esm2020/lib/modules/date-pipe/date.pipe.mjs +65 -0
- package/esm2020/lib/modules/date-pipe/fuzzy-date.pipe.mjs +47 -0
- package/esm2020/lib/modules/date-range-picker/date-range-picker.component.mjs +448 -0
- package/esm2020/lib/modules/date-range-picker/date-range-picker.module.mjs +47 -0
- package/esm2020/lib/modules/date-range-picker/date-range.service.mjs +97 -0
- package/esm2020/lib/modules/date-range-picker/types/date-range-calculation.mjs +2 -0
- package/esm2020/lib/modules/date-range-picker/types/date-range-calculator-config.mjs +2 -0
- package/esm2020/lib/modules/date-range-picker/types/date-range-calculator-date-range-function.mjs +2 -0
- package/esm2020/lib/modules/date-range-picker/types/date-range-calculator-id.mjs +118 -0
- package/esm2020/lib/modules/date-range-picker/types/date-range-calculator-type.mjs +23 -0
- package/esm2020/lib/modules/date-range-picker/types/date-range-calculator-validate-function.mjs +2 -0
- package/esm2020/lib/modules/date-range-picker/types/date-range-calculator.mjs +56 -0
- package/esm2020/lib/modules/date-range-picker/types/date-range-default-calculator-config.mjs +2 -0
- package/esm2020/lib/modules/date-range-picker/types/date-range-default-calculator-configs.mjs +147 -0
- package/esm2020/lib/modules/date-range-picker/types/date-range-relative-value.mjs +249 -0
- package/esm2020/lib/modules/date-range-picker/types/date-range.mjs +2 -0
- package/esm2020/lib/modules/datepicker/date-formatter.mjs +38 -0
- package/esm2020/lib/modules/datepicker/datepicker-adapter.service.mjs +33 -0
- package/esm2020/lib/modules/datepicker/datepicker-calendar-change.mjs +2 -0
- package/esm2020/lib/modules/datepicker/datepicker-calendar-inner.component.mjs +310 -0
- package/esm2020/lib/modules/datepicker/datepicker-calendar.component.mjs +104 -0
- package/esm2020/lib/modules/datepicker/datepicker-config.service.mjs +21 -0
- package/esm2020/lib/modules/datepicker/datepicker-custom-date.mjs +2 -0
- package/esm2020/lib/modules/datepicker/datepicker-date.mjs +2 -0
- package/esm2020/lib/modules/datepicker/datepicker-input-fuzzy.directive.mjs +466 -0
- package/esm2020/lib/modules/datepicker/datepicker-input.directive.mjs +445 -0
- package/esm2020/lib/modules/datepicker/datepicker.component.mjs +328 -0
- package/esm2020/lib/modules/datepicker/datepicker.module.mjs +95 -0
- package/esm2020/lib/modules/datepicker/datepicker.service.mjs +21 -0
- package/esm2020/lib/modules/datepicker/daypicker-button.component.mjs +22 -0
- package/esm2020/lib/modules/datepicker/daypicker-cell.component.mjs +126 -0
- package/esm2020/lib/modules/datepicker/daypicker.component.mjs +211 -0
- package/esm2020/lib/modules/datepicker/fuzzy-date.mjs +2 -0
- package/esm2020/lib/modules/datepicker/fuzzy-date.service.mjs +403 -0
- package/esm2020/lib/modules/datepicker/monthpicker.component.mjs +80 -0
- package/esm2020/lib/modules/datepicker/yearpicker.component.mjs +86 -0
- package/esm2020/lib/modules/shared/sky-datetime-resources.module.mjs +131 -0
- package/esm2020/lib/modules/timepicker/timepicker.component.mjs +361 -0
- package/esm2020/lib/modules/timepicker/timepicker.directive.mjs +228 -0
- package/esm2020/lib/modules/timepicker/timepicker.interface.mjs +2 -0
- package/esm2020/lib/modules/timepicker/timepicker.module.mjs +46 -0
- package/esm2020/skyux-datetime.mjs +5 -0
- package/esm2020/testing/datepicker-fixture.mjs +54 -0
- package/esm2020/testing/public-api.mjs +3 -0
- package/esm2020/testing/skyux-datetime-testing.mjs +5 -0
- package/esm2020/testing/timepicker-fixture.mjs +50 -0
- package/fesm2015/{skyux-datetime-testing.js → skyux-datetime-testing.mjs} +1 -1
- package/fesm2015/skyux-datetime-testing.mjs.map +1 -0
- package/fesm2015/skyux-datetime.mjs +4726 -0
- package/fesm2015/skyux-datetime.mjs.map +1 -0
- package/{esm2015/testing/datepicker-fixture.js → fesm2020/skyux-datetime-testing.mjs} +57 -2
- package/fesm2020/skyux-datetime-testing.mjs.map +1 -0
- package/{fesm2015/skyux-datetime.js → fesm2020/skyux-datetime.mjs} +110 -158
- package/fesm2020/skyux-datetime.mjs.map +1 -0
- package/package.json +38 -17
- package/testing/package.json +5 -5
- package/bundles/skyux-datetime-testing.umd.js +0 -143
- package/bundles/skyux-datetime.umd.js +0 -5488
- package/esm2015/index.js +0 -28
- package/esm2015/index.js.map +0 -1
- package/esm2015/lib/modules/date-pipe/date-format-utility.js +0 -46
- package/esm2015/lib/modules/date-pipe/date-format-utility.js.map +0 -1
- package/esm2015/lib/modules/date-pipe/date-pipe.module.js +0 -21
- package/esm2015/lib/modules/date-pipe/date-pipe.module.js.map +0 -1
- package/esm2015/lib/modules/date-pipe/date.pipe.js +0 -65
- package/esm2015/lib/modules/date-pipe/date.pipe.js.map +0 -1
- package/esm2015/lib/modules/date-pipe/fuzzy-date.pipe.js +0 -47
- package/esm2015/lib/modules/date-pipe/fuzzy-date.pipe.js.map +0 -1
- package/esm2015/lib/modules/date-range-picker/date-range-picker.component.js +0 -453
- package/esm2015/lib/modules/date-range-picker/date-range-picker.component.js.map +0 -1
- package/esm2015/lib/modules/date-range-picker/date-range-picker.module.js +0 -47
- package/esm2015/lib/modules/date-range-picker/date-range-picker.module.js.map +0 -1
- package/esm2015/lib/modules/date-range-picker/date-range.service.js +0 -97
- package/esm2015/lib/modules/date-range-picker/date-range.service.js.map +0 -1
- package/esm2015/lib/modules/date-range-picker/types/date-range-calculation.js +0 -2
- package/esm2015/lib/modules/date-range-picker/types/date-range-calculation.js.map +0 -1
- package/esm2015/lib/modules/date-range-picker/types/date-range-calculator-config.js +0 -2
- package/esm2015/lib/modules/date-range-picker/types/date-range-calculator-config.js.map +0 -1
- package/esm2015/lib/modules/date-range-picker/types/date-range-calculator-date-range-function.js +0 -2
- package/esm2015/lib/modules/date-range-picker/types/date-range-calculator-date-range-function.js.map +0 -1
- package/esm2015/lib/modules/date-range-picker/types/date-range-calculator-id.js +0 -118
- package/esm2015/lib/modules/date-range-picker/types/date-range-calculator-id.js.map +0 -1
- package/esm2015/lib/modules/date-range-picker/types/date-range-calculator-type.js +0 -23
- package/esm2015/lib/modules/date-range-picker/types/date-range-calculator-type.js.map +0 -1
- package/esm2015/lib/modules/date-range-picker/types/date-range-calculator-validate-function.js +0 -2
- package/esm2015/lib/modules/date-range-picker/types/date-range-calculator-validate-function.js.map +0 -1
- package/esm2015/lib/modules/date-range-picker/types/date-range-calculator.js +0 -56
- package/esm2015/lib/modules/date-range-picker/types/date-range-calculator.js.map +0 -1
- package/esm2015/lib/modules/date-range-picker/types/date-range-default-calculator-config.js +0 -2
- package/esm2015/lib/modules/date-range-picker/types/date-range-default-calculator-config.js.map +0 -1
- package/esm2015/lib/modules/date-range-picker/types/date-range-default-calculator-configs.js +0 -147
- package/esm2015/lib/modules/date-range-picker/types/date-range-default-calculator-configs.js.map +0 -1
- package/esm2015/lib/modules/date-range-picker/types/date-range-relative-value.js +0 -249
- package/esm2015/lib/modules/date-range-picker/types/date-range-relative-value.js.map +0 -1
- package/esm2015/lib/modules/date-range-picker/types/date-range.js +0 -2
- package/esm2015/lib/modules/date-range-picker/types/date-range.js.map +0 -1
- package/esm2015/lib/modules/datepicker/date-formatter.js +0 -38
- package/esm2015/lib/modules/datepicker/date-formatter.js.map +0 -1
- package/esm2015/lib/modules/datepicker/datepicker-adapter.service.js +0 -33
- package/esm2015/lib/modules/datepicker/datepicker-adapter.service.js.map +0 -1
- package/esm2015/lib/modules/datepicker/datepicker-calendar-change.js +0 -2
- package/esm2015/lib/modules/datepicker/datepicker-calendar-change.js.map +0 -1
- package/esm2015/lib/modules/datepicker/datepicker-calendar-inner.component.js +0 -315
- package/esm2015/lib/modules/datepicker/datepicker-calendar-inner.component.js.map +0 -1
- package/esm2015/lib/modules/datepicker/datepicker-calendar.component.js +0 -109
- package/esm2015/lib/modules/datepicker/datepicker-calendar.component.js.map +0 -1
- package/esm2015/lib/modules/datepicker/datepicker-config.service.js +0 -21
- package/esm2015/lib/modules/datepicker/datepicker-config.service.js.map +0 -1
- package/esm2015/lib/modules/datepicker/datepicker-custom-date.js +0 -2
- package/esm2015/lib/modules/datepicker/datepicker-custom-date.js.map +0 -1
- package/esm2015/lib/modules/datepicker/datepicker-date.js +0 -2
- package/esm2015/lib/modules/datepicker/datepicker-date.js.map +0 -1
- package/esm2015/lib/modules/datepicker/datepicker-input-fuzzy.directive.js +0 -467
- package/esm2015/lib/modules/datepicker/datepicker-input-fuzzy.directive.js.map +0 -1
- package/esm2015/lib/modules/datepicker/datepicker-input.directive.js +0 -446
- package/esm2015/lib/modules/datepicker/datepicker-input.directive.js.map +0 -1
- package/esm2015/lib/modules/datepicker/datepicker.component.js +0 -333
- package/esm2015/lib/modules/datepicker/datepicker.component.js.map +0 -1
- package/esm2015/lib/modules/datepicker/datepicker.module.js +0 -95
- package/esm2015/lib/modules/datepicker/datepicker.module.js.map +0 -1
- package/esm2015/lib/modules/datepicker/datepicker.service.js +0 -21
- package/esm2015/lib/modules/datepicker/datepicker.service.js.map +0 -1
- package/esm2015/lib/modules/datepicker/daypicker-button.component.js +0 -26
- package/esm2015/lib/modules/datepicker/daypicker-button.component.js.map +0 -1
- package/esm2015/lib/modules/datepicker/daypicker-cell.component.js +0 -130
- package/esm2015/lib/modules/datepicker/daypicker-cell.component.js.map +0 -1
- package/esm2015/lib/modules/datepicker/daypicker.component.js +0 -215
- package/esm2015/lib/modules/datepicker/daypicker.component.js.map +0 -1
- package/esm2015/lib/modules/datepicker/fuzzy-date.js +0 -2
- package/esm2015/lib/modules/datepicker/fuzzy-date.js.map +0 -1
- package/esm2015/lib/modules/datepicker/fuzzy-date.service.js +0 -403
- package/esm2015/lib/modules/datepicker/fuzzy-date.service.js.map +0 -1
- package/esm2015/lib/modules/datepicker/monthpicker.component.js +0 -84
- package/esm2015/lib/modules/datepicker/monthpicker.component.js.map +0 -1
- package/esm2015/lib/modules/datepicker/yearpicker.component.js +0 -90
- package/esm2015/lib/modules/datepicker/yearpicker.component.js.map +0 -1
- package/esm2015/lib/modules/shared/sky-datetime-resources.module.js +0 -131
- package/esm2015/lib/modules/shared/sky-datetime-resources.module.js.map +0 -1
- package/esm2015/lib/modules/timepicker/timepicker.component.js +0 -367
- package/esm2015/lib/modules/timepicker/timepicker.component.js.map +0 -1
- package/esm2015/lib/modules/timepicker/timepicker.directive.js +0 -228
- package/esm2015/lib/modules/timepicker/timepicker.directive.js.map +0 -1
- package/esm2015/lib/modules/timepicker/timepicker.interface.js +0 -2
- package/esm2015/lib/modules/timepicker/timepicker.interface.js.map +0 -1
- package/esm2015/lib/modules/timepicker/timepicker.module.js +0 -46
- package/esm2015/lib/modules/timepicker/timepicker.module.js.map +0 -1
- package/esm2015/skyux-datetime.js +0 -5
- package/esm2015/skyux-datetime.js.map +0 -1
- package/esm2015/testing/datepicker-fixture.js.map +0 -1
- package/esm2015/testing/public-api.js +0 -3
- package/esm2015/testing/public-api.js.map +0 -1
- package/esm2015/testing/skyux-datetime-testing.js +0 -5
- package/esm2015/testing/skyux-datetime-testing.js.map +0 -1
- package/esm2015/testing/timepicker-fixture.js +0 -50
- package/esm2015/testing/timepicker-fixture.js.map +0 -1
- package/fesm2015/skyux-datetime-testing.js.map +0 -1
- package/fesm2015/skyux-datetime.js.map +0 -1
|
@@ -0,0 +1,466 @@
|
|
|
1
|
+
import { ChangeDetectorRef, Directive, ElementRef, HostListener, Input, Optional, Renderer2, forwardRef, } from '@angular/core';
|
|
2
|
+
import { NG_VALIDATORS, NG_VALUE_ACCESSOR, } from '@angular/forms';
|
|
3
|
+
import { SkyAppLocaleProvider, SkyLibResourcesService } from '@skyux/i18n';
|
|
4
|
+
import { Subject } from 'rxjs';
|
|
5
|
+
import { distinctUntilChanged, takeUntil } from 'rxjs/operators';
|
|
6
|
+
import { SkyDateFormatter } from './date-formatter';
|
|
7
|
+
import { SkyDatepickerConfigService } from './datepicker-config.service';
|
|
8
|
+
import { SkyDatepickerComponent } from './datepicker.component';
|
|
9
|
+
import { SkyFuzzyDateService } from './fuzzy-date.service';
|
|
10
|
+
import * as i0 from "@angular/core";
|
|
11
|
+
import * as i1 from "./datepicker-config.service";
|
|
12
|
+
import * as i2 from "./fuzzy-date.service";
|
|
13
|
+
import * as i3 from "@skyux/i18n";
|
|
14
|
+
import * as i4 from "./datepicker.component";
|
|
15
|
+
// tslint:disable:no-forward-ref no-use-before-declare
|
|
16
|
+
const SKY_FUZZY_DATEPICKER_VALUE_ACCESSOR = {
|
|
17
|
+
provide: NG_VALUE_ACCESSOR,
|
|
18
|
+
useExisting: forwardRef(() => SkyFuzzyDatepickerInputDirective),
|
|
19
|
+
multi: true,
|
|
20
|
+
};
|
|
21
|
+
const SKY_FUZZY_DATEPICKER_VALIDATOR = {
|
|
22
|
+
provide: NG_VALIDATORS,
|
|
23
|
+
useExisting: forwardRef(() => SkyFuzzyDatepickerInputDirective),
|
|
24
|
+
multi: true,
|
|
25
|
+
};
|
|
26
|
+
// tslint:enable
|
|
27
|
+
export class SkyFuzzyDatepickerInputDirective {
|
|
28
|
+
constructor(changeDetector, configService, elementRef, fuzzyDateService, localeProvider, renderer, resourcesService, datepickerComponent) {
|
|
29
|
+
this.changeDetector = changeDetector;
|
|
30
|
+
this.configService = configService;
|
|
31
|
+
this.elementRef = elementRef;
|
|
32
|
+
this.fuzzyDateService = fuzzyDateService;
|
|
33
|
+
this.localeProvider = localeProvider;
|
|
34
|
+
this.renderer = renderer;
|
|
35
|
+
this.resourcesService = resourcesService;
|
|
36
|
+
this.datepickerComponent = datepickerComponent;
|
|
37
|
+
/**
|
|
38
|
+
* Indicates whether to disable date validation on the fuzzy datepicker input.
|
|
39
|
+
* @default false
|
|
40
|
+
*/
|
|
41
|
+
this.skyDatepickerNoValidate = false;
|
|
42
|
+
this.dateFormatter = new SkyDateFormatter();
|
|
43
|
+
this.ngUnsubscribe = new Subject();
|
|
44
|
+
this._futureDisabled = false;
|
|
45
|
+
this._disabled = false;
|
|
46
|
+
this._yearRequired = false;
|
|
47
|
+
// eslint-disable-next-line @typescript-eslint/no-empty-function
|
|
48
|
+
this.onChange = (_) => { };
|
|
49
|
+
// eslint-disable-next-line @typescript-eslint/no-empty-function
|
|
50
|
+
this.onTouched = () => { };
|
|
51
|
+
// eslint-disable-next-line @typescript-eslint/no-empty-function
|
|
52
|
+
this.onValidatorChange = () => { };
|
|
53
|
+
this.localeProvider
|
|
54
|
+
.getLocaleInfo()
|
|
55
|
+
.pipe(takeUntil(this.ngUnsubscribe))
|
|
56
|
+
.subscribe((localeInfo) => {
|
|
57
|
+
this.locale = localeInfo.locale;
|
|
58
|
+
SkyDateFormatter.setLocale(this.locale);
|
|
59
|
+
this.preferredShortDateFormat =
|
|
60
|
+
SkyDateFormatter.getPreferredShortDateFormat();
|
|
61
|
+
});
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* Specifies the date format for the input. Place this attribute on the `input` element
|
|
65
|
+
* to override the default in `SkyDatepickerConfigService`.
|
|
66
|
+
* @default "MM/DD/YYYY"
|
|
67
|
+
*/
|
|
68
|
+
set dateFormat(value) {
|
|
69
|
+
this._dateFormat = value;
|
|
70
|
+
if (this.value) {
|
|
71
|
+
const formattedDate = this.fuzzyDateService.format(this.value, this.dateFormat, this.locale);
|
|
72
|
+
this.setInputElementValue(formattedDate);
|
|
73
|
+
this.changeDetector.markForCheck();
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
get dateFormat() {
|
|
77
|
+
return (this._dateFormat ||
|
|
78
|
+
this.configService.dateFormat ||
|
|
79
|
+
this.preferredShortDateFormat);
|
|
80
|
+
}
|
|
81
|
+
/**
|
|
82
|
+
* Indicates whether to disable the datepicker.
|
|
83
|
+
* @default false
|
|
84
|
+
*/
|
|
85
|
+
set disabled(value) {
|
|
86
|
+
this._disabled = value;
|
|
87
|
+
this.datepickerComponent.disabled = value;
|
|
88
|
+
this.renderer.setProperty(this.elementRef.nativeElement, 'disabled', value);
|
|
89
|
+
}
|
|
90
|
+
get disabled() {
|
|
91
|
+
return this._disabled;
|
|
92
|
+
}
|
|
93
|
+
/**
|
|
94
|
+
* Indicates whether to prevent users from specifying dates that are in the future.
|
|
95
|
+
* Place this attribute on the `input` element.
|
|
96
|
+
* @default false
|
|
97
|
+
*/
|
|
98
|
+
set futureDisabled(value) {
|
|
99
|
+
this._futureDisabled = value;
|
|
100
|
+
this.onValidatorChange();
|
|
101
|
+
}
|
|
102
|
+
get futureDisabled() {
|
|
103
|
+
return this._futureDisabled;
|
|
104
|
+
}
|
|
105
|
+
/**
|
|
106
|
+
* Specifies the latest fuzzy date allowed. Place this attribute on the `input` element
|
|
107
|
+
* to prevent fuzzy dates after a specified date. This property accepts
|
|
108
|
+
* a `SkyFuzzyDate` value that includes numeric month, day, and year values.
|
|
109
|
+
* For example: `{ month: 1, day: 1, year: 2027 }`.
|
|
110
|
+
*/
|
|
111
|
+
set maxDate(value) {
|
|
112
|
+
this._maxDate = value;
|
|
113
|
+
this.datepickerComponent.maxDate = this.getMaxDate();
|
|
114
|
+
this.onValidatorChange();
|
|
115
|
+
}
|
|
116
|
+
get maxDate() {
|
|
117
|
+
return this._maxDate;
|
|
118
|
+
}
|
|
119
|
+
/**
|
|
120
|
+
* Specifies the earliest fuzzy date allowed. Place this attribute on the `input` element
|
|
121
|
+
* to prevent fuzzy dates before a specified date. This property accepts a `SkyFuzzyDate` value
|
|
122
|
+
* that includes numeric month, day, and year values.
|
|
123
|
+
* For example: `{ month: 1, day: 1, year: 2007 }`.
|
|
124
|
+
*/
|
|
125
|
+
set minDate(value) {
|
|
126
|
+
this._minDate = value;
|
|
127
|
+
this.datepickerComponent.minDate = this.getMinDate();
|
|
128
|
+
this.onValidatorChange();
|
|
129
|
+
}
|
|
130
|
+
get minDate() {
|
|
131
|
+
return this._minDate;
|
|
132
|
+
}
|
|
133
|
+
/**
|
|
134
|
+
* Creates the fuzzy datepicker input and calendar to let users specify dates that are
|
|
135
|
+
* not complete. For example, if users know the year but not the month or day, they can
|
|
136
|
+
* enter just the year. Place this directive on an `input` element, and wrap the `input`
|
|
137
|
+
* in a `sky-datepicker` component. The value that users select is driven
|
|
138
|
+
* through the `ngModel` attribute specified on the `input` element.
|
|
139
|
+
* @required
|
|
140
|
+
*/
|
|
141
|
+
set skyFuzzyDatepickerInput(value) {
|
|
142
|
+
// TODO: Remove this property in a future version of SKY UX.
|
|
143
|
+
}
|
|
144
|
+
/**
|
|
145
|
+
* Specifies the starting day of the week in the calendar, where `0` sets the starting day
|
|
146
|
+
* to Sunday. Place this attribute on the `input` element to override the default
|
|
147
|
+
* in `SkyDatepickerConfigService`.
|
|
148
|
+
* @default 0
|
|
149
|
+
*/
|
|
150
|
+
set startingDay(value) {
|
|
151
|
+
this._startingDay = value;
|
|
152
|
+
this.datepickerComponent.startingDay = this.startingDay;
|
|
153
|
+
this.onValidatorChange();
|
|
154
|
+
}
|
|
155
|
+
get startingDay() {
|
|
156
|
+
return this._startingDay || this.configService.startingDay;
|
|
157
|
+
}
|
|
158
|
+
/**
|
|
159
|
+
* Indicates whether to require the year in fuzzy dates.
|
|
160
|
+
* @default false
|
|
161
|
+
*/
|
|
162
|
+
set yearRequired(value) {
|
|
163
|
+
this._yearRequired = value;
|
|
164
|
+
this.onValidatorChange();
|
|
165
|
+
}
|
|
166
|
+
get yearRequired() {
|
|
167
|
+
return this._yearRequired;
|
|
168
|
+
}
|
|
169
|
+
get value() {
|
|
170
|
+
return this._value;
|
|
171
|
+
}
|
|
172
|
+
set value(value) {
|
|
173
|
+
this.updateValue(value);
|
|
174
|
+
}
|
|
175
|
+
ngOnInit() {
|
|
176
|
+
if (this.yearRequired) {
|
|
177
|
+
if (this.dateFormat.toLowerCase().indexOf('y') === -1) {
|
|
178
|
+
throw new Error('You have configured conflicting settings. Year is required and dateFormat does not include year.');
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
if (!this.datepickerComponent) {
|
|
182
|
+
throw new Error('You must wrap the `skyFuzzyDatepickerInput` directive within a ' +
|
|
183
|
+
'`<sky-datepicker>` component!');
|
|
184
|
+
}
|
|
185
|
+
const element = this.elementRef.nativeElement;
|
|
186
|
+
this.renderer.addClass(element, 'sky-form-control');
|
|
187
|
+
const hasAriaLabel = element.getAttribute('aria-label');
|
|
188
|
+
/* istanbul ignore else */
|
|
189
|
+
if (!hasAriaLabel) {
|
|
190
|
+
this.resourcesService
|
|
191
|
+
.getString('skyux_date_field_default_label')
|
|
192
|
+
.pipe(takeUntil(this.ngUnsubscribe))
|
|
193
|
+
.subscribe((value) => {
|
|
194
|
+
this.renderer.setAttribute(element, 'aria-label', value);
|
|
195
|
+
});
|
|
196
|
+
}
|
|
197
|
+
}
|
|
198
|
+
ngAfterContentInit() {
|
|
199
|
+
this.datepickerComponent.dateChange
|
|
200
|
+
.pipe(distinctUntilChanged(), takeUntil(this.ngUnsubscribe))
|
|
201
|
+
.subscribe((value) => {
|
|
202
|
+
this.value = value;
|
|
203
|
+
this.onTouched();
|
|
204
|
+
});
|
|
205
|
+
}
|
|
206
|
+
ngAfterViewInit() {
|
|
207
|
+
// This is needed to address a bug in Angular 4.
|
|
208
|
+
// When a control value is set intially, its value is not represented on the view.
|
|
209
|
+
// See: https://github.com/angular/angular/issues/13792
|
|
210
|
+
// Of note is the parent check which allows us to determine if the form is reactive.
|
|
211
|
+
// Without this check there is a changed before checked error
|
|
212
|
+
/* istanbul ignore else */
|
|
213
|
+
if (this.control && this.control.parent) {
|
|
214
|
+
setTimeout(() => {
|
|
215
|
+
this.control.setValue(this.value, {
|
|
216
|
+
emitEvent: false,
|
|
217
|
+
});
|
|
218
|
+
this.changeDetector.markForCheck();
|
|
219
|
+
});
|
|
220
|
+
}
|
|
221
|
+
}
|
|
222
|
+
ngOnDestroy() {
|
|
223
|
+
this.ngUnsubscribe.next();
|
|
224
|
+
this.ngUnsubscribe.complete();
|
|
225
|
+
}
|
|
226
|
+
onInputChange(event) {
|
|
227
|
+
this.onValueChange(event.target.value);
|
|
228
|
+
}
|
|
229
|
+
onInputBlur() {
|
|
230
|
+
this.onTouched();
|
|
231
|
+
const formattedDate = this.fuzzyDateService.format(this.value, this.dateFormat, this.locale);
|
|
232
|
+
if (this.control.valid) {
|
|
233
|
+
this.setInputElementValue(formattedDate);
|
|
234
|
+
}
|
|
235
|
+
}
|
|
236
|
+
onInputKeyup() {
|
|
237
|
+
this.control.markAsDirty();
|
|
238
|
+
}
|
|
239
|
+
writeValue(value) {
|
|
240
|
+
this.updateValue(value, false);
|
|
241
|
+
}
|
|
242
|
+
validate(control) {
|
|
243
|
+
if (!this.control) {
|
|
244
|
+
this.control = control;
|
|
245
|
+
}
|
|
246
|
+
if (this.skyDatepickerNoValidate) {
|
|
247
|
+
return;
|
|
248
|
+
}
|
|
249
|
+
if (!this.control.value) {
|
|
250
|
+
return;
|
|
251
|
+
}
|
|
252
|
+
const value = control.value;
|
|
253
|
+
let fuzzyDate;
|
|
254
|
+
let validationError;
|
|
255
|
+
if (typeof value === 'string') {
|
|
256
|
+
fuzzyDate = this.fuzzyDateService.getFuzzyDateFromString(value, this.dateFormat);
|
|
257
|
+
}
|
|
258
|
+
else {
|
|
259
|
+
fuzzyDate = value;
|
|
260
|
+
}
|
|
261
|
+
if (!fuzzyDate) {
|
|
262
|
+
validationError = {
|
|
263
|
+
skyFuzzyDate: {
|
|
264
|
+
invalid: value,
|
|
265
|
+
},
|
|
266
|
+
};
|
|
267
|
+
}
|
|
268
|
+
if (!validationError && !fuzzyDate.year && this.yearRequired) {
|
|
269
|
+
validationError = {
|
|
270
|
+
skyFuzzyDate: {
|
|
271
|
+
yearRequired: value,
|
|
272
|
+
},
|
|
273
|
+
};
|
|
274
|
+
}
|
|
275
|
+
if (!validationError && fuzzyDate.year) {
|
|
276
|
+
let fuzzyDateRange;
|
|
277
|
+
if (this.maxDate) {
|
|
278
|
+
fuzzyDateRange = this.fuzzyDateService.getFuzzyDateRange(fuzzyDate, this.maxDate);
|
|
279
|
+
if (!fuzzyDateRange.valid) {
|
|
280
|
+
validationError = {
|
|
281
|
+
skyFuzzyDate: {
|
|
282
|
+
maxDate: value,
|
|
283
|
+
},
|
|
284
|
+
};
|
|
285
|
+
}
|
|
286
|
+
}
|
|
287
|
+
if (!validationError && this.minDate) {
|
|
288
|
+
fuzzyDateRange = this.fuzzyDateService.getFuzzyDateRange(this.minDate, fuzzyDate);
|
|
289
|
+
if (!fuzzyDateRange.valid) {
|
|
290
|
+
validationError = {
|
|
291
|
+
skyFuzzyDate: {
|
|
292
|
+
minDate: value,
|
|
293
|
+
},
|
|
294
|
+
};
|
|
295
|
+
}
|
|
296
|
+
}
|
|
297
|
+
if (!validationError && this.futureDisabled) {
|
|
298
|
+
fuzzyDateRange = this.fuzzyDateService.getFuzzyDateRange(fuzzyDate, this.fuzzyDateService.getCurrentFuzzyDate());
|
|
299
|
+
if (!fuzzyDateRange.valid) {
|
|
300
|
+
validationError = {
|
|
301
|
+
skyFuzzyDate: {
|
|
302
|
+
futureDisabled: value,
|
|
303
|
+
},
|
|
304
|
+
};
|
|
305
|
+
}
|
|
306
|
+
}
|
|
307
|
+
}
|
|
308
|
+
if (validationError) {
|
|
309
|
+
// Mark the invalid control as touched so that the input's invalid CSS styles appear.
|
|
310
|
+
// (This is only required when the invalid value is set by the FormControl constructor.)
|
|
311
|
+
this.control.markAsTouched();
|
|
312
|
+
}
|
|
313
|
+
return validationError;
|
|
314
|
+
}
|
|
315
|
+
registerOnChange(fn) {
|
|
316
|
+
this.onChange = fn;
|
|
317
|
+
}
|
|
318
|
+
registerOnTouched(fn) {
|
|
319
|
+
this.onTouched = fn;
|
|
320
|
+
}
|
|
321
|
+
registerOnValidatorChange(fn) {
|
|
322
|
+
this.onValidatorChange = fn;
|
|
323
|
+
}
|
|
324
|
+
setDisabledState(disabled) {
|
|
325
|
+
this.disabled = disabled;
|
|
326
|
+
this.datepickerComponent.disabled = disabled;
|
|
327
|
+
}
|
|
328
|
+
/**
|
|
329
|
+
* Detects changes to the underlying input element's value and updates the ngModel accordingly.
|
|
330
|
+
* This is useful if you need to update the ngModel value before the input element loses focus.
|
|
331
|
+
*/
|
|
332
|
+
detectInputValueChange() {
|
|
333
|
+
this.onValueChange(this.elementRef.nativeElement.value);
|
|
334
|
+
}
|
|
335
|
+
onValueChange(newValue) {
|
|
336
|
+
this.value = newValue;
|
|
337
|
+
}
|
|
338
|
+
setInputElementValue(value) {
|
|
339
|
+
this.renderer.setProperty(this.elementRef.nativeElement, 'value', value);
|
|
340
|
+
}
|
|
341
|
+
getMaxDate() {
|
|
342
|
+
if (this.maxDate) {
|
|
343
|
+
const maxDate = this.fuzzyDateService.getMomentFromFuzzyDate(this.maxDate);
|
|
344
|
+
if (maxDate.isValid()) {
|
|
345
|
+
return maxDate.toDate();
|
|
346
|
+
}
|
|
347
|
+
}
|
|
348
|
+
else if (this.futureDisabled) {
|
|
349
|
+
return new Date();
|
|
350
|
+
}
|
|
351
|
+
return this.configService.maxDate;
|
|
352
|
+
}
|
|
353
|
+
getMinDate() {
|
|
354
|
+
if (this.minDate) {
|
|
355
|
+
const minDate = this.fuzzyDateService.getMomentFromFuzzyDate(this.minDate);
|
|
356
|
+
if (minDate.isValid()) {
|
|
357
|
+
return minDate.toDate();
|
|
358
|
+
}
|
|
359
|
+
}
|
|
360
|
+
return this.configService.minDate;
|
|
361
|
+
}
|
|
362
|
+
/* istanbul ignore next */
|
|
363
|
+
fuzzyDatesEqual(dateA, dateB) {
|
|
364
|
+
return (dateA &&
|
|
365
|
+
dateB &&
|
|
366
|
+
((!dateA.day && !dateB.day) || dateA.day === dateB.day) &&
|
|
367
|
+
((!dateA.month && !dateB.month) || dateA.month === dateB.month) &&
|
|
368
|
+
((!dateA.year && !dateB.year) || dateA.year === dateB.year));
|
|
369
|
+
}
|
|
370
|
+
/**
|
|
371
|
+
* Update the value of the form control and input element
|
|
372
|
+
* @param emitEvent Denotes if we emit an event to the consumer's form control. We do not want to do this if the value is being updated via a `setValue` call or a `patchValue` call as this is already handled by Angular.
|
|
373
|
+
* In these cases we do not want to fire `onChange` as it will cause extra `valueChange` and `statusChange` events and the status of the form should not be affected by these changes.
|
|
374
|
+
*/
|
|
375
|
+
updateValue(value, emitEvent = true) {
|
|
376
|
+
if (this._value === value) {
|
|
377
|
+
return;
|
|
378
|
+
}
|
|
379
|
+
let fuzzyDate;
|
|
380
|
+
let fuzzyMoment;
|
|
381
|
+
let dateValue;
|
|
382
|
+
let formattedDate;
|
|
383
|
+
if (value instanceof Date) {
|
|
384
|
+
dateValue = value;
|
|
385
|
+
formattedDate = this.dateFormatter.format(value, this.dateFormat);
|
|
386
|
+
fuzzyDate = this.fuzzyDateService.getFuzzyDateFromSelectedDate(value, this.dateFormat);
|
|
387
|
+
}
|
|
388
|
+
else if (typeof value === 'string') {
|
|
389
|
+
fuzzyDate = this.fuzzyDateService.getFuzzyDateFromString(value, this.dateFormat);
|
|
390
|
+
formattedDate = this.fuzzyDateService.format(fuzzyDate, this.dateFormat, this.locale);
|
|
391
|
+
if (!formattedDate) {
|
|
392
|
+
formattedDate = value;
|
|
393
|
+
}
|
|
394
|
+
fuzzyMoment = this.fuzzyDateService.getMomentFromFuzzyDate(fuzzyDate);
|
|
395
|
+
if (fuzzyMoment) {
|
|
396
|
+
dateValue = fuzzyMoment.toDate();
|
|
397
|
+
}
|
|
398
|
+
}
|
|
399
|
+
else {
|
|
400
|
+
fuzzyDate = value;
|
|
401
|
+
formattedDate = this.fuzzyDateService.format(fuzzyDate, this.dateFormat, this.locale);
|
|
402
|
+
fuzzyMoment = this.fuzzyDateService.getMomentFromFuzzyDate(fuzzyDate);
|
|
403
|
+
if (fuzzyMoment) {
|
|
404
|
+
dateValue = fuzzyMoment.toDate();
|
|
405
|
+
}
|
|
406
|
+
}
|
|
407
|
+
const areFuzzyDatesEqual = this.fuzzyDatesEqual(this._value, fuzzyDate);
|
|
408
|
+
const isNewValue = fuzzyDate !== this._value || !areFuzzyDatesEqual;
|
|
409
|
+
this._value = fuzzyDate || value;
|
|
410
|
+
if (isNewValue) {
|
|
411
|
+
if (emitEvent) {
|
|
412
|
+
this.onChange(this._value);
|
|
413
|
+
}
|
|
414
|
+
else {
|
|
415
|
+
this.control?.setValue(this._value, { emitEvent: false });
|
|
416
|
+
}
|
|
417
|
+
this.datepickerComponent.selectedDate = dateValue;
|
|
418
|
+
}
|
|
419
|
+
this.setInputElementValue(formattedDate || '');
|
|
420
|
+
}
|
|
421
|
+
}
|
|
422
|
+
SkyFuzzyDatepickerInputDirective.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.2.7", ngImport: i0, type: SkyFuzzyDatepickerInputDirective, deps: [{ token: i0.ChangeDetectorRef }, { token: i1.SkyDatepickerConfigService }, { token: i0.ElementRef }, { token: i2.SkyFuzzyDateService }, { token: i3.SkyAppLocaleProvider }, { token: i0.Renderer2 }, { token: i3.SkyLibResourcesService }, { token: i4.SkyDatepickerComponent, optional: true }], target: i0.ɵɵFactoryTarget.Directive });
|
|
423
|
+
SkyFuzzyDatepickerInputDirective.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "12.0.0", version: "13.2.7", type: SkyFuzzyDatepickerInputDirective, selector: "[skyFuzzyDatepickerInput]", inputs: { dateFormat: "dateFormat", disabled: "disabled", futureDisabled: "futureDisabled", maxDate: "maxDate", minDate: "minDate", skyDatepickerNoValidate: "skyDatepickerNoValidate", skyFuzzyDatepickerInput: "skyFuzzyDatepickerInput", startingDay: "startingDay", yearRequired: "yearRequired" }, host: { listeners: { "change": "onInputChange($event)", "blur": "onInputBlur()", "keyup": "onInputKeyup()" } }, providers: [
|
|
424
|
+
SKY_FUZZY_DATEPICKER_VALUE_ACCESSOR,
|
|
425
|
+
SKY_FUZZY_DATEPICKER_VALIDATOR,
|
|
426
|
+
], ngImport: i0 });
|
|
427
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.2.7", ngImport: i0, type: SkyFuzzyDatepickerInputDirective, decorators: [{
|
|
428
|
+
type: Directive,
|
|
429
|
+
args: [{
|
|
430
|
+
selector: '[skyFuzzyDatepickerInput]',
|
|
431
|
+
providers: [
|
|
432
|
+
SKY_FUZZY_DATEPICKER_VALUE_ACCESSOR,
|
|
433
|
+
SKY_FUZZY_DATEPICKER_VALIDATOR,
|
|
434
|
+
],
|
|
435
|
+
}]
|
|
436
|
+
}], ctorParameters: function () { return [{ type: i0.ChangeDetectorRef }, { type: i1.SkyDatepickerConfigService }, { type: i0.ElementRef }, { type: i2.SkyFuzzyDateService }, { type: i3.SkyAppLocaleProvider }, { type: i0.Renderer2 }, { type: i3.SkyLibResourcesService }, { type: i4.SkyDatepickerComponent, decorators: [{
|
|
437
|
+
type: Optional
|
|
438
|
+
}] }]; }, propDecorators: { dateFormat: [{
|
|
439
|
+
type: Input
|
|
440
|
+
}], disabled: [{
|
|
441
|
+
type: Input
|
|
442
|
+
}], futureDisabled: [{
|
|
443
|
+
type: Input
|
|
444
|
+
}], maxDate: [{
|
|
445
|
+
type: Input
|
|
446
|
+
}], minDate: [{
|
|
447
|
+
type: Input
|
|
448
|
+
}], skyDatepickerNoValidate: [{
|
|
449
|
+
type: Input
|
|
450
|
+
}], skyFuzzyDatepickerInput: [{
|
|
451
|
+
type: Input
|
|
452
|
+
}], startingDay: [{
|
|
453
|
+
type: Input
|
|
454
|
+
}], yearRequired: [{
|
|
455
|
+
type: Input
|
|
456
|
+
}], onInputChange: [{
|
|
457
|
+
type: HostListener,
|
|
458
|
+
args: ['change', ['$event']]
|
|
459
|
+
}], onInputBlur: [{
|
|
460
|
+
type: HostListener,
|
|
461
|
+
args: ['blur']
|
|
462
|
+
}], onInputKeyup: [{
|
|
463
|
+
type: HostListener,
|
|
464
|
+
args: ['keyup']
|
|
465
|
+
}] } });
|
|
466
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0ZXBpY2tlci1pbnB1dC1mdXp6eS5kaXJlY3RpdmUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9saWJzL2NvbXBvbmVudHMvZGF0ZXRpbWUvc3JjL2xpYi9tb2R1bGVzL2RhdGVwaWNrZXIvZGF0ZXBpY2tlci1pbnB1dC1mdXp6eS5kaXJlY3RpdmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUdMLGlCQUFpQixFQUNqQixTQUFTLEVBQ1QsVUFBVSxFQUNWLFlBQVksRUFDWixLQUFLLEVBR0wsUUFBUSxFQUNSLFNBQVMsRUFDVCxVQUFVLEdBQ1gsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUdMLGFBQWEsRUFDYixpQkFBaUIsR0FHbEIsTUFBTSxnQkFBZ0IsQ0FBQztBQUN4QixPQUFPLEVBQUUsb0JBQW9CLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFFM0UsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUMvQixPQUFPLEVBQUUsb0JBQW9CLEVBQUUsU0FBUyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFFakUsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFDcEQsT0FBTyxFQUFFLDBCQUEwQixFQUFFLE1BQU0sNkJBQTZCLENBQUM7QUFDekUsT0FBTyxFQUFFLHNCQUFzQixFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFFaEUsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sc0JBQXNCLENBQUM7Ozs7OztBQUUzRCxzREFBc0Q7QUFDdEQsTUFBTSxtQ0FBbUMsR0FBRztJQUMxQyxPQUFPLEVBQUUsaUJBQWlCO0lBQzFCLFdBQVcsRUFBRSxVQUFVLENBQUMsR0FBRyxFQUFFLENBQUMsZ0NBQWdDLENBQUM7SUFDL0QsS0FBSyxFQUFFLElBQUk7Q0FDWixDQUFDO0FBRUYsTUFBTSw4QkFBOEIsR0FBRztJQUNyQyxP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YUFDM0Q7WUFFRCxJQUFJLENBQUMsbUJBQW1CLENBQUMsWUFBWSxHQUFHLFNBQVMsQ0FBQztTQUNuRDtRQUVELElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxhQUFhLElBQUksRUFBRSxDQUFDLENBQUM7SUFDakQsQ0FBQzs7NkhBMWlCVSxnQ0FBZ0M7aUhBQWhDLGdDQUFnQyw0Y0FMaEM7UUFDVCxtQ0FBbUM7UUFDbkMsOEJBQThCO0tBQy9COzJGQUVVLGdDQUFnQztrQkFQNUMsU0FBUzttQkFBQztvQkFDVCxRQUFRLEVBQUUsMkJBQTJCO29CQUNyQyxTQUFTLEVBQUU7d0JBQ1QsbUNBQW1DO3dCQUNuQyw4QkFBOEI7cUJBQy9CO2lCQUNGOzswQkF1TUksUUFBUTs0Q0F2TEEsVUFBVTtzQkFEcEIsS0FBSztnQkE0QkssUUFBUTtzQkFEbEIsS0FBSztnQkFrQkssY0FBYztzQkFEeEIsS0FBSztnQkFpQkssT0FBTztzQkFEakIsS0FBSztnQkFrQkssT0FBTztzQkFEakIsS0FBSztnQkFnQkMsdUJBQXVCO3NCQUQ3QixLQUFLO2dCQVlLLHVCQUF1QjtzQkFEakMsS0FBSztnQkFjSyxXQUFXO3NCQURyQixLQUFLO2dCQWlCSyxZQUFZO3NCQUR0QixLQUFLO2dCQW9JQyxhQUFhO3NCQURuQixZQUFZO3VCQUFDLFFBQVEsRUFBRSxDQUFDLFFBQVEsQ0FBQztnQkFNM0IsV0FBVztzQkFEakIsWUFBWTt1QkFBQyxNQUFNO2dCQWdCYixZQUFZO3NCQURsQixZQUFZO3VCQUFDLE9BQU8iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBBZnRlckNvbnRlbnRJbml0LFxuICBBZnRlclZpZXdJbml0LFxuICBDaGFuZ2VEZXRlY3RvclJlZixcbiAgRGlyZWN0aXZlLFxuICBFbGVtZW50UmVmLFxuICBIb3N0TGlzdGVuZXIsXG4gIElucHV0LFxuICBPbkRlc3Ryb3ksXG4gIE9uSW5pdCxcbiAgT3B0aW9uYWwsXG4gIFJlbmRlcmVyMixcbiAgZm9yd2FyZFJlZixcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge1xuICBBYnN0cmFjdENvbnRyb2wsXG4gIENvbnRyb2xWYWx1ZUFjY2Vzc29yLFxuICBOR19WQUxJREFUT1JTLFxuICBOR19WQUxVRV9BQ0NFU1NPUixcbiAgVmFsaWRhdGlvbkVycm9ycyxcbiAgVmFsaWRhdG9yLFxufSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQgeyBTa3lBcHBMb2NhbGVQcm92aWRlciwgU2t5TGliUmVzb3VyY2VzU2VydmljZSB9IGZyb20gJ0Bza3l1eC9pMThuJztcblxuaW1wb3J0IHsgU3ViamVjdCB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgZGlzdGluY3RVbnRpbENoYW5nZWQsIHRha2VVbnRpbCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcblxuaW1wb3J0IHsgU2t5RGF0ZUZvcm1hdHRlciB9IGZyb20gJy4vZGF0ZS1mb3JtYXR0ZXInO1xuaW1wb3J0IHsgU2t5RGF0ZXBpY2tlckNvbmZpZ1NlcnZpY2UgfSBmcm9tICcuL2RhdGVwaWNrZXItY29uZmlnLnNlcnZpY2UnO1xuaW1wb3J0IHsgU2t5RGF0ZXBpY2tlckNvbXBvbmVudCB9IGZyb20gJy4vZGF0ZXBpY2tlci5jb21wb25lbnQnO1xuaW1wb3J0IHsgU2t5RnV6enlEYXRlIH0gZnJvbSAnLi9mdXp6eS1kYXRlJztcbmltcG9ydCB7IFNreUZ1enp5RGF0ZVNlcnZpY2UgfSBmcm9tICcuL2Z1enp5LWRhdGUuc2VydmljZSc7XG5cbi8vIHRzbGludDpkaXNhYmxlOm5vLWZvcndhcmQtcmVmIG5vLXVzZS1iZWZvcmUtZGVjbGFyZVxuY29uc3QgU0tZX0ZVWlpZX0RBVEVQSUNLRVJfVkFMVUVfQUNDRVNTT1IgPSB7XG4gIHByb3ZpZGU6IE5HX1ZBTFVFX0FDQ0VTU09SLFxuICB1c2VFeGlzdGluZzogZm9yd2FyZFJlZigoKSA9PiBTa3lGdXp6eURhdGVwaWNrZXJJbnB1dERpcmVjdGl2ZSksXG4gIG11bHRpOiB0cnVlLFxufTtcblxuY29uc3QgU0tZX0ZVWlpZX0RBVEVQSUNLRVJfVkFMSURBVE9SID0ge1xuICBwcm92aWRlOiBOR19WQUxJREFUT1JTLFxuICB1c2VFeGlzdGluZzogZm9yd2FyZFJlZigoKSA9PiBTa3lGdXp6eURhdGVwaWNrZXJJbnB1dERpcmVjdGl2ZSksXG4gIG11bHRpOiB0cnVlLFxufTtcbi8vIHRzbGludDplbmFibGVcblxuQERpcmVjdGl2ZSh7XG4gIHNlbGVjdG9yOiAnW3NreUZ1enp5RGF0ZXBpY2tlcklucHV0XScsXG4gIHByb3ZpZGVyczogW1xuICAgIFNLWV9GVVpaWV9EQVRFUElDS0VSX1ZBTFVFX0FDQ0VTU09SLFxuICAgIFNLWV9GVVpaWV9EQVRFUElDS0VSX1ZBTElEQVRPUixcbiAgXSxcbn0pXG5leHBvcnQgY2xhc3MgU2t5RnV6enlEYXRlcGlja2VySW5wdXREaXJlY3RpdmVcbiAgaW1wbGVtZW50c1xuICAgIE9uSW5pdCxcbiAgICBPbkRlc3Ryb3ksXG4gICAgQWZ0ZXJWaWV3SW5pdCxcbiAgICBBZnRlckNvbnRlbnRJbml0LFxuICAgIENvbnRyb2xWYWx1ZUFjY2Vzc29yLFxuICAgIFZhbGlkYXRvclxue1xuICAvKipcbiAgICogU3BlY2lmaWVzIHRoZSBkYXRlIGZvcm1hdCBmb3IgdGhlIGlucHV0LiBQbGFjZSB0aGlzIGF0dHJpYnV0ZSBvbiB0aGUgYGlucHV0YCBlbGVtZW50XG4gICAqIHRvIG92ZXJyaWRlIHRoZSBkZWZhdWx0IGluIGBTa3lEYXRlcGlja2VyQ29uZmlnU2VydmljZWAuXG4gICAqIEBkZWZhdWx0IFwiTU0vREQvWVlZWVwiXG4gICAqL1xuICBASW5wdXQoKVxuICBwdWJsaWMgc2V0IGRhdGVGb3JtYXQodmFsdWU6IHN0cmluZykge1xuICAgIHRoaXMuX2RhdGVGb3JtYXQgPSB2YWx1ZTtcblxuICAgIGlmICh0aGlzLnZhbHVlKSB7XG4gICAgICBjb25zdCBmb3JtYXR0ZWREYXRlID0gdGhpcy5mdXp6eURhdGVTZXJ2aWNlLmZvcm1hdChcbiAgICAgICAgdGhpcy52YWx1ZSxcbiAgICAgICAgdGhpcy5kYXRlRm9ybWF0LFxuICAgICAgICB0aGlzLmxvY2FsZVxuICAgICAgKTtcbiAgICAgIHRoaXMuc2V0SW5wdXRFbGVtZW50VmFsdWUoZm9ybWF0dGVkRGF0ZSk7XG4gICAgICB0aGlzLmNoYW5nZURldGVjdG9yLm1hcmtGb3JDaGVjaygpO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBnZXQgZGF0ZUZvcm1hdCgpOiBzdHJpbmcge1xuICAgIHJldHVybiAoXG4gICAgICB0aGlzLl9kYXRlRm9ybWF0IHx8XG4gICAgICB0aGlzLmNvbmZpZ1NlcnZpY2UuZGF0ZUZvcm1hdCB8fFxuICAgICAgdGhpcy5wcmVmZXJyZWRTaG9ydERhdGVGb3JtYXRcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIEluZGljYXRlcyB3aGV0aGVyIHRvIGRpc2FibGUgdGhlIGRhdGVwaWNrZXIuXG4gICAqIEBkZWZhdWx0IGZhbHNlXG4gICAqL1xuICBASW5wdXQoKVxuICBwdWJsaWMgc2V0IGRpc2FibGVkKHZhbHVlOiBib29sZWFuKSB7XG4gICAgdGhpcy5fZGlzYWJsZWQgPSB2YWx1ZTtcbiAgICB0aGlzLmRhdGVwaWNrZXJDb21wb25lbnQuZGlzYWJsZWQgPSB2YWx1ZTtcblxuICAgIHRoaXMucmVuZGVyZXIuc2V0UHJvcGVydHkodGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQsICdkaXNhYmxlZCcsIHZhbHVlKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgZGlzYWJsZWQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX2Rpc2FibGVkO1xuICB9XG5cbiAgLyoqXG4gICAqIEluZGljYXRlcyB3aGV0aGVyIHRvIHByZXZlbnQgdXNlcnMgZnJvbSBzcGVjaWZ5aW5nIGRhdGVzIHRoYXQgYXJlIGluIHRoZSBmdXR1cmUuXG4gICAqIFBsYWNlIHRoaXMgYXR0cmlidXRlIG9uIHRoZSBgaW5wdXRgIGVsZW1lbnQuXG4gICAqIEBkZWZhdWx0IGZhbHNlXG4gICAqL1xuICBASW5wdXQoKVxuICBwdWJsaWMgc2V0IGZ1dHVyZURpc2FibGVkKHZhbHVlOiBib29sZWFuKSB7XG4gICAgdGhpcy5fZnV0dXJlRGlzYWJsZWQgPSB2YWx1ZTtcbiAgICB0aGlzLm9uVmFsaWRhdG9yQ2hhbmdlKCk7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGZ1dHVyZURpc2FibGVkKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl9mdXR1cmVEaXNhYmxlZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBTcGVjaWZpZXMgdGhlIGxhdGVzdCBmdXp6eSBkYXRlIGFsbG93ZWQuIFBsYWNlIHRoaXMgYXR0cmlidXRlIG9uIHRoZSBgaW5wdXRgIGVsZW1lbnRcbiAgICogdG8gcHJldmVudCBmdXp6eSBkYXRlcyBhZnRlciBhIHNwZWNpZmllZCBkYXRlLiBUaGlzIHByb3BlcnR5IGFjY2VwdHNcbiAgICogYSBgU2t5RnV6enlEYXRlYCB2YWx1ZSB0aGF0IGluY2x1ZGVzIG51bWVyaWMgbW9udGgsIGRheSwgYW5kIHllYXIgdmFsdWVzLlxuICAgKiBGb3IgZXhhbXBsZTogYHsgbW9udGg6IDEsIGRheTogMSwgeWVhcjogMjAyNyB9YC5cbiAgICovXG4gIEBJbnB1dCgpXG4gIHB1YmxpYyBzZXQgbWF4RGF0ZSh2YWx1ZTogU2t5RnV6enlEYXRlKSB7XG4gICAgdGhpcy5fbWF4RGF0ZSA9IHZhbHVlO1xuICAgIHRoaXMuZGF0ZXBpY2tlckNvbXBvbmVudC5tYXhEYXRlID0gdGhpcy5nZXRNYXhEYXRlKCk7XG4gICAgdGhpcy5vblZhbGlkYXRvckNoYW5nZSgpO1xuICB9XG5cbiAgcHVibGljIGdldCBtYXhEYXRlKCk6IFNreUZ1enp5RGF0ZSB7XG4gICAgcmV0dXJuIHRoaXMuX21heERhdGU7XG4gIH1cblxuICAvKipcbiAgICogU3BlY2lmaWVzIHRoZSBlYXJsaWVzdCBmdXp6eSBkYXRlIGFsbG93ZWQuIFBsYWNlIHRoaXMgYXR0cmlidXRlIG9uIHRoZSBgaW5wdXRgIGVsZW1lbnRcbiAgICogdG8gcHJldmVudCBmdXp6eSBkYXRlcyBiZWZvcmUgYSBzcGVjaWZpZWQgZGF0ZS4gVGhpcyBwcm9wZXJ0eSBhY2NlcHRzIGEgYFNreUZ1enp5RGF0ZWAgdmFsdWVcbiAgICogdGhhdCBpbmNsdWRlcyBudW1lcmljIG1vbnRoLCBkYXksIGFuZCB5ZWFyIHZhbHVlcy5cbiAgICogRm9yIGV4YW1wbGU6IGB7IG1vbnRoOiAxLCBkYXk6IDEsIHllYXI6IDIwMDcgfWAuXG4gICAqL1xuICBASW5wdXQoKVxuICBwdWJsaWMgc2V0IG1pbkRhdGUodmFsdWU6IFNreUZ1enp5RGF0ZSkge1xuICAgIHRoaXMuX21pbkRhdGUgPSB2YWx1ZTtcbiAgICB0aGlzLmRhdGVwaWNrZXJDb21wb25lbnQubWluRGF0ZSA9IHRoaXMuZ2V0TWluRGF0ZSgpO1xuICAgIHRoaXMub25WYWxpZGF0b3JDaGFuZ2UoKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgbWluRGF0ZSgpOiBTa3lGdXp6eURhdGUge1xuICAgIHJldHVybiB0aGlzLl9taW5EYXRlO1xuICB9XG5cbiAgLyoqXG4gICAqIEluZGljYXRlcyB3aGV0aGVyIHRvIGRpc2FibGUgZGF0ZSB2YWxpZGF0aW9uIG9uIHRoZSBmdXp6eSBkYXRlcGlja2VyIGlucHV0LlxuICAgKiBAZGVmYXVsdCBmYWxzZVxuICAgKi9cbiAgQElucHV0KClcbiAgcHVibGljIHNreURhdGVwaWNrZXJOb1ZhbGlkYXRlID0gZmFsc2U7XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgdGhlIGZ1enp5IGRhdGVwaWNrZXIgaW5wdXQgYW5kIGNhbGVuZGFyIHRvIGxldCB1c2VycyBzcGVjaWZ5IGRhdGVzIHRoYXQgYXJlXG4gICAqIG5vdCBjb21wbGV0ZS4gRm9yIGV4YW1wbGUsIGlmIHVzZXJzIGtub3cgdGhlIHllYXIgYnV0IG5vdCB0aGUgbW9udGggb3IgZGF5LCB0aGV5IGNhblxuICAgKiBlbnRlciBqdXN0IHRoZSB5ZWFyLiBQbGFjZSB0aGlzIGRpcmVjdGl2ZSBvbiBhbiBgaW5wdXRgIGVsZW1lbnQsIGFuZCB3cmFwIHRoZSBgaW5wdXRgXG4gICAqIGluIGEgYHNreS1kYXRlcGlja2VyYCBjb21wb25lbnQuIFRoZSB2YWx1ZSB0aGF0IHVzZXJzIHNlbGVjdCBpcyBkcml2ZW5cbiAgICogdGhyb3VnaCB0aGUgYG5nTW9kZWxgIGF0dHJpYnV0ZSBzcGVjaWZpZWQgb24gdGhlIGBpbnB1dGAgZWxlbWVudC5cbiAgICogQHJlcXVpcmVkXG4gICAqL1xuICBASW5wdXQoKVxuICBwdWJsaWMgc2V0IHNreUZ1enp5RGF0ZXBpY2tlcklucHV0KFxuICAgIHZhbHVlOiBTa3lEYXRlcGlja2VyQ29tcG9uZW50IHwgdW5kZWZpbmVkIHwgJydcbiAgKSB7XG4gICAgLy8gVE9ETzogUmVtb3ZlIHRoaXMgcHJvcGVydHkgaW4gYSBmdXR1cmUgdmVyc2lvbiBvZiBTS1kgVVguXG4gIH1cblxuICAvKipcbiAgICogU3BlY2lmaWVzIHRoZSBzdGFydGluZyBkYXkgb2YgdGhlIHdlZWsgaW4gdGhlIGNhbGVuZGFyLCB3aGVyZSBgMGAgc2V0cyB0aGUgc3RhcnRpbmcgZGF5XG4gICAqIHRvIFN1bmRheS4gUGxhY2UgdGhpcyBhdHRyaWJ1dGUgb24gdGhlIGBpbnB1dGAgZWxlbWVudCB0byBvdmVycmlkZSB0aGUgZGVmYXVsdFxuICAgKiBpbiBgU2t5RGF0ZXBpY2tlckNvbmZpZ1NlcnZpY2VgLlxuICAgKiBAZGVmYXVsdCAwXG4gICAqL1xuICBASW5wdXQoKVxuICBwdWJsaWMgc2V0IHN0YXJ0aW5nRGF5KHZhbHVlOiBudW1iZXIpIHtcbiAgICB0aGlzLl9zdGFydGluZ0RheSA9IHZhbHVlO1xuICAgIHRoaXMuZGF0ZXBpY2tlckNvbXBvbmVudC5zdGFydGluZ0RheSA9IHRoaXMuc3RhcnRpbmdEYXk7XG5cbiAgICB0aGlzLm9uVmFsaWRhdG9yQ2hhbmdlKCk7XG4gIH1cblxuICBwdWJsaWMgZ2V0IHN0YXJ0aW5nRGF5KCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuX3N0YXJ0aW5nRGF5IHx8IHRoaXMuY29uZmlnU2VydmljZS5zdGFydGluZ0RheTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJbmRpY2F0ZXMgd2hldGhlciB0byByZXF1aXJlIHRoZSB5ZWFyIGluIGZ1enp5IGRhdGVzLlxuICAgKiBAZGVmYXVsdCBmYWxzZVxuICAgKi9cbiAgQElucHV0KClcbiAgcHVibGljIHNldCB5ZWFyUmVxdWlyZWQodmFsdWU6IGJvb2xlYW4pIHtcbiAgICB0aGlzLl95ZWFyUmVxdWlyZWQgPSB2YWx1ZTtcbiAgICB0aGlzLm9uVmFsaWRhdG9yQ2hhbmdlKCk7XG4gIH1cblxuICBwdWJsaWMgZ2V0IHllYXJSZXF1aXJlZCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5feWVhclJlcXVpcmVkO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXQgdmFsdWUoKTogYW55IHtcbiAgICByZXR1cm4gdGhpcy5fdmFsdWU7XG4gIH1cblxuICBwcml2YXRlIHNldCB2YWx1ZSh2YWx1ZTogYW55KSB7XG4gICAgdGhpcy51cGRhdGVWYWx1ZSh2YWx1ZSk7XG4gIH1cblxuICBwcml2YXRlIGNvbnRyb2w6IEFic3RyYWN0Q29udHJvbDtcblxuICBwcml2YXRlIGRhdGVGb3JtYXR0ZXIgPSBuZXcgU2t5RGF0ZUZvcm1hdHRlcigpO1xuXG4gIHByaXZhdGUgbG9jYWxlOiBzdHJpbmc7XG5cbiAgcHJpdmF0ZSBwcmVmZXJyZWRTaG9ydERhdGVGb3JtYXQ6IHN0cmluZztcblxuICBwcml2YXRlIG5nVW5zdWJzY3JpYmUgPSBuZXcgU3ViamVjdDx2b2lkPigpO1xuXG4gIHByaXZhdGUgX2Z1dHVyZURpc2FibGVkID0gZmFsc2U7XG5cbiAgcHJpdmF0ZSBfZGF0ZUZvcm1hdDogc3RyaW5nO1xuXG4gIHByaXZhdGUgX2Rpc2FibGVkID0gZmFsc2U7XG5cbiAgcHJpdmF0ZSBfbWF4RGF0ZTogU2t5RnV6enlEYXRlO1xuXG4gIHByaXZhdGUgX21pbkRhdGU6IFNreUZ1enp5RGF0ZTtcblxuICBwcml2YXRlIF9zdGFydGluZ0RheTogbnVtYmVyO1xuXG4gIHByaXZhdGUgX3ZhbHVlOiBhbnk7XG5cbiAgcHJpdmF0ZSBfeWVhclJlcXVpcmVkID0gZmFsc2U7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBjaGFuZ2VEZXRlY3RvcjogQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gICAgcHJpdmF0ZSBjb25maWdTZXJ2aWNlOiBTa3lEYXRlcGlja2VyQ29uZmlnU2VydmljZSxcbiAgICBwcml2YXRlIGVsZW1lbnRSZWY6IEVsZW1lbnRSZWYsXG4gICAgcHJpdmF0ZSBmdXp6eURhdGVTZXJ2aWNlOiBTa3lGdXp6eURhdGVTZXJ2aWNlLFxuICAgIHByaXZhdGUgbG9jYWxlUHJvdmlkZXI6IFNreUFwcExvY2FsZVByb3ZpZGVyLFxuICAgIHByaXZhdGUgcmVuZGVyZXI6IFJlbmRlcmVyMixcbiAgICBwcml2YXRlIHJlc291cmNlc1NlcnZpY2U6IFNreUxpYlJlc291cmNlc1NlcnZpY2UsXG4gICAgQE9wdGlvbmFsKCkgcHJpdmF0ZSBkYXRlcGlja2VyQ29tcG9uZW50OiBTa3lEYXRlcGlja2VyQ29tcG9uZW50XG4gICkge1xuICAgIHRoaXMubG9jYWxlUHJvdmlkZXJcbiAgICAgIC5nZXRMb2NhbGVJbmZvKClcbiAgICAgIC5waXBlKHRha2VVbnRpbCh0aGlzLm5nVW5zdWJzY3JpYmUpKVxuICAgICAgLnN1YnNjcmliZSgobG9jYWxlSW5mbykgPT4ge1xuICAgICAgICB0aGlzLmxvY2FsZSA9IGxvY2FsZUluZm8ubG9jYWxlO1xuICAgICAgICBTa3lEYXRlRm9ybWF0dGVyLnNldExvY2FsZSh0aGlzLmxvY2FsZSk7XG4gICAgICAgIHRoaXMucHJlZmVycmVkU2hvcnREYXRlRm9ybWF0ID1cbiAgICAgICAgICBTa3lEYXRlRm9ybWF0dGVyLmdldFByZWZlcnJlZFNob3J0RGF0ZUZvcm1hdCgpO1xuICAgICAgfSk7XG4gIH1cblxuICBwdWJsaWMgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMueWVhclJlcXVpcmVkKSB7XG4gICAgICBpZiAodGhpcy5kYXRlRm9ybWF0LnRvTG93ZXJDYXNlKCkuaW5kZXhPZigneScpID09PSAtMSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgJ1lvdSBoYXZlIGNvbmZpZ3VyZWQgY29uZmxpY3Rpbmcgc2V0dGluZ3MuIFllYXIgaXMgcmVxdWlyZWQgYW5kIGRhdGVGb3JtYXQgZG9lcyBub3QgaW5jbHVkZSB5ZWFyLidcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoIXRoaXMuZGF0ZXBpY2tlckNvbXBvbmVudCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAnWW91IG11c3Qgd3JhcCB0aGUgYHNreUZ1enp5RGF0ZXBpY2tlcklucHV0YCBkaXJlY3RpdmUgd2l0aGluIGEgJyArXG4gICAgICAgICAgJ2A8c2t5LWRhdGVwaWNrZXI+YCBjb21wb25lbnQhJ1xuICAgICAgKTtcbiAgICB9XG5cbiAgICBjb25zdCBlbGVtZW50ID0gdGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQ7XG5cbiAgICB0aGlzLnJlbmRlcmVyLmFkZENsYXNzKGVsZW1lbnQsICdza3ktZm9ybS1jb250cm9sJyk7XG5cbiAgICBjb25zdCBoYXNBcmlhTGFiZWwgPSBlbGVtZW50LmdldEF0dHJpYnV0ZSgnYXJpYS1sYWJlbCcpO1xuXG4gICAgLyogaXN0YW5idWwgaWdub3JlIGVsc2UgKi9cbiAgICBpZiAoIWhhc0FyaWFMYWJlbCkge1xuICAgICAgdGhpcy5yZXNvdXJjZXNTZXJ2aWNlXG4gICAgICAgIC5nZXRTdHJpbmcoJ3NreXV4X2RhdGVfZmllbGRfZGVmYXVsdF9sYWJlbCcpXG4gICAgICAgIC5waXBlKHRha2VVbnRpbCh0aGlzLm5nVW5zdWJzY3JpYmUpKVxuICAgICAgICAuc3Vic2NyaWJlKCh2YWx1ZTogc3RyaW5nKSA9PiB7XG4gICAgICAgICAgdGhpcy5yZW5kZXJlci5zZXRBdHRyaWJ1dGUoZWxlbWVudCwgJ2FyaWEtbGFiZWwnLCB2YWx1ZSk7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBuZ0FmdGVyQ29udGVudEluaXQoKTogdm9pZCB7XG4gICAgdGhpcy5kYXRlcGlja2VyQ29tcG9uZW50LmRhdGVDaGFuZ2VcbiAgICAgIC5waXBlKGRpc3RpbmN0VW50aWxDaGFuZ2VkKCksIHRha2VVbnRpbCh0aGlzLm5nVW5zdWJzY3JpYmUpKVxuICAgICAgLnN1YnNjcmliZSgodmFsdWU6IERhdGUpID0+IHtcbiAgICAgICAgdGhpcy52YWx1ZSA9IHZhbHVlO1xuICAgICAgICB0aGlzLm9uVG91Y2hlZCgpO1xuICAgICAgfSk7XG4gIH1cblxuICBwdWJsaWMgbmdBZnRlclZpZXdJbml0KCk6IHZvaWQge1xuICAgIC8vIFRoaXMgaXMgbmVlZGVkIHRvIGFkZHJlc3MgYSBidWcgaW4gQW5ndWxhciA0LlxuICAgIC8vIFdoZW4gYSBjb250cm9sIHZhbHVlIGlzIHNldCBpbnRpYWxseSwgaXRzIHZhbHVlIGlzIG5vdCByZXByZXNlbnRlZCBvbiB0aGUgdmlldy5cbiAgICAvLyBTZWU6IGh0dHBzOi8vZ2l0aHViLmNvbS9hbmd1bGFyL2FuZ3VsYXIvaXNzdWVzLzEzNzkyXG4gICAgLy8gT2Ygbm90ZSBpcyB0aGUgcGFyZW50IGNoZWNrIHdoaWNoIGFsbG93cyB1cyB0byBkZXRlcm1pbmUgaWYgdGhlIGZvcm0gaXMgcmVhY3RpdmUuXG4gICAgLy8gV2l0aG91dCB0aGlzIGNoZWNrIHRoZXJlIGlzIGEgY2hhbmdlZCBiZWZvcmUgY2hlY2tlZCBlcnJvclxuICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBlbHNlICovXG5cbiAgICBpZiAodGhpcy5jb250cm9sICYmIHRoaXMuY29udHJvbC5wYXJlbnQpIHtcbiAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICB0aGlzLmNvbnRyb2wuc2V0VmFsdWUodGhpcy52YWx1ZSwge1xuICAgICAgICAgIGVtaXRFdmVudDogZmFsc2UsXG4gICAgICAgIH0pO1xuXG4gICAgICAgIHRoaXMuY2hhbmdlRGV0ZWN0b3IubWFya0ZvckNoZWNrKCk7XG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgdGhpcy5uZ1Vuc3Vic2NyaWJlLm5leHQoKTtcbiAgICB0aGlzLm5nVW5zdWJzY3JpYmUuY29tcGxldGUoKTtcbiAgfVxuXG4gIEBIb3N0TGlzdGVuZXIoJ2NoYW5nZScsIFsnJGV2ZW50J10pXG4gIHB1YmxpYyBvbklucHV0Q2hhbmdlKGV2ZW50OiBhbnkpIHtcbiAgICB0aGlzLm9uVmFsdWVDaGFuZ2UoZXZlbnQudGFyZ2V0LnZhbHVlKTtcbiAgfVxuXG4gIEBIb3N0TGlzdGVuZXIoJ2JsdXInKVxuICBwdWJsaWMgb25JbnB1dEJsdXIoKTogdm9pZCB7XG4gICAgdGhpcy5vblRvdWNoZWQoKTtcblxuICAgIGNvbnN0IGZvcm1hdHRlZERhdGUgPSB0aGlzLmZ1enp5RGF0ZVNlcnZpY2UuZm9ybWF0KFxuICAgICAgdGhpcy52YWx1ZSxcbiAgICAgIHRoaXMuZGF0ZUZvcm1hdCxcbiAgICAgIHRoaXMubG9jYWxlXG4gICAgKTtcblxuICAgIGlmICh0aGlzLmNvbnRyb2wudmFsaWQpIHtcbiAgICAgIHRoaXMuc2V0SW5wdXRFbGVtZW50VmFsdWUoZm9ybWF0dGVkRGF0ZSk7XG4gICAgfVxuICB9XG5cbiAgQEhvc3RMaXN0ZW5lcigna2V5dXAnKVxuICBwdWJsaWMgb25JbnB1dEtleXVwKCk6IHZvaWQge1xuICAgIHRoaXMuY29udHJvbC5tYXJrQXNEaXJ0eSgpO1xuICB9XG5cbiAgcHVibGljIHdyaXRlVmFsdWUodmFsdWU6IGFueSk6IHZvaWQge1xuICAgIHRoaXMudXBkYXRlVmFsdWUodmFsdWUsIGZhbHNlKTtcbiAgfVxuXG4gIHB1YmxpYyB2YWxpZGF0ZShjb250cm9sOiBBYnN0cmFjdENvbnRyb2wpOiBWYWxpZGF0aW9uRXJyb3JzIHtcbiAgICBpZiAoIXRoaXMuY29udHJvbCkge1xuICAgICAgdGhpcy5jb250cm9sID0gY29udHJvbDtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5za3lEYXRlcGlja2VyTm9WYWxpZGF0ZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmICghdGhpcy5jb250cm9sLnZhbHVlKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgdmFsdWU6IGFueSA9IGNvbnRyb2wudmFsdWU7XG5cbiAgICBsZXQgZnV6enlEYXRlOiBTa3lGdXp6eURhdGU7XG4gICAgbGV0IHZhbGlkYXRpb25FcnJvcjogVmFsaWRhdGlvbkVycm9ycztcblxuICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnKSB7XG4gICAgICBmdXp6eURhdGUgPSB0aGlzLmZ1enp5RGF0ZVNlcnZpY2UuZ2V0RnV6enlEYXRlRnJvbVN0cmluZyhcbiAgICAgICAgdmFsdWUsXG4gICAgICAgIHRoaXMuZGF0ZUZvcm1hdFxuICAgICAgKTtcbiAgICB9IGVsc2Uge1xuICAgICAgZnV6enlEYXRlID0gdmFsdWU7XG4gICAgfVxuXG4gICAgaWYgKCFmdXp6eURhdGUpIHtcbiAgICAgIHZhbGlkYXRpb25FcnJvciA9IHtcbiAgICAgICAgc2t5RnV6enlEYXRlOiB7XG4gICAgICAgICAgaW52YWxpZDogdmFsdWUsXG4gICAgICAgIH0sXG4gICAgICB9O1xuICAgIH1cblxuICAgIGlmICghdmFsaWRhdGlvbkVycm9yICYmICFmdXp6eURhdGUueWVhciAmJiB0aGlzLnllYXJSZXF1aXJlZCkge1xuICAgICAgdmFsaWRhdGlvbkVycm9yID0ge1xuICAgICAgICBza3lGdXp6eURhdGU6IHtcbiAgICAgICAgICB5ZWFyUmVxdWlyZWQ6IHZhbHVlLFxuICAgICAgICB9LFxuICAgICAgfTtcbiAgICB9XG5cbiAgICBpZiAoIXZhbGlkYXRpb25FcnJvciAmJiBmdXp6eURhdGUueWVhcikge1xuICAgICAgbGV0IGZ1enp5RGF0ZVJhbmdlO1xuXG4gICAgICBpZiAodGhpcy5tYXhEYXRlKSB7XG4gICAgICAgIGZ1enp5RGF0ZVJhbmdlID0gdGhpcy5mdXp6eURhdGVTZXJ2aWNlLmdldEZ1enp5RGF0ZVJhbmdlKFxuICAgICAgICAgIGZ1enp5RGF0ZSxcbiAgICAgICAgICB0aGlzLm1heERhdGVcbiAgICAgICAgKTtcblxuICAgICAgICBpZiAoIWZ1enp5RGF0ZVJhbmdlLnZhbGlkKSB7XG4gICAgICAgICAgdmFsaWRhdGlvbkVycm9yID0ge1xuICAgICAgICAgICAgc2t5RnV6enlEYXRlOiB7XG4gICAgICAgICAgICAgIG1heERhdGU6IHZhbHVlLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmICghdmFsaWRhdGlvbkVycm9yICYmIHRoaXMubWluRGF0ZSkge1xuICAgICAgICBmdXp6eURhdGVSYW5nZSA9IHRoaXMuZnV6enlEYXRlU2VydmljZS5nZXRGdXp6eURhdGVSYW5nZShcbiAgICAgICAgICB0aGlzLm1pbkRhdGUsXG4gICAgICAgICAgZnV6enlEYXRlXG4gICAgICAgICk7XG4gICAgICAgIGlmICghZnV6enlEYXRlUmFuZ2UudmFsaWQpIHtcbiAgICAgICAgICB2YWxpZGF0aW9uRXJyb3IgPSB7XG4gICAgICAgICAgICBza3lGdXp6eURhdGU6IHtcbiAgICAgICAgICAgICAgbWluRGF0ZTogdmFsdWUsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKCF2YWxpZGF0aW9uRXJyb3IgJiYgdGhpcy5mdXR1cmVEaXNhYmxlZCkge1xuICAgICAgICBmdXp6eURhdGVSYW5nZSA9IHRoaXMuZnV6enlEYXRlU2VydmljZS5nZXRGdXp6eURhdGVSYW5nZShcbiAgICAgICAgICBmdXp6eURhdGUsXG4gICAgICAgICAgdGhpcy5mdXp6eURhdGVTZXJ2aWNlLmdldEN1cnJlbnRGdXp6eURhdGUoKVxuICAgICAgICApO1xuICAgICAgICBpZiAoIWZ1enp5RGF0ZVJhbmdlLnZhbGlkKSB7XG4gICAgICAgICAgdmFsaWRhdGlvbkVycm9yID0ge1xuICAgICAgICAgICAgc2t5RnV6enlEYXRlOiB7XG4gICAgICAgICAgICAgIGZ1dHVyZURpc2FibGVkOiB2YWx1ZSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGlmICh2YWxpZGF0aW9uRXJyb3IpIHtcbiAgICAgIC8vIE1hcmsgdGhlIGludmFsaWQgY29udHJvbCBhcyB0b3VjaGVkIHNvIHRoYXQgdGhlIGlucHV0J3MgaW52YWxpZCBDU1Mgc3R5bGVzIGFwcGVhci5cbiAgICAgIC8vIChUaGlzIGlzIG9ubHkgcmVxdWlyZWQgd2hlbiB0aGUgaW52YWxpZCB2YWx1ZSBpcyBzZXQgYnkgdGhlIEZvcm1Db250cm9sIGNvbnN0cnVjdG9yLilcbiAgICAgIHRoaXMuY29udHJvbC5tYXJrQXNUb3VjaGVkKCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHZhbGlkYXRpb25FcnJvcjtcbiAgfVxuXG4gIHB1YmxpYyByZWdpc3Rlck9uQ2hhbmdlKGZuOiAodmFsdWU6IGFueSkgPT4gdm9pZCk6IHZvaWQge1xuICAgIHRoaXMub25DaGFuZ2UgPSBmbjtcbiAgfVxuXG4gIHB1YmxpYyByZWdpc3Rlck9uVG91Y2hlZChmbjogKCkgPT4gdm9pZCk6IHZvaWQge1xuICAgIHRoaXMub25Ub3VjaGVkID0gZm47XG4gIH1cblxuICBwdWJsaWMgcmVnaXN0ZXJPblZhbGlkYXRvckNoYW5nZShmbjogKCkgPT4gdm9pZCk6IHZvaWQge1xuICAgIHRoaXMub25WYWxpZGF0b3JDaGFuZ2UgPSBmbjtcbiAgfVxuXG4gIHB1YmxpYyBzZXREaXNhYmxlZFN0YXRlKGRpc2FibGVkOiBib29sZWFuKTogdm9pZCB7XG4gICAgdGhpcy5kaXNhYmxlZCA9IGRpc2FibGVkO1xuICAgIHRoaXMuZGF0ZXBpY2tlckNvbXBvbmVudC5kaXNhYmxlZCA9IGRpc2FibGVkO1xuICB9XG5cbiAgLyoqXG4gICAqIERldGVjdHMgY2hhbmdlcyB0byB0aGUgdW5kZXJseWluZyBpbnB1dCBlbGVtZW50J3MgdmFsdWUgYW5kIHVwZGF0ZXMgdGhlIG5nTW9kZWwgYWNjb3JkaW5nbHkuXG4gICAqIFRoaXMgaXMgdXNlZnVsIGlmIHlvdSBuZWVkIHRvIHVwZGF0ZSB0aGUgbmdNb2RlbCB2YWx1ZSBiZWZvcmUgdGhlIGlucHV0IGVsZW1lbnQgbG9zZXMgZm9jdXMuXG4gICAqL1xuICBwdWJsaWMgZGV0ZWN0SW5wdXRWYWx1ZUNoYW5nZSgpOiB2b2lkIHtcbiAgICB0aGlzLm9uVmFsdWVDaGFuZ2UodGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQudmFsdWUpO1xuICB9XG5cbiAgcHJpdmF0ZSBvblZhbHVlQ2hhbmdlKG5ld1ZhbHVlOiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLnZhbHVlID0gbmV3VmFsdWU7XG4gIH1cblxuICBwcml2YXRlIHNldElucHV0RWxlbWVudFZhbHVlKHZhbHVlOiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLnJlbmRlcmVyLnNldFByb3BlcnR5KHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LCAndmFsdWUnLCB2YWx1ZSk7XG4gIH1cblxuICBwcml2YXRlIGdldE1heERhdGUoKTogRGF0ZSB7XG4gICAgaWYgKHRoaXMubWF4RGF0ZSkge1xuICAgICAgY29uc3QgbWF4RGF0ZSA9IHRoaXMuZnV6enlEYXRlU2VydmljZS5nZXRNb21lbnRGcm9tRnV6enlEYXRlKFxuICAgICAgICB0aGlzLm1heERhdGVcbiAgICAgICk7XG4gICAgICBpZiAobWF4RGF0ZS5pc1ZhbGlkKCkpIHtcbiAgICAgICAgcmV0dXJuIG1heERhdGUudG9EYXRlKCk7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmICh0aGlzLmZ1dHVyZURpc2FibGVkKSB7XG4gICAgICByZXR1cm4gbmV3IERhdGUoKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuY29uZmlnU2VydmljZS5tYXhEYXRlO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRNaW5EYXRlKCk6IERhdGUge1xuICAgIGlmICh0aGlzLm1pbkRhdGUpIHtcbiAgICAgIGNvbnN0IG1pbkRhdGUgPSB0aGlzLmZ1enp5RGF0ZVNlcnZpY2UuZ2V0TW9tZW50RnJvbUZ1enp5RGF0ZShcbiAgICAgICAgdGhpcy5taW5EYXRlXG4gICAgICApO1xuICAgICAgaWYgKG1pbkRhdGUuaXNWYWxpZCgpKSB7XG4gICAgICAgIHJldHVybiBtaW5EYXRlLnRvRGF0ZSgpO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdGhpcy5jb25maWdTZXJ2aWNlLm1pbkRhdGU7XG4gIH1cblxuICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuICBwcml2YXRlIGZ1enp5RGF0ZXNFcXVhbChkYXRlQTogU2t5RnV6enlEYXRlLCBkYXRlQjogU2t5RnV6enlEYXRlKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIChcbiAgICAgIGRhdGVBICYmXG4gICAgICBkYXRlQiAmJlxuICAgICAgKCghZGF0ZUEuZGF5ICYmICFkYXRlQi5kYXkpIHx8IGRhdGVBLmRheSA9PT0gZGF0ZUIuZGF5KSAmJlxuICAgICAgKCghZGF0ZUEubW9udGggJiYgIWRhdGVCLm1vbnRoKSB8fCBkYXRlQS5tb250aCA9PT0gZGF0ZUIubW9udGgpICYmXG4gICAgICAoKCFkYXRlQS55ZWFyICYmICFkYXRlQi55ZWFyKSB8fCBkYXRlQS55ZWFyID09PSBkYXRlQi55ZWFyKVxuICAgICk7XG4gIH1cblxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWVtcHR5LWZ1bmN0aW9uXG4gIHByaXZhdGUgb25DaGFuZ2UgPSAoXzogYW55KSA9PiB7fTtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1lbXB0eS1mdW5jdGlvblxuICBwcml2YXRlIG9uVG91Y2hlZCA9ICgpID0+IHt9O1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWVtcHR5LWZ1bmN0aW9uXG4gIHByaXZhdGUgb25WYWxpZGF0b3JDaGFuZ2UgPSAoKSA9PiB7fTtcblxuICAvKipcbiAgICogVXBkYXRlIHRoZSB2YWx1ZSBvZiB0aGUgZm9ybSBjb250cm9sIGFuZCBpbnB1dCBlbGVtZW50XG4gICAqIEBwYXJhbSBlbWl0RXZlbnQgRGVub3RlcyBpZiB3ZSBlbWl0IGFuIGV2ZW50IHRvIHRoZSBjb25zdW1lcidzIGZvcm0gY29udHJvbC4gV2UgZG8gbm90IHdhbnQgdG8gZG8gdGhpcyBpZiB0aGUgdmFsdWUgaXMgYmVpbmcgdXBkYXRlZCB2aWEgYSBgc2V0VmFsdWVgIGNhbGwgb3IgYSBgcGF0Y2hWYWx1ZWAgY2FsbCBhcyB0aGlzIGlzIGFscmVhZHkgaGFuZGxlZCBieSBBbmd1bGFyLlxuICAgKiBJbiB0aGVzZSBjYXNlcyB3ZSBkbyBub3Qgd2FudCB0byBmaXJlIGBvbkNoYW5nZWAgYXMgaXQgd2lsbCBjYXVzZSBleHRyYSBgdmFsdWVDaGFuZ2VgIGFuZCBgc3RhdHVzQ2hhbmdlYCBldmVudHMgYW5kIHRoZSBzdGF0dXMgb2YgdGhlIGZvcm0gc2hvdWxkIG5vdCBiZSBhZmZlY3RlZCBieSB0aGVzZSBjaGFuZ2VzLlxuICAgKi9cbiAgcHJpdmF0ZSB1cGRhdGVWYWx1ZSh2YWx1ZTogYW55LCBlbWl0RXZlbnQgPSB0cnVlKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuX3ZhbHVlID09PSB2YWx1ZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGxldCBmdXp6eURhdGU6IFNreUZ1enp5RGF0ZTtcbiAgICBsZXQgZnV6enlNb21lbnQ6IGFueTtcbiAgICBsZXQgZGF0ZVZhbHVlOiBEYXRlO1xuICAgIGxldCBmb3JtYXR0ZWREYXRlOiBzdHJpbmc7XG5cbiAgICBpZiAodmFsdWUgaW5zdGFuY2VvZiBEYXRlKSB7XG4gICAgICBkYXRlVmFsdWUgPSB2YWx1ZTtcbiAgICAgIGZvcm1hdHRlZERhdGUgPSB0aGlzLmRhdGVGb3JtYXR0ZXIuZm9ybWF0KHZhbHVlLCB0aGlzLmRhdGVGb3JtYXQpO1xuICAgICAgZnV6enlEYXRlID0gdGhpcy5mdXp6eURhdGVTZXJ2aWNlLmdldEZ1enp5RGF0ZUZyb21TZWxlY3RlZERhdGUoXG4gICAgICAgIHZhbHVlLFxuICAgICAgICB0aGlzLmRhdGVGb3JtYXRcbiAgICAgICk7XG4gICAgfSBlbHNlIGlmICh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnKSB7XG4gICAgICBmdXp6eURhdGUgPSB0aGlzLmZ1enp5RGF0ZVNlcnZpY2UuZ2V0RnV6enlEYXRlRnJvbVN0cmluZyhcbiAgICAgICAgdmFsdWUsXG4gICAgICAgIHRoaXMuZGF0ZUZvcm1hdFxuICAgICAgKTtcbiAgICAgIGZvcm1hdHRlZERhdGUgPSB0aGlzLmZ1enp5RGF0ZVNlcnZpY2UuZm9ybWF0KFxuICAgICAgICBmdXp6eURhdGUsXG4gICAgICAgIHRoaXMuZGF0ZUZvcm1hdCxcbiAgICAgICAgdGhpcy5sb2NhbGVcbiAgICAgICk7XG5cbiAgICAgIGlmICghZm9ybWF0dGVkRGF0ZSkge1xuICAgICAgICBmb3JtYXR0ZWREYXRlID0gdmFsdWU7XG4gICAgICB9XG5cbiAgICAgIGZ1enp5TW9tZW50ID0gdGhpcy5mdXp6eURhdGVTZXJ2aWNlLmdldE1vbWVudEZyb21GdXp6eURhdGUoZnV6enlEYXRlKTtcblxuICAgICAgaWYgKGZ1enp5TW9tZW50KSB7XG4gICAgICAgIGRhdGVWYWx1ZSA9IGZ1enp5TW9tZW50LnRvRGF0ZSgpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBmdXp6eURhdGUgPSB2YWx1ZSBhcyBTa3lGdXp6eURhdGU7XG4gICAgICBmb3JtYXR0ZWREYXRlID0gdGhpcy5mdXp6eURhdGVTZXJ2aWNlLmZvcm1hdChcbiAgICAgICAgZnV6enlEYXRlLFxuICAgICAgICB0aGlzLmRhdGVGb3JtYXQsXG4gICAgICAgIHRoaXMubG9jYWxlXG4gICAgICApO1xuICAgICAgZnV6enlNb21lbnQgPSB0aGlzLmZ1enp5RGF0ZVNlcnZpY2UuZ2V0TW9tZW50RnJvbUZ1enp5RGF0ZShmdXp6eURhdGUpO1xuXG4gICAgICBpZiAoZnV6enlNb21lbnQpIHtcbiAgICAgICAgZGF0ZVZhbHVlID0gZnV6enlNb21lbnQudG9EYXRlKCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgYXJlRnV6enlEYXRlc0VxdWFsID0gdGhpcy5mdXp6eURhdGVzRXF1YWwodGhpcy5fdmFsdWUsIGZ1enp5RGF0ZSk7XG4gICAgY29uc3QgaXNOZXdWYWx1ZSA9IGZ1enp5RGF0ZSAhPT0gdGhpcy5fdmFsdWUgfHwgIWFyZUZ1enp5RGF0ZXNFcXVhbDtcblxuICAgIHRoaXMuX3ZhbHVlID0gZnV6enlEYXRlIHx8IHZhbHVlO1xuXG4gICAgaWYgKGlzTmV3VmFsdWUpIHtcbiAgICAgIGlmIChlbWl0RXZlbnQpIHtcbiAgICAgICAgdGhpcy5vbkNoYW5nZSh0aGlzLl92YWx1ZSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLmNvbnRyb2w/LnNldFZhbHVlKHRoaXMuX3ZhbHVlLCB7IGVtaXRFdmVudDogZmFsc2UgfSk7XG4gICAgICB9XG5cbiAgICAgIHRoaXMuZGF0ZXBpY2tlckNvbXBvbmVudC5zZWxlY3RlZERhdGUgPSBkYXRlVmFsdWU7XG4gICAgfVxuXG4gICAgdGhpcy5zZXRJbnB1dEVsZW1lbnRWYWx1ZShmb3JtYXR0ZWREYXRlIHx8ICcnKTtcbiAgfVxufVxuIl19
|