cps-ui-kit 17.3.0 → 17.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -0
- package/esm2022/lib/components/cps-autocomplete/cps-autocomplete.component.mjs +30 -12
- package/esm2022/lib/components/cps-button/cps-button.component.mjs +2 -2
- package/esm2022/lib/components/cps-button-toggle/cps-button-toggle.component.mjs +1 -1
- package/esm2022/lib/components/cps-datepicker/cps-datepicker.component.mjs +3 -3
- package/esm2022/lib/components/cps-scheduler/cps-scheduler.component.mjs +672 -0
- package/esm2022/lib/components/cps-scheduler/cps-scheduler.utils.mjs +604 -0
- package/esm2022/lib/components/cps-select/cps-select.component.mjs +2 -2
- package/esm2022/lib/components/cps-table/components/internal/table-column-filter-constraint/table-column-filter-constraint.component.mjs +1 -1
- package/esm2022/lib/components/cps-table/cps-table.component.mjs +1 -1
- package/esm2022/lib/components/cps-timepicker/cps-timepicker.component.mjs +10 -3
- package/esm2022/lib/components/internal/cps-base-tree-dropdown/cps-base-tree-dropdown.component.mjs +1 -1
- package/esm2022/lib/directives/cps-tooltip/cps-tooltip.directive.mjs +1 -1
- package/esm2022/lib/services/cps-notification/cps-notification.service.mjs +1 -5
- package/esm2022/lib/services/cps-notification/internal/components/cps-notification-container/cps-notification-container.component.mjs +9 -5
- package/esm2022/lib/services/cps-notification/internal/components/cps-toast/cps-toast.component.mjs +3 -3
- package/esm2022/lib/services/cps-notification/utils/cps-notification-config.mjs +1 -1
- package/esm2022/public-api.mjs +2 -1
- package/fesm2022/cps-ui-kit.mjs +1316 -30
- package/fesm2022/cps-ui-kit.mjs.map +1 -1
- package/lib/components/cps-autocomplete/cps-autocomplete.component.d.ts +10 -4
- package/lib/components/cps-button/cps-button.component.d.ts +1 -1
- package/lib/components/cps-scheduler/cps-scheduler.component.d.ts +146 -0
- package/lib/components/cps-scheduler/cps-scheduler.utils.d.ts +1 -0
- package/lib/components/cps-select/cps-select.component.d.ts +1 -1
- package/lib/components/cps-timepicker/cps-timepicker.component.d.ts +6 -1
- package/lib/services/cps-notification/internal/components/cps-notification-container/cps-notification-container.component.d.ts +1 -6
- package/lib/services/cps-notification/utils/cps-notification-config.d.ts +5 -0
- package/package.json +1 -1
- package/public-api.d.ts +1 -0
|
@@ -0,0 +1,672 @@
|
|
|
1
|
+
import { Component, Input, Output, EventEmitter } from '@angular/core';
|
|
2
|
+
import { CommonModule } from '@angular/common';
|
|
3
|
+
import { FormsModule, ReactiveFormsModule, Validators } from '@angular/forms';
|
|
4
|
+
import { timeZones } from './cps-scheduler.utils';
|
|
5
|
+
import { CpsSelectComponent } from '../cps-select/cps-select.component';
|
|
6
|
+
import { CpsRadioGroupComponent } from '../cps-radio-group/cps-radio-group.component';
|
|
7
|
+
import { CpsRadioComponent } from '../cps-radio-group/cps-radio/cps-radio.component';
|
|
8
|
+
import { CpsCheckboxComponent } from '../cps-checkbox/cps-checkbox.component';
|
|
9
|
+
import { CpsInputComponent } from '../cps-input/cps-input.component';
|
|
10
|
+
import { CpsAutocompleteComponent } from '../cps-autocomplete/cps-autocomplete.component';
|
|
11
|
+
import { CpsButtonToggleComponent } from '../cps-button-toggle/cps-button-toggle.component';
|
|
12
|
+
import { CpsTimepickerComponent } from '../cps-timepicker/cps-timepicker.component';
|
|
13
|
+
import * as i0 from "@angular/core";
|
|
14
|
+
import * as i1 from "@angular/forms";
|
|
15
|
+
import * as i2 from "@angular/common";
|
|
16
|
+
const Days = {
|
|
17
|
+
MON: 'Monday',
|
|
18
|
+
TUE: 'Tuesday',
|
|
19
|
+
WED: 'Wednesday',
|
|
20
|
+
THU: 'Thursday',
|
|
21
|
+
FRI: 'Friday',
|
|
22
|
+
SAT: 'Saturday',
|
|
23
|
+
SUN: 'Sunday'
|
|
24
|
+
};
|
|
25
|
+
const MonthWeeks = {
|
|
26
|
+
'#1': 'First',
|
|
27
|
+
'#2': 'Second',
|
|
28
|
+
'#3': 'Third',
|
|
29
|
+
'#4': 'Fourth',
|
|
30
|
+
'#5': 'Fifth',
|
|
31
|
+
L: 'Last'
|
|
32
|
+
};
|
|
33
|
+
var Months;
|
|
34
|
+
(function (Months) {
|
|
35
|
+
Months[Months["January"] = 1] = "January";
|
|
36
|
+
Months[Months["February"] = 2] = "February";
|
|
37
|
+
Months[Months["March"] = 3] = "March";
|
|
38
|
+
Months[Months["April"] = 4] = "April";
|
|
39
|
+
Months[Months["May"] = 5] = "May";
|
|
40
|
+
Months[Months["June"] = 6] = "June";
|
|
41
|
+
Months[Months["July"] = 7] = "July";
|
|
42
|
+
Months[Months["August"] = 8] = "August";
|
|
43
|
+
Months[Months["September"] = 9] = "September";
|
|
44
|
+
Months[Months["October"] = 10] = "October";
|
|
45
|
+
Months[Months["November"] = 11] = "November";
|
|
46
|
+
Months[Months["December"] = 12] = "December";
|
|
47
|
+
})(Months || (Months = {}));
|
|
48
|
+
/**
|
|
49
|
+
* CpsSchedulerComponent is a component designed to facilitate the creation of Amazon EventBridge CRON expressions.
|
|
50
|
+
* @group Components
|
|
51
|
+
*/
|
|
52
|
+
export class CpsSchedulerComponent {
|
|
53
|
+
// eslint-disable-next-line no-useless-constructor
|
|
54
|
+
constructor(_fb, _cdr) {
|
|
55
|
+
this._fb = _fb;
|
|
56
|
+
this._cdr = _cdr;
|
|
57
|
+
/**
|
|
58
|
+
* Label of the component.
|
|
59
|
+
* @group Props
|
|
60
|
+
*/
|
|
61
|
+
this.label = '';
|
|
62
|
+
/**
|
|
63
|
+
* Cron expression value.
|
|
64
|
+
* @group Props
|
|
65
|
+
*/
|
|
66
|
+
this.cron = '';
|
|
67
|
+
/**
|
|
68
|
+
* Time zone value.
|
|
69
|
+
* @group Props
|
|
70
|
+
*/
|
|
71
|
+
this.timeZone = Intl.DateTimeFormat().resolvedOptions().timeZone || 'UTC';
|
|
72
|
+
/**
|
|
73
|
+
* Determines whether to show the 'Not set' tab.
|
|
74
|
+
* @group Props
|
|
75
|
+
*/
|
|
76
|
+
this.showNotSet = true;
|
|
77
|
+
/**
|
|
78
|
+
* Determines whether to show the 'Advanced' tab.
|
|
79
|
+
* @group Props
|
|
80
|
+
*/
|
|
81
|
+
this.showAdvanced = true;
|
|
82
|
+
/**
|
|
83
|
+
* Determines whether to show the time zone selector.
|
|
84
|
+
* @group Props
|
|
85
|
+
*/
|
|
86
|
+
this.showTimeZone = false;
|
|
87
|
+
/**
|
|
88
|
+
* Default time format for the component.
|
|
89
|
+
* @group Props
|
|
90
|
+
*/
|
|
91
|
+
this.defaultTime = '00:00';
|
|
92
|
+
/**
|
|
93
|
+
* Determines whether to use 24-hour time format.
|
|
94
|
+
* @group Props
|
|
95
|
+
*/
|
|
96
|
+
this.use24HourTime = true;
|
|
97
|
+
/**
|
|
98
|
+
* Determines whether the component is disabled.
|
|
99
|
+
* @group Props
|
|
100
|
+
*/
|
|
101
|
+
this.disabled = false;
|
|
102
|
+
/**
|
|
103
|
+
* Information tooltip for the component.
|
|
104
|
+
* @group Props
|
|
105
|
+
*/
|
|
106
|
+
this.infoTooltip = '';
|
|
107
|
+
/**
|
|
108
|
+
* Callback to invoke on cron expression value change.
|
|
109
|
+
* @param {string} string - cron expression value changed.
|
|
110
|
+
* @group Emits
|
|
111
|
+
*/
|
|
112
|
+
this.cronChange = new EventEmitter();
|
|
113
|
+
/**
|
|
114
|
+
* Callback to invoke on time zone change.
|
|
115
|
+
* @param {string} string - time zone changed.
|
|
116
|
+
* @group Emits
|
|
117
|
+
*/
|
|
118
|
+
this.timeZoneChange = new EventEmitter();
|
|
119
|
+
this.scheduleTypes = [
|
|
120
|
+
{ label: 'Not set', value: 'Not set' },
|
|
121
|
+
{ label: 'Minutes', value: 'Minutes' },
|
|
122
|
+
{ label: 'Hourly', value: 'Hourly' },
|
|
123
|
+
{ label: 'Daily', value: 'Daily' },
|
|
124
|
+
{ label: 'Weekly', value: 'Weekly' },
|
|
125
|
+
{ label: 'Monthly', value: 'Monthly' },
|
|
126
|
+
{ label: 'Yearly', value: 'Yearly' },
|
|
127
|
+
{ label: 'Advanced', value: 'Advanced' }
|
|
128
|
+
];
|
|
129
|
+
this.activeScheduleType = 'Not set';
|
|
130
|
+
this.selectOptions = this._getSelectOptions();
|
|
131
|
+
this.timeZoneOptions = timeZones.map((tz) => ({ label: tz, value: tz }));
|
|
132
|
+
this._isDirty = false;
|
|
133
|
+
this._minutesDefault = '0/1 * 1/1 * ? *';
|
|
134
|
+
}
|
|
135
|
+
ngOnInit() {
|
|
136
|
+
this.state = this._getDefaultState();
|
|
137
|
+
if (!this.showAdvanced) {
|
|
138
|
+
this.scheduleTypes.pop();
|
|
139
|
+
}
|
|
140
|
+
if (!this.showNotSet) {
|
|
141
|
+
this.scheduleTypes.shift();
|
|
142
|
+
if (!this.cron)
|
|
143
|
+
this.cron = this._minutesDefault;
|
|
144
|
+
}
|
|
145
|
+
this._handleModelChange(this.cron);
|
|
146
|
+
this.form = this._fb.group({
|
|
147
|
+
advanced: [
|
|
148
|
+
this.state.advanced.expression ?? '',
|
|
149
|
+
[this._validateAdvancedExpr]
|
|
150
|
+
]
|
|
151
|
+
});
|
|
152
|
+
}
|
|
153
|
+
ngOnChanges(changes) {
|
|
154
|
+
const newCron = changes.value;
|
|
155
|
+
if (newCron && !newCron.firstChange) {
|
|
156
|
+
this._handleModelChange(this.cron);
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
setActiveScheduleType(value) {
|
|
160
|
+
if (!this.disabled) {
|
|
161
|
+
this.activeScheduleType = value;
|
|
162
|
+
this.regenerateCron(true);
|
|
163
|
+
}
|
|
164
|
+
if (value && this.form) {
|
|
165
|
+
if (value === 'Advanced') {
|
|
166
|
+
this.form.controls.advanced.addValidators(Validators.required);
|
|
167
|
+
this.form.controls.advanced.updateValueAndValidity();
|
|
168
|
+
}
|
|
169
|
+
else {
|
|
170
|
+
this.form.controls.advanced.removeValidators(Validators.required);
|
|
171
|
+
this.form.controls.advanced.setErrors(null);
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
regenerateCron(tabChange) {
|
|
176
|
+
this._isDirty = true;
|
|
177
|
+
switch (this.activeScheduleType) {
|
|
178
|
+
case 'Minutes':
|
|
179
|
+
this._updateCron(`0/${this.state.minutes.minutes} * 1/1 * ? *`);
|
|
180
|
+
break;
|
|
181
|
+
case 'Hourly':
|
|
182
|
+
this._updateCron(`${this.state.hourly.minutes} 0/${this.state.hourly.hours} 1/1 * ? *`);
|
|
183
|
+
break;
|
|
184
|
+
case 'Daily':
|
|
185
|
+
switch (this.state.daily.subTab) {
|
|
186
|
+
case 'everyDays':
|
|
187
|
+
this._updateCron(`${this.state.daily.everyDays.minutes} ${this._hourToCron(this.state.daily.everyDays.hours, this.state.daily.everyDays.hourType)} 1/${this.state.daily.everyDays.days} * ? *`);
|
|
188
|
+
break;
|
|
189
|
+
case 'everyWeekDay':
|
|
190
|
+
this._updateCron(`${this.state.daily.everyWeekDay.minutes} ${this._hourToCron(this.state.daily.everyWeekDay.hours, this.state.daily.everyWeekDay.hourType)} ? * MON-FRI *`);
|
|
191
|
+
break;
|
|
192
|
+
default:
|
|
193
|
+
throw new Error('Invalid cron daily subtab selection');
|
|
194
|
+
}
|
|
195
|
+
break;
|
|
196
|
+
case 'Weekly': {
|
|
197
|
+
const days = this.selectOptions.days
|
|
198
|
+
.map((d) => d.value)
|
|
199
|
+
.reduce((acc, day) => (this.state.weekly[day] ? acc.concat([day]) : acc), [])
|
|
200
|
+
.join(',');
|
|
201
|
+
this._updateCron(`${this.state.weekly.minutes} ${this._hourToCron(this.state.weekly.hours, this.state.weekly.hourType)} ? * ${days} *`);
|
|
202
|
+
break;
|
|
203
|
+
}
|
|
204
|
+
case 'Monthly': {
|
|
205
|
+
switch (this.state.monthly.subTab) {
|
|
206
|
+
case 'specificDay': {
|
|
207
|
+
const day = this.state.monthly.runOnWeekday
|
|
208
|
+
? `${this.state.monthly.specificDay.day}W`
|
|
209
|
+
: this.state.monthly.specificDay.day;
|
|
210
|
+
this._updateCron(`${this.state.monthly.specificDay.minutes} ${this._hourToCron(this.state.monthly.specificDay.hours, this.state.monthly.specificDay.hourType)} ${day} 1/${this.state.monthly.specificDay.months} ? *`);
|
|
211
|
+
break;
|
|
212
|
+
}
|
|
213
|
+
case 'specificWeekDay':
|
|
214
|
+
this._updateCron(`${this.state.monthly.specificWeekDay.minutes} ${this._hourToCron(this.state.monthly.specificWeekDay.hours, this.state.monthly.specificWeekDay.hourType)} ? ${this.state.monthly.specificWeekDay.startMonth}/${this.state.monthly.specificWeekDay.months} ${this.state.monthly.specificWeekDay.day}${this.state.monthly.specificWeekDay.monthWeek} *`);
|
|
215
|
+
break;
|
|
216
|
+
default:
|
|
217
|
+
throw new Error('Invalid cron monthly subtab selection');
|
|
218
|
+
}
|
|
219
|
+
break;
|
|
220
|
+
}
|
|
221
|
+
case 'Yearly':
|
|
222
|
+
switch (this.state.yearly.subTab) {
|
|
223
|
+
case 'specificMonthDay': {
|
|
224
|
+
const day = this.state.yearly.runOnWeekday
|
|
225
|
+
? `${this.state.yearly.specificMonthDay.day}W`
|
|
226
|
+
: this.state.yearly.specificMonthDay.day;
|
|
227
|
+
this._updateCron(`${this.state.yearly.specificMonthDay.minutes} ${this._hourToCron(this.state.yearly.specificMonthDay.hours, this.state.yearly.specificMonthDay.hourType)} ${day} ${this.state.yearly.specificMonthDay.month} ? *`);
|
|
228
|
+
break;
|
|
229
|
+
}
|
|
230
|
+
case 'specificMonthWeek':
|
|
231
|
+
this._updateCron(`${this.state.yearly.specificMonthWeek.minutes} ${this._hourToCron(this.state.yearly.specificMonthWeek.hours, this.state.yearly.specificMonthWeek.hourType)} ? ${this.state.yearly.specificMonthWeek.month} ${this.state.yearly.specificMonthWeek.day}${this.state.yearly.specificMonthWeek.monthWeek} *`);
|
|
232
|
+
break;
|
|
233
|
+
default:
|
|
234
|
+
throw new Error('Invalid cron yearly subtab selection');
|
|
235
|
+
}
|
|
236
|
+
break;
|
|
237
|
+
case 'Advanced':
|
|
238
|
+
if (!tabChange)
|
|
239
|
+
this._updateCron(this.form.value.advanced || '');
|
|
240
|
+
this.form.controls.advanced.setValue(this.cron);
|
|
241
|
+
break;
|
|
242
|
+
default:
|
|
243
|
+
if (this.showNotSet)
|
|
244
|
+
this._updateCron('');
|
|
245
|
+
else
|
|
246
|
+
throw new Error('Invalid cron type');
|
|
247
|
+
}
|
|
248
|
+
}
|
|
249
|
+
onTimeZoneChanged(value) {
|
|
250
|
+
if (!this.showTimeZone)
|
|
251
|
+
return;
|
|
252
|
+
this.timeZoneChange.emit(value);
|
|
253
|
+
}
|
|
254
|
+
onTimeChanged(value, target) {
|
|
255
|
+
target.hours = this._stringToNum(value.hours);
|
|
256
|
+
target.minutes = this._stringToNum(value.minutes);
|
|
257
|
+
this.regenerateCron();
|
|
258
|
+
}
|
|
259
|
+
formatTimeValue(value) {
|
|
260
|
+
return {
|
|
261
|
+
hours: this._numToString(value.hours),
|
|
262
|
+
minutes: this._numToString(value.minutes)
|
|
263
|
+
};
|
|
264
|
+
}
|
|
265
|
+
_updateCron(value) {
|
|
266
|
+
if (this.cron === value)
|
|
267
|
+
return;
|
|
268
|
+
this.cron = value;
|
|
269
|
+
this.cronChange.emit(this.cron);
|
|
270
|
+
}
|
|
271
|
+
_isValidCron(cron) {
|
|
272
|
+
if (typeof cron !== 'string')
|
|
273
|
+
return false;
|
|
274
|
+
if (!this.showNotSet) {
|
|
275
|
+
if (!cron)
|
|
276
|
+
return false;
|
|
277
|
+
}
|
|
278
|
+
else if (cron === '')
|
|
279
|
+
return true;
|
|
280
|
+
const parts = cron.split(' ');
|
|
281
|
+
if (parts.length !== 6) {
|
|
282
|
+
return false;
|
|
283
|
+
}
|
|
284
|
+
return true;
|
|
285
|
+
}
|
|
286
|
+
_validateAdvancedExpr(c) {
|
|
287
|
+
const cron = c.value;
|
|
288
|
+
if (!cron)
|
|
289
|
+
return null;
|
|
290
|
+
const splits = cron?.split(' ') || [];
|
|
291
|
+
if (splits.length !== 6)
|
|
292
|
+
return { invalidExpression: 'Invalid expression' };
|
|
293
|
+
const cronSeven = `0 ${cron}`;
|
|
294
|
+
return cronSeven.match(/\d+ 0\/\d+ \* 1\/1 \* \? \*/) ||
|
|
295
|
+
cronSeven.match(/\d+ \d+ 0\/\d+ 1\/1 \* \? \*/) ||
|
|
296
|
+
cronSeven.match(/\d+ \d+ \d+ 1\/\d+ \* \? \*/) ||
|
|
297
|
+
cronSeven.match(/\d+ \d+ \d+ \? \* MON-FRI \*/) ||
|
|
298
|
+
cronSeven.match(/\d+ \d+ \d+ \? \* (MON|TUE|WED|THU|FRI|SAT|SUN)(,(MON|TUE|WED|THU|FRI|SAT|SUN))* \*/) ||
|
|
299
|
+
cronSeven.match(/\d+ \d+ \d+ (\d+|L|LW|1W) 1\/\d+ \? \*/) ||
|
|
300
|
+
cronSeven.match(/\d+ \d+ \d+ \? \d+\/\d+ (MON|TUE|WED|THU|FRI|SAT|SUN)((#[1-5])|L) \*/) ||
|
|
301
|
+
cronSeven.match(/\d+ \d+ \d+ (\d+|L|LW|1W) \d+ \? \*/) ||
|
|
302
|
+
cronSeven.match(/\d+ \d+ \d+ \? \d+ (MON|TUE|WED|THU|FRI|SAT|SUN)((#[1-5])|L) \*/)
|
|
303
|
+
? null
|
|
304
|
+
: { invalidExpression: 'Invalid expression' };
|
|
305
|
+
}
|
|
306
|
+
_getAmPmHour(hour) {
|
|
307
|
+
return this.use24HourTime ? hour : ((hour + 11) % 12) + 1;
|
|
308
|
+
}
|
|
309
|
+
_getHourType(hour) {
|
|
310
|
+
return this.use24HourTime ? undefined : hour >= 12 ? 'PM' : 'AM';
|
|
311
|
+
}
|
|
312
|
+
_hourToCron(hour, hourType) {
|
|
313
|
+
if (this.use24HourTime) {
|
|
314
|
+
return hour;
|
|
315
|
+
}
|
|
316
|
+
else {
|
|
317
|
+
return hourType === 'AM'
|
|
318
|
+
? hour === 12
|
|
319
|
+
? 0
|
|
320
|
+
: hour
|
|
321
|
+
: hour === 12
|
|
322
|
+
? 12
|
|
323
|
+
: hour + 12;
|
|
324
|
+
}
|
|
325
|
+
}
|
|
326
|
+
_handleModelChange(cron) {
|
|
327
|
+
if (!this._isValidCron(cron)) {
|
|
328
|
+
console.error('Invalid cron value:', cron);
|
|
329
|
+
this.cron = this.showNotSet ? '' : this._minutesDefault;
|
|
330
|
+
return;
|
|
331
|
+
}
|
|
332
|
+
if (this._isDirty) {
|
|
333
|
+
this._isDirty = false;
|
|
334
|
+
return;
|
|
335
|
+
}
|
|
336
|
+
else {
|
|
337
|
+
this._isDirty = false;
|
|
338
|
+
}
|
|
339
|
+
if (!cron || cron.length < 1) {
|
|
340
|
+
this.activeScheduleType = 'Not set';
|
|
341
|
+
this._cdr.detectChanges();
|
|
342
|
+
return;
|
|
343
|
+
}
|
|
344
|
+
const cronSeven = `0 ${cron}`;
|
|
345
|
+
const [minutes, hours, dayOfMonth, month, dayOfWeek] = cron.split(' ');
|
|
346
|
+
if (cronSeven.match(/\d+ 0\/\d+ \* 1\/1 \* \? \*/)) {
|
|
347
|
+
this.activeScheduleType = 'Minutes';
|
|
348
|
+
this.state.minutes.minutes = Number(minutes.substring(2));
|
|
349
|
+
}
|
|
350
|
+
else if (cronSeven.match(/\d+ \d+ 0\/\d+ 1\/1 \* \? \*/)) {
|
|
351
|
+
this.activeScheduleType = 'Hourly';
|
|
352
|
+
this.state.hourly.hours = Number(hours.substring(2));
|
|
353
|
+
this.state.hourly.minutes = Number(minutes);
|
|
354
|
+
}
|
|
355
|
+
else if (cronSeven.match(/\d+ \d+ \d+ 1\/\d+ \* \? \*/)) {
|
|
356
|
+
this.activeScheduleType = 'Daily';
|
|
357
|
+
this.state.daily.subTab = 'everyDays';
|
|
358
|
+
this.state.daily.everyDays.days = Number(dayOfMonth.substring(2));
|
|
359
|
+
const parsedHours = Number(hours);
|
|
360
|
+
this.state.daily.everyDays.hours = this._getAmPmHour(parsedHours);
|
|
361
|
+
this.state.daily.everyDays.hourType = this._getHourType(parsedHours);
|
|
362
|
+
this.state.daily.everyDays.minutes = Number(minutes);
|
|
363
|
+
}
|
|
364
|
+
else if (cronSeven.match(/\d+ \d+ \d+ \? \* MON-FRI \*/)) {
|
|
365
|
+
this.activeScheduleType = 'Daily';
|
|
366
|
+
this.state.daily.subTab = 'everyWeekDay';
|
|
367
|
+
const parsedHours = Number(hours);
|
|
368
|
+
this.state.daily.everyWeekDay.hours = this._getAmPmHour(parsedHours);
|
|
369
|
+
this.state.daily.everyWeekDay.hourType = this._getHourType(parsedHours);
|
|
370
|
+
this.state.daily.everyWeekDay.minutes = Number(minutes);
|
|
371
|
+
}
|
|
372
|
+
else if (cronSeven.match(/\d+ \d+ \d+ \? \* (MON|TUE|WED|THU|FRI|SAT|SUN)(,(MON|TUE|WED|THU|FRI|SAT|SUN))* \*/)) {
|
|
373
|
+
this.activeScheduleType = 'Weekly';
|
|
374
|
+
this.selectOptions.days
|
|
375
|
+
.map((d) => d.value)
|
|
376
|
+
.forEach((weekDay) => (this.state.weekly[weekDay] = false));
|
|
377
|
+
dayOfWeek
|
|
378
|
+
.split(',')
|
|
379
|
+
.forEach((weekDay) => (this.state.weekly[weekDay] = true));
|
|
380
|
+
const parsedHours = Number(hours);
|
|
381
|
+
this.state.weekly.hours = this._getAmPmHour(parsedHours);
|
|
382
|
+
this.state.weekly.hourType = this._getHourType(parsedHours);
|
|
383
|
+
this.state.weekly.minutes = Number(minutes);
|
|
384
|
+
}
|
|
385
|
+
else if (cronSeven.match(/\d+ \d+ \d+ (\d+|L|LW|1W) 1\/\d+ \? \*/)) {
|
|
386
|
+
this.activeScheduleType = 'Monthly';
|
|
387
|
+
this.state.monthly.subTab = 'specificDay';
|
|
388
|
+
if (dayOfMonth.indexOf('W') !== -1) {
|
|
389
|
+
this.state.monthly.specificDay.day = dayOfMonth.charAt(0);
|
|
390
|
+
this.state.monthly.runOnWeekday = true;
|
|
391
|
+
}
|
|
392
|
+
else {
|
|
393
|
+
this.state.monthly.specificDay.day = dayOfMonth;
|
|
394
|
+
}
|
|
395
|
+
this.state.monthly.specificDay.months = Number(month.substring(2));
|
|
396
|
+
const parsedHours = Number(hours);
|
|
397
|
+
this.state.monthly.specificDay.hours = this._getAmPmHour(parsedHours);
|
|
398
|
+
this.state.monthly.specificDay.hourType = this._getHourType(parsedHours);
|
|
399
|
+
this.state.monthly.specificDay.minutes = Number(minutes);
|
|
400
|
+
}
|
|
401
|
+
else if (cronSeven.match(/\d+ \d+ \d+ \? \d+\/\d+ (MON|TUE|WED|THU|FRI|SAT|SUN)((#[1-5])|L) \*/)) {
|
|
402
|
+
const day = dayOfWeek.substring(0, 3);
|
|
403
|
+
const monthWeek = dayOfWeek.substring(3);
|
|
404
|
+
this.activeScheduleType = 'Monthly';
|
|
405
|
+
this.state.monthly.subTab = 'specificWeekDay';
|
|
406
|
+
this.state.monthly.specificWeekDay.monthWeek = monthWeek;
|
|
407
|
+
this.state.monthly.specificWeekDay.day = day;
|
|
408
|
+
if (month.indexOf('/') !== -1) {
|
|
409
|
+
const [startMonth, months] = month.split('/').map(Number);
|
|
410
|
+
this.state.monthly.specificWeekDay.months = months;
|
|
411
|
+
this.state.monthly.specificWeekDay.startMonth = startMonth;
|
|
412
|
+
}
|
|
413
|
+
const parsedHours = Number(hours);
|
|
414
|
+
this.state.monthly.specificWeekDay.hours = this._getAmPmHour(parsedHours);
|
|
415
|
+
this.state.monthly.specificWeekDay.hourType =
|
|
416
|
+
this._getHourType(parsedHours);
|
|
417
|
+
this.state.monthly.specificWeekDay.minutes = Number(minutes);
|
|
418
|
+
}
|
|
419
|
+
else if (cronSeven.match(/\d+ \d+ \d+ (\d+|L|LW|1W) \d+ \? \*/)) {
|
|
420
|
+
this.activeScheduleType = 'Yearly';
|
|
421
|
+
this.state.yearly.subTab = 'specificMonthDay';
|
|
422
|
+
this.state.yearly.specificMonthDay.month = Number(month);
|
|
423
|
+
if (dayOfMonth.indexOf('W') !== -1) {
|
|
424
|
+
this.state.yearly.specificMonthDay.day = dayOfMonth.charAt(0);
|
|
425
|
+
this.state.yearly.runOnWeekday = true;
|
|
426
|
+
}
|
|
427
|
+
else {
|
|
428
|
+
this.state.yearly.specificMonthDay.day = dayOfMonth;
|
|
429
|
+
}
|
|
430
|
+
const parsedHours = Number(hours);
|
|
431
|
+
this.state.yearly.specificMonthDay.hours = this._getAmPmHour(parsedHours);
|
|
432
|
+
this.state.yearly.specificMonthDay.hourType =
|
|
433
|
+
this._getHourType(parsedHours);
|
|
434
|
+
this.state.yearly.specificMonthDay.minutes = Number(minutes);
|
|
435
|
+
}
|
|
436
|
+
else if (cronSeven.match(/\d+ \d+ \d+ \? \d+ (MON|TUE|WED|THU|FRI|SAT|SUN)((#[1-5])|L) \*/)) {
|
|
437
|
+
const day = dayOfWeek.substring(0, 3);
|
|
438
|
+
const monthWeek = dayOfWeek.substring(3);
|
|
439
|
+
this.activeScheduleType = 'Yearly';
|
|
440
|
+
this.state.yearly.subTab = 'specificMonthWeek';
|
|
441
|
+
this.state.yearly.specificMonthWeek.monthWeek = monthWeek;
|
|
442
|
+
this.state.yearly.specificMonthWeek.day = day;
|
|
443
|
+
this.state.yearly.specificMonthWeek.month = Number(month);
|
|
444
|
+
const parsedHours = Number(hours);
|
|
445
|
+
this.state.yearly.specificMonthWeek.hours =
|
|
446
|
+
this._getAmPmHour(parsedHours);
|
|
447
|
+
this.state.yearly.specificMonthWeek.hourType =
|
|
448
|
+
this._getHourType(parsedHours);
|
|
449
|
+
this.state.yearly.specificMonthWeek.minutes = Number(minutes);
|
|
450
|
+
}
|
|
451
|
+
else {
|
|
452
|
+
this.activeScheduleType = 'Advanced';
|
|
453
|
+
this.form.controls.advanced.setValue(cron);
|
|
454
|
+
}
|
|
455
|
+
this._cdr.detectChanges();
|
|
456
|
+
}
|
|
457
|
+
_getDefaultState() {
|
|
458
|
+
const [defaultHours, defaultMinutes] = this.defaultTime
|
|
459
|
+
.split(':')
|
|
460
|
+
.map(Number);
|
|
461
|
+
return {
|
|
462
|
+
minutes: {
|
|
463
|
+
minutes: 1
|
|
464
|
+
},
|
|
465
|
+
hourly: {
|
|
466
|
+
hours: 1,
|
|
467
|
+
minutes: 0
|
|
468
|
+
},
|
|
469
|
+
daily: {
|
|
470
|
+
subTab: 'everyDays',
|
|
471
|
+
everyDays: {
|
|
472
|
+
days: 1,
|
|
473
|
+
hours: this._getAmPmHour(defaultHours),
|
|
474
|
+
minutes: defaultMinutes,
|
|
475
|
+
hourType: this._getHourType(defaultHours)
|
|
476
|
+
},
|
|
477
|
+
everyWeekDay: {
|
|
478
|
+
hours: this._getAmPmHour(defaultHours),
|
|
479
|
+
minutes: defaultMinutes,
|
|
480
|
+
hourType: this._getHourType(defaultHours)
|
|
481
|
+
}
|
|
482
|
+
},
|
|
483
|
+
weekly: {
|
|
484
|
+
MON: true,
|
|
485
|
+
TUE: false,
|
|
486
|
+
WED: false,
|
|
487
|
+
THU: false,
|
|
488
|
+
FRI: false,
|
|
489
|
+
SAT: false,
|
|
490
|
+
SUN: false,
|
|
491
|
+
hours: this._getAmPmHour(defaultHours),
|
|
492
|
+
minutes: defaultMinutes,
|
|
493
|
+
hourType: this._getHourType(defaultHours)
|
|
494
|
+
},
|
|
495
|
+
monthly: {
|
|
496
|
+
subTab: 'specificDay',
|
|
497
|
+
runOnWeekday: false,
|
|
498
|
+
specificDay: {
|
|
499
|
+
day: '1',
|
|
500
|
+
months: 1,
|
|
501
|
+
hours: this._getAmPmHour(defaultHours),
|
|
502
|
+
minutes: defaultMinutes,
|
|
503
|
+
hourType: this._getHourType(defaultHours)
|
|
504
|
+
},
|
|
505
|
+
specificWeekDay: {
|
|
506
|
+
monthWeek: '#1',
|
|
507
|
+
day: 'MON',
|
|
508
|
+
startMonth: 1,
|
|
509
|
+
months: 1,
|
|
510
|
+
hours: this._getAmPmHour(defaultHours),
|
|
511
|
+
minutes: defaultMinutes,
|
|
512
|
+
hourType: this._getHourType(defaultHours)
|
|
513
|
+
}
|
|
514
|
+
},
|
|
515
|
+
yearly: {
|
|
516
|
+
subTab: 'specificMonthDay',
|
|
517
|
+
runOnWeekday: false,
|
|
518
|
+
specificMonthDay: {
|
|
519
|
+
month: 1,
|
|
520
|
+
day: '1',
|
|
521
|
+
hours: this._getAmPmHour(defaultHours),
|
|
522
|
+
minutes: defaultMinutes,
|
|
523
|
+
hourType: this._getHourType(defaultHours)
|
|
524
|
+
},
|
|
525
|
+
specificMonthWeek: {
|
|
526
|
+
monthWeek: '#1',
|
|
527
|
+
day: 'MON',
|
|
528
|
+
month: 1,
|
|
529
|
+
hours: this._getAmPmHour(defaultHours),
|
|
530
|
+
minutes: defaultMinutes,
|
|
531
|
+
hourType: this._getHourType(defaultHours)
|
|
532
|
+
}
|
|
533
|
+
},
|
|
534
|
+
advanced: {
|
|
535
|
+
expression: this.cron
|
|
536
|
+
}
|
|
537
|
+
};
|
|
538
|
+
}
|
|
539
|
+
_getRange(startFrom, until) {
|
|
540
|
+
return Array.from({ length: until + 1 - startFrom }, (_, k) => k + startFrom);
|
|
541
|
+
}
|
|
542
|
+
_getSelectOptions() {
|
|
543
|
+
return {
|
|
544
|
+
monthsNumeric: this._getRange(1, 12).map((month) => ({
|
|
545
|
+
label: month,
|
|
546
|
+
value: month
|
|
547
|
+
})),
|
|
548
|
+
months: this._getRange(1, 12).map((month) => ({
|
|
549
|
+
label: Months[month],
|
|
550
|
+
value: month
|
|
551
|
+
})),
|
|
552
|
+
monthWeeks: Object.entries(MonthWeeks).map(([key, value]) => ({
|
|
553
|
+
label: value,
|
|
554
|
+
value: key
|
|
555
|
+
})),
|
|
556
|
+
days: Object.entries(Days).map(([key, value]) => ({
|
|
557
|
+
label: value,
|
|
558
|
+
value: key
|
|
559
|
+
})),
|
|
560
|
+
minutes: this._getRange(1, 59).map((min) => ({
|
|
561
|
+
label: min,
|
|
562
|
+
value: min
|
|
563
|
+
})),
|
|
564
|
+
fullMinutes: this._getRange(0, 59).map((min) => ({
|
|
565
|
+
label: this._numToString(min),
|
|
566
|
+
value: min
|
|
567
|
+
})),
|
|
568
|
+
hours: this._getRange(1, 23).map((hour) => ({
|
|
569
|
+
label: hour,
|
|
570
|
+
value: hour
|
|
571
|
+
})),
|
|
572
|
+
monthDays: this._getRange(1, 31).map((day) => ({
|
|
573
|
+
label: day,
|
|
574
|
+
value: day
|
|
575
|
+
})),
|
|
576
|
+
monthDaysWithLasts: [...this._getRange(1, 31).map(String), 'L'].map((mdl) => {
|
|
577
|
+
return {
|
|
578
|
+
label: this._getMonthDayLabel(mdl),
|
|
579
|
+
value: mdl
|
|
580
|
+
};
|
|
581
|
+
})
|
|
582
|
+
};
|
|
583
|
+
}
|
|
584
|
+
_getMonthDayLabel(month) {
|
|
585
|
+
if (month === 'L') {
|
|
586
|
+
return 'Last Day';
|
|
587
|
+
}
|
|
588
|
+
else if (month === 'LW') {
|
|
589
|
+
return 'Last Weekday';
|
|
590
|
+
}
|
|
591
|
+
else if (month === '1W') {
|
|
592
|
+
return 'First Weekday';
|
|
593
|
+
}
|
|
594
|
+
else {
|
|
595
|
+
let suffix = '';
|
|
596
|
+
if (month.length > 1) {
|
|
597
|
+
const secondToLastDigit = month.charAt(month.length - 2);
|
|
598
|
+
if (secondToLastDigit === '1') {
|
|
599
|
+
suffix = 'th';
|
|
600
|
+
}
|
|
601
|
+
}
|
|
602
|
+
if (!suffix) {
|
|
603
|
+
const lastDigit = month.charAt(month.length - 1);
|
|
604
|
+
switch (lastDigit) {
|
|
605
|
+
case '1':
|
|
606
|
+
suffix = 'st';
|
|
607
|
+
break;
|
|
608
|
+
case '2':
|
|
609
|
+
suffix = 'nd';
|
|
610
|
+
break;
|
|
611
|
+
case '3':
|
|
612
|
+
suffix = 'rd';
|
|
613
|
+
break;
|
|
614
|
+
default:
|
|
615
|
+
suffix = 'th';
|
|
616
|
+
break;
|
|
617
|
+
}
|
|
618
|
+
}
|
|
619
|
+
return `${month}${suffix} day`;
|
|
620
|
+
}
|
|
621
|
+
}
|
|
622
|
+
_numToString(value) {
|
|
623
|
+
return value >= 0 && value <= 9 ? '0' + value : value.toString();
|
|
624
|
+
}
|
|
625
|
+
_stringToNum(value) {
|
|
626
|
+
const res = Number(value);
|
|
627
|
+
return isNaN(res) ? 0 : res;
|
|
628
|
+
}
|
|
629
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.1.2", ngImport: i0, type: CpsSchedulerComponent, deps: [{ token: i1.UntypedFormBuilder }, { token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component }); }
|
|
630
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.1.2", type: CpsSchedulerComponent, isStandalone: true, selector: "cps-scheduler", inputs: { label: "label", cron: "cron", timeZone: "timeZone", showNotSet: "showNotSet", showAdvanced: "showAdvanced", showTimeZone: "showTimeZone", defaultTime: "defaultTime", use24HourTime: "use24HourTime", disabled: "disabled", infoTooltip: "infoTooltip" }, outputs: { cronChange: "cronChange", timeZoneChange: "timeZoneChange" }, usesOnChanges: true, ngImport: i0, template: "<div class=\"cps-scheduler-selector\">\n <cps-button-toggle\n [options]=\"scheduleTypes\"\n [disabled]=\"disabled\"\n [label]=\"label\"\n [infoTooltip]=\"infoTooltip\"\n [(ngModel)]=\"activeScheduleType\"\n (ngModelChange)=\"setActiveScheduleType($event)\">\n </cps-button-toggle>\n</div>\n\n<div\n [ngSwitch]=\"activeScheduleType\"\n class=\"cps-scheduler-container\"\n [ngClass]=\"{ 'cps-scheduler-container-disabled': disabled }\">\n <div *ngSwitchCase=\"'Not set'\" class=\"cps-scheduler-tab-pane\"></div>\n\n <div *ngSwitchCase=\"'Minutes'\" class=\"cps-scheduler-tab-pane\">\n <div class=\"cps-scheduler-tab-pane-row\">\n Every\n <cps-select\n width=\"70px\"\n [disabled]=\"disabled\"\n [returnObject]=\"false\"\n [hideDetails]=\"true\"\n (valueChanged)=\"regenerateCron()\"\n [(ngModel)]=\"state.minutes.minutes\"\n [options]=\"selectOptions.minutes\"\n class=\"cps-scheduler-select-control\">\n </cps-select>\n minute(s)\n </div>\n </div>\n\n <div *ngSwitchCase=\"'Hourly'\" class=\"cps-scheduler-tab-pane\">\n <div class=\"cps-scheduler-tab-pane-row\">\n Every\n <cps-select\n width=\"70px\"\n [disabled]=\"disabled\"\n [returnObject]=\"false\"\n [hideDetails]=\"true\"\n (valueChanged)=\"regenerateCron()\"\n [(ngModel)]=\"state.hourly.hours\"\n [options]=\"selectOptions.hours\"\n class=\"cps-scheduler-select-control\">\n </cps-select>\n hour(s) on minute\n <cps-select\n width=\"70px\"\n [disabled]=\"disabled\"\n [returnObject]=\"false\"\n [hideDetails]=\"true\"\n (valueChanged)=\"regenerateCron()\"\n [(ngModel)]=\"state.hourly.minutes\"\n [options]=\"selectOptions.fullMinutes\"\n class=\"cps-scheduler-select-control\">\n </cps-select>\n </div>\n </div>\n\n <div *ngSwitchCase=\"'Daily'\" class=\"cps-scheduler-tab-pane\">\n <cps-radio-group\n [(ngModel)]=\"state.daily.subTab\"\n (valueChanged)=\"regenerateCron()\"\n [vertical]=\"true\">\n <cps-radio [option]=\"{ value: 'everyDays', disabled: disabled }\">\n <div\n class=\"cps-scheduler-tab-pane-row\"\n [ngClass]=\"{\n 'cps-scheduler-tab-pane-row-disabled':\n state.daily.subTab !== 'everyDays'\n }\">\n Every\n <cps-select\n width=\"70px\"\n [disabled]=\"disabled || state.daily.subTab !== 'everyDays'\"\n [returnObject]=\"false\"\n [hideDetails]=\"true\"\n (valueChanged)=\"regenerateCron()\"\n [(ngModel)]=\"state.daily.everyDays.days\"\n [options]=\"selectOptions.monthDays\"\n class=\"cps-scheduler-select-control\">\n </cps-select>\n day(s) at\n <cps-timepicker\n [disabled]=\"disabled || state.daily.subTab !== 'everyDays'\"\n [use24HourTime]=\"use24HourTime\"\n [mandatoryValue]=\"true\"\n [value]=\"formatTimeValue(state.daily.everyDays)\"\n [hideDetails]=\"true\"\n (valueChanged)=\"onTimeChanged($event, state.daily.everyDays)\">\n </cps-timepicker>\n </div>\n </cps-radio>\n <cps-radio [option]=\"{ value: 'everyWeekDay', disabled: disabled }\">\n <div\n class=\"cps-scheduler-tab-pane-row\"\n [ngClass]=\"{\n 'cps-scheduler-tab-pane-row-disabled':\n state.daily.subTab !== 'everyWeekDay'\n }\">\n Every working day at\n <cps-timepicker\n [disabled]=\"disabled || state.daily.subTab !== 'everyWeekDay'\"\n [use24HourTime]=\"use24HourTime\"\n [mandatoryValue]=\"true\"\n [value]=\"formatTimeValue(state.daily.everyWeekDay)\"\n [hideDetails]=\"true\"\n (valueChanged)=\"onTimeChanged($event, state.daily.everyWeekDay)\">\n </cps-timepicker>\n </div>\n </cps-radio>\n </cps-radio-group>\n </div>\n\n <div *ngSwitchCase=\"'Weekly'\" class=\"cps-scheduler-tab-pane\">\n <div class=\"cps-scheduler-days-checkbox-group\">\n <cps-checkbox\n (valueChanged)=\"regenerateCron()\"\n [disabled]=\"disabled\"\n label=\"Monday\"\n [(ngModel)]=\"state.weekly.MON\">\n </cps-checkbox>\n <cps-checkbox\n (valueChanged)=\"regenerateCron()\"\n [disabled]=\"disabled\"\n label=\"Tuesday\"\n [(ngModel)]=\"state.weekly.TUE\">\n </cps-checkbox>\n <cps-checkbox\n (valueChanged)=\"regenerateCron()\"\n [disabled]=\"disabled\"\n label=\"Wednesday\"\n [(ngModel)]=\"state.weekly.WED\">\n </cps-checkbox>\n <cps-checkbox\n (valueChanged)=\"regenerateCron()\"\n [disabled]=\"disabled\"\n label=\"Thursday\"\n [(ngModel)]=\"state.weekly.THU\">\n </cps-checkbox>\n <cps-checkbox\n (valueChanged)=\"regenerateCron()\"\n [disabled]=\"disabled\"\n label=\"Friday\"\n [(ngModel)]=\"state.weekly.FRI\">\n </cps-checkbox>\n <cps-checkbox\n (valueChanged)=\"regenerateCron()\"\n [disabled]=\"disabled\"\n label=\"Saturday\"\n [(ngModel)]=\"state.weekly.SAT\">\n </cps-checkbox>\n <cps-checkbox\n (valueChanged)=\"regenerateCron()\"\n [disabled]=\"disabled\"\n label=\"Sunday\"\n [(ngModel)]=\"state.weekly.SUN\">\n </cps-checkbox>\n </div>\n <div class=\"cps-scheduler-tab-pane-row\">\n at\n <cps-timepicker\n [disabled]=\"disabled\"\n [use24HourTime]=\"use24HourTime\"\n [mandatoryValue]=\"true\"\n [value]=\"formatTimeValue(state.weekly)\"\n [hideDetails]=\"true\"\n (valueChanged)=\"onTimeChanged($event, state.weekly)\">\n </cps-timepicker>\n </div>\n </div>\n\n <div *ngSwitchCase=\"'Monthly'\" class=\"cps-scheduler-tab-pane\">\n <cps-radio-group\n [(ngModel)]=\"state.monthly.subTab\"\n (valueChanged)=\"regenerateCron()\"\n [vertical]=\"true\">\n <cps-radio [option]=\"{ value: 'specificDay', disabled: disabled }\">\n <div\n class=\"cps-scheduler-tab-pane-row\"\n [ngClass]=\"{\n 'cps-scheduler-tab-pane-row-disabled':\n state.monthly.subTab !== 'specificDay'\n }\">\n On the\n <cps-select\n width=\"120px\"\n [disabled]=\"disabled || state.monthly.subTab !== 'specificDay'\"\n [returnObject]=\"false\"\n [hideDetails]=\"true\"\n (valueChanged)=\"regenerateCron()\"\n [(ngModel)]=\"state.monthly.specificDay.day\"\n [options]=\"selectOptions.monthDaysWithLasts\"\n class=\"cps-scheduler-select-control\">\n </cps-select>\n of every\n <cps-select\n width=\"70px\"\n [disabled]=\"disabled || state.monthly.subTab !== 'specificDay'\"\n [returnObject]=\"false\"\n [hideDetails]=\"true\"\n (valueChanged)=\"regenerateCron()\"\n [(ngModel)]=\"state.monthly.specificDay.months\"\n [options]=\"selectOptions.monthsNumeric\"\n class=\"cps-scheduler-select-control\">\n </cps-select>\n month(s) at\n <cps-timepicker\n [disabled]=\"disabled || state.monthly.subTab !== 'specificDay'\"\n [use24HourTime]=\"use24HourTime\"\n [mandatoryValue]=\"true\"\n [value]=\"formatTimeValue(state.monthly.specificDay)\"\n [hideDetails]=\"true\"\n (valueChanged)=\"onTimeChanged($event, state.monthly.specificDay)\">\n </cps-timepicker>\n <cps-checkbox\n (valueChanged)=\"regenerateCron()\"\n [disabled]=\"disabled || state.monthly.subTab !== 'specificDay'\"\n label=\"During the nearest weekday\"\n [(ngModel)]=\"state.monthly.runOnWeekday\"\n class=\"cps-scheduler-nearest-weekday-checkbox\">\n </cps-checkbox>\n </div>\n </cps-radio>\n\n <cps-radio [option]=\"{ value: 'specificWeekDay', disabled: disabled }\">\n <div\n class=\"cps-scheduler-tab-pane-row\"\n [ngClass]=\"{\n 'cps-scheduler-tab-pane-row-disabled':\n state.monthly.subTab !== 'specificWeekDay'\n }\">\n On the\n <cps-select\n width=\"106px\"\n [disabled]=\"disabled || state.monthly.subTab !== 'specificWeekDay'\"\n [returnObject]=\"false\"\n [hideDetails]=\"true\"\n (valueChanged)=\"regenerateCron()\"\n [(ngModel)]=\"state.monthly.specificWeekDay.monthWeek\"\n [options]=\"selectOptions.monthWeeks\"\n class=\"cps-scheduler-select-control\">\n </cps-select>\n <cps-select\n width=\"130px\"\n [disabled]=\"disabled || state.monthly.subTab !== 'specificWeekDay'\"\n [returnObject]=\"false\"\n [hideDetails]=\"true\"\n (valueChanged)=\"regenerateCron()\"\n [(ngModel)]=\"state.monthly.specificWeekDay.day\"\n [options]=\"selectOptions.days\"\n class=\"cps-scheduler-select-control\">\n </cps-select>\n of every\n <cps-select\n width=\"90px\"\n [disabled]=\"disabled || state.monthly.subTab !== 'specificWeekDay'\"\n [returnObject]=\"false\"\n [hideDetails]=\"true\"\n (valueChanged)=\"regenerateCron()\"\n [(ngModel)]=\"state.monthly.specificWeekDay.months\"\n [options]=\"selectOptions.monthsNumeric\"\n class=\"cps-scheduler-select-control\">\n </cps-select>\n month(s) starting in\n <cps-select\n width=\"120px\"\n [disabled]=\"disabled || state.monthly.subTab !== 'specificWeekDay'\"\n [returnObject]=\"false\"\n [hideDetails]=\"true\"\n (valueChanged)=\"regenerateCron()\"\n [(ngModel)]=\"state.monthly.specificWeekDay.startMonth\"\n [options]=\"selectOptions.months\"\n class=\"cps-scheduler-select-control\">\n </cps-select>\n at\n <cps-timepicker\n [disabled]=\"disabled || state.monthly.subTab !== 'specificWeekDay'\"\n [use24HourTime]=\"use24HourTime\"\n [mandatoryValue]=\"true\"\n [value]=\"formatTimeValue(state.monthly.specificWeekDay)\"\n [hideDetails]=\"true\"\n (valueChanged)=\"\n onTimeChanged($event, state.monthly.specificWeekDay)\n \">\n </cps-timepicker>\n </div>\n </cps-radio>\n </cps-radio-group>\n </div>\n\n <div *ngSwitchCase=\"'Yearly'\" class=\"cps-scheduler-tab-pane\">\n <cps-radio-group\n [(ngModel)]=\"state.yearly.subTab\"\n (valueChanged)=\"regenerateCron()\"\n [vertical]=\"true\">\n <cps-radio [option]=\"{ value: 'specificMonthDay', disabled: disabled }\">\n <div\n class=\"cps-scheduler-tab-pane-row\"\n [ngClass]=\"{\n 'cps-scheduler-tab-pane-row-disabled':\n state.yearly.subTab !== 'specificMonthDay'\n }\">\n Every\n <cps-select\n width=\"120px\"\n [disabled]=\"disabled || state.yearly.subTab !== 'specificMonthDay'\"\n [returnObject]=\"false\"\n [hideDetails]=\"true\"\n (valueChanged)=\"regenerateCron()\"\n [(ngModel)]=\"state.yearly.specificMonthDay.month\"\n [options]=\"selectOptions.months\"\n class=\"cps-scheduler-select-control\">\n </cps-select>\n on the\n <cps-select\n width=\"120px\"\n [disabled]=\"disabled || state.yearly.subTab !== 'specificMonthDay'\"\n [returnObject]=\"false\"\n [hideDetails]=\"true\"\n (valueChanged)=\"regenerateCron()\"\n [(ngModel)]=\"state.yearly.specificMonthDay.day\"\n [options]=\"selectOptions.monthDaysWithLasts\"\n class=\"cps-scheduler-select-control\">\n </cps-select>\n at\n <cps-timepicker\n [disabled]=\"disabled || state.yearly.subTab !== 'specificMonthDay'\"\n [use24HourTime]=\"use24HourTime\"\n [mandatoryValue]=\"true\"\n [value]=\"formatTimeValue(state.yearly.specificMonthDay)\"\n [hideDetails]=\"true\"\n (valueChanged)=\"\n onTimeChanged($event, state.yearly.specificMonthDay)\n \">\n </cps-timepicker>\n <cps-checkbox\n (valueChanged)=\"regenerateCron()\"\n [disabled]=\"disabled || state.yearly.subTab !== 'specificMonthDay'\"\n label=\"During the nearest weekday\"\n [(ngModel)]=\"state.yearly.runOnWeekday\"\n class=\"cps-scheduler-nearest-weekday-checkbox\">\n </cps-checkbox>\n </div>\n </cps-radio>\n\n <cps-radio [option]=\"{ value: 'specificMonthWeek', disabled: disabled }\">\n <div\n class=\"cps-scheduler-tab-pane-row\"\n [ngClass]=\"{\n 'cps-scheduler-tab-pane-row-disabled':\n state.yearly.subTab !== 'specificMonthWeek'\n }\">\n On the\n <cps-select\n width=\"106px\"\n [disabled]=\"disabled || state.yearly.subTab !== 'specificMonthWeek'\"\n [returnObject]=\"false\"\n [hideDetails]=\"true\"\n (valueChanged)=\"regenerateCron()\"\n [(ngModel)]=\"state.yearly.specificMonthWeek.monthWeek\"\n [options]=\"selectOptions.monthWeeks\"\n class=\"cps-scheduler-select-control\">\n </cps-select>\n <cps-select\n width=\"120px\"\n [disabled]=\"disabled || state.yearly.subTab !== 'specificMonthWeek'\"\n [returnObject]=\"false\"\n [hideDetails]=\"true\"\n (valueChanged)=\"regenerateCron()\"\n [(ngModel)]=\"state.yearly.specificMonthWeek.day\"\n [options]=\"selectOptions.days\"\n class=\"cps-scheduler-select-control\">\n </cps-select>\n of\n <cps-select\n width=\"120px\"\n [disabled]=\"disabled || state.yearly.subTab !== 'specificMonthWeek'\"\n [returnObject]=\"false\"\n [hideDetails]=\"true\"\n (valueChanged)=\"regenerateCron()\"\n [(ngModel)]=\"state.yearly.specificMonthWeek.month\"\n [options]=\"selectOptions.months\"\n class=\"cps-scheduler-select-control\">\n </cps-select>\n at\n <cps-timepicker\n [disabled]=\"disabled || state.yearly.subTab !== 'specificMonthWeek'\"\n [use24HourTime]=\"use24HourTime\"\n [mandatoryValue]=\"true\"\n [value]=\"formatTimeValue(state.yearly.specificMonthWeek)\"\n [hideDetails]=\"true\"\n (valueChanged)=\"\n onTimeChanged($event, state.yearly.specificMonthWeek)\n \">\n </cps-timepicker>\n </div>\n </cps-radio>\n </cps-radio-group>\n </div>\n\n <div *ngSwitchCase=\"'Advanced'\">\n <form [formGroup]=\"form\">\n <cps-input\n label=\"\"\n [disabled]=\"disabled\"\n width=\"500px\"\n placeholder=\"Please enter\"\n formControlName=\"advanced\"\n (valueChanged)=\"regenerateCron()\">\n </cps-input>\n </form>\n </div>\n <div class=\"cps-scheduler-time-zone\" *ngIf=\"cron && showTimeZone\">\n <cps-autocomplete\n label=\"Time zone\"\n [(ngModel)]=\"timeZone\"\n (valueChanged)=\"onTimeZoneChanged($event)\"\n [returnObject]=\"false\"\n width=\"300\"\n [options]=\"timeZoneOptions\"></cps-autocomplete>\n </div>\n</div>\n", styles: [":host .cps-scheduler-selector{margin-bottom:24px}:host .cps-scheduler-container{margin-top:10px;margin-left:16px}:host .cps-scheduler-container .cps-scheduler-select-control{margin-left:8px;margin-right:8px}:host .cps-scheduler-container .cps-scheduler-days-checkbox-group{max-width:700px;display:grid;grid-template-columns:repeat(auto-fill,minmax(150px,1fr));grid-template-rows:1fr 1fr;grid-gap:20px;margin-bottom:16px}:host .cps-scheduler-container .cps-scheduler-tab-pane{margin-bottom:28px}:host .cps-scheduler-container .cps-scheduler-tab-pane cps-radio-group ::ng-deep .cps-radio-group-content{margin-left:0!important}:host .cps-scheduler-container .cps-scheduler-tab-pane .cps-scheduler-tab-pane-row{display:flex;align-items:center}:host .cps-scheduler-container .cps-scheduler-tab-pane .cps-scheduler-tab-pane-row-disabled{color:var(--cps-color-text-light)}:host .cps-scheduler-container .cps-scheduler-tab-pane .cps-scheduler-nearest-weekday-checkbox{margin-left:16px}:host .cps-scheduler-container .cps-scheduler-tab-pane cps-timepicker{margin-left:8px}:host .cps-scheduler-container-disabled{color:var(--cps-color-text-light)}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i2.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i2.NgSwitch, selector: "[ngSwitch]", inputs: ["ngSwitch"] }, { kind: "directive", type: i2.NgSwitchCase, selector: "[ngSwitchCase]", inputs: ["ngSwitchCase"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i1.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i1.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "component", type: CpsButtonToggleComponent, selector: "cps-button-toggle", inputs: ["label", "options", "multiple", "disabled", "mandatory", "equalWidths", "optionTooltipPosition", "infoTooltip", "infoTooltipClass", "infoTooltipMaxWidth", "infoTooltipPersistent", "infoTooltipPosition", "value"], outputs: ["valueChanged"] }, { kind: "component", type: CpsSelectComponent, selector: "cps-select", inputs: ["label", "placeholder", "hint", "returnObject", "multiple", "disabled", "width", "selectAll", "chips", "closableChips", "clearable", "openOnClear", "options", "keepInitialOrder", "optionLabel", "optionValue", "optionInfo", "hideDetails", "persistentClear", "prefixIcon", "prefixIconSize", "loading", "virtualScroll", "numToleratedItems", "infoTooltip", "infoTooltipClass", "infoTooltipMaxWidth", "infoTooltipPersistent", "infoTooltipPosition", "optionsClass", "appearance", "value"], outputs: ["valueChanged"] }, { kind: "component", type: CpsRadioGroupComponent, selector: "cps-radio-group", inputs: ["options", "groupLabel", "vertical", "disabled", "infoTooltip", "infoTooltipClass", "infoTooltipMaxWidth", "infoTooltipPersistent", "infoTooltipPosition", "value"], outputs: ["valueChanged"] }, { kind: "component", type: CpsRadioComponent, selector: "cps-radio", inputs: ["option"] }, { kind: "component", type: CpsCheckboxComponent, selector: "cps-checkbox", inputs: ["label", "disabled", "infoTooltip", "infoTooltipClass", "infoTooltipMaxWidth", "infoTooltipPersistent", "infoTooltipPosition", "icon", "iconColor", "value"], outputs: ["valueChanged"] }, { kind: "component", type: CpsInputComponent, selector: "cps-input", inputs: ["label", "hint", "placeholder", "disabled", "readonly", "width", "type", "loading", "clearable", "prefixIcon", "prefixIconClickable", "prefixIconSize", "prefixText", "hideDetails", "persistentClear", "error", "infoTooltip", "infoTooltipClass", "infoTooltipMaxWidth", "infoTooltipPersistent", "infoTooltipPosition", "appearance", "valueToDisplay", "value"], outputs: ["valueChanged", "focused", "prefixIconClicked", "blurred", "cleared", "enterClicked"] }, { kind: "component", type: CpsTimepickerComponent, selector: "cps-timepicker", inputs: ["label", "disabled", "use24HourTime", "withSeconds", "hint", "hideDetails", "infoTooltip", "infoTooltipClass", "infoTooltipMaxWidth", "infoTooltipPersistent", "infoTooltipPosition", "mandatoryValue", "value"], outputs: ["valueChanged"] }, { kind: "component", type: CpsAutocompleteComponent, selector: "cps-autocomplete", inputs: ["label", "placeholder", "hint", "returnObject", "multiple", "disabled", "width", "selectAll", "showChevron", "withOptionsAliases", "useOptionsAliasesWhenNoMatch", "optionAlias", "chips", "closableChips", "clearable", "openOnClear", "options", "keepInitialOrder", "optionLabel", "optionValue", "optionInfo", "hideDetails", "persistentClear", "prefixIcon", "prefixIconSize", "loading", "emptyMessage", "showEmptyMessage", "virtualScroll", "numToleratedItems", "externalError", "infoTooltip", "infoTooltipClass", "infoTooltipMaxWidth", "infoTooltipPersistent", "infoTooltipPosition", "appearance", "emptyOptionIndex", "value"], outputs: ["valueChanged", "blurred"] }] }); }
|
|
631
|
+
}
|
|
632
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.1.2", ngImport: i0, type: CpsSchedulerComponent, decorators: [{
|
|
633
|
+
type: Component,
|
|
634
|
+
args: [{ selector: 'cps-scheduler', standalone: true, imports: [
|
|
635
|
+
CommonModule,
|
|
636
|
+
FormsModule,
|
|
637
|
+
ReactiveFormsModule,
|
|
638
|
+
CpsButtonToggleComponent,
|
|
639
|
+
CpsSelectComponent,
|
|
640
|
+
CpsRadioGroupComponent,
|
|
641
|
+
CpsRadioComponent,
|
|
642
|
+
CpsCheckboxComponent,
|
|
643
|
+
CpsInputComponent,
|
|
644
|
+
CpsTimepickerComponent,
|
|
645
|
+
CpsAutocompleteComponent
|
|
646
|
+
], template: "<div class=\"cps-scheduler-selector\">\n <cps-button-toggle\n [options]=\"scheduleTypes\"\n [disabled]=\"disabled\"\n [label]=\"label\"\n [infoTooltip]=\"infoTooltip\"\n [(ngModel)]=\"activeScheduleType\"\n (ngModelChange)=\"setActiveScheduleType($event)\">\n </cps-button-toggle>\n</div>\n\n<div\n [ngSwitch]=\"activeScheduleType\"\n class=\"cps-scheduler-container\"\n [ngClass]=\"{ 'cps-scheduler-container-disabled': disabled }\">\n <div *ngSwitchCase=\"'Not set'\" class=\"cps-scheduler-tab-pane\"></div>\n\n <div *ngSwitchCase=\"'Minutes'\" class=\"cps-scheduler-tab-pane\">\n <div class=\"cps-scheduler-tab-pane-row\">\n Every\n <cps-select\n width=\"70px\"\n [disabled]=\"disabled\"\n [returnObject]=\"false\"\n [hideDetails]=\"true\"\n (valueChanged)=\"regenerateCron()\"\n [(ngModel)]=\"state.minutes.minutes\"\n [options]=\"selectOptions.minutes\"\n class=\"cps-scheduler-select-control\">\n </cps-select>\n minute(s)\n </div>\n </div>\n\n <div *ngSwitchCase=\"'Hourly'\" class=\"cps-scheduler-tab-pane\">\n <div class=\"cps-scheduler-tab-pane-row\">\n Every\n <cps-select\n width=\"70px\"\n [disabled]=\"disabled\"\n [returnObject]=\"false\"\n [hideDetails]=\"true\"\n (valueChanged)=\"regenerateCron()\"\n [(ngModel)]=\"state.hourly.hours\"\n [options]=\"selectOptions.hours\"\n class=\"cps-scheduler-select-control\">\n </cps-select>\n hour(s) on minute\n <cps-select\n width=\"70px\"\n [disabled]=\"disabled\"\n [returnObject]=\"false\"\n [hideDetails]=\"true\"\n (valueChanged)=\"regenerateCron()\"\n [(ngModel)]=\"state.hourly.minutes\"\n [options]=\"selectOptions.fullMinutes\"\n class=\"cps-scheduler-select-control\">\n </cps-select>\n </div>\n </div>\n\n <div *ngSwitchCase=\"'Daily'\" class=\"cps-scheduler-tab-pane\">\n <cps-radio-group\n [(ngModel)]=\"state.daily.subTab\"\n (valueChanged)=\"regenerateCron()\"\n [vertical]=\"true\">\n <cps-radio [option]=\"{ value: 'everyDays', disabled: disabled }\">\n <div\n class=\"cps-scheduler-tab-pane-row\"\n [ngClass]=\"{\n 'cps-scheduler-tab-pane-row-disabled':\n state.daily.subTab !== 'everyDays'\n }\">\n Every\n <cps-select\n width=\"70px\"\n [disabled]=\"disabled || state.daily.subTab !== 'everyDays'\"\n [returnObject]=\"false\"\n [hideDetails]=\"true\"\n (valueChanged)=\"regenerateCron()\"\n [(ngModel)]=\"state.daily.everyDays.days\"\n [options]=\"selectOptions.monthDays\"\n class=\"cps-scheduler-select-control\">\n </cps-select>\n day(s) at\n <cps-timepicker\n [disabled]=\"disabled || state.daily.subTab !== 'everyDays'\"\n [use24HourTime]=\"use24HourTime\"\n [mandatoryValue]=\"true\"\n [value]=\"formatTimeValue(state.daily.everyDays)\"\n [hideDetails]=\"true\"\n (valueChanged)=\"onTimeChanged($event, state.daily.everyDays)\">\n </cps-timepicker>\n </div>\n </cps-radio>\n <cps-radio [option]=\"{ value: 'everyWeekDay', disabled: disabled }\">\n <div\n class=\"cps-scheduler-tab-pane-row\"\n [ngClass]=\"{\n 'cps-scheduler-tab-pane-row-disabled':\n state.daily.subTab !== 'everyWeekDay'\n }\">\n Every working day at\n <cps-timepicker\n [disabled]=\"disabled || state.daily.subTab !== 'everyWeekDay'\"\n [use24HourTime]=\"use24HourTime\"\n [mandatoryValue]=\"true\"\n [value]=\"formatTimeValue(state.daily.everyWeekDay)\"\n [hideDetails]=\"true\"\n (valueChanged)=\"onTimeChanged($event, state.daily.everyWeekDay)\">\n </cps-timepicker>\n </div>\n </cps-radio>\n </cps-radio-group>\n </div>\n\n <div *ngSwitchCase=\"'Weekly'\" class=\"cps-scheduler-tab-pane\">\n <div class=\"cps-scheduler-days-checkbox-group\">\n <cps-checkbox\n (valueChanged)=\"regenerateCron()\"\n [disabled]=\"disabled\"\n label=\"Monday\"\n [(ngModel)]=\"state.weekly.MON\">\n </cps-checkbox>\n <cps-checkbox\n (valueChanged)=\"regenerateCron()\"\n [disabled]=\"disabled\"\n label=\"Tuesday\"\n [(ngModel)]=\"state.weekly.TUE\">\n </cps-checkbox>\n <cps-checkbox\n (valueChanged)=\"regenerateCron()\"\n [disabled]=\"disabled\"\n label=\"Wednesday\"\n [(ngModel)]=\"state.weekly.WED\">\n </cps-checkbox>\n <cps-checkbox\n (valueChanged)=\"regenerateCron()\"\n [disabled]=\"disabled\"\n label=\"Thursday\"\n [(ngModel)]=\"state.weekly.THU\">\n </cps-checkbox>\n <cps-checkbox\n (valueChanged)=\"regenerateCron()\"\n [disabled]=\"disabled\"\n label=\"Friday\"\n [(ngModel)]=\"state.weekly.FRI\">\n </cps-checkbox>\n <cps-checkbox\n (valueChanged)=\"regenerateCron()\"\n [disabled]=\"disabled\"\n label=\"Saturday\"\n [(ngModel)]=\"state.weekly.SAT\">\n </cps-checkbox>\n <cps-checkbox\n (valueChanged)=\"regenerateCron()\"\n [disabled]=\"disabled\"\n label=\"Sunday\"\n [(ngModel)]=\"state.weekly.SUN\">\n </cps-checkbox>\n </div>\n <div class=\"cps-scheduler-tab-pane-row\">\n at\n <cps-timepicker\n [disabled]=\"disabled\"\n [use24HourTime]=\"use24HourTime\"\n [mandatoryValue]=\"true\"\n [value]=\"formatTimeValue(state.weekly)\"\n [hideDetails]=\"true\"\n (valueChanged)=\"onTimeChanged($event, state.weekly)\">\n </cps-timepicker>\n </div>\n </div>\n\n <div *ngSwitchCase=\"'Monthly'\" class=\"cps-scheduler-tab-pane\">\n <cps-radio-group\n [(ngModel)]=\"state.monthly.subTab\"\n (valueChanged)=\"regenerateCron()\"\n [vertical]=\"true\">\n <cps-radio [option]=\"{ value: 'specificDay', disabled: disabled }\">\n <div\n class=\"cps-scheduler-tab-pane-row\"\n [ngClass]=\"{\n 'cps-scheduler-tab-pane-row-disabled':\n state.monthly.subTab !== 'specificDay'\n }\">\n On the\n <cps-select\n width=\"120px\"\n [disabled]=\"disabled || state.monthly.subTab !== 'specificDay'\"\n [returnObject]=\"false\"\n [hideDetails]=\"true\"\n (valueChanged)=\"regenerateCron()\"\n [(ngModel)]=\"state.monthly.specificDay.day\"\n [options]=\"selectOptions.monthDaysWithLasts\"\n class=\"cps-scheduler-select-control\">\n </cps-select>\n of every\n <cps-select\n width=\"70px\"\n [disabled]=\"disabled || state.monthly.subTab !== 'specificDay'\"\n [returnObject]=\"false\"\n [hideDetails]=\"true\"\n (valueChanged)=\"regenerateCron()\"\n [(ngModel)]=\"state.monthly.specificDay.months\"\n [options]=\"selectOptions.monthsNumeric\"\n class=\"cps-scheduler-select-control\">\n </cps-select>\n month(s) at\n <cps-timepicker\n [disabled]=\"disabled || state.monthly.subTab !== 'specificDay'\"\n [use24HourTime]=\"use24HourTime\"\n [mandatoryValue]=\"true\"\n [value]=\"formatTimeValue(state.monthly.specificDay)\"\n [hideDetails]=\"true\"\n (valueChanged)=\"onTimeChanged($event, state.monthly.specificDay)\">\n </cps-timepicker>\n <cps-checkbox\n (valueChanged)=\"regenerateCron()\"\n [disabled]=\"disabled || state.monthly.subTab !== 'specificDay'\"\n label=\"During the nearest weekday\"\n [(ngModel)]=\"state.monthly.runOnWeekday\"\n class=\"cps-scheduler-nearest-weekday-checkbox\">\n </cps-checkbox>\n </div>\n </cps-radio>\n\n <cps-radio [option]=\"{ value: 'specificWeekDay', disabled: disabled }\">\n <div\n class=\"cps-scheduler-tab-pane-row\"\n [ngClass]=\"{\n 'cps-scheduler-tab-pane-row-disabled':\n state.monthly.subTab !== 'specificWeekDay'\n }\">\n On the\n <cps-select\n width=\"106px\"\n [disabled]=\"disabled || state.monthly.subTab !== 'specificWeekDay'\"\n [returnObject]=\"false\"\n [hideDetails]=\"true\"\n (valueChanged)=\"regenerateCron()\"\n [(ngModel)]=\"state.monthly.specificWeekDay.monthWeek\"\n [options]=\"selectOptions.monthWeeks\"\n class=\"cps-scheduler-select-control\">\n </cps-select>\n <cps-select\n width=\"130px\"\n [disabled]=\"disabled || state.monthly.subTab !== 'specificWeekDay'\"\n [returnObject]=\"false\"\n [hideDetails]=\"true\"\n (valueChanged)=\"regenerateCron()\"\n [(ngModel)]=\"state.monthly.specificWeekDay.day\"\n [options]=\"selectOptions.days\"\n class=\"cps-scheduler-select-control\">\n </cps-select>\n of every\n <cps-select\n width=\"90px\"\n [disabled]=\"disabled || state.monthly.subTab !== 'specificWeekDay'\"\n [returnObject]=\"false\"\n [hideDetails]=\"true\"\n (valueChanged)=\"regenerateCron()\"\n [(ngModel)]=\"state.monthly.specificWeekDay.months\"\n [options]=\"selectOptions.monthsNumeric\"\n class=\"cps-scheduler-select-control\">\n </cps-select>\n month(s) starting in\n <cps-select\n width=\"120px\"\n [disabled]=\"disabled || state.monthly.subTab !== 'specificWeekDay'\"\n [returnObject]=\"false\"\n [hideDetails]=\"true\"\n (valueChanged)=\"regenerateCron()\"\n [(ngModel)]=\"state.monthly.specificWeekDay.startMonth\"\n [options]=\"selectOptions.months\"\n class=\"cps-scheduler-select-control\">\n </cps-select>\n at\n <cps-timepicker\n [disabled]=\"disabled || state.monthly.subTab !== 'specificWeekDay'\"\n [use24HourTime]=\"use24HourTime\"\n [mandatoryValue]=\"true\"\n [value]=\"formatTimeValue(state.monthly.specificWeekDay)\"\n [hideDetails]=\"true\"\n (valueChanged)=\"\n onTimeChanged($event, state.monthly.specificWeekDay)\n \">\n </cps-timepicker>\n </div>\n </cps-radio>\n </cps-radio-group>\n </div>\n\n <div *ngSwitchCase=\"'Yearly'\" class=\"cps-scheduler-tab-pane\">\n <cps-radio-group\n [(ngModel)]=\"state.yearly.subTab\"\n (valueChanged)=\"regenerateCron()\"\n [vertical]=\"true\">\n <cps-radio [option]=\"{ value: 'specificMonthDay', disabled: disabled }\">\n <div\n class=\"cps-scheduler-tab-pane-row\"\n [ngClass]=\"{\n 'cps-scheduler-tab-pane-row-disabled':\n state.yearly.subTab !== 'specificMonthDay'\n }\">\n Every\n <cps-select\n width=\"120px\"\n [disabled]=\"disabled || state.yearly.subTab !== 'specificMonthDay'\"\n [returnObject]=\"false\"\n [hideDetails]=\"true\"\n (valueChanged)=\"regenerateCron()\"\n [(ngModel)]=\"state.yearly.specificMonthDay.month\"\n [options]=\"selectOptions.months\"\n class=\"cps-scheduler-select-control\">\n </cps-select>\n on the\n <cps-select\n width=\"120px\"\n [disabled]=\"disabled || state.yearly.subTab !== 'specificMonthDay'\"\n [returnObject]=\"false\"\n [hideDetails]=\"true\"\n (valueChanged)=\"regenerateCron()\"\n [(ngModel)]=\"state.yearly.specificMonthDay.day\"\n [options]=\"selectOptions.monthDaysWithLasts\"\n class=\"cps-scheduler-select-control\">\n </cps-select>\n at\n <cps-timepicker\n [disabled]=\"disabled || state.yearly.subTab !== 'specificMonthDay'\"\n [use24HourTime]=\"use24HourTime\"\n [mandatoryValue]=\"true\"\n [value]=\"formatTimeValue(state.yearly.specificMonthDay)\"\n [hideDetails]=\"true\"\n (valueChanged)=\"\n onTimeChanged($event, state.yearly.specificMonthDay)\n \">\n </cps-timepicker>\n <cps-checkbox\n (valueChanged)=\"regenerateCron()\"\n [disabled]=\"disabled || state.yearly.subTab !== 'specificMonthDay'\"\n label=\"During the nearest weekday\"\n [(ngModel)]=\"state.yearly.runOnWeekday\"\n class=\"cps-scheduler-nearest-weekday-checkbox\">\n </cps-checkbox>\n </div>\n </cps-radio>\n\n <cps-radio [option]=\"{ value: 'specificMonthWeek', disabled: disabled }\">\n <div\n class=\"cps-scheduler-tab-pane-row\"\n [ngClass]=\"{\n 'cps-scheduler-tab-pane-row-disabled':\n state.yearly.subTab !== 'specificMonthWeek'\n }\">\n On the\n <cps-select\n width=\"106px\"\n [disabled]=\"disabled || state.yearly.subTab !== 'specificMonthWeek'\"\n [returnObject]=\"false\"\n [hideDetails]=\"true\"\n (valueChanged)=\"regenerateCron()\"\n [(ngModel)]=\"state.yearly.specificMonthWeek.monthWeek\"\n [options]=\"selectOptions.monthWeeks\"\n class=\"cps-scheduler-select-control\">\n </cps-select>\n <cps-select\n width=\"120px\"\n [disabled]=\"disabled || state.yearly.subTab !== 'specificMonthWeek'\"\n [returnObject]=\"false\"\n [hideDetails]=\"true\"\n (valueChanged)=\"regenerateCron()\"\n [(ngModel)]=\"state.yearly.specificMonthWeek.day\"\n [options]=\"selectOptions.days\"\n class=\"cps-scheduler-select-control\">\n </cps-select>\n of\n <cps-select\n width=\"120px\"\n [disabled]=\"disabled || state.yearly.subTab !== 'specificMonthWeek'\"\n [returnObject]=\"false\"\n [hideDetails]=\"true\"\n (valueChanged)=\"regenerateCron()\"\n [(ngModel)]=\"state.yearly.specificMonthWeek.month\"\n [options]=\"selectOptions.months\"\n class=\"cps-scheduler-select-control\">\n </cps-select>\n at\n <cps-timepicker\n [disabled]=\"disabled || state.yearly.subTab !== 'specificMonthWeek'\"\n [use24HourTime]=\"use24HourTime\"\n [mandatoryValue]=\"true\"\n [value]=\"formatTimeValue(state.yearly.specificMonthWeek)\"\n [hideDetails]=\"true\"\n (valueChanged)=\"\n onTimeChanged($event, state.yearly.specificMonthWeek)\n \">\n </cps-timepicker>\n </div>\n </cps-radio>\n </cps-radio-group>\n </div>\n\n <div *ngSwitchCase=\"'Advanced'\">\n <form [formGroup]=\"form\">\n <cps-input\n label=\"\"\n [disabled]=\"disabled\"\n width=\"500px\"\n placeholder=\"Please enter\"\n formControlName=\"advanced\"\n (valueChanged)=\"regenerateCron()\">\n </cps-input>\n </form>\n </div>\n <div class=\"cps-scheduler-time-zone\" *ngIf=\"cron && showTimeZone\">\n <cps-autocomplete\n label=\"Time zone\"\n [(ngModel)]=\"timeZone\"\n (valueChanged)=\"onTimeZoneChanged($event)\"\n [returnObject]=\"false\"\n width=\"300\"\n [options]=\"timeZoneOptions\"></cps-autocomplete>\n </div>\n</div>\n", styles: [":host .cps-scheduler-selector{margin-bottom:24px}:host .cps-scheduler-container{margin-top:10px;margin-left:16px}:host .cps-scheduler-container .cps-scheduler-select-control{margin-left:8px;margin-right:8px}:host .cps-scheduler-container .cps-scheduler-days-checkbox-group{max-width:700px;display:grid;grid-template-columns:repeat(auto-fill,minmax(150px,1fr));grid-template-rows:1fr 1fr;grid-gap:20px;margin-bottom:16px}:host .cps-scheduler-container .cps-scheduler-tab-pane{margin-bottom:28px}:host .cps-scheduler-container .cps-scheduler-tab-pane cps-radio-group ::ng-deep .cps-radio-group-content{margin-left:0!important}:host .cps-scheduler-container .cps-scheduler-tab-pane .cps-scheduler-tab-pane-row{display:flex;align-items:center}:host .cps-scheduler-container .cps-scheduler-tab-pane .cps-scheduler-tab-pane-row-disabled{color:var(--cps-color-text-light)}:host .cps-scheduler-container .cps-scheduler-tab-pane .cps-scheduler-nearest-weekday-checkbox{margin-left:16px}:host .cps-scheduler-container .cps-scheduler-tab-pane cps-timepicker{margin-left:8px}:host .cps-scheduler-container-disabled{color:var(--cps-color-text-light)}\n"] }]
|
|
647
|
+
}], ctorParameters: () => [{ type: i1.UntypedFormBuilder }, { type: i0.ChangeDetectorRef }], propDecorators: { label: [{
|
|
648
|
+
type: Input
|
|
649
|
+
}], cron: [{
|
|
650
|
+
type: Input
|
|
651
|
+
}], timeZone: [{
|
|
652
|
+
type: Input
|
|
653
|
+
}], showNotSet: [{
|
|
654
|
+
type: Input
|
|
655
|
+
}], showAdvanced: [{
|
|
656
|
+
type: Input
|
|
657
|
+
}], showTimeZone: [{
|
|
658
|
+
type: Input
|
|
659
|
+
}], defaultTime: [{
|
|
660
|
+
type: Input
|
|
661
|
+
}], use24HourTime: [{
|
|
662
|
+
type: Input
|
|
663
|
+
}], disabled: [{
|
|
664
|
+
type: Input
|
|
665
|
+
}], infoTooltip: [{
|
|
666
|
+
type: Input
|
|
667
|
+
}], cronChange: [{
|
|
668
|
+
type: Output
|
|
669
|
+
}], timeZoneChange: [{
|
|
670
|
+
type: Output
|
|
671
|
+
}] } });
|
|
672
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3BzLXNjaGVkdWxlci5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9jcHMtdWkta2l0L3NyYy9saWIvY29tcG9uZW50cy9jcHMtc2NoZWR1bGVyL2Nwcy1zY2hlZHVsZXIuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvY3BzLXVpLWtpdC9zcmMvbGliL2NvbXBvbmVudHMvY3BzLXNjaGVkdWxlci9jcHMtc2NoZWR1bGVyLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTCxTQUFTLEVBR1QsS0FBSyxFQUNMLE1BQU0sRUFDTixZQUFZLEVBR2IsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQy9DLE9BQU8sRUFFTCxXQUFXLEVBQ1gsbUJBQW1CLEVBR25CLFVBQVUsRUFDWCxNQUFNLGdCQUFnQixDQUFDO0FBQ3hCLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUNsRCxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxvQ0FBb0MsQ0FBQztBQUN4RSxPQUFPLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSw4Q0FBOEMsQ0FBQztBQUN0RixPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxrREFBa0QsQ0FBQztBQUNyRixPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSx3Q0FBd0MsQ0FBQztBQUM5RSxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxrQ0FBa0MsQ0FBQztBQUNyRSxPQUFPLEVBQUUsd0JBQXdCLEVBQUUsTUFBTSxnREFBZ0QsQ0FBQztBQUMxRixPQUFPLEVBQ0wsd0JBQXdCLEVBRXpCLE1BQU0sa0RBQWtELENBQUM7QUFDMUQsT0FBTyxFQUNMLHNCQUFzQixFQUV2QixNQUFNLDRDQUE0QyxDQUFDOzs7O0FBRXBELE1BQU0sSUFBSSxHQUFHO0lBQ1gsR0FBRyxFQUFFLFFBQVE7SUFDYixHQUFHLEVBQUUsU0FBUztJQUNkLEdBQUcsRUFBRSxXQUFXO0lBQ2hCLEdBQUcsRUFBRSxVQUFVO0lBQ2YsR0FBRyxFQUFFLFFBQVE7SUFDYixHQUFHLEVBQUUsVUFBVTtJQUNmLEdBQUcsRUFBRSxRQUFRO0NBQ2QsQ0FBQztBQUVGLE1BQU0sVUFBVSxHQUFHO0lBQ2pCLElBQUksRUFBRSxPQUFPO0lBQ2IsSUFBSSxFQUFFLFFBQVE7SUFDZCxJQUFJLEVBQUUsT0FBTztJQUNiLElBQUksRUFBRSxRQUFRO0lBQ2QsSUFBSSxFQUFFLE9BQU87SUFDYixDQUFDLEVBQUUsTUFBTTtDQUNWLENBQUM7QUFFRixJQUFLLE1BYUo7QUFiRCxXQUFLLE1BQU07SUFDVCx5Q0FBVyxDQUFBO0lBQ1gsMkNBQVEsQ0FBQTtJQUNSLHFDQUFLLENBQUE7SUFDTCxxQ0FBSyxDQUFBO0lBQ0wsaUNBQUcsQ0FBQTtJQUNILG1DQUFJLENBQUE7SUFDSixtQ0FBSSxDQUFBO0lBQ0osdUNBQU0sQ0FBQTtJQUNOLDZDQUFTLENBQUE7SUFDVCwwQ0FBTyxDQUFBO0lBQ1AsNENBQVEsQ0FBQTtJQUNSLDRDQUFRLENBQUE7QUFDVixDQUFDLEVBYkksTUFBTSxLQUFOLE1BQU0sUUFhVjtBQUVEOzs7R0FHRztBQW9CSCxNQUFNLE9BQU8scUJBQXFCO0lBK0ZoQyxrREFBa0Q7SUFDbEQsWUFDVSxHQUF1QixFQUN2QixJQUF1QjtRQUR2QixRQUFHLEdBQUgsR0FBRyxDQUFvQjtRQUN2QixTQUFJLEdBQUosSUFBSSxDQUFtQjtRQWpHakM7OztXQUdHO1FBQ00sVUFBSyxHQUFHLEVBQUUsQ0FBQztRQUVwQjs7O1dBR0c7UUFDTSxTQUFJLEdBQUcsRUFBRSxDQUFDO1FBRW5COzs7V0FHRztRQUNNLGFBQVEsR0FBRyxJQUFJLENBQUMsY0FBYyxFQUFFLENBQUMsZUFBZSxFQUFFLENBQUMsUUFBUSxJQUFJLEtBQUssQ0FBQztRQUU5RTs7O1dBR0c7UUFDTSxlQUFVLEdBQUcsSUFBSSxDQUFDO1FBRTNCOzs7V0FHRztRQUNNLGlCQUFZLEdBQUcsSUFBSSxDQUFDO1FBRTdCOzs7V0FHRztRQUNNLGlCQUFZLEdBQUcsS0FBSyxDQUFDO1FBRTlCOzs7V0FHRztRQUNNLGdCQUFXLEdBQUcsT0FBTyxDQUFDO1FBRS9COzs7V0FHRztRQUNNLGtCQUFhLEdBQUcsSUFBSSxDQUFDO1FBRTlCOzs7V0FHRztRQUNNLGFBQVEsR0FBRyxLQUFLLENBQUM7UUFFMUI7OztXQUdHO1FBQ00sZ0JBQVcsR0FBRyxFQUFFLENBQUM7UUFFMUI7Ozs7V0FJRztRQUNPLGVBQVUsR0FBRyxJQUFJLFlBQVksRUFBVSxDQUFDO1FBRWxEOzs7O1dBSUc7UUFDTyxtQkFBYyxHQUFHLElBQUksWUFBWSxFQUFVLENBQUM7UUFFdEQsa0JBQWEsR0FBNEI7WUFDdkMsRUFBRSxLQUFLLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBRSxTQUFTLEVBQUU7WUFDdEMsRUFBRSxLQUFLLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBRSxTQUFTLEVBQUU7WUFDdEMsRUFBRSxLQUFLLEVBQUUsUUFBUSxFQUFFLEtBQUssRUFBRSxRQUFRLEVBQUU7WUFDcEMsRUFBRSxLQUFLLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxPQUFPLEVBQUU7WUFDbEMsRUFBRSxLQUFLLEVBQUUsUUFBUSxFQUFFLEtBQUssRUFBRSxRQUFRLEVBQUU7WUFDcEMsRUFBRSxLQUFLLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBRSxTQUFTLEVBQUU7WUFDdEMsRUFBRSxLQUFLLEVBQUUsUUFBUSxFQUFFLEtBQUssRUFBRSxRQUFRLEVBQUU7WUFDcEMsRUFBRSxLQUFLLEVBQUUsVUFBVSxFQUFFLEtBQUssRUFBRSxVQUFVLEVBQUU7U0FDekMsQ0FBQztRQUVGLHVCQUFrQixHQUFHLFNBQVMsQ0FBQztRQUMvQixrQkFBYSxHQUFHLElBQUksQ0FBQyxpQkFBaUIsRUFBRSxDQUFDO1FBQ3pDLG9CQUFlLEdBQUcsU0FBUyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFLEtBQUssRUFBRSxFQUFFLEVBQUUsS0FBSyxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQztRQUk1RCxhQUFRLEdBQUcsS0FBSyxDQUFDO1FBQ2pCLG9CQUFlLEdBQUcsaUJBQWlCLENBQUM7SUFNekMsQ0FBQztJQUVKLFFBQVE7UUFDTixJQUFJLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDO1FBRXJDLElBQUksQ0FBQyxJQUFJLENBQUMsWUFBWSxFQUFFLENBQUM7WUFDdkIsSUFBSSxDQUFDLGFBQWEsQ0FBQyxHQUFHLEVBQUUsQ0FBQztRQUMzQixDQUFDO1FBRUQsSUFBSSxDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztZQUNyQixJQUFJLENBQUMsYUFBYSxDQUFDLEtBQUssRUFBRSxDQUFDO1lBQzNCLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSTtnQkFBRSxJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQyxlQUFlLENBQUM7UUFDbkQsQ0FBQztRQUVELElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7UUFFbkMsSUFBSSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQztZQUN6QixRQUFRLEVBQUU7Z0JBQ1IsSUFBSSxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsVUFBVSxJQUFJLEVBQUU7Z0JBQ3BDLENBQUMsSUFBSSxDQUFDLHFCQUFxQixDQUFDO2FBQzdCO1NBQ0YsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVELFdBQVcsQ0FBQyxPQUFzQjtRQUNoQyxNQUFNLE9BQU8sR0FBRyxPQUFPLENBQUMsS0FBSyxDQUFDO1FBQzlCLElBQUksT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDLFdBQVcsRUFBRSxDQUFDO1lBQ3BDLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDckMsQ0FBQztJQUNILENBQUM7SUFFRCxxQkFBcUIsQ0FBQyxLQUFhO1FBQ2pDLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7WUFDbkIsSUFBSSxDQUFDLGtCQUFrQixHQUFHLEtBQUssQ0FBQztZQUNoQyxJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQzVCLENBQUM7UUFDRCxJQUFJLEtBQUssSUFBSSxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUM7WUFDdkIsSUFBSSxLQUFLLEtBQUssVUFBVSxFQUFFLENBQUM7Z0JBQ3pCLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxhQUFhLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQyxDQUFDO2dCQUMvRCxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsc0JBQXNCLEVBQUUsQ0FBQztZQUN2RCxDQUFDO2lCQUFNLENBQUM7Z0JBQ04sSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLGdCQUFnQixDQUFDLFVBQVUsQ0FBQyxRQUFRLENBQUMsQ0FBQztnQkFDbEUsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUM5QyxDQUFDO1FBQ0gsQ0FBQztJQUNILENBQUM7SUFFRCxjQUFjLENBQUMsU0FBbUI7UUFDaEMsSUFBSSxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUM7UUFFckIsUUFBUSxJQUFJLENBQUMsa0JBQWtCLEVBQUUsQ0FBQztZQUNoQyxLQUFLLFNBQVM7Z0JBQ1osSUFBSSxDQUFDLFdBQVcsQ0FBQyxLQUFLLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLE9BQU8sY0FBYyxDQUFDLENBQUM7Z0JBQ2hFLE1BQU07WUFDUixLQUFLLFFBQVE7Z0JBQ1gsSUFBSSxDQUFDLFdBQVcsQ0FDZCxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLE9BQU8sTUFBTSxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxLQUFLLFlBQVksQ0FDdEUsQ0FBQztnQkFDRixNQUFNO1lBQ1IsS0FBSyxPQUFPO2dCQUNWLFFBQVEsSUFBSSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsTUFBTSxFQUFFLENBQUM7b0JBQ2hDLEtBQUssV0FBVzt3QkFDZCxJQUFJLENBQUMsV0FBVyxDQUNkLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLE9BQU8sSUFBSSxJQUFJLENBQUMsV0FBVyxDQUN2RCxJQUFJLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsS0FBSyxFQUNoQyxJQUFJLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUNwQyxNQUFNLElBQUksQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxJQUFJLFFBQVEsQ0FDL0MsQ0FBQzt3QkFFRixNQUFNO29CQUNSLEtBQUssY0FBYzt3QkFDakIsSUFBSSxDQUFDLFdBQVcsQ0FDZCxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLFlBQVksQ0FBQyxPQUFPLElBQUksSUFBSSxDQUFDLFdBQVcsQ0FDMUQsSUFBSSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsWUFBWSxDQUFDLEtBQUssRUFDbkMsSUFBSSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsWUFBWSxDQUFDLFFBQVEsQ0FDdkMsZ0JBQWdCLENBQ2xCLENBQUM7d0JBQ0YsTUFBTTtvQkFDUjt3QkFDRSxNQUFNLElBQUksS0FBSyxDQUFDLHFDQUFxQyxDQUFDLENBQUM7Z0JBQzNELENBQUM7Z0JBQ0QsTUFBTTtZQUNSLEtBQUssUUFBUSxDQUFDLENBQUMsQ0FBQztnQkFDZCxNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLElBQUk7cUJBQ2pDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQztxQkFDbkIsTUFBTSxDQUNMLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxFQUNoRSxFQUFjLENBQ2Y7cUJBQ0EsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO2dCQUNiLElBQUksQ0FBQyxXQUFXLENBQ2QsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxPQUFPLElBQUksSUFBSSxDQUFDLFdBQVcsQ0FDOUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsS0FBSyxFQUN2QixJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQzNCLFFBQVEsSUFBSSxJQUFJLENBQ2xCLENBQUM7Z0JBQ0YsTUFBTTtZQUNSLENBQUM7WUFDRCxLQUFLLFNBQVMsQ0FBQyxDQUFDLENBQUM7Z0JBQ2YsUUFBUSxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxNQUFNLEVBQUUsQ0FBQztvQkFDbEMsS0FBSyxhQUFhLENBQUMsQ0FBQyxDQUFDO3dCQUNuQixNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxZQUFZOzRCQUN6QyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxXQUFXLENBQUMsR0FBRyxHQUFHOzRCQUMxQyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsV0FBVyxDQUFDLEdBQUcsQ0FBQzt3QkFFdkMsSUFBSSxDQUFDLFdBQVcsQ0FDZCxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLFdBQVcsQ0FBQyxPQUFPLElBQUksSUFBSSxDQUFDLFdBQVcsQ0FDM0QsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsV0FBVyxDQUFDLEtBQUssRUFDcEMsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsV0FBVyxDQUFDLFFBQVEsQ0FDeEMsSUFBSSxHQUFHLE1BQU0sSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsV0FBVyxDQUFDLE1BQU0sTUFBTSxDQUMxRCxDQUFDO3dCQUNGLE1BQU07b0JBQ1IsQ0FBQztvQkFDRCxLQUFLLGlCQUFpQjt3QkFDcEIsSUFBSSxDQUFDLFdBQVcsQ0FDZCxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLGVBQWUsQ0FBQyxPQUFPLElBQUksSUFBSSxDQUFDLFdBQVcsQ0FDL0QsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsZUFBZSxDQUFDLEtBQUssRUFDeEMsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsZUFBZSxDQUFDLFFBQVEsQ0FDNUMsTUFBTSxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxlQUFlLENBQUMsVUFBVSxJQUNsRCxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxlQUFlLENBQUMsTUFDckMsSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxlQUFlLENBQUMsR0FBRyxHQUN4QyxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxlQUFlLENBQUMsU0FDckMsSUFBSSxDQUNMLENBQUM7d0JBQ0YsTUFBTTtvQkFDUjt3QkFDRSxNQUFNLElBQUksS0FBSyxDQUFDLHVDQUF1QyxDQUFDLENBQUM7Z0JBQzdELENBQUM7Z0JBQ0QsTUFBTTtZQUNSLENBQUM7WUFDRCxLQUFLLFFBQVE7Z0JBQ1gsUUFBUSxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxNQUFNLEVBQUUsQ0FBQztvQkFDakMsS0FBSyxrQkFBa0IsQ0FBQyxDQUFDLENBQUM7d0JBQ3hCLE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLFlBQVk7NEJBQ3hDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLGdCQUFnQixDQUFDLEdBQUcsR0FBRzs0QkFDOUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLGdCQUFnQixDQUFDLEdBQUcsQ0FBQzt3QkFFM0MsSUFBSSxDQUFDLFdBQVcsQ0FDZCxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLGdCQUFnQixDQUFDLE9BQU8sSUFBSSxJQUFJLENBQUMsV0FBVyxDQUMvRCxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxnQkFBZ0IsQ0FBQyxLQUFLLEVBQ3hDLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLGdCQUFnQixDQUFDLFFBQVEsQ0FDNUMsSUFBSSxHQUFHLElBQUksSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsZ0JBQWdCLENBQUMsS0FBSyxNQUFNLENBQzNELENBQUM7d0JBQ0YsTUFBTTtvQkFDUixDQUFDO29CQUNELEtBQUssbUJBQW1CO3dCQUN0QixJQUFJLENBQUMsV0FBVyxDQUNkLEdBQ0UsSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsaUJBQWlCLENBQUMsT0FDdEMsSUFBSSxJQUFJLENBQUMsV0FBVyxDQUNsQixJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxpQkFBaUIsQ0FBQyxLQUFLLEVBQ3pDLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLGlCQUFpQixDQUFDLFFBQVEsQ0FDN0MsTUFBTSxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxpQkFBaUIsQ0FBQyxLQUFLLElBQzlDLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLGlCQUFpQixDQUFDLEdBQ3RDLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsaUJBQWlCLENBQUMsU0FBUyxJQUFJLENBQ3JELENBQUM7d0JBQ0YsTUFBTTtvQkFDUjt3QkFDRSxNQUFNLElBQUksS0FBSyxDQUFDLHNDQUFzQyxDQUFDLENBQUM7Z0JBQzVELENBQUM7Z0JBQ0QsTUFBTTtZQUNSLEtBQUssVUFBVTtnQkFDYixJQUFJLENBQUMsU0FBUztvQkFBRSxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLFFBQVEsSUFBSSxFQUFFLENBQUMsQ0FBQztnQkFDakUsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7Z0JBQ2hELE1BQU07WUFDUjtnQkFDRSxJQUFJLElBQUksQ0FBQyxVQUFVO29CQUFFLElBQUksQ0FBQyxXQUFXLENBQUMsRUFBRSxDQUFDLENBQUM7O29CQUNyQyxNQUFNLElBQUksS0FBSyxDQUFDLG1CQUFtQixDQUFDLENBQUM7UUFDOUMsQ0FBQztJQUNILENBQUM7SUFFRCxpQkFBaUIsQ0FBQyxLQUFhO1FBQzdCLElBQUksQ0FBQyxJQUFJLENBQUMsWUFBWTtZQUFFLE9BQU87UUFDL0IsSUFBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDbEMsQ0FBQztJQUVELGFBQWEsQ0FBQyxLQUFjLEVBQUUsTUFBVztRQUN2QyxNQUFNLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQzlDLE1BQU0sQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDbEQsSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDO0lBQ3hCLENBQUM7SUFFRCxlQUFlLENBQUMsS0FBVTtRQUN4QixPQUFPO1lBQ0wsS0FBSyxFQUFFLElBQUksQ0FBQyxZQUFZLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQztZQUNyQyxPQUFPLEVBQUUsSUFBSSxDQUFDLFlBQVksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDO1NBQzFDLENBQUM7SUFDSixDQUFDO0lBRU8sV0FBVyxDQUFDLEtBQWE7UUFDL0IsSUFBSSxJQUFJLENBQUMsSUFBSSxLQUFLLEtBQUs7WUFBRSxPQUFPO1FBQ2hDLElBQUksQ0FBQyxJQUFJLEdBQUcsS0FBSyxDQUFDO1FBQ2xCLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUNsQyxDQUFDO0lBRU8sWUFBWSxDQUFDLElBQVk7UUFDL0IsSUFBSSxPQUFPLElBQUksS0FBSyxRQUFRO1lBQUUsT0FBTyxLQUFLLENBQUM7UUFFM0MsSUFBSSxDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztZQUNyQixJQUFJLENBQUMsSUFBSTtnQkFBRSxPQUFPLEtBQUssQ0FBQztRQUMxQixDQUFDO2FBQU0sSUFBSSxJQUFJLEtBQUssRUFBRTtZQUFFLE9BQU8sSUFBSSxDQUFDO1FBRXBDLE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDOUIsSUFBSSxLQUFLLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRSxDQUFDO1lBQ3ZCLE9BQU8sS0FBSyxDQUFDO1FBQ2YsQ0FBQztRQUVELE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQztJQUVPLHFCQUFxQixDQUFDLENBQWM7UUFDMUMsTUFBTSxJQUFJLEdBQUcsQ0FBQyxDQUFDLEtBQUssQ0FBQztRQUNyQixJQUFJLENBQUMsSUFBSTtZQUFFLE9BQU8sSUFBSSxDQUFDO1FBRXZCLE1BQU0sTUFBTSxHQUFHLElBQUksRUFBRSxLQUFLLENBQUMsR0FBRyxDQUFDLElBQUksRUFBRSxDQUFDO1FBQ3RDLElBQUksTUFBTSxDQUFDLE1BQU0sS0FBSyxDQUFDO1lBQUUsT0FBTyxFQUFFLGlCQUFpQixFQUFFLG9CQUFvQixFQUFFLENBQUM7UUFFNUUsTUFBTSxTQUFTLEdBQUcsS0FBSyxJQUFJLEVBQUUsQ0FBQztRQUU5QixPQUFPLFNBQVMsQ0FBQyxLQUFLLENBQUMsNkJBQTZCLENBQUM7WUFDbkQsU0FBUyxDQUFDLEtBQUssQ0FBQyw4QkFBOEIsQ0FBQztZQUMvQyxTQUFTLENBQUMsS0FBSyxDQUFDLDZCQUE2QixDQUFDO1lBQzlDLFNBQVMsQ0FBQyxLQUFLLENBQUMsOEJBQThCLENBQUM7WUFDL0MsU0FBUyxDQUFDLEtBQUssQ0FDYixxRkFBcUYsQ0FDdEY7WUFDRCxTQUFTLENBQUMsS0FBSyxDQUFDLHdDQUF3QyxDQUFDO1lBQ3pELFNBQVMsQ0FBQyxLQUFLLENBQ2Isc0VBQXNFLENBQ3ZFO1lBQ0QsU0FBUyxDQUFDLEtBQUssQ0FBQyxxQ0FBcUMsQ0FBQztZQUN0RCxTQUFTLENBQUMsS0FBSyxDQUNiLGlFQUFpRSxDQUNsRTtZQUNELENBQUMsQ0FBQyxJQUFJO1lBQ04sQ0FBQyxDQUFDLEVBQUUsaUJBQWlCLEVBQUUsb0JBQW9CLEVBQUUsQ0FBQztJQUNsRCxDQUFDO0lBRU8sWUFBWSxDQUFDLElBQVk7UUFDL0IsT0FBTyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLEdBQUcsRUFBRSxDQUFDLEdBQUcsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQzVELENBQUM7SUFFTyxZQUFZLENBQUMsSUFBWTtRQUMvQixPQUFPLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsSUFBSSxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7SUFDbkUsQ0FBQztJQUVPLFdBQVcsQ0FBQyxJQUFZLEVBQUUsUUFBZ0I7UUFDaEQsSUFBSSxJQUFJLENBQUMsYUFBYSxFQUFFLENBQUM7WUFDdkIsT0FBTyxJQUFJLENBQUM7UUFDZCxDQUFDO2FBQU0sQ0FBQztZQUNOLE9BQU8sUUFBUSxLQUFLLElBQUk7Z0JBQ3RCLENBQUMsQ0FBQyxJQUFJLEtBQUssRUFBRTtvQkFDWCxDQUFDLENBQUMsQ0FBQztvQkFDSCxDQUFDLENBQUMsSUFBSTtnQkFDUixDQUFDLENBQUMsSUFBSSxLQUFLLEVBQUU7b0JBQ1gsQ0FBQyxDQUFDLEVBQUU7b0JBQ0osQ0FBQyxDQUFDLElBQUksR0FBRyxFQUFFLENBQUM7UUFDbEIsQ0FBQztJQUNILENBQUM7SUFFTyxrQkFBa0IsQ0FBQyxJQUFZO1FBQ3JDLElBQUksQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUM7WUFDN0IsT0FBTyxDQUFDLEtBQUssQ0FBQyxxQkFBcUIsRUFBRSxJQUFJLENBQUMsQ0FBQztZQUMzQyxJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQztZQUN4RCxPQUFPO1FBQ1QsQ0FBQztRQUVELElBQUksSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO1lBQ2xCLElBQUksQ0FBQyxRQUFRLEdBQUcsS0FBSyxDQUFDO1lBQ3RCLE9BQU87UUFDVCxDQUFDO2FBQU0sQ0FBQztZQUNOLElBQUksQ0FBQyxRQUFRLEdBQUcsS0FBSyxDQUFDO1FBQ3hCLENBQUM7UUFFRCxJQUFJLENBQUMsSUFBSSxJQUFJLElBQUksQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUM7WUFDN0IsSUFBSSxDQUFDLGtCQUFrQixHQUFHLFNBQVMsQ0FBQztZQUNwQyxJQUFJLENBQUMsSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDO1lBQzFCLE9BQU87UUFDVCxDQUFDO1FBRUQsTUFBTSxTQUFTLEdBQUcsS0FBSyxJQUFJLEVBQUUsQ0FBQztRQUU5QixNQUFNLENBQUMsT0FBTyxFQUFFLEtBQUssRUFBRSxVQUFVLEVBQUUsS0FBSyxFQUFFLFNBQVMsQ0FBQyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUM7UUFFdkUsSUFBSSxTQUFTLENBQUMsS0FBSyxDQUFDLDZCQUE2QixDQUFDLEVBQUUsQ0FBQztZQUNuRCxJQUFJLENBQUMsa0JBQWtCLEdBQUcsU0FBUyxDQUFDO1lBRXBDLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLE9BQU8sR0FBRyxNQUFNLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQzVELENBQUM7YUFBTSxJQUFJLFNBQVMsQ0FBQyxLQUFLLENBQUMsOEJBQThCLENBQUMsRUFBRSxDQUFDO1lBQzNELElBQUksQ0FBQyxrQkFBa0IsR0FBRyxRQUFRLENBQUM7WUFFbkMsSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsS0FBSyxHQUFHLE1BQU0sQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDckQsSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsT0FBTyxHQUFHLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUM5QyxDQUFDO2FBQU0sSUFBSSxTQUFTLENBQUMsS0FBSyxDQUFDLDZCQUE2QixDQUFDLEVBQUUsQ0FBQztZQUMxRCxJQUFJLENBQUMsa0JBQWtCLEdBQUcsT0FBTyxDQUFDO1lBRWxDLElBQUksQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLE1BQU0sR0FBRyxXQUFXLENBQUM7WUFDdEMsSUFBSSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLElBQUksR0FBRyxNQUFNLENBQUMsVUFBVSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ2xFLE1BQU0sV0FBVyxHQUFHLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUNsQyxJQUFJLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsV0FBVyxDQUFDLENBQUM7WUFDbEUsSUFBSSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLFdBQVcsQ0FBQyxDQUFDO1lBQ3JFLElBQUksQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxPQUFPLEdBQUcsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQ3ZELENBQUM7YUFBTSxJQUFJLFNBQVMsQ0FBQyxLQUFLLENBQUMsOEJBQThCLENBQUMsRUFBRSxDQUFDO1lBQzNELElBQUksQ0FBQyxrQkFBa0IsR0FBRyxPQUFPLENBQUM7WUFFbEMsSUFBSSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsTUFBTSxHQUFHLGNBQWMsQ0FBQztZQUN6QyxNQUFNLFdBQVcsR0FBRyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDbEMsSUFBSSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsWUFBWSxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLFdBQVcsQ0FBQyxDQUFDO1lBQ3JFLElBQUksQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLFlBQVksQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxXQUFXLENBQUMsQ0FBQztZQUN4RSxJQUFJLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxZQUFZLENBQUMsT0FBTyxHQUFHLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUMxRCxDQUFDO2FBQU0sSUFDTCxTQUFTLENBQUMsS0FBSyxDQUNiLHFGQUFxRixDQUN0RixFQUNELENBQUM7WUFDRCxJQUFJLENBQUMsa0JBQWtCLEdBQUcsUUFBUSxDQUFDO1lBQ25DLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSTtpQkFDcEIsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDO2lCQUNuQixPQUFPLENBQUMsQ0FBQyxPQUFPLEVBQUUsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQztZQUM5RCxTQUFTO2lCQUNOLEtBQUssQ0FBQyxHQUFHLENBQUM7aUJBQ1YsT0FBTyxDQUFDLENBQUMsT0FBTyxFQUFFLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxHQUFHLElBQUksQ0FBQyxDQUFDLENBQUM7WUFDN0QsTUFBTSxXQUFXLEdBQUcsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQ2xDLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLFdBQVcsQ0FBQyxDQUFDO1lBQ3pELElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLFdBQVcsQ0FBQyxDQUFDO1lBQzVELElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLE9BQU8sR0FBRyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDOUMsQ0FBQzthQUFNLElBQUksU0FBUyxDQUFDLEtBQUssQ0FBQyx3Q0FBd0MsQ0FBQyxFQUFFLENBQUM7WUFDckUsSUFBSSxDQUFDLGtCQUFrQixHQUFHLFNBQVMsQ0FBQztZQUNwQyxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxNQUFNLEdBQUcsYUFBYSxDQUFDO1lBRTFDLElBQUksVUFBVSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDO2dCQUNuQyxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxXQUFXLENBQUMsR0FBRyxHQUFHLFVBQVUsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBQzFELElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLFlBQVksR0FBRyxJQUFJLENBQUM7WUFDekMsQ0FBQztpQkFBTSxDQUFDO2dCQUNOLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLFdBQVcsQ0FBQyxHQUFHLEdBQUcsVUFBVSxDQUFDO1lBQ2xELENBQUM7WUFFRCxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxXQUFXLENBQUMsTUFBTSxHQUFHLE1BQU0sQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDbkUsTUFBTSxXQUFXLEdBQUcsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQ2xDLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLFdBQVcsQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxXQUFXLENBQUMsQ0FBQztZQUN0RSxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxXQUFXLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsV0FBVyxDQUFDLENBQUM7WUFDekUsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsV0FBVyxDQUFDLE9BQU8sR0FBRyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDM0QsQ0FBQzthQUFNLElBQ0wsU0FBUyxDQUFDLEtBQUssQ0FDYixzRUFBc0UsQ0FDdkUsRUFDRCxDQUFDO1lBQ0QsTUFBTSxHQUFHLEdBQUcsU0FBUyxDQUFDLFNBQVMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7WUFDdEMsTUFBTSxTQUFTLEdBQUcsU0FBUyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUN6QyxJQUFJLENBQUMsa0JBQWtCLEdBQUcsU0FBUyxDQUFDO1lBQ3BDLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLE1BQU0sR0FBRyxpQkFBaUIsQ0FBQztZQUM5QyxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxlQUFlLENBQUMsU0FBUyxHQUFHLFNBQVMsQ0FBQztZQUN6RCxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxlQUFlLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQztZQUU3QyxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsQ0FBQztnQkFDOUIsTUFBTSxDQUFDLFVBQVUsRUFBRSxNQUFNLENBQUMsR0FBRyxLQUFLLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQztnQkFDMUQsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsZUFBZSxDQUFDLE1BQU0sR0FBRyxNQUFNLENBQUM7Z0JBQ25ELElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLGVBQWUsQ0FBQyxVQUFVLEdBQUcsVUFBVSxDQUFDO1lBQzdELENBQUM7WUFFRCxNQUFNLFdBQVcsR0FBRyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDbEMsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsZUFBZSxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLFdBQVcsQ0FBQyxDQUFDO1lBQzFFLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLGVBQWUsQ0FBQyxRQUFRO2dCQUN6QyxJQUFJLENBQUMsWUFBWSxDQUFDLFdBQVcsQ0FBQyxDQUFDO1lBQ2pDLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLGVBQWUsQ0FBQyxPQUFPLEdBQUcsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQy9ELENBQUM7YUFBTSxJQUFJLFNBQVMsQ0FBQyxLQUFLLENBQUMscUNBQXFDLENBQUMsRUFBRSxDQUFDO1lBQ2xFLElBQUksQ0FBQyxrQkFBa0IsR0FBRyxRQUFRLENBQUM7WUFDbkMsSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsTUFBTSxHQUFHLGtCQUFrQixDQUFDO1lBQzlDLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLGdCQUFnQixDQUFDLEtBQUssR0FBRyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUM7WUFFekQsSUFBSSxVQUFVLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUM7Z0JBQ25DLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLGdCQUFnQixDQUFDLEdBQUcsR0FBRyxVQUFVLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUM5RCxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxZQUFZLEdBQUcsSUFBSSxDQUFDO1lBQ3hDLENBQUM7aUJBQU0sQ0FBQztnQkFDTixJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxnQkFBZ0IsQ0FBQyxHQUFHLEdBQUcsVUFBVSxDQUFDO1lBQ3RELENBQUM7WUFFRCxNQUFNLFdBQVcsR0FBRyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDbEMsSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsZ0JBQWdCLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsV0FBVyxDQUFDLENBQUM7WUFDMUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsZ0JBQWdCLENBQUMsUUFBUTtnQkFDekMsSUFBSSxDQUFDLFlBQVksQ0FBQyxXQUFXLENBQUMsQ0FBQztZQUNqQyxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxnQkFBZ0IsQ0FBQyxPQUFPLEdBQUcsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQy9ELENBQUM7YUFBTSxJQUNMLFNBQVMsQ0FBQyxLQUFLLENBQ2IsaUVBQWlFLENBQ2xFLEVBQ0QsQ0FBQztZQUNELE1BQU0sR0FBRyxHQUFHLFNBQVMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO1lBQ3RDLE1BQU0sU0FBUyxHQUFHLFNBQVMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDekMsSUFBSSxDQUFDLGtCQUFrQixHQUFHLFFBQVEsQ0FBQztZQUNuQyxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxNQUFNLEdBQUcsbUJBQW1CLENBQUM7WUFDL0MsSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsaUJBQWlCLENBQUMsU0FBUyxHQUFHLFNBQVMsQ0FBQztZQUMxRCxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxpQkFBaUIsQ0FBQyxHQUFHLEdBQUcsR0FBRyxDQUFDO1lBQzlDLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLGlCQUFpQixDQUFDLEtBQUssR0FBRyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDMUQsTUFBTSxXQUFXLEdBQUcsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQ2xDLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLGlCQUFpQixDQUFDLEtBQUs7Z0JBQ3ZDLElBQUksQ0FBQyxZQUFZLENBQUMsV0FBVyxDQUFDLENBQUM7WUFDakMsSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsaUJBQWlCLENBQUMsUUFBUTtnQkFDMUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxXQUFXLENBQUMsQ0FBQztZQUNqQyxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxpQkFBaUIsQ0FBQyxPQUFPLEdBQUcsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQ2hFLENBQUM7YUFBTSxDQUFDO1lBQ04sSUFBSSxDQUFDLGtCQUFrQixHQUFHLFVBQVUsQ0FBQztZQUNyQyxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQzdDLENBQUM7UUFDRCxJQUFJLENBQUMsSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDO0lBQzVCLENBQUM7SUFFTyxnQkFBZ0I7UUFDdEIsTUFBTSxDQUFDLFlBQVksRUFBRSxjQUFjLENBQUMsR0FBRyxJQUFJLENBQUMsV0FBVzthQUNwRCxLQUFLLENBQUMsR0FBRyxDQUFDO2FBQ1YsR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBRWYsT0FBTztZQUNMLE9BQU8sRUFBRTtnQkFDUCxPQUFPLEVBQUUsQ0FBQzthQUNYO1lBQ0QsTUFBTSxFQUFFO2dCQUNOLEtBQUssRUFBRSxDQUFDO2dCQUNSLE9BQU8sRUFBRSxDQUFDO2FBQ1g7WUFDRCxLQUFLLEVBQUU7Z0JBQ0wsTUFBTSxFQUFFLFdBQVc7Z0JBQ25CLFNBQVMsRUFBRTtvQkFDVCxJQUFJLEVBQUUsQ0FBQztvQkFDUCxLQUFLLEVBQUUsSUFBSSxDQUFDLFlBQVksQ0FBQyxZQUFZLENBQUM7b0JBQ3RDLE9BQU8sRUFBRSxjQUFjO29CQUN2QixRQUFRLEVBQUUsSUFBSSxDQUFDLFlBQVksQ0FBQyxZQUFZLENBQUM7aUJBQzFDO2dCQUNELFlBQVksRUFBRTtvQkFDWixLQUFLLEVBQUUsSUFBSSxDQUFDLFlBQVksQ0FBQyxZQUFZLENBQUM7b0JBQ3RDLE9BQU8sRUFBRSxjQUFjO29CQUN2QixRQUFRLEVBQUUsSUFBSSxDQUFDLFlBQVksQ0FBQyxZQUFZLENBQUM7aUJBQzFDO2FBQ0Y7WUFDRCxNQUFNLEVBQUU7Z0JBQ04sR0FBRyxFQUFFLElBQUk7Z0JBQ1QsR0FBRyxFQUFFLEtBQUs7Z0JBQ1YsR0FBRyxFQUFFLEtBQUs7Z0JBQ1YsR0FBRyxFQUFFLEtBQUs7Z0JBQ1YsR0FBRyxFQUFFLEtBQUs7Z0JBQ1YsR0FBRyxFQUFFLEtBQUs7Z0JBQ1YsR0FBRyxFQUFFLEtBQUs7Z0JBQ1YsS0FBSyxFQUFFLElBQUksQ0FBQyxZQUFZLENBQUMsWUFBWSxDQUFDO2dCQUN0QyxPQUFPLEVBQUUsY0FBYztnQkFDdkIsUUFBUSxFQUFFLElBQUksQ0FBQyxZQUFZLENBQUMsWUFBWSxDQUFDO2FBQzFDO1lBQ0QsT0FBTyxFQUFFO2dCQUNQLE1BQU0sRUFBRSxhQUFhO2dCQUNyQixZQUFZLEVBQUUsS0FBSztnQkFDbkIsV0FBVyxFQUFFO29CQUNYLEdBQUcsRUFBRSxHQUFHO29CQUNSLE1BQU0sRUFBRSxDQUFDO29CQUNULEtBQUssRUFBRSxJQUFJLENBQUMsWUFBWSxDQUFDLFlBQVksQ0FBQztvQkFDdEMsT0FBTyxFQUFFLGNBQWM7b0JBQ3ZCLFFBQVEsRUFBRSxJQUFJLENBQUMsWUFBWSxDQUFDLFlBQVksQ0FBQztpQkFDMUM7Z0JBQ0QsZUFBZSxFQUFFO29CQUNmLFNBQVMsRUFBRSxJQUFJO29CQUNmLEdBQUcsRUFBRSxLQUFLO29CQUNWLFVBQVUsRUFBRSxDQUFDO29CQUNiLE1BQU0sRUFBRSxDQUFDO29CQUNULEtBQUssRUFBRSxJQUFJLENBQUMsWUFBWSxDQUFDLFlBQVksQ0FBQztvQkFDdEMsT0FBTyxFQUFFLGNBQWM7b0JBQ3ZCLFFBQVEsRUFBRSxJQUFJLENBQUMsWUFBWSxDQUFDLFlBQVksQ0FBQztpQkFDMUM7YUFDRjtZQUNELE1BQU0sRUFBRTtnQkFDTixNQUFNLEVBQUUsa0JBQWtCO2dCQUMxQixZQUFZLEVBQUUsS0FBSztnQkFDbkIsZ0JBQWdCLEVBQUU7b0JBQ2hCLEtBQUssRUFBRSxDQUFDO29CQUNSLEdBQUcsRUFBRSxHQUFHO29CQUNSLEtBQUssRUFBRSxJQUFJLENBQUMsWUFBWSxDQUFDLFlBQVksQ0FBQztvQkFDdEMsT0FBTyxFQUFFLGNBQWM7b0JBQ3ZCLFFBQVEsRUFBRSxJQUFJLENBQUMsWUFBWSxDQUFDLFlBQVksQ0FBQztpQkFDMUM7Z0JBQ0QsaUJBQWlCLEVBQUU7b0JBQ2pCLFNBQVMsRUFBRSxJQUFJO29CQUNmLEdBQUcsRUFBRSxLQUFLO29CQUNWLEtBQUssRUFBRSxDQUFDO29CQUNSLEtBQUssRUFBRSxJQUFJLENBQUMsWUFBWSxDQUFDLFlBQVksQ0FBQztvQkFDdEMsT0FBTyxFQUFFLGNBQWM7b0JBQ3ZCLFFBQVEsRUFBRSxJQUFJLENBQUMsWUFBWSxDQUFDLFlBQVksQ0FBQztpQkFDMUM7YUFDRjtZQUNELFFBQVEsRUFBRTtnQkFDUixVQUFVLEVBQUUsSUFBSSxDQUFDLElBQUk7YUFDdEI7U0FDRixDQUFDO0lBQ0osQ0FBQztJQUVPLFNBQVMsQ0FBQyxTQUFpQixFQUFFLEtBQWE7UUFDaEQsT0FBTyxLQUFLLENBQUMsSUFBSSxDQUNmLEVBQUUsTUFBTSxFQUFFLEtBQUssR0FBRyxDQUFDLEdBQUcsU0FBUyxFQUFFLEVBQ2pDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxHQUFHLFNBQVMsQ0FDeEIsQ0FBQztJQUNKLENBQUM7SUFFTyxpQkFBaUI7UUFDdkIsT0FBTztZQUNMLGFBQWEsRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLENBQUM7Z0JBQ25ELEtBQUssRUFBRSxLQUFLO2dCQUNaLEtBQUssRUFBRSxLQUFLO2FBQ2IsQ0FBQyxDQUFDO1lBQ0gsTUFBTSxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsQ0FBQztnQkFDNUMsS0FBSyxFQUFFLE1BQU0sQ0FBQyxLQUFLLENBQUM7Z0JBQ3BCLEtBQUssRUFBRSxLQUFLO2FBQ2IsQ0FBQyxDQUFDO1lBQ0gsVUFBVSxFQUFFLE1BQU0sQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsS0FBSyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUM7Z0JBQzVELEtBQUssRUFBRSxLQUFLO2dCQUNaLEtBQUssRUFBRSxHQUFHO2FBQ1gsQ0FBQyxDQUFDO1lBQ0gsSUFBSSxFQUFFLE1BQU0sQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsS0FBSyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUM7Z0JBQ2hELEtBQUssRUFBRSxLQUFLO2dCQUNaLEtBQUssRUFBRSxHQUFHO2FBQ1gsQ0FBQyxDQUFDO1lBQ0gsT0FBTyxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUMsQ0FBQztnQkFDM0MsS0FBSyxFQUFFLEdBQUc7Z0JBQ1YsS0FBSyxFQUFFLEdBQUc7YUFDWCxDQUFDLENBQUM7WUFDSCxXQUFXLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxDQUFDO2dCQUMvQyxLQUFLLEVBQUUsSUFBSSxDQUFDLFlBQVksQ0FBQyxHQUFHLENBQUM7Z0JBQzdCLEtBQUssRUFBRSxHQUFHO2FBQ1gsQ0FBQyxDQUFDO1lBQ0gsS0FBSyxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsQ0FBQztnQkFDMUMsS0FBSyxFQUFFLElBQUk7Z0JBQ1gsS0FBSyxFQUFFLElBQUk7YUFDWixDQUFDLENBQUM7WUFDSCxTQUFTLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxDQUFDO2dCQUM3QyxLQUFLLEVBQUUsR0FBRztnQkFDVixLQUFLLEVBQUUsR0FBRzthQUNYLENBQUMsQ0FBQztZQUNILGtCQUFrQixFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUNqRSxDQUFDLEdBQUcsRUFBRSxFQUFFO2dCQUNOLE9BQU87b0JBQ0wsS0FBSyxFQUFFLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxHQUFHLENBQUM7b0JBQ2xDLEtBQUssRUFBRSxHQUFHO2lCQUNYLENBQUM7WUFDSixDQUFDLENBQ0Y7U0FDRixDQUFDO0lBQ0osQ0FBQztJQUVPLGlCQUFpQixDQUFDLEtBQWE7UUFDckMsSUFBSSxLQUFLLEtBQUssR0FBRyxFQUFFLENBQUM7WUFDbEIsT0FBTyxVQUFVLENBQUM7UUFDcEIsQ0FBQzthQUFNLElBQUksS0FBSyxLQUFLLElBQUksRUFBRSxDQUFDO1lBQzFCLE9BQU8sY0FBYyxDQUFDO1FBQ3hCLENBQUM7YUFBTSxJQUFJLEtBQUssS0FBSyxJQUFJLEVBQUUsQ0FBQztZQUMxQixPQUFPLGVBQWUsQ0FBQztRQUN6QixDQUFDO2FBQU0sQ0FBQztZQUNOLElBQUksTUFBTSxHQUFHLEVBQUUsQ0FBQztZQUNoQixJQUFJLEtBQUssQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUM7Z0JBQ3JCLE1BQU0saUJBQWlCLEdBQUcsS0FBSyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDO2dCQUN6RCxJQUFJLGlCQUFpQixLQUFLLEdBQUcsRUFBRSxDQUFDO29CQUM5QixNQUFNLEdBQUcsSUFBSSxDQUFDO2dCQUNoQixDQUFDO1lBQ0gsQ0FBQztZQUNELElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQztnQkFDWixNQUFNLFNBQVMsR0FBRyxLQUFLLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUM7Z0JBQ2pELFFBQVEsU0FBUyxFQUFFLENBQUM7b0JBQ2xCLEtBQUssR0FBRzt3QkFDTixNQUFNLEdBQUcsSUFBSSxDQUFDO3dCQUNkLE1BQU07b0JBQ1IsS0FBSyxHQUFHO3dCQUNOLE1BQU0sR0FBRyxJQUFJLENBQUM7d0JBQ2QsTUFBTTtvQkFDUixLQUFLLEdBQUc7d0JBQ04sTUFBTSxHQUFHLElBQUksQ0FBQzt3QkFDZCxNQUFNO29CQUNSO3dCQUNFLE1BQU0sR0FBRyxJQUFJLENBQUM7d0JBQ2QsTUFBTTtnQkFDVixDQUFDO1lBQ0gsQ0FBQztZQUVELE9BQU8sR0FBRyxLQUFLLEdBQUcsTUFBTSxNQUFNLENBQUM7UUFDakMsQ0FBQztJQUNILENBQUM7SUFFTyxZQUFZLENBQUMsS0FBYTtRQUNoQyxPQUFPLEtBQUssSUFBSSxDQUFDLElBQUksS0FBSyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLFFBQVEsRUFBRSxDQUFDO0lBQ25FLENBQUM7SUFFTyxZQUFZLENBQUMsS0FBYTtRQUNoQyxNQUFNLEdBQUcsR0FBRyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDMUIsT0FBTyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDO0lBQzlCLENBQUM7OEdBOXFCVSxxQkFBcUI7a0dBQXJCLHFCQUFxQiwyYUM1RmxDLG13ZkF5YUEsNHFDRDVWSSxZQUFZLDRaQUNaLFdBQVcsbW1CQUNYLG1CQUFtQixnVkFDbkIsd0JBQXdCLHVUQUN4QixrQkFBa0IsK2pCQUNsQixzQkFBc0IscVFBQ3RCLGlCQUFpQiwwRUFDakIsb0JBQW9CLDJQQUNwQixpQkFBaUIscWdCQUNqQixzQkFBc0IsaVRBQ3RCLHdCQUF3Qjs7MkZBS2YscUJBQXFCO2tCQW5CakMsU0FBUzsrQkFDRSxlQUFlLGNBQ2IsSUFBSSxXQUNQO3dCQUNQLFlBQVk7d0JBQ1osV0FBVzt3QkFDWCxtQkFBbUI7d0JBQ25CLHdCQUF3Qjt3QkFDeEIsa0JBQWtCO3dCQUNsQixzQkFBc0I7d0JBQ3RCLGlCQUFpQjt3QkFDakIsb0JBQW9CO3dCQUNwQixpQkFBaUI7d0JBQ2pCLHNCQUFzQjt3QkFDdEIsd0JBQXdCO3FCQUN6Qjt1SEFTUSxLQUFLO3NCQUFiLEtBQUs7Z0JBTUcsSUFBSTtzQkFBWixLQUFLO2dCQU1HLFFBQVE7c0JBQWhCLEtBQUs7Z0JBTUcsVUFBVTtzQkFBbEIsS0FBSztnQkFNRyxZQUFZO3NCQUFwQixLQUFLO2dCQU1HLFlBQVk7c0JBQXBCLEtBQUs7Z0JBTUcsV0FBVztzQkFBbkIsS0FBSztnQkFNRyxhQUFhO3NCQUFyQixLQUFLO2dCQU1HLFFBQVE7c0JBQWhCLEtBQUs7Z0JBTUcsV0FBVztzQkFBbkIsS0FBSztnQkFPSSxVQUFVO3NCQUFuQixNQUFNO2dCQU9HLGNBQWM7c0JBQXZCLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBDb21wb25lbnQsXG4gIE9uSW5pdCxcbiAgT25DaGFuZ2VzLFxuICBJbnB1dCxcbiAgT3V0cHV0LFxuICBFdmVudEVtaXR0ZXIsXG4gIFNpbXBsZUNoYW5nZXMsXG4gIENoYW5nZURldGVjdG9yUmVmXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQ29tbW9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7XG4gIEZvcm1Db250cm9sLFxuICBGb3Jtc01vZHVsZSxcbiAgUmVhY3RpdmVGb3Jtc01vZHVsZSxcbiAgVW50eXBlZEZvcm1CdWlsZGVyLFxuICBVbnR5cGVkRm9ybUdyb3VwLFxuICBWYWxpZGF0b3JzXG59IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7IHRpbWVab25lcyB9IGZyb20gJy4vY3BzLXNjaGVkdWxlci51dGlscyc7XG5pbXBvcnQgeyBDcHNTZWxlY3RDb21wb25lbnQgfSBmcm9tICcuLi9jcHMtc2VsZWN0L2Nwcy1zZWxlY3QuY29tcG9uZW50JztcbmltcG9ydCB7IENwc1JhZGlvR3JvdXBDb21wb25lbnQgfSBmcm9tICcuLi9jcHMtcmFkaW8tZ3JvdXAvY3BzLXJhZGlvLWdyb3VwLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBDcHNSYWRpb0NvbXBvbmVudCB9IGZyb20gJy4uL2Nwcy1yYWRpby1ncm91cC9jcHMtcmFkaW8vY3BzLXJhZGlvLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBDcHNDaGVja2JveENvbXBvbmVudCB9IGZyb20gJy4uL2Nwcy1jaGVja2JveC9jcHMtY2hlY2tib3guY29tcG9uZW50JztcbmltcG9ydCB7IENwc0lucHV0Q29tcG9uZW50IH0gZnJvbSAnLi4vY3BzLWlucHV0L2Nwcy1pbnB1dC5jb21wb25lbnQnO1xuaW1wb3J0IHsgQ3BzQXV0b2NvbXBsZXRlQ29tcG9uZW50IH0gZnJvbSAnLi4vY3BzLWF1dG9jb21wbGV0ZS9jcHMtYXV0b2NvbXBsZXRlLmNvbXBvbmVudCc7XG5pbXBvcnQge1xuICBDcHNCdXR0b25Ub2dnbGVDb21wb25lbnQsXG4gIENwc0J1dHRvblRvZ2dsZU9wdGlvblxufSBmcm9tICcuLi9jcHMtYnV0dG9uLXRvZ2dsZS9jcHMtYnV0dG9uLXRvZ2dsZS5jb21wb25lbnQnO1xuaW1wb3J0IHtcbiAgQ3BzVGltZXBpY2tlckNvbXBvbmVudCxcbiAgQ3BzVGltZVxufSBmcm9tICcuLi9jcHMtdGltZXBpY2tlci9jcHMtdGltZXBpY2tlci5jb21wb25lbnQnO1xuXG5jb25zdCBEYXlzID0ge1xuICBNT046ICdNb25kYXknLFxuICBUVUU6ICdUdWVzZGF5JyxcbiAgV0VEOiAnV2VkbmVzZGF5JyxcbiAgVEhVOiAnVGh1cnNkYXknLFxuICBGUkk6ICdGcmlkYXknLFxuICBTQVQ6ICdTYXR1cmRheScsXG4gIFNVTjogJ1N1bmRheSdcbn07XG5cbmNvbnN0IE1vbnRoV2Vla3MgPSB7XG4gICcjMSc6ICdGaXJzdCcsXG4gICcjMic6ICdTZWNvbmQnLFxuICAnIzMnOiAnVGhpcmQnLFxuICAnIzQnOiAnRm91cnRoJyxcbiAgJyM1JzogJ0ZpZnRoJyxcbiAgTDogJ0xhc3QnXG59O1xuXG5lbnVtIE1vbnRocyB7XG4gIEphbnVhcnkgPSAxLFxuICBGZWJydWFyeSxcbiAgTWFyY2gsXG4gIEFwcmlsLFxuICBNYXksXG4gIEp1bmUsXG4gIEp1bHksXG4gIEF1Z3VzdCxcbiAgU2VwdGVtYmVyLFxuICBPY3RvYmVyLFxuICBOb3ZlbWJlcixcbiAgRGVjZW1iZXJcbn1cblxuLyoqXG4gKiBDcHNTY2hlZHVsZXJDb21wb25lbnQgaXMgYSBjb21wb25lbnQgZGVzaWduZWQgdG8gZmFjaWxpdGF0ZSB0aGUgY3JlYXRpb24gb2YgQW1hem9uIEV2ZW50QnJpZGdlIENST04gZXhwcmVzc2lvbnMuXG4gKiBAZ3JvdXAgQ29tcG9uZW50c1xuICovXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdjcHMtc2NoZWR1bGVyJyxcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgaW1wb3J0czogW1xuICAgIENvbW1vbk1vZHVsZSxcbiAgICBGb3Jtc01vZHVsZSxcbiAgICBSZWFjdGl2ZUZvcm1zTW9kdWxlLFxuICAgIENwc0J1dHRvblRvZ2dsZUNvbXBvbmVudCxcbiAgICBDcHNTZWxlY3RDb21wb25lbnQsXG4gICAgQ3BzUmFkaW9Hcm91cENvbXBvbmVudCxcbiAgICBDcHNSYWRpb0NvbXBvbmVudCxcbiAgICBDcHNDaGVja2JveENvbXBvbmVudCxcbiAgICBDcHNJbnB1dENvbXBvbmVudCxcbiAgICBDcHNUaW1lcGlja2VyQ29tcG9uZW50LFxuICAgIENwc0F1dG9jb21wbGV0ZUNvbXBvbmVudFxuICBdLFxuICB0ZW1wbGF0ZVVybDogJy4vY3BzLXNjaGVkdWxlci5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsOiAnLi9jcHMtc2NoZWR1bGVyLmNvbXBvbmVudC5zY3NzJ1xufSlcbmV4cG9ydCBjbGFzcyBDcHNTY2hlZHVsZXJDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIE9uQ2hhbmdlcyB7XG4gIC8qKlxuICAgKiBMYWJlbCBvZiB0aGUgY29tcG9uZW50LlxuICAgKiBAZ3JvdXAgUHJvcHNcbiAgICovXG4gIEBJbnB1dCgpIGxhYmVsID0gJyc7XG5cbiAgLyoqXG4gICAqIENyb24gZXhwcmVzc2lvbiB2YWx1ZS5cbiAgICogQGdyb3VwIFByb3BzXG4gICAqL1xuICBASW5wdXQoKSBjcm9uID0gJyc7XG5cbiAgLyoqXG4gICAqIFRpbWUgem9uZSB2YWx1ZS5cbiAgICogQGdyb3VwIFByb3BzXG4gICAqL1xuICBASW5wdXQoKSB0aW1lWm9uZSA9IEludGwuRGF0ZVRpbWVGb3JtYXQoKS5yZXNvbHZlZE9wdGlvbnMoKS50aW1lWm9uZSB8fCAnVVRDJztcblxuICAvKipcbiAgICogRGV0ZXJtaW5lcyB3aGV0aGVyIHRvIHNob3cgdGhlICdOb3Qgc2V0JyB0YWIuXG4gICAqIEBncm91cCBQcm9wc1xuICAgKi9cbiAgQElucHV0KCkgc2hvd05vdFNldCA9IHRydWU7XG5cbiAgLyoqXG4gICAqIERldGVybWluZXMgd2hldGhlciB0byBzaG93IHRoZSAnQWR2YW5jZWQnIHRhYi5cbiAgICogQGdyb3VwIFByb3BzXG4gICAqL1xuICBASW5wdXQoKSBzaG93QWR2YW5jZWQgPSB0cnVlO1xuXG4gIC8qKlxuICAgKiBEZXRlcm1pbmVzIHdoZXRoZXIgdG8gc2hvdyB0aGUgdGltZSB6b25lIHNlbGVjdG9yLlxuICAgKiBAZ3JvdXAgUHJvcHNcbiAgICovXG4gIEBJbnB1dCgpIHNob3dUaW1lWm9uZSA9IGZhbHNlO1xuXG4gIC8qKlxuICAgKiBEZWZhdWx0IHRpbWUgZm9ybWF0IGZvciB0aGUgY29tcG9uZW50LlxuICAgKiBAZ3JvdXAgUHJvcHNcbiAgICovXG4gIEBJbnB1dCgpIGRlZmF1bHRUaW1lID0gJzAwOjAwJztcblxuICAvKipcbiAgICogRGV0ZXJtaW5lcyB3aGV0aGVyIHRvIHVzZSAyNC1ob3VyIHRpbWUgZm9ybWF0LlxuICAgKiBAZ3JvdXAgUHJvcHNcbiAgICovXG4gIEBJbnB1dCgpIHVzZTI0SG91clRpbWUgPSB0cnVlO1xuXG4gIC8qKlxuICAgKiBEZXRlcm1pbmVzIHdoZXRoZXIgdGhlIGNvbXBvbmVudCBpcyBkaXNhYmxlZC5cbiAgICogQGdyb3VwIFByb3BzXG4gICAqL1xuICBASW5wdXQoKSBkaXNhYmxlZCA9IGZhbHNlO1xuXG4gIC8qKlxuICAgKiBJbmZvcm1hdGlvbiB0b29sdGlwIGZvciB0aGUgY29tcG9uZW50LlxuICAgKiBAZ3JvdXAgUHJvcHNcbiAgICovXG4gIEBJbnB1dCgpIGluZm9Ub29sdGlwID0gJyc7XG5cbiAgLyoqXG4gICAqIENhbGxiYWNrIHRvIGludm9rZSBvbiBjcm9uIGV4cHJlc3Npb24gdmFsdWUgY2hhbmdlLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gc3RyaW5nIC0gY3JvbiBleHByZXNzaW9uIHZhbHVlIGNoYW5nZWQuXG4gICAqIEBncm91cCBFbWl0c1xuICAgKi9cbiAgQE91dHB1dCgpIGNyb25DaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPHN0cmluZz4oKTtcblxuICAvKipcbiAgICogQ2FsbGJhY2sgdG8gaW52b2tlIG9uIHRpbWUgem9uZSBjaGFuZ2UuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBzdHJpbmcgLSB0aW1lIHpvbmUgY2hhbmdlZC5cbiAgICogQGdyb3VwIEVtaXRzXG4gICAqL1xuICBAT3V0cHV0KCkgdGltZVpvbmVDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPHN0cmluZz4oKTtcblxuICBzY2hlZHVsZVR5cGVzOiBDcHNCdXR0b25Ub2dnbGVPcHRpb25bXSA9IFtcbiAgICB7IGxhYmVsOiAnTm90IHNldCcsIHZhbHVlOiAnTm90IHNldCcgfSxcbiAgICB7IGxhYmVsOiAnTWludXRlcycsIHZhbHVlOiAnTWludXRlcycgfSxcbiAgICB7IGxhYmVsOiAnSG91cmx5JywgdmFsdWU6ICdIb3VybHknIH0sXG4gICAgeyBsYWJlbDogJ0RhaWx5JywgdmFsdWU6ICdEYWlseScgfSxcbiAgICB7IGxhYmVsOiAnV2Vla2x5JywgdmFsdWU6ICdXZWVrbHknIH0sXG4gICAgeyBsYWJlbDogJ01vbnRobHknLCB2YWx1ZTogJ01vbnRobHknIH0sXG4gICAgeyBsYWJlbDogJ1llYXJseScsIHZhbHVlOiAnWWVhcmx5JyB9LFxuICAgIHsgbGFiZWw6ICdBZHZhbmNlZCcsIHZhbHVlOiAnQWR2YW5jZWQnIH1cbiAgXTtcblxuICBhY3RpdmVTY2hlZHVsZVR5cGUgPSAnTm90IHNldCc7XG4gIHNlbGVjdE9wdGlvbnMgPSB0aGlzLl9nZXRTZWxlY3RPcHRpb25zKCk7XG4gIHRpbWVab25lT3B0aW9ucyA9IHRpbWVab25lcy5tYXAoKHR6KSA9PiAoeyBsYWJlbDogdHosIHZhbHVlOiB0eiB9KSk7XG4gIHN0YXRlOiBhbnk7XG4gIGZvcm0hOiBVbnR5cGVkRm9ybUdyb3VwO1xuXG4gIHByaXZhdGUgX2lzRGlydHkgPSBmYWxzZTtcbiAgcHJpdmF0ZSBfbWludXRlc0RlZmF1bHQgPSAnMC8xICogMS8xICogPyAqJztcblxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdXNlbGVzcy1jb25zdHJ1Y3RvclxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIF9mYjogVW50eXBlZEZvcm1CdWlsZGVyLFxuICAgIHByaXZhdGUgX2NkcjogQ2hhbmdlRGV0ZWN0b3JSZWZcbiAgKSB7fVxuXG4gIG5nT25Jbml0KCk6IHZvaWQge1xuICAgIHRoaXMuc3RhdGUgPSB0aGlzLl9nZXREZWZhdWx0U3RhdGUoKTtcblxuICAgIGlmICghdGhpcy5zaG93QWR2YW5jZWQpIHtcbiAgICAgIHRoaXMuc2NoZWR1bGVUeXBlcy5wb3AoKTtcbiAgICB9XG5cbiAgICBpZiAoIXRoaXMuc2hvd05vdFNldCkge1xuICAgICAgdGhpcy5zY2hlZHVsZVR5cGVzLnNoaWZ0KCk7XG4gICAgICBpZiAoIXRoaXMuY3JvbikgdGhpcy5jcm9uID0gdGhpcy5fbWludXRlc0RlZmF1bHQ7XG4gICAgfVxuXG4gICAgdGhpcy5faGFuZGxlTW9kZWxDaGFuZ2UodGhpcy5jcm9uKTtcblxuICAgIHRoaXMuZm9ybSA9IHRoaXMuX2ZiLmdyb3VwKHtcbiAgICAgIGFkdmFuY2VkOiBbXG4gICAgICAgIHRoaXMuc3RhdGUuYWR2YW5jZWQuZXhwcmVzc2lvbiA/PyAnJyxcbiAgICAgICAgW3RoaXMuX3ZhbGlkYXRlQWR2YW5jZWRFeHByXVxuICAgICAgXVxuICAgIH0pO1xuICB9XG5cbiAgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcyk6IHZvaWQge1xuICAgIGNvbnN0IG5ld0Nyb24gPSBjaGFuZ2VzLnZhbHVlO1xuICAgIGlmIChuZXdDcm9uICYmICFuZXdDcm9uLmZpcnN0Q2hhbmdlKSB7XG4gICAgICB0aGlzLl9oYW5kbGVNb2RlbENoYW5nZSh0aGlzLmNyb24pO1xuICAgIH1cbiAgfVxuXG4gIHNldEFjdGl2ZVNjaGVkdWxlVHlwZSh2YWx1ZTogc3RyaW5nKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLmRpc2FibGVkKSB7XG4gICAgICB0aGlzLmFjdGl2ZVNjaGVkdWxlVHlwZSA9IHZhbHVlO1xuICAgICAgdGhpcy5yZWdlbmVyYXRlQ3Jvbih0cnVlKTtcbiAgICB9XG4gICAgaWYgKHZhbHVlICYmIHRoaXMuZm9ybSkge1xuICAgICAgaWYgKHZhbHVlID09PSAnQWR2YW5jZWQnKSB7XG4gICAgICAgIHRoaXMuZm9ybS5jb250cm9scy5hZHZhbmNlZC5hZGRWYWxpZGF0b3JzKFZhbGlkYXRvcnMucmVxdWlyZWQpO1xuICAgICAgICB0aGlzLmZvcm0uY29udHJvbHMuYWR2YW5jZWQudXBkYXRlVmFsdWVBbmRWYWxpZGl0eSgpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5mb3JtLmNvbnRyb2xzLmFkdmFuY2VkLnJlbW92ZVZhbGlkYXRvcnMoVmFsaWRhdG9ycy5yZXF1aXJlZCk7XG4gICAgICAgIHRoaXMuZm9ybS5jb250cm9scy5hZHZhbmNlZC5zZXRFcnJvcnMobnVsbCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmVnZW5lcmF0ZUNyb24odGFiQ2hhbmdlPzogYm9vbGVhbik6IHZvaWQge1xuICAgIHRoaXMuX2lzRGlydHkgPSB0cnVlO1xuXG4gICAgc3dpdGNoICh0aGlzLmFjdGl2ZVNjaGVkdWxlVHlwZSkge1xuICAgICAgY2FzZSAnTWludXRlcyc6XG4gICAgICAgIHRoaXMuX3VwZGF0ZUNyb24oYDAvJHt0aGlzLnN0YXRlLm1pbnV0ZXMubWludXRlc30gKiAxLzEgKiA/ICpgKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdIb3VybHknOlxuICAgICAgICB0aGlzLl91cGRhdGVDcm9uKFxuICAgICAgICAgIGAke3RoaXMuc3RhdGUuaG91cmx5Lm1pbnV0ZXN9IDAvJHt0aGlzLnN0YXRlLmhvdXJseS5ob3Vyc30gMS8xICogPyAqYFxuICAgICAgICApO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ0RhaWx5JzpcbiAgICAgICAgc3dpdGNoICh0aGlzLnN0YXRlLmRhaWx5LnN1YlRhYikge1xuICAgICAgICAgIGNhc2UgJ2V2ZXJ5RGF5cyc6XG4gICAgICAgICAgICB0aGlzLl91cGRhdGVDcm9uKFxuICAgICAgICAgICAgICBgJHt0aGlzLnN0YXRlLmRhaWx5LmV2ZXJ5RGF5cy5taW51dGVzfSAke3RoaXMuX2hvdXJUb0Nyb24oXG4gICAgICAgICAgICAgICAgdGhpcy5zdGF0ZS5kYWlseS5ldmVyeURheXMuaG91cnMsXG4gICAgICAgICAgICAgICAgdGhpcy5zdGF0ZS5kYWlseS5ldmVyeURheXMuaG91clR5cGVcbiAgICAgICAgICAgICAgKX0gMS8ke3RoaXMuc3RhdGUuZGFpbHkuZXZlcnlEYXlzLmRheXN9ICogPyAqYFxuICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgY2FzZSAnZXZlcnlXZWVrRGF5JzpcbiAgICAgICAgICAgIHRoaXMuX3VwZGF0ZUNyb24oXG4gICAgICAgICAgICAgIGAke3RoaXMuc3RhdGUuZGFpbHkuZXZlcnlXZWVrRGF5Lm1pbnV0ZXN9ICR7dGhpcy5faG91clRvQ3JvbihcbiAgICAgICAgICAgICAgICB0aGlzLnN0YXRlLmRhaWx5LmV2ZXJ5V2Vla0RheS5ob3VycyxcbiAgICAgICAgICAgICAgICB0aGlzLnN0YXRlLmRhaWx5LmV2ZXJ5V2Vla0RheS5ob3VyVHlwZVxuICAgICAgICAgICAgICApfSA/ICogTU9OLUZSSSAqYFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgY3JvbiBkYWlseSBzdWJ0YWIgc2VsZWN0aW9uJyk7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdXZWVrbHknOiB7XG4gICAgICAgIGNvbnN0IGRheXMgPSB0aGlzLnNlbGVjdE9wdGlvbnMuZGF5c1xuICAgICAgICAgIC5tYXAoKGQpID0+IGQudmFsdWUpXG4gICAgICAgICAgLnJlZHVjZShcbiAgICAgICAgICAgIChhY2MsIGRheSkgPT4gKHRoaXMuc3RhdGUud2Vla2x5W2RheV0gPyBhY2MuY29uY2F0KFtkYXldKSA6IGFjYyksXG4gICAgICAgICAgICBbXSBhcyBzdHJpbmdbXVxuICAgICAgICAgIClcbiAgICAgICAgICAuam9pbignLCcpO1xuICAgICAgICB0aGlzLl91cGRhdGVDcm9uKFxuICAgICAgICAgIGAke3RoaXMuc3RhdGUud2Vla2x5Lm1pbnV0ZXN9ICR7dGhpcy5faG91clRvQ3JvbihcbiAgICAgICAgICAgIHRoaXMuc3RhdGUud2Vla2x5LmhvdXJzLFxuICAgICAgICAgICAgdGhpcy5zdGF0ZS53ZWVrbHkuaG91clR5cGVcbiAgICAgICAgICApfSA/ICogJHtkYXlzfSAqYFxuICAgICAgICApO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGNhc2UgJ01vbnRobHknOiB7XG4gICAgICAgIHN3aXRjaCAodGhpcy5zdGF0ZS5tb250aGx5LnN1YlRhYikge1xuICAgICAgICAgIGNhc2UgJ3NwZWNpZmljRGF5Jzoge1xuICAgICAgICAgICAgY29uc3QgZGF5ID0gdGhpcy5zdGF0ZS5tb250aGx5LnJ1bk9uV2Vla2RheVxuICAgICAgICAgICAgICA/IGAke3RoaXMuc3RhdGUubW9udGhseS5zcGVjaWZpY0RheS5kYXl9V2BcbiAgICAgICAgICAgICAgOiB0aGlzLnN0YXRlLm1vbnRobHkuc3BlY2lmaWNEYXkuZGF5O1xuXG4gICAgICAgICAgICB0aGlzLl91cGRhdGVDcm9uKFxuICAgICAgICAgICAgICBgJHt0aGlzLnN0YXRlLm1vbnRobHkuc3BlY2lmaWNEYXkubWludXRlc30gJHt0aGlzLl9ob3VyVG9Dcm9uKFxuICAgICAgICAgICAgICAgIHRoaXMuc3RhdGUubW9udGhseS5zcGVjaWZpY0RheS5ob3VycyxcbiAgICAgICAgICAgICAgICB0aGlzLnN0YXRlLm1vbnRobHkuc3BlY2lmaWNEYXkuaG91clR5cGVcbiAgICAgICAgICAgICAgKX0gJHtkYXl9IDEvJHt0aGlzLnN0YXRlLm1vbnRobHkuc3BlY2lmaWNEYXkubW9udGhzfSA/ICpgXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICAgIGNhc2UgJ3NwZWNpZmljV2Vla0RheSc6XG4gICAgICAgICAgICB0aGlzLl91cGRhdGVDcm9uKFxuICAgICAgICAgICAgICBgJHt0aGlzLnN0YXRlLm1vbnRobHkuc3BlY2lmaWNXZWVrRGF5Lm1pbnV0ZXN9ICR7dGhpcy5faG91clRvQ3JvbihcbiAgICAgICAgICAgICAgICB0aGlzLnN0YXRlLm1vbnRobHkuc3BlY2lmaWNXZWVrRGF5LmhvdXJzLFxuICAgICAgICAgICAgICAgIHRoaXMuc3RhdGUubW9udGhseS5zcGVjaWZpY1dlZWtEYXkuaG91clR5cGVcbiAgICAgICAgICAgICAgKX0gPyAke3RoaXMuc3RhdGUubW9udGhseS5zcGVjaWZpY1dlZWtEYXkuc3RhcnRNb250aH0vJHtcbiAgICAgICAgICAgICAgICB0aGlzLnN0YXRlLm1vbnRobHkuc3BlY2lmaWNXZWVrRGF5Lm1vbnRoc1xuICAgICAgICAgICAgICB9ICR7dGhpcy5zdGF0ZS5tb250aGx5LnNwZWNpZmljV2Vla0RheS5kYXl9JHtcbiAgICAgICAgICAgICAgICB0aGlzLnN0YXRlLm1vbnRobHkuc3BlY2lmaWNXZWVrRGF5Lm1vbnRoV2Vla1xuICAgICAgICAgICAgICB9ICpgXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBjcm9uIG1vbnRobHkgc3VidGFiIHNlbGVjdGlvbicpO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgY2FzZSAnWWVhcmx5JzpcbiAgICAgICAgc3dpdGNoICh0aGlzLnN0YXRlLnllYXJseS5zdWJUYWIpIHtcbiAgICAgICAgICBjYXNlICdzcGVjaWZpY01vbnRoRGF5Jzoge1xuICAgICAgICAgICAgY29uc3QgZGF5ID0gdGhpcy5zdGF0ZS55ZWFybHkucnVuT25XZWVrZGF5XG4gICAgICAgICAgICAgID8gYCR7dGhpcy5zdGF0ZS55ZWFybHkuc3BlY2lmaWNNb250aERheS5kYXl9V2BcbiAgICAgICAgICAgICAgOiB0aGlzLnN0YXRlLnllYXJseS5zcGVjaWZpY01vbnRoRGF5LmRheTtcblxuICAgICAgICAgICAgdGhpcy5fdXBkYXRlQ3JvbihcbiAgICAgICAgICAgICAgYCR7dGhpcy5zdGF0ZS55ZWFybHkuc3BlY2lmaWNNb250aERheS5taW51dGVzfSAke3RoaXMuX2hvdXJUb0Nyb24oXG4gICAgICAgICAgICAgICAgdGhpcy5zdGF0ZS55ZWFybHkuc3BlY2lmaWNNb250aERheS5ob3VycyxcbiAgICAgICAgICAgICAgICB0aGlzLnN0YXRlLnllYXJseS5zcGVjaWZpY01vbnRoRGF5LmhvdXJUeXBlXG4gICAgICAgICAgICAgICl9ICR7ZGF5fSAke3RoaXMuc3RhdGUueWVhcmx5LnNwZWNpZmljTW9udGhEYXkubW9udGh9ID8gKmBcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgICAgY2FzZSAnc3BlY2lmaWNNb250aFdlZWsnOlxuICAgICAgICAgICAgdGhpcy5fdXBkYXRlQ3JvbihcbiAgICAgICAgICAgICAgYCR7XG4gICAgICAgICAgICAgICAgdGhpcy5zdGF0ZS55ZWFybHkuc3BlY2lmaWNNb250aFdlZWsubWludXRlc1xuICAgICAgICAgICAgICB9ICR7dGhpcy5faG91clRvQ3JvbihcbiAgICAgICAgICAgICAgICB0aGlzLnN0YXRlLnllYXJseS5zcGVjaWZpY01vbnRoV2Vlay5ob3VycyxcbiAgICAgICAgICAgICAgICB0aGlzLnN0YXRlLnllYXJseS5zcGVjaWZpY01vbnRoV2Vlay5ob3VyVHlwZVxuICAgICAgICAgICAgICApfSA/ICR7dGhpcy5zdGF0ZS55ZWFybHkuc3BlY2lmaWNNb250aFdlZWsubW9udGh9ICR7XG4gICAgICAgICAgICAgICAgdGhpcy5zdGF0ZS55ZWFybHkuc3BlY2lmaWNNb250aFdlZWsuZGF5XG4gICAgICAgICAgICAgIH0ke3RoaXMuc3RhdGUueWVhcmx5LnNwZWNpZmljTW9udGhXZWVrLm1vbnRoV2Vla30gKmBcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIGNyb24geWVhcmx5IHN1YnRhYiBzZWxlY3Rpb24nKTtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ0FkdmFuY2VkJzpcbiAgICAgICAgaWYgKCF0YWJDaGFuZ2UpIHRoaXMuX3VwZGF0ZUNyb24odGhpcy5mb3JtLnZhbHVlLmFkdmFuY2VkIHx8ICcnKTtcbiAgICAgICAgdGhpcy5mb3JtLmNvbnRyb2xzLmFkdmFuY2VkLnNldFZhbHVlKHRoaXMuY3Jvbik7XG4gICAgICAgIGJyZWFrO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgaWYgKHRoaXMuc2hvd05vdFNldCkgdGhpcy5fdXBkYXRlQ3JvbignJyk7XG4gICAgICAgIGVsc2UgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIGNyb24gdHlwZScpO1xuICAgIH1cbiAgfVxuXG4gIG9uVGltZVpvbmVDaGFuZ2VkKHZhbHVlOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuc2hvd1RpbWVab25lKSByZXR1cm47XG4gICAgdGhpcy50aW1lWm9uZUNoYW5nZS5lbWl0KHZhbHVlKTtcbiAgfVxuXG4gIG9uVGltZUNoYW5nZWQodmFsdWU6IENwc1RpbWUsIHRhcmdldDogYW55KTogdm9pZCB7XG4gICAgdGFyZ2V0LmhvdXJzID0gdGhpcy5fc3RyaW5nVG9OdW0odmFsdWUuaG91cnMpO1xuICAgIHRhcmdldC5taW51dGVzID0gdGhpcy5fc3RyaW5nVG9OdW0odmFsdWUubWludXRlcyk7XG4gICAgdGhpcy5yZWdlbmVyYXRlQ3JvbigpO1xuICB9XG5cbiAgZm9ybWF0VGltZVZhbHVlKHZhbHVlOiBhbnkpOiBDcHNUaW1lIHtcbiAgICByZXR1cm4ge1xuICAgICAgaG91cnM6IHRoaXMuX251bVRvU3RyaW5nKHZhbHVlLmhvdXJzKSxcbiAgICAgIG1pbnV0ZXM6IHRoaXMuX251bVRvU3RyaW5nKHZhbHVlLm1pbnV0ZXMpXG4gICAgfTtcbiAgfVxuXG4gIHByaXZhdGUgX3VwZGF0ZUNyb24odmFsdWU6IHN0cmluZyk6IHZvaWQge1xuICAgIGlmICh0aGlzLmNyb24gPT09IHZhbHVlKSByZXR1cm47XG4gICAgdGhpcy5jcm9uID0gdmFsdWU7XG4gICAgdGhpcy5jcm9uQ2hhbmdlLmVtaXQodGhpcy5jcm9uKTtcbiAgfVxuXG4gIHByaXZhdGUgX2lzVmFsaWRDcm9uKGNyb246IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIGlmICh0eXBlb2YgY3JvbiAhPT0gJ3N0cmluZycpIHJldHVybiBmYWxzZTtcblxuICAgIGlmICghdGhpcy5zaG93Tm90U2V0KSB7XG4gICAgICBpZiAoIWNyb24pIHJldHVybiBmYWxzZTtcbiAgICB9IGVsc2UgaWYgKGNyb24gPT09ICcnKSByZXR1cm4gdHJ1ZTtcblxuICAgIGNvbnN0IHBhcnRzID0gY3Jvbi5zcGxpdCgnICcpO1xuICAgIGlmIChwYXJ0cy5sZW5ndGggIT09IDYpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIHByaXZhdGUgX3ZhbGlkYXRlQWR2YW5jZWRFeHByKGM6IEZvcm1Db250cm9sKSB7XG4gICAgY29uc3QgY3JvbiA9IGMudmFsdWU7XG4gICAgaWYgKCFjcm9uKSByZXR1cm4gbnVsbDtcblxuICAgIGNvbnN0IHNwbGl0cyA9IGNyb24/LnNwbGl0KCcgJykgfHwgW107XG4gICAgaWYgKHNwbGl0cy5sZW5ndGggIT09IDYpIHJldHVybiB7IGludmFsaWRFeHByZXNzaW9uOiAnSW52YWxpZCBleHByZXNzaW9uJyB9O1xuXG4gICAgY29uc3QgY3JvblNldmVuID0gYDAgJHtjcm9ufWA7XG5cbiAgICByZXR1cm4gY3JvblNldmVuLm1hdGNoKC9cXGQrIDBcXC9cXGQrIFxcKiAxXFwvMSBcXCogXFw/IFxcKi8pIHx8XG4gICAgICBjcm9uU2V2ZW4ubWF0Y2goL1xcZCsgXFxkKyAwXFwvXFxkKyAxXFwvMSBcXCogXFw/IFxcKi8pIHx8XG4gICAgICBjcm9uU2V2ZW4ubWF0Y2goL1xcZCsgXFxkKyBcXGQrIDFcXC9cXGQrIFxcKiBcXD8gXFwqLykgfHxcbiAgICAgIGNyb25TZXZlbi5tYXRjaCgvXFxkKyBcXGQrIFxcZCsgXFw/IFxcKiBNT04tRlJJIFxcKi8pIHx8XG4gICAgICBjcm9uU2V2ZW4ubWF0Y2goXG4gICAgICAgIC9cXGQrIFxcZCsgXFxkKyBcXD8gXFwqIChNT058VFVFfFdFRHxUSFV8RlJJfFNBVHxTVU4pKCwoTU9OfFRVRXxXRUR8VEhVfEZSSXxTQVR8U1VOKSkqIFxcKi9cbiAgICAgICkgfHxcbiAgICAgIGNyb25TZXZlbi5tYXRjaCgvXFxkKyBcXGQrIFxcZCsgKFxcZCt8THxMV3wxVykgMVxcL1xcZCsgXFw/IFxcKi8pIHx8XG4gICAgICBjcm9uU2V2ZW4ubWF0Y2goXG4gICAgICAgIC9cXGQrIFxcZCsgXFxkKyBcXD8gXFxkK1xcL1xcZCsgKE1PTnxUVUV8V0VEfFRIVXxGUkl8U0FUfFNVTikoKCNbMS01XSl8TCkgXFwqL1xuICAgICAgKSB8fFxuICAgICAgY3JvblNldmVuLm1hdGNoKC9cXGQrIFxcZCsgXFxkKyAoXFxkK3xMfExXfDFXKSBcXGQrIFxcPyBcXCovKSB8fFxuICAgICAgY3JvblNldmVuLm1hdGNoKFxuICAgICAgICAvXFxkKyBcXGQrIFxcZCsgXFw/IFxcZCsgKE1PTnxUVUV8V0VEfFRIVXxGUkl8U0FUfFNVTikoKCNbMS01XSl8TCkgXFwqL1xuICAgICAgKVxuICAgICAgPyBudWxsXG4gICAgICA6IHsgaW52YWxpZEV4cHJlc3Npb246ICdJbnZhbGlkIGV4cHJlc3Npb24nIH07XG4gIH1cblxuICBwcml2YXRlIF9nZXRBbVBtSG91cihob3VyOiBudW1iZXIpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLnVzZTI0SG91clRpbWUgPyBob3VyIDogKChob3VyICsgMTEpICUgMTIpICsgMTtcbiAgfVxuXG4gIHByaXZhdGUgX2dldEhvdXJUeXBlKGhvdXI6IG51bWJlcik6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMudXNlMjRIb3VyVGltZSA/IHVuZGVmaW5lZCA6IGhvdXIgPj0gMTIgPyAnUE0nIDogJ0FNJztcbiAgfVxuXG4gIHByaXZhdGUgX2hvdXJUb0Nyb24oaG91cjogbnVtYmVyLCBob3VyVHlwZTogc3RyaW5nKTogbnVtYmVyIHtcbiAgICBpZiAodGhpcy51c2UyNEhvdXJUaW1lKSB7XG4gICAgICByZXR1cm4gaG91cjtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIGhvdXJUeXBlID09PSAnQU0nXG4gICAgICAgID8gaG91ciA9PT0gMTJcbiAgICAgICAgICA/IDBcbiAgICAgICAgICA6IGhvdXJcbiAgICAgICAgOiBob3VyID09PSAxMlxuICAgICAgICAgID8gMTJcbiAgICAgICAgICA6IGhvdXIgKyAxMjtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIF9oYW5kbGVNb2RlbENoYW5nZShjcm9uOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuX2lzVmFsaWRDcm9uKGNyb24pKSB7XG4gICAgICBjb25zb2xlLmVycm9yKCdJbnZhbGlkIGNyb24gdmFsdWU6JywgY3Jvbik7XG4gICAgICB0aGlzLmNyb24gPSB0aGlzLnNob3dOb3RTZXQgPyAnJyA6IHRoaXMuX21pbnV0ZXNEZWZhdWx0O1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmICh0aGlzLl9pc0RpcnR5KSB7XG4gICAgICB0aGlzLl9pc0RpcnR5ID0gZmFsc2U7XG4gICAgICByZXR1cm47XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuX2lzRGlydHkgPSBmYWxzZTtcbiAgICB9XG5cbiAgICBpZiAoIWNyb24gfHwgY3Jvbi5sZW5ndGggPCAxKSB7XG4gICAgICB0aGlzLmFjdGl2ZVNjaGVkdWxlVHlwZSA9ICdOb3Qgc2V0JztcbiAgICAgIHRoaXMuX2Nkci5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgY3JvblNldmVuID0gYDAgJHtjcm9ufWA7XG5cbiAgICBjb25zdCBbbWludXRlcywgaG91cnMsIGRheU9mTW9udGgsIG1vbnRoLCBkYXlPZldlZWtdID0gY3Jvbi5zcGxpdCgnICcpO1xuXG4gICAgaWYgKGNyb25TZXZlbi5tYXRjaCgvXFxkKyAwXFwvXFxkKyBcXCogMVxcLzEgXFwqIFxcPyBcXCovKSkge1xuICAgICAgdGhpcy5hY3RpdmVTY2hlZHVsZVR5cGUgPSAnTWludXRlcyc7XG5cbiAgICAgIHRoaXMuc3RhdGUubWludXRlcy5taW51dGVzID0gTnVtYmVyKG1pbnV0ZXMuc3Vic3RyaW5nKDIpKTtcbiAgICB9IGVsc2UgaWYgKGNyb25TZXZlbi5tYXRjaCgvXFxkKyBcXGQrIDBcXC9cXGQrIDFcXC8xIFxcKiBcXD8gXFwqLykpIHtcbiAgICAgIHRoaXMuYWN0aXZlU2NoZWR1bGVUeXBlID0gJ0hvdXJseSc7XG5cbiAgICAgIHRoaXMuc3RhdGUuaG91cmx5LmhvdXJzID0gTnVtYmVyKGhvdXJzLnN1YnN0cmluZygyKSk7XG4gICAgICB0aGlzLnN0YXRlLmhvdXJseS5taW51dGVzID0gTnVtYmVyKG1pbnV0ZXMpO1xuICAgIH0gZWxzZSBpZiAoY3JvblNldmVuLm1hdGNoKC9cXGQrIFxcZCsgXFxkKyAxXFwvXFxkKyBcXCogXFw/IFxcKi8pKSB7XG4gICAgICB0aGlzLmFjdGl2ZVNjaGVkdWxlVHlwZSA9ICdEYWlseSc7XG5cbiAgICAgIHRoaXMuc3RhdGUuZGFpbHkuc3ViVGFiID0gJ2V2ZXJ5RGF5cyc7XG4gICAgICB0aGlzLnN0YXRlLmRhaWx5LmV2ZXJ5RGF5cy5kYXlzID0gTnVtYmVyKGRheU9mTW9udGguc3Vic3RyaW5nKDIpKTtcbiAgICAgIGNvbnN0IHBhcnNlZEhvdXJzID0gTnVtYmVyKGhvdXJzKTtcbiAgICAgIHRoaXMuc3RhdGUuZGFpbHkuZXZlcnlEYXlzLmhvdXJzID0gdGhpcy5fZ2V0QW1QbUhvdXIocGFyc2VkSG91cnMpO1xuICAgICAgdGhpcy5zdGF0ZS5kYWlseS5ldmVyeURheXMuaG91clR5cGUgPSB0aGlzLl9nZXRIb3VyVHlwZShwYXJzZWRIb3Vycyk7XG4gICAgICB0aGlzLnN0YXRlLmRhaWx5LmV2ZXJ5RGF5cy5taW51dGVzID0gTnVtYmVyKG1pbnV0ZXMpO1xuICAgIH0gZWxzZSBpZiAoY3JvblNldmVuLm1hdGNoKC9cXGQrIFxcZCsgXFxkKyBcXD8gXFwqIE1PTi1GUkkgXFwqLykpIHtcbiAgICAgIHRoaXMuYWN0aXZlU2NoZWR1bGVUeXBlID0gJ0RhaWx5JztcblxuICAgICAgdGhpcy5zdGF0ZS5kYWlseS5zdWJUYWIgPSAnZXZlcnlXZWVrRGF5JztcbiAgICAgIGNvbnN0IHBhcnNlZEhvdXJzID0gTnVtYmVyKGhvdXJzKTtcbiAgICAgIHRoaXMuc3RhdGUuZGFpbHkuZXZlcnlXZWVrRGF5LmhvdXJzID0gdGhpcy5fZ2V0QW1QbUhvdXIocGFyc2VkSG91cnMpO1xuICAgICAgdGhpcy5zdGF0ZS5kYWlseS5ldmVyeVdlZWtEYXkuaG91clR5cGUgPSB0aGlzLl9nZXRIb3VyVHlwZShwYXJzZWRIb3Vycyk7XG4gICAgICB0aGlzLnN0YXRlLmRhaWx5LmV2ZXJ5V2Vla0RheS5taW51dGVzID0gTnVtYmVyKG1pbnV0ZXMpO1xuICAgIH0gZWxzZSBpZiAoXG4gICAgICBjcm9uU2V2ZW4ubWF0Y2goXG4gICAgICAgIC9cXGQrIFxcZCsgXFxkKyBcXD8gXFwqIChNT058VFVFfFdFRHxUSFV8RlJJfFNBVHxTVU4pKCwoTU9OfFRVRXxXRUR8VEhVfEZSSXxTQVR8U1VOKSkqIFxcKi9cbiAgICAgIClcbiAgICApIHtcbiAgICAgIHRoaXMuYWN0aXZlU2NoZWR1bGVUeXBlID0gJ1dlZWtseSc7XG4gICAgICB0aGlzLnNlbGVjdE9wdGlvbnMuZGF5c1xuICAgICAgICAubWFwKChkKSA9PiBkLnZhbHVlKVxuICAgICAgICAuZm9yRWFjaCgod2Vla0RheSkgPT4gKHRoaXMuc3RhdGUud2Vla2x5W3dlZWtEYXldID0gZmFsc2UpKTtcbiAgICAgIGRheU9mV2Vla1xuICAgICAgICAuc3BsaXQoJywnKVxuICAgICAgICAuZm9yRWFjaCgod2Vla0RheSkgPT4gKHRoaXMuc3RhdGUud2Vla2x5W3dlZWtEYXldID0gdHJ1ZSkpO1xuICAgICAgY29uc3QgcGFyc2VkSG91cnMgPSBOdW1iZXIoaG91cnMpO1xuICAgICAgdGhpcy5zdGF0ZS53ZWVrbHkuaG91cnMgPSB0aGlzLl9nZXRBbVBtSG91cihwYXJzZWRIb3Vycyk7XG4gICAgICB0aGlzLnN0YXRlLndlZWtseS5ob3VyVHlwZSA9IHRoaXMuX2dldEhvdXJUeXBlKHBhcnNlZEhvdXJzKTtcbiAgICAgIHRoaXMuc3RhdGUud2Vla2x5Lm1pbnV0ZXMgPSBOdW1iZXIobWludXRlcyk7XG4gICAgfSBlbHNlIGlmIChjcm9uU2V2ZW4ubWF0Y2goL1xcZCsgXFxkKyBcXGQrIChcXGQrfEx8TFd8MVcpIDFcXC9cXGQrIFxcPyBcXCovKSkge1xuICAgICAgdGhpcy5hY3RpdmVTY2hlZHVsZVR5cGUgPSAnTW9udGhseSc7XG4gICAgICB0aGlzLnN0YXRlLm1vbnRobHkuc3ViVGFiID0gJ3NwZWNpZmljRGF5JztcblxuICAgICAgaWYgKGRheU9mTW9udGguaW5kZXhPZignVycpICE9PSAtMSkge1xuICAgICAgICB0aGlzLnN0YXRlLm1vbnRobHkuc3BlY2lmaWNEYXkuZGF5ID0gZGF5T2ZNb250aC5jaGFyQXQoMCk7XG4gICAgICAgIHRoaXMuc3RhdGUubW9udGhseS5ydW5PbldlZWtkYXkgPSB0cnVlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5zdGF0ZS5tb250aGx5LnNwZWNpZmljRGF5LmRheSA9IGRheU9mTW9udGg7XG4gICAgICB9XG5cbiAgICAgIHRoaXMuc3RhdGUubW9udGhseS5zcGVjaWZpY0RheS5tb250aHMgPSBOdW1iZXIobW9udGguc3Vic3RyaW5nKDIpKTtcbiAgICAgIGNvbnN0IHBhcnNlZEhvdXJzID0gTnVtYmVyKGhvdXJzKTtcbiAgICAgIHRoaXMuc3RhdGUubW9udGhseS5zcGVjaWZpY0RheS5ob3VycyA9IHRoaXMuX2dldEFtUG1Ib3VyKHBhcnNlZEhvdXJzKTtcbiAgICAgIHRoaXMuc3RhdGUubW9udGhseS5zcGVjaWZpY0RheS5ob3VyVHlwZSA9IHRoaXMuX2dldEhvdXJUeXBlKHBhcnNlZEhvdXJzKTtcbiAgICAgIHRoaXMuc3RhdGUubW9udGhseS5zcGVjaWZpY0RheS5taW51dGVzID0gTnVtYmVyKG1pbnV0ZXMpO1xuICAgIH0gZWxzZSBpZiAoXG4gICAgICBjcm9uU2V2ZW4ubWF0Y2goXG4gICAgICAgIC9cXGQrIFxcZCsgXFxkKyBcXD8gXFxkK1xcL1xcZCsgKE1PTnxUVUV8V0VEfFRIVXxGUkl8U0FUfFNVTikoKCNbMS01XSl8TCkgXFwqL1xuICAgICAgKVxuICAgICkge1xuICAgICAgY29uc3QgZGF5ID0gZGF5T2ZXZWVrLnN1YnN0cmluZygwLCAzKTtcbiAgICAgIGNvbnN0IG1vbnRoV2VlayA9IGRheU9mV2Vlay5zdWJzdHJpbmcoMyk7XG4gICAgICB0aGlzLmFjdGl2ZVNjaGVkdWxlVHlwZSA9ICdNb250aGx5JztcbiAgICAgIHRoaXMuc3RhdGUubW9udGhseS5zdWJUYWIgPSAnc3BlY2lmaWNXZWVrRGF5JztcbiAgICAgIHRoaXMuc3RhdGUubW9udGhseS5zcGVjaWZpY1dlZWtEYXkubW9udGhXZWVrID0gbW9udGhXZWVrO1xuICAgICAgdGhpcy5zdGF0ZS5tb250aGx5LnNwZWNpZmljV2Vla0RheS5kYXkgPSBkYXk7XG5cbiAgICAgIGlmIChtb250aC5pbmRleE9mKCcvJykgIT09IC0xKSB7XG4gICAgICAgIGNvbnN0IFtzdGFydE1vbnRoLCBtb250aHNdID0gbW9udGguc3BsaXQoJy8nKS5tYXAoTnVtYmVyKTtcbiAgICAgICAgdGhpcy5zdGF0ZS5tb250aGx5LnNwZWNpZmljV2Vla0RheS5tb250aHMgPSBtb250aHM7XG4gICAgICAgIHRoaXMuc3RhdGUubW9udGhseS5zcGVjaWZpY1dlZWtEYXkuc3RhcnRNb250aCA9IHN0YXJ0TW9udGg7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHBhcnNlZEhvdXJzID0gTnVtYmVyKGhvdXJzKTtcbiAgICAgIHRoaXMuc3RhdGUubW9udGhseS5zcGVjaWZpY1dlZWtEYXkuaG91cnMgPSB0aGlzLl9nZXRBbVBtSG91cihwYXJzZWRIb3Vycyk7XG4gICAgICB0aGlzLnN0YXRlLm1vbnRobHkuc3BlY2lmaWNXZWVrRGF5LmhvdXJUeXBlID1cbiAgICAgICAgdGhpcy5fZ2V0SG91clR5cGUocGFyc2VkSG91cnMpO1xuICAgICAgdGhpcy5zdGF0ZS5tb250aGx5LnNwZWNpZmljV2Vla0RheS5taW51dGVzID0gTnVtYmVyKG1pbnV0ZXMpO1xuICAgIH0gZWxzZSBpZiAoY3JvblNldmVuLm1hdGNoKC9cXGQrIFxcZCsgXFxkKyAoXFxkK3xMfExXfDFXKSBcXGQrIFxcPyBcXCovKSkge1xuICAgICAgdGhpcy5hY3RpdmVTY2hlZHVsZVR5cGUgPSAnWWVhcmx5JztcbiAgICAgIHRoaXMuc3RhdGUueWVhcmx5LnN1YlRhYiA9ICdzcGVjaWZpY01vbnRoRGF5JztcbiAgICAgIHRoaXMuc3RhdGUueWVhcmx5LnNwZWNpZmljTW9udGhEYXkubW9udGggPSBOdW1iZXIobW9udGgpO1xuXG4gICAgICBpZiAoZGF5T2ZNb250aC5pbmRleE9mKCdXJykgIT09IC0xKSB7XG4gICAgICAgIHRoaXMuc3RhdGUueWVhcmx5LnNwZWNpZmljTW9udGhEYXkuZGF5ID0gZGF5T2ZNb250aC5jaGFyQXQoMCk7XG4gICAgICAgIHRoaXMuc3RhdGUueWVhcmx5LnJ1bk9uV2Vla2RheSA9IHRydWU7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLnN0YXRlLnllYXJseS5zcGVjaWZpY01vbnRoRGF5LmRheSA9IGRheU9mTW9udGg7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHBhcnNlZEhvdXJzID0gTnVtYmVyKGhvdXJzKTtcbiAgICAgIHRoaXMuc3RhdGUueWVhcmx5LnNwZWNpZmljTW9udGhEYXkuaG91cnMgPSB0aGlzLl9nZXRBbVBtSG91cihwYXJzZWRIb3Vycyk7XG4gICAgICB0aGlzLnN0YXRlLnllYXJseS5zcGVjaWZpY01vbnRoRGF5LmhvdXJUeXBlID1cbiAgICAgICAgdGhpcy5fZ2V0SG91clR5cGUocGFyc2VkSG91cnMpO1xuICAgICAgdGhpcy5zdGF0ZS55ZWFybHkuc3BlY2lmaWNNb250aERheS5taW51dGVzID0gTnVtYmVyKG1pbnV0ZXMpO1xuICAgIH0gZWxzZSBpZiAoXG4gICAgICBjcm9uU2V2ZW4ubWF0Y2goXG4gICAgICAgIC9cXGQrIFxcZCsgXFxkKyBcXD8gXFxkKyAoTU9OfFRVRXxXRUR8VEhVfEZSSXxTQVR8U1VOKSgoI1sxLTVdKXxMKSBcXCovXG4gICAgICApXG4gICAgKSB7XG4gICAgICBjb25zdCBkYXkgPSBkYXlPZldlZWsuc3Vic3RyaW5nKDAsIDMpO1xuICAgICAgY29uc3QgbW9udGhXZWVrID0gZGF5T2ZXZWVrLnN1YnN0cmluZygzKTtcbiAgICAgIHRoaXMuYWN0aXZlU2NoZWR1bGVUeXBlID0gJ1llYXJseSc7XG4gICAgICB0aGlzLnN0YXRlLnllYXJseS5zdWJUYWIgPSAnc3BlY2lmaWNNb250aFdlZWsnO1xuICAgICAgdGhpcy5zdGF0ZS55ZWFybHkuc3BlY2lmaWNNb250aFdlZWsubW9udGhXZWVrID0gbW9udGhXZWVrO1xuICAgICAgdGhpcy5zdGF0ZS55ZWFybHkuc3BlY2lmaWNNb250aFdlZWsuZGF5ID0gZGF5O1xuICAgICAgdGhpcy5zdGF0ZS55ZWFybHkuc3BlY2lmaWNNb250aFdlZWsubW9udGggPSBOdW1iZXIobW9udGgpO1xuICAgICAgY29uc3QgcGFyc2VkSG91cnMgPSBOdW1iZXIoaG91cnMpO1xuICAgICAgdGhpcy5zdGF0ZS55ZWFybHkuc3BlY2lmaWNNb250aFdlZWsuaG91cnMgPVxuICAgICAgICB0aGlzLl9nZXRBbVBtSG91cihwYXJzZWRIb3Vycyk7XG4gICAgICB0aGlzLnN0YXRlLnllYXJseS5zcGVjaWZpY01vbnRoV2Vlay5ob3VyVHlwZSA9XG4gICAgICAgIHRoaXMuX2dldEhvdXJUeXBlKHBhcnNlZEhvdXJzKTtcbiAgICAgIHRoaXMuc3RhdGUueWVhcmx5LnNwZWNpZmljTW9udGhXZWVrLm1pbnV0ZXMgPSBOdW1iZXIobWludXRlcyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuYWN0aXZlU2NoZWR1bGVUeXBlID0gJ0FkdmFuY2VkJztcbiAgICAgIHRoaXMuZm9ybS5jb250cm9scy5hZHZhbmNlZC5zZXRWYWx1ZShjcm9uKTtcbiAgICB9XG4gICAgdGhpcy5fY2RyLmRldGVjdENoYW5nZXMoKTtcbiAgfVxuXG4gIHByaXZhdGUgX2dldERlZmF1bHRTdGF0ZSgpIHtcbiAgICBjb25zdCBbZGVmYXVsdEhvdXJzLCBkZWZhdWx0TWludXRlc10gPSB0aGlzLmRlZmF1bHRUaW1lXG4gICAgICAuc3BsaXQoJzonKVxuICAgICAgLm1hcChOdW1iZXIpO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIG1pbnV0ZXM6IHtcbiAgICAgICAgbWludXRlczogMVxuICAgICAgfSxcbiAgICAgIGhvdXJseToge1xuICAgICAgICBob3VyczogMSxcbiAgICAgICAgbWludXRlczogMFxuICAgICAgfSxcbiAgICAgIGRhaWx5OiB7XG4gICAgICAgIHN1YlRhYjogJ2V2ZXJ5RGF5cycsXG4gICAgICAgIGV2ZXJ5RGF5czoge1xuICAgICAgICAgIGRheXM6IDEsXG4gICAgICAgICAgaG91cnM6IHRoaXMuX2dldEFtUG1Ib3VyKGRlZmF1bHRIb3VycyksXG4gICAgICAgICAgbWludXRlczogZGVmYXVsdE1pbnV0ZXMsXG4gICAgICAgICAgaG91clR5cGU6IHRoaXMuX2dldEhvdXJUeXBlKGRlZmF1bHRIb3VycylcbiAgICAgICAgfSxcbiAgICAgICAgZXZlcnlXZWVrRGF5OiB7XG4gICAgICAgICAgaG91cnM6IHRoaXMuX2dldEFtUG1Ib3VyKGRlZmF1bHRIb3VycyksXG4gICAgICAgICAgbWludXRlczogZGVmYXVsdE1pbnV0ZXMsXG4gICAgICAgICAgaG91clR5cGU6IHRoaXMuX2dldEhvdXJUeXBlKGRlZmF1bHRIb3VycylcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIHdlZWtseToge1xuICAgICAgICBNT046IHRydWUsXG4gICAgICAgIFRVRTogZmFsc2UsXG4gICAgICAgIFdFRDogZmFsc2UsXG4gICAgICAgIFRIVTogZmFsc2UsXG4gICAgICAgIEZSSTogZmFsc2UsXG4gICAgICAgIFNBVDogZmFsc2UsXG4gICAgICAgIFNVTjogZmFsc2UsXG4gICAgICAgIGhvdXJzOiB0aGlzLl9nZXRBbVBtSG91cihkZWZhdWx0SG91cnMpLFxuICAgICAgICBtaW51dGVzOiBkZWZhdWx0TWludXRlcyxcbiAgICAgICAgaG91clR5cGU6IHRoaXMuX2dldEhvdXJUeXBlKGRlZmF1bHRIb3VycylcbiAgICAgIH0sXG4gICAgICBtb250aGx5OiB7XG4gICAgICAgIHN1YlRhYjogJ3NwZWNpZmljRGF5JyxcbiAgICAgICAgcnVuT25XZWVrZGF5OiBmYWxzZSxcbiAgICAgICAgc3BlY2lmaWNEYXk6IHtcbiAgICAgICAgICBkYXk6ICcxJyxcbiAgICAgICAgICBtb250aHM6IDEsXG4gICAgICAgICAgaG91cnM6IHRoaXMuX2dldEFtUG1Ib3VyKGRlZmF1bHRIb3VycyksXG4gICAgICAgICAgbWludXRlczogZGVmYXVsdE1pbnV0ZXMsXG4gICAgICAgICAgaG91clR5cGU6IHRoaXMuX2dldEhvdXJUeXBlKGRlZmF1bHRIb3VycylcbiAgICAgICAgfSxcbiAgICAgICAgc3BlY2lmaWNXZWVrRGF5OiB7XG4gICAgICAgICAgbW9udGhXZWVrOiAnIzEnLFxuICAgICAgICAgIGRheTogJ01PTicsXG4gICAgICAgICAgc3RhcnRNb250aDogMSxcbiAgICAgICAgICBtb250aHM6IDEsXG4gICAgICAgICAgaG91cnM6IHRoaXMuX2dldEFtUG1Ib3VyKGRlZmF1bHRIb3VycyksXG4gICAgICAgICAgbWludXRlczogZGVmYXVsdE1pbnV0ZXMsXG4gICAgICAgICAgaG91clR5cGU6IHRoaXMuX2dldEhvdXJUeXBlKGRlZmF1bHRIb3VycylcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIHllYXJseToge1xuICAgICAgICBzdWJUYWI6ICdzcGVjaWZpY01vbnRoRGF5JyxcbiAgICAgICAgcnVuT25XZWVrZGF5OiBmYWxzZSxcbiAgICAgICAgc3BlY2lmaWNNb250aERheToge1xuICAgICAgICAgIG1vbnRoOiAxLFxuICAgICAgICAgIGRheTogJzEnLFxuICAgICAgICAgIGhvdXJzOiB0aGlzLl9nZXRBbVBtSG91cihkZWZhdWx0SG91cnMpLFxuICAgICAgICAgIG1pbnV0ZXM6IGRlZmF1bHRNaW51dGVzLFxuICAgICAgICAgIGhvdXJUeXBlOiB0aGlzLl9nZXRIb3VyVHlwZShkZWZhdWx0SG91cnMpXG4gICAgICAgIH0sXG4gICAgICAgIHNwZWNpZmljTW9udGhXZWVrOiB7XG4gICAgICAgICAgbW9udGhXZWVrOiAnIzEnLFxuICAgICAgICAgIGRheTogJ01PTicsXG4gICAgICAgICAgbW9udGg6IDEsXG4gICAgICAgICAgaG91cnM6IHRoaXMuX2dldEFtUG1Ib3VyKGRlZmF1bHRIb3VycyksXG4gICAgICAgICAgbWludXRlczogZGVmYXVsdE1pbnV0ZXMsXG4gICAgICAgICAgaG91clR5cGU6IHRoaXMuX2dldEhvdXJUeXBlKGRlZmF1bHRIb3VycylcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIGFkdmFuY2VkOiB7XG4gICAgICAgIGV4cHJlc3Npb246IHRoaXMuY3JvblxuICAgICAgfVxuICAgIH07XG4gIH1cblxuICBwcml2YXRlIF9nZXRSYW5nZShzdGFydEZyb206IG51bWJlciwgdW50aWw6IG51bWJlcik6IG51bWJlcltdIHtcbiAgICByZXR1cm4gQXJyYXkuZnJvbShcbiAgICAgIHsgbGVuZ3RoOiB1bnRpbCArIDEgLSBzdGFydEZyb20gfSxcbiAgICAgIChfLCBrKSA9PiBrICsgc3RhcnRGcm9tXG4gICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgX2dldFNlbGVjdE9wdGlvbnMoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIG1vbnRoc051bWVyaWM6IHRoaXMuX2dldFJhbmdlKDEsIDEyKS5tYXAoKG1vbnRoKSA9PiAoe1xuICAgICAgICBsYWJlbDogbW9udGgsXG4gICAgICAgIHZhbHVlOiBtb250aFxuICAgICAgfSkpLFxuICAgICAgbW9udGhzOiB0aGlzLl9nZXRSYW5nZSgxLCAxMikubWFwKChtb250aCkgPT4gKHtcbiAgICAgICAgbGFiZWw6IE1vbnRoc1ttb250aF0sXG4gICAgICAgIHZhbHVlOiBtb250aFxuICAgICAgfSkpLFxuICAgICAgbW9udGhXZWVrczogT2JqZWN0LmVudHJpZXMoTW9udGhXZWVrcykubWFwKChba2V5LCB2YWx1ZV0pID0+ICh7XG4gICAgICAgIGxhYmVsOiB2YWx1ZSxcbiAgICAgICAgdmFsdWU6IGtleVxuICAgICAgfSkpLFxuICAgICAgZGF5czogT2JqZWN0LmVudHJpZXMoRGF5cykubWFwKChba2V5LCB2YWx1ZV0pID0+ICh7XG4gICAgICAgIGxhYmVsOiB2YWx1ZSxcbiAgICAgICAgdmFsdWU6IGtleVxuICAgICAgfSkpLFxuICAgICAgbWludXRlczogdGhpcy5fZ2V0UmFuZ2UoMSwgNTkpLm1hcCgobWluKSA9PiAoe1xuICAgICAgICBsYWJlbDogbWluLFxuICAgICAgICB2YWx1ZTogbWluXG4gICAgICB9KSksXG4gICAgICBmdWxsTWludXRlczogdGhpcy5fZ2V0UmFuZ2UoMCwgNTkpLm1hcCgobWluKSA9PiAoe1xuICAgICAgICBsYWJlbDogdGhpcy5fbnVtVG9TdHJpbmcobWluKSxcbiAgICAgICAgdmFsdWU6IG1pblxuICAgICAgfSkpLFxuICAgICAgaG91cnM6IHRoaXMuX2dldFJhbmdlKDEsIDIzKS5tYXAoKGhvdXIpID0+ICh7XG4gICAgICAgIGxhYmVsOiBob3VyLFxuICAgICAgICB2YWx1ZTogaG91clxuICAgICAgfSkpLFxuICAgICAgbW9udGhEYXlzOiB0aGlzLl9nZXRSYW5nZSgxLCAzMSkubWFwKChkYXkpID0+ICh7XG4gICAgICAgIGxhYmVsOiBkYXksXG4gICAgICAgIHZhbHVlOiBkYXlcbiAgICAgIH0pKSxcbiAgICAgIG1vbnRoRGF5c1dpdGhMYXN0czogWy4uLnRoaXMuX2dldFJhbmdlKDEsIDMxKS5tYXAoU3RyaW5nKSwgJ0wnXS5tYXAoXG4gICAgICAgIChtZGwpID0+IHtcbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgbGFiZWw6IHRoaXMuX2dldE1vbnRoRGF5TGFiZWwobWRsKSxcbiAgICAgICAgICAgIHZhbHVlOiBtZGxcbiAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICApXG4gICAgfTtcbiAgfVxuXG4gIHByaXZhdGUgX2dldE1vbnRoRGF5TGFiZWwobW9udGg6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgaWYgKG1vbnRoID09PSAnTCcpIHtcbiAgICAgIHJldHVybiAnTGFzdCBEYXknO1xuICAgIH0gZWxzZSBpZiAobW9udGggPT09ICdMVycpIHtcbiAgICAgIHJldHVybiAnTGFzdCBXZWVrZGF5JztcbiAgICB9IGVsc2UgaWYgKG1vbnRoID09PSAnMVcnKSB7XG4gICAgICByZXR1cm4gJ0ZpcnN0IFdlZWtkYXknO1xuICAgIH0gZWxzZSB7XG4gICAgICBsZXQgc3VmZml4ID0gJyc7XG4gICAgICBpZiAobW9udGgubGVuZ3RoID4gMSkge1xuICAgICAgICBjb25zdCBzZWNvbmRUb0xhc3REaWdpdCA9IG1vbnRoLmNoYXJBdChtb250aC5sZW5ndGggLSAyKTtcbiAgICAgICAgaWYgKHNlY29uZFRvTGFzdERpZ2l0ID09PSAnMScpIHtcbiAgICAgICAgICBzdWZmaXggPSAndGgnO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAoIXN1ZmZpeCkge1xuICAgICAgICBjb25zdCBsYXN0RGlnaXQgPSBtb250aC5jaGFyQXQobW9udGgubGVuZ3RoIC0gMSk7XG4gICAgICAgIHN3aXRjaCAobGFzdERpZ2l0KSB7XG4gICAgICAgICAgY2FzZSAnMSc6XG4gICAgICAgICAgICBzdWZmaXggPSAnc3QnO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgY2FzZSAnMic6XG4gICAgICAgICAgICBzdWZmaXggPSAnbmQnO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgY2FzZSAnMyc6XG4gICAgICAgICAgICBzdWZmaXggPSAncmQnO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgIHN1ZmZpeCA9ICd0aCc7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gYCR7bW9udGh9JHtzdWZmaXh9IGRheWA7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBfbnVtVG9TdHJpbmcodmFsdWU6IG51bWJlcik6IHN0cmluZyB7XG4gICAgcmV0dXJuIHZhbHVlID49IDAgJiYgdmFsdWUgPD0gOSA/ICcwJyArIHZhbHVlIDogdmFsdWUudG9TdHJpbmcoKTtcbiAgfVxuXG4gIHByaXZhdGUgX3N0cmluZ1RvTnVtKHZhbHVlOiBzdHJpbmcpOiBudW1iZXIge1xuICAgIGNvbnN0IHJlcyA9IE51bWJlcih2YWx1ZSk7XG4gICAgcmV0dXJuIGlzTmFOKHJlcykgPyAwIDogcmVzO1xuICB9XG59XG4iLCI8ZGl2IGNsYXNzPVwiY3BzLXNjaGVkdWxlci1zZWxlY3RvclwiPlxuICA8Y3BzLWJ1dHRvbi10b2dnbGVcbiAgICBbb3B0aW9uc109XCJzY2hlZHVsZVR5cGVzXCJcbiAgICBbZGlzYWJsZWRdPVwiZGlzYWJsZWRcIlxuICAgIFtsYWJlbF09XCJsYWJlbFwiXG4gICAgW2luZm9Ub29sdGlwXT1cImluZm9Ub29sdGlwXCJcbiAgICBbKG5nTW9kZWwpXT1cImFjdGl2ZVNjaGVkdWxlVHlwZVwiXG4gICAgKG5nTW9kZWxDaGFuZ2UpPVwic2V0QWN0aXZlU2NoZWR1bGVUeXBlKCRldmVudClcIj5cbiAgPC9jcHMtYnV0dG9uLXRvZ2dsZT5cbjwvZGl2PlxuXG48ZGl2XG4gIFtuZ1N3aXRjaF09XCJhY3RpdmVTY2hlZHVsZVR5cGVcIlxuICBjbGFzcz1cImNwcy1zY2hlZHVsZXItY29udGFpbmVyXCJcbiAgW25nQ2xhc3NdPVwieyAnY3BzLXNjaGVkdWxlci1jb250YWluZXItZGlzYWJsZWQnOiBkaXNhYmxlZCB9XCI+XG4gIDxkaXYgKm5nU3dpdGNoQ2FzZT1cIidOb3Qgc2V0J1wiIGNsYXNzPVwiY3BzLXNjaGVkdWxlci10YWItcGFuZVwiPjwvZGl2PlxuXG4gIDxkaXYgKm5nU3dpdGNoQ2FzZT1cIidNaW51dGVzJ1wiIGNsYXNzPVwiY3BzLXNjaGVkdWxlci10YWItcGFuZVwiPlxuICAgIDxkaXYgY2xhc3M9XCJjcHMtc2NoZWR1bGVyLXRhYi1wYW5lLXJvd1wiPlxuICAgICAgRXZlcnlcbiAgICAgIDxjcHMtc2VsZWN0XG4gICAgICAgIHdpZHRoPVwiNzBweFwiXG4gICAgICAgIFtkaXNhYmxlZF09XCJkaXNhYmxlZFwiXG4gICAgICAgIFtyZXR1cm5PYmplY3RdPVwiZmFsc2VcIlxuICAgICAgICBbaGlkZURldGFpbHNdPVwidHJ1ZVwiXG4gICAgICAgICh2YWx1ZUNoYW5nZWQpPVwicmVnZW5lcmF0ZUNyb24oKVwiXG4gICAgICAgIFsobmdNb2RlbCldPVwic3RhdGUubWludXRlcy5taW51dGVzXCJcbiAgICAgICAgW29wdGlvbnNdPVwic2VsZWN0T3B0aW9ucy5taW51dGVzXCJcbiAgICAgICAgY2xhc3M9XCJjcHMtc2NoZWR1bGVyLXNlbGVjdC1jb250cm9sXCI+XG4gICAgICA8L2Nwcy1zZWxlY3Q+XG4gICAgICBtaW51dGUocylcbiAgICA8L2Rpdj5cbiAgPC9kaXY+XG5cbiAgPGRpdiAqbmdTd2l0Y2hDYXNlPVwiJ0hvdXJseSdcIiBjbGFzcz1cImNwcy1zY2hlZHVsZXItdGFiLXBhbmVcIj5cbiAgICA8ZGl2IGNsYXNzPVwiY3BzLXNjaGVkdWxlci10YWItcGFuZS1yb3dcIj5cbiAgICAgIEV2ZXJ5XG4gICAgICA8Y3BzLXNlbGVjdFxuICAgICAgICB3aWR0aD1cIjcwcHhcIlxuICAgICAgICBbZGlzYWJsZWRdPVwiZGlzYWJsZWRcIlxuICAgICAgICBbcmV0dXJuT2JqZWN0XT1cImZhbHNlXCJcbiAgICAgICAgW2hpZGVEZXRhaWxzXT1cInRydWVcIlxuICAgICAgICAodmFsdWVDaGFuZ2VkKT1cInJlZ2VuZXJhdGVDcm9uKClcIlxuICAgICAgICBbKG5nTW9kZWwpXT1cInN0YXRlLmhvdXJseS5ob3Vyc1wiXG4gICAgICAgIFtvcHRpb25zXT1cInNlbGVjdE9wdGlvbnMuaG91cnNcIlxuICAgICAgICBjbGFzcz1cImNwcy1zY2hlZHVsZXItc2VsZWN0LWNvbnRyb2xcIj5cbiAgICAgIDwvY3BzLXNlbGVjdD5cbiAgICAgIGhvdXIocykgb24gbWludXRlXG4gICAgICA8Y3BzLXNlbGVjdFxuICAgICAgICB3aWR0aD1cIjcwcHhcIlxuICAgICAgICBbZGlzYWJsZWRdPVwiZGlzYWJsZWRcIlxuICAgICAgICBbcmV0dXJuT2JqZWN0XT1cImZhbHNlXCJcbiAgICAgICAgW2hpZGVEZXRhaWxzXT1cInRydWVcIlxuICAgICAgICAodmFsdWVDaGFuZ2VkKT1cInJlZ2VuZXJhdGVDcm9uKClcIlxuICAgICAgICBbKG5nTW9kZWwpXT1cInN0YXRlLmhvdXJseS5taW51dGVzXCJcbiAgICAgICAgW29wdGlvbnNdPVwic2VsZWN0T3B0aW9ucy5mdWxsTWludXRlc1wiXG4gICAgICAgIGNsYXNzPVwiY3BzLXNjaGVkdWxlci1zZWxlY3QtY29udHJvbFwiPlxuICAgICAgPC9jcHMtc2VsZWN0PlxuICAgIDwvZGl2PlxuICA8L2Rpdj5cblxuICA8ZGl2ICpuZ1N3aXRjaENhc2U9XCInRGFpbHknXCIgY2xhc3M9XCJjcHMtc2NoZWR1bGVyLXRhYi1wYW5lXCI+XG4gICAgPGNwcy1yYWRpby1ncm91cFxuICAgICAgWyhuZ01vZGVsKV09XCJzdGF0ZS5kYWlseS5zdWJUYWJcIlxuICAgICAgKHZhbHVlQ2hhbmdlZCk9XCJyZWdlbmVyYXRlQ3JvbigpXCJcbiAgICAgIFt2ZXJ0aWNhbF09XCJ0cnVlXCI+XG4gICAgICA8Y3BzLXJhZGlvIFtvcHRpb25dPVwieyB2YWx1ZTogJ2V2ZXJ5RGF5cycsIGRpc2FibGVkOiBkaXNhYmxlZCB9XCI+XG4gICAgICAgIDxkaXZcbiAgICAgICAgICBjbGFzcz1cImNwcy1zY2hlZHVsZXItdGFiLXBhbmUtcm93XCJcbiAgICAgICAgICBbbmdDbGFzc109XCJ7XG4gICAgICAgICAgICAnY3BzLXNjaGVkdWxlci10YWItcGFuZS1yb3ctZGlzYWJsZWQnOlxuICAgICAgICAgICAgICBzdGF0ZS5kYWlseS5zdWJUYWIgIT09ICdldmVyeURheXMnXG4gICAgICAgICAgfVwiPlxuICAgICAgICAgIEV2ZXJ5XG4gICAgICAgICAgPGNwcy1zZWxlY3RcbiAgICAgICAgICAgIHdpZHRoPVwiNzBweFwiXG4gICAgICAgICAgICBbZGlzYWJsZWRdPVwiZGlzYWJsZWQgfHwgc3RhdGUuZGFpbHkuc3ViVGFiICE9PSAnZXZlcnlEYXlzJ1wiXG4gICAgICAgICAgICBbcmV0dXJuT2JqZWN0XT1cImZhbHNlXCJcbiAgICAgICAgICAgIFtoaWRlRGV0YWlsc109XCJ0cnVlXCJcbiAgICAgICAgICAgICh2YWx1ZUNoYW5nZWQpPVwicmVnZW5lcmF0ZUNyb24oKVwiXG4gICAgICAgICAgICBbKG5nTW9kZWwpXT1cInN0YXRlLmRhaWx5LmV2ZXJ5RGF5cy5kYXlzXCJcbiAgICAgICAgICAgIFtvcHRpb25zXT1cInNlbGVjdE9wdGlvbnMubW9udGhEYXlzXCJcbiAgICAgICAgICAgIGNsYXNzPVwiY3BzLXNjaGVkdWxlci1zZWxlY3QtY29udHJvbFwiPlxuICAgICAgICAgIDwvY3BzLXNlbGVjdD5cbiAgICAgICAgICBkYXkocykgYXRcbiAgICAgICAgICA8Y3BzLXRpbWVwaWNrZXJcbiAgICAgICAgICAgIFtkaXNhYmxlZF09XCJkaXNhYmxlZCB8fCBzdGF0ZS5kYWlseS5zdWJUYWIgIT09ICdldmVyeURheXMnXCJcbiAgICAgICAgICAgIFt1c2UyNEhvdXJUaW1lXT1cInVzZTI0SG91clRpbWVcIlxuICAgICAgICAgICAgW21hbmRhdG9yeVZhbHVlXT1cInRydWVcIlxuICAgICAgICAgICAgW3ZhbHVlXT1cImZvcm1hdFRpbWVWYWx1ZShzdGF0ZS5kYWlseS5ldmVyeURheXMpXCJcbiAgICAgICAgICAgIFtoaWRlRGV0YWlsc109XCJ0cnVlXCJcbiAgICAgICAgICAgICh2YWx1ZUNoYW5nZWQpPVwib25UaW1lQ2hhbmdlZCgkZXZlbnQsIHN0YXRlLmRhaWx5LmV2ZXJ5RGF5cylcIj5cbiAgICAgICAgICA8L2Nwcy10aW1lcGlja2VyPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvY3BzLXJhZGlvPlxuICAgICAgPGNwcy1yYWRpbyBbb3B0aW9uXT1cInsgdmFsdWU6ICdldmVyeVdlZWtEYXknLCBkaXNhYmxlZDogZGlzYWJsZWQgfVwiPlxuICAgICAgICA8ZGl2XG4gICAgICAgICAgY2xhc3M9XCJjcHMtc2NoZWR1bGVyLXRhYi1wYW5lLXJvd1wiXG4gICAgICAgICAgW25nQ2xhc3NdPVwie1xuICAgICAgICAgICAgJ2Nwcy1zY2hlZHVsZXItdGFiLXBhbmUtcm93LWRpc2FibGVkJzpcbiAgICAgICAgICAgICAgc3RhdGUuZGFpbHkuc3ViVGFiICE9PSAnZXZlcnlXZWVrRGF5J1xuICAgICAgICAgIH1cIj5cbiAgICAgICAgICBFdmVyeSB3b3JraW5nIGRheSBhdFxuICAgICAgICAgIDxjcHMtdGltZXBpY2tlclxuICAgICAgICAgICAgW2Rpc2FibGVkXT1cImRpc2FibGVkIHx8IHN0YXRlLmRhaWx5LnN1YlRhYiAhPT0gJ2V2ZXJ5V2Vla0RheSdcIlxuICAgICAgICAgICAgW3VzZTI0SG91clRpbWVdPVwidXNlMjRIb3VyVGltZVwiXG4gICAgICAgICAgICBbbWFuZGF0b3J5VmFsdWVdPVwidHJ1ZVwiXG4gICAgICAgICAgICBbdmFsdWVdPVwiZm9ybWF0VGltZVZhbHVlKHN0YXRlLmRhaWx5LmV2ZXJ5V2Vla0RheSlcIlxuICAgICAgICAgICAgW2hpZGVEZXRhaWxzXT1cInRydWVcIlxuICAgICAgICAgICAgKHZhbHVlQ2hhbmdlZCk9XCJvblRpbWVDaGFuZ2VkKCRldmVudCwgc3RhdGUuZGFpbHkuZXZlcnlXZWVrRGF5KVwiPlxuICAgICAgICAgIDwvY3BzLXRpbWVwaWNrZXI+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9jcHMtcmFkaW8+XG4gICAgPC9jcHMtcmFkaW8tZ3JvdXA+XG4gIDwvZGl2PlxuXG4gIDxkaXYgKm5nU3dpdGNoQ2FzZT1cIidXZWVrbHknXCIgY2xhc3M9XCJjcHMtc2NoZWR1bGVyLXRhYi1wYW5lXCI+XG4gICAgPGRpdiBjbGFzcz1cImNwcy1zY2hlZHVsZXItZGF5cy1jaGVja2JveC1ncm91cFwiPlxuICAgICAgPGNwcy1jaGVja2JveFxuICAgICAgICAodmFsdWVDaGFuZ2VkKT1cInJlZ2VuZXJhdGVDcm9uKClcIlxuICAgICAgICBbZGlzYWJsZWRdPVwiZGlzYWJsZWRcIlxuICAgICAgICBsYWJlbD1cIk1vbmRheVwiXG4gICAgICAgIFsobmdNb2RlbCldPVwic3RhdGUud2Vla2x5Lk1PTlwiPlxuICAgICAgPC9jcHMtY2hlY2tib3g+XG4gICAgICA8Y3BzLWNoZWNrYm94XG4gICAgICAgICh2YWx1ZUNoYW5nZWQpPVwicmVnZW5lcmF0ZUNyb24oKVwiXG4gICAgICAgIFtkaXNhYmxlZF09XCJkaXNhYmxlZFwiXG4gICAgICAgIGxhYmVsPVwiVHVlc2RheVwiXG4gICAgICAgIFsobmdNb2RlbCldPVwic3RhdGUud2Vla2x5LlRVRVwiPlxuICAgICAgPC9jcHMtY2hlY2tib3g+XG4gICAgICA8Y3BzLWNoZWNrYm94XG4gICAgICAgICh2YWx1ZUNoYW5nZWQpPVwicmVnZW5lcmF0ZUNyb24oKVwiXG4gICAgICAgIFtkaXNhYmxlZF09XCJkaXNhYmxlZFwiXG4gICAgICAgIGxhYmVsPVwiV2VkbmVzZGF5XCJcbiAgICAgICAgWyhuZ01vZGVsKV09XCJzdGF0ZS53ZWVrbHkuV0VEXCI+XG4gICAgICA8L2Nwcy1jaGVja2JveD5cbiAgICAgIDxjcHMtY2hlY2tib3hcbiAgICAgICAgKHZhbHVlQ2hhbmdlZCk9XCJyZWdlbmVyYXRlQ3JvbigpXCJcbiAgICAgICAgW2Rpc2FibGVkXT1cImRpc2FibGVkXCJcbiAgICAgICAgbGFiZWw9XCJUaHVyc2RheVwiXG4gICAgICAgIFsobmdNb2RlbCldPVwic3RhdGUud2Vla2x5LlRIVVwiPlxuICAgICAgPC9jcHMtY2hlY2tib3g+XG4gICAgICA8Y3BzLWNoZWNrYm94XG4gICAgICAgICh2YWx1ZUNoYW5nZWQpPVwicmVnZW5lcmF0ZUNyb24oKVwiXG4gICAgICAgIFtkaXNhYmxlZF09XCJkaXNhYmxlZFwiXG4gICAgICAgIGxhYmVsPVwiRnJpZGF5XCJcbiAgICAgICAgWyhuZ01vZGVsKV09XCJzdGF0ZS53ZWVrbHkuRlJJXCI+XG4gICAgICA8L2Nwcy1jaGVja2JveD5cbiAgICAgIDxjcHMtY2hlY2tib3hcbiAgICAgICAgKHZhbHVlQ2hhbmdlZCk9XCJyZWdlbmVyYXRlQ3JvbigpXCJcbiAgICAgICAgW2Rpc2FibGVkXT1cImRpc2FibGVkXCJcbiAgICAgICAgbGFiZWw9XCJTYXR1cmRheVwiXG4gICAgICAgIFsobmdNb2RlbCldPVwic3RhdGUud2Vla2x5LlNBVFwiPlxuICAgICAgPC9jcHMtY2hlY2tib3g+XG4gICAgICA8Y3BzLWNoZWNrYm94XG4gICAgICAgICh2YWx1ZUNoYW5nZWQpPVwicmVnZW5lcmF0ZUNyb24oKVwiXG4gICAgICAgIFtkaXNhYmxlZF09XCJkaXNhYmxlZFwiXG4gICAgICAgIGxhYmVsPVwiU3VuZGF5XCJcbiAgICAgICAgWyhuZ01vZGVsKV09XCJzdGF0ZS53ZWVrbHkuU1VOXCI+XG4gICAgICA8L2Nwcy1jaGVja2JveD5cbiAgICA8L2Rpdj5cbiAgICA8ZGl2IGNsYXNzPVwiY3BzLXNjaGVkdWxlci10YWItcGFuZS1yb3dcIj5cbiAgICAgIGF0XG4gICAgICA8Y3BzLXRpbWVwaWNrZXJcbiAgICAgICAgW2Rpc2FibGVkXT1cImRpc2FibGVkXCJcbiAgICAgICAgW3VzZTI0SG91clRpbWVdPVwidXNlMjRIb3VyVGltZVwiXG4gICAgICAgIFttYW5kYXRvcnlWYWx1ZV09XCJ0cnVlXCJcbiAgICAgICAgW3ZhbHVlXT1cImZvcm1hdFRpbWVWYWx1ZShzdGF0ZS53ZWVrbHkpXCJcbiAgICAgICAgW2hpZGVEZXRhaWxzXT1cInRydWVcIlxuICAgICAgICAodmFsdWVDaGFuZ2VkKT1cIm9uVGltZUNoYW5nZWQoJGV2ZW50LCBzdGF0ZS53ZWVrbHkpXCI+XG4gICAgICA8L2Nwcy10aW1lcGlja2VyPlxuICAgIDwvZGl2PlxuICA8L2Rpdj5cblxuICA8ZGl2ICpuZ1N3aXRjaENhc2U9XCInTW9udGhseSdcIiBjbGFzcz1cImNwcy1zY2hlZHVsZXItdGFiLXBhbmVcIj5cbiAgICA8Y3BzLXJhZGlvLWdyb3VwXG4gICAgICBbKG5nTW9kZWwpXT1cInN0YXRlLm1vbnRobHkuc3ViVGFiXCJcbiAgICAgICh2YWx1ZUNoYW5nZWQpPVwicmVnZW5lcmF0ZUNyb24oKVwiXG4gICAgICBbdmVydGljYWxdPVwidHJ1ZVwiPlxuICAgICAgPGNwcy1yYWRpbyBbb3B0aW9uXT1cInsgdmFsdWU6ICdzcGVjaWZpY0RheScsIGRpc2FibGVkOiBkaXNhYmxlZCB9XCI+XG4gICAgICAgIDxkaXZcbiAgICAgICAgICBjbGFzcz1cImNwcy1zY2hlZHVsZXItdGFiLXBhbmUtcm93XCJcbiAgICAgICAgICBbbmdDbGFzc109XCJ7XG4gICAgICAgICAgICAnY3BzLXNjaGVkdWxlci10YWItcGFuZS1yb3ctZGlzYWJsZWQnOlxuICAgICAgICAgICAgICBzdGF0ZS5tb250aGx5LnN1YlRhYiAhPT0gJ3NwZWNpZmljRGF5J1xuICAgICAgICAgIH1cIj5cbiAgICAgICAgICBPbiB0aGVcbiAgICAgICAgICA8Y3BzLXNlbGVjdFxuICAgICAgICAgICAgd2lkdGg9XCIxMjBweFwiXG4gICAgICAgICAgICBbZGlzYWJsZWRdPVwiZGlzYWJsZWQgfHwgc3RhdGUubW9udGhseS5zdWJUYWIgIT09ICdzcGVjaWZpY0RheSdcIlxuICAgICAgICAgICAgW3JldHVybk9iamVjdF09XCJmYWxzZVwiXG4gICAgICAgICAgICBbaGlkZURldGFpbHNdPVwidHJ1ZVwiXG4gICAgICAgICAgICAodmFsdWVDaGFuZ2VkKT1cInJlZ2VuZXJhdGVDcm9uKClcIlxuICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJzdGF0ZS5tb250aGx5LnNwZWNpZmljRGF5LmRheVwiXG4gICAgICAgICAgICBbb3B0aW9uc109XCJzZWxlY3RPcHRpb25zLm1vbnRoRGF5c1dpdGhMYXN0c1wiXG4gICAgICAgICAgICBjbGFzcz1cImNwcy1zY2hlZHVsZXItc2VsZWN0LWNvbnRyb2xcIj5cbiAgICAgICAgICA8L2Nwcy1zZWxlY3Q+XG4gICAgICAgICAgb2YgZXZlcnlcbiAgICAgICAgICA8Y3BzLXNlbGVjdFxuICAgICAgICAgICAgd2lkdGg9XCI3MHB4XCJcbiAgICAgICAgICAgIFtkaXNhYmxlZF09XCJkaXNhYmxlZCB8fCBzdGF0ZS5tb250aGx5LnN1YlRhYiAhPT0gJ3NwZWNpZmljRGF5J1wiXG4gICAgICAgICAgICBbcmV0dXJuT2JqZWN0XT1cImZhbHNlXCJcbiAgICAgICAgICAgIFtoaWRlRGV0YWlsc109XCJ0cnVlXCJcbiAgICAgICAgICAgICh2YWx1ZUNoYW5nZWQpPVwicmVnZW5lcmF0ZUNyb24oKVwiXG4gICAgICAgICAgICBbKG5nTW9kZWwpXT1cInN0YXRlLm1vbnRobHkuc3BlY2lmaWNEYXkubW9udGhzXCJcbiAgICAgICAgICAgIFtvcHRpb25zXT1cInNlbGVjdE9wdGlvbnMubW9udGhzTnVtZXJpY1wiXG4gICAgICAgICAgICBjbGFzcz1cImNwcy1zY2hlZHVsZXItc2VsZWN0LWNvbnRyb2xcIj5cbiAgICAgICAgICA8L2Nwcy1zZWxlY3Q+XG4gICAgICAgICAgbW9udGgocykgYXRcbiAgICAgICAgICA8Y3BzLXRpbWVwaWNrZXJcbiAgICAgICAgICAgIFtkaXNhYmxlZF09XCJkaXNhYmxlZCB8fCBzdGF0ZS5tb250aGx5LnN1YlRhYiAhPT0gJ3NwZWNpZmljRGF5J1wiXG4gICAgICAgICAgICBbdXNlMjRIb3VyVGltZV09XCJ1c2UyNEhvdXJUaW1lXCJcbiAgICAgICAgICAgIFttYW5kYXRvcnlWYWx1ZV09XCJ0cnVlXCJcbiAgICAgICAgICAgIFt2YWx1ZV09XCJmb3JtYXRUaW1lVmFsdWUoc3RhdGUubW9udGhseS5zcGVjaWZpY0RheSlcIlxuICAgICAgICAgICAgW2hpZGVEZXRhaWxzXT1cInRydWVcIlxuICAgICAgICAgICAgKHZhbHVlQ2hhbmdlZCk9XCJvblRpbWVDaGFuZ2VkKCRldmVudCwgc3RhdGUubW9udGhseS5zcGVjaWZpY0RheSlcIj5cbiAgICAgICAgICA8L2Nwcy10aW1lcGlja2VyPlxuICAgICAgICAgIDxjcHMtY2hlY2tib3hcbiAgICAgICAgICAgICh2YWx1ZUNoYW5nZWQpPVwicmVnZW5lcmF0ZUNyb24oKVwiXG4gICAgICAgICAgICBbZGlzYWJsZWRdPVwiZGlzYWJsZWQgfHwgc3RhdGUubW9udGhseS5zdWJUYWIgIT09ICdzcGVjaWZpY0RheSdcIlxuICAgICAgICAgICAgbGFiZWw9XCJEdXJpbmcgdGhlIG5lYXJlc3Qgd2Vla2RheVwiXG4gICAgICAgICAgICBbKG5nTW9kZWwpXT1cInN0YXRlLm1vbnRobHkucnVuT25XZWVrZGF5XCJcbiAgICAgICAgICAgIGNsYXNzPVwiY3BzLXNjaGVkdWxlci1uZWFyZXN0LXdlZWtkYXktY2hlY2tib3hcIj5cbiAgICAgICAgICA8L2Nwcy1jaGVja2JveD5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Nwcy1yYWRpbz5cblxuICAgICAgPGNwcy1yYWRpbyBbb3B0aW9uXT1cInsgdmFsdWU6ICdzcGVjaWZpY1dlZWtEYXknLCBkaXNhYmxlZDogZGlzYWJsZWQgfVwiPlxuICAgICAgICA8ZGl2XG4gICAgICAgICAgY2xhc3M9XCJjcHMtc2NoZWR1bGVyLXRhYi1wYW5lLXJvd1wiXG4gICAgICAgICAgW25nQ2xhc3NdPVwie1xuICAgICAgICAgICAgJ2Nwcy1zY2hlZHVsZXItdGFiLXBhbmUtcm93LWRpc2FibGVkJzpcbiAgICAgICAgICAgICAgc3RhdGUubW9udGhseS5zdWJUYWIgIT09ICdzcGVjaWZpY1dlZWtEYXknXG4gICAgICAgICAgfVwiPlxuICAgICAgICAgIE9uIHRoZVxuICAgICAgICAgIDxjcHMtc2VsZWN0XG4gICAgICAgICAgICB3aWR0aD1cIjEwNnB4XCJcbiAgICAgICAgICAgIFtkaXNhYmxlZF09XCJkaXNhYmxlZCB8fCBzdGF0ZS5tb250aGx5LnN1YlRhYiAhPT0gJ3NwZWNpZmljV2Vla0RheSdcIlxuICAgICAgICAgICAgW3JldHVybk9iamVjdF09XCJmYWxzZVwiXG4gICAgICAgICAgICBbaGlkZURldGFpbHNdPVwidHJ1ZVwiXG4gICAgICAgICAgICAodmFsdWVDaGFuZ2VkKT1cInJlZ2VuZXJhdGVDcm9uKClcIlxuICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJzdGF0ZS5tb250aGx5LnNwZWNpZmljV2Vla0RheS5tb250aFdlZWtcIlxuICAgICAgICAgICAgW29wdGlvbnNdPVwic2VsZWN0T3B0aW9ucy5tb250aFdlZWtzXCJcbiAgICAgICAgICAgIGNsYXNzPVwiY3BzLXNjaGVkdWxlci1zZWxlY3QtY29udHJvbFwiPlxuICAgICAgICAgIDwvY3BzLXNlbGVjdD5cbiAgICAgICAgICA8Y3BzLXNlbGVjdFxuICAgICAgICAgICAgd2lkdGg9XCIxMzBweFwiXG4gICAgICAgICAgICBbZGlzYWJsZWRdPVwiZGlzYWJsZWQgfHwgc3RhdGUubW9udGhseS5zdWJUYWIgIT09ICdzcGVjaWZpY1dlZWtEYXknXCJcbiAgICAgICAgICAgIFtyZXR1cm5PYmplY3RdPVwiZmFsc2VcIlxuICAgICAgICAgICAgW2hpZGVEZXRhaWxzXT1cInRydWVcIlxuICAgICAgICAgICAgKHZhbHVlQ2hhbmdlZCk9XCJyZWdlbmVyYXRlQ3JvbigpXCJcbiAgICAgICAgICAgIFsobmdNb2RlbCldPVwic3RhdGUubW9udGhseS5zcGVjaWZpY1dlZWtEYXkuZGF5XCJcbiAgICAgICAgICAgIFtvcHRpb25zXT1cInNlbGVjdE9wdGlvbnMuZGF5c1wiXG4gICAgICAgICAgICBjbGFzcz1cImNwcy1zY2hlZHVsZXItc2VsZWN0LWNvbnRyb2xcIj5cbiAgICAgICAgICA8L2Nwcy1zZWxlY3Q+XG4gICAgICAgICAgb2YgZXZlcnlcbiAgICAgICAgICA8Y3BzLXNlbGVjdFxuICAgICAgICAgICAgd2lkdGg9XCI5MHB4XCJcbiAgICAgICAgICAgIFtkaXNhYmxlZF09XCJkaXNhYmxlZCB8fCBzdGF0ZS5tb250aGx5LnN1YlRhYiAhPT0gJ3NwZWNpZmljV2Vla0RheSdcIlxuICAgICAgICAgICAgW3JldHVybk9iamVjdF09XCJmYWxzZVwiXG4gICAgICAgICAgICBbaGlkZURldGFpbHNdPVwidHJ1ZVwiXG4gICAgICAgICAgICAodmFsdWVDaGFuZ2VkKT1cInJlZ2VuZXJhdGVDcm9uKClcIlxuICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJzdGF0ZS5tb250aGx5LnNwZWNpZmljV2Vla0RheS5tb250aHNcIlxuICAgICAgICAgICAgW29wdGlvbnNdPVwic2VsZWN0T3B0aW9ucy5tb250aHNOdW1lcmljXCJcbiAgICAgICAgICAgIGNsYXNzPVwiY3BzLXNjaGVkdWxlci1zZWxlY3QtY29udHJvbFwiPlxuICAgICAgICAgIDwvY3BzLXNlbGVjdD5cbiAgICAgICAgICBtb250aChzKSBzdGFydGluZyBpblxuICAgICAgICAgIDxjcHMtc2VsZWN0XG4gICAgICAgICAgICB3aWR0aD1cIjEyMHB4XCJcbiAgICAgICAgICAgIFtkaXNhYmxlZF09XCJkaXNhYmxlZCB8fCBzdGF0ZS5tb250aGx5LnN1YlRhYiAhPT0gJ3NwZWNpZmljV2Vla0RheSdcIlxuICAgICAgICAgICAgW3JldHVybk9iamVjdF09XCJmYWxzZVwiXG4gICAgICAgICAgICBbaGlkZURldGFpbHNdPVwidHJ1ZVwiXG4gICAgICAgICAgICAodmFsdWVDaGFuZ2VkKT1cInJlZ2VuZXJhdGVDcm9uKClcIlxuICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJzdGF0ZS5tb250aGx5LnNwZWNpZmljV2Vla0RheS5zdGFydE1vbnRoXCJcbiAgICAgICAgICAgIFtvcHRpb25zXT1cInNlbGVjdE9wdGlvbnMubW9udGhzXCJcbiAgICAgICAgICAgIGNsYXNzPVwiY3BzLXNjaGVkdWxlci1zZWxlY3QtY29udHJvbFwiPlxuICAgICAgICAgIDwvY3BzLXNlbGVjdD5cbiAgICAgICAgICBhdFxuICAgICAgICAgIDxjcHMtdGltZXBpY2tlclxuICAgICAgICAgICAgW2Rpc2FibGVkXT1cImRpc2FibGVkIHx8IHN0YXRlLm1vbnRobHkuc3ViVGFiICE9PSAnc3BlY2lmaWNXZWVrRGF5J1wiXG4gICAgICAgICAgICBbdXNlMjRIb3VyVGltZV09XCJ1c2UyNEhvdXJUaW1lXCJcbiAgICAgICAgICAgIFttYW5kYXRvcnlWYWx1ZV09XCJ0cnVlXCJcbiAgICAgICAgICAgIFt2YWx1ZV09XCJmb3JtYXRUaW1lVmFsdWUoc3RhdGUubW9udGhseS5zcGVjaWZpY1dlZWtEYXkpXCJcbiAgICAgICAgICAgIFtoaWRlRGV0YWlsc109XCJ0cnVlXCJcbiAgICAgICAgICAgICh2YWx1ZUNoYW5nZWQpPVwiXG4gICAgICAgICAgICAgIG9uVGltZUNoYW5nZWQoJGV2ZW50LCBzdGF0ZS5tb250aGx5LnNwZWNpZmljV2Vla0RheSlcbiAgICAgICAgICAgIFwiPlxuICAgICAgICAgIDwvY3BzLXRpbWVwaWNrZXI+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9jcHMtcmFkaW8+XG4gICAgPC9jcHMtcmFkaW8tZ3JvdXA+XG4gIDwvZGl2PlxuXG4gIDxkaXYgKm5nU3dpdGNoQ2FzZT1cIidZZWFybHknXCIgY2xhc3M9XCJjcHMtc2NoZWR1bGVyLXRhYi1wYW5lXCI+XG4gICAgPGNwcy1yYWRpby1ncm91cFxuICAgICAgWyhuZ01vZGVsKV09XCJzdGF0ZS55ZWFybHkuc3ViVGFiXCJcbiAgICAgICh2YWx1ZUNoYW5nZWQpPVwicmVnZW5lcmF0ZUNyb24oKVwiXG4gICAgICBbdmVydGljYWxdPVwidHJ1ZVwiPlxuICAgICAgPGNwcy1yYWRpbyBbb3B0aW9uXT1cInsgdmFsdWU6ICdzcGVjaWZpY01vbnRoRGF5JywgZGlzYWJsZWQ6IGRpc2FibGVkIH1cIj5cbiAgICAgICAgPGRpdlxuICAgICAgICAgIGNsYXNzPVwiY3BzLXNjaGVkdWxlci10YWItcGFuZS1yb3dcIlxuICAgICAgICAgIFtuZ0NsYXNzXT1cIntcbiAgICAgICAgICAgICdjcHMtc2NoZWR1bGVyLXRhYi1wYW5lLXJvdy1kaXNhYmxlZCc6XG4gICAgICAgICAgICAgIHN0YXRlLnllYXJseS5zdWJUYWIgIT09ICdzcGVjaWZpY01vbnRoRGF5J1xuICAgICAgICAgIH1cIj5cbiAgICAgICAgICBFdmVyeVxuICAgICAgICAgIDxjcHMtc2VsZWN0XG4gICAgICAgICAgICB3aWR0aD1cIjEyMHB4XCJcbiAgICAgICAgICAgIFtkaXNhYmxlZF09XCJkaXNhYmxlZCB8fCBzdGF0ZS55ZWFybHkuc3ViVGFiICE9PSAnc3BlY2lmaWNNb250aERheSdcIlxuICAgICAgICAgICAgW3JldHVybk9iamVjdF09XCJmYWxzZVwiXG4gICAgICAgICAgICBbaGlkZURldGFpbHNdPVwidHJ1ZVwiXG4gICAgICAgICAgICAodmFsdWVDaGFuZ2VkKT1cInJlZ2VuZXJhdGVDcm9uKClcIlxuICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJzdGF0ZS55ZWFybHkuc3BlY2lmaWNNb250aERheS5tb250aFwiXG4gICAgICAgICAgICBbb3B0aW9uc109XCJzZWxlY3RPcHRpb25zLm1vbnRoc1wiXG4gICAgICAgICAgICBjbGFzcz1cImNwcy1zY2hlZHVsZXItc2VsZWN0LWNvbnRyb2xcIj5cbiAgICAgICAgICA8L2Nwcy1zZWxlY3Q+XG4gICAgICAgICAgb24gdGhlXG4gICAgICAgICAgPGNwcy1zZWxlY3RcbiAgICAgICAgICAgIHdpZHRoPVwiMTIwcHhcIlxuICAgICAgICAgICAgW2Rpc2FibGVkXT1cImRpc2FibGVkIHx8IHN0YXRlLnllYXJseS5zdWJUYWIgIT09ICdzcGVjaWZpY01vbnRoRGF5J1wiXG4gICAgICAgICAgICBbcmV0dXJuT2JqZWN0XT1cImZhbHNlXCJcbiAgICAgICAgICAgIFtoaWRlRGV0YWlsc109XCJ0cnVlXCJcbiAgICAgICAgICAgICh2YWx1ZUNoYW5nZWQpPVwicmVnZW5lcmF0ZUNyb24oKVwiXG4gICAgICAgICAgICBbKG5nTW9kZWwpXT1cInN0YXRlLnllYXJseS5zcGVjaWZpY01vbnRoRGF5LmRheVwiXG4gICAgICAgICAgICBbb3B0aW9uc109XCJzZWxlY3RPcHRpb25zLm1vbnRoRGF5c1dpdGhMYXN0c1wiXG4gICAgICAgICAgICBjbGFzcz1cImNwcy1zY2hlZHVsZXItc2VsZWN0LWNvbnRyb2xcIj5cbiAgICAgICAgICA8L2Nwcy1zZWxlY3Q+XG4gICAgICAgICAgYXRcbiAgICAgICAgICA8Y3BzLXRpbWVwaWNrZXJcbiAgICAgICAgICAgIFtkaXNhYmxlZF09XCJkaXNhYmxlZCB8fCBzdGF0ZS55ZWFybHkuc3ViVGFiICE9PSAnc3BlY2lmaWNNb250aERheSdcIlxuICAgICAgICAgICAgW3VzZTI0SG91clRpbWVdPVwidXNlMjRIb3VyVGltZVwiXG4gICAgICAgICAgICBbbWFuZGF0b3J5VmFsdWVdPVwidHJ1ZVwiXG4gICAgICAgICAgICBbdmFsdWVdPVwiZm9ybWF0VGltZVZhbHVlKHN0YXRlLnllYXJseS5zcGVjaWZpY01vbnRoRGF5KVwiXG4gICAgICAgICAgICBbaGlkZURldGFpbHNdPVwidHJ1ZVwiXG4gICAgICAgICAgICAodmFsdWVDaGFuZ2VkKT1cIlxuICAgICAgICAgICAgICBvblRpbWVDaGFuZ2VkKCRldmVudCwgc3RhdGUueWVhcmx5LnNwZWNpZmljTW9udGhEYXkpXG4gICAgICAgICAgICBcIj5cbiAgICAgICAgICA8L2Nwcy10aW1lcGlja2VyPlxuICAgICAgICAgIDxjcHMtY2hlY2tib3hcbiAgICAgICAgICAgICh2YWx1ZUNoYW5nZWQpPVwicmVnZW5lcmF0ZUNyb24oKVwiXG4gICAgICAgICAgICBbZGlzYWJsZWRdPVwiZGlzYWJsZWQgfHwgc3RhdGUueWVhcmx5LnN1YlRhYiAhPT0gJ3NwZWNpZmljTW9udGhEYXknXCJcbiAgICAgICAgICAgIGxhYmVsPVwiRHVyaW5nIHRoZSBuZWFyZXN0IHdlZWtkYXlcIlxuICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJzdGF0ZS55ZWFybHkucnVuT25XZWVrZGF5XCJcbiAgICAgICAgICAgIGNsYXNzPVwiY3BzLXNjaGVkdWxlci1uZWFyZXN0LXdlZWtkYXktY2hlY2tib3hcIj5cbiAgICAgICAgICA8L2Nwcy1jaGVja2JveD5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Nwcy1yYWRpbz5cblxuICAgICAgPGNwcy1yYWRpbyBbb3B0aW9uXT1cInsgdmFsdWU6ICdzcGVjaWZpY01vbnRoV2VlaycsIGRpc2FibGVkOiBkaXNhYmxlZCB9XCI+XG4gICAgICAgIDxkaXZcbiAgICAgICAgICBjbGFzcz1cImNwcy1zY2hlZHVsZXItdGFiLXBhbmUtcm93XCJcbiAgICAgICAgICBbbmdDbGFzc109XCJ7XG4gICAgICAgICAgICAnY3BzLXNjaGVkdWxlci10YWItcGFuZS1yb3ctZGlzYWJsZWQnOlxuICAgICAgICAgICAgICBzdGF0ZS55ZWFybHkuc3ViVGFiICE9PSAnc3BlY2lmaWNNb250aFdlZWsnXG4gICAgICAgICAgfVwiPlxuICAgICAgICAgIE9uIHRoZVxuICAgICAgICAgIDxjcHMtc2VsZWN0XG4gICAgICAgICAgICB3aWR0aD1cIjEwNnB4XCJcbiAgICAgICAgICAgIFtkaXNhYmxlZF09XCJkaXNhYmxlZCB8fCBzdGF0ZS55ZWFybHkuc3ViVGFiICE9PSAnc3BlY2lmaWNNb250aFdlZWsnXCJcbiAgICAgICAgICAgIFtyZXR1cm5PYmplY3RdPVwiZmFsc2VcIlxuICAgICAgICAgICAgW2hpZGVEZXRhaWxzXT1cInRydWVcIlxuICAgICAgICAgICAgKHZhbHVlQ2hhbmdlZCk9XCJyZWdlbmVyYXRlQ3JvbigpXCJcbiAgICAgICAgICAgIFsobmdNb2RlbCldPVwic3RhdGUueWVhcmx5LnNwZWNpZmljTW9udGhXZWVrLm1vbnRoV2Vla1wiXG4gICAgICAgICAgICBbb3B0aW9uc109XCJzZWxlY3RPcHRpb25zLm1vbnRoV2Vla3NcIlxuICAgICAgICAgICAgY2xhc3M9XCJjcHMtc2NoZWR1bGVyLXNlbGVjdC1jb250cm9sXCI+XG4gICAgICAgICAgPC9jcHMtc2VsZWN0PlxuICAgICAgICAgIDxjcHMtc2VsZWN0XG4gICAgICAgICAgICB3aWR0aD1cIjEyMHB4XCJcbiAgICAgICAgICAgIFtkaXNhYmxlZF09XCJkaXNhYmxlZCB8fCBzdGF0ZS55ZWFybHkuc3ViVGFiICE9PSAnc3BlY2lmaWNNb250aFdlZWsnXCJcbiAgICAgICAgICAgIFtyZXR1cm5PYmplY3RdPVwiZmFsc2VcIlxuICAgICAgICAgICAgW2hpZGVEZXRhaWxzXT1cInRydWVcIlxuICAgICAgICAgICAgKHZhbHVlQ2hhbmdlZCk9XCJyZWdlbmVyYXRlQ3JvbigpXCJcbiAgICAgICAgICAgIFsobmdNb2RlbCldPVwic3RhdGUueWVhcmx5LnNwZWNpZmljTW9udGhXZWVrLmRheVwiXG4gICAgICAgICAgICBbb3B0aW9uc109XCJzZWxlY3RPcHRpb25zLmRheXNcIlxuICAgICAgICAgICAgY2xhc3M9XCJjcHMtc2NoZWR1bGVyLXNlbGVjdC1jb250cm9sXCI+XG4gICAgICAgICAgPC9jcHMtc2VsZWN0PlxuICAgICAgICAgIG9mXG4gICAgICAgICAgPGNwcy1zZWxlY3RcbiAgICAgICAgICAgIHdpZHRoPVwiMTIwcHhcIlxuICAgICAgICAgICAgW2Rpc2FibGVkXT1cImRpc2FibGVkIHx8IHN0YXRlLnllYXJseS5zdWJUYWIgIT09ICdzcGVjaWZpY01vbnRoV2VlaydcIlxuICAgICAgICAgICAgW3JldHVybk9iamVjdF09XCJmYWxzZVwiXG4gICAgICAgICAgICBbaGlkZURldGFpbHNdPVwidHJ1ZVwiXG4gICAgICAgICAgICAodmFsdWVDaGFuZ2VkKT1cInJlZ2VuZXJhdGVDcm9uKClcIlxuICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJzdGF0ZS55ZWFybHkuc3BlY2lmaWNNb250aFdlZWsubW9udGhcIlxuICAgICAgICAgICAgW29wdGlvbnNdPVwic2VsZWN0T3B0aW9ucy5tb250aHNcIlxuICAgICAgICAgICAgY2xhc3M9XCJjcHMtc2NoZWR1bGVyLXNlbGVjdC1jb250cm9sXCI+XG4gICAgICAgICAgPC9jcHMtc2VsZWN0PlxuICAgICAgICAgIGF0XG4gICAgICAgICAgPGNwcy10aW1lcGlja2VyXG4gICAgICAgICAgICBbZGlzYWJsZWRdPVwiZGlzYWJsZWQgfHwgc3RhdGUueWVhcmx5LnN1YlRhYiAhPT0gJ3NwZWNpZmljTW9udGhXZWVrJ1wiXG4gICAgICAgICAgICBbdXNlMjRIb3VyVGltZV09XCJ1c2UyNEhvdXJUaW1lXCJcbiAgICAgICAgICAgIFttYW5kYXRvcnlWYWx1ZV09XCJ0cnVlXCJcbiAgICAgICAgICAgIFt2YWx1ZV09XCJmb3JtYXRUaW1lVmFsdWUoc3RhdGUueWVhcmx5LnNwZWNpZmljTW9udGhXZWVrKVwiXG4gICAgICAgICAgICBbaGlkZURldGFpbHNdPVwidHJ1ZVwiXG4gICAgICAgICAgICAodmFsdWVDaGFuZ2VkKT1cIlxuICAgICAgICAgICAgICBvblRpbWVDaGFuZ2VkKCRldmVudCwgc3RhdGUueWVhcmx5LnNwZWNpZmljTW9udGhXZWVrKVxuICAgICAgICAgICAgXCI+XG4gICAgICAgICAgPC9jcHMtdGltZXBpY2tlcj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Nwcy1yYWRpbz5cbiAgICA8L2Nwcy1yYWRpby1ncm91cD5cbiAgPC9kaXY+XG5cbiAgPGRpdiAqbmdTd2l0Y2hDYXNlPVwiJ0FkdmFuY2VkJ1wiPlxuICAgIDxmb3JtIFtmb3JtR3JvdXBdPVwiZm9ybVwiPlxuICAgICAgPGNwcy1pbnB1dFxuICAgICAgICBsYWJlbD1cIlwiXG4gICAgICAgIFtkaXNhYmxlZF09XCJkaXNhYmxlZFwiXG4gICAgICAgIHdpZHRoPVwiNTAwcHhcIlxuICAgICAgICBwbGFjZWhvbGRlcj1cIlBsZWFzZSBlbnRlclwiXG4gICAgICAgIGZvcm1Db250cm9sTmFtZT1cImFkdmFuY2VkXCJcbiAgICAgICAgKHZhbHVlQ2hhbmdlZCk9XCJyZWdlbmVyYXRlQ3JvbigpXCI+XG4gICAgICA8L2Nwcy1pbnB1dD5cbiAgICA8L2Zvcm0+XG4gIDwvZGl2PlxuICA8ZGl2IGNsYXNzPVwiY3BzLXNjaGVkdWxlci10aW1lLXpvbmVcIiAqbmdJZj1cImNyb24gJiYgc2hvd1RpbWVab25lXCI+XG4gICAgPGNwcy1hdXRvY29tcGxldGVcbiAgICAgIGxhYmVsPVwiVGltZSB6b25lXCJcbiAgICAgIFsobmdNb2RlbCldPVwidGltZVpvbmVcIlxuICAgICAgKHZhbHVlQ2hhbmdlZCk9XCJvblRpbWVab25lQ2hhbmdlZCgkZXZlbnQpXCJcbiAgICAgIFtyZXR1cm5PYmplY3RdPVwiZmFsc2VcIlxuICAgICAgd2lkdGg9XCIzMDBcIlxuICAgICAgW29wdGlvbnNdPVwidGltZVpvbmVPcHRpb25zXCI+PC9jcHMtYXV0b2NvbXBsZXRlPlxuICA8L2Rpdj5cbjwvZGl2PlxuIl19
|