@firestitch/report 18.10.0 → 18.10.1
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/app/reports/data/report.data.d.ts +3 -5
- package/app/reports/dialogs/report-settings/report-settings.component.d.ts +30 -2
- package/app/reports/filter-settings-rules.d.ts +4 -0
- package/app/reports/interfaces/report-filter-group-changes.interface.d.ts +7 -0
- package/app/reports/interfaces/report.interface.d.ts +1 -14
- package/app/reports/report-filter-items.d.ts +2 -8
- package/app/reports/report-view-config.d.ts +1 -3
- package/app/reports/services/report-filter-state.service.d.ts +5 -14
- package/app/reports/services/report-view.service.d.ts +1 -13
- package/app/reports/views/report/fs-ai-report.component.d.ts +2 -8
- package/esm2022/app/reports/canvas-landing-page.mjs +7 -6
- package/esm2022/app/reports/components/component-list/component-list.component.mjs +5 -5
- package/esm2022/app/reports/components/report-canvas/report-canvas.component.mjs +13 -12
- package/esm2022/app/reports/components/report-component/report-component.component.mjs +9 -9
- package/esm2022/app/reports/data/report.data.mjs +8 -5
- package/esm2022/app/reports/dialogs/report-settings/report-settings.component.mjs +169 -21
- package/esm2022/app/reports/filter-settings-rules.mjs +8 -1
- package/esm2022/app/reports/interfaces/canvas-landing-input.interface.mjs +1 -1
- package/esm2022/app/reports/interfaces/report-filter-group-changes.interface.mjs +2 -0
- package/esm2022/app/reports/interfaces/report-temporary-state.interface.mjs +1 -1
- package/esm2022/app/reports/interfaces/report-view-config.interface.mjs +1 -1
- package/esm2022/app/reports/interfaces/report.interface.mjs +1 -1
- package/esm2022/app/reports/report-date-presets.mjs +2 -2
- package/esm2022/app/reports/report-filter-items.mjs +25 -105
- package/esm2022/app/reports/report-view-config.mjs +6 -116
- package/esm2022/app/reports/services/report-filter-state.service.mjs +92 -269
- package/esm2022/app/reports/services/report-view.service.mjs +25 -165
- package/esm2022/app/reports/views/report/fs-ai-report.component.mjs +56 -120
- package/esm2022/app/reports/views/report/report.component.mjs +11 -8
- package/fesm2022/{firestitch-report-echarts-UBg8Wlhd.mjs → firestitch-report-echarts-DHEH_K_q.mjs} +2 -2
- package/fesm2022/{firestitch-report-echarts-UBg8Wlhd.mjs.map → firestitch-report-echarts-DHEH_K_q.mjs.map} +1 -1
- package/fesm2022/{firestitch-report-firestitch-report-B1keNrcK.mjs → firestitch-report-firestitch-report-ZcHTnNKq.mjs} +454 -1470
- package/fesm2022/firestitch-report-firestitch-report-ZcHTnNKq.mjs.map +1 -0
- package/fesm2022/firestitch-report.mjs +1 -1
- package/package.json +1 -1
- package/app/reports/interfaces/report-url-link.interface.d.ts +0 -4
- package/app/reports/interfaces/report-url-value-name.type.d.ts +0 -1
- package/app/reports/interfaces/report-url-write.interface.d.ts +0 -4
- package/app/reports/report-url-state.d.ts +0 -36
- package/esm2022/app/reports/interfaces/report-url-link.interface.mjs +0 -2
- package/esm2022/app/reports/interfaces/report-url-value-name.type.mjs +0 -2
- package/esm2022/app/reports/interfaces/report-url-write.interface.mjs +0 -2
- package/esm2022/app/reports/report-url-state.mjs +0 -677
- package/fesm2022/firestitch-report-firestitch-report-B1keNrcK.mjs.map +0 -1
|
@@ -69,112 +69,33 @@ export function relativeLabel(relative) {
|
|
|
69
69
|
// query values back into per-group FilterGroupValues. Shared by the report-bar
|
|
70
70
|
// fs-filter and the per-component fs-filter so both render through the same
|
|
71
71
|
// library and write into ReportFilterStateService identically. Items are named
|
|
72
|
-
// by the group's
|
|
73
|
-
// the group
|
|
72
|
+
// by the group's id (groupItemName), so the query keys map straight back to
|
|
73
|
+
// the group. A report never puts these keys in the browser URL: fs-filter's
|
|
74
|
+
// own query-param syncing is off in every report bar.
|
|
74
75
|
// The query key for the report's group-by control. Fixed rather than derived
|
|
75
76
|
// from an id because a report has exactly one — and it is NOT a filter group,
|
|
76
77
|
// so it is read straight off the change query instead of through
|
|
77
|
-
// groupValuesFromQuery.
|
|
78
|
-
//
|
|
79
|
-
// request's `state.frequency`.
|
|
78
|
+
// groupValuesFromQuery. The grain travels to the server as the data request's
|
|
79
|
+
// `state.frequency`.
|
|
80
80
|
export const GROUP_BY_ITEM = 'groupBy';
|
|
81
|
-
// The
|
|
82
|
-
|
|
83
|
-
// not take one, and report-url-state.ts imports this file.
|
|
84
|
-
// The shared view the state is a diff from, and the open personal view.
|
|
85
|
-
export const VIEW_PARAM = 'rv';
|
|
86
|
-
export const PERSONAL_VIEW_PARAM = 'rpv';
|
|
87
|
-
// The link's format.
|
|
88
|
-
export const FORMAT_PARAM = 'rf';
|
|
89
|
-
// The host's page key (FsAiReportComponent.pageQueryParam), as most hosts
|
|
90
|
-
// name it.
|
|
91
|
-
export const PAGE_PARAM = 'page';
|
|
92
|
-
// The word before a group's id in the key of a group whose label gives no
|
|
93
|
-
// key it can use (filter12).
|
|
94
|
-
const FALLBACK_KEY_WORD = 'filter';
|
|
81
|
+
// The word before a group's id in the name of its fs-filter item (filter12).
|
|
82
|
+
const ITEM_NAME_WORD = 'filter';
|
|
95
83
|
// The query key of one end of an fs-filter range item: the item's name and
|
|
96
84
|
// the end with its first letter upper-cased (fs-filter's getRangeName), so
|
|
97
|
-
//
|
|
85
|
+
// filter12 gives filter12Min and filter12From.
|
|
98
86
|
export function itemRangeName(name, end) {
|
|
99
87
|
return `${name}${end.charAt(0).toUpperCase()}${end.slice(1)}`;
|
|
100
88
|
}
|
|
101
|
-
//
|
|
102
|
-
//
|
|
103
|
-
//
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
// id has it or one of its forms, another link key or bar item uses it, or it
|
|
107
|
-
// is shaped like a tile's id key, such as q4) is the key and the group's id
|
|
108
|
-
// (region12). A label with no letter or digit, or a clash even then, keys on
|
|
109
|
-
// filter<id>. `groups` is every group of the report, so every bar and the
|
|
110
|
-
// link name a group alike.
|
|
111
|
-
export function groupParamKeys(groups) {
|
|
112
|
-
// The URL's other keys and the bar's other items.
|
|
113
|
-
const taken = new Set([
|
|
114
|
-
PAGE_PARAM, GROUP_BY_ITEM, MATCH_ITEM, LIST_SEARCH_ITEM, VIEW_PARAM, PERSONAL_VIEW_PARAM, FORMAT_PARAM,
|
|
115
|
-
]);
|
|
116
|
-
const free = (candidate) => !!candidate
|
|
117
|
-
&& keyForms(candidate).every((form) => !taken.has(form) && !ID_KEY.test(form));
|
|
118
|
-
const keys = new Map();
|
|
119
|
-
[...groups]
|
|
120
|
-
.sort((a, b) => a.id - b.id)
|
|
121
|
-
.forEach((group) => {
|
|
122
|
-
const wanted = labelKey(groupLabel(group));
|
|
123
|
-
const key = [wanted, wanted && `${wanted}${group.id}`].find(free) ?? fallbackKey(group.id, free);
|
|
124
|
-
keyForms(key).forEach((form) => taken.add(form));
|
|
125
|
-
keys.set(group.id, key);
|
|
126
|
-
});
|
|
127
|
-
return keys;
|
|
128
|
-
}
|
|
129
|
-
// filter<id>, or, in the rare report where another group's label already
|
|
130
|
-
// gives that, filter<id> and a count.
|
|
131
|
-
function fallbackKey(groupId, free) {
|
|
132
|
-
const base = `${FALLBACK_KEY_WORD}${groupId}`;
|
|
133
|
-
let key = base;
|
|
134
|
-
for (let count = 2; !free(key); count++) {
|
|
135
|
-
key = `${base}N${count}`;
|
|
136
|
-
}
|
|
137
|
-
return key;
|
|
138
|
-
}
|
|
139
|
-
// A group's key among `groups` (every group of the report). A group that is
|
|
140
|
-
// not among them is keyed as one more of them.
|
|
141
|
-
export function groupParamKey(group, groups) {
|
|
142
|
-
return groupParamKeys(groups.some((candidate) => candidate.id === group.id) ? groups : [...groups, group])
|
|
143
|
-
.get(group.id);
|
|
144
|
-
}
|
|
145
|
-
// The name of a group's fs-filter item: its key among the report's groups.
|
|
146
|
-
export function groupItemName(group, report) {
|
|
147
|
-
return groupParamKey(group, report?.filterGroups ?? []);
|
|
89
|
+
// The name of a group's fs-filter item: 'filter' and the group's id. The id
|
|
90
|
+
// never changes, so neither a new label nor a new name moves a bar's keys,
|
|
91
|
+
// and no item name can take another item's (groupBy, match, listSearch).
|
|
92
|
+
export function groupItemName(group) {
|
|
93
|
+
return `${ITEM_NAME_WORD}${group.id}`;
|
|
148
94
|
}
|
|
149
95
|
// The label a group's chip shows: its own, else its first member's column.
|
|
150
96
|
function groupLabel(group) {
|
|
151
97
|
return group.label || group.filters?.[0]?.filterColumn || '';
|
|
152
98
|
}
|
|
153
|
-
// A letter and then digits: the shape of the URL's tile keys (s31, q31,
|
|
154
|
-
// h31, d44), kept off the groups so a group key never reads as one.
|
|
155
|
-
const ID_KEY = /^[a-z]\d+$/;
|
|
156
|
-
const RANGE_ENDS = ['min', 'max', 'from', 'to'];
|
|
157
|
-
// Every key a group's item or link may write under `key`: the key, its
|
|
158
|
-
// exclude key (excludeRegion) and an fs-filter range's own keys.
|
|
159
|
-
function keyForms(key) {
|
|
160
|
-
return [key, getExcludeName(key), ...RANGE_ENDS.map((end) => itemRangeName(key, end))];
|
|
161
|
-
}
|
|
162
|
-
// A label as a camelCase key: accents dropped, words split on anything that
|
|
163
|
-
// is not a letter or digit (and where a lower-case letter meets an upper-case
|
|
164
|
-
// one), the first word lower-case, every later one capitalized.
|
|
165
|
-
function labelKey(label) {
|
|
166
|
-
return label
|
|
167
|
-
.normalize('NFD')
|
|
168
|
-
.replace(/\p{M}/gu, '')
|
|
169
|
-
.replace(/([a-z0-9])([A-Z])/g, '$1 $2')
|
|
170
|
-
.split(/[^A-Za-z0-9]+/)
|
|
171
|
-
.filter((word) => word !== '')
|
|
172
|
-
.map((word, index) => {
|
|
173
|
-
const lower = word.toLowerCase();
|
|
174
|
-
return index ? lower.charAt(0).toUpperCase() + lower.slice(1) : lower;
|
|
175
|
-
})
|
|
176
|
-
.join('');
|
|
177
|
-
}
|
|
178
99
|
// A select group's distinct options, as { name, value } pairs. The server sends
|
|
179
100
|
// { value, label }: the value is what the filter matches on (an entity's stable
|
|
180
101
|
// id) and the label is what the viewer reads — so a renamed entity keeps its id
|
|
@@ -236,7 +157,7 @@ export const OPTIONS_FAILED_NOTE = 'Could not load the list.';
|
|
|
236
157
|
// columns), and a number range is a min/max control only when it lists
|
|
237
158
|
// numberRange.
|
|
238
159
|
export function filterItemForGroup(group, options, report, initial, features = []) {
|
|
239
|
-
const name = groupItemName(group
|
|
160
|
+
const name = groupItemName(group);
|
|
240
161
|
const label = groupLabel(group);
|
|
241
162
|
switch (group.type) {
|
|
242
163
|
case 'dateRange':
|
|
@@ -276,7 +197,7 @@ function selectFilterItem(group, label, options, report, initial, exclude) {
|
|
|
276
197
|
const picks = excluding ? initial.excludeValues : initial?.values;
|
|
277
198
|
const options$ = options.options(group, report);
|
|
278
199
|
return {
|
|
279
|
-
name: groupItemName(group
|
|
200
|
+
name: groupItemName(group),
|
|
280
201
|
type: ItemType.AutoCompleteChips,
|
|
281
202
|
label,
|
|
282
203
|
fetchOnFocus: true,
|
|
@@ -303,7 +224,7 @@ function optionsNote(options, groupId) {
|
|
|
303
224
|
// 'Amount: 0 to 10'): the ends are read off the item's query the way the
|
|
304
225
|
// bar's change reads them, and worded in the report's locale.
|
|
305
226
|
function numberRangeFilterItem(group, label, report, initial) {
|
|
306
|
-
const name = groupItemName(group
|
|
227
|
+
const name = groupItemName(group);
|
|
307
228
|
const min = initial?.min ?? undefined;
|
|
308
229
|
const max = initial?.max ?? undefined;
|
|
309
230
|
const locale = resolveFormatContext(report ?? {}).locale;
|
|
@@ -350,7 +271,6 @@ export function hasPageGroup(report) {
|
|
|
350
271
|
}
|
|
351
272
|
// The query key of the report bar's Match control. Not a filter group: it
|
|
352
273
|
// says how the groups combine, so it is read straight off the change query.
|
|
353
|
-
// It is also the report URL's key for the match (match=any).
|
|
354
274
|
export const MATCH_ITEM = 'match';
|
|
355
275
|
const MATCH_OPTIONS = [
|
|
356
276
|
{ name: 'All filters', value: 'all' },
|
|
@@ -385,7 +305,7 @@ export function matchFromQuery(query) {
|
|
|
385
305
|
// the change query and travels as the list's own `state.search`.
|
|
386
306
|
export const LIST_SEARCH_ITEM = 'listSearch';
|
|
387
307
|
// The longest search the server applies (ReportQueryRunner::MAX_SEARCH_LENGTH).
|
|
388
|
-
// The viewer cuts the text to it too, so the
|
|
308
|
+
// The viewer cuts the text to it too, so the state, the request and the export
|
|
389
309
|
// title all carry the text that was actually searched.
|
|
390
310
|
export const LIST_SEARCH_MAX_LENGTH = 100;
|
|
391
311
|
// The fs-filter config item for a list's search box, seeded with the text the
|
|
@@ -461,10 +381,10 @@ export function groupBySignature(report) {
|
|
|
461
381
|
}
|
|
462
382
|
// Read an fs-filter change query into per-group values. Returns one entry per
|
|
463
383
|
// group with the value to store (or null to clear) — callers feed these to
|
|
464
|
-
// ReportFilterStateService.setValue.
|
|
465
|
-
export function groupValuesFromQuery(query, groups
|
|
384
|
+
// ReportFilterStateService.setValue.
|
|
385
|
+
export function groupValuesFromQuery(query, groups) {
|
|
466
386
|
return groups.map((group) => {
|
|
467
|
-
const name = groupItemName(group
|
|
387
|
+
const name = groupItemName(group);
|
|
468
388
|
switch (group.type) {
|
|
469
389
|
case 'dateRange':
|
|
470
390
|
return { groupId: group.id, value: dateRangeFromQuery(query, name) };
|
|
@@ -479,7 +399,7 @@ export function groupValuesFromQuery(query, groups, report) {
|
|
|
479
399
|
}
|
|
480
400
|
});
|
|
481
401
|
}
|
|
482
|
-
// A date range's days (<
|
|
402
|
+
// A date range's days (<name>From, <name>To).
|
|
483
403
|
function dateRangeFromQuery(query, name) {
|
|
484
404
|
const start = query[itemRangeName(name, 'from')];
|
|
485
405
|
const end = query[itemRangeName(name, 'to')];
|
|
@@ -488,8 +408,8 @@ function dateRangeFromQuery(query, name) {
|
|
|
488
408
|
}
|
|
489
409
|
return { start: start || null, end: end || null };
|
|
490
410
|
}
|
|
491
|
-
// A select's picks: kept (<
|
|
492
|
-
// (exclude<
|
|
411
|
+
// A select's picks: kept (<name>), or left out while its exclude row is on
|
|
412
|
+
// (exclude<Name>).
|
|
493
413
|
function selectFromQuery(query, name) {
|
|
494
414
|
const excludeValues = selectQueryValues(query[getExcludeName(name)]);
|
|
495
415
|
if (excludeValues.length) {
|
|
@@ -498,7 +418,7 @@ function selectFromQuery(query, name) {
|
|
|
498
418
|
const values = selectQueryValues(query[name]);
|
|
499
419
|
return values.length ? { values } : null;
|
|
500
420
|
}
|
|
501
|
-
// A number range's ends (<
|
|
421
|
+
// A number range's ends (<name>Min, <name>Max). An end left empty is open.
|
|
502
422
|
function numberRangeFromQuery(query, name) {
|
|
503
423
|
const min = rangeBound(query[itemRangeName(name, 'min')]);
|
|
504
424
|
const max = rangeBound(query[itemRangeName(name, 'max')]);
|
|
@@ -550,4 +470,4 @@ function selectQueryValues(raw) {
|
|
|
550
470
|
}
|
|
551
471
|
return String(raw).split(',');
|
|
552
472
|
}
|
|
553
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVwb3J0LWZpbHRlci1pdGVtcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9hcHAvcmVwb3J0cy9yZXBvcnQtZmlsdGVyLWl0ZW1zLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBcUIsUUFBUSxFQUFFLGNBQWMsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBRWpGLE9BQU8sRUFBRSxNQUFNLEVBQUUsUUFBUSxFQUFFLE1BQU0sVUFBVSxDQUFDO0FBRTVDLE9BQU8sRUFBYyxFQUFFLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDdEMsT0FBTyxFQUFFLEdBQUcsRUFBRSxXQUFXLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUdsRCxPQUFPLEVBQUUsY0FBYyxFQUFFLGFBQWEsRUFBRSxNQUFNLDhCQUE4QixDQUFDO0FBQzdFLE9BQU8sRUFBRSxTQUFTLEVBQUUsZUFBZSxFQUFFLG9CQUFvQixFQUFFLE1BQU0sVUFBVSxDQUFDO0FBSTVFLE9BQU8sRUFDK0IsbUJBQW1CLEdBRXhELE1BQU0sK0JBQStCLENBQUM7QUFDdkMsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBSXpELDJFQUEyRTtBQUMzRSw0RUFBNEU7QUFDNUUseUVBQXlFO0FBQ3pFLE1BQU0sVUFBVSxlQUFlLENBQUMsS0FBdUM7SUFDckUsSUFBSSxLQUFLLFlBQVksSUFBSSxFQUFFLENBQUM7UUFDMUIsT0FBTyxNQUFNLENBQUMsS0FBSyxFQUFFLFlBQVksQ0FBQyxDQUFDO0lBQ3JDLENBQUM7SUFFRCxzRUFBc0U7SUFDdEUsOEJBQThCO0lBQzlCLE9BQU8sS0FBSyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDO0FBQ3hELENBQUM7QUFHRCw4RUFBOEU7QUFDOUUsK0VBQStFO0FBQy9FLDhFQUE4RTtBQUM5RSxpRUFBaUU7QUFDakUsRUFBRTtBQUNGLGdGQUFnRjtBQUNoRixnRkFBZ0Y7QUFDaEYsNkRBQTZEO0FBQzdELEVBQUU7QUFDRiw0RUFBNEU7QUFDNUUsMkNBQTJDO0FBQzNDLE1BQU0sVUFBVSxjQUFjLENBQUMsS0FBdUMsRUFBRSxNQUF1QjtJQUM3RixNQUFNLEtBQUssR0FBRyxlQUFlLENBQUMsS0FBSyxDQUFDLENBQUM7SUFFckMsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDO1FBQ1gsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0lBRUQsTUFBTSxJQUFJLEdBQUcsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBRTdCLE9BQU8sTUFBTSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxlQUFlLENBQUMsSUFBSSxFQUFFLE1BQU0sRUFBRSxTQUFTLENBQUMsQ0FBQztBQUNqRyxDQUFDO0FBR0QsMkVBQTJFO0FBQzNFLDZFQUE2RTtBQUM3RSxnREFBZ0Q7QUFDaEQsTUFBTSxVQUFVLGFBQWEsQ0FBQyxLQUFnQztJQUM1RCxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUM7UUFDWCxPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7SUFFRCxNQUFNLElBQUksR0FBRyxRQUFRLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQztJQUUxQyxPQUFPLE1BQU0sQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDO0FBQ3BELENBQUM7QUFHRCw4RUFBOEU7QUFDOUUsNkVBQTZFO0FBQzdFLDRDQUE0QztBQUM1QyxNQUFNLFVBQVUsV0FBVyxDQUFDLEtBQThCO0lBQ3hELE9BQU8sS0FBSyxZQUFZLElBQUksSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLE9BQU8sRUFBRSxDQUFDO1FBQzVELENBQUMsQ0FBQyxNQUFNLENBQUMsS0FBSyxFQUFFLFlBQVksQ0FBQztRQUM3QixDQUFDLENBQUMsSUFBSSxDQUFDO0FBQ1gsQ0FBQztBQUdELDhFQUE4RTtBQUM5RSwwRUFBMEU7QUFDMUUsMkVBQTJFO0FBQzNFLDBDQUEwQztBQUMxQyxNQUFNLFVBQVUsYUFBYSxDQUFDLFFBQWdCO0lBQzVDLE1BQU0sS0FBSyxHQUFHLFFBQVE7U0FDbkIsT0FBTyxDQUFDLG9CQUFvQixFQUFFLE9BQU8sQ0FBQztTQUN0QyxPQUFPLENBQUMsY0FBYyxFQUFFLE9BQU8sQ0FBQztTQUNoQyxXQUFXLEVBQUUsQ0FBQztJQUVqQixPQUFPLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsV0FBVyxFQUFFLEdBQUcsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUN4RCxDQUFDO0FBR0QsOEVBQThFO0FBQzlFLCtFQUErRTtBQUMvRSw0RUFBNEU7QUFDNUUsK0VBQStFO0FBQy9FLDhFQUE4RTtBQUM5RSxpRkFBaUY7QUFFakYsNkVBQTZFO0FBQzdFLDhFQUE4RTtBQUM5RSxpRUFBaUU7QUFDakUsc0VBQXNFO0FBQ3RFLHFFQUFxRTtBQUNyRSwrQkFBK0I7QUFDL0IsTUFBTSxDQUFDLE1BQU0sYUFBYSxHQUFHLFNBQVMsQ0FBQztBQUV2Qyw2RUFBNkU7QUFDN0UsMEVBQTBFO0FBQzFFLDJEQUEyRDtBQUMzRCx3RUFBd0U7QUFDeEUsTUFBTSxDQUFDLE1BQU0sVUFBVSxHQUFHLElBQUksQ0FBQztBQUMvQixNQUFNLENBQUMsTUFBTSxtQkFBbUIsR0FBRyxLQUFLLENBQUM7QUFDekMscUJBQXFCO0FBQ3JCLE1BQU0sQ0FBQyxNQUFNLFlBQVksR0FBRyxJQUFJLENBQUM7QUFDakMsMEVBQTBFO0FBQzFFLFdBQVc7QUFDWCxNQUFNLENBQUMsTUFBTSxVQUFVLEdBQUcsTUFBTSxDQUFDO0FBRWpDLDBFQUEwRTtBQUMxRSw2QkFBNkI7QUFDN0IsTUFBTSxpQkFBaUIsR0FBRyxRQUFRLENBQUM7QUFNbkMsMkVBQTJFO0FBQzNFLDJFQUEyRTtBQUMzRSxnREFBZ0Q7QUFDaEQsTUFBTSxVQUFVLGFBQWEsQ0FBQyxJQUFZLEVBQUUsR0FBaUI7SUFDM0QsT0FBTyxHQUFHLElBQUksR0FBRyxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLFdBQVcsRUFBRSxHQUFHLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztBQUNoRSxDQUFDO0FBRUQsNkVBQTZFO0FBQzdFLDRFQUE0RTtBQUM1RSwwRUFBMEU7QUFDMUUsNkVBQTZFO0FBQzdFLDRFQUE0RTtBQUM1RSw2RUFBNkU7QUFDN0UsNEVBQTRFO0FBQzVFLDZFQUE2RTtBQUM3RSwwRUFBMEU7QUFDMUUsMkJBQTJCO0FBQzNCLE1BQU0sVUFBVSxjQUFjLENBQUMsTUFBc0U7SUFDbkcsa0RBQWtEO0lBQ2xELE1BQU0sS0FBSyxHQUFHLElBQUksR0FBRyxDQUFDO1FBQ3BCLFVBQVUsRUFBRSxhQUFhLEVBQUUsVUFBVSxFQUFFLGdCQUFnQixFQUFFLFVBQVUsRUFBRSxtQkFBbUIsRUFBRSxZQUFZO0tBQ3ZHLENBQUMsQ0FBQztJQUNILE1BQU0sSUFBSSxHQUFHLENBQUMsU0FBaUIsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLFNBQVM7V0FDMUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO0lBQ2pGLE1BQU0sSUFBSSxHQUFHLElBQUksR0FBRyxFQUFrQixDQUFDO0lBRXZDLENBQUMsR0FBRyxNQUFNLENBQUM7U0FDUixJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUM7U0FDM0IsT0FBTyxDQUFDLENBQUMsS0FBSyxFQUFFLEVBQUU7UUFDakIsTUFBTSxNQUFNLEdBQUcsUUFBUSxDQUFDLFVBQVUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO1FBQzNDLE1BQU0sR0FBRyxHQUFHLENBQUMsTUFBTSxFQUFFLE1BQU0sSUFBSSxHQUFHLE1BQU0sR0FBRyxLQUFLLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksV0FBVyxDQUFDLEtBQUssQ0FBQyxFQUFFLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFFakcsUUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO1FBQ2pELElBQUksQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLEVBQUUsRUFBRSxHQUFHLENBQUMsQ0FBQztJQUMxQixDQUFDLENBQUMsQ0FBQztJQUVMLE9BQU8sSUFBSSxDQUFDO0FBQ2QsQ0FBQztBQUVELHlFQUF5RTtBQUN6RSxzQ0FBc0M7QUFDdEMsU0FBUyxXQUFXLENBQUMsT0FBZSxFQUFFLElBQW9DO0lBQ3hFLE1BQU0sSUFBSSxHQUFHLEdBQUcsaUJBQWlCLEdBQUcsT0FBTyxFQUFFLENBQUM7SUFDOUMsSUFBSSxHQUFHLEdBQUcsSUFBSSxDQUFDO0lBRWYsS0FBSyxJQUFJLEtBQUssR0FBRyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsS0FBSyxFQUFFLEVBQUUsQ0FBQztRQUN4QyxHQUFHLEdBQUcsR0FBRyxJQUFJLElBQUksS0FBSyxFQUFFLENBQUM7SUFDM0IsQ0FBQztJQUVELE9BQU8sR0FBRyxDQUFDO0FBQ2IsQ0FBQztBQUVELDRFQUE0RTtBQUM1RSwrQ0FBK0M7QUFDL0MsTUFBTSxVQUFVLGFBQWEsQ0FDM0IsS0FBMEQsRUFDMUQsTUFBc0U7SUFFdEUsT0FBTyxjQUFjLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDLFNBQVMsRUFBRSxFQUFFLENBQUMsU0FBUyxDQUFDLEVBQUUsS0FBSyxLQUFLLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLE1BQU0sRUFBRSxLQUFLLENBQUMsQ0FBQztTQUN2RyxHQUFHLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0FBQ25CLENBQUM7QUFFRCwyRUFBMkU7QUFDM0UsTUFBTSxVQUFVLGFBQWEsQ0FBQyxLQUF3QixFQUFFLE1BQXFCO0lBQzNFLE9BQU8sYUFBYSxDQUFDLEtBQUssRUFBRSxNQUFNLEVBQUUsWUFBWSxJQUFJLEVBQUUsQ0FBQyxDQUFDO0FBQzFELENBQUM7QUFFRCwyRUFBMkU7QUFDM0UsU0FBUyxVQUFVLENBQUMsS0FBbUQ7SUFDckUsT0FBTyxLQUFLLENBQUMsS0FBSyxJQUFJLEtBQUssQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxZQUFZLElBQUksRUFBRSxDQUFDO0FBQy9ELENBQUM7QUFFRCx3RUFBd0U7QUFDeEUsb0VBQW9FO0FBQ3BFLE1BQU0sTUFBTSxHQUFHLFlBQVksQ0FBQztBQUU1QixNQUFNLFVBQVUsR0FBNEIsQ0FBQyxLQUFLLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxJQUFJLENBQUMsQ0FBQztBQUV6RSx1RUFBdUU7QUFDdkUsaUVBQWlFO0FBQ2pFLFNBQVMsUUFBUSxDQUFDLEdBQVc7SUFDM0IsT0FBTyxDQUFDLEdBQUcsRUFBRSxjQUFjLENBQUMsR0FBRyxDQUFDLEVBQUUsR0FBRyxVQUFVLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxhQUFhLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUN6RixDQUFDO0FBRUQsNEVBQTRFO0FBQzVFLDhFQUE4RTtBQUM5RSxnRUFBZ0U7QUFDaEUsU0FBUyxRQUFRLENBQUMsS0FBYTtJQUM3QixPQUFPLEtBQUs7U0FDVCxTQUFTLENBQUMsS0FBSyxDQUFDO1NBQ2hCLE9BQU8sQ0FBQyxTQUFTLEVBQUUsRUFBRSxDQUFDO1NBQ3RCLE9BQU8sQ0FBQyxvQkFBb0IsRUFBRSxPQUFPLENBQUM7U0FDdEMsS0FBSyxDQUFDLGVBQWUsQ0FBQztTQUN0QixNQUFNLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLElBQUksS0FBSyxFQUFFLENBQUM7U0FDN0IsR0FBRyxDQUFDLENBQUMsSUFBSSxFQUFFLEtBQUssRUFBRSxFQUFFO1FBQ25CLE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztRQUVqQyxPQUFPLEtBQUssQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxXQUFXLEVBQUUsR0FBRyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUM7SUFDeEUsQ0FBQyxDQUFDO1NBQ0QsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDO0FBQ2QsQ0FBQztBQUVELGdGQUFnRjtBQUNoRixnRkFBZ0Y7QUFDaEYsZ0ZBQWdGO0FBQ2hGLGdGQUFnRjtBQUNoRiw2RUFBNkU7QUFDN0UsK0VBQStFO0FBQy9FLCtFQUErRTtBQUMvRSw2RUFBNkU7QUFDN0UsMEVBQTBFO0FBQzFFLGlFQUFpRTtBQUNqRSwyRUFBMkU7QUFDM0Usb0JBQW9CO0FBQ3BCLE1BQU0sVUFBVSxnQkFBZ0IsQ0FDOUIsS0FBd0IsRUFDeEIsVUFBc0IsRUFDdEIsUUFBZ0I7SUFFaEIsTUFBTSxZQUFZLEdBQUcsQ0FBQyxLQUFLLENBQUMsT0FBTyxJQUFJLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxDQUFDO0lBQy9FLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQztRQUNsQixPQUFPLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQztJQUNoQixDQUFDO0lBRUQsT0FBTyxVQUFVLENBQUMsYUFBYSxDQUFDLFFBQVEsRUFBRSxZQUFZLENBQUMsRUFBRSxDQUFDO1NBQ3ZELElBQUksQ0FDSCxHQUFHLENBQUMsQ0FBQyxPQUE2QixFQUFFLEVBQUUsQ0FBQyxDQUFDLE9BQU8sSUFBSSxFQUFFLENBQUM7U0FDbkQsR0FBRyxDQUFDLENBQUMsTUFBTSxFQUFFLEVBQUUsQ0FBQyxDQUFDLEVBQUUsSUFBSSxFQUFFLE1BQU0sQ0FBQyxLQUFLLEVBQUUsS0FBSyxFQUFFLE1BQU0sQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFDbEUsV0FBVyxDQUFDLEVBQUUsVUFBVSxFQUFFLENBQUMsRUFBRSxRQUFRLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FDaEQsQ0FBQztBQUNOLENBQUM7QUFFRCwyRUFBMkU7QUFDM0UsK0VBQStFO0FBQy9FLDRFQUE0RTtBQUM1RSxpRkFBaUY7QUFDakYsNkVBQTZFO0FBQzdFLDJFQUEyRTtBQUMzRSw0RUFBNEU7QUFDNUUsOEVBQThFO0FBQzlFLFVBQVU7QUFDVixNQUFNLFVBQVUsbUJBQW1CLENBQ2pDLFFBQThDLEVBQzlDLE1BQWlCLEVBQ2pCLFFBQTJDLEdBQUcsRUFBRSxDQUFDLElBQUk7SUFFckQsTUFBTSxLQUFLLEdBQUcsQ0FBQyxPQUFpQyxFQUFFLEVBQUUsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsS0FBSyxFQUFFLEVBQUU7UUFDeEUsTUFBTSxNQUFNLEdBQUcsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDLFNBQVMsRUFBRSxFQUFFLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsS0FBSyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztRQUV0RixPQUFPLEVBQUUsSUFBSSxFQUFFLEtBQUssQ0FBQyxLQUFLLENBQUMsSUFBSSxNQUFNLEVBQUUsSUFBSSxJQUFJLE1BQU0sQ0FBQyxLQUFLLENBQUMsRUFBRSxLQUFLLEVBQUUsQ0FBQztJQUN4RSxDQUFDLENBQUMsQ0FBQztJQUVILE9BQU8sTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxLQUFLLElBQUksQ0FBQztRQUNuRCxDQUFDLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUNmLENBQUMsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO0FBQ2hDLENBQUM7QUFFRCwyRUFBMkU7QUFDM0UsZ0ZBQWdGO0FBQ2hGLFlBQVk7QUFDWixNQUFNLFVBQVUsWUFBWSxDQUMxQixRQUE4QyxFQUM5QyxPQUFnQjtJQUVoQixNQUFNLElBQUksR0FBRyxDQUFDLE9BQU8sSUFBSSxFQUFFLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxXQUFXLEVBQUUsQ0FBQztJQUVsRCxPQUFPLFFBQVEsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsT0FBTyxFQUFFLEVBQUUsQ0FBQyxJQUFJO1FBQ3hDLENBQUMsQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUMsTUFBTSxFQUFFLEVBQUUsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUN0RSxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQztBQUNoQixDQUFDO0FBRUQsOERBQThEO0FBQzlELE1BQU0sQ0FBQyxNQUFNLHNCQUFzQixHQUFHLHdDQUF3QyxDQUFDO0FBRS9FLDRFQUE0RTtBQUM1RSx3QkFBd0I7QUFDeEIsTUFBTSxDQUFDLE1BQU0sbUJBQW1CLEdBQUcsMEJBQTBCLENBQUM7QUFFOUQsNEVBQTRFO0FBQzVFLDZFQUE2RTtBQUM3RSw2RUFBNkU7QUFDN0UsMEVBQTBFO0FBQzFFLDRFQUE0RTtBQUM1RSx1RUFBdUU7QUFDdkUsZUFBZTtBQUNmLE1BQU0sVUFBVSxrQkFBa0IsQ0FDaEMsS0FBd0IsRUFDeEIsT0FBbUMsRUFDbkMsTUFBcUIsRUFDckIsT0FBMEIsRUFDMUIsV0FBMkMsRUFBRTtJQUU3QyxNQUFNLElBQUksR0FBRyxhQUFhLENBQUMsS0FBSyxFQUFFLE1BQU0sQ0FBQyxDQUFDO0lBQzFDLE1BQU0sS0FBSyxHQUFHLFVBQVUsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUVoQyxRQUFRLEtBQUssQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUNuQixLQUFLLFdBQVc7WUFDZCxPQUFPLG1CQUFtQixDQUFDLElBQUksRUFBRSxLQUFLLEVBQUUsT0FBTyxDQUFDLENBQUM7UUFFbkQsS0FBSyxRQUFRO1lBQ1gsT0FBTyxnQkFBZ0IsQ0FBQyxLQUFLLEVBQUUsS0FBSyxFQUFFLE9BQU8sRUFBRSxNQUFNLEVBQUUsT0FBTyxFQUFFLGFBQWEsQ0FBQyxLQUFLLEVBQUUsUUFBUSxDQUFDLENBQUMsQ0FBQztRQUVsRyxLQUFLLGFBQWE7WUFDaEIsT0FBTyxRQUFRLENBQUMsUUFBUSxDQUFDLGFBQWEsQ0FBQztnQkFDckMsQ0FBQyxDQUFDLHFCQUFxQixDQUFDLEtBQUssRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLE9BQU8sQ0FBQztnQkFDdEQsQ0FBQyxDQUFDLGlCQUFpQixDQUFDLElBQUksRUFBRSxLQUFLLEVBQUUsT0FBTyxDQUFDLENBQUM7UUFFOUMsS0FBSyxTQUFTLENBQUM7UUFDZjtZQUNFLE9BQU8saUJBQWlCLENBQUMsSUFBSSxFQUFFLEtBQUssRUFBRSxPQUFPLENBQUMsQ0FBQztJQUNuRCxDQUFDO0FBQ0gsQ0FBQztBQUVELDhFQUE4RTtBQUM5RSxzQ0FBc0M7QUFDdEMsU0FBUyxtQkFBbUIsQ0FBQyxJQUFZLEVBQUUsS0FBYSxFQUFFLE9BQTBCO0lBQ2xGLE1BQU0sT0FBTyxHQUFHLENBQUMsQ0FBQyxDQUFDLE9BQU8sRUFBRSxLQUFLLElBQUksT0FBTyxFQUFFLEdBQUcsQ0FBQyxDQUFDO0lBRW5ELE9BQU87UUFDTCxJQUFJO1FBQ0osSUFBSSxFQUFFLFFBQVEsQ0FBQyxTQUFTO1FBQ3hCLEtBQUssRUFBRSxFQUFFLElBQUksRUFBRSxHQUFHLEtBQUssT0FBTyxFQUFFLEVBQUUsRUFBRSxHQUFHLEtBQUssS0FBSyxFQUFFO1FBQ25ELE9BQU8sRUFBRSxPQUFPO1lBQ2QsQ0FBQyxDQUFDLEVBQUUsSUFBSSxFQUFFLE9BQU8sQ0FBQyxLQUFLLElBQUksU0FBUyxFQUFFLEVBQUUsRUFBRSxPQUFPLENBQUMsR0FBRyxJQUFJLFNBQVMsRUFBRTtZQUNwRSxDQUFDLENBQUMsU0FBUztLQUNkLENBQUM7QUFDSixDQUFDO0FBRUQsc0VBQXNFO0FBQ3RFLDhFQUE4RTtBQUM5RSw4RUFBOEU7QUFDOUUsdUVBQXVFO0FBQ3ZFLHlFQUF5RTtBQUN6RSwwQkFBMEI7QUFDMUIsU0FBUyxnQkFBZ0IsQ0FDdkIsS0FBd0IsRUFDeEIsS0FBYSxFQUNiLE9BQW1DLEVBQ25DLE1BQXFCLEVBQ3JCLE9BQXFDLEVBQ3JDLE9BQWdCO0lBRWhCLE1BQU0sU0FBUyxHQUFHLE9BQU8sSUFBSSxDQUFDLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxJQUFJLENBQUMsQ0FBQyxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sQ0FBQztJQUMxRixNQUFNLEtBQUssR0FBRyxTQUFTLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLE9BQU8sRUFBRSxNQUFNLENBQUM7SUFDbEUsTUFBTSxRQUFRLEdBQUcsT0FBTyxDQUFDLE9BQU8sQ0FBQyxLQUFLLEVBQUUsTUFBTSxDQUFDLENBQUM7SUFFaEQsT0FBTztRQUNMLElBQUksRUFBRSxhQUFhLENBQUMsS0FBSyxFQUFFLE1BQU0sQ0FBQztRQUNsQyxJQUFJLEVBQUUsUUFBUSxDQUFDLGlCQUFpQjtRQUNoQyxLQUFLO1FBQ0wsWUFBWSxFQUFFLElBQUk7UUFDbEIsT0FBTyxFQUFFLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxTQUFTO1FBQ2pDLE1BQU0sRUFBRSxDQUFDLE9BQWdCLEVBQUUsRUFBRSxDQUFDLFlBQVksQ0FBQyxRQUFRLEVBQUUsT0FBTyxDQUFDO1FBQzdELFNBQVMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxXQUFXLENBQUMsT0FBTyxFQUFFLEtBQUssQ0FBQyxFQUFFLENBQUM7UUFDL0MseUVBQXlFO1FBQ3pFLDRFQUE0RTtRQUM1RSxPQUFPLEVBQUUsS0FBSyxFQUFFLE1BQU07WUFDcEIsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLG1CQUFtQixDQUFDLFFBQVEsRUFBRSxLQUFLLEVBQUUsQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLEVBQUUsRUFBRSxLQUFLLENBQUMsQ0FBQztpQkFDcEYsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLFFBQVEsRUFBRSxFQUFFLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxRQUFRLEVBQUUsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQztZQUNoRixDQUFDLENBQUMsU0FBUztLQUNkLENBQUM7QUFDSixDQUFDO0FBRUQsNkVBQTZFO0FBQzdFLFNBQVMsV0FBVyxDQUFDLE9BQW1DLEVBQUUsT0FBZTtJQUN2RSxJQUFJLE9BQU8sQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQztRQUM1QixPQUFPLG1CQUFtQixDQUFDO0lBQzdCLENBQUM7SUFFRCxPQUFPLE9BQU8sQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLHNCQUFzQixDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7QUFDcEUsQ0FBQztBQUVELDRFQUE0RTtBQUM1RSxxRUFBcUU7QUFDckUseUVBQXlFO0FBQ3pFLDhEQUE4RDtBQUM5RCxTQUFTLHFCQUFxQixDQUM1QixLQUF3QixFQUN4QixLQUFhLEVBQ2IsTUFBcUIsRUFDckIsT0FBMEI7SUFFMUIsTUFBTSxJQUFJLEdBQUcsYUFBYSxDQUFDLEtBQUssRUFBRSxNQUFNLENBQUMsQ0FBQztJQUMxQyxNQUFNLEdBQUcsR0FBRyxPQUFPLEVBQUUsR0FBRyxJQUFJLFNBQVMsQ0FBQztJQUN0QyxNQUFNLEdBQUcsR0FBRyxPQUFPLEVBQUUsR0FBRyxJQUFJLFNBQVMsQ0FBQztJQUN0QyxNQUFNLE1BQU0sR0FBRyxvQkFBb0IsQ0FBQyxNQUFNLElBQUksRUFBRSxDQUFDLENBQUMsTUFBTSxDQUFDO0lBRXpELE9BQU87UUFDTCxJQUFJO1FBQ0osSUFBSSxFQUFFLFFBQVEsQ0FBQyxLQUFLO1FBQ3BCLEtBQUs7UUFDTCxPQUFPLEVBQUUsR0FBRyxLQUFLLFNBQVMsSUFBSSxHQUFHLEtBQUssU0FBUyxDQUFDLENBQUMsQ0FBQyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsU0FBUztRQUMxRSxRQUFRLEVBQUUsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLGNBQWMsQ0FDaEMsRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLEtBQUssQ0FBQyxLQUFLLEVBQUUsRUFDN0Isb0JBQW9CLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsRUFDdEMsRUFBRSxNQUFNLEVBQUUsRUFDVixNQUFNLENBQ1A7S0FDRixDQUFDO0FBQ0osQ0FBQztBQUVELFNBQVMsaUJBQWlCLENBQUMsSUFBWSxFQUFFLEtBQWEsRUFBRSxPQUEwQjtJQUNoRixPQUFPO1FBQ0wsSUFBSTtRQUNKLElBQUksRUFBRSxRQUFRLENBQUMsT0FBTztRQUN0QixLQUFLO1FBQ0wsT0FBTyxFQUFFLE9BQU8sRUFBRSxLQUFLO0tBQ3hCLENBQUM7QUFDSixDQUFDO0FBRUQsMkVBQTJFO0FBQzNFLDRFQUE0RTtBQUM1RSwyRUFBMkU7QUFDM0UsaUVBQWlFO0FBQ2pFLE1BQU0sZ0JBQWdCLEdBQWlDLENBQUMsUUFBUSxFQUFFLE1BQU0sRUFBRSxNQUFNLENBQUMsQ0FBQztBQUNsRixNQUFNLGVBQWUsR0FBZ0MsQ0FBQyxRQUFRLEVBQUUsU0FBUyxFQUFFLGFBQWEsQ0FBQyxDQUFDO0FBRTFGLDJEQUEyRDtBQUMzRCxNQUFNLFVBQVUsZUFBZSxDQUFDLEtBQXdCLEVBQUUsTUFBcUI7SUFDN0UsT0FBTyxnQkFBZ0IsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQztXQUN4QyxlQUFlLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUM7V0FDcEMsQ0FBQyxLQUFLLENBQUMsS0FBSyxLQUFLLE1BQU0sSUFBSSxDQUFDLENBQUMsQ0FBQyxNQUFNLElBQUksS0FBSyxDQUFDLE1BQU0sS0FBSyxNQUFNLENBQUMsQ0FBQyxDQUFDO0FBQ3pFLENBQUM7QUFFRCw0RUFBNEU7QUFDNUUsd0RBQXdEO0FBQ3hELE1BQU0sVUFBVSxlQUFlLENBQUMsTUFBcUIsRUFBRSxNQUFxQjtJQUMxRSxPQUFPLENBQUMsTUFBTSxFQUFFLFlBQVksSUFBSSxFQUFFLENBQUM7U0FDaEMsTUFBTSxDQUFDLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxLQUFLLENBQUMsS0FBSyxLQUFLLFFBQVEsSUFBSSxLQUFLLENBQUMsS0FBSyxLQUFLLE1BQU07V0FDaEUsQ0FBQyxLQUFLLENBQUMsS0FBSyxLQUFLLE1BQU0sSUFBSSxDQUFDLENBQUMsTUFBTSxJQUFJLEtBQUssQ0FBQyxNQUFNLEtBQUssTUFBTSxDQUFDLENBQUM7U0FDcEUsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLEtBQUssR0FBRyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUM7QUFDdkMsQ0FBQztBQUVELDJFQUEyRTtBQUMzRSxtQ0FBbUM7QUFDbkMsTUFBTSxVQUFVLFlBQVksQ0FBQyxNQUFxQjtJQUNoRCxPQUFPLENBQUMsTUFBTSxFQUFFLFlBQVksSUFBSSxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLEtBQUssQ0FBQyxLQUFLLEtBQUssTUFBTSxDQUFDLENBQUM7QUFDOUUsQ0FBQztBQUVELDBFQUEwRTtBQUMxRSw0RUFBNEU7QUFDNUUsNkRBQTZEO0FBQzdELE1BQU0sQ0FBQyxNQUFNLFVBQVUsR0FBRyxPQUFPLENBQUM7QUFFbEMsTUFBTSxhQUFhLEdBQWlEO0lBQ2xFLEVBQUUsSUFBSSxFQUFFLGFBQWEsRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFO0lBQ3JDLEVBQUUsSUFBSSxFQUFFLFlBQVksRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFO0NBQ3JDLENBQUM7QUFFRiw0RUFBNEU7QUFDNUUsNkVBQTZFO0FBQzdFLCtEQUErRDtBQUMvRCxNQUFNLFVBQVUsZUFBZSxDQUM3QixNQUFxQixFQUNyQixNQUEyQixFQUMzQixNQUFxQixFQUNyQixLQUF3QjtJQUV4QixNQUFNLFFBQVEsR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxlQUFlLENBQUMsS0FBSyxFQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUM7SUFFMUUsSUFBSSxDQUFDLE1BQU0sRUFBRSxjQUFjLEVBQUUsUUFBUSxDQUFDLFVBQVUsQ0FBQyxJQUFJLFFBQVEsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUM7UUFDekUsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0lBRUQsT0FBTztRQUNMLElBQUksRUFBRSxVQUFVO1FBQ2hCLElBQUksRUFBRSxRQUFRLENBQUMsTUFBTTtRQUNyQixLQUFLLEVBQUUsT0FBTztRQUNkLFFBQVEsRUFBRSxLQUFLO1FBQ2YsTUFBTSxFQUFFLEdBQUcsRUFBRSxDQUFDLGFBQWE7UUFDM0IsT0FBTyxFQUFFLEtBQUs7UUFDZCwyRUFBMkU7UUFDM0UsUUFBUSxFQUFFLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxhQUFhLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsRUFBRSxNQUFNLENBQUM7S0FDdEUsQ0FBQztBQUNKLENBQUM7QUFFRCxxRUFBcUU7QUFDckUsTUFBTSxVQUFVLGNBQWMsQ0FBQyxLQUE4QjtJQUMzRCxPQUFPLEtBQUssRUFBRSxDQUFDLFVBQVUsQ0FBQyxLQUFLLEtBQUssQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUM7QUFDdkQsQ0FBQztBQUVELDZFQUE2RTtBQUM3RSw4RUFBOEU7QUFDOUUsNkVBQTZFO0FBQzdFLGlFQUFpRTtBQUNqRSxNQUFNLENBQUMsTUFBTSxnQkFBZ0IsR0FBRyxZQUFZLENBQUM7QUFFN0MsZ0ZBQWdGO0FBQ2hGLDZFQUE2RTtBQUM3RSx1REFBdUQ7QUFDdkQsTUFBTSxDQUFDLE1BQU0sc0JBQXNCLEdBQUcsR0FBRyxDQUFDO0FBRTFDLDhFQUE4RTtBQUM5RSx5RUFBeUU7QUFDekUsMEVBQTBFO0FBQzFFLG9CQUFvQjtBQUNwQixNQUFNLFVBQVUsY0FBYyxDQUFDLEtBQW9CO0lBQ2pELE9BQU87UUFDTCxJQUFJLEVBQUUsUUFBUSxDQUFDLE9BQU87UUFDdEIsSUFBSSxFQUFFLGdCQUFnQjtRQUN0QixLQUFLLEVBQUUsUUFBUTtRQUNmLE9BQU8sRUFBRSxLQUFLLElBQUksU0FBUztLQUM1QixDQUFDO0FBQ0osQ0FBQztBQUVELDRFQUE0RTtBQUM1RSwyRUFBMkU7QUFDM0Usb0RBQW9EO0FBQ3BELE1BQU0sVUFBVSxrQkFBa0IsQ0FBQyxNQUFxQjtJQUN0RCxPQUFPLENBQUMsTUFBTSxFQUFFLEtBQUssSUFBSSxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLFVBQVUsSUFBSSxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxTQUFTLEVBQUUsRUFBRSxDQUNyRixTQUFTLENBQUMsSUFBSSxLQUFLLE9BQU8sSUFBSSxTQUFTLENBQUMsTUFBTSxFQUFFLEtBQUssRUFBRSxJQUFJLEtBQUssTUFBTSxDQUFDLENBQUMsQ0FBQztBQUM3RSxDQUFDO0FBRUQsK0VBQStFO0FBQy9FLCtFQUErRTtBQUMvRSw4RUFBOEU7QUFDOUUsU0FBUyxjQUFjLENBQUMsTUFBYztJQUNwQyxNQUFNLGFBQWEsR0FBRyxNQUFNLENBQUMsTUFBTSxFQUFFLE9BQU8sRUFBRSxhQUFhLElBQUksRUFBRSxDQUFDO0lBRWxFLE9BQU8sYUFBYSxDQUFDLE1BQU07UUFDekIsQ0FBQyxDQUFDLG1CQUFtQixDQUFDLE1BQU0sQ0FBQyxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQUMsYUFBYSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDOUUsQ0FBQyxDQUFDLG1CQUFtQixDQUFDO0FBQzFCLENBQUM7QUFFRCwrRUFBK0U7QUFDL0UsZ0ZBQWdGO0FBQ2hGLGtGQUFrRjtBQUNsRixNQUFNLFVBQVUsb0JBQW9CLENBQUMsTUFBYyxFQUFFLFdBQW9DO0lBQ3ZGLE9BQU8sQ0FBQyxXQUFXLElBQUksY0FBYyxDQUFDLE1BQU0sQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQUMsTUFBTSxDQUFDLEtBQUssS0FBSyxXQUFXLENBQUMsQ0FBQztBQUMvRixDQUFDO0FBRUQsZ0ZBQWdGO0FBQ2hGLDJCQUEyQjtBQUMzQixFQUFFO0FBQ0YsMkVBQTJFO0FBQzNFLDBFQUEwRTtBQUMxRSwyRUFBMkU7QUFDM0Usd0NBQXdDO0FBQ3hDLGdGQUFnRjtBQUNoRiw4REFBOEQ7QUFDOUQsTUFBTSxVQUFVLGlCQUFpQixDQUMvQixNQUFjLEVBQ2QsT0FBaUM7SUFFakMsTUFBTSxPQUFPLEdBQUcsTUFBTSxDQUFDLE1BQU0sRUFBRSxPQUFPLENBQUM7SUFFdkMsMkVBQTJFO0lBQzNFLDZFQUE2RTtJQUM3RSx3RUFBd0U7SUFDeEUsSUFBSSxPQUFPLEVBQUUsT0FBTyxLQUFLLEtBQUssSUFBSSxDQUFDLGtCQUFrQixDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUM7UUFDOUQsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0lBRUQsTUFBTSxNQUFNLEdBQUcsY0FBYyxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBRXRDLE9BQU87UUFDTCxJQUFJLEVBQUUsYUFBYTtRQUNuQixJQUFJLEVBQUUsUUFBUSxDQUFDLE1BQU07UUFDckIsS0FBSyxFQUFFLE9BQU8sRUFBRSxLQUFLLElBQUksVUFBVTtRQUNuQyxRQUFRLEVBQUUsS0FBSztRQUNmLE1BQU0sRUFBRSxHQUFHLEVBQUUsQ0FBQyxNQUFNO1FBQ3BCLE9BQU8sRUFBRSxvQkFBb0IsQ0FBQyxNQUFNLEVBQUUsT0FBTyxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sSUFBSSxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUztLQUM1RixDQUFDO0FBQ0osQ0FBQztBQUVELGdGQUFnRjtBQUNoRiw4RUFBOEU7QUFDOUUsNkVBQTZFO0FBQzdFLDREQUE0RDtBQUM1RCxNQUFNLFVBQVUsZ0JBQWdCLENBQUMsTUFBcUI7SUFDcEQsSUFBSSxDQUFDLE1BQU0sSUFBSSxDQUFDLGlCQUFpQixDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUM7UUFDMUMsT0FBTyxFQUFFLENBQUM7SUFDWixDQUFDO0lBRUQsTUFBTSxPQUFPLEdBQUcsTUFBTSxDQUFDLE1BQU0sRUFBRSxPQUFPLENBQUM7SUFFdkMsT0FBTyxDQUFDLFNBQVMsRUFBRSxPQUFPLEVBQUUsS0FBSyxJQUFJLEVBQUUsRUFBRSxDQUFDLE9BQU8sRUFBRSxhQUFhLElBQUksRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQy9GLENBQUM7QUFFRCw4RUFBOEU7QUFDOUUsMkVBQTJFO0FBQzNFLHVFQUF1RTtBQUN2RSxNQUFNLFVBQVUsb0JBQW9CLENBQ2xDLEtBQTBCLEVBQzFCLE1BQTJCLEVBQzNCLE1BQXFCO0lBRXJCLE9BQU8sTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEtBQUssRUFBRSxFQUFFO1FBQzFCLE1BQU0sSUFBSSxHQUFHLGFBQWEsQ0FBQyxLQUFLLEVBQUUsTUFBTSxDQUFDLENBQUM7UUFFMUMsUUFBUSxLQUFLLENBQUMsSUFBSSxFQUFFLENBQUM7WUFDbkIsS0FBSyxXQUFXO2dCQUNkLE9BQU8sRUFBRSxPQUFPLEVBQUUsS0FBSyxDQUFDLEVBQUUsRUFBRSxLQUFLLEVBQUUsa0JBQWtCLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxFQUFFLENBQUM7WUFFdkUsS0FBSyxRQUFRO2dCQUNYLE9BQU8sRUFBRSxPQUFPLEVBQUUsS0FBSyxDQUFDLEVBQUUsRUFBRSxLQUFLLEVBQUUsZUFBZSxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsRUFBRSxDQUFDO1lBRXBFLEtBQUssYUFBYTtnQkFDaEIsT0FBTyxFQUFFLE9BQU8sRUFBRSxLQUFLLENBQUMsRUFBRSxFQUFFLEtBQUssRUFBRSxvQkFBb0IsQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLEVBQUUsQ0FBQztZQUV6RSxPQUFPLENBQUMsQ0FBQyxDQUFDO2dCQUNSLE1BQU0sT0FBTyxHQUFHLE1BQU0sQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUM7Z0JBRWpELE9BQU8sRUFBRSxPQUFPLEVBQUUsS0FBSyxDQUFDLEVBQUUsRUFBRSxLQUFLLEVBQUUsT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFLEtBQUssRUFBRSxPQUFPLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUM7WUFDM0UsQ0FBQztRQUNILENBQUM7SUFDSCxDQUFDLENBQUMsQ0FBQztBQUNMLENBQUM7QUFFRCw0Q0FBNEM7QUFDNUMsU0FBUyxrQkFBa0IsQ0FBQyxLQUEwQixFQUFFLElBQVk7SUFDbEUsTUFBTSxLQUFLLEdBQUcsS0FBSyxDQUFDLGFBQWEsQ0FBQyxJQUFJLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQztJQUNqRCxNQUFNLEdBQUcsR0FBRyxLQUFLLENBQUMsYUFBYSxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDO0lBRTdDLElBQUksQ0FBQyxLQUFLLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQztRQUNuQixPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7SUFFRCxPQUFPLEVBQUUsS0FBSyxFQUFFLEtBQUssSUFBSSxJQUFJLEVBQUUsR0FBRyxFQUFFLEdBQUcsSUFBSSxJQUFJLEVBQUUsQ0FBQztBQUNwRCxDQUFDO0FBRUQsMEVBQTBFO0FBQzFFLGtCQUFrQjtBQUNsQixTQUFTLGVBQWUsQ0FBQyxLQUEwQixFQUFFLElBQVk7SUFDL0QsTUFBTSxhQUFhLEdBQUcsaUJBQWlCLENBQUMsS0FBSyxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDckUsSUFBSSxhQUFhLENBQUMsTUFBTSxFQUFFLENBQUM7UUFDekIsT0FBTyxFQUFFLGFBQWEsRUFBRSxDQUFDO0lBQzNCLENBQUM7SUFFRCxNQUFNLE1BQU0sR0FBRyxpQkFBaUIsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztJQUU5QyxPQUFPLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsTUFBTSxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQztBQUMzQyxDQUFDO0FBRUQseUVBQXlFO0FBQ3pFLFNBQVMsb0JBQW9CLENBQUMsS0FBMEIsRUFBRSxJQUFZO0lBQ3BFLE1BQU0sR0FBRyxHQUFHLFVBQVUsQ0FBQyxLQUFLLENBQUMsYUFBYSxDQUFDLElBQUksRUFBRSxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDMUQsTUFBTSxHQUFHLEdBQUcsVUFBVSxDQUFDLEtBQUssQ0FBQyxhQUFhLENBQUMsSUFBSSxFQUFFLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUUxRCxJQUFJLEdBQUcsS0FBSyxJQUFJLElBQUksR0FBRyxLQUFLLElBQUksRUFBRSxDQUFDO1FBQ2pDLE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQztJQUVELE9BQU87UUFDTCxHQUFHLENBQUMsR0FBRyxLQUFLLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO1FBQ2hDLEdBQUcsQ0FBQyxHQUFHLEtBQUssSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7S0FDakMsQ0FBQztBQUNKLENBQUM7QUFFRCw2RUFBNkU7QUFDN0UsOEVBQThFO0FBQzlFLGtDQUFrQztBQUNsQyxTQUFTLFVBQVUsQ0FBQyxHQUFZO0lBQzlCLE1BQU0sSUFBSSxHQUFHLE9BQU8sR0FBRyxLQUFLLFFBQVEsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsR0FBRyxJQUFJLEVBQUUsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDO0lBQzlFLE1BQU0sTUFBTSxHQUFHLElBQUksS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBRWhELE9BQU8sTUFBTSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7QUFDakQsQ0FBQztBQUVELDBFQUEwRTtBQUMxRSwyRUFBMkU7QUFDM0UsNEVBQTRFO0FBQzVFLG1EQUFtRDtBQUNuRCxNQUFNLFVBQVUsbUJBQW1CLENBQUMsS0FBMEM7SUFDNUUsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDO1FBQ1gsT0FBTyxFQUFFLENBQUM7SUFDWixDQUFDO0lBRUQsT0FBTyxJQUFJLENBQUMsU0FBUyxDQUFDO1FBQ3BCLGVBQWUsQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLElBQUksRUFBRTtRQUNsQyxlQUFlLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxJQUFJLEVBQUU7UUFDaEMsQ0FBQyxLQUFLLENBQUMsTUFBTSxJQUFJLEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUM7UUFDaEMsQ0FBQyxLQUFLLENBQUMsYUFBYSxJQUFJLEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUM7UUFDdkMsQ0FBQyxLQUFLLENBQUMsS0FBSyxJQUFJLEVBQUUsQ0FBQyxDQUFDLElBQUksRUFBRTtRQUMxQixLQUFLLENBQUMsR0FBRyxJQUFJLEVBQUU7UUFDZixLQUFLLENBQUMsR0FBRyxJQUFJLEVBQUU7S0FDaEIsQ0FBQyxDQUFDO0FBQ0wsQ0FBQztBQUVELGdGQUFnRjtBQUNoRix1RkFBdUY7QUFDdkYsaUZBQWlGO0FBQ2pGLGdGQUFnRjtBQUNoRixnRkFBZ0Y7QUFDaEYsU0FBUyxpQkFBaUIsQ0FBQyxHQUFZO0lBQ3JDLElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDO1FBQ3ZCLE9BQU8sR0FBRyxDQUFDO0lBQ2IsQ0FBQztJQUVELElBQUksR0FBRyxLQUFLLElBQUksSUFBSSxHQUFHLEtBQUssU0FBUyxJQUFJLEdBQUcsS0FBSyxFQUFFLEVBQUUsQ0FBQztRQUNwRCxPQUFPLEVBQUUsQ0FBQztJQUNaLENBQUM7SUFFRCxPQUFPLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDaEMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IElGaWx0ZXJDb25maWdJdGVtLCBJdGVtVHlwZSwgZ2V0RXhjbHVkZU5hbWUgfSBmcm9tICdAZmlyZXN0aXRjaC9maWx0ZXInO1xuXG5pbXBvcnQgeyBmb3JtYXQsIHBhcnNlSVNPIH0gZnJvbSAnZGF0ZS1mbnMnO1xuXG5pbXBvcnQgeyBPYnNlcnZhYmxlLCBvZiB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgbWFwLCBzaGFyZVJlcGxheSB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcblxuaW1wb3J0IHsgUmVwb3J0RGF0YSB9IGZyb20gJy4vZGF0YS9yZXBvcnQuZGF0YSc7XG5pbXBvcnQgeyBmaWx0ZXJMaW5lVGV4dCwgbWF0Y2hMaW5lVGV4dCB9IGZyb20gJy4vZXhwb3J0L3JlcG9ydC1maWx0ZXItbGluZXMnO1xuaW1wb3J0IHsgREFZX1NIT1JULCBmb3JtYXRMb2NhbERhdGUsIHJlc29sdmVGb3JtYXRDb250ZXh0IH0gZnJvbSAnLi9mb3JtYXQnO1xuaW1wb3J0IHsgUmVwb3J0RmlsdGVyTWF0Y2ggfSBmcm9tICcuL2ludGVyZmFjZXMvcmVwb3J0LWZpbHRlci1tYXRjaC50eXBlJztcbmltcG9ydCB7IFJlcG9ydEZpbHRlck9wdGlvblBhaXIgfSBmcm9tICcuL2ludGVyZmFjZXMvcmVwb3J0LWZpbHRlci1vcHRpb24tcGFpci5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgUmVwb3J0Vmlld2VyRmVhdHVyZSB9IGZyb20gJy4vaW50ZXJmYWNlcy9yZXBvcnQtdmlld2VyLWZlYXR1cmUudHlwZSc7XG5pbXBvcnQge1xuICBDaGFydEdyYW51bGFyaXR5LCBGaWx0ZXJHcm91cFZhbHVlLCBHUkFOVUxBUklUWV9PUFRJT05TLCBSZXBvcnQsIFJlcG9ydEZpbHRlckdyb3VwLCBSZXBvcnRGaWx0ZXJMZXZlbCxcbiAgUmVwb3J0RmlsdGVyT3B0aW9uLCBSZXBvcnRGaWx0ZXJUeXBlLCBSZXBvcnRMb2NhbGVUYWcsXG59IGZyb20gJy4vaW50ZXJmYWNlcy9yZXBvcnQuaW50ZXJmYWNlJztcbmltcG9ydCB7IG9mZmVyc0V4Y2x1ZGUgfSBmcm9tICcuL3JlcG9ydC12aWV3ZXItZmVhdHVyZXMnO1xuaW1wb3J0IHsgUmVwb3J0RmlsdGVyT3B0aW9uc1NlcnZpY2UgfSBmcm9tICcuL3NlcnZpY2VzL3JlcG9ydC1maWx0ZXItb3B0aW9ucy5zZXJ2aWNlJztcblxuXG4vLyBBIGRhdGUtcmFuZ2UgYm91bmRhcnkgYXMgdGhlIHBpY2tlZCBMT0NBTCBjYWxlbmRhciBkYXkgKG5vIHRpbWUsIG5vIHR6KS5cbi8vIERhdGUtcmFuZ2UgZmlsdGVycyBhcmUgY2FsZW5kYXItZGF5IHNlbWFudGljcywgc28gdGhlIGJvdW5kYXJ5IG11c3QgY2Fycnlcbi8vIG9ubHkgWS1NLUQg4oCUIG5ldmVyIGEgdGltZXpvbmUtYmVhcmluZyBpbnN0YW50IHRoZSBiYWNrZW5kIHdvdWxkIHNoaWZ0LlxuZXhwb3J0IGZ1bmN0aW9uIGRhdGVCb3VuZFN0cmluZyh2YWx1ZTogRGF0ZSB8IHN0cmluZyB8IG51bGwgfCB1bmRlZmluZWQpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBpZiAodmFsdWUgaW5zdGFuY2VvZiBEYXRlKSB7XG4gICAgcmV0dXJuIGZvcm1hdCh2YWx1ZSwgJ3l5eXktTU0tZGQnKTtcbiAgfVxuXG4gIC8vIEF1dGhvcmVkL3JlbGF0aXZlIGRlZmF1bHRzIGFycml2ZSBhcyBzdHJpbmdzIGFscmVhZHkgaW4gWS1NLUQgZm9ybTtcbiAgLy8ga2VlcCBqdXN0IHRoZSBkYXRlIHBvcnRpb24uXG4gIHJldHVybiB2YWx1ZSA/IFN0cmluZyh2YWx1ZSkuc2xpY2UoMCwgMTApIDogdW5kZWZpbmVkO1xufVxuXG5cbi8vIEEgZGF0ZS1yYW5nZSBib3VuZGFyeSBhcyBpdCBzaG91bGQgUkVBRCBvbiBhIGNvdmVyIHBhZ2Ug4oCUIHRoZSBzYW1lIGNhbGVuZGFyXG4vLyBkYXkgZGF0ZUJvdW5kU3RyaW5nKCkgaGFuZHMgdGhlIHNlcnZlciwgc28gYSBwcmludGVkIHBlcmlvZCBjYW4gbmV2ZXIgbmFtZSBhXG4vLyBkaWZmZXJlbnQgZGF5IHRoYW4gdGhlIG51bWJlcnMgdW5kZXIgaXQgd2VyZSBmaWx0ZXJlZCBieS4gUmV0dXJucyBudWxsIHdoZW5cbi8vIHRoZXJlIGlzIG5vIGJvdW5kYXJ5OyB0aGUgY2FsbGVyIHN1cHBsaWVzIGl0cyBvd24gcGxhY2Vob2xkZXIuXG4vL1xuLy8gVGhlIHBhcnNlIGhhcyB0byBiZSBwYXJzZUlTTywgbm90IGBuZXcgRGF0ZWA6IGBuZXcgRGF0ZSgnMjAyNi0wNS0wMScpYCBpcyBVVENcbi8vIG1pZG5pZ2h0LCBzbyBmb3JtYXR0aW5nIGl0IGFueXdoZXJlIHdlc3Qgb2YgVVRDIHByaW50cyBBcHIgMzAuIHBhcnNlSVNPIHJlYWRzXG4vLyBhIGJhcmUgWS1NLUQgYXMgTE9DQUwgbWlkbmlnaHQsIHdoaWNoIG5vIG9mZnNldCBjYW4gc2hpZnQuXG4vL1xuLy8gVGhlIGRheSBpcyB3cml0dGVuIGluIHRoZSByZXBvcnQncyBsb2NhbGUsIGFzIGl0cyBkYXRlIGNlbGxzIGFyZTogJ0phbiA1LFxuLy8gMjAyNicgaW4gZW4tVVMsICc1IGphbnYuIDIwMjYnIGluIGZyLUNBLlxuZXhwb3J0IGZ1bmN0aW9uIGRhdGVCb3VuZExhYmVsKHZhbHVlOiBEYXRlIHwgc3RyaW5nIHwgbnVsbCB8IHVuZGVmaW5lZCwgbG9jYWxlOiBSZXBvcnRMb2NhbGVUYWcpOiBzdHJpbmcgfCBudWxsIHtcbiAgY29uc3QgYm91bmQgPSBkYXRlQm91bmRTdHJpbmcodmFsdWUpO1xuXG4gIGlmICghYm91bmQpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIGNvbnN0IGRhdGUgPSBwYXJzZUlTTyhib3VuZCk7XG5cbiAgcmV0dXJuIE51bWJlci5pc05hTihkYXRlLmdldFRpbWUoKSkgPyBTdHJpbmcodmFsdWUpIDogZm9ybWF0TG9jYWxEYXRlKGRhdGUsIGxvY2FsZSwgREFZX1NIT1JUKTtcbn1cblxuXG4vLyBBIHN0b3JlZCB5eXl5LU1NLWRkIGJvdW5kYXJ5IGFzIGEgbG9jYWwgRGF0ZSBmb3IgYSBkYXRlIHBpY2tlciwgb3IgbnVsbC5cbi8vIHBhcnNlSVNPIHJlYWRzIGEgYmFyZSBZLU0tRCBhcyBMT0NBTCBtaWRuaWdodCwgc28gdGhlIHBpY2tlciBzaG93cyB0aGUgZGF5XG4vLyB0aGF0IHdhcyBzdG9yZWQsIHdoYXRldmVyIHRoZSBicm93c2VyJ3Mgem9uZS5cbmV4cG9ydCBmdW5jdGlvbiBkYXRlRnJvbUJvdW5kKHZhbHVlOiBzdHJpbmcgfCBudWxsIHwgdW5kZWZpbmVkKTogRGF0ZSB8IG51bGwge1xuICBpZiAoIXZhbHVlKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBjb25zdCBkYXRlID0gcGFyc2VJU08odmFsdWUuc2xpY2UoMCwgMTApKTtcblxuICByZXR1cm4gTnVtYmVyLmlzTmFOKGRhdGUuZ2V0VGltZSgpKSA/IG51bGwgOiBkYXRlO1xufVxuXG5cbi8vIEEgcGlja2VkIERhdGUgYXMgYSB5eXl5LU1NLWRkIGJvdW5kYXJ5IGZvciBzdG9yYWdlLCBvciBudWxsLiBVc2VzIHRoZSBsb2NhbFxuLy8gY2FsZW5kYXIgZGF5IChmb3JtYXQsIG5vdCB0b0lTT1N0cmluZykgc28gdGhlIGJvdW5kYXJ5IGlzIHRoZSBkYXkgdGhhdCB3YXNcbi8vIHBpY2tlZCwgcmVnYXJkbGVzcyBvZiB0aGUgYnJvd3NlcidzIHpvbmUuXG5leHBvcnQgZnVuY3Rpb24gZGF0ZVRvQm91bmQodmFsdWU6IERhdGUgfCBudWxsIHwgdW5kZWZpbmVkKTogc3RyaW5nIHwgbnVsbCB7XG4gIHJldHVybiB2YWx1ZSBpbnN0YW5jZW9mIERhdGUgJiYgIU51bWJlci5pc05hTih2YWx1ZS5nZXRUaW1lKCkpXG4gICAgPyBmb3JtYXQodmFsdWUsICd5eXl5LU1NLWRkJylcbiAgICA6IG51bGw7XG59XG5cblxuLy8gQSByZWxhdGl2ZSBkYXRlLXJhbmdlIHByZXNldCBrZXkgYXMgYSBzZW50ZW5jZS1jYXNlIGxhYmVsLCBkZXJpdmVkIGZyb20gdGhlXG4vLyBjYW1lbENhc2Uga2V5IGl0c2VsZiAoJ2xhc3QxMk1vbnRocycgcmVhZHMgJ0xhc3QgMTIgbW9udGhzJywgJ3RoaXNXZWVrJ1xuLy8gcmVhZHMgJ1RoaXMgd2VlaycpLCBzbyBubyBsaXN0IG9mIHByZXNldHMgaXMgbWlycm9yZWQgaGVyZSBhbmQgYSBrZXkgdGhlXG4vLyBzZXJ2ZXIgYWRkcyBsYXRlciBzdGlsbCByZWFkcyBzZW5zaWJseS5cbmV4cG9ydCBmdW5jdGlvbiByZWxhdGl2ZUxhYmVsKHJlbGF0aXZlOiBzdHJpbmcpOiBzdHJpbmcge1xuICBjb25zdCB3b3JkcyA9IHJlbGF0aXZlXG4gICAgLnJlcGxhY2UoLyhbYS16XSkoW0EtWjAtOV0pL2csICckMSAkMicpXG4gICAgLnJlcGxhY2UoLyhcXGQpKFtBLVpdKS9nLCAnJDEgJDInKVxuICAgIC50b0xvd2VyQ2FzZSgpO1xuXG4gIHJldHVybiB3b3Jkcy5jaGFyQXQoMCkudG9VcHBlckNhc2UoKSArIHdvcmRzLnNsaWNlKDEpO1xufVxuXG5cbi8vIE1hcHMgYSByZXBvcnQgZmlsdGVyIEdST1VQIHRvIGFuIGZzLWZpbHRlciBjb25maWcgaXRlbSwgYW5kIHJlYWRzIGZzLWZpbHRlclxuLy8gcXVlcnkgdmFsdWVzIGJhY2sgaW50byBwZXItZ3JvdXAgRmlsdGVyR3JvdXBWYWx1ZXMuIFNoYXJlZCBieSB0aGUgcmVwb3J0LWJhclxuLy8gZnMtZmlsdGVyIGFuZCB0aGUgcGVyLWNvbXBvbmVudCBmcy1maWx0ZXIgc28gYm90aCByZW5kZXIgdGhyb3VnaCB0aGUgc2FtZVxuLy8gbGlicmFyeSBhbmQgd3JpdGUgaW50byBSZXBvcnRGaWx0ZXJTdGF0ZVNlcnZpY2UgaWRlbnRpY2FsbHkuIEl0ZW1zIGFyZSBuYW1lZFxuLy8gYnkgdGhlIGdyb3VwJ3Mga2V5IChncm91cFBhcmFtS2V5cyksIHNvIHRoZSBxdWVyeSBrZXlzIG1hcCBzdHJhaWdodCBiYWNrIHRvXG4vLyB0aGUgZ3JvdXAsIGFuZCB0aGUgcmVwb3J0IGxpbmsgdXNlcyB0aGUgc2FtZSBxdWVyeSBrZXlzIChyZXBvcnQtdXJsLXN0YXRlLnRzKS5cblxuLy8gVGhlIHF1ZXJ5IGtleSBmb3IgdGhlIHJlcG9ydCdzIGdyb3VwLWJ5IGNvbnRyb2wuIEZpeGVkIHJhdGhlciB0aGFuIGRlcml2ZWRcbi8vIGZyb20gYW4gaWQgYmVjYXVzZSBhIHJlcG9ydCBoYXMgZXhhY3RseSBvbmUg4oCUIGFuZCBpdCBpcyBOT1QgYSBmaWx0ZXIgZ3JvdXAsXG4vLyBzbyBpdCBpcyByZWFkIHN0cmFpZ2h0IG9mZiB0aGUgY2hhbmdlIHF1ZXJ5IGluc3RlYWQgb2YgdGhyb3VnaFxuLy8gZ3JvdXBWYWx1ZXNGcm9tUXVlcnkuIEl0IGlzIGFsc28gdGhlIHJlcG9ydCBVUkwncyBrZXkgZm9yIHRoZSBncmFpblxuLy8gKHJlcG9ydC11cmwtc3RhdGUudHMpLiBUaGUgZ3JhaW4gdHJhdmVscyB0byB0aGUgc2VydmVyIGFzIHRoZSBkYXRhXG4vLyByZXF1ZXN0J3MgYHN0YXRlLmZyZXF1ZW5jeWAuXG5leHBvcnQgY29uc3QgR1JPVVBfQllfSVRFTSA9ICdncm91cEJ5JztcblxuLy8gVGhlIGtleXMgb2YgdGhlIHJlcG9ydCBVUkwgdGhhdCBhcmUgbm90IGZpbHRlciBncm91cHMgKHJlcG9ydC11cmwtc3RhdGUudHNcbi8vIHJlYWRzIGFuZCB3cml0ZXMgdGhlbSkuIFRoZXkgYXJlIGRlY2xhcmVkIGhlcmUgYmVjYXVzZSBhIGdyb3VwIGtleSBtdXN0XG4vLyBub3QgdGFrZSBvbmUsIGFuZCByZXBvcnQtdXJsLXN0YXRlLnRzIGltcG9ydHMgdGhpcyBmaWxlLlxuLy8gVGhlIHNoYXJlZCB2aWV3IHRoZSBzdGF0ZSBpcyBhIGRpZmYgZnJvbSwgYW5kIHRoZSBvcGVuIHBlcnNvbmFsIHZpZXcuXG5leHBvcnQgY29uc3QgVklFV19QQVJBTSA9ICdydic7XG5leHBvcnQgY29uc3QgUEVSU09OQUxfVklFV19QQVJBTSA9ICdycHYnO1xuLy8gVGhlIGxpbmsncyBmb3JtYXQuXG5leHBvcnQgY29uc3QgRk9STUFUX1BBUkFNID0gJ3JmJztcbi8vIFRoZSBob3N0J3MgcGFnZSBrZXkgKEZzQWlSZXBvcnRDb21wb25lbnQucGFnZVF1ZXJ5UGFyYW0pLCBhcyBtb3N0IGhvc3RzXG4vLyBuYW1lIGl0LlxuZXhwb3J0IGNvbnN0IFBBR0VfUEFSQU0gPSAncGFnZSc7XG5cbi8vIFRoZSB3b3JkIGJlZm9yZSBhIGdyb3VwJ3MgaWQgaW4gdGhlIGtleSBvZiBhIGdyb3VwIHdob3NlIGxhYmVsIGdpdmVzIG5vXG4vLyBrZXkgaXQgY2FuIHVzZSAoZmlsdGVyMTIpLlxuY29uc3QgRkFMTEJBQ0tfS0VZX1dPUkQgPSAnZmlsdGVyJztcblxuLy8gVGhlIGVuZHMgb2YgYW4gZnMtZmlsdGVyIHJhbmdlIGl0ZW06IFJhbmdlIHdyaXRlcyA8a2V5Pk1pbiBhbmQgPGtleT5NYXgsXG4vLyBEYXRlUmFuZ2UgPGtleT5Gcm9tIGFuZCA8a2V5PlRvLlxuZXhwb3J0IHR5cGUgSXRlbVJhbmdlRW5kID0gJ21pbicgfCAnbWF4JyB8ICdmcm9tJyB8ICd0byc7XG5cbi8vIFRoZSBxdWVyeSBrZXkgb2Ygb25lIGVuZCBvZiBhbiBmcy1maWx0ZXIgcmFuZ2UgaXRlbTogdGhlIGl0ZW0ncyBuYW1lIGFuZFxuLy8gdGhlIGVuZCB3aXRoIGl0cyBmaXJzdCBsZXR0ZXIgdXBwZXItY2FzZWQgKGZzLWZpbHRlcidzIGdldFJhbmdlTmFtZSksIHNvXG4vLyB1bml0cyBnaXZlcyB1bml0c01pbiBhbmQgZGF0ZSBnaXZlcyBkYXRlRnJvbS5cbmV4cG9ydCBmdW5jdGlvbiBpdGVtUmFuZ2VOYW1lKG5hbWU6IHN0cmluZywgZW5kOiBJdGVtUmFuZ2VFbmQpOiBzdHJpbmcge1xuICByZXR1cm4gYCR7bmFtZX0ke2VuZC5jaGFyQXQoMCkudG9VcHBlckNhc2UoKX0ke2VuZC5zbGljZSgxKX1gO1xufVxuXG4vLyBFYWNoIGdyb3VwJ3Mga2V5IGluIHRoZSByZXBvcnQgVVJMLCBieSBncm91cCBpZCwgd2hpY2ggaXMgYWxzbyB0aGUgbmFtZSBvZlxuLy8gaXRzIGZzLWZpbHRlciBpdGVtOiB0aGUgY2FtZWxDYXNlIG9mIHRoZSBsYWJlbCB0aGUgYmFyIHNob3dzICgnUmVnaW9uJyAtPlxuLy8gcmVnaW9uLCAnUmVwb3J0IFBlcmlvZCcgLT4gcmVwb3J0UGVyaW9kKS4gVGhlIGxpbmsgd3JpdGVzIGEgZ3JvdXAgdW5kZXJcbi8vIHRoZSBpdGVtJ3Mgb3duIHF1ZXJ5IGtleXMgKHJlZ2lvbj0sIGV4Y2x1ZGVSZWdpb249LCB1bml0c01pbj0sIGRhdGVGcm9tPSkuXG4vLyBBIGtleSB0aGUgcmVwb3J0IGNhbm5vdCBnaXZlIGEgZ3JvdXAgYXMgaXQgaXMgKGFub3RoZXIgZ3JvdXAgd2l0aCBhIGxvd2VyXG4vLyBpZCBoYXMgaXQgb3Igb25lIG9mIGl0cyBmb3JtcywgYW5vdGhlciBsaW5rIGtleSBvciBiYXIgaXRlbSB1c2VzIGl0LCBvciBpdFxuLy8gaXMgc2hhcGVkIGxpa2UgYSB0aWxlJ3MgaWQga2V5LCBzdWNoIGFzIHE0KSBpcyB0aGUga2V5IGFuZCB0aGUgZ3JvdXAncyBpZFxuLy8gKHJlZ2lvbjEyKS4gQSBsYWJlbCB3aXRoIG5vIGxldHRlciBvciBkaWdpdCwgb3IgYSBjbGFzaCBldmVuIHRoZW4sIGtleXMgb25cbi8vIGZpbHRlcjxpZD4uIGBncm91cHNgIGlzIGV2ZXJ5IGdyb3VwIG9mIHRoZSByZXBvcnQsIHNvIGV2ZXJ5IGJhciBhbmQgdGhlXG4vLyBsaW5rIG5hbWUgYSBncm91cCBhbGlrZS5cbmV4cG9ydCBmdW5jdGlvbiBncm91cFBhcmFtS2V5cyhncm91cHM6IHJlYWRvbmx5IFBpY2s8UmVwb3J0RmlsdGVyR3JvdXAsICdpZCcgfCAnbGFiZWwnIHwgJ2ZpbHRlcnMnPltdKTogTWFwPG51bWJlciwgc3RyaW5nPiB7XG4gIC8vIFRoZSBVUkwncyBvdGhlciBrZXlzIGFuZCB0aGUgYmFyJ3Mgb3RoZXIgaXRlbXMuXG4gIGNvbnN0IHRha2VuID0gbmV3IFNldChbXG4gICAgUEFHRV9QQVJBTSwgR1JPVVBfQllfSVRFTSwgTUFUQ0hfSVRFTSwgTElTVF9TRUFSQ0hfSVRFTSwgVklFV19QQVJBTSwgUEVSU09OQUxfVklFV19QQVJBTSwgRk9STUFUX1BBUkFNLFxuICBdKTtcbiAgY29uc3QgZnJlZSA9IChjYW5kaWRhdGU6IHN0cmluZykgPT4gISFjYW5kaWRhdGVcbiAgICAmJiBrZXlGb3JtcyhjYW5kaWRhdGUpLmV2ZXJ5KChmb3JtKSA9PiAhdGFrZW4uaGFzKGZvcm0pICYmICFJRF9LRVkudGVzdChmb3JtKSk7XG4gIGNvbnN0IGtleXMgPSBuZXcgTWFwPG51bWJlciwgc3RyaW5nPigpO1xuXG4gIFsuLi5ncm91cHNdXG4gICAgLnNvcnQoKGEsIGIpID0+IGEuaWQgLSBiLmlkKVxuICAgIC5mb3JFYWNoKChncm91cCkgPT4ge1xuICAgICAgY29uc3Qgd2FudGVkID0gbGFiZWxLZXkoZ3JvdXBMYWJlbChncm91cCkpO1xuICAgICAgY29uc3Qga2V5ID0gW3dhbnRlZCwgd2FudGVkICYmIGAke3dhbnRlZH0ke2dyb3VwLmlkfWBdLmZpbmQoZnJlZSkgPz8gZmFsbGJhY2tLZXkoZ3JvdXAuaWQsIGZyZWUpO1xuXG4gICAgICBrZXlGb3JtcyhrZXkpLmZvckVhY2goKGZvcm0pID0+IHRha2VuLmFkZChmb3JtKSk7XG4gICAgICBrZXlzLnNldChncm91cC5pZCwga2V5KTtcbiAgICB9KTtcblxuICByZXR1cm4ga2V5cztcbn1cblxuLy8gZmlsdGVyPGlkPiwgb3IsIGluIHRoZSByYXJlIHJlcG9ydCB3aGVyZSBhbm90aGVyIGdyb3VwJ3MgbGFiZWwgYWxyZWFkeVxuLy8gZ2l2ZXMgdGhhdCwgZmlsdGVyPGlkPiBhbmQgYSBjb3VudC5cbmZ1bmN0aW9uIGZhbGxiYWNrS2V5KGdyb3VwSWQ6IG51bWJlciwgZnJlZTogKGNhbmRpZGF0ZTogc3RyaW5nKSA9PiBib29sZWFuKTogc3RyaW5nIHtcbiAgY29uc3QgYmFzZSA9IGAke0ZBTExCQUNLX0tFWV9XT1JEfSR7Z3JvdXBJZH1gO1xuICBsZXQga2V5ID0gYmFzZTtcblxuICBmb3IgKGxldCBjb3VudCA9IDI7ICFmcmVlKGtleSk7IGNvdW50KyspIHtcbiAgICBrZXkgPSBgJHtiYXNlfU4ke2NvdW50fWA7XG4gIH1cblxuICByZXR1cm4ga2V5O1xufVxuXG4vLyBBIGdyb3VwJ3Mga2V5IGFtb25nIGBncm91cHNgIChldmVyeSBncm91cCBvZiB0aGUgcmVwb3J0KS4gQSBncm91cCB0aGF0IGlzXG4vLyBub3QgYW1vbmcgdGhlbSBpcyBrZXllZCBhcyBvbmUgbW9yZSBvZiB0aGVtLlxuZXhwb3J0IGZ1bmN0aW9uIGdyb3VwUGFyYW1LZXkoXG4gIGdyb3VwOiBQaWNrPFJlcG9ydEZpbHRlckdyb3VwLCAnaWQnIHwgJ2xhYmVsJyB8ICdmaWx0ZXJzJz4sXG4gIGdyb3VwczogcmVhZG9ubHkgUGljazxSZXBvcnRGaWx0ZXJHcm91cCwgJ2lkJyB8ICdsYWJlbCcgfCAnZmlsdGVycyc+W10sXG4pOiBzdHJpbmcge1xuICByZXR1cm4gZ3JvdXBQYXJhbUtleXMoZ3JvdXBzLnNvbWUoKGNhbmRpZGF0ZSkgPT4gY2FuZGlkYXRlLmlkID09PSBncm91cC5pZCkgPyBncm91cHMgOiBbLi4uZ3JvdXBzLCBncm91cF0pXG4gICAgLmdldChncm91cC5pZCk7XG59XG5cbi8vIFRoZSBuYW1lIG9mIGEgZ3JvdXAncyBmcy1maWx0ZXIgaXRlbTogaXRzIGtleSBhbW9uZyB0aGUgcmVwb3J0J3MgZ3JvdXBzLlxuZXhwb3J0IGZ1bmN0aW9uIGdyb3VwSXRlbU5hbWUoZ3JvdXA6IFJlcG9ydEZpbHRlckdyb3VwLCByZXBvcnQ6IFJlcG9ydCB8IG51bGwpOiBzdHJpbmcge1xuICByZXR1cm4gZ3JvdXBQYXJhbUtleShncm91cCwgcmVwb3J0Py5maWx0ZXJHcm91cHMgPz8gW10pO1xufVxuXG4vLyBUaGUgbGFiZWwgYSBncm91cCdzIGNoaXAgc2hvd3M6IGl0cyBvd24sIGVsc2UgaXRzIGZpcnN0IG1lbWJlcidzIGNvbHVtbi5cbmZ1bmN0aW9uIGdyb3VwTGFiZWwoZ3JvdXA6IFBpY2s8UmVwb3J0RmlsdGVyR3JvdXAsICdsYWJlbCcgfCAnZmlsdGVycyc+KTogc3RyaW5nIHtcbiAgcmV0dXJuIGdyb3VwLmxhYmVsIHx8IGdyb3VwLmZpbHRlcnM/LlswXT8uZmlsdGVyQ29sdW1uIHx8ICcnO1xufVxuXG4vLyBBIGxldHRlciBhbmQgdGhlbiBkaWdpdHM6IHRoZSBzaGFwZSBvZiB0aGUgVVJMJ3MgdGlsZSBrZXlzIChzMzEsIHEzMSxcbi8vIGgzMSwgZDQ0KSwga2VwdCBvZmYgdGhlIGdyb3VwcyBzbyBhIGdyb3VwIGtleSBuZXZlciByZWFkcyBhcyBvbmUuXG5jb25zdCBJRF9LRVkgPSAvXlthLXpdXFxkKyQvO1xuXG5jb25zdCBSQU5HRV9FTkRTOiByZWFkb25seSBJdGVtUmFuZ2VFbmRbXSA9IFsnbWluJywgJ21heCcsICdmcm9tJywgJ3RvJ107XG5cbi8vIEV2ZXJ5IGtleSBhIGdyb3VwJ3MgaXRlbSBvciBsaW5rIG1heSB3cml0ZSB1bmRlciBga2V5YDogdGhlIGtleSwgaXRzXG4vLyBleGNsdWRlIGtleSAoZXhjbHVkZVJlZ2lvbikgYW5kIGFuIGZzLWZpbHRlciByYW5nZSdzIG93biBrZXlzLlxuZnVuY3Rpb24ga2V5Rm9ybXMoa2V5OiBzdHJpbmcpOiBzdHJpbmdbXSB7XG4gIHJldHVybiBba2V5LCBnZXRFeGNsdWRlTmFtZShrZXkpLCAuLi5SQU5HRV9FTkRTLm1hcCgoZW5kKSA9PiBpdGVtUmFuZ2VOYW1lKGtleSwgZW5kKSldO1xufVxuXG4vLyBBIGxhYmVsIGFzIGEgY2FtZWxDYXNlIGtleTogYWNjZW50cyBkcm9wcGVkLCB3b3JkcyBzcGxpdCBvbiBhbnl0aGluZyB0aGF0XG4vLyBpcyBub3QgYSBsZXR0ZXIgb3IgZGlnaXQgKGFuZCB3aGVyZSBhIGxvd2VyLWNhc2UgbGV0dGVyIG1lZXRzIGFuIHVwcGVyLWNhc2Vcbi8vIG9uZSksIHRoZSBmaXJzdCB3b3JkIGxvd2VyLWNhc2UsIGV2ZXJ5IGxhdGVyIG9uZSBjYXBpdGFsaXplZC5cbmZ1bmN0aW9uIGxhYmVsS2V5KGxhYmVsOiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gbGFiZWxcbiAgICAubm9ybWFsaXplKCdORkQnKVxuICAgIC5yZXBsYWNlKC9cXHB7TX0vZ3UsICcnKVxuICAgIC5yZXBsYWNlKC8oW2EtejAtOV0pKFtBLVpdKS9nLCAnJDEgJDInKVxuICAgIC5zcGxpdCgvW15BLVphLXowLTldKy8pXG4gICAgLmZpbHRlcigod29yZCkgPT4gd29yZCAhPT0gJycpXG4gICAgLm1hcCgod29yZCwgaW5kZXgpID0+IHtcbiAgICAgIGNvbnN0IGxvd2VyID0gd29yZC50b0xvd2VyQ2FzZSgpO1xuXG4gICAgICByZXR1cm4gaW5kZXggPyBsb3dlci5jaGFyQXQoMCkudG9VcHBlckNhc2UoKSArIGxvd2VyLnNsaWNlKDEpIDogbG93ZXI7XG4gICAgfSlcbiAgICAuam9pbignJyk7XG59XG5cbi8vIEEgc2VsZWN0IGdyb3VwJ3MgZGlzdGluY3Qgb3B0aW9ucywgYXMgeyBuYW1lLCB2YWx1ZSB9IHBhaXJzLiBUaGUgc2VydmVyIHNlbmRzXG4vLyB7IHZhbHVlLCBsYWJlbCB9OiB0aGUgdmFsdWUgaXMgd2hhdCB0aGUgZmlsdGVyIG1hdGNoZXMgb24gKGFuIGVudGl0eSdzIHN0YWJsZVxuLy8gaWQpIGFuZCB0aGUgbGFiZWwgaXMgd2hhdCB0aGUgdmlld2VyIHJlYWRzIOKAlCBzbyBhIHJlbmFtZWQgZW50aXR5IGtlZXBzIGl0cyBpZFxuLy8gYW5kIHNpbXBseSBzaG93cyBpdHMgbmV3IG5hbWUgaGVyZS4gT3B0aW9ucyBjb21lIGZyb20gdGhlIGZpcnN0IG1lbWJlciBmaWx0ZXJcbi8vIHRoYXQgZGVjbGFyZXMgdGhlbSDigJQgbWVtYmVycyBhcmUgdGhlIHNhbWUgZGF0YSBwb2ludCwgc28gYW55IG1lbWJlcidzIGxpc3Rcbi8vIHNlcnZlcyB0aGUgZ3JvdXAuIFRoZSBsaXN0IGlzIGZldGNoZWQgb25jZSAodGhlIHNlcnZlciBjYXBzIGl0KSBhbmQgcmVwbGF5ZWRcbi8vIChzaGFyZVJlcGxheSksIHNvIHJlcGVhdGVkIHJlYWRzIG5ldmVyIHJlZmV0Y2guIFRoaXMgaXMgdGhlIGZ1bGwgbGlzdCwgbmV2ZXJcbi8vIG5hcnJvd2VkIGJ5IG90aGVyIGZpbHRlcnM6IHRoZSByZXBvcnQtc2V0dGluZ3MgZGVmYXVsdCBwaWNrZXIgcmVhZHMgaXQgKGFuXG4vLyBhdXRob3Igc2V0cyBhIGRlZmF1bHQgYWdhaW5zdCB0aGUgd2hvbGUgbGlzdCksIGFuZCBzbyBkb2VzIHRoZSBleHBvcnQnc1xuLy8gZmlsdGVyIHdvcmRpbmcgZm9yIGEgcGljayB0aGUgYmFyIGhhcyBub3QgbmFtZWQuIFRoZSBiYXJzIHJlYWRcbi8vIFJlcG9ydEZpbHRlck9wdGlvbnNTZXJ2aWNlIGluc3RlYWQuIFJldHVybnMgYW4gZW1wdHkgbGlzdCB3aGVuIG5vIG1lbWJlclxuLy8gcHJvdmlkZXMgb3B0aW9ucy5cbmV4cG9ydCBmdW5jdGlvbiBsb2FkR3JvdXBPcHRpb25zKFxuICBncm91cDogUmVwb3J0RmlsdGVyR3JvdXAsXG4gIHJlcG9ydERhdGE6IFJlcG9ydERhdGEsXG4gIHJlcG9ydElkOiBudW1iZXIsXG4pOiBPYnNlcnZhYmxlPFJlcG9ydEZpbHRlck9wdGlvblBhaXJbXT4ge1xuICBjb25zdCBvcHRpb25GaWx0ZXIgPSAoZ3JvdXAuZmlsdGVycyA/PyBbXSkuZmluZCgobWVtYmVyKSA9PiBtZW1iZXIuaGFzT3B0aW9ucyk7XG4gIGlmICghb3B0aW9uRmlsdGVyKSB7XG4gICAgcmV0dXJuIG9mKFtdKTtcbiAgfVxuXG4gIHJldHVybiByZXBvcnREYXRhLmZpbHRlck9wdGlvbnMocmVwb3J0SWQsIG9wdGlvbkZpbHRlci5pZClcbiAgICAucGlwZShcbiAgICAgIG1hcCgob3B0aW9uczogUmVwb3J0RmlsdGVyT3B0aW9uW10pID0+IChvcHRpb25zID8/IFtdKVxuICAgICAgICAubWFwKChvcHRpb24pID0+ICh7IG5hbWU6IG9wdGlvbi5sYWJlbCwgdmFsdWU6IG9wdGlvbi52YWx1ZSB9KSkpLFxuICAgICAgc2hhcmVSZXBsYXkoeyBidWZmZXJTaXplOiAxLCByZWZDb3VudDogZmFsc2UgfSksXG4gICAgKTtcbn1cblxuLy8gU3RvcmVkIGZpbHRlciB2YWx1ZXMgKGlkcykgcGFpcmVkIGJhY2sgd2l0aCB0aGUgbGFiZWxzIHRvIHNob3cgZm9yIHRoZW0uXG4vLyBBIHNhdmVkIGRlZmF1bHQgaG9sZHMgb25seSB2YWx1ZXMsIHNvIHRoZSBuYW1lcyBoYXZlIHRvIGJlIHJlYWQgYmFjayBvZmYgdGhlXG4vLyBvcHRpb24gbGlzdCDigJQgdGhhdCBpbmRpcmVjdGlvbiBpcyBleGFjdGx5IHdoYXQgc3Vydml2ZXMgYSByZW5hbWUuIGBsYWJlbGBcbi8vIG5hbWVzIGEgdmFsdWUgZmlyc3Q6IGEgbmFtZSBhbHJlYWR5IGxlYXJuZWQgKFJlcG9ydEZpbHRlck9wdGlvbnNTZXJ2aWNlLmxhYmVsKVxuLy8gaG9sZHMgZm9yIGEgcGljayBhIG5hcnJvd2VkIGxpc3QgbGVhdmVzIG91dCwgYW5kIHdoZW4gaXQgbmFtZXMgZXZlcnkgdmFsdWVcbi8vIHRoZSBsaXN0IGlzIG5vdCByZWFkIGF0IGFsbC4gQSB2YWx1ZSB3aXRoIG5vIG5hbWUgYW5kIG5vIG1hdGNoaW5nIG9wdGlvblxuLy8gKGl0cyBlbnRpdHkgd2FzIGRlbGV0ZWQsIHNvIGl0IGlzIG5vIGxvbmdlciBsaXN0ZWQpIGZhbGxzIGJhY2sgdG8gc2hvd2luZ1xuLy8gdGhlIHJhdyB2YWx1ZSByYXRoZXIgdGhhbiBkcm9wcGluZyB0aGUgY2hpcCwgd2hpY2ggd291bGQgc2lsZW50bHkgd2lkZW4gdGhlXG4vLyBmaWx0ZXIuXG5leHBvcnQgZnVuY3Rpb24gcmVzb2x2ZU9wdGlvblZhbHVlcyhcbiAgb3B0aW9ucyQ6IE9ic2VydmFibGU8UmVwb3J0RmlsdGVyT3B0aW9uUGFpcltdPixcbiAgdmFsdWVzOiB1bmtub3duW10sXG4gIGxhYmVsOiAodmFsdWU6IHVua25vd24pID0+IHN0cmluZyB8IG51bGwgPSAoKSA9PiBudWxsLFxuKTogT2JzZXJ2YWJsZTxSZXBvcnRGaWx0ZXJPcHRpb25QYWlyW10+IHtcbiAgY29uc3QgbmFtZWQgPSAob3B0aW9uczogUmVwb3J0RmlsdGVyT3B0aW9uUGFpcltdKSA9PiB2YWx1ZXMubWFwKCh2YWx1ZSkgPT4ge1xuICAgIGNvbnN0IG9wdGlvbiA9IG9wdGlvbnMuZmluZCgoY2FuZGlkYXRlKSA9PiBTdHJpbmcoY2FuZGlkYXRlLnZhbHVlKSA9PT0gU3RyaW5nKHZhbHVlKSk7XG5cbiAgICByZXR1cm4geyBuYW1lOiBsYWJlbCh2YWx1ZSkgPz8gb3B0aW9uPy5uYW1lID8/IFN0cmluZyh2YWx1ZSksIHZhbHVlIH07XG4gIH0pO1xuXG4gIHJldHVybiB2YWx1ZXMuZXZlcnkoKHZhbHVlKSA9PiBsYWJlbCh2YWx1ZSkgIT09IG51bGwpXG4gICAgPyBvZihuYW1lZChbXSkpXG4gICAgOiBvcHRpb25zJC5waXBlKG1hcChuYW1lZCkpO1xufVxuXG4vLyBDYXNlLWluc2Vuc2l0aXZlIG5hbWUgZmlsdGVyIGFwcGxpZWQgdG8gYSBsb2FkZWQgb3B0aW9uIGxpc3Qg4oCUIHRoZSB0eXBlZFxuLy8ga2V5d29yZCBoYXMgdG8gYmUgbWF0Y2hlZCBoZXJlIGJlY2F1c2UgZnMtYXV0b2NvbXBsZXRlIHJlbmRlcnMgd2hhdCB3ZSByZXR1cm5cbi8vIHZlcmJhdGltLlxuZXhwb3J0IGZ1bmN0aW9uIG1hdGNoT3B0aW9ucyhcbiAgb3B0aW9ucyQ6IE9ic2VydmFibGU8UmVwb3J0RmlsdGVyT3B0aW9uUGFpcltdPixcbiAga2V5d29yZD86IHN0cmluZyxcbik6IE9ic2VydmFibGU8UmVwb3J0RmlsdGVyT3B0aW9uUGFpcltdPiB7XG4gIGNvbnN0IHRlcm0gPSAoa2V5d29yZCA/PyAnJykudHJpbSgpLnRvTG93ZXJDYXNlKCk7XG5cbiAgcmV0dXJuIG9wdGlvbnMkLnBpcGUobWFwKChvcHRpb25zKSA9PiB0ZXJtXG4gICAgPyBvcHRpb25zLmZpbHRlcigob3B0aW9uKSA9PiBvcHRpb24ubmFtZS50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKHRlcm0pKVxuICAgIDogb3B0aW9ucykpO1xufVxuXG4vLyBUaGUgcGFuZWwgcm93IG9mIGEgc2VsZWN0IHdob3NlIGxpc3QgdGhlIHNlcnZlciBjdXQgYXQgNTAwLlxuZXhwb3J0IGNvbnN0IE9QVElPTlNfVFJVTkNBVEVEX05PVEUgPSAnU2hvd2luZyB0aGUgZmlyc3QgNTAwLiBUeXBlIHRvIG5hcnJvdy4nO1xuXG4vLyBUaGUgcGFuZWwgcm93IG9mIGEgc2VsZWN0IHdob3NlIGxpc3QgY291bGQgbm90IGJlIHJlYWQuIFRoZSBuZXh0IGZvY3VzIG9yXG4vLyBrZXlzdHJva2UgYXNrcyBhZ2Fpbi5cbmV4cG9ydCBjb25zdCBPUFRJT05TX0ZBSUxFRF9OT1RFID0gJ0NvdWxkIG5vdCBsb2FkIHRoZSBsaXN0Lic7XG5cbi8vIEJ1aWxkIHRoZSBmcy1maWx0ZXIgY29uZmlnIGl0ZW0gZm9yIGEgZ3JvdXAsIHNlZWRpbmcgaXRzIGRlZmF1bHQgZnJvbSB0aGVcbi8vIGN1cnJlbnQgc2Vzc2lvbiB2YWx1ZSBzbyBhdXRob3JlZC9yZWxhdGl2ZSBkZWZhdWx0cyBzaG93IHNlbGVjdGVkIG9uIG9wZW4uXG4vLyBBIHNlbGVjdCBsaXN0cyB3aGF0IGBvcHRpb25zYCBvZmZlcnMgZm9yIGl0IGluIGByZXBvcnRgLiBgZmVhdHVyZXNgIGlzIHRoZVxuLy8gcmVwb3J0J3Mgdmlld2VyRmVhdHVyZXM6IGEgc2VsZWN0IG9mZmVycyAnRXhjbHVkZSB0aGVzZScgYnkgdGhlIHJ1bGUgb2Zcbi8vIG9mZmVyc0V4Y2x1ZGUgKHRoZSBzZXJ2ZXIgbGlzdHMgZXhjbHVkZVZhbHVlcyBhbmQgbm8gbWVtYmVyIGJpbmRzIHNldmVyYWxcbi8vIGNvbHVtbnMpLCBhbmQgYSBudW1iZXIgcmFuZ2UgaXMgYSBtaW4vbWF4IGNvbnRyb2wgb25seSB3aGVuIGl0IGxpc3RzXG4vLyBudW1iZXJSYW5nZS5cbmV4cG9ydCBmdW5jdGlvbiBmaWx0ZXJJdGVtRm9yR3JvdXAoXG4gIGdyb3VwOiBSZXBvcnRGaWx0ZXJHcm91cCxcbiAgb3B0aW9uczogUmVwb3J0RmlsdGVyT3B0aW9uc1NlcnZpY2UsXG4gIHJlcG9ydDogUmVwb3J0IHwgbnVsbCxcbiAgaW5pdGlhbD86IEZpbHRlckdyb3VwVmFsdWUsXG4gIGZlYXR1cmVzOiByZWFkb25seSBSZXBvcnRWaWV3ZXJGZWF0dXJlW10gPSBbXSxcbik6IElGaWx0ZXJDb25maWdJdGVtIHtcbiAgY29uc3QgbmFtZSA9IGdyb3VwSXRlbU5hbWUoZ3JvdXAsIHJlcG9ydCk7XG4gIGNvbnN0IGxhYmVsID0gZ3JvdXBMYWJlbChncm91cCk7XG5cbiAgc3dpdGNoIChncm91cC50eXBlKSB7XG4gICAgY2FzZSAnZGF0ZVJhbmdlJzpcbiAgICAgIHJldHVybiBkYXRlUmFuZ2VGaWx0ZXJJdGVtKG5hbWUsIGxhYmVsLCBpbml0aWFsKTtcblxuICAgIGNhc2UgJ3NlbGVjdCc6XG4gICAgICByZXR1cm4gc2VsZWN0RmlsdGVySXRlbShncm91cCwgbGFiZWwsIG9wdGlvbnMsIHJlcG9ydCwgaW5pdGlhbCwgb2ZmZXJzRXhjbHVkZShncm91cCwgZmVhdHVyZXMpKTtcblxuICAgIGNhc2UgJ251bWJlclJhbmdlJzpcbiAgICAgIHJldHVybiBmZWF0dXJlcy5pbmNsdWRlcygnbnVtYmVyUmFuZ2UnKVxuICAgICAgICA/IG51bWJlclJhbmdlRmlsdGVySXRlbShncm91cCwgbGFiZWwsIHJlcG9ydCwgaW5pdGlhbClcbiAgICAgICAgOiBrZXl3b3JkRmlsdGVySXRlbShuYW1lLCBsYWJlbCwgaW5pdGlhbCk7XG5cbiAgICBjYXNlICdrZXl3b3JkJzpcbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuIGtleXdvcmRGaWx0ZXJJdGVtKG5hbWUsIGxhYmVsLCBpbml0aWFsKTtcbiAgfVxufVxuXG4vLyBBIGRhdGUgcmFuZ2Ugb3BlbnMgb24gaXRzIGRheXMsIGFuZCBpdHMgY2hpcCBzaG93cyB0aGVtLiBBIHByZXNldCBwaWNrZWQgaW5cbi8vIHRoZSBkYXRlIHBpY2tlciBvbmx5IHNldHMgdGhlIGRheXMuXG5mdW5jdGlvbiBkYXRlUmFuZ2VGaWx0ZXJJdGVtKG5hbWU6IHN0cmluZywgbGFiZWw6IHN0cmluZywgaW5pdGlhbD86IEZpbHRlckdyb3VwVmFsdWUpOiBJRmlsdGVyQ29uZmlnSXRlbSB7XG4gIGNvbnN0IGhhc0RheXMgPSAhIShpbml0aWFsPy5zdGFydCB8fCBpbml0aWFsPy5lbmQpO1xuXG4gIHJldHVybiB7XG4gICAgbmFtZSxcbiAgICB0eXBlOiBJdGVtVHlwZS5EYXRlUmFuZ2UsXG4gICAgbGFiZWw6IHsgZnJvbTogYCR7bGFiZWx9IEZyb21gLCB0bzogYCR7bGFiZWx9IFRvYCB9LFxuICAgIGRlZmF1bHQ6IGhhc0RheXNcbiAgICAgID8geyBmcm9tOiBpbml0aWFsLnN0YXJ0ID8/IHVuZGVmaW5lZCwgdG86IGluaXRpYWwuZW5kID8/IHVuZGVmaW5lZCB9XG4gICAgICA6IHVuZGVmaW5lZCxcbiAgfTtcbn1cblxuLy8gQSBzZWxlY3QncyBwaWNrcywga2VwdCBvciBsZWZ0IG91dC4gV2l0aCBgZXhjbHVkZWAgdGhlIGxpc3QgaGFzIHRoZVxuLy8gJ0V4Y2x1ZGUgdGhlc2UnIHJvdywgYW5kIGEgdmFsdWUgdGhhdCBsZWF2ZXMgb3V0IG9wZW5zIHdpdGggaXQgb24uIEl0cyBsaXN0XG4vLyBpcyByZWFkIG9uIGZvY3VzIGFuZCBvbiBlYWNoIGtleXN0cm9rZTogdGhlIG9wdGlvbnMgc2VydmljZSBmZXRjaGVzIGl0IHdoZW5cbi8vIHRoZSBvdGhlciBmaWx0ZXJzIGNoYW5nZWQgc2luY2UgYW5kIHJlcGxheXMgaXQgb3RoZXJ3aXNlLCBhbmQgdHlwaW5nXG4vLyBmaWx0ZXJzIGl0IGhlcmUuIEEgbGlzdCB0aGUgc2VydmVyIGN1dCwgb3Igb25lIHRoYXQgY291bGQgbm90IGJlIHJlYWQsXG4vLyBzYXlzIHNvIGluIGEgcGFuZWwgcm93LlxuZnVuY3Rpb24gc2VsZWN0RmlsdGVySXRlbShcbiAgZ3JvdXA6IFJlcG9ydEZpbHRlckdyb3VwLFxuICBsYWJlbDogc3RyaW5nLFxuICBvcHRpb25zOiBSZXBvcnRGaWx0ZXJPcHRpb25zU2VydmljZSxcbiAgcmVwb3J0OiBSZXBvcnQgfCBudWxsLFxuICBpbml0aWFsOiBGaWx0ZXJHcm91cFZhbHVlIHwgdW5kZWZpbmVkLFxuICBleGNsdWRlOiBib29sZWFuLFxuKTogSUZpbHRlckNvbmZpZ0l0ZW0ge1xuICBjb25zdCBleGNsdWRpbmcgPSBleGNsdWRlICYmICFpbml0aWFsPy52YWx1ZXM/Lmxlbmd0aCAmJiAhIWluaXRpYWw/LmV4Y2x1ZGVWYWx1ZXM/Lmxlbmd0aDtcbiAgY29uc3QgcGlja3MgPSBleGNsdWRpbmcgPyBpbml0aWFsLmV4Y2x1ZGVWYWx1ZXMgOiBpbml0aWFsPy52YWx1ZXM7XG4gIGNvbnN0IG9wdGlvbnMkID0gb3B0aW9ucy5vcHRpb25zKGdyb3VwLCByZXBvcnQpO1xuXG4gIHJldHVybiB7XG4gICAgbmFtZTogZ3JvdXBJdGVtTmFtZShncm91cCwgcmVwb3J0KSxcbiAgICB0eXBlOiBJdGVtVHlwZS5BdXRvQ29tcGxldGVDaGlwcyxcbiAgICBsYWJlbCxcbiAgICBmZXRjaE9uRm9jdXM6IHRydWUsXG4gICAgZXhjbHVkZTogZXhjbHVkZSA/IHt9IDogdW5kZWZpbmVkLFxuICAgIHZhbHVlczogKGtleXdvcmQ/OiBzdHJpbmcpID0+IG1hdGNoT3B0aW9ucyhvcHRpb25zJCwga2V5d29yZCksXG4gICAgcGFuZWxOb3RlOiAoKSA9PiBvcHRpb25zTm90ZShvcHRpb25zLCBncm91cC5pZCksXG4gICAgLy8gU3RvcmVkIHZhbHVlcyBhcmUgaWRzLCBzbyBhIGNoaXAgaXMgbmFtZWQgYnkgYSBuYW1lIGFscmVhZHkgbGVhcm5lZCBvclxuICAgIC8vIG9uY2UgdGhlIG9wdGlvbiBsaXN0IGhhcyBsb2FkZWQg4oCUIGhlbmNlIHRoZSBvYnNlcnZhYmxlIGZvcm0gb2YgYGRlZmF1bHRgLlxuICAgIGRlZmF1bHQ6IHBpY2tzPy5sZW5ndGhcbiAgICAgID8gKCkgPT4gcmVzb2x2ZU9wdGlvblZhbHVlcyhvcHRpb25zJCwgcGlja3MsICh2YWx1ZSkgPT4gb3B0aW9ucy5sYWJlbChncm91cC5pZCwgdmFsdWUpKVxuICAgICAgICAucGlwZShtYXAoKHNlbGVjdGVkKSA9PiAoZXhjbHVkaW5nID8geyBleGNsdWRlOiB0cnVlLCBzZWxlY3RlZCB9IDogc2VsZWN0ZWQpKSlcbiAgICAgIDogdW5kZWZpbmVkLFxuICB9O1xufVxuXG4vLyBUaGUgcGFuZWwgcm93IG9mIGEgc2VsZWN0J3MgbGF0ZXN0IGxpc3Q6IGEgZmFpbHVyZSBmaXJzdCwgdGhlbiBhIGN1dCBsaXN0LlxuZnVuY3Rpb24gb3B0aW9uc05vdGUob3B0aW9uczogUmVwb3J0RmlsdGVyT3B0aW9uc1NlcnZpY2UsIGdyb3VwSWQ6IG51bWJlcik6IHN0cmluZyB8IG51bGwge1xuICBpZiAob3B0aW9ucy5mYWlsZWQoZ3JvdXBJZCkpIHtcbiAgICByZXR1cm4gT1BUSU9OU19GQUlMRURfTk9URTtcbiAgfVxuXG4gIHJldHVybiBvcHRpb25zLnRydW5jYXRlZChncm91cElkKSA/IE9QVElPTlNfVFJVTkNBVEVEX05PVEUgOiBudWxsO1xufVxuXG4vLyBBIG51bWJlciByYW5nZSdzIGxvdyBhbmQgaGlnaCBlbmRzLCBlaXRoZXIgb25lIG9wZW4uIDAgaXMgYW4gZW5kIGxpa2UgYW55XG4vLyBvdGhlci4gSXRzIGNoaXAgcmVhZHMgYXMgdGhlIGV4cG9ydCBsaW5lcyBkbyAoJ0Ftb3VudDogMCBvciBtb3JlJyxcbi8vICdBbW91bnQ6IDAgdG8gMTAnKTogdGhlIGVuZHMgYXJlIHJlYWQgb2ZmIHRoZSBpdGVtJ3MgcXVlcnkgdGhlIHdheSB0aGVcbi8vIGJhcidzIGNoYW5nZSByZWFkcyB0aGVtLCBhbmQgd29yZGVkIGluIHRoZSByZXBvcnQncyBsb2NhbGUuXG5mdW5jdGlvbiBudW1iZXJSYW5nZUZpbHRlckl0ZW0oXG4gIGdyb3VwOiBSZXBvcnRGaWx0ZXJHcm91cCxcbiAgbGFiZWw6IHN0cmluZyxcbiAgcmVwb3J0OiBSZXBvcnQgfCBudWxsLFxuICBpbml0aWFsPzogRmlsdGVyR3JvdXBWYWx1ZSxcbik6IElGaWx0ZXJDb25maWdJdGVtIHtcbiAgY29uc3QgbmFtZSA9IGdyb3VwSXRlbU5hbWUoZ3JvdXAsIHJlcG9ydCk7XG4gIGNvbnN0IG1pbiA9IGluaXRpYWw/Lm1pbiA/PyB1bmRlZmluZWQ7XG4gIGNvbnN0IG1heCA9IGluaXRpYWw/Lm1heCA/PyB1bmRlZmluZWQ7XG4gIGNvbnN0IGxvY2FsZSA9IHJlc29sdmVGb3JtYXRDb250ZXh0KHJlcG9ydCA/PyB7fSkubG9jYWxlO1xuXG4gIHJldHVybiB7XG4gICAgbmFtZSxcbiAgICB0eXBlOiBJdGVtVHlwZS5SYW5nZSxcbiAgICBsYWJlbCxcbiAgICBkZWZhdWx0OiBtaW4gIT09IHVuZGVmaW5lZCB8fCBtYXggIT09IHVuZGVmaW5lZCA/IHsgbWluLCBtYXggfSA6IHVuZGVmaW5lZCxcbiAgICBjaGlwVGV4dDogKGl0ZW0pID0+IGZpbHRlckxpbmVUZXh0KFxuICAgICAgeyBsYWJlbCwgbGV2ZWw6IGdyb3VwLmxldmVsIH0sXG4gICAgICBudW1iZXJSYW5nZUZyb21RdWVyeShpdGVtLnF1ZXJ5LCBuYW1lKSxcbiAgICAgIHsgbG9jYWxlIH0sXG4gICAgICAnY2hpcCcsXG4gICAgKSxcbiAgfTtcbn1cblxuZnVuY3Rpb24ga2V5d29yZEZpbHRlckl0ZW0obmFtZTogc3RyaW5nLCBsYWJlbDogc3RyaW5nLCBpbml0aWFsPzogRmlsdGVyR3JvdXBWYWx1ZSk6IElGaWx0ZXJDb25maWdJdGVtIHtcbiAgcmV0dXJuIHtcbiAgICBuYW1lLFxuICAgIHR5cGU6IEl0ZW1UeXBlLktleXdvcmQsXG4gICAgbGFiZWwsXG4gICAgZGVmYXVsdDogaW5pdGlhbD8udmFsdWUsXG4gIH07XG59XG5cbi8vIFRoZSBncm91cHMgYSBtYXRjaCBvZiAnYW55JyBjb21iaW5lczogcmVwb3J0IGJhciBncm91cHMgKGEgcGFnZSBncm91cCBvblxuLy8gaXRzIG93biBwYWdlIG9ubHkpIHRoYXQgYSB2aWV3ZXIgcGlja3MgdmFsdWVzLCB0ZXh0IG9yIGEgbnVtYmVyIHJhbmdlIGluLlxuLy8gRGF0ZXMsIHRpbGUtb25seSBncm91cHMgYW5kIHRoZSBjcm9zcy1maWx0ZXIgYWx3YXlzIG5hcnJvdyBvbiB0aGVpciBvd24uXG4vLyBUaGUgc2VydmVyIGhvbGRzIHRoZSBzYW1lIHJ1bGUgYW5kIGNoZWNrcyBldmVyeSBpZCBpdCBpcyBzZW50LlxuY29uc3QgTUFUQ0hfQU5ZX0xFVkVMUzogcmVhZG9ubHkgUmVwb3J0RmlsdGVyTGV2ZWxbXSA9IFsncmVwb3J0JywgJ2JvdGgnLCAncGFnZSddO1xuY29uc3QgTUFUQ0hfQU5ZX1RZUEVTOiByZWFkb25seSBSZXBvcnRGaWx0ZXJUeXBlW10gPSBbJ3NlbGVjdCcsICdrZXl3b3JkJywgJ251bWJlclJhbmdlJ107XG5cbi8vIFdoZXRoZXIgYSBncm91cCBqb2lucyBhIG1hdGNoIG9mICdhbnknIG9uIHBhZ2UgYHBhZ2VJZGAuXG5leHBvcnQgZnVuY3Rpb24gaXNNYXRjaEFueUdyb3VwKGdyb3VwOiBSZXBvcnRGaWx0ZXJHcm91cCwgcGFnZUlkOiBudW1iZXIgfCBudWxsKTogYm9vbGVhbiB7XG4gIHJldHVybiBNQVRDSF9BTllfTEVWRUxTLmluY2x1ZGVzKGdyb3VwLmxldmVsKVxuICAgICYmIE1BVENIX0FOWV9UWVBFUy5pbmNsdWRlcyhncm91cC50eXBlKVxuICAgICYmIChncm91cC5sZXZlbCAhPT0gJ3BhZ2UnIHx8ICghIXBhZ2VJZCAmJiBncm91cC5wYWdlSWQgPT09IHBhZ2VJZCkpO1xufVxuXG4vLyBUaGUgcmVwb3J0IGJhcidzIGdyb3VwcyBpbiB0aGVpciBzYXZlZCBvcmRlcjogdGhlIHJlcG9ydCBhbmQgYm90aCBncm91cHMsXG4vLyBhbmQgdGhlIHBhZ2UgZ3JvdXBzIG9mIHRoZSBwYWdlIG9uIHNjcmVlbiAoYHBhZ2VJZGApLlxuZXhwb3J0IGZ1bmN0aW9uIHJlcG9ydEJhckdyb3VwcyhyZXBvcnQ6IFJlcG9ydCB8IG51bGwsIHBhZ2VJZDogbnVtYmVyIHwgbnVsbCk6IFJlcG9ydEZpbHRlckdyb3VwW10ge1xuICByZXR1cm4gKHJlcG9ydD8uZmlsdGVyR3JvdXBzID8/IFtdKVxuICAgIC5maWx0ZXIoKGdyb3VwKSA9PiBncm91cC5sZXZlbCA9PT0gJ3JlcG9ydCcgfHwgZ3JvdXAubGV2ZWwgPT09ICdib3RoJ1xuICAgICAgfHwgKGdyb3VwLmxldmVsID09PSAncGFnZScgJiYgISFwYWdlSWQgJiYgZ3JvdXAucGFnZUlkID09PSBwYWdlSWQpKVxuICAgIC5zb3J0KChhLCBiKSA9PiBhLm9yZGVyIC0gYi5vcmRlcik7XG59XG5cbi8vIFdoZXRoZXIgdGhlIHJlcG9ydCBoYXMgYSBncm91cCBzaG93biBvbiBvbmUgcGFnZSBvbmx5LCBzbyBpdHMgcmVwb3J0IGJhclxuLy8gY2hhbmdlcyB3aXRoIHRoZSBwYWdlIG9uIHNjcmVlbi5cbmV4cG9ydCBmdW5jdGlvbiBoYXNQYWdlR3JvdXAocmVwb3J0OiBSZXBvcnQgfCBudWxsKTogYm9vbGVhbiB7XG4gIHJldHVybiAocmVwb3J0Py5maWx0ZXJHcm91cHMgPz8gW10pLnNvbWUoKGdyb3VwKSA9PiBncm91cC5sZXZlbCA9PT0gJ3BhZ2UnKTtcbn1cblxuLy8gVGhlIHF1ZXJ5IGtleSBvZiB0aGUgcmVwb3J0IGJhcidzIE1hdGNoIGNvbnRyb2wuIE5vdCBhIGZpbHRlciBncm91cDogaXRcbi8vIHNheXMgaG93IHRoZSBncm91cHMgY29tYmluZSwgc28gaXQgaXMgcmVhZCBzdHJhaWdodCBvZmYgdGhlIGNoYW5nZSBxdWVyeS5cbi8vIEl0IGlzIGFsc28gdGhlIHJlcG9ydCBVUkwncyBrZXkgZm9yIHRoZSBtYXRjaCAobWF0Y2g9YW55KS5cbmV4cG9ydCBjb25zdCBNQVRDSF9JVEVNID0gJ21hdGNoJztcblxuY29uc3QgTUFUQ0hfT1BUSU9OUzogeyBuYW1lOiBzdHJpbmc7IHZhbHVlOiBSZXBvcnRGaWx0ZXJNYXRjaCB9W10gPSBbXG4gIHsgbmFtZTogJ0FsbCBmaWx0ZXJzJywgdmFsdWU6ICdhbGwnIH0sXG4gIHsgbmFtZTogJ0FueSBmaWx0ZXInLCB2YWx1ZTogJ2FueScgfSxcbl07XG5cbi8vIFRoZSByZXBvcnQgYmFyJ3MgTWF0Y2ggY29udHJvbCwgbGFzdCBpbiB0aGUgYmFyLCBvciBudWxsIHdoZW4gaXQgd291bGQgZG9cbi8vIG5vdGhpbmc6IHRoZSBzZXJ2ZXIgbXVzdCBzZXJ2ZSBtYXRjaEFueSwgYW5kIHRoZSBiYXIgbXVzdCBob2xkIHR3byBvciBtb3JlXG4vLyBncm91cHMgdGhhdCBjb21iaW5lIChhbiAnYW55JyBvdmVyIG9uZSBncm91cCBpcyB0aGF0IGdyb3VwKS5cbmV4cG9ydCBmdW5jdGlvbiBtYXRjaEZpbHRlckl0ZW0oXG4gIHJlcG9ydDogUmVwb3J0IHwgbnVsbCxcbiAgZ3JvdXBzOiBSZXBvcnRGaWx0ZXJHcm91cFtdLFxuICBwYWdlSWQ6IG51bWJlciB8IG51bGwsXG4gIG1hdGNoOiBSZXBvcnRGaWx0ZXJNYXRjaCxcbik6IElGaWx0ZXJDb25maWdJdGVtIHwgbnVsbCB7XG4gIGNvbnN0IGVsaWdpYmxlID0gZ3JvdXBzLmZpbHRlcigoZ3JvdXApID0+IGlzTWF0Y2hBbnlHcm91cChncm91cCwgcGFnZUlkKSk7XG5cbiAgaWYgKCFyZXBvcnQ/LnZpZXdlckZlYXR1cmVzPy5pbmNsdWRlcygnbWF0Y2hBbnknKSB8fCBlbGlnaWJsZS5sZW5ndGggPCAyKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICByZXR1cm4ge1xuICAgIG5hbWU6IE1BVENIX0lURU0sXG4gICAgdHlwZTogSXRlbVR5cGUuU2VsZWN0LFxuICAgIGxhYmVsOiAnTWF0Y2gnLFxuICAgIG11bHRpcGxlOiBmYWxzZSxcbiAgICB2YWx1ZXM6ICgpID0+IE1BVENIX09QVElPTlMsXG4gICAgZGVmYXVsdDogbWF0Y2gsXG4gICAgLy8gJ01hdGNoOiBhbnkgZmlsdGVyJyBvciAnTWF0Y2g6IGFsbCBmaWx0ZXJzJywgaW4gdGhlIGV4cG9ydCBsaW5lcycgd29yZHMuXG4gICAgY2hpcFRleHQ6IChpdGVtKSA9PiBtYXRjaExpbmVUZXh0KG1hdGNoRnJvbVF1ZXJ5KGl0ZW0ucXVlcnkpLCAnY2hpcCcpLFxuICB9O1xufVxuXG4vLyBUaGUgbWF0Y2ggYSBjaGFuZ2UgcXVlcnkgb2YgYSBiYXIgd2l0aCB0aGUgTWF0Y2ggY29udHJvbCBhc2tzIGZvci5cbmV4cG9ydCBmdW5jdGlvbiBtYXRjaEZyb21RdWVyeShxdWVyeTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4pOiBSZXBvcnRGaWx0ZXJNYXRjaCB7XG4gIHJldHVybiBxdWVyeT8uW01BVENIX0lURU1dID09PSAnYW55JyA/ICdhbnknIDogJ2FsbCc7XG59XG5cbi8vIFRoZSBxdWVyeSBrZXkgb2YgYSBsaXN0J3Mgc2VhcmNoIGJveCBpbiBpdHMgY29tcG9uZW50IGhlYWRlci4gRml4ZWQgcmF0aGVyXG4vLyB0aGFuIGRlcml2ZWQgZnJvbSBhbiBpZCBiZWNhdXNlIGEgaGVhZGVyIGhvbGRzIGF0IG1vc3Qgb25lLCBhbmQgaXQgaXMgTk9UIGFcbi8vIGZpbHRlciBncm91cDogaXRzIHRleHQgbmFycm93cyB0aGF0IGxpc3QgYWxvbmUsIHNvIGl0IGlzIHJlYWQgc3RyYWlnaHQgb2ZmXG4vLyB0aGUgY2hhbmdlIHF1ZXJ5IGFuZCB0cmF2ZWxzIGFzIHRoZSBsaXN0J3Mgb3duIGBzdGF0ZS5zZWFyY2hgLlxuZXhwb3J0IGNvbnN0IExJU1RfU0VBUkNIX0lURU0gPSAnbGlzdFNlYXJjaCc7XG5cbi8vIFRoZSBsb25nZXN0IHNlYXJjaCB0aGUgc2VydmVyIGFwcGxpZXMgKFJlcG9ydFF1ZXJ5UnVubmVyOjpNQVhfU0VBUkNIX0xFTkdUSCkuXG4vLyBUaGUgdmlld2VyIGN1dHMgdGhlIHRleHQgdG8gaXQgdG9vLCBzbyB0aGUgVVJMLCB0aGUgcmVxdWVzdCBhbmQgdGhlIGV4cG9ydFxuLy8gdGl0bGUgYWxsIGNhcnJ5IHRoZSB0ZXh0IHRoYXQgd2FzIGFjdHVhbGx5IHNlYXJjaGVkLlxuZXhwb3J0IGNvbnN0IExJU1RfU0VBUkNIX01BWF9MRU5HVEggPSAxMDA7XG5cbi8vIFRoZSBmcy1maWx0ZXIgY29uZmlnIGl0ZW0gZm9yIGEgbGlzdCdzIHNlYXJjaCBib3gsIHNlZWRlZCB3aXRoIHRoZSB0ZXh0IHRoZVxuLy8gdmlld2VyIGxhc3Qgc2VhcmNoZWQuIGZzLWZpbHRlciBzaG93cyBvbmUgc2VhcmNoIGJveCBwZXIgYmFyIChpdHMgbGFzdFxuLy8ga2V5d29yZCBpdGVtKSwgc28gdGhlIGNhbGxlciBhZGRzIHRoaXMgb25seSB0byBhIGhlYWRlciB3aXRoIG5vIGtleXdvcmRcbi8vIGdyb3VwIG9mIGl0cyBvd24uXG5leHBvcnQgZnVuY3Rpb24gbGlzdFNlYXJjaEl0ZW0odmFsdWU6IHN0cmluZyB8IG51bGwpOiBJRmlsdGVyQ29uZmlnSXRlbSB7XG4gIHJldHVybiB7XG4gICAgdHlwZTogSXRlbVR5cGUuS2V5d29yZCxcbiAgICBuYW1lOiBMSVNUX1NFQVJDSF9JVEVNLFxuICAgIGxhYmVsOiAnU2VhcmNoJyxcbiAgICBkZWZhdWx0OiB2YWx1ZSA/PyB1bmRlZmluZWQsXG4gIH07XG59XG5cbi8vIFdoZXRoZXIgdGhlIHJlcG9ydCBoYXMgYSBjaGFydCB0aGUgZ3JvdXAtYnkgY29udHJvbCBjYW4gcmUtYnVja2V0LiBBIHRpbWVcbi8vIHgtYXhpcyBpcyB0aGUgd2hvbGUgcXVhbGlmaWNhdGlvbjogdGhlIGNvbnRyb2wgY2hhbmdlcyB0aGUgZ3JhaW4gb2YgdGhhdFxuLy8gYXhpcywgYW5kIGEgY2F0ZWdvcnkgYXhpcyBoYXMgbm8gZ3JhaW4gdG8gY2hhbmdlLlxuZXhwb3J0IGZ1bmN0aW9uIGhhc1RpbWVTZXJpZXNDaGFydChyZXBvcnQ6IFJlcG9ydCB8IG51bGwpOiBib29sZWFuIHtcbiAgcmV0dXJuIChyZXBvcnQ/LnBhZ2VzID8/IFtdKS5zb21lKChwYWdlKSA9PiAocGFnZS5jb21wb25lbnRzID8/IFtdKS5zb21lKChjb21wb25lbnQpID0+XG4gICAgY29tcG9uZW50LnR5cGUgPT09ICdjaGFydCcgJiYgY29tcG9uZW50LmNvbmZpZz8ueEF4aXM/LmtpbmQgPT09ICd0aW1lJykpO1xufVxuXG4vLyBUaGUgZ3JhaW5zIHRoZSByZXBvcnQncyBncm91cC1ieSBjb250cm9sIG9mZmVycywgbmFtZWQgZm9yIHRoZSB2aWV3ZXIuIFdISUNIXG4vLyBvZiB0aGVtIGNvbWVzIGZyb20gdGhlIHJlcG9ydDsgaG93IHRoZXkgcmVhZCBjb21lcyBmcm9tIEdSQU5VTEFSSVRZX09QVElPTlMuXG4vLyBBbiBlbXB0eSBzdG9yZWQgbGlzdCBtZWFucyBldmVyeSBncmFpbiDigJQgdGhlIHNhbWUgcnVsZSB0aGUgYmFja2VuZCBhcHBsaWVzLlxuZnVuY3Rpb24gZ3JvdXBCeU9wdGlvbnMocmVwb3J0OiBSZXBvcnQpOiB7IHZhbHVlOiBDaGFydEdyYW51bGFyaXR5OyBuYW1lOiBzdHJpbmcgfVtdIHtcbiAgY29uc3QgZ3JhbnVsYXJpdGllcyA9IHJlcG9ydC5jb25maWc/Lmdyb3VwQnk/LmdyYW51bGFyaXRpZXMgPz8gW107XG5cbiAgcmV0dXJuIGdyYW51bGFyaXRpZXMubGVuZ3RoXG4gICAgPyBHUkFOVUxBUklUWV9PUFRJT05TLmZpbHRlcigob3B0aW9uKSA9PiBncmFudWxhcml0aWVzLmluY2x1ZGVzKG9wdGlvbi52YWx1ZSkpXG4gICAgOiBHUkFOVUxBUklUWV9PUFRJT05TO1xufVxuXG4vLyBXaGV0aGVyIGEgZ3JhaW4gaXMgb25lIHRoZSByZXBvcnQncyBjb250cm9sIHN0aWxsIG9mZmVycy4gQSBncmFpbiBpdCBkb2Vzbid0XG4vLyBjYW5ub3Qgc3RheSBpbiBlZmZlY3Q6IHRoZSBhZ2VudCBjYW4gbmFycm93IHRoZSBsaXN0IGF0IGFueSB0aW1lLCBhbmQgYSBjaGFydFxuLy8gbGVmdCBidWNrZXRpbmcgYXQgYSBkcm9wcGVkIGdyYWluIGlzIG9uZSB0aGUgdmlld2VyIGNhbiBuZWl0aGVyIHNlZSBub3IgY2hhbmdlLlxuZXhwb3J0IGZ1bmN0aW9uIGlzR3JhbnVsYXJpdHlPZmZlcmVkKHJlcG9ydDogUmVwb3J0LCBncmFudWxhcml0eTogQ2hhcnRHcmFudWxhcml0eSB8IG51bGwpOiBib29sZWFuIHtcbiAgcmV0dXJuICFncmFudWxhcml0eSB8fCBncm91cEJ5T3B0aW9ucyhyZXBvcnQpLnNvbWUoKG9wdGlvbikgPT4gb3B0aW9uLnZhbHVlID09PSBncmFudWxhcml0eSk7XG59XG5cbi8vIFRoZSBmcy1maWx0ZXIgY29uZmlnIGl0ZW0gZm9yIHRoZSByZXBvcnQncyBncm91cC1ieSBjb250cm9sLCBvciBudWxsIHdoZW4gdGhlXG4vLyByZXBvcnQgaGFzIG5vbmUgdG8gc2hvdy5cbi8vXG4vLyBJdCBsZWFkcyB0aGUgc2FtZSBiYXIgdGhlIGZpbHRlcnMgcmVuZGVyIGluLCBidXQgaXQgaXMgTk9UIG9uZTogYSBmaWx0ZXJcbi8vIG5hcnJvd3MgV0hJQ0ggcm93cyBhcmUgY291bnRlZCwgdGhpcyBjaGFuZ2VzIGhvdyB0aGUgc3Vydml2aW5nIHJvd3MgYXJlXG4vLyBCVUNLRVRFRCDigJQgYW5kIGl0IGNvbWVzIGZpcnN0IGJlY2F1c2UgdGhlIGdyYWluIGlzIHdoYXQgYSB2aWV3ZXIgc2V0dGxlc1xuLy8gYmVmb3JlIGRlY2lkaW5nIHdoaWNoIHJvd3MgdGhleSB3YW50LlxuLy8gUGlja2luZyBhIGdyYWluIHNldHMgYSBzZXNzaW9uLXdpZGUgb3ZlcnJpZGUgdGhhdCByaWRlcyBhbG9uZyBpbiBlYWNoIGNoYXJ0J3Ncbi8vIGRhdGEgcmVxdWVzdCwgc28gdGhlIGNoYXJ0cyB0aGVtc2VsdmVzIGFyZSBuZXZlciByZXdyaXR0ZW4uXG5leHBvcnQgZnVuY3Rpb24gZ3JvdXBCeUZpbHRlckl0ZW0oXG4gIHJlcG9ydDogUmVwb3J0LFxuICBpbml0aWFsPzogQ2hhcnRHcmFudWxhcml0eSB8IG51bGwsXG4pOiBJRmlsdGVyQ29uZmlnSXRlbSB8IG51bGwge1xuICBjb25zdCBncm91cEJ5ID0gcmVwb3J0LmNvbmZpZz8uZ3JvdXBCeTtcblxuICAvLyBPbmx5IGFuIEVYUExJQ0lUIGZhbHNlIGhpZGVzIHRoZSBjb250cm9sLiBBbiBhYnNlbnQgYmxvY2sgbWVhbnMgYSByZXBvcnRcbiAgLy8gc2VydmVkIGJ5IGEgYnVpbGQgdGhhdCBwcmVkYXRlcyB0aGUgY29udHJvbCBiZWluZyBzdG9yZWQsIGFuZCBldmVyeSBvbmUgb2ZcbiAgLy8gdGhvc2UgaGFkIG9uZSDigJQgdGhlIGJhY2tlbmQgcmVzb2x2ZXMgaXQgdGhlIHNhbWUgd2F5IChSZXBvcnRHcm91cEJ5KS5cbiAgaWYgKGdyb3VwQnk/LmVuYWJsZWQgPT09IGZhbHNlIHx8ICFoYXNUaW1lU2VyaWVzQ2hhcnQocmVwb3J0KSkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgY29uc3QgdmFsdWVzID0gZ3JvdXBCeU9wdGlvbnMocmVwb3J0KTtcblxuICByZXR1cm4ge1xuICAgIG5hbWU6IEdST1VQX0JZX0lURU0sXG4gICAgdHlwZTogSXRlbVR5cGUuU2VsZWN0LFxuICAgIGxhYmVsOiBncm91cEJ5Py5sYWJlbCB8fCAnR3JvdXAgQnknLFxuICAgIG11bHRpcGxlOiBmYWxzZSxcbiAgICB2YWx1ZXM6ICgpID0+IHZhbHVlcyxcbiAgICBkZWZhdWx0OiBpc0dyYW51bGFyaXR5T2ZmZXJlZChyZXBvcnQsIGluaXRpYWwgPz8gbnVsbCkgPyAoaW5pdGlhbCA/PyB1bmRlZmluZWQpIDogdW5kZWZpbmVkLFxuICB9O1xufVxuXG4vLyBUaGUgZ3JvdXAtYnkgY29udHJvbCdzIGNvbnRyaWJ1dGlvbiB0byB0aGUgdG9vbGJhcidzIGZzLWZpbHRlciBrZXkuIGZzLWZpbHRlclxuLy8gcmVhZHMgaXRzIGNvbmZpZyBvbmNlIGF0IGluaXQsIGFuZCB0aGUgYWdlbnQgY2FuIGNoYW5nZSB0aGUgY29udHJvbCdzIGxhYmVsXG4vLyBvciB0aGUgZ3JhaW5zIGl0IG9mZmVycyDigJQgd2l0aG91dCB0aG9zZSBpbiB0aGUga2V5IHRoZSBiYXIga2VlcHMgcmVuZGVyaW5nXG4vLyB0aGUgY29udHJvbCBpdCB3YXMgY3JlYXRlZCB3aXRoIHVudGlsIGEgZnVsbCBwYWdlIHJlbG9hZC5cbmV4cG9ydCBmdW5jdGlvbiBncm91cEJ5U2lnbmF0dXJlKHJlcG9ydDogUmVwb3J0IHwgbnVsbCk6IHN0cmluZyB7XG4gIGlmICghcmVwb3J0IHx8ICFncm91cEJ5RmlsdGVySXRlbShyZXBvcnQpKSB7XG4gICAgcmV0dXJuICcnO1xuICB9XG5cbiAgY29uc3QgZ3JvdXBCeSA9IHJlcG9ydC5jb25maWc/Lmdyb3VwQnk7XG5cbiAgcmV0dXJuIFsnZ3JvdXBCeScsIGdyb3VwQnk/LmxhYmVsID8/ICcnLCAoZ3JvdXBCeT8uZ3JhbnVsYXJpdGllcyA/PyBbXSkuam9pbignLCcpXS5qb2luKCc6Jyk7XG59XG5cbi8vIFJlYWQgYW4gZnMtZmlsdGVyIGNoYW5nZSBxdWVyeSBpbnRvIHBlci1ncm91cCB2YWx1ZXMuIFJldHVybnMgb25lIGVudHJ5IHBlclxuLy8gZ3JvdXAgd2l0aCB0aGUgdmFsdWUgdG8gc3RvcmUgKG9yIG51bGwgdG8gY2xlYXIpIOKAlCBjYWxsZXJzIGZlZWQgdGhlc2UgdG9cbi8vIFJlcG9ydEZpbHRlclN0YXRlU2VydmljZS5zZXRWYWx1ZS4gYHJlcG9ydGAgbmFtZXMgdGhlIGdyb3VwcycgaXRlbXMuXG5leHBvcnQgZnVuY3Rpb24gZ3JvdXBWYWx1ZXNGcm9tUXVlcnkoXG4gIHF1ZXJ5OiBSZWNvcmQ8c3RyaW5nLCBhbnk+LFxuICBncm91cHM6IFJlcG9ydEZpbHRlckdyb3VwW10sXG4gIHJlcG9ydDogUmVwb3J0IHwgbnVsbCxcbik6IHsgZ3JvdXBJZDogbnVtYmVyOyB2YWx1ZTogRmlsdGVyR3JvdXBWYWx1ZSB8IG51bGwgfVtdIHtcbiAgcmV0dXJuIGdyb3Vwcy5tYXAoKGdyb3VwKSA9PiB7XG4gICAgY29uc3QgbmFtZSA9IGdyb3VwSXRlbU5hbWUoZ3JvdXAsIHJlcG9ydCk7XG5cbiAgICBzd2l0Y2ggKGdyb3VwLnR5cGUpIHtcbiAgICAgIGNhc2UgJ2RhdGVSYW5nZSc6XG4gICAgICAgIHJldHVybiB7IGdyb3VwSWQ6IGdyb3VwLmlkLCB2YWx1ZTogZGF0ZVJhbmdlRnJvbVF1ZXJ5KHF1ZXJ5LCBuYW1lKSB9O1xuXG4gICAgICBjYXNlICdzZWxlY3QnOlxuICAgICAgICByZXR1cm4geyBncm91cElkOiBncm91cC5pZCwgdmFsdWU6IHNlbGVjdEZyb21RdWVyeShxdWVyeSwgbmFtZSkgfTtcblxuICAgICAgY2FzZSAnbnVtYmVyUmFuZ2UnOlxuICAgICAgICByZXR1cm4geyBncm91cElkOiBncm91cC5pZCwgdmFsdWU6IG51bWJlclJhbmdlRnJvbVF1ZXJ5KHF1ZXJ5LCBuYW1lKSB9O1xuXG4gICAgICBkZWZhdWx0OiB7XG4gICAgICAgIGNvbnN0IGtleXdvcmQgPSBTdHJpbmcocXVlcnlbbmFtZV0gPz8gJycpLnRyaW0oKTtcblxuICAgICAgICByZXR1cm4geyBncm91cElkOiBncm91cC5pZCwgdmFsdWU6IGtleXdvcmQgPyB7IHZhbHVlOiBrZXl3b3JkIH0gOiBudWxsIH07XG4gICAgICB9XG4gICAgfVxuICB9KTtcbn1cblxuLy8gQSBkYXRlIHJhbmdlJ3MgZGF5cyAoPGtleT5Gcm9tLCA8a2V5PlRvKS5cbmZ1bmN0aW9uIGRhdGVSYW5nZUZyb21RdWVyeShxdWVyeTogUmVjb3JkPHN0cmluZywgYW55PiwgbmFtZTogc3RyaW5nKTogRmlsdGVyR3JvdXBWYWx1ZSB8IG51bGwge1xuICBjb25zdCBzdGFydCA9IHF1ZXJ5W2l0ZW1SYW5nZU5hbWUobmFtZSwgJ2Zyb20nKV07XG4gIGNvbnN0IGVuZCA9IHF1ZXJ5W2l0ZW1SYW5nZU5hbWUobmFtZSwgJ3RvJyldO1xuXG4gIGlmICghc3RhcnQgJiYgIWVuZCkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgcmV0dXJuIHsgc3RhcnQ6IHN0YXJ0IHx8IG51bGwsIGVuZDogZW5kIHx8IG51bGwgfTtcbn1cblxuLy8gQSBzZWxlY3QncyBwaWNrczoga2VwdCAoPGtleT4pLCBvciBsZWZ0IG91dCB3aGlsZSBpdHMgZXhjbHVkZSByb3cgaXMgb25cbi8vIChleGNsdWRlPEtleT4pLlxuZnVuY3Rpb24gc2VsZWN0RnJvbVF1ZXJ5KHF1ZXJ5OiBSZWNvcmQ8c3RyaW5nLCBhbnk+LCBuYW1lOiBzdHJpbmcpOiBGaWx0ZXJHcm91cFZhbHVlIHwgbnVsbCB7XG4gIGNvbnN0IGV4Y2x1ZGVWYWx1ZXMgPSBzZWxlY3RRdWVyeVZhbHVlcyhxdWVyeVtnZXRFeGNsdWRlTmFtZShuYW1lKV0pO1xuICBpZiAoZXhjbHVkZVZhbHVlcy5sZW5ndGgpIHtcbiAgICByZXR1cm4geyBleGNsdWRlVmFsdWVzIH07XG4gIH1cblxuICBjb25zdCB2YWx1ZXMgPSBzZWxlY3RRdWVyeVZhbHVlcyhxdWVyeVtuYW1lXSk7XG5cbiAgcmV0dXJuIHZhbHVlcy5sZW5ndGggPyB7IHZhbHVlcyB9IDogbnVsbDtcbn1cblxuLy8gQSBudW1iZXIgcmFuZ2UncyBlbmRzICg8a2V5Pk1pbiwgPGtleT5NYXgpLiBBbiBlbmQgbGVmdCBlbXB0eSBpcyBvcGVuLlxuZnVuY3Rpb24gbnVtYmVyUmFuZ2VGcm9tUXVlcnkocXVlcnk6IFJlY29yZDxzdHJpbmcsIGFueT4sIG5hbWU6IHN0cmluZyk6IEZpbHRlckdyb3VwVmFsdWUgfCBudWxsIHtcbiAgY29uc3QgbWluID0gcmFuZ2VCb3VuZChxdWVyeVtpdGVtUmFuZ2VOYW1lKG5hbWUsICdtaW4nKV0pO1xuICBjb25zdCBtYXggPSByYW5nZUJvdW5kKHF1ZXJ5W2l0ZW1SYW5nZU5hbWUobmFtZSwgJ21heCcpXSk7XG5cbiAgaWYgKG1pbiA9PT0gbnVsbCAmJiBtYXggPT09IG51bGwpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgLi4uKG1pbiAhPT0gbnVsbCA/IHsgbWluIH0gOiB7fSksXG4gICAgLi4uKG1heCAhPT0gbnVsbCA/IHsgbWF4IH0gOiB7fSksXG4gIH07XG59XG5cbi8vIE9uZSBlbmQgb2YgYSBudW1iZXIgcmFuZ2UgYXMgZnMtZmlsdGVyJ3MgUmFuZ2Ugc2VuZHMgaXQ6IHRoZSB0ZXh0IHR5cGVkIGluXG4vLyBpdHMgaW5wdXQuIE51bWJlcigpIHJlYWRzIGFueSBub24tZW1wdHkgdGV4dCwgc28gJzAnIGlzIHRoZSBlbmQgMDsgZW1wdHkgb3Jcbi8vIHVucmVhZGFibGUgdGV4dCBpcyBhbiBvcGVuIGVuZC5cbmZ1bmN0aW9uIHJhbmdlQm91bmQocmF3OiB1bmtub3duKTogbnVtYmVyIHwgbnVsbCB7XG4gIGNvbnN0IHRleHQgPSB0eXBlb2YgcmF3ID09PSAnbnVtYmVyJyA/IFN0cmluZyhyYXcpIDogU3RyaW5nKHJhdyA/PyAnJykudHJpbSgpO1xuICBjb25zdCBudW1iZXIgPSB0ZXh0ID09PSAnJyA/IE5hTiA6IE51bWJlcih0ZXh0KTtcblxuICByZXR1cm4gTnVtYmVyLmlzRmluaXRlKG51bWJlcikgPyBudW1iZXIgOiBudWxsO1xufVxuXG4vLyBBIGdyb3VwIHZhbHVlIGFzIHRleHQsIHRoZSBzYW1lIGZvciB0aGUgc2FtZSB2YWx1ZSB3aGF0ZXZlciBpdHMgc291cmNlOlxuLy8gZGF5cyBhcyBjYWxlbmRhciBkYXlzLCBwaWNrcyBhbmQgZW5kcyBhcyB0ZXh0LCBrZXl3b3JkIHRleHQgdHJpbW1lZC4gVGhlXG4vLyB2YWx1ZSBhIHRpbGUgaGVhZGVyIHdhcyBidWlsdCB3aXRoIGlzIGtleWVkIG9uIGl0LCBzbyBhIGhlYWRlciBpcyBjcmVhdGVkXG4vLyBhZ2FpbiB3aGVuIGFub3RoZXIgYmFyIGNoYW5nZXMgYSBncm91cCBpdCBzaG93cy5cbmV4cG9ydCBmdW5jdGlvbiBncm91cFZhbHVlU2lnbmF0dXJlKHZhbHVlOiBGaWx0ZXJHcm91cFZhbHVlIHwgbnVsbCB8IHVuZGVmaW5lZCk6IHN0cmluZyB7XG4gIGlmICghdmFsdWUpIHtcbiAgICByZXR1cm4gJyc7XG4gIH1cblxuICByZXR1cm4gSlNPTi5zdHJpbmdpZnkoW1xuICAgIGRhdGVCb3VuZFN0cmluZyh2YWx1ZS5zdGFydCkgPz8gJycsXG4gICAgZGF0ZUJvdW5kU3RyaW5nKHZhbHVlLmVuZCkgPz8gJycsXG4gICAgKHZhbHVlLnZhbHVlcyA/PyBbXSkubWFwKFN0cmluZyksXG4gICAgKHZhbHVlLmV4Y2x1ZGVWYWx1ZXMgPz8gW10pLm1hcChTdHJpbmcpLFxuICAgICh2YWx1ZS52YWx1ZSA/PyAnJykudHJpbSgpLFxuICAgIHZhbHVlLm1pbiA/PyAnJyxcbiAgICB2YWx1ZS5tYXggPz8gJycsXG4gIF0pO1xufVxuXG4vLyBmcy1maWx0ZXIncyBBdXRvQ29tcGxldGVDaGlwcyBzZXJpYWxpc2VzIGEgbXVsdGktc2VsZWN0IGludG8gT05FIHF1ZXJ5IHZhbHVlOlxuLy8gdGhlIHNlbGVjdGVkIHZhbHVlcyBqb2luZWQgYnkgXCIsXCIgKGl0cyBgcXVlcnlgIGdldHRlciBkb2VzIGAubWFwKHZhbHVlKS5qb2luKCcsJylgKS5cbi8vIFNvIGEgMisgc2VsZWN0aW9uIGFycml2ZXMgYXMgdGhlIHN0cmluZyBcImEsYlwiLCBub3QgYW4gYXJyYXkg4oCUIHNwbGl0dGluZyBvbiBcIixcIlxuLy8gcmV2ZXJzZXMgdGhhdCBmYWl0aGZ1bGx5LiBXaXRob3V0IHRoaXMsIGEgbXVsdGktc2VsZWN0IHdhcyBzZW50IGFzIHRoZSBzaW5nbGVcbi8vIHZhbHVlIFtcImEsYlwiXSwgcHJvZHVjaW5nIGBjb2wgSU4gKCdhLGInKWAgc2VydmVyLXNpZGUsIHdoaWNoIG1hdGNoZXMgbm90aGluZy5cbmZ1bmN0aW9uIHNlbGVjdFF1ZXJ5VmFsdWVzKHJhdzogdW5rbm93bik6IHVua25vd25bXSB7XG4gIGlmIChBcnJheS5pc0FycmF5KHJhdykpIHtcbiAgICByZXR1cm4gcmF3O1xuICB9XG5cbiAgaWYgKHJhdyA9PT0gbnVsbCB8fCByYXcgPT09IHVuZGVmaW5lZCB8fCByYXcgPT09ICcnKSB7XG4gICAgcmV0dXJuIFtdO1xuICB9XG5cbiAgcmV0dXJuIFN0cmluZyhyYXcpLnNwbGl0KCcsJyk7XG59XG4iXX0=
|
|
473
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVwb3J0LWZpbHRlci1pdGVtcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9hcHAvcmVwb3J0cy9yZXBvcnQtZmlsdGVyLWl0ZW1zLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBcUIsUUFBUSxFQUFFLGNBQWMsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBRWpGLE9BQU8sRUFBRSxNQUFNLEVBQUUsUUFBUSxFQUFFLE1BQU0sVUFBVSxDQUFDO0FBRTVDLE9BQU8sRUFBYyxFQUFFLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDdEMsT0FBTyxFQUFFLEdBQUcsRUFBRSxXQUFXLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUdsRCxPQUFPLEVBQUUsY0FBYyxFQUFFLGFBQWEsRUFBRSxNQUFNLDhCQUE4QixDQUFDO0FBQzdFLE9BQU8sRUFBRSxTQUFTLEVBQUUsZUFBZSxFQUFFLG9CQUFvQixFQUFFLE1BQU0sVUFBVSxDQUFDO0FBSTVFLE9BQU8sRUFDK0IsbUJBQW1CLEdBRXhELE1BQU0sK0JBQStCLENBQUM7QUFDdkMsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBSXpELDJFQUEyRTtBQUMzRSw0RUFBNEU7QUFDNUUseUVBQXlFO0FBQ3pFLE1BQU0sVUFBVSxlQUFlLENBQUMsS0FBdUM7SUFDckUsSUFBSSxLQUFLLFlBQVksSUFBSSxFQUFFLENBQUM7UUFDMUIsT0FBTyxNQUFNLENBQUMsS0FBSyxFQUFFLFlBQVksQ0FBQyxDQUFDO0lBQ3JDLENBQUM7SUFFRCxzRUFBc0U7SUFDdEUsOEJBQThCO0lBQzlCLE9BQU8sS0FBSyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDO0FBQ3hELENBQUM7QUFHRCw4RUFBOEU7QUFDOUUsK0VBQStFO0FBQy9FLDhFQUE4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QUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2hDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJRmlsdGVyQ29uZmlnSXRlbSwgSXRlbVR5cGUsIGdldEV4Y2x1ZGVOYW1lIH0gZnJvbSAnQGZpcmVzdGl0Y2gvZmlsdGVyJztcblxuaW1wb3J0IHsgZm9ybWF0LCBwYXJzZUlTTyB9IGZyb20gJ2RhdGUtZm5zJztcblxuaW1wb3J0IHsgT2JzZXJ2YWJsZSwgb2YgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IG1hcCwgc2hhcmVSZXBsYXkgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5cbmltcG9ydCB7IFJlcG9ydERhdGEgfSBmcm9tICcuL2RhdGEvcmVwb3J0LmRhdGEnO1xuaW1wb3J0IHsgZmlsdGVyTGluZVRleHQsIG1hdGNoTGluZVRleHQgfSBmcm9tICcuL2V4cG9ydC9yZXBvcnQtZmlsdGVyLWxpbmVzJztcbmltcG9ydCB7IERBWV9TSE9SVCwgZm9ybWF0TG9jYWxEYXRlLCByZXNvbHZlRm9ybWF0Q29udGV4dCB9IGZyb20gJy4vZm9ybWF0JztcbmltcG9ydCB7IFJlcG9ydEZpbHRlck1hdGNoIH0gZnJvbSAnLi9pbnRlcmZhY2VzL3JlcG9ydC1maWx0ZXItbWF0Y2gudHlwZSc7XG5pbXBvcnQgeyBSZXBvcnRGaWx0ZXJPcHRpb25QYWlyIH0gZnJvbSAnLi9pbnRlcmZhY2VzL3JlcG9ydC1maWx0ZXItb3B0aW9uLXBhaXIuaW50ZXJmYWNlJztcbmltcG9ydCB7IFJlcG9ydFZpZXdlckZlYXR1cmUgfSBmcm9tICcuL2ludGVyZmFjZXMvcmVwb3J0LXZpZXdlci1mZWF0dXJlLnR5cGUnO1xuaW1wb3J0IHtcbiAgQ2hhcnRHcmFudWxhcml0eSwgRmlsdGVyR3JvdXBWYWx1ZSwgR1JBTlVMQVJJVFlfT1BUSU9OUywgUmVwb3J0LCBSZXBvcnRGaWx0ZXJHcm91cCwgUmVwb3J0RmlsdGVyTGV2ZWwsXG4gIFJlcG9ydEZpbHRlck9wdGlvbiwgUmVwb3J0RmlsdGVyVHlwZSwgUmVwb3J0TG9jYWxlVGFnLFxufSBmcm9tICcuL2ludGVyZmFjZXMvcmVwb3J0LmludGVyZmFjZSc7XG5pbXBvcnQgeyBvZmZlcnNFeGNsdWRlIH0gZnJvbSAnLi9yZXBvcnQtdmlld2VyLWZlYXR1cmVzJztcbmltcG9ydCB7IFJlcG9ydEZpbHRlck9wdGlvbnNTZXJ2aWNlIH0gZnJvbSAnLi9zZXJ2aWNlcy9yZXBvcnQtZmlsdGVyLW9wdGlvbnMuc2VydmljZSc7XG5cblxuLy8gQSBkYXRlLXJhbmdlIGJvdW5kYXJ5IGFzIHRoZSBwaWNrZWQgTE9DQUwgY2FsZW5kYXIgZGF5IChubyB0aW1lLCBubyB0eikuXG4vLyBEYXRlLXJhbmdlIGZpbHRlcnMgYXJlIGNhbGVuZGFyLWRheSBzZW1hbnRpY3MsIHNvIHRoZSBib3VuZGFyeSBtdXN0IGNhcnJ5XG4vLyBvbmx5IFktTS1EIOKAlCBuZXZlciBhIHRpbWV6b25lLWJlYXJpbmcgaW5zdGFudCB0aGUgYmFja2VuZCB3b3VsZCBzaGlmdC5cbmV4cG9ydCBmdW5jdGlvbiBkYXRlQm91bmRTdHJpbmcodmFsdWU6IERhdGUgfCBzdHJpbmcgfCBudWxsIHwgdW5kZWZpbmVkKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgaWYgKHZhbHVlIGluc3RhbmNlb2YgRGF0ZSkge1xuICAgIHJldHVybiBmb3JtYXQodmFsdWUsICd5eXl5LU1NLWRkJyk7XG4gIH1cblxuICAvLyBBdXRob3JlZC9yZWxhdGl2ZSBkZWZhdWx0cyBhcnJpdmUgYXMgc3RyaW5ncyBhbHJlYWR5IGluIFktTS1EIGZvcm07XG4gIC8vIGtlZXAganVzdCB0aGUgZGF0ZSBwb3J0aW9uLlxuICByZXR1cm4gdmFsdWUgPyBTdHJpbmcodmFsdWUpLnNsaWNlKDAsIDEwKSA6IHVuZGVmaW5lZDtcbn1cblxuXG4vLyBBIGRhdGUtcmFuZ2UgYm91bmRhcnkgYXMgaXQgc2hvdWxkIFJFQUQgb24gYSBjb3ZlciBwYWdlIOKAlCB0aGUgc2FtZSBjYWxlbmRhclxuLy8gZGF5IGRhdGVCb3VuZFN0cmluZygpIGhhbmRzIHRoZSBzZXJ2ZXIsIHNvIGEgcHJpbnRlZCBwZXJpb2QgY2FuIG5ldmVyIG5hbWUgYVxuLy8gZGlmZmVyZW50IGRheSB0aGFuIHRoZSBudW1iZXJzIHVuZGVyIGl0IHdlcmUgZmlsdGVyZWQgYnkuIFJldHVybnMgbnVsbCB3aGVuXG4vLyB0aGVyZSBpcyBubyBib3VuZGFyeTsgdGhlIGNhbGxlciBzdXBwbGllcyBpdHMgb3duIHBsYWNlaG9sZGVyLlxuLy9cbi8vIFRoZSBwYXJzZSBoYXMgdG8gYmUgcGFyc2VJU08sIG5vdCBgbmV3IERhdGVgOiBgbmV3IERhdGUoJzIwMjYtMDUtMDEnKWAgaXMgVVRDXG4vLyBtaWRuaWdodCwgc28gZm9ybWF0dGluZyBpdCBhbnl3aGVyZSB3ZXN0IG9mIFVUQyBwcmludHMgQXByIDMwLiBwYXJzZUlTTyByZWFkc1xuLy8gYSBiYXJlIFktTS1EIGFzIExPQ0FMIG1pZG5pZ2h0LCB3aGljaCBubyBvZmZzZXQgY2FuIHNoaWZ0LlxuLy9cbi8vIFRoZSBkYXkgaXMgd3JpdHRlbiBpbiB0aGUgcmVwb3J0J3MgbG9jYWxlLCBhcyBpdHMgZGF0ZSBjZWxscyBhcmU6ICdKYW4gNSxcbi8vIDIwMjYnIGluIGVuLVVTLCAnNSBqYW52LiAyMDI2JyBpbiBmci1DQS5cbmV4cG9ydCBmdW5jdGlvbiBkYXRlQm91bmRMYWJlbCh2YWx1ZTogRGF0ZSB8IHN0cmluZyB8IG51bGwgfCB1bmRlZmluZWQsIGxvY2FsZTogUmVwb3J0TG9jYWxlVGFnKTogc3RyaW5nIHwgbnVsbCB7XG4gIGNvbnN0IGJvdW5kID0gZGF0ZUJvdW5kU3RyaW5nKHZhbHVlKTtcblxuICBpZiAoIWJvdW5kKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBjb25zdCBkYXRlID0gcGFyc2VJU08oYm91bmQpO1xuXG4gIHJldHVybiBOdW1iZXIuaXNOYU4oZGF0ZS5nZXRUaW1lKCkpID8gU3RyaW5nKHZhbHVlKSA6IGZvcm1hdExvY2FsRGF0ZShkYXRlLCBsb2NhbGUsIERBWV9TSE9SVCk7XG59XG5cblxuLy8gQSBzdG9yZWQgeXl5eS1NTS1kZCBib3VuZGFyeSBhcyBhIGxvY2FsIERhdGUgZm9yIGEgZGF0ZSBwaWNrZXIsIG9yIG51bGwuXG4vLyBwYXJzZUlTTyByZWFkcyBhIGJhcmUgWS1NLUQgYXMgTE9DQUwgbWlkbmlnaHQsIHNvIHRoZSBwaWNrZXIgc2hvd3MgdGhlIGRheVxuLy8gdGhhdCB3YXMgc3RvcmVkLCB3aGF0ZXZlciB0aGUgYnJvd3NlcidzIHpvbmUuXG5leHBvcnQgZnVuY3Rpb24gZGF0ZUZyb21Cb3VuZCh2YWx1ZTogc3RyaW5nIHwgbnVsbCB8IHVuZGVmaW5lZCk6IERhdGUgfCBudWxsIHtcbiAgaWYgKCF2YWx1ZSkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgY29uc3QgZGF0ZSA9IHBhcnNlSVNPKHZhbHVlLnNsaWNlKDAsIDEwKSk7XG5cbiAgcmV0dXJuIE51bWJlci5pc05hTihkYXRlLmdldFRpbWUoKSkgPyBudWxsIDogZGF0ZTtcbn1cblxuXG4vLyBBIHBpY2tlZCBEYXRlIGFzIGEgeXl5eS1NTS1kZCBib3VuZGFyeSBmb3Igc3RvcmFnZSwgb3IgbnVsbC4gVXNlcyB0aGUgbG9jYWxcbi8vIGNhbGVuZGFyIGRheSAoZm9ybWF0LCBub3QgdG9JU09TdHJpbmcpIHNvIHRoZSBib3VuZGFyeSBpcyB0aGUgZGF5IHRoYXQgd2FzXG4vLyBwaWNrZWQsIHJlZ2FyZGxlc3Mgb2YgdGhlIGJyb3dzZXIncyB6b25lLlxuZXhwb3J0IGZ1bmN0aW9uIGRhdGVUb0JvdW5kKHZhbHVlOiBEYXRlIHwgbnVsbCB8IHVuZGVmaW5lZCk6IHN0cmluZyB8IG51bGwge1xuICByZXR1cm4gdmFsdWUgaW5zdGFuY2VvZiBEYXRlICYmICFOdW1iZXIuaXNOYU4odmFsdWUuZ2V0VGltZSgpKVxuICAgID8gZm9ybWF0KHZhbHVlLCAneXl5eS1NTS1kZCcpXG4gICAgOiBudWxsO1xufVxuXG5cbi8vIEEgcmVsYXRpdmUgZGF0ZS1yYW5nZSBwcmVzZXQga2V5IGFzIGEgc2VudGVuY2UtY2FzZSBsYWJlbCwgZGVyaXZlZCBmcm9tIHRoZVxuLy8gY2FtZWxDYXNlIGtleSBpdHNlbGYgKCdsYXN0MTJNb250aHMnIHJlYWRzICdMYXN0IDEyIG1vbnRocycsICd0aGlzV2Vlaydcbi8vIHJlYWRzICdUaGlzIHdlZWsnKSwgc28gbm8gbGlzdCBvZiBwcmVzZXRzIGlzIG1pcnJvcmVkIGhlcmUgYW5kIGEga2V5IHRoZVxuLy8gc2VydmVyIGFkZHMgbGF0ZXIgc3RpbGwgcmVhZHMgc2Vuc2libHkuXG5leHBvcnQgZnVuY3Rpb24gcmVsYXRpdmVMYWJlbChyZWxhdGl2ZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgY29uc3Qgd29yZHMgPSByZWxhdGl2ZVxuICAgIC5yZXBsYWNlKC8oW2Etel0pKFtBLVowLTldKS9nLCAnJDEgJDInKVxuICAgIC5yZXBsYWNlKC8oXFxkKShbQS1aXSkvZywgJyQxICQyJylcbiAgICAudG9Mb3dlckNhc2UoKTtcblxuICByZXR1cm4gd29yZHMuY2hhckF0KDApLnRvVXBwZXJDYXNlKCkgKyB3b3Jkcy5zbGljZSgxKTtcbn1cblxuXG4vLyBNYXBzIGEgcmVwb3J0IGZpbHRlciBHUk9VUCB0byBhbiBmcy1maWx0ZXIgY29uZmlnIGl0ZW0sIGFuZCByZWFkcyBmcy1maWx0ZXJcbi8vIHF1ZXJ5IHZhbHVlcyBiYWNrIGludG8gcGVyLWdyb3VwIEZpbHRlckdyb3VwVmFsdWVzLiBTaGFyZWQgYnkgdGhlIHJlcG9ydC1iYXJcbi8vIGZzLWZpbHRlciBhbmQgdGhlIHBlci1jb21wb25lbnQgZnMtZmlsdGVyIHNvIGJvdGggcmVuZGVyIHRocm91Z2ggdGhlIHNhbWVcbi8vIGxpYnJhcnkgYW5kIHdyaXRlIGludG8gUmVwb3J0RmlsdGVyU3RhdGVTZXJ2aWNlIGlkZW50aWNhbGx5LiBJdGVtcyBhcmUgbmFtZWRcbi8vIGJ5IHRoZSBncm91cCdzIGlkIChncm91cEl0ZW1OYW1lKSwgc28gdGhlIHF1ZXJ5IGtleXMgbWFwIHN0cmFpZ2h0IGJhY2sgdG9cbi8vIHRoZSBncm91cC4gQSByZXBvcnQgbmV2ZXIgcHV0cyB0aGVzZSBrZXlzIGluIHRoZSBicm93c2VyIFVSTDogZnMtZmlsdGVyJ3Ncbi8vIG93biBxdWVyeS1wYXJhbSBzeW5jaW5nIGlzIG9mZiBpbiBldmVyeSByZXBvcnQgYmFyLlxuXG4vLyBUaGUgcXVlcnkga2V5IGZvciB0aGUgcmVwb3J0J3MgZ3JvdXAtYnkgY29udHJvbC4gRml4ZWQgcmF0aGVyIHRoYW4gZGVyaXZlZFxuLy8gZnJvbSBhbiBpZCBiZWNhdXNlIGEgcmVwb3J0IGhhcyBleGFjdGx5IG9uZSDigJQgYW5kIGl0IGlzIE5PVCBhIGZpbHRlciBncm91cCxcbi8vIHNvIGl0IGlzIHJlYWQgc3RyYWlnaHQgb2ZmIHRoZSBjaGFuZ2UgcXVlcnkgaW5zdGVhZCBvZiB0aHJvdWdoXG4vLyBncm91cFZhbHVlc0Zyb21RdWVyeS4gVGhlIGdyYWluIHRyYXZlbHMgdG8gdGhlIHNlcnZlciBhcyB0aGUgZGF0YSByZXF1ZXN0J3Ncbi8vIGBzdGF0ZS5mcmVxdWVuY3lgLlxuZXhwb3J0IGNvbnN0IEdST1VQX0JZX0lURU0gPSAnZ3JvdXBCeSc7XG5cbi8vIFRoZSB3b3JkIGJlZm9yZSBhIGdyb3VwJ3MgaWQgaW4gdGhlIG5hbWUgb2YgaXRzIGZzLWZpbHRlciBpdGVtIChmaWx0ZXIxMikuXG5jb25zdCBJVEVNX05BTUVfV09SRCA9ICdmaWx0ZXInO1xuXG4vLyBUaGUgZW5kcyBvZiBhbiBmcy1maWx0ZXIgcmFuZ2UgaXRlbTogUmFuZ2Ugd3JpdGVzIDxuYW1lPk1pbiBhbmQgPG5hbWU+TWF4LFxuLy8gRGF0ZVJhbmdlIDxuYW1lPkZyb20gYW5kIDxuYW1lPlRvLlxuZXhwb3J0IHR5cGUgSXRlbVJhbmdlRW5kID0gJ21pbicgfCAnbWF4JyB8ICdmcm9tJyB8ICd0byc7XG5cbi8vIFRoZSBxdWVyeSBrZXkgb2Ygb25lIGVuZCBvZiBhbiBmcy1maWx0ZXIgcmFuZ2UgaXRlbTogdGhlIGl0ZW0ncyBuYW1lIGFuZFxuLy8gdGhlIGVuZCB3aXRoIGl0cyBmaXJzdCBsZXR0ZXIgdXBwZXItY2FzZWQgKGZzLWZpbHRlcidzIGdldFJhbmdlTmFtZSksIHNvXG4vLyBmaWx0ZXIxMiBnaXZlcyBmaWx0ZXIxMk1pbiBhbmQgZmlsdGVyMTJGcm9tLlxuZXhwb3J0IGZ1bmN0aW9uIGl0ZW1SYW5nZU5hbWUobmFtZTogc3RyaW5nLCBlbmQ6IEl0ZW1SYW5nZUVuZCk6IHN0cmluZyB7XG4gIHJldHVybiBgJHtuYW1lfSR7ZW5kLmNoYXJBdCgwKS50b1VwcGVyQ2FzZSgpfSR7ZW5kLnNsaWNlKDEpfWA7XG59XG5cbi8vIFRoZSBuYW1lIG9mIGEgZ3JvdXAncyBmcy1maWx0ZXIgaXRlbTogJ2ZpbHRlcicgYW5kIHRoZSBncm91cCdzIGlkLiBUaGUgaWRcbi8vIG5ldmVyIGNoYW5nZXMsIHNvIG5laXRoZXIgYSBuZXcgbGFiZWwgbm9yIGEgbmV3IG5hbWUgbW92ZXMgYSBiYXIncyBrZXlzLFxuLy8gYW5kIG5vIGl0ZW0gbmFtZSBjYW4gdGFrZSBhbm90aGVyIGl0ZW0ncyAoZ3JvdXBCeSwgbWF0Y2gsIGxpc3RTZWFyY2gpLlxuZXhwb3J0IGZ1bmN0aW9uIGdyb3VwSXRlbU5hbWUoZ3JvdXA6IFBpY2s8UmVwb3J0RmlsdGVyR3JvdXAsICdpZCc+KTogc3RyaW5nIHtcbiAgcmV0dXJuIGAke0lURU1fTkFNRV9XT1JEfSR7Z3JvdXAuaWR9YDtcbn1cblxuLy8gVGhlIGxhYmVsIGEgZ3JvdXAncyBjaGlwIHNob3dzOiBpdHMgb3duLCBlbHNlIGl0cyBmaXJzdCBtZW1iZXIncyBjb2x1bW4uXG5mdW5jdGlvbiBncm91cExhYmVsKGdyb3VwOiBQaWNrPFJlcG9ydEZpbHRlckdyb3VwLCAnbGFiZWwnIHwgJ2ZpbHRlcnMnPik6IHN0cmluZyB7XG4gIHJldHVybiBncm91cC5sYWJlbCB8fCBncm91cC5maWx0ZXJzPy5bMF0/LmZpbHRlckNvbHVtbiB8fCAnJztcbn1cblxuLy8gQSBzZWxlY3QgZ3JvdXAncyBkaXN0aW5jdCBvcHRpb25zLCBhcyB7IG5hbWUsIHZhbHVlIH0gcGFpcnMuIFRoZSBzZXJ2ZXIgc2VuZHNcbi8vIHsgdmFsdWUsIGxhYmVsIH06IHRoZSB2YWx1ZSBpcyB3aGF0IHRoZSBmaWx0ZXIgbWF0Y2hlcyBvbiAoYW4gZW50aXR5J3Mgc3RhYmxlXG4vLyBpZCkgYW5kIHRoZSBsYWJlbCBpcyB3aGF0IHRoZSB2aWV3ZXIgcmVhZHMg4oCUIHNvIGEgcmVuYW1lZCBlbnRpdHkga2VlcHMgaXRzIGlkXG4vLyBhbmQgc2ltcGx5IHNob3dzIGl0cyBuZXcgbmFtZSBoZXJlLiBPcHRpb25zIGNvbWUgZnJvbSB0aGUgZmlyc3QgbWVtYmVyIGZpbHRlclxuLy8gdGhhdCBkZWNsYXJlcyB0aGVtIOKAlCBtZW1iZXJzIGFyZSB0aGUgc2FtZSBkYXRhIHBvaW50LCBzbyBhbnkgbWVtYmVyJ3MgbGlzdFxuLy8gc2VydmVzIHRoZSBncm91cC4gVGhlIGxpc3QgaXMgZmV0Y2hlZCBvbmNlICh0aGUgc2VydmVyIGNhcHMgaXQpIGFuZCByZXBsYXllZFxuLy8gKHNoYXJlUmVwbGF5KSwgc28gcmVwZWF0ZWQgcmVhZHMgbmV2ZXIgcmVmZXRjaC4gVGhpcyBpcyB0aGUgZnVsbCBsaXN0LCBuZXZlclxuLy8gbmFycm93ZWQgYnkgb3RoZXIgZmlsdGVyczogdGhlIHJlcG9ydC1zZXR0aW5ncyBkZWZhdWx0IHBpY2tlciByZWFkcyBpdCAoYW5cbi8vIGF1dGhvciBzZXRzIGEgZGVmYXVsdCBhZ2FpbnN0IHRoZSB3aG9sZSBsaXN0KSwgYW5kIHNvIGRvZXMgdGhlIGV4cG9ydCdzXG4vLyBmaWx0ZXIgd29yZGluZyBmb3IgYSBwaWNrIHRoZSBiYXIgaGFzIG5vdCBuYW1lZC4gVGhlIGJhcnMgcmVhZFxuLy8gUmVwb3J0RmlsdGVyT3B0aW9uc1NlcnZpY2UgaW5zdGVhZC4gUmV0dXJucyBhbiBlbXB0eSBsaXN0IHdoZW4gbm8gbWVtYmVyXG4vLyBwcm92aWRlcyBvcHRpb25zLlxuZXhwb3J0IGZ1bmN0aW9uIGxvYWRHcm91cE9wdGlvbnMoXG4gIGdyb3VwOiBSZXBvcnRGaWx0ZXJHcm91cCxcbiAgcmVwb3J0RGF0YTogUmVwb3J0RGF0YSxcbiAgcmVwb3J0SWQ6IG51bWJlcixcbik6IE9ic2VydmFibGU8UmVwb3J0RmlsdGVyT3B0aW9uUGFpcltdPiB7XG4gIGNvbnN0IG9wdGlvbkZpbHRlciA9IChncm91cC5maWx0ZXJzID8/IFtdKS5maW5kKChtZW1iZXIpID0+IG1lbWJlci5oYXNPcHRpb25zKTtcbiAgaWYgKCFvcHRpb25GaWx0ZXIpIHtcbiAgICByZXR1cm4gb2YoW10pO1xuICB9XG5cbiAgcmV0dXJuIHJlcG9ydERhdGEuZmlsdGVyT3B0aW9ucyhyZXBvcnRJZCwgb3B0aW9uRmlsdGVyLmlkKVxuICAgIC5waXBlKFxuICAgICAgbWFwKChvcHRpb25zOiBSZXBvcnRGaWx0ZXJPcHRpb25bXSkgPT4gKG9wdGlvbnMgPz8gW10pXG4gICAgICAgIC5tYXAoKG9wdGlvbikgPT4gKHsgbmFtZTogb3B0aW9uLmxhYmVsLCB2YWx1ZTogb3B0aW9uLnZhbHVlIH0pKSksXG4gICAgICBzaGFyZVJlcGxheSh7IGJ1ZmZlclNpemU6IDEsIHJlZkNvdW50OiBmYWxzZSB9KSxcbiAgICApO1xufVxuXG4vLyBTdG9yZWQgZmlsdGVyIHZhbHVlcyAoaWRzKSBwYWlyZWQgYmFjayB3aXRoIHRoZSBsYWJlbHMgdG8gc2hvdyBmb3IgdGhlbS5cbi8vIEEgc2F2ZWQgZGVmYXVsdCBob2xkcyBvbmx5IHZhbHVlcywgc28gdGhlIG5hbWVzIGhhdmUgdG8gYmUgcmVhZCBiYWNrIG9mZiB0aGVcbi8vIG9wdGlvbiBsaXN0IOKAlCB0aGF0IGluZGlyZWN0aW9uIGlzIGV4YWN0bHkgd2hhdCBzdXJ2aXZlcyBhIHJlbmFtZS4gYGxhYmVsYFxuLy8gbmFtZXMgYSB2YWx1ZSBmaXJzdDogYSBuYW1lIGFscmVhZHkgbGVhcm5lZCAoUmVwb3J0RmlsdGVyT3B0aW9uc1NlcnZpY2UubGFiZWwpXG4vLyBob2xkcyBmb3IgYSBwaWNrIGEgbmFycm93ZWQgbGlzdCBsZWF2ZXMgb3V0LCBhbmQgd2hlbiBpdCBuYW1lcyBldmVyeSB2YWx1ZVxuLy8gdGhlIGxpc3QgaXMgbm90IHJlYWQgYXQgYWxsLiBBIHZhbHVlIHdpdGggbm8gbmFtZSBhbmQgbm8gbWF0Y2hpbmcgb3B0aW9uXG4vLyAoaXRzIGVudGl0eSB3YXMgZGVsZXRlZCwgc28gaXQgaXMgbm8gbG9uZ2VyIGxpc3RlZCkgZmFsbHMgYmFjayB0byBzaG93aW5nXG4vLyB0aGUgcmF3IHZhbHVlIHJhdGhlciB0aGFuIGRyb3BwaW5nIHRoZSBjaGlwLCB3aGljaCB3b3VsZCBzaWxlbnRseSB3aWRlbiB0aGVcbi8vIGZpbHRlci5cbmV4cG9ydCBmdW5jdGlvbiByZXNvbHZlT3B0aW9uVmFsdWVzKFxuICBvcHRpb25zJDogT2JzZXJ2YWJsZTxSZXBvcnRGaWx0ZXJPcHRpb25QYWlyW10+LFxuICB2YWx1ZXM6IHVua25vd25bXSxcbiAgbGFiZWw6ICh2YWx1ZTogdW5rbm93bikgPT4gc3RyaW5nIHwgbnVsbCA9ICgpID0+IG51bGwsXG4pOiBPYnNlcnZhYmxlPFJlcG9ydEZpbHRlck9wdGlvblBhaXJbXT4ge1xuICBjb25zdCBuYW1lZCA9IChvcHRpb25zOiBSZXBvcnRGaWx0ZXJPcHRpb25QYWlyW10pID0+IHZhbHVlcy5tYXAoKHZhbHVlKSA9PiB7XG4gICAgY29uc3Qgb3B0aW9uID0gb3B0aW9ucy5maW5kKChjYW5kaWRhdGUpID0+IFN0cmluZyhjYW5kaWRhdGUudmFsdWUpID09PSBTdHJpbmcodmFsdWUpKTtcblxuICAgIHJldHVybiB7IG5hbWU6IGxhYmVsKHZhbHVlKSA/PyBvcHRpb24/Lm5hbWUgPz8gU3RyaW5nKHZhbHVlKSwgdmFsdWUgfTtcbiAgfSk7XG5cbiAgcmV0dXJuIHZhbHVlcy5ldmVyeSgodmFsdWUpID0+IGxhYmVsKHZhbHVlKSAhPT0gbnVsbClcbiAgICA/IG9mKG5hbWVkKFtdKSlcbiAgICA6IG9wdGlvbnMkLnBpcGUobWFwKG5hbWVkKSk7XG59XG5cbi8vIENhc2UtaW5zZW5zaXRpdmUgbmFtZSBmaWx0ZXIgYXBwbGllZCB0byBhIGxvYWRlZCBvcHRpb24gbGlzdCDigJQgdGhlIHR5cGVkXG4vLyBrZXl3b3JkIGhhcyB0byBiZSBtYXRjaGVkIGhlcmUgYmVjYXVzZSBmcy1hdXRvY29tcGxldGUgcmVuZGVycyB3aGF0IHdlIHJldHVyblxuLy8gdmVyYmF0aW0uXG5leHBvcnQgZnVuY3Rpb24gbWF0Y2hPcHRpb25zKFxuICBvcHRpb25zJDogT2JzZXJ2YWJsZTxSZXBvcnRGaWx0ZXJPcHRpb25QYWlyW10+LFxuICBrZXl3b3JkPzogc3RyaW5nLFxuKTogT2JzZXJ2YWJsZTxSZXBvcnRGaWx0ZXJPcHRpb25QYWlyW10+IHtcbiAgY29uc3QgdGVybSA9IChrZXl3b3JkID8/ICcnKS50cmltKCkudG9Mb3dlckNhc2UoKTtcblxuICByZXR1cm4gb3B0aW9ucyQucGlwZShtYXAoKG9wdGlvbnMpID0+IHRlcm1cbiAgICA/IG9wdGlvbnMuZmlsdGVyKChvcHRpb24pID0+IG9wdGlvbi5uYW1lLnRvTG93ZXJDYXNlKCkuaW5jbHVkZXModGVybSkpXG4gICAgOiBvcHRpb25zKSk7XG59XG5cbi8vIFRoZSBwYW5lbCByb3cgb2YgYSBzZWxlY3Qgd2hvc2UgbGlzdCB0aGUgc2VydmVyIGN1dCBhdCA1MDAuXG5leHBvcnQgY29uc3QgT1BUSU9OU19UUlVOQ0FURURfTk9URSA9ICdTaG93aW5nIHRoZSBmaXJzdCA1MDAuIFR5cGUgdG8gbmFycm93Lic7XG5cbi8vIFRoZSBwYW5lbCByb3cgb2YgYSBzZWxlY3Qgd2hvc2UgbGlzdCBjb3VsZCBub3QgYmUgcmVhZC4gVGhlIG5leHQgZm9jdXMgb3Jcbi8vIGtleXN0cm9rZSBhc2tzIGFnYWluLlxuZXhwb3J0IGNvbnN0IE9QVElPTlNfRkFJTEVEX05PVEUgPSAnQ291bGQgbm90IGxvYWQgdGhlIGxpc3QuJztcblxuLy8gQnVpbGQgdGhlIGZzLWZpbHRlciBjb25maWcgaXRlbSBmb3IgYSBncm91cCwgc2VlZGluZyBpdHMgZGVmYXVsdCBmcm9tIHRoZVxuLy8gY3VycmVudCBzZXNzaW9uIHZhbHVlIHNvIGF1dGhvcmVkL3JlbGF0aXZlIGRlZmF1bHRzIHNob3cgc2VsZWN0ZWQgb24gb3Blbi5cbi8vIEEgc2VsZWN0IGxpc3RzIHdoYXQgYG9wdGlvbnNgIG9mZmVycyBmb3IgaXQgaW4gYHJlcG9ydGAuIGBmZWF0dXJlc2AgaXMgdGhlXG4vLyByZXBvcnQncyB2aWV3ZXJGZWF0dXJlczogYSBzZWxlY3Qgb2ZmZXJzICdFeGNsdWRlIHRoZXNlJyBieSB0aGUgcnVsZSBvZlxuLy8gb2ZmZXJzRXhjbHVkZSAodGhlIHNlcnZlciBsaXN0cyBleGNsdWRlVmFsdWVzIGFuZCBubyBtZW1iZXIgYmluZHMgc2V2ZXJhbFxuLy8gY29sdW1ucyksIGFuZCBhIG51bWJlciByYW5nZSBpcyBhIG1pbi9tYXggY29udHJvbCBvbmx5IHdoZW4gaXQgbGlzdHNcbi8vIG51bWJlclJhbmdlLlxuZXhwb3J0IGZ1bmN0aW9uIGZpbHRlckl0ZW1Gb3JHcm91cChcbiAgZ3JvdXA6IFJlcG9ydEZpbHRlckdyb3VwLFxuICBvcHRpb25zOiBSZXBvcnRGaWx0ZXJPcHRpb25zU2VydmljZSxcbiAgcmVwb3J0OiBSZXBvcnQgfCBudWxsLFxuICBpbml0aWFsPzogRmlsdGVyR3JvdXBWYWx1ZSxcbiAgZmVhdHVyZXM6IHJlYWRvbmx5IFJlcG9ydFZpZXdlckZlYXR1cmVbXSA9IFtdLFxuKTogSUZpbHRlckNvbmZpZ0l0ZW0ge1xuICBjb25zdCBuYW1lID0gZ3JvdXBJdGVtTmFtZShncm91cCk7XG4gIGNvbnN0IGxhYmVsID0gZ3JvdXBMYWJlbChncm91cCk7XG5cbiAgc3dpdGNoIChncm91cC50eXBlKSB7XG4gICAgY2FzZSAnZGF0ZVJhbmdlJzpcbiAgICAgIHJldHVybiBkYXRlUmFuZ2VGaWx0ZXJJdGVtKG5hbWUsIGxhYmVsLCBpbml0aWFsKTtcblxuICAgIGNhc2UgJ3NlbGVjdCc6XG4gICAgICByZXR1cm4gc2VsZWN0RmlsdGVySXRlbShncm91cCwgbGFiZWwsIG9wdGlvbnMsIHJlcG9ydCwgaW5pdGlhbCwgb2ZmZXJzRXhjbHVkZShncm91cCwgZmVhdHVyZXMpKTtcblxuICAgIGNhc2UgJ251bWJlclJhbmdlJzpcbiAgICAgIHJldHVybiBmZWF0dXJlcy5pbmNsdWRlcygnbnVtYmVyUmFuZ2UnKVxuICAgICAgICA/IG51bWJlclJhbmdlRmlsdGVySXRlbShncm91cCwgbGFiZWwsIHJlcG9ydCwgaW5pdGlhbClcbiAgICAgICAgOiBrZXl3b3JkRmlsdGVySXRlbShuYW1lLCBsYWJlbCwgaW5pdGlhbCk7XG5cbiAgICBjYXNlICdrZXl3b3JkJzpcbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuIGtleXdvcmRGaWx0ZXJJdGVtKG5hbWUsIGxhYmVsLCBpbml0aWFsKTtcbiAgfVxufVxuXG4vLyBBIGRhdGUgcmFuZ2Ugb3BlbnMgb24gaXRzIGRheXMsIGFuZCBpdHMgY2hpcCBzaG93cyB0aGVtLiBBIHByZXNldCBwaWNrZWQgaW5cbi8vIHRoZSBkYXRlIHBpY2tlciBvbmx5IHNldHMgdGhlIGRheXMuXG5mdW5jdGlvbiBkYXRlUmFuZ2VGaWx0ZXJJdGVtKG5hbWU6IHN0cmluZywgbGFiZWw6IHN0cmluZywgaW5pdGlhbD86IEZpbHRlckdyb3VwVmFsdWUpOiBJRmlsdGVyQ29uZmlnSXRlbSB7XG4gIGNvbnN0IGhhc0RheXMgPSAhIShpbml0aWFsPy5zdGFydCB8fCBpbml0aWFsPy5lbmQpO1xuXG4gIHJldHVybiB7XG4gICAgbmFtZSxcbiAgICB0eXBlOiBJdGVtVHlwZS5EYXRlUmFuZ2UsXG4gICAgbGFiZWw6IHsgZnJvbTogYCR7bGFiZWx9IEZyb21gLCB0bzogYCR7bGFiZWx9IFRvYCB9LFxuICAgIGRlZmF1bHQ6IGhhc0RheXNcbiAgICAgID8geyBmcm9tOiBpbml0aWFsLnN0YXJ0ID8/IHVuZGVmaW5lZCwgdG86IGluaXRpYWwuZW5kID8/IHVuZGVmaW5lZCB9XG4gICAgICA6IHVuZGVmaW5lZCxcbiAgfTtcbn1cblxuLy8gQSBzZWxlY3QncyBwaWNrcywga2VwdCBvciBsZWZ0IG91dC4gV2l0aCBgZXhjbHVkZWAgdGhlIGxpc3QgaGFzIHRoZVxuLy8gJ0V4Y2x1ZGUgdGhlc2UnIHJvdywgYW5kIGEgdmFsdWUgdGhhdCBsZWF2ZXMgb3V0IG9wZW5zIHdpdGggaXQgb24uIEl0cyBsaXN0XG4vLyBpcyByZWFkIG9uIGZvY3VzIGFuZCBvbiBlYWNoIGtleXN0cm9rZTogdGhlIG9wdGlvbnMgc2VydmljZSBmZXRjaGVzIGl0IHdoZW5cbi8vIHRoZSBvdGhlciBmaWx0ZXJzIGNoYW5nZWQgc2luY2UgYW5kIHJlcGxheXMgaXQgb3RoZXJ3aXNlLCBhbmQgdHlwaW5nXG4vLyBmaWx0ZXJzIGl0IGhlcmUuIEEgbGlzdCB0aGUgc2VydmVyIGN1dCwgb3Igb25lIHRoYXQgY291bGQgbm90IGJlIHJlYWQsXG4vLyBzYXlzIHNvIGluIGEgcGFuZWwgcm93LlxuZnVuY3Rpb24gc2VsZWN0RmlsdGVySXRlbShcbiAgZ3JvdXA6IFJlcG9ydEZpbHRlckdyb3VwLFxuICBsYWJlbDogc3RyaW5nLFxuICBvcHRpb25zOiBSZXBvcnRGaWx0ZXJPcHRpb25zU2VydmljZSxcbiAgcmVwb3J0OiBSZXBvcnQgfCBudWxsLFxuICBpbml0aWFsOiBGaWx0ZXJHcm91cFZhbHVlIHwgdW5kZWZpbmVkLFxuICBleGNsdWRlOiBib29sZWFuLFxuKTogSUZpbHRlckNvbmZpZ0l0ZW0ge1xuICBjb25zdCBleGNsdWRpbmcgPSBleGNsdWRlICYmICFpbml0aWFsPy52YWx1ZXM/Lmxlbmd0aCAmJiAhIWluaXRpYWw/LmV4Y2x1ZGVWYWx1ZXM/Lmxlbmd0aDtcbiAgY29uc3QgcGlja3MgPSBleGNsdWRpbmcgPyBpbml0aWFsLmV4Y2x1ZGVWYWx1ZXMgOiBpbml0aWFsPy52YWx1ZXM7XG4gIGNvbnN0IG9wdGlvbnMkID0gb3B0aW9ucy5vcHRpb25zKGdyb3VwLCByZXBvcnQpO1xuXG4gIHJldHVybiB7XG4gICAgbmFtZTogZ3JvdXBJdGVtTmFtZShncm91cCksXG4gICAgdHlwZTogSXRlbVR5cGUuQXV0b0NvbXBsZXRlQ2hpcHMsXG4gICAgbGFiZWwsXG4gICAgZmV0Y2hPbkZvY3VzOiB0cnVlLFxuICAgIGV4Y2x1ZGU6IGV4Y2x1ZGUgPyB7fSA6IHVuZGVmaW5lZCxcbiAgICB2YWx1ZXM6IChrZXl3b3JkPzogc3RyaW5nKSA9PiBtYXRjaE9wdGlvbnMob3B0aW9ucyQsIGtleXdvcmQpLFxuICAgIHBhbmVsTm90ZTogKCkgPT4gb3B0aW9uc05vdGUob3B0aW9ucywgZ3JvdXAuaWQpLFxuICAgIC8vIFN0b3JlZCB2YWx1ZXMgYXJlIGlkcywgc28gYSBjaGlwIGlzIG5hbWVkIGJ5IGEgbmFtZSBhbHJlYWR5IGxlYXJuZWQgb3JcbiAgICAvLyBvbmNlIHRoZSBvcHRpb24gbGlzdCBoYXMgbG9hZGVkIOKAlCBoZW5jZSB0aGUgb2JzZXJ2YWJsZSBmb3JtIG9mIGBkZWZhdWx0YC5cbiAgICBkZWZhdWx0OiBwaWNrcz8ubGVuZ3RoXG4gICAgICA/ICgpID0+IHJlc29sdmVPcHRpb25WYWx1ZXMob3B0aW9ucyQsIHBpY2tzLCAodmFsdWUpID0+IG9wdGlvbnMubGFiZWwoZ3JvdXAuaWQsIHZhbHVlKSlcbiAgICAgICAgLnBpcGUobWFwKChzZWxlY3RlZCkgPT4gKGV4Y2x1ZGluZyA/IHsgZXhjbHVkZTogdHJ1ZSwgc2VsZWN0ZWQgfSA6IHNlbGVjdGVkKSkpXG4gICAgICA6IHVuZGVmaW5lZCxcbiAgfTtcbn1cblxuLy8gVGhlIHBhbmVsIHJvdyBvZiBhIHNlbGVjdCdzIGxhdGVzdCBsaXN0OiBhIGZhaWx1cmUgZmlyc3QsIHRoZW4gYSBjdXQgbGlzdC5cbmZ1bmN0aW9uIG9wdGlvbnNOb3RlKG9wdGlvbnM6IFJlcG9ydEZpbHRlck9wdGlvbnNTZXJ2aWNlLCBncm91cElkOiBudW1iZXIpOiBzdHJpbmcgfCBudWxsIHtcbiAgaWYgKG9wdGlvbnMuZmFpbGVkKGdyb3VwSWQpKSB7XG4gICAgcmV0dXJuIE9QVElPTlNfRkFJTEVEX05PVEU7XG4gIH1cblxuICByZXR1cm4gb3B0aW9ucy50cnVuY2F0ZWQoZ3JvdXBJZCkgPyBPUFRJT05TX1RSVU5DQVRFRF9OT1RFIDogbnVsbDtcbn1cblxuLy8gQSBudW1iZXIgcmFuZ2UncyBsb3cgYW5kIGhpZ2ggZW5kcywgZWl0aGVyIG9uZSBvcGVuLiAwIGlzIGFuIGVuZCBsaWtlIGFueVxuLy8gb3RoZXIuIEl0cyBjaGlwIHJlYWRzIGFzIHRoZSBleHBvcnQgbGluZXMgZG8gKCdBbW91bnQ6IDAgb3IgbW9yZScsXG4vLyAnQW1vdW50OiAwIHRvIDEwJyk6IHRoZSBlbmRzIGFyZSByZWFkIG9mZiB0aGUgaXRlbSdzIHF1ZXJ5IHRoZSB3YXkgdGhlXG4vLyBiYXIncyBjaGFuZ2UgcmVhZHMgdGhlbSwgYW5kIHdvcmRlZCBpbiB0aGUgcmVwb3J0J3MgbG9jYWxlLlxuZnVuY3Rpb24gbnVtYmVyUmFuZ2VGaWx0ZXJJdGVtKFxuICBncm91cDogUmVwb3J0RmlsdGVyR3JvdXAsXG4gIGxhYmVsOiBzdHJpbmcsXG4gIHJlcG9ydDogUmVwb3J0IHwgbnVsbCxcbiAgaW5pdGlhbD86IEZpbHRlckdyb3VwVmFsdWUsXG4pOiBJRmlsdGVyQ29uZmlnSXRlbSB7XG4gIGNvbnN0IG5hbWUgPSBncm91cEl0ZW1OYW1lKGdyb3VwKTtcbiAgY29uc3QgbWluID0gaW5pdGlhbD8ubWluID8/IHVuZGVmaW5lZDtcbiAgY29uc3QgbWF4ID0gaW5pdGlhbD8ubWF4ID8/IHVuZGVmaW5lZDtcbiAgY29uc3QgbG9jYWxlID0gcmVzb2x2ZUZvcm1hdENvbnRleHQocmVwb3J0ID8/IHt9KS5sb2NhbGU7XG5cbiAgcmV0dXJuIHtcbiAgICBuYW1lLFxuICAgIHR5cGU6IEl0ZW1UeXBlLlJhbmdlLFxuICAgIGxhYmVsLFxuICAgIGRlZmF1bHQ6IG1pbiAhPT0gdW5kZWZpbmVkIHx8IG1heCAhPT0gdW5kZWZpbmVkID8geyBtaW4sIG1heCB9IDogdW5kZWZpbmVkLFxuICAgIGNoaXBUZXh0OiAoaXRlbSkgPT4gZmlsdGVyTGluZVRleHQoXG4gICAgICB7IGxhYmVsLCBsZXZlbDogZ3JvdXAubGV2ZWwgfSxcbiAgICAgIG51bWJlclJhbmdlRnJvbVF1ZXJ5KGl0ZW0ucXVlcnksIG5hbWUpLFxuICAgICAgeyBsb2NhbGUgfSxcbiAgICAgICdjaGlwJyxcbiAgICApLFxuICB9O1xufVxuXG5mdW5jdGlvbiBrZXl3b3JkRmlsdGVySXRlbShuYW1lOiBzdHJpbmcsIGxhYmVsOiBzdHJpbmcsIGluaXRpYWw/OiBGaWx0ZXJHcm91cFZhbHVlKTogSUZpbHRlckNvbmZpZ0l0ZW0ge1xuICByZXR1cm4ge1xuICAgIG5hbWUsXG4gICAgdHlwZTogSXRlbVR5cGUuS2V5d29yZCxcbiAgICBsYWJlbCxcbiAgICBkZWZhdWx0OiBpbml0aWFsPy52YWx1ZSxcbiAgfTtcbn1cblxuLy8gVGhlIGdyb3VwcyBhIG1hdGNoIG9mICdhbnknIGNvbWJpbmVzOiByZXBvcnQgYmFyIGdyb3VwcyAoYSBwYWdlIGdyb3VwIG9uXG4vLyBpdHMgb3duIHBhZ2Ugb25seSkgdGhhdCBhIHZpZXdlciBwaWNrcyB2YWx1ZXMsIHRleHQgb3IgYSBudW1iZXIgcmFuZ2UgaW4uXG4vLyBEYXRlcywgdGlsZS1vbmx5IGdyb3VwcyBhbmQgdGhlIGNyb3NzLWZpbHRlciBhbHdheXMgbmFycm93IG9uIHRoZWlyIG93bi5cbi8vIFRoZSBzZXJ2ZXIgaG9sZHMgdGhlIHNhbWUgcnVsZSBhbmQgY2hlY2tzIGV2ZXJ5IGlkIGl0IGlzIHNlbnQuXG5jb25zdCBNQVRDSF9BTllfTEVWRUxTOiByZWFkb25seSBSZXBvcnRGaWx0ZXJMZXZlbFtdID0gWydyZXBvcnQnLCAnYm90aCcsICdwYWdlJ107XG5jb25zdCBNQVRDSF9BTllfVFlQRVM6IHJlYWRvbmx5IFJlcG9ydEZpbHRlclR5cGVbXSA9IFsnc2VsZWN0JywgJ2tleXdvcmQnLCAnbnVtYmVyUmFuZ2UnXTtcblxuLy8gV2hldGhlciBhIGdyb3VwIGpvaW5zIGEgbWF0Y2ggb2YgJ2FueScgb24gcGFnZSBgcGFnZUlkYC5cbmV4cG9ydCBmdW5jdGlvbiBpc01hdGNoQW55R3JvdXAoZ3JvdXA6IFJlcG9ydEZpbHRlckdyb3VwLCBwYWdlSWQ6IG51bWJlciB8IG51bGwpOiBib29sZWFuIHtcbiAgcmV0dXJuIE1BVENIX0FOWV9MRVZFTFMuaW5jbHVkZXMoZ3JvdXAubGV2ZWwpXG4gICAgJiYgTUFUQ0hfQU5ZX1RZUEVTLmluY2x1ZGVzKGdyb3VwLnR5cGUpXG4gICAgJiYgKGdyb3VwLmxldmVsICE9PSAncGFnZScgfHwgKCEhcGFnZUlkICYmIGdyb3VwLnBhZ2VJZCA9PT0gcGFnZUlkKSk7XG59XG5cbi8vIFRoZSByZXBvcnQgYmFyJ3MgZ3JvdXBzIGluIHRoZWlyIHNhdmVkIG9yZGVyOiB0aGUgcmVwb3J0IGFuZCBib3RoIGdyb3Vwcyxcbi8vIGFuZCB0aGUgcGFnZSBncm91cHMgb2YgdGhlIHBhZ2Ugb24gc2NyZWVuIChgcGFnZUlkYCkuXG5leHBvcnQgZnVuY3Rpb24gcmVwb3J0QmFyR3JvdXBzKHJlcG9ydDogUmVwb3J0IHwgbnVsbCwgcGFnZUlkOiBudW1iZXIgfCBudWxsKTogUmVwb3J0RmlsdGVyR3JvdXBbXSB7XG4gIHJldHVybiAocmVwb3J0Py5maWx0ZXJHcm91cHMgPz8gW10pXG4gICAgLmZpbHRlcigoZ3JvdXApID0+IGdyb3VwLmxldmVsID09PSAncmVwb3J0JyB8fCBncm91cC5sZXZlbCA9PT0gJ2JvdGgnXG4gICAgICB8fCAoZ3JvdXAubGV2ZWwgPT09ICdwYWdlJyAmJiAhIXBhZ2VJZCAmJiBncm91cC5wYWdlSWQgPT09IHBhZ2VJZCkpXG4gICAgLnNvcnQoKGEsIGIpID0+IGEub3JkZXIgLSBiLm9yZGVyKTtcbn1cblxuLy8gV2hldGhlciB0aGUgcmVwb3J0IGhhcyBhIGdyb3VwIHNob3duIG9uIG9uZSBwYWdlIG9ubHksIHNvIGl0cyByZXBvcnQgYmFyXG4vLyBjaGFuZ2VzIHdpdGggdGhlIHBhZ2Ugb24gc2NyZWVuLlxuZXhwb3J0IGZ1bmN0aW9uIGhhc1BhZ2VHcm91cChyZXBvcnQ6IFJlcG9ydCB8IG51bGwpOiBib29sZWFuIHtcbiAgcmV0dXJuIChyZXBvcnQ/LmZpbHRlckdyb3VwcyA/PyBbXSkuc29tZSgoZ3JvdXApID0+IGdyb3VwLmxldmVsID09PSAncGFnZScpO1xufVxuXG4vLyBUaGUgcXVlcnkga2V5IG9mIHRoZSByZXBvcnQgYmFyJ3MgTWF0Y2ggY29udHJvbC4gTm90IGEgZmlsdGVyIGdyb3VwOiBpdFxuLy8gc2F5cyBob3cgdGhlIGdyb3VwcyBjb21iaW5lLCBzbyBpdCBpcyByZWFkIHN0cmFpZ2h0IG9mZiB0aGUgY2hhbmdlIHF1ZXJ5LlxuZXhwb3J0IGNvbnN0IE1BVENIX0lURU0gPSAnbWF0Y2gnO1xuXG5jb25zdCBNQVRDSF9PUFRJT05TOiB7IG5hbWU6IHN0cmluZzsgdmFsdWU6IFJlcG9ydEZpbHRlck1hdGNoIH1bXSA9IFtcbiAgeyBuYW1lOiAnQWxsIGZpbHRlcnMnLCB2YWx1ZTogJ2FsbCcgfSxcbiAgeyBuYW1lOiAnQW55IGZpbHRlcicsIHZhbHVlOiAnYW55JyB9LFxuXTtcblxuLy8gVGhlIHJlcG9ydCBiYXIncyBNYXRjaCBjb250cm9sLCBsYXN0IGluIHRoZSBiYXIsIG9yIG51bGwgd2hlbiBpdCB3b3VsZCBkb1xuLy8gbm90aGluZzogdGhlIHNlcnZlciBtdXN0IHNlcnZlIG1hdGNoQW55LCBhbmQgdGhlIGJhciBtdXN0IGhvbGQgdHdvIG9yIG1vcmVcbi8vIGdyb3VwcyB0aGF0IGNvbWJpbmUgKGFuICdhbnknIG92ZXIgb25lIGdyb3VwIGlzIHRoYXQgZ3JvdXApLlxuZXhwb3J0IGZ1bmN0aW9uIG1hdGNoRmlsdGVySXRlbShcbiAgcmVwb3J0OiBSZXBvcnQgfCBudWxsLFxuICBncm91cHM6IFJlcG9ydEZpbHRlckdyb3VwW10sXG4gIHBhZ2VJZDogbnVtYmVyIHwgbnVsbCxcbiAgbWF0Y2g6IFJlcG9ydEZpbHRlck1hdGNoLFxuKTogSUZpbHRlckNvbmZpZ0l0ZW0gfCBudWxsIHtcbiAgY29uc3QgZWxpZ2libGUgPSBncm91cHMuZmlsdGVyKChncm91cCkgPT4gaXNNYXRjaEFueUdyb3VwKGdyb3VwLCBwYWdlSWQpKTtcblxuICBpZiAoIXJlcG9ydD8udmlld2VyRmVhdHVyZXM/LmluY2x1ZGVzKCdtYXRjaEFueScpIHx8IGVsaWdpYmxlLmxlbmd0aCA8IDIpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgbmFtZTogTUFUQ0hfSVRFTSxcbiAgICB0eXBlOiBJdGVtVHlwZS5TZWxlY3QsXG4gICAgbGFiZWw6ICdNYXRjaCcsXG4gICAgbXVsdGlwbGU6IGZhbHNlLFxuICAgIHZhbHVlczogKCkgPT4gTUFUQ0hfT1BUSU9OUyxcbiAgICBkZWZhdWx0OiBtYXRjaCxcbiAgICAvLyAnTWF0Y2g6IGFueSBmaWx0ZXInIG9yICdNYXRjaDogYWxsIGZpbHRlcnMnLCBpbiB0aGUgZXhwb3J0IGxpbmVzJyB3b3Jkcy5cbiAgICBjaGlwVGV4dDogKGl0ZW0pID0+IG1hdGNoTGluZVRleHQobWF0Y2hGcm9tUXVlcnkoaXRlbS5xdWVyeSksICdjaGlwJyksXG4gIH07XG59XG5cbi8vIFRoZSBtYXRjaCBhIGNoYW5nZSBxdWVyeSBvZiBhIGJhciB3aXRoIHRoZSBNYXRjaCBjb250cm9sIGFza3MgZm9yLlxuZXhwb3J0IGZ1bmN0aW9uIG1hdGNoRnJvbVF1ZXJ5KHF1ZXJ5OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPik6IFJlcG9ydEZpbHRlck1hdGNoIHtcbiAgcmV0dXJuIHF1ZXJ5Py5bTUFUQ0hfSVRFTV0gPT09ICdhbnknID8gJ2FueScgOiAnYWxsJztcbn1cblxuLy8gVGhlIHF1ZXJ5IGtleSBvZiBhIGxpc3QncyBzZWFyY2ggYm94IGluIGl0cyBjb21wb25lbnQgaGVhZGVyLiBGaXhlZCByYXRoZXJcbi8vIHRoYW4gZGVyaXZlZCBmcm9tIGFuIGlkIGJlY2F1c2UgYSBoZWFkZXIgaG9sZHMgYXQgbW9zdCBvbmUsIGFuZCBpdCBpcyBOT1QgYVxuLy8gZmlsdGVyIGdyb3VwOiBpdHMgdGV4dCBuYXJyb3dzIHRoYXQgbGlzdCBhbG9uZSwgc28gaXQgaXMgcmVhZCBzdHJhaWdodCBvZmZcbi8vIHRoZSBjaGFuZ2UgcXVlcnkgYW5kIHRyYXZlbHMgYXMgdGhlIGxpc3QncyBvd24gYHN0YXRlLnNlYXJjaGAuXG5leHBvcnQgY29uc3QgTElTVF9TRUFSQ0hfSVRFTSA9ICdsaXN0U2VhcmNoJztcblxuLy8gVGhlIGxvbmdlc3Qgc2VhcmNoIHRoZSBzZXJ2ZXIgYXBwbGllcyAoUmVwb3J0UXVlcnlSdW5uZXI6Ok1BWF9TRUFSQ0hfTEVOR1RIKS5cbi8vIFRoZSB2aWV3ZXIgY3V0cyB0aGUgdGV4dCB0byBpdCB0b28sIHNvIHRoZSBzdGF0ZSwgdGhlIHJlcXVlc3QgYW5kIHRoZSBleHBvcnRcbi8vIHRpdGxlIGFsbCBjYXJyeSB0aGUgdGV4dCB0aGF0IHdhcyBhY3R1YWxseSBzZWFyY2hlZC5cbmV4cG9ydCBjb25zdCBMSVNUX1NFQVJDSF9NQVhfTEVOR1RIID0gMTAwO1xuXG4vLyBUaGUgZnMtZmlsdGVyIGNvbmZpZyBpdGVtIGZvciBhIGxpc3QncyBzZWFyY2ggYm94LCBzZWVkZWQgd2l0aCB0aGUgdGV4dCB0aGVcbi8vIHZpZXdlciBsYXN0IHNlYXJjaGVkLiBmcy1maWx0ZXIgc2hvd3Mgb25lIHNlYXJjaCBib3ggcGVyIGJhciAoaXRzIGxhc3Rcbi8vIGtleXdvcmQgaXRlbSksIHNvIHRoZSBjYWxsZXIgYWRkcyB0aGlzIG9ubHkgdG8gYSBoZWFkZXIgd2l0aCBubyBrZXl3b3JkXG4vLyBncm91cCBvZiBpdHMgb3duLlxuZXhwb3J0IGZ1bmN0aW9uIGxpc3RTZWFyY2hJdGVtKHZhbHVlOiBzdHJpbmcgfCBudWxsKTogSUZpbHRlckNvbmZpZ0l0ZW0ge1xuICByZXR1cm4ge1xuICAgIHR5cGU6IEl0ZW1UeXBlLktleXdvcmQsXG4gICAgbmFtZTogTElTVF9TRUFSQ0hfSVRFTSxcbiAgICBsYWJlbDogJ1NlYXJjaCcsXG4gICAgZGVmYXVsdDogdmFsdWUgPz8gdW5kZWZpbmVkLFxuICB9O1xufVxuXG4vLyBXaGV0aGVyIHRoZSByZXBvcnQgaGFzIGEgY2hhcnQgdGhlIGdyb3VwLWJ5IGNvbnRyb2wgY2FuIHJlLWJ1Y2tldC4gQSB0aW1lXG4vLyB4LWF4aXMgaXMgdGhlIHdob2xlIHF1YWxpZmljYXRpb246IHRoZSBjb250cm9sIGNoYW5nZXMgdGhlIGdyYWluIG9mIHRoYXRcbi8vIGF4aXMsIGFuZCBhIGNhdGVnb3J5IGF4aXMgaGFzIG5vIGdyYWluIHRvIGNoYW5nZS5cbmV4cG9ydCBmdW5jdGlvbiBoYXNUaW1lU2VyaWVzQ2hhcnQocmVwb3J0OiBSZXBvcnQgfCBudWxsKTogYm9vbGVhbiB7XG4gIHJldHVybiAocmVwb3J0Py5wYWdlcyA/PyBbXSkuc29tZSgocGFnZSkgPT4gKHBhZ2UuY29tcG9uZW50cyA/PyBbXSkuc29tZSgoY29tcG9uZW50KSA9PlxuICAgIGNvbXBvbmVudC50eXBlID09PSAnY2hhcnQnICYmIGNvbXBvbmVudC5jb25maWc/LnhBeGlzPy5raW5kID09PSAndGltZScpKTtcbn1cblxuLy8gVGhlIGdyYWlucyB0aGUgcmVwb3J0J3MgZ3JvdXAtYnkgY29udHJvbCBvZmZlcnMsIG5hbWVkIGZvciB0aGUgdmlld2VyLiBXSElDSFxuLy8gb2YgdGhlbSBjb21lcyBmcm9tIHRoZSByZXBvcnQ7IGhvdyB0aGV5IHJlYWQgY29tZXMgZnJvbSBHUkFOVUxBUklUWV9PUFRJT05TLlxuLy8gQW4gZW1wdHkgc3RvcmVkIGxpc3QgbWVhbnMgZXZlcnkgZ3JhaW4g4oCUIHRoZSBzYW1lIHJ1bGUgdGhlIGJhY2tlbmQgYXBwbGllcy5cbmZ1bmN0aW9uIGdyb3VwQnlPcHRpb25zKHJlcG9ydDogUmVwb3J0KTogeyB2YWx1ZTogQ2hhcnRHcmFudWxhcml0eTsgbmFtZTogc3RyaW5nIH1bXSB7XG4gIGNvbnN0IGdyYW51bGFyaXRpZXMgPSByZXBvcnQuY29uZmlnPy5ncm91cEJ5Py5ncmFudWxhcml0aWVzID8/IFtdO1xuXG4gIHJldHVybiBncmFudWxhcml0aWVzLmxlbmd0aFxuICAgID8gR1JBTlVMQVJJVFlfT1BUSU9OUy5maWx0ZXIoKG9wdGlvbikgPT4gZ3JhbnVsYXJpdGllcy5pbmNsdWRlcyhvcHRpb24udmFsdWUpKVxuICAgIDogR1JBTlVMQVJJVFlfT1BUSU9OUztcbn1cblxuLy8gV2hldGhlciBhIGdyYWluIGlzIG9uZSB0aGUgcmVwb3J0J3MgY29udHJvbCBzdGlsbCBvZmZlcnMuIEEgZ3JhaW4gaXQgZG9lc24ndFxuLy8gY2Fubm90IHN0YXkgaW4gZWZmZWN0OiB0aGUgYWdlbnQgY2FuIG5hcnJvdyB0aGUgbGlzdCBhdCBhbnkgdGltZSwgYW5kIGEgY2hhcnRcbi8vIGxlZnQgYnVja2V0aW5nIGF0IGEgZHJvcHBlZCBncmFpbiBpcyBvbmUgdGhlIHZpZXdlciBjYW4gbmVpdGhlciBzZWUgbm9yIGNoYW5nZS5cbmV4cG9ydCBmdW5jdGlvbiBpc0dyYW51bGFyaXR5T2ZmZXJlZChyZXBvcnQ6IFJlcG9ydCwgZ3JhbnVsYXJpdHk6IENoYXJ0R3JhbnVsYXJpdHkgfCBudWxsKTogYm9vbGVhbiB7XG4gIHJldHVybiAhZ3JhbnVsYXJpdHkgfHwgZ3JvdXBCeU9wdGlvbnMocmVwb3J0KS5zb21lKChvcHRpb24pID0+IG9wdGlvbi52YWx1ZSA9PT0gZ3JhbnVsYXJpdHkpO1xufVxuXG4vLyBUaGUgZnMtZmlsdGVyIGNvbmZpZyBpdGVtIGZvciB0aGUgcmVwb3J0J3MgZ3JvdXAtYnkgY29udHJvbCwgb3IgbnVsbCB3aGVuIHRoZVxuLy8gcmVwb3J0IGhhcyBub25lIHRvIHNob3cuXG4vL1xuLy8gSXQgbGVhZHMgdGhlIHNhbWUgYmFyIHRoZSBmaWx0ZXJzIHJlbmRlciBpbiwgYnV0IGl0IGlzIE5PVCBvbmU6IGEgZmlsdGVyXG4vLyBuYXJyb3dzIFdISUNIIHJvd3MgYXJlIGNvdW50ZWQsIHRoaXMgY2hhbmdlcyBob3cgdGhlIHN1cnZpdmluZyByb3dzIGFyZVxuLy8gQlVDS0VURUQg4oCUIGFuZCBpdCBjb21lcyBmaXJzdCBiZWNhdXNlIHRoZSBncmFpbiBpcyB3aGF0IGEgdmlld2VyIHNldHRsZXNcbi8vIGJlZm9yZSBkZWNpZGluZyB3aGljaCByb3dzIHRoZXkgd2FudC5cbi8vIFBpY2tpbmcgYSBncmFpbiBzZXRzIGEgc2Vzc2lvbi13aWRlIG92ZXJyaWRlIHRoYXQgcmlkZXMgYWxvbmcgaW4gZWFjaCBjaGFydCdzXG4vLyBkYXRhIHJlcXVlc3QsIHNvIHRoZSBjaGFydHMgdGhlbXNlbHZlcyBhcmUgbmV2ZXIgcmV3cml0dGVuLlxuZXhwb3J0IGZ1bmN0aW9uIGdyb3VwQnlGaWx0ZXJJdGVtKFxuICByZXBvcnQ6IFJlcG9ydCxcbiAgaW5pdGlhbD86IENoYXJ0R3JhbnVsYXJpdHkgfCBudWxsLFxuKTogSUZpbHRlckNvbmZpZ0l0ZW0gfCBudWxsIHtcbiAgY29uc3QgZ3JvdXBCeSA9IHJlcG9ydC5jb25maWc/Lmdyb3VwQnk7XG5cbiAgLy8gT25seSBhbiBFWFBMSUNJVCBmYWxzZSBoaWRlcyB0aGUgY29udHJvbC4gQW4gYWJzZW50IGJsb2NrIG1lYW5zIGEgcmVwb3J0XG4gIC8vIHNlcnZlZCBieSBhIGJ1aWxkIHRoYXQgcHJlZGF0ZXMgdGhlIGNvbnRyb2wgYmVpbmcgc3RvcmVkLCBhbmQgZXZlcnkgb25lIG9mXG4gIC8vIHRob3NlIGhhZCBvbmUg4oCUIHRoZSBiYWNrZW5kIHJlc29sdmVzIGl0IHRoZSBzYW1lIHdheSAoUmVwb3J0R3JvdXBCeSkuXG4gIGlmIChncm91cEJ5Py5lbmFibGVkID09PSBmYWxzZSB8fCAhaGFzVGltZVNlcmllc0NoYXJ0KHJlcG9ydCkpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIGNvbnN0IHZhbHVlcyA9IGdyb3VwQnlPcHRpb25zKHJlcG9ydCk7XG5cbiAgcmV0dXJuIHtcbiAgICBuYW1lOiBHUk9VUF9CWV9JVEVNLFxuICAgIHR5cGU6IEl0ZW1UeXBlLlNlbGVjdCxcbiAgICBsYWJlbDogZ3JvdXBCeT8ubGFiZWwgfHwgJ0dyb3VwIEJ5JyxcbiAgICBtdWx0aXBsZTogZmFsc2UsXG4gICAgdmFsdWVzOiAoKSA9PiB2YWx1ZXMsXG4gICAgZGVmYXVsdDogaXNHcmFudWxhcml0eU9mZmVyZWQocmVwb3J0LCBpbml0aWFsID8/IG51bGwpID8gKGluaXRpYWwgPz8gdW5kZWZpbmVkKSA6IHVuZGVmaW5lZCxcbiAgfTtcbn1cblxuLy8gVGhlIGdyb3VwLWJ5IGNvbnRyb2wncyBjb250cmlidXRpb24gdG8gdGhlIHRvb2xiYXIncyBmcy1maWx0ZXIga2V5LiBmcy1maWx0ZXJcbi8vIHJlYWRzIGl0cyBjb25maWcgb25jZSBhdCBpbml0LCBhbmQgdGhlIGFnZW50IGNhbiBjaGFuZ2UgdGhlIGNvbnRyb2wncyBsYWJlbFxuLy8gb3IgdGhlIGdyYWlucyBpdCBvZmZlcnMg4oCUIHdpdGhvdXQgdGhvc2UgaW4gdGhlIGtleSB0aGUgYmFyIGtlZXBzIHJlbmRlcmluZ1xuLy8gdGhlIGNvbnRyb2wgaXQgd2FzIGNyZWF0ZWQgd2l0aCB1bnRpbCBhIGZ1bGwgcGFnZSByZWxvYWQuXG5leHBvcnQgZnVuY3Rpb24gZ3JvdXBCeVNpZ25hdHVyZShyZXBvcnQ6IFJlcG9ydCB8IG51bGwpOiBzdHJpbmcge1xuICBpZiAoIXJlcG9ydCB8fCAhZ3JvdXBCeUZpbHRlckl0ZW0ocmVwb3J0KSkge1xuICAgIHJldHVybiAnJztcbiAgfVxuXG4gIGNvbnN0IGdyb3VwQnkgPSByZXBvcnQuY29uZmlnPy5ncm91cEJ5O1xuXG4gIHJldHVybiBbJ2dyb3VwQnknLCBncm91cEJ5Py5sYWJlbCA/PyAnJywgKGdyb3VwQnk/LmdyYW51bGFyaXRpZXMgPz8gW10pLmpvaW4oJywnKV0uam9pbignOicpO1xufVxuXG4vLyBSZWFkIGFuIGZzLWZpbHRlciBjaGFuZ2UgcXVlcnkgaW50byBwZXItZ3JvdXAgdmFsdWVzLiBSZXR1cm5zIG9uZSBlbnRyeSBwZXJcbi8vIGdyb3VwIHdpdGggdGhlIHZhbHVlIHRvIHN0b3JlIChvciBudWxsIHRvIGNsZWFyKSDigJQgY2FsbGVycyBmZWVkIHRoZXNlIHRvXG4vLyBSZXBvcnRGaWx0ZXJTdGF0ZVNlcnZpY2Uuc2V0VmFsdWUuXG5leHBvcnQgZnVuY3Rpb24gZ3JvdXBWYWx1ZXNGcm9tUXVlcnkoXG4gIHF1ZXJ5OiBSZWNvcmQ8c3RyaW5nLCBhbnk+LFxuICBncm91cHM6IFJlcG9ydEZpbHRlckdyb3VwW10sXG4pOiB7IGdyb3VwSWQ6IG51bWJlcjsgdmFsdWU6IEZpbHRlckdyb3VwVmFsdWUgfCBudWxsIH1bXSB7XG4gIHJldHVybiBncm91cHMubWFwKChncm91cCkgPT4ge1xuICAgIGNvbnN0IG5hbWUgPSBncm91cEl0ZW1OYW1lKGdyb3VwKTtcblxuICAgIHN3aXRjaCAoZ3JvdXAudHlwZSkge1xuICAgICAgY2FzZSAnZGF0ZVJhbmdlJzpcbiAgICAgICAgcmV0dXJuIHsgZ3JvdXBJZDogZ3JvdXAuaWQsIHZhbHVlOiBkYXRlUmFuZ2VGcm9tUXVlcnkocXVlcnksIG5hbWUpIH07XG5cbiAgICAgIGNhc2UgJ3NlbGVjdCc6XG4gICAgICAgIHJldHVybiB7IGdyb3VwSWQ6IGdyb3VwLmlkLCB2YWx1ZTogc2VsZWN0RnJvbVF1ZXJ5KHF1ZXJ5LCBuYW1lKSB9O1xuXG4gICAgICBjYXNlICdudW1iZXJSYW5nZSc6XG4gICAgICAgIHJldHVybiB7IGdyb3VwSWQ6IGdyb3VwLmlkLCB2YWx1ZTogbnVtYmVyUmFuZ2VGcm9tUXVlcnkocXVlcnksIG5hbWUpIH07XG5cbiAgICAgIGRlZmF1bHQ6IHtcbiAgICAgICAgY29uc3Qga2V5d29yZCA9IFN0cmluZyhxdWVyeVtuYW1lXSA/PyAnJykudHJpbSgpO1xuXG4gICAgICAgIHJldHVybiB7IGdyb3VwSWQ6IGdyb3VwLmlkLCB2YWx1ZToga2V5d29yZCA/IHsgdmFsdWU6IGtleXdvcmQgfSA6IG51bGwgfTtcbiAgICAgIH1cbiAgICB9XG4gIH0pO1xufVxuXG4vLyBBIGRhdGUgcmFuZ2UncyBkYXlzICg8bmFtZT5Gcm9tLCA8bmFtZT5UbykuXG5mdW5jdGlvbiBkYXRlUmFuZ2VGcm9tUXVlcnkocXVlcnk6IFJlY29yZDxzdHJpbmcsIGFueT4sIG5hbWU6IHN0cmluZyk6IEZpbHRlckdyb3VwVmFsdWUgfCBudWxsIHtcbiAgY29uc3Qgc3RhcnQgPSBxdWVyeVtpdGVtUmFuZ2VOYW1lKG5hbWUsICdmcm9tJyldO1xuICBjb25zdCBlbmQgPSBxdWVyeVtpdGVtUmFuZ2VOYW1lKG5hbWUsICd0bycpXTtcblxuICBpZiAoIXN0YXJ0ICYmICFlbmQpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIHJldHVybiB7IHN0YXJ0OiBzdGFydCB8fCBudWxsLCBlbmQ6IGVuZCB8fCBudWxsIH07XG59XG5cbi8vIEEgc2VsZWN0J3MgcGlja3M6IGtlcHQgKDxuYW1lPiksIG9yIGxlZnQgb3V0IHdoaWxlIGl0cyBleGNsdWRlIHJvdyBpcyBvblxuLy8gKGV4Y2x1ZGU8TmFtZT4pLlxuZnVuY3Rpb24gc2VsZWN0RnJvbVF1ZXJ5KHF1ZXJ5OiBSZWNvcmQ8c3RyaW5nLCBhbnk+LCBuYW1lOiBzdHJpbmcpOiBGaWx0ZXJHcm91cFZhbHVlIHwgbnVsbCB7XG4gIGNvbnN0IGV4Y2x1ZGVWYWx1ZXMgPSBzZWxlY3RRdWVyeVZhbHVlcyhxdWVyeVtnZXRFeGNsdWRlTmFtZShuYW1lKV0pO1xuICBpZiAoZXhjbHVkZVZhbHVlcy5sZW5ndGgpIHtcbiAgICByZXR1cm4geyBleGNsdWRlVmFsdWVzIH07XG4gIH1cblxuICBjb25zdCB2YWx1ZXMgPSBzZWxlY3RRdWVyeVZhbHVlcyhxdWVyeVtuYW1lXSk7XG5cbiAgcmV0dXJuIHZhbHVlcy5sZW5ndGggPyB7IHZhbHVlcyB9IDogbnVsbDtcbn1cblxuLy8gQSBudW1iZXIgcmFuZ2UncyBlbmRzICg8bmFtZT5NaW4sIDxuYW1lPk1heCkuIEFuIGVuZCBsZWZ0IGVtcHR5IGlzIG9wZW4uXG5mdW5jdGlvbiBudW1iZXJSYW5nZUZyb21RdWVyeShxdWVyeTogUmVjb3JkPHN0cmluZywgYW55PiwgbmFtZTogc3RyaW5nKTogRmlsdGVyR3JvdXBWYWx1ZSB8IG51bGwge1xuICBjb25zdCBtaW4gPSByYW5nZUJvdW5kKHF1ZXJ5W2l0ZW1SYW5nZU5hbWUobmFtZSwgJ21pbicpXSk7XG4gIGNvbnN0IG1heCA9IHJhbmdlQm91bmQocXVlcnlbaXRlbVJhbmdlTmFtZShuYW1lLCAnbWF4JyldKTtcblxuICBpZiAobWluID09PSBudWxsICYmIG1heCA9PT0gbnVsbCkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgcmV0dXJuIHtcbiAgICAuLi4obWluICE9PSBudWxsID8geyBtaW4gfSA6IHt9KSxcbiAgICAuLi4obWF4ICE9PSBudWxsID8geyBtYXggfSA6IHt9KSxcbiAgfTtcbn1cblxuLy8gT25lIGVuZCBvZiBhIG51bWJlciByYW5nZSBhcyBmcy1maWx0ZXIncyBSYW5nZSBzZW5kcyBpdDogdGhlIHRleHQgdHlwZWQgaW5cbi8vIGl0cyBpbnB1dC4gTnVtYmVyKCkgcmVhZHMgYW55IG5vbi1lbXB0eSB0ZXh0LCBzbyAnMCcgaXMgdGhlIGVuZCAwOyBlbXB0eSBvclxuLy8gdW5yZWFkYWJsZSB0ZXh0IGlzIGFuIG9wZW4gZW5kLlxuZnVuY3Rpb24gcmFuZ2VCb3VuZChyYXc6IHVua25vd24pOiBudW1iZXIgfCBudWxsIHtcbiAgY29uc3QgdGV4dCA9IHR5cGVvZiByYXcgPT09ICdudW1iZXInID8gU3RyaW5nKHJhdykgOiBTdHJpbmcocmF3ID8/ICcnKS50cmltKCk7XG4gIGNvbnN0IG51bWJlciA9IHRleHQgPT09ICcnID8gTmFOIDogTnVtYmVyKHRleHQpO1xuXG4gIHJldHVybiBOdW1iZXIuaXNGaW5pdGUobnVtYmVyKSA/IG51bWJlciA6IG51bGw7XG59XG5cbi8vIEEgZ3JvdXAgdmFsdWUgYXMgdGV4dCwgdGhlIHNhbWUgZm9yIHRoZSBzYW1lIHZhbHVlIHdoYXRldmVyIGl0cyBzb3VyY2U6XG4vLyBkYXlzIGFzIGNhbGVuZGFyIGRheXMsIHBpY2tzIGFuZCBlbmRzIGFzIHRleHQsIGtleXdvcmQgdGV4dCB0cmltbWVkLiBUaGVcbi8vIHZhbHVlIGEgdGlsZSBoZWFkZXIgd2FzIGJ1aWx0IHdpdGggaXMga2V5ZWQgb24gaXQsIHNvIGEgaGVhZGVyIGlzIGNyZWF0ZWRcbi8vIGFnYWluIHdoZW4gYW5vdGhlciBiYXIgY2hhbmdlcyBhIGdyb3VwIGl0IHNob3dzLlxuZXhwb3J0IGZ1bmN0aW9uIGdyb3VwVmFsdWVTaWduYXR1cmUodmFsdWU6IEZpbHRlckdyb3VwVmFsdWUgfCBudWxsIHwgdW5kZWZpbmVkKTogc3RyaW5nIHtcbiAgaWYgKCF2YWx1ZSkge1xuICAgIHJldHVybiAnJztcbiAgfVxuXG4gIHJldHVybiBKU09OLnN0cmluZ2lmeShbXG4gICAgZGF0ZUJvdW5kU3RyaW5nKHZhbHVlLnN0YXJ0KSA/PyAnJyxcbiAgICBkYXRlQm91bmRTdHJpbmcodmFsdWUuZW5kKSA/PyAnJyxcbiAgICAodmFsdWUudmFsdWVzID8/IFtdKS5tYXAoU3RyaW5nKSxcbiAgICAodmFsdWUuZXhjbHVkZVZhbHVlcyA/PyBbXSkubWFwKFN0cmluZyksXG4gICAgKHZhbHVlLnZhbHVlID8/ICcnKS50cmltKCksXG4gICAgdmFsdWUubWluID8/ICcnLFxuICAgIHZhbHVlLm1heCA/PyAnJyxcbiAgXSk7XG59XG5cbi8vIGZzLWZpbHRlcidzIEF1dG9Db21wbGV0ZUNoaXBzIHNlcmlhbGlzZXMgYSBtdWx0aS1zZWxlY3QgaW50byBPTkUgcXVlcnkgdmFsdWU6XG4vLyB0aGUgc2VsZWN0ZWQgdmFsdWVzIGpvaW5lZCBieSBcIixcIiAoaXRzIGBxdWVyeWAgZ2V0dGVyIGRvZXMgYC5tYXAodmFsdWUpLmpvaW4oJywnKWApLlxuLy8gU28gYSAyKyBzZWxlY3Rpb24gYXJyaXZlcyBhcyB0aGUgc3RyaW5nIFwiYSxiXCIsIG5vdCBhbiBhcnJheSDigJQgc3BsaXR0aW5nIG9uIFwiLFwiXG4vLyByZXZlcnNlcyB0aGF0IGZhaXRoZnVsbHkuIFdpdGhvdXQgdGhpcywgYSBtdWx0aS1zZWxlY3Qgd2FzIHNlbnQgYXMgdGhlIHNpbmdsZVxuLy8gdmFsdWUgW1wiYSxiXCJdLCBwcm9kdWNpbmcgYGNvbCBJTiAoJ2EsYicpYCBzZXJ2ZXItc2lkZSwgd2hpY2ggbWF0Y2hlcyBub3RoaW5nLlxuZnVuY3Rpb24gc2VsZWN0UXVlcnlWYWx1ZXMocmF3OiB1bmtub3duKTogdW5rbm93bltdIHtcbiAgaWYgKEFycmF5LmlzQXJyYXkocmF3KSkge1xuICAgIHJldHVybiByYXc7XG4gIH1cblxuICBpZiAocmF3ID09PSBudWxsIHx8IHJhdyA9PT0gdW5kZWZpbmVkIHx8IHJhdyA9PT0gJycpIHtcbiAgICByZXR1cm4gW107XG4gIH1cblxuICByZXR1cm4gU3RyaW5nKHJhdykuc3BsaXQoJywnKTtcbn1cbiJdfQ==
|