@blinkk/root-cms 1.0.0-rc.3 → 1.0.0-rc.30
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +22 -0
- package/README.md +41 -0
- package/dist/app.js +3 -1
- package/dist/cli.js +50 -13
- package/dist/client.d.ts +36 -2
- package/dist/client.js +136 -5
- package/dist/core.d.ts +2 -2
- package/dist/core.js +144 -5
- package/dist/functions.d.ts +1 -1
- package/dist/functions.js +2 -1
- package/dist/plugin.d.ts +11 -1
- package/dist/plugin.js +6 -1
- package/dist/project.d.ts +2 -2
- package/dist/richtext.d.ts +73 -0
- package/dist/richtext.js +129 -0
- package/dist/{schema-49de9659.d.ts → schema--v3Ho5Lj.d.ts} +32 -39
- package/dist/ui/signin.css +19 -3
- package/dist/ui/signin.js +550 -402
- package/dist/ui/ui.css +223 -48
- package/dist/ui/ui.js +21604 -7856
- package/package.json +51 -35
package/dist/core.js
CHANGED
|
@@ -5,14 +5,16 @@ var __export = (target, all) => {
|
|
|
5
5
|
};
|
|
6
6
|
|
|
7
7
|
// core/client.ts
|
|
8
|
+
import crypto from "node:crypto";
|
|
8
9
|
import {
|
|
9
10
|
FieldValue,
|
|
10
11
|
getFirestore
|
|
11
12
|
} from "firebase-admin/firestore";
|
|
13
|
+
var PUBLISH_DOCS_BATCH_LIMIT = 100;
|
|
12
14
|
var RootCMSClient = class {
|
|
13
15
|
constructor(rootConfig) {
|
|
14
16
|
this.rootConfig = rootConfig;
|
|
15
|
-
this.cmsPlugin = getCmsPlugin(rootConfig);
|
|
17
|
+
this.cmsPlugin = getCmsPlugin(this.rootConfig);
|
|
16
18
|
const cmsPluginOptions = this.cmsPlugin.getConfig();
|
|
17
19
|
this.projectId = cmsPluginOptions.id || "default";
|
|
18
20
|
this.app = this.cmsPlugin.getFirebaseApp();
|
|
@@ -94,6 +96,82 @@ var RootCMSClient = class {
|
|
|
94
96
|
const count = results.data().count;
|
|
95
97
|
return count;
|
|
96
98
|
}
|
|
99
|
+
/**
|
|
100
|
+
* Batch publishes a set of docs by id.
|
|
101
|
+
*/
|
|
102
|
+
async publishDocs(docIds, options) {
|
|
103
|
+
const projectCollectionsPath = `Projects/${this.projectId}/Collections`;
|
|
104
|
+
const publishedBy = (options == null ? void 0 : options.publishedBy) || "root-cms-client";
|
|
105
|
+
const docRefs = docIds.map((docId) => {
|
|
106
|
+
const [collection2, slug] = docId.split("/");
|
|
107
|
+
if (!collection2 || !slug) {
|
|
108
|
+
throw new Error(`invalid doc id: ${docId}`);
|
|
109
|
+
}
|
|
110
|
+
const docRef = this.db.doc(
|
|
111
|
+
`${projectCollectionsPath}/${collection2}/Drafts/${slug}`
|
|
112
|
+
);
|
|
113
|
+
return docRef;
|
|
114
|
+
});
|
|
115
|
+
const docSnapshots = await this.db.getAll(...docRefs);
|
|
116
|
+
const docs = docSnapshots.map((snapshot) => snapshot.data()).filter((d) => !!d);
|
|
117
|
+
if (docs.length > PUBLISH_DOCS_BATCH_LIMIT) {
|
|
118
|
+
throw new Error(
|
|
119
|
+
`publishDocs() has a limit of ${PUBLISH_DOCS_BATCH_LIMIT}`
|
|
120
|
+
);
|
|
121
|
+
}
|
|
122
|
+
if (docs.length === 0) {
|
|
123
|
+
return [];
|
|
124
|
+
}
|
|
125
|
+
let batchCount = 0;
|
|
126
|
+
const batch = this.db.batch();
|
|
127
|
+
const publishedDocs = [];
|
|
128
|
+
for (const doc of docs) {
|
|
129
|
+
const { id, collection: collection2, slug, sys, fields } = doc;
|
|
130
|
+
const draftRef = this.db.doc(
|
|
131
|
+
`${projectCollectionsPath}/${collection2}/Drafts/${slug}`
|
|
132
|
+
);
|
|
133
|
+
const scheduledRef = this.db.doc(
|
|
134
|
+
`${projectCollectionsPath}/${collection2}/Scheduled/${slug}`
|
|
135
|
+
);
|
|
136
|
+
const publishedRef = this.db.doc(
|
|
137
|
+
`${projectCollectionsPath}/${collection2}/Published/${slug}`
|
|
138
|
+
);
|
|
139
|
+
const firstPublishedAt = sys.firstPublishedAt ?? FieldValue.serverTimestamp();
|
|
140
|
+
const firstPublishedBy = sys.firstPublishedBy ?? publishedBy;
|
|
141
|
+
batch.set(publishedRef, {
|
|
142
|
+
id,
|
|
143
|
+
collection: collection2,
|
|
144
|
+
slug,
|
|
145
|
+
fields: fields || {},
|
|
146
|
+
sys: {
|
|
147
|
+
...sys,
|
|
148
|
+
firstPublishedAt,
|
|
149
|
+
firstPublishedBy,
|
|
150
|
+
publishedAt: FieldValue.serverTimestamp(),
|
|
151
|
+
publishedBy
|
|
152
|
+
}
|
|
153
|
+
});
|
|
154
|
+
batchCount += 1;
|
|
155
|
+
batch.delete(scheduledRef);
|
|
156
|
+
batchCount += 1;
|
|
157
|
+
batch.update(draftRef, {
|
|
158
|
+
"sys.scheduledAt": FieldValue.delete(),
|
|
159
|
+
"sys.scheduledBy": FieldValue.delete(),
|
|
160
|
+
"sys.firstPublishedAt": firstPublishedAt,
|
|
161
|
+
"sys.firstPublishedBy": firstPublishedBy,
|
|
162
|
+
"sys.publishedAt": FieldValue.serverTimestamp(),
|
|
163
|
+
"sys.publishedBy": publishedBy
|
|
164
|
+
});
|
|
165
|
+
batchCount += 1;
|
|
166
|
+
publishedDocs.push(doc);
|
|
167
|
+
if (batchCount >= 498) {
|
|
168
|
+
break;
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
await batch.commit();
|
|
172
|
+
console.log(`published ${publishedDocs.length} docs!`);
|
|
173
|
+
return publishedDocs;
|
|
174
|
+
}
|
|
97
175
|
/**
|
|
98
176
|
* Publishes scheduled docs.
|
|
99
177
|
*/
|
|
@@ -142,7 +220,7 @@ var RootCMSClient = class {
|
|
|
142
220
|
);
|
|
143
221
|
const { scheduledAt, scheduledBy, ...sys } = data.sys || {};
|
|
144
222
|
const firstPublishedAt = sys.firstPublishedAt ?? scheduledAt;
|
|
145
|
-
const firstPublishedBy = sys.firstPublishedBy ?? (scheduledBy || "");
|
|
223
|
+
const firstPublishedBy = sys.firstPublishedBy ?? (scheduledBy || "root-cms-client");
|
|
146
224
|
batch.set(publishedRef, {
|
|
147
225
|
id,
|
|
148
226
|
collection: collection2,
|
|
@@ -165,7 +243,7 @@ var RootCMSClient = class {
|
|
|
165
243
|
"sys.firstPublishedAt": firstPublishedAt,
|
|
166
244
|
"sys.firstPublishedBy": firstPublishedBy,
|
|
167
245
|
"sys.publishedAt": FieldValue.serverTimestamp(),
|
|
168
|
-
"sys.publishedBy": scheduledBy || ""
|
|
246
|
+
"sys.publishedBy": scheduledBy || "root-cms-client"
|
|
169
247
|
});
|
|
170
248
|
batchCount += 1;
|
|
171
249
|
publishedDocs.push(doc);
|
|
@@ -202,6 +280,53 @@ var RootCMSClient = class {
|
|
|
202
280
|
});
|
|
203
281
|
return translationsMap;
|
|
204
282
|
}
|
|
283
|
+
/**
|
|
284
|
+
* Saves a map of translations, e.g.:
|
|
285
|
+
* ```
|
|
286
|
+
* await client.saveTranslations({
|
|
287
|
+
* "Hello": {"es": "Hola", "fr": "Bonjour"},
|
|
288
|
+
* });
|
|
289
|
+
* ```
|
|
290
|
+
*/
|
|
291
|
+
async saveTranslations(translations, tags) {
|
|
292
|
+
const translationsPath = `Projects/${this.projectId}/Translations`;
|
|
293
|
+
const batch = this.db.batch();
|
|
294
|
+
let batchCount = 0;
|
|
295
|
+
Object.entries(translations).forEach(([source, sourceTranslations]) => {
|
|
296
|
+
const hash = this.getTranslationKey(source);
|
|
297
|
+
const translationRef = this.db.doc(`${translationsPath}/${hash}`);
|
|
298
|
+
const data = {
|
|
299
|
+
...sourceTranslations,
|
|
300
|
+
source: this.normalizeString(source)
|
|
301
|
+
};
|
|
302
|
+
if (tags) {
|
|
303
|
+
data.tags = tags;
|
|
304
|
+
}
|
|
305
|
+
batch.update(translationRef, data);
|
|
306
|
+
batchCount += 1;
|
|
307
|
+
});
|
|
308
|
+
if (batchCount > 500) {
|
|
309
|
+
throw new Error("up to 500 translations can be saved at a time.");
|
|
310
|
+
}
|
|
311
|
+
await batch.commit();
|
|
312
|
+
}
|
|
313
|
+
/**
|
|
314
|
+
* Returns the "key" used for a translation as stored in the db. Translations
|
|
315
|
+
* are stored under `Projects/<project id>/Translations/<sha1 hash>`.
|
|
316
|
+
*/
|
|
317
|
+
getTranslationKey(source) {
|
|
318
|
+
const sha1 = crypto.createHash("sha1").update(this.normalizeString(source)).digest("hex");
|
|
319
|
+
return sha1;
|
|
320
|
+
}
|
|
321
|
+
/**
|
|
322
|
+
* Cleans a string that's used for translations. Performs the following:
|
|
323
|
+
* - Removes any leading/trailing whitespace
|
|
324
|
+
* - Removes spaces at the end of any line
|
|
325
|
+
*/
|
|
326
|
+
normalizeString(str) {
|
|
327
|
+
const lines = String(str).trim().split("\n").map((line) => line.trimEnd());
|
|
328
|
+
return lines.join("\n");
|
|
329
|
+
}
|
|
205
330
|
/**
|
|
206
331
|
* Loads translations for a particular locale.
|
|
207
332
|
*
|
|
@@ -233,7 +358,12 @@ function unmarshalData(data) {
|
|
|
233
358
|
if (val.toMillis) {
|
|
234
359
|
result[key] = val.toMillis();
|
|
235
360
|
} else if (Object.hasOwn(val, "_array") && Array.isArray(val._array)) {
|
|
236
|
-
const arr = val._array.map((
|
|
361
|
+
const arr = val._array.map((arrayKey) => {
|
|
362
|
+
return {
|
|
363
|
+
...unmarshalData(val[arrayKey] || {}),
|
|
364
|
+
_arrayKey: arrayKey
|
|
365
|
+
};
|
|
366
|
+
});
|
|
237
367
|
result[key] = arr;
|
|
238
368
|
} else {
|
|
239
369
|
result[key] = unmarshalData(val);
|
|
@@ -484,6 +614,8 @@ __export(schema_exports, {
|
|
|
484
614
|
number: () => number,
|
|
485
615
|
object: () => object,
|
|
486
616
|
oneOf: () => oneOf,
|
|
617
|
+
reference: () => reference,
|
|
618
|
+
richtext: () => richtext,
|
|
487
619
|
select: () => select,
|
|
488
620
|
string: () => string
|
|
489
621
|
});
|
|
@@ -523,6 +655,12 @@ function array(field) {
|
|
|
523
655
|
function oneOf(field) {
|
|
524
656
|
return { ...field, type: "oneof" };
|
|
525
657
|
}
|
|
658
|
+
function richtext(field) {
|
|
659
|
+
return { ...field, type: "richtext" };
|
|
660
|
+
}
|
|
661
|
+
function reference(field) {
|
|
662
|
+
return { ...field, type: "reference" };
|
|
663
|
+
}
|
|
526
664
|
function defineSchema(schema) {
|
|
527
665
|
return schema;
|
|
528
666
|
}
|
|
@@ -532,6 +670,7 @@ function defineCollection(collection2) {
|
|
|
532
670
|
}
|
|
533
671
|
var collection = defineCollection;
|
|
534
672
|
export {
|
|
673
|
+
PUBLISH_DOCS_BATCH_LIMIT,
|
|
535
674
|
RootCMSClient,
|
|
536
675
|
getCmsPlugin,
|
|
537
676
|
getDoc,
|
|
@@ -547,4 +686,4 @@ export {
|
|
|
547
686
|
unmarshalArray,
|
|
548
687
|
unmarshalData
|
|
549
688
|
};
|
|
550
|
-
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vY29yZS9jbGllbnQudHMiLCAiLi4vY29yZS9ydW50aW1lLnRzIiwgIi4uL2NvcmUvc2NoZW1hLnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyJpbXBvcnQge1BsdWdpbiwgUm9vdENvbmZpZ30gZnJvbSAnQGJsaW5ray9yb290JztcbmltcG9ydCB7QXBwfSBmcm9tICdmaXJlYmFzZS1hZG1pbi9hcHAnO1xuaW1wb3J0IHtcbiAgRmllbGRWYWx1ZSxcbiAgRmlyZXN0b3JlLFxuICBRdWVyeSxcbiAgVGltZXN0YW1wLFxuICBnZXRGaXJlc3RvcmUsXG59IGZyb20gJ2ZpcmViYXNlLWFkbWluL2ZpcmVzdG9yZSc7XG5pbXBvcnQge0NNU1BsdWdpbn0gZnJvbSAnLi9wbHVnaW4uanMnO1xuXG5leHBvcnQgaW50ZXJmYWNlIERvYzxGaWVsZHMgPSBhbnk+IHtcbiAgLyoqIFRoZSBpZCBvZiB0aGUgZG9jLCBlLmcuIFwiUGFnZXMvZm9vLWJhclwiLiAqL1xuICBpZDogc3RyaW5nO1xuICAvKiogVGhlIGNvbGxlY3Rpb24gaWQgb2YgdGhlIGRvYywgZS5nLiBcIlBhZ2VzXCIuICovXG4gIGNvbGxlY3Rpb25JZDogc3RyaW5nO1xuICAvKiogVGhlIHNsdWcgb2YgdGhlIGRvYywgZS5nLiBcImZvby1iYXJcIi4gKi9cbiAgc2x1Zzogc3RyaW5nO1xuICBzeXM6IHtcbiAgICBjcmVhdGVkQXQ6IG51bWJlcjtcbiAgICBjcmVhdGVkQnk6IHN0cmluZztcbiAgICBtb2RpZmllZEF0OiBudW1iZXI7XG4gICAgbW9kaWZpZWRCeTogc3RyaW5nO1xuICAgIGZpcnN0UHVibGlzaGVkQXQ/OiBudW1iZXI7XG4gICAgZmlyc3RQdWJsaXNoZWRCeT86IHN0cmluZztcbiAgICBwdWJsaXNoZWRBdD86IG51bWJlcjtcbiAgICBwdWJsaXNoZWRCeT86IHN0cmluZztcbiAgICBsb2NhbGVzPzogc3RyaW5nW107XG4gIH07XG4gIGZpZWxkczogRmllbGRzO1xufVxuXG5leHBvcnQgdHlwZSBEb2NNb2RlID0gJ2RyYWZ0JyB8ICdwdWJsaXNoZWQnO1xuXG5leHBvcnQgaW50ZXJmYWNlIEdldERvY09wdGlvbnMge1xuICAvKiogTW9kZSwgZWl0aGVyIFwiZHJhZnRcIiBvciBcInB1Ymxpc2hlZFwiLiAqL1xuICBtb2RlOiBEb2NNb2RlO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFNldERvY09wdGlvbnMge1xuICAvKiogTW9kZSwgZWl0aGVyIFwiZHJhZnRcIiBvciBcInB1Ymxpc2hlZFwiLiAqL1xuICBtb2RlOiBEb2NNb2RlO1xuICAvKipcbiAgICogRW1haWwgb2YgdXNlciBtb2RpZnlpbmcgdGhlIGRvYy4gSWYgYmxhbmssIGRlZmF1bHRzIHRvIGByb290LWNtcy1jbGllbnRgLlxuICAgKi9cbiAgbW9kaWZpZWRCeT86IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBMaXN0RG9jc09wdGlvbnMge1xuICBtb2RlOiBEb2NNb2RlO1xuICBvZmZzZXQ/OiBudW1iZXI7XG4gIGxpbWl0PzogbnVtYmVyO1xuICBvcmRlckJ5Pzogc3RyaW5nO1xuICBvcmRlckJ5RGlyZWN0aW9uPzogJ2FzYycgfCAnZGVzYyc7XG4gIHF1ZXJ5PzogKHF1ZXJ5OiBRdWVyeSkgPT4gUXVlcnk7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgR2V0Q291bnRPcHRpb25zIHtcbiAgbW9kZTogRG9jTW9kZTtcbiAgcXVlcnk/OiAocXVlcnk6IFF1ZXJ5KSA9PiBRdWVyeTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBUcmFuc2xhdGlvbiB7XG4gIFtsb2NhbGU6IHN0cmluZ106IHN0cmluZztcbiAgc291cmNlOiBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgVHJhbnNsYXRpb25zTWFwIHtcbiAgW2hhc2g6IHN0cmluZ106IFRyYW5zbGF0aW9uO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIExvY2FsZVRyYW5zbGF0aW9ucyB7XG4gIFtzb3VyY2U6IHN0cmluZ106IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBMb2FkVHJhbnNsYXRpb25zT3B0aW9ucyB7XG4gIHRhZ3M/OiBzdHJpbmdbXTtcbn1cblxuZXhwb3J0IGNsYXNzIFJvb3RDTVNDbGllbnQge1xuICBwcml2YXRlIHJlYWRvbmx5IHJvb3RDb25maWc6IFJvb3RDb25maWc7XG4gIHByaXZhdGUgcmVhZG9ubHkgY21zUGx1Z2luOiBDTVNQbHVnaW47XG4gIHByaXZhdGUgcmVhZG9ubHkgcHJvamVjdElkOiBzdHJpbmc7XG4gIHByaXZhdGUgcmVhZG9ubHkgYXBwOiBBcHA7XG4gIHByaXZhdGUgcmVhZG9ubHkgZGI6IEZpcmVzdG9yZTtcblxuICBjb25zdHJ1Y3Rvcihyb290Q29uZmlnOiBSb290Q29uZmlnKSB7XG4gICAgdGhpcy5yb290Q29uZmlnID0gcm9vdENvbmZpZztcbiAgICB0aGlzLmNtc1BsdWdpbiA9IGdldENtc1BsdWdpbihyb290Q29uZmlnKTtcblxuICAgIGNvbnN0IGNtc1BsdWdpbk9wdGlvbnMgPSB0aGlzLmNtc1BsdWdpbi5nZXRDb25maWcoKTtcbiAgICB0aGlzLnByb2plY3RJZCA9IGNtc1BsdWdpbk9wdGlvbnMuaWQgfHwgJ2RlZmF1bHQnO1xuICAgIHRoaXMuYXBwID0gdGhpcy5jbXNQbHVnaW4uZ2V0RmlyZWJhc2VBcHAoKTtcbiAgICB0aGlzLmRiID0gZ2V0RmlyZXN0b3JlKHRoaXMuYXBwKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXRyaWV2ZXMgZG9jIGRhdGEgZnJvbSBSb290LmpzIENNUy5cbiAgICovXG4gIGFzeW5jIGdldERvYzxGaWVsZHMgPSBhbnk+KFxuICAgIGNvbGxlY3Rpb25JZDogc3RyaW5nLFxuICAgIHNsdWc6IHN0cmluZyxcbiAgICBvcHRpb25zOiBHZXREb2NPcHRpb25zXG4gICk6IFByb21pc2U8RG9jPEZpZWxkcz4gfCBudWxsPiB7XG4gICAgY29uc3QgcmF3RGF0YSA9IGF3YWl0IHRoaXMuZ2V0UmF3RG9jKGNvbGxlY3Rpb25JZCwgc2x1Zywgb3B0aW9ucyk7XG4gICAgaWYgKHJhd0RhdGEpIHtcbiAgICAgIHJldHVybiB1bm1hcnNoYWxEYXRhKHJhd0RhdGEpIGFzIERvYzxGaWVsZHM+O1xuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXRyaWV2ZXMgcmF3IGRvYyBkYXRhIGFzIHN0b3JlZCBpbiB0aGUgZGF0YWJhc2UuIE9ubHkgdXNlIHRoaXMgaWYgeW91IGtub3dcbiAgICogd2hhdCB5b3UgYXJlIGRvaW5nLlxuICAgKi9cbiAgYXN5bmMgZ2V0UmF3RG9jKFxuICAgIGNvbGxlY3Rpb25JZDogc3RyaW5nLFxuICAgIHNsdWc6IHN0cmluZyxcbiAgICBvcHRpb25zOiBHZXREb2NPcHRpb25zXG4gICk6IFByb21pc2U8YW55IHwgbnVsbD4ge1xuICAgIGNvbnN0IG1vZGUgPSBvcHRpb25zLm1vZGU7XG4gICAgY29uc3QgbW9kZUNvbGxlY3Rpb24gPSBtb2RlID09PSAnZHJhZnQnID8gJ0RyYWZ0cycgOiAnUHVibGlzaGVkJztcbiAgICAvLyBTbHVncyB3aXRoIHNsYXNoZXMgYXJlIGVuY29kZWQgYXMgYC0tYCBpbiB0aGUgREIuXG4gICAgc2x1ZyA9IHNsdWcucmVwbGFjZUFsbCgnLycsICctLScpO1xuICAgIGNvbnN0IGRiUGF0aCA9IGBQcm9qZWN0cy8ke3RoaXMucHJvamVjdElkfS9Db2xsZWN0aW9ucy8ke2NvbGxlY3Rpb25JZH0vJHttb2RlQ29sbGVjdGlvbn0vJHtzbHVnfWA7XG4gICAgY29uc3QgZG9jUmVmID0gdGhpcy5kYi5kb2MoZGJQYXRoKTtcbiAgICBjb25zdCBkb2MgPSBhd2FpdCBkb2NSZWYuZ2V0KCk7XG4gICAgaWYgKGRvYy5leGlzdHMpIHtcbiAgICAgIHJldHVybiBkb2MuZGF0YSgpO1xuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIGFzeW5jIHNldFJhd0RvYyhcbiAgICBjb2xsZWN0aW9uSWQ6IHN0cmluZyxcbiAgICBzbHVnOiBzdHJpbmcsXG4gICAgZGF0YTogYW55LFxuICAgIG9wdGlvbnM6IFNldERvY09wdGlvbnNcbiAgKSB7XG4gICAgY29uc3QgbW9kZSA9IG9wdGlvbnMubW9kZTtcbiAgICBjb25zdCBtb2RlQ29sbGVjdGlvbiA9IG1vZGUgPT09ICdkcmFmdCcgPyAnRHJhZnRzJyA6ICdQdWJsaXNoZWQnO1xuICAgIGNvbnN0IGRiUGF0aCA9IGBQcm9qZWN0cy8ke3RoaXMucHJvamVjdElkfS9Db2xsZWN0aW9ucy8ke2NvbGxlY3Rpb25JZH0vJHttb2RlQ29sbGVjdGlvbn0vJHtzbHVnfWA7XG4gICAgY29uc3QgZG9jUmVmID0gdGhpcy5kYi5kb2MoZGJQYXRoKTtcbiAgICBhd2FpdCBkb2NSZWYuc2V0KGRhdGEpO1xuICB9XG5cbiAgLyoqXG4gICAqIExpc3RzIGRvY3MgZnJvbSBhIFJvb3QuanMgQ01TIGNvbGxlY3Rpb24uXG4gICAqL1xuICBhc3luYyBsaXN0RG9jczxUPihcbiAgICBjb2xsZWN0aW9uSWQ6IHN0cmluZyxcbiAgICBvcHRpb25zOiBMaXN0RG9jc09wdGlvbnNcbiAgKTogUHJvbWlzZTx7ZG9jczogVFtdfT4ge1xuICAgIGNvbnN0IG1vZGUgPSBvcHRpb25zLm1vZGU7XG4gICAgY29uc3QgbW9kZUNvbGxlY3Rpb24gPSBtb2RlID09PSAnZHJhZnQnID8gJ0RyYWZ0cycgOiAnUHVibGlzaGVkJztcbiAgICBjb25zdCBkYlBhdGggPSBgUHJvamVjdHMvJHt0aGlzLnByb2plY3RJZH0vQ29sbGVjdGlvbnMvJHtjb2xsZWN0aW9uSWR9LyR7bW9kZUNvbGxlY3Rpb259YDtcbiAgICBsZXQgcXVlcnk6IFF1ZXJ5ID0gdGhpcy5kYi5jb2xsZWN0aW9uKGRiUGF0aCk7XG4gICAgaWYgKG9wdGlvbnMubGltaXQpIHtcbiAgICAgIHF1ZXJ5ID0gcXVlcnkubGltaXQob3B0aW9ucy5saW1pdCk7XG4gICAgfVxuICAgIGlmIChvcHRpb25zLm9mZnNldCkge1xuICAgICAgcXVlcnkgPSBxdWVyeS5vZmZzZXQob3B0aW9ucy5vZmZzZXQpO1xuICAgIH1cbiAgICBpZiAob3B0aW9ucy5vcmRlckJ5KSB7XG4gICAgICBxdWVyeSA9IHF1ZXJ5Lm9yZGVyQnkob3B0aW9ucy5vcmRlckJ5LCBvcHRpb25zLm9yZGVyQnlEaXJlY3Rpb24pO1xuICAgIH1cbiAgICBpZiAob3B0aW9ucy5xdWVyeSkge1xuICAgICAgcXVlcnkgPSBvcHRpb25zLnF1ZXJ5KHF1ZXJ5KTtcbiAgICB9XG4gICAgY29uc3QgcmVzdWx0cyA9IGF3YWl0IHF1ZXJ5LmdldCgpO1xuICAgIGNvbnN0IGRvY3M6IFRbXSA9IFtdO1xuICAgIHJlc3VsdHMuZm9yRWFjaCgocmVzdWx0KSA9PiB7XG4gICAgICBjb25zdCBkb2MgPSB1bm1hcnNoYWxEYXRhKHJlc3VsdC5kYXRhKCkpIGFzIFQ7XG4gICAgICBkb2NzLnB1c2goZG9jKTtcbiAgICB9KTtcbiAgICByZXR1cm4ge2RvY3N9O1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIG51bWJlciBvZiBkb2NzIGluIGEgUm9vdC5qcyBDTVMgY29sbGVjdGlvbi5cbiAgICovXG4gIGFzeW5jIGdldERvY3NDb3VudChjb2xsZWN0aW9uSWQ6IHN0cmluZywgb3B0aW9uczogR2V0Q291bnRPcHRpb25zKSB7XG4gICAgY29uc3QgbW9kZSA9IG9wdGlvbnMubW9kZTtcbiAgICBjb25zdCBtb2RlQ29sbGVjdGlvbiA9IG1vZGUgPT09ICdkcmFmdCcgPyAnRHJhZnRzJyA6ICdQdWJsaXNoZWQnO1xuICAgIGNvbnN0IGRiUGF0aCA9IGBQcm9qZWN0cy8ke3RoaXMucHJvamVjdElkfS9Db2xsZWN0aW9ucy8ke2NvbGxlY3Rpb25JZH0vJHttb2RlQ29sbGVjdGlvbn1gO1xuICAgIGxldCBxdWVyeTogUXVlcnkgPSB0aGlzLmRiLmNvbGxlY3Rpb24oZGJQYXRoKTtcbiAgICBpZiAob3B0aW9ucy5xdWVyeSkge1xuICAgICAgcXVlcnkgPSBvcHRpb25zLnF1ZXJ5KHF1ZXJ5KTtcbiAgICB9XG4gICAgY29uc3QgcmVzdWx0cyA9IGF3YWl0IHF1ZXJ5LmNvdW50KCkuZ2V0KCk7XG4gICAgY29uc3QgY291bnQgPSByZXN1bHRzLmRhdGEoKS5jb3VudDtcbiAgICByZXR1cm4gY291bnQ7XG4gIH1cblxuICAvKipcbiAgICogUHVibGlzaGVzIHNjaGVkdWxlZCBkb2NzLlxuICAgKi9cbiAgYXN5bmMgcHVibGlzaFNjaGVkdWxlZERvY3MoKSB7XG4gICAgY29uc3QgcHJvamVjdENvbGxlY3Rpb25zUGF0aCA9IGBQcm9qZWN0cy8ke3RoaXMucHJvamVjdElkfS9Db2xsZWN0aW9uc2A7XG4gICAgY29uc3Qgbm93ID0gTWF0aC5jZWlsKG5ldyBEYXRlKCkuZ2V0VGltZSgpKTtcblxuICAgIGNvbnN0IHNuYXBzaG90ID0gYXdhaXQgdGhpcy5kYi5jb2xsZWN0aW9uR3JvdXAoJ1NjaGVkdWxlZCcpLmdldCgpO1xuICAgIGNvbnN0IGRvY3MgPSBzbmFwc2hvdC5kb2NzXG4gICAgICAuZmlsdGVyKChkKSA9PiB7XG4gICAgICAgIC8vIEZpbHRlciBkb2NzIGJ5IHByb2plY3QuXG4gICAgICAgIGlmICghZC5yZWYucGF0aC5zdGFydHNXaXRoKHByb2plY3RDb2xsZWN0aW9uc1BhdGgpKSB7XG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIC8vIEZpbHRlciBkb2NzIHdoZXJlIHNjaGVkdWxlZEF0IGlzIGluIHRoZSBwYXN0LlxuICAgICAgICAvLyBOT1RFKHN0ZXZlbmxlKTogdGhlIGZpbHRlcmluZyBpcyBkb25lIG1hbnVhbGx5IGluc3RlYWQgb2YgdXNpbmcgYSBxdWVyeVxuICAgICAgICAvLyB0byBhdm9pZCBoYXZpbmcgdG8gY3JlYXRlIGFuIGluZGV4IGluIGZpcmVzdG9yZS5cbiAgICAgICAgY29uc3QgZGF0YSA9IGQuZGF0YSgpIHx8IHt9O1xuICAgICAgICBjb25zdCBzY2hlZHVsZWRBdDogVGltZXN0YW1wIHwgdW5kZWZpbmVkID0gZGF0YS5zeXM/LnNjaGVkdWxlZEF0O1xuICAgICAgICByZXR1cm4gKFxuICAgICAgICAgIHNjaGVkdWxlZEF0ICYmIHNjaGVkdWxlZEF0LnRvTWlsbGlzICYmIHNjaGVkdWxlZEF0LnRvTWlsbGlzKCkgPD0gbm93XG4gICAgICAgICk7XG4gICAgICB9KVxuICAgICAgLm1hcCgoZCkgPT4ge1xuICAgICAgICBjb25zdCBkYlBhdGggPSBkLnJlZi5wYXRoO1xuICAgICAgICBjb25zdCBzZWdtZW50cyA9IGRiUGF0aC5zcGxpdCgnLycpO1xuICAgICAgICBjb25zdCBzbHVnID0gc2VnbWVudHMuYXQoLTEpO1xuICAgICAgICBjb25zdCBjb2xsZWN0aW9uID0gc2VnbWVudHMuYXQoLTMpO1xuICAgICAgICBjb25zdCBpZCA9IGAke2NvbGxlY3Rpb259LyR7c2x1Z31gO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIGRhdGE6IGQuZGF0YSgpLFxuICAgICAgICAgIGlkLFxuICAgICAgICAgIGNvbGxlY3Rpb24sXG4gICAgICAgICAgc2x1ZyxcbiAgICAgICAgfTtcbiAgICAgIH0pO1xuXG4gICAgaWYgKGRvY3MubGVuZ3RoID09PSAwKSB7XG4gICAgICBjb25zb2xlLmxvZygnbm8gZG9jcyB0byBzY2hlZHVsZScpO1xuICAgICAgcmV0dXJuIFtdO1xuICAgIH1cblxuICAgIC8vIEVhY2ggdHJhbnNhY3Rpb24gb3IgYmF0Y2ggY2FuIHdyaXRlIGEgbWF4IG9mIDUwMCBvcHMuXG4gICAgLy8gaHR0cHM6Ly9maXJlYmFzZS5nb29nbGUuY29tL2RvY3MvZmlyZXN0b3JlL21hbmFnZS1kYXRhL3RyYW5zYWN0aW9uc1xuICAgIGxldCBiYXRjaENvdW50ID0gMDtcbiAgICBjb25zdCBiYXRjaCA9IHRoaXMuZGIuYmF0Y2goKTtcbiAgICBjb25zdCBwdWJsaXNoZWREb2NzOiBhbnlbXSA9IFtdO1xuICAgIGZvciAoY29uc3QgZG9jIG9mIGRvY3MpIHtcbiAgICAgIGNvbnN0IHtpZCwgY29sbGVjdGlvbiwgc2x1ZywgZGF0YX0gPSBkb2M7XG4gICAgICBjb25zdCBkcmFmdFJlZiA9IHRoaXMuZGIuZG9jKFxuICAgICAgICBgJHtwcm9qZWN0Q29sbGVjdGlvbnNQYXRofS8ke2NvbGxlY3Rpb259L0RyYWZ0cy8ke3NsdWd9YFxuICAgICAgKTtcbiAgICAgIGNvbnN0IHNjaGVkdWxlZFJlZiA9IHRoaXMuZGIuZG9jKFxuICAgICAgICBgJHtwcm9qZWN0Q29sbGVjdGlvbnNQYXRofS8ke2NvbGxlY3Rpb259L1NjaGVkdWxlZC8ke3NsdWd9YFxuICAgICAgKTtcbiAgICAgIGNvbnN0IHB1Ymxpc2hlZFJlZiA9IHRoaXMuZGIuZG9jKFxuICAgICAgICBgJHtwcm9qZWN0Q29sbGVjdGlvbnNQYXRofS8ke2NvbGxlY3Rpb259L1B1Ymxpc2hlZC8ke3NsdWd9YFxuICAgICAgKTtcbiAgICAgIGNvbnN0IHtzY2hlZHVsZWRBdCwgc2NoZWR1bGVkQnksIC4uLnN5c30gPSBkYXRhLnN5cyB8fCB7fTtcblxuICAgICAgLy8gT25seSB1cGRhdGUgYGZpcnN0UHVibGlzaGVkYCBpZiBpdCBkb2Vzbid0IGFscmVhZHkgZXhpc3QuXG4gICAgICBjb25zdCBmaXJzdFB1Ymxpc2hlZEF0ID0gc3lzLmZpcnN0UHVibGlzaGVkQXQgPz8gc2NoZWR1bGVkQXQ7XG4gICAgICBjb25zdCBmaXJzdFB1Ymxpc2hlZEJ5ID0gc3lzLmZpcnN0UHVibGlzaGVkQnkgPz8gKHNjaGVkdWxlZEJ5IHx8ICcnKTtcblxuICAgICAgLy8gU2F2ZSBwdWJsaXNoZWQgZG9jLlxuICAgICAgYmF0Y2guc2V0KHB1Ymxpc2hlZFJlZiwge1xuICAgICAgICBpZCxcbiAgICAgICAgY29sbGVjdGlvbixcbiAgICAgICAgc2x1ZyxcbiAgICAgICAgZmllbGRzOiBkYXRhLmZpZWxkcyB8fCB7fSxcbiAgICAgICAgc3lzOiB7XG4gICAgICAgICAgLi4uc3lzLFxuICAgICAgICAgIGZpcnN0UHVibGlzaGVkQXQ6IGZpcnN0UHVibGlzaGVkQXQsXG4gICAgICAgICAgZmlyc3RQdWJsaXNoZWRCeTogZmlyc3RQdWJsaXNoZWRCeSxcbiAgICAgICAgICBwdWJsaXNoZWRBdDogRmllbGRWYWx1ZS5zZXJ2ZXJUaW1lc3RhbXAoKSxcbiAgICAgICAgICBwdWJsaXNoZWRCeTogc2NoZWR1bGVkQnkgfHwgJycsXG4gICAgICAgIH0sXG4gICAgICB9KTtcbiAgICAgIGJhdGNoQ291bnQgKz0gMTtcblxuICAgICAgLy8gUmVtb3ZlIHB1Ymxpc2hlZCBkb2MuXG4gICAgICBiYXRjaC5kZWxldGUoc2NoZWR1bGVkUmVmKTtcbiAgICAgIGJhdGNoQ291bnQgKz0gMTtcblxuICAgICAgLy8gVXBkYXRlIHRoZSBkcmFmdCBkb2MgdG8gcmVtb3ZlIGBzY2hlZHVsZWRBdGAgYW5kIGBzY2hlZHVsZWRCeWAgZmllbGRzXG4gICAgICAvLyBhbmQgdXBkYXRlIHRoZSBgcHVibGlzaGVkQXRgIGFuZCBgcHVibGlzaGVkQnlgIGZpZWxkcy5cbiAgICAgIGJhdGNoLnVwZGF0ZShkcmFmdFJlZiwge1xuICAgICAgICAnc3lzLnNjaGVkdWxlZEF0JzogRmllbGRWYWx1ZS5kZWxldGUoKSxcbiAgICAgICAgJ3N5cy5zY2hlZHVsZWRCeSc6IEZpZWxkVmFsdWUuZGVsZXRlKCksXG4gICAgICAgICdzeXMuZmlyc3RQdWJsaXNoZWRBdCc6IGZpcnN0UHVibGlzaGVkQXQsXG4gICAgICAgICdzeXMuZmlyc3RQdWJsaXNoZWRCeSc6IGZpcnN0UHVibGlzaGVkQnksXG4gICAgICAgICdzeXMucHVibGlzaGVkQXQnOiBGaWVsZFZhbHVlLnNlcnZlclRpbWVzdGFtcCgpLFxuICAgICAgICAnc3lzLnB1Ymxpc2hlZEJ5Jzogc2NoZWR1bGVkQnkgfHwgJycsXG4gICAgICB9KTtcbiAgICAgIGJhdGNoQ291bnQgKz0gMTtcblxuICAgICAgcHVibGlzaGVkRG9jcy5wdXNoKGRvYyk7XG5cbiAgICAgIGlmIChiYXRjaENvdW50ID49IDQ5OCkge1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG5cbiAgICBhd2FpdCBiYXRjaC5jb21taXQoKTtcbiAgICBjb25zb2xlLmxvZyhgcHVibGlzaGVkICR7cHVibGlzaGVkRG9jcy5sZW5ndGh9IGRvY3MhYCk7XG4gICAgcmV0dXJuIHB1Ymxpc2hlZERvY3M7XG4gIH1cblxuICAvKipcbiAgICogTG9hZHMgdHJhbnNsYXRpb25zIHNhdmVkIGluIHRoZSB0cmFuc2xhdGlvbnMgY29sbGVjdGlvbiwgb3B0aW9uYWxseVxuICAgKiBmaWx0ZXJlZCBieSB0YWcuXG4gICAqXG4gICAqIFJldHVybnMgYSBtYXAgbGlrZTpcbiAgICogYGBgXG4gICAqIHtcbiAgICogICBcIjxoYXNoPlwiOiB7XCJzb3VyY2VcIjogXCJIZWxsb1wiLCBcImVzXCI6IFwiSG9sYVwiLCBcImZyXCI6IFwiQm9uam91clwifSxcbiAgICogfVxuICAgKiBgYGBcbiAgICovXG4gIGFzeW5jIGxvYWRUcmFuc2xhdGlvbnMoXG4gICAgb3B0aW9ucz86IExvYWRUcmFuc2xhdGlvbnNPcHRpb25zXG4gICk6IFByb21pc2U8VHJhbnNsYXRpb25zTWFwPiB7XG4gICAgY29uc3QgZGJQYXRoID0gYFByb2plY3RzLyR7dGhpcy5wcm9qZWN0SWR9L1RyYW5zbGF0aW9uc2A7XG4gICAgbGV0IHF1ZXJ5OiBRdWVyeSA9IHRoaXMuZGIuY29sbGVjdGlvbihkYlBhdGgpO1xuICAgIGlmIChvcHRpb25zPy50YWdzKSB7XG4gICAgICBxdWVyeSA9IHF1ZXJ5LndoZXJlKCd0YWdzJywgJ2FycmF5LWNvbnRhaW5zLWFueScsIG9wdGlvbnMudGFncyk7XG4gICAgfVxuXG4gICAgY29uc3QgcXVlcnlTbmFwc2hvdCA9IGF3YWl0IHF1ZXJ5LmdldCgpO1xuICAgIGNvbnN0IHRyYW5zbGF0aW9uc01hcDogVHJhbnNsYXRpb25zTWFwID0ge307XG4gICAgcXVlcnlTbmFwc2hvdC5mb3JFYWNoKChkb2MpID0+IHtcbiAgICAgIGNvbnN0IGhhc2ggPSBkb2MuaWQ7XG4gICAgICB0cmFuc2xhdGlvbnNNYXBbaGFzaF0gPSBkb2MuZGF0YSgpIGFzIFRyYW5zbGF0aW9uO1xuICAgIH0pO1xuICAgIHJldHVybiB0cmFuc2xhdGlvbnNNYXA7XG4gIH1cblxuICAvKipcbiAgICogTG9hZHMgdHJhbnNsYXRpb25zIGZvciBhIHBhcnRpY3VsYXIgbG9jYWxlLlxuICAgKlxuICAgKiBSZXR1cm5zIGEgbWFwIGxpa2U6XG4gICAqIGBgYFxuICAgKiB7XG4gICAqICAgXCJIZWxsb1wiOiBcIkJvbmpvdXJcIixcbiAgICogfVxuICAgKiBgYGBcbiAgICovXG4gIGFzeW5jIGxvYWRUcmFuc2xhdGlvbnNGb3JMb2NhbGUoXG4gICAgbG9jYWxlOiBzdHJpbmcsXG4gICAgb3B0aW9ucz86IExvYWRUcmFuc2xhdGlvbnNPcHRpb25zXG4gICk6IFByb21pc2U8TG9jYWxlVHJhbnNsYXRpb25zPiB7XG4gICAgY29uc3QgdHJhbnNsYXRpb25zTWFwID0gYXdhaXQgdGhpcy5sb2FkVHJhbnNsYXRpb25zKG9wdGlvbnMpO1xuICAgIHJldHVybiB0cmFuc2xhdGlvbnNGb3JMb2NhbGUodHJhbnNsYXRpb25zTWFwLCBsb2NhbGUpO1xuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRDbXNQbHVnaW4ocm9vdENvbmZpZzogUm9vdENvbmZpZyk6IENNU1BsdWdpbiB7XG4gIGNvbnN0IHBsdWdpbnM6IFBsdWdpbltdID0gcm9vdENvbmZpZy5wbHVnaW5zIHx8IFtdO1xuICBjb25zdCBwbHVnaW4gPSBwbHVnaW5zLmZpbmQoKHBsdWdpbikgPT4gcGx1Z2luLm5hbWUgPT09ICdyb290LWNtcycpO1xuICBpZiAoIXBsdWdpbikge1xuICAgIHRocm93IG5ldyBFcnJvcignY291bGQgbm90IGZpbmQgcm9vdC1jbXMgcGx1Z2luIGNvbmZpZyBpbiByb290LmNvbmZpZy50cycpO1xuICB9XG4gIHJldHVybiBwbHVnaW4gYXMgQ01TUGx1Z2luO1xufVxuXG4vKipcbiAqIFdhbGtzIHRoZSBkYXRhIHRyZWUgYW5kIGNvbnZlcnRzIGFueSBUaW1lc3RhbXAgb2JqZWN0cyB0byBtaWxsaXMgYW5kIGFueVxuICogX2FycmF5IG1hcHMgdG8gbm9ybWFsIGFycmF5cy5cbiAqXG4gKiBFLmcuOlxuICpcbiAqIG5vcm1hbGl6ZURhdGEoe1xuICogICBzeXM6IHttb2RpZmllZEF0OiBUaW1lc3RhbXAoMTIzKX0sXG4gKiAgIGZpZWxkczoge1xuICogICAgIF9hcnJheTogWydhc2RmJ10sXG4gKiAgICAgYXNkZjoge3RpdGxlOiAnaGVsbG8nfVxuICogICB9XG4gKiB9KVxuICogLy8gPT4ge3N5czoge21vZGlmaWVkQXQ6IDEyM30sIGZpZWxkczoge2ZvbzogW3t0aXRsZTogJ2hlbGxvJ31dfX1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHVubWFyc2hhbERhdGEoZGF0YTogYW55KTogYW55IHtcbiAgY29uc3QgcmVzdWx0OiBhbnkgPSB7fTtcbiAgZm9yIChjb25zdCBrZXkgaW4gZGF0YSkge1xuICAgIGNvbnN0IHZhbCA9IGRhdGFba2V5XTtcbiAgICBpZiAoaXNPYmplY3QodmFsKSkge1xuICAgICAgaWYgKHZhbC50b01pbGxpcykge1xuICAgICAgICByZXN1bHRba2V5XSA9IHZhbC50b01pbGxpcygpO1xuICAgICAgfSBlbHNlIGlmIChPYmplY3QuaGFzT3duKHZhbCwgJ19hcnJheScpICYmIEFycmF5LmlzQXJyYXkodmFsLl9hcnJheSkpIHtcbiAgICAgICAgY29uc3QgYXJyID0gdmFsLl9hcnJheS5tYXAoKGs6IHN0cmluZykgPT4gdW5tYXJzaGFsRGF0YSh2YWxba10gfHwge30pKTtcbiAgICAgICAgcmVzdWx0W2tleV0gPSBhcnI7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXN1bHRba2V5XSA9IHVubWFyc2hhbERhdGEodmFsKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgcmVzdWx0W2tleV0gPSB2YWw7XG4gICAgfVxuICB9XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbi8qKiBAZGVwcmVjYXRlZCBVc2UgYHVubWFyc2hhbERhdGEoKWAgaW5zdGVhZC4gKi9cbmV4cG9ydCBmdW5jdGlvbiBub3JtYWxpemVEYXRhKGRhdGE6IGFueSk6IGFueSB7XG4gIHJldHVybiB1bm1hcnNoYWxEYXRhKGRhdGEpO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEFycmF5T2JqZWN0IHtcbiAgW2tleTogc3RyaW5nXTogYW55O1xuICBfYXJyYXk6IHN0cmluZ1tdO1xufVxuXG4vKipcbiAqIFNlcmlhbGl6ZXMgYW4gYXJyYXkgaW50byBhbiBgQXJyYXlPYmplY3RgLCBlLmcuOlxuICpcbiAqIGBgYFxuICogbWFyc2hhbEFycmF5KFsxLCAyLCAzXSlcbiAqIC8vID0+IHthOiAxLCBiOiAyLCBjOiAzLCBfYXJyYXk6IFsnYScsICdiJywgJ2MnXX1cbiAqIGBgYFxuICpcbiAqIFRoaXMgZGF0YWJhc2Ugc3RvcmFnZSBtZXRob2QgbWFrZXMgaXQgZWFzaWVyIHRvIHVwZGF0ZSBhIHNpbmdsZSBmaWVsZCBpbiBhXG4gKiBkZWVwbHkgbmVzdGVkIGFycmF5IG9iamVjdC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG1hcnNoYWxBcnJheShhcnI6IGFueVtdKTogQXJyYXlPYmplY3Qge1xuICBpZiAoIUFycmF5LmlzQXJyYXkoYXJyKSkge1xuICAgIHJldHVybiBhcnI7XG4gIH1cbiAgY29uc3QgYXJyT2JqZWN0OiBBcnJheU9iamVjdCA9IHtfYXJyYXk6IFtdfTtcbiAgZm9yIChjb25zdCBpdGVtIG9mIGFycikge1xuICAgIGNvbnN0IGtleSA9IHJhbmRTdHJpbmcoNik7XG4gICAgYXJyT2JqZWN0W2tleV0gPSBpdGVtO1xuICAgIGFyck9iamVjdC5fYXJyYXkucHVzaChrZXkpO1xuICB9XG4gIHJldHVybiBhcnJPYmplY3Q7XG59XG5cbi8qKlxuICogQ29udmVydHMgYW4gYEFycmF5T2JqZWN0YCB0byBhIG5vcm1hbCBhcnJheS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHVubWFyc2hhbEFycmF5KGFyck9iamVjdDogQXJyYXlPYmplY3QpOiBhbnlbXSB7XG4gIGlmICghQXJyYXkuaXNBcnJheShhcnJPYmplY3Q/Ll9hcnJheSkpIHtcbiAgICByZXR1cm4gW107XG4gIH1cbiAgY29uc3QgYXJyID0gYXJyT2JqZWN0Ll9hcnJheS5tYXAoKGs6IHN0cmluZykgPT4gYXJyT2JqZWN0W2tdKTtcbiAgcmV0dXJuIGFycjtcbn1cblxuZnVuY3Rpb24gaXNPYmplY3QoZGF0YTogYW55KTogYm9vbGVhbiB7XG4gIHJldHVybiB0eXBlb2YgZGF0YSA9PT0gJ29iamVjdCcgJiYgIUFycmF5LmlzQXJyYXkoZGF0YSkgJiYgZGF0YSAhPT0gbnVsbDtcbn1cblxuZnVuY3Rpb24gcmFuZFN0cmluZyhsZW46IG51bWJlcik6IHN0cmluZyB7XG4gIGNvbnN0IHJlc3VsdCA9IFtdO1xuICBjb25zdCBjaGFycyA9XG4gICAgJ0FCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5JztcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBsZW47IGkrKykge1xuICAgIGNvbnN0IHJhbmQgPSBNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkgKiBjaGFycy5sZW5ndGgpO1xuICAgIHJlc3VsdC5wdXNoKGNoYXJzLmNoYXJBdChyYW5kKSk7XG4gIH1cbiAgcmV0dXJuIHJlc3VsdC5qb2luKCcnKTtcbn1cblxuLyoqXG4gKiBDb252ZXJ0cyBhIHRyYW5zbGF0aW9ucyBtYXAgZnJvbSBgbG9hZFRyYW5zbGF0aW9ucygpYCB0byBhIG1hcCBvZiBzb3VyY2UgdG9cbiAqIHRyYW5zbGF0ZWQgc3RyaW5nIGZvciBhIHBhcnRpY3VsYXIgbG9jYWxlLlxuICpcbiAqIFJldHVybnMgYSBtYXAgbGlrZTpcbiAqIGBgYFxuICoge1xuICogICBcIkhlbGxvXCI6IFwiQm9uam91clwiLFxuICogfVxuICogYGBgXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0cmFuc2xhdGlvbnNGb3JMb2NhbGUoXG4gIHRyYW5zbGF0aW9uc01hcDogVHJhbnNsYXRpb25zTWFwLFxuICBsb2NhbGU6IHN0cmluZ1xuKSB7XG4gIGNvbnN0IGxvY2FsZVRyYW5zbGF0aW9uczogTG9jYWxlVHJhbnNsYXRpb25zID0ge307XG4gIE9iamVjdC52YWx1ZXModHJhbnNsYXRpb25zTWFwKS5mb3JFYWNoKChzdHJpbmcpID0+IHtcbiAgICBjb25zdCBzb3VyY2UgPSBzdHJpbmcuc291cmNlO1xuICAgIGNvbnN0IHRyYW5zbGF0aW9uID0gc3RyaW5nW2xvY2FsZV0gfHwgc3RyaW5nLmVuIHx8IHN0cmluZy5zb3VyY2U7XG4gICAgbG9jYWxlVHJhbnNsYXRpb25zW3NvdXJjZV0gPSB0cmFuc2xhdGlvbjtcbiAgfSk7XG4gIHJldHVybiBsb2NhbGVUcmFuc2xhdGlvbnM7XG59XG4iLCAiLyoqIEBkZXByZWNhdGVkIFVzZSBjbGllbnQudHMgaW5zdGVhZC4gKi9cblxuaW1wb3J0IHtSb290Q29uZmlnfSBmcm9tICdAYmxpbmtrL3Jvb3QnO1xuaW1wb3J0IHtcbiAgRmllbGRWYWx1ZSxcbiAgUXVlcnksXG4gIFRpbWVzdGFtcCxcbiAgZ2V0RmlyZXN0b3JlLFxufSBmcm9tICdmaXJlYmFzZS1hZG1pbi9maXJlc3RvcmUnO1xuaW1wb3J0IHtcbiAgTG9hZFRyYW5zbGF0aW9uc09wdGlvbnMsXG4gIExvY2FsZVRyYW5zbGF0aW9ucyxcbiAgVHJhbnNsYXRpb24sXG4gIFRyYW5zbGF0aW9uc01hcCxcbiAgZ2V0Q21zUGx1Z2luLFxuICB0cmFuc2xhdGlvbnNGb3JMb2NhbGUsXG4gIHVubWFyc2hhbERhdGEsXG59IGZyb20gJy4vY2xpZW50LmpzJztcblxuLyoqXG4gKiBSZXRyaWV2ZXMgYSBkb2MgZnJvbSBSb290LmpzIENNUy5cbiAqIEBkZXByZWNhdGVkIFVzZSBSb290Q01TQ2xpZW50LmdldERvYygpIGluc3RlYWQuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZXREb2M8VD4oXG4gIHJvb3RDb25maWc6IFJvb3RDb25maWcsXG4gIGNvbGxlY3Rpb25JZDogc3RyaW5nLFxuICBzbHVnOiBzdHJpbmcsXG4gIG9wdGlvbnM6IHtcbiAgICBtb2RlOiAnZHJhZnQnIHwgJ3B1Ymxpc2hlZCc7XG4gIH1cbik6IFByb21pc2U8VCB8IG51bGw+IHtcbiAgY29uc3QgY21zUGx1Z2luID0gZ2V0Q21zUGx1Z2luKHJvb3RDb25maWcpO1xuICBjb25zdCBjbXNQbHVnaW5PcHRpb25zID0gY21zUGx1Z2luLmdldENvbmZpZygpO1xuICBjb25zdCBwcm9qZWN0SWQgPSBjbXNQbHVnaW5PcHRpb25zLmlkIHx8ICdkZWZhdWx0JztcbiAgY29uc3QgbW9kZSA9IG9wdGlvbnMubW9kZTtcbiAgY29uc3QgbW9kZUNvbGxlY3Rpb24gPSBtb2RlID09PSAnZHJhZnQnID8gJ0RyYWZ0cycgOiAnUHVibGlzaGVkJztcbiAgY29uc3QgYXBwID0gY21zUGx1Z2luLmdldEZpcmViYXNlQXBwKCk7XG4gIGNvbnN0IGRiID0gZ2V0RmlyZXN0b3JlKGFwcCk7XG4gIC8vIFNsdWdzIHdpdGggc2xhc2hlcyBhcmUgZW5jb2RlZCBhcyBgLS1gIGluIHRoZSBEQi5cbiAgc2x1ZyA9IHNsdWcucmVwbGFjZUFsbCgnLycsICctLScpO1xuICBjb25zdCBkYlBhdGggPSBgUHJvamVjdHMvJHtwcm9qZWN0SWR9L0NvbGxlY3Rpb25zLyR7Y29sbGVjdGlvbklkfS8ke21vZGVDb2xsZWN0aW9ufS8ke3NsdWd9YDtcbiAgY29uc3QgZG9jUmVmID0gZGIuZG9jKGRiUGF0aCk7XG4gIGNvbnN0IGRvYyA9IGF3YWl0IGRvY1JlZi5nZXQoKTtcbiAgaWYgKGRvYy5leGlzdHMpIHtcbiAgICBjb25zdCBkYXRhID0gZG9jLmRhdGEoKTtcbiAgICByZXR1cm4gdW5tYXJzaGFsRGF0YShkYXRhKSBhcyBUO1xuICB9XG4gIGNvbnNvbGUubG9nKGBkb2Mgbm90IGZvdW5kOiAke2RiUGF0aH1gKTtcbiAgcmV0dXJuIG51bGw7XG59XG5cbi8qKlxuICogTGlzdHMgZG9jcyBmcm9tIGEgUm9vdC5qcyBDTVMgY29sbGVjdGlvbi5cbiAqIEBkZXByZWNhdGVkIFVzZSBSb290Q01TQ2xpZW50Lmxpc3REb2NzKCkgaW5zdGVhZC5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGxpc3REb2NzPFQ+KFxuICByb290Q29uZmlnOiBSb290Q29uZmlnLFxuICBjb2xsZWN0aW9uSWQ6IHN0cmluZyxcbiAgb3B0aW9uczoge1xuICAgIG1vZGU6ICdkcmFmdCcgfCAncHVibGlzaGVkJztcbiAgICBvZmZzZXQ/OiBudW1iZXI7XG4gICAgbGltaXQ/OiBudW1iZXI7XG4gICAgb3JkZXJCeT86IHN0cmluZztcbiAgICBvcmRlckJ5RGlyZWN0aW9uPzogJ2FzYycgfCAnZGVzYyc7XG4gICAgcXVlcnk/OiAocXVlcnk6IFF1ZXJ5KSA9PiBRdWVyeTtcbiAgfVxuKTogUHJvbWlzZTx7ZG9jczogVFtdfT4ge1xuICBjb25zdCBjbXNQbHVnaW4gPSBnZXRDbXNQbHVnaW4ocm9vdENvbmZpZyk7XG4gIGNvbnN0IGNtc1BsdWdpbk9wdGlvbnMgPSBjbXNQbHVnaW4uZ2V0Q29uZmlnKCk7XG4gIGNvbnN0IHByb2plY3RJZCA9IGNtc1BsdWdpbk9wdGlvbnMuaWQgfHwgJ2RlZmF1bHQnO1xuICBjb25zdCBtb2RlID0gb3B0aW9ucy5tb2RlO1xuICBjb25zdCBtb2RlQ29sbGVjdGlvbiA9IG1vZGUgPT09ICdkcmFmdCcgPyAnRHJhZnRzJyA6ICdQdWJsaXNoZWQnO1xuICBjb25zdCBhcHAgPSBjbXNQbHVnaW4uZ2V0RmlyZWJhc2VBcHAoKTtcbiAgY29uc3QgZGIgPSBnZXRGaXJlc3RvcmUoYXBwKTtcbiAgY29uc3QgZGJQYXRoID0gYFByb2plY3RzLyR7cHJvamVjdElkfS9Db2xsZWN0aW9ucy8ke2NvbGxlY3Rpb25JZH0vJHttb2RlQ29sbGVjdGlvbn1gO1xuICBsZXQgcXVlcnk6IFF1ZXJ5ID0gZGIuY29sbGVjdGlvbihkYlBhdGgpO1xuICBpZiAob3B0aW9ucy5saW1pdCkge1xuICAgIHF1ZXJ5ID0gcXVlcnkubGltaXQob3B0aW9ucy5saW1pdCk7XG4gIH1cbiAgaWYgKG9wdGlvbnMub2Zmc2V0KSB7XG4gICAgcXVlcnkgPSBxdWVyeS5vZmZzZXQob3B0aW9ucy5vZmZzZXQpO1xuICB9XG4gIGlmIChvcHRpb25zLm9yZGVyQnkpIHtcbiAgICBxdWVyeSA9IHF1ZXJ5Lm9yZGVyQnkob3B0aW9ucy5vcmRlckJ5LCBvcHRpb25zLm9yZGVyQnlEaXJlY3Rpb24pO1xuICB9XG4gIGlmIChvcHRpb25zLnF1ZXJ5KSB7XG4gICAgcXVlcnkgPSBvcHRpb25zLnF1ZXJ5KHF1ZXJ5KTtcbiAgfVxuICBjb25zdCByZXN1bHRzID0gYXdhaXQgcXVlcnkuZ2V0KCk7XG4gIGNvbnN0IGRvY3M6IFRbXSA9IFtdO1xuICByZXN1bHRzLmZvckVhY2goKHJlc3VsdCkgPT4ge1xuICAgIGNvbnN0IGRvYyA9IHVubWFyc2hhbERhdGEocmVzdWx0LmRhdGEoKSkgYXMgVDtcbiAgICBkb2NzLnB1c2goZG9jKTtcbiAgfSk7XG4gIHJldHVybiB7ZG9jc307XG59XG5cbi8qKlxuICogUmV0dXJucyB0aGUgbnVtYmVyIG9mIGRvY3MgaW4gYSBSb290LmpzIENNUyBjb2xsZWN0aW9uLlxuICogQGRlcHJlY2F0ZWQgVXNlIFJvb3RDTVNDbGllbnQuZ2V0RG9jc0NvdW50KCkgaW5zdGVhZC5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIG51bURvY3MoXG4gIHJvb3RDb25maWc6IFJvb3RDb25maWcsXG4gIGNvbGxlY3Rpb25JZDogc3RyaW5nLFxuICBvcHRpb25zOiB7XG4gICAgbW9kZTogJ2RyYWZ0JyB8ICdwdWJsaXNoZWQnO1xuICAgIHF1ZXJ5PzogKHF1ZXJ5OiBRdWVyeSkgPT4gUXVlcnk7XG4gIH1cbikge1xuICBjb25zdCBjbXNQbHVnaW4gPSBnZXRDbXNQbHVnaW4ocm9vdENvbmZpZyk7XG4gIGNvbnN0IGNtc1BsdWdpbk9wdGlvbnMgPSBjbXNQbHVnaW4uZ2V0Q29uZmlnKCk7XG4gIGNvbnN0IHByb2plY3RJZCA9IGNtc1BsdWdpbk9wdGlvbnMuaWQgfHwgJ2RlZmF1bHQnO1xuICBjb25zdCBtb2RlID0gb3B0aW9ucy5tb2RlO1xuICBjb25zdCBtb2RlQ29sbGVjdGlvbiA9IG1vZGUgPT09ICdkcmFmdCcgPyAnRHJhZnRzJyA6ICdQdWJsaXNoZWQnO1xuICBjb25zdCBhcHAgPSBjbXNQbHVnaW4uZ2V0RmlyZWJhc2VBcHAoKTtcbiAgY29uc3QgZGIgPSBnZXRGaXJlc3RvcmUoYXBwKTtcbiAgY29uc3QgZGJQYXRoID0gYFByb2plY3RzLyR7cHJvamVjdElkfS9Db2xsZWN0aW9ucy8ke2NvbGxlY3Rpb25JZH0vJHttb2RlQ29sbGVjdGlvbn1gO1xuICBsZXQgcXVlcnk6IFF1ZXJ5ID0gZGIuY29sbGVjdGlvbihkYlBhdGgpO1xuICBpZiAob3B0aW9ucy5xdWVyeSkge1xuICAgIHF1ZXJ5ID0gb3B0aW9ucy5xdWVyeShxdWVyeSk7XG4gIH1cbiAgY29uc3QgcmVzdWx0cyA9IGF3YWl0IHF1ZXJ5LmNvdW50KCkuZ2V0KCk7XG4gIGNvbnN0IGNvdW50ID0gcmVzdWx0cy5kYXRhKCkuY291bnQ7XG4gIHJldHVybiBjb3VudDtcbn1cblxuLyoqXG4gKiBQdWJsaXNoZXMgc2NoZWR1bGVkIGRvY3MuXG4gKiBAZGVwcmVjYXRlZCBVc2UgUm9vdENNU0NsaWVudC5wdWJsaXNoU2NoZWR1bGVkRG9jcygpIGluc3RlYWQuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBwdWJsaXNoU2NoZWR1bGVkRG9jcyhyb290Q29uZmlnOiBSb290Q29uZmlnKSB7XG4gIGNvbnN0IGNtc1BsdWdpbiA9IGdldENtc1BsdWdpbihyb290Q29uZmlnKTtcbiAgY29uc3QgY21zUGx1Z2luT3B0aW9ucyA9IGNtc1BsdWdpbi5nZXRDb25maWcoKTtcbiAgY29uc3QgcHJvamVjdElkID0gY21zUGx1Z2luT3B0aW9ucy5pZCB8fCAnZGVmYXVsdCc7XG4gIGNvbnN0IGFwcCA9IGNtc1BsdWdpbi5nZXRGaXJlYmFzZUFwcCgpO1xuICBjb25zdCBkYiA9IGdldEZpcmVzdG9yZShhcHApO1xuXG4gIGNvbnN0IHByb2plY3RDb2xsZWN0aW9uc1BhdGggPSBgUHJvamVjdHMvJHtwcm9qZWN0SWR9L0NvbGxlY3Rpb25zYDtcbiAgY29uc3Qgbm93ID0gTWF0aC5jZWlsKG5ldyBEYXRlKCkuZ2V0VGltZSgpKTtcblxuICBjb25zdCBzbmFwc2hvdCA9IGF3YWl0IGRiLmNvbGxlY3Rpb25Hcm91cCgnU2NoZWR1bGVkJykuZ2V0KCk7XG4gIGNvbnN0IGRvY3MgPSBzbmFwc2hvdC5kb2NzXG4gICAgLmZpbHRlcigoZCkgPT4ge1xuICAgICAgLy8gRmlsdGVyIGRvY3MgYnkgcHJvamVjdC5cbiAgICAgIGlmICghZC5yZWYucGF0aC5zdGFydHNXaXRoKHByb2plY3RDb2xsZWN0aW9uc1BhdGgpKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICAgIC8vIEZpbHRlciBkb2NzIHdoZXJlIHNjaGVkdWxlZEF0IGlzIGluIHRoZSBwYXN0LlxuICAgICAgLy8gTk9URShzdGV2ZW5sZSk6IHRoZSBmaWx0ZXJpbmcgaXMgZG9uZSBtYW51YWxseSBpbnN0ZWFkIG9mIHVzaW5nIGEgcXVlcnlcbiAgICAgIC8vIHRvIGF2b2lkIGhhdmluZyB0byBjcmVhdGUgYW4gaW5kZXggaW4gZmlyZXN0b3JlLlxuICAgICAgY29uc3QgZGF0YSA9IGQuZGF0YSgpIHx8IHt9O1xuICAgICAgY29uc3Qgc2NoZWR1bGVkQXQ6IFRpbWVzdGFtcCB8IHVuZGVmaW5lZCA9IGRhdGEuc3lzPy5zY2hlZHVsZWRBdDtcbiAgICAgIHJldHVybiAoXG4gICAgICAgIHNjaGVkdWxlZEF0ICYmIHNjaGVkdWxlZEF0LnRvTWlsbGlzICYmIHNjaGVkdWxlZEF0LnRvTWlsbGlzKCkgPD0gbm93XG4gICAgICApO1xuICAgIH0pXG4gICAgLm1hcCgoZCkgPT4ge1xuICAgICAgY29uc3QgZGJQYXRoID0gZC5yZWYucGF0aDtcbiAgICAgIGNvbnN0IHNlZ21lbnRzID0gZGJQYXRoLnNwbGl0KCcvJyk7XG4gICAgICBjb25zdCBzbHVnID0gc2VnbWVudHMuYXQoLTEpO1xuICAgICAgY29uc3QgY29sbGVjdGlvbiA9IHNlZ21lbnRzLmF0KC0zKTtcbiAgICAgIGNvbnN0IGlkID0gYCR7Y29sbGVjdGlvbn0vJHtzbHVnfWA7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBkYXRhOiBkLmRhdGEoKSxcbiAgICAgICAgaWQsXG4gICAgICAgIGNvbGxlY3Rpb24sXG4gICAgICAgIHNsdWcsXG4gICAgICB9O1xuICAgIH0pO1xuXG4gIGlmIChkb2NzLmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVybiBbXTtcbiAgfVxuXG4gIC8vIEVhY2ggdHJhbnNhY3Rpb24gb3IgYmF0Y2ggY2FuIHdyaXRlIGEgbWF4IG9mIDUwMCBvcHMuXG4gIC8vIGh0dHBzOi8vZmlyZWJhc2UuZ29vZ2xlLmNvbS9kb2NzL2ZpcmVzdG9yZS9tYW5hZ2UtZGF0YS90cmFuc2FjdGlvbnNcbiAgbGV0IGJhdGNoQ291bnQgPSAwO1xuICBjb25zdCBiYXRjaCA9IGRiLmJhdGNoKCk7XG4gIGNvbnN0IHB1Ymxpc2hlZERvY3M6IGFueVtdID0gW107XG4gIGZvciAoY29uc3QgZG9jIG9mIGRvY3MpIHtcbiAgICBjb25zdCB7aWQsIGNvbGxlY3Rpb24sIHNsdWcsIGRhdGF9ID0gZG9jO1xuICAgIGNvbnN0IGRyYWZ0UmVmID0gZGIuZG9jKFxuICAgICAgYCR7cHJvamVjdENvbGxlY3Rpb25zUGF0aH0vJHtjb2xsZWN0aW9ufS9EcmFmdHMvJHtzbHVnfWBcbiAgICApO1xuICAgIGNvbnN0IHNjaGVkdWxlZFJlZiA9IGRiLmRvYyhcbiAgICAgIGAke3Byb2plY3RDb2xsZWN0aW9uc1BhdGh9LyR7Y29sbGVjdGlvbn0vU2NoZWR1bGVkLyR7c2x1Z31gXG4gICAgKTtcbiAgICBjb25zdCBwdWJsaXNoZWRSZWYgPSBkYi5kb2MoXG4gICAgICBgJHtwcm9qZWN0Q29sbGVjdGlvbnNQYXRofS8ke2NvbGxlY3Rpb259L1B1Ymxpc2hlZC8ke3NsdWd9YFxuICAgICk7XG4gICAgY29uc3Qge3NjaGVkdWxlZEF0LCBzY2hlZHVsZWRCeSwgLi4uc3lzfSA9IGRhdGEuc3lzIHx8IHt9O1xuXG4gICAgLy8gT25seSB1cGRhdGUgYGZpcnN0UHVibGlzaGVkYCBpZiBpdCBkb2Vzbid0IGFscmVhZHkgZXhpc3QuXG4gICAgY29uc3QgZmlyc3RQdWJsaXNoZWRBdCA9IHN5cy5maXJzdFB1Ymxpc2hlZEF0ID8/IHNjaGVkdWxlZEF0O1xuICAgIGNvbnN0IGZpcnN0UHVibGlzaGVkQnkgPSBzeXMuZmlyc3RQdWJsaXNoZWRCeSA/PyAoc2NoZWR1bGVkQnkgfHwgJycpO1xuXG4gICAgLy8gU2F2ZSBwdWJsaXNoZWQgZG9jLlxuICAgIGJhdGNoLnNldChwdWJsaXNoZWRSZWYsIHtcbiAgICAgIGlkLFxuICAgICAgY29sbGVjdGlvbixcbiAgICAgIHNsdWcsXG4gICAgICBmaWVsZHM6IGRhdGEuZmllbGRzIHx8IHt9LFxuICAgICAgc3lzOiB7XG4gICAgICAgIC4uLnN5cyxcbiAgICAgICAgZmlyc3RQdWJsaXNoZWRBdDogZmlyc3RQdWJsaXNoZWRBdCxcbiAgICAgICAgZmlyc3RQdWJsaXNoZWRCeTogZmlyc3RQdWJsaXNoZWRCeSxcbiAgICAgICAgcHVibGlzaGVkQXQ6IEZpZWxkVmFsdWUuc2VydmVyVGltZXN0YW1wKCksXG4gICAgICAgIHB1Ymxpc2hlZEJ5OiBzY2hlZHVsZWRCeSB8fCAnJyxcbiAgICAgIH0sXG4gICAgfSk7XG4gICAgYmF0Y2hDb3VudCArPSAxO1xuXG4gICAgLy8gUmVtb3ZlIHB1Ymxpc2hlZCBkb2MuXG4gICAgYmF0Y2guZGVsZXRlKHNjaGVkdWxlZFJlZik7XG4gICAgYmF0Y2hDb3VudCArPSAxO1xuXG4gICAgLy8gVXBkYXRlIHRoZSBkcmFmdCBkb2MgdG8gcmVtb3ZlIGBzY2hlZHVsZWRBdGAgYW5kIGBzY2hlZHVsZWRCeWAgZmllbGRzXG4gICAgLy8gYW5kIHVwZGF0ZSB0aGUgYHB1Ymxpc2hlZEF0YCBhbmQgYHB1Ymxpc2hlZEJ5YCBmaWVsZHMuXG4gICAgYmF0Y2gudXBkYXRlKGRyYWZ0UmVmLCB7XG4gICAgICAnc3lzLnNjaGVkdWxlZEF0JzogRmllbGRWYWx1ZS5kZWxldGUoKSxcbiAgICAgICdzeXMuc2NoZWR1bGVkQnknOiBGaWVsZFZhbHVlLmRlbGV0ZSgpLFxuICAgICAgJ3N5cy5maXJzdFB1Ymxpc2hlZEF0JzogZmlyc3RQdWJsaXNoZWRBdCxcbiAgICAgICdzeXMuZmlyc3RQdWJsaXNoZWRCeSc6IGZpcnN0UHVibGlzaGVkQnksXG4gICAgICAnc3lzLnB1Ymxpc2hlZEF0JzogRmllbGRWYWx1ZS5zZXJ2ZXJUaW1lc3RhbXAoKSxcbiAgICAgICdzeXMucHVibGlzaGVkQnknOiBzY2hlZHVsZWRCeSB8fCAnJyxcbiAgICB9KTtcbiAgICBiYXRjaENvdW50ICs9IDE7XG5cbiAgICBwdWJsaXNoZWREb2NzLnB1c2goZG9jKTtcblxuICAgIGlmIChiYXRjaENvdW50ID49IDQ5OCkge1xuICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG5cbiAgYXdhaXQgYmF0Y2guY29tbWl0KCk7XG4gIGNvbnNvbGUubG9nKGBwdWJsaXNoZWQgJHtwdWJsaXNoZWREb2NzLmxlbmd0aH0gZG9jcyFgKTtcbiAgcmV0dXJuIHB1Ymxpc2hlZERvY3M7XG59XG5cbi8qKlxuICogQGRlcHJlY2F0ZWQgVXNlIGBSb290Q01TQ2xpZW50LmxvYWRUcmFuc2xhdGlvbnMoKWAuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBsb2FkVHJhbnNsYXRpb25zKFxuICByb290Q29uZmlnOiBSb290Q29uZmlnLFxuICBvcHRpb25zPzogTG9hZFRyYW5zbGF0aW9uc09wdGlvbnNcbik6IFByb21pc2U8VHJhbnNsYXRpb25zTWFwPiB7XG4gIGNvbnN0IGNtc1BsdWdpbiA9IGdldENtc1BsdWdpbihyb290Q29uZmlnKTtcbiAgY29uc3QgY21zUGx1Z2luT3B0aW9ucyA9IGNtc1BsdWdpbi5nZXRDb25maWcoKTtcbiAgY29uc3QgcHJvamVjdElkID0gY21zUGx1Z2luT3B0aW9ucy5pZCB8fCAnZGVmYXVsdCc7XG4gIGNvbnN0IGFwcCA9IGNtc1BsdWdpbi5nZXRGaXJlYmFzZUFwcCgpO1xuICBjb25zdCBkYiA9IGdldEZpcmVzdG9yZShhcHApO1xuXG4gIGNvbnN0IGRiUGF0aCA9IGBQcm9qZWN0cy8ke3Byb2plY3RJZH0vVHJhbnNsYXRpb25zYDtcbiAgbGV0IHF1ZXJ5OiBRdWVyeSA9IGRiLmNvbGxlY3Rpb24oZGJQYXRoKTtcbiAgaWYgKG9wdGlvbnM/LnRhZ3MpIHtcbiAgICBxdWVyeSA9IHF1ZXJ5LndoZXJlKCd0YWdzJywgJ2FycmF5LWNvbnRhaW5zLWFueScsIG9wdGlvbnMudGFncyk7XG4gIH1cblxuICBjb25zdCBxdWVyeVNuYXBzaG90ID0gYXdhaXQgcXVlcnkuZ2V0KCk7XG4gIGNvbnN0IHRyYW5zbGF0aW9uc01hcDogVHJhbnNsYXRpb25zTWFwID0ge307XG4gIHF1ZXJ5U25hcHNob3QuZm9yRWFjaCgoZG9jKSA9PiB7XG4gICAgY29uc3QgaGFzaCA9IGRvYy5pZDtcbiAgICB0cmFuc2xhdGlvbnNNYXBbaGFzaF0gPSBkb2MuZGF0YSgpIGFzIFRyYW5zbGF0aW9uO1xuICB9KTtcbiAgcmV0dXJuIHRyYW5zbGF0aW9uc01hcDtcbn1cblxuLyoqXG4gKiBAZGVwcmVjYXRlZCBVc2UgYFJvb3RDTVNDbGllbnQubG9hZFRyYW5zbGF0aW9uc0ZvckxvY2FsZSgpYC5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGxvYWRUcmFuc2xhdGlvbnNGb3JMb2NhbGUoXG4gIHJvb3RDb25maWc6IFJvb3RDb25maWcsXG4gIGxvY2FsZTogc3RyaW5nLFxuICBvcHRpb25zPzogTG9hZFRyYW5zbGF0aW9uc09wdGlvbnNcbik6IFByb21pc2U8TG9jYWxlVHJhbnNsYXRpb25zPiB7XG4gIGNvbnN0IHRyYW5zbGF0aW9uc01hcCA9IGF3YWl0IGxvYWRUcmFuc2xhdGlvbnMocm9vdENvbmZpZywgb3B0aW9ucyk7XG4gIHJldHVybiB0cmFuc2xhdGlvbnNGb3JMb2NhbGUodHJhbnNsYXRpb25zTWFwLCBsb2NhbGUpO1xufVxuIiwgImltcG9ydCB7RnVuY3Rpb25hbENvbXBvbmVudH0gZnJvbSAncHJlYWN0JztcblxuZXhwb3J0IGludGVyZmFjZSBDb21tb25GaWVsZFByb3BzIHtcbiAgdHlwZTogc3RyaW5nO1xuICBpZD86IHN0cmluZztcbiAgbGFiZWw/OiBzdHJpbmc7XG4gIGhlbHA/OiBzdHJpbmc7XG4gIHBsYWNlaG9sZGVyPzogc3RyaW5nO1xuICBkZWZhdWx0PzogYW55O1xuICBoaWRkZW4/OiBib29sZWFuO1xuICBkZXByZWNhdGVkPzogYm9vbGVhbjtcbn1cblxuZXhwb3J0IHR5cGUgU3RyaW5nRmllbGQgPSBDb21tb25GaWVsZFByb3BzICYge1xuICB0eXBlOiAnc3RyaW5nJztcbiAgZGVmYXVsdD86IHN0cmluZztcbiAgdHJhbnNsYXRlPzogYm9vbGVhbjtcbiAgdmFyaWFudD86ICdpbnB1dCcgfCAndGV4dGFyZWEnO1xuICAvKiogRm9yIHRleHRhcmVhIHZhcmlhbnQsIHRoZSBtYXhpbXVtIG51bWJlciBvZiByb3dzIG9mIHRleHQgdG8gc2hvdy4gKi9cbiAgbWF4Um93cz86IG51bWJlcjtcbn07XG5cbmV4cG9ydCBmdW5jdGlvbiBzdHJpbmcoZmllbGQ6IE9taXQ8U3RyaW5nRmllbGQsICd0eXBlJz4pOiBTdHJpbmdGaWVsZCB7XG4gIHJldHVybiB7Li4uZmllbGQsIHR5cGU6ICdzdHJpbmcnfTtcbn1cblxuZXhwb3J0IHR5cGUgTnVtYmVyRmllbGQgPSBDb21tb25GaWVsZFByb3BzICYge1xuICB0eXBlOiAnbnVtYmVyJztcbiAgZGVmYXVsdD86IG51bWJlcjtcbn07XG5cbmV4cG9ydCBmdW5jdGlvbiBudW1iZXIoZmllbGQ6IE9taXQ8TnVtYmVyRmllbGQsICd0eXBlJz4pOiBOdW1iZXJGaWVsZCB7XG4gIHJldHVybiB7Li4uZmllbGQsIHR5cGU6ICdudW1iZXInfTtcbn1cblxuZXhwb3J0IHR5cGUgRGF0ZUZpZWxkID0gQ29tbW9uRmllbGRQcm9wcyAmIHtcbiAgdHlwZTogJ2RhdGUnO1xuICBkZWZhdWx0Pzogc3RyaW5nO1xufTtcblxuZXhwb3J0IGZ1bmN0aW9uIGRhdGUoZmllbGQ6IE9taXQ8RGF0ZUZpZWxkLCAndHlwZSc+KTogRGF0ZUZpZWxkIHtcbiAgcmV0dXJuIHsuLi5maWVsZCwgdHlwZTogJ2RhdGUnfTtcbn1cblxuZXhwb3J0IHR5cGUgRGF0ZVRpbWVGaWVsZCA9IENvbW1vbkZpZWxkUHJvcHMgJiB7XG4gIHR5cGU6ICdkYXRldGltZSc7XG4gIGRlZmF1bHQ/OiBzdHJpbmc7XG59O1xuXG5leHBvcnQgZnVuY3Rpb24gZGF0ZXRpbWUoZmllbGQ6IE9taXQ8RGF0ZVRpbWVGaWVsZCwgJ3R5cGUnPik6IERhdGVUaW1lRmllbGQge1xuICByZXR1cm4gey4uLmZpZWxkLCB0eXBlOiAnZGF0ZXRpbWUnfTtcbn1cblxuZXhwb3J0IHR5cGUgQm9vbGVhbkZpZWxkID0gQ29tbW9uRmllbGRQcm9wcyAmIHtcbiAgdHlwZTogJ2Jvb2xlYW4nO1xuICBkZWZhdWx0PzogYm9vbGVhbjtcbiAgY2hlY2tib3hMYWJlbD86IHN0cmluZztcbn07XG5cbmV4cG9ydCBmdW5jdGlvbiBib29sZWFuKGZpZWxkOiBPbWl0PEJvb2xlYW5GaWVsZCwgJ3R5cGUnPik6IEJvb2xlYW5GaWVsZCB7XG4gIHJldHVybiB7Li4uZmllbGQsIHR5cGU6ICdib29sZWFuJ307XG59XG5cbmV4cG9ydCB0eXBlIFNlbGVjdEZpZWxkID0gQ29tbW9uRmllbGRQcm9wcyAmIHtcbiAgdHlwZTogJ3NlbGVjdCc7XG4gIGRlZmF1bHQ/OiBzdHJpbmc7XG4gIG9wdGlvbnM/OiBBcnJheTx7dmFsdWU6IHN0cmluZzsgbGFiZWw/OiBzdHJpbmd9PiB8IHN0cmluZ1tdO1xuICB0cmFuc2xhdGU/OiBib29sZWFuO1xufTtcblxuZXhwb3J0IGZ1bmN0aW9uIHNlbGVjdChmaWVsZDogT21pdDxTZWxlY3RGaWVsZCwgJ3R5cGUnPik6IFNlbGVjdEZpZWxkIHtcbiAgcmV0dXJuIHsuLi5maWVsZCwgdHlwZTogJ3NlbGVjdCd9O1xufVxuXG5leHBvcnQgdHlwZSBNdWx0aVNlbGVjdEZpZWxkID0gT21pdDxTZWxlY3RGaWVsZCwgJ3R5cGUnPiAmIHtcbiAgdHlwZTogJ211bHRpc2VsZWN0JztcbiAgLyoqIFNldCB0byBgdHJ1ZWAgdG8gYWxsb3cgdXNlcnMgdG8gY3JlYXRlIGFyYml0cmFyeSB2YWx1ZXMuICovXG4gIGNyZWF0YWJsZT86IGJvb2xlYW47XG4gIHRyYW5zbGF0ZT86IGJvb2xlYW47XG59O1xuXG5leHBvcnQgZnVuY3Rpb24gbXVsdGlzZWxlY3QoXG4gIGZpZWxkOiBPbWl0PE11bHRpU2VsZWN0RmllbGQsICd0eXBlJz5cbik6IE11bHRpU2VsZWN0RmllbGQge1xuICByZXR1cm4gey4uLmZpZWxkLCB0eXBlOiAnbXVsdGlzZWxlY3QnfTtcbn1cblxuZXhwb3J0IHR5cGUgSW1hZ2VGaWVsZCA9IENvbW1vbkZpZWxkUHJvcHMgJiB7XG4gIHR5cGU6ICdpbWFnZSc7XG4gIHRyYW5zbGF0ZT86IGJvb2xlYW47XG4gIC8qKiBMaXN0IG9mIHN1cHBvcnRlZCBleHRzLCBlLmcuIGBbJy5tcDQnXWAuICovXG4gIGV4dHM/OiBzdHJpbmdbXTtcbn07XG5cbmV4cG9ydCBmdW5jdGlvbiBpbWFnZShmaWVsZDogT21pdDxJbWFnZUZpZWxkLCAndHlwZSc+KTogSW1hZ2VGaWVsZCB7XG4gIHJldHVybiB7Li4uZmllbGQsIHR5cGU6ICdpbWFnZSd9O1xufVxuXG5leHBvcnQgdHlwZSBGaWxlRmllbGQgPSBDb21tb25GaWVsZFByb3BzICYge1xuICB0eXBlOiAnZmlsZSc7XG4gIC8qKiBMaXN0IG9mIHN1cHBvcnRlZCBleHRzLCBlLmcuIGBbJy5tcDQnXWAuICovXG4gIGV4dHM/OiBzdHJpbmdbXTtcbn07XG5cbmV4cG9ydCBmdW5jdGlvbiBmaWxlKGZpZWxkOiBPbWl0PEZpbGVGaWVsZCwgJ3R5cGUnPik6IEZpbGVGaWVsZCB7XG4gIHJldHVybiB7Li4uZmllbGQsIHR5cGU6ICdmaWxlJ307XG59XG5cbmV4cG9ydCB0eXBlIE9iamVjdEZpZWxkID0gQ29tbW9uRmllbGRQcm9wcyAmIHtcbiAgdHlwZTogJ29iamVjdCc7XG4gIGZpZWxkczogRmllbGRXaXRoSWRbXTtcbn07XG5cbmV4cG9ydCBmdW5jdGlvbiBvYmplY3QoZmllbGQ6IE9taXQ8T2JqZWN0RmllbGQsICd0eXBlJz4pOiBPYmplY3RGaWVsZCB7XG4gIHJldHVybiB7Li4uZmllbGQsIHR5cGU6ICdvYmplY3QnfTtcbn1cblxuZXhwb3J0IHR5cGUgQXJyYXlGaWVsZCA9IENvbW1vbkZpZWxkUHJvcHMgJiB7XG4gIHR5cGU6ICdhcnJheSc7XG4gIGRlZmF1bHQ/OiBhbnlbXTtcbiAgLyoqXG4gICAqIFN0cmluZyBmb3JtYXQgZm9yIHRoZSBwcmV2aWV3IGxpbmUgb2YgYW4gaXRlbSBpbiB0aGUgYXJyYXkuIFBsYWNlaG9sZGVyXG4gICAqIHZhbHVlcyBzaG91bGQgdXNlIGJyYWNrZXRzLCBlLmcuIGBte19pbmRleDowMn06IHtfdHlwZX1gLlxuICAgKlxuICAgKiBNdWx0aXBsZSB2YWx1ZXMgY2FuIGJlIHByb3ZpZGVkLCBpbiB3aGljaCBjYXNlIHRoZSBmaXJzdCBwcmV2aWV3IGxpbmUgd2l0aFxuICAgKiBubyBtaXNzaW5nIHBsYWNlaG9sZGVyIHZhbHVlcyB3aWxsIGJlIHVzZWQuXG4gICAqXG4gICAqIFN5c3RlbSBhZGRlZCBwbGFjZWhvbGRlciB2YWx1ZXM6XG4gICAqXG4gICAqIC0gX2luZGV4OiBUaGUgMC1iYXNlZCBpbmRleC5cbiAgICogLSBfaW5kZXg6MDI6IEEgbGVmdC1wYWRkZWQgdmVyc2lvbiBvZiBfaW5kZXggdG8gMiBkaWdpdHMuXG4gICAqIC0gX2luZGV4OjAzOiBBIGxlZnQtcGFkZGVkIHZlcnNpb24gb2YgX2luZGV4IHRvIDMgZGlnaXRzLlxuICAgKiAtIF90eXBlOiBGb3IgYXJyYXkgb2Ygb25lLW9mIGZpZWxkcywgdGhlIHR5cGUgb2YgdGhlIHNlbGVjdGVkIGZpZWxkLlxuICAgKi9cbiAgcHJldmlldz86IHN0cmluZyB8IHN0cmluZ1tdO1xuICAvLyBOT1RFKHN0ZXZlbmxlKTogdGhlIGFycmF5IGZpZWxkIHNob3VsZCBvbmx5IGFjY2VwdCBvYmplY3QgdmFsdWVzIHRvIGtlZXBcbiAgLy8gdGhlIHNjaGVtYXMgZnV0dXJlLWZyaWVuZGx5LiBGb3IgZXhhbXBsZSwgaWYgd2Ugd2VyZSB0byBhY2NlcHQgcHJpbWF0aXZlc1xuICAvLyAoZS5nLiBBcnJheTxzdHJpbmc+KSBhbmQgdGhlIGRldmVsb3BlciBkZWNpZGVzIGluIHRoZSBmdXR1cmUgdGhhdCB0aGV5XG4gIC8vIG5lZWQgdG8gYWRkIGV4dHJhIGZpZWxkcyB0byB0aGF0IGFycmF5IHR5cGUsIHRoZXkgd291bGQgaGF2ZSB0byBjcmVhdGUgYVxuICAvLyBuZXcgZmllbGQsIGNyZWF0ZSBhIG5ldyBzY2hlbWEgZmllbGQsIGFuZCB0aGVuIHBlcmZvcm0gYSBkYiBtaWdyYXRpb24gdG9cbiAgLy8gdXBkYXRlIGZyb20gdGhlIG9sZCBmaWVsZCB0eXBlIHRvIHRoZSBuZXcgZmllbGQgdHlwZS4gQnV0IGlmIHdlIGVuZm9yY2VcbiAgLy8gb2JqZWN0cyBoZXJlLCBhIGRldmVsb3BlciBzaG91bGQgdGVjaG5pY2FsbHkgYmUgYWJsZSB0byBhZGQgZmllbGRzIHRvIHRoZVxuICAvLyBuZXN0ZWQgZmllbGQgZGVmaW5pdGlvbiB3aXRob3V0IGJyZWFraW5nIGFueSBleGlzdGluZyBkYiBlbnRyaWVzLlxuICBvZjogT2JqZWN0TGlrZUZpZWxkO1xuICAvKipcbiAgICogTGFiZWwgdG8gdXNlIGZvciB0aGUgXCJhZGQgaXRlbVwiIGJ1dHRvbi4gRGVmYXVsdHMgdG8gYEFkZGAuXG4gICAqL1xuICBidXR0b25MYWJlbD86IHN0cmluZztcbn07XG5cbmV4cG9ydCBmdW5jdGlvbiBhcnJheShmaWVsZDogT21pdDxBcnJheUZpZWxkLCAndHlwZSc+KTogQXJyYXlGaWVsZCB7XG4gIHJldHVybiB7Li4uZmllbGQsIHR5cGU6ICdhcnJheSd9O1xufVxuXG5leHBvcnQgdHlwZSBPbmVPZkZpZWxkID0gQ29tbW9uRmllbGRQcm9wcyAmIHtcbiAgdHlwZTogJ29uZW9mJztcbiAgdHlwZXM6IFNjaGVtYVtdO1xufTtcblxuZXhwb3J0IGZ1bmN0aW9uIG9uZU9mKGZpZWxkOiBPbWl0PE9uZU9mRmllbGQsICd0eXBlJz4pOiBPbmVPZkZpZWxkIHtcbiAgcmV0dXJuIHsuLi5maWVsZCwgdHlwZTogJ29uZW9mJ307XG59XG5cbmV4cG9ydCB0eXBlIEZpZWxkID1cbiAgfCBTdHJpbmdGaWVsZFxuICB8IE51bWJlckZpZWxkXG4gIHwgRGF0ZUZpZWxkXG4gIHwgRGF0ZVRpbWVGaWVsZFxuICB8IEJvb2xlYW5GaWVsZFxuICB8IFNlbGVjdEZpZWxkXG4gIHwgTXVsdGlTZWxlY3RGaWVsZFxuICB8IEltYWdlRmllbGRcbiAgfCBGaWxlRmllbGRcbiAgfCBPYmplY3RGaWVsZFxuICB8IEFycmF5RmllbGRcbiAgfCBPbmVPZkZpZWxkO1xuXG4vKipcbiAqIFNpbWlsYXIgdG8ge0BsaW5rIEZpZWxkfSBidXQgd2l0aCBhIHJlcXVpcmVkIGBpZGAuXG4gKiBUT0RPKHN0ZXZlbmxlKTogZml4IHRoaXMuXG4gKi9cbmV4cG9ydCB0eXBlIEZpZWxkV2l0aElkID0gRmllbGQ7XG5cbmV4cG9ydCB0eXBlIE9iamVjdExpa2VGaWVsZCA9IEltYWdlRmllbGQgfCBGaWxlRmllbGQgfCBPYmplY3RGaWVsZCB8IE9uZU9mRmllbGQ7XG5cbmV4cG9ydCBpbnRlcmZhY2UgU2NoZW1hIHtcbiAgbmFtZTogc3RyaW5nO1xuICBkZXNjcmlwdGlvbj86IHN0cmluZztcbiAgZmllbGRzOiBGaWVsZFdpdGhJZFtdO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZGVmaW5lU2NoZW1hKHNjaGVtYTogU2NoZW1hKTogU2NoZW1hIHtcbiAgcmV0dXJuIHNjaGVtYTtcbn1cblxuLyoqIERlZmluZXMgdGhlIHNjaGVtYSBmb3IgYSBjb2xsZWN0aW9uIG9yIHJldXNhYmxlIGNvbXBvbmVudC4gKi9cbmV4cG9ydCBjb25zdCBkZWZpbmUgPSBkZWZpbmVTY2hlbWE7XG5cbmV4cG9ydCB0eXBlIENvbGxlY3Rpb24gPSBTY2hlbWEgJiB7XG4gIC8qKiBVUkwgcGF0aCB3aGVyZSB0aGUgY29sbGVjdGlvbiBzZXJ2ZXMgZnJvbS4gKi9cbiAgdXJsPzogc3RyaW5nO1xuICAvKipcbiAgICogVVJMIHRoYXQgY2FuIGJlIHVzZWQgdG8gcmVuZGVyIGEgcHJldmlldyBwYWdlLiBVc2VkIGJ5IHRoZSBzaWRlLWJ5LXNpZGVcbiAgICogZWRpdG9yIHRvIHJlbmRlciBpbnN0YW50IHByZXZpZXdzLiBJZiBibGFuaywgZGVmYXVsdHMgdG8gdGhlIGB1cmxgIGNvbmZpZy5cbiAgICovXG4gIHByZXZpZXdVcmw/OiBzdHJpbmc7XG4gIC8qKiBQYWdlIGNvbXBvbmVudCB0byByZW5kZXIgdGhlIGNvbGxlY3Rpb24gZm9yIGluc3RhbnQgcHJldmlld3MgKi9cbiAgQ29tcG9uZW50PzogRnVuY3Rpb25hbENvbXBvbmVudDtcbiAgLyoqXG4gICAqIERlZmluZXMgdGhlIGZpZWxkcyB0byB1c2UgZm9yIGRvY3VtZW50IHByZXZpZXcuIERlZmF1bHRzIHRvIFwidGl0bGVcIiBhbmRcbiAgICogXCJpbWFnZVwiLiBVc2UgZG90IG5vdGF0aW9uIGZvciBuZXN0ZWQgZmllbGRzLCBlLmcuIFwibWV0YS50aXRsZVwiLlxuICAgKi9cbiAgcHJldmlldz86IHtcbiAgICB0aXRsZT86IHN0cmluZztcbiAgICBpbWFnZT86IHN0cmluZztcbiAgfTtcbn07XG5cbmV4cG9ydCBmdW5jdGlvbiBkZWZpbmVDb2xsZWN0aW9uKGNvbGxlY3Rpb246IENvbGxlY3Rpb24pOiBDb2xsZWN0aW9uIHtcbiAgcmV0dXJuIGNvbGxlY3Rpb247XG59XG5cbmV4cG9ydCBjb25zdCBjb2xsZWN0aW9uID0gZGVmaW5lQ29sbGVjdGlvbjtcbiJdLAogICJtYXBwaW5ncyI6ICI7Ozs7Ozs7QUFFQTtBQUFBLEVBQ0U7QUFBQSxFQUlBO0FBQUEsT0FDSztBQXVFQSxJQUFNLGdCQUFOLE1BQW9CO0FBQUEsRUFPekIsWUFBWSxZQUF3QjtBQUNsQyxTQUFLLGFBQWE7QUFDbEIsU0FBSyxZQUFZLGFBQWEsVUFBVTtBQUV4QyxVQUFNLG1CQUFtQixLQUFLLFVBQVUsVUFBVTtBQUNsRCxTQUFLLFlBQVksaUJBQWlCLE1BQU07QUFDeEMsU0FBSyxNQUFNLEtBQUssVUFBVSxlQUFlO0FBQ3pDLFNBQUssS0FBSyxh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O0FBQzdCLFFBQU0sa0JBQWtCLE1BQU0saUJBQWlCLFlBQVksT0FBTztBQUNsRSxTQUFPLHNCQUFzQixpQkFBaUIsTUFBTTtBQUN0RDs7O0FDdFJBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBc0JPLFNBQVMsT0FBTyxPQUErQztBQUNwRSxTQUFPLEVBQUMsR0FBRyxPQUFPLE1BQU0sU0FBUTtBQUNsQztBQU9PLFNBQVMsT0FBTyxPQUErQztBQUNwRSxTQUFPLEVBQUMsR0FBRyxPQUFPLE1BQU0sU0FBUTtBQUNsQztBQU9PLFNBQVMsS0FBSyxPQUEyQztBQUM5RCxTQUFPLEVBQUMsR0FBRyxPQUFPLE1BQU0sT0FBTTtBQUNoQztBQU9PLFNBQVMsU0FBUyxPQUFtRDtBQUMxRSxTQUFPLEVBQUMsR0FBRyxPQUFPLE1BQU0sV0FBVTtBQUNwQztBQVFPLFNBQVMsUUFBUSxPQUFpRDtBQUN2RSxTQUFPLEVBQUMsR0FBRyxPQUFPLE1BQU0sVUFBUztBQUNuQztBQVNPLFNBQVMsT0FBTyxPQUErQztBQUNwRSxTQUFPLEVBQUMsR0FBRyxPQUFPLE1BQU0sU0FBUTtBQUNsQztBQVNPLFNBQVMsWUFDZCxPQUNrQjtBQUNsQixTQUFPLEVBQUMsR0FBRyxPQUFPLE1BQU0sY0FBYTtBQUN2QztBQVNPLFNBQVMsTUFBTSxPQUE2QztBQUNqRSxTQUFPLEVBQUMsR0FBRyxPQUFPLE1BQU0sUUFBTztBQUNqQztBQVFPLFNBQVMsS0FBSyxPQUEyQztBQUM5RCxTQUFPLEVBQUMsR0FBRyxPQUFPLE1BQU0sT0FBTTtBQUNoQztBQU9PLFNBQVMsT0FBTyxPQUErQztBQUNwRSxTQUFPLEVBQUMsR0FBRyxPQUFPLE1BQU0sU0FBUTtBQUNsQztBQW1DTyxTQUFTLE1BQU0sT0FBNkM7QUFDakUsU0FBTyxFQUFDLEdBQUcsT0FBTyxNQUFNLFFBQU87QUFDakM7QUFPTyxTQUFTLE1BQU0sT0FBNkM7QUFDakUsU0FBTyxFQUFDLEdBQUcsT0FBTyxNQUFNLFFBQU87QUFDakM7QUE4Qk8sU0FBUyxhQUFhLFFBQXdCO0FBQ25ELFNBQU87QUFDVDtBQUdPLElBQU0sU0FBUztBQXNCZixTQUFTLGlCQUFpQkcsYUFBb0M7QUFDbkUsU0FBT0E7QUFDVDtBQUVPLElBQU0sYUFBYTsiLAogICJuYW1lcyI6IFsiY29sbGVjdGlvbiIsICJwbHVnaW4iLCAic3RyaW5nIiwgIkZpZWxkVmFsdWUiLCAiZ2V0RmlyZXN0b3JlIiwgImdldEZpcmVzdG9yZSIsICJjb2xsZWN0aW9uIiwgIkZpZWxkVmFsdWUiLCAiY29sbGVjdGlvbiJdCn0K
|
|
689
|
+
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vY29yZS9jbGllbnQudHMiLCAiLi4vY29yZS9ydW50aW1lLnRzIiwgIi4uL2NvcmUvc2NoZW1hLnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyJpbXBvcnQgY3J5cHRvIGZyb20gJ25vZGU6Y3J5cHRvJztcbmltcG9ydCB7UGx1Z2luLCBSb290Q29uZmlnfSBmcm9tICdAYmxpbmtrL3Jvb3QnO1xuaW1wb3J0IHtBcHB9IGZyb20gJ2ZpcmViYXNlLWFkbWluL2FwcCc7XG5pbXBvcnQge1xuICBGaWVsZFZhbHVlLFxuICBGaXJlc3RvcmUsXG4gIFF1ZXJ5LFxuICBUaW1lc3RhbXAsXG4gIGdldEZpcmVzdG9yZSxcbn0gZnJvbSAnZmlyZWJhc2UtYWRtaW4vZmlyZXN0b3JlJztcbmltcG9ydCB7Q01TUGx1Z2lufSBmcm9tICcuL3BsdWdpbi5qcyc7XG5cbi8qKlxuICogTWF4IG51bWJlciBvZiBkb2NzIHRoYXQgY2FuIGJlIHB1Ymxpc2hlZCBhdCBvbmNlIGJ5IGBwdWJsaXNoRG9jcygpYC5cbiAqL1xuZXhwb3J0IGNvbnN0IFBVQkxJU0hfRE9DU19CQVRDSF9MSU1JVCA9IDEwMDtcblxuZXhwb3J0IGludGVyZmFjZSBEb2M8RmllbGRzID0gYW55PiB7XG4gIC8qKiBUaGUgaWQgb2YgdGhlIGRvYywgZS5nLiBcIlBhZ2VzL2Zvby1iYXJcIi4gKi9cbiAgaWQ6IHN0cmluZztcbiAgLyoqIFRoZSBjb2xsZWN0aW9uIGlkIG9mIHRoZSBkb2MsIGUuZy4gXCJQYWdlc1wiLiAqL1xuICBjb2xsZWN0aW9uOiBzdHJpbmc7XG4gIC8qKiBUaGUgc2x1ZyBvZiB0aGUgZG9jLCBlLmcuIFwiZm9vLWJhclwiLiAqL1xuICBzbHVnOiBzdHJpbmc7XG4gIHN5czoge1xuICAgIGNyZWF0ZWRBdDogbnVtYmVyO1xuICAgIGNyZWF0ZWRCeTogc3RyaW5nO1xuICAgIG1vZGlmaWVkQXQ6IG51bWJlcjtcbiAgICBtb2RpZmllZEJ5OiBzdHJpbmc7XG4gICAgZmlyc3RQdWJsaXNoZWRBdD86IG51bWJlcjtcbiAgICBmaXJzdFB1Ymxpc2hlZEJ5Pzogc3RyaW5nO1xuICAgIHB1Ymxpc2hlZEF0PzogbnVtYmVyO1xuICAgIHB1Ymxpc2hlZEJ5Pzogc3RyaW5nO1xuICAgIGxvY2FsZXM/OiBzdHJpbmdbXTtcbiAgfTtcbiAgZmllbGRzOiBGaWVsZHM7XG59XG5cbmV4cG9ydCB0eXBlIERvY01vZGUgPSAnZHJhZnQnIHwgJ3B1Ymxpc2hlZCc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgR2V0RG9jT3B0aW9ucyB7XG4gIC8qKiBNb2RlLCBlaXRoZXIgXCJkcmFmdFwiIG9yIFwicHVibGlzaGVkXCIuICovXG4gIG1vZGU6IERvY01vZGU7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgU2V0RG9jT3B0aW9ucyB7XG4gIC8qKiBNb2RlLCBlaXRoZXIgXCJkcmFmdFwiIG9yIFwicHVibGlzaGVkXCIuICovXG4gIG1vZGU6IERvY01vZGU7XG4gIC8qKlxuICAgKiBFbWFpbCBvZiB1c2VyIG1vZGlmeWluZyB0aGUgZG9jLiBJZiBibGFuaywgZGVmYXVsdHMgdG8gYHJvb3QtY21zLWNsaWVudGAuXG4gICAqL1xuICBtb2RpZmllZEJ5Pzogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIExpc3REb2NzT3B0aW9ucyB7XG4gIG1vZGU6IERvY01vZGU7XG4gIG9mZnNldD86IG51bWJlcjtcbiAgbGltaXQ/OiBudW1iZXI7XG4gIG9yZGVyQnk/OiBzdHJpbmc7XG4gIG9yZGVyQnlEaXJlY3Rpb24/OiAnYXNjJyB8ICdkZXNjJztcbiAgcXVlcnk/OiAocXVlcnk6IFF1ZXJ5KSA9PiBRdWVyeTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBHZXRDb3VudE9wdGlvbnMge1xuICBtb2RlOiBEb2NNb2RlO1xuICBxdWVyeT86IChxdWVyeTogUXVlcnkpID0+IFF1ZXJ5O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zbGF0aW9uIHtcbiAgW2xvY2FsZTogc3RyaW5nXTogc3RyaW5nO1xuICBzb3VyY2U6IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBUcmFuc2xhdGlvbnNNYXAge1xuICBbaGFzaDogc3RyaW5nXTogVHJhbnNsYXRpb247XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgTG9jYWxlVHJhbnNsYXRpb25zIHtcbiAgW3NvdXJjZTogc3RyaW5nXTogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIExvYWRUcmFuc2xhdGlvbnNPcHRpb25zIHtcbiAgdGFncz86IHN0cmluZ1tdO1xufVxuXG5leHBvcnQgY2xhc3MgUm9vdENNU0NsaWVudCB7XG4gIHByaXZhdGUgcmVhZG9ubHkgcm9vdENvbmZpZzogUm9vdENvbmZpZztcbiAgcHJpdmF0ZSByZWFkb25seSBjbXNQbHVnaW46IENNU1BsdWdpbjtcbiAgcHJpdmF0ZSByZWFkb25seSBwcm9qZWN0SWQ6IHN0cmluZztcbiAgcHJpdmF0ZSByZWFkb25seSBhcHA6IEFwcDtcbiAgcHJpdmF0ZSByZWFkb25seSBkYjogRmlyZXN0b3JlO1xuXG4gIGNvbnN0cnVjdG9yKHJvb3RDb25maWc6IFJvb3RDb25maWcpIHtcbiAgICB0aGlzLnJvb3RDb25maWcgPSByb290Q29uZmlnO1xuICAgIHRoaXMuY21zUGx1Z2luID0gZ2V0Q21zUGx1Z2luKHRoaXMucm9vdENvbmZpZyk7XG5cbiAgICBjb25zdCBjbXNQbHVnaW5PcHRpb25zID0gdGhpcy5jbXNQbHVnaW4uZ2V0Q29uZmlnKCk7XG4gICAgdGhpcy5wcm9qZWN0SWQgPSBjbXNQbHVnaW5PcHRpb25zLmlkIHx8ICdkZWZhdWx0JztcbiAgICB0aGlzLmFwcCA9IHRoaXMuY21zUGx1Z2luLmdldEZpcmViYXNlQXBwKCk7XG4gICAgdGhpcy5kYiA9IGdldEZpcmVzdG9yZSh0aGlzLmFwcCk7XG4gIH1cblxuICAvKipcbiAgICogUmV0cmlldmVzIGRvYyBkYXRhIGZyb20gUm9vdC5qcyBDTVMuXG4gICAqL1xuICBhc3luYyBnZXREb2M8RmllbGRzID0gYW55PihcbiAgICBjb2xsZWN0aW9uSWQ6IHN0cmluZyxcbiAgICBzbHVnOiBzdHJpbmcsXG4gICAgb3B0aW9uczogR2V0RG9jT3B0aW9uc1xuICApOiBQcm9taXNlPERvYzxGaWVsZHM+IHwgbnVsbD4ge1xuICAgIGNvbnN0IHJhd0RhdGEgPSBhd2FpdCB0aGlzLmdldFJhd0RvYyhjb2xsZWN0aW9uSWQsIHNsdWcsIG9wdGlvbnMpO1xuICAgIGlmIChyYXdEYXRhKSB7XG4gICAgICByZXR1cm4gdW5tYXJzaGFsRGF0YShyYXdEYXRhKSBhcyBEb2M8RmllbGRzPjtcbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICAvKipcbiAgICogUmV0cmlldmVzIHJhdyBkb2MgZGF0YSBhcyBzdG9yZWQgaW4gdGhlIGRhdGFiYXNlLiBPbmx5IHVzZSB0aGlzIGlmIHlvdSBrbm93XG4gICAqIHdoYXQgeW91IGFyZSBkb2luZy5cbiAgICovXG4gIGFzeW5jIGdldFJhd0RvYyhcbiAgICBjb2xsZWN0aW9uSWQ6IHN0cmluZyxcbiAgICBzbHVnOiBzdHJpbmcsXG4gICAgb3B0aW9uczogR2V0RG9jT3B0aW9uc1xuICApOiBQcm9taXNlPGFueSB8IG51bGw+IHtcbiAgICBjb25zdCBtb2RlID0gb3B0aW9ucy5tb2RlO1xuICAgIGNvbnN0IG1vZGVDb2xsZWN0aW9uID0gbW9kZSA9PT0gJ2RyYWZ0JyA/ICdEcmFmdHMnIDogJ1B1Ymxpc2hlZCc7XG4gICAgLy8gU2x1Z3Mgd2l0aCBzbGFzaGVzIGFyZSBlbmNvZGVkIGFzIGAtLWAgaW4gdGhlIERCLlxuICAgIHNsdWcgPSBzbHVnLnJlcGxhY2VBbGwoJy8nLCAnLS0nKTtcbiAgICBjb25zdCBkYlBhdGggPSBgUHJvamVjdHMvJHt0aGlzLnByb2plY3RJZH0vQ29sbGVjdGlvbnMvJHtjb2xsZWN0aW9uSWR9LyR7bW9kZUNvbGxlY3Rpb259LyR7c2x1Z31gO1xuICAgIGNvbnN0IGRvY1JlZiA9IHRoaXMuZGIuZG9jKGRiUGF0aCk7XG4gICAgY29uc3QgZG9jID0gYXdhaXQgZG9jUmVmLmdldCgpO1xuICAgIGlmIChkb2MuZXhpc3RzKSB7XG4gICAgICByZXR1cm4gZG9jLmRhdGEoKTtcbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBhc3luYyBzZXRSYXdEb2MoXG4gICAgY29sbGVjdGlvbklkOiBzdHJpbmcsXG4gICAgc2x1Zzogc3RyaW5nLFxuICAgIGRhdGE6IGFueSxcbiAgICBvcHRpb25zOiBTZXREb2NPcHRpb25zXG4gICkge1xuICAgIGNvbnN0IG1vZGUgPSBvcHRpb25zLm1vZGU7XG4gICAgY29uc3QgbW9kZUNvbGxlY3Rpb24gPSBtb2RlID09PSAnZHJhZnQnID8gJ0RyYWZ0cycgOiAnUHVibGlzaGVkJztcbiAgICBjb25zdCBkYlBhdGggPSBgUHJvamVjdHMvJHt0aGlzLnByb2plY3RJZH0vQ29sbGVjdGlvbnMvJHtjb2xsZWN0aW9uSWR9LyR7bW9kZUNvbGxlY3Rpb259LyR7c2x1Z31gO1xuICAgIGNvbnN0IGRvY1JlZiA9IHRoaXMuZGIuZG9jKGRiUGF0aCk7XG4gICAgYXdhaXQgZG9jUmVmLnNldChkYXRhKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBMaXN0cyBkb2NzIGZyb20gYSBSb290LmpzIENNUyBjb2xsZWN0aW9uLlxuICAgKi9cbiAgYXN5bmMgbGlzdERvY3M8VD4oXG4gICAgY29sbGVjdGlvbklkOiBzdHJpbmcsXG4gICAgb3B0aW9uczogTGlzdERvY3NPcHRpb25zXG4gICk6IFByb21pc2U8e2RvY3M6IFRbXX0+IHtcbiAgICBjb25zdCBtb2RlID0gb3B0aW9ucy5tb2RlO1xuICAgIGNvbnN0IG1vZGVDb2xsZWN0aW9uID0gbW9kZSA9PT0gJ2RyYWZ0JyA/ICdEcmFmdHMnIDogJ1B1Ymxpc2hlZCc7XG4gICAgY29uc3QgZGJQYXRoID0gYFByb2plY3RzLyR7dGhpcy5wcm9qZWN0SWR9L0NvbGxlY3Rpb25zLyR7Y29sbGVjdGlvbklkfS8ke21vZGVDb2xsZWN0aW9ufWA7XG4gICAgbGV0IHF1ZXJ5OiBRdWVyeSA9IHRoaXMuZGIuY29sbGVjdGlvbihkYlBhdGgpO1xuICAgIGlmIChvcHRpb25zLmxpbWl0KSB7XG4gICAgICBxdWVyeSA9IHF1ZXJ5LmxpbWl0KG9wdGlvbnMubGltaXQpO1xuICAgIH1cbiAgICBpZiAob3B0aW9ucy5vZmZzZXQpIHtcbiAgICAgIHF1ZXJ5ID0gcXVlcnkub2Zmc2V0KG9wdGlvbnMub2Zmc2V0KTtcbiAgICB9XG4gICAgaWYgKG9wdGlvbnMub3JkZXJCeSkge1xuICAgICAgcXVlcnkgPSBxdWVyeS5vcmRlckJ5KG9wdGlvbnMub3JkZXJCeSwgb3B0aW9ucy5vcmRlckJ5RGlyZWN0aW9uKTtcbiAgICB9XG4gICAgaWYgKG9wdGlvbnMucXVlcnkpIHtcbiAgICAgIHF1ZXJ5ID0gb3B0aW9ucy5xdWVyeShxdWVyeSk7XG4gICAgfVxuICAgIGNvbnN0IHJlc3VsdHMgPSBhd2FpdCBxdWVyeS5nZXQoKTtcbiAgICBjb25zdCBkb2NzOiBUW10gPSBbXTtcbiAgICByZXN1bHRzLmZvckVhY2goKHJlc3VsdCkgPT4ge1xuICAgICAgY29uc3QgZG9jID0gdW5tYXJzaGFsRGF0YShyZXN1bHQuZGF0YSgpKSBhcyBUO1xuICAgICAgZG9jcy5wdXNoKGRvYyk7XG4gICAgfSk7XG4gICAgcmV0dXJuIHtkb2NzfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBudW1iZXIgb2YgZG9jcyBpbiBhIFJvb3QuanMgQ01TIGNvbGxlY3Rpb24uXG4gICAqL1xuICBhc3luYyBnZXREb2NzQ291bnQoY29sbGVjdGlvbklkOiBzdHJpbmcsIG9wdGlvbnM6IEdldENvdW50T3B0aW9ucykge1xuICAgIGNvbnN0IG1vZGUgPSBvcHRpb25zLm1vZGU7XG4gICAgY29uc3QgbW9kZUNvbGxlY3Rpb24gPSBtb2RlID09PSAnZHJhZnQnID8gJ0RyYWZ0cycgOiAnUHVibGlzaGVkJztcbiAgICBjb25zdCBkYlBhdGggPSBgUHJvamVjdHMvJHt0aGlzLnByb2plY3RJZH0vQ29sbGVjdGlvbnMvJHtjb2xsZWN0aW9uSWR9LyR7bW9kZUNvbGxlY3Rpb259YDtcbiAgICBsZXQgcXVlcnk6IFF1ZXJ5ID0gdGhpcy5kYi5jb2xsZWN0aW9uKGRiUGF0aCk7XG4gICAgaWYgKG9wdGlvbnMucXVlcnkpIHtcbiAgICAgIHF1ZXJ5ID0gb3B0aW9ucy5xdWVyeShxdWVyeSk7XG4gICAgfVxuICAgIGNvbnN0IHJlc3VsdHMgPSBhd2FpdCBxdWVyeS5jb3VudCgpLmdldCgpO1xuICAgIGNvbnN0IGNvdW50ID0gcmVzdWx0cy5kYXRhKCkuY291bnQ7XG4gICAgcmV0dXJuIGNvdW50O1xuICB9XG5cbiAgLyoqXG4gICAqIEJhdGNoIHB1Ymxpc2hlcyBhIHNldCBvZiBkb2NzIGJ5IGlkLlxuICAgKi9cbiAgYXN5bmMgcHVibGlzaERvY3MoZG9jSWRzOiBzdHJpbmdbXSwgb3B0aW9ucz86IHtwdWJsaXNoZWRCeTogc3RyaW5nfSkge1xuICAgIGNvbnN0IHByb2plY3RDb2xsZWN0aW9uc1BhdGggPSBgUHJvamVjdHMvJHt0aGlzLnByb2plY3RJZH0vQ29sbGVjdGlvbnNgO1xuICAgIGNvbnN0IHB1Ymxpc2hlZEJ5ID0gb3B0aW9ucz8ucHVibGlzaGVkQnkgfHwgJ3Jvb3QtY21zLWNsaWVudCc7XG5cbiAgICAvLyBGZXRjaCB0aGUgY3VycmVudCBkcmFmdCBkYXRhIGZvciBlYWNoIGRvYy5cbiAgICBjb25zdCBkb2NSZWZzID0gZG9jSWRzLm1hcCgoZG9jSWQpID0+IHtcbiAgICAgIGNvbnN0IFtjb2xsZWN0aW9uLCBzbHVnXSA9IGRvY0lkLnNwbGl0KCcvJyk7XG4gICAgICBpZiAoIWNvbGxlY3Rpb24gfHwgIXNsdWcpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBpbnZhbGlkIGRvYyBpZDogJHtkb2NJZH1gKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGRvY1JlZiA9IHRoaXMuZGIuZG9jKFxuICAgICAgICBgJHtwcm9qZWN0Q29sbGVjdGlvbnNQYXRofS8ke2NvbGxlY3Rpb259L0RyYWZ0cy8ke3NsdWd9YFxuICAgICAgKTtcbiAgICAgIHJldHVybiBkb2NSZWY7XG4gICAgfSk7XG4gICAgY29uc3QgZG9jU25hcHNob3RzID0gYXdhaXQgdGhpcy5kYi5nZXRBbGwoLi4uZG9jUmVmcyk7XG4gICAgY29uc3QgZG9jcyA9IGRvY1NuYXBzaG90c1xuICAgICAgLy8gUmV0cmlldmUgc25hcHNob3QgZGF0YSBmb3IgZWFjaCBkb2MuXG4gICAgICAubWFwKChzbmFwc2hvdCkgPT4gc25hcHNob3QuZGF0YSgpIGFzIERvYylcbiAgICAgIC8vIFJlbW92ZSBkb2NzIHRoYXQgZG9uJ3QgZXhpc3QuXG4gICAgICAuZmlsdGVyKChkKSA9PiAhIWQpO1xuXG4gICAgaWYgKGRvY3MubGVuZ3RoID4gUFVCTElTSF9ET0NTX0JBVENIX0xJTUlUKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBwdWJsaXNoRG9jcygpIGhhcyBhIGxpbWl0IG9mICR7UFVCTElTSF9ET0NTX0JBVENIX0xJTUlUfWBcbiAgICAgICk7XG4gICAgfVxuXG4gICAgaWYgKGRvY3MubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm4gW107XG4gICAgfVxuXG4gICAgLy8gLy8gRWFjaCB0cmFuc2FjdGlvbiBvciBiYXRjaCBjYW4gd3JpdGUgYSBtYXggb2YgNTAwIG9wcy5cbiAgICAvLyAvLyBodHRwczovL2ZpcmViYXNlLmdvb2dsZS5jb20vZG9jcy9maXJlc3RvcmUvbWFuYWdlLWRhdGEvdHJhbnNhY3Rpb25zXG4gICAgbGV0IGJhdGNoQ291bnQgPSAwO1xuICAgIGNvbnN0IGJhdGNoID0gdGhpcy5kYi5iYXRjaCgpO1xuICAgIGNvbnN0IHB1Ymxpc2hlZERvY3M6IGFueVtdID0gW107XG4gICAgZm9yIChjb25zdCBkb2Mgb2YgZG9jcykge1xuICAgICAgY29uc3Qge2lkLCBjb2xsZWN0aW9uLCBzbHVnLCBzeXMsIGZpZWxkc30gPSBkb2M7XG4gICAgICBjb25zdCBkcmFmdFJlZiA9IHRoaXMuZGIuZG9jKFxuICAgICAgICBgJHtwcm9qZWN0Q29sbGVjdGlvbnNQYXRofS8ke2NvbGxlY3Rpb259L0RyYWZ0cy8ke3NsdWd9YFxuICAgICAgKTtcbiAgICAgIGNvbnN0IHNjaGVkdWxlZFJlZiA9IHRoaXMuZGIuZG9jKFxuICAgICAgICBgJHtwcm9qZWN0Q29sbGVjdGlvbnNQYXRofS8ke2NvbGxlY3Rpb259L1NjaGVkdWxlZC8ke3NsdWd9YFxuICAgICAgKTtcbiAgICAgIGNvbnN0IHB1Ymxpc2hlZFJlZiA9IHRoaXMuZGIuZG9jKFxuICAgICAgICBgJHtwcm9qZWN0Q29sbGVjdGlvbnNQYXRofS8ke2NvbGxlY3Rpb259L1B1Ymxpc2hlZC8ke3NsdWd9YFxuICAgICAgKTtcblxuICAgICAgLy8gT25seSB1cGRhdGUgYGZpcnN0UHVibGlzaGVkYCBpZiBpdCBkb2Vzbid0IGFscmVhZHkgZXhpc3QuXG4gICAgICBjb25zdCBmaXJzdFB1Ymxpc2hlZEF0ID1cbiAgICAgICAgc3lzLmZpcnN0UHVibGlzaGVkQXQgPz8gRmllbGRWYWx1ZS5zZXJ2ZXJUaW1lc3RhbXAoKTtcbiAgICAgIGNvbnN0IGZpcnN0UHVibGlzaGVkQnkgPSBzeXMuZmlyc3RQdWJsaXNoZWRCeSA/PyBwdWJsaXNoZWRCeTtcblxuICAgICAgLy8gU2F2ZSBwdWJsaXNoZWQgZG9jLlxuICAgICAgYmF0Y2guc2V0KHB1Ymxpc2hlZFJlZiwge1xuICAgICAgICBpZCxcbiAgICAgICAgY29sbGVjdGlvbixcbiAgICAgICAgc2x1ZyxcbiAgICAgICAgZmllbGRzOiBmaWVsZHMgfHwge30sXG4gICAgICAgIHN5czoge1xuICAgICAgICAgIC4uLnN5cyxcbiAgICAgICAgICBmaXJzdFB1Ymxpc2hlZEF0OiBmaXJzdFB1Ymxpc2hlZEF0LFxuICAgICAgICAgIGZpcnN0UHVibGlzaGVkQnk6IGZpcnN0UHVibGlzaGVkQnksXG4gICAgICAgICAgcHVibGlzaGVkQXQ6IEZpZWxkVmFsdWUuc2VydmVyVGltZXN0YW1wKCksXG4gICAgICAgICAgcHVibGlzaGVkQnk6IHB1Ymxpc2hlZEJ5LFxuICAgICAgICB9LFxuICAgICAgfSk7XG4gICAgICBiYXRjaENvdW50ICs9IDE7XG5cbiAgICAgIC8vIFJlbW92ZSBzY2hlZHVsZWQgZG9jLCBpZiBhbnkuXG4gICAgICBiYXRjaC5kZWxldGUoc2NoZWR1bGVkUmVmKTtcbiAgICAgIGJhdGNoQ291bnQgKz0gMTtcblxuICAgICAgLy8gVXBkYXRlIHRoZSBkcmFmdCBkb2MgdG8gcmVtb3ZlIGBzY2hlZHVsZWRBdGAgYW5kIGBzY2hlZHVsZWRCeWAgZmllbGRzXG4gICAgICAvLyBhbmQgdXBkYXRlIHRoZSBgcHVibGlzaGVkQXRgIGFuZCBgcHVibGlzaGVkQnlgIGZpZWxkcy5cbiAgICAgIGJhdGNoLnVwZGF0ZShkcmFmdFJlZiwge1xuICAgICAgICAnc3lzLnNjaGVkdWxlZEF0JzogRmllbGRWYWx1ZS5kZWxldGUoKSxcbiAgICAgICAgJ3N5cy5zY2hlZHVsZWRCeSc6IEZpZWxkVmFsdWUuZGVsZXRlKCksXG4gICAgICAgICdzeXMuZmlyc3RQdWJsaXNoZWRBdCc6IGZpcnN0UHVibGlzaGVkQXQsXG4gICAgICAgICdzeXMuZmlyc3RQdWJsaXNoZWRCeSc6IGZpcnN0UHVibGlzaGVkQnksXG4gICAgICAgICdzeXMucHVibGlzaGVkQXQnOiBGaWVsZFZhbHVlLnNlcnZlclRpbWVzdGFtcCgpLFxuICAgICAgICAnc3lzLnB1Ymxpc2hlZEJ5JzogcHVibGlzaGVkQnksXG4gICAgICB9KTtcbiAgICAgIGJhdGNoQ291bnQgKz0gMTtcblxuICAgICAgcHVibGlzaGVkRG9jcy5wdXNoKGRvYyk7XG5cbiAgICAgIGlmIChiYXRjaENvdW50ID49IDQ5OCkge1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG5cbiAgICBhd2FpdCBiYXRjaC5jb21taXQoKTtcbiAgICBjb25zb2xlLmxvZyhgcHVibGlzaGVkICR7cHVibGlzaGVkRG9jcy5sZW5ndGh9IGRvY3MhYCk7XG4gICAgcmV0dXJuIHB1Ymxpc2hlZERvY3M7XG4gIH1cblxuICAvKipcbiAgICogUHVibGlzaGVzIHNjaGVkdWxlZCBkb2NzLlxuICAgKi9cbiAgYXN5bmMgcHVibGlzaFNjaGVkdWxlZERvY3MoKSB7XG4gICAgY29uc3QgcHJvamVjdENvbGxlY3Rpb25zUGF0aCA9IGBQcm9qZWN0cy8ke3RoaXMucHJvamVjdElkfS9Db2xsZWN0aW9uc2A7XG4gICAgY29uc3Qgbm93ID0gTWF0aC5jZWlsKG5ldyBEYXRlKCkuZ2V0VGltZSgpKTtcblxuICAgIGNvbnN0IHNuYXBzaG90ID0gYXdhaXQgdGhpcy5kYi5jb2xsZWN0aW9uR3JvdXAoJ1NjaGVkdWxlZCcpLmdldCgpO1xuICAgIGNvbnN0IGRvY3MgPSBzbmFwc2hvdC5kb2NzXG4gICAgICAuZmlsdGVyKChkKSA9PiB7XG4gICAgICAgIC8vIEZpbHRlciBkb2NzIGJ5IHByb2plY3QuXG4gICAgICAgIGlmICghZC5yZWYucGF0aC5zdGFydHNXaXRoKHByb2plY3RDb2xsZWN0aW9uc1BhdGgpKSB7XG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIC8vIEZpbHRlciBkb2NzIHdoZXJlIHNjaGVkdWxlZEF0IGlzIGluIHRoZSBwYXN0LlxuICAgICAgICAvLyBOT1RFKHN0ZXZlbmxlKTogdGhlIGZpbHRlcmluZyBpcyBkb25lIG1hbnVhbGx5IGluc3RlYWQgb2YgdXNpbmcgYSBxdWVyeVxuICAgICAgICAvLyB0byBhdm9pZCBoYXZpbmcgdG8gY3JlYXRlIGFuIGluZGV4IGluIGZpcmVzdG9yZS5cbiAgICAgICAgY29uc3QgZGF0YSA9IGQuZGF0YSgpIHx8IHt9O1xuICAgICAgICBjb25zdCBzY2hlZHVsZWRBdDogVGltZXN0YW1wIHwgdW5kZWZpbmVkID0gZGF0YS5zeXM/LnNjaGVkdWxlZEF0O1xuICAgICAgICByZXR1cm4gKFxuICAgICAgICAgIHNjaGVkdWxlZEF0ICYmIHNjaGVkdWxlZEF0LnRvTWlsbGlzICYmIHNjaGVkdWxlZEF0LnRvTWlsbGlzKCkgPD0gbm93XG4gICAgICAgICk7XG4gICAgICB9KVxuICAgICAgLm1hcCgoZCkgPT4ge1xuICAgICAgICBjb25zdCBkYlBhdGggPSBkLnJlZi5wYXRoO1xuICAgICAgICBjb25zdCBzZWdtZW50cyA9IGRiUGF0aC5zcGxpdCgnLycpO1xuICAgICAgICBjb25zdCBzbHVnID0gc2VnbWVudHMuYXQoLTEpO1xuICAgICAgICBjb25zdCBjb2xsZWN0aW9uID0gc2VnbWVudHMuYXQoLTMpO1xuICAgICAgICBjb25zdCBpZCA9IGAke2NvbGxlY3Rpb259LyR7c2x1Z31gO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIGRhdGE6IGQuZGF0YSgpLFxuICAgICAgICAgIGlkLFxuICAgICAgICAgIGNvbGxlY3Rpb24sXG4gICAgICAgICAgc2x1ZyxcbiAgICAgICAgfTtcbiAgICAgIH0pO1xuXG4gICAgaWYgKGRvY3MubGVuZ3RoID09PSAwKSB7XG4gICAgICBjb25zb2xlLmxvZygnbm8gZG9jcyB0byBzY2hlZHVsZScpO1xuICAgICAgcmV0dXJuIFtdO1xuICAgIH1cblxuICAgIC8vIEVhY2ggdHJhbnNhY3Rpb24gb3IgYmF0Y2ggY2FuIHdyaXRlIGEgbWF4IG9mIDUwMCBvcHMuXG4gICAgLy8gaHR0cHM6Ly9maXJlYmFzZS5nb29nbGUuY29tL2RvY3MvZmlyZXN0b3JlL21hbmFnZS1kYXRhL3RyYW5zYWN0aW9uc1xuICAgIGxldCBiYXRjaENvdW50ID0gMDtcbiAgICBjb25zdCBiYXRjaCA9IHRoaXMuZGIuYmF0Y2goKTtcbiAgICBjb25zdCBwdWJsaXNoZWREb2NzOiBhbnlbXSA9IFtdO1xuICAgIGZvciAoY29uc3QgZG9jIG9mIGRvY3MpIHtcbiAgICAgIGNvbnN0IHtpZCwgY29sbGVjdGlvbiwgc2x1ZywgZGF0YX0gPSBkb2M7XG4gICAgICBjb25zdCBkcmFmdFJlZiA9IHRoaXMuZGIuZG9jKFxuICAgICAgICBgJHtwcm9qZWN0Q29sbGVjdGlvbnNQYXRofS8ke2NvbGxlY3Rpb259L0RyYWZ0cy8ke3NsdWd9YFxuICAgICAgKTtcbiAgICAgIGNvbnN0IHNjaGVkdWxlZFJlZiA9IHRoaXMuZGIuZG9jKFxuICAgICAgICBgJHtwcm9qZWN0Q29sbGVjdGlvbnNQYXRofS8ke2NvbGxlY3Rpb259L1NjaGVkdWxlZC8ke3NsdWd9YFxuICAgICAgKTtcbiAgICAgIGNvbnN0IHB1Ymxpc2hlZFJlZiA9IHRoaXMuZGIuZG9jKFxuICAgICAgICBgJHtwcm9qZWN0Q29sbGVjdGlvbnNQYXRofS8ke2NvbGxlY3Rpb259L1B1Ymxpc2hlZC8ke3NsdWd9YFxuICAgICAgKTtcbiAgICAgIGNvbnN0IHtzY2hlZHVsZWRBdCwgc2NoZWR1bGVkQnksIC4uLnN5c30gPSBkYXRhLnN5cyB8fCB7fTtcblxuICAgICAgLy8gT25seSB1cGRhdGUgYGZpcnN0UHVibGlzaGVkYCBpZiBpdCBkb2Vzbid0IGFscmVhZHkgZXhpc3QuXG4gICAgICBjb25zdCBmaXJzdFB1Ymxpc2hlZEF0ID0gc3lzLmZpcnN0UHVibGlzaGVkQXQgPz8gc2NoZWR1bGVkQXQ7XG4gICAgICBjb25zdCBmaXJzdFB1Ymxpc2hlZEJ5ID1cbiAgICAgICAgc3lzLmZpcnN0UHVibGlzaGVkQnkgPz8gKHNjaGVkdWxlZEJ5IHx8ICdyb290LWNtcy1jbGllbnQnKTtcblxuICAgICAgLy8gU2F2ZSBwdWJsaXNoZWQgZG9jLlxuICAgICAgYmF0Y2guc2V0KHB1Ymxpc2hlZFJlZiwge1xuICAgICAgICBpZCxcbiAgICAgICAgY29sbGVjdGlvbixcbiAgICAgICAgc2x1ZyxcbiAgICAgICAgZmllbGRzOiBkYXRhLmZpZWxkcyB8fCB7fSxcbiAgICAgICAgc3lzOiB7XG4gICAgICAgICAgLi4uc3lzLFxuICAgICAgICAgIGZpcnN0UHVibGlzaGVkQXQ6IGZpcnN0UHVibGlzaGVkQXQsXG4gICAgICAgICAgZmlyc3RQdWJsaXNoZWRCeTogZmlyc3RQdWJsaXNoZWRCeSxcbiAgICAgICAgICBwdWJsaXNoZWRBdDogRmllbGRWYWx1ZS5zZXJ2ZXJUaW1lc3RhbXAoKSxcbiAgICAgICAgICBwdWJsaXNoZWRCeTogc2NoZWR1bGVkQnkgfHwgJycsXG4gICAgICAgIH0sXG4gICAgICB9KTtcbiAgICAgIGJhdGNoQ291bnQgKz0gMTtcblxuICAgICAgLy8gUmVtb3ZlIHB1Ymxpc2hlZCBkb2MuXG4gICAgICBiYXRjaC5kZWxldGUoc2NoZWR1bGVkUmVmKTtcbiAgICAgIGJhdGNoQ291bnQgKz0gMTtcblxuICAgICAgLy8gVXBkYXRlIHRoZSBkcmFmdCBkb2MgdG8gcmVtb3ZlIGBzY2hlZHVsZWRBdGAgYW5kIGBzY2hlZHVsZWRCeWAgZmllbGRzXG4gICAgICAvLyBhbmQgdXBkYXRlIHRoZSBgcHVibGlzaGVkQXRgIGFuZCBgcHVibGlzaGVkQnlgIGZpZWxkcy5cbiAgICAgIGJhdGNoLnVwZGF0ZShkcmFmdFJlZiwge1xuICAgICAgICAnc3lzLnNjaGVkdWxlZEF0JzogRmllbGRWYWx1ZS5kZWxldGUoKSxcbiAgICAgICAgJ3N5cy5zY2hlZHVsZWRCeSc6IEZpZWxkVmFsdWUuZGVsZXRlKCksXG4gICAgICAgICdzeXMuZmlyc3RQdWJsaXNoZWRBdCc6IGZpcnN0UHVibGlzaGVkQXQsXG4gICAgICAgICdzeXMuZmlyc3RQdWJsaXNoZWRCeSc6IGZpcnN0UHVibGlzaGVkQnksXG4gICAgICAgICdzeXMucHVibGlzaGVkQXQnOiBGaWVsZFZhbHVlLnNlcnZlclRpbWVzdGFtcCgpLFxuICAgICAgICAnc3lzLnB1Ymxpc2hlZEJ5Jzogc2NoZWR1bGVkQnkgfHwgJ3Jvb3QtY21zLWNsaWVudCcsXG4gICAgICB9KTtcbiAgICAgIGJhdGNoQ291bnQgKz0gMTtcblxuICAgICAgcHVibGlzaGVkRG9jcy5wdXNoKGRvYyk7XG5cbiAgICAgIGlmIChiYXRjaENvdW50ID49IDQ5OCkge1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG5cbiAgICBhd2FpdCBiYXRjaC5jb21taXQoKTtcbiAgICBjb25zb2xlLmxvZyhgcHVibGlzaGVkICR7cHVibGlzaGVkRG9jcy5sZW5ndGh9IGRvY3MhYCk7XG4gICAgcmV0dXJuIHB1Ymxpc2hlZERvY3M7XG4gIH1cblxuICAvKipcbiAgICogTG9hZHMgdHJhbnNsYXRpb25zIHNhdmVkIGluIHRoZSB0cmFuc2xhdGlvbnMgY29sbGVjdGlvbiwgb3B0aW9uYWxseVxuICAgKiBmaWx0ZXJlZCBieSB0YWcuXG4gICAqXG4gICAqIFJldHVybnMgYSBtYXAgbGlrZTpcbiAgICogYGBgXG4gICAqIHtcbiAgICogICBcIjxoYXNoPlwiOiB7XCJzb3VyY2VcIjogXCJIZWxsb1wiLCBcImVzXCI6IFwiSG9sYVwiLCBcImZyXCI6IFwiQm9uam91clwifSxcbiAgICogfVxuICAgKiBgYGBcbiAgICovXG4gIGFzeW5jIGxvYWRUcmFuc2xhdGlvbnMoXG4gICAgb3B0aW9ucz86IExvYWRUcmFuc2xhdGlvbnNPcHRpb25zXG4gICk6IFByb21pc2U8VHJhbnNsYXRpb25zTWFwPiB7XG4gICAgY29uc3QgZGJQYXRoID0gYFByb2plY3RzLyR7dGhpcy5wcm9qZWN0SWR9L1RyYW5zbGF0aW9uc2A7XG4gICAgbGV0IHF1ZXJ5OiBRdWVyeSA9IHRoaXMuZGIuY29sbGVjdGlvbihkYlBhdGgpO1xuICAgIGlmIChvcHRpb25zPy50YWdzKSB7XG4gICAgICBxdWVyeSA9IHF1ZXJ5LndoZXJlKCd0YWdzJywgJ2FycmF5LWNvbnRhaW5zLWFueScsIG9wdGlvbnMudGFncyk7XG4gICAgfVxuXG4gICAgY29uc3QgcXVlcnlTbmFwc2hvdCA9IGF3YWl0IHF1ZXJ5LmdldCgpO1xuICAgIGNvbnN0IHRyYW5zbGF0aW9uc01hcDogVHJhbnNsYXRpb25zTWFwID0ge307XG4gICAgcXVlcnlTbmFwc2hvdC5mb3JFYWNoKChkb2MpID0+IHtcbiAgICAgIGNvbnN0IGhhc2ggPSBkb2MuaWQ7XG4gICAgICB0cmFuc2xhdGlvbnNNYXBbaGFzaF0gPSBkb2MuZGF0YSgpIGFzIFRyYW5zbGF0aW9uO1xuICAgIH0pO1xuICAgIHJldHVybiB0cmFuc2xhdGlvbnNNYXA7XG4gIH1cblxuICAvKipcbiAgICogU2F2ZXMgYSBtYXAgb2YgdHJhbnNsYXRpb25zLCBlLmcuOlxuICAgKiBgYGBcbiAgICogYXdhaXQgY2xpZW50LnNhdmVUcmFuc2xhdGlvbnMoe1xuICAgKiAgIFwiSGVsbG9cIjoge1wiZXNcIjogXCJIb2xhXCIsIFwiZnJcIjogXCJCb25qb3VyXCJ9LFxuICAgKiB9KTtcbiAgICogYGBgXG4gICAqL1xuICBhc3luYyBzYXZlVHJhbnNsYXRpb25zKFxuICAgIHRyYW5zbGF0aW9uczoge1xuICAgICAgW3NvdXJjZTogc3RyaW5nXToge1tsb2NhbGU6IHN0cmluZ106IHN0cmluZ307XG4gICAgfSxcbiAgICB0YWdzPzogc3RyaW5nW11cbiAgKSB7XG4gICAgY29uc3QgdHJhbnNsYXRpb25zUGF0aCA9IGBQcm9qZWN0cy8ke3RoaXMucHJvamVjdElkfS9UcmFuc2xhdGlvbnNgO1xuICAgIGNvbnN0IGJhdGNoID0gdGhpcy5kYi5iYXRjaCgpO1xuICAgIGxldCBiYXRjaENvdW50ID0gMDtcbiAgICBPYmplY3QuZW50cmllcyh0cmFuc2xhdGlvbnMpLmZvckVhY2goKFtzb3VyY2UsIHNvdXJjZVRyYW5zbGF0aW9uc10pID0+IHtcbiAgICAgIGNvbnN0IGhhc2ggPSB0aGlzLmdldFRyYW5zbGF0aW9uS2V5KHNvdXJjZSk7XG4gICAgICBjb25zdCB0cmFuc2xhdGlvblJlZiA9IHRoaXMuZGIuZG9jKGAke3RyYW5zbGF0aW9uc1BhdGh9LyR7aGFzaH1gKTtcbiAgICAgIGNvbnN0IGRhdGE6IGFueSA9IHtcbiAgICAgICAgLi4uc291cmNlVHJhbnNsYXRpb25zLFxuICAgICAgICBzb3VyY2U6IHRoaXMubm9ybWFsaXplU3RyaW5nKHNvdXJjZSksXG4gICAgICB9O1xuICAgICAgaWYgKHRhZ3MpIHtcbiAgICAgICAgZGF0YS50YWdzID0gdGFncztcbiAgICAgIH1cbiAgICAgIGJhdGNoLnVwZGF0ZSh0cmFuc2xhdGlvblJlZiwgZGF0YSk7XG4gICAgICBiYXRjaENvdW50ICs9IDE7XG4gICAgfSk7XG4gICAgaWYgKGJhdGNoQ291bnQgPiA1MDApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcigndXAgdG8gNTAwIHRyYW5zbGF0aW9ucyBjYW4gYmUgc2F2ZWQgYXQgYSB0aW1lLicpO1xuICAgIH1cbiAgICBhd2FpdCBiYXRjaC5jb21taXQoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBcImtleVwiIHVzZWQgZm9yIGEgdHJhbnNsYXRpb24gYXMgc3RvcmVkIGluIHRoZSBkYi4gVHJhbnNsYXRpb25zXG4gICAqIGFyZSBzdG9yZWQgdW5kZXIgYFByb2plY3RzLzxwcm9qZWN0IGlkPi9UcmFuc2xhdGlvbnMvPHNoYTEgaGFzaD5gLlxuICAgKi9cbiAgZ2V0VHJhbnNsYXRpb25LZXkoc291cmNlOiBzdHJpbmcpIHtcbiAgICBjb25zdCBzaGExID0gY3J5cHRvXG4gICAgICAuY3JlYXRlSGFzaCgnc2hhMScpXG4gICAgICAudXBkYXRlKHRoaXMubm9ybWFsaXplU3RyaW5nKHNvdXJjZSkpXG4gICAgICAuZGlnZXN0KCdoZXgnKTtcbiAgICByZXR1cm4gc2hhMTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDbGVhbnMgYSBzdHJpbmcgdGhhdCdzIHVzZWQgZm9yIHRyYW5zbGF0aW9ucy4gUGVyZm9ybXMgdGhlIGZvbGxvd2luZzpcbiAgICogLSBSZW1vdmVzIGFueSBsZWFkaW5nL3RyYWlsaW5nIHdoaXRlc3BhY2VcbiAgICogLSBSZW1vdmVzIHNwYWNlcyBhdCB0aGUgZW5kIG9mIGFueSBsaW5lXG4gICAqL1xuICBub3JtYWxpemVTdHJpbmcoc3RyOiBzdHJpbmcpIHtcbiAgICBjb25zdCBsaW5lcyA9IFN0cmluZyhzdHIpXG4gICAgICAudHJpbSgpXG4gICAgICAuc3BsaXQoJ1xcbicpXG4gICAgICAubWFwKChsaW5lKSA9PiBsaW5lLnRyaW1FbmQoKSk7XG4gICAgcmV0dXJuIGxpbmVzLmpvaW4oJ1xcbicpO1xuICB9XG5cbiAgLyoqXG4gICAqIExvYWRzIHRyYW5zbGF0aW9ucyBmb3IgYSBwYXJ0aWN1bGFyIGxvY2FsZS5cbiAgICpcbiAgICogUmV0dXJucyBhIG1hcCBsaWtlOlxuICAgKiBgYGBcbiAgICoge1xuICAgKiAgIFwiSGVsbG9cIjogXCJCb25qb3VyXCIsXG4gICAqIH1cbiAgICogYGBgXG4gICAqL1xuICBhc3luYyBsb2FkVHJhbnNsYXRpb25zRm9yTG9jYWxlKFxuICAgIGxvY2FsZTogc3RyaW5nLFxuICAgIG9wdGlvbnM/OiBMb2FkVHJhbnNsYXRpb25zT3B0aW9uc1xuICApOiBQcm9taXNlPExvY2FsZVRyYW5zbGF0aW9ucz4ge1xuICAgIGNvbnN0IHRyYW5zbGF0aW9uc01hcCA9IGF3YWl0IHRoaXMubG9hZFRyYW5zbGF0aW9ucyhvcHRpb25zKTtcbiAgICByZXR1cm4gdHJhbnNsYXRpb25zRm9yTG9jYWxlKHRyYW5zbGF0aW9uc01hcCwgbG9jYWxlKTtcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0Q21zUGx1Z2luKHJvb3RDb25maWc6IFJvb3RDb25maWcpOiBDTVNQbHVnaW4ge1xuICBjb25zdCBwbHVnaW5zOiBQbHVnaW5bXSA9IHJvb3RDb25maWcucGx1Z2lucyB8fCBbXTtcbiAgY29uc3QgcGx1Z2luID0gcGx1Z2lucy5maW5kKChwbHVnaW4pID0+IHBsdWdpbi5uYW1lID09PSAncm9vdC1jbXMnKTtcbiAgaWYgKCFwbHVnaW4pIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ2NvdWxkIG5vdCBmaW5kIHJvb3QtY21zIHBsdWdpbiBjb25maWcgaW4gcm9vdC5jb25maWcudHMnKTtcbiAgfVxuICByZXR1cm4gcGx1Z2luIGFzIENNU1BsdWdpbjtcbn1cblxuLyoqXG4gKiBXYWxrcyB0aGUgZGF0YSB0cmVlIGFuZCBjb252ZXJ0cyBhbnkgVGltZXN0YW1wIG9iamVjdHMgdG8gbWlsbGlzIGFuZCBhbnlcbiAqIF9hcnJheSBtYXBzIHRvIG5vcm1hbCBhcnJheXMuXG4gKlxuICogRS5nLjpcbiAqXG4gKiBub3JtYWxpemVEYXRhKHtcbiAqICAgc3lzOiB7bW9kaWZpZWRBdDogVGltZXN0YW1wKDEyMyl9LFxuICogICBmaWVsZHM6IHtcbiAqICAgICBfYXJyYXk6IFsnYXNkZiddLFxuICogICAgIGFzZGY6IHt0aXRsZTogJ2hlbGxvJ31cbiAqICAgfVxuICogfSlcbiAqIC8vID0+IHtzeXM6IHttb2RpZmllZEF0OiAxMjN9LCBmaWVsZHM6IHtmb286IFt7dGl0bGU6ICdoZWxsbyd9XX19XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB1bm1hcnNoYWxEYXRhKGRhdGE6IGFueSk6IGFueSB7XG4gIGNvbnN0IHJlc3VsdDogYW55ID0ge307XG4gIGZvciAoY29uc3Qga2V5IGluIGRhdGEpIHtcbiAgICBjb25zdCB2YWwgPSBkYXRhW2tleV07XG4gICAgaWYgKGlzT2JqZWN0KHZhbCkpIHtcbiAgICAgIGlmICh2YWwudG9NaWxsaXMpIHtcbiAgICAgICAgcmVzdWx0W2tleV0gPSB2YWwudG9NaWxsaXMoKTtcbiAgICAgIH0gZWxzZSBpZiAoT2JqZWN0Lmhhc093bih2YWwsICdfYXJyYXknKSAmJiBBcnJheS5pc0FycmF5KHZhbC5fYXJyYXkpKSB7XG4gICAgICAgIGNvbnN0IGFyciA9IHZhbC5fYXJyYXkubWFwKChhcnJheUtleTogc3RyaW5nKSA9PiB7XG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIC4uLnVubWFyc2hhbERhdGEodmFsW2FycmF5S2V5XSB8fCB7fSksXG4gICAgICAgICAgICBfYXJyYXlLZXk6IGFycmF5S2V5LFxuICAgICAgICAgIH07XG4gICAgICAgIH0pO1xuICAgICAgICByZXN1bHRba2V5XSA9IGFycjtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJlc3VsdFtrZXldID0gdW5tYXJzaGFsRGF0YSh2YWwpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICByZXN1bHRba2V5XSA9IHZhbDtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuLyoqIEBkZXByZWNhdGVkIFVzZSBgdW5tYXJzaGFsRGF0YSgpYCBpbnN0ZWFkLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG5vcm1hbGl6ZURhdGEoZGF0YTogYW55KTogYW55IHtcbiAgcmV0dXJuIHVubWFyc2hhbERhdGEoZGF0YSk7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQXJyYXlPYmplY3Qge1xuICBba2V5OiBzdHJpbmddOiBhbnk7XG4gIF9hcnJheTogc3RyaW5nW107XG59XG5cbi8qKlxuICogU2VyaWFsaXplcyBhbiBhcnJheSBpbnRvIGFuIGBBcnJheU9iamVjdGAsIGUuZy46XG4gKlxuICogYGBgXG4gKiBtYXJzaGFsQXJyYXkoWzEsIDIsIDNdKVxuICogLy8gPT4ge2E6IDEsIGI6IDIsIGM6IDMsIF9hcnJheTogWydhJywgJ2InLCAnYyddfVxuICogYGBgXG4gKlxuICogVGhpcyBkYXRhYmFzZSBzdG9yYWdlIG1ldGhvZCBtYWtlcyBpdCBlYXNpZXIgdG8gdXBkYXRlIGEgc2luZ2xlIGZpZWxkIGluIGFcbiAqIGRlZXBseSBuZXN0ZWQgYXJyYXkgb2JqZWN0LlxuICovXG5leHBvcnQgZnVuY3Rpb24gbWFyc2hhbEFycmF5KGFycjogYW55W10pOiBBcnJheU9iamVjdCB7XG4gIGlmICghQXJyYXkuaXNBcnJheShhcnIpKSB7XG4gICAgcmV0dXJuIGFycjtcbiAgfVxuICBjb25zdCBhcnJPYmplY3Q6IEFycmF5T2JqZWN0ID0ge19hcnJheTogW119O1xuICBmb3IgKGNvbnN0IGl0ZW0gb2YgYXJyKSB7XG4gICAgY29uc3Qga2V5ID0gcmFuZFN0cmluZyg2KTtcbiAgICBhcnJPYmplY3Rba2V5XSA9IGl0ZW07XG4gICAgYXJyT2JqZWN0Ll9hcnJheS5wdXNoKGtleSk7XG4gIH1cbiAgcmV0dXJuIGFyck9iamVjdDtcbn1cblxuLyoqXG4gKiBDb252ZXJ0cyBhbiBgQXJyYXlPYmplY3RgIHRvIGEgbm9ybWFsIGFycmF5LlxuICovXG5leHBvcnQgZnVuY3Rpb24gdW5tYXJzaGFsQXJyYXkoYXJyT2JqZWN0OiBBcnJheU9iamVjdCk6IGFueVtdIHtcbiAgaWYgKCFBcnJheS5pc0FycmF5KGFyck9iamVjdD8uX2FycmF5KSkge1xuICAgIHJldHVybiBbXTtcbiAgfVxuICBjb25zdCBhcnIgPSBhcnJPYmplY3QuX2FycmF5Lm1hcCgoazogc3RyaW5nKSA9PiBhcnJPYmplY3Rba10pO1xuICByZXR1cm4gYXJyO1xufVxuXG5mdW5jdGlvbiBpc09iamVjdChkYXRhOiBhbnkpOiBib29sZWFuIHtcbiAgcmV0dXJuIHR5cGVvZiBkYXRhID09PSAnb2JqZWN0JyAmJiAhQXJyYXkuaXNBcnJheShkYXRhKSAmJiBkYXRhICE9PSBudWxsO1xufVxuXG5mdW5jdGlvbiByYW5kU3RyaW5nKGxlbjogbnVtYmVyKTogc3RyaW5nIHtcbiAgY29uc3QgcmVzdWx0ID0gW107XG4gIGNvbnN0IGNoYXJzID1cbiAgICAnQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODknO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgY29uc3QgcmFuZCA9IE1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSAqIGNoYXJzLmxlbmd0aCk7XG4gICAgcmVzdWx0LnB1c2goY2hhcnMuY2hhckF0KHJhbmQpKTtcbiAgfVxuICByZXR1cm4gcmVzdWx0LmpvaW4oJycpO1xufVxuXG4vKipcbiAqIENvbnZlcnRzIGEgdHJhbnNsYXRpb25zIG1hcCBmcm9tIGBsb2FkVHJhbnNsYXRpb25zKClgIHRvIGEgbWFwIG9mIHNvdXJjZSB0b1xuICogdHJhbnNsYXRlZCBzdHJpbmcgZm9yIGEgcGFydGljdWxhciBsb2NhbGUuXG4gKlxuICogUmV0dXJucyBhIG1hcCBsaWtlOlxuICogYGBgXG4gKiB7XG4gKiAgIFwiSGVsbG9cIjogXCJCb25qb3VyXCIsXG4gKiB9XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRyYW5zbGF0aW9uc0ZvckxvY2FsZShcbiAgdHJhbnNsYXRpb25zTWFwOiBUcmFuc2xhdGlvbnNNYXAsXG4gIGxvY2FsZTogc3RyaW5nXG4pIHtcbiAgY29uc3QgbG9jYWxlVHJhbnNsYXRpb25zOiBMb2NhbGVUcmFuc2xhdGlvbnMgPSB7fTtcbiAgT2JqZWN0LnZhbHVlcyh0cmFuc2xhdGlvbnNNYXApLmZvckVhY2goKHN0cmluZykgPT4ge1xuICAgIGNvbnN0IHNvdXJjZSA9IHN0cmluZy5zb3VyY2U7XG4gICAgY29uc3QgdHJhbnNsYXRpb24gPSBzdHJpbmdbbG9jYWxlXSB8fCBzdHJpbmcuZW4gfHwgc3RyaW5nLnNvdXJjZTtcbiAgICBsb2NhbGVUcmFuc2xhdGlvbnNbc291cmNlXSA9IHRyYW5zbGF0aW9uO1xuICB9KTtcbiAgcmV0dXJuIGxvY2FsZVRyYW5zbGF0aW9ucztcbn1cbiIsICIvKiogQGRlcHJlY2F0ZWQgVXNlIGNsaWVudC50cyBpbnN0ZWFkLiAqL1xuXG5pbXBvcnQge1Jvb3RDb25maWd9IGZyb20gJ0BibGlua2svcm9vdCc7XG5pbXBvcnQge1xuICBGaWVsZFZhbHVlLFxuICBRdWVyeSxcbiAgVGltZXN0YW1wLFxuICBnZXRGaXJlc3RvcmUsXG59IGZyb20gJ2ZpcmViYXNlLWFkbWluL2ZpcmVzdG9yZSc7XG5pbXBvcnQge1xuICBMb2FkVHJhbnNsYXRpb25zT3B0aW9ucyxcbiAgTG9jYWxlVHJhbnNsYXRpb25zLFxuICBUcmFuc2xhdGlvbixcbiAgVHJhbnNsYXRpb25zTWFwLFxuICBnZXRDbXNQbHVnaW4sXG4gIHRyYW5zbGF0aW9uc0ZvckxvY2FsZSxcbiAgdW5tYXJzaGFsRGF0YSxcbn0gZnJvbSAnLi9jbGllbnQuanMnO1xuXG4vKipcbiAqIFJldHJpZXZlcyBhIGRvYyBmcm9tIFJvb3QuanMgQ01TLlxuICogQGRlcHJlY2F0ZWQgVXNlIFJvb3RDTVNDbGllbnQuZ2V0RG9jKCkgaW5zdGVhZC5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdldERvYzxUPihcbiAgcm9vdENvbmZpZzogUm9vdENvbmZpZyxcbiAgY29sbGVjdGlvbklkOiBzdHJpbmcsXG4gIHNsdWc6IHN0cmluZyxcbiAgb3B0aW9uczoge1xuICAgIG1vZGU6ICdkcmFmdCcgfCAncHVibGlzaGVkJztcbiAgfVxuKTogUHJvbWlzZTxUIHwgbnVsbD4ge1xuICBjb25zdCBjbXNQbHVnaW4gPSBnZXRDbXNQbHVnaW4ocm9vdENvbmZpZyk7XG4gIGNvbnN0IGNtc1BsdWdpbk9wdGlvbnMgPSBjbXNQbHVnaW4uZ2V0Q29uZmlnKCk7XG4gIGNvbnN0IHByb2plY3RJZCA9IGNtc1BsdWdpbk9wdGlvbnMuaWQgfHwgJ2RlZmF1bHQnO1xuICBjb25zdCBtb2RlID0gb3B0aW9ucy5tb2RlO1xuICBjb25zdCBtb2RlQ29sbGVjdGlvbiA9IG1vZGUgPT09ICdkcmFmdCcgPyAnRHJhZnRzJyA6ICdQdWJsaXNoZWQnO1xuICBjb25zdCBhcHAgPSBjbXNQbHVnaW4uZ2V0RmlyZWJhc2VBcHAoKTtcbiAgY29uc3QgZGIgPSBnZXRGaXJlc3RvcmUoYXBwKTtcbiAgLy8gU2x1Z3Mgd2l0aCBzbGFzaGVzIGFyZSBlbmNvZGVkIGFzIGAtLWAgaW4gdGhlIERCLlxuICBzbHVnID0gc2x1Zy5yZXBsYWNlQWxsKCcvJywgJy0tJyk7XG4gIGNvbnN0IGRiUGF0aCA9IGBQcm9qZWN0cy8ke3Byb2plY3RJZH0vQ29sbGVjdGlvbnMvJHtjb2xsZWN0aW9uSWR9LyR7bW9kZUNvbGxlY3Rpb259LyR7c2x1Z31gO1xuICBjb25zdCBkb2NSZWYgPSBkYi5kb2MoZGJQYXRoKTtcbiAgY29uc3QgZG9jID0gYXdhaXQgZG9jUmVmLmdldCgpO1xuICBpZiAoZG9jLmV4aXN0cykge1xuICAgIGNvbnN0IGRhdGEgPSBkb2MuZGF0YSgpO1xuICAgIHJldHVybiB1bm1hcnNoYWxEYXRhKGRhdGEpIGFzIFQ7XG4gIH1cbiAgY29uc29sZS5sb2coYGRvYyBub3QgZm91bmQ6ICR7ZGJQYXRofWApO1xuICByZXR1cm4gbnVsbDtcbn1cblxuLyoqXG4gKiBMaXN0cyBkb2NzIGZyb20gYSBSb290LmpzIENNUyBjb2xsZWN0aW9uLlxuICogQGRlcHJlY2F0ZWQgVXNlIFJvb3RDTVNDbGllbnQubGlzdERvY3MoKSBpbnN0ZWFkLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gbGlzdERvY3M8VD4oXG4gIHJvb3RDb25maWc6IFJvb3RDb25maWcsXG4gIGNvbGxlY3Rpb25JZDogc3RyaW5nLFxuICBvcHRpb25zOiB7XG4gICAgbW9kZTogJ2RyYWZ0JyB8ICdwdWJsaXNoZWQnO1xuICAgIG9mZnNldD86IG51bWJlcjtcbiAgICBsaW1pdD86IG51bWJlcjtcbiAgICBvcmRlckJ5Pzogc3RyaW5nO1xuICAgIG9yZGVyQnlEaXJlY3Rpb24/OiAnYXNjJyB8ICdkZXNjJztcbiAgICBxdWVyeT86IChxdWVyeTogUXVlcnkpID0+IFF1ZXJ5O1xuICB9XG4pOiBQcm9taXNlPHtkb2NzOiBUW119PiB7XG4gIGNvbnN0IGNtc1BsdWdpbiA9IGdldENtc1BsdWdpbihyb290Q29uZmlnKTtcbiAgY29uc3QgY21zUGx1Z2luT3B0aW9ucyA9IGNtc1BsdWdpbi5nZXRDb25maWcoKTtcbiAgY29uc3QgcHJvamVjdElkID0gY21zUGx1Z2luT3B0aW9ucy5pZCB8fCAnZGVmYXVsdCc7XG4gIGNvbnN0IG1vZGUgPSBvcHRpb25zLm1vZGU7XG4gIGNvbnN0IG1vZGVDb2xsZWN0aW9uID0gbW9kZSA9PT0gJ2RyYWZ0JyA/ICdEcmFmdHMnIDogJ1B1Ymxpc2hlZCc7XG4gIGNvbnN0IGFwcCA9IGNtc1BsdWdpbi5nZXRGaXJlYmFzZUFwcCgpO1xuICBjb25zdCBkYiA9IGdldEZpcmVzdG9yZShhcHApO1xuICBjb25zdCBkYlBhdGggPSBgUHJvamVjdHMvJHtwcm9qZWN0SWR9L0NvbGxlY3Rpb25zLyR7Y29sbGVjdGlvbklkfS8ke21vZGVDb2xsZWN0aW9ufWA7XG4gIGxldCBxdWVyeTogUXVlcnkgPSBkYi5jb2xsZWN0aW9uKGRiUGF0aCk7XG4gIGlmIChvcHRpb25zLmxpbWl0KSB7XG4gICAgcXVlcnkgPSBxdWVyeS5saW1pdChvcHRpb25zLmxpbWl0KTtcbiAgfVxuICBpZiAob3B0aW9ucy5vZmZzZXQpIHtcbiAgICBxdWVyeSA9IHF1ZXJ5Lm9mZnNldChvcHRpb25zLm9mZnNldCk7XG4gIH1cbiAgaWYgKG9wdGlvbnMub3JkZXJCeSkge1xuICAgIHF1ZXJ5ID0gcXVlcnkub3JkZXJCeShvcHRpb25zLm9yZGVyQnksIG9wdGlvbnMub3JkZXJCeURpcmVjdGlvbik7XG4gIH1cbiAgaWYgKG9wdGlvbnMucXVlcnkpIHtcbiAgICBxdWVyeSA9IG9wdGlvbnMucXVlcnkocXVlcnkpO1xuICB9XG4gIGNvbnN0IHJlc3VsdHMgPSBhd2FpdCBxdWVyeS5nZXQoKTtcbiAgY29uc3QgZG9jczogVFtdID0gW107XG4gIHJlc3VsdHMuZm9yRWFjaCgocmVzdWx0KSA9PiB7XG4gICAgY29uc3QgZG9jID0gdW5tYXJzaGFsRGF0YShyZXN1bHQuZGF0YSgpKSBhcyBUO1xuICAgIGRvY3MucHVzaChkb2MpO1xuICB9KTtcbiAgcmV0dXJuIHtkb2NzfTtcbn1cblxuLyoqXG4gKiBSZXR1cm5zIHRoZSBudW1iZXIgb2YgZG9jcyBpbiBhIFJvb3QuanMgQ01TIGNvbGxlY3Rpb24uXG4gKiBAZGVwcmVjYXRlZCBVc2UgUm9vdENNU0NsaWVudC5nZXREb2NzQ291bnQoKSBpbnN0ZWFkLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gbnVtRG9jcyhcbiAgcm9vdENvbmZpZzogUm9vdENvbmZpZyxcbiAgY29sbGVjdGlvbklkOiBzdHJpbmcsXG4gIG9wdGlvbnM6IHtcbiAgICBtb2RlOiAnZHJhZnQnIHwgJ3B1Ymxpc2hlZCc7XG4gICAgcXVlcnk/OiAocXVlcnk6IFF1ZXJ5KSA9PiBRdWVyeTtcbiAgfVxuKSB7XG4gIGNvbnN0IGNtc1BsdWdpbiA9IGdldENtc1BsdWdpbihyb290Q29uZmlnKTtcbiAgY29uc3QgY21zUGx1Z2luT3B0aW9ucyA9IGNtc1BsdWdpbi5nZXRDb25maWcoKTtcbiAgY29uc3QgcHJvamVjdElkID0gY21zUGx1Z2luT3B0aW9ucy5pZCB8fCAnZGVmYXVsdCc7XG4gIGNvbnN0IG1vZGUgPSBvcHRpb25zLm1vZGU7XG4gIGNvbnN0IG1vZGVDb2xsZWN0aW9uID0gbW9kZSA9PT0gJ2RyYWZ0JyA/ICdEcmFmdHMnIDogJ1B1Ymxpc2hlZCc7XG4gIGNvbnN0IGFwcCA9IGNtc1BsdWdpbi5nZXRGaXJlYmFzZUFwcCgpO1xuICBjb25zdCBkYiA9IGdldEZpcmVzdG9yZShhcHApO1xuICBjb25zdCBkYlBhdGggPSBgUHJvamVjdHMvJHtwcm9qZWN0SWR9L0NvbGxlY3Rpb25zLyR7Y29sbGVjdGlvbklkfS8ke21vZGVDb2xsZWN0aW9ufWA7XG4gIGxldCBxdWVyeTogUXVlcnkgPSBkYi5jb2xsZWN0aW9uKGRiUGF0aCk7XG4gIGlmIChvcHRpb25zLnF1ZXJ5KSB7XG4gICAgcXVlcnkgPSBvcHRpb25zLnF1ZXJ5KHF1ZXJ5KTtcbiAgfVxuICBjb25zdCByZXN1bHRzID0gYXdhaXQgcXVlcnkuY291bnQoKS5nZXQoKTtcbiAgY29uc3QgY291bnQgPSByZXN1bHRzLmRhdGEoKS5jb3VudDtcbiAgcmV0dXJuIGNvdW50O1xufVxuXG4vKipcbiAqIFB1Ymxpc2hlcyBzY2hlZHVsZWQgZG9jcy5cbiAqIEBkZXByZWNhdGVkIFVzZSBSb290Q01TQ2xpZW50LnB1Ymxpc2hTY2hlZHVsZWREb2NzKCkgaW5zdGVhZC5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHB1Ymxpc2hTY2hlZHVsZWREb2NzKHJvb3RDb25maWc6IFJvb3RDb25maWcpIHtcbiAgY29uc3QgY21zUGx1Z2luID0gZ2V0Q21zUGx1Z2luKHJvb3RDb25maWcpO1xuICBjb25zdCBjbXNQbHVnaW5PcHRpb25zID0gY21zUGx1Z2luLmdldENvbmZpZygpO1xuICBjb25zdCBwcm9qZWN0SWQgPSBjbXNQbHVnaW5PcHRpb25zLmlkIHx8ICdkZWZhdWx0JztcbiAgY29uc3QgYXBwID0gY21zUGx1Z2luLmdldEZpcmViYXNlQXBwKCk7XG4gIGNvbnN0IGRiID0gZ2V0RmlyZXN0b3JlKGFwcCk7XG5cbiAgY29uc3QgcHJvamVjdENvbGxlY3Rpb25zUGF0aCA9IGBQcm9qZWN0cy8ke3Byb2plY3RJZH0vQ29sbGVjdGlvbnNgO1xuICBjb25zdCBub3cgPSBNYXRoLmNlaWwobmV3IERhdGUoKS5nZXRUaW1lKCkpO1xuXG4gIGNvbnN0IHNuYXBzaG90ID0gYXdhaXQgZGIuY29sbGVjdGlvbkdyb3VwKCdTY2hlZHVsZWQnKS5nZXQoKTtcbiAgY29uc3QgZG9jcyA9IHNuYXBzaG90LmRvY3NcbiAgICAuZmlsdGVyKChkKSA9PiB7XG4gICAgICAvLyBGaWx0ZXIgZG9jcyBieSBwcm9qZWN0LlxuICAgICAgaWYgKCFkLnJlZi5wYXRoLnN0YXJ0c1dpdGgocHJvamVjdENvbGxlY3Rpb25zUGF0aCkpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgICAgLy8gRmlsdGVyIGRvY3Mgd2hlcmUgc2NoZWR1bGVkQXQgaXMgaW4gdGhlIHBhc3QuXG4gICAgICAvLyBOT1RFKHN0ZXZlbmxlKTogdGhlIGZpbHRlcmluZyBpcyBkb25lIG1hbnVhbGx5IGluc3RlYWQgb2YgdXNpbmcgYSBxdWVyeVxuICAgICAgLy8gdG8gYXZvaWQgaGF2aW5nIHRvIGNyZWF0ZSBhbiBpbmRleCBpbiBmaXJlc3RvcmUuXG4gICAgICBjb25zdCBkYXRhID0gZC5kYXRhKCkgfHwge307XG4gICAgICBjb25zdCBzY2hlZHVsZWRBdDogVGltZXN0YW1wIHwgdW5kZWZpbmVkID0gZGF0YS5zeXM/LnNjaGVkdWxlZEF0O1xuICAgICAgcmV0dXJuIChcbiAgICAgICAgc2NoZWR1bGVkQXQgJiYgc2NoZWR1bGVkQXQudG9NaWxsaXMgJiYgc2NoZWR1bGVkQXQudG9NaWxsaXMoKSA8PSBub3dcbiAgICAgICk7XG4gICAgfSlcbiAgICAubWFwKChkKSA9PiB7XG4gICAgICBjb25zdCBkYlBhdGggPSBkLnJlZi5wYXRoO1xuICAgICAgY29uc3Qgc2VnbWVudHMgPSBkYlBhdGguc3BsaXQoJy8nKTtcbiAgICAgIGNvbnN0IHNsdWcgPSBzZWdtZW50cy5hdCgtMSk7XG4gICAgICBjb25zdCBjb2xsZWN0aW9uID0gc2VnbWVudHMuYXQoLTMpO1xuICAgICAgY29uc3QgaWQgPSBgJHtjb2xsZWN0aW9ufS8ke3NsdWd9YDtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGRhdGE6IGQuZGF0YSgpLFxuICAgICAgICBpZCxcbiAgICAgICAgY29sbGVjdGlvbixcbiAgICAgICAgc2x1ZyxcbiAgICAgIH07XG4gICAgfSk7XG5cbiAgaWYgKGRvY3MubGVuZ3RoID09PSAwKSB7XG4gICAgcmV0dXJuIFtdO1xuICB9XG5cbiAgLy8gRWFjaCB0cmFuc2FjdGlvbiBvciBiYXRjaCBjYW4gd3JpdGUgYSBtYXggb2YgNTAwIG9wcy5cbiAgLy8gaHR0cHM6Ly9maXJlYmFzZS5nb29nbGUuY29tL2RvY3MvZmlyZXN0b3JlL21hbmFnZS1kYXRhL3RyYW5zYWN0aW9uc1xuICBsZXQgYmF0Y2hDb3VudCA9IDA7XG4gIGNvbnN0IGJhdGNoID0gZGIuYmF0Y2goKTtcbiAgY29uc3QgcHVibGlzaGVkRG9jczogYW55W10gPSBbXTtcbiAgZm9yIChjb25zdCBkb2Mgb2YgZG9jcykge1xuICAgIGNvbnN0IHtpZCwgY29sbGVjdGlvbiwgc2x1ZywgZGF0YX0gPSBkb2M7XG4gICAgY29uc3QgZHJhZnRSZWYgPSBkYi5kb2MoXG4gICAgICBgJHtwcm9qZWN0Q29sbGVjdGlvbnNQYXRofS8ke2NvbGxlY3Rpb259L0RyYWZ0cy8ke3NsdWd9YFxuICAgICk7XG4gICAgY29uc3Qgc2NoZWR1bGVkUmVmID0gZGIuZG9jKFxuICAgICAgYCR7cHJvamVjdENvbGxlY3Rpb25zUGF0aH0vJHtjb2xsZWN0aW9ufS9TY2hlZHVsZWQvJHtzbHVnfWBcbiAgICApO1xuICAgIGNvbnN0IHB1Ymxpc2hlZFJlZiA9IGRiLmRvYyhcbiAgICAgIGAke3Byb2plY3RDb2xsZWN0aW9uc1BhdGh9LyR7Y29sbGVjdGlvbn0vUHVibGlzaGVkLyR7c2x1Z31gXG4gICAgKTtcbiAgICBjb25zdCB7c2NoZWR1bGVkQXQsIHNjaGVkdWxlZEJ5LCAuLi5zeXN9ID0gZGF0YS5zeXMgfHwge307XG5cbiAgICAvLyBPbmx5IHVwZGF0ZSBgZmlyc3RQdWJsaXNoZWRgIGlmIGl0IGRvZXNuJ3QgYWxyZWFkeSBleGlzdC5cbiAgICBjb25zdCBmaXJzdFB1Ymxpc2hlZEF0ID0gc3lzLmZpcnN0UHVibGlzaGVkQXQgPz8gc2NoZWR1bGVkQXQ7XG4gICAgY29uc3QgZmlyc3RQdWJsaXNoZWRCeSA9IHN5cy5maXJzdFB1Ymxpc2hlZEJ5ID8/IChzY2hlZHVsZWRCeSB8fCAnJyk7XG5cbiAgICAvLyBTYXZlIHB1Ymxpc2hlZCBkb2MuXG4gICAgYmF0Y2guc2V0KHB1Ymxpc2hlZFJlZiwge1xuICAgICAgaWQsXG4gICAgICBjb2xsZWN0aW9uLFxuICAgICAgc2x1ZyxcbiAgICAgIGZpZWxkczogZGF0YS5maWVsZHMgfHwge30sXG4gICAgICBzeXM6IHtcbiAgICAgICAgLi4uc3lzLFxuICAgICAgICBmaXJzdFB1Ymxpc2hlZEF0OiBmaXJzdFB1Ymxpc2hlZEF0LFxuICAgICAgICBmaXJzdFB1Ymxpc2hlZEJ5OiBmaXJzdFB1Ymxpc2hlZEJ5LFxuICAgICAgICBwdWJsaXNoZWRBdDogRmllbGRWYWx1ZS5zZXJ2ZXJUaW1lc3RhbXAoKSxcbiAgICAgICAgcHVibGlzaGVkQnk6IHNjaGVkdWxlZEJ5IHx8ICcnLFxuICAgICAgfSxcbiAgICB9KTtcbiAgICBiYXRjaENvdW50ICs9IDE7XG5cbiAgICAvLyBSZW1vdmUgcHVibGlzaGVkIGRvYy5cbiAgICBiYXRjaC5kZWxldGUoc2NoZWR1bGVkUmVmKTtcbiAgICBiYXRjaENvdW50ICs9IDE7XG5cbiAgICAvLyBVcGRhdGUgdGhlIGRyYWZ0IGRvYyB0byByZW1vdmUgYHNjaGVkdWxlZEF0YCBhbmQgYHNjaGVkdWxlZEJ5YCBmaWVsZHNcbiAgICAvLyBhbmQgdXBkYXRlIHRoZSBgcHVibGlzaGVkQXRgIGFuZCBgcHVibGlzaGVkQnlgIGZpZWxkcy5cbiAgICBiYXRjaC51cGRhdGUoZHJhZnRSZWYsIHtcbiAgICAgICdzeXMuc2NoZWR1bGVkQXQnOiBGaWVsZFZhbHVlLmRlbGV0ZSgpLFxuICAgICAgJ3N5cy5zY2hlZHVsZWRCeSc6IEZpZWxkVmFsdWUuZGVsZXRlKCksXG4gICAgICAnc3lzLmZpcnN0UHVibGlzaGVkQXQnOiBmaXJzdFB1Ymxpc2hlZEF0LFxuICAgICAgJ3N5cy5maXJzdFB1Ymxpc2hlZEJ5JzogZmlyc3RQdWJsaXNoZWRCeSxcbiAgICAgICdzeXMucHVibGlzaGVkQXQnOiBGaWVsZFZhbHVlLnNlcnZlclRpbWVzdGFtcCgpLFxuICAgICAgJ3N5cy5wdWJsaXNoZWRCeSc6IHNjaGVkdWxlZEJ5IHx8ICcnLFxuICAgIH0pO1xuICAgIGJhdGNoQ291bnQgKz0gMTtcblxuICAgIHB1Ymxpc2hlZERvY3MucHVzaChkb2MpO1xuXG4gICAgaWYgKGJhdGNoQ291bnQgPj0gNDk4KSB7XG4gICAgICBicmVhaztcbiAgICB9XG4gIH1cblxuICBhd2FpdCBiYXRjaC5jb21taXQoKTtcbiAgY29uc29sZS5sb2coYHB1Ymxpc2hlZCAke3B1Ymxpc2hlZERvY3MubGVuZ3RofSBkb2NzIWApO1xuICByZXR1cm4gcHVibGlzaGVkRG9jcztcbn1cblxuLyoqXG4gKiBAZGVwcmVjYXRlZCBVc2UgYFJvb3RDTVNDbGllbnQubG9hZFRyYW5zbGF0aW9ucygpYC5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGxvYWRUcmFuc2xhdGlvbnMoXG4gIHJvb3RDb25maWc6IFJvb3RDb25maWcsXG4gIG9wdGlvbnM/OiBMb2FkVHJhbnNsYXRpb25zT3B0aW9uc1xuKTogUHJvbWlzZTxUcmFuc2xhdGlvbnNNYXA+IHtcbiAgY29uc3QgY21zUGx1Z2luID0gZ2V0Q21zUGx1Z2luKHJvb3RDb25maWcpO1xuICBjb25zdCBjbXNQbHVnaW5PcHRpb25zID0gY21zUGx1Z2luLmdldENvbmZpZygpO1xuICBjb25zdCBwcm9qZWN0SWQgPSBjbXNQbHVnaW5PcHRpb25zLmlkIHx8ICdkZWZhdWx0JztcbiAgY29uc3QgYXBwID0gY21zUGx1Z2luLmdldEZpcmViYXNlQXBwKCk7XG4gIGNvbnN0IGRiID0gZ2V0RmlyZXN0b3JlKGFwcCk7XG5cbiAgY29uc3QgZGJQYXRoID0gYFByb2plY3RzLyR7cHJvamVjdElkfS9UcmFuc2xhdGlvbnNgO1xuICBsZXQgcXVlcnk6IFF1ZXJ5ID0gZGIuY29sbGVjdGlvbihkYlBhdGgpO1xuICBpZiAob3B0aW9ucz8udGFncykge1xuICAgIHF1ZXJ5ID0gcXVlcnkud2hlcmUoJ3RhZ3MnLCAnYXJyYXktY29udGFpbnMtYW55Jywgb3B0aW9ucy50YWdzKTtcbiAgfVxuXG4gIGNvbnN0IHF1ZXJ5U25hcHNob3QgPSBhd2FpdCBxdWVyeS5nZXQoKTtcbiAgY29uc3QgdHJhbnNsYXRpb25zTWFwOiBUcmFuc2xhdGlvbnNNYXAgPSB7fTtcbiAgcXVlcnlTbmFwc2hvdC5mb3JFYWNoKChkb2MpID0+IHtcbiAgICBjb25zdCBoYXNoID0gZG9jLmlkO1xuICAgIHRyYW5zbGF0aW9uc01hcFtoYXNoXSA9IGRvYy5kYXRhKCkgYXMgVHJhbnNsYXRpb247XG4gIH0pO1xuICByZXR1cm4gdHJhbnNsYXRpb25zTWFwO1xufVxuXG4vKipcbiAqIEBkZXByZWNhdGVkIFVzZSBgUm9vdENNU0NsaWVudC5sb2FkVHJhbnNsYXRpb25zRm9yTG9jYWxlKClgLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gbG9hZFRyYW5zbGF0aW9uc0ZvckxvY2FsZShcbiAgcm9vdENvbmZpZzogUm9vdENvbmZpZyxcbiAgbG9jYWxlOiBzdHJpbmcsXG4gIG9wdGlvbnM/OiBMb2FkVHJhbnNsYXRpb25zT3B0aW9uc1xuKTogUHJvbWlzZTxMb2NhbGVUcmFuc2xhdGlvbnM+IHtcbiAgY29uc3QgdHJhbnNsYXRpb25zTWFwID0gYXdhaXQgbG9hZFRyYW5zbGF0aW9ucyhyb290Q29uZmlnLCBvcHRpb25zKTtcbiAgcmV0dXJuIHRyYW5zbGF0aW9uc0ZvckxvY2FsZSh0cmFuc2xhdGlvbnNNYXAsIGxvY2FsZSk7XG59XG4iLCAiaW1wb3J0IHtGdW5jdGlvbmFsQ29tcG9uZW50fSBmcm9tICdwcmVhY3QnO1xuXG5leHBvcnQgaW50ZXJmYWNlIENvbW1vbkZpZWxkUHJvcHMge1xuICB0eXBlOiBzdHJpbmc7XG4gIGlkPzogc3RyaW5nO1xuICBsYWJlbD86IHN0cmluZztcbiAgaGVscD86IHN0cmluZztcbiAgcGxhY2Vob2xkZXI/OiBzdHJpbmc7XG4gIGRlZmF1bHQ/OiBhbnk7XG4gIGhpZGRlbj86IGJvb2xlYW47XG4gIGRlcHJlY2F0ZWQ/OiBib29sZWFuO1xufVxuXG5leHBvcnQgdHlwZSBTdHJpbmdGaWVsZCA9IENvbW1vbkZpZWxkUHJvcHMgJiB7XG4gIHR5cGU6ICdzdHJpbmcnO1xuICBkZWZhdWx0Pzogc3RyaW5nO1xuICB0cmFuc2xhdGU/OiBib29sZWFuO1xuICB2YXJpYW50PzogJ2lucHV0JyB8ICd0ZXh0YXJlYSc7XG4gIC8qKiBGb3IgdGV4dGFyZWEgdmFyaWFudCwgdGhlIG1heGltdW0gbnVtYmVyIG9mIHJvd3Mgb2YgdGV4dCB0byBzaG93LiAqL1xuICBtYXhSb3dzPzogbnVtYmVyO1xufTtcblxuZXhwb3J0IGZ1bmN0aW9uIHN0cmluZyhmaWVsZDogT21pdDxTdHJpbmdGaWVsZCwgJ3R5cGUnPik6IFN0cmluZ0ZpZWxkIHtcbiAgcmV0dXJuIHsuLi5maWVsZCwgdHlwZTogJ3N0cmluZyd9O1xufVxuXG5leHBvcnQgdHlwZSBOdW1iZXJGaWVsZCA9IENvbW1vbkZpZWxkUHJvcHMgJiB7XG4gIHR5cGU6ICdudW1iZXInO1xuICBkZWZhdWx0PzogbnVtYmVyO1xufTtcblxuZXhwb3J0IGZ1bmN0aW9uIG51bWJlcihmaWVsZDogT21pdDxOdW1iZXJGaWVsZCwgJ3R5cGUnPik6IE51bWJlckZpZWxkIHtcbiAgcmV0dXJuIHsuLi5maWVsZCwgdHlwZTogJ251bWJlcid9O1xufVxuXG5leHBvcnQgdHlwZSBEYXRlRmllbGQgPSBDb21tb25GaWVsZFByb3BzICYge1xuICB0eXBlOiAnZGF0ZSc7XG4gIGRlZmF1bHQ/OiBzdHJpbmc7XG59O1xuXG5leHBvcnQgZnVuY3Rpb24gZGF0ZShmaWVsZDogT21pdDxEYXRlRmllbGQsICd0eXBlJz4pOiBEYXRlRmllbGQge1xuICByZXR1cm4gey4uLmZpZWxkLCB0eXBlOiAnZGF0ZSd9O1xufVxuXG5leHBvcnQgdHlwZSBEYXRlVGltZUZpZWxkID0gQ29tbW9uRmllbGRQcm9wcyAmIHtcbiAgdHlwZTogJ2RhdGV0aW1lJztcbiAgZGVmYXVsdD86IHN0cmluZztcbn07XG5cbmV4cG9ydCBmdW5jdGlvbiBkYXRldGltZShmaWVsZDogT21pdDxEYXRlVGltZUZpZWxkLCAndHlwZSc+KTogRGF0ZVRpbWVGaWVsZCB7XG4gIHJldHVybiB7Li4uZmllbGQsIHR5cGU6ICdkYXRldGltZSd9O1xufVxuXG5leHBvcnQgdHlwZSBCb29sZWFuRmllbGQgPSBDb21tb25GaWVsZFByb3BzICYge1xuICB0eXBlOiAnYm9vbGVhbic7XG4gIGRlZmF1bHQ/OiBib29sZWFuO1xuICBjaGVja2JveExhYmVsPzogc3RyaW5nO1xufTtcblxuZXhwb3J0IGZ1bmN0aW9uIGJvb2xlYW4oZmllbGQ6IE9taXQ8Qm9vbGVhbkZpZWxkLCAndHlwZSc+KTogQm9vbGVhbkZpZWxkIHtcbiAgcmV0dXJuIHsuLi5maWVsZCwgdHlwZTogJ2Jvb2xlYW4nfTtcbn1cblxuZXhwb3J0IHR5cGUgU2VsZWN0RmllbGQgPSBDb21tb25GaWVsZFByb3BzICYge1xuICB0eXBlOiAnc2VsZWN0JztcbiAgZGVmYXVsdD86IHN0cmluZztcbiAgb3B0aW9ucz86IEFycmF5PHt2YWx1ZTogc3RyaW5nOyBsYWJlbD86IHN0cmluZ30+IHwgc3RyaW5nW107XG4gIHRyYW5zbGF0ZT86IGJvb2xlYW47XG59O1xuXG5leHBvcnQgZnVuY3Rpb24gc2VsZWN0KGZpZWxkOiBPbWl0PFNlbGVjdEZpZWxkLCAndHlwZSc+KTogU2VsZWN0RmllbGQge1xuICByZXR1cm4gey4uLmZpZWxkLCB0eXBlOiAnc2VsZWN0J307XG59XG5cbmV4cG9ydCB0eXBlIE11bHRpU2VsZWN0RmllbGQgPSBPbWl0PFNlbGVjdEZpZWxkLCAndHlwZSc+ICYge1xuICB0eXBlOiAnbXVsdGlzZWxlY3QnO1xuICAvKiogU2V0IHRvIGB0cnVlYCB0byBhbGxvdyB1c2VycyB0byBjcmVhdGUgYXJiaXRyYXJ5IHZhbHVlcy4gKi9cbiAgY3JlYXRhYmxlPzogYm9vbGVhbjtcbiAgdHJhbnNsYXRlPzogYm9vbGVhbjtcbn07XG5cbmV4cG9ydCBmdW5jdGlvbiBtdWx0aXNlbGVjdChcbiAgZmllbGQ6IE9taXQ8TXVsdGlTZWxlY3RGaWVsZCwgJ3R5cGUnPlxuKTogTXVsdGlTZWxlY3RGaWVsZCB7XG4gIHJldHVybiB7Li4uZmllbGQsIHR5cGU6ICdtdWx0aXNlbGVjdCd9O1xufVxuXG5leHBvcnQgdHlwZSBJbWFnZUZpZWxkID0gQ29tbW9uRmllbGRQcm9wcyAmIHtcbiAgdHlwZTogJ2ltYWdlJztcbiAgdHJhbnNsYXRlPzogYm9vbGVhbjtcbiAgLyoqIExpc3Qgb2Ygc3VwcG9ydGVkIGV4dHMsIGUuZy4gYFsnLm1wNCddYC4gKi9cbiAgZXh0cz86IHN0cmluZ1tdO1xufTtcblxuZXhwb3J0IGZ1bmN0aW9uIGltYWdlKGZpZWxkOiBPbWl0PEltYWdlRmllbGQsICd0eXBlJz4pOiBJbWFnZUZpZWxkIHtcbiAgcmV0dXJuIHsuLi5maWVsZCwgdHlwZTogJ2ltYWdlJ307XG59XG5cbmV4cG9ydCB0eXBlIEZpbGVGaWVsZCA9IENvbW1vbkZpZWxkUHJvcHMgJiB7XG4gIHR5cGU6ICdmaWxlJztcbiAgLyoqIExpc3Qgb2Ygc3VwcG9ydGVkIGV4dHMsIGUuZy4gYFsnLm1wNCddYC4gKi9cbiAgZXh0cz86IHN0cmluZ1tdO1xuICAvKipcbiAgICogV2hldGhlciB0byBwcmVzZXJ2ZSB0aGUgZmluYWwgc2VydmluZyBmaWxlbmFtZSB3aGVuIGEgdXNlciB1cGxvYWRzIGEgZmlsZS5cbiAgICogQnkgZGVmYXVsdCwgdGhlIGZpbGVuYW1lIGlzIGhhc2hlZCBmb3Igb2JmdXNjYXRpb24gcHVycG9zZXMuXG4gICAqL1xuICBwcmVzZXJ2ZUZpbGVuYW1lPzogYm9vbGVhbjtcbn07XG5cbmV4cG9ydCBmdW5jdGlvbiBmaWxlKGZpZWxkOiBPbWl0PEZpbGVGaWVsZCwgJ3R5cGUnPik6IEZpbGVGaWVsZCB7XG4gIHJldHVybiB7Li4uZmllbGQsIHR5cGU6ICdmaWxlJ307XG59XG5cbmV4cG9ydCB0eXBlIE9iamVjdEZpZWxkID0gQ29tbW9uRmllbGRQcm9wcyAmIHtcbiAgdHlwZTogJ29iamVjdCc7XG4gIGZpZWxkczogRmllbGRXaXRoSWRbXTtcbn07XG5cbmV4cG9ydCBmdW5jdGlvbiBvYmplY3QoZmllbGQ6IE9taXQ8T2JqZWN0RmllbGQsICd0eXBlJz4pOiBPYmplY3RGaWVsZCB7XG4gIHJldHVybiB7Li4uZmllbGQsIHR5cGU6ICdvYmplY3QnfTtcbn1cblxuZXhwb3J0IHR5cGUgQXJyYXlGaWVsZCA9IENvbW1vbkZpZWxkUHJvcHMgJiB7XG4gIHR5cGU6ICdhcnJheSc7XG4gIGRlZmF1bHQ/OiBhbnlbXTtcbiAgLyoqXG4gICAqIFN0cmluZyBmb3JtYXQgZm9yIHRoZSBwcmV2aWV3IGxpbmUgb2YgYW4gaXRlbSBpbiB0aGUgYXJyYXkuIFBsYWNlaG9sZGVyXG4gICAqIHZhbHVlcyBzaG91bGQgdXNlIGJyYWNrZXRzLCBlLmcuIGBte19pbmRleDowMn06IHtfdHlwZX1gLlxuICAgKlxuICAgKiBNdWx0aXBsZSB2YWx1ZXMgY2FuIGJlIHByb3ZpZGVkLCBpbiB3aGljaCBjYXNlIHRoZSBmaXJzdCBwcmV2aWV3IGxpbmUgd2l0aFxuICAgKiBubyBtaXNzaW5nIHBsYWNlaG9sZGVyIHZhbHVlcyB3aWxsIGJlIHVzZWQuXG4gICAqXG4gICAqIFN5c3RlbSBhZGRlZCBwbGFjZWhvbGRlciB2YWx1ZXM6XG4gICAqXG4gICAqIC0gX2luZGV4OiBUaGUgMC1iYXNlZCBpbmRleC5cbiAgICogLSBfaW5kZXg6MDI6IEEgbGVmdC1wYWRkZWQgdmVyc2lvbiBvZiBfaW5kZXggdG8gMiBkaWdpdHMuXG4gICAqIC0gX2luZGV4OjAzOiBBIGxlZnQtcGFkZGVkIHZlcnNpb24gb2YgX2luZGV4IHRvIDMgZGlnaXRzLlxuICAgKiAtIF90eXBlOiBGb3IgYXJyYXkgb2Ygb25lLW9mIGZpZWxkcywgdGhlIHR5cGUgb2YgdGhlIHNlbGVjdGVkIGZpZWxkLlxuICAgKi9cbiAgcHJldmlldz86IHN0cmluZyB8IHN0cmluZ1tdO1xuICAvLyBOT1RFKHN0ZXZlbmxlKTogdGhlIGFycmF5IGZpZWxkIHNob3VsZCBvbmx5IGFjY2VwdCBvYmplY3QgdmFsdWVzIHRvIGtlZXBcbiAgLy8gdGhlIHNjaGVtYXMgZnV0dXJlLWZyaWVuZGx5LiBGb3IgZXhhbXBsZSwgaWYgd2Ugd2VyZSB0byBhY2NlcHQgcHJpbWF0aXZlc1xuICAvLyAoZS5nLiBBcnJheTxzdHJpbmc+KSBhbmQgdGhlIGRldmVsb3BlciBkZWNpZGVzIGluIHRoZSBmdXR1cmUgdGhhdCB0aGV5XG4gIC8vIG5lZWQgdG8gYWRkIGV4dHJhIGZpZWxkcyB0byB0aGF0IGFycmF5IHR5cGUsIHRoZXkgd291bGQgaGF2ZSB0byBjcmVhdGUgYVxuICAvLyBuZXcgZmllbGQsIGNyZWF0ZSBhIG5ldyBzY2hlbWEgZmllbGQsIGFuZCB0aGVuIHBlcmZvcm0gYSBkYiBtaWdyYXRpb24gdG9cbiAgLy8gdXBkYXRlIGZyb20gdGhlIG9sZCBmaWVsZCB0eXBlIHRvIHRoZSBuZXcgZmllbGQgdHlwZS4gQnV0IGlmIHdlIGVuZm9yY2VcbiAgLy8gb2JqZWN0cyBoZXJlLCBhIGRldmVsb3BlciBzaG91bGQgdGVjaG5pY2FsbHkgYmUgYWJsZSB0byBhZGQgZmllbGRzIHRvIHRoZVxuICAvLyBuZXN0ZWQgZmllbGQgZGVmaW5pdGlvbiB3aXRob3V0IGJyZWFraW5nIGFueSBleGlzdGluZyBkYiBlbnRyaWVzLlxuICBvZjogT2JqZWN0TGlrZUZpZWxkO1xuICAvKipcbiAgICogTGFiZWwgdG8gdXNlIGZvciB0aGUgXCJhZGQgaXRlbVwiIGJ1dHRvbi4gRGVmYXVsdHMgdG8gYEFkZGAuXG4gICAqL1xuICBidXR0b25MYWJlbD86IHN0cmluZztcbn07XG5cbmV4cG9ydCBmdW5jdGlvbiBhcnJheShmaWVsZDogT21pdDxBcnJheUZpZWxkLCAndHlwZSc+KTogQXJyYXlGaWVsZCB7XG4gIHJldHVybiB7Li4uZmllbGQsIHR5cGU6ICdhcnJheSd9O1xufVxuXG5leHBvcnQgdHlwZSBPbmVPZkZpZWxkID0gQ29tbW9uRmllbGRQcm9wcyAmIHtcbiAgdHlwZTogJ29uZW9mJztcbiAgdHlwZXM6IFNjaGVtYVtdO1xufTtcblxuZXhwb3J0IGZ1bmN0aW9uIG9uZU9mKGZpZWxkOiBPbWl0PE9uZU9mRmllbGQsICd0eXBlJz4pOiBPbmVPZkZpZWxkIHtcbiAgcmV0dXJuIHsuLi5maWVsZCwgdHlwZTogJ29uZW9mJ307XG59XG5cbmV4cG9ydCB0eXBlIFJpY2hUZXh0RmllbGQgPSBDb21tb25GaWVsZFByb3BzICYge1xuICB0eXBlOiAncmljaHRleHQnO1xuICB0cmFuc2xhdGU/OiBib29sZWFuO1xuICBwbGFjZWhvbGRlcj86IHN0cmluZztcbn07XG5cbmV4cG9ydCBmdW5jdGlvbiByaWNodGV4dChmaWVsZDogT21pdDxSaWNoVGV4dEZpZWxkLCAndHlwZSc+KTogUmljaFRleHRGaWVsZCB7XG4gIHJldHVybiB7Li4uZmllbGQsIHR5cGU6ICdyaWNodGV4dCd9O1xufVxuXG5leHBvcnQgdHlwZSBSZWZlcmVuY2VGaWVsZCA9IENvbW1vbkZpZWxkUHJvcHMgJiB7XG4gIHR5cGU6ICdyZWZlcmVuY2UnO1xuICAvKiogTGlzdCBvZiBjb2xsZWN0aW9uIGlkcyB0aGUgcmVmZXJlbmNlIGNhbiBiZSBjaG9zZW4gZnJvbS4gKi9cbiAgY29sbGVjdGlvbnM/OiBzdHJpbmdbXTtcbiAgLyoqIEluaXRpYWwgY29sbGVjdGlvbiB0byBzaG93IHdoZW4gcGlja2luZyBhIHJlZmVyZW5jZS4gKi9cbiAgaW5pdGlhbENvbGxlY3Rpb24/OiBzdHJpbmc7XG4gIC8qKiBMYWJlbCBmb3IgdGhlIGJ1dHRvbi4gRGVmYXVsdHMgdG8gXCJTZWxlY3RcIi4gKi9cbiAgYnV0dG9uTGFiZWw/OiBzdHJpbmc7XG59O1xuXG5leHBvcnQgZnVuY3Rpb24gcmVmZXJlbmNlKGZpZWxkOiBPbWl0PFJlZmVyZW5jZUZpZWxkLCAndHlwZSc+KTogUmVmZXJlbmNlRmllbGQge1xuICByZXR1cm4gey4uLmZpZWxkLCB0eXBlOiAncmVmZXJlbmNlJ307XG59XG5cbmV4cG9ydCB0eXBlIEZpZWxkID1cbiAgfCBTdHJpbmdGaWVsZFxuICB8IE51bWJlckZpZWxkXG4gIHwgRGF0ZUZpZWxkXG4gIHwgRGF0ZVRpbWVGaWVsZFxuICB8IEJvb2xlYW5GaWVsZFxuICB8IFNlbGVjdEZpZWxkXG4gIHwgTXVsdGlTZWxlY3RGaWVsZFxuICB8IEltYWdlRmllbGRcbiAgfCBGaWxlRmllbGRcbiAgfCBPYmplY3RGaWVsZFxuICB8IEFycmF5RmllbGRcbiAgfCBPbmVPZkZpZWxkXG4gIHwgUmljaFRleHRGaWVsZFxuICB8IFJlZmVyZW5jZUZpZWxkO1xuXG4vKipcbiAqIFNpbWlsYXIgdG8ge0BsaW5rIEZpZWxkfSBidXQgd2l0aCBhIHJlcXVpcmVkIGBpZGAuXG4gKiBUT0RPKHN0ZXZlbmxlKTogZml4IHRoaXMuXG4gKi9cbmV4cG9ydCB0eXBlIEZpZWxkV2l0aElkID0gRmllbGQ7XG5cbmV4cG9ydCB0eXBlIE9iamVjdExpa2VGaWVsZCA9XG4gIHwgSW1hZ2VGaWVsZFxuICB8IEZpbGVGaWVsZFxuICB8IE9iamVjdEZpZWxkXG4gIHwgT25lT2ZGaWVsZFxuICB8IFJlZmVyZW5jZUZpZWxkO1xuXG5leHBvcnQgaW50ZXJmYWNlIFNjaGVtYSB7XG4gIG5hbWU6IHN0cmluZztcbiAgZGVzY3JpcHRpb24/OiBzdHJpbmc7XG4gIGZpZWxkczogRmllbGRXaXRoSWRbXTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGRlZmluZVNjaGVtYShzY2hlbWE6IFNjaGVtYSk6IFNjaGVtYSB7XG4gIHJldHVybiBzY2hlbWE7XG59XG5cbi8qKiBEZWZpbmVzIHRoZSBzY2hlbWEgZm9yIGEgY29sbGVjdGlvbiBvciByZXVzYWJsZSBjb21wb25lbnQuICovXG5leHBvcnQgY29uc3QgZGVmaW5lID0gZGVmaW5lU2NoZW1hO1xuXG5leHBvcnQgdHlwZSBDb2xsZWN0aW9uID0gU2NoZW1hICYge1xuICAvKiogVVJMIHBhdGggd2hlcmUgdGhlIGNvbGxlY3Rpb24gc2VydmVzIGZyb20uICovXG4gIHVybD86IHN0cmluZztcbiAgLyoqXG4gICAqIFVSTCB0aGF0IGNhbiBiZSB1c2VkIHRvIHJlbmRlciBhIHByZXZpZXcgcGFnZS4gVXNlZCBieSB0aGUgc2lkZS1ieS1zaWRlXG4gICAqIGVkaXRvciB0byByZW5kZXIgaW5zdGFudCBwcmV2aWV3cy4gSWYgYmxhbmssIGRlZmF1bHRzIHRvIHRoZSBgdXJsYCBjb25maWcuXG4gICAqL1xuICBwcmV2aWV3VXJsPzogc3RyaW5nO1xuICAvKiogUGFnZSBjb21wb25lbnQgdG8gcmVuZGVyIHRoZSBjb2xsZWN0aW9uIGZvciBpbnN0YW50IHByZXZpZXdzICovXG4gIENvbXBvbmVudD86IEZ1bmN0aW9uYWxDb21wb25lbnQ7XG4gIC8qKlxuICAgKiBEZWZpbmVzIHRoZSBmaWVsZHMgdG8gdXNlIGZvciBkb2N1bWVudCBwcmV2aWV3LiBEZWZhdWx0cyB0byBcInRpdGxlXCIgYW5kXG4gICAqIFwiaW1hZ2VcIi4gVXNlIGRvdCBub3RhdGlvbiBmb3IgbmVzdGVkIGZpZWxkcywgZS5nLiBcIm1ldGEudGl0bGVcIi5cbiAgICovXG4gIHByZXZpZXc/OiB7XG4gICAgdGl0bGU/OiBzdHJpbmc7XG4gICAgaW1hZ2U/OiBzdHJpbmc7XG4gICAgZGVmYXVsdEltYWdlPzoge1xuICAgICAgc3JjOiBzdHJpbmc7XG4gICAgfTtcbiAgfTtcbn07XG5cbmV4cG9ydCBmdW5jdGlvbiBkZWZpbmVDb2xsZWN0aW9uKGNvbGxlY3Rpb246IENvbGxlY3Rpb24pOiBDb2xsZWN0aW9uIHtcbiAgcmV0dXJuIGNvbGxlY3Rpb247XG59XG5cbmV4cG9ydCBjb25zdCBjb2xsZWN0aW9uID0gZGVmaW5lQ29sbGVjdGlvbjtcbiJdLAogICJtYXBwaW5ncyI6ICI7Ozs7Ozs7QUFBQSxPQUFPLFlBQVk7QUFHbkI7QUFBQSxFQUNFO0FBQUEsRUFJQTtBQUFBLE9BQ0s7QUFNQSxJQUFNLDJCQUEyQjtBQXNFakMsSUFBTSxnQkFBTixNQUFvQjtB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QUNsQztBQW1DTyxTQUFTLE1BQU0sT0FBNkM7QUFDakUsU0FBTyxFQUFDLEdBQUcsT0FBTyxNQUFNLFFBQU87QUFDakM7QUFPTyxTQUFTLE1BQU0sT0FBNkM7QUFDakUsU0FBTyxFQUFDLEdBQUcsT0FBTyxNQUFNLFFBQU87QUFDakM7QUFRTyxTQUFTLFNBQVMsT0FBbUQ7QUFDMUUsU0FBTyxFQUFDLEdBQUcsT0FBTyxNQUFNLFdBQVU7QUFDcEM7QUFZTyxTQUFTLFVBQVUsT0FBcUQ7QUFDN0UsU0FBTyxFQUFDLEdBQUcsT0FBTyxNQUFNLFlBQVc7QUFDckM7QUFxQ08sU0FBUyxhQUFhLFFBQXdCO0FBQ25ELFNBQU87QUFDVDtBQUdPLElBQU0sU0FBUztBQXlCZixTQUFTLGlCQUFpQkcsYUFBb0M7QUFDbkUsU0FBT0E7QUFDVDtBQUVPLElBQU0sYUFBYTsiLAogICJuYW1lcyI6IFsiY29sbGVjdGlvbiIsICJwbHVnaW4iLCAic3RyaW5nIiwgIkZpZWxkVmFsdWUiLCAiZ2V0RmlyZXN0b3JlIiwgImdldEZpcmVzdG9yZSIsICJjb2xsZWN0aW9uIiwgIkZpZWxkVmFsdWUiLCAiY29sbGVjdGlvbiJdCn0K
|
package/dist/functions.d.ts
CHANGED