ngx-register-base 1.3.2 → 2.0.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.
Files changed (160) hide show
  1. package/README.md +10 -0
  2. package/esm2022/lib/components/checkbox-selector/checkbox-selector.component.mjs +3 -3
  3. package/esm2022/lib/components/column-settings/column-settings.component.mjs +30 -25
  4. package/esm2022/lib/components/column-settings/components/column-settings-template/column-settings-template.component.mjs +4 -12
  5. package/esm2022/lib/components/column-settings/components/reset-settings-form/reset-settings-form.component.mjs +13 -0
  6. package/esm2022/lib/components/column-settings/consts/column-settings.consts.mjs +9 -9
  7. package/esm2022/lib/components/filter-button/filter-button.component.mjs +4 -5
  8. package/esm2022/lib/components/filters/components/filter-list/filter-edit/filter-edit.component.mjs +22 -22
  9. package/esm2022/lib/components/filters/components/filter-list/filter-list-footer/filter-list-footer.component.mjs +9 -6
  10. package/esm2022/lib/components/filters/components/filter-list/filter-list-header/filter-list-header.component.mjs +13 -8
  11. package/esm2022/lib/components/filters/components/filter-list/filter-list-saved/filter-list-saved.component.mjs +4 -4
  12. package/esm2022/lib/components/filters/components/filter-list/filter-list.service.mjs +16 -13
  13. package/esm2022/lib/components/filters/components/filter-list/filters-section/filters-section.component.mjs +4 -4
  14. package/esm2022/lib/components/filters/components/filter-list.module.mjs +33 -7
  15. package/esm2022/lib/components/filters/register-table-filter.component.mjs +5 -4
  16. package/esm2022/lib/components/filters/register-table-filter.module.mjs +5 -5
  17. package/esm2022/lib/components/index.mjs +2 -2
  18. package/esm2022/lib/components/inputs/index.mjs +4 -4
  19. package/esm2022/lib/components/inputs/param-calendar-year/param-calendar-year.component.mjs +37 -30
  20. package/esm2022/lib/components/inputs/param-custom/param-custom.component.mjs +3 -3
  21. package/esm2022/lib/components/inputs/param-date/param-date.component.mjs +27 -15
  22. package/esm2022/lib/components/inputs/param-date-range/index.mjs +2 -0
  23. package/esm2022/lib/components/inputs/param-date-range/param-date-range.component.mjs +80 -18
  24. package/esm2022/lib/components/inputs/param-date-time/param-date-time.component.mjs +65 -30
  25. package/esm2022/lib/components/inputs/param-date-time-range/date-time-range/date-time-range.component.mjs +406 -0
  26. package/esm2022/lib/components/inputs/param-date-time-range/date-time-range/date-time-range.consts.mjs +13 -0
  27. package/esm2022/lib/components/inputs/param-date-time-range/param-date-time-range.component.mjs +31 -34
  28. package/esm2022/lib/components/inputs/param-dropbox/param-dropbox.component.mjs +126 -0
  29. package/esm2022/lib/components/inputs/param-month/param-month.component.mjs +40 -9
  30. package/esm2022/lib/components/inputs/param-month-range/param-month-range.component.mjs +29 -8
  31. package/esm2022/lib/components/inputs/param-multi-select/param-multi-select.component.mjs +97 -113
  32. package/esm2022/lib/components/inputs/param-select/param-select.component.mjs +40 -36
  33. package/esm2022/lib/components/inputs/param-switcher/index.mjs +2 -0
  34. package/esm2022/lib/components/inputs/param-switcher/param-switcher.component.mjs +61 -11
  35. package/esm2022/lib/components/inputs/param-switcher/param-switcher.types.mjs +2 -0
  36. package/esm2022/lib/components/inputs/param-switcher-date-time-range/consts/param-switcher-date-time-range.consts.mjs +7 -25
  37. package/esm2022/lib/components/inputs/param-switcher-date-time-range/param-switcher-date-time-range.component.mjs +21 -20
  38. package/esm2022/lib/components/inputs/param-text/param-text.component.mjs +11 -6
  39. package/esm2022/lib/components/inputs/param-textarea/param-textarea.component.mjs +5 -3
  40. package/esm2022/lib/components/inputs/param-toggle/param-toggle.component.mjs +24 -7
  41. package/esm2022/lib/components/inputs/param-tree/param-tree.component.mjs +3 -3
  42. package/esm2022/lib/components/inputs/param-tree/services/param-tree.service.mjs +9 -2
  43. package/esm2022/lib/components/inputs/param-tree-multi-select/param-tree-multi-select.component.mjs +13 -6
  44. package/esm2022/lib/components/inputs/param-tree-select/param-tree-select.component.mjs +9 -4
  45. package/esm2022/lib/components/inputs/sub-components/param-invalid-icon/param-invalid-icon.component.mjs +9 -5
  46. package/esm2022/lib/components/inputs/sub-components/param-label-hint-icon/param-label-hint-icon.component.mjs +12 -0
  47. package/esm2022/lib/components/paginator/paginator.component.mjs +10 -12
  48. package/esm2022/lib/components/register-table/register-table.component.mjs +31 -12
  49. package/esm2022/lib/components/search-input/search-input.component.mjs +5 -7
  50. package/esm2022/lib/components/sliding-panel/sliding-panel.component.mjs +23 -35
  51. package/esm2022/lib/components/template-modal/index.mjs +3 -0
  52. package/esm2022/lib/components/template-modal/template-modal.base.mjs +16 -0
  53. package/esm2022/lib/components/template-modal/template-modal.component.mjs +16 -0
  54. package/esm2022/lib/core/param/index.mjs +1 -1
  55. package/esm2022/lib/core/param/param-base.mjs +28 -3
  56. package/esm2022/lib/core/param/param-date-base.mjs +20 -11
  57. package/esm2022/lib/core/param/param-select-base.mjs +14 -6
  58. package/esm2022/lib/core/register-base/register-base.store.mjs +1 -1
  59. package/esm2022/lib/directives/date/date-time.types.mjs +1 -1
  60. package/esm2022/lib/providers/index.mjs +2 -0
  61. package/esm2022/lib/providers/provide-icons.mjs +23 -0
  62. package/esm2022/lib/services/date-time.service.mjs +1 -38
  63. package/esm2022/lib/services/dialog/dialog.service.mjs +1 -13
  64. package/esm2022/lib/services/dialog/dialog.types.mjs +2 -2
  65. package/esm2022/lib/services/message.service.mjs +48 -0
  66. package/esm2022/lib/services/validation-message.service.mjs +52 -0
  67. package/esm2022/lib/store/fast-query-store.service.mjs +16 -1
  68. package/esm2022/lib/utils/index.mjs +2 -1
  69. package/esm2022/lib/utils/utils.mjs +17 -0
  70. package/esm2022/public-api.mjs +2 -1
  71. package/fesm2022/ngx-register-base.mjs +1463 -1017
  72. package/fesm2022/ngx-register-base.mjs.map +1 -1
  73. package/icons/arrow-turn-up-left.svg +3 -0
  74. package/icons/check.svg +3 -0
  75. package/icons/floppy.svg +3 -0
  76. package/icons/star-empty.svg +10 -0
  77. package/icons/star-fill.svg +3 -0
  78. package/icons/trash.svg +3 -0
  79. package/icons/xmark.svg +3 -0
  80. package/lib/components/column-settings/column-settings.component.d.ts +9 -9
  81. package/lib/components/column-settings/components/column-settings-template/column-settings-template.component.d.ts +5 -5
  82. package/lib/components/{reset-settings-form → column-settings/components/reset-settings-form}/reset-settings-form.component.d.ts +2 -5
  83. package/lib/components/column-settings/consts/column-settings.consts.d.ts +8 -8
  84. package/lib/components/filters/components/filter-list/filter-edit/filter-edit.component.d.ts +5 -8
  85. package/lib/components/filters/components/filter-list/filter-list-footer/filter-list-footer.component.d.ts +2 -1
  86. package/lib/components/filters/components/filter-list/filter-list-header/filter-list-header.component.d.ts +2 -1
  87. package/lib/components/filters/components/filter-list/filter-list.service.d.ts +2 -3
  88. package/lib/components/filters/components/filter-list.module.d.ts +7 -7
  89. package/lib/components/filters/register-table-filter.component.d.ts +2 -1
  90. package/lib/components/filters/register-table-filter.module.d.ts +2 -2
  91. package/lib/components/index.d.ts +1 -1
  92. package/lib/components/inputs/index.d.ts +3 -4
  93. package/lib/components/inputs/param-calendar-year/param-calendar-year.component.d.ts +2 -8
  94. package/lib/components/inputs/param-custom/param-custom.component.d.ts +1 -1
  95. package/lib/components/inputs/param-date/param-date.component.d.ts +7 -10
  96. package/lib/components/inputs/param-date-range/index.d.ts +1 -0
  97. package/lib/components/inputs/param-date-range/param-date-range.component.d.ts +13 -16
  98. package/lib/components/inputs/param-date-time/param-date-time.component.d.ts +8 -13
  99. package/lib/components/inputs/param-date-time-range/date-time-range/date-time-range.component.d.ts +96 -0
  100. package/lib/components/inputs/param-date-time-range/date-time-range/date-time-range.consts.d.ts +12 -0
  101. package/lib/components/inputs/param-date-time-range/param-date-time-range.component.d.ts +17 -16
  102. package/lib/components/inputs/param-dropbox/param-dropbox.component.d.ts +31 -0
  103. package/lib/components/inputs/param-month/param-month.component.d.ts +10 -8
  104. package/lib/components/inputs/param-month-range/param-month-range.component.d.ts +10 -8
  105. package/lib/components/inputs/param-multi-select/param-multi-select.component.d.ts +9 -11
  106. package/lib/components/inputs/param-select/param-select.component.d.ts +9 -12
  107. package/lib/components/inputs/param-switcher/index.d.ts +2 -0
  108. package/lib/components/inputs/param-switcher/param-switcher.component.d.ts +21 -5
  109. package/lib/components/inputs/param-switcher/param-switcher.types.d.ts +7 -0
  110. package/lib/components/inputs/param-switcher-date-time-range/consts/param-switcher-date-time-range.consts.d.ts +3 -2
  111. package/lib/components/inputs/param-switcher-date-time-range/param-switcher-date-time-range.component.d.ts +5 -4
  112. package/lib/components/inputs/param-text/param-text.component.d.ts +6 -4
  113. package/lib/components/inputs/param-textarea/param-textarea.component.d.ts +2 -1
  114. package/lib/components/inputs/param-toggle/param-toggle.component.d.ts +3 -2
  115. package/lib/components/inputs/param-tree/services/param-tree.service.d.ts +1 -1
  116. package/lib/components/inputs/param-tree-multi-select/param-tree-multi-select.component.d.ts +2 -1
  117. package/lib/components/inputs/sub-components/param-invalid-icon/param-invalid-icon.component.d.ts +2 -1
  118. package/lib/components/inputs/sub-components/param-label-hint-icon/param-label-hint-icon.component.d.ts +5 -0
  119. package/lib/components/paginator/paginator.component.d.ts +3 -4
  120. package/lib/components/register-table/register-table.component.d.ts +5 -3
  121. package/lib/components/sliding-panel/sliding-panel.component.d.ts +8 -8
  122. package/lib/components/template-modal/index.d.ts +2 -0
  123. package/lib/components/template-modal/template-modal.base.d.ts +9 -0
  124. package/lib/components/template-modal/template-modal.component.d.ts +6 -0
  125. package/lib/core/param/index.d.ts +1 -0
  126. package/lib/core/param/param-base.d.ts +18 -2
  127. package/lib/core/param/param-date-base.d.ts +15 -9
  128. package/lib/core/param/param-select-base.d.ts +12 -7
  129. package/lib/core/register-base/register-base.store.d.ts +2 -3
  130. package/lib/directives/date/date-time.types.d.ts +0 -2
  131. package/lib/providers/index.d.ts +1 -0
  132. package/lib/providers/provide-icons.d.ts +3 -0
  133. package/lib/services/date-time.service.d.ts +0 -13
  134. package/lib/services/dialog/dialog.service.d.ts +1 -3
  135. package/lib/services/dialog/dialog.types.d.ts +0 -3
  136. package/lib/services/message.service.d.ts +20 -0
  137. package/lib/services/validation-message.service.d.ts +14 -0
  138. package/lib/store/fast-query-store.service.d.ts +1 -0
  139. package/lib/utils/index.d.ts +1 -0
  140. package/lib/utils/utils.d.ts +3 -0
  141. package/package.json +5 -12
  142. package/public-api.d.ts +1 -0
  143. package/styles/common-param.less +15 -0
  144. package/styles/flex.less +5 -1
  145. package/styles/icons.less +8 -0
  146. package/styles/modals.less +54 -0
  147. package/styles/overrides/tui/tui-input.less +94 -121
  148. package/styles/styles.less +2 -0
  149. package/esm2022/lib/components/inputs/inputs.module.mjs +0 -166
  150. package/esm2022/lib/components/inputs/sub-components/param-delete-content-icon/param-delete-content-btn.component.mjs +0 -15
  151. package/esm2022/lib/components/reset-settings-form/reset-settings-form.component.mjs +0 -18
  152. package/esm2022/lib/components/sliding-panel/sliding-panel.module.mjs +0 -19
  153. package/esm2022/lib/utils/prizm.shared.module.mjs +0 -284
  154. package/icons/calendar-blank.svg +0 -10
  155. package/lib/components/inputs/inputs.module.d.ts +0 -31
  156. package/lib/components/inputs/sub-components/param-delete-content-icon/param-delete-content-btn.component.d.ts +0 -6
  157. package/lib/components/sliding-panel/sliding-panel.module.d.ts +0 -9
  158. package/lib/utils/prizm.shared.module.d.ts +0 -14
  159. /package/icons/{calendar-icon.svg → calendar-date-time.svg} +0 -0
  160. /package/icons/{calendar-custom.svg → calendar-date.svg} +0 -0
@@ -0,0 +1,406 @@
1
+ import { ChangeDetectionStrategy, Component, computed, input, signal, viewChildren, } from '@angular/core';
2
+ import { CommonModule } from '@angular/common';
3
+ import { FormsModule, NG_VALUE_ACCESSOR, ReactiveFormsModule, } from '@angular/forms';
4
+ import { MaskitoDirective } from '@maskito/angular';
5
+ import { TUI_FIRST_DAY, TUI_LAST_DAY, TuiActiveZone, TuiDay, TuiDayRange, tuiNullableSame, TuiTime, } from '@taiga-ui/cdk';
6
+ import { TuiAppearance, TuiButton, TuiDropdown, TuiIcon, TuiTextfield } from '@taiga-ui/core';
7
+ import { TuiCalendarRange, TuiInputTime, tuiInputTimeOptionsProvider } from '@taiga-ui/kit';
8
+ import { maskitoDateOptionsGenerator, maskitoTimeOptionsGenerator, } from '@maskito/kit';
9
+ import { DATE_MAX_LENGTH, DATE_MODE, DATE_PLACEHOLDER, DATE_SEPARATOR, EInputType, TIME_PLACEHOLDER, } from './date-time-range.consts';
10
+ import { addDays, format, isAfter, isBefore, isEqual } from 'date-fns';
11
+ import { EDatePattern } from '../../../../directives/date/date-time.types';
12
+ import * as i0 from "@angular/core";
13
+ import * as i1 from "@angular/forms";
14
+ import * as i2 from "@taiga-ui/core";
15
+ import * as i3 from "@taiga-ui/kit";
16
+ export class CustomDateTimeRangeComponent {
17
+ constructor() {
18
+ this.inputItems = viewChildren('inputItem');
19
+ this.min = input(null);
20
+ this.max = input(null);
21
+ this.minLength = input(null);
22
+ this.maxLength = input(null);
23
+ this.timeMode = input('HH:MM');
24
+ this.placeholder = input('Выберите период');
25
+ this.forceClear = input(true);
26
+ this.value = signal(null);
27
+ /** ControlValueAccessor properties and methods */
28
+ this.onChange = (val) => {
29
+ console.warn('onChange', val);
30
+ };
31
+ this.onTouched = () => { };
32
+ this.touched = false;
33
+ this.disabled = false;
34
+ /** custom date-time-range component props and methods */
35
+ this.open = false;
36
+ this.EInputType = EInputType;
37
+ this.DATE_PLACEHOLDER = DATE_PLACEHOLDER;
38
+ this.TIME_PLACEHOLDER = TIME_PLACEHOLDER;
39
+ this.isFocused = signal(false);
40
+ this.calendarMinDay = computed(() => {
41
+ const minDate = this.min();
42
+ return minDate ? TuiDay.fromLocalNativeDate(minDate) : TUI_FIRST_DAY;
43
+ });
44
+ this.calendarMaxDay = computed(() => {
45
+ const maxDate = this.max();
46
+ return maxDate ? TuiDay.fromLocalNativeDate(maxDate) : TUI_LAST_DAY;
47
+ });
48
+ this.timeLength = computed(() => this.timeMode().length * 0.95);
49
+ this._dateFrom = signal(null);
50
+ this._dateTo = signal(null);
51
+ this._timeFrom = signal(null);
52
+ this._timeTo = signal(null);
53
+ this._currentDayRange = computed(() => {
54
+ const fromDate = this._dateFrom() || this.value()?.from;
55
+ const toDate = this._dateTo() || this.value()?.to;
56
+ if (fromDate && toDate) {
57
+ return isBefore(fromDate, toDate)
58
+ ? { from: fromDate, to: toDate }
59
+ : { from: toDate, to: fromDate };
60
+ }
61
+ return null;
62
+ });
63
+ this._currentTimeFrom = computed(() => this._timeFrom() || this.tuiTimeFrom() || new TuiTime(0, 0, 0));
64
+ this._currentTimeTo = computed(() => this._timeTo() || this.tuiTimeTo() || new TuiTime(23, 59, 59));
65
+ /** range computed from value */
66
+ this.computedTuiDayRange = computed(() => {
67
+ const nativeRange = this.value();
68
+ if (!nativeRange) {
69
+ return null;
70
+ }
71
+ const [fromDate] = this.fromNativeToTui(nativeRange.from);
72
+ const [toDate] = this.fromNativeToTui(nativeRange.to);
73
+ return new TuiDayRange(fromDate, toDate);
74
+ });
75
+ /** computed timeFrom from value */
76
+ this.tuiTimeFrom = computed(() => {
77
+ const nativeRange = this.value();
78
+ if (!nativeRange) {
79
+ return null;
80
+ }
81
+ const [, timeFrom] = this.fromNativeToTui(nativeRange.from);
82
+ return timeFrom;
83
+ });
84
+ /** computed timeTo from value */
85
+ this.tuiTimeTo = computed(() => {
86
+ const nativeRange = this.value();
87
+ if (!nativeRange) {
88
+ return null;
89
+ }
90
+ const [, timeTo] = this.fromNativeToTui(nativeRange.to);
91
+ return timeTo;
92
+ });
93
+ this.fromValue = computed(() => {
94
+ const from = this.value()?.from || null;
95
+ if (from) {
96
+ return format(from, EDatePattern.DATE);
97
+ }
98
+ return null;
99
+ });
100
+ this.toValue = computed(() => {
101
+ const to = this.value()?.to || null;
102
+ if (to) {
103
+ return format(to, EDatePattern.DATE);
104
+ }
105
+ return null;
106
+ });
107
+ this.fromTimeValue = computed(() => {
108
+ const fromTime = this.tuiTimeFrom();
109
+ if (fromTime) {
110
+ return this.timeToString(fromTime);
111
+ }
112
+ return null;
113
+ });
114
+ this.toTimeValue = computed(() => {
115
+ const toTime = this.tuiTimeTo();
116
+ if (toTime) {
117
+ return this.timeToString(toTime);
118
+ }
119
+ return null;
120
+ });
121
+ this.empty = computed(() => !this.value());
122
+ this.datePlaceholder = computed(() => this.isFocused() ? DATE_PLACEHOLDER : this.placeholder());
123
+ this.timeMaxLength = computed(() => this.timeMode().length);
124
+ this.computedDateMask = computed(() => {
125
+ const min = this.calendarMinDay().toLocalNativeDate();
126
+ const max = this.calendarMaxDay().toLocalNativeDate();
127
+ return maskitoDateOptionsGenerator({
128
+ mode: DATE_MODE,
129
+ separator: DATE_SEPARATOR,
130
+ min,
131
+ max,
132
+ });
133
+ });
134
+ this.computedTimeMask = computed(() => {
135
+ const mode = this.timeMode();
136
+ return maskitoTimeOptionsGenerator({
137
+ mode,
138
+ });
139
+ });
140
+ }
141
+ /** Method 1: Framework writes value to your component */
142
+ writeValue(date) {
143
+ this.value.set(date);
144
+ this.resetSignals();
145
+ }
146
+ /** Method 2: Register callback for when value changes */
147
+ registerOnChange(onChange) {
148
+ this.onChange = onChange;
149
+ }
150
+ /** Method 3: Register callback for when user touches control */
151
+ registerOnTouched(onTouched) {
152
+ this.onTouched = onTouched;
153
+ }
154
+ /** Method 4: Handle disabled state */
155
+ setDisabledState(disabled) {
156
+ this.disabled = disabled;
157
+ }
158
+ markAsTouched() {
159
+ if (!this.touched) {
160
+ this.onTouched();
161
+ this.touched = true;
162
+ }
163
+ }
164
+ /** method to notify parent form on control value changes by user interaction */
165
+ onValueChange(val) {
166
+ this.markAsTouched();
167
+ if (!this.disabled) {
168
+ this.value.set(val);
169
+ this.onChange(this.value());
170
+ }
171
+ }
172
+ onClick() {
173
+ this.open = !this.open;
174
+ }
175
+ onFocus() {
176
+ this.isFocused.set(true);
177
+ }
178
+ onBlur() {
179
+ this.isFocused.set(false);
180
+ }
181
+ onActiveZone(active) {
182
+ this.open = active && this.open;
183
+ }
184
+ onCalendarChange(range) {
185
+ if (range &&
186
+ !tuiNullableSame(this.computedTuiDayRange(), range, (a, b) => a?.daySame(b))) {
187
+ const nativeDateRange = this.transformRange(range);
188
+ this.onValueChange(nativeDateRange);
189
+ }
190
+ }
191
+ updateTimeFrom(timeFrom) {
192
+ const currFrom = this.tuiTimeFrom();
193
+ if (currFrom === timeFrom) {
194
+ return;
195
+ }
196
+ this._timeFrom.set(timeFrom);
197
+ const currentRange = this.value();
198
+ if (currentRange) {
199
+ const { from, to } = this.getUpdatedDateTime(currentRange);
200
+ this.onValueChange({ from, to });
201
+ }
202
+ }
203
+ updateTimeTo(timeTo) {
204
+ const currTo = this.tuiTimeTo();
205
+ if (currTo === timeTo) {
206
+ return;
207
+ }
208
+ this._timeTo.set(timeTo);
209
+ const currentRange = this.value();
210
+ if (currentRange) {
211
+ const { from, to } = this.getUpdatedDateTime(currentRange);
212
+ this.onValueChange({ from, to });
213
+ }
214
+ }
215
+ getUpdatedDateTime(currentRange) {
216
+ const { hours: fromHours, minutes: fromMin, seconds: fromSec } = this._currentTimeFrom();
217
+ const { hours: toHours, minutes: toMin, seconds: toSec } = this._currentTimeTo();
218
+ const from = new Date(currentRange.from.setHours(fromHours, fromMin, fromSec));
219
+ const to = new Date(currentRange.to.setHours(toHours, toMin, toSec));
220
+ return { from, to };
221
+ }
222
+ /** method to focus on next input when prev is filled */
223
+ onKeyup(e, type) {
224
+ e.preventDefault();
225
+ const idx = Object.values(EInputType).indexOf(type);
226
+ if (idx === 3 || this.inputItemsAreFilled) {
227
+ return;
228
+ }
229
+ const currentInput = this.inputItems()[idx];
230
+ const currentLen = currentInput?.nativeElement?.value?.length;
231
+ const maxLen = this.getInputMaxLength(type);
232
+ const isFocusNext = currentLen === maxLen;
233
+ if (isFocusNext) {
234
+ const nextInput = this.inputItems()[idx + 1];
235
+ nextInput?.nativeElement?.focus();
236
+ }
237
+ }
238
+ clear() {
239
+ this.resetSignals();
240
+ this.clearInputItems();
241
+ this.onValueChange(null);
242
+ }
243
+ /** update value method for date inputItems */
244
+ onDateValueChange(value, type) {
245
+ const isValid = value?.length === DATE_MAX_LENGTH;
246
+ if (!isValid) {
247
+ return;
248
+ }
249
+ if (type === EInputType.DATE_FROM) {
250
+ this.setDateFrom(value);
251
+ }
252
+ if (type === EInputType.DATE_TO) {
253
+ this.setDateTo(value);
254
+ }
255
+ const currentRange = this._currentDayRange();
256
+ if (currentRange) {
257
+ const { from, to } = this.getUpdatedDateTime(currentRange);
258
+ this.onValueChange({ from, to });
259
+ }
260
+ }
261
+ /** update value method for time inputItems */
262
+ onTimeValueChange(value, type) {
263
+ const isValid = value?.length === this.timeMaxLength();
264
+ if (!isValid) {
265
+ return;
266
+ }
267
+ if (type === EInputType.TIME_FROM) {
268
+ const timeFrom = this.getTuiTimeFromString(value);
269
+ this._timeFrom.set(timeFrom);
270
+ }
271
+ if (type === EInputType.TIME_TO) {
272
+ const timeTo = this.getTuiTimeFromString(value);
273
+ this._timeTo.set(timeTo);
274
+ }
275
+ const currentRange = this._currentDayRange();
276
+ if (currentRange) {
277
+ const { from, to } = this.getUpdatedDateTime(currentRange);
278
+ this.onValueChange({ from, to });
279
+ }
280
+ }
281
+ getTuiTimeFromString(str) {
282
+ const arr = str.split(':');
283
+ const [hourStr, minStr, secStr] = arr;
284
+ const hours = Number(hourStr);
285
+ const min = Number(minStr);
286
+ const sec = Number(secStr ?? 0);
287
+ return new TuiTime(hours, min, sec);
288
+ }
289
+ timeToString(value) {
290
+ return value instanceof TuiTime ? value.toString(this.timeMode()) : null;
291
+ }
292
+ getInputMaxLength(inputType) {
293
+ return inputType === EInputType.DATE_FROM || inputType === EInputType.DATE_TO
294
+ ? DATE_MAX_LENGTH
295
+ : this.timeMaxLength();
296
+ }
297
+ get inputItemsAreFilled() {
298
+ const inputs = this.inputItems();
299
+ return inputs.every((item) => !!item.nativeElement.value);
300
+ }
301
+ setDateFrom(date) {
302
+ const fromDate = this.getNativeFromString(date);
303
+ const minDate = this.calendarMinDay().toLocalNativeDate();
304
+ const isSameOrAfter = isAfter(fromDate, minDate) || isEqual(fromDate, minDate);
305
+ const from = isSameOrAfter ? fromDate : minDate;
306
+ this._dateFrom.set(from);
307
+ }
308
+ setDateTo(date) {
309
+ const toDate = this.getNativeFromString(date);
310
+ const maxDate = this.maxDateBasedOnMaxLength ?? this.calendarMaxDay().toLocalNativeDate();
311
+ const isSameOrBefore = isBefore(toDate, maxDate) || isEqual(toDate, maxDate);
312
+ const to = isSameOrBefore ? toDate : maxDate;
313
+ this._dateTo.set(to);
314
+ }
315
+ get maxDateBasedOnMaxLength() {
316
+ const maxLen = this.maxLength();
317
+ const fromDate = this._dateFrom() ?? this.value()?.from;
318
+ if (maxLen?.day && fromDate) {
319
+ const maxLenDay = addDays(fromDate, maxLen.day - 1);
320
+ const maxDate = this.calendarMaxDay().toLocalNativeDate();
321
+ return isBefore(maxLenDay, maxDate) ? maxLenDay : maxDate;
322
+ }
323
+ return null;
324
+ }
325
+ getNativeFromString(str) {
326
+ const arr = str.split('.');
327
+ const [dayStr, monthStr, yearStr] = arr;
328
+ const year = Number(yearStr);
329
+ const month = Number(monthStr) - 1;
330
+ const day = Number(dayStr);
331
+ return new Date(year, month, day);
332
+ }
333
+ resetSignals() {
334
+ this._dateFrom.set(null);
335
+ this._dateTo.set(null);
336
+ this._timeFrom.set(null);
337
+ this._timeTo.set(null);
338
+ }
339
+ clearInputItems() {
340
+ const inputs = this.inputItems();
341
+ for (const el of inputs) {
342
+ if (el?.nativeElement?.value) {
343
+ el.nativeElement.value = '';
344
+ }
345
+ }
346
+ }
347
+ transformRange(dayRange) {
348
+ const { from: fromDate, to: toDate } = dayRange;
349
+ const fromTime = this._currentTimeFrom();
350
+ const toTime = this._currentTimeTo();
351
+ const from = this.fromTuiToNative(fromDate, fromTime);
352
+ const to = this.fromTuiToNative(toDate, toTime);
353
+ return { from, to };
354
+ }
355
+ fromTuiToNative(date, time) {
356
+ const nativeDate = date.toLocalNativeDate();
357
+ if (time) {
358
+ const { hours = 0, minutes = 0, seconds = 0 } = time;
359
+ return new Date(nativeDate.setHours(hours, minutes, seconds));
360
+ }
361
+ return nativeDate;
362
+ }
363
+ fromNativeToTui(date) {
364
+ const tuiDay = TuiDay.fromLocalNativeDate(date);
365
+ const tuiTime = new TuiTime(date.getHours(), date.getMinutes(), date.getSeconds());
366
+ return [tuiDay, tuiTime];
367
+ }
368
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: CustomDateTimeRangeComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
369
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: CustomDateTimeRangeComponent, isStandalone: true, selector: "sproc-custom-date-time-range", inputs: { min: { classPropertyName: "min", publicName: "min", isSignal: true, isRequired: false, transformFunction: null }, max: { classPropertyName: "max", publicName: "max", isSignal: true, isRequired: false, transformFunction: null }, minLength: { classPropertyName: "minLength", publicName: "minLength", isSignal: true, isRequired: false, transformFunction: null }, maxLength: { classPropertyName: "maxLength", publicName: "maxLength", isSignal: true, isRequired: false, transformFunction: null }, timeMode: { classPropertyName: "timeMode", publicName: "timeMode", isSignal: true, isRequired: false, transformFunction: null }, placeholder: { classPropertyName: "placeholder", publicName: "placeholder", isSignal: true, isRequired: false, transformFunction: null }, forceClear: { classPropertyName: "forceClear", publicName: "forceClear", isSignal: true, isRequired: false, transformFunction: null } }, providers: [
370
+ {
371
+ provide: NG_VALUE_ACCESSOR,
372
+ multi: true,
373
+ useExisting: CustomDateTimeRangeComponent,
374
+ },
375
+ tuiInputTimeOptionsProvider({
376
+ icon: () => '',
377
+ }),
378
+ ], viewQueries: [{ propertyName: "inputItems", predicate: ["inputItem"], descendants: true, isSignal: true }], ngImport: i0, template: "@let timeFrom = tuiTimeFrom();\n@let timeTo = tuiTimeTo();\n\n<div\n tuiAppearance=\"sproc-input-appearance\"\n class=\"multiple-input-box\"\n [tuiDropdown]=\"dropdownContent\"\n [tuiDropdownManual]=\"open\"\n (click)=\"onClick()\"\n (tuiActiveZoneChange)=\"onActiveZone($event)\"\n>\n <div class=\"input-items\">\n <input\n #inputItem\n class=\"input-date\"\n [placeholder]=\"datePlaceholder()\"\n [maskito]=\"computedDateMask()\"\n [disabled]=\"disabled\"\n [class.show-placeholder]=\"empty() && !isFocused()\"\n [ngModelOptions]=\"{ standalone: true }\"\n [ngModel]=\"fromValue()\"\n (ngModelChange)=\"onDateValueChange($event, EInputType.DATE_FROM)\"\n (keyup)=\"onKeyup($event, EInputType.DATE_FROM)\"\n (focus)=\"onFocus()\"\n (blur)=\"onBlur()\"\n />\n <input\n #inputItem\n class=\"input-time\"\n [placeholder]=\"TIME_PLACEHOLDER\"\n [maskito]=\"computedTimeMask()\"\n [disabled]=\"disabled\"\n [style.width.ch]=\"timeLength()\"\n [ngModelOptions]=\"{ standalone: true }\"\n [ngModel]=\"fromTimeValue()\"\n (ngModelChange)=\"onTimeValueChange($event, EInputType.TIME_FROM)\"\n (keyup)=\"onKeyup($event, EInputType.TIME_FROM)\"\n (focus)=\"onFocus()\"\n (blur)=\"onBlur()\"\n />\n <span class=\"delimiter\">-</span>\n <input\n #inputItem\n class=\"input-date\"\n [placeholder]=\"DATE_PLACEHOLDER\"\n [maskito]=\"computedDateMask()\"\n [disabled]=\"disabled\"\n [ngModelOptions]=\"{ standalone: true }\"\n [ngModel]=\"toValue()\"\n (ngModelChange)=\"onDateValueChange($event, EInputType.DATE_TO)\"\n (keyup)=\"onKeyup($event, EInputType.DATE_TO)\"\n (focus)=\"onFocus()\"\n (blur)=\"onBlur()\"\n />\n <input\n #inputItem\n class=\"input-time\"\n [placeholder]=\"TIME_PLACEHOLDER\"\n [maskito]=\"computedTimeMask()\"\n [disabled]=\"disabled\"\n [style.width.ch]=\"timeLength()\"\n [ngModelOptions]=\"{ standalone: true }\"\n [ngModel]=\"toTimeValue()\"\n (ngModelChange)=\"onTimeValueChange($event, EInputType.TIME_TO)\"\n (keyup)=\"onKeyup($event, EInputType.TIME_TO)\"\n (focus)=\"onFocus()\"\n (blur)=\"onBlur()\"\n />\n </div>\n\n <div class=\"t-content\">\n <div class=\"icon-wrapper\">\n <!-- placeholder for sproc-param-invalid-icon -->\n <ng-content />\n\n @if (forceClear()) {\n <button\n class=\"t-clear\"\n tuiIconButton\n size=\"xs\"\n appearance=\"action-grayscale\"\n type=\"button\"\n (click)=\"clear()\"\n >\n \u041E\u0447\u0438\u0441\u0442\u0438\u0442\u044C\n </button>\n }\n </div>\n\n <tui-icon class=\"calendar\" [icon]=\"'@sproc.calendar-date'\"> </tui-icon>\n </div>\n</div>\n\n<ng-template #dropdownContent>\n <tui-calendar-range\n [value]=\"computedTuiDayRange()\"\n [min]=\"calendarMinDay()\"\n [max]=\"calendarMaxDay()\"\n [maxLength]=\"maxLength()\"\n [minLength]=\"minLength()\"\n (valueChange)=\"onCalendarChange($event)\"\n />\n\n <div class=\"time-range\">\n <tui-textfield\n tuiAppearance=\"sproc-input-appearance\"\n [tuiTextfieldSize]=\"'s'\"\n [style.width.px]=\"250\"\n >\n <input\n tuiInputTime\n [mode]=\"timeMode()\"\n [ngModel]=\"timeFrom\"\n (ngModelChange)=\"updateTimeFrom($event)\"\n />\n <tui-icon class=\"clock-icon\" [icon]=\"'@tui.clock'\" [style.font-size.px]=\"16\" />\n </tui-textfield>\n\n <tui-textfield\n tuiAppearance=\"sproc-input-appearance\"\n [tuiTextfieldSize]=\"'s'\"\n [style.width.px]=\"250\"\n >\n <input\n tuiInputTime\n [mode]=\"timeMode()\"\n [ngModel]=\"timeTo\"\n (ngModelChange)=\"updateTimeTo($event)\"\n />\n <tui-icon class=\"clock-icon\" [icon]=\"'@tui.clock'\" [style.font-size.px]=\"16\" />\n </tui-textfield>\n </div>\n</ng-template>\n", styles: [".time-range{width:100%;display:flex;justify-content:space-around;padding-block:16px}.time-range input{box-shadow:none!important}.time-range .clock-icon{margin-right:5px}.multiple-input-box{display:flex;justify-content:space-between;align-items:center;padding:8px 0 8px 4px;padding-inline-start:.75rem}.multiple-input-box .input-items{display:flex;gap:1px}.multiple-input-box .input-items input{border:none;padding:0;background:inherit}.multiple-input-box .input-items input:focus-visible{outline:none!important}.multiple-input-box .input-items input:hover{background:inherit}.multiple-input-box .input-items .delimiter{line-height:16px;height:16px;margin:0 .25ch}.multiple-input-box .input-items .input-date{width:calc(10 * .92ch)}.multiple-input-box .input-items .input-date.show-placeholder{width:100%!important}.multiple-input-box .input-items .input-date.show-placeholder~input,.multiple-input-box .input-items .input-date.show-placeholder~.delimiter{display:none}.multiple-input-box .t-content{display:flex;block-size:var(--t-height);align-items:center;gap:3px;position:relative}.multiple-input-box .t-content .calendar{width:16px;height:16px;color:#1b1f3b66!important}.multiple-input-box .t-content .calendar:hover{color:#1b1f3ba6!important}.multiple-input-box .icon-wrapper{position:absolute;left:-45px;display:flex}.multiple-input-box [tuiIconButton].t-clear{width:16px;height:16px}.multiple-input-box [tuiIconButton].t-clear:before{display:none!important}.multiple-input-box:hover{background:var(--brand-disabled)}.multiple-input-box:hover [tuiIconButton].t-clear:before{display:block!important}.multiple-input-box:focus,.multiple-input-box:focus-within,.multiple-input-box:focus-visible{border-color:var(--tui-background-accent-1);box-shadow:0 0 0 2px var(--tui-background-accent-1-pressed)!important}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i1.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: i2.TuiTextfieldComponent, selector: "tui-textfield:not([multi])" }, { kind: "directive", type: i2.TuiTextfieldOptionsDirective, selector: "[tuiTextfieldAppearance],[tuiTextfieldSize],[tuiTextfieldCleaner]", inputs: ["tuiTextfieldAppearance", "tuiTextfieldSize", "tuiTextfieldCleaner"] }, { kind: "directive", type: i3.TuiInputTimeDirective, selector: "input[tuiInputTime]", inputs: ["accept", "mode", "prefix", "postfix"] }, { kind: "directive", type: MaskitoDirective, selector: "[maskito]", inputs: ["maskito", "maskitoElement"] }, { kind: "component", type: TuiCalendarRange, selector: "tui-calendar-range", inputs: ["disabledItemHandler", "markerHandler", "items", "min", "max", "minLength", "maxLength", "item", "value", "defaultViewedMonth"], outputs: ["valueChange", "itemChange"] }, { kind: "directive", type: i2.TuiDropdownDirective, selector: "[tuiDropdown]:not(ng-container):not(ng-template)", inputs: ["tuiDropdown"], exportAs: ["tuiDropdown"] }, { kind: "directive", type: i2.TuiDropdownManual, selector: "[tuiDropdownManual]", inputs: ["tuiDropdownManual"] }, { kind: "directive", type: TuiButton, selector: "a[tuiButton],button[tuiButton],a[tuiIconButton],button[tuiIconButton]", inputs: ["size"] }, { kind: "directive", type: TuiActiveZone, selector: "[tuiActiveZone]:not(ng-container), [tuiActiveZoneChange]:not(ng-container), [tuiActiveZoneParent]:not(ng-container)", inputs: ["tuiActiveZoneParent"], outputs: ["tuiActiveZoneChange"], exportAs: ["tuiActiveZone"] }, { kind: "component", type: TuiIcon, selector: "tui-icon", inputs: ["icon", "background"] }, { kind: "directive", type: TuiAppearance, selector: "[tuiAppearance]", inputs: ["tuiAppearance", "tuiAppearanceState", "tuiAppearanceFocus", "tuiAppearanceMode"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
379
+ }
380
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: CustomDateTimeRangeComponent, decorators: [{
381
+ type: Component,
382
+ args: [{ selector: 'sproc-custom-date-time-range', standalone: true, changeDetection: ChangeDetectionStrategy.OnPush, imports: [
383
+ CommonModule,
384
+ ReactiveFormsModule,
385
+ FormsModule,
386
+ TuiTextfield,
387
+ TuiInputTime,
388
+ MaskitoDirective,
389
+ TuiCalendarRange,
390
+ TuiDropdown,
391
+ TuiButton,
392
+ TuiActiveZone,
393
+ TuiIcon,
394
+ TuiAppearance,
395
+ ], providers: [
396
+ {
397
+ provide: NG_VALUE_ACCESSOR,
398
+ multi: true,
399
+ useExisting: CustomDateTimeRangeComponent,
400
+ },
401
+ tuiInputTimeOptionsProvider({
402
+ icon: () => '',
403
+ }),
404
+ ], template: "@let timeFrom = tuiTimeFrom();\n@let timeTo = tuiTimeTo();\n\n<div\n tuiAppearance=\"sproc-input-appearance\"\n class=\"multiple-input-box\"\n [tuiDropdown]=\"dropdownContent\"\n [tuiDropdownManual]=\"open\"\n (click)=\"onClick()\"\n (tuiActiveZoneChange)=\"onActiveZone($event)\"\n>\n <div class=\"input-items\">\n <input\n #inputItem\n class=\"input-date\"\n [placeholder]=\"datePlaceholder()\"\n [maskito]=\"computedDateMask()\"\n [disabled]=\"disabled\"\n [class.show-placeholder]=\"empty() && !isFocused()\"\n [ngModelOptions]=\"{ standalone: true }\"\n [ngModel]=\"fromValue()\"\n (ngModelChange)=\"onDateValueChange($event, EInputType.DATE_FROM)\"\n (keyup)=\"onKeyup($event, EInputType.DATE_FROM)\"\n (focus)=\"onFocus()\"\n (blur)=\"onBlur()\"\n />\n <input\n #inputItem\n class=\"input-time\"\n [placeholder]=\"TIME_PLACEHOLDER\"\n [maskito]=\"computedTimeMask()\"\n [disabled]=\"disabled\"\n [style.width.ch]=\"timeLength()\"\n [ngModelOptions]=\"{ standalone: true }\"\n [ngModel]=\"fromTimeValue()\"\n (ngModelChange)=\"onTimeValueChange($event, EInputType.TIME_FROM)\"\n (keyup)=\"onKeyup($event, EInputType.TIME_FROM)\"\n (focus)=\"onFocus()\"\n (blur)=\"onBlur()\"\n />\n <span class=\"delimiter\">-</span>\n <input\n #inputItem\n class=\"input-date\"\n [placeholder]=\"DATE_PLACEHOLDER\"\n [maskito]=\"computedDateMask()\"\n [disabled]=\"disabled\"\n [ngModelOptions]=\"{ standalone: true }\"\n [ngModel]=\"toValue()\"\n (ngModelChange)=\"onDateValueChange($event, EInputType.DATE_TO)\"\n (keyup)=\"onKeyup($event, EInputType.DATE_TO)\"\n (focus)=\"onFocus()\"\n (blur)=\"onBlur()\"\n />\n <input\n #inputItem\n class=\"input-time\"\n [placeholder]=\"TIME_PLACEHOLDER\"\n [maskito]=\"computedTimeMask()\"\n [disabled]=\"disabled\"\n [style.width.ch]=\"timeLength()\"\n [ngModelOptions]=\"{ standalone: true }\"\n [ngModel]=\"toTimeValue()\"\n (ngModelChange)=\"onTimeValueChange($event, EInputType.TIME_TO)\"\n (keyup)=\"onKeyup($event, EInputType.TIME_TO)\"\n (focus)=\"onFocus()\"\n (blur)=\"onBlur()\"\n />\n </div>\n\n <div class=\"t-content\">\n <div class=\"icon-wrapper\">\n <!-- placeholder for sproc-param-invalid-icon -->\n <ng-content />\n\n @if (forceClear()) {\n <button\n class=\"t-clear\"\n tuiIconButton\n size=\"xs\"\n appearance=\"action-grayscale\"\n type=\"button\"\n (click)=\"clear()\"\n >\n \u041E\u0447\u0438\u0441\u0442\u0438\u0442\u044C\n </button>\n }\n </div>\n\n <tui-icon class=\"calendar\" [icon]=\"'@sproc.calendar-date'\"> </tui-icon>\n </div>\n</div>\n\n<ng-template #dropdownContent>\n <tui-calendar-range\n [value]=\"computedTuiDayRange()\"\n [min]=\"calendarMinDay()\"\n [max]=\"calendarMaxDay()\"\n [maxLength]=\"maxLength()\"\n [minLength]=\"minLength()\"\n (valueChange)=\"onCalendarChange($event)\"\n />\n\n <div class=\"time-range\">\n <tui-textfield\n tuiAppearance=\"sproc-input-appearance\"\n [tuiTextfieldSize]=\"'s'\"\n [style.width.px]=\"250\"\n >\n <input\n tuiInputTime\n [mode]=\"timeMode()\"\n [ngModel]=\"timeFrom\"\n (ngModelChange)=\"updateTimeFrom($event)\"\n />\n <tui-icon class=\"clock-icon\" [icon]=\"'@tui.clock'\" [style.font-size.px]=\"16\" />\n </tui-textfield>\n\n <tui-textfield\n tuiAppearance=\"sproc-input-appearance\"\n [tuiTextfieldSize]=\"'s'\"\n [style.width.px]=\"250\"\n >\n <input\n tuiInputTime\n [mode]=\"timeMode()\"\n [ngModel]=\"timeTo\"\n (ngModelChange)=\"updateTimeTo($event)\"\n />\n <tui-icon class=\"clock-icon\" [icon]=\"'@tui.clock'\" [style.font-size.px]=\"16\" />\n </tui-textfield>\n </div>\n</ng-template>\n", styles: [".time-range{width:100%;display:flex;justify-content:space-around;padding-block:16px}.time-range input{box-shadow:none!important}.time-range .clock-icon{margin-right:5px}.multiple-input-box{display:flex;justify-content:space-between;align-items:center;padding:8px 0 8px 4px;padding-inline-start:.75rem}.multiple-input-box .input-items{display:flex;gap:1px}.multiple-input-box .input-items input{border:none;padding:0;background:inherit}.multiple-input-box .input-items input:focus-visible{outline:none!important}.multiple-input-box .input-items input:hover{background:inherit}.multiple-input-box .input-items .delimiter{line-height:16px;height:16px;margin:0 .25ch}.multiple-input-box .input-items .input-date{width:calc(10 * .92ch)}.multiple-input-box .input-items .input-date.show-placeholder{width:100%!important}.multiple-input-box .input-items .input-date.show-placeholder~input,.multiple-input-box .input-items .input-date.show-placeholder~.delimiter{display:none}.multiple-input-box .t-content{display:flex;block-size:var(--t-height);align-items:center;gap:3px;position:relative}.multiple-input-box .t-content .calendar{width:16px;height:16px;color:#1b1f3b66!important}.multiple-input-box .t-content .calendar:hover{color:#1b1f3ba6!important}.multiple-input-box .icon-wrapper{position:absolute;left:-45px;display:flex}.multiple-input-box [tuiIconButton].t-clear{width:16px;height:16px}.multiple-input-box [tuiIconButton].t-clear:before{display:none!important}.multiple-input-box:hover{background:var(--brand-disabled)}.multiple-input-box:hover [tuiIconButton].t-clear:before{display:block!important}.multiple-input-box:focus,.multiple-input-box:focus-within,.multiple-input-box:focus-visible{border-color:var(--tui-background-accent-1);box-shadow:0 0 0 2px var(--tui-background-accent-1-pressed)!important}\n"] }]
405
+ }] });
406
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0ZS10aW1lLXJhbmdlLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25neC1yZWdpc3Rlci1iYXNlL3NyYy9saWIvY29tcG9uZW50cy9pbnB1dHMvcGFyYW0tZGF0ZS10aW1lLXJhbmdlL2RhdGUtdGltZS1yYW5nZS9kYXRlLXRpbWUtcmFuZ2UuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmd4LXJlZ2lzdGVyLWJhc2Uvc3JjL2xpYi9jb21wb25lbnRzL2lucHV0cy9wYXJhbS1kYXRlLXRpbWUtcmFuZ2UvZGF0ZS10aW1lLXJhbmdlL2RhdGUtdGltZS1yYW5nZS5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0wsdUJBQXVCLEVBQ3ZCLFNBQVMsRUFDVCxRQUFRLEVBRVIsS0FBSyxFQUNMLE1BQU0sRUFDTixZQUFZLEdBQ2IsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQy9DLE9BQU8sRUFFTCxXQUFXLEVBQ1gsaUJBQWlCLEVBQ2pCLG1CQUFtQixHQUNwQixNQUFNLGdCQUFnQixDQUFDO0FBQ3hCLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBQ3BELE9BQU8sRUFDTCxhQUFhLEVBQ2IsWUFBWSxFQUNaLGFBQWEsRUFDYixNQUFNLEVBRU4sV0FBVyxFQUNYLGVBQWUsRUFDZixPQUFPLEdBQ1IsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLGFBQWEsRUFBRSxTQUFTLEVBQUUsV0FBVyxFQUFFLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUM5RixPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsWUFBWSxFQUFFLDJCQUEyQixFQUFFLE1BQU0sZUFBZSxDQUFDO0FBRzVG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M0IsQ0FBQzsrR0ExYVUsNEJBQTRCO21HQUE1Qiw0QkFBNEIscTlCQVg1QjtZQUNUO2dCQUNFLE9BQU8sRUFBRSxpQkFBaUI7Z0JBQzFCLEtBQUssRUFBRSxJQUFJO2dCQUNYLFdBQVcsRUFBRSw0QkFBNEI7YUFDMUM7WUFDRCwyQkFBMkIsQ0FBQztnQkFDMUIsSUFBSSxFQUFFLEdBQUcsRUFBRSxDQUFDLEVBQUU7YUFDZixDQUFDO1NBQ0gsc0lDN0VILDQ5SEFxSUEsODBERDlFSSxZQUFZLDhCQUNaLG1CQUFtQixzWkFDbkIsV0FBVywyckJBR1gsZ0JBQWdCLDZGQUNoQixnQkFBZ0IsNGdCQUVoQixTQUFTLG9JQUNULGFBQWEsZ1FBQ2IsT0FBTyxxRkFDUCxhQUFhOzs0RkFhSiw0QkFBNEI7a0JBL0J4QyxTQUFTOytCQUNFLDhCQUE4QixjQUM1QixJQUFJLG1CQUdDLHVCQUF1QixDQUFDLE1BQU0sV0FDdEM7d0JBQ1AsWUFBWTt3QkFDWixtQkFBbUI7d0JBQ25CLFdBQVc7d0JBQ1gsWUFBWTt3QkFDWixZQUFZO3dCQUNaLGdCQUFnQjt3QkFDaEIsZ0JBQWdCO3dCQUNoQixXQUFXO3dCQUNYLFNBQVM7d0JBQ1QsYUFBYTt3QkFDYixPQUFPO3dCQUNQLGFBQWE7cUJBQ2QsYUFDVTt3QkFDVDs0QkFDRSxPQUFPLEVBQUUsaUJBQWlCOzRCQUMxQixLQUFLLEVBQUUsSUFBSTs0QkFDWCxXQUFXLDhCQUE4Qjt5QkFDMUM7d0JBQ0QsMkJBQTJCLENBQUM7NEJBQzFCLElBQUksRUFBRSxHQUFHLEVBQUUsQ0FBQyxFQUFFO3lCQUNmLENBQUM7cUJBQ0giLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSxcbiAgQ29tcG9uZW50LFxuICBjb21wdXRlZCxcbiAgRWxlbWVudFJlZixcbiAgaW5wdXQsXG4gIHNpZ25hbCxcbiAgdmlld0NoaWxkcmVuLFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IENvbW1vbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQge1xuICBDb250cm9sVmFsdWVBY2Nlc3NvcixcbiAgRm9ybXNNb2R1bGUsXG4gIE5HX1ZBTFVFX0FDQ0VTU09SLFxuICBSZWFjdGl2ZUZvcm1zTW9kdWxlLFxufSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQgeyBNYXNraXRvRGlyZWN0aXZlIH0gZnJvbSAnQG1hc2tpdG8vYW5ndWxhcic7XG5pbXBvcnQge1xuICBUVUlfRklSU1RfREFZLFxuICBUVUlfTEFTVF9EQVksXG4gIFR1aUFjdGl2ZVpvbmUsXG4gIFR1aURheSxcbiAgVHVpRGF5TGlrZSxcbiAgVHVpRGF5UmFuZ2UsXG4gIHR1aU51bGxhYmxlU2FtZSxcbiAgVHVpVGltZSxcbn0gZnJvbSAnQHRhaWdhLXVpL2Nkayc7XG5pbXBvcnQgeyBUdWlBcHBlYXJhbmNlLCBUdWlCdXR0b24sIFR1aURyb3Bkb3duLCBUdWlJY29uLCBUdWlUZXh0ZmllbGQgfSBmcm9tICdAdGFpZ2EtdWkvY29yZSc7XG5pbXBvcnQgeyBUdWlDYWxlbmRhclJhbmdlLCBUdWlJbnB1dFRpbWUsIHR1aUlucHV0VGltZU9wdGlvbnNQcm92aWRlciB9IGZyb20gJ0B0YWlnYS11aS9raXQnO1xuXG5pbXBvcnQgeyBNYXNraXRvT3B0aW9ucyB9IGZyb20gJ0BtYXNraXRvL2NvcmUnO1xuaW1wb3J0IHtcbiAgbWFza2l0b0RhdGVPcHRpb25zR2VuZXJhdG9yLFxuICBNYXNraXRvVGltZU1vZGUsXG4gIG1hc2tpdG9UaW1lT3B0aW9uc0dlbmVyYXRvcixcbn0gZnJvbSAnQG1hc2tpdG8va2l0JztcbmltcG9ydCB7XG4gIERBVEVfTUFYX0xFTkdUSCxcbiAgREFURV9NT0RFLFxuICBEQVRFX1BMQUNFSE9MREVSLFxuICBEQVRFX1NFUEFSQVRPUixcbiAgRUlucHV0VHlwZSxcbiAgVElNRV9QTEFDRUhPTERFUixcbn0gZnJvbSAnLi9kYXRlLXRpbWUtcmFuZ2UuY29uc3RzJztcbmltcG9ydCB7IGFkZERheXMsIGZvcm1hdCwgaXNBZnRlciwgaXNCZWZvcmUsIGlzRXF1YWwgfSBmcm9tICdkYXRlLWZucyc7XG5pbXBvcnQgeyBFRGF0ZVBhdHRlcm4gfSBmcm9tICcuLi8uLi8uLi8uLi9kaXJlY3RpdmVzL2RhdGUvZGF0ZS10aW1lLnR5cGVzJztcbmltcG9ydCB7IERhdGVSYW5nZVR5cGUgfSBmcm9tICcuLi8uLi8uLi8uLi9jb3JlL3BhcmFtL3BhcmFtLWRhdGUtYmFzZSc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ3Nwcm9jLWN1c3RvbS1kYXRlLXRpbWUtcmFuZ2UnLFxuICBzdGFuZGFsb25lOiB0cnVlLFxuICB0ZW1wbGF0ZVVybDogJy4vZGF0ZS10aW1lLXJhbmdlLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vZGF0ZS10aW1lLXJhbmdlLmNvbXBvbmVudC5sZXNzJ10sXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxuICBpbXBvcnRzOiBbXG4gICAgQ29tbW9uTW9kdWxlLFxuICAgIFJlYWN0aXZlRm9ybXNNb2R1bGUsXG4gICAgRm9ybXNNb2R1bGUsXG4gICAgVHVpVGV4dGZpZWxkLFxuICAgIFR1aUlucHV0VGltZSxcbiAgICBNYXNraXRvRGlyZWN0aXZlLFxuICAgIFR1aUNhbGVuZGFyUmFuZ2UsXG4gICAgVHVpRHJvcGRvd24sXG4gICAgVHVpQnV0dG9uLFxuICAgIFR1aUFjdGl2ZVpvbmUsXG4gICAgVHVpSWNvbixcbiAgICBUdWlBcHBlYXJhbmNlLFxuICBdLFxuICBwcm92aWRlcnM6IFtcbiAgICB7XG4gICAgICBwcm92aWRlOiBOR19WQUxVRV9BQ0NFU1NPUixcbiAgICAgIG11bHRpOiB0cnVlLFxuICAgICAgdXNlRXhpc3Rpbmc6IEN1c3RvbURhdGVUaW1lUmFuZ2VDb21wb25lbnQsXG4gICAgfSxcbiAgICB0dWlJbnB1dFRpbWVPcHRpb25zUHJvdmlkZXIoe1xuICAgICAgaWNvbjogKCkgPT4gJycsXG4gICAgfSksXG4gIF0sXG59KVxuZXhwb3J0IGNsYXNzIEN1c3RvbURhdGVUaW1lUmFuZ2VDb21wb25lbnQgaW1wbGVtZW50cyBDb250cm9sVmFsdWVBY2Nlc3NvciB7XG4gIHByb3RlY3RlZCBpbnB1dEl0ZW1zID0gdmlld0NoaWxkcmVuPEVsZW1lbnRSZWY8SFRNTElucHV0RWxlbWVudD4+KCdpbnB1dEl0ZW0nKTtcblxuICBwdWJsaWMgbWluID0gaW5wdXQ8RGF0ZSB8IG51bGwgfCB1bmRlZmluZWQ+KG51bGwpO1xuICBwdWJsaWMgbWF4ID0gaW5wdXQ8RGF0ZSB8IG51bGwgfCB1bmRlZmluZWQ+KG51bGwpO1xuICBwdWJsaWMgbWluTGVuZ3RoID0gaW5wdXQ8VHVpRGF5TGlrZSB8IG51bGw+KG51bGwpO1xuICBwdWJsaWMgbWF4TGVuZ3RoID0gaW5wdXQ8VHVpRGF5TGlrZSB8IG51bGw+KG51bGwpO1xuICBwdWJsaWMgdGltZU1vZGUgPSBpbnB1dDxNYXNraXRvVGltZU1vZGU+KCdISDpNTScpO1xuICBwdWJsaWMgcGxhY2Vob2xkZXIgPSBpbnB1dCgn0JLRi9Cx0LXRgNC40YLQtSDQv9C10YDQuNC+0LQnKTtcbiAgcHVibGljIGZvcmNlQ2xlYXIgPSBpbnB1dCh0cnVlKTtcblxuICBwcm90ZWN0ZWQgdmFsdWUgPSBzaWduYWw8RGF0ZVJhbmdlVHlwZSB8IG51bGw+KG51bGwpO1xuXG4gIC8qKiBDb250cm9sVmFsdWVBY2Nlc3NvciBwcm9wZXJ0aWVzIGFuZCBtZXRob2RzICovXG4gIHB1YmxpYyBvbkNoYW5nZSA9ICh2YWw6IGFueSk6IHZvaWQgPT4ge1xuICAgIGNvbnNvbGUud2Fybignb25DaGFuZ2UnLCB2YWwpO1xuICB9O1xuXG4gIHB1YmxpYyBvblRvdWNoZWQgPSAoKTogdm9pZCA9PiB7fTtcblxuICBwdWJsaWMgdG91Y2hlZCA9IGZhbHNlO1xuXG4gIHB1YmxpYyBkaXNhYmxlZCA9IGZhbHNlO1xuICAvKiogTWV0aG9kIDE6IEZyYW1ld29yayB3cml0ZXMgdmFsdWUgdG8geW91ciBjb21wb25lbnQgKi9cbiAgcHVibGljIHdyaXRlVmFsdWUoZGF0ZTogRGF0ZVJhbmdlVHlwZSB8IG51bGwpOiB2b2lkIHtcbiAgICB0aGlzLnZhbHVlLnNldChkYXRlKTtcbiAgICB0aGlzLnJlc2V0U2lnbmFscygpO1xuICB9XG4gIC8qKiBNZXRob2QgMjogUmVnaXN0ZXIgY2FsbGJhY2sgZm9yIHdoZW4gdmFsdWUgY2hhbmdlcyAqL1xuICBwdWJsaWMgcmVnaXN0ZXJPbkNoYW5nZShvbkNoYW5nZTogYW55KTogdm9pZCB7XG4gICAgdGhpcy5vbkNoYW5nZSA9IG9uQ2hhbmdlO1xuICB9XG4gIC8qKiBNZXRob2QgMzogUmVnaXN0ZXIgY2FsbGJhY2sgZm9yIHdoZW4gdXNlciB0b3VjaGVzIGNvbnRyb2wgKi9cbiAgcHVibGljIHJlZ2lzdGVyT25Ub3VjaGVkKG9uVG91Y2hlZDogYW55KTogdm9pZCB7XG4gICAgdGhpcy5vblRvdWNoZWQgPSBvblRvdWNoZWQ7XG4gIH1cblxuICAvKiogTWV0aG9kIDQ6IEhhbmRsZSBkaXNhYmxlZCBzdGF0ZSAqL1xuICBwdWJsaWMgc2V0RGlzYWJsZWRTdGF0ZShkaXNhYmxlZDogYm9vbGVhbik6IHZvaWQge1xuICAgIHRoaXMuZGlzYWJsZWQgPSBkaXNhYmxlZDtcbiAgfVxuXG4gIHB1YmxpYyBtYXJrQXNUb3VjaGVkKCk6IHZvaWQge1xuICAgIGlmICghdGhpcy50b3VjaGVkKSB7XG4gICAgICB0aGlzLm9uVG91Y2hlZCgpO1xuICAgICAgdGhpcy50b3VjaGVkID0gdHJ1ZTtcbiAgICB9XG4gIH1cblxuICAvKiogbWV0aG9kIHRvIG5vdGlmeSBwYXJlbnQgZm9ybSBvbiBjb250cm9sIHZhbHVlIGNoYW5nZXMgYnkgdXNlciBpbnRlcmFjdGlvbiAqL1xuICBwcm90ZWN0ZWQgb25WYWx1ZUNoYW5nZSh2YWw6IERhdGVSYW5nZVR5cGUgfCBudWxsKTogdm9pZCB7XG4gICAgdGhpcy5tYXJrQXNUb3VjaGVkKCk7XG4gICAgaWYgKCF0aGlzLmRpc2FibGVkKSB7XG4gICAgICB0aGlzLnZhbHVlLnNldCh2YWwpO1xuICAgICAgdGhpcy5vbkNoYW5nZSh0aGlzLnZhbHVlKCkpO1xuICAgIH1cbiAgfVxuXG4gIC8qKiBjdXN0b20gZGF0ZS10aW1lLXJhbmdlIGNvbXBvbmVudCBwcm9wcyBhbmQgbWV0aG9kcyAqL1xuICBwcm90ZWN0ZWQgb3BlbiA9IGZhbHNlO1xuICBwcm90ZWN0ZWQgRUlucHV0VHlwZSA9IEVJbnB1dFR5cGU7XG4gIHByb3RlY3RlZCBEQVRFX1BMQUNFSE9MREVSID0gREFURV9QTEFDRUhPTERFUjtcbiAgcHJvdGVjdGVkIFRJTUVfUExBQ0VIT0xERVIgPSBUSU1FX1BMQUNFSE9MREVSO1xuICBwcm90ZWN0ZWQgaXNGb2N1c2VkID0gc2lnbmFsKGZhbHNlKTtcblxuICBwcm90ZWN0ZWQgY2FsZW5kYXJNaW5EYXkgPSBjb21wdXRlZDxUdWlEYXk+KCgpID0+IHtcbiAgICBjb25zdCBtaW5EYXRlID0gdGhpcy5taW4oKTtcbiAgICByZXR1cm4gbWluRGF0ZSA/IFR1aURheS5mcm9tTG9jYWxOYXRpdmVEYXRlKG1pbkRhdGUpIDogVFVJX0ZJUlNUX0RBWTtcbiAgfSk7XG4gIHByb3RlY3RlZCBjYWxlbmRhck1heERheSA9IGNvbXB1dGVkPFR1aURheT4oKCkgPT4ge1xuICAgIGNvbnN0IG1heERhdGUgPSB0aGlzLm1heCgpO1xuICAgIHJldHVybiBtYXhEYXRlID8gVHVpRGF5LmZyb21Mb2NhbE5hdGl2ZURhdGUobWF4RGF0ZSkgOiBUVUlfTEFTVF9EQVk7XG4gIH0pO1xuXG4gIHByb3RlY3RlZCB0aW1lTGVuZ3RoID0gY29tcHV0ZWQoKCkgPT4gdGhpcy50aW1lTW9kZSgpLmxlbmd0aCAqIDAuOTUpO1xuXG4gIHByaXZhdGUgX2RhdGVGcm9tID0gc2lnbmFsPERhdGUgfCBudWxsPihudWxsKTtcbiAgcHJpdmF0ZSBfZGF0ZVRvID0gc2lnbmFsPERhdGUgfCBudWxsPihudWxsKTtcblxuICBwcml2YXRlIF90aW1lRnJvbSA9IHNpZ25hbDxUdWlUaW1lIHwgbnVsbD4obnVsbCk7XG4gIHByaXZhdGUgX3RpbWVUbyA9IHNpZ25hbDxUdWlUaW1lIHwgbnVsbD4obnVsbCk7XG5cbiAgcHJpdmF0ZSBfY3VycmVudERheVJhbmdlID0gY29tcHV0ZWQ8RGF0ZVJhbmdlVHlwZSB8IG51bGw+KCgpID0+IHtcbiAgICBjb25zdCBmcm9tRGF0ZSA9IHRoaXMuX2RhdGVGcm9tKCkgfHwgdGhpcy52YWx1ZSgpPy5mcm9tO1xuICAgIGNvbnN0IHRvRGF0ZSA9IHRoaXMuX2RhdGVUbygpIHx8IHRoaXMudmFsdWUoKT8udG87XG4gICAgaWYgKGZyb21EYXRlICYmIHRvRGF0ZSkge1xuICAgICAgcmV0dXJuIGlzQmVmb3JlKGZyb21EYXRlLCB0b0RhdGUpXG4gICAgICAgID8geyBmcm9tOiBmcm9tRGF0ZSwgdG86IHRvRGF0ZSB9XG4gICAgICAgIDogeyBmcm9tOiB0b0RhdGUsIHRvOiBmcm9tRGF0ZSB9O1xuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbiAgfSk7XG5cbiAgcHJpdmF0ZSBfY3VycmVudFRpbWVGcm9tID0gY29tcHV0ZWQ8VHVpVGltZT4oXG4gICAgKCkgPT4gdGhpcy5fdGltZUZyb20oKSB8fCB0aGlzLnR1aVRpbWVGcm9tKCkgfHwgbmV3IFR1aVRpbWUoMCwgMCwgMClcbiAgKTtcblxuICBwcml2YXRlIF9jdXJyZW50VGltZVRvID0gY29tcHV0ZWQ8VHVpVGltZT4oXG4gICAgKCkgPT4gdGhpcy5fdGltZVRvKCkgfHwgdGhpcy50dWlUaW1lVG8oKSB8fCBuZXcgVHVpVGltZSgyMywgNTksIDU5KVxuICApO1xuXG4gIC8qKiByYW5nZSBjb21wdXRlZCBmcm9tIHZhbHVlICovXG4gIHByb3RlY3RlZCBjb21wdXRlZFR1aURheVJhbmdlID0gY29tcHV0ZWQ8VHVpRGF5UmFuZ2UgfCBudWxsPigoKSA9PiB7XG4gICAgY29uc3QgbmF0aXZlUmFuZ2UgPSB0aGlzLnZhbHVlKCk7XG4gICAgaWYgKCFuYXRpdmVSYW5nZSkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIGNvbnN0IFtmcm9tRGF0ZV0gPSB0aGlzLmZyb21OYXRpdmVUb1R1aShuYXRpdmVSYW5nZS5mcm9tKTtcbiAgICBjb25zdCBbdG9EYXRlXSA9IHRoaXMuZnJvbU5hdGl2ZVRvVHVpKG5hdGl2ZVJhbmdlLnRvKTtcblxuICAgIHJldHVybiBuZXcgVHVpRGF5UmFuZ2UoZnJvbURhdGUsIHRvRGF0ZSk7XG4gIH0pO1xuXG4gIC8qKiBjb21wdXRlZCB0aW1lRnJvbSBmcm9tIHZhbHVlICovXG4gIHByb3RlY3RlZCB0dWlUaW1lRnJvbSA9IGNvbXB1dGVkPFR1aVRpbWUgfCBudWxsPigoKSA9PiB7XG4gICAgY29uc3QgbmF0aXZlUmFuZ2UgPSB0aGlzLnZhbHVlKCk7XG4gICAgaWYgKCFuYXRpdmVSYW5nZSkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIGNvbnN0IFssIHRpbWVGcm9tXSA9IHRoaXMuZnJvbU5hdGl2ZVRvVHVpKG5hdGl2ZVJhbmdlLmZyb20pO1xuXG4gICAgcmV0dXJuIHRpbWVGcm9tO1xuICB9KTtcblxuICAvKiogY29tcHV0ZWQgdGltZVRvIGZyb20gdmFsdWUgKi9cbiAgcHJvdGVjdGVkIHR1aVRpbWVUbyA9IGNvbXB1dGVkPFR1aVRpbWUgfCBudWxsPigoKSA9PiB7XG4gICAgY29uc3QgbmF0aXZlUmFuZ2UgPSB0aGlzLnZhbHVlKCk7XG4gICAgaWYgKCFuYXRpdmVSYW5nZSkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIGNvbnN0IFssIHRpbWVUb10gPSB0aGlzLmZyb21OYXRpdmVUb1R1aShuYXRpdmVSYW5nZS50byk7XG5cbiAgICByZXR1cm4gdGltZVRvO1xuICB9KTtcblxuICBwcm90ZWN0ZWQgZnJvbVZhbHVlID0gY29tcHV0ZWQ8c3RyaW5nIHwgbnVsbD4oKCkgPT4ge1xuICAgIGNvbnN0IGZyb20gPSB0aGlzLnZhbHVlKCk/LmZyb20gfHwgbnVsbDtcbiAgICBpZiAoZnJvbSkge1xuICAgICAgcmV0dXJuIGZvcm1hdChmcm9tLCBFRGF0ZVBhdHRlcm4uREFURSk7XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xuICB9KTtcblxuICBwcm90ZWN0ZWQgdG9WYWx1ZSA9IGNvbXB1dGVkPHN0cmluZyB8IG51bGw+KCgpID0+IHtcbiAgICBjb25zdCB0byA9IHRoaXMudmFsdWUoKT8udG8gfHwgbnVsbDtcbiAgICBpZiAodG8pIHtcbiAgICAgIHJldHVybiBmb3JtYXQodG8sIEVEYXRlUGF0dGVybi5EQVRFKTtcbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG4gIH0pO1xuXG4gIHByb3RlY3RlZCBmcm9tVGltZVZhbHVlID0gY29tcHV0ZWQ8c3RyaW5nIHwgbnVsbD4oKCkgPT4ge1xuICAgIGNvbnN0IGZyb21UaW1lID0gdGhpcy50dWlUaW1lRnJvbSgpO1xuICAgIGlmIChmcm9tVGltZSkge1xuICAgICAgcmV0dXJuIHRoaXMudGltZVRvU3RyaW5nKGZyb21UaW1lKTtcbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG4gIH0pO1xuXG4gIHByb3RlY3RlZCB0b1RpbWVWYWx1ZSA9IGNvbXB1dGVkPHN0cmluZyB8IG51bGw+KCgpID0+IHtcbiAgICBjb25zdCB0b1RpbWUgPSB0aGlzLnR1aVRpbWVUbygpO1xuICAgIGlmICh0b1RpbWUpIHtcbiAgICAgIHJldHVybiB0aGlzLnRpbWVUb1N0cmluZyh0b1RpbWUpO1xuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbiAgfSk7XG5cbiAgcHJvdGVjdGVkIGVtcHR5ID0gY29tcHV0ZWQoKCkgPT4gIXRoaXMudmFsdWUoKSk7XG5cbiAgcHJvdGVjdGVkIGRhdGVQbGFjZWhvbGRlciA9IGNvbXB1dGVkKCgpID0+XG4gICAgdGhpcy5pc0ZvY3VzZWQoKSA/IERBVEVfUExBQ0VIT0xERVIgOiB0aGlzLnBsYWNlaG9sZGVyKClcbiAgKTtcblxuICBwcm90ZWN0ZWQgdGltZU1heExlbmd0aCA9IGNvbXB1dGVkKCgpID0+IHRoaXMudGltZU1vZGUoKS5sZW5ndGgpO1xuXG4gIHByb3RlY3RlZCBvbkNsaWNrKCk6IHZvaWQge1xuICAgIHRoaXMub3BlbiA9ICF0aGlzLm9wZW47XG4gIH1cblxuICBwcm90ZWN0ZWQgb25Gb2N1cygpOiB2b2lkIHtcbiAgICB0aGlzLmlzRm9jdXNlZC5zZXQodHJ1ZSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgb25CbHVyKCk6IHZvaWQge1xuICAgIHRoaXMuaXNGb2N1c2VkLnNldChmYWxzZSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgb25BY3RpdmVab25lKGFjdGl2ZTogYm9vbGVhbik6IHZvaWQge1xuICAgIHRoaXMub3BlbiA9IGFjdGl2ZSAmJiB0aGlzLm9wZW47XG4gIH1cblxuICBwcm90ZWN0ZWQgY29tcHV0ZWREYXRlTWFzayA9IGNvbXB1dGVkPE1hc2tpdG9PcHRpb25zPigoKSA9PiB7XG4gICAgY29uc3QgbWluID0gdGhpcy5jYWxlbmRhck1pbkRheSgpLnRvTG9jYWxOYXRpdmVEYXRlKCk7XG4gICAgY29uc3QgbWF4ID0gdGhpcy5jYWxlbmRhck1heERheSgpLnRvTG9jYWxOYXRpdmVEYXRlKCk7XG5cbiAgICByZXR1cm4gbWFza2l0b0RhdGVPcHRpb25zR2VuZXJhdG9yKHtcbiAgICAgIG1vZGU6IERBVEVfTU9ERSxcbiAgICAgIHNlcGFyYXRvcjogREFURV9TRVBBUkFUT1IsXG4gICAgICBtaW4sXG4gICAgICBtYXgsXG4gICAgfSk7XG4gIH0pO1xuXG4gIHByb3RlY3RlZCBjb21wdXRlZFRpbWVNYXNrID0gY29tcHV0ZWQoKCkgPT4ge1xuICAgIGNvbnN0IG1vZGUgPSB0aGlzLnRpbWVNb2RlKCk7XG4gICAgcmV0dXJuIG1hc2tpdG9UaW1lT3B0aW9uc0dlbmVyYXRvcih7XG4gICAgICBtb2RlLFxuICAgIH0pO1xuICB9KTtcblxuICBwcm90ZWN0ZWQgb25DYWxlbmRhckNoYW5nZShyYW5nZTogVHVpRGF5UmFuZ2UgfCBudWxsKTogdm9pZCB7XG4gICAgaWYgKFxuICAgICAgcmFuZ2UgJiZcbiAgICAgICF0dWlOdWxsYWJsZVNhbWU8VHVpRGF5UmFuZ2U+KHRoaXMuY29tcHV0ZWRUdWlEYXlSYW5nZSgpLCByYW5nZSwgKGEsIGIpID0+IGE/LmRheVNhbWUoYikpXG4gICAgKSB7XG4gICAgICBjb25zdCBuYXRpdmVEYXRlUmFuZ2UgPSB0aGlzLnRyYW5zZm9ybVJhbmdlKHJhbmdlKTtcbiAgICAgIHRoaXMub25WYWx1ZUNoYW5nZShuYXRpdmVEYXRlUmFuZ2UpO1xuICAgIH1cbiAgfVxuXG4gIHByb3RlY3RlZCB1cGRhdGVUaW1lRnJvbSh0aW1lRnJvbTogVHVpVGltZSB8IG51bGwpOiB2b2lkIHtcbiAgICBjb25zdCBjdXJyRnJvbSA9IHRoaXMudHVpVGltZUZyb20oKTtcbiAgICBpZiAoY3VyckZyb20gPT09IHRpbWVGcm9tKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuX3RpbWVGcm9tLnNldCh0aW1lRnJvbSk7XG4gICAgY29uc3QgY3VycmVudFJhbmdlID0gdGhpcy52YWx1ZSgpO1xuXG4gICAgaWYgKGN1cnJlbnRSYW5nZSkge1xuICAgICAgY29uc3QgeyBmcm9tLCB0byB9ID0gdGhpcy5nZXRVcGRhdGVkRGF0ZVRpbWUoY3VycmVudFJhbmdlKTtcbiAgICAgIHRoaXMub25WYWx1ZUNoYW5nZSh7IGZyb20sIHRvIH0pO1xuICAgIH1cbiAgfVxuXG4gIHByb3RlY3RlZCB1cGRhdGVUaW1lVG8odGltZVRvOiBUdWlUaW1lIHwgbnVsbCk6IHZvaWQge1xuICAgIGNvbnN0IGN1cnJUbyA9IHRoaXMudHVpVGltZVRvKCk7XG4gICAgaWYgKGN1cnJUbyA9PT0gdGltZVRvKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuX3RpbWVUby5zZXQodGltZVRvKTtcbiAgICBjb25zdCBjdXJyZW50UmFuZ2UgPSB0aGlzLnZhbHVlKCk7XG5cbiAgICBpZiAoY3VycmVudFJhbmdlKSB7XG4gICAgICBjb25zdCB7IGZyb20sIHRvIH0gPSB0aGlzLmdldFVwZGF0ZWREYXRlVGltZShjdXJyZW50UmFuZ2UpO1xuICAgICAgdGhpcy5vblZhbHVlQ2hhbmdlKHsgZnJvbSwgdG8gfSk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBnZXRVcGRhdGVkRGF0ZVRpbWUoY3VycmVudFJhbmdlOiBEYXRlUmFuZ2VUeXBlKTogRGF0ZVJhbmdlVHlwZSB7XG4gICAgY29uc3QgeyBob3VyczogZnJvbUhvdXJzLCBtaW51dGVzOiBmcm9tTWluLCBzZWNvbmRzOiBmcm9tU2VjIH0gPSB0aGlzLl9jdXJyZW50VGltZUZyb20oKTtcbiAgICBjb25zdCB7IGhvdXJzOiB0b0hvdXJzLCBtaW51dGVzOiB0b01pbiwgc2Vjb25kczogdG9TZWMgfSA9IHRoaXMuX2N1cnJlbnRUaW1lVG8oKTtcbiAgICBjb25zdCBmcm9tID0gbmV3IERhdGUoY3VycmVudFJhbmdlLmZyb20uc2V0SG91cnMoZnJvbUhvdXJzLCBmcm9tTWluLCBmcm9tU2VjKSk7XG4gICAgY29uc3QgdG8gPSBuZXcgRGF0ZShjdXJyZW50UmFuZ2UudG8uc2V0SG91cnModG9Ib3VycywgdG9NaW4sIHRvU2VjKSk7XG5cbiAgICByZXR1cm4geyBmcm9tLCB0byB9O1xuICB9XG5cbiAgLyoqIG1ldGhvZCB0byBmb2N1cyBvbiBuZXh0IGlucHV0IHdoZW4gcHJldiBpcyBmaWxsZWQgKi9cbiAgcHJvdGVjdGVkIG9uS2V5dXAoZTogS2V5Ym9hcmRFdmVudCwgdHlwZTogRUlucHV0VHlwZSk6IHZvaWQge1xuICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICBjb25zdCBpZHggPSBPYmplY3QudmFsdWVzKEVJbnB1dFR5cGUpLmluZGV4T2YodHlwZSk7XG5cbiAgICBpZiAoaWR4ID09PSAzIHx8IHRoaXMuaW5wdXRJdGVtc0FyZUZpbGxlZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBjdXJyZW50SW5wdXQgPSB0aGlzLmlucHV0SXRlbXMoKVtpZHhdO1xuICAgIGNvbnN0IGN1cnJlbnRMZW4gPSBjdXJyZW50SW5wdXQ/Lm5hdGl2ZUVsZW1lbnQ/LnZhbHVlPy5sZW5ndGg7XG4gICAgY29uc3QgbWF4TGVuID0gdGhpcy5nZXRJbnB1dE1heExlbmd0aCh0eXBlKTtcbiAgICBjb25zdCBpc0ZvY3VzTmV4dCA9IGN1cnJlbnRMZW4gPT09IG1heExlbjtcbiAgICBpZiAoaXNGb2N1c05leHQpIHtcbiAgICAgIGNvbnN0IG5leHRJbnB1dCA9IHRoaXMuaW5wdXRJdGVtcygpW2lkeCArIDFdO1xuICAgICAgbmV4dElucHV0Py5uYXRpdmVFbGVtZW50Py5mb2N1cygpO1xuICAgIH1cbiAgfVxuXG4gIHByb3RlY3RlZCBjbGVhcigpOiB2b2lkIHtcbiAgICB0aGlzLnJlc2V0U2lnbmFscygpO1xuICAgIHRoaXMuY2xlYXJJbnB1dEl0ZW1zKCk7XG4gICAgdGhpcy5vblZhbHVlQ2hhbmdlKG51bGwpO1xuICB9XG5cbiAgLyoqIHVwZGF0ZSB2YWx1ZSBtZXRob2QgZm9yIGRhdGUgaW5wdXRJdGVtcyAqL1xuICBwcm90ZWN0ZWQgb25EYXRlVmFsdWVDaGFuZ2UodmFsdWU6IHN0cmluZyB8IG51bGwsIHR5cGU6IEVJbnB1dFR5cGUpOiB2b2lkIHtcbiAgICBjb25zdCBpc1ZhbGlkID0gdmFsdWU/Lmxlbmd0aCA9PT0gREFURV9NQVhfTEVOR1RIO1xuXG4gICAgaWYgKCFpc1ZhbGlkKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKHR5cGUgPT09IEVJbnB1dFR5cGUuREFURV9GUk9NKSB7XG4gICAgICB0aGlzLnNldERhdGVGcm9tKHZhbHVlKTtcbiAgICB9XG4gICAgaWYgKHR5cGUgPT09IEVJbnB1dFR5cGUuREFURV9UTykge1xuICAgICAgdGhpcy5zZXREYXRlVG8odmFsdWUpO1xuICAgIH1cbiAgICBjb25zdCBjdXJyZW50UmFuZ2UgPSB0aGlzLl9jdXJyZW50RGF5UmFuZ2UoKTtcblxuICAgIGlmIChjdXJyZW50UmFuZ2UpIHtcbiAgICAgIGNvbnN0IHsgZnJvbSwgdG8gfSA9IHRoaXMuZ2V0VXBkYXRlZERhdGVUaW1lKGN1cnJlbnRSYW5nZSk7XG4gICAgICB0aGlzLm9uVmFsdWVDaGFuZ2UoeyBmcm9tLCB0byB9KTtcbiAgICB9XG4gIH1cblxuICAvKiogdXBkYXRlIHZhbHVlIG1ldGhvZCBmb3IgdGltZSBpbnB1dEl0ZW1zICovXG4gIHByb3RlY3RlZCBvblRpbWVWYWx1ZUNoYW5nZSh2YWx1ZTogc3RyaW5nIHwgbnVsbCwgdHlwZTogRUlucHV0VHlwZSk6IHZvaWQge1xuICAgIGNvbnN0IGlzVmFsaWQgPSB2YWx1ZT8ubGVuZ3RoID09PSB0aGlzLnRpbWVNYXhMZW5ndGgoKTtcbiAgICBpZiAoIWlzVmFsaWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKHR5cGUgPT09IEVJbnB1dFR5cGUuVElNRV9GUk9NKSB7XG4gICAgICBjb25zdCB0aW1lRnJvbSA9IHRoaXMuZ2V0VHVpVGltZUZyb21TdHJpbmcodmFsdWUpO1xuICAgICAgdGhpcy5fdGltZUZyb20uc2V0KHRpbWVGcm9tKTtcbiAgICB9XG4gICAgaWYgKHR5cGUgPT09IEVJbnB1dFR5cGUuVElNRV9UTykge1xuICAgICAgY29uc3QgdGltZVRvID0gdGhpcy5nZXRUdWlUaW1lRnJvbVN0cmluZyh2YWx1ZSk7XG4gICAgICB0aGlzLl90aW1lVG8uc2V0KHRpbWVUbyk7XG4gICAgfVxuXG4gICAgY29uc3QgY3VycmVudFJhbmdlID0gdGhpcy5fY3VycmVudERheVJhbmdlKCk7XG5cbiAgICBpZiAoY3VycmVudFJhbmdlKSB7XG4gICAgICBjb25zdCB7IGZyb20sIHRvIH0gPSB0aGlzLmdldFVwZGF0ZWREYXRlVGltZShjdXJyZW50UmFuZ2UpO1xuICAgICAgdGhpcy5vblZhbHVlQ2hhbmdlKHsgZnJvbSwgdG8gfSk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBnZXRUdWlUaW1lRnJvbVN0cmluZyhzdHI6IHN0cmluZykge1xuICAgIGNvbnN0IGFyciA9IHN0ci5zcGxpdCgnOicpO1xuICAgIGNvbnN0IFtob3VyU3RyLCBtaW5TdHIsIHNlY1N0cl0gPSBhcnI7XG4gICAgY29uc3QgaG91cnMgPSBOdW1iZXIoaG91clN0cik7XG4gICAgY29uc3QgbWluID0gTnVtYmVyKG1pblN0cik7XG4gICAgY29uc3Qgc2VjID0gTnVtYmVyKHNlY1N0ciA/PyAwKTtcbiAgICByZXR1cm4gbmV3IFR1aVRpbWUoaG91cnMsIG1pbiwgc2VjKTtcbiAgfVxuXG4gIHByaXZhdGUgdGltZVRvU3RyaW5nKHZhbHVlOiB1bmtub3duKTogc3RyaW5nIHwgbnVsbCB7XG4gICAgcmV0dXJuIHZhbHVlIGluc3RhbmNlb2YgVHVpVGltZSA/IHZhbHVlLnRvU3RyaW5nKHRoaXMudGltZU1vZGUoKSkgOiBudWxsO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRJbnB1dE1heExlbmd0aChpbnB1dFR5cGU6IEVJbnB1dFR5cGUpOiBudW1iZXIge1xuICAgIHJldHVybiBpbnB1dFR5cGUgPT09IEVJbnB1dFR5cGUuREFURV9GUk9NIHx8IGlucHV0VHlwZSA9PT0gRUlucHV0VHlwZS5EQVRFX1RPXG4gICAgICA/IERBVEVfTUFYX0xFTkdUSFxuICAgICAgOiB0aGlzLnRpbWVNYXhMZW5ndGgoKTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0IGlucHV0SXRlbXNBcmVGaWxsZWQoKTogYm9vbGVhbiB7XG4gICAgY29uc3QgaW5wdXRzID0gdGhpcy5pbnB1dEl0ZW1zKCk7XG4gICAgcmV0dXJuIGlucHV0cy5ldmVyeSgoaXRlbSkgPT4gISFpdGVtLm5hdGl2ZUVsZW1lbnQudmFsdWUpO1xuICB9XG5cbiAgcHJpdmF0ZSBzZXREYXRlRnJvbShkYXRlOiBzdHJpbmcpIHtcbiAgICBjb25zdCBmcm9tRGF0ZSA9IHRoaXMuZ2V0TmF0aXZlRnJvbVN0cmluZyhkYXRlKTtcbiAgICBjb25zdCBtaW5EYXRlID0gdGhpcy5jYWxlbmRhck1pbkRheSgpLnRvTG9jYWxOYXRpdmVEYXRlKCk7XG4gICAgY29uc3QgaXNTYW1lT3JBZnRlciA9IGlzQWZ0ZXIoZnJvbURhdGUsIG1pbkRhdGUpIHx8IGlzRXF1YWwoZnJvbURhdGUsIG1pbkRhdGUpO1xuICAgIGNvbnN0IGZyb20gPSBpc1NhbWVPckFmdGVyID8gZnJvbURhdGUgOiBtaW5EYXRlO1xuXG4gICAgdGhpcy5fZGF0ZUZyb20uc2V0KGZyb20pO1xuICB9XG5cbiAgcHJpdmF0ZSBzZXREYXRlVG8oZGF0ZTogc3RyaW5nKSB7XG4gICAgY29uc3QgdG9EYXRlID0gdGhpcy5nZXROYXRpdmVGcm9tU3RyaW5nKGRhdGUpO1xuICAgIGNvbnN0IG1heERhdGUgPSB0aGlzLm1heERhdGVCYXNlZE9uTWF4TGVuZ3RoID8/IHRoaXMuY2FsZW5kYXJNYXhEYXkoKS50b0xvY2FsTmF0aXZlRGF0ZSgpO1xuICAgIGNvbnN0IGlzU2FtZU9yQmVmb3JlID0gaXNCZWZvcmUodG9EYXRlLCBtYXhEYXRlKSB8fCBpc0VxdWFsKHRvRGF0ZSwgbWF4RGF0ZSk7XG4gICAgY29uc3QgdG8gPSBpc1NhbWVPckJlZm9yZSA/IHRvRGF0ZSA6IG1heERhdGU7XG4gICAgdGhpcy5fZGF0ZVRvLnNldCh0byk7XG4gIH1cblxuICBwcml2YXRlIGdldCBtYXhEYXRlQmFzZWRPbk1heExlbmd0aCgpOiBEYXRlIHwgbnVsbCB7XG4gICAgY29uc3QgbWF4TGVuID0gdGhpcy5tYXhMZW5ndGgoKTtcbiAgICBjb25zdCBmcm9tRGF0ZSA9IHRoaXMuX2RhdGVGcm9tKCkgPz8gdGhpcy52YWx1ZSgpPy5mcm9tO1xuICAgIGlmIChtYXhMZW4/LmRheSAmJiBmcm9tRGF0ZSkge1xuICAgICAgY29uc3QgbWF4TGVuRGF5ID0gYWRkRGF5cyhmcm9tRGF0ZSwgbWF4TGVuLmRheSAtIDEpO1xuICAgICAgY29uc3QgbWF4RGF0ZSA9IHRoaXMuY2FsZW5kYXJNYXhEYXkoKS50b0xvY2FsTmF0aXZlRGF0ZSgpO1xuXG4gICAgICByZXR1cm4gaXNCZWZvcmUobWF4TGVuRGF5LCBtYXhEYXRlKSA/IG1heExlbkRheSA6IG1heERhdGU7XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXROYXRpdmVGcm9tU3RyaW5nKHN0cjogc3RyaW5nKTogRGF0ZSB7XG4gICAgY29uc3QgYXJyID0gc3RyLnNwbGl0KCcuJyk7XG4gICAgY29uc3QgW2RheVN0ciwgbW9udGhTdHIsIHllYXJTdHJdID0gYXJyO1xuICAgIGNvbnN0IHllYXIgPSBOdW1iZXIoeWVhclN0cik7XG4gICAgY29uc3QgbW9udGggPSBOdW1iZXIobW9udGhTdHIpIC0gMTtcbiAgICBjb25zdCBkYXkgPSBOdW1iZXIoZGF5U3RyKTtcbiAgICByZXR1cm4gbmV3IERhdGUoeWVhciwgbW9udGgsIGRheSk7XG4gIH1cblxuICBwcml2YXRlIHJlc2V0U2lnbmFscygpIHtcbiAgICB0aGlzLl9kYXRlRnJvbS5zZXQobnVsbCk7XG4gICAgdGhpcy5fZGF0ZVRvLnNldChudWxsKTtcbiAgICB0aGlzLl90aW1lRnJvbS5zZXQobnVsbCk7XG4gICAgdGhpcy5fdGltZVRvLnNldChudWxsKTtcbiAgfVxuXG4gIHByaXZhdGUgY2xlYXJJbnB1dEl0ZW1zKCkge1xuICAgIGNvbnN0IGlucHV0cyA9IHRoaXMuaW5wdXRJdGVtcygpO1xuICAgIGZvciAoY29uc3QgZWwgb2YgaW5wdXRzKSB7XG4gICAgICBpZiAoZWw/Lm5hdGl2ZUVsZW1lbnQ/LnZhbHVlKSB7XG4gICAgICAgIGVsLm5hdGl2ZUVsZW1lbnQudmFsdWUgPSAnJztcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHRyYW5zZm9ybVJhbmdlKGRheVJhbmdlOiBUdWlEYXlSYW5nZSk6IERhdGVSYW5nZVR5cGUge1xuICAgIGNvbnN0IHsgZnJvbTogZnJvbURhdGUsIHRvOiB0b0RhdGUgfSA9IGRheVJhbmdlO1xuICAgIGNvbnN0IGZyb21UaW1lID0gdGhpcy5fY3VycmVudFRpbWVGcm9tKCk7XG4gICAgY29uc3QgdG9UaW1lID0gdGhpcy5fY3VycmVudFRpbWVUbygpO1xuICAgIGNvbnN0IGZyb20gPSB0aGlzLmZyb21UdWlUb05hdGl2ZShmcm9tRGF0ZSwgZnJvbVRpbWUpO1xuICAgIGNvbnN0IHRvID0gdGhpcy5mcm9tVHVpVG9OYXRpdmUodG9EYXRlLCB0b1RpbWUpO1xuICAgIHJldHVybiB7IGZyb20sIHRvIH07XG4gIH1cblxuICBwcml2YXRlIGZyb21UdWlUb05hdGl2ZShkYXRlOiBUdWlEYXksIHRpbWU6IFR1aVRpbWUgfCBudWxsKTogRGF0ZSB7XG4gICAgY29uc3QgbmF0aXZlRGF0ZSA9IGRhdGUudG9Mb2NhbE5hdGl2ZURhdGUoKTtcbiAgICBpZiAodGltZSkge1xuICAgICAgY29uc3QgeyBob3VycyA9IDAsIG1pbnV0ZXMgPSAwLCBzZWNvbmRzID0gMCB9ID0gdGltZTtcbiAgICAgIHJldHVybiBuZXcgRGF0ZShuYXRpdmVEYXRlLnNldEhvdXJzKGhvdXJzLCBtaW51dGVzLCBzZWNvbmRzKSk7XG4gICAgfVxuICAgIHJldHVybiBuYXRpdmVEYXRlO1xuICB9XG5cbiAgcHJpdmF0ZSBmcm9tTmF0aXZlVG9UdWkoZGF0ZTogRGF0ZSk6IFtUdWlEYXksIFR1aVRpbWVdIHtcbiAgICBjb25zdCB0dWlEYXkgPSBUdWlEYXkuZnJvbUxvY2FsTmF0aXZlRGF0ZShkYXRlKTtcbiAgICBjb25zdCB0dWlUaW1lID0gbmV3IFR1aVRpbWUoZGF0ZS5nZXRIb3VycygpLCBkYXRlLmdldE1pbnV0ZXMoKSwgZGF0ZS5nZXRTZWNvbmRzKCkpO1xuICAgIHJldHVybiBbdHVpRGF5LCB0dWlUaW1lXTtcbiAgfVxufVxuIiwiQGxldCB0aW1lRnJvbSA9IHR1aVRpbWVGcm9tKCk7XG5AbGV0IHRpbWVUbyA9IHR1aVRpbWVUbygpO1xuXG48ZGl2XG4gIHR1aUFwcGVhcmFuY2U9XCJzcHJvYy1pbnB1dC1hcHBlYXJhbmNlXCJcbiAgY2xhc3M9XCJtdWx0aXBsZS1pbnB1dC1ib3hcIlxuICBbdHVpRHJvcGRvd25dPVwiZHJvcGRvd25Db250ZW50XCJcbiAgW3R1aURyb3Bkb3duTWFudWFsXT1cIm9wZW5cIlxuICAoY2xpY2spPVwib25DbGljaygpXCJcbiAgKHR1aUFjdGl2ZVpvbmVDaGFuZ2UpPVwib25BY3RpdmVab25lKCRldmVudClcIlxuPlxuICA8ZGl2IGNsYXNzPVwiaW5wdXQtaXRlbXNcIj5cbiAgICA8aW5wdXRcbiAgICAgICNpbnB1dEl0ZW1cbiAgICAgIGNsYXNzPVwiaW5wdXQtZGF0ZVwiXG4gICAgICBbcGxhY2Vob2xkZXJdPVwiZGF0ZVBsYWNlaG9sZGVyKClcIlxuICAgICAgW21hc2tpdG9dPVwiY29tcHV0ZWREYXRlTWFzaygpXCJcbiAgICAgIFtkaXNhYmxlZF09XCJkaXNhYmxlZFwiXG4gICAgICBbY2xhc3Muc2hvdy1wbGFjZWhvbGRlcl09XCJlbXB0eSgpICYmICFpc0ZvY3VzZWQoKVwiXG4gICAgICBbbmdNb2RlbE9wdGlvbnNdPVwieyBzdGFuZGFsb25lOiB0cnVlIH1cIlxuICAgICAgW25nTW9kZWxdPVwiZnJvbVZhbHVlKClcIlxuICAgICAgKG5nTW9kZWxDaGFuZ2UpPVwib25EYXRlVmFsdWVDaGFuZ2UoJGV2ZW50LCBFSW5wdXRUeXBlLkRBVEVfRlJPTSlcIlxuICAgICAgKGtleXVwKT1cIm9uS2V5dXAoJGV2ZW50LCBFSW5wdXRUeXBlLkRBVEVfRlJPTSlcIlxuICAgICAgKGZvY3VzKT1cIm9uRm9jdXMoKVwiXG4gICAgICAoYmx1cik9XCJvbkJsdXIoKVwiXG4gICAgLz5cbiAgICA8aW5wdXRcbiAgICAgICNpbnB1dEl0ZW1cbiAgICAgIGNsYXNzPVwiaW5wdXQtdGltZVwiXG4gICAgICBbcGxhY2Vob2xkZXJdPVwiVElNRV9QTEFDRUhPTERFUlwiXG4gICAgICBbbWFza2l0b109XCJjb21wdXRlZFRpbWVNYXNrKClcIlxuICAgICAgW2Rpc2FibGVkXT1cImRpc2FibGVkXCJcbiAgICAgIFtzdHlsZS53aWR0aC5jaF09XCJ0aW1lTGVuZ3RoKClcIlxuICAgICAgW25nTW9kZWxPcHRpb25zXT1cInsgc3RhbmRhbG9uZTogdHJ1ZSB9XCJcbiAgICAgIFtuZ01vZGVsXT1cImZyb21UaW1lVmFsdWUoKVwiXG4gICAgICAobmdNb2RlbENoYW5nZSk9XCJvblRpbWVWYWx1ZUNoYW5nZSgkZXZlbnQsIEVJbnB1dFR5cGUuVElNRV9GUk9NKVwiXG4gICAgICAoa2V5dXApPVwib25LZXl1cCgkZXZlbnQsIEVJbnB1dFR5cGUuVElNRV9GUk9NKVwiXG4gICAgICAoZm9jdXMpPVwib25Gb2N1cygpXCJcbiAgICAgIChibHVyKT1cIm9uQmx1cigpXCJcbiAgICAvPlxuICAgIDxzcGFuIGNsYXNzPVwiZGVsaW1pdGVyXCI+LTwvc3Bhbj5cbiAgICA8aW5wdXRcbiAgICAgICNpbnB1dEl0ZW1cbiAgICAgIGNsYXNzPVwiaW5wdXQtZGF0ZVwiXG4gICAgICBbcGxhY2Vob2xkZXJdPVwiREFURV9QTEFDRUhPTERFUlwiXG4gICAgICBbbWFza2l0b109XCJjb21wdXRlZERhdGVNYXNrKClcIlxuICAgICAgW2Rpc2FibGVkXT1cImRpc2FibGVkXCJcbiAgICAgIFtuZ01vZGVsT3B0aW9uc109XCJ7IHN0YW5kYWxvbmU6IHRydWUgfVwiXG4gICAgICBbbmdNb2RlbF09XCJ0b1ZhbHVlKClcIlxuICAgICAgKG5nTW9kZWxDaGFuZ2UpPVwib25EYXRlVmFsdWVDaGFuZ2UoJGV2ZW50LCBFSW5wdXRUeXBlLkRBVEVfVE8pXCJcbiAgICAgIChrZXl1cCk9XCJvbktleXVwKCRldmVudCwgRUlucHV0VHlwZS5EQVRFX1RPKVwiXG4gICAgICAoZm9jdXMpPVwib25Gb2N1cygpXCJcbiAgICAgIChibHVyKT1cIm9uQmx1cigpXCJcbiAgICAvPlxuICAgIDxpbnB1dFxuICAgICAgI2lucHV0SXRlbVxuICAgICAgY2xhc3M9XCJpbnB1dC10aW1lXCJcbiAgICAgIFtwbGFjZWhvbGRlcl09XCJUSU1FX1BMQUNFSE9MREVSXCJcbiAgICAgIFttYXNraXRvXT1cImNvbXB1dGVkVGltZU1hc2soKVwiXG4gICAgICBbZGlzYWJsZWRdPVwiZGlzYWJsZWRcIlxuICAgICAgW3N0eWxlLndpZHRoLmNoXT1cInRpbWVMZW5ndGgoKVwiXG4gICAgICBbbmdNb2RlbE9wdGlvbnNdPVwieyBzdGFuZGFsb25lOiB0cnVlIH1cIlxuICAgICAgW25nTW9kZWxdPVwidG9UaW1lVmFsdWUoKVwiXG4gICAgICAobmdNb2RlbENoYW5nZSk9XCJvblRpbWVWYWx1ZUNoYW5nZSgkZXZlbnQsIEVJbnB1dFR5cGUuVElNRV9UTylcIlxuICAgICAgKGtleXVwKT1cIm9uS2V5dXAoJGV2ZW50LCBFSW5wdXRUeXBlLlRJTUVfVE8pXCJcbiAgICAgIChmb2N1cyk9XCJvbkZvY3VzKClcIlxuICAgICAgKGJsdXIpPVwib25CbHVyKClcIlxuICAgIC8+XG4gIDwvZGl2PlxuXG4gIDxkaXYgY2xhc3M9XCJ0LWNvbnRlbnRcIj5cbiAgICA8ZGl2IGNsYXNzPVwiaWNvbi13cmFwcGVyXCI+XG4gICAgICA8IS0tIHBsYWNlaG9sZGVyIGZvciBzcHJvYy1wYXJhbS1pbnZhbGlkLWljb24gLS0+XG4gICAgICA8bmctY29udGVudCAvPlxuXG4gICAgICBAaWYgKGZvcmNlQ2xlYXIoKSkge1xuICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgY2xhc3M9XCJ0LWNsZWFyXCJcbiAgICAgICAgICB0dWlJY29uQnV0dG9uXG4gICAgICAgICAgc2l6ZT1cInhzXCJcbiAgICAgICAgICBhcHBlYXJhbmNlPVwiYWN0aW9uLWdyYXlzY2FsZVwiXG4gICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgKGNsaWNrKT1cImNsZWFyKClcIlxuICAgICAgICA+XG4gICAgICAgICAg0J7Rh9C40YHRgtC40YLRjFxuICAgICAgICA8L2J1dHRvbj5cbiAgICAgIH1cbiAgICA8L2Rpdj5cblxuICAgIDx0dWktaWNvbiBjbGFzcz1cImNhbGVuZGFyXCIgW2ljb25dPVwiJ0BzcHJvYy5jYWxlbmRhci1kYXRlJ1wiPiA8L3R1aS1pY29uPlxuICA8L2Rpdj5cbjwvZGl2PlxuXG48bmctdGVtcGxhdGUgI2Ryb3Bkb3duQ29udGVudD5cbiAgPHR1aS1jYWxlbmRhci1yYW5nZVxuICAgIFt2YWx1ZV09XCJjb21wdXRlZFR1aURheVJhbmdlKClcIlxuICAgIFttaW5dPVwiY2FsZW5kYXJNaW5EYXkoKVwiXG4gICAgW21heF09XCJjYWxlbmRhck1heERheSgpXCJcbiAgICBbbWF4TGVuZ3RoXT1cIm1heExlbmd0aCgpXCJcbiAgICBbbWluTGVuZ3RoXT1cIm1pbkxlbmd0aCgpXCJcbiAgICAodmFsdWVDaGFuZ2UpPVwib25DYWxlbmRhckNoYW5nZSgkZXZlbnQpXCJcbiAgLz5cblxuICA8ZGl2IGNsYXNzPVwidGltZS1yYW5nZVwiPlxuICAgIDx0dWktdGV4dGZpZWxkXG4gICAgICB0dWlBcHBlYXJhbmNlPVwic3Byb2MtaW5wdXQtYXBwZWFyYW5jZVwiXG4gICAgICBbdHVpVGV4dGZpZWxkU2l6ZV09XCIncydcIlxuICAgICAgW3N0eWxlLndpZHRoLnB4XT1cIjI1MFwiXG4gICAgPlxuICAgICAgPGlucHV0XG4gICAgICAgIHR1aUlucHV0VGltZVxuICAgICAgICBbbW9kZV09XCJ0aW1lTW9kZSgpXCJcbiAgICAgICAgW25nTW9kZWxdPVwidGltZUZyb21cIlxuICAgICAgICAobmdNb2RlbENoYW5nZSk9XCJ1cGRhdGVUaW1lRnJvbSgkZXZlbnQpXCJcbiAgICAgIC8+XG4gICAgICA8dHVpLWljb24gY2xhc3M9XCJjbG9jay1pY29uXCIgW2ljb25dPVwiJ0B0dWkuY2xvY2snXCIgW3N0eWxlLmZvbnQtc2l6ZS5weF09XCIxNlwiIC8+XG4gICAgPC90dWktdGV4dGZpZWxkPlxuXG4gICAgPHR1aS10ZXh0ZmllbGRcbiAgICAgIHR1aUFwcGVhcmFuY2U9XCJzcHJvYy1pbnB1dC1hcHBlYXJhbmNlXCJcbiAgICAgIFt0dWlUZXh0ZmllbGRTaXplXT1cIidzJ1wiXG4gICAgICBbc3R5bGUud2lkdGgucHhdPVwiMjUwXCJcbiAgICA+XG4gICAgICA8aW5wdXRcbiAgICAgICAgdHVpSW5wdXRUaW1lXG4gICAgICAgIFttb2RlXT1cInRpbWVNb2RlKClcIlxuICAgICAgICBbbmdNb2RlbF09XCJ0aW1lVG9cIlxuICAgICAgICAobmdNb2RlbENoYW5nZSk9XCJ1cGRhdGVUaW1lVG8oJGV2ZW50KVwiXG4gICAgICAvPlxuICAgICAgPHR1aS1pY29uIGNsYXNzPVwiY2xvY2staWNvblwiIFtpY29uXT1cIidAdHVpLmNsb2NrJ1wiIFtzdHlsZS5mb250LXNpemUucHhdPVwiMTZcIiAvPlxuICAgIDwvdHVpLXRleHRmaWVsZD5cbiAgPC9kaXY+XG48L25nLXRlbXBsYXRlPlxuIl19
@@ -0,0 +1,13 @@
1
+ export const DATE_MODE = 'dd/mm/yyyy';
2
+ export const DATE_SEPARATOR = '.';
3
+ export var EInputType;
4
+ (function (EInputType) {
5
+ EInputType["DATE_FROM"] = "DATE_FROM";
6
+ EInputType["TIME_FROM"] = "TIME_FROM";
7
+ EInputType["DATE_TO"] = "DATE_TO";
8
+ EInputType["TIME_TO"] = "TIME_TO";
9
+ })(EInputType || (EInputType = {}));
10
+ export const DATE_MAX_LENGTH = 10;
11
+ export const DATE_PLACEHOLDER = '__.__.____';
12
+ export const TIME_PLACEHOLDER = '__:__';
13
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0ZS10aW1lLXJhbmdlLmNvbnN0cy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25neC1yZWdpc3Rlci1iYXNlL3NyYy9saWIvY29tcG9uZW50cy9pbnB1dHMvcGFyYW0tZGF0ZS10aW1lLXJhbmdlL2RhdGUtdGltZS1yYW5nZS9kYXRlLXRpbWUtcmFuZ2UuY29uc3RzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUVBLE1BQU0sQ0FBQyxNQUFNLFNBQVMsR0FBb0IsWUFBWSxDQUFDO0FBQ3ZELE1BQU0sQ0FBQyxNQUFNLGNBQWMsR0FBRyxHQUFHLENBQUM7QUFFbEMsTUFBTSxDQUFOLElBQVksVUFLWDtBQUxELFdBQVksVUFBVTtJQUNwQixxQ0FBdUIsQ0FBQTtJQUN2QixxQ0FBdUIsQ0FBQTtJQUN2QixpQ0FBbUIsQ0FBQTtJQUNuQixpQ0FBbUIsQ0FBQTtBQUNyQixDQUFDLEVBTFcsVUFBVSxLQUFWLFVBQVUsUUFLckI7QUFFRCxNQUFNLENBQUMsTUFBTSxlQUFlLEdBQUcsRUFBRSxDQUFDO0FBRWxDLE1BQU0sQ0FBQyxNQUFNLGdCQUFnQixHQUFHLFlBQVksQ0FBQztBQUM3QyxNQUFNLENBQUMsTUFBTSxnQkFBZ0IsR0FBRyxPQUFPLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBNYXNraXRvRGF0ZU1vZGUgfSBmcm9tICdAbWFza2l0by9raXQnO1xuXG5leHBvcnQgY29uc3QgREFURV9NT0RFOiBNYXNraXRvRGF0ZU1vZGUgPSAnZGQvbW0veXl5eSc7XG5leHBvcnQgY29uc3QgREFURV9TRVBBUkFUT1IgPSAnLic7XG5cbmV4cG9ydCBlbnVtIEVJbnB1dFR5cGUge1xuICBEQVRFX0ZST00gPSAnREFURV9GUk9NJyxcbiAgVElNRV9GUk9NID0gJ1RJTUVfRlJPTScsXG4gIERBVEVfVE8gPSAnREFURV9UTycsXG4gIFRJTUVfVE8gPSAnVElNRV9UTycsXG59XG5cbmV4cG9ydCBjb25zdCBEQVRFX01BWF9MRU5HVEggPSAxMDtcblxuZXhwb3J0IGNvbnN0IERBVEVfUExBQ0VIT0xERVIgPSAnX18uX18uX19fXyc7XG5leHBvcnQgY29uc3QgVElNRV9QTEFDRUhPTERFUiA9ICdfXzpfXyc7XG4iXX0=