@netwin/angular-datetime-picker 1.0.0-rc.3

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.
Files changed (79) hide show
  1. package/README.md +225 -0
  2. package/assets/style/picker.min.css +1 -0
  3. package/esm2022/lib/date-time/adapter/date-time-adapter.class.mjs +120 -0
  4. package/esm2022/lib/date-time/adapter/date-time-format.class.mjs +7 -0
  5. package/esm2022/lib/date-time/adapter/native-date-time-adapter.class.mjs +253 -0
  6. package/esm2022/lib/date-time/adapter/native-date-time-format.class.mjs +16 -0
  7. package/esm2022/lib/date-time/adapter/native-date-time.module.mjs +45 -0
  8. package/esm2022/lib/date-time/adapter/unix-timestamp-adapter/unix-timestamp-date-time-adapter.class.mjs +228 -0
  9. package/esm2022/lib/date-time/adapter/unix-timestamp-adapter/unix-timestamp-date-time-format.class.mjs +16 -0
  10. package/esm2022/lib/date-time/calendar-body.component.mjs +146 -0
  11. package/esm2022/lib/date-time/calendar-month-view.component.mjs +436 -0
  12. package/esm2022/lib/date-time/calendar-multi-year-view.component.mjs +366 -0
  13. package/esm2022/lib/date-time/calendar-year-view.component.mjs +362 -0
  14. package/esm2022/lib/date-time/calendar.component.mjs +368 -0
  15. package/esm2022/lib/date-time/date-time-inline.component.mjs +293 -0
  16. package/esm2022/lib/date-time/date-time-picker-container.component.mjs +405 -0
  17. package/esm2022/lib/date-time/date-time-picker-input.directive.mjs +598 -0
  18. package/esm2022/lib/date-time/date-time-picker-intl.service.mjs +62 -0
  19. package/esm2022/lib/date-time/date-time-picker-trigger.directive.mjs +64 -0
  20. package/esm2022/lib/date-time/date-time-picker.animations.mjs +21 -0
  21. package/esm2022/lib/date-time/date-time-picker.component.mjs +564 -0
  22. package/esm2022/lib/date-time/date-time.class.mjs +176 -0
  23. package/esm2022/lib/date-time/date-time.module.mjs +83 -0
  24. package/esm2022/lib/date-time/numberedFixLen.pipe.mjs +28 -0
  25. package/esm2022/lib/date-time/options-provider.mjs +34 -0
  26. package/esm2022/lib/date-time/timer-box.component.mjs +140 -0
  27. package/esm2022/lib/date-time/timer.component.mjs +279 -0
  28. package/esm2022/lib/dialog/dialog-config.class.mjs +59 -0
  29. package/esm2022/lib/dialog/dialog-container.component.mjs +232 -0
  30. package/esm2022/lib/dialog/dialog-ref.class.mjs +134 -0
  31. package/esm2022/lib/dialog/dialog.module.mjs +26 -0
  32. package/esm2022/lib/dialog/dialog.service.mjs +228 -0
  33. package/esm2022/lib/utils/array.utils.mjs +12 -0
  34. package/esm2022/lib/utils/constants.mjs +34 -0
  35. package/esm2022/lib/utils/date.utils.mjs +49 -0
  36. package/esm2022/lib/utils/index.mjs +5 -0
  37. package/esm2022/lib/utils/object.utils.mjs +26 -0
  38. package/esm2022/netwin-angular-datetime-picker.mjs +5 -0
  39. package/esm2022/public_api.mjs +25 -0
  40. package/fesm2022/netwin-angular-datetime-picker.mjs +5751 -0
  41. package/fesm2022/netwin-angular-datetime-picker.mjs.map +1 -0
  42. package/index.d.ts +5 -0
  43. package/lib/date-time/adapter/date-time-adapter.class.d.ts +193 -0
  44. package/lib/date-time/adapter/date-time-format.class.d.ts +15 -0
  45. package/lib/date-time/adapter/native-date-time-adapter.class.d.ts +72 -0
  46. package/lib/date-time/adapter/native-date-time-format.class.d.ts +5 -0
  47. package/lib/date-time/adapter/native-date-time.module.d.ts +12 -0
  48. package/lib/date-time/adapter/unix-timestamp-adapter/unix-timestamp-date-time-adapter.class.d.ts +67 -0
  49. package/lib/date-time/adapter/unix-timestamp-adapter/unix-timestamp-date-time-format.class.d.ts +5 -0
  50. package/lib/date-time/calendar-body.component.d.ts +79 -0
  51. package/lib/date-time/calendar-month-view.component.d.ts +141 -0
  52. package/lib/date-time/calendar-multi-year-view.component.d.ts +107 -0
  53. package/lib/date-time/calendar-year-view.component.d.ts +120 -0
  54. package/lib/date-time/calendar.component.d.ts +154 -0
  55. package/lib/date-time/date-time-inline.component.d.ts +102 -0
  56. package/lib/date-time/date-time-picker-container.component.d.ts +130 -0
  57. package/lib/date-time/date-time-picker-input.directive.d.ts +164 -0
  58. package/lib/date-time/date-time-picker-intl.service.d.ts +51 -0
  59. package/lib/date-time/date-time-picker-trigger.directive.d.ts +23 -0
  60. package/lib/date-time/date-time-picker.animations.d.ts +8 -0
  61. package/lib/date-time/date-time-picker.component.d.ts +173 -0
  62. package/lib/date-time/date-time.class.d.ts +103 -0
  63. package/lib/date-time/date-time.module.d.ts +23 -0
  64. package/lib/date-time/numberedFixLen.pipe.d.ts +10 -0
  65. package/lib/date-time/options-provider.d.ts +23 -0
  66. package/lib/date-time/timer-box.component.d.ts +42 -0
  67. package/lib/date-time/timer.component.d.ts +131 -0
  68. package/lib/dialog/dialog-config.class.d.ts +169 -0
  69. package/lib/dialog/dialog-container.component.d.ts +58 -0
  70. package/lib/dialog/dialog-ref.class.d.ts +51 -0
  71. package/lib/dialog/dialog.module.d.ts +11 -0
  72. package/lib/dialog/dialog.service.d.ts +76 -0
  73. package/lib/utils/array.utils.d.ts +5 -0
  74. package/lib/utils/constants.d.ts +19 -0
  75. package/lib/utils/date.utils.d.ts +12 -0
  76. package/lib/utils/index.d.ts +4 -0
  77. package/lib/utils/object.utils.d.ts +11 -0
  78. package/package.json +51 -0
  79. package/public_api.d.ts +24 -0
@@ -0,0 +1,293 @@
1
+ /**
2
+ * date-time-inline.component
3
+ */
4
+ import { coerceBooleanProperty } from '@angular/cdk/coercion';
5
+ import { ChangeDetectionStrategy, Component, EventEmitter, forwardRef, Inject, Input, Optional, Output, ViewChild } from '@angular/core';
6
+ import { NG_VALUE_ACCESSOR } from '@angular/forms';
7
+ import { OWL_DATE_TIME_FORMATS } from './adapter/date-time-format.class';
8
+ import { OwlDateTimeContainerComponent } from './date-time-picker-container.component';
9
+ import { OwlDateTime } from './date-time.class';
10
+ import * as i0 from "@angular/core";
11
+ import * as i1 from "./adapter/date-time-adapter.class";
12
+ import * as i2 from "./date-time-picker-container.component";
13
+ export const OWL_DATETIME_VALUE_ACCESSOR = {
14
+ provide: NG_VALUE_ACCESSOR,
15
+ useExisting: forwardRef(() => OwlDateTimeInlineComponent),
16
+ multi: true
17
+ };
18
+ export class OwlDateTimeInlineComponent extends OwlDateTime {
19
+ get pickerType() {
20
+ return this._pickerType;
21
+ }
22
+ set pickerType(val) {
23
+ if (val !== this._pickerType) {
24
+ this._pickerType = val;
25
+ }
26
+ }
27
+ get disabled() {
28
+ return !!this._disabled;
29
+ }
30
+ set disabled(value) {
31
+ this._disabled = coerceBooleanProperty(value);
32
+ }
33
+ get selectMode() {
34
+ return this._selectMode;
35
+ }
36
+ set selectMode(mode) {
37
+ if (mode !== 'single' && mode !== 'range' && mode !== 'rangeFrom' && mode !== 'rangeTo') {
38
+ throw Error('OwlDateTime Error: invalid selectMode value!');
39
+ }
40
+ this._selectMode = mode;
41
+ }
42
+ get startAt() {
43
+ if (this._startAt) {
44
+ return this._startAt;
45
+ }
46
+ if (this.selectMode === 'single') {
47
+ return this.value || null;
48
+ }
49
+ else if (this.selectMode === 'range' || this.selectMode === 'rangeFrom') {
50
+ return this.values[0] || null;
51
+ }
52
+ else if (this.selectMode === 'rangeTo') {
53
+ return this.values[1] || null;
54
+ }
55
+ else {
56
+ return null;
57
+ }
58
+ }
59
+ set startAt(date) {
60
+ this._startAt = this.getValidDate(this.dateTimeAdapter.deserialize(date));
61
+ }
62
+ get endAt() {
63
+ if (this._endAt) {
64
+ return this._endAt;
65
+ }
66
+ if (this.selectMode === 'single') {
67
+ return this.value || null;
68
+ }
69
+ else if (this.selectMode === 'range' || this.selectMode === 'rangeFrom') {
70
+ return this.values[1] || null;
71
+ }
72
+ else {
73
+ return null;
74
+ }
75
+ }
76
+ set endAt(date) {
77
+ this._endAt = this.getValidDate(this.dateTimeAdapter.deserialize(date));
78
+ }
79
+ get dateTimeFilter() {
80
+ return this._dateTimeFilter;
81
+ }
82
+ set dateTimeFilter(filter) {
83
+ this._dateTimeFilter = filter;
84
+ }
85
+ get minDateTime() {
86
+ return this._min || null;
87
+ }
88
+ set minDateTime(value) {
89
+ this._min = this.getValidDate(this.dateTimeAdapter.deserialize(value));
90
+ this.changeDetector.markForCheck();
91
+ }
92
+ get maxDateTime() {
93
+ return this._max || null;
94
+ }
95
+ set maxDateTime(value) {
96
+ this._max = this.getValidDate(this.dateTimeAdapter.deserialize(value));
97
+ this.changeDetector.markForCheck();
98
+ }
99
+ get value() {
100
+ return this._value;
101
+ }
102
+ set value(value) {
103
+ value = this.dateTimeAdapter.deserialize(value);
104
+ value = this.getValidDate(value);
105
+ this._value = value;
106
+ this.selected = value;
107
+ }
108
+ get values() {
109
+ return this._values;
110
+ }
111
+ set values(values) {
112
+ if (values && values.length > 0) {
113
+ values = values.map((v) => {
114
+ v = this.dateTimeAdapter.deserialize(v);
115
+ v = this.getValidDate(v);
116
+ return v ? this.dateTimeAdapter.clone(v) : null;
117
+ });
118
+ this._values = [...values];
119
+ this.selecteds = [...values];
120
+ }
121
+ else {
122
+ this._values = [];
123
+ this.selecteds = [];
124
+ }
125
+ }
126
+ get selected() {
127
+ return this._selected;
128
+ }
129
+ set selected(value) {
130
+ this._selected = value;
131
+ this.changeDetector.markForCheck();
132
+ }
133
+ get selecteds() {
134
+ return this._selecteds;
135
+ }
136
+ set selecteds(values) {
137
+ this._selecteds = values;
138
+ this.changeDetector.markForCheck();
139
+ }
140
+ get opened() {
141
+ return true;
142
+ }
143
+ get pickerMode() {
144
+ return 'inline';
145
+ }
146
+ get isInSingleMode() {
147
+ return this._selectMode === 'single';
148
+ }
149
+ get isInRangeMode() {
150
+ return this._selectMode === 'range' || this._selectMode === 'rangeFrom' || this._selectMode === 'rangeTo';
151
+ }
152
+ get owlDTInlineClass() {
153
+ return true;
154
+ }
155
+ constructor(changeDetector, dateTimeAdapter, dateTimeFormats) {
156
+ super(dateTimeAdapter, dateTimeFormats);
157
+ this.changeDetector = changeDetector;
158
+ this.dateTimeAdapter = dateTimeAdapter;
159
+ this.dateTimeFormats = dateTimeFormats;
160
+ /**
161
+ * Set the type of the dateTime picker
162
+ * 'both' -- show both calendar and timer
163
+ * 'calendar' -- show only calendar
164
+ * 'timer' -- show only timer
165
+ */
166
+ this._pickerType = 'both';
167
+ this._disabled = false;
168
+ this._selectMode = 'single';
169
+ this._values = [];
170
+ /**
171
+ * Emits selected year in multi-year view
172
+ * This doesn't imply a change on the selected date.
173
+ * */
174
+ this.yearSelected = new EventEmitter();
175
+ /**
176
+ * Emits selected month in year view
177
+ * This doesn't imply a change on the selected date.
178
+ * */
179
+ this.monthSelected = new EventEmitter();
180
+ /**
181
+ * Emits selected date
182
+ * */
183
+ this.dateSelected = new EventEmitter();
184
+ this._selecteds = [];
185
+ this.onModelChange = () => {
186
+ /* noop */
187
+ };
188
+ this.onModelTouched = () => {
189
+ /* noop */
190
+ };
191
+ }
192
+ ngOnInit() {
193
+ this.container.picker = this;
194
+ }
195
+ writeValue(value) {
196
+ if (this.isInSingleMode) {
197
+ this.value = value;
198
+ this.container.pickerMoment = value;
199
+ }
200
+ else {
201
+ this.values = value;
202
+ this.container.pickerMoment = this._values[this.container.activeSelectedIndex];
203
+ }
204
+ }
205
+ registerOnChange(fn) {
206
+ this.onModelChange = fn;
207
+ }
208
+ registerOnTouched(fn) {
209
+ this.onModelTouched = fn;
210
+ }
211
+ setDisabledState(isDisabled) {
212
+ this.disabled = isDisabled;
213
+ }
214
+ select(date) {
215
+ if (this.disabled) {
216
+ return;
217
+ }
218
+ if (Array.isArray(date)) {
219
+ this.values = [...date];
220
+ }
221
+ else {
222
+ this.value = date;
223
+ }
224
+ this.onModelChange(date);
225
+ this.onModelTouched();
226
+ }
227
+ /**
228
+ * Emits the selected year in multi-year view
229
+ * */
230
+ selectYear(normalizedYear) {
231
+ this.yearSelected.emit(normalizedYear);
232
+ }
233
+ /**
234
+ * Emits selected month in year view
235
+ * */
236
+ selectMonth(normalizedMonth) {
237
+ this.monthSelected.emit(normalizedMonth);
238
+ }
239
+ /**
240
+ * Emits the selected date
241
+ * */
242
+ selectDate(normalizedDate) {
243
+ this.dateSelected.emit(normalizedDate);
244
+ }
245
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.7", ngImport: i0, type: OwlDateTimeInlineComponent, deps: [{ token: i0.ChangeDetectorRef }, { token: i1.DateTimeAdapter, optional: true }, { token: OWL_DATE_TIME_FORMATS, optional: true }], target: i0.ɵɵFactoryTarget.Component }); }
246
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.7", type: OwlDateTimeInlineComponent, selector: "owl-date-time-inline", inputs: { pickerType: "pickerType", disabled: "disabled", selectMode: "selectMode", startAt: "startAt", endAt: "endAt", dateTimeFilter: ["owlDateTimeFilter", "dateTimeFilter"], minDateTime: ["min", "minDateTime"], maxDateTime: ["max", "maxDateTime"], value: "value", values: "values" }, outputs: { yearSelected: "yearSelected", monthSelected: "monthSelected", dateSelected: "dateSelected" }, host: { properties: { "class.owl-dt-inline": "owlDTInlineClass" } }, providers: [OWL_DATETIME_VALUE_ACCESSOR], viewQueries: [{ propertyName: "container", first: true, predicate: OwlDateTimeContainerComponent, descendants: true, static: true }], usesInheritance: true, ngImport: i0, template: "<owl-date-time-container></owl-date-time-container>\n", styles: [""], dependencies: [{ kind: "component", type: i2.OwlDateTimeContainerComponent, selector: "owl-date-time-container", exportAs: ["owlDateTimeContainer"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
247
+ }
248
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.7", ngImport: i0, type: OwlDateTimeInlineComponent, decorators: [{
249
+ type: Component,
250
+ args: [{ selector: 'owl-date-time-inline', host: {
251
+ '[class.owl-dt-inline]': 'owlDTInlineClass'
252
+ }, changeDetection: ChangeDetectionStrategy.OnPush, preserveWhitespaces: false, providers: [OWL_DATETIME_VALUE_ACCESSOR], template: "<owl-date-time-container></owl-date-time-container>\n" }]
253
+ }], ctorParameters: () => [{ type: i0.ChangeDetectorRef }, { type: i1.DateTimeAdapter, decorators: [{
254
+ type: Optional
255
+ }] }, { type: undefined, decorators: [{
256
+ type: Optional
257
+ }, {
258
+ type: Inject,
259
+ args: [OWL_DATE_TIME_FORMATS]
260
+ }] }], propDecorators: { container: [{
261
+ type: ViewChild,
262
+ args: [OwlDateTimeContainerComponent, { static: true }]
263
+ }], pickerType: [{
264
+ type: Input
265
+ }], disabled: [{
266
+ type: Input
267
+ }], selectMode: [{
268
+ type: Input
269
+ }], startAt: [{
270
+ type: Input
271
+ }], endAt: [{
272
+ type: Input
273
+ }], dateTimeFilter: [{
274
+ type: Input,
275
+ args: ['owlDateTimeFilter']
276
+ }], minDateTime: [{
277
+ type: Input,
278
+ args: ['min']
279
+ }], maxDateTime: [{
280
+ type: Input,
281
+ args: ['max']
282
+ }], value: [{
283
+ type: Input
284
+ }], values: [{
285
+ type: Input
286
+ }], yearSelected: [{
287
+ type: Output
288
+ }], monthSelected: [{
289
+ type: Output
290
+ }], dateSelected: [{
291
+ type: Output
292
+ }] } });
293
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0ZS10aW1lLWlubGluZS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9waWNrZXIvc3JjL2xpYi9kYXRlLXRpbWUvZGF0ZS10aW1lLWlubGluZS5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9waWNrZXIvc3JjL2xpYi9kYXRlLXRpbWUvZGF0ZS10aW1lLWlubGluZS5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7R0FFRztBQUVILE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBQzlELE9BQU8sRUFDTCx1QkFBdUIsRUFFdkIsU0FBUyxFQUNULFlBQVksRUFDWixVQUFVLEVBQ1YsTUFBTSxFQUNOLEtBQUssRUFFTCxRQUFRLEVBQ1IsTUFBTSxFQUNOLFNBQVMsRUFDVixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQXdCLGlCQUFpQixFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFFekUsT0FBTyxFQUFFLHFCQUFxQixFQUFzQixNQUFNLGtDQUFrQyxDQUFDO0FBQzdGLE9BQU8sRUFBRSw2QkFBNkIsRUFBRSxNQUFNLHdDQUF3QyxDQUFDO0FBQ3ZGLE9BQU8sRUFBRSxXQUFXLEVBQXNDLE1BQU0sbUJBQW1CLENBQUM7Ozs7QUFFcEYsTUFBTSxDQUFDLE1BQU0sMkJBQTJCLEdBQVE7SUFDOUMsT0FBTyxFQUFFLGlCQUFpQjtJQUMxQixXQUFXLEVBQUUsVUFBVSxDQUFDLEdBQUcsRUFBRSxDQUFDLDBCQUEwQixDQUFDO0lBQ3pELEtBQUssRUFBRSxJQUFJO0NBQ1osQ0FBQztBQWFGLE1BQU0sT0FBTywwQkFBOEIsU0FBUSxXQUFjO0lBVy9ELElBQ0ksVUFBVTtRQUNaLE9BQU8sSUFBSSxDQUFDLFdBQVcsQ0FBQztJQUMxQixDQUFDO0lBRUQsSUFBSSxVQUFVLENBQUMsR0FBZTtRQUM1QixJQUFJLEdBQUcs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Y2VzQ29udGVudCI6WyIvKipcbiAqIGRhdGUtdGltZS1pbmxpbmUuY29tcG9uZW50XG4gKi9cblxuaW1wb3J0IHsgY29lcmNlQm9vbGVhblByb3BlcnR5IH0gZnJvbSAnQGFuZ3VsYXIvY2RrL2NvZXJjaW9uJztcbmltcG9ydCB7XG4gIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LFxuICBDaGFuZ2VEZXRlY3RvclJlZixcbiAgQ29tcG9uZW50LFxuICBFdmVudEVtaXR0ZXIsXG4gIGZvcndhcmRSZWYsXG4gIEluamVjdCxcbiAgSW5wdXQsXG4gIE9uSW5pdCxcbiAgT3B0aW9uYWwsXG4gIE91dHB1dCxcbiAgVmlld0NoaWxkXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQ29udHJvbFZhbHVlQWNjZXNzb3IsIE5HX1ZBTFVFX0FDQ0VTU09SIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgRGF0ZVRpbWVBZGFwdGVyIH0gZnJvbSAnLi9hZGFwdGVyL2RhdGUtdGltZS1hZGFwdGVyLmNsYXNzJztcbmltcG9ydCB7IE9XTF9EQVRFX1RJTUVfRk9STUFUUywgT3dsRGF0ZVRpbWVGb3JtYXRzIH0gZnJvbSAnLi9hZGFwdGVyL2RhdGUtdGltZS1mb3JtYXQuY2xhc3MnO1xuaW1wb3J0IHsgT3dsRGF0ZVRpbWVDb250YWluZXJDb21wb25lbnQgfSBmcm9tICcuL2RhdGUtdGltZS1waWNrZXItY29udGFpbmVyLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBPd2xEYXRlVGltZSwgUGlja2VyTW9kZSwgUGlja2VyVHlwZSwgU2VsZWN0TW9kZSB9IGZyb20gJy4vZGF0ZS10aW1lLmNsYXNzJztcblxuZXhwb3J0IGNvbnN0IE9XTF9EQVRFVElNRV9WQUxVRV9BQ0NFU1NPUjogYW55ID0ge1xuICBwcm92aWRlOiBOR19WQUxVRV9BQ0NFU1NPUixcbiAgdXNlRXhpc3Rpbmc6IGZvcndhcmRSZWYoKCkgPT4gT3dsRGF0ZVRpbWVJbmxpbmVDb21wb25lbnQpLFxuICBtdWx0aTogdHJ1ZVxufTtcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnb3dsLWRhdGUtdGltZS1pbmxpbmUnLFxuICB0ZW1wbGF0ZVVybDogJy4vZGF0ZS10aW1lLWlubGluZS5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL2RhdGUtdGltZS1pbmxpbmUuY29tcG9uZW50LnNjc3MnXSxcbiAgaG9zdDoge1xuICAgICdbY2xhc3Mub3dsLWR0LWlubGluZV0nOiAnb3dsRFRJbmxpbmVDbGFzcydcbiAgfSxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG4gIHByZXNlcnZlV2hpdGVzcGFjZXM6IGZhbHNlLFxuICBwcm92aWRlcnM6IFtPV0xfREFURVRJTUVfVkFMVUVfQUNDRVNTT1JdXG59KVxuZXhwb3J0IGNsYXNzIE93bERhdGVUaW1lSW5saW5lQ29tcG9uZW50PFQ+IGV4dGVuZHMgT3dsRGF0ZVRpbWU8VD4gaW1wbGVtZW50cyBPbkluaXQsIENvbnRyb2xWYWx1ZUFjY2Vzc29yIHtcbiAgQFZpZXdDaGlsZChPd2xEYXRlVGltZUNvbnRhaW5lckNvbXBvbmVudCwgeyBzdGF0aWM6IHRydWUgfSlcbiAgY29udGFpbmVyOiBPd2xEYXRlVGltZUNvbnRhaW5lckNvbXBvbmVudDxUPjtcblxuICAvKipcbiAgICogU2V0IHRoZSB0eXBlIG9mIHRoZSBkYXRlVGltZSBwaWNrZXJcbiAgICogICAgICAnYm90aCcgLS0gc2hvdyBib3RoIGNhbGVuZGFyIGFuZCB0aW1lclxuICAgKiAgICAgICdjYWxlbmRhcicgLS0gc2hvdyBvbmx5IGNhbGVuZGFyXG4gICAqICAgICAgJ3RpbWVyJyAtLSBzaG93IG9ubHkgdGltZXJcbiAgICovXG4gIHByaXZhdGUgX3BpY2tlclR5cGU6IFBpY2tlclR5cGUgPSAnYm90aCc7XG4gIEBJbnB1dCgpXG4gIGdldCBwaWNrZXJUeXBlKCk6IFBpY2tlclR5cGUge1xuICAgIHJldHVybiB0aGlzLl9waWNrZXJUeXBlO1xuICB9XG5cbiAgc2V0IHBpY2tlclR5cGUodmFsOiBQaWNrZXJUeXBlKSB7XG4gICAgaWYgKHZhbCAhPT0gdGhpcy5fcGlja2VyVHlwZSkge1xuICAgICAgdGhpcy5fcGlja2VyVHlwZSA9IHZhbDtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIF9kaXNhYmxlZCA9IGZhbHNlO1xuICBASW5wdXQoKVxuICBvdmVycmlkZSBnZXQgZGlzYWJsZWQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuICEhdGhpcy5fZGlzYWJsZWQ7XG4gIH1cblxuICBvdmVycmlkZSBzZXQgZGlzYWJsZWQodmFsdWU6IGJvb2xlYW4pIHtcbiAgICB0aGlzLl9kaXNhYmxlZCA9IGNvZXJjZUJvb2xlYW5Qcm9wZXJ0eSh2YWx1ZSk7XG4gIH1cblxuICBwcml2YXRlIF9zZWxlY3RNb2RlOiBTZWxlY3RNb2RlID0gJ3NpbmdsZSc7XG4gIEBJbnB1dCgpXG4gIGdldCBzZWxlY3RNb2RlKCkge1xuICAgIHJldHVybiB0aGlzLl9zZWxlY3RNb2RlO1xuICB9XG5cbiAgc2V0IHNlbGVjdE1vZGUobW9kZTogU2VsZWN0TW9kZSkge1xuICAgIGlmIChtb2RlICE9PSAnc2luZ2xlJyAmJiBtb2RlICE9PSAncmFuZ2UnICYmIG1vZGUgIT09ICdyYW5nZUZyb20nICYmIG1vZGUgIT09ICdyYW5nZVRvJykge1xuICAgICAgdGhyb3cgRXJyb3IoJ093bERhdGVUaW1lIEVycm9yOiBpbnZhbGlkIHNlbGVjdE1vZGUgdmFsdWUhJyk7XG4gICAgfVxuXG4gICAgdGhpcy5fc2VsZWN0TW9kZSA9IG1vZGU7XG4gIH1cblxuICAvKiogVGhlIGRhdGUgdG8gb3BlbiB0aGUgY2FsZW5kYXIgdG8gaW5pdGlhbGx5LiAqL1xuICBwcml2YXRlIF9zdGFydEF0OiBUIHwgbnVsbDtcbiAgQElucHV0KClcbiAgZ2V0IHN0YXJ0QXQoKTogVCB8IG51bGwge1xuICAgIGlmICh0aGlzLl9zdGFydEF0KSB7XG4gICAgICByZXR1cm4gdGhpcy5fc3RhcnRBdDtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5zZWxlY3RNb2RlID09PSAnc2luZ2xlJykge1xuICAgICAgcmV0dXJuIHRoaXMudmFsdWUgfHwgbnVsbDtcbiAgICB9IGVsc2UgaWYgKHRoaXMuc2VsZWN0TW9kZSA9PT0gJ3JhbmdlJyB8fCB0aGlzLnNlbGVjdE1vZGUgPT09ICdyYW5nZUZyb20nKSB7XG4gICAgICByZXR1cm4gdGhpcy52YWx1ZXNbMF0gfHwgbnVsbDtcbiAgICB9IGVsc2UgaWYgKHRoaXMuc2VsZWN0TW9kZSA9PT0gJ3JhbmdlVG8nKSB7XG4gICAgICByZXR1cm4gdGhpcy52YWx1ZXNbMV0gfHwgbnVsbDtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICB9XG5cbiAgc2V0IHN0YXJ0QXQoZGF0ZTogVCB8IG51bGwpIHtcbiAgICB0aGlzLl9zdGFydEF0ID0gdGhpcy5nZXRWYWxpZERhdGUodGhpcy5kYXRlVGltZUFkYXB0ZXIuZGVzZXJpYWxpemUoZGF0ZSkpO1xuICB9XG5cbiAgLyoqIFRoZSBkYXRlIHRvIG9wZW4gZm9yIHJhbmdlIGNhbGVuZGFyLiAqL1xuICBwcml2YXRlIF9lbmRBdDogVCB8IG51bGw7XG4gIEBJbnB1dCgpXG4gIGdldCBlbmRBdCgpOiBUIHwgbnVsbCB7XG4gICAgaWYgKHRoaXMuX2VuZEF0KSB7XG4gICAgICByZXR1cm4gdGhpcy5fZW5kQXQ7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuc2VsZWN0TW9kZSA9PT0gJ3NpbmdsZScpIHtcbiAgICAgIHJldHVybiB0aGlzLnZhbHVlIHx8IG51bGw7XG4gICAgfSBlbHNlIGlmICh0aGlzLnNlbGVjdE1vZGUgPT09ICdyYW5nZScgfHwgdGhpcy5zZWxlY3RNb2RlID09PSAncmFuZ2VGcm9tJykge1xuICAgICAgcmV0dXJuIHRoaXMudmFsdWVzWzFdIHx8IG51bGw7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgfVxuXG4gIHNldCBlbmRBdChkYXRlOiBUIHwgbnVsbCkge1xuICAgIHRoaXMuX2VuZEF0ID0gdGhpcy5nZXRWYWxpZERhdGUodGhpcy5kYXRlVGltZUFkYXB0ZXIuZGVzZXJpYWxpemUoZGF0ZSkpO1xuICB9XG5cbiAgcHJpdmF0ZSBfZGF0ZVRpbWVGaWx0ZXI6IChkYXRlOiBUIHwgbnVsbCkgPT4gYm9vbGVhbjtcbiAgQElucHV0KCdvd2xEYXRlVGltZUZpbHRlcicpXG4gIGdldCBkYXRlVGltZUZpbHRlcigpIHtcbiAgICByZXR1cm4gdGhpcy5fZGF0ZVRpbWVGaWx0ZXI7XG4gIH1cblxuICBzZXQgZGF0ZVRpbWVGaWx0ZXIoZmlsdGVyOiAoZGF0ZTogVCB8IG51bGwpID0+IGJvb2xlYW4pIHtcbiAgICB0aGlzLl9kYXRlVGltZUZpbHRlciA9IGZpbHRlcjtcbiAgfVxuXG4gIC8qKiBUaGUgbWluaW11bSB2YWxpZCBkYXRlLiAqL1xuICBwcml2YXRlIF9taW46IFQgfCBudWxsO1xuXG4gIGdldCBtaW5EYXRlVGltZSgpOiBUIHwgbnVsbCB7XG4gICAgcmV0dXJuIHRoaXMuX21pbiB8fCBudWxsO1xuICB9XG5cbiAgQElucHV0KCdtaW4nKVxuICBzZXQgbWluRGF0ZVRpbWUodmFsdWU6IFQgfCBudWxsKSB7XG4gICAgdGhpcy5fbWluID0gdGhpcy5nZXRWYWxpZERhdGUodGhpcy5kYXRlVGltZUFkYXB0ZXIuZGVzZXJpYWxpemUodmFsdWUpKTtcbiAgICB0aGlzLmNoYW5nZURldGVjdG9yLm1hcmtGb3JDaGVjaygpO1xuICB9XG5cbiAgLyoqIFRoZSBtYXhpbXVtIHZhbGlkIGRhdGUuICovXG4gIHByaXZhdGUgX21heDogVCB8IG51bGw7XG5cbiAgZ2V0IG1heERhdGVUaW1lKCk6IFQgfCBudWxsIHtcbiAgICByZXR1cm4gdGhpcy5fbWF4IHx8IG51bGw7XG4gIH1cblxuICBASW5wdXQoJ21heCcpXG4gIHNldCBtYXhEYXRlVGltZSh2YWx1ZTogVCB8IG51bGwpIHtcbiAgICB0aGlzLl9tYXggPSB0aGlzLmdldFZhbGlkRGF0ZSh0aGlzLmRhdGVUaW1lQWRhcHRlci5kZXNlcmlhbGl6ZSh2YWx1ZSkpO1xuICAgIHRoaXMuY2hhbmdlRGV0ZWN0b3IubWFya0ZvckNoZWNrKCk7XG4gIH1cblxuICBwcml2YXRlIF92YWx1ZTogVCB8IG51bGw7XG4gIEBJbnB1dCgpXG4gIGdldCB2YWx1ZSgpIHtcbiAgICByZXR1cm4gdGhpcy5fdmFsdWU7XG4gIH1cblxuICBzZXQgdmFsdWUodmFsdWU6IFQgfCBudWxsKSB7XG4gICAgdmFsdWUgPSB0aGlzLmRhdGVUaW1lQWRhcHRlci5kZXNlcmlhbGl6ZSh2YWx1ZSk7XG4gICAgdmFsdWUgPSB0aGlzLmdldFZhbGlkRGF0ZSh2YWx1ZSk7XG4gICAgdGhpcy5fdmFsdWUgPSB2YWx1ZTtcbiAgICB0aGlzLnNlbGVjdGVkID0gdmFsdWU7XG4gIH1cblxuICBwcml2YXRlIF92YWx1ZXM6IEFycmF5PFQ+ID0gW107XG4gIEBJbnB1dCgpXG4gIGdldCB2YWx1ZXMoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3ZhbHVlcztcbiAgfVxuXG4gIHNldCB2YWx1ZXModmFsdWVzOiBBcnJheTxUPikge1xuICAgIGlmICh2YWx1ZXMgJiYgdmFsdWVzLmxlbmd0aCA+IDApIHtcbiAgICAgIHZhbHVlcyA9IHZhbHVlcy5tYXAoKHYpID0+IHtcbiAgICAgICAgdiA9IHRoaXMuZGF0ZVRpbWVBZGFwdGVyLmRlc2VyaWFsaXplKHYpO1xuICAgICAgICB2ID0gdGhpcy5nZXRWYWxpZERhdGUodik7XG4gICAgICAgIHJldHVybiB2ID8gdGhpcy5kYXRlVGltZUFkYXB0ZXIuY2xvbmUodikgOiBudWxsO1xuICAgICAgfSk7XG4gICAgICB0aGlzLl92YWx1ZXMgPSBbLi4udmFsdWVzXTtcbiAgICAgIHRoaXMuc2VsZWN0ZWRzID0gWy4uLnZhbHVlc107XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuX3ZhbHVlcyA9IFtdO1xuICAgICAgdGhpcy5zZWxlY3RlZHMgPSBbXTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogRW1pdHMgc2VsZWN0ZWQgeWVhciBpbiBtdWx0aS15ZWFyIHZpZXdcbiAgICogVGhpcyBkb2Vzbid0IGltcGx5IGEgY2hhbmdlIG9uIHRoZSBzZWxlY3RlZCBkYXRlLlxuICAgKiAqL1xuICBAT3V0cHV0KClcbiAgeWVhclNlbGVjdGVkID0gbmV3IEV2ZW50RW1pdHRlcjxUPigpO1xuXG4gIC8qKlxuICAgKiBFbWl0cyBzZWxlY3RlZCBtb250aCBpbiB5ZWFyIHZpZXdcbiAgICogVGhpcyBkb2Vzbid0IGltcGx5IGEgY2hhbmdlIG9uIHRoZSBzZWxlY3RlZCBkYXRlLlxuICAgKiAqL1xuICBAT3V0cHV0KClcbiAgbW9udGhTZWxlY3RlZCA9IG5ldyBFdmVudEVtaXR0ZXI8VD4oKTtcblxuICAvKipcbiAgICogRW1pdHMgc2VsZWN0ZWQgZGF0ZVxuICAgKiAqL1xuICBAT3V0cHV0KClcbiAgZGF0ZVNlbGVjdGVkID0gbmV3IEV2ZW50RW1pdHRlcjxUPigpO1xuXG4gIHByaXZhdGUgX3NlbGVjdGVkOiBUIHwgbnVsbDtcbiAgZ2V0IHNlbGVjdGVkKCkge1xuICAgIHJldHVybiB0aGlzLl9zZWxlY3RlZDtcbiAgfVxuXG4gIHNldCBzZWxlY3RlZCh2YWx1ZTogVCB8IG51bGwpIHtcbiAgICB0aGlzLl9zZWxlY3RlZCA9IHZhbHVlO1xuICAgIHRoaXMuY2hhbmdlRGV0ZWN0b3IubWFya0ZvckNoZWNrKCk7XG4gIH1cblxuICBwcml2YXRlIF9zZWxlY3RlZHM6IEFycmF5PFQ+ID0gW107XG4gIGdldCBzZWxlY3RlZHMoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3NlbGVjdGVkcztcbiAgfVxuXG4gIHNldCBzZWxlY3RlZHModmFsdWVzOiBBcnJheTxUPikge1xuICAgIHRoaXMuX3NlbGVjdGVkcyA9IHZhbHVlcztcbiAgICB0aGlzLmNoYW5nZURldGVjdG9yLm1hcmtGb3JDaGVjaygpO1xuICB9XG5cbiAgZ2V0IG9wZW5lZCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIGdldCBwaWNrZXJNb2RlKCk6IFBpY2tlck1vZGUge1xuICAgIHJldHVybiAnaW5saW5lJztcbiAgfVxuXG4gIGdldCBpc0luU2luZ2xlTW9kZSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5fc2VsZWN0TW9kZSA9PT0gJ3NpbmdsZSc7XG4gIH1cblxuICBnZXQgaXNJblJhbmdlTW9kZSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5fc2VsZWN0TW9kZSA9PT0gJ3JhbmdlJyB8fCB0aGlzLl9zZWxlY3RNb2RlID09PSAncmFuZ2VGcm9tJyB8fCB0aGlzLl9zZWxlY3RNb2RlID09PSAncmFuZ2VUbyc7XG4gIH1cblxuICBnZXQgb3dsRFRJbmxpbmVDbGFzcygpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIHByaXZhdGUgb25Nb2RlbENoYW5nZTogKHY6IFQgfCBBcnJheTxUPikgPT4gdm9pZCA9ICgpID0+IHtcbiAgICAvKiBub29wICovXG4gIH07XG5cbiAgcHJpdmF0ZSBvbk1vZGVsVG91Y2hlZDogKCkgPT4gdm9pZCA9ICgpID0+IHtcbiAgICAvKiBub29wICovXG4gIH07XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJvdGVjdGVkIGNoYW5nZURldGVjdG9yOiBDaGFuZ2VEZXRlY3RvclJlZixcbiAgICBAT3B0aW9uYWwoKSBwcm90ZWN0ZWQgb3ZlcnJpZGUgZGF0ZVRpbWVBZGFwdGVyOiBEYXRlVGltZUFkYXB0ZXI8VD4sXG4gICAgQE9wdGlvbmFsKCkgQEluamVjdChPV0xfREFURV9USU1FX0ZPUk1BVFMpIHByb3RlY3RlZCBvdmVycmlkZSBkYXRlVGltZUZvcm1hdHM6IE93bERhdGVUaW1lRm9ybWF0c1xuICApIHtcbiAgICBzdXBlcihkYXRlVGltZUFkYXB0ZXIsIGRhdGVUaW1lRm9ybWF0cyk7XG4gIH1cblxuICBwdWJsaWMgbmdPbkluaXQoKSB7XG4gICAgdGhpcy5jb250YWluZXIucGlja2VyID0gdGhpcztcbiAgfVxuXG4gIHB1YmxpYyB3cml0ZVZhbHVlKHZhbHVlOiBhbnkpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5pc0luU2luZ2xlTW9kZSkge1xuICAgICAgdGhpcy52YWx1ZSA9IHZhbHVlO1xuICAgICAgdGhpcy5jb250YWluZXIucGlja2VyTW9tZW50ID0gdmFsdWU7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMudmFsdWVzID0gdmFsdWU7XG4gICAgICB0aGlzLmNvbnRhaW5lci5waWNrZXJNb21lbnQgPSB0aGlzLl92YWx1ZXNbdGhpcy5jb250YWluZXIuYWN0aXZlU2VsZWN0ZWRJbmRleF07XG4gICAgfVxuICB9XG5cbiAgcHVibGljIHJlZ2lzdGVyT25DaGFuZ2UoZm46IGFueSk6IHZvaWQge1xuICAgIHRoaXMub25Nb2RlbENoYW5nZSA9IGZuO1xuICB9XG5cbiAgcHVibGljIHJlZ2lzdGVyT25Ub3VjaGVkKGZuOiBhbnkpOiB2b2lkIHtcbiAgICB0aGlzLm9uTW9kZWxUb3VjaGVkID0gZm47XG4gIH1cblxuICBwdWJsaWMgc2V0RGlzYWJsZWRTdGF0ZShpc0Rpc2FibGVkOiBib29sZWFuKTogdm9pZCB7XG4gICAgdGhpcy5kaXNhYmxlZCA9IGlzRGlzYWJsZWQ7XG4gIH1cblxuICBwdWJsaWMgc2VsZWN0KGRhdGU6IEFycmF5PFQ+IHwgVCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmRpc2FibGVkKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKEFycmF5LmlzQXJyYXkoZGF0ZSkpIHtcbiAgICAgIHRoaXMudmFsdWVzID0gWy4uLmRhdGVdO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnZhbHVlID0gZGF0ZTtcbiAgICB9XG4gICAgdGhpcy5vbk1vZGVsQ2hhbmdlKGRhdGUpO1xuICAgIHRoaXMub25Nb2RlbFRvdWNoZWQoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBFbWl0cyB0aGUgc2VsZWN0ZWQgeWVhciBpbiBtdWx0aS15ZWFyIHZpZXdcbiAgICogKi9cbiAgcHVibGljIHNlbGVjdFllYXIobm9ybWFsaXplZFllYXI6IFQpOiB2b2lkIHtcbiAgICB0aGlzLnllYXJTZWxlY3RlZC5lbWl0KG5vcm1hbGl6ZWRZZWFyKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBFbWl0cyBzZWxlY3RlZCBtb250aCBpbiB5ZWFyIHZpZXdcbiAgICogKi9cbiAgcHVibGljIHNlbGVjdE1vbnRoKG5vcm1hbGl6ZWRNb250aDogVCk6IHZvaWQge1xuICAgIHRoaXMubW9udGhTZWxlY3RlZC5lbWl0KG5vcm1hbGl6ZWRNb250aCk7XG4gIH1cblxuICAvKipcbiAgICogRW1pdHMgdGhlIHNlbGVjdGVkIGRhdGVcbiAgICogKi9cbiAgcHVibGljIHNlbGVjdERhdGUobm9ybWFsaXplZERhdGU6IFQpOiB2b2lkIHtcbiAgICB0aGlzLmRhdGVTZWxlY3RlZC5lbWl0KG5vcm1hbGl6ZWREYXRlKTtcbiAgfVxufVxuIiwiPG93bC1kYXRlLXRpbWUtY29udGFpbmVyPjwvb3dsLWRhdGUtdGltZS1jb250YWluZXI+XG4iXX0=