@oneluiz/dual-datepicker 3.3.0 → 3.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +220 -7
- package/core/dual-date-range.store.d.ts +104 -0
- package/core/index.d.ts +7 -0
- package/core/preset.engine.d.ts +54 -0
- package/core/range.validator.d.ts +37 -0
- package/dual-datepicker.component.d.ts +29 -1
- package/esm2022/core/dual-date-range.store.mjs +293 -0
- package/esm2022/core/index.mjs +8 -0
- package/esm2022/core/preset.engine.mjs +209 -0
- package/esm2022/core/range.validator.mjs +105 -0
- package/esm2022/dual-datepicker.component.mjs +194 -9
- package/esm2022/public-api.mjs +5 -2
- package/fesm2022/oneluiz-dual-datepicker.mjs +801 -9
- package/fesm2022/oneluiz-dual-datepicker.mjs.map +1 -1
- package/package.json +2 -2
- package/public-api.d.ts +1 -0
|
@@ -0,0 +1,293 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Headless Date Range Store using Angular Signals
|
|
3
|
+
*
|
|
4
|
+
* Architecture:
|
|
5
|
+
* - State lives HERE, not in UI component
|
|
6
|
+
* - Deterministic: no hidden side effects
|
|
7
|
+
* - SSR-compatible: no window/document dependencies
|
|
8
|
+
* - Testable: pure signal-based state
|
|
9
|
+
* - Reusable: inject anywhere (services, components, guards)
|
|
10
|
+
*
|
|
11
|
+
* Usage:
|
|
12
|
+
* ```typescript
|
|
13
|
+
* // In component
|
|
14
|
+
* const rangeStore = inject(DualDateRangeStore);
|
|
15
|
+
* rangeStore.applyPreset('THIS_MONTH');
|
|
16
|
+
*
|
|
17
|
+
* // In service (headless!)
|
|
18
|
+
* const store = inject(DualDateRangeStore);
|
|
19
|
+
* const range = store.range();
|
|
20
|
+
* this.http.get(`/api/sales?start=${range.start}&end=${range.end}`);
|
|
21
|
+
* ```
|
|
22
|
+
*/
|
|
23
|
+
import { Injectable, signal, computed } from '@angular/core';
|
|
24
|
+
import { validateRangeOrder, validateRangeBounds, isDateDisabled, applyBounds, parseISODate, formatISODate } from './range.validator';
|
|
25
|
+
import { presetEngine } from './preset.engine';
|
|
26
|
+
import * as i0 from "@angular/core";
|
|
27
|
+
export class DualDateRangeStore {
|
|
28
|
+
// Configuration
|
|
29
|
+
config = signal({
|
|
30
|
+
enableTimePicker: false,
|
|
31
|
+
defaultStartTime: '00:00',
|
|
32
|
+
defaultEndTime: '23:59'
|
|
33
|
+
});
|
|
34
|
+
// Core state - using signals
|
|
35
|
+
_startDate = signal(null);
|
|
36
|
+
_endDate = signal(null);
|
|
37
|
+
_leftMonth = signal(new Date());
|
|
38
|
+
_rightMonth = signal(this.getNextMonth(new Date()));
|
|
39
|
+
_selectingStart = signal(true);
|
|
40
|
+
// Time state
|
|
41
|
+
_startTime = signal('00:00');
|
|
42
|
+
_endTime = signal('23:59');
|
|
43
|
+
// Pending state for requireApply mode
|
|
44
|
+
_pendingStart = signal(null);
|
|
45
|
+
_pendingEnd = signal(null);
|
|
46
|
+
_hasPendingChanges = signal(false);
|
|
47
|
+
// Public read-only signals
|
|
48
|
+
startDate = this._startDate.asReadonly();
|
|
49
|
+
endDate = this._endDate.asReadonly();
|
|
50
|
+
leftMonth = this._leftMonth.asReadonly();
|
|
51
|
+
rightMonth = this._rightMonth.asReadonly();
|
|
52
|
+
selectingStart = this._selectingStart.asReadonly();
|
|
53
|
+
startTime = this._startTime.asReadonly();
|
|
54
|
+
endTime = this._endTime.asReadonly();
|
|
55
|
+
hasPendingChanges = this._hasPendingChanges.asReadonly();
|
|
56
|
+
// Computed: ISO range for API consumption
|
|
57
|
+
range = computed(() => {
|
|
58
|
+
const start = this._startDate();
|
|
59
|
+
const end = this._endDate();
|
|
60
|
+
const cfg = this.config();
|
|
61
|
+
const result = {
|
|
62
|
+
start: formatISODate(start),
|
|
63
|
+
end: formatISODate(end)
|
|
64
|
+
};
|
|
65
|
+
if (cfg.enableTimePicker) {
|
|
66
|
+
result.startTime = this._startTime();
|
|
67
|
+
result.endTime = this._endTime();
|
|
68
|
+
}
|
|
69
|
+
return result;
|
|
70
|
+
});
|
|
71
|
+
// Computed: validation state
|
|
72
|
+
isValid = computed(() => {
|
|
73
|
+
const start = this._startDate();
|
|
74
|
+
const end = this._endDate();
|
|
75
|
+
const cfg = this.config();
|
|
76
|
+
const orderValidation = validateRangeOrder(start, end);
|
|
77
|
+
if (!orderValidation.valid)
|
|
78
|
+
return false;
|
|
79
|
+
const boundsValidation = validateRangeBounds(start, end, cfg.minDate, cfg.maxDate);
|
|
80
|
+
return boundsValidation.valid;
|
|
81
|
+
});
|
|
82
|
+
// Computed: range text for display
|
|
83
|
+
rangeText = computed(() => {
|
|
84
|
+
const start = this._startDate();
|
|
85
|
+
const end = this._endDate();
|
|
86
|
+
if (!start && !end)
|
|
87
|
+
return '';
|
|
88
|
+
if (!start)
|
|
89
|
+
return `? - ${this.formatDateShort(end)}`;
|
|
90
|
+
if (!end)
|
|
91
|
+
return `${this.formatDateShort(start)}`;
|
|
92
|
+
return `${this.formatDateShort(start)} - ${this.formatDateShort(end)}`;
|
|
93
|
+
});
|
|
94
|
+
/**
|
|
95
|
+
* Configure the store
|
|
96
|
+
*/
|
|
97
|
+
configure(config) {
|
|
98
|
+
this.config.update(current => ({ ...current, ...config }));
|
|
99
|
+
}
|
|
100
|
+
/**
|
|
101
|
+
* Set start date (with validation)
|
|
102
|
+
*/
|
|
103
|
+
setStart(date) {
|
|
104
|
+
const parsedDate = this.parseDate(date);
|
|
105
|
+
if (parsedDate) {
|
|
106
|
+
const cfg = this.config();
|
|
107
|
+
// Apply bounds
|
|
108
|
+
const boundedDate = applyBounds(parsedDate, cfg.minDate, cfg.maxDate);
|
|
109
|
+
// Check if disabled
|
|
110
|
+
if (isDateDisabled(boundedDate, cfg.disabledDates)) {
|
|
111
|
+
console.warn('Cannot select disabled date');
|
|
112
|
+
return;
|
|
113
|
+
}
|
|
114
|
+
this._startDate.set(boundedDate);
|
|
115
|
+
this._selectingStart.set(false);
|
|
116
|
+
// Auto-adjust end if it becomes invalid
|
|
117
|
+
const end = this._endDate();
|
|
118
|
+
if (end && end < boundedDate) {
|
|
119
|
+
this._endDate.set(null);
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
else {
|
|
123
|
+
this._startDate.set(null);
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
/**
|
|
127
|
+
* Set end date (with validation)
|
|
128
|
+
*/
|
|
129
|
+
setEnd(date) {
|
|
130
|
+
const parsedDate = this.parseDate(date);
|
|
131
|
+
if (parsedDate) {
|
|
132
|
+
const cfg = this.config();
|
|
133
|
+
// Apply bounds
|
|
134
|
+
const boundedDate = applyBounds(parsedDate, cfg.minDate, cfg.maxDate);
|
|
135
|
+
// Check if disabled
|
|
136
|
+
if (isDateDisabled(boundedDate, cfg.disabledDates)) {
|
|
137
|
+
console.warn('Cannot select disabled date');
|
|
138
|
+
return;
|
|
139
|
+
}
|
|
140
|
+
// Validate order
|
|
141
|
+
const start = this._startDate();
|
|
142
|
+
if (start && boundedDate < start) {
|
|
143
|
+
console.warn('End date cannot be before start date');
|
|
144
|
+
return;
|
|
145
|
+
}
|
|
146
|
+
this._endDate.set(boundedDate);
|
|
147
|
+
this._selectingStart.set(true); // Ready for next selection
|
|
148
|
+
}
|
|
149
|
+
else {
|
|
150
|
+
this._endDate.set(null);
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
/**
|
|
154
|
+
* Set complete range at once
|
|
155
|
+
*/
|
|
156
|
+
setRange(start, end) {
|
|
157
|
+
this.setStart(start);
|
|
158
|
+
this.setEnd(end);
|
|
159
|
+
}
|
|
160
|
+
/**
|
|
161
|
+
* Set pending selection (for requireApply mode)
|
|
162
|
+
*/
|
|
163
|
+
setPendingStart(date) {
|
|
164
|
+
const parsedDate = this.parseDate(date);
|
|
165
|
+
this._pendingStart.set(parsedDate);
|
|
166
|
+
this._hasPendingChanges.set(true);
|
|
167
|
+
}
|
|
168
|
+
setPendingEnd(date) {
|
|
169
|
+
const parsedDate = this.parseDate(date);
|
|
170
|
+
this._pendingEnd.set(parsedDate);
|
|
171
|
+
this._hasPendingChanges.set(true);
|
|
172
|
+
}
|
|
173
|
+
/**
|
|
174
|
+
* Apply pending changes
|
|
175
|
+
*/
|
|
176
|
+
applyPending() {
|
|
177
|
+
const pendingStart = this._pendingStart();
|
|
178
|
+
const pendingEnd = this._pendingEnd();
|
|
179
|
+
if (pendingStart)
|
|
180
|
+
this.setStart(pendingStart);
|
|
181
|
+
if (pendingEnd)
|
|
182
|
+
this.setEnd(pendingEnd);
|
|
183
|
+
this.clearPending();
|
|
184
|
+
}
|
|
185
|
+
/**
|
|
186
|
+
* Cancel pending changes
|
|
187
|
+
*/
|
|
188
|
+
cancelPending() {
|
|
189
|
+
this.clearPending();
|
|
190
|
+
}
|
|
191
|
+
clearPending() {
|
|
192
|
+
this._pendingStart.set(null);
|
|
193
|
+
this._pendingEnd.set(null);
|
|
194
|
+
this._hasPendingChanges.set(false);
|
|
195
|
+
}
|
|
196
|
+
/**
|
|
197
|
+
* Reset to empty state
|
|
198
|
+
*/
|
|
199
|
+
reset() {
|
|
200
|
+
this._startDate.set(null);
|
|
201
|
+
this._endDate.set(null);
|
|
202
|
+
this._selectingStart.set(true);
|
|
203
|
+
this.clearPending();
|
|
204
|
+
}
|
|
205
|
+
/**
|
|
206
|
+
* Apply a preset by key
|
|
207
|
+
*/
|
|
208
|
+
applyPreset(presetKey, now = new Date()) {
|
|
209
|
+
const range = presetEngine.resolve(presetKey, now);
|
|
210
|
+
if (range) {
|
|
211
|
+
this.setRange(range.start, range.end);
|
|
212
|
+
}
|
|
213
|
+
else {
|
|
214
|
+
console.warn(`Preset "${presetKey}" not found`);
|
|
215
|
+
}
|
|
216
|
+
}
|
|
217
|
+
/**
|
|
218
|
+
* Navigate left calendar month
|
|
219
|
+
*/
|
|
220
|
+
setLeftMonth(date) {
|
|
221
|
+
this._leftMonth.set(date);
|
|
222
|
+
// Ensure right month is always after left
|
|
223
|
+
const right = this._rightMonth();
|
|
224
|
+
if (right <= date) {
|
|
225
|
+
this._rightMonth.set(this.getNextMonth(date));
|
|
226
|
+
}
|
|
227
|
+
}
|
|
228
|
+
/**
|
|
229
|
+
* Navigate right calendar month
|
|
230
|
+
*/
|
|
231
|
+
setRightMonth(date) {
|
|
232
|
+
this._rightMonth.set(date);
|
|
233
|
+
// Ensure left month is always before right
|
|
234
|
+
const left = this._leftMonth();
|
|
235
|
+
if (left >= date) {
|
|
236
|
+
this._leftMonth.set(this.getPreviousMonth(date));
|
|
237
|
+
}
|
|
238
|
+
}
|
|
239
|
+
/**
|
|
240
|
+
* Set time values
|
|
241
|
+
*/
|
|
242
|
+
setStartTime(time) {
|
|
243
|
+
this._startTime.set(time);
|
|
244
|
+
}
|
|
245
|
+
setEndTime(time) {
|
|
246
|
+
this._endTime.set(time);
|
|
247
|
+
}
|
|
248
|
+
/**
|
|
249
|
+
* Get current state as snapshot
|
|
250
|
+
*/
|
|
251
|
+
getSnapshot() {
|
|
252
|
+
return this.range();
|
|
253
|
+
}
|
|
254
|
+
/**
|
|
255
|
+
* Load state from snapshot
|
|
256
|
+
*/
|
|
257
|
+
loadSnapshot(snapshot) {
|
|
258
|
+
this.setRange(snapshot.start, snapshot.end);
|
|
259
|
+
if (snapshot.startTime) {
|
|
260
|
+
this.setStartTime(snapshot.startTime);
|
|
261
|
+
}
|
|
262
|
+
if (snapshot.endTime) {
|
|
263
|
+
this.setEndTime(snapshot.endTime);
|
|
264
|
+
}
|
|
265
|
+
}
|
|
266
|
+
// Helper methods
|
|
267
|
+
parseDate(date) {
|
|
268
|
+
if (!date)
|
|
269
|
+
return null;
|
|
270
|
+
if (date instanceof Date)
|
|
271
|
+
return date;
|
|
272
|
+
return parseISODate(date);
|
|
273
|
+
}
|
|
274
|
+
getNextMonth(date) {
|
|
275
|
+
return new Date(date.getFullYear(), date.getMonth() + 1, 1);
|
|
276
|
+
}
|
|
277
|
+
getPreviousMonth(date) {
|
|
278
|
+
return new Date(date.getFullYear(), date.getMonth() - 1, 1);
|
|
279
|
+
}
|
|
280
|
+
formatDateShort(date) {
|
|
281
|
+
const months = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'];
|
|
282
|
+
return `${date.getDate()} ${months[date.getMonth()]}`;
|
|
283
|
+
}
|
|
284
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: DualDateRangeStore, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
|
|
285
|
+
static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: DualDateRangeStore, providedIn: 'root' });
|
|
286
|
+
}
|
|
287
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: DualDateRangeStore, decorators: [{
|
|
288
|
+
type: Injectable,
|
|
289
|
+
args: [{
|
|
290
|
+
providedIn: 'root'
|
|
291
|
+
}]
|
|
292
|
+
}] });
|
|
293
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZHVhbC1kYXRlLXJhbmdlLnN0b3JlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2NvcmUvZHVhbC1kYXRlLXJhbmdlLnN0b3JlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FxQkc7QUFFSCxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBRSxRQUFRLEVBQWtCLE1BQU0sZUFBZSxDQUFDO0FBQzdFLE9BQU8sRUFDTCxrQkFBa0IsRUFDbEIsbUJBQW1CLEVBQ25CLGNBQWMsRUFDZCxXQUFXLEVBQ1gsWUFBWSxFQUNaLGFBQWEsRUFDZCxNQUFNLG1CQUFtQixDQUFDO0FBQzNCLE9BQU8sRUFBRSxZQUFZLEVBQWUsTUFBTSxpQkFBaUIsQ0FBQzs7QUFxQjVELE1BQU0sT0FBTyxrQkFBa0I7SUFDN0IsZ0JBQWdCO0lBQ1IsTUFBTSxHQUFHLE1BQU0sQ0FBa0I7UUFDdkMsZ0JBQWdCLEVBQUUsS0FBSztRQUN2QixnQkFBZ0IsRUFBRSxPQUFPO1FBQ3pCLGNBQWMsRUFBRSxPQUFPO0tBQ3hCLENBQUMsQ0FBQztJQUVILDZCQUE2QjtJQUNyQixVQUFVLEdBQUcsTUFBTSxDQUFjLElBQUksQ0FBQyxDQUFDO0lBQ3ZDLFFBQVEsR0FBRyxNQUFNLENBQWMsSUFBSSxDQUFDLENBQUM7SUFDckMsVUFBVSxHQUFHLE1BQU0sQ0FBTyxJQUFJLElBQUksRUFBRSxDQUFDLENBQUM7SUFDdEMsV0FBVyxHQUFHLE1BQU0sQ0FBTyxJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQzFELGVBQWUsR0FBRyxNQUFNLENBQVUsSUFBSSxDQUFDLENBQUM7SUFFaEQsYUFBYTtJQUNMLFVBQVUsR0FBRyxNQUFNLENBQVMsT0FBTyxDQUFDLENBQUM7SUFDckMsUUFBUSxHQUFHLE1BQU0sQ0FBUyxPQUFPLENBQUMsQ0FBQztJQUUzQyxzQ0FBc0M7SUFDOUIsYUFB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LElBQTBCO1FBQzFDLElBQUksQ0FBQyxJQUFJO1lBQUUsT0FBTyxJQUFJLENBQUM7UUFDdkIsSUFBSSxJQUFJLFlBQVksSUFBSTtZQUFFLE9BQU8sSUFBSSxDQUFDO1FBQ3RDLE9BQU8sWUFBWSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQzVCLENBQUM7SUFFTyxZQUFZLENBQUMsSUFBVTtRQUM3QixPQUFPLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUUsRUFBRSxJQUFJLENBQUMsUUFBUSxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQzlELENBQUM7SUFFTyxnQkFBZ0IsQ0FBQyxJQUFVO1FBQ2pDLE9BQU8sSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLFdBQVcsRUFBRSxFQUFFLElBQUksQ0FBQyxRQUFRLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDOUQsQ0FBQztJQUVPLGVBQWUsQ0FBQyxJQUFVO1FBQ2hDLE1BQU0sTUFBTSxHQUFHLENBQUMsS0FBSyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxLQUFLLENBQUMsQ0FBQztRQUNwRyxPQUFPLEdBQUcsSUFBSSxDQUFDLE9BQU8sRUFBRSxJQUFJLE1BQU0sQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUMsRUFBRSxDQUFDO0lBQ3hELENBQUM7d0dBOVNVLGtCQUFrQjs0R0FBbEIsa0JBQWtCLGNBRmpCLE1BQU07OzRGQUVQLGtCQUFrQjtrQkFIOUIsVUFBVTttQkFBQztvQkFDVixVQUFVLEVBQUUsTUFBTTtpQkFDbkIiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEhlYWRsZXNzIERhdGUgUmFuZ2UgU3RvcmUgdXNpbmcgQW5ndWxhciBTaWduYWxzXG4gKiBcbiAqIEFyY2hpdGVjdHVyZTpcbiAqIC0gU3RhdGUgbGl2ZXMgSEVSRSwgbm90IGluIFVJIGNvbXBvbmVudFxuICogLSBEZXRlcm1pbmlzdGljOiBubyBoaWRkZW4gc2lkZSBlZmZlY3RzXG4gKiAtIFNTUi1jb21wYXRpYmxlOiBubyB3aW5kb3cvZG9jdW1lbnQgZGVwZW5kZW5jaWVzXG4gKiAtIFRlc3RhYmxlOiBwdXJlIHNpZ25hbC1iYXNlZCBzdGF0ZVxuICogLSBSZXVzYWJsZTogaW5qZWN0IGFueXdoZXJlIChzZXJ2aWNlcywgY29tcG9uZW50cywgZ3VhcmRzKVxuICogXG4gKiBVc2FnZTpcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIC8vIEluIGNvbXBvbmVudFxuICogY29uc3QgcmFuZ2VTdG9yZSA9IGluamVjdChEdWFsRGF0ZVJhbmdlU3RvcmUpO1xuICogcmFuZ2VTdG9yZS5hcHBseVByZXNldCgnVEhJU19NT05USCcpO1xuICogXG4gKiAvLyBJbiBzZXJ2aWNlIChoZWFkbGVzcyEpXG4gKiBjb25zdCBzdG9yZSA9IGluamVjdChEdWFsRGF0ZVJhbmdlU3RvcmUpO1xuICogY29uc3QgcmFuZ2UgPSBzdG9yZS5yYW5nZSgpO1xuICogdGhpcy5odHRwLmdldChgL2FwaS9zYWxlcz9zdGFydD0ke3JhbmdlLnN0YXJ0fSZlbmQ9JHtyYW5nZS5lbmR9YCk7XG4gKiBgYGBcbiAqL1xuXG5pbXBvcnQgeyBJbmplY3RhYmxlLCBzaWduYWwsIGNvbXB1dGVkLCBlZmZlY3QsIGluamVjdCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgXG4gIHZhbGlkYXRlUmFuZ2VPcmRlciwgXG4gIHZhbGlkYXRlUmFuZ2VCb3VuZHMsIFxuICBpc0RhdGVEaXNhYmxlZCxcbiAgYXBwbHlCb3VuZHMsXG4gIHBhcnNlSVNPRGF0ZSxcbiAgZm9ybWF0SVNPRGF0ZVxufSBmcm9tICcuL3JhbmdlLnZhbGlkYXRvcic7XG5pbXBvcnQgeyBwcmVzZXRFbmdpbmUsIFByZXNldFJhbmdlIH0gZnJvbSAnLi9wcmVzZXQuZW5naW5lJztcblxuZXhwb3J0IGludGVyZmFjZSBEYXRlUmFuZ2VTdGF0ZSB7XG4gIHN0YXJ0OiBzdHJpbmc7IC8vIElTTyBkYXRlXG4gIGVuZDogc3RyaW5nOyAvLyBJU08gZGF0ZVxuICBzdGFydFRpbWU/OiBzdHJpbmc7IC8vIEhIOm1tXG4gIGVuZFRpbWU/OiBzdHJpbmc7IC8vIEhIOm1tXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgRGF0ZVJhbmdlQ29uZmlnIHtcbiAgbWluRGF0ZT86IERhdGU7XG4gIG1heERhdGU/OiBEYXRlO1xuICBkaXNhYmxlZERhdGVzPzogRGF0ZVtdIHwgKChkYXRlOiBEYXRlKSA9PiBib29sZWFuKTtcbiAgZW5hYmxlVGltZVBpY2tlcj86IGJvb2xlYW47XG4gIGRlZmF1bHRTdGFydFRpbWU/OiBzdHJpbmc7XG4gIGRlZmF1bHRFbmRUaW1lPzogc3RyaW5nO1xufVxuXG5ASW5qZWN0YWJsZSh7XG4gIHByb3ZpZGVkSW46ICdyb290J1xufSlcbmV4cG9ydCBjbGFzcyBEdWFsRGF0ZVJhbmdlU3RvcmUge1xuICAvLyBDb25maWd1cmF0aW9uXG4gIHByaXZhdGUgY29uZmlnID0gc2lnbmFsPERhdGVSYW5nZUNvbmZpZz4oe1xuICAgIGVuYWJsZVRpbWVQaWNrZXI6IGZhbHNlLFxuICAgIGRlZmF1bHRTdGFydFRpbWU6ICcwMDowMCcsXG4gICAgZGVmYXVsdEVuZFRpbWU6ICcyMzo1OSdcbiAgfSk7XG5cbiAgLy8gQ29yZSBzdGF0ZSAtIHVzaW5nIHNpZ25hbHNcbiAgcHJpdmF0ZSBfc3RhcnREYXRlID0gc2lnbmFsPERhdGUgfCBudWxsPihudWxsKTtcbiAgcHJpdmF0ZSBfZW5kRGF0ZSA9IHNpZ25hbDxEYXRlIHwgbnVsbD4obnVsbCk7XG4gIHByaXZhdGUgX2xlZnRNb250aCA9IHNpZ25hbDxEYXRlPihuZXcgRGF0ZSgpKTtcbiAgcHJpdmF0ZSBfcmlnaHRNb250aCA9IHNpZ25hbDxEYXRlPih0aGlzLmdldE5leHRNb250aChuZXcgRGF0ZSgpKSk7XG4gIHByaXZhdGUgX3NlbGVjdGluZ1N0YXJ0ID0gc2lnbmFsPGJvb2xlYW4+KHRydWUpO1xuXG4gIC8vIFRpbWUgc3RhdGVcbiAgcHJpdmF0ZSBfc3RhcnRUaW1lID0gc2lnbmFsPHN0cmluZz4oJzAwOjAwJyk7XG4gIHByaXZhdGUgX2VuZFRpbWUgPSBzaWduYWw8c3RyaW5nPignMjM6NTknKTtcblxuICAvLyBQZW5kaW5nIHN0YXRlIGZvciByZXF1aXJlQXBwbHkgbW9kZVxuICBwcml2YXRlIF9wZW5kaW5nU3RhcnQgPSBzaWduYWw8RGF0ZSB8IG51bGw+KG51bGwpO1xuICBwcml2YXRlIF9wZW5kaW5nRW5kID0gc2lnbmFsPERhdGUgfCBudWxsPihudWxsKTtcbiAgcHJpdmF0ZSBfaGFzUGVuZGluZ0NoYW5nZXMgPSBzaWduYWw8Ym9vbGVhbj4oZmFsc2UpO1xuXG4gIC8vIFB1YmxpYyByZWFkLW9ubHkgc2lnbmFsc1xuICByZWFkb25seSBzdGFydERhdGUgPSB0aGlzLl9zdGFydERhdGUuYXNSZWFkb25seSgpO1xuICByZWFkb25seSBlbmREYXRlID0gdGhpcy5fZW5kRGF0ZS5hc1JlYWRvbmx5KCk7XG4gIHJlYWRvbmx5IGxlZnRNb250aCA9IHRoaXMuX2xlZnRNb250aC5hc1JlYWRvbmx5KCk7XG4gIHJlYWRvbmx5IHJpZ2h0TW9udGggPSB0aGlzLl9yaWdodE1vbnRoLmFzUmVhZG9ubHkoKTtcbiAgcmVhZG9ubHkgc2VsZWN0aW5nU3RhcnQgPSB0aGlzLl9zZWxlY3RpbmdTdGFydC5hc1JlYWRvbmx5KCk7XG4gIHJlYWRvbmx5IHN0YXJ0VGltZSA9IHRoaXMuX3N0YXJ0VGltZS5hc1JlYWRvbmx5KCk7XG4gIHJlYWRvbmx5IGVuZFRpbWUgPSB0aGlzLl9lbmRUaW1lLmFzUmVhZG9ubHkoKTtcbiAgcmVhZG9ubHkgaGFzUGVuZGluZ0NoYW5nZXMgPSB0aGlzLl9oYXNQZW5kaW5nQ2hhbmdlcy5hc1JlYWRvbmx5KCk7XG5cbiAgLy8gQ29tcHV0ZWQ6IElTTyByYW5nZSBmb3IgQVBJIGNvbnN1bXB0aW9uXG4gIHJlYWRvbmx5IHJhbmdlID0gY29tcHV0ZWQ8RGF0ZVJhbmdlU3RhdGU+KCgpID0+IHtcbiAgICBjb25zdCBzdGFydCA9IHRoaXMuX3N0YXJ0RGF0ZSgpO1xuICAgIGNvbnN0IGVuZCA9IHRoaXMuX2VuZERhdGUoKTtcbiAgICBjb25zdCBjZmcgPSB0aGlzLmNvbmZpZygpO1xuXG4gICAgY29uc3QgcmVzdWx0OiBEYXRlUmFuZ2VTdGF0ZSA9IHtcbiAgICAgIHN0YXJ0OiBmb3JtYXRJU09EYXRlKHN0YXJ0KSxcbiAgICAgIGVuZDogZm9ybWF0SVNPRGF0ZShlbmQpXG4gICAgfTtcblxuICAgIGlmIChjZmcuZW5hYmxlVGltZVBpY2tlcikge1xuICAgICAgcmVzdWx0LnN0YXJ0VGltZSA9IHRoaXMuX3N0YXJ0VGltZSgpO1xuICAgICAgcmVzdWx0LmVuZFRpbWUgPSB0aGlzLl9lbmRUaW1lKCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfSk7XG5cbiAgLy8gQ29tcHV0ZWQ6IHZhbGlkYXRpb24gc3RhdGVcbiAgcmVhZG9ubHkgaXNWYWxpZCA9IGNvbXB1dGVkKCgpID0+IHtcbiAgICBjb25zdCBzdGFydCA9IHRoaXMuX3N0YXJ0RGF0ZSgpO1xuICAgIGNvbnN0IGVuZCA9IHRoaXMuX2VuZERhdGUoKTtcbiAgICBjb25zdCBjZmcgPSB0aGlzLmNvbmZpZygpO1xuXG4gICAgY29uc3Qgb3JkZXJWYWxpZGF0aW9uID0gdmFsaWRhdGVSYW5nZU9yZGVyKHN0YXJ0LCBlbmQpO1xuICAgIGlmICghb3JkZXJWYWxpZGF0aW9uLnZhbGlkKSByZXR1cm4gZmFsc2U7XG5cbiAgICBjb25zdCBib3VuZHNWYWxpZGF0aW9uID0gdmFsaWRhdGVSYW5nZUJvdW5kcyhcbiAgICAgIHN0YXJ0LFxuICAgICAgZW5kLFxuICAgICAgY2ZnLm1pbkRhdGUsXG4gICAgICBjZmcubWF4RGF0ZVxuICAgICk7XG4gICAgcmV0dXJuIGJvdW5kc1ZhbGlkYXRpb24udmFsaWQ7XG4gIH0pO1xuXG4gIC8vIENvbXB1dGVkOiByYW5nZSB0ZXh0IGZvciBkaXNwbGF5XG4gIHJlYWRvbmx5IHJhbmdlVGV4dCA9IGNvbXB1dGVkKCgpID0+IHtcbiAgICBjb25zdCBzdGFydCA9IHRoaXMuX3N0YXJ0RGF0ZSgpO1xuICAgIGNvbnN0IGVuZCA9IHRoaXMuX2VuZERhdGUoKTtcblxuICAgIGlmICghc3RhcnQgJiYgIWVuZCkgcmV0dXJuICcnO1xuICAgIGlmICghc3RhcnQpIHJldHVybiBgPyAtICR7dGhpcy5mb3JtYXREYXRlU2hvcnQoZW5kISl9YDtcbiAgICBpZiAoIWVuZCkgcmV0dXJuIGAke3RoaXMuZm9ybWF0RGF0ZVNob3J0KHN0YXJ0KX1gO1xuXG4gICAgcmV0dXJuIGAke3RoaXMuZm9ybWF0RGF0ZVNob3J0KHN0YXJ0KX0gLSAke3RoaXMuZm9ybWF0RGF0ZVNob3J0KGVuZCl9YDtcbiAgfSk7XG5cbiAgLyoqXG4gICAqIENvbmZpZ3VyZSB0aGUgc3RvcmVcbiAgICovXG4gIGNvbmZpZ3VyZShjb25maWc6IFBhcnRpYWw8RGF0ZVJhbmdlQ29uZmlnPik6IHZvaWQge1xuICAgIHRoaXMuY29uZmlnLnVwZGF0ZShjdXJyZW50ID0+ICh7IC4uLmN1cnJlbnQsIC4uLmNvbmZpZyB9KSk7XG4gIH1cblxuICAvKipcbiAgICogU2V0IHN0YXJ0IGRhdGUgKHdpdGggdmFsaWRhdGlvbilcbiAgICovXG4gIHNldFN0YXJ0KGRhdGU6IERhdGUgfCBzdHJpbmcgfCBudWxsKTogdm9pZCB7XG4gICAgY29uc3QgcGFyc2VkRGF0ZSA9IHRoaXMucGFyc2VEYXRlKGRhdGUpO1xuICAgIFxuICAgIGlmIChwYXJzZWREYXRlKSB7XG4gICAgICBjb25zdCBjZmcgPSB0aGlzLmNvbmZpZygpO1xuICAgICAgXG4gICAgICAvLyBBcHBseSBib3VuZHNcbiAgICAgIGNvbnN0IGJvdW5kZWREYXRlID0gYXBwbHlCb3VuZHMocGFyc2VkRGF0ZSwgY2ZnLm1pbkRhdGUsIGNmZy5tYXhEYXRlKTtcbiAgICAgIFxuICAgICAgLy8gQ2hlY2sgaWYgZGlzYWJsZWRcbiAgICAgIGlmIChpc0RhdGVEaXNhYmxlZChib3VuZGVkRGF0ZSwgY2ZnLmRpc2FibGVkRGF0ZXMpKSB7XG4gICAgICAgIGNvbnNvbGUud2FybignQ2Fubm90IHNlbGVjdCBkaXNhYmxlZCBkYXRlJyk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgdGhpcy5fc3RhcnREYXRlLnNldChib3VuZGVkRGF0ZSk7XG4gICAgICB0aGlzLl9zZWxlY3RpbmdTdGFydC5zZXQoZmFsc2UpO1xuXG4gICAgICAvLyBBdXRvLWFkanVzdCBlbmQgaWYgaXQgYmVjb21lcyBpbnZhbGlkXG4gICAgICBjb25zdCBlbmQgPSB0aGlzLl9lbmREYXRlKCk7XG4gICAgICBpZiAoZW5kICYmIGVuZCA8IGJvdW5kZWREYXRlKSB7XG4gICAgICAgIHRoaXMuX2VuZERhdGUuc2V0KG51bGwpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLl9zdGFydERhdGUuc2V0KG51bGwpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBTZXQgZW5kIGRhdGUgKHdpdGggdmFsaWRhdGlvbilcbiAgICovXG4gIHNldEVuZChkYXRlOiBEYXRlIHwgc3RyaW5nIHwgbnVsbCk6IHZvaWQge1xuICAgIGNvbnN0IHBhcnNlZERhdGUgPSB0aGlzLnBhcnNlRGF0ZShkYXRlKTtcbiAgICBcbiAgICBpZiAocGFyc2VkRGF0ZSkge1xuICAgICAgY29uc3QgY2ZnID0gdGhpcy5jb25maWcoKTtcbiAgICAgIFxuICAgICAgLy8gQXBwbHkgYm91bmRzXG4gICAgICBjb25zdCBib3VuZGVkRGF0ZSA9IGFwcGx5Qm91bmRzKHBhcnNlZERhdGUsIGNmZy5taW5EYXRlLCBjZmcubWF4RGF0ZSk7XG4gICAgICBcbiAgICAgIC8vIENoZWNrIGlmIGRpc2FibGVkXG4gICAgICBpZiAoaXNEYXRlRGlzYWJsZWQoYm91bmRlZERhdGUsIGNmZy5kaXNhYmxlZERhdGVzKSkge1xuICAgICAgICBjb25zb2xlLndhcm4oJ0Nhbm5vdCBzZWxlY3QgZGlzYWJsZWQgZGF0ZScpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIC8vIFZhbGlkYXRlIG9yZGVyXG4gICAgICBjb25zdCBzdGFydCA9IHRoaXMuX3N0YXJ0RGF0ZSgpO1xuICAgICAgaWYgKHN0YXJ0ICYmIGJvdW5kZWREYXRlIDwgc3RhcnQpIHtcbiAgICAgICAgY29uc29sZS53YXJuKCdFbmQgZGF0ZSBjYW5ub3QgYmUgYmVmb3JlIHN0YXJ0IGRhdGUnKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICB0aGlzLl9lbmREYXRlLnNldChib3VuZGVkRGF0ZSk7XG4gICAgICB0aGlzLl9zZWxlY3RpbmdTdGFydC5zZXQodHJ1ZSk7IC8vIFJlYWR5IGZvciBuZXh0IHNlbGVjdGlvblxuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLl9lbmREYXRlLnNldChudWxsKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogU2V0IGNvbXBsZXRlIHJhbmdlIGF0IG9uY2VcbiAgICovXG4gIHNldFJhbmdlKHN0YXJ0OiBEYXRlIHwgc3RyaW5nIHwgbnVsbCwgZW5kOiBEYXRlIHwgc3RyaW5nIHwgbnVsbCk6IHZvaWQge1xuICAgIHRoaXMuc2V0U3RhcnQoc3RhcnQpO1xuICAgIHRoaXMuc2V0RW5kKGVuZCk7XG4gIH1cblxuICAvKipcbiAgICogU2V0IHBlbmRpbmcgc2VsZWN0aW9uIChmb3IgcmVxdWlyZUFwcGx5IG1vZGUpXG4gICAqL1xuICBzZXRQZW5kaW5nU3RhcnQoZGF0ZTogRGF0ZSB8IHN0cmluZyB8IG51bGwpOiB2b2lkIHtcbiAgICBjb25zdCBwYXJzZWREYXRlID0gdGhpcy5wYXJzZURhdGUoZGF0ZSk7XG4gICAgdGhpcy5fcGVuZGluZ1N0YXJ0LnNldChwYXJzZWREYXRlKTtcbiAgICB0aGlzLl9oYXNQZW5kaW5nQ2hhbmdlcy5zZXQodHJ1ZSk7XG4gIH1cblxuICBzZXRQZW5kaW5nRW5kKGRhdGU6IERhdGUgfCBzdHJpbmcgfCBudWxsKTogdm9pZCB7XG4gICAgY29uc3QgcGFyc2VkRGF0ZSA9IHRoaXMucGFyc2VEYXRlKGRhdGUpO1xuICAgIHRoaXMuX3BlbmRpbmdFbmQuc2V0KHBhcnNlZERhdGUpO1xuICAgIHRoaXMuX2hhc1BlbmRpbmdDaGFuZ2VzLnNldCh0cnVlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBcHBseSBwZW5kaW5nIGNoYW5nZXNcbiAgICovXG4gIGFwcGx5UGVuZGluZygpOiB2b2lkIHtcbiAgICBjb25zdCBwZW5kaW5nU3RhcnQgPSB0aGlzLl9wZW5kaW5nU3RhcnQoKTtcbiAgICBjb25zdCBwZW5kaW5nRW5kID0gdGhpcy5fcGVuZGluZ0VuZCgpO1xuXG4gICAgaWYgKHBlbmRpbmdTdGFydCkgdGhpcy5zZXRTdGFydChwZW5kaW5nU3RhcnQpO1xuICAgIGlmIChwZW5kaW5nRW5kKSB0aGlzLnNldEVuZChwZW5kaW5nRW5kKTtcblxuICAgIHRoaXMuY2xlYXJQZW5kaW5nKCk7XG4gIH1cblxuICAvKipcbiAgICogQ2FuY2VsIHBlbmRpbmcgY2hhbmdlc1xuICAgKi9cbiAgY2FuY2VsUGVuZGluZygpOiB2b2lkIHtcbiAgICB0aGlzLmNsZWFyUGVuZGluZygpO1xuICB9XG5cbiAgcHJpdmF0ZSBjbGVhclBlbmRpbmcoKTogdm9pZCB7XG4gICAgdGhpcy5fcGVuZGluZ1N0YXJ0LnNldChudWxsKTtcbiAgICB0aGlzLl9wZW5kaW5nRW5kLnNldChudWxsKTtcbiAgICB0aGlzLl9oYXNQZW5kaW5nQ2hhbmdlcy5zZXQoZmFsc2UpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlc2V0IHRvIGVtcHR5IHN0YXRlXG4gICAqL1xuICByZXNldCgpOiB2b2lkIHtcbiAgICB0aGlzLl9zdGFydERhdGUuc2V0KG51bGwpO1xuICAgIHRoaXMuX2VuZERhdGUuc2V0KG51bGwpO1xuICAgIHRoaXMuX3NlbGVjdGluZ1N0YXJ0LnNldCh0cnVlKTtcbiAgICB0aGlzLmNsZWFyUGVuZGluZygpO1xuICB9XG5cbiAgLyoqXG4gICAqIEFwcGx5IGEgcHJlc2V0IGJ5IGtleVxuICAgKi9cbiAgYXBwbHlQcmVzZXQocHJlc2V0S2V5OiBzdHJpbmcsIG5vdzogRGF0ZSA9IG5ldyBEYXRlKCkpOiB2b2lkIHtcbiAgICBjb25zdCByYW5nZSA9IHByZXNldEVuZ2luZS5yZXNvbHZlKHByZXNldEtleSwgbm93KTtcbiAgICBcbiAgICBpZiAocmFuZ2UpIHtcbiAgICAgIHRoaXMuc2V0UmFuZ2UocmFuZ2Uuc3RhcnQsIHJhbmdlLmVuZCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnNvbGUud2FybihgUHJlc2V0IFwiJHtwcmVzZXRLZXl9XCIgbm90IGZvdW5kYCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIE5hdmlnYXRlIGxlZnQgY2FsZW5kYXIgbW9udGhcbiAgICovXG4gIHNldExlZnRNb250aChkYXRlOiBEYXRlKTogdm9pZCB7XG4gICAgdGhpcy5fbGVmdE1vbnRoLnNldChkYXRlKTtcbiAgICBcbiAgICAvLyBFbnN1cmUgcmlnaHQgbW9udGggaXMgYWx3YXlzIGFmdGVyIGxlZnRcbiAgICBjb25zdCByaWdodCA9IHRoaXMuX3JpZ2h0TW9udGgoKTtcbiAgICBpZiAocmlnaHQgPD0gZGF0ZSkge1xuICAgICAgdGhpcy5fcmlnaHRNb250aC5zZXQodGhpcy5nZXROZXh0TW9udGgoZGF0ZSkpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBOYXZpZ2F0ZSByaWdodCBjYWxlbmRhciBtb250aFxuICAgKi9cbiAgc2V0UmlnaHRNb250aChkYXRlOiBEYXRlKTogdm9pZCB7XG4gICAgdGhpcy5fcmlnaHRNb250aC5zZXQoZGF0ZSk7XG4gICAgXG4gICAgLy8gRW5zdXJlIGxlZnQgbW9udGggaXMgYWx3YXlzIGJlZm9yZSByaWdodFxuICAgIGNvbnN0IGxlZnQgPSB0aGlzLl9sZWZ0TW9udGgoKTtcbiAgICBpZiAobGVmdCA+PSBkYXRlKSB7XG4gICAgICB0aGlzLl9sZWZ0TW9udGguc2V0KHRoaXMuZ2V0UHJldmlvdXNNb250aChkYXRlKSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFNldCB0aW1lIHZhbHVlc1xuICAgKi9cbiAgc2V0U3RhcnRUaW1lKHRpbWU6IHN0cmluZyk6IHZvaWQge1xuICAgIHRoaXMuX3N0YXJ0VGltZS5zZXQodGltZSk7XG4gIH1cblxuICBzZXRFbmRUaW1lKHRpbWU6IHN0cmluZyk6IHZvaWQge1xuICAgIHRoaXMuX2VuZFRpbWUuc2V0KHRpbWUpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBjdXJyZW50IHN0YXRlIGFzIHNuYXBzaG90XG4gICAqL1xuICBnZXRTbmFwc2hvdCgpOiBEYXRlUmFuZ2VTdGF0ZSB7XG4gICAgcmV0dXJuIHRoaXMucmFuZ2UoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBMb2FkIHN0YXRlIGZyb20gc25hcHNob3RcbiAgICovXG4gIGxvYWRTbmFwc2hvdChzbmFwc2hvdDogRGF0ZVJhbmdlU3RhdGUpOiB2b2lkIHtcbiAgICB0aGlzLnNldFJhbmdlKHNuYXBzaG90LnN0YXJ0LCBzbmFwc2hvdC5lbmQpO1xuICAgIFxuICAgIGlmIChzbmFwc2hvdC5zdGFydFRpbWUpIHtcbiAgICAgIHRoaXMuc2V0U3RhcnRUaW1lKHNuYXBzaG90LnN0YXJ0VGltZSk7XG4gICAgfVxuICAgIFxuICAgIGlmIChzbmFwc2hvdC5lbmRUaW1lKSB7XG4gICAgICB0aGlzLnNldEVuZFRpbWUoc25hcHNob3QuZW5kVGltZSk7XG4gICAgfVxuICB9XG5cbiAgLy8gSGVscGVyIG1ldGhvZHNcbiAgcHJpdmF0ZSBwYXJzZURhdGUoZGF0ZTogRGF0ZSB8IHN0cmluZyB8IG51bGwpOiBEYXRlIHwgbnVsbCB7XG4gICAgaWYgKCFkYXRlKSByZXR1cm4gbnVsbDtcbiAgICBpZiAoZGF0ZSBpbnN0YW5jZW9mIERhdGUpIHJldHVybiBkYXRlO1xuICAgIHJldHVybiBwYXJzZUlTT0RhdGUoZGF0ZSk7XG4gIH1cblxuICBwcml2YXRlIGdldE5leHRNb250aChkYXRlOiBEYXRlKTogRGF0ZSB7XG4gICAgcmV0dXJuIG5ldyBEYXRlKGRhdGUuZ2V0RnVsbFllYXIoKSwgZGF0ZS5nZXRNb250aCgpICsgMSwgMSk7XG4gIH1cblxuICBwcml2YXRlIGdldFByZXZpb3VzTW9udGgoZGF0ZTogRGF0ZSk6IERhdGUge1xuICAgIHJldHVybiBuZXcgRGF0ZShkYXRlLmdldEZ1bGxZZWFyKCksIGRhdGUuZ2V0TW9udGgoKSAtIDEsIDEpO1xuICB9XG5cbiAgcHJpdmF0ZSBmb3JtYXREYXRlU2hvcnQoZGF0ZTogRGF0ZSk6IHN0cmluZyB7XG4gICAgY29uc3QgbW9udGhzID0gWydKYW4nLCAnRmViJywgJ01hcicsICdBcHInLCAnTWF5JywgJ0p1bicsICdKdWwnLCAnQXVnJywgJ1NlcCcsICdPY3QnLCAnTm92JywgJ0RlYyddO1xuICAgIHJldHVybiBgJHtkYXRlLmdldERhdGUoKX0gJHttb250aHNbZGF0ZS5nZXRNb250aCgpXX1gO1xuICB9XG59XG4iXX0=
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Core headless date range logic
|
|
3
|
+
* Import from here for clean barrel exports
|
|
4
|
+
*/
|
|
5
|
+
export * from './dual-date-range.store';
|
|
6
|
+
export * from './preset.engine';
|
|
7
|
+
export * from './range.validator';
|
|
8
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvY29yZS9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7O0dBR0c7QUFFSCxjQUFjLHlCQUF5QixDQUFDO0FBQ3hDLGNBQWMsaUJBQWlCLENBQUM7QUFDaEMsY0FBYyxtQkFBbUIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQ29yZSBoZWFkbGVzcyBkYXRlIHJhbmdlIGxvZ2ljXG4gKiBJbXBvcnQgZnJvbSBoZXJlIGZvciBjbGVhbiBiYXJyZWwgZXhwb3J0c1xuICovXG5cbmV4cG9ydCAqIGZyb20gJy4vZHVhbC1kYXRlLXJhbmdlLnN0b3JlJztcbmV4cG9ydCAqIGZyb20gJy4vcHJlc2V0LmVuZ2luZSc7XG5leHBvcnQgKiBmcm9tICcuL3JhbmdlLnZhbGlkYXRvcic7XG4iXX0=
|
|
@@ -0,0 +1,209 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Headless Preset Engine
|
|
3
|
+
* Pure functions that resolve date ranges WITHOUT render dependency
|
|
4
|
+
* Perfect for SSR, global state, dashboard filters
|
|
5
|
+
*/
|
|
6
|
+
import { formatISODate } from './range.validator';
|
|
7
|
+
/**
|
|
8
|
+
* Registry of built-in presets
|
|
9
|
+
* Can be extended by consumers
|
|
10
|
+
*/
|
|
11
|
+
export class PresetEngine {
|
|
12
|
+
presets = new Map();
|
|
13
|
+
constructor() {
|
|
14
|
+
this.registerBuiltInPresets();
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Register a custom preset
|
|
18
|
+
*/
|
|
19
|
+
register(key, preset) {
|
|
20
|
+
this.presets.set(key, preset);
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Resolve a preset to date range
|
|
24
|
+
*/
|
|
25
|
+
resolve(key, now = new Date()) {
|
|
26
|
+
const preset = this.presets.get(key);
|
|
27
|
+
if (!preset)
|
|
28
|
+
return null;
|
|
29
|
+
const { start, end } = preset.resolve(now);
|
|
30
|
+
return {
|
|
31
|
+
start: formatISODate(start),
|
|
32
|
+
end: formatISODate(end)
|
|
33
|
+
};
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Get all available preset keys
|
|
37
|
+
*/
|
|
38
|
+
getPresetKeys() {
|
|
39
|
+
return Array.from(this.presets.keys());
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Register all built-in presets
|
|
43
|
+
*/
|
|
44
|
+
registerBuiltInPresets() {
|
|
45
|
+
// Today
|
|
46
|
+
this.register('TODAY', {
|
|
47
|
+
resolve: (now) => ({ start: now, end: now })
|
|
48
|
+
});
|
|
49
|
+
// Yesterday
|
|
50
|
+
this.register('YESTERDAY', {
|
|
51
|
+
resolve: (now) => {
|
|
52
|
+
const date = new Date(now);
|
|
53
|
+
date.setDate(date.getDate() - 1);
|
|
54
|
+
return { start: date, end: date };
|
|
55
|
+
}
|
|
56
|
+
});
|
|
57
|
+
// Last N Days
|
|
58
|
+
this.register('LAST_7_DAYS', {
|
|
59
|
+
resolve: (now) => {
|
|
60
|
+
const end = new Date(now);
|
|
61
|
+
const start = new Date(now);
|
|
62
|
+
start.setDate(start.getDate() - 6);
|
|
63
|
+
return { start, end };
|
|
64
|
+
}
|
|
65
|
+
});
|
|
66
|
+
this.register('LAST_14_DAYS', {
|
|
67
|
+
resolve: (now) => {
|
|
68
|
+
const end = new Date(now);
|
|
69
|
+
const start = new Date(now);
|
|
70
|
+
start.setDate(start.getDate() - 13);
|
|
71
|
+
return { start, end };
|
|
72
|
+
}
|
|
73
|
+
});
|
|
74
|
+
this.register('LAST_30_DAYS', {
|
|
75
|
+
resolve: (now) => {
|
|
76
|
+
const end = new Date(now);
|
|
77
|
+
const start = new Date(now);
|
|
78
|
+
start.setDate(start.getDate() - 29);
|
|
79
|
+
return { start, end };
|
|
80
|
+
}
|
|
81
|
+
});
|
|
82
|
+
this.register('LAST_60_DAYS', {
|
|
83
|
+
resolve: (now) => {
|
|
84
|
+
const end = new Date(now);
|
|
85
|
+
const start = new Date(now);
|
|
86
|
+
start.setDate(start.getDate() - 59);
|
|
87
|
+
return { start, end };
|
|
88
|
+
}
|
|
89
|
+
});
|
|
90
|
+
this.register('LAST_90_DAYS', {
|
|
91
|
+
resolve: (now) => {
|
|
92
|
+
const end = new Date(now);
|
|
93
|
+
const start = new Date(now);
|
|
94
|
+
start.setDate(start.getDate() - 89);
|
|
95
|
+
return { start, end };
|
|
96
|
+
}
|
|
97
|
+
});
|
|
98
|
+
// This Week (Monday to Sunday)
|
|
99
|
+
this.register('THIS_WEEK', {
|
|
100
|
+
resolve: (now) => {
|
|
101
|
+
const dayOfWeek = now.getDay();
|
|
102
|
+
const start = new Date(now);
|
|
103
|
+
const daysToMonday = dayOfWeek === 0 ? 6 : dayOfWeek - 1;
|
|
104
|
+
start.setDate(start.getDate() - daysToMonday);
|
|
105
|
+
const end = new Date(start);
|
|
106
|
+
end.setDate(end.getDate() + 6);
|
|
107
|
+
return { start, end };
|
|
108
|
+
}
|
|
109
|
+
});
|
|
110
|
+
// Last Week
|
|
111
|
+
this.register('LAST_WEEK', {
|
|
112
|
+
resolve: (now) => {
|
|
113
|
+
const dayOfWeek = now.getDay();
|
|
114
|
+
const daysToMonday = dayOfWeek === 0 ? 6 : dayOfWeek - 1;
|
|
115
|
+
const lastMonday = new Date(now);
|
|
116
|
+
lastMonday.setDate(lastMonday.getDate() - daysToMonday - 7);
|
|
117
|
+
const lastSunday = new Date(lastMonday);
|
|
118
|
+
lastSunday.setDate(lastSunday.getDate() + 6);
|
|
119
|
+
return { start: lastMonday, end: lastSunday };
|
|
120
|
+
}
|
|
121
|
+
});
|
|
122
|
+
// This Month
|
|
123
|
+
this.register('THIS_MONTH', {
|
|
124
|
+
resolve: (now) => {
|
|
125
|
+
const start = new Date(now.getFullYear(), now.getMonth(), 1);
|
|
126
|
+
const end = new Date(now.getFullYear(), now.getMonth() + 1, 0);
|
|
127
|
+
return { start, end };
|
|
128
|
+
}
|
|
129
|
+
});
|
|
130
|
+
// Last Month
|
|
131
|
+
this.register('LAST_MONTH', {
|
|
132
|
+
resolve: (now) => {
|
|
133
|
+
const start = new Date(now.getFullYear(), now.getMonth() - 1, 1);
|
|
134
|
+
const end = new Date(now.getFullYear(), now.getMonth(), 0);
|
|
135
|
+
return { start, end };
|
|
136
|
+
}
|
|
137
|
+
});
|
|
138
|
+
// Month to Date
|
|
139
|
+
this.register('MONTH_TO_DATE', {
|
|
140
|
+
resolve: (now) => {
|
|
141
|
+
const start = new Date(now.getFullYear(), now.getMonth(), 1);
|
|
142
|
+
return { start, end: now };
|
|
143
|
+
}
|
|
144
|
+
});
|
|
145
|
+
// This Quarter
|
|
146
|
+
this.register('THIS_QUARTER', {
|
|
147
|
+
resolve: (now) => {
|
|
148
|
+
const currentMonth = now.getMonth();
|
|
149
|
+
const quarterStartMonth = Math.floor(currentMonth / 3) * 3;
|
|
150
|
+
const start = new Date(now.getFullYear(), quarterStartMonth, 1);
|
|
151
|
+
const end = new Date(now.getFullYear(), quarterStartMonth + 3, 0);
|
|
152
|
+
return { start, end };
|
|
153
|
+
}
|
|
154
|
+
});
|
|
155
|
+
// Last Quarter
|
|
156
|
+
this.register('LAST_QUARTER', {
|
|
157
|
+
resolve: (now) => {
|
|
158
|
+
const currentMonth = now.getMonth();
|
|
159
|
+
const lastQuarterStartMonth = Math.floor(currentMonth / 3) * 3 - 3;
|
|
160
|
+
const start = new Date(now.getFullYear(), lastQuarterStartMonth, 1);
|
|
161
|
+
const end = new Date(now.getFullYear(), lastQuarterStartMonth + 3, 0);
|
|
162
|
+
return { start, end };
|
|
163
|
+
}
|
|
164
|
+
});
|
|
165
|
+
// Quarter to Date
|
|
166
|
+
this.register('QUARTER_TO_DATE', {
|
|
167
|
+
resolve: (now) => {
|
|
168
|
+
const currentMonth = now.getMonth();
|
|
169
|
+
const quarterStartMonth = Math.floor(currentMonth / 3) * 3;
|
|
170
|
+
const start = new Date(now.getFullYear(), quarterStartMonth, 1);
|
|
171
|
+
return { start, end: now };
|
|
172
|
+
}
|
|
173
|
+
});
|
|
174
|
+
// This Year
|
|
175
|
+
this.register('THIS_YEAR', {
|
|
176
|
+
resolve: (now) => {
|
|
177
|
+
const start = new Date(now.getFullYear(), 0, 1);
|
|
178
|
+
const end = new Date(now.getFullYear(), 11, 31);
|
|
179
|
+
return { start, end };
|
|
180
|
+
}
|
|
181
|
+
});
|
|
182
|
+
// Last Year
|
|
183
|
+
this.register('LAST_YEAR', {
|
|
184
|
+
resolve: (now) => {
|
|
185
|
+
const start = new Date(now.getFullYear() - 1, 0, 1);
|
|
186
|
+
const end = new Date(now.getFullYear() - 1, 11, 31);
|
|
187
|
+
return { start, end };
|
|
188
|
+
}
|
|
189
|
+
});
|
|
190
|
+
// Year to Date
|
|
191
|
+
this.register('YEAR_TO_DATE', {
|
|
192
|
+
resolve: (now) => {
|
|
193
|
+
const start = new Date(now.getFullYear(), 0, 1);
|
|
194
|
+
return { start, end: now };
|
|
195
|
+
}
|
|
196
|
+
});
|
|
197
|
+
}
|
|
198
|
+
}
|
|
199
|
+
/**
|
|
200
|
+
* Create a custom preset from a function
|
|
201
|
+
*/
|
|
202
|
+
export function createPreset(resolver) {
|
|
203
|
+
return { resolve: resolver };
|
|
204
|
+
}
|
|
205
|
+
/**
|
|
206
|
+
* Singleton preset engine instance
|
|
207
|
+
*/
|
|
208
|
+
export const presetEngine = new PresetEngine();
|
|
209
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJlc2V0LmVuZ2luZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9jb3JlL3ByZXNldC5lbmdpbmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7R0FJRztBQUVILE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQWVsRDs7O0dBR0c7QUFDSCxNQUFNLE9BQU8sWUFBWTtJQUNmLE9BQU8sR0FBRyxJQUFJLEdBQUcsRUFBdUIsQ0FBQztJQUVqRDtRQUNFLElBQUksQ0FBQyxzQkFBc0IsRUFBRSxDQUFDO0lBQ2hDLENBQUM7SUFFRDs7T0FFRztJQUNILFFBQVEsQ0FBQyxHQUFXLEVBQUUsTUFBbUI7UUFDdkMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLE1BQU0sQ0FBQyxDQUFDO0lBQ2hDLENBQUM7SUFFRDs7T0FFRztJQUNILE9BQU8sQ0FBQyxHQUFXLEVBQUUsTUFBWSxJQUFJLElBQUksRUFBRTtRQUN6QyxNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUNyQyxJQUFJLENBQUMsTUFBTTtZQUFFLE9BQU8sSUFBSSxDQUFDO1FBRXpCLE1BQU0sRUFBRSxLQUFLLEVBQUUsR0FBRyxFQUFFLEdBQUcsTUFBTSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUMzQyxPQUFPO1lBQ0wsS0FBSyxFQUFFLGFBQWEsQ0FBQyxLQUFLLENBQUM7WUFDM0IsR0FBRyxFQUFFLGFBQWEsQ0FBQyxHQUFHLENBQUM7U0FDeEIsQ0FBQztJQUNKLENBQUM7SUFFRDs7T0FFRztJQUNILGFBQWE7UUFDWCxPQUFPLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDO0lBQ3pDLENBQUM7SUFFRDs7T0FFRztJQUNLLHNCQUFzQjtRQUM1QixRQUFRO1FBQ1IsSUFB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Q0gsTUFBTSxVQUFVLFlBQVksQ0FDMUIsUUFBbUQ7SUFFbkQsT0FBTyxFQUFFLE9BQU8sRUFBRSxRQUFRLEVBQUUsQ0FBQztBQUMvQixDQUFDO0FBRUQ7O0dBRUc7QUFDSCxNQUFNLENBQUMsTUFBTSxZQUFZLEdBQUcsSUFBSSxZQUFZLEVBQUUsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogSGVhZGxlc3MgUHJlc2V0IEVuZ2luZVxuICogUHVyZSBmdW5jdGlvbnMgdGhhdCByZXNvbHZlIGRhdGUgcmFuZ2VzIFdJVEhPVVQgcmVuZGVyIGRlcGVuZGVuY3lcbiAqIFBlcmZlY3QgZm9yIFNTUiwgZ2xvYmFsIHN0YXRlLCBkYXNoYm9hcmQgZmlsdGVyc1xuICovXG5cbmltcG9ydCB7IGZvcm1hdElTT0RhdGUgfSBmcm9tICcuL3JhbmdlLnZhbGlkYXRvcic7XG5cbmV4cG9ydCBpbnRlcmZhY2UgUmFuZ2VQcmVzZXQge1xuICAvKipcbiAgICogUmVzb2x2ZSBwcmVzZXQgdG8gYWN0dWFsIGRhdGUgcmFuZ2VcbiAgICogQHBhcmFtIG5vdyAtIEN1cnJlbnQgZGF0ZSBmb3IgZGV0ZXJtaW5pc3RpYyBjYWxjdWxhdGlvblxuICAgKi9cbiAgcmVzb2x2ZShub3c6IERhdGUpOiB7IHN0YXJ0OiBEYXRlOyBlbmQ6IERhdGUgfTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBQcmVzZXRSYW5nZSB7XG4gIHN0YXJ0OiBzdHJpbmc7IC8vIElTTyBmb3JtYXRcbiAgZW5kOiBzdHJpbmc7IC8vIElTTyBmb3JtYXRcbn1cblxuLyoqXG4gKiBSZWdpc3RyeSBvZiBidWlsdC1pbiBwcmVzZXRzXG4gKiBDYW4gYmUgZXh0ZW5kZWQgYnkgY29uc3VtZXJzXG4gKi9cbmV4cG9ydCBjbGFzcyBQcmVzZXRFbmdpbmUge1xuICBwcml2YXRlIHByZXNldHMgPSBuZXcgTWFwPHN0cmluZywgUmFuZ2VQcmVzZXQ+KCk7XG5cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgdGhpcy5yZWdpc3RlckJ1aWx0SW5QcmVzZXRzKCk7XG4gIH1cblxuICAvKipcbiAgICogUmVnaXN0ZXIgYSBjdXN0b20gcHJlc2V0XG4gICAqL1xuICByZWdpc3RlcihrZXk6IHN0cmluZywgcHJlc2V0OiBSYW5nZVByZXNldCk6IHZvaWQge1xuICAgIHRoaXMucHJlc2V0cy5zZXQoa2V5LCBwcmVzZXQpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlc29sdmUgYSBwcmVzZXQgdG8gZGF0ZSByYW5nZVxuICAgKi9cbiAgcmVzb2x2ZShrZXk6IHN0cmluZywgbm93OiBEYXRlID0gbmV3IERhdGUoKSk6IFByZXNldFJhbmdlIHwgbnVsbCB7XG4gICAgY29uc3QgcHJlc2V0ID0gdGhpcy5wcmVzZXRzLmdldChrZXkpO1xuICAgIGlmICghcHJlc2V0KSByZXR1cm4gbnVsbDtcblxuICAgIGNvbnN0IHsgc3RhcnQsIGVuZCB9ID0gcHJlc2V0LnJlc29sdmUobm93KTtcbiAgICByZXR1cm4ge1xuICAgICAgc3RhcnQ6IGZvcm1hdElTT0RhdGUoc3RhcnQpLFxuICAgICAgZW5kOiBmb3JtYXRJU09EYXRlKGVuZClcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBhbGwgYXZhaWxhYmxlIHByZXNldCBrZXlzXG4gICAqL1xuICBnZXRQcmVzZXRLZXlzKCk6IHN0cmluZ1tdIHtcbiAgICByZXR1cm4gQXJyYXkuZnJvbSh0aGlzLnByZXNldHMua2V5cygpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWdpc3RlciBhbGwgYnVpbHQtaW4gcHJlc2V0c1xuICAgKi9cbiAgcHJpdmF0ZSByZWdpc3RlckJ1aWx0SW5QcmVzZXRzKCk6IHZvaWQge1xuICAgIC8vIFRvZGF5XG4gICAgdGhpcy5yZWdpc3RlcignVE9EQVknLCB7XG4gICAgICByZXNvbHZlOiAobm93KSA9PiAoeyBzdGFydDogbm93LCBlbmQ6IG5vdyB9KVxuICAgIH0pO1xuXG4gICAgLy8gWWVzdGVyZGF5XG4gICAgdGhpcy5yZWdpc3RlcignWUVTVEVSREFZJywge1xuICAgICAgcmVzb2x2ZTogKG5vdykgPT4ge1xuICAgICAgICBjb25zdCBkYXRlID0gbmV3IERhdGUobm93KTtcbiAgICAgICAgZGF0ZS5zZXREYXRlKGRhdGUuZ2V0RGF0ZSgpIC0gMSk7XG4gICAgICAgIHJldHVybiB7IHN0YXJ0OiBkYXRlLCBlbmQ6IGRhdGUgfTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIC8vIExhc3QgTiBEYXlzXG4gICAgdGhpcy5yZWdpc3RlcignTEFTVF83X0RBWVMnLCB7XG4gICAgICByZXNvbHZlOiAobm93KSA9PiB7XG4gICAgICAgIGNvbnN0IGVuZCA9IG5ldyBEYXRlKG5vdyk7XG4gICAgICAgIGNvbnN0IHN0YXJ0ID0gbmV3IERhdGUobm93KTtcbiAgICAgICAgc3RhcnQuc2V0RGF0ZShzdGFydC5nZXREYXRlKCkgLSA2KTtcbiAgICAgICAgcmV0dXJuIHsgc3RhcnQsIGVuZCB9O1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgdGhpcy5yZWdpc3RlcignTEFTVF8xNF9EQVlTJywge1xuICAgICAgcmVzb2x2ZTogKG5vdykgPT4ge1xuICAgICAgICBjb25zdCBlbmQgPSBuZXcgRGF0ZShub3cpO1xuICAgICAgICBjb25zdCBzdGFydCA9IG5ldyBEYXRlKG5vdyk7XG4gICAgICAgIHN0YXJ0LnNldERhdGUoc3RhcnQuZ2V0RGF0ZSgpIC0gMTMpO1xuICAgICAgICByZXR1cm4geyBzdGFydCwgZW5kIH07XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICB0aGlzLnJlZ2lzdGVyKCdMQVNUXzMwX0RBWVMnLCB7XG4gICAgICByZXNvbHZlOiAobm93KSA9PiB7XG4gICAgICAgIGNvbnN0IGVuZCA9IG5ldyBEYXRlKG5vdyk7XG4gICAgICAgIGNvbnN0IHN0YXJ0ID0gbmV3IERhdGUobm93KTtcbiAgICAgICAgc3RhcnQuc2V0RGF0ZShzdGFydC5nZXREYXRlKCkgLSAyOSk7XG4gICAgICAgIHJldHVybiB7IHN0YXJ0LCBlbmQgfTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIHRoaXMucmVnaXN0ZXIoJ0xBU1RfNjBfREFZUycsIHtcbiAgICAgIHJlc29sdmU6IChub3cpID0+IHtcbiAgICAgICAgY29uc3QgZW5kID0gbmV3IERhdGUobm93KTtcbiAgICAgICAgY29uc3Qgc3RhcnQgPSBuZXcgRGF0ZShub3cpO1xuICAgICAgICBzdGFydC5zZXREYXRlKHN0YXJ0LmdldERhdGUoKSAtIDU5KTtcbiAgICAgICAgcmV0dXJuIHsgc3RhcnQsIGVuZCB9O1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgdGhpcy5yZWdpc3RlcignTEFTVF85MF9EQVlTJywge1xuICAgICAgcmVzb2x2ZTogKG5vdykgPT4ge1xuICAgICAgICBjb25zdCBlbmQgPSBuZXcgRGF0ZShub3cpO1xuICAgICAgICBjb25zdCBzdGFydCA9IG5ldyBEYXRlKG5vdyk7XG4gICAgICAgIHN0YXJ0LnNldERhdGUoc3RhcnQuZ2V0RGF0ZSgpIC0gODkpO1xuICAgICAgICByZXR1cm4geyBzdGFydCwgZW5kIH07XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICAvLyBUaGlzIFdlZWsgKE1vbmRheSB0byBTdW5kYXkpXG4gICAgdGhpcy5yZWdpc3RlcignVEhJU19XRUVLJywge1xuICAgICAgcmVzb2x2ZTogKG5vdykgPT4ge1xuICAgICAgICBjb25zdCBkYXlPZldlZWsgPSBub3cuZ2V0RGF5KCk7XG4gICAgICAgIGNvbnN0IHN0YXJ0ID0gbmV3IERhdGUobm93KTtcbiAgICAgICAgY29uc3QgZGF5c1RvTW9uZGF5ID0gZGF5T2ZXZWVrID09PSAwID8gNiA6IGRheU9mV2VlayAtIDE7XG4gICAgICAgIHN0YXJ0LnNldERhdGUoc3RhcnQuZ2V0RGF0ZSgpIC0gZGF5c1RvTW9uZGF5KTtcblxuICAgICAgICBjb25zdCBlbmQgPSBuZXcgRGF0ZShzdGFydCk7XG4gICAgICAgIGVuZC5zZXREYXRlKGVuZC5nZXREYXRlKCkgKyA2KTtcblxuICAgICAgICByZXR1cm4geyBzdGFydCwgZW5kIH07XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICAvLyBMYXN0IFdlZWtcbiAgICB0aGlzLnJlZ2lzdGVyKCdMQVNUX1dFRUsnLCB7XG4gICAgICByZXNvbHZlOiAobm93KSA9PiB7XG4gICAgICAgIGNvbnN0IGRheU9mV2VlayA9IG5vdy5nZXREYXkoKTtcbiAgICAgICAgY29uc3QgZGF5c1RvTW9uZGF5ID0gZGF5T2ZXZWVrID09PSAwID8gNiA6IGRheU9mV2VlayAtIDE7XG5cbiAgICAgICAgY29uc3QgbGFzdE1vbmRheSA9IG5ldyBEYXRlKG5vdyk7XG4gICAgICAgIGxhc3RNb25kYXkuc2V0RGF0ZShsYXN0TW9uZGF5LmdldERhdGUoKSAtIGRheXNUb01vbmRheSAtIDcpO1xuXG4gICAgICAgIGNvbnN0IGxhc3RTdW5kYXkgPSBuZXcgRGF0ZShsYXN0TW9uZGF5KTtcbiAgICAgICAgbGFzdFN1bmRheS5zZXREYXRlKGxhc3RTdW5kYXkuZ2V0RGF0ZSgpICsgNik7XG5cbiAgICAgICAgcmV0dXJuIHsgc3RhcnQ6IGxhc3RNb25kYXksIGVuZDogbGFzdFN1bmRheSB9O1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgLy8gVGhpcyBNb250aFxuICAgIHRoaXMucmVnaXN0ZXIoJ1RISVNfTU9OVEgnLCB7XG4gICAgICByZXNvbHZlOiAobm93KSA9PiB7XG4gICAgICAgIGNvbnN0IHN0YXJ0ID0gbmV3IERhdGUobm93LmdldEZ1bGxZZWFyKCksIG5vdy5nZXRNb250aCgpLCAxKTtcbiAgICAgICAgY29uc3QgZW5kID0gbmV3IERhdGUobm93LmdldEZ1bGxZZWFyKCksIG5vdy5nZXRNb250aCgpICsgMSwgMCk7XG4gICAgICAgIHJldHVybiB7IHN0YXJ0LCBlbmQgfTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIC8vIExhc3QgTW9udGhcbiAgICB0aGlzLnJlZ2lzdGVyKCdMQVNUX01PTlRIJywge1xuICAgICAgcmVzb2x2ZTogKG5vdykgPT4ge1xuICAgICAgICBjb25zdCBzdGFydCA9IG5ldyBEYXRlKG5vdy5nZXRGdWxsWWVhcigpLCBub3cuZ2V0TW9udGgoKSAtIDEsIDEpO1xuICAgICAgICBjb25zdCBlbmQgPSBuZXcgRGF0ZShub3cuZ2V0RnVsbFllYXIoKSwgbm93LmdldE1vbnRoKCksIDApO1xuICAgICAgICByZXR1cm4geyBzdGFydCwgZW5kIH07XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICAvLyBNb250aCB0byBEYXRlXG4gICAgdGhpcy5yZWdpc3RlcignTU9OVEhfVE9fREFURScsIHtcbiAgICAgIHJlc29sdmU6IChub3cpID0+IHtcbiAgICAgICAgY29uc3Qgc3RhcnQgPSBuZXcgRGF0ZShub3cuZ2V0RnVsbFllYXIoKSwgbm93LmdldE1vbnRoKCksIDEpO1xuICAgICAgICByZXR1cm4geyBzdGFydCwgZW5kOiBub3cgfTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIC8vIFRoaXMgUXVhcnRlclxuICAgIHRoaXMucmVnaXN0ZXIoJ1RISVNfUVVBUlRFUicsIHtcbiAgICAgIHJlc29sdmU6IChub3cpID0+IHtcbiAgICAgICAgY29uc3QgY3VycmVudE1vbnRoID0gbm93LmdldE1vbnRoKCk7XG4gICAgICAgIGNvbnN0IHF1YXJ0ZXJTdGFydE1vbnRoID0gTWF0aC5mbG9vcihjdXJyZW50TW9udGggLyAzKSAqIDM7XG4gICAgICAgIGNvbnN0IHN0YXJ0ID0gbmV3IERhdGUobm93LmdldEZ1bGxZZWFyKCksIHF1YXJ0ZXJTdGFydE1vbnRoLCAxKTtcbiAgICAgICAgY29uc3QgZW5kID0gbmV3IERhdGUobm93LmdldEZ1bGxZZWFyKCksIHF1YXJ0ZXJTdGFydE1vbnRoICsgMywgMCk7XG4gICAgICAgIHJldHVybiB7IHN0YXJ0LCBlbmQgfTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIC8vIExhc3QgUXVhcnRlclxuICAgIHRoaXMucmVnaXN0ZXIoJ0xBU1RfUVVBUlRFUicsIHtcbiAgICAgIHJlc29sdmU6IChub3cpID0+IHtcbiAgICAgICAgY29uc3QgY3VycmVudE1vbnRoID0gbm93LmdldE1vbnRoKCk7XG4gICAgICAgIGNvbnN0IGxhc3RRdWFydGVyU3RhcnRNb250aCA9IE1hdGguZmxvb3IoY3VycmVudE1vbnRoIC8gMykgKiAzIC0gMztcbiAgICAgICAgY29uc3Qgc3RhcnQgPSBuZXcgRGF0ZShub3cuZ2V0RnVsbFllYXIoKSwgbGFzdFF1YXJ0ZXJTdGFydE1vbnRoLCAxKTtcbiAgICAgICAgY29uc3QgZW5kID0gbmV3IERhdGUobm93LmdldEZ1bGxZZWFyKCksIGxhc3RRdWFydGVyU3RhcnRNb250aCArIDMsIDApO1xuICAgICAgICByZXR1cm4geyBzdGFydCwgZW5kIH07XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICAvLyBRdWFydGVyIHRvIERhdGVcbiAgICB0aGlzLnJlZ2lzdGVyKCdRVUFSVEVSX1RPX0RBVEUnLCB7XG4gICAgICByZXNvbHZlOiAobm93KSA9PiB7XG4gICAgICAgIGNvbnN0IGN1cnJlbnRNb250aCA9IG5vdy5nZXRNb250aCgpO1xuICAgICAgICBjb25zdCBxdWFydGVyU3RhcnRNb250aCA9IE1hdGguZmxvb3IoY3VycmVudE1vbnRoIC8gMykgKiAzO1xuICAgICAgICBjb25zdCBzdGFydCA9IG5ldyBEYXRlKG5vdy5nZXRGdWxsWWVhcigpLCBxdWFydGVyU3RhcnRNb250aCwgMSk7XG4gICAgICAgIHJldHVybiB7IHN0YXJ0LCBlbmQ6IG5vdyB9O1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgLy8gVGhpcyBZZWFyXG4gICAgdGhpcy5yZWdpc3RlcignVEhJU19ZRUFSJywge1xuICAgICAgcmVzb2x2ZTogKG5vdykgPT4ge1xuICAgICAgICBjb25zdCBzdGFydCA9IG5ldyBEYXRlKG5vdy5nZXRGdWxsWWVhcigpLCAwLCAxKTtcbiAgICAgICAgY29uc3QgZW5kID0gbmV3IERhdGUobm93LmdldEZ1bGxZZWFyKCksIDExLCAzMSk7XG4gICAgICAgIHJldHVybiB7IHN0YXJ0LCBlbmQgfTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIC8vIExhc3QgWWVhclxuICAgIHRoaXMucmVnaXN0ZXIoJ0xBU1RfWUVBUicsIHtcbiAgICAgIHJlc29sdmU6IChub3cpID0+IHtcbiAgICAgICAgY29uc3Qgc3RhcnQgPSBuZXcgRGF0ZShub3cuZ2V0RnVsbFllYXIoKSAtIDEsIDAsIDEpO1xuICAgICAgICBjb25zdCBlbmQgPSBuZXcgRGF0ZShub3cuZ2V0RnVsbFllYXIoKSAtIDEsIDExLCAzMSk7XG4gICAgICAgIHJldHVybiB7IHN0YXJ0LCBlbmQgfTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIC8vIFllYXIgdG8gRGF0ZVxuICAgIHRoaXMucmVnaXN0ZXIoJ1lFQVJfVE9fREFURScsIHtcbiAgICAgIHJlc29sdmU6IChub3cpID0+IHtcbiAgICAgICAgY29uc3Qgc3RhcnQgPSBuZXcgRGF0ZShub3cuZ2V0RnVsbFllYXIoKSwgMCwgMSk7XG4gICAgICAgIHJldHVybiB7IHN0YXJ0LCBlbmQ6IG5vdyB9O1xuICAgICAgfVxuICAgIH0pO1xuICB9XG59XG5cbi8qKlxuICogQ3JlYXRlIGEgY3VzdG9tIHByZXNldCBmcm9tIGEgZnVuY3Rpb25cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZVByZXNldChcbiAgcmVzb2x2ZXI6IChub3c6IERhdGUpID0+IHsgc3RhcnQ6IERhdGU7IGVuZDogRGF0ZSB9XG4pOiBSYW5nZVByZXNldCB7XG4gIHJldHVybiB7IHJlc29sdmU6IHJlc29sdmVyIH07XG59XG5cbi8qKlxuICogU2luZ2xldG9uIHByZXNldCBlbmdpbmUgaW5zdGFuY2VcbiAqL1xuZXhwb3J0IGNvbnN0IHByZXNldEVuZ2luZSA9IG5ldyBQcmVzZXRFbmdpbmUoKTtcbiJdfQ==
|