hijri-date-time-picker 1.0.0 → 1.0.2
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/LICENSE +21 -21
- package/README.md +185 -183
- package/dist/LICENSE +21 -0
- package/dist/README.md +185 -0
- package/dist/demo.d.ts +5 -1
- package/dist/demo.js +213 -173
- package/dist/esm2022/hijri-date-time-picker.mjs +5 -0
- package/dist/esm2022/index.mjs +3 -0
- package/dist/esm2022/lib/hijri-date-picker.component.mjs +606 -0
- package/dist/esm2022/lib/hijri-date-picker.types.mjs +22 -0
- package/dist/fesm2022/hijri-date-time-picker.mjs +634 -0
- package/dist/fesm2022/hijri-date-time-picker.mjs.map +1 -0
- package/dist/lib/hijri-date-picker.component.d.ts +8 -6
- package/dist/lib/hijri-date-picker.component.js +245 -118
- package/dist/lib/hijri-date-picker.types.d.ts +4 -4
- package/dist/lib/hijri-date-picker.types.js +66 -10
- package/package.json +48 -47
|
@@ -0,0 +1,606 @@
|
|
|
1
|
+
import { Component, Input, Output, EventEmitter } from '@angular/core';
|
|
2
|
+
import { CommonModule } from '@angular/common';
|
|
3
|
+
import HijriDate, { toHijri } from 'hijri-date/lib/safe';
|
|
4
|
+
import { GREGORIAN_MONTHS_EN, GREGORIAN_MONTHS_AR, HIJRI_MONTHS_EN, HIJRI_MONTHS_AR, WEEKDAY_NAMES_EN, WEEKDAY_NAMES_AR } from './hijri-date-picker.types';
|
|
5
|
+
import * as i0 from "@angular/core";
|
|
6
|
+
import * as i1 from "@angular/common";
|
|
7
|
+
export class HijriDatePickerComponent {
|
|
8
|
+
// Mode & Configuration
|
|
9
|
+
canChangeMode = true;
|
|
10
|
+
mode = 'greg';
|
|
11
|
+
dir = 'ltr';
|
|
12
|
+
locale = 'en';
|
|
13
|
+
// Validation
|
|
14
|
+
futureValidation = true;
|
|
15
|
+
futureYearsLimit = 10;
|
|
16
|
+
isRequired = false;
|
|
17
|
+
minDate; // Minimum selectable date
|
|
18
|
+
maxDate; // Maximum selectable date
|
|
19
|
+
// Selection
|
|
20
|
+
multiple = false;
|
|
21
|
+
showConfirmButton = false;
|
|
22
|
+
initialSelectedDate; // For single selection mode - bind initial date
|
|
23
|
+
initialSelectedDates; // For multiple selection mode - bind initial dates
|
|
24
|
+
// Labels
|
|
25
|
+
submitTextButton = 'Submit';
|
|
26
|
+
todaysDateText = 'Today';
|
|
27
|
+
ummAlQuraDateText = 'Umm Al-Qura Calendar';
|
|
28
|
+
yearSelectLabel = 'Year';
|
|
29
|
+
monthSelectLabel = 'Month';
|
|
30
|
+
// Display Options
|
|
31
|
+
todaysDateSection = true;
|
|
32
|
+
markToday = true;
|
|
33
|
+
disableYearPicker = false;
|
|
34
|
+
disableMonthPicker = false;
|
|
35
|
+
disableDayPicker = false;
|
|
36
|
+
// Styling
|
|
37
|
+
styles = {};
|
|
38
|
+
// Time Configuration
|
|
39
|
+
enableTime = false;
|
|
40
|
+
timeFormat = '24';
|
|
41
|
+
minuteStep = 1;
|
|
42
|
+
enableSeconds = false;
|
|
43
|
+
defaultTime;
|
|
44
|
+
// Outputs
|
|
45
|
+
dateSelected = new EventEmitter();
|
|
46
|
+
modeChanged = new EventEmitter();
|
|
47
|
+
// Internal State
|
|
48
|
+
currentYear = new Date().getFullYear();
|
|
49
|
+
currentMonth = new Date().getMonth();
|
|
50
|
+
currentHijriYear = 0;
|
|
51
|
+
currentHijriMonth = 0;
|
|
52
|
+
selectedDates = [];
|
|
53
|
+
calendarDays = [];
|
|
54
|
+
today = new Date();
|
|
55
|
+
years = [];
|
|
56
|
+
months = [];
|
|
57
|
+
weekdays = [];
|
|
58
|
+
// Time state
|
|
59
|
+
selectedTime = {
|
|
60
|
+
hours: 0,
|
|
61
|
+
minutes: 0,
|
|
62
|
+
seconds: 0
|
|
63
|
+
};
|
|
64
|
+
isPM = false;
|
|
65
|
+
ngOnInit() {
|
|
66
|
+
this.initializeCalendar();
|
|
67
|
+
this.initializeSelectedDates();
|
|
68
|
+
this.initializeTime();
|
|
69
|
+
this.updateLocaleData();
|
|
70
|
+
this.generateYears();
|
|
71
|
+
this.generateCalendar();
|
|
72
|
+
}
|
|
73
|
+
ngOnChanges(changes) {
|
|
74
|
+
if (changes['mode'] || changes['locale']) {
|
|
75
|
+
this.updateLocaleData();
|
|
76
|
+
this.generateCalendar();
|
|
77
|
+
}
|
|
78
|
+
// Handle changes to initial selected dates
|
|
79
|
+
if (changes['initialSelectedDate'] || changes['initialSelectedDates']) {
|
|
80
|
+
this.initializeSelectedDates();
|
|
81
|
+
this.generateCalendar();
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
initializeCalendar() {
|
|
85
|
+
const hijriToday = new HijriDate();
|
|
86
|
+
this.currentHijriYear = hijriToday.getFullYear();
|
|
87
|
+
this.currentHijriMonth = hijriToday.getMonth();
|
|
88
|
+
}
|
|
89
|
+
initializeSelectedDates() {
|
|
90
|
+
// Handle single selection mode
|
|
91
|
+
if (!this.multiple && this.initialSelectedDate) {
|
|
92
|
+
this.selectedDates = [this.createSelectedDate(this.initialSelectedDate)];
|
|
93
|
+
}
|
|
94
|
+
// Handle multiple selection mode
|
|
95
|
+
if (this.multiple && this.initialSelectedDates && this.initialSelectedDates.length > 0) {
|
|
96
|
+
this.selectedDates = this.initialSelectedDates.map(date => this.createSelectedDate(date));
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
initializeTime() {
|
|
100
|
+
if (!this.enableTime) {
|
|
101
|
+
return;
|
|
102
|
+
}
|
|
103
|
+
// Set default time if provided
|
|
104
|
+
if (this.defaultTime) {
|
|
105
|
+
this.selectedTime = {
|
|
106
|
+
hours: this.defaultTime.hours,
|
|
107
|
+
minutes: this.defaultTime.minutes,
|
|
108
|
+
seconds: this.defaultTime.seconds || 0
|
|
109
|
+
};
|
|
110
|
+
// Set AM/PM for 12-hour format
|
|
111
|
+
if (this.timeFormat === '12') {
|
|
112
|
+
this.isPM = this.selectedTime.hours >= 12;
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
else {
|
|
116
|
+
// Default to current time
|
|
117
|
+
const now = new Date();
|
|
118
|
+
this.selectedTime = {
|
|
119
|
+
hours: now.getHours(),
|
|
120
|
+
minutes: now.getMinutes(),
|
|
121
|
+
seconds: now.getSeconds()
|
|
122
|
+
};
|
|
123
|
+
this.isPM = this.selectedTime.hours >= 12;
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
updateLocaleData() {
|
|
127
|
+
// Update weekday names
|
|
128
|
+
this.weekdays = this.locale === 'ar' ? WEEKDAY_NAMES_AR : WEEKDAY_NAMES_EN;
|
|
129
|
+
// Update month names based on mode and locale
|
|
130
|
+
if (this.mode === 'hijri') {
|
|
131
|
+
this.months = this.locale === 'ar' ? HIJRI_MONTHS_AR : HIJRI_MONTHS_EN;
|
|
132
|
+
}
|
|
133
|
+
else {
|
|
134
|
+
this.months = this.locale === 'ar' ? GREGORIAN_MONTHS_AR : GREGORIAN_MONTHS_EN;
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
generateYears() {
|
|
138
|
+
const currentYear = this.mode === 'hijri' ? this.currentHijriYear : this.currentYear;
|
|
139
|
+
const startYear = currentYear - 100;
|
|
140
|
+
const endYear = currentYear + this.futureYearsLimit;
|
|
141
|
+
this.years = [];
|
|
142
|
+
for (let year = startYear; year <= endYear; year++) {
|
|
143
|
+
this.years.push(year);
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
generateCalendar() {
|
|
147
|
+
this.calendarDays = [];
|
|
148
|
+
if (this.mode === 'hijri') {
|
|
149
|
+
this.generateHijriCalendar();
|
|
150
|
+
}
|
|
151
|
+
else {
|
|
152
|
+
this.generateGregorianCalendar();
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
generateGregorianCalendar() {
|
|
156
|
+
const firstDay = new Date(this.currentYear, this.currentMonth, 1);
|
|
157
|
+
const lastDay = new Date(this.currentYear, this.currentMonth + 1, 0);
|
|
158
|
+
const startingDayOfWeek = firstDay.getDay();
|
|
159
|
+
const daysInMonth = lastDay.getDate();
|
|
160
|
+
// Add empty cells for days before the first day of the month
|
|
161
|
+
for (let i = 0; i < startingDayOfWeek; i++) {
|
|
162
|
+
this.calendarDays.push({ day: null, disabled: true });
|
|
163
|
+
}
|
|
164
|
+
// Add days of the month
|
|
165
|
+
for (let day = 1; day <= daysInMonth; day++) {
|
|
166
|
+
const date = new Date(this.currentYear, this.currentMonth, day);
|
|
167
|
+
const isToday = this.isSameDay(date, this.today);
|
|
168
|
+
const isDisabled = this.isDateDisabled(date);
|
|
169
|
+
const isSelected = this.isDateSelected(date);
|
|
170
|
+
this.calendarDays.push({
|
|
171
|
+
day,
|
|
172
|
+
date,
|
|
173
|
+
isToday,
|
|
174
|
+
isDisabled,
|
|
175
|
+
isSelected,
|
|
176
|
+
disabled: false
|
|
177
|
+
});
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
generateHijriCalendar() {
|
|
181
|
+
const hijriDate = new HijriDate(this.currentHijriYear, this.currentHijriMonth, 1);
|
|
182
|
+
const gregorianDate = hijriDate.toGregorian();
|
|
183
|
+
const startingDayOfWeek = gregorianDate.getDay();
|
|
184
|
+
// Get days in Hijri month (typically 29 or 30)
|
|
185
|
+
const daysInMonth = this.getDaysInHijriMonth(this.currentHijriYear, this.currentHijriMonth);
|
|
186
|
+
// Add empty cells for days before the first day of the month
|
|
187
|
+
for (let i = 0; i < startingDayOfWeek; i++) {
|
|
188
|
+
this.calendarDays.push({ day: null, disabled: true });
|
|
189
|
+
}
|
|
190
|
+
// Add days of the month
|
|
191
|
+
for (let day = 1; day <= daysInMonth; day++) {
|
|
192
|
+
const hijriDay = new HijriDate(this.currentHijriYear, this.currentHijriMonth, day);
|
|
193
|
+
const gregorianDay = hijriDay.toGregorian();
|
|
194
|
+
const isToday = this.isSameDay(gregorianDay, this.today);
|
|
195
|
+
const isDisabled = this.isDateDisabled(gregorianDay);
|
|
196
|
+
const isSelected = this.isDateSelected(gregorianDay);
|
|
197
|
+
this.calendarDays.push({
|
|
198
|
+
day,
|
|
199
|
+
date: gregorianDay,
|
|
200
|
+
hijriDate: hijriDay,
|
|
201
|
+
isToday,
|
|
202
|
+
isDisabled,
|
|
203
|
+
isSelected,
|
|
204
|
+
disabled: false
|
|
205
|
+
});
|
|
206
|
+
}
|
|
207
|
+
}
|
|
208
|
+
getDaysInHijriMonth(year, month) {
|
|
209
|
+
// Try to create the 30th day; if it fails, the month has 29 days
|
|
210
|
+
try {
|
|
211
|
+
new HijriDate(year, month, 30);
|
|
212
|
+
return 30;
|
|
213
|
+
}
|
|
214
|
+
catch {
|
|
215
|
+
return 29;
|
|
216
|
+
}
|
|
217
|
+
}
|
|
218
|
+
isSameDay(date1, date2) {
|
|
219
|
+
return date1.getFullYear() === date2.getFullYear() &&
|
|
220
|
+
date1.getMonth() === date2.getMonth() &&
|
|
221
|
+
date1.getDate() === date2.getDate();
|
|
222
|
+
}
|
|
223
|
+
isDateDisabled(date) {
|
|
224
|
+
// Check minDate constraint
|
|
225
|
+
if (this.minDate) {
|
|
226
|
+
const minDateOnly = new Date(this.minDate);
|
|
227
|
+
minDateOnly.setHours(0, 0, 0, 0);
|
|
228
|
+
const checkDate = new Date(date);
|
|
229
|
+
checkDate.setHours(0, 0, 0, 0);
|
|
230
|
+
if (checkDate < minDateOnly) {
|
|
231
|
+
return true;
|
|
232
|
+
}
|
|
233
|
+
}
|
|
234
|
+
// Check maxDate constraint
|
|
235
|
+
if (this.maxDate) {
|
|
236
|
+
const maxDateOnly = new Date(this.maxDate);
|
|
237
|
+
maxDateOnly.setHours(23, 59, 59, 999);
|
|
238
|
+
const checkDate = new Date(date);
|
|
239
|
+
checkDate.setHours(0, 0, 0, 0);
|
|
240
|
+
if (checkDate > maxDateOnly) {
|
|
241
|
+
return true;
|
|
242
|
+
}
|
|
243
|
+
}
|
|
244
|
+
// Check futureValidation constraint
|
|
245
|
+
if (this.futureValidation) {
|
|
246
|
+
const maxDate = new Date();
|
|
247
|
+
maxDate.setFullYear(maxDate.getFullYear() + this.futureYearsLimit);
|
|
248
|
+
return date > maxDate;
|
|
249
|
+
}
|
|
250
|
+
return false;
|
|
251
|
+
}
|
|
252
|
+
isDateSelected(date) {
|
|
253
|
+
return this.selectedDates.some(selected => this.isSameDay(selected.gregorian, date));
|
|
254
|
+
}
|
|
255
|
+
onDayClick(dayInfo) {
|
|
256
|
+
if (dayInfo.disabled || dayInfo.isDisabled) {
|
|
257
|
+
return;
|
|
258
|
+
}
|
|
259
|
+
const selectedDate = this.createSelectedDate(dayInfo.date);
|
|
260
|
+
if (this.multiple) {
|
|
261
|
+
const index = this.selectedDates.findIndex(d => this.isSameDay(d.gregorian, dayInfo.date));
|
|
262
|
+
if (index > -1) {
|
|
263
|
+
this.selectedDates.splice(index, 1);
|
|
264
|
+
}
|
|
265
|
+
else {
|
|
266
|
+
this.selectedDates.push(selectedDate);
|
|
267
|
+
}
|
|
268
|
+
if (!this.showConfirmButton) {
|
|
269
|
+
this.dateSelected.emit([...this.selectedDates]);
|
|
270
|
+
}
|
|
271
|
+
}
|
|
272
|
+
else {
|
|
273
|
+
this.selectedDates = [selectedDate];
|
|
274
|
+
if (!this.showConfirmButton) {
|
|
275
|
+
this.dateSelected.emit(selectedDate);
|
|
276
|
+
}
|
|
277
|
+
}
|
|
278
|
+
this.generateCalendar();
|
|
279
|
+
}
|
|
280
|
+
createSelectedDate(date) {
|
|
281
|
+
const hijriDate = toHijri(date);
|
|
282
|
+
// If time is enabled, set the time on the date object
|
|
283
|
+
if (this.enableTime) {
|
|
284
|
+
let hours24 = this.selectedTime.hours;
|
|
285
|
+
if (this.timeFormat === '12') {
|
|
286
|
+
if (this.isPM && this.selectedTime.hours !== 12) {
|
|
287
|
+
hours24 = this.selectedTime.hours + 12;
|
|
288
|
+
}
|
|
289
|
+
else if (!this.isPM && this.selectedTime.hours === 12) {
|
|
290
|
+
hours24 = 0;
|
|
291
|
+
}
|
|
292
|
+
}
|
|
293
|
+
date.setHours(hours24, this.selectedTime.minutes, this.selectedTime.seconds);
|
|
294
|
+
}
|
|
295
|
+
return {
|
|
296
|
+
gregorian: date,
|
|
297
|
+
hijri: {
|
|
298
|
+
year: hijriDate.getFullYear(),
|
|
299
|
+
month: hijriDate.getMonth(),
|
|
300
|
+
day: hijriDate.getDate()
|
|
301
|
+
},
|
|
302
|
+
time: this.enableTime ? {
|
|
303
|
+
hours: date.getHours(),
|
|
304
|
+
minutes: date.getMinutes(),
|
|
305
|
+
seconds: date.getSeconds()
|
|
306
|
+
} : undefined,
|
|
307
|
+
formatted: {
|
|
308
|
+
gregorian: this.formatGregorianDate(date),
|
|
309
|
+
hijri: this.formatHijriDate(hijriDate),
|
|
310
|
+
time: this.enableTime ? this.formatTime(date.getHours(), date.getMinutes(), date.getSeconds()) : undefined
|
|
311
|
+
}
|
|
312
|
+
};
|
|
313
|
+
}
|
|
314
|
+
formatGregorianDate(date) {
|
|
315
|
+
const day = date.getDate();
|
|
316
|
+
const month = this.locale === 'ar' ? GREGORIAN_MONTHS_AR[date.getMonth()] : GREGORIAN_MONTHS_EN[date.getMonth()];
|
|
317
|
+
const year = date.getFullYear();
|
|
318
|
+
return this.locale === 'ar'
|
|
319
|
+
? `${day} ${month} ${year}`
|
|
320
|
+
: `${month} ${day}, ${year}`;
|
|
321
|
+
}
|
|
322
|
+
formatHijriDate(hijriDate) {
|
|
323
|
+
const day = hijriDate.getDate();
|
|
324
|
+
const month = this.locale === 'ar'
|
|
325
|
+
? HIJRI_MONTHS_AR[hijriDate.getMonth()]
|
|
326
|
+
: HIJRI_MONTHS_EN[hijriDate.getMonth()];
|
|
327
|
+
const year = hijriDate.getFullYear();
|
|
328
|
+
return this.locale === 'ar'
|
|
329
|
+
? `${day} ${month} ${year} هـ`
|
|
330
|
+
: `${day} ${month} ${year} AH`;
|
|
331
|
+
}
|
|
332
|
+
onYearChange(event) {
|
|
333
|
+
const year = parseInt(event.target.value);
|
|
334
|
+
if (this.mode === 'hijri') {
|
|
335
|
+
this.currentHijriYear = year;
|
|
336
|
+
}
|
|
337
|
+
else {
|
|
338
|
+
this.currentYear = year;
|
|
339
|
+
}
|
|
340
|
+
this.generateCalendar();
|
|
341
|
+
}
|
|
342
|
+
onMonthChange(event) {
|
|
343
|
+
const month = parseInt(event.target.value);
|
|
344
|
+
if (this.mode === 'hijri') {
|
|
345
|
+
this.currentHijriMonth = month;
|
|
346
|
+
}
|
|
347
|
+
else {
|
|
348
|
+
this.currentMonth = month;
|
|
349
|
+
}
|
|
350
|
+
this.generateCalendar();
|
|
351
|
+
}
|
|
352
|
+
previousMonth() {
|
|
353
|
+
if (this.mode === 'hijri') {
|
|
354
|
+
if (this.currentHijriMonth === 0) {
|
|
355
|
+
this.currentHijriMonth = 11;
|
|
356
|
+
this.currentHijriYear--;
|
|
357
|
+
}
|
|
358
|
+
else {
|
|
359
|
+
this.currentHijriMonth--;
|
|
360
|
+
}
|
|
361
|
+
}
|
|
362
|
+
else {
|
|
363
|
+
if (this.currentMonth === 0) {
|
|
364
|
+
this.currentMonth = 11;
|
|
365
|
+
this.currentYear--;
|
|
366
|
+
}
|
|
367
|
+
else {
|
|
368
|
+
this.currentMonth--;
|
|
369
|
+
}
|
|
370
|
+
}
|
|
371
|
+
this.generateCalendar();
|
|
372
|
+
}
|
|
373
|
+
nextMonth() {
|
|
374
|
+
if (this.mode === 'hijri') {
|
|
375
|
+
if (this.currentHijriMonth === 11) {
|
|
376
|
+
this.currentHijriMonth = 0;
|
|
377
|
+
this.currentHijriYear++;
|
|
378
|
+
}
|
|
379
|
+
else {
|
|
380
|
+
this.currentHijriMonth++;
|
|
381
|
+
}
|
|
382
|
+
}
|
|
383
|
+
else {
|
|
384
|
+
if (this.currentMonth === 11) {
|
|
385
|
+
this.currentMonth = 0;
|
|
386
|
+
this.currentYear++;
|
|
387
|
+
}
|
|
388
|
+
else {
|
|
389
|
+
this.currentMonth++;
|
|
390
|
+
}
|
|
391
|
+
}
|
|
392
|
+
this.generateCalendar();
|
|
393
|
+
}
|
|
394
|
+
toggleMode() {
|
|
395
|
+
if (!this.canChangeMode) {
|
|
396
|
+
return;
|
|
397
|
+
}
|
|
398
|
+
this.mode = this.mode === 'greg' ? 'hijri' : 'greg';
|
|
399
|
+
this.updateLocaleData();
|
|
400
|
+
this.generateYears();
|
|
401
|
+
this.generateCalendar();
|
|
402
|
+
this.modeChanged.emit(this.mode);
|
|
403
|
+
}
|
|
404
|
+
selectToday() {
|
|
405
|
+
const today = new Date();
|
|
406
|
+
this.onDayClick({ date: today, disabled: false, isDisabled: false });
|
|
407
|
+
}
|
|
408
|
+
onSubmit() {
|
|
409
|
+
if (this.isRequired && this.selectedDates.length === 0) {
|
|
410
|
+
return;
|
|
411
|
+
}
|
|
412
|
+
if (this.multiple) {
|
|
413
|
+
this.dateSelected.emit([...this.selectedDates]);
|
|
414
|
+
}
|
|
415
|
+
else if (this.selectedDates.length > 0) {
|
|
416
|
+
this.dateSelected.emit(this.selectedDates[0]);
|
|
417
|
+
}
|
|
418
|
+
}
|
|
419
|
+
// Time handling methods
|
|
420
|
+
incrementTime(type) {
|
|
421
|
+
if (type === 'hours') {
|
|
422
|
+
const max = this.timeFormat === '12' ? 12 : 23;
|
|
423
|
+
this.selectedTime.hours = (this.selectedTime.hours + 1) > max ? (this.timeFormat === '12' ? 1 : 0) : this.selectedTime.hours + 1;
|
|
424
|
+
}
|
|
425
|
+
else if (type === 'minutes') {
|
|
426
|
+
this.selectedTime.minutes = (this.selectedTime.minutes + this.minuteStep) > 59 ? 0 : this.selectedTime.minutes + this.minuteStep;
|
|
427
|
+
}
|
|
428
|
+
else if (type === 'seconds') {
|
|
429
|
+
this.selectedTime.seconds = (this.selectedTime.seconds + 1) > 59 ? 0 : this.selectedTime.seconds + 1;
|
|
430
|
+
}
|
|
431
|
+
this.updateSelectedDateTime();
|
|
432
|
+
}
|
|
433
|
+
decrementTime(type) {
|
|
434
|
+
if (type === 'hours') {
|
|
435
|
+
const min = this.timeFormat === '12' ? 1 : 0;
|
|
436
|
+
const max = this.timeFormat === '12' ? 12 : 23;
|
|
437
|
+
this.selectedTime.hours = (this.selectedTime.hours - 1) < min ? max : this.selectedTime.hours - 1;
|
|
438
|
+
}
|
|
439
|
+
else if (type === 'minutes') {
|
|
440
|
+
this.selectedTime.minutes = (this.selectedTime.minutes - this.minuteStep) < 0 ? 59 : this.selectedTime.minutes - this.minuteStep;
|
|
441
|
+
}
|
|
442
|
+
else if (type === 'seconds') {
|
|
443
|
+
this.selectedTime.seconds = (this.selectedTime.seconds - 1) < 0 ? 59 : this.selectedTime.seconds - 1;
|
|
444
|
+
}
|
|
445
|
+
this.updateSelectedDateTime();
|
|
446
|
+
}
|
|
447
|
+
onTimeChange(type, event) {
|
|
448
|
+
const value = parseInt(event.target.value) || 0;
|
|
449
|
+
if (type === 'hours') {
|
|
450
|
+
const min = this.timeFormat === '12' ? 1 : 0;
|
|
451
|
+
const max = this.timeFormat === '12' ? 12 : 23;
|
|
452
|
+
this.selectedTime.hours = Math.max(min, Math.min(max, value));
|
|
453
|
+
}
|
|
454
|
+
else if (type === 'minutes') {
|
|
455
|
+
this.selectedTime.minutes = Math.max(0, Math.min(59, value));
|
|
456
|
+
}
|
|
457
|
+
else if (type === 'seconds') {
|
|
458
|
+
this.selectedTime.seconds = Math.max(0, Math.min(59, value));
|
|
459
|
+
}
|
|
460
|
+
this.updateSelectedDateTime();
|
|
461
|
+
}
|
|
462
|
+
setAMPM(pm) {
|
|
463
|
+
this.isPM = pm;
|
|
464
|
+
this.updateSelectedDateTime();
|
|
465
|
+
}
|
|
466
|
+
formatTime(hours, minutes, seconds) {
|
|
467
|
+
if (this.timeFormat === '12') {
|
|
468
|
+
const displayHours = hours % 12 || 12;
|
|
469
|
+
const ampm = hours >= 12 ? 'PM' : 'AM';
|
|
470
|
+
const minutesStr = minutes.toString().padStart(2, '0');
|
|
471
|
+
if (this.enableSeconds) {
|
|
472
|
+
const secondsStr = seconds.toString().padStart(2, '0');
|
|
473
|
+
return `${displayHours}:${minutesStr}:${secondsStr} ${ampm}`;
|
|
474
|
+
}
|
|
475
|
+
return `${displayHours}:${minutesStr} ${ampm}`;
|
|
476
|
+
}
|
|
477
|
+
else {
|
|
478
|
+
const hoursStr = hours.toString().padStart(2, '0');
|
|
479
|
+
const minutesStr = minutes.toString().padStart(2, '0');
|
|
480
|
+
if (this.enableSeconds) {
|
|
481
|
+
const secondsStr = seconds.toString().padStart(2, '0');
|
|
482
|
+
return `${hoursStr}:${minutesStr}:${secondsStr}`;
|
|
483
|
+
}
|
|
484
|
+
return `${hoursStr}:${minutesStr}`;
|
|
485
|
+
}
|
|
486
|
+
}
|
|
487
|
+
updateSelectedDateTime() {
|
|
488
|
+
if (!this.enableTime || this.selectedDates.length === 0) {
|
|
489
|
+
return;
|
|
490
|
+
}
|
|
491
|
+
// Convert 12-hour to 24-hour if needed
|
|
492
|
+
let hours24 = this.selectedTime.hours;
|
|
493
|
+
if (this.timeFormat === '12') {
|
|
494
|
+
if (this.isPM && this.selectedTime.hours !== 12) {
|
|
495
|
+
hours24 = this.selectedTime.hours + 12;
|
|
496
|
+
}
|
|
497
|
+
else if (!this.isPM && this.selectedTime.hours === 12) {
|
|
498
|
+
hours24 = 0;
|
|
499
|
+
}
|
|
500
|
+
}
|
|
501
|
+
// Update all selected dates with new time
|
|
502
|
+
this.selectedDates = this.selectedDates.map(selectedDate => {
|
|
503
|
+
const newDate = new Date(selectedDate.gregorian);
|
|
504
|
+
newDate.setHours(hours24, this.selectedTime.minutes, this.selectedTime.seconds);
|
|
505
|
+
return {
|
|
506
|
+
...selectedDate,
|
|
507
|
+
gregorian: newDate,
|
|
508
|
+
time: {
|
|
509
|
+
hours: hours24,
|
|
510
|
+
minutes: this.selectedTime.minutes,
|
|
511
|
+
seconds: this.selectedTime.seconds
|
|
512
|
+
},
|
|
513
|
+
formatted: {
|
|
514
|
+
...selectedDate.formatted,
|
|
515
|
+
time: this.formatTime(hours24, this.selectedTime.minutes, this.selectedTime.seconds)
|
|
516
|
+
}
|
|
517
|
+
};
|
|
518
|
+
});
|
|
519
|
+
}
|
|
520
|
+
getCustomStyles() {
|
|
521
|
+
return {
|
|
522
|
+
'--primary-color': this.styles.primaryColor || '#4f46e5',
|
|
523
|
+
'--secondary-color': this.styles.secondaryColor || '#818cf8',
|
|
524
|
+
'--background-color': this.styles.backgroundColor || '#ffffff',
|
|
525
|
+
'--text-color': this.styles.textColor || '#1f2937',
|
|
526
|
+
'--selected-date-color': this.styles.selectedDateColor || '#ffffff',
|
|
527
|
+
'--selected-date-background': this.styles.selectedDateBackground || '#4f46e5',
|
|
528
|
+
'--today-color': this.styles.todayColor || '#10b981',
|
|
529
|
+
'--disabled-color': this.styles.disabledColor || '#d1d5db',
|
|
530
|
+
'--border-color': this.styles.borderColor || '#e5e7eb',
|
|
531
|
+
'--hover-color': this.styles.hoverColor || '#f3f4f6',
|
|
532
|
+
'--font-family': this.styles.fontFamily || 'system-ui, -apple-system, sans-serif',
|
|
533
|
+
'--font-size': this.styles.fontSize || '14px',
|
|
534
|
+
'--border-radius': this.styles.borderRadius || '8px'
|
|
535
|
+
};
|
|
536
|
+
}
|
|
537
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: HijriDatePickerComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
538
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: HijriDatePickerComponent, isStandalone: true, selector: "hijri-date-picker", inputs: { canChangeMode: "canChangeMode", mode: "mode", dir: "dir", locale: "locale", futureValidation: "futureValidation", futureYearsLimit: "futureYearsLimit", isRequired: "isRequired", minDate: "minDate", maxDate: "maxDate", multiple: "multiple", showConfirmButton: "showConfirmButton", initialSelectedDate: "initialSelectedDate", initialSelectedDates: "initialSelectedDates", submitTextButton: "submitTextButton", todaysDateText: "todaysDateText", ummAlQuraDateText: "ummAlQuraDateText", yearSelectLabel: "yearSelectLabel", monthSelectLabel: "monthSelectLabel", todaysDateSection: "todaysDateSection", markToday: "markToday", disableYearPicker: "disableYearPicker", disableMonthPicker: "disableMonthPicker", disableDayPicker: "disableDayPicker", styles: "styles", enableTime: "enableTime", timeFormat: "timeFormat", minuteStep: "minuteStep", enableSeconds: "enableSeconds", defaultTime: "defaultTime" }, outputs: { dateSelected: "dateSelected", modeChanged: "modeChanged" }, usesOnChanges: true, ngImport: i0, template: "<div class=\"hijri-date-picker\" [dir]=\"dir\" [style]=\"getCustomStyles()\">\n <!-- Header Section -->\n <div class=\"picker-header\">\n <!-- Mode Toggle Button -->\n <button \n *ngIf=\"canChangeMode\" \n class=\"mode-toggle-btn\"\n (click)=\"toggleMode()\"\n [attr.aria-label]=\"mode === 'greg' ? 'Switch to Hijri' : 'Switch to Gregorian'\">\n {{ mode === 'greg' ? (locale === 'ar' ? '\u062A\u0642\u0648\u064A\u0645 \u0647\u062C\u0631\u064A' : 'Hijri') : (locale === 'ar' ? '\u062A\u0642\u0648\u064A\u0645 \u0645\u064A\u0644\u0627\u062F\u064A' : 'Gregorian') }}\n </button>\n\n <!-- Today's Date Section -->\n <div *ngIf=\"todaysDateSection\" class=\"todays-date\">\n <button class=\"today-btn\" (click)=\"selectToday()\">\n {{ todaysDateText }}\n </button>\n </div>\n </div>\n\n <!-- Calendar Controls -->\n <div class=\"calendar-controls\">\n <!-- Year Picker -->\n <div class=\"control-group\" *ngIf=\"!disableYearPicker\">\n <label [attr.for]=\"'year-select'\">{{ yearSelectLabel }}</label>\n <select \n id=\"year-select\"\n [value]=\"mode === 'hijri' ? currentHijriYear : currentYear\"\n (change)=\"onYearChange($event)\"\n class=\"year-select\">\n <option *ngFor=\"let year of years\" [value]=\"year\">{{ year }}</option>\n </select>\n </div>\n\n <!-- Month Picker -->\n <div class=\"control-group\" *ngIf=\"!disableMonthPicker\">\n <label [attr.for]=\"'month-select'\">{{ monthSelectLabel }}</label>\n <select \n id=\"month-select\"\n [value]=\"mode === 'hijri' ? currentHijriMonth : currentMonth\"\n (change)=\"onMonthChange($event)\"\n class=\"month-select\">\n <option *ngFor=\"let month of months; let i = index\" [value]=\"i\">\n {{ month }}\n </option>\n </select>\n </div>\n\n <!-- Navigation Buttons -->\n <div class=\"navigation-buttons\">\n <button \n class=\"nav-btn prev-btn\"\n (click)=\"previousMonth()\"\n [attr.aria-label]=\"locale === 'ar' ? '\u0627\u0644\u0634\u0647\u0631 \u0627\u0644\u0633\u0627\u0628\u0642' : 'Previous Month'\">\n {{ dir === 'rtl' ? '\u2190' : '\u2192' }}\n </button>\n <button \n class=\"nav-btn next-btn\"\n (click)=\"nextMonth()\"\n [attr.aria-label]=\"locale === 'ar' ? '\u0627\u0644\u0634\u0647\u0631 \u0627\u0644\u062A\u0627\u0644\u064A' : 'Next Month'\">\n {{ dir === 'rtl' ? '\u2192' : '\u2190' }}\n </button>\n </div>\n </div>\n\n <!-- Calendar Grid -->\n <div class=\"calendar-grid\" *ngIf=\"!disableDayPicker\">\n <!-- Weekday Headers -->\n <div class=\"weekday-header\">\n <div class=\"weekday\" *ngFor=\"let weekday of weekdays\">\n {{ weekday }}\n </div>\n </div>\n\n <!-- Calendar Days -->\n <div class=\"calendar-days\">\n <div \n *ngFor=\"let dayInfo of calendarDays\"\n class=\"day-cell\"\n [class.empty]=\"dayInfo.day === null\"\n [class.today]=\"markToday && dayInfo.isToday\"\n [class.selected]=\"dayInfo.isSelected\"\n [class.disabled]=\"dayInfo.isDisabled\"\n (click)=\"onDayClick(dayInfo)\">\n <span *ngIf=\"dayInfo.day !== null\">{{ dayInfo.day }}</span>\n </div>\n </div>\n </div>\n\n <!-- Time Picker Section -->\n <div class=\"time-picker\" *ngIf=\"enableTime\">\n <div class=\"time-picker-label\">\n {{ locale === 'ar' ? '\u0627\u0644\u0648\u0642\u062A' : 'Time' }}\n </div>\n \n <div class=\"time-inputs\">\n <!-- Hours Input -->\n <div class=\"time-input-group\">\n <button class=\"time-btn\" (click)=\"incrementTime('hours')\">\u25B2</button>\n <input \n type=\"number\" \n class=\"time-input\"\n [value]=\"timeFormat === '12' ? (selectedTime.hours % 12 || 12) : selectedTime.hours\"\n (input)=\"onTimeChange('hours', $event)\"\n [min]=\"timeFormat === '12' ? 1 : 0\"\n [max]=\"timeFormat === '12' ? 12 : 23\"\n [attr.aria-label]=\"locale === 'ar' ? '\u0627\u0644\u0633\u0627\u0639\u0627\u062A' : 'Hours'\">\n <button class=\"time-btn\" (click)=\"decrementTime('hours')\">\u25BC</button>\n </div>\n \n <span class=\"time-separator\">:</span>\n \n <!-- Minutes Input -->\n <div class=\"time-input-group\">\n <button class=\"time-btn\" (click)=\"incrementTime('minutes')\">\u25B2</button>\n <input \n type=\"number\" \n class=\"time-input\"\n [value]=\"selectedTime.minutes\"\n (input)=\"onTimeChange('minutes', $event)\"\n [min]=\"0\"\n [max]=\"59\"\n [step]=\"minuteStep\"\n [attr.aria-label]=\"locale === 'ar' ? '\u0627\u0644\u062F\u0642\u0627\u0626\u0642' : 'Minutes'\">\n <button class=\"time-btn\" (click)=\"decrementTime('minutes')\">\u25BC</button>\n </div>\n \n <!-- Seconds Input (Optional) -->\n <ng-container *ngIf=\"enableSeconds\">\n <span class=\"time-separator\">:</span>\n <div class=\"time-input-group\">\n <button class=\"time-btn\" (click)=\"incrementTime('seconds')\">\u25B2</button>\n <input \n type=\"number\" \n class=\"time-input\"\n [value]=\"selectedTime.seconds\"\n (input)=\"onTimeChange('seconds', $event)\"\n [min]=\"0\"\n [max]=\"59\"\n [attr.aria-label]=\"locale === 'ar' ? '\u0627\u0644\u062B\u0648\u0627\u0646\u064A' : 'Seconds'\">\n <button class=\"time-btn\" (click)=\"decrementTime('seconds')\">\u25BC</button>\n </div>\n </ng-container>\n \n <!-- AM/PM Toggle (12-hour format) -->\n <div class=\"ampm-toggle\" *ngIf=\"timeFormat === '12'\">\n <button \n class=\"ampm-btn\"\n [class.active]=\"!isPM\"\n (click)=\"setAMPM(false)\">\n AM\n </button>\n <button \n class=\"ampm-btn\"\n [class.active]=\"isPM\"\n (click)=\"setAMPM(true)\">\n PM\n </button>\n </div>\n </div>\n </div>\n\n <!-- Selected Dates Display -->\n <div class=\"selected-dates\" *ngIf=\"selectedDates.length > 0\">\n <div class=\"selected-label\">\n {{ locale === 'ar' ? '\u0627\u0644\u062A\u0648\u0627\u0631\u064A\u062E \u0627\u0644\u0645\u062D\u062F\u062F\u0629:' : 'Selected Dates:' }}\n </div>\n <div class=\"selected-list\">\n <div class=\"selected-item\" *ngFor=\"let date of selectedDates\">\n <div class=\"selected-date-info\">\n <span class=\"date-text\">\n {{ mode === 'hijri' ? date.formatted.hijri : date.formatted.gregorian }}\n </span>\n <span class=\"time-text\" *ngIf=\"enableTime && date.formatted.time\">\n {{ date.formatted.time }}\n </span>\n </div>\n </div>\n </div>\n </div>\n\n <!-- Submit Button -->\n <div class=\"picker-footer\" *ngIf=\"showConfirmButton\">\n <button \n class=\"submit-btn\"\n (click)=\"onSubmit()\"\n [disabled]=\"isRequired && selectedDates.length === 0\">\n {{ submitTextButton }}\n </button>\n </div>\n\n <!-- Calendar Type Label -->\n <div class=\"calendar-type\" *ngIf=\"mode === 'hijri'\">\n <small>{{ ummAlQuraDateText }}</small>\n </div>\n</div>\n", styles: [".hijri-date-picker{font-family:var(--font-family);font-size:var(--font-size);background-color:var(--background-color);color:var(--text-color);border:1px solid var(--border-color);border-radius:var(--border-radius);padding:20px;max-width:400px;box-shadow:0 4px 6px #0000001a}.picker-header{display:flex;justify-content:space-between;align-items:center;margin-bottom:16px;gap:12px}.mode-toggle-btn{background-color:var(--secondary-color);color:#fff;border:none;padding:8px 16px;border-radius:calc(var(--border-radius) / 2);cursor:pointer;font-size:13px;font-weight:500;transition:all .2s ease}.mode-toggle-btn:hover{opacity:.9;transform:translateY(-1px)}.mode-toggle-btn:active{transform:translateY(0)}.todays-date{flex:1;display:flex;justify-content:flex-end}.today-btn{background-color:var(--today-color);color:#fff;border:none;padding:8px 16px;border-radius:calc(var(--border-radius) / 2);cursor:pointer;font-size:13px;font-weight:500;transition:all .2s ease}.today-btn:hover{opacity:.9;transform:translateY(-1px)}.calendar-controls{display:flex;flex-wrap:wrap;gap:12px;margin-bottom:16px;align-items:flex-end}.control-group{flex:1;min-width:120px;display:flex;flex-direction:column;gap:4px}.control-group label{font-size:12px;font-weight:500;color:var(--text-color);opacity:.8}.year-select,.month-select{padding:8px 12px;border:1px solid var(--border-color);border-radius:calc(var(--border-radius) / 2);background-color:var(--background-color);color:var(--text-color);font-size:14px;cursor:pointer;transition:border-color .2s ease}.year-select:hover,.month-select:hover{border-color:var(--primary-color)}.year-select:focus,.month-select:focus{outline:none;border-color:var(--primary-color);box-shadow:0 0 0 3px #4f46e51a}.navigation-buttons{display:flex;gap:8px}.nav-btn{background-color:var(--primary-color);color:#fff;border:none;width:36px;height:36px;border-radius:calc(var(--border-radius) / 2);cursor:pointer;font-size:18px;display:flex;align-items:center;justify-content:center;transition:all .2s ease}.nav-btn:hover{opacity:.9;transform:scale(1.05)}.nav-btn:active{transform:scale(.95)}.calendar-grid{margin-bottom:16px}.weekday-header{display:grid;grid-template-columns:repeat(7,1fr);gap:4px;margin-bottom:8px}.weekday{text-align:center;font-size:12px;font-weight:600;color:var(--text-color);opacity:.7;padding:8px 4px}.calendar-days{display:grid;grid-template-columns:repeat(7,1fr);gap:4px}.day-cell{aspect-ratio:1;display:flex;align-items:center;justify-content:center;border-radius:calc(var(--border-radius) / 2);cursor:pointer;font-size:14px;font-weight:500;transition:all .2s ease;position:relative}.day-cell:not(.empty):not(.disabled):hover{background-color:var(--hover-color);transform:scale(1.05)}.day-cell.empty{cursor:default;pointer-events:none}.day-cell.today{color:var(--today-color);font-weight:700}.day-cell.today:after{content:\"\";position:absolute;bottom:4px;left:50%;transform:translate(-50%);width:4px;height:4px;background-color:var(--today-color);border-radius:50%}.day-cell.selected{background-color:var(--selected-date-background);color:var(--selected-date-color);font-weight:700}.day-cell.disabled{color:var(--disabled-color);cursor:not-allowed;opacity:.5}.day-cell.disabled:hover{background-color:transparent;transform:none}.selected-dates{margin-bottom:16px;padding:12px;background-color:var(--hover-color);border-radius:calc(var(--border-radius) / 2)}.selected-label{font-size:12px;font-weight:600;margin-bottom:8px;color:var(--text-color);opacity:.8}.selected-list{display:flex;flex-wrap:wrap;gap:8px}.selected-item{background-color:var(--primary-color);color:#fff;padding:6px 12px;border-radius:calc(var(--border-radius) / 2);font-size:13px;font-weight:500}.picker-footer{margin-bottom:12px}.submit-btn{width:100%;background-color:var(--primary-color);color:#fff;border:none;padding:12px 24px;border-radius:calc(var(--border-radius) / 2);cursor:pointer;font-size:15px;font-weight:600;transition:all .2s ease}.submit-btn:hover:not(:disabled){opacity:.9;transform:translateY(-2px);box-shadow:0 4px 8px #00000026}.submit-btn:active:not(:disabled){transform:translateY(0)}.submit-btn:disabled{opacity:.5;cursor:not-allowed}.calendar-type{text-align:center;color:var(--text-color);opacity:.6;font-size:11px}.hijri-date-picker[dir=rtl]{direction:rtl}.hijri-date-picker[dir=rtl] .picker-header{flex-direction:row-reverse}.hijri-date-picker[dir=rtl] .todays-date{justify-content:flex-start}@media (max-width: 480px){.hijri-date-picker{padding:16px;max-width:100%}.calendar-controls{flex-direction:column}.control-group{width:100%}.navigation-buttons{width:100%;justify-content:space-between}.weekday{font-size:11px;padding:6px 2px}.day-cell{font-size:13px}}@media (prefers-color-scheme: dark){.hijri-date-picker{--background-color: #1f2937;--text-color: #f9fafb;--border-color: #374151;--hover-color: #374151}}.time-picker{margin-top:10px;margin-bottom:20px;padding:16px;background:linear-gradient(135deg,var(--hover-color) 0%,transparent 100%);border-radius:var(--border-radius);border:1px solid var(--border-color);box-shadow:inset 0 2px 4px #0000000d}.time-picker-label{font-size:13px;font-weight:600;margin-bottom:12px;color:var(--text-color);opacity:.9;text-align:center;text-transform:uppercase;letter-spacing:.5px}.time-inputs{display:flex;align-items:center;justify-content:center;gap:12px}.time-input-group{display:flex;flex-direction:column;align-items:center;gap:6px}.time-btn{background-color:var(--primary-color);color:#fff;border:none;width:36px;height:28px;border-radius:calc(var(--border-radius) / 3);cursor:pointer;font-size:12px;display:flex;align-items:center;justify-content:center;transition:all .2s ease;-webkit-user-select:none;user-select:none}.time-btn:hover{filter:brightness(1.1);transform:scale(1.05)}.time-btn:active{transform:scale(.95)}.time-input{width:60px;padding:10px 4px;text-align:center;border:2px solid var(--border-color);border-radius:calc(var(--border-radius) / 2);background-color:var(--background-color);color:var(--text-color);font-size:20px;font-weight:700;transition:all .2s ease;box-shadow:0 2px 4px #0000000d}.time-input:focus{outline:none;border-color:var(--primary-color);box-shadow:0 0 0 4px #4f46e526}.time-input::-webkit-inner-spin-button,.time-input::-webkit-outer-spin-button{-webkit-appearance:none;margin:0}.time-separator{font-size:28px;font-weight:700;color:var(--text-color);opacity:.4;padding-bottom:4px}.ampm-toggle{display:flex;flex-direction:column;gap:6px;margin-left:12px}.ampm-btn{background-color:var(--background-color);color:var(--text-color);border:1px solid var(--border-color);padding:8px 14px;border-radius:calc(var(--border-radius) / 3);cursor:pointer;font-size:11px;font-weight:700;transition:all .2s ease;box-shadow:0 2px 4px #0000000d}.ampm-btn.active{background-color:var(--primary-color);color:#fff;border-color:var(--primary-color);box-shadow:0 4px 6px #00000026}.ampm-btn:hover:not(.active){background-color:var(--hover-color);border-color:var(--primary-color)}.selected-date-info{display:flex;flex-direction:column;align-items:center;gap:2px}.selected-item .time-text{font-size:11px;opacity:.85;font-weight:500;background-color:#fff3;padding:2px 8px;border-radius:10px;margin-top:2px}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }] });
|
|
539
|
+
}
|
|
540
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: HijriDatePickerComponent, decorators: [{
|
|
541
|
+
type: Component,
|
|
542
|
+
args: [{ selector: 'hijri-date-picker', standalone: true, imports: [CommonModule], template: "<div class=\"hijri-date-picker\" [dir]=\"dir\" [style]=\"getCustomStyles()\">\n <!-- Header Section -->\n <div class=\"picker-header\">\n <!-- Mode Toggle Button -->\n <button \n *ngIf=\"canChangeMode\" \n class=\"mode-toggle-btn\"\n (click)=\"toggleMode()\"\n [attr.aria-label]=\"mode === 'greg' ? 'Switch to Hijri' : 'Switch to Gregorian'\">\n {{ mode === 'greg' ? (locale === 'ar' ? '\u062A\u0642\u0648\u064A\u0645 \u0647\u062C\u0631\u064A' : 'Hijri') : (locale === 'ar' ? '\u062A\u0642\u0648\u064A\u0645 \u0645\u064A\u0644\u0627\u062F\u064A' : 'Gregorian') }}\n </button>\n\n <!-- Today's Date Section -->\n <div *ngIf=\"todaysDateSection\" class=\"todays-date\">\n <button class=\"today-btn\" (click)=\"selectToday()\">\n {{ todaysDateText }}\n </button>\n </div>\n </div>\n\n <!-- Calendar Controls -->\n <div class=\"calendar-controls\">\n <!-- Year Picker -->\n <div class=\"control-group\" *ngIf=\"!disableYearPicker\">\n <label [attr.for]=\"'year-select'\">{{ yearSelectLabel }}</label>\n <select \n id=\"year-select\"\n [value]=\"mode === 'hijri' ? currentHijriYear : currentYear\"\n (change)=\"onYearChange($event)\"\n class=\"year-select\">\n <option *ngFor=\"let year of years\" [value]=\"year\">{{ year }}</option>\n </select>\n </div>\n\n <!-- Month Picker -->\n <div class=\"control-group\" *ngIf=\"!disableMonthPicker\">\n <label [attr.for]=\"'month-select'\">{{ monthSelectLabel }}</label>\n <select \n id=\"month-select\"\n [value]=\"mode === 'hijri' ? currentHijriMonth : currentMonth\"\n (change)=\"onMonthChange($event)\"\n class=\"month-select\">\n <option *ngFor=\"let month of months; let i = index\" [value]=\"i\">\n {{ month }}\n </option>\n </select>\n </div>\n\n <!-- Navigation Buttons -->\n <div class=\"navigation-buttons\">\n <button \n class=\"nav-btn prev-btn\"\n (click)=\"previousMonth()\"\n [attr.aria-label]=\"locale === 'ar' ? '\u0627\u0644\u0634\u0647\u0631 \u0627\u0644\u0633\u0627\u0628\u0642' : 'Previous Month'\">\n {{ dir === 'rtl' ? '\u2190' : '\u2192' }}\n </button>\n <button \n class=\"nav-btn next-btn\"\n (click)=\"nextMonth()\"\n [attr.aria-label]=\"locale === 'ar' ? '\u0627\u0644\u0634\u0647\u0631 \u0627\u0644\u062A\u0627\u0644\u064A' : 'Next Month'\">\n {{ dir === 'rtl' ? '\u2192' : '\u2190' }}\n </button>\n </div>\n </div>\n\n <!-- Calendar Grid -->\n <div class=\"calendar-grid\" *ngIf=\"!disableDayPicker\">\n <!-- Weekday Headers -->\n <div class=\"weekday-header\">\n <div class=\"weekday\" *ngFor=\"let weekday of weekdays\">\n {{ weekday }}\n </div>\n </div>\n\n <!-- Calendar Days -->\n <div class=\"calendar-days\">\n <div \n *ngFor=\"let dayInfo of calendarDays\"\n class=\"day-cell\"\n [class.empty]=\"dayInfo.day === null\"\n [class.today]=\"markToday && dayInfo.isToday\"\n [class.selected]=\"dayInfo.isSelected\"\n [class.disabled]=\"dayInfo.isDisabled\"\n (click)=\"onDayClick(dayInfo)\">\n <span *ngIf=\"dayInfo.day !== null\">{{ dayInfo.day }}</span>\n </div>\n </div>\n </div>\n\n <!-- Time Picker Section -->\n <div class=\"time-picker\" *ngIf=\"enableTime\">\n <div class=\"time-picker-label\">\n {{ locale === 'ar' ? '\u0627\u0644\u0648\u0642\u062A' : 'Time' }}\n </div>\n \n <div class=\"time-inputs\">\n <!-- Hours Input -->\n <div class=\"time-input-group\">\n <button class=\"time-btn\" (click)=\"incrementTime('hours')\">\u25B2</button>\n <input \n type=\"number\" \n class=\"time-input\"\n [value]=\"timeFormat === '12' ? (selectedTime.hours % 12 || 12) : selectedTime.hours\"\n (input)=\"onTimeChange('hours', $event)\"\n [min]=\"timeFormat === '12' ? 1 : 0\"\n [max]=\"timeFormat === '12' ? 12 : 23\"\n [attr.aria-label]=\"locale === 'ar' ? '\u0627\u0644\u0633\u0627\u0639\u0627\u062A' : 'Hours'\">\n <button class=\"time-btn\" (click)=\"decrementTime('hours')\">\u25BC</button>\n </div>\n \n <span class=\"time-separator\">:</span>\n \n <!-- Minutes Input -->\n <div class=\"time-input-group\">\n <button class=\"time-btn\" (click)=\"incrementTime('minutes')\">\u25B2</button>\n <input \n type=\"number\" \n class=\"time-input\"\n [value]=\"selectedTime.minutes\"\n (input)=\"onTimeChange('minutes', $event)\"\n [min]=\"0\"\n [max]=\"59\"\n [step]=\"minuteStep\"\n [attr.aria-label]=\"locale === 'ar' ? '\u0627\u0644\u062F\u0642\u0627\u0626\u0642' : 'Minutes'\">\n <button class=\"time-btn\" (click)=\"decrementTime('minutes')\">\u25BC</button>\n </div>\n \n <!-- Seconds Input (Optional) -->\n <ng-container *ngIf=\"enableSeconds\">\n <span class=\"time-separator\">:</span>\n <div class=\"time-input-group\">\n <button class=\"time-btn\" (click)=\"incrementTime('seconds')\">\u25B2</button>\n <input \n type=\"number\" \n class=\"time-input\"\n [value]=\"selectedTime.seconds\"\n (input)=\"onTimeChange('seconds', $event)\"\n [min]=\"0\"\n [max]=\"59\"\n [attr.aria-label]=\"locale === 'ar' ? '\u0627\u0644\u062B\u0648\u0627\u0646\u064A' : 'Seconds'\">\n <button class=\"time-btn\" (click)=\"decrementTime('seconds')\">\u25BC</button>\n </div>\n </ng-container>\n \n <!-- AM/PM Toggle (12-hour format) -->\n <div class=\"ampm-toggle\" *ngIf=\"timeFormat === '12'\">\n <button \n class=\"ampm-btn\"\n [class.active]=\"!isPM\"\n (click)=\"setAMPM(false)\">\n AM\n </button>\n <button \n class=\"ampm-btn\"\n [class.active]=\"isPM\"\n (click)=\"setAMPM(true)\">\n PM\n </button>\n </div>\n </div>\n </div>\n\n <!-- Selected Dates Display -->\n <div class=\"selected-dates\" *ngIf=\"selectedDates.length > 0\">\n <div class=\"selected-label\">\n {{ locale === 'ar' ? '\u0627\u0644\u062A\u0648\u0627\u0631\u064A\u062E \u0627\u0644\u0645\u062D\u062F\u062F\u0629:' : 'Selected Dates:' }}\n </div>\n <div class=\"selected-list\">\n <div class=\"selected-item\" *ngFor=\"let date of selectedDates\">\n <div class=\"selected-date-info\">\n <span class=\"date-text\">\n {{ mode === 'hijri' ? date.formatted.hijri : date.formatted.gregorian }}\n </span>\n <span class=\"time-text\" *ngIf=\"enableTime && date.formatted.time\">\n {{ date.formatted.time }}\n </span>\n </div>\n </div>\n </div>\n </div>\n\n <!-- Submit Button -->\n <div class=\"picker-footer\" *ngIf=\"showConfirmButton\">\n <button \n class=\"submit-btn\"\n (click)=\"onSubmit()\"\n [disabled]=\"isRequired && selectedDates.length === 0\">\n {{ submitTextButton }}\n </button>\n </div>\n\n <!-- Calendar Type Label -->\n <div class=\"calendar-type\" *ngIf=\"mode === 'hijri'\">\n <small>{{ ummAlQuraDateText }}</small>\n </div>\n</div>\n", styles: [".hijri-date-picker{font-family:var(--font-family);font-size:var(--font-size);background-color:var(--background-color);color:var(--text-color);border:1px solid var(--border-color);border-radius:var(--border-radius);padding:20px;max-width:400px;box-shadow:0 4px 6px #0000001a}.picker-header{display:flex;justify-content:space-between;align-items:center;margin-bottom:16px;gap:12px}.mode-toggle-btn{background-color:var(--secondary-color);color:#fff;border:none;padding:8px 16px;border-radius:calc(var(--border-radius) / 2);cursor:pointer;font-size:13px;font-weight:500;transition:all .2s ease}.mode-toggle-btn:hover{opacity:.9;transform:translateY(-1px)}.mode-toggle-btn:active{transform:translateY(0)}.todays-date{flex:1;display:flex;justify-content:flex-end}.today-btn{background-color:var(--today-color);color:#fff;border:none;padding:8px 16px;border-radius:calc(var(--border-radius) / 2);cursor:pointer;font-size:13px;font-weight:500;transition:all .2s ease}.today-btn:hover{opacity:.9;transform:translateY(-1px)}.calendar-controls{display:flex;flex-wrap:wrap;gap:12px;margin-bottom:16px;align-items:flex-end}.control-group{flex:1;min-width:120px;display:flex;flex-direction:column;gap:4px}.control-group label{font-size:12px;font-weight:500;color:var(--text-color);opacity:.8}.year-select,.month-select{padding:8px 12px;border:1px solid var(--border-color);border-radius:calc(var(--border-radius) / 2);background-color:var(--background-color);color:var(--text-color);font-size:14px;cursor:pointer;transition:border-color .2s ease}.year-select:hover,.month-select:hover{border-color:var(--primary-color)}.year-select:focus,.month-select:focus{outline:none;border-color:var(--primary-color);box-shadow:0 0 0 3px #4f46e51a}.navigation-buttons{display:flex;gap:8px}.nav-btn{background-color:var(--primary-color);color:#fff;border:none;width:36px;height:36px;border-radius:calc(var(--border-radius) / 2);cursor:pointer;font-size:18px;display:flex;align-items:center;justify-content:center;transition:all .2s ease}.nav-btn:hover{opacity:.9;transform:scale(1.05)}.nav-btn:active{transform:scale(.95)}.calendar-grid{margin-bottom:16px}.weekday-header{display:grid;grid-template-columns:repeat(7,1fr);gap:4px;margin-bottom:8px}.weekday{text-align:center;font-size:12px;font-weight:600;color:var(--text-color);opacity:.7;padding:8px 4px}.calendar-days{display:grid;grid-template-columns:repeat(7,1fr);gap:4px}.day-cell{aspect-ratio:1;display:flex;align-items:center;justify-content:center;border-radius:calc(var(--border-radius) / 2);cursor:pointer;font-size:14px;font-weight:500;transition:all .2s ease;position:relative}.day-cell:not(.empty):not(.disabled):hover{background-color:var(--hover-color);transform:scale(1.05)}.day-cell.empty{cursor:default;pointer-events:none}.day-cell.today{color:var(--today-color);font-weight:700}.day-cell.today:after{content:\"\";position:absolute;bottom:4px;left:50%;transform:translate(-50%);width:4px;height:4px;background-color:var(--today-color);border-radius:50%}.day-cell.selected{background-color:var(--selected-date-background);color:var(--selected-date-color);font-weight:700}.day-cell.disabled{color:var(--disabled-color);cursor:not-allowed;opacity:.5}.day-cell.disabled:hover{background-color:transparent;transform:none}.selected-dates{margin-bottom:16px;padding:12px;background-color:var(--hover-color);border-radius:calc(var(--border-radius) / 2)}.selected-label{font-size:12px;font-weight:600;margin-bottom:8px;color:var(--text-color);opacity:.8}.selected-list{display:flex;flex-wrap:wrap;gap:8px}.selected-item{background-color:var(--primary-color);color:#fff;padding:6px 12px;border-radius:calc(var(--border-radius) / 2);font-size:13px;font-weight:500}.picker-footer{margin-bottom:12px}.submit-btn{width:100%;background-color:var(--primary-color);color:#fff;border:none;padding:12px 24px;border-radius:calc(var(--border-radius) / 2);cursor:pointer;font-size:15px;font-weight:600;transition:all .2s ease}.submit-btn:hover:not(:disabled){opacity:.9;transform:translateY(-2px);box-shadow:0 4px 8px #00000026}.submit-btn:active:not(:disabled){transform:translateY(0)}.submit-btn:disabled{opacity:.5;cursor:not-allowed}.calendar-type{text-align:center;color:var(--text-color);opacity:.6;font-size:11px}.hijri-date-picker[dir=rtl]{direction:rtl}.hijri-date-picker[dir=rtl] .picker-header{flex-direction:row-reverse}.hijri-date-picker[dir=rtl] .todays-date{justify-content:flex-start}@media (max-width: 480px){.hijri-date-picker{padding:16px;max-width:100%}.calendar-controls{flex-direction:column}.control-group{width:100%}.navigation-buttons{width:100%;justify-content:space-between}.weekday{font-size:11px;padding:6px 2px}.day-cell{font-size:13px}}@media (prefers-color-scheme: dark){.hijri-date-picker{--background-color: #1f2937;--text-color: #f9fafb;--border-color: #374151;--hover-color: #374151}}.time-picker{margin-top:10px;margin-bottom:20px;padding:16px;background:linear-gradient(135deg,var(--hover-color) 0%,transparent 100%);border-radius:var(--border-radius);border:1px solid var(--border-color);box-shadow:inset 0 2px 4px #0000000d}.time-picker-label{font-size:13px;font-weight:600;margin-bottom:12px;color:var(--text-color);opacity:.9;text-align:center;text-transform:uppercase;letter-spacing:.5px}.time-inputs{display:flex;align-items:center;justify-content:center;gap:12px}.time-input-group{display:flex;flex-direction:column;align-items:center;gap:6px}.time-btn{background-color:var(--primary-color);color:#fff;border:none;width:36px;height:28px;border-radius:calc(var(--border-radius) / 3);cursor:pointer;font-size:12px;display:flex;align-items:center;justify-content:center;transition:all .2s ease;-webkit-user-select:none;user-select:none}.time-btn:hover{filter:brightness(1.1);transform:scale(1.05)}.time-btn:active{transform:scale(.95)}.time-input{width:60px;padding:10px 4px;text-align:center;border:2px solid var(--border-color);border-radius:calc(var(--border-radius) / 2);background-color:var(--background-color);color:var(--text-color);font-size:20px;font-weight:700;transition:all .2s ease;box-shadow:0 2px 4px #0000000d}.time-input:focus{outline:none;border-color:var(--primary-color);box-shadow:0 0 0 4px #4f46e526}.time-input::-webkit-inner-spin-button,.time-input::-webkit-outer-spin-button{-webkit-appearance:none;margin:0}.time-separator{font-size:28px;font-weight:700;color:var(--text-color);opacity:.4;padding-bottom:4px}.ampm-toggle{display:flex;flex-direction:column;gap:6px;margin-left:12px}.ampm-btn{background-color:var(--background-color);color:var(--text-color);border:1px solid var(--border-color);padding:8px 14px;border-radius:calc(var(--border-radius) / 3);cursor:pointer;font-size:11px;font-weight:700;transition:all .2s ease;box-shadow:0 2px 4px #0000000d}.ampm-btn.active{background-color:var(--primary-color);color:#fff;border-color:var(--primary-color);box-shadow:0 4px 6px #00000026}.ampm-btn:hover:not(.active){background-color:var(--hover-color);border-color:var(--primary-color)}.selected-date-info{display:flex;flex-direction:column;align-items:center;gap:2px}.selected-item .time-text{font-size:11px;opacity:.85;font-weight:500;background-color:#fff3;padding:2px 8px;border-radius:10px;margin-top:2px}\n"] }]
|
|
543
|
+
}], propDecorators: { canChangeMode: [{
|
|
544
|
+
type: Input
|
|
545
|
+
}], mode: [{
|
|
546
|
+
type: Input
|
|
547
|
+
}], dir: [{
|
|
548
|
+
type: Input
|
|
549
|
+
}], locale: [{
|
|
550
|
+
type: Input
|
|
551
|
+
}], futureValidation: [{
|
|
552
|
+
type: Input
|
|
553
|
+
}], futureYearsLimit: [{
|
|
554
|
+
type: Input
|
|
555
|
+
}], isRequired: [{
|
|
556
|
+
type: Input
|
|
557
|
+
}], minDate: [{
|
|
558
|
+
type: Input
|
|
559
|
+
}], maxDate: [{
|
|
560
|
+
type: Input
|
|
561
|
+
}], multiple: [{
|
|
562
|
+
type: Input
|
|
563
|
+
}], showConfirmButton: [{
|
|
564
|
+
type: Input
|
|
565
|
+
}], initialSelectedDate: [{
|
|
566
|
+
type: Input
|
|
567
|
+
}], initialSelectedDates: [{
|
|
568
|
+
type: Input
|
|
569
|
+
}], submitTextButton: [{
|
|
570
|
+
type: Input
|
|
571
|
+
}], todaysDateText: [{
|
|
572
|
+
type: Input
|
|
573
|
+
}], ummAlQuraDateText: [{
|
|
574
|
+
type: Input
|
|
575
|
+
}], yearSelectLabel: [{
|
|
576
|
+
type: Input
|
|
577
|
+
}], monthSelectLabel: [{
|
|
578
|
+
type: Input
|
|
579
|
+
}], todaysDateSection: [{
|
|
580
|
+
type: Input
|
|
581
|
+
}], markToday: [{
|
|
582
|
+
type: Input
|
|
583
|
+
}], disableYearPicker: [{
|
|
584
|
+
type: Input
|
|
585
|
+
}], disableMonthPicker: [{
|
|
586
|
+
type: Input
|
|
587
|
+
}], disableDayPicker: [{
|
|
588
|
+
type: Input
|
|
589
|
+
}], styles: [{
|
|
590
|
+
type: Input
|
|
591
|
+
}], enableTime: [{
|
|
592
|
+
type: Input
|
|
593
|
+
}], timeFormat: [{
|
|
594
|
+
type: Input
|
|
595
|
+
}], minuteStep: [{
|
|
596
|
+
type: Input
|
|
597
|
+
}], enableSeconds: [{
|
|
598
|
+
type: Input
|
|
599
|
+
}], defaultTime: [{
|
|
600
|
+
type: Input
|
|
601
|
+
}], dateSelected: [{
|
|
602
|
+
type: Output
|
|
603
|
+
}], modeChanged: [{
|
|
604
|
+
type: Output
|
|
605
|
+
}] } });
|
|
606
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaGlqcmktZGF0ZS1waWNrZXIuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2xpYi9oaWpyaS1kYXRlLXBpY2tlci5jb21wb25lbnQudHMiLCIuLi8uLi8uLi9zcmMvbGliL2hpanJpLWRhdGUtcGlja2VyLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxZQUFZLEVBQW9DLE1BQU0sZUFBZSxDQUFDO0FBQ3pHLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMvQyxPQUFPLFNBQVMsRUFBRSxFQUFFLE9BQU8sRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQ3pELE9BQU8sRUFTTCxtQkFBbUIsRUFDbkIsbUJBQW1CLEVBQ25CLGVBQWUsRUFDZixlQUFlLEVBQ2YsZ0JBQWdCLEVBQ2hCLGdCQUFnQixFQUNqQixNQUFNLDJCQUEyQixDQUFDOzs7QUFTbkMsTUFBTSxPQUFPLHdCQUF3QjtJQUNuQyx1QkFBdUI7SUFDZCxhQUFhLEdBQVksSUFBSSxDQUFDO0lBQzlCLElBQUksR0FBYSxNQUFNLENBQUM7SUFDeEIsR0FBRyxHQUFjLEtBQUssQ0FBQztJQUN2QixNQUFNLEdBQVcsSUFBSSxDQUFDO0lBRS9CLGFBQWE7SUFDSixnQkFBZ0IsR0FBWSxJQUFJLENBQUM7SUFDakMsZ0JBQWdCLEdBQVcsRUFBRSxDQUFDO0lBQzlCLFVBQVUsR0FBWSxLQUFLLENBQUM7SUFDNUIsT0FBTyxDQUFRLENBQUMsMEJBQTBCO0lBQzFDLE9BQU8sQ0FBUSxDQUFDLDBCQUEwQjtJQUVuRCxZQUFZO0lBQ0gsUUFBUSxHQUFZLEtBQUssQ0FBQztJQUMxQixpQkFBaUIsR0FBWSxLQUFLLENBQUM7SUFDbkMsbUJBQW1CLENBQVEsQ0FBQyxnREFBZ0Q7SUFDNUUsb0JBQW9CLENBQVUsQ0FBQyxtREFBbUQ7SUFFM0YsU0FB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bUJBQW1CO3NCQUEzQixLQUFLO2dCQUNHLG9CQUFvQjtzQkFBNUIsS0FBSztnQkFHRyxnQkFBZ0I7c0JBQXhCLEtBQUs7Z0JBQ0csY0FBYztzQkFBdEIsS0FBSztnQkFDRyxpQkFBaUI7c0JBQXpCLEtBQUs7Z0JBQ0csZUFBZTtzQkFBdkIsS0FBSztnQkFDRyxnQkFBZ0I7c0JBQXhCLEtBQUs7Z0JBR0csaUJBQWlCO3NCQUF6QixLQUFLO2dCQUNHLFNBQVM7c0JBQWpCLEtBQUs7Z0JBQ0csaUJBQWlCO3NCQUF6QixLQUFLO2dCQUNHLGtCQUFrQjtzQkFBMUIsS0FBSztnQkFDRyxnQkFBZ0I7c0JBQXhCLEtBQUs7Z0JBR0csTUFBTTtzQkFBZCxLQUFLO2dCQUdHLFVBQVU7c0JBQWxCLEtBQUs7Z0JBQ0csVUFBVTtzQkFBbEIsS0FBSztnQkFDRyxVQUFVO3NCQUFsQixLQUFLO2dCQUNHLGFBQWE7c0JBQXJCLEtBQUs7Z0JBQ0csV0FBVztzQkFBbkIsS0FBSztnQkFHSSxZQUFZO3NCQUFyQixNQUFNO2dCQUNHLFdBQVc7c0JBQXBCLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIElucHV0LCBPdXRwdXQsIEV2ZW50RW1pdHRlciwgT25Jbml0LCBPbkNoYW5nZXMsIFNpbXBsZUNoYW5nZXMgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IENvbW1vbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQgSGlqcmlEYXRlLCB7IHRvSGlqcmkgfSBmcm9tICdoaWpyaS1kYXRlL2xpYi9zYWZlJztcbmltcG9ydCB7XG4gIERhdGVNb2RlLFxuICBEaXJlY3Rpb24sXG4gIExvY2FsZSxcbiAgU2VsZWN0ZWREYXRlLFxuICBEYXRlUGlja2VyU3R5bGVzLFxuICBEYXRlUGlja2VyTGFiZWxzLFxuICBEYXRlUGlja2VyRGlzcGxheSxcbiAgVGltZUZvcm1hdCxcbiAgR1JFR09SSUFOX01PTlRIU19FTixcbiAgR1JFR09SSUFOX01PTlRIU19BUixcbiAgSElKUklfTU9OVEhTX0VOLFxuICBISUpSSV9NT05USFNfQVIsXG4gIFdFRUtEQVlfTkFNRVNfRU4sXG4gIFdFRUtEQVlfTkFNRVNfQVJcbn0gZnJvbSAnLi9oaWpyaS1kYXRlLXBpY2tlci50eXBlcyc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2hpanJpLWRhdGUtcGlja2VyJyxcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgaW1wb3J0czogW0NvbW1vbk1vZHVsZV0sXG4gIHRlbXBsYXRlVXJsOiAnLi9oaWpyaS1kYXRlLXBpY2tlci5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL2hpanJpLWRhdGUtcGlja2VyLmNvbXBvbmVudC5jc3MnXVxufSlcbmV4cG9ydCBjbGFzcyBIaWpyaURhdGVQaWNrZXJDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIE9uQ2hhbmdlcyB7XG4gIC8vIE1vZGUgJiBDb25maWd1cmF0aW9uXG4gIEBJbnB1dCgpIGNhbkNoYW5nZU1vZGU6IGJvb2xlYW4gPSB0cnVlO1xuICBASW5wdXQoKSBtb2RlOiBEYXRlTW9kZSA9ICdncmVnJztcbiAgQElucHV0KCkgZGlyOiBEaXJlY3Rpb24gPSAnbHRyJztcbiAgQElucHV0KCkgbG9jYWxlOiBMb2NhbGUgPSAnZW4nO1xuXG4gIC8vIFZhbGlkYXRpb25cbiAgQElucHV0KCkgZnV0dXJlVmFsaWRhdGlvbjogYm9vbGVhbiA9IHRydWU7XG4gIEBJbnB1dCgpIGZ1dHVyZVllYXJzTGltaXQ6IG51bWJlciA9IDEwO1xuICBASW5wdXQoKSBpc1JlcXVpcmVkOiBib29sZWFuID0gZmFsc2U7XG4gIEBJbnB1dCgpIG1pbkRhdGU/OiBEYXRlOyAvLyBNaW5pbXVtIHNlbGVjdGFibGUgZGF0ZVxuICBASW5wdXQoKSBtYXhEYXRlPzogRGF0ZTsgLy8gTWF4aW11bSBzZWxlY3RhYmxlIGRhdGVcblxuICAvLyBTZWxlY3Rpb25cbiAgQElucHV0KCkgbXVsdGlwbGU6IGJvb2xlYW4gPSBmYWxzZTtcbiAgQElucHV0KCkgc2hvd0NvbmZpcm1CdXR0b246IGJvb2xlYW4gPSBmYWxzZTtcbiAgQElucHV0KCkgaW5pdGlhbFNlbGVjdGVkRGF0ZT86IERhdGU7IC8vIEZvciBzaW5nbGUgc2VsZWN0aW9uIG1vZGUgLSBiaW5kIGluaXRpYWwgZGF0ZVxuICBASW5wdXQoKSBpbml0aWFsU2VsZWN0ZWREYXRlcz86IERhdGVbXTsgLy8gRm9yIG11bHRpcGxlIHNlbGVjdGlvbiBtb2RlIC0gYmluZCBpbml0aWFsIGRhdGVzXG5cbiAgLy8gTGFiZWxzXG4gIEBJbnB1dCgpIHN1Ym1pdFRleHRCdXR0b246IHN0cmluZyA9ICdTdWJtaXQnO1xuICBASW5wdXQoKSB0b2RheXNEYXRlVGV4dDogc3RyaW5nID0gJ1RvZGF5JztcbiAgQElucHV0KCkgdW1tQWxRdXJhRGF0ZVRleHQ6IHN0cmluZyA9ICdVbW0gQWwtUXVyYSBDYWxlbmRhcic7XG4gIEBJbnB1dCgpIHllYXJTZWxlY3RMYWJlbDogc3RyaW5nID0gJ1llYXInO1xuICBASW5wdXQoKSBtb250aFNlbGVjdExhYmVsOiBzdHJpbmcgPSAnTW9udGgnO1xuXG4gIC8vIERpc3BsYXkgT3B0aW9uc1xuICBASW5wdXQoKSB0b2RheXNEYXRlU2VjdGlvbjogYm9vbGVhbiA9IHRydWU7XG4gIEBJbnB1dCgpIG1hcmtUb2RheTogYm9vbGVhbiA9IHRydWU7XG4gIEBJbnB1dCgpIGRpc2FibGVZZWFyUGlja2VyOiBib29sZWFuID0gZmFsc2U7XG4gIEBJbnB1dCgpIGRpc2FibGVNb250aFBpY2tlcjogYm9vbGVhbiA9IGZhbHNlO1xuICBASW5wdXQoKSBkaXNhYmxlRGF5UGlja2VyOiBib29sZWFuID0gZmFsc2U7XG5cbiAgLy8gU3R5bGluZ1xuICBASW5wdXQoKSBzdHlsZXM6IERhdGVQaWNrZXJTdHlsZXMgPSB7fTtcblxuICAvLyBUaW1lIENvbmZpZ3VyYXRpb25cbiAgQElucHV0KCkgZW5hYmxlVGltZTogYm9vbGVhbiA9IGZhbHNlO1xuICBASW5wdXQoKSB0aW1lRm9ybWF0OiBUaW1lRm9ybWF0ID0gJzI0JztcbiAgQElucHV0KCkgbWludXRlU3RlcDogbnVtYmVyID0gMTtcbiAgQElucHV0KCkgZW5hYmxlU2Vjb25kczogYm9vbGVhbiA9IGZhbHNlO1xuICBASW5wdXQoKSBkZWZhdWx0VGltZT86IHsgaG91cnM6IG51bWJlcjsgbWludXRlczogbnVtYmVyOyBzZWNvbmRzPzogbnVtYmVyIH07XG5cbiAgLy8gT3V0cHV0c1xuICBAT3V0cHV0KCkgZGF0ZVNlbGVjdGVkID0gbmV3IEV2ZW50RW1pdHRlcjxTZWxlY3RlZERhdGUgfCBTZWxlY3RlZERhdGVbXT4oKTtcbiAgQE91dHB1dCgpIG1vZGVDaGFuZ2VkID0gbmV3IEV2ZW50RW1pdHRlcjxEYXRlTW9kZT4oKTtcblxuICAvLyBJbnRlcm5hbCBTdGF0ZVxuICBjdXJyZW50WWVhcjogbnVtYmVyID0gbmV3IERhdGUoKS5nZXRGdWxsWWVhcigpO1xuICBjdXJyZW50TW9udGg6IG51bWJlciA9IG5ldyBEYXRlKCkuZ2V0TW9udGgoKTtcbiAgY3VycmVudEhpanJpWWVhcjogbnVtYmVyID0gMDtcbiAgY3VycmVudEhpanJpTW9udGg6IG51bWJlciA9IDA7XG4gIFxuICBzZWxlY3RlZERhdGVzOiBTZWxlY3RlZERhdGVbXSA9IFtdO1xuICBjYWxlbmRhckRheXM6IGFueVtdID0gW107XG4gIHRvZGF5OiBEYXRlID0gbmV3IERhdGUoKTtcbiAgXG4gIHllYXJzOiBudW1iZXJbXSA9IFtdO1xuICBtb250aHM6IHN0cmluZ1tdID0gW107XG4gIHdlZWtkYXlzOiBzdHJpbmdbXSA9IFtdO1xuXG4gIC8vIFRpbWUgc3RhdGVcbiAgc2VsZWN0ZWRUaW1lOiB7IGhvdXJzOiBudW1iZXI7IG1pbnV0ZXM6IG51bWJlcjsgc2Vjb25kczogbnVtYmVyIH0gPSB7XG4gICAgaG91cnM6IDAsXG4gICAgbWludXRlczogMCxcbiAgICBzZWNvbmRzOiAwXG4gIH07XG4gIGlzUE06IGJvb2xlYW4gPSBmYWxzZTtcblxuICBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICB0aGlzLmluaXRpYWxpemVDYWxlbmRhcigpO1xuICAgIHRoaXMuaW5pdGlhbGl6ZVNlbGVjdGVkRGF0ZXMoKTtcbiAgICB0aGlzLmluaXRpYWxpemVUaW1lKCk7XG4gICAgdGhpcy51cGRhdGVMb2NhbGVEYXRhKCk7XG4gICAgdGhpcy5nZW5lcmF0ZVllYXJzKCk7XG4gICAgdGhpcy5nZW5lcmF0ZUNhbGVuZGFyKCk7XG4gIH1cblxuICBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKTogdm9pZCB7XG4gICAgaWYgKGNoYW5nZXNbJ21vZGUnXSB8fCBjaGFuZ2VzWydsb2NhbGUnXSkge1xuICAgICAgdGhpcy51cGRhdGVMb2NhbGVEYXRhKCk7XG4gICAgICB0aGlzLmdlbmVyYXRlQ2FsZW5kYXIoKTtcbiAgICB9XG4gICAgXG4gICAgLy8gSGFuZGxlIGNoYW5nZXMgdG8gaW5pdGlhbCBzZWxlY3RlZCBkYXRlc1xuICAgIGlmIChjaGFuZ2VzWydpbml0aWFsU2VsZWN0ZWREYXRlJ10gfHwgY2hhbmdlc1snaW5pdGlhbFNlbGVjdGVkRGF0ZXMnXSkge1xuICAgICAgdGhpcy5pbml0aWFsaXplU2VsZWN0ZWREYXRlcygpO1xuICAgICAgdGhpcy5nZW5lcmF0ZUNhbGVuZGFyKCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBpbml0aWFsaXplQ2FsZW5kYXIoKTogdm9pZCB7XG4gICAgY29uc3QgaGlqcmlUb2RheSA9IG5ldyBIaWpyaURhdGUoKTtcbiAgICB0aGlzLmN1cnJlbnRIaWpyaVllYXIgPSBoaWpyaVRvZGF5LmdldEZ1bGxZZWFyKCk7XG4gICAgdGhpcy5jdXJyZW50SGlqcmlNb250aCA9IGhpanJpVG9kYXkuZ2V0TW9udGgoKTtcbiAgfVxuXG4gIHByaXZhdGUgaW5pdGlhbGl6ZVNlbGVjdGVkRGF0ZXMoKTogdm9pZCB7XG4gICAgLy8gSGFuZGxlIHNpbmdsZSBzZWxlY3Rpb24gbW9kZVxuICAgIGlmICghdGhpcy5tdWx0aXBsZSAmJiB0aGlzLmluaXRpYWxTZWxlY3RlZERhdGUpIHtcbiAgICAgIHRoaXMuc2VsZWN0ZWREYXRlcyA9IFt0aGlzLmNyZWF0ZVNlbGVjdGVkRGF0ZSh0aGlzLmluaXRpYWxTZWxlY3RlZERhdGUpXTtcbiAgICB9XG4gICAgXG4gICAgLy8gSGFuZGxlIG11bHRpcGxlIHNlbGVjdGlvbiBtb2RlXG4gICAgaWYgKHRoaXMubXVsdGlwbGUgJiYgdGhpcy5pbml0aWFsU2VsZWN0ZWREYXRlcyAmJiB0aGlzLmluaXRpYWxTZWxlY3RlZERhdGVzLmxlbmd0aCA+IDApIHtcbiAgICAgIHRoaXMuc2VsZWN0ZWREYXRlcyA9IHRoaXMuaW5pdGlhbFNlbGVjdGVkRGF0ZXMubWFwKGRhdGUgPT4gdGhpcy5jcmVhdGVTZWxlY3RlZERhdGUoZGF0ZSkpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgaW5pdGlhbGl6ZVRpbWUoKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLmVuYWJsZVRpbWUpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBTZXQgZGVmYXVsdCB0aW1lIGlmIHByb3ZpZGVkXG4gICAgaWYgKHRoaXMuZGVmYXVsdFRpbWUpIHtcbiAgICAgIHRoaXMuc2VsZWN0ZWRUaW1lID0ge1xuICAgICAgICBob3VyczogdGhpcy5kZWZhdWx0VGltZS5ob3VycyxcbiAgICAgICAgbWludXRlczogdGhpcy5kZWZhdWx0VGltZS5taW51dGVzLFxuICAgICAgICBzZWNvbmRzOiB0aGlzLmRlZmF1bHRUaW1lLnNlY29uZHMgfHwgMFxuICAgICAgfTtcbiAgICAgIFxuICAgICAgLy8gU2V0IEFNL1BNIGZvciAxMi1ob3VyIGZvcm1hdFxuICAgICAgaWYgKHRoaXMudGltZUZvcm1hdCA9PT0gJzEyJykge1xuICAgICAgICB0aGlzLmlzUE0gPSB0aGlzLnNlbGVjdGVkVGltZS5ob3VycyA+PSAxMjtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgLy8gRGVmYXVsdCB0byBjdXJyZW50IHRpbWVcbiAgICAgIGNvbnN0IG5vdyA9IG5ldyBEYXRlKCk7XG4gICAgICB0aGlzLnNlbGVjdGVkVGltZSA9IHtcbiAgICAgICAgaG91cnM6IG5vdy5nZXRIb3VycygpLFxuICAgICAgICBtaW51dGVzOiBub3cuZ2V0TWludXRlcygpLFxuICAgICAgICBzZWNvbmRzOiBub3cuZ2V0U2Vjb25kcygpXG4gICAgICB9O1xuICAgICAgdGhpcy5pc1BNID0gdGhpcy5zZWxlY3RlZFRpbWUuaG91cnMgPj0gMTI7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSB1cGRhdGVMb2NhbGVEYXRhKCk6IHZvaWQge1xuICAgIC8vIFVwZGF0ZSB3ZWVrZGF5IG5hbWVzXG4gICAgdGhpcy53ZWVrZGF5cyA9IHRoaXMubG9jYWxlID09PSAnYXInID8gV0VFS0RBWV9OQU1FU19BUiA6IFdFRUtEQVlfTkFNRVNfRU47XG5cbiAgICAvLyBVcGRhdGUgbW9udGggbmFtZXMgYmFzZWQgb24gbW9kZSBhbmQgbG9jYWxlXG4gICAgaWYgKHRoaXMubW9kZSA9PT0gJ2hpanJpJykge1xuICAgICAgdGhpcy5tb250aHMgPSB0aGlzLmxvY2FsZSA9PT0gJ2FyJyA/IEhJSlJJX01PTlRIU19BUiA6IEhJSlJJX01PTlRIU19FTjtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5tb250aHMgPSB0aGlzLmxvY2FsZSA9PT0gJ2FyJyA/IEdSRUdPUklBTl9NT05USFNfQVIgOiBHUkVHT1JJQU5fTU9OVEhTX0VOO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgZ2VuZXJhdGVZZWFycygpOiB2b2lkIHtcbiAgICBjb25zdCBjdXJyZW50WWVhciA9IHRoaXMubW9kZSA9PT0gJ2hpanJpJyA/IHRoaXMuY3VycmVudEhpanJpWWVhciA6IHRoaXMuY3VycmVudFllYXI7XG4gICAgY29uc3Qgc3RhcnRZZWFyID0gY3VycmVudFllYXIgLSAxMDA7XG4gICAgY29uc3QgZW5kWWVhciA9IGN1cnJlbnRZZWFyICsgdGhpcy5mdXR1cmVZZWFyc0xpbWl0O1xuICAgIFxuICAgIHRoaXMueWVhcnMgPSBbXTtcbiAgICBmb3IgKGxldCB5ZWFyID0gc3RhcnRZZWFyOyB5ZWFyIDw9IGVuZFllYXI7IHllYXIrKykge1xuICAgICAgdGhpcy55ZWFycy5wdXNoKHllYXIpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgZ2VuZXJhdGVDYWxlbmRhcigpOiB2b2lkIHtcbiAgICB0aGlzLmNhbGVuZGFyRGF5cyA9IFtdO1xuICAgIFxuICAgIGlmICh0aGlzLm1vZGUgPT09ICdoaWpyaScpIHtcbiAgICAgIHRoaXMuZ2VuZXJhdGVIaWpyaUNhbGVuZGFyKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuZ2VuZXJhdGVHcmVnb3JpYW5DYWxlbmRhcigpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgZ2VuZXJhdGVHcmVnb3JpYW5DYWxlbmRhcigpOiB2b2lkIHtcbiAgICBjb25zdCBmaXJzdERheSA9IG5ldyBEYXRlKHRoaXMuY3VycmVudFllYXIsIHRoaXMuY3VycmVudE1vbnRoLCAxKTtcbiAgICBjb25zdCBsYXN0RGF5ID0gbmV3IERhdGUodGhpcy5jdXJyZW50WWVhciwgdGhpcy5jdXJyZW50TW9udGggKyAxLCAwKTtcbiAgICBjb25zdCBzdGFydGluZ0RheU9mV2VlayA9IGZpcnN0RGF5LmdldERheSgpO1xuICAgIGNvbnN0IGRheXNJbk1vbnRoID0gbGFzdERheS5nZXREYXRlKCk7XG5cbiAgICAvLyBBZGQgZW1wdHkgY2VsbHMgZm9yIGRheXMgYmVmb3JlIHRoZSBmaXJzdCBkYXkgb2YgdGhlIG1vbnRoXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzdGFydGluZ0RheU9mV2VlazsgaSsrKSB7XG4gICAgICB0aGlzLmNhbGVuZGFyRGF5cy5wdXNoKHsgZGF5OiBudWxsLCBkaXNhYmxlZDogdHJ1ZSB9KTtcbiAgICB9XG5cbiAgICAvLyBBZGQgZGF5cyBvZiB0aGUgbW9udGhcbiAgICBmb3IgKGxldCBkYXkgPSAxOyBkYXkgPD0gZGF5c0luTW9udGg7IGRheSsrKSB7XG4gICAgICBjb25zdCBkYXRlID0gbmV3IERhdGUodGhpcy5jdXJyZW50WWVhciwgdGhpcy5jdXJyZW50TW9udGgsIGRheSk7XG4gICAgICBjb25zdCBpc1RvZGF5ID0gdGhpcy5pc1NhbWVEYXkoZGF0ZSwgdGhpcy50b2RheSk7XG4gICAgICBjb25zdCBpc0Rpc2FibGVkID0gdGhpcy5pc0RhdGVEaXNhYmxlZChkYXRlKTtcbiAgICAgIGNvbnN0IGlzU2VsZWN0ZWQgPSB0aGlzLmlzRGF0ZVNlbGVjdGVkKGRhdGUpO1xuXG4gICAgICB0aGlzLmNhbGVuZGFyRGF5cy5wdXNoKHtcbiAgICAgICAgZGF5LFxuICAgICAgICBkYXRlLFxuICAgICAgICBpc1RvZGF5LFxuICAgICAgICBpc0Rpc2FibGVkLFxuICAgICAgICBpc1NlbGVjdGVkLFxuICAgICAgICBkaXNhYmxlZDogZmFsc2VcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgZ2VuZXJhdGVIaWpyaUNhbGVuZGFyKCk6IHZvaWQge1xuICAgIGNvbnN0IGhpanJpRGF0ZSA9IG5ldyBIaWpyaURhdGUodGhpcy5jdXJyZW50SGlqcmlZZWFyLCB0aGlzLmN1cnJlbnRIaWpyaU1vbnRoLCAxKTtcbiAgICBjb25zdCBncmVnb3JpYW5EYXRlID0gaGlqcmlEYXRlLnRvR3JlZ29yaWFuKCk7XG4gICAgY29uc3Qgc3RhcnRpbmdEYXlPZldlZWsgPSBncmVnb3JpYW5EYXRlLmdldERheSgpO1xuICAgIFxuICAgIC8vIEdldCBkYXlzIGluIEhpanJpIG1vbnRoICh0eXBpY2FsbHkgMjkgb3IgMzApXG4gICAgY29uc3QgZGF5c0luTW9udGggPSB0aGlzLmdldERheXNJbkhpanJpTW9udGgodGhpcy5jdXJyZW50SGlqcmlZZWFyLCB0aGlzLmN1cnJlbnRIaWpyaU1vbnRoKTtcblxuICAgIC8vIEFkZCBlbXB0eSBjZWxscyBmb3IgZGF5cyBiZWZvcmUgdGhlIGZpcnN0IGRheSBvZiB0aGUgbW9udGhcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHN0YXJ0aW5nRGF5T2ZXZWVrOyBpKyspIHtcbiAgICAgIHRoaXMuY2FsZW5kYXJEYXlzLnB1c2goeyBkYXk6IG51bGwsIGRpc2FibGVkOiB0cnVlIH0pO1xuICAgIH1cblxuICAgIC8vIEFkZCBkYXlzIG9mIHRoZSBtb250aFxuICAgIGZvciAobGV0IGRheSA9IDE7IGRheSA8PSBkYXlzSW5Nb250aDsgZGF5KyspIHtcbiAgICAgIGNvbnN0IGhpanJpRGF5ID0gbmV3IEhpanJpRGF0ZSh0aGlzLmN1cnJlbnRIaWpyaVllYXIsIHRoaXMuY3VycmVudEhpanJpTW9udGgsIGRheSk7XG4gICAgICBjb25zdCBncmVnb3JpYW5EYXkgPSBoaWpyaURheS50b0dyZWdvcmlhbigpO1xuICAgICAgY29uc3QgaXNUb2RheSA9IHRoaXMuaXNTYW1lRGF5KGdyZWdvcmlhbkRheSwgdGhpcy50b2RheSk7XG4gICAgICBjb25zdCBpc0Rpc2FibGVkID0gdGhpcy5pc0RhdGVEaXNhYmxlZChncmVnb3JpYW5EYXkpO1xuICAgICAgY29uc3QgaXNTZWxlY3RlZCA9IHRoaXMuaXNEYXRlU2VsZWN0ZWQoZ3JlZ29yaWFuRGF5KTtcblxuICAgICAgdGhpcy5jYWxlbmRhckRheXMucHVzaCh7XG4gICAgICAgIGRheSxcbiAgICAgICAgZGF0ZTogZ3JlZ29yaWFuRGF5LFxuICAgICAgICBoaWpyaURhdGU6IGhpanJpRGF5LFxuICAgICAgICBpc1RvZGF5LFxuICAgICAgICBpc0Rpc2FibGVkLFxuICAgICAgICBpc1NlbGVjdGVkLFxuICAgICAgICBkaXNhYmxlZDogZmFsc2VcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgZ2V0RGF5c0luSGlqcmlNb250aCh5ZWFyOiBudW1iZXIsIG1vbnRoOiBudW1iZXIpOiBudW1iZXIge1xuICAgIC8vIFRyeSB0byBjcmVhdGUgdGhlIDMwdGggZGF5OyBpZiBpdCBmYWlscywgdGhlIG1vbnRoIGhhcyAyOSBkYXlzXG4gICAgdHJ5IHtcbiAgICAgIG5ldyBIaWpyaURhdGUoeWVhciwgbW9udGgsIDMwKTtcbiAgICAgIHJldHVybiAzMDtcbiAgICB9IGNhdGNoIHtcbiAgICAgIHJldHVybiAyOTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGlzU2FtZURheShkYXRlMTogRGF0ZSwgZGF0ZTI6IERhdGUpOiBib29sZWFuIHtcbiAgICByZXR1cm4gZGF0ZTEuZ2V0RnVsbFllYXIoKSA9PT0gZGF0ZTIuZ2V0RnVsbFllYXIoKSAmJlxuICAgICAgICAgICBkYXRlMS5nZXRNb250aCgpID09PSBkYXRlMi5nZXRNb250aCgpICYmXG4gICAgICAgICAgIGRhdGUxLmdldERhdGUoKSA9PT0gZGF0ZTIuZ2V0RGF0ZSgpO1xuICB9XG5cbiAgcHJpdmF0ZSBpc0RhdGVEaXNhYmxlZChkYXRlOiBEYXRlKTogYm9vbGVhbiB7XG4gICAgLy8gQ2hlY2sgbWluRGF0ZSBjb25zdHJhaW50XG4gICAgaWYgKHRoaXMubWluRGF0ZSkge1xuICAgICAgY29uc3QgbWluRGF0ZU9ubHkgPSBuZXcgRGF0ZSh0aGlzLm1pbkRhdGUpO1xuICAgICAgbWluRGF0ZU9ubHkuc2V0SG91cnMoMCwgMCwgMCwgMCk7XG4gICAgICBjb25zdCBjaGVja0RhdGUgPSBuZXcgRGF0ZShkYXRlKTtcbiAgICAgIGNoZWNrRGF0ZS5zZXRIb3VycygwLCAwLCAwLCAwKTtcbiAgICAgIGlmIChjaGVja0RhdGUgPCBtaW5EYXRlT25seSkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBDaGVjayBtYXhEYXRlIGNvbnN0cmFpbnRcbiAgICBpZiAodGhpcy5tYXhEYXRlKSB7XG4gICAgICBjb25zdCBtYXhEYXRlT25seSA9IG5ldyBEYXRlKHRoaXMubWF4RGF0ZSk7XG4gICAgICBtYXhEYXRlT25seS5zZXRIb3VycygyMywgNTksIDU5LCA5OTkpO1xuICAgICAgY29uc3QgY2hlY2tEYXRlID0gbmV3IERhdGUoZGF0ZSk7XG4gICAgICBjaGVja0RhdGUuc2V0SG91cnMoMCwgMCwgMCwgMCk7XG4gICAgICBpZiAoY2hlY2tEYXRlID4gbWF4RGF0ZU9ubHkpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gQ2hlY2sgZnV0dXJlVmFsaWRhdGlvbiBjb25zdHJhaW50XG4gICAgaWYgKHRoaXMuZnV0dXJlVmFsaWRhdGlvbikge1xuICAgICAgY29uc3QgbWF4RGF0ZSA9IG5ldyBEYXRlKCk7XG4gICAgICBtYXhEYXRlLnNldEZ1bGxZZWFyKG1heERhdGUuZ2V0RnVsbFllYXIoKSArIHRoaXMuZnV0dXJlWWVhcnNMaW1pdCk7XG4gICAgICByZXR1cm4gZGF0ZSA+IG1heERhdGU7XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHByaXZhdGUgaXNEYXRlU2VsZWN0ZWQoZGF0ZTogRGF0ZSk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLnNlbGVjdGVkRGF0ZXMuc29tZShzZWxlY3RlZCA9PiBcbiAgICAgIHRoaXMuaXNTYW1lRGF5KHNlbGVjdGVkLmdyZWdvcmlhbiwgZGF0ZSlcbiAgICApO1xuICB9XG5cbiAgb25EYXlDbGljayhkYXlJbmZvOiBhbnkpOiB2b2lkIHtcbiAgICBpZiAoZGF5SW5mby5kaXNhYmxlZCB8fCBkYXlJbmZvLmlzRGlzYWJsZWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBzZWxlY3RlZERhdGUgPSB0aGlzLmNyZWF0ZVNlbGVjdGVkRGF0ZShkYXlJbmZvLmRhdGUpO1xuXG4gICAgaWYgKHRoaXMubXVsdGlwbGUpIHtcbiAgICAgIGNvbnN0IGluZGV4ID0gdGhpcy5zZWxlY3RlZERhdGVzLmZpbmRJbmRleChkID0+IFxuICAgICAgICB0aGlzLmlzU2FtZURheShkLmdyZWdvcmlhbiwgZGF5SW5mby5kYXRlKVxuICAgICAgKTtcbiAgICAgIFxuICAgICAgaWYgKGluZGV4ID4gLTEpIHtcbiAgICAgICAgdGhpcy5zZWxlY3RlZERhdGVzLnNwbGljZShpbmRleCwgMSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLnNlbGVjdGVkRGF0ZXMucHVzaChzZWxlY3RlZERhdGUpO1xuICAgICAgfVxuXG4gICAgICBpZiAoIXRoaXMuc2hvd0NvbmZpcm1CdXR0b24pIHtcbiAgICAgICAgdGhpcy5kYXRlU2VsZWN0ZWQuZW1pdChbLi4udGhpcy5zZWxlY3RlZERhdGVzXSk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuc2VsZWN0ZWREYXRlcyA9IFtzZWxlY3RlZERhdGVdO1xuICAgICAgXG4gICAgICBpZiAoIXRoaXMuc2hvd0NvbmZpcm1CdXR0b24pIHtcbiAgICAgICAgdGhpcy5kYXRlU2VsZWN0ZWQuZW1pdChzZWxlY3RlZERhdGUpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHRoaXMuZ2VuZXJhdGVDYWxlbmRhcigpO1xuICB9XG5cbiAgcHJpdmF0ZSBjcmVhdGVTZWxlY3RlZERhdGUoZGF0ZTogRGF0ZSk6IFNlbGVjdGVkRGF0ZSB7XG4gICAgY29uc3QgaGlqcmlEYXRlID0gdG9IaWpyaShkYXRlKTtcbiAgICBcbiAgICAvLyBJZiB0aW1lIGlzIGVuYWJsZWQsIHNldCB0aGUgdGltZSBvbiB0aGUgZGF0ZSBvYmplY3RcbiAgICBpZiAodGhpcy5lbmFibGVUaW1lKSB7XG4gICAgICBsZXQgaG91cnMyNCA9IHRoaXMuc2VsZWN0ZWRUaW1lLmhvdXJzO1xuICAgICAgaWYgKHRoaXMudGltZUZvcm1hdCA9PT0gJzEyJykge1xuICAgICAgICBpZiAodGhpcy5pc1BNICYmIHRoaXMuc2VsZWN0ZWRUaW1lLmhvdXJzICE9PSAxMikge1xuICAgICAgICAgIGhvdXJzMjQgPSB0aGlzLnNlbGVjdGVkVGltZS5ob3VycyArIDEyO1xuICAgICAgICB9IGVsc2UgaWYgKCF0aGlzLmlzUE0gJiYgdGhpcy5zZWxlY3RlZFRpbWUuaG91cnMgPT09IDEyKSB7XG4gICAgICAgICAgaG91cnMyNCA9IDA7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGRhdGUuc2V0SG91cnMoaG91cnMyNCwgdGhpcy5zZWxlY3RlZFRpbWUubWludXRlcywgdGhpcy5zZWxlY3RlZFRpbWUuc2Vjb25kcyk7XG4gICAgfVxuICAgIFxuICAgIHJldHVybiB7XG4gICAgICBncmVnb3JpYW46IGRhdGUsXG4gICAgICBoaWpyaToge1xuICAgICAgICB5ZWFyOiBoaWpyaURhdGUuZ2V0RnVsbFllYXIoKSxcbiAgICAgICAgbW9udGg6IGhpanJpRGF0ZS5nZXRNb250aCgpLFxuICAgICAgICBkYXk6IGhpanJpRGF0ZS5nZXREYXRlKClcbiAgICAgIH0sXG4gICAgICB0aW1lOiB0aGlzLmVuYWJsZVRpbWUgPyB7XG4gICAgICAgIGhvdXJzOiBkYXRlLmdldEhvdXJzKCksXG4gICAgICAgIG1pbnV0ZXM6IGRhdGUuZ2V0TWludXRlcygpLFxuICAgICAgICBzZWNvbmRzOiBkYXRlLmdldFNlY29uZHMoKVxuICAgICAgfSA6IHVuZGVmaW5lZCxcbiAgICAgIGZvcm1hdHRlZDoge1xuICAgICAgICBncmVnb3JpYW46IHRoaXMuZm9ybWF0R3JlZ29yaWFuRGF0ZShkYXRlKSxcbiAgICAgICAgaGlqcmk6IHRoaXMuZm9ybWF0SGlqcmlEYXRlKGhpanJpRGF0ZSksXG4gICAgICAgIHRpbWU6IHRoaXMuZW5hYmxlVGltZSA/IHRoaXMuZm9ybWF0VGltZShkYXRlLmdldEhvdXJzKCksIGRhdGUuZ2V0TWludXRlcygpLCBkYXRlLmdldFNlY29uZHMoKSkgOiB1bmRlZmluZWRcbiAgICAgIH1cbiAgICB9O1xuICB9XG5cbiAgcHJpdmF0ZSBmb3JtYXRHcmVnb3JpYW5EYXRlKGRhdGU6IERhdGUpOiBzdHJpbmcge1xuICAgIGNvbnN0IGRheSA9IGRhdGUuZ2V0RGF0ZSgpO1xuICAgIGNvbnN0IG1vbnRoID0gdGhpcy5sb2NhbGUgPT09ICdhcicgPyBHUkVHT1JJQU5fTU9OVEhTX0FSW2RhdGUuZ2V0TW9udGgoKV0gOiBHUkVHT1JJQU5fTU9OVEhTX0VOW2RhdGUuZ2V0TW9udGgoKV07XG4gICAgY29uc3QgeWVhciA9IGRhdGUuZ2V0RnVsbFllYXIoKTtcbiAgICBcbiAgICByZXR1cm4gdGhpcy5sb2NhbGUgPT09ICdhcicgXG4gICAgICA/IGAke2RheX0gJHttb250aH0gJHt5ZWFyfWBcbiAgICAgIDogYCR7bW9udGh9ICR7ZGF5fSwgJHt5ZWFyfWA7XG4gIH1cblxuICBwcml2YXRlIGZvcm1hdEhpanJpRGF0ZShoaWpyaURhdGU6IEhpanJpRGF0ZSk6IHN0cmluZyB7XG4gICAgY29uc3QgZGF5ID0gaGlqcmlEYXRlLmdldERhdGUoKTtcbiAgICBjb25zdCBtb250aCA9IHRoaXMubG9jYWxlID09PSAnYXInIFxuICAgICAgPyBISUpSSV9NT05USFNfQVJbaGlqcmlEYXRlLmdldE1vbnRoKCldIFxuICAgICAgOiBISUpSSV9NT05USFNfRU5baGlqcmlEYXRlLmdldE1vbnRoKCldO1xuICAgIGNvbnN0IHllYXIgPSBoaWpyaURhdGUuZ2V0RnVsbFllYXIoKTtcbiAgICBcbiAgICByZXR1cm4gdGhpcy5sb2NhbGUgPT09ICdhcicgXG4gICAgICA/IGAke2RheX0gJHttb250aH0gJHt5ZWFyfSDZh9mAYFxuICAgICAgOiBgJHtkYXl9ICR7bW9udGh9ICR7eWVhcn0gQUhgO1xuICB9XG5cbiAgb25ZZWFyQ2hhbmdlKGV2ZW50OiBFdmVudCk6IHZvaWQge1xuICAgIGNvbnN0IHllYXIgPSBwYXJzZUludCgoZXZlbnQudGFyZ2V0IGFzIEhUTUxTZWxlY3RFbGVtZW50KS52YWx1ZSk7XG4gICAgXG4gICAgaWYgKHRoaXMubW9kZSA9PT0gJ2hpanJpJykge1xuICAgICAgdGhpcy5jdXJyZW50SGlqcmlZZWFyID0geWVhcjtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5jdXJyZW50WWVhciA9IHllYXI7XG4gICAgfVxuICAgIFxuICAgIHRoaXMuZ2VuZXJhdGVDYWxlbmRhcigpO1xuICB9XG5cbiAgb25Nb250aENoYW5nZShldmVudDogRXZlbnQpOiB2b2lkIHtcbiAgICBjb25zdCBtb250aCA9IHBhcnNlSW50KChldmVudC50YXJnZXQgYXMgSFRNTFNlbGVjdEVsZW1lbnQpLnZhbHVlKTtcbiAgICBcbiAgICBpZiAodGhpcy5tb2RlID09PSAnaGlqcmknKSB7XG4gICAgICB0aGlzLmN1cnJlbnRIaWpyaU1vbnRoID0gbW9udGg7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuY3VycmVudE1vbnRoID0gbW9udGg7XG4gICAgfVxuICAgIFxuICAgIHRoaXMuZ2VuZXJhdGVDYWxlbmRhcigpO1xuICB9XG5cbiAgcHJldmlvdXNNb250aCgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5tb2RlID09PSAnaGlqcmknKSB7XG4gICAgICBpZiAodGhpcy5jdXJyZW50SGlqcmlNb250aCA9PT0gMCkge1xuICAgICAgICB0aGlzLmN1cnJlbnRIaWpyaU1vbnRoID0gMTE7XG4gICAgICAgIHRoaXMuY3VycmVudEhpanJpWWVhci0tO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5jdXJyZW50SGlqcmlNb250aC0tO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBpZiAodGhpcy5jdXJyZW50TW9udGggPT09IDApIHtcbiAgICAgICAgdGhpcy5jdXJyZW50TW9udGggPSAxMTtcbiAgICAgICAgdGhpcy5jdXJyZW50WWVhci0tO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5jdXJyZW50TW9udGgtLTtcbiAgICAgIH1cbiAgICB9XG4gICAgXG4gICAgdGhpcy5nZW5lcmF0ZUNhbGVuZGFyKCk7XG4gIH1cblxuICBuZXh0TW9udGgoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMubW9kZSA9PT0gJ2hpanJpJykge1xuICAgICAgaWYgKHRoaXMuY3VycmVudEhpanJpTW9udGggPT09IDExKSB7XG4gICAgICAgIHRoaXMuY3VycmVudEhpanJpTW9udGggPSAwO1xuICAgICAgICB0aGlzLmN1cnJlbnRIaWpyaVllYXIrKztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuY3VycmVudEhpanJpTW9udGgrKztcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKHRoaXMuY3VycmVudE1vbnRoID09PSAxMSkge1xuICAgICAgICB0aGlzLmN1cnJlbnRNb250aCA9IDA7XG4gICAgICAgIHRoaXMuY3VycmVudFllYXIrKztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuY3VycmVudE1vbnRoKys7XG4gICAgICB9XG4gICAgfVxuICAgIFxuICAgIHRoaXMuZ2VuZXJhdGVDYWxlbmRhcigpO1xuICB9XG5cbiAgdG9nZ2xlTW9kZSgpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuY2FuQ2hhbmdlTW9kZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMubW9kZSA9IHRoaXMubW9kZSA9PT0gJ2dyZWcnID8gJ2hpanJpJyA6ICdncmVnJztcbiAgICB0aGlzLnVwZGF0ZUxvY2FsZURhdGEoKTtcbiAgICB0aGlzLmdlbmVyYXRlWWVhcnMoKTtcbiAgICB0aGlzLmdlbmVyYXRlQ2FsZW5kYXIoKTtcbiAgICB0aGlzLm1vZGVDaGFuZ2VkLmVtaXQodGhpcy5tb2RlKTtcbiAgfVxuXG4gIHNlbGVjdFRvZGF5KCk6IHZvaWQge1xuICAgIGNvbnN0IHRvZGF5ID0gbmV3IERhdGUoKTtcbiAgICB0aGlzLm9uRGF5Q2xpY2soeyBkYXRlOiB0b2RheSwgZGlzYWJsZWQ6IGZhbHNlLCBpc0Rpc2FibGVkOiBmYWxzZSB9KTtcbiAgfVxuXG4gIG9uU3VibWl0KCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmlzUmVxdWlyZWQgJiYgdGhpcy5zZWxlY3RlZERhdGVzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmICh0aGlzLm11bHRpcGxlKSB7XG4gICAgICB0aGlzLmRhdGVTZWxlY3RlZC5lbWl0KFsuLi50aGlzLnNlbGVjdGVkRGF0ZXNdKTtcbiAgICB9IGVsc2UgaWYgKHRoaXMuc2VsZWN0ZWREYXRlcy5sZW5ndGggPiAwKSB7XG4gICAgICB0aGlzLmRhdGVTZWxlY3RlZC5lbWl0KHRoaXMuc2VsZWN0ZWREYXRlc1swXSk7XG4gICAgfVxuICB9XG5cbiAgLy8gVGltZSBoYW5kbGluZyBtZXRob2RzXG4gIGluY3JlbWVudFRpbWUodHlwZTogJ2hvdXJzJyB8ICdtaW51dGVzJyB8ICdzZWNvbmRzJyk6IHZvaWQge1xuICAgIGlmICh0eXBlID09PSAnaG91cnMnKSB7XG4gICAgICBjb25zdCBtYXggPSB0aGlzLnRpbWVGb3JtYXQgPT09ICcxMicgPyAxMiA6IDIzO1xuICAgICAgdGhpcy5zZWxlY3RlZFRpbWUuaG91cnMgPSAodGhpcy5zZWxlY3RlZFRpbWUuaG91cnMgKyAxKSA+IG1heCA/ICh0aGlzLnRpbWVGb3JtYXQgPT09ICcxMicgPyAxIDogMCkgOiB0aGlzLnNlbGVjdGVkVGltZS5ob3VycyArIDE7XG4gICAgfSBlbHNlIGlmICh0eXBlID09PSAnbWludXRlcycpIHtcbiAgICAgIHRoaXMuc2VsZWN0ZWRUaW1lLm1pbnV0ZXMgPSAodGhpcy5zZWxlY3RlZFRpbWUubWludXRlcyArIHRoaXMubWludXRlU3RlcCkgPiA1OSA/IDAgOiB0aGlzLnNlbGVjdGVkVGltZS5taW51dGVzICsgdGhpcy5taW51dGVTdGVwO1xuICAgIH0gZWxzZSBpZiAodHlwZSA9PT0gJ3NlY29uZHMnKSB7XG4gICAgICB0aGlzLnNlbGVjdGVkVGltZS5zZWNvbmRzID0gKHRoaXMuc2VsZWN0ZWRUaW1lLnNlY29uZHMgKyAxKSA+IDU5ID8gMCA6IHRoaXMuc2VsZWN0ZWRUaW1lLnNlY29uZHMgKyAxO1xuICAgIH1cbiAgICB0aGlzLnVwZGF0ZVNlbGVjdGVkRGF0ZVRpbWUoKTtcbiAgfVxuXG4gIGRlY3JlbWVudFRpbWUodHlwZTogJ2hvdXJzJyB8ICdtaW51dGVzJyB8ICdzZWNvbmRzJyk6IHZvaWQge1xuICAgIGlmICh0eXBlID09PSAnaG91cnMnKSB7XG4gICAgICBjb25zdCBtaW4gPSB0aGlzLnRpbWVGb3JtYXQgPT09ICcxMicgPyAxIDogMDtcbiAgICAgIGNvbnN0IG1heCA9IHRoaXMudGltZUZvcm1hdCA9PT0gJzEyJyA/IDEyIDogMjM7XG4gICAgICB0aGlzLnNlbGVjdGVkVGltZS5ob3VycyA9ICh0aGlzLnNlbGVjdGVkVGltZS5ob3VycyAtIDEpIDwgbWluID8gbWF4IDogdGhpcy5zZWxlY3RlZFRpbWUuaG91cnMgLSAxO1xuICAgIH0gZWxzZSBpZiAodHlwZSA9PT0gJ21pbnV0ZXMnKSB7XG4gICAgICB0aGlzLnNlbGVjdGVkVGltZS5taW51dGVzID0gKHRoaXMuc2VsZWN0ZWRUaW1lLm1pbnV0ZXMgLSB0aGlzLm1pbnV0ZVN0ZXApIDwgMCA/IDU5IDogdGhpcy5zZWxlY3RlZFRpbWUubWludXRlcyAtIHRoaXMubWludXRlU3RlcDtcbiAgICB9IGVsc2UgaWYgKHR5cGUgPT09ICdzZWNvbmRzJykge1xuICAgICAgdGhpcy5zZWxlY3RlZFRpbWUuc2Vjb25kcyA9ICh0aGlzLnNlbGVjdGVkVGltZS5zZWNvbmRzIC0gMSkgPCAwID8gNTkgOiB0aGlzLnNlbGVjdGVkVGltZS5zZWNvbmRzIC0gMTtcbiAgICB9XG4gICAgdGhpcy51cGRhdGVTZWxlY3RlZERhdGVUaW1lKCk7XG4gIH1cblxuICBvblRpbWVDaGFuZ2UodHlwZTogJ2hvdXJzJyB8ICdtaW51dGVzJyB8ICdzZWNvbmRzJywgZXZlbnQ6IGFueSk6IHZvaWQge1xuICAgIGNvbnN0IHZhbHVlID0gcGFyc2VJbnQoZXZlbnQudGFyZ2V0LnZhbHVlKSB8fCAwO1xuICAgIFxuICAgIGlmICh0eXBlID09PSAnaG91cnMnKSB7XG4gICAgICBjb25zdCBtaW4gPSB0aGlzLnRpbWVGb3JtYXQgPT09ICcxMicgPyAxIDogMDtcbiAgICAgIGNvbnN0IG1heCA9IHRoaXMudGltZUZvcm1hdCA9PT0gJzEyJyA/IDEyIDogMjM7XG4gICAgICB0aGlzLnNlbGVjdGVkVGltZS5ob3VycyA9IE1hdGgubWF4KG1pbiwgTWF0aC5taW4obWF4LCB2YWx1ZSkpO1xuICAgIH0gZWxzZSBpZiAodHlwZSA9PT0gJ21pbnV0ZXMnKSB7XG4gICAgICB0aGlzLnNlbGVjdGVkVGltZS5taW51dGVzID0gTWF0aC5tYXgoMCwgTWF0aC5taW4oNTksIHZhbHVlKSk7XG4gICAgfSBlbHNlIGlmICh0eXBlID09PSAnc2Vjb25kcycpIHtcbiAgICAgIHRoaXMuc2VsZWN0ZWRUaW1lLnNlY29uZHMgPSBNYXRoLm1heCgwLCBNYXRoLm1pbig1OSwgdmFsdWUpKTtcbiAgICB9XG4gICAgXG4gICAgdGhpcy51cGRhdGVTZWxlY3RlZERhdGVUaW1lKCk7XG4gIH1cblxuICBzZXRBTVBNKHBtOiBib29sZWFuKTogdm9pZCB7XG4gICAgdGhpcy5pc1BNID0gcG07XG4gICAgdGhpcy51cGRhdGVTZWxlY3RlZERhdGVUaW1lKCk7XG4gIH1cblxuICBwcml2YXRlIGZvcm1hdFRpbWUoaG91cnM6IG51bWJlciwgbWludXRlczogbnVtYmVyLCBzZWNvbmRzOiBudW1iZXIpOiBzdHJpbmcge1xuICAgIGlmICh0aGlzLnRpbWVGb3JtYXQgPT09ICcxMicpIHtcbiAgICAgIGNvbnN0IGRpc3BsYXlIb3VycyA9IGhvdXJzICUgMTIgfHwgMTI7XG4gICAgICBjb25zdCBhbXBtID0gaG91cnMgPj0gMTIgPyAnUE0nIDogJ0FNJztcbiAgICAgIGNvbnN0IG1pbnV0ZXNTdHIgPSBtaW51dGVzLnRvU3RyaW5nKCkucGFkU3RhcnQoMiwgJzAnKTtcbiAgICAgIFxuICAgICAgaWYgKHRoaXMuZW5hYmxlU2Vjb25kcykge1xuICAgICAgICBjb25zdCBzZWNvbmRzU3RyID0gc2Vjb25kcy50b1N0cmluZygpLnBhZFN0YXJ0KDIsICcwJyk7XG4gICAgICAgIHJldHVybiBgJHtkaXNwbGF5SG91cnN9OiR7bWludXRlc1N0cn06JHtzZWNvbmRzU3RyfSAke2FtcG19YDtcbiAgICAgIH1cbiAgICAgIHJldHVybiBgJHtkaXNwbGF5SG91cnN9OiR7bWludXRlc1N0cn0gJHthbXBtfWA7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IGhvdXJzU3RyID0gaG91cnMudG9TdHJpbmcoKS5wYWRTdGFydCgyLCAnMCcpO1xuICAgICAgY29uc3QgbWludXRlc1N0ciA9IG1pbnV0ZXMudG9TdHJpbmcoKS5wYWRTdGFydCgyLCAnMCcpO1xuICAgICAgXG4gICAgICBpZiAodGhpcy5lbmFibGVTZWNvbmRzKSB7XG4gICAgICAgIGNvbnN0IHNlY29uZHNTdHIgPSBzZWNvbmRzLnRvU3RyaW5nKCkucGFkU3RhcnQoMiwgJzAnKTtcbiAgICAgICAgcmV0dXJuIGAke2hvdXJzU3RyfToke21pbnV0ZXNTdHJ9OiR7c2Vjb25kc1N0cn1gO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGAke2hvdXJzU3RyfToke21pbnV0ZXNTdHJ9YDtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHVwZGF0ZVNlbGVjdGVkRGF0ZVRpbWUoKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLmVuYWJsZVRpbWUgfHwgdGhpcy5zZWxlY3RlZERhdGVzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIENvbnZlcnQgMTItaG91ciB0byAyNC1ob3VyIGlmIG5lZWRlZFxuICAgIGxldCBob3VyczI0ID0gdGhpcy5zZWxlY3RlZFRpbWUuaG91cnM7XG4gICAgaWYgKHRoaXMudGltZUZvcm1hdCA9PT0gJzEyJykge1xuICAgICAgaWYgKHRoaXMuaXNQTSAmJiB0aGlzLnNlbGVjdGVkVGltZS5ob3VycyAhPT0gMTIpIHtcbiAgICAgICAgaG91cnMyNCA9IHRoaXMuc2VsZWN0ZWRUaW1lLmhvdXJzICsgMTI7XG4gICAgICB9IGVsc2UgaWYgKCF0aGlzLmlzUE0gJiYgdGhpcy5zZWxlY3RlZFRpbWUuaG91cnMgPT09IDEyKSB7XG4gICAgICAgIGhvdXJzMjQgPSAwO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIFVwZGF0ZSBhbGwgc2VsZWN0ZWQgZGF0ZXMgd2l0aCBuZXcgdGltZVxuICAgIHRoaXMuc2VsZWN0ZWREYXRlcyA9IHRoaXMuc2VsZWN0ZWREYXRlcy5tYXAoc2VsZWN0ZWREYXRlID0+IHtcbiAgICAgIGNvbnN0IG5ld0RhdGUgPSBuZXcgRGF0ZShzZWxlY3RlZERhdGUuZ3JlZ29yaWFuKTtcbiAgICAgIG5ld0RhdGUuc2V0SG91cnMoaG91cnMyNCwgdGhpcy5zZWxlY3RlZFRpbWUubWludXRlcywgdGhpcy5zZWxlY3RlZFRpbWUuc2Vjb25kcyk7XG4gICAgICBcbiAgICAgIHJldHVybiB7XG4gICAgICAgIC4uLnNlbGVjdGVkRGF0ZSxcbiAgICAgICAgZ3JlZ29yaWFuOiBuZXdEYXRlLFxuICAgICAgICB0aW1lOiB7XG4gICAgICAgICAgaG91cnM6IGhvdXJzMjQsXG4gICAgICAgICAgbWludXRlczogdGhpcy5zZWxlY3RlZFRpbWUubWludXRlcyxcbiAgICAgICAgICBzZWNvbmRzOiB0aGlzLnNlbGVjdGVkVGltZS5zZWNvbmRzXG4gICAgICAgIH0sXG4gICAgICAgIGZvcm1hdHRlZDoge1xuICAgICAgICAgIC4uLnNlbGVjdGVkRGF0ZS5mb3JtYXR0ZWQsXG4gICAgICAgICAgdGltZTogdGhpcy5mb3JtYXRUaW1lKGhvdXJzMjQsIHRoaXMuc2VsZWN0ZWRUaW1lLm1pbnV0ZXMsIHRoaXMuc2VsZWN0ZWRUaW1lLnNlY29uZHMpXG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgfSk7XG4gIH1cblxuICBnZXRDdXN0b21TdHlsZXMoKTogYW55IHtcbiAgICByZXR1cm4ge1xuICAgICAgJy0tcHJpbWFyeS1jb2xvcic6IHRoaXMuc3R5bGVzLnByaW1hcnlDb2xvciB8fCAnIzRmNDZlNScsXG4gICAgICAnLS1zZWNvbmRhcnktY29sb3InOiB0aGlzLnN0eWxlcy5zZWNvbmRhcnlDb2xvciB8fCAnIzgxOGNmOCcsXG4gICAgICAnLS1iYWNrZ3JvdW5kLWNvbG9yJzogdGhpcy5zdHlsZXMuYmFja2dyb3VuZENvbG9yIHx8ICcjZmZmZmZmJyxcbiAgICAgICctLXRleHQtY29sb3InOiB0aGlzLnN0eWxlcy50ZXh0Q29sb3IgfHwgJyMxZjI5MzcnLFxuICAgICAgJy0tc2VsZWN0ZWQtZGF0ZS1jb2xvcic6IHRoaXMuc3R5bGVzLnNlbGVjdGVkRGF0ZUNvbG9yIHx8ICcjZmZmZmZmJyxcbiAgICAgICctLXNlbGVjdGVkLWRhdGUtYmFja2dyb3VuZCc6IHRoaXMuc3R5bGVzLnNlbGVjdGVkRGF0ZUJhY2tncm91bmQgfHwgJyM0ZjQ2ZTUnLFxuICAgICAgJy0tdG9kYXktY29sb3InOiB0aGlzLnN0eWxlcy50b2RheUNvbG9yIHx8ICcjMTBiOTgxJyxcbiAgICAgICctLWRpc2FibGVkLWNvbG9yJzogdGhpcy5zdHlsZXMuZGlzYWJsZWRDb2xvciB8fCAnI2QxZDVkYicsXG4gICAgICAnLS1ib3JkZXItY29sb3InOiB0aGlzLnN0eWxlcy5ib3JkZXJDb2xvciB8fCAnI2U1ZTdlYicsXG4gICAgICAnLS1ob3Zlci1jb2xvcic6IHRoaXMuc3R5bGVzLmhvdmVyQ29sb3IgfHwgJyNmM2Y0ZjYnLFxuICAgICAgJy0tZm9udC1mYW1pbHknOiB0aGlzLnN0eWxlcy5mb250RmFtaWx5IHx8ICdzeXN0ZW0tdWksIC1hcHBsZS1zeXN0ZW0sIHNhbnMtc2VyaWYnLFxuICAgICAgJy0tZm9udC1zaXplJzogdGhpcy5zdHlsZXMuZm9udFNpemUgfHwgJzE0cHgnLFxuICAgICAgJy0tYm9yZGVyLXJhZGl1cyc6IHRoaXMuc3R5bGVzLmJvcmRlclJhZGl1cyB8fCAnOHB4J1xuICAgIH07XG4gIH1cbn1cblxuLy8gUmUtZXhwb3J0IHR5cGVzIGZvciBleHRlcm5hbCB1c2VcbmV4cG9ydCB0eXBlIHsgU2VsZWN0ZWREYXRlLCBEYXRlUGlja2VyU3R5bGVzLCBEYXRlTW9kZSwgRGlyZWN0aW9uLCBMb2NhbGUgfTtcbiIsIjxkaXYgY2xhc3M9XCJoaWpyaS1kYXRlLXBpY2tlclwiIFtkaXJdPVwiZGlyXCIgW3N0eWxlXT1cImdldEN1c3RvbVN0eWxlcygpXCI+XG4gIDwhLS0gSGVhZGVyIFNlY3Rpb24gLS0+XG4gIDxkaXYgY2xhc3M9XCJwaWNrZXItaGVhZGVyXCI+XG4gICAgPCEtLSBNb2RlIFRvZ2dsZSBCdXR0b24gLS0+XG4gICAgPGJ1dHRvbiBcbiAgICAgICpuZ0lmPVwiY2FuQ2hhbmdlTW9kZVwiIFxuICAgICAgY2xhc3M9XCJtb2RlLXRvZ2dsZS1idG5cIlxuICAgICAgKGNsaWNrKT1cInRvZ2dsZU1vZGUoKVwiXG4gICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cIm1vZGUgPT09ICdncmVnJyA/ICdTd2l0Y2ggdG8gSGlqcmknIDogJ1N3aXRjaCB0byBHcmVnb3JpYW4nXCI+XG4gICAgICB7eyBtb2RlID09PSAnZ3JlZycgPyAobG9jYWxlID09PSAnYXInID8gJ9iq2YLZiNmK2YUg2YfYrNix2YonIDogJ0hpanJpJykgOiAobG9jYWxlID09PSAnYXInID8gJ9iq2YLZiNmK2YUg2YXZitmE2KfYr9mKJyA6ICdHcmVnb3JpYW4nKSB9fVxuICAgIDwvYnV0dG9uPlxuXG4gICAgPCEtLSBUb2RheSdzIERhdGUgU2VjdGlvbiAtLT5cbiAgICA8ZGl2ICpuZ0lmPVwidG9kYXlzRGF0ZVNlY3Rpb25cIiBjbGFzcz1cInRvZGF5cy1kYXRlXCI+XG4gICAgICA8YnV0dG9uIGNsYXNzPVwidG9kYXktYnRuXCIgKGNsaWNrKT1cInNlbGVjdFRvZGF5KClcIj5cbiAgICAgICAge3sgdG9kYXlzRGF0ZVRleHQgfX1cbiAgICAgIDwvYnV0dG9uPlxuICAgIDwvZGl2PlxuICA8L2Rpdj5cblxuICA8IS0tIENhbGVuZGFyIENvbnRyb2xzIC0tPlxuICA8ZGl2IGNsYXNzPVwiY2FsZW5kYXItY29udHJvbHNcIj5cbiAgICA8IS0tIFllYXIgUGlja2VyIC0tPlxuICAgIDxkaXYgY2xhc3M9XCJjb250cm9sLWdyb3VwXCIgKm5nSWY9XCIhZGlzYWJsZVllYXJQaWNrZXJcIj5cbiAgICAgIDxsYWJlbCBbYXR0ci5mb3JdPVwiJ3llYXItc2VsZWN0J1wiPnt7IHllYXJTZWxlY3RMYWJlbCB9fTwvbGFiZWw+XG4gICAgICA8c2VsZWN0IFxuICAgICAgICBpZD1cInllYXItc2VsZWN0XCJcbiAgICAgICAgW3ZhbHVlXT1cIm1vZGUgPT09ICdoaWpyaScgPyBjdXJyZW50SGlqcmlZZWFyIDogY3VycmVudFllYXJcIlxuICAgICAgICAoY2hhbmdlKT1cIm9uWWVhckNoYW5nZSgkZXZlbnQpXCJcbiAgICAgICAgY2xhc3M9XCJ5ZWFyLXNlbGVjdFwiPlxuICAgICAgICA8b3B0aW9uICpuZ0Zvcj1cImxldCB5ZWFyIG9mIHllYXJzXCIgW3ZhbHVlXT1cInllYXJcIj57eyB5ZWFyIH19PC9vcHRpb24+XG4gICAgICA8L3NlbGVjdD5cbiAgICA8L2Rpdj5cblxuICAgIDwhLS0gTW9udGggUGlja2VyIC0tPlxuICAgIDxkaXYgY2xhc3M9XCJjb250cm9sLWdyb3VwXCIgKm5nSWY9XCIhZGlzYWJsZU1vbnRoUGlja2VyXCI+XG4gICAgICA8bGFiZWwgW2F0dHIuZm9yXT1cIidtb250aC1zZWxlY3QnXCI+e3sgbW9udGhTZWxlY3RMYWJlbCB9fTwvbGFiZWw+XG4gICAgICA8c2VsZWN0IFxuICAgICAgICBpZD1cIm1vbnRoLXNlbGVjdFwiXG4gICAgICAgIFt2YWx1ZV09XCJtb2RlID09PSAnaGlqcmknID8gY3VycmVudEhpanJpTW9udGggOiBjdXJyZW50TW9udGhcIlxuICAgICAgICAoY2hhbmdlKT1cIm9uTW9udGhDaGFuZ2UoJGV2ZW50KVwiXG4gICAgICAgIGNsYXNzPVwibW9udGgtc2VsZWN0XCI+XG4gICAgICAgIDxvcHRpb24gKm5nRm9yPVwibGV0IG1vbnRoIG9mIG1vbnRoczsgbGV0IGkgPSBpbmRleFwiIFt2YWx1ZV09XCJpXCI+XG4gICAgICAgICAge3sgbW9udGggfX1cbiAgICAgICAgPC9vcHRpb24+XG4gICAgICA8L3NlbGVjdD5cbiAgICA8L2Rpdj5cblxuICAgIDwhLS0gTmF2aWdhdGlvbiBCdXR0b25zIC0tPlxuICAgIDxkaXYgY2xhc3M9XCJuYXZpZ2F0aW9uLWJ1dHRvbnNcIj5cbiAgICAgIDxidXR0b24gXG4gICAgICAgIGNsYXNzPVwibmF2LWJ0biBwcmV2LWJ0blwiXG4gICAgICAgIChjbGljayk9XCJwcmV2aW91c01vbnRoKClcIlxuICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cImxvY2FsZSA9PT0gJ2FyJyA/ICfYp9mE2LTZh9ixINin2YTYs9in2KjZgicgOiAnUHJldmlvdXMgTW9udGgnXCI+XG4gICAgICAgIHt7IGRpciA9PT0gJ3J0bCcgPyAn4oaQJyA6ICfihpInIH19XG4gICAgICA8L2J1dHRvbj5cbiAgICAgIDxidXR0b24gXG4gICAgICAgIGNsYXNzPVwibmF2LWJ0biBuZXh0LWJ0blwiXG4gICAgICAgIChjbGljayk9XCJuZXh0TW9udGgoKVwiXG4gICAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwibG9jYWxlID09PSAnYXInID8gJ9in2YTYtNmH2LEg2KfZhNiq2KfZhNmKJyA6ICdOZXh0IE1vbnRoJ1wiPlxuICAgICAgICB7eyBkaXIgPT09ICdydGwnID8gJ+KGkicgOiAn4oaQJyB9fVxuICAgICAgPC9idXR0b24+XG4gICAgPC9kaXY+XG4gIDwvZGl2PlxuXG4gIDwhLS0gQ2FsZW5kYXIgR3JpZCAtLT5cbiAgPGRpdiBjbGFzcz1cImNhbGVuZGFyLWdyaWRcIiAqbmdJZj1cIiFkaXNhYmxlRGF5UGlja2VyXCI+XG4gICAgPCEtLSBXZWVrZGF5IEhlYWRlcnMgLS0+XG4gICAgPGRpdiBjbGFzcz1cIndlZWtkYXktaGVhZGVyXCI+XG4gICAgICA8ZGl2IGNsYXNzPVwid2Vla2RheVwiICpuZ0Zvcj1cImxldCB3ZWVrZGF5IG9mIHdlZWtkYXlzXCI+XG4gICAgICAgIHt7IHdlZWtkYXkgfX1cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuXG4gICAgPCEtLSBDYWxlbmRhciBEYXlzIC0tPlxuICAgIDxkaXYgY2xhc3M9XCJjYWxlbmRhci1kYXlzXCI+XG4gICAgICA8ZGl2IFxuICAgICAgICAqbmdGb3I9XCJsZXQgZGF5SW5mbyBvZiBjYWxlbmRhckRheXNcIlxuICAgICAgICBjbGFzcz1cImRheS1jZWxsXCJcbiAgICAgICAgW2NsYXNzLmVtcHR5XT1cImRheUluZm8uZGF5ID09PSBudWxsXCJcbiAgICAgICAgW2NsYXNzLnRvZGF5XT1cIm1hcmtUb2RheSAmJiBkYXlJbmZvLmlzVG9kYXlcIlxuICAgICAgICBbY2xhc3Muc2VsZWN0ZWRdPVwiZGF5SW5mby5pc1NlbGVjdGVkXCJcbiAgICAgICAgW2NsYXNzLmRpc2FibGVkXT1cImRheUluZm8uaXNEaXNhYmxlZFwiXG4gICAgICAgIChjbGljayk9XCJvbkRheUNsaWNrKGRheUluZm8pXCI+XG4gICAgICAgIDxzcGFuICpuZ0lmPVwiZGF5SW5mby5kYXkgIT09IG51bGxcIj57eyBkYXlJbmZvLmRheSB9fTwvc3Bhbj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICA8L2Rpdj5cblxuICA8IS0tIFRpbWUgUGlja2VyIFNlY3Rpb24gLS0+XG4gIDxkaXYgY2xhc3M9XCJ0aW1lLXBpY2tlclwiICpuZ0lmPVwiZW5hYmxlVGltZVwiPlxuICAgIDxkaXYgY2xhc3M9XCJ0aW1lLXBpY2tlci1sYWJlbFwiPlxuICAgICAge3sgbG9jYWxlID09PSAnYXInID8gJ9in2YTZiNmC2KonIDogJ1RpbWUnIH19XG4gICAgPC9kaXY+XG4gICAgXG4gICAgPGRpdiBjbGFzcz1cInRpbWUtaW5wdXRzXCI+XG4gICAgICA8IS0tIEhvdXJzIElucHV0IC0tPlxuICAgICAgPGRpdiBjbGFzcz1cInRpbWUtaW5wdXQtZ3JvdXBcIj5cbiAgICAgICAgPGJ1dHRvbiBjbGFzcz1cInRpbWUtYnRuXCIgKGNsaWNrKT1cImluY3JlbWVudFRpbWUoJ2hvdXJzJylcIj7ilrI8L2J1dHRvbj5cbiAgICAgICAgPGlucHV0IFxuICAgICAgICAgIHR5cGU9XCJudW1iZXJcIiBcbiAgICAgICAgICBjbGFzcz1cInRpbWUtaW5wdXRcIlxuICAgICAgICAgIFt2YWx1ZV09XCJ0aW1lRm9ybWF0ID09PSAnMTInID8gKHNlbGVjdGVkVGltZS5ob3VycyAlIDEyIHx8IDEyKSA6IHNlbGVjdGVkVGltZS5ob3Vyc1wiXG4gICAgICAgICAgKGlucHV0KT1cIm9uVGltZUNoYW5nZSgnaG91cnMnLCAkZXZlbnQpXCJcbiAgICAgICAgICBbbWluXT1cInRpbWVGb3JtYXQgPT09ICcxMicgPyAxIDogMFwiXG4gICAgICAgICAgW21heF09XCJ0aW1lRm9ybWF0ID09PSAnMTInID8gMTIgOiAyM1wiXG4gICAgICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCJsb2NhbGUgPT09ICdhcicgPyAn2KfZhNiz2KfYudin2KonIDogJ0hvdXJzJ1wiPlxuICAgICAgICA8YnV0dG9uIGNsYXNzPVwidGltZS1idG5cIiAoY2xpY2spPVwiZGVjcmVtZW50VGltZSgnaG91cnMnKVwiPuKWvDwvYnV0dG9uPlxuICAgICAgPC9kaXY+XG4gICAgICBcbiAgICAgIDxzcGFuIGNsYXNzPVwidGltZS1zZXBhcmF0b3JcIj46PC9zcGFuPlxuICAgICAgXG4gICAgICA8IS0tIE1pbnV0ZXMgSW5wdXQgLS0+XG4gICAgICA8ZGl2IGNsYXNzPVwidGltZS1pbnB1dC1ncm91cFwiPlxuICAgICAgICA8YnV0dG9uIGNsYXNzPVwidGltZS1idG5cIiAoY2xpY2spPVwiaW5jcmVtZW50VGltZSgnbWludXRlcycpXCI+4payPC9idXR0b24+XG4gICAgICAgIDxpbnB1dCBcbiAgICAgICAgICB0eXBlPVwibnVtYmVyXCIgXG4gICAgICAgICAgY2xhc3M9XCJ0aW1lLWlucHV0XCJcbiAgICAgICAgICBbdmFsdWVdPVwic2VsZWN0ZWRUaW1lLm1pbnV0ZXNcIlxuICAgICAgICAgIChpbnB1dCk9XCJvblRpbWVDaGFuZ2UoJ21pbnV0ZXMnLCAkZXZlbnQpXCJcbiAgICAgICAgICBbbWluXT1cIjBcIlxuICAgICAgICAgIFttYXhdPVwiNTlcIlxuICAgICAgICAgIFtzdGVwXT1cIm1pbnV0ZVN0ZXBcIlxuICAgICAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwibG9jYWxlID09PSAnYXInID8gJ9in2YTYr9mC2KfYptmCJyA6ICdNaW51dGVzJ1wiPlxuICAgICAgICA8YnV0dG9uIGNsYXNzPVwidGltZS1idG5cIiAoY2xpY2spPVwiZGVjcmVtZW50VGltZSgnbWludXRlcycpXCI+4pa8PC9idXR0b24+XG4gICAgICA8L2Rpdj5cbiAgICAgIFxuICAgICAgPCEtLSBTZWNvbmRzIElucHV0IChPcHRpb25hbCkgLS0+XG4gICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiZW5hYmxlU2Vjb25kc1wiPlxuICAgICAgICA8c3BhbiBjbGFzcz1cInRpbWUtc2VwYXJhdG9yXCI+Ojwvc3Bhbj5cbiAgICAgICAgPGRpdiBjbGFzcz1cInRpbWUtaW5wdXQtZ3JvdXBcIj5cbiAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwidGltZS1idG5cIiAoY2xpY2spPVwiaW5jcmVtZW50VGltZSgnc2Vjb25kcycpXCI+4payPC9idXR0b24+XG4gICAgICAgICAgPGlucHV0IFxuICAgICAgICAgICAgdHlwZT1cIm51bWJlclwiIFxuICAgICAgICAgICAgY2xhc3M9XCJ0aW1lLWlucHV0XCJcbiAgICAgICAgICAgIFt2YWx1ZV09XCJzZWxlY3RlZFRpbWUuc2Vjb25kc1wiXG4gICAgICAgICAgICAoaW5wdXQpPVwib25UaW1lQ2hhbmdlKCdzZWNvbmRzJywgJGV2ZW50KVwiXG4gICAgICAgICAgICBbbWluXT1cIjBcIlxuICAgICAgICAgICAgW21heF09XCI1OVwiXG4gICAgICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cImxvY2FsZSA9PT0gJ2FyJyA/ICfYp9mE2KvZiNin2YbZiicgOiAnU2Vjb25kcydcIj5cbiAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwidGltZS1idG5cIiAoY2xpY2spPVwiZGVjcmVtZW50VGltZSgnc2Vjb25kcycpXCI+4pa8PC9idXR0b24+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICBcbiAgICAgIDwhLS0gQU0vUE0gVG9nZ2xlICgxMi1ob3VyIGZvcm1hdCkgLS0+XG4gICAgICA8ZGl2IGNsYXNzPVwiYW1wbS10b2dnbGVcIiAqbmdJZj1cInRpbWVGb3JtYXQgPT09ICcxMidcIj5cbiAgICAgICAgPGJ1dHRvbiBcbiAgICAgICAgICBjbGFzcz1cImFtcG0tYnRuXCJcbiAgICAgICAgICBbY2xhc3MuYWN0aXZlXT1cIiFpc1BNXCJcbiAgICAgICAgICAoY2xpY2spPVwic2V0QU1QTShmYWxzZSlcIj5cbiAgICAgICAgICBBTVxuICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgPGJ1dHRvbiBcbiAgICAgICAgICBjbGFzcz1cImFtcG0tYnRuXCJcbiAgICAgICAgICBbY2xhc3MuYWN0aXZlXT1cImlzUE1cIlxuICAgICAgICAgIChjbGljayk9XCJzZXRBTVBNKHRydWUpXCI+XG4gICAgICAgICAgUE1cbiAgICAgICAgPC9idXR0b24+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+XG5cbiAgPCEtLSBTZWxlY3RlZCBEYXRlcyBEaXNwbGF5IC0tPlxuICA8ZGl2IGNsYXNzPVwic2VsZWN0ZWQtZGF0ZXNcIiAqbmdJZj1cInNlbGVjdGVkRGF0ZXMubGVuZ3RoID4gMFwiPlxuICAgIDxkaXYgY2xhc3M9XCJzZWxlY3RlZC1sYWJlbFwiPlxuICAgICAge3sgbG9jYWxlID09PSAnYXInID8gJ9in2YTYqtmI2KfYsdmK2K4g2KfZhNmF2K3Yr9iv2Kk6JyA6ICdTZWxlY3RlZCBEYXRlczonIH19XG4gICAgPC9kaXY+XG4gICAgPGRpdiBjbGFzcz1cInNlbGVjdGVkLWxpc3RcIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJzZWxlY3RlZC1pdGVtXCIgKm5nRm9yPVwibGV0IGRhdGUgb2Ygc2VsZWN0ZWREYXRlc1wiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwic2VsZWN0ZWQtZGF0ZS1pbmZvXCI+XG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJkYXRlLXRleHRcIj5cbiAgICAgICAgICAgIHt7IG1vZGUgPT09ICdoaWpyaScgPyBkYXRlLmZvcm1hdHRlZC5oaWpyaSA6IGRhdGUuZm9ybWF0dGVkLmdyZWdvcmlhbiB9fVxuICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICA8c3BhbiBjbGFzcz1cInRpbWUtdGV4dFwiICpuZ0lmPVwiZW5hYmxlVGltZSAmJiBkYXRlLmZvcm1hdHRlZC50aW1lXCI+XG4gICAgICAgICAgICB7eyBkYXRlLmZvcm1hdHRlZC50aW1lIH19XG4gICAgICAgICAgPC9zcGFuPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICA8L2Rpdj5cblxuICA8IS0tIFN1Ym1pdCBCdXR0b24gLS0+XG4gIDxkaXYgY2xhc3M9XCJwaWNrZXItZm9vdGVyXCIgKm5nSWY9XCJzaG93Q29uZmlybUJ1dHRvblwiPlxuICAgIDxidXR0b24gXG4gICAgICBjbGFzcz1cInN1Ym1pdC1idG5cIlxuICAgICAgKGNsaWNrKT1cIm9uU3VibWl0KClcIlxuICAgICAgW2Rpc2FibGVkXT1cImlzUmVxdWlyZWQgJiYgc2VsZWN0ZWREYXRlcy5sZW5ndGggPT09IDBcIj5cbiAgICAgIHt7IHN1Ym1pdFRleHRCdXR0b24gfX1cbiAgICA8L2J1dHRvbj5cbiAgPC9kaXY+XG5cbiAgPCEtLSBDYWxlbmRhciBUeXBlIExhYmVsIC0tPlxuICA8ZGl2IGNsYXNzPVwiY2FsZW5kYXItdHlwZVwiICpuZ0lmPVwibW9kZSA9PT0gJ2hpanJpJ1wiPlxuICAgIDxzbWFsbD57eyB1bW1BbFF1cmFEYXRlVGV4dCB9fTwvc21hbGw+XG4gIDwvZGl2PlxuPC9kaXY+XG4iXX0=
|