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