@oneluiz/dual-datepicker 3.5.1 → 3.6.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/core/built-in-presets.d.ts +98 -0
- package/core/index.d.ts +11 -0
- package/core/preset-providers.d.ts +176 -0
- package/core/preset-registry.d.ts +181 -0
- package/core/preset.engine.d.ts +57 -21
- package/core/range-preset.plugin.d.ts +188 -0
- package/esm2022/core/built-in-presets.mjs +289 -0
- package/esm2022/core/index.mjs +13 -1
- package/esm2022/core/preset-providers.mjs +243 -0
- package/esm2022/core/preset-registry.mjs +277 -0
- package/esm2022/core/preset.engine.mjs +86 -210
- package/esm2022/core/range-preset.plugin.mjs +70 -0
- package/esm2022/dual-datepicker.component.mjs +26 -2
- package/fesm2022/oneluiz-dual-datepicker.mjs +988 -211
- package/fesm2022/oneluiz-dual-datepicker.mjs.map +1 -1
- package/package.json +2 -2
|
@@ -10,77 +10,116 @@
|
|
|
10
10
|
* v3.5.1: Timezone-Safe via DateAdapter
|
|
11
11
|
* All date operations use DateAdapter for consistent behavior
|
|
12
12
|
* Fixes timezone bugs common in ERP/BI/POS systems
|
|
13
|
+
*
|
|
14
|
+
* v3.6.0: Plugin-Driven Architecture
|
|
15
|
+
* Preset Engine now uses PresetRegistry for plugin-based extensibility
|
|
16
|
+
* Follows Open/Closed Principle - extend without modifying core
|
|
17
|
+
* Supports external preset packages for industry-specific needs
|
|
13
18
|
*/
|
|
14
19
|
import { Injectable, inject } from '@angular/core';
|
|
15
20
|
import { DATE_CLOCK } from './date-clock';
|
|
16
21
|
import { SystemClock } from './system-clock';
|
|
17
22
|
import { DATE_ADAPTER } from './date-adapter';
|
|
18
23
|
import { NativeDateAdapter } from './native-date-adapter';
|
|
24
|
+
import { PresetRegistry } from './preset-registry';
|
|
19
25
|
import * as i0 from "@angular/core";
|
|
20
26
|
/**
|
|
21
|
-
*
|
|
22
|
-
*
|
|
27
|
+
* Preset Engine - Plugin-Driven Architecture
|
|
28
|
+
*
|
|
29
|
+
* ARCHITECTURE (v3.6.0):
|
|
30
|
+
* - NO longer contains presets internally
|
|
31
|
+
* - Uses PresetRegistry for plugin management
|
|
32
|
+
* - Injects DateClock for SSR-safe time
|
|
33
|
+
* - Injects DateAdapter for timezone-safe operations
|
|
34
|
+
* - Follows Open/Closed Principle
|
|
23
35
|
*
|
|
24
|
-
*
|
|
25
|
-
* -
|
|
26
|
-
* -
|
|
27
|
-
* -
|
|
28
|
-
*
|
|
36
|
+
* BACKWARD COMPATIBILITY:
|
|
37
|
+
* - Old API unchanged: resolve(), register(), getPresetKeys()
|
|
38
|
+
* - Built-in presets auto-registered via provider
|
|
39
|
+
* - Existing code continues to work
|
|
40
|
+
*
|
|
41
|
+
* EXTENSIBILITY:
|
|
42
|
+
* ```typescript
|
|
43
|
+
* // Register custom preset via registry
|
|
44
|
+
* const registry = inject(PresetRegistry);
|
|
45
|
+
* registry.register({
|
|
46
|
+
* key: 'MY_PRESET',
|
|
47
|
+
* resolve: (clock, adapter) => {
|
|
48
|
+
* const now = clock.now();
|
|
49
|
+
* return { start: now, end: now };
|
|
50
|
+
* }
|
|
51
|
+
* });
|
|
29
52
|
*
|
|
30
|
-
*
|
|
31
|
-
*
|
|
32
|
-
*
|
|
33
|
-
*
|
|
34
|
-
* - Override DATE_ADAPTER for Luxon/DayJS/custom implementations
|
|
53
|
+
* // Use via engine
|
|
54
|
+
* const engine = inject(PresetEngine);
|
|
55
|
+
* const range = engine.resolve('MY_PRESET');
|
|
56
|
+
* ```
|
|
35
57
|
*/
|
|
36
58
|
export class PresetEngine {
|
|
37
|
-
presets = new Map();
|
|
38
59
|
clock;
|
|
39
60
|
adapter;
|
|
61
|
+
registry;
|
|
40
62
|
constructor() {
|
|
41
|
-
//
|
|
63
|
+
// Inject dependencies with fallbacks
|
|
42
64
|
try {
|
|
43
65
|
this.clock = inject(DATE_CLOCK, { optional: true }) ?? new SystemClock();
|
|
44
|
-
}
|
|
45
|
-
catch {
|
|
46
|
-
// In case inject() fails (e.g., called outside injection context)
|
|
47
|
-
this.clock = new SystemClock();
|
|
48
|
-
}
|
|
49
|
-
// Try to inject DATE_ADAPTER, fallback to NativeDateAdapter if not provided
|
|
50
|
-
try {
|
|
51
66
|
this.adapter = inject(DATE_ADAPTER, { optional: true }) ?? new NativeDateAdapter();
|
|
67
|
+
this.registry = inject(PresetRegistry);
|
|
52
68
|
}
|
|
53
69
|
catch {
|
|
54
|
-
//
|
|
70
|
+
// Fallback if inject() fails outside injection context
|
|
71
|
+
this.clock = new SystemClock();
|
|
55
72
|
this.adapter = new NativeDateAdapter();
|
|
73
|
+
this.registry = new PresetRegistry();
|
|
56
74
|
}
|
|
57
|
-
this.registerBuiltInPresets();
|
|
58
75
|
}
|
|
59
76
|
/**
|
|
60
77
|
* Register a custom preset
|
|
78
|
+
*
|
|
79
|
+
* @deprecated Use PresetRegistry.register() directly for new code
|
|
80
|
+
* Kept for backward compatibility
|
|
81
|
+
*
|
|
82
|
+
* @param key - Preset key (e.g., 'MY_CUSTOM_PRESET')
|
|
83
|
+
* @param preset - Legacy RangePreset object
|
|
61
84
|
*/
|
|
62
85
|
register(key, preset) {
|
|
63
|
-
|
|
86
|
+
// Convert legacy RangePreset to RangePresetPlugin
|
|
87
|
+
this.registry.register({
|
|
88
|
+
key: key,
|
|
89
|
+
resolve: (clock, adapter) => {
|
|
90
|
+
const now = clock.now();
|
|
91
|
+
return preset.resolve(now);
|
|
92
|
+
}
|
|
93
|
+
});
|
|
64
94
|
}
|
|
65
95
|
/**
|
|
66
96
|
* Resolve a preset to date range
|
|
67
97
|
*
|
|
68
|
-
*
|
|
69
|
-
*
|
|
98
|
+
* Plugin Architecture:
|
|
99
|
+
* 1. Looks up plugin in PresetRegistry
|
|
100
|
+
* 2. Calls plugin.resolve(clock, adapter)
|
|
101
|
+
* 3. Returns ISO date range
|
|
70
102
|
*
|
|
71
|
-
*
|
|
72
|
-
*
|
|
73
|
-
* - DATE_ADAPTER: Control date operations (e.g., Luxon for timezone support)
|
|
103
|
+
* SSR Note: Uses injected DateClock for deterministic resolution
|
|
104
|
+
* Timezone Note: Uses injected DateAdapter for consistent operations
|
|
74
105
|
*
|
|
75
106
|
* @param key - Preset key (e.g., 'TODAY', 'LAST_7_DAYS')
|
|
76
107
|
* @param now - Optional override for current date (defaults to clock.now())
|
|
108
|
+
* @returns ISO date range or null if preset not found
|
|
77
109
|
*/
|
|
78
110
|
resolve(key, now) {
|
|
79
|
-
const
|
|
80
|
-
if (!
|
|
111
|
+
const plugin = this.registry.get(key);
|
|
112
|
+
if (!plugin) {
|
|
113
|
+
console.warn(`[PresetEngine] Preset "${key}" not found in registry`);
|
|
81
114
|
return null;
|
|
82
|
-
|
|
83
|
-
|
|
115
|
+
}
|
|
116
|
+
// Create temporary clock if now is provided
|
|
117
|
+
const effectiveClock = now
|
|
118
|
+
? { now: () => now }
|
|
119
|
+
: this.clock;
|
|
120
|
+
// Resolve via plugin
|
|
121
|
+
const { start, end } = plugin.resolve(effectiveClock, this.adapter);
|
|
122
|
+
// Convert to ISO format
|
|
84
123
|
return {
|
|
85
124
|
start: this.adapter.toISODate(start),
|
|
86
125
|
end: this.adapter.toISODate(end)
|
|
@@ -88,188 +127,22 @@ export class PresetEngine {
|
|
|
88
127
|
}
|
|
89
128
|
/**
|
|
90
129
|
* Get all available preset keys
|
|
130
|
+
*
|
|
131
|
+
* Delegates to PresetRegistry
|
|
132
|
+
*
|
|
133
|
+
* @returns Array of registered preset keys
|
|
91
134
|
*/
|
|
92
135
|
getPresetKeys() {
|
|
93
|
-
return
|
|
136
|
+
return this.registry.getAllKeys();
|
|
94
137
|
}
|
|
95
138
|
/**
|
|
96
|
-
*
|
|
139
|
+
* Check if a preset exists
|
|
97
140
|
*
|
|
98
|
-
*
|
|
141
|
+
* @param key - Preset key to check
|
|
142
|
+
* @returns true if preset is registered
|
|
99
143
|
*/
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
// Today
|
|
103
|
-
this.register('TODAY', {
|
|
104
|
-
resolve: (now) => {
|
|
105
|
-
const normalized = adapter.normalize(now);
|
|
106
|
-
return { start: normalized, end: normalized };
|
|
107
|
-
}
|
|
108
|
-
});
|
|
109
|
-
// Yesterday
|
|
110
|
-
this.register('YESTERDAY', {
|
|
111
|
-
resolve: (now) => {
|
|
112
|
-
const date = adapter.addDays(now, -1);
|
|
113
|
-
return { start: date, end: date };
|
|
114
|
-
}
|
|
115
|
-
});
|
|
116
|
-
// Last N Days
|
|
117
|
-
this.register('LAST_7_DAYS', {
|
|
118
|
-
resolve: (now) => {
|
|
119
|
-
const end = adapter.normalize(now);
|
|
120
|
-
const start = adapter.addDays(now, -6);
|
|
121
|
-
return { start, end };
|
|
122
|
-
}
|
|
123
|
-
});
|
|
124
|
-
this.register('LAST_14_DAYS', {
|
|
125
|
-
resolve: (now) => {
|
|
126
|
-
const end = adapter.normalize(now);
|
|
127
|
-
const start = adapter.addDays(now, -13);
|
|
128
|
-
return { start, end };
|
|
129
|
-
}
|
|
130
|
-
});
|
|
131
|
-
this.register('LAST_30_DAYS', {
|
|
132
|
-
resolve: (now) => {
|
|
133
|
-
const end = adapter.normalize(now);
|
|
134
|
-
const start = adapter.addDays(now, -29);
|
|
135
|
-
return { start, end };
|
|
136
|
-
}
|
|
137
|
-
});
|
|
138
|
-
this.register('LAST_60_DAYS', {
|
|
139
|
-
resolve: (now) => {
|
|
140
|
-
const end = adapter.normalize(now);
|
|
141
|
-
const start = adapter.addDays(now, -59);
|
|
142
|
-
return { start, end };
|
|
143
|
-
}
|
|
144
|
-
});
|
|
145
|
-
this.register('LAST_90_DAYS', {
|
|
146
|
-
resolve: (now) => {
|
|
147
|
-
const end = adapter.normalize(now);
|
|
148
|
-
const start = adapter.addDays(now, -89);
|
|
149
|
-
return { start, end };
|
|
150
|
-
}
|
|
151
|
-
});
|
|
152
|
-
// This Week (Monday to Sunday)
|
|
153
|
-
this.register('THIS_WEEK', {
|
|
154
|
-
resolve: (now) => {
|
|
155
|
-
const dayOfWeek = adapter.getDay(now);
|
|
156
|
-
const daysToMonday = dayOfWeek === 0 ? 6 : dayOfWeek - 1;
|
|
157
|
-
const start = adapter.addDays(now, -daysToMonday);
|
|
158
|
-
const end = adapter.addDays(start, 6);
|
|
159
|
-
return { start, end };
|
|
160
|
-
}
|
|
161
|
-
});
|
|
162
|
-
// Last Week
|
|
163
|
-
this.register('LAST_WEEK', {
|
|
164
|
-
resolve: (now) => {
|
|
165
|
-
const dayOfWeek = adapter.getDay(now);
|
|
166
|
-
const daysToMonday = dayOfWeek === 0 ? 6 : dayOfWeek - 1;
|
|
167
|
-
const lastMonday = adapter.addDays(now, -daysToMonday - 7);
|
|
168
|
-
const lastSunday = adapter.addDays(lastMonday, 6);
|
|
169
|
-
return { start: lastMonday, end: lastSunday };
|
|
170
|
-
}
|
|
171
|
-
});
|
|
172
|
-
// This Month
|
|
173
|
-
this.register('THIS_MONTH', {
|
|
174
|
-
resolve: (now) => {
|
|
175
|
-
const start = adapter.startOfMonth(now);
|
|
176
|
-
const end = adapter.endOfMonth(now);
|
|
177
|
-
return { start, end };
|
|
178
|
-
}
|
|
179
|
-
});
|
|
180
|
-
// Last Month
|
|
181
|
-
this.register('LAST_MONTH', {
|
|
182
|
-
resolve: (now) => {
|
|
183
|
-
const lastMonth = adapter.addMonths(now, -1);
|
|
184
|
-
const start = adapter.startOfMonth(lastMonth);
|
|
185
|
-
const end = adapter.endOfMonth(lastMonth);
|
|
186
|
-
return { start, end };
|
|
187
|
-
}
|
|
188
|
-
});
|
|
189
|
-
// Month to Date
|
|
190
|
-
this.register('MONTH_TO_DATE', {
|
|
191
|
-
resolve: (now) => {
|
|
192
|
-
const start = adapter.startOfMonth(now);
|
|
193
|
-
const end = adapter.normalize(now);
|
|
194
|
-
return { start, end };
|
|
195
|
-
}
|
|
196
|
-
});
|
|
197
|
-
// This Quarter
|
|
198
|
-
this.register('THIS_QUARTER', {
|
|
199
|
-
resolve: (now) => {
|
|
200
|
-
const currentMonth = adapter.getMonth(now);
|
|
201
|
-
const quarterStartMonth = Math.floor(currentMonth / 3) * 3;
|
|
202
|
-
const year = adapter.getYear(now);
|
|
203
|
-
// Construct start of quarter
|
|
204
|
-
const start = new Date(year, quarterStartMonth, 1);
|
|
205
|
-
const normalizedStart = adapter.normalize(start);
|
|
206
|
-
// Construct end of quarter (last day of 3rd month)
|
|
207
|
-
const end = new Date(year, quarterStartMonth + 3, 0);
|
|
208
|
-
const normalizedEnd = adapter.normalize(end);
|
|
209
|
-
return { start: normalizedStart, end: normalizedEnd };
|
|
210
|
-
}
|
|
211
|
-
});
|
|
212
|
-
// Last Quarter
|
|
213
|
-
this.register('LAST_QUARTER', {
|
|
214
|
-
resolve: (now) => {
|
|
215
|
-
const currentMonth = adapter.getMonth(now);
|
|
216
|
-
const lastQuarterStartMonth = Math.floor(currentMonth / 3) * 3 - 3;
|
|
217
|
-
const year = adapter.getYear(now);
|
|
218
|
-
// Handle year rollover (Q1 - 1 = Q4 of previous year)
|
|
219
|
-
const adjustedYear = lastQuarterStartMonth < 0 ? year - 1 : year;
|
|
220
|
-
const adjustedMonth = lastQuarterStartMonth < 0 ? 9 : lastQuarterStartMonth;
|
|
221
|
-
const start = new Date(adjustedYear, adjustedMonth, 1);
|
|
222
|
-
const normalizedStart = adapter.normalize(start);
|
|
223
|
-
const end = new Date(adjustedYear, adjustedMonth + 3, 0);
|
|
224
|
-
const normalizedEnd = adapter.normalize(end);
|
|
225
|
-
return { start: normalizedStart, end: normalizedEnd };
|
|
226
|
-
}
|
|
227
|
-
});
|
|
228
|
-
// Quarter to Date
|
|
229
|
-
this.register('QUARTER_TO_DATE', {
|
|
230
|
-
resolve: (now) => {
|
|
231
|
-
const currentMonth = adapter.getMonth(now);
|
|
232
|
-
const quarterStartMonth = Math.floor(currentMonth / 3) * 3;
|
|
233
|
-
const year = adapter.getYear(now);
|
|
234
|
-
const start = new Date(year, quarterStartMonth, 1);
|
|
235
|
-
const normalizedStart = adapter.normalize(start);
|
|
236
|
-
const end = adapter.normalize(now);
|
|
237
|
-
return { start: normalizedStart, end };
|
|
238
|
-
}
|
|
239
|
-
});
|
|
240
|
-
// This Year
|
|
241
|
-
this.register('THIS_YEAR', {
|
|
242
|
-
resolve: (now) => {
|
|
243
|
-
const year = adapter.getYear(now);
|
|
244
|
-
const start = new Date(year, 0, 1);
|
|
245
|
-
const end = new Date(year, 11, 31);
|
|
246
|
-
return {
|
|
247
|
-
start: adapter.normalize(start),
|
|
248
|
-
end: adapter.normalize(end)
|
|
249
|
-
};
|
|
250
|
-
}
|
|
251
|
-
});
|
|
252
|
-
// Last Year
|
|
253
|
-
this.register('LAST_YEAR', {
|
|
254
|
-
resolve: (now) => {
|
|
255
|
-
const year = adapter.getYear(now);
|
|
256
|
-
const start = new Date(year - 1, 0, 1);
|
|
257
|
-
const end = new Date(year - 1, 11, 31);
|
|
258
|
-
return {
|
|
259
|
-
start: adapter.normalize(start),
|
|
260
|
-
end: adapter.normalize(end)
|
|
261
|
-
};
|
|
262
|
-
}
|
|
263
|
-
});
|
|
264
|
-
// Year to Date
|
|
265
|
-
this.register('YEAR_TO_DATE', {
|
|
266
|
-
resolve: (now) => {
|
|
267
|
-
const year = adapter.getYear(now);
|
|
268
|
-
const start = new Date(year, 0, 1);
|
|
269
|
-
const end = adapter.normalize(now);
|
|
270
|
-
return { start: adapter.normalize(start), end };
|
|
271
|
-
}
|
|
272
|
-
});
|
|
144
|
+
hasPreset(key) {
|
|
145
|
+
return this.registry.has(key);
|
|
273
146
|
}
|
|
274
147
|
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: PresetEngine, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
|
|
275
148
|
static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: PresetEngine, providedIn: 'root' });
|
|
@@ -282,6 +155,9 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
|
|
|
282
155
|
}], ctorParameters: () => [] });
|
|
283
156
|
/**
|
|
284
157
|
* Create a custom preset from a function
|
|
158
|
+
*
|
|
159
|
+
* @deprecated Use RangePresetPlugin interface instead
|
|
160
|
+
* Kept for backward compatibility
|
|
285
161
|
*/
|
|
286
162
|
export function createPreset(resolver) {
|
|
287
163
|
return { resolve: resolver };
|
|
@@ -300,4 +176,4 @@ export function createPreset(resolver) {
|
|
|
300
176
|
* This export will be removed in v4.0.0
|
|
301
177
|
*/
|
|
302
178
|
export const presetEngine = new PresetEngine();
|
|
303
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJlc2V0LmVuZ2luZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9jb3JlL3ByZXNldC5lbmdpbmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7OztHQVlHO0FBRUgsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLEVBQVksTUFBTSxlQUFlLENBQUM7QUFDN0QsT0FBTyxFQUFhLFVBQVUsRUFBRSxNQUFNLGNBQWMsQ0FBQztBQUNyRCxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDN0MsT0FBTyxFQUFlLFlBQVksRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQzNELE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLHVCQUF1QixDQUFDOztBQWUxRDs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFJSCxNQUFNLE9BQU8sWUFBWTtJQUNmLE9BQU8sR0FBRyxJQUFJLEdBQUcsRUFBdUIsQ0FBQztJQUN6QyxLQUFLLENBQVk7SUFDakIsT0FBTyxDQUFjO0lBRTdCO1FBQ0Usb0VBQW9FO1FBQ3BFLElBQUksQ0FBQztZQUNILElBQUksQ0FBQyxLQUFLLEdBQUcsTUFBTSxDQUFDLFVBQVUsRUFBRSxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsQ0FBQyxJQUFJLElBQUksV0FBVyxFQUFFLENBQUM7UUFDM0UsQ0FBQztRQUFDLE1BQU0sQ0FBQztZQUNQLGtFQUFrRTtZQUNsRSxJQUFJLENBQUMsS0FBSyxHQUFHLElBQUksV0FBVyxFQUFFLENBQUM7UUFDakMsQ0FBQztRQUVELDRFQUE0RTtRQUM1RSxJQUFJLENBQUM7WUFDSCxJQUFJLENBQUMsT0FBTyxHQUFHLE1BQU0sQ0FBQyxZQUFZLEVBQUUsRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLENBQUMsSUFBSSxJQUFJLGlCQUFpQixFQUFFLENBQUM7UUFDckYsQ0FBQztRQUFDLE1BQU0sQ0FBQztZQUNQLGtFQUFrRTtZQUNsRSxJQUFJLENBQUMsT0FB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Q0FBQztvQkFDL0IsR0FBRyxFQUFFLE9BQU8sQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDO2lCQUM1QixDQUFDO1lBQ0osQ0FBQztTQUNGLENBQUMsQ0FBQztRQUVILGVBQWU7UUFDZixJQUFJLENBQUMsUUFBUSxDQUFDLGNBQWMsRUFBRTtZQUM1QixPQUFPLEVBQUUsQ0FBQyxHQUFHLEVBQUUsRUFBRTtnQkFDZixNQUFNLElBQUksR0FBRyxPQUFPLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDO2dCQUNsQyxNQUFNLEtBQUssR0FBRyxJQUFJLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO2dCQUNuQyxNQUFNLEdBQUcsR0FBRyxPQUFPLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxDQUFDO2dCQUNuQyxPQUFPLEVBQUUsS0FBSyxFQUFFLE9BQU8sQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUM7WUFDbEQsQ0FBQztTQUNGLENBQUMsQ0FBQztJQUNMLENBQUM7d0dBN1FVLFlBQVk7NEdBQVosWUFBWSxjQUZYLE1BQU07OzRGQUVQLFlBQVk7a0JBSHhCLFVBQVU7bUJBQUM7b0JBQ1YsVUFBVSxFQUFFLE1BQU07aUJBQ25COztBQWlSRDs7R0FFRztBQUNILE1BQU0sVUFBVSxZQUFZLENBQzFCLFFBQW1EO0lBRW5ELE9BQU8sRUFBRSxPQUFPLEVBQUUsUUFBUSxFQUFFLENBQUM7QUFDL0IsQ0FBQztBQUVEOzs7Ozs7Ozs7Ozs7R0FZRztBQUNILE1BQU0sQ0FBQyxNQUFNLFlBQVksR0FBRyxJQUFJLFlBQVksRUFBRSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBIZWFkbGVzcyBQcmVzZXQgRW5naW5lXG4gKiBQdXJlIGZ1bmN0aW9ucyB0aGF0IHJlc29sdmUgZGF0ZSByYW5nZXMgV0lUSE9VVCByZW5kZXIgZGVwZW5kZW5jeVxuICogUGVyZmVjdCBmb3IgU1NSLCBnbG9iYWwgc3RhdGUsIGRhc2hib2FyZCBmaWx0ZXJzXG4gKiBcbiAqIHYzLjUuMDogU1NSLVNhZmUgdmlhIENsb2NrIEluamVjdGlvblxuICogQWxsIGRhdGUgY2FsY3VsYXRpb25zIHVzZSBEYXRlQ2xvY2sgaW5zdGVhZCBvZiBuZXcgRGF0ZSgpXG4gKiBUaGlzIGVuc3VyZXMgc2VydmVyIGFuZCBjbGllbnQgcmVzb2x2ZSBpZGVudGljYWwgcHJlc2V0c1xuICogXG4gKiB2My41LjE6IFRpbWV6b25lLVNhZmUgdmlhIERhdGVBZGFwdGVyXG4gKiBBbGwgZGF0ZSBvcGVyYXRpb25zIHVzZSBEYXRlQWRhcHRlciBmb3IgY29uc2lzdGVudCBiZWhhdmlvclxuICogRml4ZXMgdGltZXpvbmUgYnVncyBjb21tb24gaW4gRVJQL0JJL1BPUyBzeXN0ZW1zXG4gKi9cblxuaW1wb3J0IHsgSW5qZWN0YWJsZSwgaW5qZWN0LCBPcHRpb25hbCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgRGF0ZUNsb2NrLCBEQVRFX0NMT0NLIH0gZnJvbSAnLi9kYXRlLWNsb2NrJztcbmltcG9ydCB7IFN5c3RlbUNsb2NrIH0gZnJvbSAnLi9zeXN0ZW0tY2xvY2snO1xuaW1wb3J0IHsgRGF0ZUFkYXB0ZXIsIERBVEVfQURBUFRFUiB9IGZyb20gJy4vZGF0ZS1hZGFwdGVyJztcbmltcG9ydCB7IE5hdGl2ZURhdGVBZGFwdGVyIH0gZnJvbSAnLi9uYXRpdmUtZGF0ZS1hZGFwdGVyJztcblxuZXhwb3J0IGludGVyZmFjZSBSYW5nZVByZXNldCB7XG4gIC8qKlxuICAgKiBSZXNvbHZlIHByZXNldCB0byBhY3R1YWwgZGF0ZSByYW5nZVxuICAgKiBAcGFyYW0gbm93IC0gQ3VycmVudCBkYXRlIGZvciBkZXRlcm1pbmlzdGljIGNhbGN1bGF0aW9uXG4gICAqL1xuICByZXNvbHZlKG5vdzogRGF0ZSk6IHsgc3RhcnQ6IERhdGU7IGVuZDogRGF0ZSB9O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFByZXNldFJhbmdlIHtcbiAgc3RhcnQ6IHN0cmluZzsgLy8gSVNPIGZvcm1hdFxuICBlbmQ6IHN0cmluZzsgLy8gSVNPIGZvcm1hdFxufVxuXG4vKipcbiAqIFJlZ2lzdHJ5IG9mIGJ1aWx0LWluIHByZXNldHNcbiAqIENhbiBiZSBleHRlbmRlZCBieSBjb25zdW1lcnNcbiAqIFxuICogU1NSLVNhZmUgQXJjaGl0ZWN0dXJlOlxuICogLSBJbmplY3RzIERhdGVDbG9jayB2aWEgRElcbiAqIC0gQWxsIHByZXNldHMgdXNlIGNsb2NrLm5vdygpIGluc3RlYWQgb2YgbmV3IERhdGUoKVxuICogLSBEZXRlcm1pbmlzdGljOiBzYW1lIGNsb2NrLm5vdygpIOKGkiBzYW1lIHByZXNldFxuICogLSBPdmVycmlkZSBEQVRFX0NMT0NLIHRva2VuIGluIFNTUiB0byBlbnN1cmUgY29uc2lzdGVuY3lcbiAqIFxuICogVGltZXpvbmUtU2FmZSBBcmNoaXRlY3R1cmU6XG4gKiAtIEluamVjdHMgRGF0ZUFkYXB0ZXIgdmlhIERJXG4gKiAtIEFsbCBkYXRlIG9wZXJhdGlvbnMgdXNlIGFkYXB0ZXIgbWV0aG9kc1xuICogLSBQcmV2ZW50cyB0aW1lem9uZSBidWdzIGluIGNyb3NzLXRpbWV6b25lIHNjZW5hcmlvc1xuICogLSBPdmVycmlkZSBEQVRFX0FEQVBURVIgZm9yIEx1eG9uL0RheUpTL2N1c3RvbSBpbXBsZW1lbnRhdGlvbnNcbiAqL1xuQEluamVjdGFibGUoe1xuICBwcm92aWRlZEluOiAncm9vdCdcbn0pXG5leHBvcnQgY2xhc3MgUHJlc2V0RW5naW5lIHtcbiAgcHJpdmF0ZSBwcmVzZXRzID0gbmV3IE1hcDxzdHJpbmcsIFJhbmdlUHJlc2V0PigpO1xuICBwcml2YXRlIGNsb2NrOiBEYXRlQ2xvY2s7XG4gIHByaXZhdGUgYWRhcHRlcjogRGF0ZUFkYXB0ZXI7XG5cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgLy8gVHJ5IHRvIGluamVjdCBEQVRFX0NMT0NLLCBmYWxsYmFjayB0byBTeXN0ZW1DbG9jayBpZiBub3QgcHJvdmlkZWRcbiAgICB0cnkge1xuICAgICAgdGhpcy5jbG9jayA9IGluamVjdChEQVRFX0NMT0NLLCB7IG9wdGlvbmFsOiB0cnVlIH0pID8/IG5ldyBTeXN0ZW1DbG9jaygpO1xuICAgIH0gY2F0Y2gge1xuICAgICAgLy8gSW4gY2FzZSBpbmplY3QoKSBmYWlscyAoZS5nLiwgY2FsbGVkIG91dHNpZGUgaW5qZWN0aW9uIGNvbnRleHQpXG4gICAgICB0aGlzLmNsb2NrID0gbmV3IFN5c3RlbUNsb2NrKCk7XG4gICAgfVxuXG4gICAgLy8gVHJ5IHRvIGluamVjdCBEQVRFX0FEQVBURVIsIGZhbGxiYWNrIHRvIE5hdGl2ZURhdGVBZGFwdGVyIGlmIG5vdCBwcm92aWRlZFxuICAgIHRyeSB7XG4gICAgICB0aGlzLmFkYXB0ZXIgPSBpbmplY3QoREFURV9BREFQVEVSLCB7IG9wdGlvbmFsOiB0cnVlIH0pID8/IG5ldyBOYXRpdmVEYXRlQWRhcHRlcigpO1xuICAgIH0gY2F0Y2gge1xuICAgICAgLy8gSW4gY2FzZSBpbmplY3QoKSBmYWlscyAoZS5nLiwgY2FsbGVkIG91dHNpZGUgaW5qZWN0aW9uIGNvbnRleHQpXG4gICAgICB0aGlzLmFkYXB0ZXIgPSBuZXcgTmF0aXZlRGF0ZUFkYXB0ZXIoKTtcbiAgICB9XG5cbiAgICB0aGlzLnJlZ2lzdGVyQnVpbHRJblByZXNldHMoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWdpc3RlciBhIGN1c3RvbSBwcmVzZXRcbiAgICovXG4gIHJlZ2lzdGVyKGtleTogc3RyaW5nLCBwcmVzZXQ6IFJhbmdlUHJlc2V0KTogdm9pZCB7XG4gICAgdGhpcy5wcmVzZXRzLnNldChrZXksIHByZXNldCk7XG4gIH1cblxuICAvKipcbiAgICogUmVzb2x2ZSBhIHByZXNldCB0byBkYXRlIHJhbmdlXG4gICAqIFxuICAgKiBTU1IgTm90ZTogVXNlcyBpbmplY3RlZCBEYXRlQ2xvY2sgZm9yIGRldGVybWluaXN0aWMgcmVzb2x1dGlvblxuICAgKiBUaW1lem9uZSBOb3RlOiBVc2VzIGluamVjdGVkIERhdGVBZGFwdGVyIGZvciBjb25zaXN0ZW50IGRhdGUgb3BlcmF0aW9uc1xuICAgKiBcbiAgICogT3ZlcnJpZGUgdG9rZW5zIGluIFNTUiBzY2VuYXJpb3M6XG4gICAqIC0gREFURV9DTE9DSzogQ29udHJvbCBjdXJyZW50IHRpbWVcbiAgICogLSBEQVRFX0FEQVBURVI6IENvbnRyb2wgZGF0ZSBvcGVyYXRpb25zIChlLmcuLCBMdXhvbiBmb3IgdGltZXpvbmUgc3VwcG9ydClcbiAgICogXG4gICAqIEBwYXJhbSBrZXkgLSBQcmVzZXQga2V5IChlLmcuLCAnVE9EQVknLCAnTEFTVF83X0RBWVMnKVxuICAgKiBAcGFyYW0gbm93IC0gT3B0aW9uYWwgb3ZlcnJpZGUgZm9yIGN1cnJlbnQgZGF0ZSAoZGVmYXVsdHMgdG8gY2xvY2subm93KCkpXG4gICAqL1xuICByZXNvbHZlKGtleTogc3RyaW5nLCBub3c/OiBEYXRlKTogUHJlc2V0UmFuZ2UgfCBudWxsIHtcbiAgICBjb25zdCBwcmVzZXQgPSB0aGlzLnByZXNldHMuZ2V0KGtleSk7XG4gICAgaWYgKCFwcmVzZXQpIHJldHVybiBudWxsO1xuXG4gICAgY29uc3QgY3VycmVudERhdGUgPSBub3cgPz8gdGhpcy5jbG9jay5ub3coKTtcbiAgICBjb25zdCB7IHN0YXJ0LCBlbmQgfSA9IHByZXNldC5yZXNvbHZlKGN1cnJlbnREYXRlKTtcbiAgICByZXR1cm4ge1xuICAgICAgc3RhcnQ6IHRoaXMuYWRhcHRlci50b0lTT0RhdGUoc3RhcnQpLFxuICAgICAgZW5kOiB0aGlzLmFkYXB0ZXIudG9JU09EYXRlKGVuZClcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBhbGwgYXZhaWxhYmxlIHByZXNldCBrZXlzXG4gICAqL1xuICBnZXRQcmVzZXRLZXlzKCk6IHN0cmluZ1tdIHtcbiAgICByZXR1cm4gQXJyYXkuZnJvbSh0aGlzLnByZXNldHMua2V5cygpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWdpc3RlciBhbGwgYnVpbHQtaW4gcHJlc2V0c1xuICAgKiBcbiAgICogQWxsIHByZXNldHMgbm93IHVzZSBEYXRlQWRhcHRlciBmb3IgdGltZXpvbmUtc2FmZSBvcGVyYXRpb25zXG4gICAqL1xuICBwcml2YXRlIHJlZ2lzdGVyQnVpbHRJblByZXNldHMoKTogdm9pZCB7XG4gICAgY29uc3QgYWRhcHRlciA9IHRoaXMuYWRhcHRlcjtcblxuICAgIC8vIFRvZGF5XG4gICAgdGhpcy5yZWdpc3RlcignVE9EQVknLCB7XG4gICAgICByZXNvbHZlOiAobm93KSA9PiB7XG4gICAgICAgIGNvbnN0IG5vcm1hbGl6ZWQgPSBhZGFwdGVyLm5vcm1hbGl6ZShub3cpO1xuICAgICAgICByZXR1cm4geyBzdGFydDogbm9ybWFsaXplZCwgZW5kOiBub3JtYWxpemVkIH07XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICAvLyBZZXN0ZXJkYXlcbiAgICB0aGlzLnJlZ2lzdGVyKCdZRVNURVJEQVknLCB7XG4gICAgICByZXNvbHZlOiAobm93KSA9PiB7XG4gICAgICAgIGNvbnN0IGRhdGUgPSBhZGFwdGVyLmFkZERheXMobm93LCAtMSk7XG4gICAgICAgIHJldHVybiB7IHN0YXJ0OiBkYXRlLCBlbmQ6IGRhdGUgfTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIC8vIExhc3QgTiBEYXlzXG4gICAgdGhpcy5yZWdpc3RlcignTEFTVF83X0RBWVMnLCB7XG4gICAgICByZXNvbHZlOiAobm93KSA9PiB7XG4gICAgICAgIGNvbnN0IGVuZCA9IGFkYXB0ZXIubm9ybWFsaXplKG5vdyk7XG4gICAgICAgIGNvbnN0IHN0YXJ0ID0gYWRhcHRlci5hZGREYXlzKG5vdywgLTYpO1xuICAgICAgICByZXR1cm4geyBzdGFydCwgZW5kIH07XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICB0aGlzLnJlZ2lzdGVyKCdMQVNUXzE0X0RBWVMnLCB7XG4gICAgICByZXNvbHZlOiAobm93KSA9PiB7XG4gICAgICAgIGNvbnN0IGVuZCA9IGFkYXB0ZXIubm9ybWFsaXplKG5vdyk7XG4gICAgICAgIGNvbnN0IHN0YXJ0ID0gYWRhcHRlci5hZGREYXlzKG5vdywgLTEzKTtcbiAgICAgICAgcmV0dXJuIHsgc3RhcnQsIGVuZCB9O1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgdGhpcy5yZWdpc3RlcignTEFTVF8zMF9EQVlTJywge1xuICAgICAgcmVzb2x2ZTogKG5vdykgPT4ge1xuICAgICAgICBjb25zdCBlbmQgPSBhZGFwdGVyLm5vcm1hbGl6ZShub3cpO1xuICAgICAgICBjb25zdCBzdGFydCA9IGFkYXB0ZXIuYWRkRGF5cyhub3csIC0yOSk7XG4gICAgICAgIHJldHVybiB7IHN0YXJ0LCBlbmQgfTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIHRoaXMucmVnaXN0ZXIoJ0xBU1RfNjBfREFZUycsIHtcbiAgICAgIHJlc29sdmU6IChub3cpID0+IHtcbiAgICAgICAgY29uc3QgZW5kID0gYWRhcHRlci5ub3JtYWxpemUobm93KTtcbiAgICAgICAgY29uc3Qgc3RhcnQgPSBhZGFwdGVyLmFkZERheXMobm93LCAtNTkpO1xuICAgICAgICByZXR1cm4geyBzdGFydCwgZW5kIH07XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICB0aGlzLnJlZ2lzdGVyKCdMQVNUXzkwX0RBWVMnLCB7XG4gICAgICByZXNvbHZlOiAobm93KSA9PiB7XG4gICAgICAgIGNvbnN0IGVuZCA9IGFkYXB0ZXIubm9ybWFsaXplKG5vdyk7XG4gICAgICAgIGNvbnN0IHN0YXJ0ID0gYWRhcHRlci5hZGREYXlzKG5vdywgLTg5KTtcbiAgICAgICAgcmV0dXJuIHsgc3RhcnQsIGVuZCB9O1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgLy8gVGhpcyBXZWVrIChNb25kYXkgdG8gU3VuZGF5KVxuICAgIHRoaXMucmVnaXN0ZXIoJ1RISVNfV0VFSycsIHtcbiAgICAgIHJlc29sdmU6IChub3cpID0+IHtcbiAgICAgICAgY29uc3QgZGF5T2ZXZWVrID0gYWRhcHRlci5nZXREYXkobm93KTtcbiAgICAgICAgY29uc3QgZGF5c1RvTW9uZGF5ID0gZGF5T2ZXZWVrID09PSAwID8gNiA6IGRheU9mV2VlayAtIDE7XG4gICAgICAgIGNvbnN0IHN0YXJ0ID0gYWRhcHRlci5hZGREYXlzKG5vdywgLWRheXNUb01vbmRheSk7XG4gICAgICAgIGNvbnN0IGVuZCA9IGFkYXB0ZXIuYWRkRGF5cyhzdGFydCwgNik7XG4gICAgICAgIHJldHVybiB7IHN0YXJ0LCBlbmQgfTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIC8vIExhc3QgV2Vla1xuICAgIHRoaXMucmVnaXN0ZXIoJ0xBU1RfV0VFSycsIHtcbiAgICAgIHJlc29sdmU6IChub3cpID0+IHtcbiAgICAgICAgY29uc3QgZGF5T2ZXZWVrID0gYWRhcHRlci5nZXREYXkobm93KTtcbiAgICAgICAgY29uc3QgZGF5c1RvTW9uZGF5ID0gZGF5T2ZXZWVrID09PSAwID8gNiA6IGRheU9mV2VlayAtIDE7XG4gICAgICAgIGNvbnN0IGxhc3RNb25kYXkgPSBhZGFwdGVyLmFkZERheXMobm93LCAtZGF5c1RvTW9uZGF5IC0gNyk7XG4gICAgICAgIGNvbnN0IGxhc3RTdW5kYXkgPSBhZGFwdGVyLmFkZERheXMobGFzdE1vbmRheSwgNik7XG4gICAgICAgIHJldHVybiB7IHN0YXJ0OiBsYXN0TW9uZGF5LCBlbmQ6IGxhc3RTdW5kYXkgfTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIC8vIFRoaXMgTW9udGhcbiAgICB0aGlzLnJlZ2lzdGVyKCdUSElTX01PTlRIJywge1xuICAgICAgcmVzb2x2ZTogKG5vdykgPT4ge1xuICAgICAgICBjb25zdCBzdGFydCA9IGFkYXB0ZXIuc3RhcnRPZk1vbnRoKG5vdyk7XG4gICAgICAgIGNvbnN0IGVuZCA9IGFkYXB0ZXIuZW5kT2ZNb250aChub3cpO1xuICAgICAgICByZXR1cm4geyBzdGFydCwgZW5kIH07XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICAvLyBMYXN0IE1vbnRoXG4gICAgdGhpcy5yZWdpc3RlcignTEFTVF9NT05USCcsIHtcbiAgICAgIHJlc29sdmU6IChub3cpID0+IHtcbiAgICAgICAgY29uc3QgbGFzdE1vbnRoID0gYWRhcHRlci5hZGRNb250aHMobm93LCAtMSk7XG4gICAgICAgIGNvbnN0IHN0YXJ0ID0gYWRhcHRlci5zdGFydE9mTW9udGgobGFzdE1vbnRoKTtcbiAgICAgICAgY29uc3QgZW5kID0gYWRhcHRlci5lbmRPZk1vbnRoKGxhc3RNb250aCk7XG4gICAgICAgIHJldHVybiB7IHN0YXJ0LCBlbmQgfTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIC8vIE1vbnRoIHRvIERhdGVcbiAgICB0aGlzLnJlZ2lzdGVyKCdNT05USF9UT19EQVRFJywge1xuICAgICAgcmVzb2x2ZTogKG5vdykgPT4ge1xuICAgICAgICBjb25zdCBzdGFydCA9IGFkYXB0ZXIuc3RhcnRPZk1vbnRoKG5vdyk7XG4gICAgICAgIGNvbnN0IGVuZCA9IGFkYXB0ZXIubm9ybWFsaXplKG5vdyk7XG4gICAgICAgIHJldHVybiB7IHN0YXJ0LCBlbmQgfTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIC8vIFRoaXMgUXVhcnRlclxuICAgIHRoaXMucmVnaXN0ZXIoJ1RISVNfUVVBUlRFUicsIHtcbiAgICAgIHJlc29sdmU6IChub3cpID0+IHtcbiAgICAgICAgY29uc3QgY3VycmVudE1vbnRoID0gYWRhcHRlci5nZXRNb250aChub3cpO1xuICAgICAgICBjb25zdCBxdWFydGVyU3RhcnRNb250aCA9IE1hdGguZmxvb3IoY3VycmVudE1vbnRoIC8gMykgKiAzO1xuICAgICAgICBjb25zdCB5ZWFyID0gYWRhcHRlci5nZXRZZWFyKG5vdyk7XG4gICAgICAgIFxuICAgICAgICAvLyBDb25zdHJ1Y3Qgc3RhcnQgb2YgcXVhcnRlclxuICAgICAgICBjb25zdCBzdGFydCA9IG5ldyBEYXRlKHllYXIsIHF1YXJ0ZXJTdGFydE1vbnRoLCAxKTtcbiAgICAgICAgY29uc3Qgbm9ybWFsaXplZFN0YXJ0ID0gYWRhcHRlci5ub3JtYWxpemUoc3RhcnQpO1xuICAgICAgICBcbiAgICAgICAgLy8gQ29uc3RydWN0IGVuZCBvZiBxdWFydGVyIChsYXN0IGRheSBvZiAzcmQgbW9udGgpXG4gICAgICAgIGNvbnN0IGVuZCA9IG5ldyBEYXRlKHllYXIsIHF1YXJ0ZXJTdGFydE1vbnRoICsgMywgMCk7XG4gICAgICAgIGNvbnN0IG5vcm1hbGl6ZWRFbmQgPSBhZGFwdGVyLm5vcm1hbGl6ZShlbmQpO1xuICAgICAgICBcbiAgICAgICAgcmV0dXJuIHsgc3RhcnQ6IG5vcm1hbGl6ZWRTdGFydCwgZW5kOiBub3JtYWxpemVkRW5kIH07XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICAvLyBMYXN0IFF1YXJ0ZXJcbiAgICB0aGlzLnJlZ2lzdGVyKCdMQVNUX1FVQVJURVInLCB7XG4gICAgICByZXNvbHZlOiAobm93KSA9PiB7XG4gICAgICAgIGNvbnN0IGN1cnJlbnRNb250aCA9IGFkYXB0ZXIuZ2V0TW9udGgobm93KTtcbiAgICAgICAgY29uc3QgbGFzdFF1YXJ0ZXJTdGFydE1vbnRoID0gTWF0aC5mbG9vcihjdXJyZW50TW9udGggLyAzKSAqIDMgLSAzO1xuICAgICAgICBjb25zdCB5ZWFyID0gYWRhcHRlci5nZXRZZWFyKG5vdyk7XG4gICAgICAgIFxuICAgICAgICAvLyBIYW5kbGUgeWVhciByb2xsb3ZlciAoUTEgLSAxID0gUTQgb2YgcHJldmlvdXMgeWVhcilcbiAgICAgICAgY29uc3QgYWRqdXN0ZWRZZWFyID0gbGFzdFF1YXJ0ZXJTdGFydE1vbnRoIDwgMCA/IHllYXIgLSAxIDogeWVhcjtcbiAgICAgICAgY29uc3QgYWRqdXN0ZWRNb250aCA9IGxhc3RRdWFydGVyU3RhcnRNb250aCA8IDAgPyA5IDogbGFzdFF1YXJ0ZXJTdGFydE1vbnRoO1xuICAgICAgICBcbiAgICAgICAgY29uc3Qgc3RhcnQgPSBuZXcgRGF0ZShhZGp1c3RlZFllYXIsIGFkanVzdGVkTW9udGgsIDEpO1xuICAgICAgICBjb25zdCBub3JtYWxpemVkU3RhcnQgPSBhZGFwdGVyLm5vcm1hbGl6ZShzdGFydCk7XG4gICAgICAgIFxuICAgICAgICBjb25zdCBlbmQgPSBuZXcgRGF0ZShhZGp1c3RlZFllYXIsIGFkanVzdGVkTW9udGggKyAzLCAwKTtcbiAgICAgICAgY29uc3Qgbm9ybWFsaXplZEVuZCA9IGFkYXB0ZXIubm9ybWFsaXplKGVuZCk7XG4gICAgICAgIFxuICAgICAgICByZXR1cm4geyBzdGFydDogbm9ybWFsaXplZFN0YXJ0LCBlbmQ6IG5vcm1hbGl6ZWRFbmQgfTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIC8vIFF1YXJ0ZXIgdG8gRGF0ZVxuICAgIHRoaXMucmVnaXN0ZXIoJ1FVQVJURVJfVE9fREFURScsIHtcbiAgICAgIHJlc29sdmU6IChub3cpID0+IHtcbiAgICAgICAgY29uc3QgY3VycmVudE1vbnRoID0gYWRhcHRlci5nZXRNb250aChub3cpO1xuICAgICAgICBjb25zdCBxdWFydGVyU3RhcnRNb250aCA9IE1hdGguZmxvb3IoY3VycmVudE1vbnRoIC8gMykgKiAzO1xuICAgICAgICBjb25zdCB5ZWFyID0gYWRhcHRlci5nZXRZZWFyKG5vdyk7XG4gICAgICAgIFxuICAgICAgICBjb25zdCBzdGFydCA9IG5ldyBEYXRlKHllYXIsIHF1YXJ0ZXJTdGFydE1vbnRoLCAxKTtcbiAgICAgICAgY29uc3Qgbm9ybWFsaXplZFN0YXJ0ID0gYWRhcHRlci5ub3JtYWxpemUoc3RhcnQpO1xuICAgICAgICBjb25zdCBlbmQgPSBhZGFwdGVyLm5vcm1hbGl6ZShub3cpO1xuICAgICAgICBcbiAgICAgICAgcmV0dXJuIHsgc3RhcnQ6IG5vcm1hbGl6ZWRTdGFydCwgZW5kIH07XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICAvLyBUaGlzIFllYXJcbiAgICB0aGlzLnJlZ2lzdGVyKCdUSElTX1lFQVInLCB7XG4gICAgICByZXNvbHZlOiAobm93KSA9PiB7XG4gICAgICAgIGNvbnN0IHllYXIgPSBhZGFwdGVyLmdldFllYXIobm93KTtcbiAgICAgICAgY29uc3Qgc3RhcnQgPSBuZXcgRGF0ZSh5ZWFyLCAwLCAxKTtcbiAgICAgICAgY29uc3QgZW5kID0gbmV3IERhdGUoeWVhciwgMTEsIDMxKTtcbiAgICAgICAgcmV0dXJuIHsgXG4gICAgICAgICAgc3RhcnQ6IGFkYXB0ZXIubm9ybWFsaXplKHN0YXJ0KSwgXG4gICAgICAgICAgZW5kOiBhZGFwdGVyLm5vcm1hbGl6ZShlbmQpIFxuICAgICAgICB9O1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgLy8gTGFzdCBZZWFyXG4gICAgdGhpcy5yZWdpc3RlcignTEFTVF9ZRUFSJywge1xuICAgICAgcmVzb2x2ZTogKG5vdykgPT4ge1xuICAgICAgICBjb25zdCB5ZWFyID0gYWRhcHRlci5nZXRZZWFyKG5vdyk7XG4gICAgICAgIGNvbnN0IHN0YXJ0ID0gbmV3IERhdGUoeWVhciAtIDEsIDAsIDEpO1xuICAgICAgICBjb25zdCBlbmQgPSBuZXcgRGF0ZSh5ZWFyIC0gMSwgMTEsIDMxKTtcbiAgICAgICAgcmV0dXJuIHsgXG4gICAgICAgICAgc3RhcnQ6IGFkYXB0ZXIubm9ybWFsaXplKHN0YXJ0KSwgXG4gICAgICAgICAgZW5kOiBhZGFwdGVyLm5vcm1hbGl6ZShlbmQpIFxuICAgICAgICB9O1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgLy8gWWVhciB0byBEYXRlXG4gICAgdGhpcy5yZWdpc3RlcignWUVBUl9UT19EQVRFJywge1xuICAgICAgcmVzb2x2ZTogKG5vdykgPT4ge1xuICAgICAgICBjb25zdCB5ZWFyID0gYWRhcHRlci5nZXRZZWFyKG5vdyk7XG4gICAgICAgIGNvbnN0IHN0YXJ0ID0gbmV3IERhdGUoeWVhciwgMCwgMSk7XG4gICAgICAgIGNvbnN0IGVuZCA9IGFkYXB0ZXIubm9ybWFsaXplKG5vdyk7XG4gICAgICAgIHJldHVybiB7IHN0YXJ0OiBhZGFwdGVyLm5vcm1hbGl6ZShzdGFydCksIGVuZCB9O1xuICAgICAgfVxuICAgIH0pO1xuICB9XG59XG5cbi8qKlxuICogQ3JlYXRlIGEgY3VzdG9tIHByZXNldCBmcm9tIGEgZnVuY3Rpb25cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZVByZXNldChcbiAgcmVzb2x2ZXI6IChub3c6IERhdGUpID0+IHsgc3RhcnQ6IERhdGU7IGVuZDogRGF0ZSB9XG4pOiBSYW5nZVByZXNldCB7XG4gIHJldHVybiB7IHJlc29sdmU6IHJlc29sdmVyIH07XG59XG5cbi8qKlxuICogQGRlcHJlY2F0ZWQgVXNlIGRlcGVuZGVuY3kgaW5qZWN0aW9uIGluc3RlYWQ6XG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBwcml2YXRlIGVuZ2luZSA9IGluamVjdChQcmVzZXRFbmdpbmUpO1xuICogYGBgXG4gKiBcbiAqIFNpbmdsZXRvbiBwcmVzZXQgZW5naW5lIGluc3RhbmNlIGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5XG4gKiBcbiAqIFdBUk5JTkc6IFRoaXMgc2luZ2xldG9uIHVzZXMgU3lzdGVtQ2xvY2sgZGlyZWN0bHkgYW5kIGlzIE5PVCBTU1Itc2FmZS5cbiAqIEZvciBTU1IgYXBwbGljYXRpb25zLCBpbmplY3QgUHJlc2V0RW5naW5lIGFuZCBvdmVycmlkZSBEQVRFX0NMT0NLIHRva2VuLlxuICogXG4gKiBUaGlzIGV4cG9ydCB3aWxsIGJlIHJlbW92ZWQgaW4gdjQuMC4wXG4gKi9cbmV4cG9ydCBjb25zdCBwcmVzZXRFbmdpbmUgPSBuZXcgUHJlc2V0RW5naW5lKCk7XG4iXX0=
|
|
179
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJlc2V0LmVuZ2luZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9jb3JlL3ByZXNldC5lbmdpbmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBaUJHO0FBRUgsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDbkQsT0FBTyxFQUFhLFVBQVUsRUFBRSxNQUFNLGNBQWMsQ0FBQztBQUNyRCxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDN0MsT0FBTyxFQUFlLFlBQVksRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQzNELE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBQzFELE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQzs7QUFtQm5EOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBK0JHO0FBSUgsTUFBTSxPQUFPLFlBQVk7SUFDZixLQUFLLENBQVk7SUFDakIsT0FBTyxDQUFjO0lBQ3JCLFFBQVEsQ0FBaUI7SUFFakM7UUFDRSxxQ0FBcUM7UUFDckMsSUFBSSxDQUFDO1lBQ0gsSUFBSSxDQUFDLEtBQUssR0FBRyxNQUFNLENBQUMsVUFBVSxFQUFFLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRSxDQUFDLElBQUksSUFBSSxXQUFXLEVBQUUsQ0FBQztZQUN6RSxJQUFJLENBQUMsT0FBTyxHQUFHLE1BQU0sQ0FBQyxZQUFZLEVBQUUsRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLENBQUMsSUFBSSxJQUFJLGlCQUFpQixFQUFFLENBQUM7WUFDbkYsSUFBSSxDQUFDLFFBQVEsR0FBRyxNQUFNLENBQUMsY0FBYyxDQUFDLENBQUM7UUFDekMsQ0FBQztRQUFDLE1BQU0sQ0FBQztZQUNQLHVEQUF1RDtZQUN2RCxJQUFJLENBQUMsS0FBSyxHQUFHLElBQUksV0FBVyxFQUFFLENBQUM7WUFDL0IsSUFBSSxDQUFDLE9BQU8sR0FBRyxJQUFJLGlCQUFpQixFQUFFLENBQUM7WUFDdkMsSUFBSSxDQUFDLFFBQVEsR0FBRyxJQUFJLGNBQWMsRUFBRSxDQUFDO1FBQ3ZDLENBQUM7SUFDSCxDQUFDO0lBRUQ7Ozs7Ozs7O09BUUc7SUFDSCxRQUFRLENBQUMsR0FBVyxFQUFFLE1BQW1CO1FBQ3ZDLGtEQUFrRDtRQUNsRCxJQUFJLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQztZQUNyQixHQUFHLEVBQUUsR0FBRztZQUNSLE9BQU8sRUFBRSxDQUFDLEtBQUssRUFBRSxPQUFPLEVBQUUsRUFBRTtnQkFDMUIsTUFBTSxHQUFHLEdBQUcsS0FBSyxDQUFDLEdBQUcsRUFBRSxDQUFDO2dCQUN4QixPQUFPLE1BQU0sQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDN0IsQ0FBQztTQUNGLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFRDs7Ozs7Ozs7Ozs7Ozs7T0FjRztJQUNILE9BQU8sQ0FBQyxHQUFXLEVBQUUsR0FBVTtRQUM3QixNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUV0QyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7WUFDWixPQUFPLENBQUMsSUFBSSxDQUFDLDBCQUEwQixHQUFHLHlCQUF5QixDQUFDLENBQUM7WUFDckUsT0FBTyxJQUFJLENBQUM7UUFDZCxDQUFDO1FBRUQsNENBQTRDO1FBQzVDLE1BQU0sY0FBYyxHQUFHLEdBQUc7WUFDeEIsQ0FBQyxDQUFDLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDLEdBQUcsRUFBRTtZQUNwQixDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQztRQUVmLHFCQUFxQjtRQUNyQixNQUFNLEVBQUUsS0FBSyxFQUFFLEdBQUcsRUFBRSxHQUFHLE1BQU0sQ0FBQyxPQUFPLENBQUMsY0FBYyxFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUVwRSx3QkFBd0I7UUFDeEIsT0FBTztZQUNMLEtBQUssRUFBRSxJQUFJLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUM7WUFDcEMsR0FBRyxFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQztTQUNqQyxDQUFDO0lBQ0osQ0FBQztJQUVEOzs7Ozs7T0FNRztJQUNILGFBQWE7UUFDWCxPQUFPLElBQUksQ0FBQyxRQUFRLENBQUMsVUFBVSxFQUFFLENBQUM7SUFDcEMsQ0FBQztJQUVEOzs7OztPQUtHO0lBQ0gsU0FBUyxDQUFDLEdBQVc7UUFDbkIsT0FBTyxJQUFJLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUNoQyxDQUFDO3dHQWhHVSxZQUFZOzRHQUFaLFlBQVksY0FGWCxNQUFNOzs0RkFFUCxZQUFZO2tCQUh4QixVQUFVO21CQUFDO29CQUNWLFVBQVUsRUFBRSxNQUFNO2lCQUNuQjs7QUFvR0Q7Ozs7O0dBS0c7QUFDSCxNQUFNLFVBQVUsWUFBWSxDQUMxQixRQUFtRDtJQUVuRCxPQUFPLEVBQUUsT0FBTyxFQUFFLFFBQVEsRUFBRSxDQUFDO0FBQy9CLENBQUM7QUFFRDs7Ozs7Ozs7Ozs7O0dBWUc7QUFDSCxNQUFNLENBQUMsTUFBTSxZQUFZLEdBQUcsSUFBSSxZQUFZLEVBQUUsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogSGVhZGxlc3MgUHJlc2V0IEVuZ2luZVxuICogUHVyZSBmdW5jdGlvbnMgdGhhdCByZXNvbHZlIGRhdGUgcmFuZ2VzIFdJVEhPVVQgcmVuZGVyIGRlcGVuZGVuY3lcbiAqIFBlcmZlY3QgZm9yIFNTUiwgZ2xvYmFsIHN0YXRlLCBkYXNoYm9hcmQgZmlsdGVyc1xuICogXG4gKiB2My41LjA6IFNTUi1TYWZlIHZpYSBDbG9jayBJbmplY3Rpb25cbiAqIEFsbCBkYXRlIGNhbGN1bGF0aW9ucyB1c2UgRGF0ZUNsb2NrIGluc3RlYWQgb2YgbmV3IERhdGUoKVxuICogVGhpcyBlbnN1cmVzIHNlcnZlciBhbmQgY2xpZW50IHJlc29sdmUgaWRlbnRpY2FsIHByZXNldHNcbiAqIFxuICogdjMuNS4xOiBUaW1lem9uZS1TYWZlIHZpYSBEYXRlQWRhcHRlclxuICogQWxsIGRhdGUgb3BlcmF0aW9ucyB1c2UgRGF0ZUFkYXB0ZXIgZm9yIGNvbnNpc3RlbnQgYmVoYXZpb3JcbiAqIEZpeGVzIHRpbWV6b25lIGJ1Z3MgY29tbW9uIGluIEVSUC9CSS9QT1Mgc3lzdGVtc1xuICogXG4gKiB2My42LjA6IFBsdWdpbi1Ecml2ZW4gQXJjaGl0ZWN0dXJlXG4gKiBQcmVzZXQgRW5naW5lIG5vdyB1c2VzIFByZXNldFJlZ2lzdHJ5IGZvciBwbHVnaW4tYmFzZWQgZXh0ZW5zaWJpbGl0eVxuICogRm9sbG93cyBPcGVuL0Nsb3NlZCBQcmluY2lwbGUgLSBleHRlbmQgd2l0aG91dCBtb2RpZnlpbmcgY29yZVxuICogU3VwcG9ydHMgZXh0ZXJuYWwgcHJlc2V0IHBhY2thZ2VzIGZvciBpbmR1c3RyeS1zcGVjaWZpYyBuZWVkc1xuICovXG5cbmltcG9ydCB7IEluamVjdGFibGUsIGluamVjdCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgRGF0ZUNsb2NrLCBEQVRFX0NMT0NLIH0gZnJvbSAnLi9kYXRlLWNsb2NrJztcbmltcG9ydCB7IFN5c3RlbUNsb2NrIH0gZnJvbSAnLi9zeXN0ZW0tY2xvY2snO1xuaW1wb3J0IHsgRGF0ZUFkYXB0ZXIsIERBVEVfQURBUFRFUiB9IGZyb20gJy4vZGF0ZS1hZGFwdGVyJztcbmltcG9ydCB7IE5hdGl2ZURhdGVBZGFwdGVyIH0gZnJvbSAnLi9uYXRpdmUtZGF0ZS1hZGFwdGVyJztcbmltcG9ydCB7IFByZXNldFJlZ2lzdHJ5IH0gZnJvbSAnLi9wcmVzZXQtcmVnaXN0cnknO1xuXG4vKipcbiAqIEBkZXByZWNhdGVkIFVzZSBSYW5nZVByZXNldFBsdWdpbiBmcm9tICcuL3JhbmdlLXByZXNldC5wbHVnaW4nIGluc3RlYWRcbiAqIEtlcHQgZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHlcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBSYW5nZVByZXNldCB7XG4gIC8qKlxuICAgKiBSZXNvbHZlIHByZXNldCB0byBhY3R1YWwgZGF0ZSByYW5nZVxuICAgKiBAcGFyYW0gbm93IC0gQ3VycmVudCBkYXRlIGZvciBkZXRlcm1pbmlzdGljIGNhbGN1bGF0aW9uXG4gICAqL1xuICByZXNvbHZlKG5vdzogRGF0ZSk6IHsgc3RhcnQ6IERhdGU7IGVuZDogRGF0ZSB9O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFByZXNldFJhbmdlIHtcbiAgc3RhcnQ6IHN0cmluZzsgLy8gSVNPIGZvcm1hdFxuICBlbmQ6IHN0cmluZzsgLy8gSVNPIGZvcm1hdFxufVxuXG4vKipcbiAqIFByZXNldCBFbmdpbmUgLSBQbHVnaW4tRHJpdmVuIEFyY2hpdGVjdHVyZVxuICogXG4gKiBBUkNISVRFQ1RVUkUgKHYzLjYuMCk6XG4gKiAtIE5PIGxvbmdlciBjb250YWlucyBwcmVzZXRzIGludGVybmFsbHlcbiAqIC0gVXNlcyBQcmVzZXRSZWdpc3RyeSBmb3IgcGx1Z2luIG1hbmFnZW1lbnRcbiAqIC0gSW5qZWN0cyBEYXRlQ2xvY2sgZm9yIFNTUi1zYWZlIHRpbWVcbiAqIC0gSW5qZWN0cyBEYXRlQWRhcHRlciBmb3IgdGltZXpvbmUtc2FmZSBvcGVyYXRpb25zXG4gKiAtIEZvbGxvd3MgT3Blbi9DbG9zZWQgUHJpbmNpcGxlXG4gKiBcbiAqIEJBQ0tXQVJEIENPTVBBVElCSUxJVFk6XG4gKiAtIE9sZCBBUEkgdW5jaGFuZ2VkOiByZXNvbHZlKCksIHJlZ2lzdGVyKCksIGdldFByZXNldEtleXMoKVxuICogLSBCdWlsdC1pbiBwcmVzZXRzIGF1dG8tcmVnaXN0ZXJlZCB2aWEgcHJvdmlkZXJcbiAqIC0gRXhpc3RpbmcgY29kZSBjb250aW51ZXMgdG8gd29ya1xuICogXG4gKiBFWFRFTlNJQklMSVRZOlxuICogYGBgdHlwZXNjcmlwdFxuICogLy8gUmVnaXN0ZXIgY3VzdG9tIHByZXNldCB2aWEgcmVnaXN0cnlcbiAqIGNvbnN0IHJlZ2lzdHJ5ID0gaW5qZWN0KFByZXNldFJlZ2lzdHJ5KTtcbiAqIHJlZ2lzdHJ5LnJlZ2lzdGVyKHtcbiAqICAga2V5OiAnTVlfUFJFU0VUJyxcbiAqICAgcmVzb2x2ZTogKGNsb2NrLCBhZGFwdGVyKSA9PiB7XG4gKiAgICAgY29uc3Qgbm93ID0gY2xvY2subm93KCk7XG4gKiAgICAgcmV0dXJuIHsgc3RhcnQ6IG5vdywgZW5kOiBub3cgfTtcbiAqICAgfVxuICogfSk7XG4gKiBcbiAqIC8vIFVzZSB2aWEgZW5naW5lXG4gKiBjb25zdCBlbmdpbmUgPSBpbmplY3QoUHJlc2V0RW5naW5lKTtcbiAqIGNvbnN0IHJhbmdlID0gZW5naW5lLnJlc29sdmUoJ01ZX1BSRVNFVCcpO1xuICogYGBgXG4gKi9cbkBJbmplY3RhYmxlKHtcbiAgcHJvdmlkZWRJbjogJ3Jvb3QnXG59KVxuZXhwb3J0IGNsYXNzIFByZXNldEVuZ2luZSB7XG4gIHByaXZhdGUgY2xvY2s6IERhdGVDbG9jaztcbiAgcHJpdmF0ZSBhZGFwdGVyOiBEYXRlQWRhcHRlcjtcbiAgcHJpdmF0ZSByZWdpc3RyeTogUHJlc2V0UmVnaXN0cnk7XG5cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgLy8gSW5qZWN0IGRlcGVuZGVuY2llcyB3aXRoIGZhbGxiYWNrc1xuICAgIHRyeSB7XG4gICAgICB0aGlzLmNsb2NrID0gaW5qZWN0KERBVEVfQ0xPQ0ssIHsgb3B0aW9uYWw6IHRydWUgfSkgPz8gbmV3IFN5c3RlbUNsb2NrKCk7XG4gICAgICB0aGlzLmFkYXB0ZXIgPSBpbmplY3QoREFURV9BREFQVEVSLCB7IG9wdGlvbmFsOiB0cnVlIH0pID8/IG5ldyBOYXRpdmVEYXRlQWRhcHRlcigpO1xuICAgICAgdGhpcy5yZWdpc3RyeSA9IGluamVjdChQcmVzZXRSZWdpc3RyeSk7XG4gICAgfSBjYXRjaCB7XG4gICAgICAvLyBGYWxsYmFjayBpZiBpbmplY3QoKSBmYWlscyBvdXRzaWRlIGluamVjdGlvbiBjb250ZXh0XG4gICAgICB0aGlzLmNsb2NrID0gbmV3IFN5c3RlbUNsb2NrKCk7XG4gICAgICB0aGlzLmFkYXB0ZXIgPSBuZXcgTmF0aXZlRGF0ZUFkYXB0ZXIoKTtcbiAgICAgIHRoaXMucmVnaXN0cnkgPSBuZXcgUHJlc2V0UmVnaXN0cnkoKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUmVnaXN0ZXIgYSBjdXN0b20gcHJlc2V0XG4gICAqIFxuICAgKiBAZGVwcmVjYXRlZCBVc2UgUHJlc2V0UmVnaXN0cnkucmVnaXN0ZXIoKSBkaXJlY3RseSBmb3IgbmV3IGNvZGVcbiAgICogS2VwdCBmb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eVxuICAgKiBcbiAgICogQHBhcmFtIGtleSAtIFByZXNldCBrZXkgKGUuZy4sICdNWV9DVVNUT01fUFJFU0VUJylcbiAgICogQHBhcmFtIHByZXNldCAtIExlZ2FjeSBSYW5nZVByZXNldCBvYmplY3RcbiAgICovXG4gIHJlZ2lzdGVyKGtleTogc3RyaW5nLCBwcmVzZXQ6IFJhbmdlUHJlc2V0KTogdm9pZCB7XG4gICAgLy8gQ29udmVydCBsZWdhY3kgUmFuZ2VQcmVzZXQgdG8gUmFuZ2VQcmVzZXRQbHVnaW5cbiAgICB0aGlzLnJlZ2lzdHJ5LnJlZ2lzdGVyKHtcbiAgICAgIGtleToga2V5LFxuICAgICAgcmVzb2x2ZTogKGNsb2NrLCBhZGFwdGVyKSA9PiB7XG4gICAgICAgIGNvbnN0IG5vdyA9IGNsb2NrLm5vdygpO1xuICAgICAgICByZXR1cm4gcHJlc2V0LnJlc29sdmUobm93KTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXNvbHZlIGEgcHJlc2V0IHRvIGRhdGUgcmFuZ2VcbiAgICogXG4gICAqIFBsdWdpbiBBcmNoaXRlY3R1cmU6XG4gICAqIDEuIExvb2tzIHVwIHBsdWdpbiBpbiBQcmVzZXRSZWdpc3RyeVxuICAgKiAyLiBDYWxscyBwbHVnaW4ucmVzb2x2ZShjbG9jaywgYWRhcHRlcilcbiAgICogMy4gUmV0dXJucyBJU08gZGF0ZSByYW5nZVxuICAgKiBcbiAgICogU1NSIE5vdGU6IFVzZXMgaW5qZWN0ZWQgRGF0ZUNsb2NrIGZvciBkZXRlcm1pbmlzdGljIHJlc29sdXRpb25cbiAgICogVGltZXpvbmUgTm90ZTogVXNlcyBpbmplY3RlZCBEYXRlQWRhcHRlciBmb3IgY29uc2lzdGVudCBvcGVyYXRpb25zXG4gICAqIFxuICAgKiBAcGFyYW0ga2V5IC0gUHJlc2V0IGtleSAoZS5nLiwgJ1RPREFZJywgJ0xBU1RfN19EQVlTJylcbiAgICogQHBhcmFtIG5vdyAtIE9wdGlvbmFsIG92ZXJyaWRlIGZvciBjdXJyZW50IGRhdGUgKGRlZmF1bHRzIHRvIGNsb2NrLm5vdygpKVxuICAgKiBAcmV0dXJucyBJU08gZGF0ZSByYW5nZSBvciBudWxsIGlmIHByZXNldCBub3QgZm91bmRcbiAgICovXG4gIHJlc29sdmUoa2V5OiBzdHJpbmcsIG5vdz86IERhdGUpOiBQcmVzZXRSYW5nZSB8IG51bGwge1xuICAgIGNvbnN0IHBsdWdpbiA9IHRoaXMucmVnaXN0cnkuZ2V0KGtleSk7XG4gICAgXG4gICAgaWYgKCFwbHVnaW4pIHtcbiAgICAgIGNvbnNvbGUud2FybihgW1ByZXNldEVuZ2luZV0gUHJlc2V0IFwiJHtrZXl9XCIgbm90IGZvdW5kIGluIHJlZ2lzdHJ5YCk7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICAvLyBDcmVhdGUgdGVtcG9yYXJ5IGNsb2NrIGlmIG5vdyBpcyBwcm92aWRlZFxuICAgIGNvbnN0IGVmZmVjdGl2ZUNsb2NrID0gbm93IFxuICAgICAgPyB7IG5vdzogKCkgPT4gbm93IH0gXG4gICAgICA6IHRoaXMuY2xvY2s7XG5cbiAgICAvLyBSZXNvbHZlIHZpYSBwbHVnaW5cbiAgICBjb25zdCB7IHN0YXJ0LCBlbmQgfSA9IHBsdWdpbi5yZXNvbHZlKGVmZmVjdGl2ZUNsb2NrLCB0aGlzLmFkYXB0ZXIpO1xuXG4gICAgLy8gQ29udmVydCB0byBJU08gZm9ybWF0XG4gICAgcmV0dXJuIHtcbiAgICAgIHN0YXJ0OiB0aGlzLmFkYXB0ZXIudG9JU09EYXRlKHN0YXJ0KSxcbiAgICAgIGVuZDogdGhpcy5hZGFwdGVyLnRvSVNPRGF0ZShlbmQpXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgYWxsIGF2YWlsYWJsZSBwcmVzZXQga2V5c1xuICAgKiBcbiAgICogRGVsZWdhdGVzIHRvIFByZXNldFJlZ2lzdHJ5XG4gICAqIFxuICAgKiBAcmV0dXJucyBBcnJheSBvZiByZWdpc3RlcmVkIHByZXNldCBrZXlzXG4gICAqL1xuICBnZXRQcmVzZXRLZXlzKCk6IHN0cmluZ1tdIHtcbiAgICByZXR1cm4gdGhpcy5yZWdpc3RyeS5nZXRBbGxLZXlzKCk7XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2sgaWYgYSBwcmVzZXQgZXhpc3RzXG4gICAqIFxuICAgKiBAcGFyYW0ga2V5IC0gUHJlc2V0IGtleSB0byBjaGVja1xuICAgKiBAcmV0dXJucyB0cnVlIGlmIHByZXNldCBpcyByZWdpc3RlcmVkXG4gICAqL1xuICBoYXNQcmVzZXQoa2V5OiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5yZWdpc3RyeS5oYXMoa2V5KTtcbiAgfVxufVxuXG4vKipcbiAqIENyZWF0ZSBhIGN1c3RvbSBwcmVzZXQgZnJvbSBhIGZ1bmN0aW9uXG4gKiBcbiAqIEBkZXByZWNhdGVkIFVzZSBSYW5nZVByZXNldFBsdWdpbiBpbnRlcmZhY2UgaW5zdGVhZFxuICogS2VwdCBmb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eVxuICovXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlUHJlc2V0KFxuICByZXNvbHZlcjogKG5vdzogRGF0ZSkgPT4geyBzdGFydDogRGF0ZTsgZW5kOiBEYXRlIH1cbik6IFJhbmdlUHJlc2V0IHtcbiAgcmV0dXJuIHsgcmVzb2x2ZTogcmVzb2x2ZXIgfTtcbn1cblxuLyoqXG4gKiBAZGVwcmVjYXRlZCBVc2UgZGVwZW5kZW5jeSBpbmplY3Rpb24gaW5zdGVhZDpcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIHByaXZhdGUgZW5naW5lID0gaW5qZWN0KFByZXNldEVuZ2luZSk7XG4gKiBgYGBcbiAqIFxuICogU2luZ2xldG9uIHByZXNldCBlbmdpbmUgaW5zdGFuY2UgZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHlcbiAqIFxuICogV0FSTklORzogVGhpcyBzaW5nbGV0b24gdXNlcyBTeXN0ZW1DbG9jayBkaXJlY3RseSBhbmQgaXMgTk9UIFNTUi1zYWZlLlxuICogRm9yIFNTUiBhcHBsaWNhdGlvbnMsIGluamVjdCBQcmVzZXRFbmdpbmUgYW5kIG92ZXJyaWRlIERBVEVfQ0xPQ0sgdG9rZW4uXG4gKiBcbiAqIFRoaXMgZXhwb3J0IHdpbGwgYmUgcmVtb3ZlZCBpbiB2NC4wLjBcbiAqL1xuZXhwb3J0IGNvbnN0IHByZXNldEVuZ2luZSA9IG5ldyBQcmVzZXRFbmdpbmUoKTtcbiJdfQ==
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Range Preset Plugin System
|
|
3
|
+
*
|
|
4
|
+
* Version: 3.6.0
|
|
5
|
+
*
|
|
6
|
+
* Plugin-based architecture for date range presets following Open/Closed Principle.
|
|
7
|
+
*
|
|
8
|
+
* WHY THIS EXISTS:
|
|
9
|
+
* - Enterprise apps need industry-specific presets (fiscal, hotel, logistics)
|
|
10
|
+
* - Presets should be distributable as external packages
|
|
11
|
+
* - Core should NOT know about all possible presets
|
|
12
|
+
* - Users should extend presets without modifying library code
|
|
13
|
+
*
|
|
14
|
+
* ARCHITECTURE:
|
|
15
|
+
* ```
|
|
16
|
+
* RangePresetPlugin (interface) - Contract for all presets
|
|
17
|
+
* ↓
|
|
18
|
+
* PresetRegistry (service) - Manages plugin registration
|
|
19
|
+
* ↓
|
|
20
|
+
* PresetEngine (refactored) - Resolves presets via registry
|
|
21
|
+
* ↓
|
|
22
|
+
* DualDateRangeStore - No changes, backward compatible
|
|
23
|
+
* ```
|
|
24
|
+
*
|
|
25
|
+
* USAGE:
|
|
26
|
+
* ```typescript
|
|
27
|
+
* // Built-in presets work automatically
|
|
28
|
+
* store.applyPreset('LAST_7_DAYS'); // ✅ Works
|
|
29
|
+
*
|
|
30
|
+
* // Register custom preset
|
|
31
|
+
* const registry = inject(PresetRegistry);
|
|
32
|
+
* registry.register({
|
|
33
|
+
* key: 'THIS_FISCAL_QUARTER',
|
|
34
|
+
* resolve: (clock, adapter) => {
|
|
35
|
+
* const now = clock.now();
|
|
36
|
+
* const fiscalStart = adapter.startOfMonth(now);
|
|
37
|
+
* const fiscalEnd = adapter.endOfMonth(now);
|
|
38
|
+
* return { start: fiscalStart, end: fiscalEnd };
|
|
39
|
+
* }
|
|
40
|
+
* });
|
|
41
|
+
*
|
|
42
|
+
* // Use custom preset
|
|
43
|
+
* store.applyPreset('THIS_FISCAL_QUARTER'); // ✅ Works
|
|
44
|
+
* ```
|
|
45
|
+
*
|
|
46
|
+
* EXTERNAL PACKAGES:
|
|
47
|
+
* ```typescript
|
|
48
|
+
* // @acme/fiscal-presets package
|
|
49
|
+
* export const FISCAL_PRESETS: RangePresetPlugin[] = [
|
|
50
|
+
* { key: 'FISCAL_Q1', resolve: ... },
|
|
51
|
+
* { key: 'FISCAL_Q2', resolve: ... }
|
|
52
|
+
* ];
|
|
53
|
+
*
|
|
54
|
+
* // In app
|
|
55
|
+
* FISCAL_PRESETS.forEach(p => registry.register(p));
|
|
56
|
+
* ```
|
|
57
|
+
*/
|
|
58
|
+
/**
|
|
59
|
+
* Type guard to check if object is a valid RangePresetPlugin
|
|
60
|
+
*
|
|
61
|
+
* @param obj - Object to check
|
|
62
|
+
* @returns true if object implements RangePresetPlugin interface
|
|
63
|
+
*/
|
|
64
|
+
export function isRangePresetPlugin(obj) {
|
|
65
|
+
return (obj &&
|
|
66
|
+
typeof obj === 'object' &&
|
|
67
|
+
typeof obj.key === 'string' &&
|
|
68
|
+
typeof obj.resolve === 'function');
|
|
69
|
+
}
|
|
70
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmFuZ2UtcHJlc2V0LnBsdWdpbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9jb3JlL3JhbmdlLXByZXNldC5wbHVnaW4udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBd0RHO0FBbUlIOzs7OztHQUtHO0FBQ0gsTUFBTSxVQUFVLG1CQUFtQixDQUFDLEdBQVE7SUFDMUMsT0FBTyxDQUNMLEdBQUc7UUFDSCxPQUFPLEdBQUcsS0FBSyxRQUFRO1FBQ3ZCLE9BQU8sR0FBRyxDQUFDLEdBQUcsS0FBSyxRQUFRO1FBQzNCLE9BQU8sR0FBRyxDQUFDLE9BQU8sS0FBSyxVQUFVLENBQ2xDLENBQUM7QUFDSixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBSYW5nZSBQcmVzZXQgUGx1Z2luIFN5c3RlbVxuICogXG4gKiBWZXJzaW9uOiAzLjYuMFxuICogXG4gKiBQbHVnaW4tYmFzZWQgYXJjaGl0ZWN0dXJlIGZvciBkYXRlIHJhbmdlIHByZXNldHMgZm9sbG93aW5nIE9wZW4vQ2xvc2VkIFByaW5jaXBsZS5cbiAqIFxuICogV0hZIFRISVMgRVhJU1RTOlxuICogLSBFbnRlcnByaXNlIGFwcHMgbmVlZCBpbmR1c3RyeS1zcGVjaWZpYyBwcmVzZXRzIChmaXNjYWwsIGhvdGVsLCBsb2dpc3RpY3MpXG4gKiAtIFByZXNldHMgc2hvdWxkIGJlIGRpc3RyaWJ1dGFibGUgYXMgZXh0ZXJuYWwgcGFja2FnZXNcbiAqIC0gQ29yZSBzaG91bGQgTk9UIGtub3cgYWJvdXQgYWxsIHBvc3NpYmxlIHByZXNldHNcbiAqIC0gVXNlcnMgc2hvdWxkIGV4dGVuZCBwcmVzZXRzIHdpdGhvdXQgbW9kaWZ5aW5nIGxpYnJhcnkgY29kZVxuICogXG4gKiBBUkNISVRFQ1RVUkU6XG4gKiBgYGBcbiAqIFJhbmdlUHJlc2V0UGx1Z2luIChpbnRlcmZhY2UpIC0gQ29udHJhY3QgZm9yIGFsbCBwcmVzZXRzXG4gKiAgICAg4oaTXG4gKiBQcmVzZXRSZWdpc3RyeSAoc2VydmljZSkgLSBNYW5hZ2VzIHBsdWdpbiByZWdpc3RyYXRpb25cbiAqICAgICDihpNcbiAqIFByZXNldEVuZ2luZSAocmVmYWN0b3JlZCkgLSBSZXNvbHZlcyBwcmVzZXRzIHZpYSByZWdpc3RyeVxuICogICAgIOKGk1xuICogRHVhbERhdGVSYW5nZVN0b3JlIC0gTm8gY2hhbmdlcywgYmFja3dhcmQgY29tcGF0aWJsZVxuICogYGBgXG4gKiBcbiAqIFVTQUdFOlxuICogYGBgdHlwZXNjcmlwdFxuICogLy8gQnVpbHQtaW4gcHJlc2V0cyB3b3JrIGF1dG9tYXRpY2FsbHlcbiAqIHN0b3JlLmFwcGx5UHJlc2V0KCdMQVNUXzdfREFZUycpOyAvLyDinIUgV29ya3NcbiAqIFxuICogLy8gUmVnaXN0ZXIgY3VzdG9tIHByZXNldFxuICogY29uc3QgcmVnaXN0cnkgPSBpbmplY3QoUHJlc2V0UmVnaXN0cnkpO1xuICogcmVnaXN0cnkucmVnaXN0ZXIoe1xuICogICBrZXk6ICdUSElTX0ZJU0NBTF9RVUFSVEVSJyxcbiAqICAgcmVzb2x2ZTogKGNsb2NrLCBhZGFwdGVyKSA9PiB7XG4gKiAgICAgY29uc3Qgbm93ID0gY2xvY2subm93KCk7XG4gKiAgICAgY29uc3QgZmlzY2FsU3RhcnQgPSBhZGFwdGVyLnN0YXJ0T2ZNb250aChub3cpO1xuICogICAgIGNvbnN0IGZpc2NhbEVuZCA9IGFkYXB0ZXIuZW5kT2ZNb250aChub3cpO1xuICogICAgIHJldHVybiB7IHN0YXJ0OiBmaXNjYWxTdGFydCwgZW5kOiBmaXNjYWxFbmQgfTtcbiAqICAgfVxuICogfSk7XG4gKiBcbiAqIC8vIFVzZSBjdXN0b20gcHJlc2V0XG4gKiBzdG9yZS5hcHBseVByZXNldCgnVEhJU19GSVNDQUxfUVVBUlRFUicpOyAvLyDinIUgV29ya3NcbiAqIGBgYFxuICogXG4gKiBFWFRFUk5BTCBQQUNLQUdFUzpcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIC8vIEBhY21lL2Zpc2NhbC1wcmVzZXRzIHBhY2thZ2VcbiAqIGV4cG9ydCBjb25zdCBGSVNDQUxfUFJFU0VUUzogUmFuZ2VQcmVzZXRQbHVnaW5bXSA9IFtcbiAqICAgeyBrZXk6ICdGSVNDQUxfUTEnLCByZXNvbHZlOiAuLi4gfSxcbiAqICAgeyBrZXk6ICdGSVNDQUxfUTInLCByZXNvbHZlOiAuLi4gfVxuICogXTtcbiAqIFxuICogLy8gSW4gYXBwXG4gKiBGSVNDQUxfUFJFU0VUUy5mb3JFYWNoKHAgPT4gcmVnaXN0cnkucmVnaXN0ZXIocCkpO1xuICogYGBgXG4gKi9cblxuaW1wb3J0IHsgRGF0ZUNsb2NrIH0gZnJvbSAnLi9kYXRlLWNsb2NrJztcbmltcG9ydCB7IERhdGVBZGFwdGVyIH0gZnJvbSAnLi9kYXRlLWFkYXB0ZXInO1xuXG4vKipcbiAqIERhdGUgcmFuZ2UgcmV0dXJuZWQgYnkgcHJlc2V0IHBsdWdpbnNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBEYXRlUmFuZ2Uge1xuICAvKipcbiAgICogU3RhcnQgZGF0ZSBvZiB0aGUgcmFuZ2UgKGluY2x1c2l2ZSlcbiAgICovXG4gIHN0YXJ0OiBEYXRlO1xuXG4gIC8qKlxuICAgKiBFbmQgZGF0ZSBvZiB0aGUgcmFuZ2UgKGluY2x1c2l2ZSlcbiAgICovXG4gIGVuZDogRGF0ZTtcbn1cblxuLyoqXG4gKiBSYW5nZSBQcmVzZXQgUGx1Z2luIEludGVyZmFjZVxuICogXG4gKiBBbGwgZGF0ZSByYW5nZSBwcmVzZXRzIChidWlsdC1pbiBvciBleHRlcm5hbCkgaW1wbGVtZW50IHRoaXMgaW50ZXJmYWNlLlxuICogXG4gKiBERVNJR04gUFJJTkNJUExFUzpcbiAqIC0gKipEZXRlcm1pbmlzdGljKio6IEdpdmVuIHRoZSBzYW1lIGNsb2NrLm5vdygpLCBhbHdheXMgcmV0dXJucyBzYW1lIHJhbmdlXG4gKiAtICoqVGltZXpvbmUtc2FmZSoqOiBVc2VzIERhdGVBZGFwdGVyIGZvciBhbGwgZGF0ZSBvcGVyYXRpb25zXG4gKiAtICoqU1NSLWNvbXBhdGlibGUqKjogVXNlcyBEYXRlQ2xvY2sgaW5qZWN0aW9uLCBubyBnbG9iYWwgRGF0ZSgpXG4gKiAtICoqVGVzdGFibGUqKjogUHVyZSBmdW5jdGlvbiwgbm8gc2lkZSBlZmZlY3RzXG4gKiBcbiAqIEVYQU1QTEUgLSBCdWlsdC1pbiBwcmVzZXQ6XG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBjb25zdCB0b2RheVByZXNldDogUmFuZ2VQcmVzZXRQbHVnaW4gPSB7XG4gKiAgIGtleTogJ1RPREFZJyxcbiAqICAgcmVzb2x2ZTogKGNsb2NrLCBhZGFwdGVyKSA9PiB7XG4gKiAgICAgY29uc3Qgbm93ID0gY2xvY2subm93KCk7XG4gKiAgICAgY29uc3Qgbm9ybWFsaXplZCA9IGFkYXB0ZXIubm9ybWFsaXplKG5vdyk7XG4gKiAgICAgcmV0dXJuIHsgc3RhcnQ6IG5vcm1hbGl6ZWQsIGVuZDogbm9ybWFsaXplZCB9O1xuICogICB9XG4gKiB9O1xuICogYGBgXG4gKiBcbiAqIEVYQU1QTEUgLSBDdXN0b20gZmlzY2FsIHByZXNldDpcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGNvbnN0IGZpc2NhbFF1YXJ0ZXJQcmVzZXQ6IFJhbmdlUHJlc2V0UGx1Z2luID0ge1xuICogICBrZXk6ICdUSElTX0ZJU0NBTF9RVUFSVEVSJyxcbiAqICAgcmVzb2x2ZTogKGNsb2NrLCBhZGFwdGVyKSA9PiB7XG4gKiAgICAgY29uc3Qgbm93ID0gY2xvY2subm93KCk7XG4gKiAgICAgY29uc3QgbW9udGggPSBhZGFwdGVyLmdldE1vbnRoKG5vdyk7IC8vIDAtMTFcbiAqICAgICBcbiAqICAgICAvLyBGaXNjYWwgeWVhciBzdGFydHMgaW4gQXByaWwgKG1vbnRoIDMpXG4gKiAgICAgY29uc3QgZmlzY2FsTW9udGggPSAobW9udGggKyA5KSAlIDEyOyAvLyBPZmZzZXQgdG8gZmlzY2FsIGNhbGVuZGFyXG4gKiAgICAgY29uc3QgcXVhcnRlclN0YXJ0TW9udGggPSBNYXRoLmZsb29yKGZpc2NhbE1vbnRoIC8gMykgKiAzO1xuICogICAgIGNvbnN0IGFkanVzdGVkTW9udGggPSAocXVhcnRlclN0YXJ0TW9udGggLSA5ICsgMTIpICUgMTI7XG4gKiAgICAgXG4gKiAgICAgY29uc3QgeWVhck9mZnNldCA9IG1vbnRoIDwgMyA/IC0xIDogMDtcbiAqICAgICBjb25zdCB5ZWFyID0gYWRhcHRlci5nZXRZZWFyKG5vdykgKyB5ZWFyT2Zmc2V0O1xuICogICAgIFxuICogICAgIGNvbnN0IHN0YXJ0ID0gbmV3IERhdGUoeWVhciwgYWRqdXN0ZWRNb250aCwgMSk7XG4gKiAgICAgY29uc3QgZW5kID0gbmV3IERhdGUoeWVhciwgYWRqdXN0ZWRNb250aCArIDMsIDApO1xuICogICAgIFxuICogICAgIHJldHVybiB7XG4gKiAgICAgICBzdGFydDogYWRhcHRlci5ub3JtYWxpemUoc3RhcnQpLFxuICogICAgICAgZW5kOiBhZGFwdGVyLm5vcm1hbGl6ZShlbmQpXG4gKiAgICAgfTtcbiAqICAgfVxuICogfTtcbiAqIGBgYFxuICogXG4gKiBFWEFNUExFIC0gSG90ZWwgaW5kdXN0cnkgcHJlc2V0OlxuICogYGBgdHlwZXNjcmlwdFxuICogY29uc3QgY2hlY2tJbldlZWtQcmVzZXQ6IFJhbmdlUHJlc2V0UGx1Z2luID0ge1xuICogICBrZXk6ICdDSEVDS19JTl9XRUVLJyxcbiAqICAgcmVzb2x2ZTogKGNsb2NrLCBhZGFwdGVyKSA9PiB7XG4gKiAgICAgY29uc3Qgbm93ID0gY2xvY2subm93KCk7XG4gKiAgICAgLy8gSG90ZWwgY2hlY2staW5zIGFyZSBGcmlkYXkgdG8gRnJpZGF5XG4gKiAgICAgY29uc3QgZGF5T2ZXZWVrID0gYWRhcHRlci5nZXREYXlPZldlZWsobm93KTtcbiAqICAgICBjb25zdCBkYXlzVG9GcmlkYXkgPSBkYXlPZldlZWsgPD0gNSA/IDUgLSBkYXlPZldlZWsgOiA3IC0gZGF5T2ZXZWVrICsgNTtcbiAqICAgICBcbiAqICAgICBjb25zdCBuZXh0RnJpZGF5ID0gYWRhcHRlci5hZGREYXlzKG5vdywgZGF5c1RvRnJpZGF5KTtcbiAqICAgICBjb25zdCBmb2xsb3dpbmdGcmlkYXkgPSBhZGFwdGVyLmFkZERheXMobmV4dEZyaWRheSwgNyk7XG4gKiAgICAgXG4gKiAgICAgcmV0dXJuIHsgc3RhcnQ6IG5leHRGcmlkYXksIGVuZDogZm9sbG93aW5nRnJpZGF5IH07XG4gKiAgIH1cbiAqIH07XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBSYW5nZVByZXNldFBsdWdpbiB7XG4gIC8qKlxuICAgKiBVbmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHByZXNldFxuICAgKiBcbiAgICogQ29udmVudGlvbjogU0NSRUFNSU5HX1NOQUtFX0NBU0VcbiAgICogXG4gICAqIEV4YW1wbGVzOlxuICAgKiAtIEJ1aWx0LWluOiAnVE9EQVknLCAnTEFTVF83X0RBWVMnLCAnVEhJU19NT05USCdcbiAgICogLSBGaXNjYWw6ICdGSVNDQUxfUTEnLCAnRklTQ0FMX1lFQVJfVE9fREFURSdcbiAgICogLSBIb3RlbDogJ0NIRUNLX0lOX1dFRUsnLCAnTkVYVF8zMF9OSUdIVFMnXG4gICAqIC0gTG9naXN0aWNzOiAnU0hJUFBJTkdfV0VFSycsICdERUxJVkVSWV9XSU5ET1cnXG4gICAqL1xuICBrZXk6IHN0cmluZztcblxuICAvKipcbiAgICogUmVzb2x2ZSB0aGUgZGF0ZSByYW5nZSBmb3IgdGhpcyBwcmVzZXRcbiAgICogXG4gICAqIE1VU1QgdXNlOlxuICAgKiAtIGBjbG9jay5ub3coKWAgZm9yIGN1cnJlbnQgdGltZSAoU1NSLXNhZmUsIGRldGVybWluaXN0aWMpXG4gICAqIC0gYGFkYXB0ZXIuKmAgZm9yIGFsbCBkYXRlIG9wZXJhdGlvbnMgKHRpbWV6b25lLXNhZmUpXG4gICAqIFxuICAgKiBNVVNUIE5PVCB1c2U6XG4gICAqIC0gYG5ldyBEYXRlKClgIGRpcmVjdGx5IChicmVha3MgU1NSIGRldGVybWluaXNtKVxuICAgKiAtIGBkYXRlLnRvSVNPU3RyaW5nKClgICh0aW1lem9uZSBidWdzKVxuICAgKiAtIGBkYXRlLnNldERhdGUoKWAgKG11dGF0ZXMsIHVzZSBhZGFwdGVyLmFkZERheXMoKSBpbnN0ZWFkKVxuICAgKiBcbiAgICogQHBhcmFtIGNsb2NrIC0gSW5qZWN0ZWQgRGF0ZUNsb2NrIGZvciBTU1Itc2FmZSB0aW1lIGFjY2Vzc1xuICAgKiBAcGFyYW0gYWRhcHRlciAtIEluamVjdGVkIERhdGVBZGFwdGVyIGZvciB0aW1lem9uZS1zYWZlIG9wZXJhdGlvbnNcbiAgICogQHJldHVybnMgRGF0ZSByYW5nZSB3aXRoIHN0YXJ0IGFuZCBlbmQgZGF0ZXMgKGJvdGggaW5jbHVzaXZlKVxuICAgKiBcbiAgICogQGV4YW1wbGVcbiAgICogYGBgdHlwZXNjcmlwdFxuICAgKiByZXNvbHZlOiAoY2xvY2ssIGFkYXB0ZXIpID0+IHtcbiAgICogICBjb25zdCBub3cgPSBjbG9jay5ub3coKTtcbiAgICogICBjb25zdCBzdGFydCA9IGFkYXB0ZXIuYWRkRGF5cyhub3csIC03KTtcbiAgICogICBjb25zdCBlbmQgPSBhZGFwdGVyLm5vcm1hbGl6ZShub3cpO1xuICAgKiAgIHJldHVybiB7IHN0YXJ0LCBlbmQgfTtcbiAgICogfVxuICAgKiBgYGBcbiAgICovXG4gIHJlc29sdmUoY2xvY2s6IERhdGVDbG9jaywgYWRhcHRlcjogRGF0ZUFkYXB0ZXIpOiBEYXRlUmFuZ2U7XG59XG5cbi8qKlxuICogVHlwZSBndWFyZCB0byBjaGVjayBpZiBvYmplY3QgaXMgYSB2YWxpZCBSYW5nZVByZXNldFBsdWdpblxuICogXG4gKiBAcGFyYW0gb2JqIC0gT2JqZWN0IHRvIGNoZWNrXG4gKiBAcmV0dXJucyB0cnVlIGlmIG9iamVjdCBpbXBsZW1lbnRzIFJhbmdlUHJlc2V0UGx1Z2luIGludGVyZmFjZVxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNSYW5nZVByZXNldFBsdWdpbihvYmo6IGFueSk6IG9iaiBpcyBSYW5nZVByZXNldFBsdWdpbiB7XG4gIHJldHVybiAoXG4gICAgb2JqICYmXG4gICAgdHlwZW9mIG9iaiA9PT0gJ29iamVjdCcgJiZcbiAgICB0eXBlb2Ygb2JqLmtleSA9PT0gJ3N0cmluZycgJiZcbiAgICB0eXBlb2Ygb2JqLnJlc29sdmUgPT09ICdmdW5jdGlvbidcbiAgKTtcbn1cbiJdfQ==
|