velocious 1.0.466 → 1.0.467
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +2 -1
- package/build/configuration.js +2 -2
- package/build/database/pool/async-tracked-multi-connection.js +7 -2
- package/build/database/pool/single-multi-use.js +38 -0
- package/build/frontend-model-controller.js +162 -56
- package/build/frontend-models/query.js +55 -33
- package/build/src/configuration.js +3 -3
- package/build/src/database/pool/async-tracked-multi-connection.d.ts.map +1 -1
- package/build/src/database/pool/async-tracked-multi-connection.js +9 -3
- package/build/src/database/pool/single-multi-use.d.ts +1 -0
- package/build/src/database/pool/single-multi-use.d.ts.map +1 -1
- package/build/src/database/pool/single-multi-use.js +34 -1
- package/build/src/frontend-model-controller.d.ts +45 -5
- package/build/src/frontend-model-controller.d.ts.map +1 -1
- package/build/src/frontend-model-controller.js +155 -57
- package/build/src/frontend-models/query.d.ts +8 -0
- package/build/src/frontend-models/query.d.ts.map +1 -1
- package/build/src/frontend-models/query.js +53 -34
- package/build/src/utils/ransack.d.ts +11 -3
- package/build/src/utils/ransack.d.ts.map +1 -1
- package/build/src/utils/ransack.js +42 -23
- package/build/utils/ransack.js +44 -22
- package/package.json +1 -1
- package/src/configuration.js +2 -2
- package/src/database/pool/async-tracked-multi-connection.js +7 -2
- package/src/database/pool/single-multi-use.js +38 -0
- package/src/frontend-model-controller.js +162 -56
- package/src/frontend-models/query.js +55 -33
- package/src/utils/ransack.js +44 -22
|
@@ -19,12 +19,20 @@ export function normalizeRansackGroup(modelClass: RansackModelClass, params: Rec
|
|
|
19
19
|
* @property {"asc" | "desc"} direction - Sort direction.
|
|
20
20
|
*/
|
|
21
21
|
/**
|
|
22
|
-
* Parses
|
|
23
|
-
* @param {RansackModelClass} modelClass - Model class for attribute
|
|
22
|
+
* Parses a ransack `s` sort string against model attributes.
|
|
23
|
+
* @param {RansackModelClass} modelClass - Model class for attribute lookup.
|
|
24
24
|
* @param {string} sortString - Ransack sort string (e.g., "name asc" or "name asc, createdAt desc").
|
|
25
|
-
* @returns {RansackSort[]} -
|
|
25
|
+
* @returns {RansackSort[]} - Parsed sort definitions.
|
|
26
26
|
*/
|
|
27
27
|
export function parseRansackSort(modelClass: RansackModelClass, sortString: string): RansackSort[];
|
|
28
|
+
/** Error raised when a Ransack descriptor is malformed. */
|
|
29
|
+
export class RansackQueryError extends Error {
|
|
30
|
+
/**
|
|
31
|
+
* Creates a Ransack query error.
|
|
32
|
+
* @param {string} message - Error message.
|
|
33
|
+
*/
|
|
34
|
+
constructor(message: string);
|
|
35
|
+
}
|
|
28
36
|
/**
|
|
29
37
|
* RansackSort type.
|
|
30
38
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ransack.d.ts","sourceRoot":"","sources":["../../../src/utils/ransack.js"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"ransack.d.ts","sourceRoot":"","sources":["../../../src/utils/ransack.js"],"names":[],"mappings":"AAkFA;;;;;GAKG;AACH,mDAJW,iBAAiB,UACjB,MAAM,CAAC,MAAM,EAAE,OAAC,CAAC,GACf,gBAAgB,EAAE,CAI9B;AAED;;;;;GAKG;AACH,kDAJW,iBAAiB,UACjB,MAAM,CAAC,MAAM,EAAE,OAAC,CAAC,GACf,YAAY,CAoCxB;AAiqBD;;;;;GAKG;AAEH;;;;;GAKG;AACH,6CAJW,iBAAiB,cACjB,MAAM,GACJ,WAAW,EAAE,CA6BzB;AAv0BD,2DAA2D;AAC3D;IACE;;;OAGG;IACH,qBAFW,MAAM,EAMhB;CACF;;;;;;;;eAuxBa,MAAM;;;;eACN,KAAK,GAAG,MAAM;;;;;+BA3wBf,MAAM,GAAG,KAAK,GAAG,IAAI,GAAG,IAAI,GAAG,MAAM,GAAG,IAAI,GAAG,IAAI,GAAG,MAAM,GAAG,QAAQ,GAAG,QAAQ,GAAG,MAAM,GAAG,OAAO;;;;gCAKrG,KAAK,GAAG,IAAI;;;;gCAKZ,cAAc,6BAA6B,EAAE,OAAO,GAAG,OAAO,4BAA4B,EAAE,kBAAkB;;;;;;;;mBAM7G,MAAM;;;;UACN,MAAM,EAAE;;;;;;;;;gBAMR,gBAAgB,EAAE;;;;gBAClB,iBAAiB;;;;eACjB,gBAAgB;;;;WAChB,OAAC;;;;;;;;;gBAMD,iBAAiB;;;;gBACjB,gBAAgB,EAAE;;;;eAClB,YAAY,EAAE"}
|
|
@@ -2,6 +2,25 @@
|
|
|
2
2
|
import * as inflection from "inflection";
|
|
3
3
|
import { isPlainObject } from "is-plain-object";
|
|
4
4
|
import { resolveFrontendModelClass } from "../frontend-models/model-registry.js";
|
|
5
|
+
/** Error raised when a Ransack descriptor is malformed. */
|
|
6
|
+
export class RansackQueryError extends Error {
|
|
7
|
+
/**
|
|
8
|
+
* Creates a Ransack query error.
|
|
9
|
+
* @param {string} message - Error message.
|
|
10
|
+
*/
|
|
11
|
+
constructor(message) {
|
|
12
|
+
super(message);
|
|
13
|
+
this.name = "RansackQueryError";
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Builds a Ransack query error.
|
|
18
|
+
* @param {string} message - Error message.
|
|
19
|
+
* @returns {RansackQueryError} - Ransack query error.
|
|
20
|
+
*/
|
|
21
|
+
function ransackQueryError(message) {
|
|
22
|
+
return new RansackQueryError(message);
|
|
23
|
+
}
|
|
5
24
|
/**
|
|
6
25
|
* RansackPredicate type.
|
|
7
26
|
* @typedef {"cont" | "end" | "eq" | "gt" | "gteq" | "in" | "lt" | "lteq" | "not_eq" | "not_in" | "null" | "start"} RansackPredicate
|
|
@@ -66,7 +85,7 @@ export function normalizeRansackParams(modelClass, params) {
|
|
|
66
85
|
*/
|
|
67
86
|
export function normalizeRansackGroup(modelClass, params) {
|
|
68
87
|
if (!isPlainObject(params)) {
|
|
69
|
-
throw
|
|
88
|
+
throw ransackQueryError(`ransack params must be a plain object, got: ${typeof params}`);
|
|
70
89
|
}
|
|
71
90
|
/**
|
|
72
91
|
* Normalized.
|
|
@@ -106,7 +125,7 @@ const SKIP_RANSACK_CONDITION = Symbol("skip-ransack-condition");
|
|
|
106
125
|
function normalizeSimpleRansackCondition({ key, modelClass, rawValue }) {
|
|
107
126
|
const parsedKey = parseRansackKey(key);
|
|
108
127
|
if (!parsedKey) {
|
|
109
|
-
throw
|
|
128
|
+
throw ransackQueryError(`Unsupported ransack predicate in key: ${key}`);
|
|
110
129
|
}
|
|
111
130
|
const value = normalizeRansackValue({
|
|
112
131
|
predicate: parsedKey.predicate,
|
|
@@ -136,14 +155,14 @@ function normalizeAdvancedRansackConditions({ modelClass, value }) {
|
|
|
136
155
|
const conditions = [];
|
|
137
156
|
for (const entry of normalizeRansackCollection(value, "conditions")) {
|
|
138
157
|
if (!isPlainObject(entry)) {
|
|
139
|
-
throw
|
|
158
|
+
throw ransackQueryError(`Ransack condition entries must be plain objects, got: ${typeof entry}`);
|
|
140
159
|
}
|
|
141
160
|
const predicateValue = entry.p;
|
|
142
161
|
if (typeof predicateValue !== "string") {
|
|
143
|
-
throw
|
|
162
|
+
throw ransackQueryError("Ransack condition predicate must be a string");
|
|
144
163
|
}
|
|
145
164
|
if (!supportedPredicates.includes(predicateValue)) {
|
|
146
|
-
throw
|
|
165
|
+
throw ransackQueryError(`Unsupported ransack predicate in condition: ${predicateValue}`);
|
|
147
166
|
}
|
|
148
167
|
const predicate = /** @type {RansackPredicate} */ (predicateValue);
|
|
149
168
|
const rawValue = advancedRansackConditionValue({ predicate, value: entry.v });
|
|
@@ -174,7 +193,7 @@ function normalizeAdvancedRansackGroups({ modelClass, value }) {
|
|
|
174
193
|
const groupings = [];
|
|
175
194
|
for (const entry of normalizeRansackCollection(value, "groupings")) {
|
|
176
195
|
if (!isPlainObject(entry)) {
|
|
177
|
-
throw
|
|
196
|
+
throw ransackQueryError(`Ransack grouping entries must be plain objects, got: ${typeof entry}`);
|
|
178
197
|
}
|
|
179
198
|
groupings.push(normalizeRansackGroup(modelClass, entry));
|
|
180
199
|
}
|
|
@@ -191,7 +210,7 @@ function normalizeRansackCombinator(value, defaultValue) {
|
|
|
191
210
|
return defaultValue;
|
|
192
211
|
if (value === "and" || value === "or")
|
|
193
212
|
return value;
|
|
194
|
-
throw
|
|
213
|
+
throw ransackQueryError(`Invalid ransack combinator: ${String(value)}`);
|
|
195
214
|
}
|
|
196
215
|
/**
|
|
197
216
|
* Runs normalize ransack collection.
|
|
@@ -216,7 +235,7 @@ function normalizeRansackCollection(value, name) {
|
|
|
216
235
|
})
|
|
217
236
|
.map((key) => value[key]);
|
|
218
237
|
}
|
|
219
|
-
throw
|
|
238
|
+
throw ransackQueryError(`Ransack ${name} must be an array or object, got: ${typeof value}`);
|
|
220
239
|
}
|
|
221
240
|
/**
|
|
222
241
|
* Runs advanced ransack condition value.
|
|
@@ -250,7 +269,7 @@ function resolveRansackAttributesFromAdvancedValue({ modelClass, value }) {
|
|
|
250
269
|
attributes.push(...resolveRansackAttributes({ modelClass, value: attributeValue }));
|
|
251
270
|
}
|
|
252
271
|
if (attributes.length < 1) {
|
|
253
|
-
throw
|
|
272
|
+
throw ransackQueryError("Ransack condition must include at least one attribute");
|
|
254
273
|
}
|
|
255
274
|
return attributes;
|
|
256
275
|
}
|
|
@@ -268,7 +287,7 @@ function normalizeAdvancedAttributeValues(value) {
|
|
|
268
287
|
if (isPlainObject(value)) {
|
|
269
288
|
return normalizeRansackCollection(value, "attributes").map((entry) => normalizeAdvancedAttributeValue(entry));
|
|
270
289
|
}
|
|
271
|
-
throw
|
|
290
|
+
throw ransackQueryError(`Ransack condition attributes must be strings, arrays, or objects, got: ${typeof value}`);
|
|
272
291
|
}
|
|
273
292
|
/**
|
|
274
293
|
* Runs normalize advanced attribute value.
|
|
@@ -281,7 +300,7 @@ function normalizeAdvancedAttributeValue(value) {
|
|
|
281
300
|
if (isPlainObject(value) && typeof value.name === "string") {
|
|
282
301
|
return value.name;
|
|
283
302
|
}
|
|
284
|
-
throw
|
|
303
|
+
throw ransackQueryError(`Ransack condition attribute entries must be strings or {name}, got: ${typeof value}`);
|
|
285
304
|
}
|
|
286
305
|
/**
|
|
287
306
|
* Runs resolve ransack attributes.
|
|
@@ -296,7 +315,7 @@ function resolveRansackAttributes({ modelClass, value }) {
|
|
|
296
315
|
const targetModelClass = modelClassAtPath({ modelClass, path: resolvedPath.path });
|
|
297
316
|
const attributeName = resolveAttributeName({ modelClass: targetModelClass, value: resolvedPath.attributeValue });
|
|
298
317
|
if (!attributeName) {
|
|
299
|
-
throw
|
|
318
|
+
throw ransackQueryError(`Unknown ransack attribute "${resolvedPath.attributeValue}" for ${targetModelClass.name}`);
|
|
300
319
|
}
|
|
301
320
|
return {
|
|
302
321
|
attributeName,
|
|
@@ -316,7 +335,7 @@ function modelClassAtPath({ modelClass, path }) {
|
|
|
316
335
|
for (const relationshipName of path) {
|
|
317
336
|
const relationship = relationshipEntries(currentModelClass)[relationshipName];
|
|
318
337
|
if (!relationship) {
|
|
319
|
-
throw
|
|
338
|
+
throw ransackQueryError(`Unknown ransack relationship "${relationshipName}" for ${currentModelClass.name}`);
|
|
320
339
|
}
|
|
321
340
|
currentModelClass = relationship.targetModelClass;
|
|
322
341
|
}
|
|
@@ -351,7 +370,7 @@ function resolveRansackPath({ modelClass, value }) {
|
|
|
351
370
|
remainingValue = match.remainingValue;
|
|
352
371
|
}
|
|
353
372
|
if (remainingValue.length < 1) {
|
|
354
|
-
throw
|
|
373
|
+
throw ransackQueryError(`Invalid ransack key path: ${value}`);
|
|
355
374
|
}
|
|
356
375
|
return {
|
|
357
376
|
attributeValue: remainingValue,
|
|
@@ -560,7 +579,7 @@ function parseRansackKey(key) {
|
|
|
560
579
|
continue;
|
|
561
580
|
const pathValue = key.slice(0, key.length - suffix.length);
|
|
562
581
|
if (pathValue.length < 1) {
|
|
563
|
-
throw
|
|
582
|
+
throw ransackQueryError(`Invalid ransack key: ${key}`);
|
|
564
583
|
}
|
|
565
584
|
return {
|
|
566
585
|
pathValue,
|
|
@@ -573,7 +592,7 @@ function parseRansackKey(key) {
|
|
|
573
592
|
continue;
|
|
574
593
|
const pathValue = key.slice(0, key.length - camelSuffix.length);
|
|
575
594
|
if (pathValue.length < 1) {
|
|
576
|
-
throw
|
|
595
|
+
throw ransackQueryError(`Invalid ransack key: ${key}`);
|
|
577
596
|
}
|
|
578
597
|
return {
|
|
579
598
|
pathValue,
|
|
@@ -647,7 +666,7 @@ function normalizeRansackBoolean(value) {
|
|
|
647
666
|
return false;
|
|
648
667
|
if (ransackValueIsBlank(value))
|
|
649
668
|
return null;
|
|
650
|
-
throw
|
|
669
|
+
throw ransackQueryError(`Invalid ransack boolean value: ${String(value)}`);
|
|
651
670
|
}
|
|
652
671
|
/**
|
|
653
672
|
* Runs ransack value is blank.
|
|
@@ -680,10 +699,10 @@ function normalizeRansackArray(value) {
|
|
|
680
699
|
* @property {"asc" | "desc"} direction - Sort direction.
|
|
681
700
|
*/
|
|
682
701
|
/**
|
|
683
|
-
* Parses
|
|
684
|
-
* @param {RansackModelClass} modelClass - Model class for attribute
|
|
702
|
+
* Parses a ransack `s` sort string against model attributes.
|
|
703
|
+
* @param {RansackModelClass} modelClass - Model class for attribute lookup.
|
|
685
704
|
* @param {string} sortString - Ransack sort string (e.g., "name asc" or "name asc, createdAt desc").
|
|
686
|
-
* @returns {RansackSort[]} -
|
|
705
|
+
* @returns {RansackSort[]} - Parsed sort definitions.
|
|
687
706
|
*/
|
|
688
707
|
export function parseRansackSort(modelClass, sortString) {
|
|
689
708
|
const segments = sortString.split(",").map((segment) => segment.trim()).filter((segment) => segment.length > 0);
|
|
@@ -696,11 +715,11 @@ export function parseRansackSort(modelClass, sortString) {
|
|
|
696
715
|
const columnCandidate = parts[0];
|
|
697
716
|
const directionCandidate = parts.length > 1 ? parts[1].toLowerCase() : "asc";
|
|
698
717
|
if (directionCandidate !== "asc" && directionCandidate !== "desc") {
|
|
699
|
-
throw
|
|
718
|
+
throw ransackQueryError(`Invalid ransack sort direction "${directionCandidate}" in: ${segment}`);
|
|
700
719
|
}
|
|
701
720
|
const resolvedAttribute = resolveAttributeName({ modelClass, value: columnCandidate });
|
|
702
721
|
if (!resolvedAttribute) {
|
|
703
|
-
throw
|
|
722
|
+
throw ransackQueryError(`Unknown ransack sort attribute "${columnCandidate}" for ${modelClass.name}`);
|
|
704
723
|
}
|
|
705
724
|
sorts.push({ attribute: resolvedAttribute, direction: directionCandidate });
|
|
706
725
|
}
|
|
@@ -714,4 +733,4 @@ export function parseRansackSort(modelClass, sortString) {
|
|
|
714
733
|
function uniqunize(values) {
|
|
715
734
|
return Array.from(new Set(values));
|
|
716
735
|
}
|
|
717
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmFuc2Fjay5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy91dGlscy9yYW5zYWNrLmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLFlBQVk7QUFFWixPQUFPLEtBQUssVUFBVSxNQUFNLFlBQVksQ0FBQTtBQUN4QyxPQUFPLEVBQUMsYUFBYSxFQUFDLE1BQU0saUJBQWlCLENBQUE7QUFDN0MsT0FBTyxFQUFDLHlCQUF5QixFQUFDLE1BQU0sc0NBQXNDLENBQUE7QUFFOUU7OztHQUdHO0FBRUg7OztHQUdHO0FBRUg7OztHQUdHO0FBRUg7Ozs7O0dBS0c7QUFFSDs7Ozs7OztHQU9HO0FBRUg7Ozs7OztHQU1HO0FBRUgsTUFBTSxtQkFBbUIsR0FBRztJQUMxQixRQUFRO0lBQ1IsUUFBUTtJQUNSLE1BQU07SUFDTixNQUFNO0lBQ04sT0FBTztJQUNQLE1BQU07SUFDTixNQUFNO0lBQ04sS0FBSztJQUNMLElBQUk7SUFDSixJQUFJO0lBQ0osSUFBSTtJQUNKLElBQUk7Q0FDTCxDQUFBO0FBRUQ7Ozs7O0dBS0c7QUFDSCxNQUFNLFVBQVUsc0JBQXNCLENBQUMsVUFBVSxFQUFFLE1BQU07SUFDdkQsT0FBTyxxQkFBcUIsQ0FBQyxVQUFVLEVBQUUsTUFBTSxDQUFDLENBQUMsVUFBVSxDQUFBO0FBQzdELENBQUM7QUFFRDs7Ozs7R0FLRztBQUNILE1BQU0sVUFBVSxxQkFBcUIsQ0FBQyxVQUFVLEVBQUUsTUFBTTtJQUN0RCxJQUFJLENBQUMsYUFBYSxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUM7UUFDM0IsTUFBTSxJQUFJLEtBQUssQ0FBQywrQ0FBK0MsT0FBTyxNQUFNLEVBQUUsQ0FBQyxDQUFBO0lBQ2pGLENBQUM7SUFFRDs7OEJBRTBCO0lBQzFCLE1BQU0sVUFBVSxHQUFHO1FBQ2pCLFVBQVUsRUFBRSwwQkFBMEIsQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLEtBQUssQ0FBQztRQUN2RCxVQUFVLEVBQUUsRUFBRTtRQUNkLFNB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QUFDLG1DQUFtQyxrQkFBa0IsU0FBUyxPQUFPLEVBQUUsQ0FBQyxDQUFBO1FBQzFGLENBQUM7UUFFRCxNQUFNLGlCQUFpQixHQUFHLG9CQUFvQixDQUFDLEVBQUMsVUFBVSxFQUFFLEtBQUssRUFBRSxlQUFlLEVBQUMsQ0FBQyxDQUFBO1FBRXBGLElBQUksQ0FBQyxpQkFBaUIsRUFBRSxDQUFDO1lBQ3ZCLE1BQU0sSUFBSSxLQUFLLENBQUMsbUNBQW1DLGVBQWUsU0FBUyxVQUFVLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQTtRQUMvRixDQUFDO1FBRUQsS0FBSyxDQUFDLElBQUksQ0FBQyxFQUFDLFNBQVMsRUFBRSxpQkFBaUIsRUFBRSxTQUFTLEVBQUUsa0JBQWtCLEVBQUMsQ0FBQyxDQUFBO0lBQzNFLENBQUM7SUFFRCxPQUFPLEtBQUssQ0FBQTtBQUNkLENBQUM7QUFFRDs7OztHQUlHO0FBQ0gsU0FBUyxTQUFTLENBQUMsTUFBTTtJQUN2QixPQUFPLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQTtBQUNwQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQHRzLWNoZWNrXG5cbmltcG9ydCAqIGFzIGluZmxlY3Rpb24gZnJvbSBcImluZmxlY3Rpb25cIlxuaW1wb3J0IHtpc1BsYWluT2JqZWN0fSBmcm9tIFwiaXMtcGxhaW4tb2JqZWN0XCJcbmltcG9ydCB7cmVzb2x2ZUZyb250ZW5kTW9kZWxDbGFzc30gZnJvbSBcIi4uL2Zyb250ZW5kLW1vZGVscy9tb2RlbC1yZWdpc3RyeS5qc1wiXG5cbi8qKlxuICogUmFuc2Fja1ByZWRpY2F0ZSB0eXBlLlxuICogQHR5cGVkZWYge1wiY29udFwiIHwgXCJlbmRcIiB8IFwiZXFcIiB8IFwiZ3RcIiB8IFwiZ3RlcVwiIHwgXCJpblwiIHwgXCJsdFwiIHwgXCJsdGVxXCIgfCBcIm5vdF9lcVwiIHwgXCJub3RfaW5cIiB8IFwibnVsbFwiIHwgXCJzdGFydFwifSBSYW5zYWNrUHJlZGljYXRlXG4gKi9cblxuLyoqXG4gKiBSYW5zYWNrQ29tYmluYXRvciB0eXBlLlxuICogQHR5cGVkZWYge1wiYW5kXCIgfCBcIm9yXCJ9IFJhbnNhY2tDb21iaW5hdG9yXG4gKi9cblxuLyoqXG4gKiBSYW5zYWNrTW9kZWxDbGFzcyB0eXBlLlxuICogQHR5cGVkZWYge3R5cGVvZiBpbXBvcnQoXCIuLi9kYXRhYmFzZS9yZWNvcmQvaW5kZXguanNcIikuZGVmYXVsdCB8IGltcG9ydChcIi4uL2Zyb250ZW5kLW1vZGVscy9iYXNlLmpzXCIpLkZyb250ZW5kTW9kZWxDbGFzc30gUmFuc2Fja01vZGVsQ2xhc3NcbiAqL1xuXG4vKipcbiAqIFJhbnNhY2tBdHRyaWJ1dGUgdHlwZS5cbiAqIEB0eXBlZGVmIHtvYmplY3R9IFJhbnNhY2tBdHRyaWJ1dGVcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBhdHRyaWJ1dGVOYW1lIC0gUmVzb2x2ZWQgYXR0cmlidXRlIG5hbWUuXG4gKiBAcHJvcGVydHkge3N0cmluZ1tdfSBwYXRoIC0gUmVzb2x2ZWQgcmVsYXRpb25zaGlwIHBhdGguXG4gKi9cblxuLyoqXG4gKiBSYW5zYWNrQ29uZGl0aW9uIHR5cGUuXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBSYW5zYWNrQ29uZGl0aW9uXG4gKiBAcHJvcGVydHkge1JhbnNhY2tBdHRyaWJ1dGVbXX0gYXR0cmlidXRlcyAtIFJlc29sdmVkIGF0dHJpYnV0ZXMgdG8gdGVzdC5cbiAqIEBwcm9wZXJ0eSB7UmFuc2Fja0NvbWJpbmF0b3J9IGNvbWJpbmF0b3IgLSBIb3cgbXVsdGlwbGUgYXR0cmlidXRlcyBhcmUgY29tYmluZWQuXG4gKiBAcHJvcGVydHkge1JhbnNhY2tQcmVkaWNhdGV9IHByZWRpY2F0ZSAtIFBhcnNlZCBSYW5zYWNrIHByZWRpY2F0ZS5cbiAqIEBwcm9wZXJ0eSB7P30gdmFsdWUgLSBOb3JtYWxpemVkIHZhbHVlLlxuICovXG5cbi8qKlxuICogUmFuc2Fja0dyb3VwIHR5cGUuXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBSYW5zYWNrR3JvdXBcbiAqIEBwcm9wZXJ0eSB7UmFuc2Fja0NvbWJpbmF0b3J9IGNvbWJpbmF0b3IgLSBIb3cgZW50cmllcyBpbnNpZGUgdGhpcyBncm91cCBhcmUgY29tYmluZWQuXG4gKiBAcHJvcGVydHkge1JhbnNhY2tDb25kaXRpb25bXX0gY29uZGl0aW9ucyAtIENvbmRpdGlvbnMgaW4gdGhpcyBncm91cC5cbiAqIEBwcm9wZXJ0eSB7UmFuc2Fja0dyb3VwW119IGdyb3VwaW5ncyAtIE5lc3RlZCBncm91cHMuXG4gKi9cblxuY29uc3Qgc3VwcG9ydGVkUHJlZGljYXRlcyA9IFtcbiAgXCJub3RfaW5cIixcbiAgXCJub3RfZXFcIixcbiAgXCJndGVxXCIsXG4gIFwibHRlcVwiLFxuICBcInN0YXJ0XCIsXG4gIFwiY29udFwiLFxuICBcIm51bGxcIixcbiAgXCJlbmRcIixcbiAgXCJlcVwiLFxuICBcImd0XCIsXG4gIFwibHRcIixcbiAgXCJpblwiXG5dXG5cbi8qKlxuICogUnVucyB0aGUgbm9ybWFsaXplUmFuc2Fja1BhcmFtcyBoZWxwZXIuXG4gKiBAcGFyYW0ge1JhbnNhY2tNb2RlbENsYXNzfSBtb2RlbENsYXNzIC0gTW9kZWwgY2xhc3MuXG4gKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsID8+fSBwYXJhbXMgLSBSYW5zYWNrLXN0eWxlIHBhcmFtcyBoYXNoLlxuICogQHJldHVybnMge1JhbnNhY2tDb25kaXRpb25bXX0gLSBOb3JtYWxpemVkIGNvbmRpdGlvbnMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBub3JtYWxpemVSYW5zYWNrUGFyYW1zKG1vZGVsQ2xhc3MsIHBhcmFtcykge1xuICByZXR1cm4gbm9ybWFsaXplUmFuc2Fja0dyb3VwKG1vZGVsQ2xhc3MsIHBhcmFtcykuY29uZGl0aW9uc1xufVxuXG4vKipcbiAqIFJ1bnMgdGhlIG5vcm1hbGl6ZVJhbnNhY2tHcm91cCBoZWxwZXIuXG4gKiBAcGFyYW0ge1JhbnNhY2tNb2RlbENsYXNzfSBtb2RlbENsYXNzIC0gTW9kZWwgY2xhc3MuXG4gKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsID8+fSBwYXJhbXMgLSBSYW5zYWNrLXN0eWxlIHBhcmFtcyBoYXNoLlxuICogQHJldHVybnMge1JhbnNhY2tHcm91cH0gLSBOb3JtYWxpemVkIGdyb3VwLlxuICovXG5leHBvcnQgZnVuY3Rpb24gbm9ybWFsaXplUmFuc2Fja0dyb3VwKG1vZGVsQ2xhc3MsIHBhcmFtcykge1xuICBpZiAoIWlzUGxhaW5PYmplY3QocGFyYW1zKSkge1xuICAgIHRocm93IG5ldyBFcnJvcihgcmFuc2FjayBwYXJhbXMgbXVzdCBiZSBhIHBsYWluIG9iamVjdCwgZ290OiAke3R5cGVvZiBwYXJhbXN9YClcbiAgfVxuXG4gIC8qKlxuICAgKiBOb3JtYWxpemVkLlxuICAgKiBAdHlwZSB7UmFuc2Fja0dyb3VwfSAqL1xuICBjb25zdCBub3JtYWxpemVkID0ge1xuICAgIGNvbWJpbmF0b3I6IG5vcm1hbGl6ZVJhbnNhY2tDb21iaW5hdG9yKHBhcmFtcy5tLCBcImFuZFwiKSxcbiAgICBjb25kaXRpb25zOiBbXSxcbiAgICBncm91cGluZ3M6IFtdXG4gIH1cblxuICBmb3IgKGNvbnN0IFtrZXksIHJhd1ZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhwYXJhbXMpKSB7XG4gICAgaWYgKGtleSA9PT0gXCJtXCIpIHtcbiAgICAgIGNvbnRpbnVlXG4gICAgfVxuXG4gICAgaWYgKGtleSA9PT0gXCJjXCIpIHtcbiAgICAgIG5vcm1hbGl6ZWQuY29uZGl0aW9ucy5wdXNoKC4uLm5vcm1hbGl6ZUFkdmFuY2VkUmFuc2Fja0NvbmRpdGlvbnMoe21vZGVsQ2xhc3MsIHZhbHVlOiByYXdWYWx1ZX0pKVxuICAgICAgY29udGludWVcbiAgICB9XG5cbiAgICBpZiAoa2V5ID09PSBcImdcIikge1xuICAgICAgbm9ybWFsaXplZC5ncm91cGluZ3MucHVzaCguLi5ub3JtYWxpemVBZHZhbmNlZFJhbnNhY2tHcm91cHMoe21vZGVsQ2xhc3MsIHZhbHVlOiByYXdWYWx1ZX0pKVxuICAgICAgY29udGludWVcbiAgICB9XG5cbiAgICBjb25zdCBjb25kaXRpb24gPSBub3JtYWxpemVTaW1wbGVSYW5zYWNrQ29uZGl0aW9uKHtrZXksIG1vZGVsQ2xhc3MsIHJhd1ZhbHVlfSlcbiAgICBpZiAoY29uZGl0aW9uKSBub3JtYWxpemVkLmNvbmRpdGlvbnMucHVzaChjb25kaXRpb24pXG4gIH1cblxuICByZXR1cm4gbm9ybWFsaXplZFxufVxuXG5jb25zdCBTS0lQX1JBTlNBQ0tfQ09ORElUSU9OID0gU3ltYm9sKFwic2tpcC1yYW5zYWNrLWNvbmRpdGlvblwiKVxuXG4vKipcbiAqIFJ1bnMgbm9ybWFsaXplIHNpbXBsZSByYW5zYWNrIGNvbmRpdGlvbi5cbiAqIEBwYXJhbSB7b2JqZWN0fSBhcmdzIC0gT3B0aW9ucy5cbiAqIEBwYXJhbSB7c3RyaW5nfSBhcmdzLmtleSAtIFNpbXBsZSBSYW5zYWNrIGtleS5cbiAqIEBwYXJhbSB7UmFuc2Fja01vZGVsQ2xhc3N9IGFyZ3MubW9kZWxDbGFzcyAtIE1vZGVsIGNsYXNzLlxuICogQHBhcmFtIHs/fSBhcmdzLnJhd1ZhbHVlIC0gUmF3IGNvbmRpdGlvbiB2YWx1ZS5cbiAqIEByZXR1cm5zIHtSYW5zYWNrQ29uZGl0aW9uIHwgbnVsbH0gLSBOb3JtYWxpemVkIGNvbmRpdGlvbiwgb3IgbnVsbCB3aGVuIHNraXBwZWQuXG4gKi9cbmZ1bmN0aW9uIG5vcm1hbGl6ZVNpbXBsZVJhbnNhY2tDb25kaXRpb24oe2tleSwgbW9kZWxDbGFzcywgcmF3VmFsdWV9KSB7XG4gIGNvbnN0IHBhcnNlZEtleSA9IHBhcnNlUmFuc2Fja0tleShrZXkpXG5cbiAgaWYgKCFwYXJzZWRLZXkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYFVuc3VwcG9ydGVkIHJhbnNhY2sgcHJlZGljYXRlIGluIGtleTogJHtrZXl9YClcbiAgfVxuXG4gIGNvbnN0IHZhbHVlID0gbm9ybWFsaXplUmFuc2Fja1ZhbHVlKHtcbiAgICBwcmVkaWNhdGU6IHBhcnNlZEtleS5wcmVkaWNhdGUsXG4gICAgdmFsdWU6IHJhd1ZhbHVlXG4gIH0pXG5cbiAgaWYgKHZhbHVlID09PSBTS0lQX1JBTlNBQ0tfQ09ORElUSU9OKSByZXR1cm4gbnVsbFxuXG4gIGNvbnN0IGF0dHJpYnV0ZXMgPSByZXNvbHZlUmFuc2Fja0F0dHJpYnV0ZXMoe21vZGVsQ2xhc3MsIHZhbHVlOiBwYXJzZWRLZXkucGF0aFZhbHVlfSlcblxuICByZXR1cm4ge1xuICAgIGF0dHJpYnV0ZXMsXG4gICAgY29tYmluYXRvcjogYXR0cmlidXRlcy5sZW5ndGggPiAxID8gXCJvclwiIDogXCJhbmRcIixcbiAgICBwcmVkaWNhdGU6IHBhcnNlZEtleS5wcmVkaWNhdGUsXG4gICAgdmFsdWVcbiAgfVxufVxuXG4vKipcbiAqIFJ1bnMgbm9ybWFsaXplIGFkdmFuY2VkIHJhbnNhY2sgY29uZGl0aW9ucy5cbiAqIEBwYXJhbSB7b2JqZWN0fSBhcmdzIC0gT3B0aW9ucy5cbiAqIEBwYXJhbSB7UmFuc2Fja01vZGVsQ2xhc3N9IGFyZ3MubW9kZWxDbGFzcyAtIE1vZGVsIGNsYXNzLlxuICogQHBhcmFtIHs/fSBhcmdzLnZhbHVlIC0gQWR2YW5jZWQgY29uZGl0aW9ucyBjb2xsZWN0aW9uLlxuICogQHJldHVybnMge1JhbnNhY2tDb25kaXRpb25bXX0gLSBOb3JtYWxpemVkIGNvbmRpdGlvbnMuXG4gKi9cbmZ1bmN0aW9uIG5vcm1hbGl6ZUFkdmFuY2VkUmFuc2Fja0NvbmRpdGlvbnMoe21vZGVsQ2xhc3MsIHZhbHVlfSkge1xuICAvKipcbiAgICogQ29uZGl0aW9ucy5cbiAgICogQHR5cGUge1JhbnNhY2tDb25kaXRpb25bXX0gKi9cbiAgY29uc3QgY29uZGl0aW9ucyA9IFtdXG5cbiAgZm9yIChjb25zdCBlbnRyeSBvZiBub3JtYWxpemVSYW5zYWNrQ29sbGVjdGlvbih2YWx1ZSwgXCJjb25kaXRpb25zXCIpKSB7XG4gICAgaWYgKCFpc1BsYWluT2JqZWN0KGVudHJ5KSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBSYW5zYWNrIGNvbmRpdGlvbiBlbnRyaWVzIG11c3QgYmUgcGxhaW4gb2JqZWN0cywgZ290OiAke3R5cGVvZiBlbnRyeX1gKVxuICAgIH1cblxuICAgIGNvbnN0IHByZWRpY2F0ZVZhbHVlID0gZW50cnkucFxuXG4gICAgaWYgKHR5cGVvZiBwcmVkaWNhdGVWYWx1ZSAhPT0gXCJzdHJpbmdcIikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiUmFuc2FjayBjb25kaXRpb24gcHJlZGljYXRlIG11c3QgYmUgYSBzdHJpbmdcIilcbiAgICB9XG5cbiAgICBpZiAoIXN1cHBvcnRlZFByZWRpY2F0ZXMuaW5jbHVkZXMocHJlZGljYXRlVmFsdWUpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYFVuc3VwcG9ydGVkIHJhbnNhY2sgcHJlZGljYXRlIGluIGNvbmRpdGlvbjogJHtwcmVkaWNhdGVWYWx1ZX1gKVxuICAgIH1cblxuICAgIGNvbnN0IHByZWRpY2F0ZSA9IC8qKiBAdHlwZSB7UmFuc2Fja1ByZWRpY2F0ZX0gKi8gKHByZWRpY2F0ZVZhbHVlKVxuICAgIGNvbnN0IHJhd1ZhbHVlID0gYWR2YW5jZWRSYW5zYWNrQ29uZGl0aW9uVmFsdWUoe3ByZWRpY2F0ZSwgdmFsdWU6IGVudHJ5LnZ9KVxuICAgIGNvbnN0IG5vcm1hbGl6ZWRWYWx1ZSA9IG5vcm1hbGl6ZVJhbnNhY2tWYWx1ZSh7cHJlZGljYXRlLCB2YWx1ZTogcmF3VmFsdWV9KVxuXG4gICAgaWYgKG5vcm1hbGl6ZWRWYWx1ZSA9PT0gU0tJUF9SQU5TQUNLX0NPTkRJVElPTikgY29udGludWVcblxuICAgIGNvbnN0IGF0dHJpYnV0ZXMgPSByZXNvbHZlUmFuc2Fja0F0dHJpYnV0ZXNGcm9tQWR2YW5jZWRWYWx1ZSh7bW9kZWxDbGFzcywgdmFsdWU6IGVudHJ5LmF9KVxuXG4gICAgY29uZGl0aW9ucy5wdXNoKHtcbiAgICAgIGF0dHJpYnV0ZXMsXG4gICAgICBjb21iaW5hdG9yOiBub3JtYWxpemVSYW5zYWNrQ29tYmluYXRvcihlbnRyeS5tLCBhdHRyaWJ1dGVzLmxlbmd0aCA+IDEgPyBcIm9yXCIgOiBcImFuZFwiKSxcbiAgICAgIHByZWRpY2F0ZSxcbiAgICAgIHZhbHVlOiBub3JtYWxpemVkVmFsdWVcbiAgICB9KVxuICB9XG5cbiAgcmV0dXJuIGNvbmRpdGlvbnNcbn1cblxuLyoqXG4gKiBSdW5zIG5vcm1hbGl6ZSBhZHZhbmNlZCByYW5zYWNrIGdyb3Vwcy5cbiAqIEBwYXJhbSB7b2JqZWN0fSBhcmdzIC0gT3B0aW9ucy5cbiAqIEBwYXJhbSB7UmFuc2Fja01vZGVsQ2xhc3N9IGFyZ3MubW9kZWxDbGFzcyAtIE1vZGVsIGNsYXNzLlxuICogQHBhcmFtIHs/fSBhcmdzLnZhbHVlIC0gQWR2YW5jZWQgZ3JvdXBzIGNvbGxlY3Rpb24uXG4gKiBAcmV0dXJucyB7UmFuc2Fja0dyb3VwW119IC0gTm9ybWFsaXplZCBncm91cHMuXG4gKi9cbmZ1bmN0aW9uIG5vcm1hbGl6ZUFkdmFuY2VkUmFuc2Fja0dyb3Vwcyh7bW9kZWxDbGFzcywgdmFsdWV9KSB7XG4gIC8qKlxuICAgKiBHcm91cGluZ3MuXG4gICAqIEB0eXBlIHtSYW5zYWNrR3JvdXBbXX0gKi9cbiAgY29uc3QgZ3JvdXBpbmdzID0gW11cblxuICBmb3IgKGNvbnN0IGVudHJ5IG9mIG5vcm1hbGl6ZVJhbnNhY2tDb2xsZWN0aW9uKHZhbHVlLCBcImdyb3VwaW5nc1wiKSkge1xuICAgIGlmICghaXNQbGFpbk9iamVjdChlbnRyeSkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgUmFuc2FjayBncm91cGluZyBlbnRyaWVzIG11c3QgYmUgcGxhaW4gb2JqZWN0cywgZ290OiAke3R5cGVvZiBlbnRyeX1gKVxuICAgIH1cblxuICAgIGdyb3VwaW5ncy5wdXNoKG5vcm1hbGl6ZVJhbnNhY2tHcm91cChtb2RlbENsYXNzLCBlbnRyeSkpXG4gIH1cblxuICByZXR1cm4gZ3JvdXBpbmdzXG59XG5cbi8qKlxuICogUnVucyBub3JtYWxpemUgcmFuc2FjayBjb21iaW5hdG9yLlxuICogQHBhcmFtIHs/fSB2YWx1ZSAtIENhbmRpZGF0ZSBjb21iaW5hdG9yLlxuICogQHBhcmFtIHtSYW5zYWNrQ29tYmluYXRvcn0gZGVmYXVsdFZhbHVlIC0gRGVmYXVsdCBjb21iaW5hdG9yLlxuICogQHJldHVybnMge1JhbnNhY2tDb21iaW5hdG9yfSAtIE5vcm1hbGl6ZWQgY29tYmluYXRvci5cbiAqL1xuZnVuY3Rpb24gbm9ybWFsaXplUmFuc2Fja0NvbWJpbmF0b3IodmFsdWUsIGRlZmF1bHRWYWx1ZSkge1xuICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCB8fCB2YWx1ZSA9PT0gbnVsbCB8fCB2YWx1ZSA9PT0gXCJcIikgcmV0dXJuIGRlZmF1bHRWYWx1ZVxuICBpZiAodmFsdWUgPT09IFwiYW5kXCIgfHwgdmFsdWUgPT09IFwib3JcIikgcmV0dXJuIHZhbHVlXG5cbiAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIHJhbnNhY2sgY29tYmluYXRvcjogJHtTdHJpbmcodmFsdWUpfWApXG59XG5cbi8qKlxuICogUnVucyBub3JtYWxpemUgcmFuc2FjayBjb2xsZWN0aW9uLlxuICogQHBhcmFtIHs/fSB2YWx1ZSAtIENhbmRpZGF0ZSBjb2xsZWN0aW9uLlxuICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgLSBDb2xsZWN0aW9uIG5hbWUgZm9yIGVycm9ycy5cbiAqIEByZXR1cm5zIHtBcnJheTw/Pn0gLSBDb2xsZWN0aW9uIHZhbHVlcyBpbiBzdGFibGUgb3JkZXIuXG4gKi9cbmZ1bmN0aW9uIG5vcm1hbGl6ZVJhbnNhY2tDb2xsZWN0aW9uKHZhbHVlLCBuYW1lKSB7XG4gIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkIHx8IHZhbHVlID09PSBudWxsIHx8IHZhbHVlID09PSBcIlwiKSByZXR1cm4gW11cbiAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSByZXR1cm4gdmFsdWVcblxuICBpZiAoaXNQbGFpbk9iamVjdCh2YWx1ZSkpIHtcbiAgICByZXR1cm4gT2JqZWN0LmtleXModmFsdWUpXG4gICAgICAuc29ydCgobGVmdCwgcmlnaHQpID0+IHtcbiAgICAgICAgY29uc3QgbGVmdE51bWJlciA9IE51bWJlcihsZWZ0KVxuICAgICAgICBjb25zdCByaWdodE51bWJlciA9IE51bWJlcihyaWdodClcblxuICAgICAgICBpZiAoTnVtYmVyLmlzRmluaXRlKGxlZnROdW1iZXIpICYmIE51bWJlci5pc0Zpbml0ZShyaWdodE51bWJlcikpIHtcbiAgICAgICAgICByZXR1cm4gbGVmdE51bWJlciAtIHJpZ2h0TnVtYmVyXG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gbGVmdC5sb2NhbGVDb21wYXJlKHJpZ2h0KVxuICAgICAgfSlcbiAgICAgIC5tYXAoKGtleSkgPT4gdmFsdWVba2V5XSlcbiAgfVxuXG4gIHRocm93IG5ldyBFcnJvcihgUmFuc2FjayAke25hbWV9IG11c3QgYmUgYW4gYXJyYXkgb3Igb2JqZWN0LCBnb3Q6ICR7dHlwZW9mIHZhbHVlfWApXG59XG5cbi8qKlxuICogUnVucyBhZHZhbmNlZCByYW5zYWNrIGNvbmRpdGlvbiB2YWx1ZS5cbiAqIEBwYXJhbSB7b2JqZWN0fSBhcmdzIC0gT3B0aW9ucy5cbiAqIEBwYXJhbSB7UmFuc2Fja1ByZWRpY2F0ZX0gYXJncy5wcmVkaWNhdGUgLSBQYXJzZWQgcHJlZGljYXRlLlxuICogQHBhcmFtIHs/fSBhcmdzLnZhbHVlIC0gQWR2YW5jZWQgY29uZGl0aW9uIHZhbHVlLlxuICogQHJldHVybnMgez99IC0gVmFsdWUgcGFzc2VkIHRvIHByZWRpY2F0ZSBub3JtYWxpemF0aW9uLlxuICovXG5mdW5jdGlvbiBhZHZhbmNlZFJhbnNhY2tDb25kaXRpb25WYWx1ZSh7cHJlZGljYXRlLCB2YWx1ZX0pIHtcbiAgaWYgKHByZWRpY2F0ZSA9PT0gXCJpblwiIHx8IHByZWRpY2F0ZSA9PT0gXCJub3RfaW5cIikgcmV0dXJuIHZhbHVlXG5cbiAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgcmV0dXJuIHZhbHVlLmZpbmQoKGVudHJ5KSA9PiBlbnRyeSAhPT0gdW5kZWZpbmVkICYmIGVudHJ5ICE9PSBudWxsICYmIGVudHJ5ICE9PSBcIlwiKVxuICB9XG5cbiAgcmV0dXJuIHZhbHVlXG59XG5cbi8qKlxuICogUnVucyByZXNvbHZlIHJhbnNhY2sgYXR0cmlidXRlcyBmcm9tIGFkdmFuY2VkIHZhbHVlLlxuICogQHBhcmFtIHtvYmplY3R9IGFyZ3MgLSBPcHRpb25zLlxuICogQHBhcmFtIHtSYW5zYWNrTW9kZWxDbGFzc30gYXJncy5tb2RlbENsYXNzIC0gTW9kZWwgY2xhc3MuXG4gKiBAcGFyYW0gez99IGFyZ3MudmFsdWUgLSBBZHZhbmNlZCBhdHRyaWJ1dGUgdmFsdWUuXG4gKiBAcmV0dXJucyB7UmFuc2Fja0F0dHJpYnV0ZVtdfSAtIFJlc29sdmVkIGF0dHJpYnV0ZXMuXG4gKi9cbmZ1bmN0aW9uIHJlc29sdmVSYW5zYWNrQXR0cmlidXRlc0Zyb21BZHZhbmNlZFZhbHVlKHttb2RlbENsYXNzLCB2YWx1ZX0pIHtcbiAgY29uc3QgdmFsdWVzID0gbm9ybWFsaXplQWR2YW5jZWRBdHRyaWJ1dGVWYWx1ZXModmFsdWUpXG4gIC8qKlxuICAgKiBBdHRyaWJ1dGVzLlxuICAgKiBAdHlwZSB7UmFuc2Fja0F0dHJpYnV0ZVtdfSAqL1xuICBjb25zdCBhdHRyaWJ1dGVzID0gW11cblxuICBmb3IgKGNvbnN0IGF0dHJpYnV0ZVZhbHVlIG9mIHZhbHVlcykge1xuICAgIGF0dHJpYnV0ZXMucHVzaCguLi5yZXNvbHZlUmFuc2Fja0F0dHJpYnV0ZXMoe21vZGVsQ2xhc3MsIHZhbHVlOiBhdHRyaWJ1dGVWYWx1ZX0pKVxuICB9XG5cbiAgaWYgKGF0dHJpYnV0ZXMubGVuZ3RoIDwgMSkge1xuICAgIHRocm93IG5ldyBFcnJvcihcIlJhbnNhY2sgY29uZGl0aW9uIG11c3QgaW5jbHVkZSBhdCBsZWFzdCBvbmUgYXR0cmlidXRlXCIpXG4gIH1cblxuICByZXR1cm4gYXR0cmlidXRlc1xufVxuXG4vKipcbiAqIFJ1bnMgbm9ybWFsaXplIGFkdmFuY2VkIGF0dHJpYnV0ZSB2YWx1ZXMuXG4gKiBAcGFyYW0gez99IHZhbHVlIC0gQWR2YW5jZWQgYXR0cmlidXRlIHZhbHVlLlxuICogQHJldHVybnMge3N0cmluZ1tdfSAtIEF0dHJpYnV0ZSBwYXRoIHN0cmluZ3MuXG4gKi9cbmZ1bmN0aW9uIG5vcm1hbGl6ZUFkdmFuY2VkQXR0cmlidXRlVmFsdWVzKHZhbHVlKSB7XG4gIGlmICh0eXBlb2YgdmFsdWUgPT09IFwic3RyaW5nXCIpIHJldHVybiBbdmFsdWVdXG5cbiAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgcmV0dXJuIHZhbHVlLm1hcCgoZW50cnkpID0+IG5vcm1hbGl6ZUFkdmFuY2VkQXR0cmlidXRlVmFsdWUoZW50cnkpKVxuICB9XG5cbiAgaWYgKGlzUGxhaW5PYmplY3QodmFsdWUpKSB7XG4gICAgcmV0dXJuIG5vcm1hbGl6ZVJhbnNhY2tDb2xsZWN0aW9uKHZhbHVlLCBcImF0dHJpYnV0ZXNcIikubWFwKChlbnRyeSkgPT4gbm9ybWFsaXplQWR2YW5jZWRBdHRyaWJ1dGVWYWx1ZShlbnRyeSkpXG4gIH1cblxuICB0aHJvdyBuZXcgRXJyb3IoYFJhbnNhY2sgY29uZGl0aW9uIGF0dHJpYnV0ZXMgbXVzdCBiZSBzdHJpbmdzLCBhcnJheXMsIG9yIG9iamVjdHMsIGdvdDogJHt0eXBlb2YgdmFsdWV9YClcbn1cblxuLyoqXG4gKiBSdW5zIG5vcm1hbGl6ZSBhZHZhbmNlZCBhdHRyaWJ1dGUgdmFsdWUuXG4gKiBAcGFyYW0gez99IHZhbHVlIC0gQWR2YW5jZWQgYXR0cmlidXRlIGVudHJ5LlxuICogQHJldHVybnMge3N0cmluZ30gLSBBdHRyaWJ1dGUgcGF0aCBzdHJpbmcuXG4gKi9cbmZ1bmN0aW9uIG5vcm1hbGl6ZUFkdmFuY2VkQXR0cmlidXRlVmFsdWUodmFsdWUpIHtcbiAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gXCJzdHJpbmdcIikgcmV0dXJuIHZhbHVlXG5cbiAgaWYgKGlzUGxhaW5PYmplY3QodmFsdWUpICYmIHR5cGVvZiB2YWx1ZS5uYW1lID09PSBcInN0cmluZ1wiKSB7XG4gICAgcmV0dXJuIHZhbHVlLm5hbWVcbiAgfVxuXG4gIHRocm93IG5ldyBFcnJvcihgUmFuc2FjayBjb25kaXRpb24gYXR0cmlidXRlIGVudHJpZXMgbXVzdCBiZSBzdHJpbmdzIG9yIHtuYW1lfSwgZ290OiAke3R5cGVvZiB2YWx1ZX1gKVxufVxuXG4vKipcbiAqIFJ1bnMgcmVzb2x2ZSByYW5zYWNrIGF0dHJpYnV0ZXMuXG4gKiBAcGFyYW0ge29iamVjdH0gYXJncyAtIE9wdGlvbnMuXG4gKiBAcGFyYW0ge1JhbnNhY2tNb2RlbENsYXNzfSBhcmdzLm1vZGVsQ2xhc3MgLSBNb2RlbCBjbGFzcy5cbiAqIEBwYXJhbSB7c3RyaW5nfSBhcmdzLnZhbHVlIC0gQXR0cmlidXRlIHBhdGggdmFsdWUuXG4gKiBAcmV0dXJucyB7UmFuc2Fja0F0dHJpYnV0ZVtdfSAtIFJlc29sdmVkIGF0dHJpYnV0ZXMuXG4gKi9cbmZ1bmN0aW9uIHJlc29sdmVSYW5zYWNrQXR0cmlidXRlcyh7bW9kZWxDbGFzcywgdmFsdWV9KSB7XG4gIHJldHVybiB2YWx1ZS5zcGxpdChcIl9vcl9cIikubWFwKChhdHRyaWJ1dGVWYWx1ZSkgPT4ge1xuICAgIGNvbnN0IHJlc29sdmVkUGF0aCA9IHJlc29sdmVSYW5zYWNrUGF0aCh7bW9kZWxDbGFzcywgdmFsdWU6IGF0dHJpYnV0ZVZhbHVlfSlcbiAgICBjb25zdCB0YXJnZXRNb2RlbENsYXNzID0gbW9kZWxDbGFzc0F0UGF0aCh7bW9kZWxDbGFzcywgcGF0aDogcmVzb2x2ZWRQYXRoLnBhdGh9KVxuICAgIGNvbnN0IGF0dHJpYnV0ZU5hbWUgPSByZXNvbHZlQXR0cmlidXRlTmFtZSh7bW9kZWxDbGFzczogdGFyZ2V0TW9kZWxDbGFzcywgdmFsdWU6IHJlc29sdmVkUGF0aC5hdHRyaWJ1dGVWYWx1ZX0pXG5cbiAgICBpZiAoIWF0dHJpYnV0ZU5hbWUpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgVW5rbm93biByYW5zYWNrIGF0dHJpYnV0ZSBcIiR7cmVzb2x2ZWRQYXRoLmF0dHJpYnV0ZVZhbHVlfVwiIGZvciAke3RhcmdldE1vZGVsQ2xhc3MubmFtZX1gKVxuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICBhdHRyaWJ1dGVOYW1lLFxuICAgICAgcGF0aDogcmVzb2x2ZWRQYXRoLnBhdGhcbiAgICB9XG4gIH0pXG59XG5cbi8qKlxuICogUnVucyBtb2RlbCBjbGFzcyBhdCBwYXRoLlxuICogQHBhcmFtIHtvYmplY3R9IGFyZ3MgLSBPcHRpb25zLlxuICogQHBhcmFtIHtSYW5zYWNrTW9kZWxDbGFzc30gYXJncy5tb2RlbENsYXNzIC0gUm9vdCBtb2RlbCBjbGFzcy5cbiAqIEBwYXJhbSB7c3RyaW5nW119IGFyZ3MucGF0aCAtIFJlbGF0aW9uc2hpcCBwYXRoLlxuICogQHJldHVybnMge1JhbnNhY2tNb2RlbENsYXNzfSAtIFRhcmdldCBtb2RlbCBjbGFzcy5cbiAqL1xuZnVuY3Rpb24gbW9kZWxDbGFzc0F0UGF0aCh7bW9kZWxDbGFzcywgcGF0aH0pIHtcbiAgbGV0IGN1cnJlbnRNb2RlbENsYXNzID0gbW9kZWxDbGFzc1xuXG4gIGZvciAoY29uc3QgcmVsYXRpb25zaGlwTmFtZSBvZiBwYXRoKSB7XG4gICAgY29uc3QgcmVsYXRpb25zaGlwID0gcmVsYXRpb25zaGlwRW50cmllcyhjdXJyZW50TW9kZWxDbGFzcylbcmVsYXRpb25zaGlwTmFtZV1cblxuICAgIGlmICghcmVsYXRpb25zaGlwKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYFVua25vd24gcmFuc2FjayByZWxhdGlvbnNoaXAgXCIke3JlbGF0aW9uc2hpcE5hbWV9XCIgZm9yICR7Y3VycmVudE1vZGVsQ2xhc3MubmFtZX1gKVxuICAgIH1cblxuICAgIGN1cnJlbnRNb2RlbENsYXNzID0gcmVsYXRpb25zaGlwLnRhcmdldE1vZGVsQ2xhc3NcbiAgfVxuXG4gIHJldHVybiBjdXJyZW50TW9kZWxDbGFzc1xufVxuXG4vKipcbiAqIFJ1bnMgcmVzb2x2ZSByYW5zYWNrIHBhdGguXG4gKiBAcGFyYW0ge29iamVjdH0gYXJncyAtIE9wdGlvbnMuXG4gKiBAcGFyYW0ge1JhbnNhY2tNb2RlbENsYXNzfSBhcmdzLm1vZGVsQ2xhc3MgLSBDdXJyZW50IG1vZGVsIGNsYXNzLlxuICogQHBhcmFtIHtzdHJpbmd9IGFyZ3MudmFsdWUgLSBSZW1haW5pbmcgcGF0aCB2YWx1ZS5cbiAqIEByZXR1cm5zIHt7YXR0cmlidXRlVmFsdWU6IHN0cmluZywgcGF0aDogc3RyaW5nW119fSAtIFJlc29sdmVkIHJlbGF0aW9uc2hpcCBwYXRoIGFuZCByZW1haW5pbmcgYXR0cmlidXRlIHZhbHVlLlxuICovXG5mdW5jdGlvbiByZXNvbHZlUmFuc2Fja1BhdGgoe21vZGVsQ2xhc3MsIHZhbHVlfSkge1xuICAvKipcbiAgICogUGF0aC5cbiAgICogQHR5cGUge3N0cmluZ1tdfSAqL1xuICBjb25zdCBwYXRoID0gW11cbiAgbGV0IGN1cnJlbnRNb2RlbENsYXNzID0gbW9kZWxDbGFzc1xuICBsZXQgcmVtYWluaW5nVmFsdWUgPSB2YWx1ZVxuXG4gIHdoaWxlICh0cnVlKSB7XG4gICAgaWYgKHJlc29sdmVBdHRyaWJ1dGVOYW1lKHttb2RlbENsYXNzOiBjdXJyZW50TW9kZWxDbGFzcywgdmFsdWU6IHJlbWFpbmluZ1ZhbHVlfSkpIHtcbiAgICAgIGJyZWFrXG4gICAgfVxuXG4gICAgY29uc3QgbWF0Y2ggPSBmaW5kUmVsYXRpb25zaGlwUHJlZml4KHtcbiAgICAgIG1vZGVsQ2xhc3M6IGN1cnJlbnRNb2RlbENsYXNzLFxuICAgICAgdmFsdWU6IHJlbWFpbmluZ1ZhbHVlXG4gICAgfSlcblxuICAgIGlmICghbWF0Y2gpIGJyZWFrXG5cbiAgICBwYXRoLnB1c2gobWF0Y2gucmVsYXRpb25zaGlwTmFtZSlcbiAgICBjdXJyZW50TW9kZWxDbGFzcyA9IG1hdGNoLnRhcmdldE1vZGVsQ2xhc3NcbiAgICByZW1haW5pbmdWYWx1ZSA9IG1hdGNoLnJlbWFpbmluZ1ZhbHVlXG4gIH1cblxuICBpZiAocmVtYWluaW5nVmFsdWUubGVuZ3RoIDwgMSkge1xuICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCByYW5zYWNrIGtleSBwYXRoOiAke3ZhbHVlfWApXG4gIH1cblxuICByZXR1cm4ge1xuICAgIGF0dHJpYnV0ZVZhbHVlOiByZW1haW5pbmdWYWx1ZSxcbiAgICBwYXRoXG4gIH1cbn1cblxuLyoqXG4gKiBSdW5zIGZpbmQgcmVsYXRpb25zaGlwIHByZWZpeC5cbiAqIEBwYXJhbSB7b2JqZWN0fSBhcmdzIC0gT3B0aW9ucy5cbiAqIEBwYXJhbSB7UmFuc2Fja01vZGVsQ2xhc3N9IGFyZ3MubW9kZWxDbGFzcyAtIEN1cnJlbnQgbW9kZWwgY2xhc3MuXG4gKiBAcGFyYW0ge3N0cmluZ30gYXJncy52YWx1ZSAtIFJlbWFpbmluZyB2YWx1ZSB0byBtYXRjaC5cbiAqIEByZXR1cm5zIHt7cmVsYXRpb25zaGlwTmFtZTogc3RyaW5nLCByZW1haW5pbmdWYWx1ZTogc3RyaW5nLCB0YXJnZXRNb2RlbENsYXNzOiBSYW5zYWNrTW9kZWxDbGFzc30gfCBudWxsfSAtIE1hdGNoaW5nIHJlbGF0aW9uc2hpcCBwcmVmaXguXG4gKi9cbmZ1bmN0aW9uIGZpbmRSZWxhdGlvbnNoaXBQcmVmaXgoe21vZGVsQ2xhc3MsIHZhbHVlfSkge1xuICBsZXQgYmVzdE1hdGNoID0gbnVsbFxuXG4gIGZvciAoY29uc3QgcmVsYXRpb25zaGlwTmFtZSBvZiBPYmplY3Qua2V5cyhyZWxhdGlvbnNoaXBFbnRyaWVzKG1vZGVsQ2xhc3MpKSkge1xuICAgIGNvbnN0IHJlbGF0aW9uc2hpcCA9IHJlbGF0aW9uc2hpcEVudHJpZXMobW9kZWxDbGFzcylbcmVsYXRpb25zaGlwTmFtZV1cblxuICAgIGZvciAoY29uc3QgY2FuZGlkYXRlIG9mIHJlbGF0aW9uc2hpcENhbmRpZGF0ZXMocmVsYXRpb25zaGlwTmFtZSkpIHtcbiAgICAgIGNvbnN0IHJlbWFpbmluZ1ZhbHVlID0gc3RyaXBSZWxhdGlvbnNoaXBDYW5kaWRhdGUodmFsdWUsIGNhbmRpZGF0ZSlcblxuICAgICAgaWYgKHJlbWFpbmluZ1ZhbHVlID09PSBudWxsKSBjb250aW51ZVxuICAgICAgaWYgKHJlbWFpbmluZ1ZhbHVlLmxlbmd0aCA8IDEpIGNvbnRpbnVlXG4gICAgICBpZiAoYmVzdE1hdGNoICYmIGNhbmRpZGF0ZS5sZW5ndGggPD0gYmVzdE1hdGNoLmNhbmRpZGF0ZUxlbmd0aCkgY29udGludWVcblxuICAgICAgYmVzdE1hdGNoID0ge1xuICAgICAgICBjYW5kaWRhdGVMZW5ndGg6IGNhbmRpZGF0ZS5sZW5ndGgsXG4gICAgICAgIHJlbGF0aW9uc2hpcE5hbWUsXG4gICAgICAgIHJlbWFpbmluZ1ZhbHVlLFxuICAgICAgICB0YXJnZXRNb2RlbENsYXNzOiByZWxhdGlvbnNoaXAudGFyZ2V0TW9kZWxDbGFzc1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGlmICghYmVzdE1hdGNoKSByZXR1cm4gbnVsbFxuXG4gIHJldHVybiB7XG4gICAgcmVsYXRpb25zaGlwTmFtZTogYmVzdE1hdGNoLnJlbGF0aW9uc2hpcE5hbWUsXG4gICAgcmVtYWluaW5nVmFsdWU6IGJlc3RNYXRjaC5yZW1haW5pbmdWYWx1ZSxcbiAgICB0YXJnZXRNb2RlbENsYXNzOiBiZXN0TWF0Y2gudGFyZ2V0TW9kZWxDbGFzc1xuICB9XG59XG5cbi8qKlxuICogUmV0dXJucyB0aGUgcG9ydGlvbiBvZiBgdmFsdWVgIGFmdGVyIGBjYW5kaWRhdGVgIHdoZW4gYGNhbmRpZGF0ZWBcbiAqIHNpdHMgYXQgYSByZWxhdGlvbnNoaXAtcGF0aCBib3VuZGFyeSwgb3IgbnVsbCB3aGVuIHRoZXJlJ3Mgbm9cbiAqIGJvdW5kYXJ5IG1hdGNoLiBUd28gYm91bmRhcnkgZm9ybXMgYXJlIGFjY2VwdGVkOlxuICogLSBzbmFrZTogYDxjYW5kaWRhdGU+X2AgZm9sbG93ZWQgYnkgdGhlIHJlc3Qgb2YgdGhlIHBhdGggKGUuZy5cbiAqICAgYHRhc2tfcHJvamVjdF9pZGAgYWdhaW5zdCBjYW5kaWRhdGUgYHRhc2tgIHJldHVybnMgYHByb2plY3RfaWRgKS5cbiAqIC0gY2FtZWw6IGA8Y2FuZGlkYXRlPmAgaW1tZWRpYXRlbHkgZm9sbG93ZWQgYnkgYW4gdXBwZXJjYXNlIGxldHRlcixcbiAqICAgd2hpY2ggbWFya3MgYSBuZXcgd29yZCBpbiBjYW1lbENhc2UgKGUuZy4gYHRhc2tQcm9qZWN0SWRgIGFnYWluc3RcbiAqICAgY2FuZGlkYXRlIGB0YXNrYCByZXR1cm5zIGBwcm9qZWN0SWRgIHdpdGggdGhlIGxlYWRpbmcgYFBgXG4gKiAgIGxvd2VyY2FzZWQgc28gdGhlIHJlbWFpbmRlciBzdGF5cyBpbiBjYWxsZXItZm9ybSBmb3IgdGhlIG5leHRcbiAqICAgYXR0cmlidXRlIC8gcmVsYXRpb25zaGlwIG1hdGNoKS5cbiAqIEBwYXJhbSB7c3RyaW5nfSB2YWx1ZSAtIFJlbWFpbmluZyByYW5zYWNrIHBhdGguXG4gKiBAcGFyYW0ge3N0cmluZ30gY2FuZGlkYXRlIC0gUmVsYXRpb25zaGlwIG5hbWUgY2FuZGlkYXRlLlxuICogQHJldHVybnMge3N0cmluZyB8IG51bGx9IC0gUmVtYWluZGVyIGFmdGVyIHRoZSBjYW5kaWRhdGUsIG9yIG51bGwuXG4gKi9cbmZ1bmN0aW9uIHN0cmlwUmVsYXRpb25zaGlwQ2FuZGlkYXRlKHZhbHVlLCBjYW5kaWRhdGUpIHtcbiAgaWYgKHZhbHVlLnN0YXJ0c1dpdGgoYCR7Y2FuZGlkYXRlfV9gKSkge1xuICAgIHJldHVybiB2YWx1ZS5zbGljZShjYW5kaWRhdGUubGVuZ3RoICsgMSlcbiAgfVxuXG4gIGlmICh2YWx1ZS5sZW5ndGggPD0gY2FuZGlkYXRlLmxlbmd0aCkgcmV0dXJuIG51bGxcbiAgaWYgKCF2YWx1ZS5zdGFydHNXaXRoKGNhbmRpZGF0ZSkpIHJldHVybiBudWxsXG5cbiAgY29uc3QgbmV4dENoYXIgPSB2YWx1ZS5jaGFyQXQoY2FuZGlkYXRlLmxlbmd0aClcblxuICBpZiAobmV4dENoYXIgPCBcIkFcIiB8fCBuZXh0Q2hhciA+IFwiWlwiKSByZXR1cm4gbnVsbFxuXG4gIHJldHVybiBuZXh0Q2hhci50b0xvd2VyQ2FzZSgpICsgdmFsdWUuc2xpY2UoY2FuZGlkYXRlLmxlbmd0aCArIDEpXG59XG5cbi8qKlxuICogUnVucyByZWxhdGlvbnNoaXAgY2FuZGlkYXRlcy5cbiAqIEBwYXJhbSB7c3RyaW5nfSByZWxhdGlvbnNoaXBOYW1lIC0gUmVsYXRpb25zaGlwIG5hbWUuXG4gKiBAcmV0dXJucyB7c3RyaW5nW119IC0gQ2FuZGlkYXRlIHRva2VucyBmb3IgbWF0Y2hpbmcuXG4gKi9cbmZ1bmN0aW9uIHJlbGF0aW9uc2hpcENhbmRpZGF0ZXMocmVsYXRpb25zaGlwTmFtZSkge1xuICByZXR1cm4gdW5pcXVuaXplKFtyZWxhdGlvbnNoaXBOYW1lLCBpbmZsZWN0aW9uLnVuZGVyc2NvcmUocmVsYXRpb25zaGlwTmFtZSldKVxufVxuXG4vKipcbiAqIFJ1bnMgcmVzb2x2ZSBhdHRyaWJ1dGUgbmFtZS5cbiAqIEBwYXJhbSB7b2JqZWN0fSBhcmdzIC0gT3B0aW9ucy5cbiAqIEBwYXJhbSB7UmFuc2Fja01vZGVsQ2xhc3N9IGFyZ3MubW9kZWxDbGFzcyAtIE1vZGVsIGNsYXNzLlxuICogQHBhcmFtIHtzdHJpbmd9IGFyZ3MudmFsdWUgLSBBdHRyaWJ1dGUgY2FuZGlkYXRlLlxuICogQHJldHVybnMge3N0cmluZyB8IHVuZGVmaW5lZH0gLSBSZXNvbHZlZCBhdHRyaWJ1dGUgbmFtZS5cbiAqL1xuZnVuY3Rpb24gcmVzb2x2ZUF0dHJpYnV0ZU5hbWUoe21vZGVsQ2xhc3MsIHZhbHVlfSkge1xuICBmb3IgKGNvbnN0IFthdHRyaWJ1dGVOYW1lLCBjb2x1bW5OYW1lXSBvZiBPYmplY3QuZW50cmllcyhhdHRyaWJ1dGVFbnRyaWVzKG1vZGVsQ2xhc3MpKSkge1xuICAgIGlmIChtYXRjaGVzQXR0cmlidXRlVmFsdWUoe2F0dHJpYnV0ZU5hbWUsIGNvbHVtbk5hbWUsIHZhbHVlfSkpIHtcbiAgICAgIHJldHVybiBhdHRyaWJ1dGVOYW1lXG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHVuZGVmaW5lZFxufVxuXG4vKipcbiAqIFJ1bnMgcmVsYXRpb25zaGlwIGVudHJpZXMuXG4gKiBAcGFyYW0ge1JhbnNhY2tNb2RlbENsYXNzfSBtb2RlbENsYXNzIC0gTW9kZWwgY2xhc3MuXG4gKiBAcmV0dXJucyB7UmVjb3JkPHN0cmluZywge3RhcmdldE1vZGVsQ2xhc3M6IFJhbnNhY2tNb2RlbENsYXNzfT59IC0gUmVsYXRpb25zaGlwIGVudHJpZXMga2V5ZWQgYnkgbmFtZS5cbiAqL1xuZnVuY3Rpb24gcmVsYXRpb25zaGlwRW50cmllcyhtb2RlbENsYXNzKSB7XG4gIGlmICh0eXBlb2YgLyoqIEB0eXBlIHs/fSAqLyAobW9kZWxDbGFzcykuZ2V0UmVsYXRpb25zaGlwc01hcCA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgcmV0dXJuIGJhY2tlbmRSZWxhdGlvbnNoaXBFbnRyaWVzKG1vZGVsQ2xhc3MpXG4gIH1cblxuICBpZiAodHlwZW9mIC8qKiBAdHlwZSB7P30gKi8gKG1vZGVsQ2xhc3MpLnJlbGF0aW9uc2hpcERlZmluaXRpb25zID09PSBcImZ1bmN0aW9uXCIgJiZcbiAgICB0eXBlb2YgLyoqIEB0eXBlIHs/fSAqLyAobW9kZWxDbGFzcykucmVsYXRpb25zaGlwTW9kZWxDbGFzc2VzID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICByZXR1cm4gZnJvbnRlbmRSZWxhdGlvbnNoaXBFbnRyaWVzKG1vZGVsQ2xhc3MpXG4gIH1cblxuICByZXR1cm4ge31cbn1cblxuLyoqXG4gKiBSdW5zIGJhY2tlbmQgcmVsYXRpb25zaGlwIGVudHJpZXMuXG4gKiBAcGFyYW0ge1JhbnNhY2tNb2RlbENsYXNzfSBtb2RlbENsYXNzIC0gQmFja2VuZCBtb2RlbCBjbGFzcy5cbiAqIEByZXR1cm5zIHtSZWNvcmQ8c3RyaW5nLCB7dGFyZ2V0TW9kZWxDbGFzczogUmFuc2Fja01vZGVsQ2xhc3N9Pn0gLSBSZWxhdGlvbnNoaXAgZW50cmllcyBrZXllZCBieSBuYW1lLlxuICovXG5mdW5jdGlvbiBiYWNrZW5kUmVsYXRpb25zaGlwRW50cmllcyhtb2RlbENsYXNzKSB7XG4gIC8qKlxuICAgKiBFbnRyaWVzLlxuICAgKiBAdHlwZSB7UmVjb3JkPHN0cmluZywge3RhcmdldE1vZGVsQ2xhc3M6IFJhbnNhY2tNb2RlbENsYXNzfT59ICovXG4gIGNvbnN0IGVudHJpZXMgPSB7fVxuICBjb25zdCByZWxhdGlvbnNoaXBzTWFwID0gLyoqIEB0eXBlIHs/fSAqLyAobW9kZWxDbGFzcykuZ2V0UmVsYXRpb25zaGlwc01hcCgpXG5cbiAgZm9yIChjb25zdCByZWxhdGlvbnNoaXBOYW1lIG9mIE9iamVjdC5rZXlzKHJlbGF0aW9uc2hpcHNNYXApKSB7XG4gICAgY29uc3QgcmVsYXRpb25zaGlwID0gcmVsYXRpb25zaGlwc01hcFtyZWxhdGlvbnNoaXBOYW1lXVxuXG4gICAgaWYgKHR5cGVvZiByZWxhdGlvbnNoaXAuaXNQb2x5bW9ycGhpYyA9PT0gXCJmdW5jdGlvblwiICYmIHJlbGF0aW9uc2hpcC5pc1BvbHltb3JwaGljKCkpIGNvbnRpbnVlXG5cbiAgICBjb25zdCB0YXJnZXRNb2RlbENsYXNzID0gcmVsYXRpb25zaGlwLmdldFRhcmdldE1vZGVsQ2xhc3MoKVxuXG4gICAgaWYgKCF0YXJnZXRNb2RlbENsYXNzKSBjb250aW51ZVxuXG4gICAgZW50cmllc1tyZWxhdGlvbnNoaXBOYW1lXSA9IHt0YXJnZXRNb2RlbENsYXNzfVxuICB9XG5cbiAgcmV0dXJuIGVudHJpZXNcbn1cblxuLyoqXG4gKiBSdW5zIGZyb250ZW5kIHJlbGF0aW9uc2hpcCBlbnRyaWVzLlxuICogQHBhcmFtIHtSYW5zYWNrTW9kZWxDbGFzc30gbW9kZWxDbGFzcyAtIEZyb250ZW5kIG1vZGVsIGNsYXNzLlxuICogQHJldHVybnMge1JlY29yZDxzdHJpbmcsIHt0YXJnZXRNb2RlbENsYXNzOiBSYW5zYWNrTW9kZWxDbGFzc30+fSAtIFJlbGF0aW9uc2hpcCBlbnRyaWVzIGtleWVkIGJ5IG5hbWUuXG4gKi9cbmZ1bmN0aW9uIGZyb250ZW5kUmVsYXRpb25zaGlwRW50cmllcyhtb2RlbENsYXNzKSB7XG4gIC8qKlxuICAgKiBFbnRyaWVzLlxuICAgKiBAdHlwZSB7UmVjb3JkPHN0cmluZywge3RhcmdldE1vZGVsQ2xhc3M6IFJhbnNhY2tNb2RlbENsYXNzfT59ICovXG4gIGNvbnN0IGVudHJpZXMgPSB7fVxuICBjb25zdCBkZWZpbml0aW9ucyA9IC8qKiBAdHlwZSB7P30gKi8gKG1vZGVsQ2xhc3MpLnJlbGF0aW9uc2hpcERlZmluaXRpb25zKClcbiAgY29uc3QgcmVsYXRpb25zaGlwTW9kZWxDbGFzc2VzID0gLyoqIEB0eXBlIHs/fSAqLyAobW9kZWxDbGFzcykucmVsYXRpb25zaGlwTW9kZWxDbGFzc2VzKClcblxuICBmb3IgKGNvbnN0IHJlbGF0aW9uc2hpcE5hbWUgb2YgT2JqZWN0LmtleXMoZGVmaW5pdGlvbnMpKSB7XG4gICAgY29uc3QgdGFyZ2V0TW9kZWxDbGFzcyA9IHJlc29sdmVGcm9udGVuZE1vZGVsQ2xhc3MocmVsYXRpb25zaGlwTW9kZWxDbGFzc2VzW3JlbGF0aW9uc2hpcE5hbWVdKVxuXG4gICAgaWYgKCF0YXJnZXRNb2RlbENsYXNzKSBjb250aW51ZVxuXG4gICAgZW50cmllc1tyZWxhdGlvbnNoaXBOYW1lXSA9IHt0YXJnZXRNb2RlbENsYXNzfVxuICB9XG5cbiAgcmV0dXJuIGVudHJpZXNcbn1cblxuLyoqXG4gKiBSdW5zIGF0dHJpYnV0ZSBlbnRyaWVzLlxuICogQHBhcmFtIHtSYW5zYWNrTW9kZWxDbGFzc30gbW9kZWxDbGFzcyAtIE1vZGVsIGNsYXNzLlxuICogQHJldHVybnMge1JlY29yZDxzdHJpbmcsIHN0cmluZz59IC0gQXR0cmlidXRlLXRvLWNvbHVtbiBlbnRyaWVzIGtleWVkIGJ5IGF0dHJpYnV0ZSBuYW1lLlxuICovXG5mdW5jdGlvbiBhdHRyaWJ1dGVFbnRyaWVzKG1vZGVsQ2xhc3MpIHtcbiAgaWYgKHR5cGVvZiAvKiogQHR5cGUgez99ICovIChtb2RlbENsYXNzKS5nZXRBdHRyaWJ1dGVOYW1lVG9Db2x1bW5OYW1lTWFwID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICByZXR1cm4gLyoqIEB0eXBlIHtSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+fSAqLyAoKC8qKiBAdHlwZSB7P30gKi8gKG1vZGVsQ2xhc3MpLmdldEF0dHJpYnV0ZU5hbWVUb0NvbHVtbk5hbWVNYXAoKSkpXG4gIH1cblxuICBjb25zdCByZXNvdXJjZUNvbmZpZyA9IHR5cGVvZiAvKiogQHR5cGUgez99ICovIChtb2RlbENsYXNzKS5yZXNvdXJjZUNvbmZpZyA9PT0gXCJmdW5jdGlvblwiXG4gICAgPyAvKiogQHR5cGUgez99ICovIChtb2RlbENsYXNzKS5yZXNvdXJjZUNvbmZpZygpXG4gICAgOiB7fVxuICBjb25zdCBhdHRyaWJ1dGVzID0gcmVzb3VyY2VDb25maWcuYXR0cmlidXRlc1xuICAvKipcbiAgICogRW50cmllcy5cbiAgICogQHR5cGUge1JlY29yZDxzdHJpbmcsIHN0cmluZz59ICovXG4gIGNvbnN0IGVudHJpZXMgPSB7fVxuXG4gIGlmIChBcnJheS5pc0FycmF5KGF0dHJpYnV0ZXMpKSB7XG4gICAgZm9yIChjb25zdCBhdHRyaWJ1dGVOYW1lIG9mIGF0dHJpYnV0ZXMpIHtcbiAgICAgIGlmICh0eXBlb2YgYXR0cmlidXRlTmFtZSAhPT0gXCJzdHJpbmdcIikgY29udGludWVcblxuICAgICAgZW50cmllc1thdHRyaWJ1dGVOYW1lXSA9IGF0dHJpYnV0ZU5hbWVcbiAgICB9XG4gIH0gZWxzZSBpZiAoaXNQbGFpbk9iamVjdChhdHRyaWJ1dGVzKSkge1xuICAgIGZvciAoY29uc3QgYXR0cmlidXRlTmFtZSBvZiBPYmplY3Qua2V5cyhhdHRyaWJ1dGVzKSkge1xuICAgICAgZW50cmllc1thdHRyaWJ1dGVOYW1lXSA9IGF0dHJpYnV0ZU5hbWVcbiAgICB9XG4gIH1cblxuICByZXR1cm4gZW50cmllc1xufVxuXG4vKipcbiAqIFJ1bnMgbWF0Y2hlcyBhdHRyaWJ1dGUgdmFsdWUuXG4gKiBAcGFyYW0ge29iamVjdH0gYXJncyAtIE9wdGlvbnMuXG4gKiBAcGFyYW0ge3N0cmluZ30gYXJncy5hdHRyaWJ1dGVOYW1lIC0gQXR0cmlidXRlIG5hbWUuXG4gKiBAcGFyYW0ge3N0cmluZ30gYXJncy5jb2x1bW5OYW1lIC0gQ29sdW1uIG5hbWUuXG4gKiBAcGFyYW0ge3N0cmluZ30gYXJncy52YWx1ZSAtIENhbmRpZGF0ZSB2YWx1ZS5cbiAqIEByZXR1cm5zIHtib29sZWFufSAtIFdoZXRoZXIgdGhlIGNhbmRpZGF0ZSByZXNvbHZlcyB0byB0aGUgYXR0cmlidXRlLlxuICovXG5mdW5jdGlvbiBtYXRjaGVzQXR0cmlidXRlVmFsdWUoe2F0dHJpYnV0ZU5hbWUsIGNvbHVtbk5hbWUsIHZhbHVlfSkge1xuICByZXR1cm4gdW5pcXVuaXplKFtcbiAgICBhdHRyaWJ1dGVOYW1lLFxuICAgIGNvbHVtbk5hbWUsXG4gICAgaW5mbGVjdGlvbi51bmRlcnNjb3JlKGF0dHJpYnV0ZU5hbWUpLFxuICAgIGluZmxlY3Rpb24udW5kZXJzY29yZShjb2x1bW5OYW1lKVxuICBdKS5pbmNsdWRlcyh2YWx1ZSlcbn1cblxuLyoqXG4gKiBSdW5zIHBhcnNlIHJhbnNhY2sga2V5LlxuICogQHBhcmFtIHtzdHJpbmd9IGtleSAtIFJhbnNhY2sga2V5LlxuICogQHJldHVybnMge3twYXRoVmFsdWU6IHN0cmluZywgcHJlZGljYXRlOiBSYW5zYWNrUHJlZGljYXRlfSB8IG51bGx9IC0gUGFyc2VkIGtleS5cbiAqL1xuZnVuY3Rpb24gcGFyc2VSYW5zYWNrS2V5KGtleSkge1xuICBmb3IgKGNvbnN0IHByZWRpY2F0ZSBvZiBzdXBwb3J0ZWRQcmVkaWNhdGVzKSB7XG4gICAgY29uc3Qgc3VmZml4ID0gYF8ke3ByZWRpY2F0ZX1gXG4gICAgaWYgKCFrZXkuZW5kc1dpdGgoc3VmZml4KSkgY29udGludWVcblxuICAgIGNvbnN0IHBhdGhWYWx1ZSA9IGtleS5zbGljZSgwLCBrZXkubGVuZ3RoIC0gc3VmZml4Lmxlbmd0aClcblxuICAgIGlmIChwYXRoVmFsdWUubGVuZ3RoIDwgMSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIHJhbnNhY2sga2V5OiAke2tleX1gKVxuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICBwYXRoVmFsdWUsXG4gICAgICBwcmVkaWNhdGU6IC8qKiBAdHlwZSB7UmFuc2Fja1ByZWRpY2F0ZX0gKi8gKHByZWRpY2F0ZSlcbiAgICB9XG4gIH1cblxuICBmb3IgKGNvbnN0IHByZWRpY2F0ZSBvZiBzdXBwb3J0ZWRQcmVkaWNhdGVzKSB7XG4gICAgY29uc3QgY2FtZWxTdWZmaXggPSBzbmFrZVRvQ2FtZWxTdWZmaXgocHJlZGljYXRlKVxuXG4gICAgaWYgKCFrZXkuZW5kc1dpdGgoY2FtZWxTdWZmaXgpKSBjb250aW51ZVxuXG4gICAgY29uc3QgcGF0aFZhbHVlID0ga2V5LnNsaWNlKDAsIGtleS5sZW5ndGggLSBjYW1lbFN1ZmZpeC5sZW5ndGgpXG5cbiAgICBpZiAocGF0aFZhbHVlLmxlbmd0aCA8IDEpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCByYW5zYWNrIGtleTogJHtrZXl9YClcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgcGF0aFZhbHVlLFxuICAgICAgcHJlZGljYXRlOiAvKiogQHR5cGUge1JhbnNhY2tQcmVkaWNhdGV9ICovIChwcmVkaWNhdGUpXG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIG51bGxcbn1cblxuLyoqXG4gKiBSdW5zIHNuYWtlIHRvIGNhbWVsIHN1ZmZpeC5cbiAqIEBwYXJhbSB7c3RyaW5nfSB2YWx1ZSAtIFNuYWtlLWNhc2UgcHJlZGljYXRlLlxuICogQHJldHVybnMge3N0cmluZ30gLSBDYW1lbENhc2UgcHJlZGljYXRlIHN1ZmZpeCB1c2VkIGluIHJhbnNhY2sga2V5cy5cbiAqL1xuZnVuY3Rpb24gc25ha2VUb0NhbWVsU3VmZml4KHZhbHVlKSB7XG4gIGNvbnN0IHNlZ21lbnRzID0gdmFsdWUuc3BsaXQoXCJfXCIpXG5cbiAgcmV0dXJuIHNlZ21lbnRzLm1hcCgoc2VnbWVudCkgPT4gc2VnbWVudC5jaGFyQXQoMCkudG9VcHBlckNhc2UoKSArIHNlZ21lbnQuc2xpY2UoMSkpLmpvaW4oXCJcIilcbn1cblxuLyoqXG4gKiBSdW5zIG5vcm1hbGl6ZSByYW5zYWNrIHZhbHVlLlxuICogQHBhcmFtIHtvYmplY3R9IGFyZ3MgLSBPcHRpb25zLlxuICogQHBhcmFtIHtSYW5zYWNrUHJlZGljYXRlfSBhcmdzLnByZWRpY2F0ZSAtIFBhcnNlZCBwcmVkaWNhdGUuXG4gKiBAcGFyYW0gez99IGFyZ3MudmFsdWUgLSBSYXcgdmFsdWUuXG4gKiBAcmV0dXJucyB7P30gLSBOb3JtYWxpemVkIHZhbHVlLlxuICovXG5mdW5jdGlvbiBub3JtYWxpemVSYW5zYWNrVmFsdWUoe3ByZWRpY2F0ZSwgdmFsdWV9KSB7XG4gIGlmIChwcmVkaWNhdGUgPT09IFwibnVsbFwiKSB7XG4gICAgcmV0dXJuIG5vcm1hbGl6ZVJhbnNhY2tOdWxsVmFsdWUodmFsdWUpXG4gIH1cblxuICBpZiAocHJlZGljYXRlID09PSBcImluXCIgfHwgcHJlZGljYXRlID09PSBcIm5vdF9pblwiKSB7XG4gICAgcmV0dXJuIG5vcm1hbGl6ZVJhbnNhY2tMaXN0VmFsdWUodmFsdWUpXG4gIH1cblxuICBpZiAocmFuc2Fja1ZhbHVlSXNCbGFuayh2YWx1ZSkpIHJldHVybiBTS0lQX1JBTlNBQ0tfQ09ORElUSU9OXG5cbiAgcmV0dXJuIHZhbHVlXG59XG5cbi8qKlxuICogUnVucyBub3JtYWxpemUgcmFuc2FjayBudWxsIHZhbHVlLlxuICogQHBhcmFtIHs/fSB2YWx1ZSAtIENhbmRpZGF0ZSBudWxsIHByZWRpY2F0ZSB2YWx1ZS5cbiAqIEByZXR1cm5zIHtib29sZWFuIHwgdHlwZW9mIFNLSVBfUkFOU0FDS19DT05ESVRJT059IC0gTm9ybWFsaXplZCB2YWx1ZS5cbiAqL1xuZnVuY3Rpb24gbm9ybWFsaXplUmFuc2Fja051bGxWYWx1ZSh2YWx1ZSkge1xuICBjb25zdCBib29sZWFuVmFsdWUgPSBub3JtYWxpemVSYW5zYWNrQm9vbGVhbih2YWx1ZSlcblxuICByZXR1cm4gYm9vbGVhblZhbHVlID09PSBudWxsID8gU0tJUF9SQU5TQUNLX0NPTkRJVElPTiA6IGJvb2xlYW5WYWx1ZVxufVxuXG4vKipcbiAqIFJ1bnMgbm9ybWFsaXplIHJhbnNhY2sgbGlzdCB2YWx1ZS5cbiAqIEBwYXJhbSB7P30gdmFsdWUgLSBDYW5kaWRhdGUgbGlzdCBwcmVkaWNhdGUgdmFsdWUuXG4gKiBAcmV0dXJucyB7QXJyYXk8Pz4gfCB0eXBlb2YgU0tJUF9SQU5TQUNLX0NPTkRJVElPTn0gLSBOb3JtYWxpemVkIHZhbHVlLlxuICovXG5mdW5jdGlvbiBub3JtYWxpemVSYW5zYWNrTGlzdFZhbHVlKHZhbHVlKSB7XG4gIGNvbnN0IG5vcm1hbGl6ZWRBcnJheSA9IG5vcm1hbGl6ZVJhbnNhY2tBcnJheSh2YWx1ZSlcblxuICByZXR1cm4gbm9ybWFsaXplZEFycmF5Lmxlbmd0aCA8IDEgPyBTS0lQX1JBTlNBQ0tfQ09ORElUSU9OIDogbm9ybWFsaXplZEFycmF5XG59XG5cbi8qKlxuICogUmFuc2FjayB0cnVlIHZhbHVlcy5cbiAqIEB0eXBlIHtTZXQ8Pz59ICovXG5jb25zdCByYW5zYWNrVHJ1ZVZhbHVlcyA9IG5ldyBTZXQoW3RydWUsIDEsIFwiMVwiLCBcInRydWVcIl0pXG4vKipcbiAqIFJhbnNhY2sgZmFsc2UgdmFsdWVzLlxuICogQHR5cGUge1NldDw/Pn0gKi9cbmNvbnN0IHJhbnNhY2tGYWxzZVZhbHVlcyA9IG5ldyBTZXQoW2ZhbHNlLCAwLCBcIjBcIiwgXCJmYWxzZVwiXSlcblxuLyoqXG4gKiBSdW5zIG5vcm1hbGl6ZSByYW5zYWNrIGJvb2xlYW4uXG4gKiBAcGFyYW0gez99IHZhbHVlIC0gQ2FuZGlkYXRlIGJvb2xlYW4uXG4gKiBAcmV0dXJucyB7Ym9vbGVhbiB8IG51bGx9IC0gTm9ybWFsaXplZCBib29sZWFuIG9yIG51bGwgd2hlbiBibGFuay5cbiAqL1xuZnVuY3Rpb24gbm9ybWFsaXplUmFuc2Fja0Jvb2xlYW4odmFsdWUpIHtcbiAgaWYgKHJhbnNhY2tUcnVlVmFsdWVzLmhhcyh2YWx1ZSkpIHJldHVybiB0cnVlXG4gIGlmIChyYW5zYWNrRmFsc2VWYWx1ZXMuaGFzKHZhbHVlKSkgcmV0dXJuIGZhbHNlXG4gIGlmIChyYW5zYWNrVmFsdWVJc0JsYW5rKHZhbHVlKSkgcmV0dXJuIG51bGxcblxuICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgcmFuc2FjayBib29sZWFuIHZhbHVlOiAke1N0cmluZyh2YWx1ZSl9YClcbn1cblxuLyoqXG4gKiBSdW5zIHJhbnNhY2sgdmFsdWUgaXMgYmxhbmsuXG4gKiBAcGFyYW0gez99IHZhbHVlIC0gQ2FuZGlkYXRlIHZhbHVlLlxuICogQHJldHVybnMge2Jvb2xlYW59IC0gV2hldGhlciB2YWx1ZSBzaG91bGQgYmUgaWdub3JlZCBhcyBibGFuay5cbiAqL1xuZnVuY3Rpb24gcmFuc2Fja1ZhbHVlSXNCbGFuayh2YWx1ZSkge1xuICByZXR1cm4gdmFsdWUgPT09IHVuZGVmaW5lZCB8fCB2YWx1ZSA9PT0gbnVsbCB8fCB2YWx1ZSA9PT0gXCJcIlxufVxuXG4vKipcbiAqIFJ1bnMgbm9ybWFsaXplIHJhbnNhY2sgYXJyYXkuXG4gKiBAcGFyYW0gez99IHZhbHVlIC0gQ2FuZGlkYXRlIGFycmF5LWlzaCB2YWx1ZS5cbiAqIEByZXR1cm5zIHtBcnJheTw/Pn0gLSBOb3JtYWxpemVkIGFycmF5IHZhbHVlcy5cbiAqL1xuZnVuY3Rpb24gbm9ybWFsaXplUmFuc2Fja0FycmF5KHZhbHVlKSB7XG4gIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgIHJldHVybiB2YWx1ZS5maWx0ZXIoKGVudHJ5KSA9PiBlbnRyeSAhPT0gdW5kZWZpbmVkICYmIGVudHJ5ICE9PSBudWxsICYmIGVudHJ5ICE9PSBcIlwiKVxuICB9XG5cbiAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gXCJzdHJpbmdcIikge1xuICAgIHJldHVybiB2YWx1ZS5zcGxpdChcIixcIikubWFwKChlbnRyeSkgPT4gZW50cnkudHJpbSgpKS5maWx0ZXIoKGVudHJ5KSA9PiBlbnRyeS5sZW5ndGggPiAwKVxuICB9XG5cbiAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQgfHwgdmFsdWUgPT09IG51bGwgfHwgdmFsdWUgPT09IFwiXCIpIHJldHVybiBbXVxuXG4gIHJldHVybiBbdmFsdWVdXG59XG5cbi8qKlxuICogUmFuc2Fja1NvcnQgdHlwZS5cbiAqIEB0eXBlZGVmIHtvYmplY3R9IFJhbnNhY2tTb3J0XG4gKiBAcHJvcGVydHkge3N0cmluZ30gYXR0cmlidXRlIC0gUmVzb2x2ZWQgYXR0cmlidXRlIG5hbWUuXG4gKiBAcHJvcGVydHkge1wiYXNjXCIgfCBcImRlc2NcIn0gZGlyZWN0aW9uIC0gU29ydCBkaXJlY3Rpb24uXG4gKi9cblxuLyoqXG4gKiBQYXJzZXMgYW5kIHZhbGlkYXRlcyBhIHJhbnNhY2sgYHNgIHNvcnQgc3RyaW5nIGFnYWluc3QgbW9kZWwgYXR0cmlidXRlcy5cbiAqIEBwYXJhbSB7UmFuc2Fja01vZGVsQ2xhc3N9IG1vZGVsQ2xhc3MgLSBNb2RlbCBjbGFzcyBmb3IgYXR0cmlidXRlIHZhbGlkYXRpb24uXG4gKiBAcGFyYW0ge3N0cmluZ30gc29ydFN0cmluZyAtIFJhbnNhY2sgc29ydCBzdHJpbmcgKGUuZy4sIFwibmFtZSBhc2NcIiBvciBcIm5hbWUgYXNjLCBjcmVhdGVkQXQgZGVzY1wiKS5cbiAqIEByZXR1cm5zIHtSYW5zYWNrU29ydFtdfSAtIFZhbGlkYXRlZCBzb3J0IGRlZmluaXRpb25zLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcGFyc2VSYW5zYWNrU29ydChtb2RlbENsYXNzLCBzb3J0U3RyaW5nKSB7XG4gIGNvbnN0IHNlZ21lbnRzID0gc29ydFN0cmluZy5zcGxpdChcIixcIikubWFwKChzZWdtZW50KSA9PiBzZWdtZW50LnRyaW0oKSkuZmlsdGVyKChzZWdtZW50KSA9PiBzZWdtZW50Lmxlbmd0aCA+IDApXG5cbiAgLyoqXG4gICAqIFNvcnRzLlxuICAgKiBAdHlwZSB7UmFuc2Fja1NvcnRbXX0gKi9cbiAgY29uc3Qgc29ydHMgPSBbXVxuXG4gIGZvciAoY29uc3Qgc2VnbWVudCBvZiBzZWdtZW50cykge1xuICAgIGNvbnN0IHBhcnRzID0gc2VnbWVudC5zcGxpdCgvXFxzKy8pXG4gICAgY29uc3QgY29sdW1uQ2FuZGlkYXRlID0gcGFydHNbMF1cbiAgICBjb25zdCBkaXJlY3Rpb25DYW5kaWRhdGUgPSBwYXJ0cy5sZW5ndGggPiAxID8gcGFydHNbMV0udG9Mb3dlckNhc2UoKSA6IFwiYXNjXCJcblxuICAgIGlmIChkaXJlY3Rpb25DYW5kaWRhdGUgIT09IFwiYXNjXCIgJiYgZGlyZWN0aW9uQ2FuZGlkYXRlICE9PSBcImRlc2NcIikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIHJhbnNhY2sgc29ydCBkaXJlY3Rpb24gXCIke2RpcmVjdGlvbkNhbmRpZGF0ZX1cIiBpbjogJHtzZWdtZW50fWApXG4gICAgfVxuXG4gICAgY29uc3QgcmVzb2x2ZWRBdHRyaWJ1dGUgPSByZXNvbHZlQXR0cmlidXRlTmFtZSh7bW9kZWxDbGFzcywgdmFsdWU6IGNvbHVtbkNhbmRpZGF0ZX0pXG5cbiAgICBpZiAoIXJlc29sdmVkQXR0cmlidXRlKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYFVua25vd24gcmFuc2FjayBzb3J0IGF0dHJpYnV0ZSBcIiR7Y29sdW1uQ2FuZGlkYXRlfVwiIGZvciAke21vZGVsQ2xhc3MubmFtZX1gKVxuICAgIH1cblxuICAgIHNvcnRzLnB1c2goe2F0dHJpYnV0ZTogcmVzb2x2ZWRBdHRyaWJ1dGUsIGRpcmVjdGlvbjogZGlyZWN0aW9uQ2FuZGlkYXRlfSlcbiAgfVxuXG4gIHJldHVybiBzb3J0c1xufVxuXG4vKipcbiAqIFJ1bnMgdW5pcXVuaXplLlxuICogQHBhcmFtIHtzdHJpbmdbXX0gdmFsdWVzIC0gSW5wdXQgdmFsdWVzLlxuICogQHJldHVybnMge3N0cmluZ1tdfSAtIFVuaXF1ZSB2YWx1ZXMgaW4gb3JpZ2luYWwgb3JkZXIuXG4gKi9cbmZ1bmN0aW9uIHVuaXF1bml6ZSh2YWx1ZXMpIHtcbiAgcmV0dXJuIEFycmF5LmZyb20obmV3IFNldCh2YWx1ZXMpKVxufVxuIl19
|
|
736
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmFuc2Fjay5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy91dGlscy9yYW5zYWNrLmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLFlBQVk7QUFFWixPQUFPLEtBQUssVUFBVSxNQUFNLFlBQVksQ0FBQTtBQUN4QyxPQUFPLEVBQUMsYUFBYSxFQUFDLE1BQU0saUJBQWlCLENBQUE7QUFDN0MsT0FBTyxFQUFDLHlCQUF5QixFQUFDLE1BQU0sc0NBQXNDLENBQUE7QUFFOUUsMkRBQTJEO0FBQzNELE1BQU0sT0FBTyxpQkFBa0IsU0FBUSxLQUFLO0lBQzFDOzs7T0FHRztJQUNILFlBQVksT0FBTztRQUNqQixLQUFLLENBQUMsT0FBTyxDQUFDLENBQUE7UUFFZCxJQUFJLENBQUMsSUFBSSxHQUFHLG1CQUFtQixDQUFBO0lBQ2pDLENBQUM7Q0FDRjtBQUVEOzs7O0dBSUc7QUFDSCxTQUFTLGlCQUFpQixDQUFDLE9BQU87SUFDaEMsT0FBTyxJQUFJLGlCQUFpQixDQUFDLE9BQU8sQ0FBQyxDQUFBO0FBQ3ZDLENBQUM7QUFFRDs7O0dBR0c7QUFFSDs7O0dBR0c7QUFFSDs7O0dBR0c7QUFFSDs7Ozs7R0FLRztBQUVIOzs7Ozs7O0dBT0c7QUFFSDs7Ozs7O0dBTUc7QUFFSCxNQUFNLG1CQUFtQixHQUFHO0lBQzFCLFFBQVE7SUFDUixRQUFRO0lBQ1IsTUFBTTtJQUNOLE1BQU07SUFDTixPQUFPO0lBQ1AsTUFBTTtJQUNOLE1BQU07SUFDTixLQUFLO0lBQ0wsSUFBSTtJQUNKLElBQUk7SUFDSixJQUFJO0lBQ0osSUFBSTtDQUNMLENBQUE7QUFFRDs7Ozs7R0FLRztBQUNILE1BQU0sVUFBVSxzQkFBc0IsQ0FBQyxVQUFVLEVBQUUsTUFBTTtJQUN2RCxPQUFPLHFCQUFxQixDQUFDLFVBQVUsRUFBRSxNQUFNLENBQUMsQ0FBQyxVQUFVLENBQUE7QUFDN0QsQ0FBQztBQUVEOzs7OztHQUtHO0FBQ0gsTUFBTSxVQUFVLHFCQUFxQixDQUFDLFVBQVUsRUFBRSxNQUFNO0lBQ3RELElBQUksQ0FBQyxhQUFhLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQztRQUMzQixNQUFNLGlCQUFpQixDQUFDLCtDQUErQyxPQUFPLE1BQU0sRUFBRSxDQUFDLENBQUE7SUFDekYsQ0FBQztJQUVEOzs4QkFFMEI7SUFDMUIsTUFBTSxVQUFVLEdBQUc7UUFDakIsVUFBVSxFQUFFLDBCQUEwQixDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsS0FBSyxDQUFDO1FBQ3ZELFVBQVUsRUFBRSxFQUFFO1FBQ2QsU0FBUyxFQUFFLEVBQUU7S0FDZCxDQUFBO0lBRUQsS0FBSyxNQUFNLENBQUMsR0FBRyxFQUFFLFFBQVEsQ0FBQyxJQUFJLE1BQU0sQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQztRQUNyRCxJQUFJLEdBQUcsS0FBSyxHQUFHLEVBQUUsQ0FBQztZQUNoQixTQUFRO1FBQ1YsQ0FBQztRQUVELElBQUksR0FBRyxLQUFLLEdBQUcsRUFBRSxDQUFDO1lBQ2hCLFVBQVUsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLEdBQUcsa0NBQWtDLENBQUMsRUFBQyxVQUFVLEVBQUUsS0FBSyxFQUFFLFFBQVEsRUFBQyxDQUFDLENBQUMsQ0FBQTtZQUNoRyxTQUFRO1FBQ1YsQ0FBQztRQUVELElBQUksR0FBRyxLQUFLLEdBQUcsRUFBRSxDQUFDO1lBQ2hCLFVBQVUsQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLEdBQUcsOEJBQThCLENBQUMsRUFBQyxVQUFVLEVBQUUsS0FBSyxFQUFFLFFBQVEsRUFBQyxDQUFDLENBQUMsQ0FBQTtZQUMzRixTQUFRO1FBQ1YsQ0FBQztRQUVELE1BQU0sU0FBUyxHQUFHLCtCQUErQixDQUFDLEVBQUMsR0FBRyxFQUFFLFVBQVUsRUFBRSxRQUFRLEVBQUMsQ0FBQyxDQUFBO1FBQzlFLElBQUksU0FBUztZQUFFLFVBQVUsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFBO0lBQ3RELENBQUM7SUFFRCxPQUFPLFVBQVUsQ0FBQTtBQUNuQixDQUFDO0FBRUQsTUFBTSxzQkFBc0IsR0FBRyxNQUFNLENBQUMsd0JBQXdCLENBQUMsQ0FBQTtBQUUvRDs7Ozs7OztHQU9HO0FBQ0gsU0FBUywrQkFBK0IsQ0FBQyxFQUFDLEdBQUcsRUFBRSxVQUFVLEVBQUUsUUFBUSxFQUFDO0lBQ2xFLE1BQU0sU0FBUyxHQUFHLGVBQWUsQ0FBQyxHQUFHLENBQUMsQ0FBQTtJQUV0QyxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUM7UUFDZixNQUFNLGlCQUFpQixDQUFDLHlDQUF5QyxHQUFHLEVBQUUsQ0FBQyxDQUFBO0lBQ3pFLENBQUM7SUFFRCxNQUFNLEtBQUssR0FBRyxxQkFBcUIsQ0FBQztRQUNsQyxTQUFTLEVBQUUsU0FBUyxDQUFDLFNBQVM7UUFDOUIsS0FBSyxFQUFFLFFBQVE7S0FDaEIsQ0FBQyxDQUFBO0lBRUYsSUFBSSxLQUFLLEtBQUssc0JBQXNCO1FBQUUsT0FBTyxJQUFJLENBQUE7SUFFakQsTUFBTSxVQUFVLEdBQUcsd0JBQXdCLENBQUMsRUFBQyxVQUFVLEVBQUUsS0FBSyxFQUFFLFNBQVMsQ0FBQyxTQUFTLEVBQUMsQ0FBQyxDQUFBO0lBRXJGLE9BQU87UUFDTCxVQUFVO1FBQ1YsVUFBVSxFQUFFLFVBQVUsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEtBQUs7UUFDaEQsU0FBUyxFQUFFLFNBQVMsQ0FBQyxTQUFTO1FBQzlCLEtBQUs7S0FDTixDQUFBO0FBQ0gsQ0FBQztBQUVEOzs7Ozs7R0FNRztBQUNILFNBQVMsa0NBQWtDLENBQUMsRUFBQyxVQUFVLEVBQUUsS0FBSyxFQUFDO0lBQzdEOztvQ0FFZ0M7SUFDaEMsTUFBTSxVQUFVLEdBQUcsRUFBRSxDQUFBO0lBRXJCLEtBQUssTUFBTSxLQUFLLElBQUksMEJBQTBCLENBQUMsS0FBSyxFQUFFLFlBQVksQ0FBQyxFQUFFLENBQUM7UUFDcEUsSUFBSSxDQUFDLGFBQWEsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDO1lBQzFCLE1BQU0saUJBQWlCLENBQUMseURBQXlELE9BQU8sS0FBSyxFQUFFLENBQUMsQ0FBQTtRQUNsRyxDQUFDO1FBRUQsTUFBTSxjQUFjLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQTtRQUU5QixJQUFJLE9BQU8sY0FBYyxLQUFLLFFBQVEsRUFBRSxDQUFDO1lBQ3ZDLE1BQU0saUJBQWlCLENBQUMsOENBQThDLENBQUMsQ0FBQTtRQUN6RSxDQUFDO1FBRUQsSUFBSSxDQUFDLG1CQUFtQixDQUFDLFFBQVEsQ0FBQyxjQUFjLENBQUMsRUFBRSxDQUFDO1lBQ2xELE1BQU0saUJBQWlCLENBQUMsK0NBQStDLGNBQWMsRUFBRSxDQUFDLENBQUE7UUFDMUYsQ0FBQztRQUVELE1BQU0sU0FBUyxHQUFHLCtCQUErQixDQUFDLENBQUMsY0FBYyxDQUFDLENBQUE7UUFDbEUsTUFBTSxRQUFRLEdBQUcsNkJBQTZCLENBQUMsRUFBQyxTQUFTLEVBQUUsS0FBSyxFQUFFLEtBQUssQ0FBQyxDQUFDLEVBQUMsQ0FBQyxDQUFBO1FBQzNFLE1BQU0sZUFBZSxHQUFHLHFCQUFxQixDQUFDLEVBQUMsU0FBUyxFQUFFLEtBQUssRUFBRSxRQUFRLEVBQUMsQ0FBQyxDQUFBO1FBRTNFLElBQUksZUFBZSxLQUFLLHNCQUFzQjtZQUFFLFNBQVE7UUFFeEQsTUFBTSxVQUFVLEdBQUcseUNBQXlDLENBQUMsRUFBQyxVQUFVLEVBQUUsS0FBSyxFQUFFLEtBQUssQ0FBQyxDQUFDLEVBQUMsQ0FBQyxDQUFBO1FBRTFGLFVBQVUsQ0FBQyxJQUFJLENBQUM7WUFDZCxVQUFVO1lBQ1YsVUFBVSxFQUFFLDBCQUEwQixDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsVUFBVSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDO1lBQ3JGLFNBQVM7WUFDVCxLQUFLLEVBQUUsZUFBZTtTQUN2QixDQUFDLENBQUE7SUFDSixDQUFDO0lBRUQsT0FBTyxVQUFVLENBQUE7QUFDbkIsQ0FBQztBQUVEOzs7Ozs7R0FNRztBQUNILFNBQVMsOEJBQThCLENBQUMsRUFBQyxVQUFVLEVBQUUsS0FBSyxFQUFDO0lBQ3pEOztnQ0FFNEI7SUFDNUIsTUFBTSxTQUFTLEdBQUcsRUFBRSxDQUFBO0lBRXBCLEtBQUssTUFBTSxLQUFLLElBQUksMEJBQTBCLENBQUMsS0FBSyxFQUFFLFdBQVcsQ0FBQyxFQUFFLENBQUM7UUFDbkUsSUFBSSxDQUFDLGFBQWEsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDO1lBQzFCLE1BQU0saUJBQWlCLENBQUMsd0RBQXdELE9BQU8sS0FBSyxFQUFFLENBQUMsQ0FBQTtRQUNqRyxDQUFDO1FBRUQsU0FBUyxDQUFDLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxVQUFVLEVBQUUsS0FBSyxDQUFDLENBQUMsQ0FBQTtJQUMxRCxDQUFDO0lBRUQsT0FBTyxTQUFTLENBQUE7QUFDbEIsQ0FBQztBQUVEOzs7OztHQUtHO0FBQ0gsU0FBUywwQkFBMEIsQ0FBQyxLQUFLLEVBQUUsWUFBWTtJQUNyRCxJQUFJLEtBQUssS0FBSyxTQUFTLElBQUksS0FBSyxLQUFLLElBQUksSUFBSSxLQUFLLEtBQUssRUFBRTtRQUFFLE9BQU8sWUFBWSxDQUFBO0lBQzlFLElBQUksS0FBSyxLQUFLLEtBQUssSUFBSSxLQUFLLEtBQUssSUFBSTtRQUFFLE9BQU8sS0FBSyxDQUFBO0lBRW5ELE1BQU0saUJBQWlCLENBQUMsK0JBQStCLE1BQU0sQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLENBQUE7QUFDekUsQ0FBQztBQUVEOzs7OztHQUtHO0FBQ0gsU0FBUywwQkFBMEIsQ0FBQyxLQUFLLEVBQUUsSUFBSTtJQUM3QyxJQUFJLEtBQUssS0FBSyxTQUFTLElBQUksS0FBSyxLQUFLLElBQUksSUFBSSxLQUFLLEtBQUssRUFBRTtRQUFFLE9BQU8sRUFBRSxDQUFBO0lBQ3BFLElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUM7UUFBRSxPQUFPLEtBQUssQ0FBQTtJQUV0QyxJQUFJLGFBQWEsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDO1FBQ3pCLE9BQU8sTUFBTSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUM7YUFDdEIsSUFBSSxDQUFDLENBQUMsSUFBSSxFQUFFLEtBQUssRUFBRSxFQUFFO1lBQ3BCLE1BQU0sVUFBVSxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQTtZQUMvQixNQUFNLFdBQVcsR0FBRyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUE7WUFFakMsSUFBSSxNQUFNLENBQUMsUUFBUSxDQUFDLFVBQVUsQ0FBQyxJQUFJLE1BQU0sQ0FBQyxRQUFRLENBQUMsV0FBVyxDQUFDLEVBQUUsQ0FBQztnQkFDaEUsT0FBTyxVQUFVLEdBQUcsV0FBVyxDQUFBO1lBQ2pDLENBQUM7WUFFRCxPQUFPLElBQUksQ0FBQyxhQUFhLENBQUMsS0FBSyxDQUFDLENBQUE7UUFDbEMsQ0FBQyxDQUFDO2FBQ0QsR0FBRyxDQUFDLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQTtJQUM3QixDQUFDO0lBRUQsTUFBTSxpQkFBaUIsQ0FBQyxXQUFXLElBQUkscUNBQXFDLE9BQU8sS0FBSyxFQUFFLENBQUMsQ0FBQTtBQUM3RixDQUFDO0FBRUQ7Ozs7OztHQU1HO0FBQ0gsU0FBUyw2QkFBNkIsQ0FBQyxFQUFDLFNBQVMsRUFBRSxLQUFLLEVBQUM7SUFDdkQsSUFBSSxTQUFTLEtBQUssSUFBSSxJQUFJLFNBQVMsS0FBSyxRQUFRO1FBQUUsT0FBTyxLQUFLLENBQUE7SUFFOUQsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUM7UUFDekIsT0FBTyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxLQUFLLEtBQUssU0FBUyxJQUFJLEtBQUssS0FBSyxJQUFJLElBQUksS0FBSyxLQUFLLEVBQUUsQ0FBQyxDQUFBO0lBQ3JGLENBQUM7SUFFRCxPQUFPLEtBQUssQ0FBQTtBQUNkLENBQUM7QUFFRDs7Ozs7O0dBTUc7QUFDSCxTQUFTLHlDQUF5QyxDQUFDLEVBQUMsVUFBVSxFQUFFLEtBQUssRUFBQztJQUNwRSxNQUFNLE1BQU0sR0FBRyxnQ0FBZ0MsQ0FBQyxLQUFLLENBQUMsQ0FBQTtJQUN0RDs7b0NBRWdDO0lBQ2hDLE1BQU0sVUFBVSxHQUFHLEVBQUUsQ0FBQTtJQUVyQixLQUFLLE1BQU0sY0FBYyxJQUFJLE1BQU0sRUFBRSxDQUFDO1FBQ3BDLFVBQVUsQ0FBQyxJQUFJLENBQUMsR0FBRyx3QkFBd0IsQ0FBQyxFQUFDLFVBQVUsRUFBRSxLQUFLLEVBQUUsY0FBYyxFQUFDLENBQUMsQ0FBQyxDQUFBO0lBQ25GLENBQUM7SUFFRCxJQUFJLFVBQVUsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUM7UUFDMUIsTUFBTSxpQkFBaUIsQ0FBQyx1REFBdUQsQ0FBQyxDQUFBO0lBQ2xGLENBQUM7SUFFRCxPQUFPLFVBQVUsQ0FBQTtBQUNuQixDQUFDO0FBRUQ7Ozs7R0FJRztBQUNILFNBQVMsZ0NBQWdDLENBQUMsS0FBSztJQUM3QyxJQUFJLE9BQU8sS0FBSyxLQUFLLFFBQVE7UUFBRSxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUE7SUFFN0MsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUM7UUFDekIsT0FBTyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQywrQkFBK0IsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFBO0lBQ3JFLENBQUM7SUFFRCxJQUFJLGFBQWEsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDO1FBQ3pCLE9BQU8sMEJBQTBCLENBQUMsS0FBSyxFQUFFLFlBQVksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsK0JBQStCLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQTtJQUMvRyxDQUFDO0lBRUQsTUFBTSxpQkFBaUIsQ0FBQywwRUFBMEUsT0FBTyxLQUFLLEVBQUUsQ0FBQyxDQUFBO0FBQ25ILENBQUM7QUFFRDs7OztHQUlHO0FBQ0gsU0FBUywrQkFBK0IsQ0FBQyxLQUFLO0lBQzVDLElBQUksT0FBTyxLQUFLLEtBQUssUUFBUTtRQUFFLE9BQU8sS0FBSyxDQUFBO0lBRTNDLElBQUksYUFBYSxDQUFDLEtBQUssQ0FBQyxJQUFJLE9BQU8sS0FBSyxDQUFDLElBQUksS0FBSyxRQUFRLEVBQUUsQ0FBQztRQUMzRCxPQUFPLEtBQUssQ0FBQyxJQUFJLENBQUE7SUFDbkIsQ0FBQztJQUVELE1BQU0saUJBQWlCLENBQUMsdUVBQXVFLE9BQU8sS0FBSyxFQUFFLENBQUMsQ0FBQTtBQUNoSCxDQUFDO0FBRUQ7Ozs7OztHQU1HO0FBQ0gsU0FBUyx3QkFBd0IsQ0FBQyxFQUFDLFVBQVUsRUFBRSxLQUFLLEVBQUM7SUFDbkQsT0FBTyxLQUFLLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLGNBQWMsRUFBRSxFQUFFO1FBQ2hELE1BQU0sWUFBWSxHQUFHLGtCQUFrQixDQUFDLEVBQUMsVUFBVSxFQUFFLEtBQUssRUFBRSxjQUFjLEVBQUMsQ0FBQyxDQUFBO1FBQzVFLE1BQU0sZ0JBQWdCLEdBQUcsZ0JBQWdCLENBQUMsRUFBQyxVQUFVLEVBQUUsSUFBSSxFQUFFLFlBQVksQ0FBQyxJQUFJLEVBQUMsQ0FBQyxDQUFBO1FBQ2hGLE1BQU0sYUFBYSxHQUFHLG9CQUFvQixDQUFDLEVBQUMsVUFBVSxFQUFFLGdCQUFnQixFQUFFLEtBQUssRUFBRSxZQUFZLENBQUMsY0FBYyxFQUFDLENBQUMsQ0FBQTtRQUU5RyxJQUFJLENBQUMsYUFBYSxFQUFFLENBQUM7WUFDbkIsTUFBTSxpQkFBaUIsQ0FBQyw4QkFBOEIsWUFBWSxDQUFDLGNBQWMsU0FBUyxnQkFBZ0IsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFBO1FBQ3BILENBQUM7UUFFRCxPQUFPO1lBQ0wsYUFBYTtZQUNiLElBQUksRUFBRSxZQUFZLENBQUMsSUFBSTtTQUN4QixDQUFBO0lBQ0gsQ0FBQyxDQUFDLENBQUE7QUFDSixDQUFDO0FBRUQ7Ozs7OztHQU1HO0FBQ0gsU0FBUyxnQkFBZ0IsQ0FBQyxFQUFDLFVBQVUsRUFBRSxJQUFJLEVBQUM7SUFDMUMsSUFBSSxpQkFBaUIsR0FBRyxVQUFVLENBQUE7SUFFbEMsS0FBSyxNQUFNLGdCQUFnQixJQUFJLElBQUksRUFBRSxDQUFDO1FBQ3BDLE1BQU0sWUFBWSxHQUFHLG1CQUFtQixDQUFDLGlCQUFpQixDQUFDLENBQUMsZ0JBQWdCLENBQUMsQ0FBQTtRQUU3RSxJQUFJLENBQUMsWUFBWSxFQUFFLENBQUM7WUFDbEIsTUFBTSxpQkFBaUIsQ0FBQyxpQ0FBaUMsZ0JBQWdCLFNBQVMsaUJBQWlCLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQTtRQUM3RyxDQUFDO1FBRUQsaUJBQWlCLEdBQUcsWUFBWSxDQUFDLGdCQUFnQixDQUFBO0lBQ25ELENBQUM7SUFFRCxPQUFPLGlCQUFpQixDQUFBO0FBQzFCLENBQUM7QUFFRDs7Ozs7O0dBTUc7QUFDSCxTQUFTLGtCQUFrQixDQUFDLEVBQUMsVUFBVSxFQUFFLEtBQUssRUFBQztJQUM3Qzs7MEJBRXNCO0lBQ3RCLE1BQU0sSUFBSSxHQUFHLEVBQUUsQ0FBQTtJQUNmLElBQUksaUJBQWlCLEdBQUcsVUFBVSxDQUFBO0lBQ2xDLElBQUksY0FBYyxHQUFHLEtBQUssQ0FBQTtJQUUxQixPQUFPLElBQUksRUFBRSxDQUFDO1FBQ1osSUFBSSxvQkFBb0IsQ0FBQyxFQUFDLFVBQVUsRUFBRSxpQkFBaUIsRUFBRSxLQUFLLEVBQUUsY0FBYyxFQUFDLENBQUMsRUFBRSxDQUFDO1lBQ2pGLE1BQUs7UUFDUCxDQUFDO1FBRUQsTUFBTSxLQUFLLEdBQUcsc0JBQXNCLENBQUM7WUFDbkMsVUFBVSxFQUFFLGlCQUFpQjtZQUM3QixLQUFLLEVBQUUsY0FBYztTQUN0QixDQUFDLENBQUE7UUFFRixJQUFJLENBQUMsS0FBSztZQUFFLE1BQUs7UUFFakIsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsZ0JBQWdCLENBQUMsQ0FBQTtRQUNqQyxpQkFBaUIsR0FBRyxLQUFLLENBQUMsZ0JBQWdCLENBQUE7UUFDMUMsY0FBYyxHQUFHLEtBQUssQ0FBQyxjQUFjLENBQUE7SUFDdkMsQ0FBQztJQUVELElBQUksY0FBYyxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQztRQUM5QixNQUFNLGlCQUFpQixDQUFDLDZCQUE2QixLQUFLLEVBQUUsQ0FBQyxDQUFBO0lBQy9ELENBQUM7SUFFRCxPQUFPO1FBQ0wsY0FBYyxFQUFFLGNBQWM7UUFDOUIsSUFBSTtLQUNMLENBQUE7QUFDSCxDQUFDO0FBRUQ7Ozs7OztHQU1HO0FBQ0gsU0FBUyxzQkFBc0IsQ0FBQyxFQUFDLFVBQVUsRUFBRSxLQUFLLEVBQUM7SUFDakQsSUFBSSxTQUFTLEdBQUcsSUFBSSxDQUFBO0lBRXBCLEtBQUssTUFBTSxnQkFBZ0IsSUFBSSxNQUFNLENBQUMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLFVBQVUsQ0FBQyxDQUFDLEVBQUUsQ0FBQztRQUM1RSxNQUFNLFlBQVksR0FBRyxtQkFBbUIsQ0FBQyxVQUFVLENBQUMsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFBO1FBRXRFLEtBQUssTUFBTSxTQUFTLElBQUksc0JBQXNCLENBQUMsZ0JBQWdCLENBQUMsRUFBRSxDQUFDO1lBQ2pFLE1BQU0sY0FBYyxHQUFHLDBCQUEwQixDQUFDLEtBQUssRUFBRSxTQUFTLENBQUMsQ0FBQTtZQUVuRSxJQUFJLGNBQWMsS0FBSyxJQUFJO2dCQUFFLFNBQVE7WUFDckMsSUFBSSxjQUFjLENBQUMsTUFBTSxHQUFHLENBQUM7Z0JBQUUsU0FBUTtZQUN2QyxJQUFJLFNBQVMsSUFBSSxTQUFTLENBQUMsTUFBTSxJQUFJLFNBQVMsQ0FBQyxlQUFlO2dCQUFFLFNBQVE7WUFFeEUsU0FBUyxHQUFHO2dCQUNWLGVBQWUsRUFBRSxTQUFTLENBQUMsTUFBTTtnQkFDakMsZ0JBQWdCO2dCQUNoQixjQUFjO2dCQUNkLGdCQUFnQixFQUFFLFlBQVksQ0FBQyxnQkFBZ0I7YUFDaEQsQ0FBQTtRQUNILENBQUM7SUFDSCxDQUFDO0lBRUQsSUFBSSxDQUFDLFNBQVM7UUFBRSxPQUFPLElBQUksQ0FBQTtJQUUzQixPQUFPO1FBQ0wsZ0JBQWdCLEVBQUUsU0FBUyxDQUFDLGdCQUFnQjtRQUM1QyxjQUFjLEVBQUUsU0FBUyxDQUFDLGNBQWM7UUFDeEMsZ0JBQWdCLEVBQUUsU0FBUyxDQUFDLGdCQUFnQjtLQUM3QyxDQUFBO0FBQ0gsQ0FBQztBQUVEOzs7Ozs7Ozs7Ozs7OztHQWNHO0FBQ0gsU0FBUywwQkFBMEIsQ0FBQyxLQUFLLEVBQUUsU0FBUztJQUNsRCxJQUFJLEtBQUssQ0FBQyxVQUFVLENBQUMsR0FBRyxTQUFTLEdBQUcsQ0FBQyxFQUFFLENBQUM7UUFDdEMsT0FBTyxLQUFLLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUE7SUFDMUMsQ0FBQztJQUVELElBQUksS0FBSyxDQUFDLE1BQU0sSUFBSSxTQUFTLENBQUMsTUFBTTtRQUFFLE9BQU8sSUFBSSxDQUFBO0lBQ2pELElBQUksQ0FBQyxLQUFLLENBQUMsVUFBVSxDQUFDLFNBQVMsQ0FBQztRQUFFLE9BQU8sSUFBSSxDQUFBO0lBRTdDLE1BQU0sUUFBUSxHQUFHLEtBQUssQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxDQUFBO0lBRS9DLElBQUksUUFBUSxHQUFHLEdBQUcsSUFBSSxRQUFRLEdBQUcsR0FBRztRQUFFLE9BQU8sSUFBSSxDQUFBO0lBRWpELE9BQU8sUUFBUSxDQUFDLFdBQVcsRUFBRSxHQUFHLEtBQUssQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQTtBQUNuRSxDQUFDO0FBRUQ7Ozs7R0FJRztBQUNILFNBQVMsc0JBQXNCLENBQUMsZ0JBQWdCO0lBQzlDLE9BQU8sU0FBUyxDQUFDLENBQUMsZ0JBQWdCLEVBQUUsVUFBVSxDQUFDLFVBQVUsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsQ0FBQTtBQUMvRSxDQUFDO0FBRUQ7Ozs7OztHQU1HO0FBQ0gsU0FBUyxvQkFBb0IsQ0FBQyxFQUFDLFVBQVUsRUFBRSxLQUFLLEVBQUM7SUFDL0MsS0FBSyxNQUFNLENBQUMsYUFBYSxFQUFFLFVBQVUsQ0FBQyxJQUFJLE1BQU0sQ0FBQyxPQUFPLENBQUMsZ0JBQWdCLENBQUMsVUFBVSxDQUFDLENBQUMsRUFBRSxDQUFDO1FBQ3ZGLElBQUkscUJBQXFCLENBQUMsRUFBQyxhQUFhLEVBQUUsVUFBVSxFQUFFLEtBQUssRUFBQyxDQUFDLEVBQUUsQ0FBQztZQUM5RCxPQUFPLGFBQWEsQ0FBQTtRQUN0QixDQUFDO0lBQ0gsQ0FBQztJQUVELE9BQU8sU0FBUyxDQUFBO0FBQ2xCLENBQUM7QUFFRDs7OztHQUlHO0FBQ0gsU0FBUyxtQkFBbUIsQ0FBQyxVQUFVO0lBQ3JDLElBQUksT0FBTyxnQkFBZ0IsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDLG1CQUFtQixLQUFLLFVBQVUsRUFBRSxDQUFDO1FBQzVFLE9BQU8sMEJBQTBCLENBQUMsVUFBVSxDQUFDLENBQUE7SUFDL0MsQ0FBQztJQUVELElBQUksT0FBTyxnQkFBZ0IsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDLHVCQUF1QixLQUFLLFVBQVU7UUFDN0UsT0FBTyxnQkFBZ0IsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDLHdCQUF3QixLQUFLLFVBQVUsRUFBRSxDQUFDO1FBQy9FLE9BQU8sMkJBQTJCLENBQUMsVUFBVSxDQUFDLENBQUE7SUFDaEQsQ0FBQztJQUVELE9BQU8sRUFBRSxDQUFBO0FBQ1gsQ0FBQztBQUVEOzs7O0dBSUc7QUFDSCxTQUFTLDBCQUEwQixDQUFDLFVBQVU7SUFDNUM7O3VFQUVtRTtJQUNuRSxNQUFNLE9BQU8sR0FBRyxFQUFFLENBQUE7SUFDbEIsTUFBTSxnQkFBZ0IsR0FBRyxnQkFBZ0IsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDLG1CQUFtQixFQUFFLENBQUE7SUFFNUUsS0FBSyxNQUFNLGdCQUFnQixJQUFJLE1BQU0sQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsRUFBRSxDQUFDO1FBQzdELE1BQU0sWUFBWSxHQUFHLGdCQUFnQixDQUFDLGdCQUFnQixDQUFDLENBQUE7UUFFdkQsSUFBSSxPQUFPLFlBQVksQ0FBQyxhQUFhLEtBQUssVUFBVSxJQUFJLFlBQVksQ0FBQyxhQUFhLEVBQUU7WUFBRSxTQUFRO1FBRTlGLE1BQU0sZ0JBQWdCLEdBQUcsWUFBWSxDQUFDLG1CQUFtQixFQUFFLENBQUE7UUFFM0QsSUFBSSxDQUFDLGdCQUFnQjtZQUFFLFNBQVE7UUFFL0IsT0FBTyxDQUFDLGdCQUFnQixDQUFDLEdBQUcsRUFBQyxnQkFBZ0IsRUFBQyxDQUFBO0lBQ2hELENBQUM7SUFFRCxPQUFPLE9BQU8sQ0FBQTtBQUNoQixDQUFDO0FBRUQ7Ozs7R0FJRztBQUNILFNBQVMsMkJBQTJCLENBQUMsVUFBVTtJQUM3Qzs7dUVBRW1FO0lBQ25FLE1BQU0sT0FBTyxHQUFHLEVBQUUsQ0FBQTtJQUNsQixNQUFNLFdBQVcsR0FBRyxnQkFBZ0IsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDLHVCQUF1QixFQUFFLENBQUE7SUFDM0UsTUFBTSx3QkFBd0IsR0FBRyxnQkFBZ0IsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDLHdCQUF3QixFQUFFLENBQUE7SUFFekYsS0FBSyxNQUFNLGdCQUFnQixJQUFJLE1BQU0sQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLEVBQUUsQ0FBQztRQUN4RCxNQUFNLGdCQUFnQixHQUFHLHlCQUF5QixDQUFDLHdCQUF3QixDQUFDLGdCQUFnQixDQUFDLENBQUMsQ0FBQTtRQUU5RixJQUFJLENBQUMsZ0JBQWdCO1lBQUUsU0FBUTtRQUUvQixPQUFPLENBQUMsZ0JBQWdCLENBQUMsR0FBRyxFQUFDLGdCQUFnQixFQUFDLENBQUE7SUFDaEQsQ0FBQztJQUVELE9BQU8sT0FBTyxDQUFBO0FBQ2hCLENBQUM7QUFFRDs7OztHQUlHO0FBQ0gsU0FBUyxnQkFBZ0IsQ0FBQyxVQUFVO0lBQ2xDLElBQUksT0FBTyxnQkFBZ0IsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDLCtCQUErQixLQUFLLFVBQVUsRUFBRSxDQUFDO1FBQ3hGLE9BQU8scUNBQXFDLENBQUMsQ0FBQyxFQUFDLGdCQUFpQixDQUFDLFVBQVUsQ0FBQyxDQUFDLCtCQUErQixFQUFFLENBQUMsQ0FBQyxDQUFBO0lBQ2xILENBQUM7SUFFRCxNQUFNLGNBQWMsR0FBRyxPQUFPLGdCQUFnQixDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsY0FBYyxLQUFLLFVBQVU7UUFDdkYsQ0FBQyxDQUFDLGdCQUFnQixDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsY0FBYyxFQUFFO1FBQ2hELENBQUMsQ0FBQyxFQUFFLENBQUE7SUFDTixNQUFNLFVBQVUsR0FBRyxjQUFjLENBQUMsVUFBVSxDQUFBO0lBQzVDOzt3Q0FFb0M7SUFDcEMsTUFBTSxPQUFPLEdBQUcsRUFBRSxDQUFBO0lBRWxCLElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUMsRUFBRSxDQUFDO1FBQzlCLEtBQUssTUFBTSxhQUFhLElBQUksVUFBVSxFQUFFLENBQUM7WUFDdkMsSUFBSSxPQUFPLGFBQWEsS0FBSyxRQUFRO2dCQUFFLFNBQVE7WUFFL0MsT0FBTyxDQUFDLGFBQWEsQ0FBQyxHQUFHLGFBQWEsQ0FBQTtRQUN4QyxDQUFDO0lBQ0gsQ0FBQztTQUFNLElBQUksYUFBYSxDQUFDLFVBQVUsQ0FBQyxFQUFFLENBQUM7UUFDckMsS0FBSyxNQUFNLGFBQWEsSUFBSSxNQUFNLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxFQUFFLENBQUM7WUFDcEQsT0FBTyxDQUFDLGFBQWEsQ0FBQyxHQUFHLGFBQWEsQ0FBQTtRQUN4QyxDQUFDO0lBQ0gsQ0FBQztJQUVELE9BQU8sT0FBTyxDQUFBO0FBQ2hCLENBQUM7QUFFRDs7Ozs7OztHQU9HO0FBQ0gsU0FBUyxxQkFBcUIsQ0FBQyxFQUFDLGFBQWEsRUFBRSxVQUFVLEVBQUUsS0FBSyxFQUFDO0lBQy9ELE9BQU8sU0FBUyxDQUFDO1FBQ2YsYUFBYTtRQUNiLFVBQVU7UUFDVixVQUFVLENBQUMsVUFBVSxDQUFDLGFBQWEsQ0FBQztRQUNwQyxVQUFVLENBQUMsVUFBVSxDQUFDLFVBQVUsQ0FBQztLQUNsQyxDQUFDLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFBO0FBQ3BCLENBQUM7QUFFRDs7OztHQUlHO0FBQ0gsU0FBUyxlQUFlLENBQUMsR0FBRztJQUMxQixLQUFLLE1BQU0sU0FBUyxJQUFJLG1CQUFtQixFQUFFLENBQUM7UUFDNUMsTUFBTSxNQUFNLEdBQUcsSUFBSSxTQUFTLEVBQUUsQ0FBQTtRQUM5QixJQUFJLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUM7WUFBRSxTQUFRO1FBRW5DLE1BQU0sU0FBUyxHQUFHLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxNQUFNLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFBO1FBRTFELElBQUksU0FBUyxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQztZQUN6QixNQUFNLGlCQUFpQixDQUFDLHdCQUF3QixHQUFHLEVBQUUsQ0FBQyxDQUFBO1FBQ3hELENBQUM7UUFFRCxPQUFPO1lBQ0wsU0FBUztZQUNULFNBQVMsRUFBRSwrQkFBK0IsQ0FBQyxDQUFDLFNBQVMsQ0FBQztTQUN2RCxDQUFBO0lBQ0gsQ0FBQztJQUVELEtBQUssTUFBTSxTQUFTLElBQUksbUJBQW1CLEVBQUUsQ0FBQztRQUM1QyxNQUFNLFdBQVcsR0FBRyxrQkFBa0IsQ0FBQyxTQUFTLENBQUMsQ0FBQTtRQUVqRCxJQUFJLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxXQUFXLENBQUM7WUFBRSxTQUFRO1FBRXhDLE1BQU0sU0FBUyxHQUFHLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxNQUFNLEdBQUcsV0FBVyxDQUFDLE1BQU0sQ0FBQyxDQUFBO1FBRS9ELElBQUksU0FBUyxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQztZQUN6QixNQUFNLGlCQUFpQixDQUFDLHdCQUF3QixHQUFHLEVBQUUsQ0FBQyxDQUFBO1FBQ3hELENBQUM7UUFFRCxPQUFPO1lBQ0wsU0FBUztZQUNULFNBQVMsRUFBRSwrQkFBK0IsQ0FBQyxDQUFDLFNBQVMsQ0FBQztTQUN2RCxDQUFBO0lBQ0gsQ0FBQztJQUVELE9BQU8sSUFBSSxDQUFBO0FBQ2IsQ0FBQztBQUVEOzs7O0dBSUc7QUFDSCxTQUFTLGtCQUFrQixDQUFDLEtBQUs7SUFDL0IsTUFBTSxRQUFRLEdBQUcsS0FBSyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQTtJQUVqQyxPQUFPLFFBQVEsQ0FBQyxHQUFHLENBQUMsQ0FBQyxPQUFPLEVBQUUsRUFBRSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsV0FBVyxFQUFFLEdBQUcsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQTtBQUMvRixDQUFDO0FBRUQ7Ozs7OztHQU1HO0FBQ0gsU0FBUyxxQkFBcUIsQ0FBQyxFQUFDLFNBQVMsRUFBRSxLQUFLLEVBQUM7SUFDL0MsSUFBSSxTQUFTLEtBQUssTUFBTSxFQUFFLENBQUM7UUFDekIsT0FBTyx5QkFBeUIsQ0FBQyxLQUFLLENBQUMsQ0FBQTtJQUN6QyxDQUFDO0lBRUQsSUFBSSxTQUFTLEtBQUssSUFBSSxJQUFJLFNBQVMsS0FBSyxRQUFRLEVBQUUsQ0FBQztRQUNqRCxPQUFPLHlCQUF5QixDQUFDLEtBQUssQ0FBQyxDQUFBO0lBQ3pDLENBQUM7SUFFRCxJQUFJLG1CQUFtQixDQUFDLEtBQUssQ0FBQztRQUFFLE9BQU8sc0JBQXNCLENBQUE7SUFFN0QsT0FBTyxLQUFLLENBQUE7QUFDZCxDQUFDO0FBRUQ7Ozs7R0FJRztBQUNILFNBQVMseUJBQXlCLENBQUMsS0FBSztJQUN0QyxNQUFNLFlBQVksR0FBRyx1QkFBdUIsQ0FBQyxLQUFLLENBQUMsQ0FBQTtJQUVuRCxPQUFPLFlBQVksS0FBSyxJQUFJLENBQUMsQ0FBQyxDQUFDLHNCQUFzQixDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUE7QUFDdEUsQ0FBQztBQUVEOzs7O0dBSUc7QUFDSCxTQUFTLHlCQUF5QixDQUFDLEtBQUs7SUFDdEMsTUFBTSxlQUFlLEdBQUcscUJBQXFCLENBQUMsS0FBSyxDQUFDLENBQUE7SUFFcEQsT0FBTyxlQUFlLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsc0JBQXNCLENBQUMsQ0FBQyxDQUFDLGVBQWUsQ0FBQTtBQUM5RSxDQUFDO0FBRUQ7O29CQUVvQjtBQUNwQixNQUFNLGlCQUFpQixHQUFHLElBQUksR0FBRyxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUMsRUFBRSxHQUFHLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQTtBQUN6RDs7b0JBRW9CO0FBQ3BCLE1BQU0sa0JBQWtCLEdBQUcsSUFBSSxHQUFHLENBQUMsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxFQUFFLEdBQUcsRUFBRSxPQUFPLENBQUMsQ0FBQyxDQUFBO0FBRTVEOzs7O0dBSUc7QUFDSCxTQUFTLHVCQUF1QixDQUFDLEtBQUs7SUFDcEMsSUFBSSxpQkFBaUIsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDO1FBQUUsT0FBTyxJQUFJLENBQUE7SUFDN0MsSUFBSSxrQkFBa0IsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDO1FBQUUsT0FBTyxLQUFLLENBQUE7SUFDL0MsSUFBSSxtQkFBbUIsQ0FBQyxLQUFLLENBQUM7UUFBRSxPQUFPLElBQUksQ0FBQTtJQUUzQyxNQUFNLGlCQUFpQixDQUFDLGtDQUFrQyxNQUFNLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFBO0FBQzVFLENBQUM7QUFFRDs7OztHQUlHO0FBQ0gsU0FBUyxtQkFBbUIsQ0FBQyxLQUFLO0lBQ2hDLE9BQU8sS0FBSyxLQUFLLFNBQVMsSUFBSSxLQUFLLEtBQUssSUFBSSxJQUFJLEtBQUssS0FBSyxFQUFFLENBQUE7QUFDOUQsQ0FBQztBQUVEOzs7O0dBSUc7QUFDSCxTQUFTLHFCQUFxQixDQUFDLEtBQUs7SUFDbEMsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUM7UUFDekIsT0FBTyxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxLQUFLLEtBQUssU0FBUyxJQUFJLEtBQUssS0FBSyxJQUFJLElBQUksS0FBSyxLQUFLLEVBQUUsQ0FBQyxDQUFBO0lBQ3ZGLENBQUM7SUFFRCxJQUFJLE9BQU8sS0FBSyxLQUFLLFFBQVEsRUFBRSxDQUFDO1FBQzlCLE9BQU8sS0FBSyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLEtBQUssQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsS0FBSyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQTtJQUMxRixDQUFDO0lBRUQsSUFBSSxLQUFLLEtBQUssU0FBUyxJQUFJLEtBQUssS0FBSyxJQUFJLElBQUksS0FBSyxLQUFLLEVBQUU7UUFBRSxPQUFPLEVBQUUsQ0FBQTtJQUVwRSxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUE7QUFDaEIsQ0FBQztBQUVEOzs7OztHQUtHO0FBRUg7Ozs7O0dBS0c7QUFDSCxNQUFNLFVBQVUsZ0JBQWdCLENBQUMsVUFBVSxFQUFFLFVBQVU7SUFDckQsTUFBTSxRQUFRLEdBQUcsVUFBVSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxPQUFPLEVBQUUsRUFBRSxDQUFDLE9BQU8sQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLE9BQU8sRUFBRSxFQUFFLENBQUMsT0FBTyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQTtJQUUvRzs7K0JBRTJCO0lBQzNCLE1BQU0sS0FBSyxHQUFHLEVBQUUsQ0FBQTtJQUVoQixLQUFLLE1BQU0sT0FBTyxJQUFJLFFBQVEsRUFBRSxDQUFDO1FBQy9CLE1BQU0sS0FBSyxHQUFHLE9BQU8sQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUE7UUFDbEMsTUFBTSxlQUFlLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFBO1FBQ2hDLE1BQU0sa0JBQWtCLEdBQUcsS0FBSyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxXQUFXLEVBQUUsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFBO1FBRTVFLElBQUksa0JBQWtCLEtBQUssS0FBSyxJQUFJLGtCQUFrQixLQUFLLE1BQU0sRUFBRSxDQUFDO1lBQ2xFLE1BQU0saUJBQWlCLENBQUMsbUNBQW1DLGtCQUFrQixTQUFTLE9BQU8sRUFBRSxDQUFDLENBQUE7UUFDbEcsQ0FBQztRQUVELE1BQU0saUJBQWlCLEdBQUcsb0JBQW9CLENBQUMsRUFBQyxVQUFVLEVBQUUsS0FBSyxFQUFFLGVBQWUsRUFBQyxDQUFDLENBQUE7UUFFcEYsSUFBSSxDQUFDLGlCQUFpQixFQUFFLENBQUM7WUFDdkIsTUFBTSxpQkFBaUIsQ0FBQyxtQ0FBbUMsZUFBZSxTQUFTLFVBQVUsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFBO1FBQ3ZHLENBQUM7UUFFRCxLQUFLLENBQUMsSUFBSSxDQUFDLEVBQUMsU0FBUyxFQUFFLGlCQUFpQixFQUFFLFNBQVMsRUFBRSxrQkFBa0IsRUFBQyxDQUFDLENBQUE7SUFDM0UsQ0FBQztJQUVELE9BQU8sS0FBSyxDQUFBO0FBQ2QsQ0FBQztBQUVEOzs7O0dBSUc7QUFDSCxTQUFTLFNBQVMsQ0FBQyxNQUFNO0lBQ3ZCLE9BQU8sS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFBO0FBQ3BDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBAdHMtY2hlY2tcblxuaW1wb3J0ICogYXMgaW5mbGVjdGlvbiBmcm9tIFwiaW5mbGVjdGlvblwiXG5pbXBvcnQge2lzUGxhaW5PYmplY3R9IGZyb20gXCJpcy1wbGFpbi1vYmplY3RcIlxuaW1wb3J0IHtyZXNvbHZlRnJvbnRlbmRNb2RlbENsYXNzfSBmcm9tIFwiLi4vZnJvbnRlbmQtbW9kZWxzL21vZGVsLXJlZ2lzdHJ5LmpzXCJcblxuLyoqIEVycm9yIHJhaXNlZCB3aGVuIGEgUmFuc2FjayBkZXNjcmlwdG9yIGlzIG1hbGZvcm1lZC4gKi9cbmV4cG9ydCBjbGFzcyBSYW5zYWNrUXVlcnlFcnJvciBleHRlbmRzIEVycm9yIHtcbiAgLyoqXG4gICAqIENyZWF0ZXMgYSBSYW5zYWNrIHF1ZXJ5IGVycm9yLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gbWVzc2FnZSAtIEVycm9yIG1lc3NhZ2UuXG4gICAqL1xuICBjb25zdHJ1Y3RvcihtZXNzYWdlKSB7XG4gICAgc3VwZXIobWVzc2FnZSlcblxuICAgIHRoaXMubmFtZSA9IFwiUmFuc2Fja1F1ZXJ5RXJyb3JcIlxuICB9XG59XG5cbi8qKlxuICogQnVpbGRzIGEgUmFuc2FjayBxdWVyeSBlcnJvci5cbiAqIEBwYXJhbSB7c3RyaW5nfSBtZXNzYWdlIC0gRXJyb3IgbWVzc2FnZS5cbiAqIEByZXR1cm5zIHtSYW5zYWNrUXVlcnlFcnJvcn0gLSBSYW5zYWNrIHF1ZXJ5IGVycm9yLlxuICovXG5mdW5jdGlvbiByYW5zYWNrUXVlcnlFcnJvcihtZXNzYWdlKSB7XG4gIHJldHVybiBuZXcgUmFuc2Fja1F1ZXJ5RXJyb3IobWVzc2FnZSlcbn1cblxuLyoqXG4gKiBSYW5zYWNrUHJlZGljYXRlIHR5cGUuXG4gKiBAdHlwZWRlZiB7XCJjb250XCIgfCBcImVuZFwiIHwgXCJlcVwiIHwgXCJndFwiIHwgXCJndGVxXCIgfCBcImluXCIgfCBcImx0XCIgfCBcImx0ZXFcIiB8IFwibm90X2VxXCIgfCBcIm5vdF9pblwiIHwgXCJudWxsXCIgfCBcInN0YXJ0XCJ9IFJhbnNhY2tQcmVkaWNhdGVcbiAqL1xuXG4vKipcbiAqIFJhbnNhY2tDb21iaW5hdG9yIHR5cGUuXG4gKiBAdHlwZWRlZiB7XCJhbmRcIiB8IFwib3JcIn0gUmFuc2Fja0NvbWJpbmF0b3JcbiAqL1xuXG4vKipcbiAqIFJhbnNhY2tNb2RlbENsYXNzIHR5cGUuXG4gKiBAdHlwZWRlZiB7dHlwZW9mIGltcG9ydChcIi4uL2RhdGFiYXNlL3JlY29yZC9pbmRleC5qc1wiKS5kZWZhdWx0IHwgaW1wb3J0KFwiLi4vZnJvbnRlbmQtbW9kZWxzL2Jhc2UuanNcIikuRnJvbnRlbmRNb2RlbENsYXNzfSBSYW5zYWNrTW9kZWxDbGFzc1xuICovXG5cbi8qKlxuICogUmFuc2Fja0F0dHJpYnV0ZSB0eXBlLlxuICogQHR5cGVkZWYge29iamVjdH0gUmFuc2Fja0F0dHJpYnV0ZVxuICogQHByb3BlcnR5IHtzdHJpbmd9IGF0dHJpYnV0ZU5hbWUgLSBSZXNvbHZlZCBhdHRyaWJ1dGUgbmFtZS5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nW119IHBhdGggLSBSZXNvbHZlZCByZWxhdGlvbnNoaXAgcGF0aC5cbiAqL1xuXG4vKipcbiAqIFJhbnNhY2tDb25kaXRpb24gdHlwZS5cbiAqIEB0eXBlZGVmIHtvYmplY3R9IFJhbnNhY2tDb25kaXRpb25cbiAqIEBwcm9wZXJ0eSB7UmFuc2Fja0F0dHJpYnV0ZVtdfSBhdHRyaWJ1dGVzIC0gUmVzb2x2ZWQgYXR0cmlidXRlcyB0byB0ZXN0LlxuICogQHByb3BlcnR5IHtSYW5zYWNrQ29tYmluYXRvcn0gY29tYmluYXRvciAtIEhvdyBtdWx0aXBsZSBhdHRyaWJ1dGVzIGFyZSBjb21iaW5lZC5cbiAqIEBwcm9wZXJ0eSB7UmFuc2Fja1ByZWRpY2F0ZX0gcHJlZGljYXRlIC0gUGFyc2VkIFJhbnNhY2sgcHJlZGljYXRlLlxuICogQHByb3BlcnR5IHs/fSB2YWx1ZSAtIE5vcm1hbGl6ZWQgdmFsdWUuXG4gKi9cblxuLyoqXG4gKiBSYW5zYWNrR3JvdXAgdHlwZS5cbiAqIEB0eXBlZGVmIHtvYmplY3R9IFJhbnNhY2tHcm91cFxuICogQHByb3BlcnR5IHtSYW5zYWNrQ29tYmluYXRvcn0gY29tYmluYXRvciAtIEhvdyBlbnRyaWVzIGluc2lkZSB0aGlzIGdyb3VwIGFyZSBjb21iaW5lZC5cbiAqIEBwcm9wZXJ0eSB7UmFuc2Fja0NvbmRpdGlvbltdfSBjb25kaXRpb25zIC0gQ29uZGl0aW9ucyBpbiB0aGlzIGdyb3VwLlxuICogQHByb3BlcnR5IHtSYW5zYWNrR3JvdXBbXX0gZ3JvdXBpbmdzIC0gTmVzdGVkIGdyb3Vwcy5cbiAqL1xuXG5jb25zdCBzdXBwb3J0ZWRQcmVkaWNhdGVzID0gW1xuICBcIm5vdF9pblwiLFxuICBcIm5vdF9lcVwiLFxuICBcImd0ZXFcIixcbiAgXCJsdGVxXCIsXG4gIFwic3RhcnRcIixcbiAgXCJjb250XCIsXG4gIFwibnVsbFwiLFxuICBcImVuZFwiLFxuICBcImVxXCIsXG4gIFwiZ3RcIixcbiAgXCJsdFwiLFxuICBcImluXCJcbl1cblxuLyoqXG4gKiBSdW5zIHRoZSBub3JtYWxpemVSYW5zYWNrUGFyYW1zIGhlbHBlci5cbiAqIEBwYXJhbSB7UmFuc2Fja01vZGVsQ2xhc3N9IG1vZGVsQ2xhc3MgLSBNb2RlbCBjbGFzcy5cbiAqIEBwYXJhbSB7UmVjb3JkPHN0cmluZywgPz59IHBhcmFtcyAtIFJhbnNhY2stc3R5bGUgcGFyYW1zIGhhc2guXG4gKiBAcmV0dXJucyB7UmFuc2Fja0NvbmRpdGlvbltdfSAtIE5vcm1hbGl6ZWQgY29uZGl0aW9ucy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG5vcm1hbGl6ZVJhbnNhY2tQYXJhbXMobW9kZWxDbGFzcywgcGFyYW1zKSB7XG4gIHJldHVybiBub3JtYWxpemVSYW5zYWNrR3JvdXAobW9kZWxDbGFzcywgcGFyYW1zKS5jb25kaXRpb25zXG59XG5cbi8qKlxuICogUnVucyB0aGUgbm9ybWFsaXplUmFuc2Fja0dyb3VwIGhlbHBlci5cbiAqIEBwYXJhbSB7UmFuc2Fja01vZGVsQ2xhc3N9IG1vZGVsQ2xhc3MgLSBNb2RlbCBjbGFzcy5cbiAqIEBwYXJhbSB7UmVjb3JkPHN0cmluZywgPz59IHBhcmFtcyAtIFJhbnNhY2stc3R5bGUgcGFyYW1zIGhhc2guXG4gKiBAcmV0dXJucyB7UmFuc2Fja0dyb3VwfSAtIE5vcm1hbGl6ZWQgZ3JvdXAuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBub3JtYWxpemVSYW5zYWNrR3JvdXAobW9kZWxDbGFzcywgcGFyYW1zKSB7XG4gIGlmICghaXNQbGFpbk9iamVjdChwYXJhbXMpKSB7XG4gICAgdGhyb3cgcmFuc2Fja1F1ZXJ5RXJyb3IoYHJhbnNhY2sgcGFyYW1zIG11c3QgYmUgYSBwbGFpbiBvYmplY3QsIGdvdDogJHt0eXBlb2YgcGFyYW1zfWApXG4gIH1cblxuICAvKipcbiAgICogTm9ybWFsaXplZC5cbiAgICogQHR5cGUge1JhbnNhY2tHcm91cH0gKi9cbiAgY29uc3Qgbm9ybWFsaXplZCA9IHtcbiAgICBjb21iaW5hdG9yOiBub3JtYWxpemVSYW5zYWNrQ29tYmluYXRvcihwYXJhbXMubSwgXCJhbmRcIiksXG4gICAgY29uZGl0aW9uczogW10sXG4gICAgZ3JvdXBpbmdzOiBbXVxuICB9XG5cbiAgZm9yIChjb25zdCBba2V5LCByYXdWYWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMocGFyYW1zKSkge1xuICAgIGlmIChrZXkgPT09IFwibVwiKSB7XG4gICAgICBjb250aW51ZVxuICAgIH1cblxuICAgIGlmIChrZXkgPT09IFwiY1wiKSB7XG4gICAgICBub3JtYWxpemVkLmNvbmRpdGlvbnMucHVzaCguLi5ub3JtYWxpemVBZHZhbmNlZFJhbnNhY2tDb25kaXRpb25zKHttb2RlbENsYXNzLCB2YWx1ZTogcmF3VmFsdWV9KSlcbiAgICAgIGNvbnRpbnVlXG4gICAgfVxuXG4gICAgaWYgKGtleSA9PT0gXCJnXCIpIHtcbiAgICAgIG5vcm1hbGl6ZWQuZ3JvdXBpbmdzLnB1c2goLi4ubm9ybWFsaXplQWR2YW5jZWRSYW5zYWNrR3JvdXBzKHttb2RlbENsYXNzLCB2YWx1ZTogcmF3VmFsdWV9KSlcbiAgICAgIGNvbnRpbnVlXG4gICAgfVxuXG4gICAgY29uc3QgY29uZGl0aW9uID0gbm9ybWFsaXplU2ltcGxlUmFuc2Fja0NvbmRpdGlvbih7a2V5LCBtb2RlbENsYXNzLCByYXdWYWx1ZX0pXG4gICAgaWYgKGNvbmRpdGlvbikgbm9ybWFsaXplZC5jb25kaXRpb25zLnB1c2goY29uZGl0aW9uKVxuICB9XG5cbiAgcmV0dXJuIG5vcm1hbGl6ZWRcbn1cblxuY29uc3QgU0tJUF9SQU5TQUNLX0NPTkRJVElPTiA9IFN5bWJvbChcInNraXAtcmFuc2Fjay1jb25kaXRpb25cIilcblxuLyoqXG4gKiBSdW5zIG5vcm1hbGl6ZSBzaW1wbGUgcmFuc2FjayBjb25kaXRpb24uXG4gKiBAcGFyYW0ge29iamVjdH0gYXJncyAtIE9wdGlvbnMuXG4gKiBAcGFyYW0ge3N0cmluZ30gYXJncy5rZXkgLSBTaW1wbGUgUmFuc2FjayBrZXkuXG4gKiBAcGFyYW0ge1JhbnNhY2tNb2RlbENsYXNzfSBhcmdzLm1vZGVsQ2xhc3MgLSBNb2RlbCBjbGFzcy5cbiAqIEBwYXJhbSB7P30gYXJncy5yYXdWYWx1ZSAtIFJhdyBjb25kaXRpb24gdmFsdWUuXG4gKiBAcmV0dXJucyB7UmFuc2Fja0NvbmRpdGlvbiB8IG51bGx9IC0gTm9ybWFsaXplZCBjb25kaXRpb24sIG9yIG51bGwgd2hlbiBza2lwcGVkLlxuICovXG5mdW5jdGlvbiBub3JtYWxpemVTaW1wbGVSYW5zYWNrQ29uZGl0aW9uKHtrZXksIG1vZGVsQ2xhc3MsIHJhd1ZhbHVlfSkge1xuICBjb25zdCBwYXJzZWRLZXkgPSBwYXJzZVJhbnNhY2tLZXkoa2V5KVxuXG4gIGlmICghcGFyc2VkS2V5KSB7XG4gICAgdGhyb3cgcmFuc2Fja1F1ZXJ5RXJyb3IoYFVuc3VwcG9ydGVkIHJhbnNhY2sgcHJlZGljYXRlIGluIGtleTogJHtrZXl9YClcbiAgfVxuXG4gIGNvbnN0IHZhbHVlID0gbm9ybWFsaXplUmFuc2Fja1ZhbHVlKHtcbiAgICBwcmVkaWNhdGU6IHBhcnNlZEtleS5wcmVkaWNhdGUsXG4gICAgdmFsdWU6IHJhd1ZhbHVlXG4gIH0pXG5cbiAgaWYgKHZhbHVlID09PSBTS0lQX1JBTlNBQ0tfQ09ORElUSU9OKSByZXR1cm4gbnVsbFxuXG4gIGNvbnN0IGF0dHJpYnV0ZXMgPSByZXNvbHZlUmFuc2Fja0F0dHJpYnV0ZXMoe21vZGVsQ2xhc3MsIHZhbHVlOiBwYXJzZWRLZXkucGF0aFZhbHVlfSlcblxuICByZXR1cm4ge1xuICAgIGF0dHJpYnV0ZXMsXG4gICAgY29tYmluYXRvcjogYXR0cmlidXRlcy5sZW5ndGggPiAxID8gXCJvclwiIDogXCJhbmRcIixcbiAgICBwcmVkaWNhdGU6IHBhcnNlZEtleS5wcmVkaWNhdGUsXG4gICAgdmFsdWVcbiAgfVxufVxuXG4vKipcbiAqIFJ1bnMgbm9ybWFsaXplIGFkdmFuY2VkIHJhbnNhY2sgY29uZGl0aW9ucy5cbiAqIEBwYXJhbSB7b2JqZWN0fSBhcmdzIC0gT3B0aW9ucy5cbiAqIEBwYXJhbSB7UmFuc2Fja01vZGVsQ2xhc3N9IGFyZ3MubW9kZWxDbGFzcyAtIE1vZGVsIGNsYXNzLlxuICogQHBhcmFtIHs/fSBhcmdzLnZhbHVlIC0gQWR2YW5jZWQgY29uZGl0aW9ucyBjb2xsZWN0aW9uLlxuICogQHJldHVybnMge1JhbnNhY2tDb25kaXRpb25bXX0gLSBOb3JtYWxpemVkIGNvbmRpdGlvbnMuXG4gKi9cbmZ1bmN0aW9uIG5vcm1hbGl6ZUFkdmFuY2VkUmFuc2Fja0NvbmRpdGlvbnMoe21vZGVsQ2xhc3MsIHZhbHVlfSkge1xuICAvKipcbiAgICogQ29uZGl0aW9ucy5cbiAgICogQHR5cGUge1JhbnNhY2tDb25kaXRpb25bXX0gKi9cbiAgY29uc3QgY29uZGl0aW9ucyA9IFtdXG5cbiAgZm9yIChjb25zdCBlbnRyeSBvZiBub3JtYWxpemVSYW5zYWNrQ29sbGVjdGlvbih2YWx1ZSwgXCJjb25kaXRpb25zXCIpKSB7XG4gICAgaWYgKCFpc1BsYWluT2JqZWN0KGVudHJ5KSkge1xuICAgICAgdGhyb3cgcmFuc2Fja1F1ZXJ5RXJyb3IoYFJhbnNhY2sgY29uZGl0aW9uIGVudHJpZXMgbXVzdCBiZSBwbGFpbiBvYmplY3RzLCBnb3Q6ICR7dHlwZW9mIGVudHJ5fWApXG4gICAgfVxuXG4gICAgY29uc3QgcHJlZGljYXRlVmFsdWUgPSBlbnRyeS5wXG5cbiAgICBpZiAodHlwZW9mIHByZWRpY2F0ZVZhbHVlICE9PSBcInN0cmluZ1wiKSB7XG4gICAgICB0aHJvdyByYW5zYWNrUXVlcnlFcnJvcihcIlJhbnNhY2sgY29uZGl0aW9uIHByZWRpY2F0ZSBtdXN0IGJlIGEgc3RyaW5nXCIpXG4gICAgfVxuXG4gICAgaWYgKCFzdXBwb3J0ZWRQcmVkaWNhdGVzLmluY2x1ZGVzKHByZWRpY2F0ZVZhbHVlKSkge1xuICAgICAgdGhyb3cgcmFuc2Fja1F1ZXJ5RXJyb3IoYFVuc3VwcG9ydGVkIHJhbnNhY2sgcHJlZGljYXRlIGluIGNvbmRpdGlvbjogJHtwcmVkaWNhdGVWYWx1ZX1gKVxuICAgIH1cblxuICAgIGNvbnN0IHByZWRpY2F0ZSA9IC8qKiBAdHlwZSB7UmFuc2Fja1ByZWRpY2F0ZX0gKi8gKHByZWRpY2F0ZVZhbHVlKVxuICAgIGNvbnN0IHJhd1ZhbHVlID0gYWR2YW5jZWRSYW5zYWNrQ29uZGl0aW9uVmFsdWUoe3ByZWRpY2F0ZSwgdmFsdWU6IGVudHJ5LnZ9KVxuICAgIGNvbnN0IG5vcm1hbGl6ZWRWYWx1ZSA9IG5vcm1hbGl6ZVJhbnNhY2tWYWx1ZSh7cHJlZGljYXRlLCB2YWx1ZTogcmF3VmFsdWV9KVxuXG4gICAgaWYgKG5vcm1hbGl6ZWRWYWx1ZSA9PT0gU0tJUF9SQU5TQUNLX0NPTkRJVElPTikgY29udGludWVcblxuICAgIGNvbnN0IGF0dHJpYnV0ZXMgPSByZXNvbHZlUmFuc2Fja0F0dHJpYnV0ZXNGcm9tQWR2YW5jZWRWYWx1ZSh7bW9kZWxDbGFzcywgdmFsdWU6IGVudHJ5LmF9KVxuXG4gICAgY29uZGl0aW9ucy5wdXNoKHtcbiAgICAgIGF0dHJpYnV0ZXMsXG4gICAgICBjb21iaW5hdG9yOiBub3JtYWxpemVSYW5zYWNrQ29tYmluYXRvcihlbnRyeS5tLCBhdHRyaWJ1dGVzLmxlbmd0aCA+IDEgPyBcIm9yXCIgOiBcImFuZFwiKSxcbiAgICAgIHByZWRpY2F0ZSxcbiAgICAgIHZhbHVlOiBub3JtYWxpemVkVmFsdWVcbiAgICB9KVxuICB9XG5cbiAgcmV0dXJuIGNvbmRpdGlvbnNcbn1cblxuLyoqXG4gKiBSdW5zIG5vcm1hbGl6ZSBhZHZhbmNlZCByYW5zYWNrIGdyb3Vwcy5cbiAqIEBwYXJhbSB7b2JqZWN0fSBhcmdzIC0gT3B0aW9ucy5cbiAqIEBwYXJhbSB7UmFuc2Fja01vZGVsQ2xhc3N9IGFyZ3MubW9kZWxDbGFzcyAtIE1vZGVsIGNsYXNzLlxuICogQHBhcmFtIHs/fSBhcmdzLnZhbHVlIC0gQWR2YW5jZWQgZ3JvdXBzIGNvbGxlY3Rpb24uXG4gKiBAcmV0dXJucyB7UmFuc2Fja0dyb3VwW119IC0gTm9ybWFsaXplZCBncm91cHMuXG4gKi9cbmZ1bmN0aW9uIG5vcm1hbGl6ZUFkdmFuY2VkUmFuc2Fja0dyb3Vwcyh7bW9kZWxDbGFzcywgdmFsdWV9KSB7XG4gIC8qKlxuICAgKiBHcm91cGluZ3MuXG4gICAqIEB0eXBlIHtSYW5zYWNrR3JvdXBbXX0gKi9cbiAgY29uc3QgZ3JvdXBpbmdzID0gW11cblxuICBmb3IgKGNvbnN0IGVudHJ5IG9mIG5vcm1hbGl6ZVJhbnNhY2tDb2xsZWN0aW9uKHZhbHVlLCBcImdyb3VwaW5nc1wiKSkge1xuICAgIGlmICghaXNQbGFpbk9iamVjdChlbnRyeSkpIHtcbiAgICAgIHRocm93IHJhbnNhY2tRdWVyeUVycm9yKGBSYW5zYWNrIGdyb3VwaW5nIGVudHJpZXMgbXVzdCBiZSBwbGFpbiBvYmplY3RzLCBnb3Q6ICR7dHlwZW9mIGVudHJ5fWApXG4gICAgfVxuXG4gICAgZ3JvdXBpbmdzLnB1c2gobm9ybWFsaXplUmFuc2Fja0dyb3VwKG1vZGVsQ2xhc3MsIGVudHJ5KSlcbiAgfVxuXG4gIHJldHVybiBncm91cGluZ3Ncbn1cblxuLyoqXG4gKiBSdW5zIG5vcm1hbGl6ZSByYW5zYWNrIGNvbWJpbmF0b3IuXG4gKiBAcGFyYW0gez99IHZhbHVlIC0gQ2FuZGlkYXRlIGNvbWJpbmF0b3IuXG4gKiBAcGFyYW0ge1JhbnNhY2tDb21iaW5hdG9yfSBkZWZhdWx0VmFsdWUgLSBEZWZhdWx0IGNvbWJpbmF0b3IuXG4gKiBAcmV0dXJucyB7UmFuc2Fja0NvbWJpbmF0b3J9IC0gTm9ybWFsaXplZCBjb21iaW5hdG9yLlxuICovXG5mdW5jdGlvbiBub3JtYWxpemVSYW5zYWNrQ29tYmluYXRvcih2YWx1ZSwgZGVmYXVsdFZhbHVlKSB7XG4gIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkIHx8IHZhbHVlID09PSBudWxsIHx8IHZhbHVlID09PSBcIlwiKSByZXR1cm4gZGVmYXVsdFZhbHVlXG4gIGlmICh2YWx1ZSA9PT0gXCJhbmRcIiB8fCB2YWx1ZSA9PT0gXCJvclwiKSByZXR1cm4gdmFsdWVcblxuICB0aHJvdyByYW5zYWNrUXVlcnlFcnJvcihgSW52YWxpZCByYW5zYWNrIGNvbWJpbmF0b3I6ICR7U3RyaW5nKHZhbHVlKX1gKVxufVxuXG4vKipcbiAqIFJ1bnMgbm9ybWFsaXplIHJhbnNhY2sgY29sbGVjdGlvbi5cbiAqIEBwYXJhbSB7P30gdmFsdWUgLSBDYW5kaWRhdGUgY29sbGVjdGlvbi5cbiAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIC0gQ29sbGVjdGlvbiBuYW1lIGZvciBlcnJvcnMuXG4gKiBAcmV0dXJucyB7QXJyYXk8Pz59IC0gQ29sbGVjdGlvbiB2YWx1ZXMgaW4gc3RhYmxlIG9yZGVyLlxuICovXG5mdW5jdGlvbiBub3JtYWxpemVSYW5zYWNrQ29sbGVjdGlvbih2YWx1ZSwgbmFtZSkge1xuICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCB8fCB2YWx1ZSA9PT0gbnVsbCB8fCB2YWx1ZSA9PT0gXCJcIikgcmV0dXJuIFtdXG4gIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSkgcmV0dXJuIHZhbHVlXG5cbiAgaWYgKGlzUGxhaW5PYmplY3QodmFsdWUpKSB7XG4gICAgcmV0dXJuIE9iamVjdC5rZXlzKHZhbHVlKVxuICAgICAgLnNvcnQoKGxlZnQsIHJpZ2h0KSA9PiB7XG4gICAgICAgIGNvbnN0IGxlZnROdW1iZXIgPSBOdW1iZXIobGVmdClcbiAgICAgICAgY29uc3QgcmlnaHROdW1iZXIgPSBOdW1iZXIocmlnaHQpXG5cbiAgICAgICAgaWYgKE51bWJlci5pc0Zpbml0ZShsZWZ0TnVtYmVyKSAmJiBOdW1iZXIuaXNGaW5pdGUocmlnaHROdW1iZXIpKSB7XG4gICAgICAgICAgcmV0dXJuIGxlZnROdW1iZXIgLSByaWdodE51bWJlclxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGxlZnQubG9jYWxlQ29tcGFyZShyaWdodClcbiAgICAgIH0pXG4gICAgICAubWFwKChrZXkpID0+IHZhbHVlW2tleV0pXG4gIH1cblxuICB0aHJvdyByYW5zYWNrUXVlcnlFcnJvcihgUmFuc2FjayAke25hbWV9IG11c3QgYmUgYW4gYXJyYXkgb3Igb2JqZWN0LCBnb3Q6ICR7dHlwZW9mIHZhbHVlfWApXG59XG5cbi8qKlxuICogUnVucyBhZHZhbmNlZCByYW5zYWNrIGNvbmRpdGlvbiB2YWx1ZS5cbiAqIEBwYXJhbSB7b2JqZWN0fSBhcmdzIC0gT3B0aW9ucy5cbiAqIEBwYXJhbSB7UmFuc2Fja1ByZWRpY2F0ZX0gYXJncy5wcmVkaWNhdGUgLSBQYXJzZWQgcHJlZGljYXRlLlxuICogQHBhcmFtIHs/fSBhcmdzLnZhbHVlIC0gQWR2YW5jZWQgY29uZGl0aW9uIHZhbHVlLlxuICogQHJldHVybnMgez99IC0gVmFsdWUgcGFzc2VkIHRvIHByZWRpY2F0ZSBub3JtYWxpemF0aW9uLlxuICovXG5mdW5jdGlvbiBhZHZhbmNlZFJhbnNhY2tDb25kaXRpb25WYWx1ZSh7cHJlZGljYXRlLCB2YWx1ZX0pIHtcbiAgaWYgKHByZWRpY2F0ZSA9PT0gXCJpblwiIHx8IHByZWRpY2F0ZSA9PT0gXCJub3RfaW5cIikgcmV0dXJuIHZhbHVlXG5cbiAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgcmV0dXJuIHZhbHVlLmZpbmQoKGVudHJ5KSA9PiBlbnRyeSAhPT0gdW5kZWZpbmVkICYmIGVudHJ5ICE9PSBudWxsICYmIGVudHJ5ICE9PSBcIlwiKVxuICB9XG5cbiAgcmV0dXJuIHZhbHVlXG59XG5cbi8qKlxuICogUnVucyByZXNvbHZlIHJhbnNhY2sgYXR0cmlidXRlcyBmcm9tIGFkdmFuY2VkIHZhbHVlLlxuICogQHBhcmFtIHtvYmplY3R9IGFyZ3MgLSBPcHRpb25zLlxuICogQHBhcmFtIHtSYW5zYWNrTW9kZWxDbGFzc30gYXJncy5tb2RlbENsYXNzIC0gTW9kZWwgY2xhc3MuXG4gKiBAcGFyYW0gez99IGFyZ3MudmFsdWUgLSBBZHZhbmNlZCBhdHRyaWJ1dGUgdmFsdWUuXG4gKiBAcmV0dXJucyB7UmFuc2Fja0F0dHJpYnV0ZVtdfSAtIFJlc29sdmVkIGF0dHJpYnV0ZXMuXG4gKi9cbmZ1bmN0aW9uIHJlc29sdmVSYW5zYWNrQXR0cmlidXRlc0Zyb21BZHZhbmNlZFZhbHVlKHttb2RlbENsYXNzLCB2YWx1ZX0pIHtcbiAgY29uc3QgdmFsdWVzID0gbm9ybWFsaXplQWR2YW5jZWRBdHRyaWJ1dGVWYWx1ZXModmFsdWUpXG4gIC8qKlxuICAgKiBBdHRyaWJ1dGVzLlxuICAgKiBAdHlwZSB7UmFuc2Fja0F0dHJpYnV0ZVtdfSAqL1xuICBjb25zdCBhdHRyaWJ1dGVzID0gW11cblxuICBmb3IgKGNvbnN0IGF0dHJpYnV0ZVZhbHVlIG9mIHZhbHVlcykge1xuICAgIGF0dHJpYnV0ZXMucHVzaCguLi5yZXNvbHZlUmFuc2Fja0F0dHJpYnV0ZXMoe21vZGVsQ2xhc3MsIHZhbHVlOiBhdHRyaWJ1dGVWYWx1ZX0pKVxuICB9XG5cbiAgaWYgKGF0dHJpYnV0ZXMubGVuZ3RoIDwgMSkge1xuICAgIHRocm93IHJhbnNhY2tRdWVyeUVycm9yKFwiUmFuc2FjayBjb25kaXRpb24gbXVzdCBpbmNsdWRlIGF0IGxlYXN0IG9uZSBhdHRyaWJ1dGVcIilcbiAgfVxuXG4gIHJldHVybiBhdHRyaWJ1dGVzXG59XG5cbi8qKlxuICogUnVucyBub3JtYWxpemUgYWR2YW5jZWQgYXR0cmlidXRlIHZhbHVlcy5cbiAqIEBwYXJhbSB7P30gdmFsdWUgLSBBZHZhbmNlZCBhdHRyaWJ1dGUgdmFsdWUuXG4gKiBAcmV0dXJucyB7c3RyaW5nW119IC0gQXR0cmlidXRlIHBhdGggc3RyaW5ncy5cbiAqL1xuZnVuY3Rpb24gbm9ybWFsaXplQWR2YW5jZWRBdHRyaWJ1dGVWYWx1ZXModmFsdWUpIHtcbiAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gXCJzdHJpbmdcIikgcmV0dXJuIFt2YWx1ZV1cblxuICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICByZXR1cm4gdmFsdWUubWFwKChlbnRyeSkgPT4gbm9ybWFsaXplQWR2YW5jZWRBdHRyaWJ1dGVWYWx1ZShlbnRyeSkpXG4gIH1cblxuICBpZiAoaXNQbGFpbk9iamVjdCh2YWx1ZSkpIHtcbiAgICByZXR1cm4gbm9ybWFsaXplUmFuc2Fja0NvbGxlY3Rpb24odmFsdWUsIFwiYXR0cmlidXRlc1wiKS5tYXAoKGVudHJ5KSA9PiBub3JtYWxpemVBZHZhbmNlZEF0dHJpYnV0ZVZhbHVlKGVudHJ5KSlcbiAgfVxuXG4gIHRocm93IHJhbnNhY2tRdWVyeUVycm9yKGBSYW5zYWNrIGNvbmRpdGlvbiBhdHRyaWJ1dGVzIG11c3QgYmUgc3RyaW5ncywgYXJyYXlzLCBvciBvYmplY3RzLCBnb3Q6ICR7dHlwZW9mIHZhbHVlfWApXG59XG5cbi8qKlxuICogUnVucyBub3JtYWxpemUgYWR2YW5jZWQgYXR0cmlidXRlIHZhbHVlLlxuICogQHBhcmFtIHs/fSB2YWx1ZSAtIEFkdmFuY2VkIGF0dHJpYnV0ZSBlbnRyeS5cbiAqIEByZXR1cm5zIHtzdHJpbmd9IC0gQXR0cmlidXRlIHBhdGggc3RyaW5nLlxuICovXG5mdW5jdGlvbiBub3JtYWxpemVBZHZhbmNlZEF0dHJpYnV0ZVZhbHVlKHZhbHVlKSB7XG4gIGlmICh0eXBlb2YgdmFsdWUgPT09IFwic3RyaW5nXCIpIHJldHVybiB2YWx1ZVxuXG4gIGlmIChpc1BsYWluT2JqZWN0KHZhbHVlKSAmJiB0eXBlb2YgdmFsdWUubmFtZSA9PT0gXCJzdHJpbmdcIikge1xuICAgIHJldHVybiB2YWx1ZS5uYW1lXG4gIH1cblxuICB0aHJvdyByYW5zYWNrUXVlcnlFcnJvcihgUmFuc2FjayBjb25kaXRpb24gYXR0cmlidXRlIGVudHJpZXMgbXVzdCBiZSBzdHJpbmdzIG9yIHtuYW1lfSwgZ290OiAke3R5cGVvZiB2YWx1ZX1gKVxufVxuXG4vKipcbiAqIFJ1bnMgcmVzb2x2ZSByYW5zYWNrIGF0dHJpYnV0ZXMuXG4gKiBAcGFyYW0ge29iamVjdH0gYXJncyAtIE9wdGlvbnMuXG4gKiBAcGFyYW0ge1JhbnNhY2tNb2RlbENsYXNzfSBhcmdzLm1vZGVsQ2xhc3MgLSBNb2RlbCBjbGFzcy5cbiAqIEBwYXJhbSB7c3RyaW5nfSBhcmdzLnZhbHVlIC0gQXR0cmlidXRlIHBhdGggdmFsdWUuXG4gKiBAcmV0dXJucyB7UmFuc2Fja0F0dHJpYnV0ZVtdfSAtIFJlc29sdmVkIGF0dHJpYnV0ZXMuXG4gKi9cbmZ1bmN0aW9uIHJlc29sdmVSYW5zYWNrQXR0cmlidXRlcyh7bW9kZWxDbGFzcywgdmFsdWV9KSB7XG4gIHJldHVybiB2YWx1ZS5zcGxpdChcIl9vcl9cIikubWFwKChhdHRyaWJ1dGVWYWx1ZSkgPT4ge1xuICAgIGNvbnN0IHJlc29sdmVkUGF0aCA9IHJlc29sdmVSYW5zYWNrUGF0aCh7bW9kZWxDbGFzcywgdmFsdWU6IGF0dHJpYnV0ZVZhbHVlfSlcbiAgICBjb25zdCB0YXJnZXRNb2RlbENsYXNzID0gbW9kZWxDbGFzc0F0UGF0aCh7bW9kZWxDbGFzcywgcGF0aDogcmVzb2x2ZWRQYXRoLnBhdGh9KVxuICAgIGNvbnN0IGF0dHJpYnV0ZU5hbWUgPSByZXNvbHZlQXR0cmlidXRlTmFtZSh7bW9kZWxDbGFzczogdGFyZ2V0TW9kZWxDbGFzcywgdmFsdWU6IHJlc29sdmVkUGF0aC5hdHRyaWJ1dGVWYWx1ZX0pXG5cbiAgICBpZiAoIWF0dHJpYnV0ZU5hbWUpIHtcbiAgICAgIHRocm93IHJhbnNhY2tRdWVyeUVycm9yKGBVbmtub3duIHJhbnNhY2sgYXR0cmlidXRlIFwiJHtyZXNvbHZlZFBhdGguYXR0cmlidXRlVmFsdWV9XCIgZm9yICR7dGFyZ2V0TW9kZWxDbGFzcy5uYW1lfWApXG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIGF0dHJpYnV0ZU5hbWUsXG4gICAgICBwYXRoOiByZXNvbHZlZFBhdGgucGF0aFxuICAgIH1cbiAgfSlcbn1cblxuLyoqXG4gKiBSdW5zIG1vZGVsIGNsYXNzIGF0IHBhdGguXG4gKiBAcGFyYW0ge29iamVjdH0gYXJncyAtIE9wdGlvbnMuXG4gKiBAcGFyYW0ge1JhbnNhY2tNb2RlbENsYXNzfSBhcmdzLm1vZGVsQ2xhc3MgLSBSb290IG1vZGVsIGNsYXNzLlxuICogQHBhcmFtIHtzdHJpbmdbXX0gYXJncy5wYXRoIC0gUmVsYXRpb25zaGlwIHBhdGguXG4gKiBAcmV0dXJucyB7UmFuc2Fja01vZGVsQ2xhc3N9IC0gVGFyZ2V0IG1vZGVsIGNsYXNzLlxuICovXG5mdW5jdGlvbiBtb2RlbENsYXNzQXRQYXRoKHttb2RlbENsYXNzLCBwYXRofSkge1xuICBsZXQgY3VycmVudE1vZGVsQ2xhc3MgPSBtb2RlbENsYXNzXG5cbiAgZm9yIChjb25zdCByZWxhdGlvbnNoaXBOYW1lIG9mIHBhdGgpIHtcbiAgICBjb25zdCByZWxhdGlvbnNoaXAgPSByZWxhdGlvbnNoaXBFbnRyaWVzKGN1cnJlbnRNb2RlbENsYXNzKVtyZWxhdGlvbnNoaXBOYW1lXVxuXG4gICAgaWYgKCFyZWxhdGlvbnNoaXApIHtcbiAgICAgIHRocm93IHJhbnNhY2tRdWVyeUVycm9yKGBVbmtub3duIHJhbnNhY2sgcmVsYXRpb25zaGlwIFwiJHtyZWxhdGlvbnNoaXBOYW1lfVwiIGZvciAke2N1cnJlbnRNb2RlbENsYXNzLm5hbWV9YClcbiAgICB9XG5cbiAgICBjdXJyZW50TW9kZWxDbGFzcyA9IHJlbGF0aW9uc2hpcC50YXJnZXRNb2RlbENsYXNzXG4gIH1cblxuICByZXR1cm4gY3VycmVudE1vZGVsQ2xhc3Ncbn1cblxuLyoqXG4gKiBSdW5zIHJlc29sdmUgcmFuc2FjayBwYXRoLlxuICogQHBhcmFtIHtvYmplY3R9IGFyZ3MgLSBPcHRpb25zLlxuICogQHBhcmFtIHtSYW5zYWNrTW9kZWxDbGFzc30gYXJncy5tb2RlbENsYXNzIC0gQ3VycmVudCBtb2RlbCBjbGFzcy5cbiAqIEBwYXJhbSB7c3RyaW5nfSBhcmdzLnZhbHVlIC0gUmVtYWluaW5nIHBhdGggdmFsdWUuXG4gKiBAcmV0dXJucyB7e2F0dHJpYnV0ZVZhbHVlOiBzdHJpbmcsIHBhdGg6IHN0cmluZ1tdfX0gLSBSZXNvbHZlZCByZWxhdGlvbnNoaXAgcGF0aCBhbmQgcmVtYWluaW5nIGF0dHJpYnV0ZSB2YWx1ZS5cbiAqL1xuZnVuY3Rpb24gcmVzb2x2ZVJhbnNhY2tQYXRoKHttb2RlbENsYXNzLCB2YWx1ZX0pIHtcbiAgLyoqXG4gICAqIFBhdGguXG4gICAqIEB0eXBlIHtzdHJpbmdbXX0gKi9cbiAgY29uc3QgcGF0aCA9IFtdXG4gIGxldCBjdXJyZW50TW9kZWxDbGFzcyA9IG1vZGVsQ2xhc3NcbiAgbGV0IHJlbWFpbmluZ1ZhbHVlID0gdmFsdWVcblxuICB3aGlsZSAodHJ1ZSkge1xuICAgIGlmIChyZXNvbHZlQXR0cmlidXRlTmFtZSh7bW9kZWxDbGFzczogY3VycmVudE1vZGVsQ2xhc3MsIHZhbHVlOiByZW1haW5pbmdWYWx1ZX0pKSB7XG4gICAgICBicmVha1xuICAgIH1cblxuICAgIGNvbnN0IG1hdGNoID0gZmluZFJlbGF0aW9uc2hpcFByZWZpeCh7XG4gICAgICBtb2RlbENsYXNzOiBjdXJyZW50TW9kZWxDbGFzcyxcbiAgICAgIHZhbHVlOiByZW1haW5pbmdWYWx1ZVxuICAgIH0pXG5cbiAgICBpZiAoIW1hdGNoKSBicmVha1xuXG4gICAgcGF0aC5wdXNoKG1hdGNoLnJlbGF0aW9uc2hpcE5hbWUpXG4gICAgY3VycmVudE1vZGVsQ2xhc3MgPSBtYXRjaC50YXJnZXRNb2RlbENsYXNzXG4gICAgcmVtYWluaW5nVmFsdWUgPSBtYXRjaC5yZW1haW5pbmdWYWx1ZVxuICB9XG5cbiAgaWYgKHJlbWFpbmluZ1ZhbHVlLmxlbmd0aCA8IDEpIHtcbiAgICB0aHJvdyByYW5zYWNrUXVlcnlFcnJvcihgSW52YWxpZCByYW5zYWNrIGtleSBwYXRoOiAke3ZhbHVlfWApXG4gIH1cblxuICByZXR1cm4ge1xuICAgIGF0dHJpYnV0ZVZhbHVlOiByZW1haW5pbmdWYWx1ZSxcbiAgICBwYXRoXG4gIH1cbn1cblxuLyoqXG4gKiBSdW5zIGZpbmQgcmVsYXRpb25zaGlwIHByZWZpeC5cbiAqIEBwYXJhbSB7b2JqZWN0fSBhcmdzIC0gT3B0aW9ucy5cbiAqIEBwYXJhbSB7UmFuc2Fja01vZGVsQ2xhc3N9IGFyZ3MubW9kZWxDbGFzcyAtIEN1cnJlbnQgbW9kZWwgY2xhc3MuXG4gKiBAcGFyYW0ge3N0cmluZ30gYXJncy52YWx1ZSAtIFJlbWFpbmluZyB2YWx1ZSB0byBtYXRjaC5cbiAqIEByZXR1cm5zIHt7cmVsYXRpb25zaGlwTmFtZTogc3RyaW5nLCByZW1haW5pbmdWYWx1ZTogc3RyaW5nLCB0YXJnZXRNb2RlbENsYXNzOiBSYW5zYWNrTW9kZWxDbGFzc30gfCBudWxsfSAtIE1hdGNoaW5nIHJlbGF0aW9uc2hpcCBwcmVmaXguXG4gKi9cbmZ1bmN0aW9uIGZpbmRSZWxhdGlvbnNoaXBQcmVmaXgoe21vZGVsQ2xhc3MsIHZhbHVlfSkge1xuICBsZXQgYmVzdE1hdGNoID0gbnVsbFxuXG4gIGZvciAoY29uc3QgcmVsYXRpb25zaGlwTmFtZSBvZiBPYmplY3Qua2V5cyhyZWxhdGlvbnNoaXBFbnRyaWVzKG1vZGVsQ2xhc3MpKSkge1xuICAgIGNvbnN0IHJlbGF0aW9uc2hpcCA9IHJlbGF0aW9uc2hpcEVudHJpZXMobW9kZWxDbGFzcylbcmVsYXRpb25zaGlwTmFtZV1cblxuICAgIGZvciAoY29uc3QgY2FuZGlkYXRlIG9mIHJlbGF0aW9uc2hpcENhbmRpZGF0ZXMocmVsYXRpb25zaGlwTmFtZSkpIHtcbiAgICAgIGNvbnN0IHJlbWFpbmluZ1ZhbHVlID0gc3RyaXBSZWxhdGlvbnNoaXBDYW5kaWRhdGUodmFsdWUsIGNhbmRpZGF0ZSlcblxuICAgICAgaWYgKHJlbWFpbmluZ1ZhbHVlID09PSBudWxsKSBjb250aW51ZVxuICAgICAgaWYgKHJlbWFpbmluZ1ZhbHVlLmxlbmd0aCA8IDEpIGNvbnRpbnVlXG4gICAgICBpZiAoYmVzdE1hdGNoICYmIGNhbmRpZGF0ZS5sZW5ndGggPD0gYmVzdE1hdGNoLmNhbmRpZGF0ZUxlbmd0aCkgY29udGludWVcblxuICAgICAgYmVzdE1hdGNoID0ge1xuICAgICAgICBjYW5kaWRhdGVMZW5ndGg6IGNhbmRpZGF0ZS5sZW5ndGgsXG4gICAgICAgIHJlbGF0aW9uc2hpcE5hbWUsXG4gICAgICAgIHJlbWFpbmluZ1ZhbHVlLFxuICAgICAgICB0YXJnZXRNb2RlbENsYXNzOiByZWxhdGlvbnNoaXAudGFyZ2V0TW9kZWxDbGFzc1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGlmICghYmVzdE1hdGNoKSByZXR1cm4gbnVsbFxuXG4gIHJldHVybiB7XG4gICAgcmVsYXRpb25zaGlwTmFtZTogYmVzdE1hdGNoLnJlbGF0aW9uc2hpcE5hbWUsXG4gICAgcmVtYWluaW5nVmFsdWU6IGJlc3RNYXRjaC5yZW1haW5pbmdWYWx1ZSxcbiAgICB0YXJnZXRNb2RlbENsYXNzOiBiZXN0TWF0Y2gudGFyZ2V0TW9kZWxDbGFzc1xuICB9XG59XG5cbi8qKlxuICogUmV0dXJucyB0aGUgcG9ydGlvbiBvZiBgdmFsdWVgIGFmdGVyIGBjYW5kaWRhdGVgIHdoZW4gYGNhbmRpZGF0ZWBcbiAqIHNpdHMgYXQgYSByZWxhdGlvbnNoaXAtcGF0aCBib3VuZGFyeSwgb3IgbnVsbCB3aGVuIHRoZXJlJ3Mgbm9cbiAqIGJvdW5kYXJ5IG1hdGNoLiBUd28gYm91bmRhcnkgZm9ybXMgYXJlIGFjY2VwdGVkOlxuICogLSBzbmFrZTogYDxjYW5kaWRhdGU+X2AgZm9sbG93ZWQgYnkgdGhlIHJlc3Qgb2YgdGhlIHBhdGggKGUuZy5cbiAqICAgYHRhc2tfcHJvamVjdF9pZGAgYWdhaW5zdCBjYW5kaWRhdGUgYHRhc2tgIHJldHVybnMgYHByb2plY3RfaWRgKS5cbiAqIC0gY2FtZWw6IGA8Y2FuZGlkYXRlPmAgaW1tZWRpYXRlbHkgZm9sbG93ZWQgYnkgYW4gdXBwZXJjYXNlIGxldHRlcixcbiAqICAgd2hpY2ggbWFya3MgYSBuZXcgd29yZCBpbiBjYW1lbENhc2UgKGUuZy4gYHRhc2tQcm9qZWN0SWRgIGFnYWluc3RcbiAqICAgY2FuZGlkYXRlIGB0YXNrYCByZXR1cm5zIGBwcm9qZWN0SWRgIHdpdGggdGhlIGxlYWRpbmcgYFBgXG4gKiAgIGxvd2VyY2FzZWQgc28gdGhlIHJlbWFpbmRlciBzdGF5cyBpbiBjYWxsZXItZm9ybSBmb3IgdGhlIG5leHRcbiAqICAgYXR0cmlidXRlIC8gcmVsYXRpb25zaGlwIG1hdGNoKS5cbiAqIEBwYXJhbSB7c3RyaW5nfSB2YWx1ZSAtIFJlbWFpbmluZyByYW5zYWNrIHBhdGguXG4gKiBAcGFyYW0ge3N0cmluZ30gY2FuZGlkYXRlIC0gUmVsYXRpb25zaGlwIG5hbWUgY2FuZGlkYXRlLlxuICogQHJldHVybnMge3N0cmluZyB8IG51bGx9IC0gUmVtYWluZGVyIGFmdGVyIHRoZSBjYW5kaWRhdGUsIG9yIG51bGwuXG4gKi9cbmZ1bmN0aW9uIHN0cmlwUmVsYXRpb25zaGlwQ2FuZGlkYXRlKHZhbHVlLCBjYW5kaWRhdGUpIHtcbiAgaWYgKHZhbHVlLnN0YXJ0c1dpdGgoYCR7Y2FuZGlkYXRlfV9gKSkge1xuICAgIHJldHVybiB2YWx1ZS5zbGljZShjYW5kaWRhdGUubGVuZ3RoICsgMSlcbiAgfVxuXG4gIGlmICh2YWx1ZS5sZW5ndGggPD0gY2FuZGlkYXRlLmxlbmd0aCkgcmV0dXJuIG51bGxcbiAgaWYgKCF2YWx1ZS5zdGFydHNXaXRoKGNhbmRpZGF0ZSkpIHJldHVybiBudWxsXG5cbiAgY29uc3QgbmV4dENoYXIgPSB2YWx1ZS5jaGFyQXQoY2FuZGlkYXRlLmxlbmd0aClcblxuICBpZiAobmV4dENoYXIgPCBcIkFcIiB8fCBuZXh0Q2hhciA+IFwiWlwiKSByZXR1cm4gbnVsbFxuXG4gIHJldHVybiBuZXh0Q2hhci50b0xvd2VyQ2FzZSgpICsgdmFsdWUuc2xpY2UoY2FuZGlkYXRlLmxlbmd0aCArIDEpXG59XG5cbi8qKlxuICogUnVucyByZWxhdGlvbnNoaXAgY2FuZGlkYXRlcy5cbiAqIEBwYXJhbSB7c3RyaW5nfSByZWxhdGlvbnNoaXBOYW1lIC0gUmVsYXRpb25zaGlwIG5hbWUuXG4gKiBAcmV0dXJucyB7c3RyaW5nW119IC0gQ2FuZGlkYXRlIHRva2VucyBmb3IgbWF0Y2hpbmcuXG4gKi9cbmZ1bmN0aW9uIHJlbGF0aW9uc2hpcENhbmRpZGF0ZXMocmVsYXRpb25zaGlwTmFtZSkge1xuICByZXR1cm4gdW5pcXVuaXplKFtyZWxhdGlvbnNoaXBOYW1lLCBpbmZsZWN0aW9uLnVuZGVyc2NvcmUocmVsYXRpb25zaGlwTmFtZSldKVxufVxuXG4vKipcbiAqIFJ1bnMgcmVzb2x2ZSBhdHRyaWJ1dGUgbmFtZS5cbiAqIEBwYXJhbSB7b2JqZWN0fSBhcmdzIC0gT3B0aW9ucy5cbiAqIEBwYXJhbSB7UmFuc2Fja01vZGVsQ2xhc3N9IGFyZ3MubW9kZWxDbGFzcyAtIE1vZGVsIGNsYXNzLlxuICogQHBhcmFtIHtzdHJpbmd9IGFyZ3MudmFsdWUgLSBBdHRyaWJ1dGUgY2FuZGlkYXRlLlxuICogQHJldHVybnMge3N0cmluZyB8IHVuZGVmaW5lZH0gLSBSZXNvbHZlZCBhdHRyaWJ1dGUgbmFtZS5cbiAqL1xuZnVuY3Rpb24gcmVzb2x2ZUF0dHJpYnV0ZU5hbWUoe21vZGVsQ2xhc3MsIHZhbHVlfSkge1xuICBmb3IgKGNvbnN0IFthdHRyaWJ1dGVOYW1lLCBjb2x1bW5OYW1lXSBvZiBPYmplY3QuZW50cmllcyhhdHRyaWJ1dGVFbnRyaWVzKG1vZGVsQ2xhc3MpKSkge1xuICAgIGlmIChtYXRjaGVzQXR0cmlidXRlVmFsdWUoe2F0dHJpYnV0ZU5hbWUsIGNvbHVtbk5hbWUsIHZhbHVlfSkpIHtcbiAgICAgIHJldHVybiBhdHRyaWJ1dGVOYW1lXG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHVuZGVmaW5lZFxufVxuXG4vKipcbiAqIFJ1bnMgcmVsYXRpb25zaGlwIGVudHJpZXMuXG4gKiBAcGFyYW0ge1JhbnNhY2tNb2RlbENsYXNzfSBtb2RlbENsYXNzIC0gTW9kZWwgY2xhc3MuXG4gKiBAcmV0dXJucyB7UmVjb3JkPHN0cmluZywge3RhcmdldE1vZGVsQ2xhc3M6IFJhbnNhY2tNb2RlbENsYXNzfT59IC0gUmVsYXRpb25zaGlwIGVudHJpZXMga2V5ZWQgYnkgbmFtZS5cbiAqL1xuZnVuY3Rpb24gcmVsYXRpb25zaGlwRW50cmllcyhtb2RlbENsYXNzKSB7XG4gIGlmICh0eXBlb2YgLyoqIEB0eXBlIHs/fSAqLyAobW9kZWxDbGFzcykuZ2V0UmVsYXRpb25zaGlwc01hcCA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgcmV0dXJuIGJhY2tlbmRSZWxhdGlvbnNoaXBFbnRyaWVzKG1vZGVsQ2xhc3MpXG4gIH1cblxuICBpZiAodHlwZW9mIC8qKiBAdHlwZSB7P30gKi8gKG1vZGVsQ2xhc3MpLnJlbGF0aW9uc2hpcERlZmluaXRpb25zID09PSBcImZ1bmN0aW9uXCIgJiZcbiAgICB0eXBlb2YgLyoqIEB0eXBlIHs/fSAqLyAobW9kZWxDbGFzcykucmVsYXRpb25zaGlwTW9kZWxDbGFzc2VzID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICByZXR1cm4gZnJvbnRlbmRSZWxhdGlvbnNoaXBFbnRyaWVzKG1vZGVsQ2xhc3MpXG4gIH1cblxuICByZXR1cm4ge31cbn1cblxuLyoqXG4gKiBSdW5zIGJhY2tlbmQgcmVsYXRpb25zaGlwIGVudHJpZXMuXG4gKiBAcGFyYW0ge1JhbnNhY2tNb2RlbENsYXNzfSBtb2RlbENsYXNzIC0gQmFja2VuZCBtb2RlbCBjbGFzcy5cbiAqIEByZXR1cm5zIHtSZWNvcmQ8c3RyaW5nLCB7dGFyZ2V0TW9kZWxDbGFzczogUmFuc2Fja01vZGVsQ2xhc3N9Pn0gLSBSZWxhdGlvbnNoaXAgZW50cmllcyBrZXllZCBieSBuYW1lLlxuICovXG5mdW5jdGlvbiBiYWNrZW5kUmVsYXRpb25zaGlwRW50cmllcyhtb2RlbENsYXNzKSB7XG4gIC8qKlxuICAgKiBFbnRyaWVzLlxuICAgKiBAdHlwZSB7UmVjb3JkPHN0cmluZywge3RhcmdldE1vZGVsQ2xhc3M6IFJhbnNhY2tNb2RlbENsYXNzfT59ICovXG4gIGNvbnN0IGVudHJpZXMgPSB7fVxuICBjb25zdCByZWxhdGlvbnNoaXBzTWFwID0gLyoqIEB0eXBlIHs/fSAqLyAobW9kZWxDbGFzcykuZ2V0UmVsYXRpb25zaGlwc01hcCgpXG5cbiAgZm9yIChjb25zdCByZWxhdGlvbnNoaXBOYW1lIG9mIE9iamVjdC5rZXlzKHJlbGF0aW9uc2hpcHNNYXApKSB7XG4gICAgY29uc3QgcmVsYXRpb25zaGlwID0gcmVsYXRpb25zaGlwc01hcFtyZWxhdGlvbnNoaXBOYW1lXVxuXG4gICAgaWYgKHR5cGVvZiByZWxhdGlvbnNoaXAuaXNQb2x5bW9ycGhpYyA9PT0gXCJmdW5jdGlvblwiICYmIHJlbGF0aW9uc2hpcC5pc1BvbHltb3JwaGljKCkpIGNvbnRpbnVlXG5cbiAgICBjb25zdCB0YXJnZXRNb2RlbENsYXNzID0gcmVsYXRpb25zaGlwLmdldFRhcmdldE1vZGVsQ2xhc3MoKVxuXG4gICAgaWYgKCF0YXJnZXRNb2RlbENsYXNzKSBjb250aW51ZVxuXG4gICAgZW50cmllc1tyZWxhdGlvbnNoaXBOYW1lXSA9IHt0YXJnZXRNb2RlbENsYXNzfVxuICB9XG5cbiAgcmV0dXJuIGVudHJpZXNcbn1cblxuLyoqXG4gKiBSdW5zIGZyb250ZW5kIHJlbGF0aW9uc2hpcCBlbnRyaWVzLlxuICogQHBhcmFtIHtSYW5zYWNrTW9kZWxDbGFzc30gbW9kZWxDbGFzcyAtIEZyb250ZW5kIG1vZGVsIGNsYXNzLlxuICogQHJldHVybnMge1JlY29yZDxzdHJpbmcsIHt0YXJnZXRNb2RlbENsYXNzOiBSYW5zYWNrTW9kZWxDbGFzc30+fSAtIFJlbGF0aW9uc2hpcCBlbnRyaWVzIGtleWVkIGJ5IG5hbWUuXG4gKi9cbmZ1bmN0aW9uIGZyb250ZW5kUmVsYXRpb25zaGlwRW50cmllcyhtb2RlbENsYXNzKSB7XG4gIC8qKlxuICAgKiBFbnRyaWVzLlxuICAgKiBAdHlwZSB7UmVjb3JkPHN0cmluZywge3RhcmdldE1vZGVsQ2xhc3M6IFJhbnNhY2tNb2RlbENsYXNzfT59ICovXG4gIGNvbnN0IGVudHJpZXMgPSB7fVxuICBjb25zdCBkZWZpbml0aW9ucyA9IC8qKiBAdHlwZSB7P30gKi8gKG1vZGVsQ2xhc3MpLnJlbGF0aW9uc2hpcERlZmluaXRpb25zKClcbiAgY29uc3QgcmVsYXRpb25zaGlwTW9kZWxDbGFzc2VzID0gLyoqIEB0eXBlIHs/fSAqLyAobW9kZWxDbGFzcykucmVsYXRpb25zaGlwTW9kZWxDbGFzc2VzKClcblxuICBmb3IgKGNvbnN0IHJlbGF0aW9uc2hpcE5hbWUgb2YgT2JqZWN0LmtleXMoZGVmaW5pdGlvbnMpKSB7XG4gICAgY29uc3QgdGFyZ2V0TW9kZWxDbGFzcyA9IHJlc29sdmVGcm9udGVuZE1vZGVsQ2xhc3MocmVsYXRpb25zaGlwTW9kZWxDbGFzc2VzW3JlbGF0aW9uc2hpcE5hbWVdKVxuXG4gICAgaWYgKCF0YXJnZXRNb2RlbENsYXNzKSBjb250aW51ZVxuXG4gICAgZW50cmllc1tyZWxhdGlvbnNoaXBOYW1lXSA9IHt0YXJnZXRNb2RlbENsYXNzfVxuICB9XG5cbiAgcmV0dXJuIGVudHJpZXNcbn1cblxuLyoqXG4gKiBSdW5zIGF0dHJpYnV0ZSBlbnRyaWVzLlxuICogQHBhcmFtIHtSYW5zYWNrTW9kZWxDbGFzc30gbW9kZWxDbGFzcyAtIE1vZGVsIGNsYXNzLlxuICogQHJldHVybnMge1JlY29yZDxzdHJpbmcsIHN0cmluZz59IC0gQXR0cmlidXRlLXRvLWNvbHVtbiBlbnRyaWVzIGtleWVkIGJ5IGF0dHJpYnV0ZSBuYW1lLlxuICovXG5mdW5jdGlvbiBhdHRyaWJ1dGVFbnRyaWVzKG1vZGVsQ2xhc3MpIHtcbiAgaWYgKHR5cGVvZiAvKiogQHR5cGUgez99ICovIChtb2RlbENsYXNzKS5nZXRBdHRyaWJ1dGVOYW1lVG9Db2x1bW5OYW1lTWFwID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICByZXR1cm4gLyoqIEB0eXBlIHtSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+fSAqLyAoKC8qKiBAdHlwZSB7P30gKi8gKG1vZGVsQ2xhc3MpLmdldEF0dHJpYnV0ZU5hbWVUb0NvbHVtbk5hbWVNYXAoKSkpXG4gIH1cblxuICBjb25zdCByZXNvdXJjZUNvbmZpZyA9IHR5cGVvZiAvKiogQHR5cGUgez99ICovIChtb2RlbENsYXNzKS5yZXNvdXJjZUNvbmZpZyA9PT0gXCJmdW5jdGlvblwiXG4gICAgPyAvKiogQHR5cGUgez99ICovIChtb2RlbENsYXNzKS5yZXNvdXJjZUNvbmZpZygpXG4gICAgOiB7fVxuICBjb25zdCBhdHRyaWJ1dGVzID0gcmVzb3VyY2VDb25maWcuYXR0cmlidXRlc1xuICAvKipcbiAgICogRW50cmllcy5cbiAgICogQHR5cGUge1JlY29yZDxzdHJpbmcsIHN0cmluZz59ICovXG4gIGNvbnN0IGVudHJpZXMgPSB7fVxuXG4gIGlmIChBcnJheS5pc0FycmF5KGF0dHJpYnV0ZXMpKSB7XG4gICAgZm9yIChjb25zdCBhdHRyaWJ1dGVOYW1lIG9mIGF0dHJpYnV0ZXMpIHtcbiAgICAgIGlmICh0eXBlb2YgYXR0cmlidXRlTmFtZSAhPT0gXCJzdHJpbmdcIikgY29udGludWVcblxuICAgICAgZW50cmllc1thdHRyaWJ1dGVOYW1lXSA9IGF0dHJpYnV0ZU5hbWVcbiAgICB9XG4gIH0gZWxzZSBpZiAoaXNQbGFpbk9iamVjdChhdHRyaWJ1dGVzKSkge1xuICAgIGZvciAoY29uc3QgYXR0cmlidXRlTmFtZSBvZiBPYmplY3Qua2V5cyhhdHRyaWJ1dGVzKSkge1xuICAgICAgZW50cmllc1thdHRyaWJ1dGVOYW1lXSA9IGF0dHJpYnV0ZU5hbWVcbiAgICB9XG4gIH1cblxuICByZXR1cm4gZW50cmllc1xufVxuXG4vKipcbiAqIFJ1bnMgbWF0Y2hlcyBhdHRyaWJ1dGUgdmFsdWUuXG4gKiBAcGFyYW0ge29iamVjdH0gYXJncyAtIE9wdGlvbnMuXG4gKiBAcGFyYW0ge3N0cmluZ30gYXJncy5hdHRyaWJ1dGVOYW1lIC0gQXR0cmlidXRlIG5hbWUuXG4gKiBAcGFyYW0ge3N0cmluZ30gYXJncy5jb2x1bW5OYW1lIC0gQ29sdW1uIG5hbWUuXG4gKiBAcGFyYW0ge3N0cmluZ30gYXJncy52YWx1ZSAtIENhbmRpZGF0ZSB2YWx1ZS5cbiAqIEByZXR1cm5zIHtib29sZWFufSAtIFdoZXRoZXIgdGhlIGNhbmRpZGF0ZSByZXNvbHZlcyB0byB0aGUgYXR0cmlidXRlLlxuICovXG5mdW5jdGlvbiBtYXRjaGVzQXR0cmlidXRlVmFsdWUoe2F0dHJpYnV0ZU5hbWUsIGNvbHVtbk5hbWUsIHZhbHVlfSkge1xuICByZXR1cm4gdW5pcXVuaXplKFtcbiAgICBhdHRyaWJ1dGVOYW1lLFxuICAgIGNvbHVtbk5hbWUsXG4gICAgaW5mbGVjdGlvbi51bmRlcnNjb3JlKGF0dHJpYnV0ZU5hbWUpLFxuICAgIGluZmxlY3Rpb24udW5kZXJzY29yZShjb2x1bW5OYW1lKVxuICBdKS5pbmNsdWRlcyh2YWx1ZSlcbn1cblxuLyoqXG4gKiBSdW5zIHBhcnNlIHJhbnNhY2sga2V5LlxuICogQHBhcmFtIHtzdHJpbmd9IGtleSAtIFJhbnNhY2sga2V5LlxuICogQHJldHVybnMge3twYXRoVmFsdWU6IHN0cmluZywgcHJlZGljYXRlOiBSYW5zYWNrUHJlZGljYXRlfSB8IG51bGx9IC0gUGFyc2VkIGtleS5cbiAqL1xuZnVuY3Rpb24gcGFyc2VSYW5zYWNrS2V5KGtleSkge1xuICBmb3IgKGNvbnN0IHByZWRpY2F0ZSBvZiBzdXBwb3J0ZWRQcmVkaWNhdGVzKSB7XG4gICAgY29uc3Qgc3VmZml4ID0gYF8ke3ByZWRpY2F0ZX1gXG4gICAgaWYgKCFrZXkuZW5kc1dpdGgoc3VmZml4KSkgY29udGludWVcblxuICAgIGNvbnN0IHBhdGhWYWx1ZSA9IGtleS5zbGljZSgwLCBrZXkubGVuZ3RoIC0gc3VmZml4Lmxlbmd0aClcblxuICAgIGlmIChwYXRoVmFsdWUubGVuZ3RoIDwgMSkge1xuICAgICAgdGhyb3cgcmFuc2Fja1F1ZXJ5RXJyb3IoYEludmFsaWQgcmFuc2FjayBrZXk6ICR7a2V5fWApXG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIHBhdGhWYWx1ZSxcbiAgICAgIHByZWRpY2F0ZTogLyoqIEB0eXBlIHtSYW5zYWNrUHJlZGljYXRlfSAqLyAocHJlZGljYXRlKVxuICAgIH1cbiAgfVxuXG4gIGZvciAoY29uc3QgcHJlZGljYXRlIG9mIHN1cHBvcnRlZFByZWRpY2F0ZXMpIHtcbiAgICBjb25zdCBjYW1lbFN1ZmZpeCA9IHNuYWtlVG9DYW1lbFN1ZmZpeChwcmVkaWNhdGUpXG5cbiAgICBpZiAoIWtleS5lbmRzV2l0aChjYW1lbFN1ZmZpeCkpIGNvbnRpbnVlXG5cbiAgICBjb25zdCBwYXRoVmFsdWUgPSBrZXkuc2xpY2UoMCwga2V5Lmxlbmd0aCAtIGNhbWVsU3VmZml4Lmxlbmd0aClcblxuICAgIGlmIChwYXRoVmFsdWUubGVuZ3RoIDwgMSkge1xuICAgICAgdGhyb3cgcmFuc2Fja1F1ZXJ5RXJyb3IoYEludmFsaWQgcmFuc2FjayBrZXk6ICR7a2V5fWApXG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIHBhdGhWYWx1ZSxcbiAgICAgIHByZWRpY2F0ZTogLyoqIEB0eXBlIHtSYW5zYWNrUHJlZGljYXRlfSAqLyAocHJlZGljYXRlKVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBudWxsXG59XG5cbi8qKlxuICogUnVucyBzbmFrZSB0byBjYW1lbCBzdWZmaXguXG4gKiBAcGFyYW0ge3N0cmluZ30gdmFsdWUgLSBTbmFrZS1jYXNlIHByZWRpY2F0ZS5cbiAqIEByZXR1cm5zIHtzdHJpbmd9IC0gQ2FtZWxDYXNlIHByZWRpY2F0ZSBzdWZmaXggdXNlZCBpbiByYW5zYWNrIGtleXMuXG4gKi9cbmZ1bmN0aW9uIHNuYWtlVG9DYW1lbFN1ZmZpeCh2YWx1ZSkge1xuICBjb25zdCBzZWdtZW50cyA9IHZhbHVlLnNwbGl0KFwiX1wiKVxuXG4gIHJldHVybiBzZWdtZW50cy5tYXAoKHNlZ21lbnQpID0+IHNlZ21lbnQuY2hhckF0KDApLnRvVXBwZXJDYXNlKCkgKyBzZWdtZW50LnNsaWNlKDEpKS5qb2luKFwiXCIpXG59XG5cbi8qKlxuICogUnVucyBub3JtYWxpemUgcmFuc2FjayB2YWx1ZS5cbiAqIEBwYXJhbSB7b2JqZWN0fSBhcmdzIC0gT3B0aW9ucy5cbiAqIEBwYXJhbSB7UmFuc2Fja1ByZWRpY2F0ZX0gYXJncy5wcmVkaWNhdGUgLSBQYXJzZWQgcHJlZGljYXRlLlxuICogQHBhcmFtIHs/fSBhcmdzLnZhbHVlIC0gUmF3IHZhbHVlLlxuICogQHJldHVybnMgez99IC0gTm9ybWFsaXplZCB2YWx1ZS5cbiAqL1xuZnVuY3Rpb24gbm9ybWFsaXplUmFuc2Fja1ZhbHVlKHtwcmVkaWNhdGUsIHZhbHVlfSkge1xuICBpZiAocHJlZGljYXRlID09PSBcIm51bGxcIikge1xuICAgIHJldHVybiBub3JtYWxpemVSYW5zYWNrTnVsbFZhbHVlKHZhbHVlKVxuICB9XG5cbiAgaWYgKHByZWRpY2F0ZSA9PT0gXCJpblwiIHx8IHByZWRpY2F0ZSA9PT0gXCJub3RfaW5cIikge1xuICAgIHJldHVybiBub3JtYWxpemVSYW5zYWNrTGlzdFZhbHVlKHZhbHVlKVxuICB9XG5cbiAgaWYgKHJhbnNhY2tWYWx1ZUlzQmxhbmsodmFsdWUpKSByZXR1cm4gU0tJUF9SQU5TQUNLX0NPTkRJVElPTlxuXG4gIHJldHVybiB2YWx1ZVxufVxuXG4vKipcbiAqIFJ1bnMgbm9ybWFsaXplIHJhbnNhY2sgbnVsbCB2YWx1ZS5cbiAqIEBwYXJhbSB7P30gdmFsdWUgLSBDYW5kaWRhdGUgbnVsbCBwcmVkaWNhdGUgdmFsdWUuXG4gKiBAcmV0dXJucyB7Ym9vbGVhbiB8IHR5cGVvZiBTS0lQX1JBTlNBQ0tfQ09ORElUSU9OfSAtIE5vcm1hbGl6ZWQgdmFsdWUuXG4gKi9cbmZ1bmN0aW9uIG5vcm1hbGl6ZVJhbnNhY2tOdWxsVmFsdWUodmFsdWUpIHtcbiAgY29uc3QgYm9vbGVhblZhbHVlID0gbm9ybWFsaXplUmFuc2Fja0Jvb2xlYW4odmFsdWUpXG5cbiAgcmV0dXJuIGJvb2xlYW5WYWx1ZSA9PT0gbnVsbCA/IFNLSVBfUkFOU0FDS19DT05ESVRJT04gOiBib29sZWFuVmFsdWVcbn1cblxuLyoqXG4gKiBSdW5zIG5vcm1hbGl6ZSByYW5zYWNrIGxpc3QgdmFsdWUuXG4gKiBAcGFyYW0gez99IHZhbHVlIC0gQ2FuZGlkYXRlIGxpc3QgcHJlZGljYXRlIHZhbHVlLlxuICogQHJldHVybnMge0FycmF5PD8+IHwgdHlwZW9mIFNLSVBfUkFOU0FDS19DT05ESVRJT059IC0gTm9ybWFsaXplZCB2YWx1ZS5cbiAqL1xuZnVuY3Rpb24gbm9ybWFsaXplUmFuc2Fja0xpc3RWYWx1ZSh2YWx1ZSkge1xuICBjb25zdCBub3JtYWxpemVkQXJyYXkgPSBub3JtYWxpemVSYW5zYWNrQXJyYXkodmFsdWUpXG5cbiAgcmV0dXJuIG5vcm1hbGl6ZWRBcnJheS5sZW5ndGggPCAxID8gU0tJUF9SQU5TQUNLX0NPTkRJVElPTiA6IG5vcm1hbGl6ZWRBcnJheVxufVxuXG4vKipcbiAqIFJhbnNhY2sgdHJ1ZSB2YWx1ZXMuXG4gKiBAdHlwZSB7U2V0PD8+fSAqL1xuY29uc3QgcmFuc2Fja1RydWVWYWx1ZXMgPSBuZXcgU2V0KFt0cnVlLCAxLCBcIjFcIiwgXCJ0cnVlXCJdKVxuLyoqXG4gKiBSYW5zYWNrIGZhbHNlIHZhbHVlcy5cbiAqIEB0eXBlIHtTZXQ8Pz59ICovXG5jb25zdCByYW5zYWNrRmFsc2VWYWx1ZXMgPSBuZXcgU2V0KFtmYWxzZSwgMCwgXCIwXCIsIFwiZmFsc2VcIl0pXG5cbi8qKlxuICogUnVucyBub3JtYWxpemUgcmFuc2FjayBib29sZWFuLlxuICogQHBhcmFtIHs/fSB2YWx1ZSAtIENhbmRpZGF0ZSBib29sZWFuLlxuICogQHJldHVybnMge2Jvb2xlYW4gfCBudWxsfSAtIE5vcm1hbGl6ZWQgYm9vbGVhbiBvciBudWxsIHdoZW4gYmxhbmsuXG4gKi9cbmZ1bmN0aW9uIG5vcm1hbGl6ZVJhbnNhY2tCb29sZWFuKHZhbHVlKSB7XG4gIGlmIChyYW5zYWNrVHJ1ZVZhbHVlcy5oYXModmFsdWUpKSByZXR1cm4gdHJ1ZVxuICBpZiAocmFuc2Fja0ZhbHNlVmFsdWVzLmhhcyh2YWx1ZSkpIHJldHVybiBmYWxzZVxuICBpZiAocmFuc2Fja1ZhbHVlSXNCbGFuayh2YWx1ZSkpIHJldHVybiBudWxsXG5cbiAgdGhyb3cgcmFuc2Fja1F1ZXJ5RXJyb3IoYEludmFsaWQgcmFuc2FjayBib29sZWFuIHZhbHVlOiAke1N0cmluZyh2YWx1ZSl9YClcbn1cblxuLyoqXG4gKiBSdW5zIHJhbnNhY2sgdmFsdWUgaXMgYmxhbmsuXG4gKiBAcGFyYW0gez99IHZhbHVlIC0gQ2FuZGlkYXRlIHZhbHVlLlxuICogQHJldHVybnMge2Jvb2xlYW59IC0gV2hldGhlciB2YWx1ZSBzaG91bGQgYmUgaWdub3JlZCBhcyBibGFuay5cbiAqL1xuZnVuY3Rpb24gcmFuc2Fja1ZhbHVlSXNCbGFuayh2YWx1ZSkge1xuICByZXR1cm4gdmFsdWUgPT09IHVuZGVmaW5lZCB8fCB2YWx1ZSA9PT0gbnVsbCB8fCB2YWx1ZSA9PT0gXCJcIlxufVxuXG4vKipcbiAqIFJ1bnMgbm9ybWFsaXplIHJhbnNhY2sgYXJyYXkuXG4gKiBAcGFyYW0gez99IHZhbHVlIC0gQ2FuZGlkYXRlIGFycmF5LWlzaCB2YWx1ZS5cbiAqIEByZXR1cm5zIHtBcnJheTw/Pn0gLSBOb3JtYWxpemVkIGFycmF5IHZhbHVlcy5cbiAqL1xuZnVuY3Rpb24gbm9ybWFsaXplUmFuc2Fja0FycmF5KHZhbHVlKSB7XG4gIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgIHJldHVybiB2YWx1ZS5maWx0ZXIoKGVudHJ5KSA9PiBlbnRyeSAhPT0gdW5kZWZpbmVkICYmIGVudHJ5ICE9PSBudWxsICYmIGVudHJ5ICE9PSBcIlwiKVxuICB9XG5cbiAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gXCJzdHJpbmdcIikge1xuICAgIHJldHVybiB2YWx1ZS5zcGxpdChcIixcIikubWFwKChlbnRyeSkgPT4gZW50cnkudHJpbSgpKS5maWx0ZXIoKGVudHJ5KSA9PiBlbnRyeS5sZW5ndGggPiAwKVxuICB9XG5cbiAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQgfHwgdmFsdWUgPT09IG51bGwgfHwgdmFsdWUgPT09IFwiXCIpIHJldHVybiBbXVxuXG4gIHJldHVybiBbdmFsdWVdXG59XG5cbi8qKlxuICogUmFuc2Fja1NvcnQgdHlwZS5cbiAqIEB0eXBlZGVmIHtvYmplY3R9IFJhbnNhY2tTb3J0XG4gKiBAcHJvcGVydHkge3N0cmluZ30gYXR0cmlidXRlIC0gUmVzb2x2ZWQgYXR0cmlidXRlIG5hbWUuXG4gKiBAcHJvcGVydHkge1wiYXNjXCIgfCBcImRlc2NcIn0gZGlyZWN0aW9uIC0gU29ydCBkaXJlY3Rpb24uXG4gKi9cblxuLyoqXG4gKiBQYXJzZXMgYSByYW5zYWNrIGBzYCBzb3J0IHN0cmluZyBhZ2FpbnN0IG1vZGVsIGF0dHJpYnV0ZXMuXG4gKiBAcGFyYW0ge1JhbnNhY2tNb2RlbENsYXNzfSBtb2RlbENsYXNzIC0gTW9kZWwgY2xhc3MgZm9yIGF0dHJpYnV0ZSBsb29rdXAuXG4gKiBAcGFyYW0ge3N0cmluZ30gc29ydFN0cmluZyAtIFJhbnNhY2sgc29ydCBzdHJpbmcgKGUuZy4sIFwibmFtZSBhc2NcIiBvciBcIm5hbWUgYXNjLCBjcmVhdGVkQXQgZGVzY1wiKS5cbiAqIEByZXR1cm5zIHtSYW5zYWNrU29ydFtdfSAtIFBhcnNlZCBzb3J0IGRlZmluaXRpb25zLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcGFyc2VSYW5zYWNrU29ydChtb2RlbENsYXNzLCBzb3J0U3RyaW5nKSB7XG4gIGNvbnN0IHNlZ21lbnRzID0gc29ydFN0cmluZy5zcGxpdChcIixcIikubWFwKChzZWdtZW50KSA9PiBzZWdtZW50LnRyaW0oKSkuZmlsdGVyKChzZWdtZW50KSA9PiBzZWdtZW50Lmxlbmd0aCA+IDApXG5cbiAgLyoqXG4gICAqIFNvcnRzLlxuICAgKiBAdHlwZSB7UmFuc2Fja1NvcnRbXX0gKi9cbiAgY29uc3Qgc29ydHMgPSBbXVxuXG4gIGZvciAoY29uc3Qgc2VnbWVudCBvZiBzZWdtZW50cykge1xuICAgIGNvbnN0IHBhcnRzID0gc2VnbWVudC5zcGxpdCgvXFxzKy8pXG4gICAgY29uc3QgY29sdW1uQ2FuZGlkYXRlID0gcGFydHNbMF1cbiAgICBjb25zdCBkaXJlY3Rpb25DYW5kaWRhdGUgPSBwYXJ0cy5sZW5ndGggPiAxID8gcGFydHNbMV0udG9Mb3dlckNhc2UoKSA6IFwiYXNjXCJcblxuICAgIGlmIChkaXJlY3Rpb25DYW5kaWRhdGUgIT09IFwiYXNjXCIgJiYgZGlyZWN0aW9uQ2FuZGlkYXRlICE9PSBcImRlc2NcIikge1xuICAgICAgdGhyb3cgcmFuc2Fja1F1ZXJ5RXJyb3IoYEludmFsaWQgcmFuc2FjayBzb3J0IGRpcmVjdGlvbiBcIiR7ZGlyZWN0aW9uQ2FuZGlkYXRlfVwiIGluOiAke3NlZ21lbnR9YClcbiAgICB9XG5cbiAgICBjb25zdCByZXNvbHZlZEF0dHJpYnV0ZSA9IHJlc29sdmVBdHRyaWJ1dGVOYW1lKHttb2RlbENsYXNzLCB2YWx1ZTogY29sdW1uQ2FuZGlkYXRlfSlcblxuICAgIGlmICghcmVzb2x2ZWRBdHRyaWJ1dGUpIHtcbiAgICAgIHRocm93IHJhbnNhY2tRdWVyeUVycm9yKGBVbmtub3duIHJhbnNhY2sgc29ydCBhdHRyaWJ1dGUgXCIke2NvbHVtbkNhbmRpZGF0ZX1cIiBmb3IgJHttb2RlbENsYXNzLm5hbWV9YClcbiAgICB9XG5cbiAgICBzb3J0cy5wdXNoKHthdHRyaWJ1dGU6IHJlc29sdmVkQXR0cmlidXRlLCBkaXJlY3Rpb246IGRpcmVjdGlvbkNhbmRpZGF0ZX0pXG4gIH1cblxuICByZXR1cm4gc29ydHNcbn1cblxuLyoqXG4gKiBSdW5zIHVuaXF1bml6ZS5cbiAqIEBwYXJhbSB7c3RyaW5nW119IHZhbHVlcyAtIElucHV0IHZhbHVlcy5cbiAqIEByZXR1cm5zIHtzdHJpbmdbXX0gLSBVbmlxdWUgdmFsdWVzIGluIG9yaWdpbmFsIG9yZGVyLlxuICovXG5mdW5jdGlvbiB1bmlxdW5pemUodmFsdWVzKSB7XG4gIHJldHVybiBBcnJheS5mcm9tKG5ldyBTZXQodmFsdWVzKSlcbn1cbiJdfQ==
|