@sockethub/activity-streams 4.4.0-alpha.10 → 4.4.0-alpha.12
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +5 -26
- package/dist/activity-streams.js +78 -50
- package/dist/activity-streams.min.js +4 -4
- package/package.json +4 -3
- package/src/activity-streams.test.ts +18 -23
- package/src/activity-streams.ts +103 -72
package/README.md
CHANGED
|
@@ -83,37 +83,16 @@ const user = ActivityStreams.Object.create({
|
|
|
83
83
|
// Create an activity that references it
|
|
84
84
|
const activity = ActivityStreams.Stream({
|
|
85
85
|
type: "send",
|
|
86
|
-
context:
|
|
86
|
+
"@context": [
|
|
87
|
+
"https://www.w3.org/ns/activitystreams",
|
|
88
|
+
"https://sockethub.org/ns/context/v1.jsonld",
|
|
89
|
+
"https://sockethub.org/ns/context/platform/irc/v1.jsonld"
|
|
90
|
+
],
|
|
87
91
|
actor: "user@example.com", // automatically expands to full object
|
|
88
92
|
object: { type: "message", content: "Hello!" }
|
|
89
93
|
});
|
|
90
94
|
```
|
|
91
95
|
|
|
92
|
-
### With Sockethub Client
|
|
93
|
-
|
|
94
|
-
If you're using the Sockethub client, this library is already bundled and available:
|
|
95
|
-
|
|
96
|
-
```javascript
|
|
97
|
-
import SockethubClient from '@sockethub/client';
|
|
98
|
-
|
|
99
|
-
const socket = io('http://localhost:10550');
|
|
100
|
-
const sockethubClient = new SockethubClient(socket);
|
|
101
|
-
|
|
102
|
-
// Access ActivityStreams through the client
|
|
103
|
-
const user = sockethubClient.ActivityStreams.Object.create({
|
|
104
|
-
id: "user@example.com",
|
|
105
|
-
type: "person",
|
|
106
|
-
name: "John Doe"
|
|
107
|
-
});
|
|
108
|
-
|
|
109
|
-
const activity = sockethubClient.ActivityStreams.Stream({
|
|
110
|
-
type: "send",
|
|
111
|
-
context: "irc",
|
|
112
|
-
actor: "user@example.com",
|
|
113
|
-
object: { type: "message", content: "Hello!" }
|
|
114
|
-
});
|
|
115
|
-
```
|
|
116
|
-
|
|
117
96
|
## Example
|
|
118
97
|
|
|
119
98
|
```javascript
|
package/dist/activity-streams.js
CHANGED
|
@@ -3,15 +3,29 @@ var __getProtoOf = Object.getPrototypeOf;
|
|
|
3
3
|
var __defProp = Object.defineProperty;
|
|
4
4
|
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
5
5
|
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
6
|
+
function __accessProp(key) {
|
|
7
|
+
return this[key];
|
|
8
|
+
}
|
|
9
|
+
var __toESMCache_node;
|
|
10
|
+
var __toESMCache_esm;
|
|
6
11
|
var __toESM = (mod, isNodeMode, target) => {
|
|
12
|
+
var canCache = mod != null && typeof mod === "object";
|
|
13
|
+
if (canCache) {
|
|
14
|
+
var cache = isNodeMode ? __toESMCache_node ??= new WeakMap : __toESMCache_esm ??= new WeakMap;
|
|
15
|
+
var cached = cache.get(mod);
|
|
16
|
+
if (cached)
|
|
17
|
+
return cached;
|
|
18
|
+
}
|
|
7
19
|
target = mod != null ? __create(__getProtoOf(mod)) : {};
|
|
8
20
|
const to = isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target;
|
|
9
21
|
for (let key of __getOwnPropNames(mod))
|
|
10
22
|
if (!__hasOwnProp.call(to, key))
|
|
11
23
|
__defProp(to, key, {
|
|
12
|
-
get: (
|
|
24
|
+
get: __accessProp.bind(mod, key),
|
|
13
25
|
enumerable: true
|
|
14
26
|
});
|
|
27
|
+
if (canCache)
|
|
28
|
+
cache.set(mod, to);
|
|
15
29
|
return to;
|
|
16
30
|
};
|
|
17
31
|
var __commonJS = (cb, mod) => () => (mod || cb((mod = { exports: {} }).exports, mod), mod.exports);
|
|
@@ -194,6 +208,15 @@ var require_eventemitter3 = __commonJS((exports, module) => {
|
|
|
194
208
|
}
|
|
195
209
|
});
|
|
196
210
|
|
|
211
|
+
// ../schemas/dist/context.js
|
|
212
|
+
var {createRequire} = (() => ({}));
|
|
213
|
+
var AS2_BASE_CONTEXT_URL = "https://www.w3.org/ns/activitystreams";
|
|
214
|
+
var SOCKETHUB_BASE_CONTEXT_URL = "https://sockethub.org/ns/context/v1.jsonld";
|
|
215
|
+
var PLATFORM_CONTEXT_PREFIX = "https://sockethub.org/ns/context/platform/";
|
|
216
|
+
var platformContextToPlatformId = new Map;
|
|
217
|
+
var platformContextToSchemaId = new Map;
|
|
218
|
+
var platformContextToCredentialsSchemaId = new Map;
|
|
219
|
+
|
|
197
220
|
// ../../node_modules/eventemitter3/index.mjs
|
|
198
221
|
var import__ = __toESM(require_eventemitter3(), 1);
|
|
199
222
|
var eventemitter3_default = import__.default;
|
|
@@ -218,13 +241,13 @@ var eventemitter3_default = import__.default;
|
|
|
218
241
|
var ee = new eventemitter3_default;
|
|
219
242
|
var baseProps = {
|
|
220
243
|
stream: [
|
|
244
|
+
"@context",
|
|
221
245
|
"id",
|
|
222
246
|
"type",
|
|
247
|
+
"platform",
|
|
223
248
|
"actor",
|
|
224
249
|
"target",
|
|
225
250
|
"object",
|
|
226
|
-
"context",
|
|
227
|
-
"context",
|
|
228
251
|
"published",
|
|
229
252
|
"error"
|
|
230
253
|
],
|
|
@@ -284,14 +307,6 @@ var baseProps = {
|
|
|
284
307
|
"xmpp:stanza-id"
|
|
285
308
|
]
|
|
286
309
|
};
|
|
287
|
-
var rename = {
|
|
288
|
-
"@id": "id",
|
|
289
|
-
"@type": "type",
|
|
290
|
-
verb: "type",
|
|
291
|
-
displayName: "name",
|
|
292
|
-
objectType: "type",
|
|
293
|
-
platform: "context"
|
|
294
|
-
};
|
|
295
310
|
var expand = {
|
|
296
311
|
actor: {
|
|
297
312
|
primary: "id",
|
|
@@ -312,18 +327,8 @@ var failOnUnknownObjectProperties = false;
|
|
|
312
327
|
var warnOnUnknownObjectProperties = true;
|
|
313
328
|
var specialObjs = [];
|
|
314
329
|
function matchesCustomProp(type, key) {
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
if (obj.includes(key)) {
|
|
318
|
-
return true;
|
|
319
|
-
}
|
|
320
|
-
}
|
|
321
|
-
return false;
|
|
322
|
-
}
|
|
323
|
-
function renameProp(obj, key) {
|
|
324
|
-
obj[rename[key]] = obj[key];
|
|
325
|
-
delete obj[key];
|
|
326
|
-
return obj;
|
|
330
|
+
const props = customProps[type];
|
|
331
|
+
return Array.isArray(props) && props.includes(key);
|
|
327
332
|
}
|
|
328
333
|
function validateObject(type, incomingObj, requireId = false) {
|
|
329
334
|
if (incomingObj === null) {
|
|
@@ -344,15 +349,13 @@ function validateObject(type, incomingObj, requireId = false) {
|
|
|
344
349
|
if (requireId && !obj.id) {
|
|
345
350
|
throw new Error(`ActivityStreams validation failed: the "${type}" property requires an 'id' property. Example: { id: "user@example.com", type: "person" }`);
|
|
346
351
|
}
|
|
347
|
-
const
|
|
348
|
-
|
|
352
|
+
const incomingRecord = incomingObj;
|
|
353
|
+
const allowedProps = baseProps[type];
|
|
354
|
+
const unknownKeys = Object.keys(incomingRecord).filter((key) => {
|
|
355
|
+
return !allowedProps.includes(key);
|
|
349
356
|
});
|
|
350
357
|
for (const key of unknownKeys) {
|
|
351
|
-
|
|
352
|
-
if (rename[key]) {
|
|
353
|
-
ao = renameProp(ao, key);
|
|
354
|
-
continue;
|
|
355
|
-
}
|
|
358
|
+
const ao = incomingObj;
|
|
356
359
|
if (matchesCustomProp(ao.type, key)) {
|
|
357
360
|
continue;
|
|
358
361
|
}
|
|
@@ -374,26 +377,28 @@ function ensureProps(obj) {
|
|
|
374
377
|
}
|
|
375
378
|
function expandStream(meta) {
|
|
376
379
|
const stream = {};
|
|
377
|
-
|
|
378
|
-
|
|
379
|
-
|
|
380
|
-
|
|
381
|
-
stream[key] =
|
|
382
|
-
|
|
380
|
+
const metaRecord = meta;
|
|
381
|
+
for (const key of Object.keys(metaRecord)) {
|
|
382
|
+
const value = metaRecord[key];
|
|
383
|
+
if (typeof value === "string") {
|
|
384
|
+
stream[key] = objs.get(value) || value;
|
|
385
|
+
} else if (Array.isArray(value)) {
|
|
386
|
+
const expanded = [];
|
|
387
|
+
for (const entry of value) {
|
|
383
388
|
if (typeof entry === "string") {
|
|
384
|
-
|
|
389
|
+
expanded.push(objs.get(entry) || entry);
|
|
385
390
|
}
|
|
386
391
|
}
|
|
392
|
+
stream[key] = expanded;
|
|
387
393
|
} else {
|
|
388
|
-
stream[key] =
|
|
394
|
+
stream[key] = value;
|
|
389
395
|
}
|
|
390
396
|
}
|
|
391
397
|
for (const key of Object.keys(expand)) {
|
|
392
|
-
|
|
398
|
+
const value = stream[key];
|
|
399
|
+
if (typeof value === "string") {
|
|
393
400
|
const idx = expand[key].primary;
|
|
394
|
-
|
|
395
|
-
obj[idx] = stream[key];
|
|
396
|
-
stream[key] = obj;
|
|
401
|
+
stream[key] = { [idx]: value };
|
|
397
402
|
}
|
|
398
403
|
}
|
|
399
404
|
return stream;
|
|
@@ -438,10 +443,9 @@ function ASFactory(opts = {}) {
|
|
|
438
443
|
specialObjs = opts?.specialObjs || [];
|
|
439
444
|
failOnUnknownObjectProperties = typeof opts.failOnUnknownObjectProperties === "boolean" ? opts.failOnUnknownObjectProperties : failOnUnknownObjectProperties;
|
|
440
445
|
warnOnUnknownObjectProperties = typeof opts.warnOnUnknownObjectProperties === "boolean" ? opts.warnOnUnknownObjectProperties : warnOnUnknownObjectProperties;
|
|
441
|
-
|
|
442
|
-
|
|
443
|
-
|
|
444
|
-
}
|
|
446
|
+
const customPropsConfig = opts.customProps || {};
|
|
447
|
+
for (const propName of Object.keys(customPropsConfig)) {
|
|
448
|
+
customProps[propName] = customPropsConfig[propName];
|
|
445
449
|
}
|
|
446
450
|
return {
|
|
447
451
|
Stream,
|
|
@@ -453,10 +457,34 @@ function ASFactory(opts = {}) {
|
|
|
453
457
|
}
|
|
454
458
|
((global) => {
|
|
455
459
|
global.ASFactor = ASFactory;
|
|
456
|
-
})(typeof
|
|
460
|
+
})(typeof globalThis === "object" ? globalThis : {});
|
|
461
|
+
function buildCanonicalContext(platform) {
|
|
462
|
+
const platformUrl = platform.startsWith("https://") ? platform : `${PLATFORM_CONTEXT_PREFIX}${platform}/v1.jsonld`;
|
|
463
|
+
return [AS2_BASE_CONTEXT_URL, SOCKETHUB_BASE_CONTEXT_URL, platformUrl];
|
|
464
|
+
}
|
|
465
|
+
function platformIdFromContext(context) {
|
|
466
|
+
if (!Array.isArray(context)) {
|
|
467
|
+
return;
|
|
468
|
+
}
|
|
469
|
+
for (const entry of context) {
|
|
470
|
+
if (typeof entry === "string" && entry.startsWith(PLATFORM_CONTEXT_PREFIX)) {
|
|
471
|
+
const rest = entry.slice(PLATFORM_CONTEXT_PREFIX.length);
|
|
472
|
+
const slashIdx = rest.indexOf("/");
|
|
473
|
+
if (slashIdx > 0) {
|
|
474
|
+
return rest.slice(0, slashIdx);
|
|
475
|
+
}
|
|
476
|
+
}
|
|
477
|
+
}
|
|
478
|
+
return;
|
|
479
|
+
}
|
|
457
480
|
export {
|
|
458
|
-
|
|
481
|
+
platformIdFromContext,
|
|
482
|
+
buildCanonicalContext,
|
|
483
|
+
SOCKETHUB_BASE_CONTEXT_URL,
|
|
484
|
+
PLATFORM_CONTEXT_PREFIX,
|
|
485
|
+
ASFactory,
|
|
486
|
+
AS2_BASE_CONTEXT_URL
|
|
459
487
|
};
|
|
460
488
|
|
|
461
|
-
//# debugId=
|
|
462
|
-
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2V2ZW50ZW1pdHRlcjMvaW5kZXguanMiLCAiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2V2ZW50ZW1pdHRlcjMvaW5kZXgubWpzIiwgIi4uL3NyYy9hY3Rpdml0eS1zdHJlYW1zLnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWwogICAgIid1c2Ugc3RyaWN0JztcblxudmFyIGhhcyA9IE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHlcbiAgLCBwcmVmaXggPSAnfic7XG5cbi8qKlxuICogQ29uc3RydWN0b3IgdG8gY3JlYXRlIGEgc3RvcmFnZSBmb3Igb3VyIGBFRWAgb2JqZWN0cy5cbiAqIEFuIGBFdmVudHNgIGluc3RhbmNlIGlzIGEgcGxhaW4gb2JqZWN0IHdob3NlIHByb3BlcnRpZXMgYXJlIGV2ZW50IG5hbWVzLlxuICpcbiAqIEBjb25zdHJ1Y3RvclxuICogQHByaXZhdGVcbiAqL1xuZnVuY3Rpb24gRXZlbnRzKCkge31cblxuLy9cbi8vIFdlIHRyeSB0byBub3QgaW5oZXJpdCBmcm9tIGBPYmplY3QucHJvdG90eXBlYC4gSW4gc29tZSBlbmdpbmVzIGNyZWF0aW5nIGFuXG4vLyBpbnN0YW5jZSBpbiB0aGlzIHdheSBpcyBmYXN0ZXIgdGhhbiBjYWxsaW5nIGBPYmplY3QuY3JlYXRlKG51bGwpYCBkaXJlY3RseS5cbi8vIElmIGBPYmplY3QuY3JlYXRlKG51bGwpYCBpcyBub3Qgc3VwcG9ydGVkIHdlIHByZWZpeCB0aGUgZXZlbnQgbmFtZXMgd2l0aCBhXG4vLyBjaGFyYWN0ZXIgdG8gbWFrZSBzdXJlIHRoYXQgdGhlIGJ1aWx0LWluIG9iamVjdCBwcm9wZXJ0aWVzIGFyZSBub3Rcbi8vIG92ZXJyaWRkZW4gb3IgdXNlZCBhcyBhbiBhdHRhY2sgdmVjdG9yLlxuLy9cbmlmIChPYmplY3QuY3JlYXRlKSB7XG4gIEV2ZW50cy5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuXG4gIC8vXG4gIC8vIFRoaXMgaGFjayBpcyBuZWVkZWQgYmVjYXVzZSB0aGUgYF9fcHJvdG9fX2AgcHJvcGVydHkgaXMgc3RpbGwgaW5oZXJpdGVkIGluXG4gIC8vIHNvbWUgb2xkIGJyb3dzZXJzIGxpa2UgQW5kcm9pZCA0LCBpUGhvbmUgNS4xLCBPcGVyYSAxMSBhbmQgU2FmYXJpIDUuXG4gIC8vXG4gIGlmICghbmV3IEV2ZW50cygpLl9fcHJvdG9fXykgcHJlZml4ID0gZmFsc2U7XG59XG5cbi8qKlxuICogUmVwcmVzZW50YXRpb24gb2YgYSBzaW5nbGUgZXZlbnQgbGlzdGVuZXIuXG4gKlxuICogQHBhcmFtIHtGdW5jdGlvbn0gZm4gVGhlIGxpc3RlbmVyIGZ1bmN0aW9uLlxuICogQHBhcmFtIHsqfSBjb250ZXh0IFRoZSBjb250ZXh0IHRvIGludm9rZSB0aGUgbGlzdGVuZXIgd2l0aC5cbiAqIEBwYXJhbSB7Qm9vbGVhbn0gW29uY2U9ZmFsc2VdIFNwZWNpZnkgaWYgdGhlIGxpc3RlbmVyIGlzIGEgb25lLXRpbWUgbGlzdGVuZXIuXG4gKiBAY29uc3RydWN0b3JcbiAqIEBwcml2YXRlXG4gKi9cbmZ1bmN0aW9uIEVFKGZuLCBjb250ZXh0LCBvbmNlKSB7XG4gIHRoaXMuZm4gPSBmbjtcbiAgdGhpcy5jb250ZXh0ID0gY29udGV4dDtcbiAgdGhpcy5vbmNlID0gb25jZSB8fCBmYWxzZTtcbn1cblxuLyoqXG4gKiBBZGQgYSBsaXN0ZW5lciBmb3IgYSBnaXZlbiBldmVudC5cbiAqXG4gKiBAcGFyYW0ge0V2ZW50RW1pdHRlcn0gZW1pdHRlciBSZWZlcmVuY2UgdG8gdGhlIGBFdmVudEVtaXR0ZXJgIGluc3RhbmNlLlxuICogQHBhcmFtIHsoU3RyaW5nfFN5bWJvbCl9IGV2ZW50IFRoZSBldmVudCBuYW1lLlxuICogQHBhcmFtIHtGdW5jdGlvbn0gZm4gVGhlIGxpc3RlbmVyIGZ1bmN0aW9uLlxuICogQHBhcmFtIHsqfSBjb250ZXh0IFRoZSBjb250ZXh0IHRvIGludm9rZSB0aGUgbGlzdGVuZXIgd2l0aC5cbiAqIEBwYXJhbSB7Qm9vbGVhbn0gb25jZSBTcGVjaWZ5IGlmIHRoZSBsaXN0ZW5lciBpcyBhIG9uZS10aW1lIGxpc3RlbmVyLlxuICogQHJldHVybnMge0V2ZW50RW1pdHRlcn1cbiAqIEBwcml2YXRlXG4gKi9cbmZ1bmN0aW9uIGFkZExpc3RlbmVyKGVtaXR0ZXIsIGV2ZW50LCBmbiwgY29udGV4dCwgb25jZSkge1xuICBpZiAodHlwZW9mIGZuICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcignVGhlIGxpc3RlbmVyIG11c3QgYmUgYSBmdW5jdGlvbicpO1xuICB9XG5cbiAgdmFyIGxpc3RlbmVyID0gbmV3IEVFKGZuLCBjb250ZXh0IHx8IGVtaXR0ZXIsIG9uY2UpXG4gICAgLCBldnQgPSBwcmVmaXggPyBwcmVmaXggKyBldmVudCA6IGV2ZW50O1xuXG4gIGlmICghZW1pdHRlci5fZXZlbnRzW2V2dF0pIGVtaXR0ZXIuX2V2ZW50c1tldnRdID0gbGlzdGVuZXIsIGVtaXR0ZXIuX2V2ZW50c0NvdW50Kys7XG4gIGVsc2UgaWYgKCFlbWl0dGVyLl9ldmVudHNbZXZ0XS5mbikgZW1pdHRlci5fZXZlbnRzW2V2dF0ucHVzaChsaXN0ZW5lcik7XG4gIGVsc2UgZW1pdHRlci5fZXZlbnRzW2V2dF0gPSBbZW1pdHRlci5fZXZlbnRzW2V2dF0sIGxpc3RlbmVyXTtcblxuICByZXR1cm4gZW1pdHRlcjtcbn1cblxuLyoqXG4gKiBDbGVhciBldmVudCBieSBuYW1lLlxuICpcbiAqIEBwYXJhbSB7RXZlbnRFbWl0dGVyfSBlbWl0dGVyIFJlZmVyZW5jZSB0byB0aGUgYEV2ZW50RW1pdHRlcmAgaW5zdGFuY2UuXG4gKiBAcGFyYW0geyhTdHJpbmd8U3ltYm9sKX0gZXZ0IFRoZSBFdmVudCBuYW1lLlxuICogQHByaXZhdGVcbiAqL1xuZnVuY3Rpb24gY2xlYXJFdmVudChlbWl0dGVyLCBldnQpIHtcbiAgaWYgKC0tZW1pdHRlci5fZXZlbnRzQ291bnQgPT09IDApIGVtaXR0ZXIuX2V2ZW50cyA9IG5ldyBFdmVudHMoKTtcbiAgZWxzZSBkZWxldGUgZW1pdHRlci5fZXZlbnRzW2V2dF07XG59XG5cbi8qKlxuICogTWluaW1hbCBgRXZlbnRFbWl0dGVyYCBpbnRlcmZhY2UgdGhhdCBpcyBtb2xkZWQgYWdhaW5zdCB0aGUgTm9kZS5qc1xuICogYEV2ZW50RW1pdHRlcmAgaW50ZXJmYWNlLlxuICpcbiAqIEBjb25zdHJ1Y3RvclxuICogQHB1YmxpY1xuICovXG5mdW5jdGlvbiBFdmVudEVtaXR0ZXIoKSB7XG4gIHRoaXMuX2V2ZW50cyA9IG5ldyBFdmVudHMoKTtcbiAgdGhpcy5fZXZlbnRzQ291bnQgPSAwO1xufVxuXG4vKipcbiAqIFJldHVybiBhbiBhcnJheSBsaXN0aW5nIHRoZSBldmVudHMgZm9yIHdoaWNoIHRoZSBlbWl0dGVyIGhhcyByZWdpc3RlcmVkXG4gKiBsaXN0ZW5lcnMuXG4gKlxuICogQHJldHVybnMge0FycmF5fVxuICogQHB1YmxpY1xuICovXG5FdmVudEVtaXR0ZXIucHJvdG90eXBlLmV2ZW50TmFtZXMgPSBmdW5jdGlvbiBldmVudE5hbWVzKCkge1xuICB2YXIgbmFtZXMgPSBbXVxuICAgICwgZXZlbnRzXG4gICAgLCBuYW1lO1xuXG4gIGlmICh0aGlzLl9ldmVudHNDb3VudCA9PT0gMCkgcmV0dXJuIG5hbWVzO1xuXG4gIGZvciAobmFtZSBpbiAoZXZlbnRzID0gdGhpcy5fZXZlbnRzKSkge1xuICAgIGlmIChoYXMuY2FsbChldmVudHMsIG5hbWUpKSBuYW1lcy5wdXNoKHByZWZpeCA/IG5hbWUuc2xpY2UoMSkgOiBuYW1lKTtcbiAgfVxuXG4gIGlmIChPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKSB7XG4gICAgcmV0dXJuIG5hbWVzLmNvbmNhdChPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKGV2ZW50cykpO1xuICB9XG5cbiAgcmV0dXJuIG5hbWVzO1xufTtcblxuLyoqXG4gKiBSZXR1cm4gdGhlIGxpc3RlbmVycyByZWdpc3RlcmVkIGZvciBhIGdpdmVuIGV2ZW50LlxuICpcbiAqIEBwYXJhbSB7KFN0cmluZ3xTeW1ib2wpfSBldmVudCBUaGUgZXZlbnQgbmFtZS5cbiAqIEByZXR1cm5zIHtBcnJheX0gVGhlIHJlZ2lzdGVyZWQgbGlzdGVuZXJzLlxuICogQHB1YmxpY1xuICovXG5FdmVudEVtaXR0ZXIucHJvdG90eXBlLmxpc3RlbmVycyA9IGZ1bmN0aW9uIGxpc3RlbmVycyhldmVudCkge1xuICB2YXIgZXZ0ID0gcHJlZml4ID8gcHJlZml4ICsgZXZlbnQgOiBldmVudFxuICAgICwgaGFuZGxlcnMgPSB0aGlzLl9ldmVudHNbZXZ0XTtcblxuICBpZiAoIWhhbmRsZXJzKSByZXR1cm4gW107XG4gIGlmIChoYW5kbGVycy5mbikgcmV0dXJuIFtoYW5kbGVycy5mbl07XG5cbiAgZm9yICh2YXIgaSA9IDAsIGwgPSBoYW5kbGVycy5sZW5ndGgsIGVlID0gbmV3IEFycmF5KGwpOyBpIDwgbDsgaSsrKSB7XG4gICAgZWVbaV0gPSBoYW5kbGVyc1tpXS5mbjtcbiAgfVxuXG4gIHJldHVybiBlZTtcbn07XG5cbi8qKlxuICogUmV0dXJuIHRoZSBudW1iZXIgb2YgbGlzdGVuZXJzIGxpc3RlbmluZyB0byBhIGdpdmVuIGV2ZW50LlxuICpcbiAqIEBwYXJhbSB7KFN0cmluZ3xTeW1ib2wpfSBldmVudCBUaGUgZXZlbnQgbmFtZS5cbiAqIEByZXR1cm5zIHtOdW1iZXJ9IFRoZSBudW1iZXIgb2YgbGlzdGVuZXJzLlxuICogQHB1YmxpY1xuICovXG5FdmVudEVtaXR0ZXIucHJvdG90eXBlLmxpc3RlbmVyQ291bnQgPSBmdW5jdGlvbiBsaXN0ZW5lckNvdW50KGV2ZW50KSB7XG4gIHZhciBldnQgPSBwcmVmaXggPyBwcmVmaXggKyBldmVudCA6IGV2ZW50XG4gICAgLCBsaXN0ZW5lcnMgPSB0aGlzLl9ldmVudHNbZXZ0XTtcblxuICBpZiAoIWxpc3RlbmVycykgcmV0dXJuIDA7XG4gIGlmIChsaXN0ZW5lcnMuZm4pIHJldHVybiAxO1xuICByZXR1cm4gbGlzdGVuZXJzLmxlbmd0aDtcbn07XG5cbi8qKlxuICogQ2FsbHMgZWFjaCBvZiB0aGUgbGlzdGVuZXJzIHJlZ2lzdGVyZWQgZm9yIGEgZ2l2ZW4gZXZlbnQuXG4gKlxuICogQHBhcmFtIHsoU3RyaW5nfFN5bWJvbCl9IGV2ZW50IFRoZSBldmVudCBuYW1lLlxuICogQHJldHVybnMge0Jvb2xlYW59IGB0cnVlYCBpZiB0aGUgZXZlbnQgaGFkIGxpc3RlbmVycywgZWxzZSBgZmFsc2VgLlxuICogQHB1YmxpY1xuICovXG5FdmVudEVtaXR0ZXIucHJvdG90eXBlLmVtaXQgPSBmdW5jdGlvbiBlbWl0KGV2ZW50LCBhMSwgYTIsIGEzLCBhNCwgYTUpIHtcbiAgdmFyIGV2dCA9IHByZWZpeCA/IHByZWZpeCArIGV2ZW50IDogZXZlbnQ7XG5cbiAgaWYgKCF0aGlzLl9ldmVudHNbZXZ0XSkgcmV0dXJuIGZhbHNlO1xuXG4gIHZhciBsaXN0ZW5lcnMgPSB0aGlzLl9ldmVudHNbZXZ0XVxuICAgICwgbGVuID0gYXJndW1lbnRzLmxlbmd0aFxuICAgICwgYXJnc1xuICAgICwgaTtcblxuICBpZiAobGlzdGVuZXJzLmZuKSB7XG4gICAgaWYgKGxpc3RlbmVycy5vbmNlKSB0aGlzLnJlbW92ZUxpc3RlbmVyKGV2ZW50LCBsaXN0ZW5lcnMuZm4sIHVuZGVmaW5lZCwgdHJ1ZSk7XG5cbiAgICBzd2l0Y2ggKGxlbikge1xuICAgICAgY2FzZSAxOiByZXR1cm4gbGlzdGVuZXJzLmZuLmNhbGwobGlzdGVuZXJzLmNvbnRleHQpLCB0cnVlO1xuICAgICAgY2FzZSAyOiByZXR1cm4gbGlzdGVuZXJzLmZuLmNhbGwobGlzdGVuZXJzLmNvbnRleHQsIGExKSwgdHJ1ZTtcbiAgICAgIGNhc2UgMzogcmV0dXJuIGxpc3RlbmVycy5mbi5jYWxsKGxpc3RlbmVycy5jb250ZXh0LCBhMSwgYTIpLCB0cnVlO1xuICAgICAgY2FzZSA0OiByZXR1cm4gbGlzdGVuZXJzLmZuLmNhbGwobGlzdGVuZXJzLmNvbnRleHQsIGExLCBhMiwgYTMpLCB0cnVlO1xuICAgICAgY2FzZSA1OiByZXR1cm4gbGlzdGVuZXJzLmZuLmNhbGwobGlzdGVuZXJzLmNvbnRleHQsIGExLCBhMiwgYTMsIGE0KSwgdHJ1ZTtcbiAgICAgIGNhc2UgNjogcmV0dXJuIGxpc3RlbmVycy5mbi5jYWxsKGxpc3RlbmVycy5jb250ZXh0LCBhMSwgYTIsIGEzLCBhNCwgYTUpLCB0cnVlO1xuICAgIH1cblxuICAgIGZvciAoaSA9IDEsIGFyZ3MgPSBuZXcgQXJyYXkobGVuIC0xKTsgaSA8IGxlbjsgaSsrKSB7XG4gICAgICBhcmdzW2kgLSAxXSA9IGFyZ3VtZW50c1tpXTtcbiAgICB9XG5cbiAgICBsaXN0ZW5lcnMuZm4uYXBwbHkobGlzdGVuZXJzLmNvbnRleHQsIGFyZ3MpO1xuICB9IGVsc2Uge1xuICAgIHZhciBsZW5ndGggPSBsaXN0ZW5lcnMubGVuZ3RoXG4gICAgICAsIGo7XG5cbiAgICBmb3IgKGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHtcbiAgICAgIGlmIChsaXN0ZW5lcnNbaV0ub25jZSkgdGhpcy5yZW1vdmVMaXN0ZW5lcihldmVudCwgbGlzdGVuZXJzW2ldLmZuLCB1bmRlZmluZWQsIHRydWUpO1xuXG4gICAgICBzd2l0Y2ggKGxlbikge1xuICAgICAgICBjYXNlIDE6IGxpc3RlbmVyc1tpXS5mbi5jYWxsKGxpc3RlbmVyc1tpXS5jb250ZXh0KTsgYnJlYWs7XG4gICAgICAgIGNhc2UgMjogbGlzdGVuZXJzW2ldLmZuLmNhbGwobGlzdGVuZXJzW2ldLmNvbnRleHQsIGExKTsgYnJlYWs7XG4gICAgICAgIGNhc2UgMzogbGlzdGVuZXJzW2ldLmZuLmNhbGwobGlzdGVuZXJzW2ldLmNvbnRleHQsIGExLCBhMik7IGJyZWFrO1xuICAgICAgICBjYXNlIDQ6IGxpc3RlbmVyc1tpXS5mbi5jYWxsKGxpc3RlbmVyc1tpXS5jb250ZXh0LCBhMSwgYTIsIGEzKTsgYnJlYWs7XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgaWYgKCFhcmdzKSBmb3IgKGogPSAxLCBhcmdzID0gbmV3IEFycmF5KGxlbiAtMSk7IGogPCBsZW47IGorKykge1xuICAgICAgICAgICAgYXJnc1tqIC0gMV0gPSBhcmd1bWVudHNbal07XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgbGlzdGVuZXJzW2ldLmZuLmFwcGx5KGxpc3RlbmVyc1tpXS5jb250ZXh0LCBhcmdzKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gdHJ1ZTtcbn07XG5cbi8qKlxuICogQWRkIGEgbGlzdGVuZXIgZm9yIGEgZ2l2ZW4gZXZlbnQuXG4gKlxuICogQHBhcmFtIHsoU3RyaW5nfFN5bWJvbCl9IGV2ZW50IFRoZSBldmVudCBuYW1lLlxuICogQHBhcmFtIHtGdW5jdGlvbn0gZm4gVGhlIGxpc3RlbmVyIGZ1bmN0aW9uLlxuICogQHBhcmFtIHsqfSBbY29udGV4dD10aGlzXSBUaGUgY29udGV4dCB0byBpbnZva2UgdGhlIGxpc3RlbmVyIHdpdGguXG4gKiBAcmV0dXJucyB7RXZlbnRFbWl0dGVyfSBgdGhpc2AuXG4gKiBAcHVibGljXG4gKi9cbkV2ZW50RW1pdHRlci5wcm90b3R5cGUub24gPSBmdW5jdGlvbiBvbihldmVudCwgZm4sIGNvbnRleHQpIHtcbiAgcmV0dXJuIGFkZExpc3RlbmVyKHRoaXMsIGV2ZW50LCBmbiwgY29udGV4dCwgZmFsc2UpO1xufTtcblxuLyoqXG4gKiBBZGQgYSBvbmUtdGltZSBsaXN0ZW5lciBmb3IgYSBnaXZlbiBldmVudC5cbiAqXG4gKiBAcGFyYW0geyhTdHJpbmd8U3ltYm9sKX0gZXZlbnQgVGhlIGV2ZW50IG5hbWUuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmbiBUaGUgbGlzdGVuZXIgZnVuY3Rpb24uXG4gKiBAcGFyYW0geyp9IFtjb250ZXh0PXRoaXNdIFRoZSBjb250ZXh0IHRvIGludm9rZSB0aGUgbGlzdGVuZXIgd2l0aC5cbiAqIEByZXR1cm5zIHtFdmVudEVtaXR0ZXJ9IGB0aGlzYC5cbiAqIEBwdWJsaWNcbiAqL1xuRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5vbmNlID0gZnVuY3Rpb24gb25jZShldmVudCwgZm4sIGNvbnRleHQpIHtcbiAgcmV0dXJuIGFkZExpc3RlbmVyKHRoaXMsIGV2ZW50LCBmbiwgY29udGV4dCwgdHJ1ZSk7XG59O1xuXG4vKipcbiAqIFJlbW92ZSB0aGUgbGlzdGVuZXJzIG9mIGEgZ2l2ZW4gZXZlbnQuXG4gKlxuICogQHBhcmFtIHsoU3RyaW5nfFN5bWJvbCl9IGV2ZW50IFRoZSBldmVudCBuYW1lLlxuICogQHBhcmFtIHtGdW5jdGlvbn0gZm4gT25seSByZW1vdmUgdGhlIGxpc3RlbmVycyB0aGF0IG1hdGNoIHRoaXMgZnVuY3Rpb24uXG4gKiBAcGFyYW0geyp9IGNvbnRleHQgT25seSByZW1vdmUgdGhlIGxpc3RlbmVycyB0aGF0IGhhdmUgdGhpcyBjb250ZXh0LlxuICogQHBhcmFtIHtCb29sZWFufSBvbmNlIE9ubHkgcmVtb3ZlIG9uZS10aW1lIGxpc3RlbmVycy5cbiAqIEByZXR1cm5zIHtFdmVudEVtaXR0ZXJ9IGB0aGlzYC5cbiAqIEBwdWJsaWNcbiAqL1xuRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5yZW1vdmVMaXN0ZW5lciA9IGZ1bmN0aW9uIHJlbW92ZUxpc3RlbmVyKGV2ZW50LCBmbiwgY29udGV4dCwgb25jZSkge1xuICB2YXIgZXZ0ID0gcHJlZml4ID8gcHJlZml4ICsgZXZlbnQgOiBldmVudDtcblxuICBpZiAoIXRoaXMuX2V2ZW50c1tldnRdKSByZXR1cm4gdGhpcztcbiAgaWYgKCFmbikge1xuICAgIGNsZWFyRXZlbnQodGhpcywgZXZ0KTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIHZhciBsaXN0ZW5lcnMgPSB0aGlzLl9ldmVudHNbZXZ0XTtcblxuICBpZiAobGlzdGVuZXJzLmZuKSB7XG4gICAgaWYgKFxuICAgICAgbGlzdGVuZXJzLmZuID09PSBmbiAmJlxuICAgICAgKCFvbmNlIHx8IGxpc3RlbmVycy5vbmNlKSAmJlxuICAgICAgKCFjb250ZXh0IHx8IGxpc3RlbmVycy5jb250ZXh0ID09PSBjb250ZXh0KVxuICAgICkge1xuICAgICAgY2xlYXJFdmVudCh0aGlzLCBldnQpO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBmb3IgKHZhciBpID0gMCwgZXZlbnRzID0gW10sIGxlbmd0aCA9IGxpc3RlbmVycy5sZW5ndGg7IGkgPCBsZW5ndGg7IGkrKykge1xuICAgICAgaWYgKFxuICAgICAgICBsaXN0ZW5lcnNbaV0uZm4gIT09IGZuIHx8XG4gICAgICAgIChvbmNlICYmICFsaXN0ZW5lcnNbaV0ub25jZSkgfHxcbiAgICAgICAgKGNvbnRleHQgJiYgbGlzdGVuZXJzW2ldLmNvbnRleHQgIT09IGNvbnRleHQpXG4gICAgICApIHtcbiAgICAgICAgZXZlbnRzLnB1c2gobGlzdGVuZXJzW2ldKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvL1xuICAgIC8vIFJlc2V0IHRoZSBhcnJheSwgb3IgcmVtb3ZlIGl0IGNvbXBsZXRlbHkgaWYgd2UgaGF2ZSBubyBtb3JlIGxpc3RlbmVycy5cbiAgICAvL1xuICAgIGlmIChldmVudHMubGVuZ3RoKSB0aGlzLl9ldmVudHNbZXZ0XSA9IGV2ZW50cy5sZW5ndGggPT09IDEgPyBldmVudHNbMF0gOiBldmVudHM7XG4gICAgZWxzZSBjbGVhckV2ZW50KHRoaXMsIGV2dCk7XG4gIH1cblxuICByZXR1cm4gdGhpcztcbn07XG5cbi8qKlxuICogUmVtb3ZlIGFsbCBsaXN0ZW5lcnMsIG9yIHRob3NlIG9mIHRoZSBzcGVjaWZpZWQgZXZlbnQuXG4gKlxuICogQHBhcmFtIHsoU3RyaW5nfFN5bWJvbCl9IFtldmVudF0gVGhlIGV2ZW50IG5hbWUuXG4gKiBAcmV0dXJucyB7RXZlbnRFbWl0dGVyfSBgdGhpc2AuXG4gKiBAcHVibGljXG4gKi9cbkV2ZW50RW1pdHRlci5wcm90b3R5cGUucmVtb3ZlQWxsTGlzdGVuZXJzID0gZnVuY3Rpb24gcmVtb3ZlQWxsTGlzdGVuZXJzKGV2ZW50KSB7XG4gIHZhciBldnQ7XG5cbiAgaWYgKGV2ZW50KSB7XG4gICAgZXZ0ID0gcHJlZml4ID8gcHJlZml4ICsgZXZlbnQgOiBldmVudDtcbiAgICBpZiAodGhpcy5fZXZlbnRzW2V2dF0pIGNsZWFyRXZlbnQodGhpcywgZXZ0KTtcbiAgfSBlbHNlIHtcbiAgICB0aGlzLl9ldmVudHMgPSBuZXcgRXZlbnRzKCk7XG4gICAgdGhpcy5fZXZlbnRzQ291bnQgPSAwO1xuICB9XG5cbiAgcmV0dXJuIHRoaXM7XG59O1xuXG4vL1xuLy8gQWxpYXMgbWV0aG9kcyBuYW1lcyBiZWNhdXNlIHBlb3BsZSByb2xsIGxpa2UgdGhhdC5cbi8vXG5FdmVudEVtaXR0ZXIucHJvdG90eXBlLm9mZiA9IEV2ZW50RW1pdHRlci5wcm90b3R5cGUucmVtb3ZlTGlzdGVuZXI7XG5FdmVudEVtaXR0ZXIucHJvdG90eXBlLmFkZExpc3RlbmVyID0gRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5vbjtcblxuLy9cbi8vIEV4cG9zZSB0aGUgcHJlZml4LlxuLy9cbkV2ZW50RW1pdHRlci5wcmVmaXhlZCA9IHByZWZpeDtcblxuLy9cbi8vIEFsbG93IGBFdmVudEVtaXR0ZXJgIHRvIGJlIGltcG9ydGVkIGFzIG1vZHVsZSBuYW1lc3BhY2UuXG4vL1xuRXZlbnRFbWl0dGVyLkV2ZW50RW1pdHRlciA9IEV2ZW50RW1pdHRlcjtcblxuLy9cbi8vIEV4cG9zZSB0aGUgbW9kdWxlLlxuLy9cbmlmICgndW5kZWZpbmVkJyAhPT0gdHlwZW9mIG1vZHVsZSkge1xuICBtb2R1bGUuZXhwb3J0cyA9IEV2ZW50RW1pdHRlcjtcbn1cbiIsCiAgICAiaW1wb3J0IEV2ZW50RW1pdHRlciBmcm9tICcuL2luZGV4LmpzJ1xuXG5leHBvcnQgeyBFdmVudEVtaXR0ZXIgfVxuZXhwb3J0IGRlZmF1bHQgRXZlbnRFbWl0dGVyXG4iLAogICAgIi8qIVxuICogYWN0aXZpdHktc3RyZWFtc1xuICogICBodHRwczovL2dpdGh1Yi5jb20vc2lsdmVyYnVja2V0L2FjdGl2aXR5LXN0cmVhbXNcbiAqXG4gKiBEZXZlbG9wZWQgYW5kIE1haW50YWluZWQgYnk6XG4gKiAgIE5pY2sgSmVubmluZ3MgPG5pY2tAc2lsdmVyYnVja2V0Lm5ldD5cbiAqXG4gKiBhY3Rpdml0eS1zdHJlYW1zIGlzIHJlbGVhc2VkIHVuZGVyIHRoZSBNSVQgKHNlZSBMSUNFTlNFKS5cbiAqXG4gKiBZb3UgZG9uJ3QgaGF2ZSB0byBkbyBhbnl0aGluZyBzcGVjaWFsIHRvIGNob29zZSBvbmUgbGljZW5zZSBvciB0aGUgb3RoZXJcbiAqIGFuZCB5b3UgZG9uJ3QgaGF2ZSB0byBub3RpZnkgYW55b25lIHdoaWNoIGxpY2Vuc2UgeW91IGFyZSB1c2luZy5cbiAqIFBsZWFzZSBzZWUgdGhlIGNvcnJlc3BvbmRpbmcgbGljZW5zZSBmaWxlIGZvciBkZXRhaWxzIG9mIHRoZXNlIGxpY2Vuc2VzLlxuICogWW91IGFyZSBmcmVlIHRvIHVzZSwgbW9kaWZ5IGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUsIGJ1dCBhbGwgY29weXJpZ2h0XG4gKiBpbmZvcm1hdGlvbiBtdXN0IHJlbWFpbi5cbiAqXG4gKi9cblxuaW1wb3J0IHR5cGUgeyBBY3Rpdml0eU9iamVjdCwgQWN0aXZpdHlTdHJlYW0gfSBmcm9tIFwiQHNvY2tldGh1Yi9zY2hlbWFzXCI7XG5pbXBvcnQgRXZlbnRFbWl0dGVyIGZyb20gXCJldmVudGVtaXR0ZXIzXCI7XG5cbmNvbnN0IGVlID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuY29uc3QgYmFzZVByb3BzID0ge1xuICAgIHN0cmVhbTogW1xuICAgICAgICBcImlkXCIsXG4gICAgICAgIFwidHlwZVwiLFxuICAgICAgICBcImFjdG9yXCIsXG4gICAgICAgIFwidGFyZ2V0XCIsXG4gICAgICAgIFwib2JqZWN0XCIsXG4gICAgICAgIFwiY29udGV4dFwiLFxuICAgICAgICBcImNvbnRleHRcIixcbiAgICAgICAgXCJwdWJsaXNoZWRcIixcbiAgICAgICAgXCJlcnJvclwiLFxuICAgIF0sXG4gICAgb2JqZWN0OiBbXG4gICAgICAgIFwiaWRcIixcbiAgICAgICAgXCJ0eXBlXCIsXG4gICAgICAgIFwiY29udGV4dFwiLFxuICAgICAgICBcImFsaWFzXCIsXG4gICAgICAgIFwiYXR0YWNoZWRUb1wiLFxuICAgICAgICBcImF0dGFjaG1lbnRcIixcbiAgICAgICAgXCJhdHRyaWJ1dGVkVG9cIixcbiAgICAgICAgXCJhdHRyaWJ1dGVkV2l0aFwiLFxuICAgICAgICBcImNvbmRpdGlvblwiLFxuICAgICAgICBcImNvbnRlbnRcIixcbiAgICAgICAgXCJjb250ZW50TWFwXCIsXG4gICAgICAgIFwiY29udGV4dFwiLFxuICAgICAgICBcImNvbnRleHRPZlwiLFxuICAgICAgICBcIm5hbWVcIixcbiAgICAgICAgXCJlbmRUaW1lXCIsXG4gICAgICAgIFwiZ2VuZXJhdG9yXCIsXG4gICAgICAgIFwiZ2VuZXJhdG9yT2ZcIixcbiAgICAgICAgXCJncm91cFwiLFxuICAgICAgICBcImljb25cIixcbiAgICAgICAgXCJpbWFnZVwiLFxuICAgICAgICBcImluUmVwbHlUb1wiLFxuICAgICAgICBcIm1lbWJlcnNcIixcbiAgICAgICAgXCJtZW1iZXJPZlwiLFxuICAgICAgICBcIm1lc3NhZ2VcIixcbiAgICAgICAgXCJsb2NhdGlvblwiLFxuICAgICAgICBcImxvY2F0aW9uT2ZcIixcbiAgICAgICAgXCJvYmplY3RPZlwiLFxuICAgICAgICBcIm9yaWdpbk9mXCIsXG4gICAgICAgIFwicHJlc2VuY2VcIixcbiAgICAgICAgXCJwcmV2aWV3XCIsXG4gICAgICAgIFwicHJldmlld09mXCIsXG4gICAgICAgIFwicHJvdmlkZXJcIixcbiAgICAgICAgXCJwcm92aWRlck9mXCIsXG4gICAgICAgIFwicHVibGlzaGVkXCIsXG4gICAgICAgIFwicmF0aW5nXCIsXG4gICAgICAgIFwicmVsYXRpb25zaGlwXCIsXG4gICAgICAgIFwicmVzdWx0T2ZcIixcbiAgICAgICAgXCJyZXBsaWVzXCIsXG4gICAgICAgIFwicm9sZVwiLFxuICAgICAgICBcInNjb3BlXCIsXG4gICAgICAgIFwic2NvcGVPZlwiLFxuICAgICAgICBcInN0YXJ0VGltZVwiLFxuICAgICAgICBcInN0YXR1c1wiLFxuICAgICAgICBcInN1bW1hcnlcIixcbiAgICAgICAgXCJ0b3BpY1wiLFxuICAgICAgICBcInRhZ1wiLFxuICAgICAgICBcInRhZ09mXCIsXG4gICAgICAgIFwidGFyZ2V0T2ZcIixcbiAgICAgICAgXCJ0aXRsZVwiLFxuICAgICAgICBcInRpdGxlTWFwXCIsXG4gICAgICAgIFwidXBkYXRlZFwiLFxuICAgICAgICBcInVybFwiLFxuICAgICAgICBcInhtcHA6c3RhbnphLWlkXCIsXG4gICAgXSxcbn07XG5jb25zdCByZW5hbWUgPSB7XG4gICAgXCJAaWRcIjogXCJpZFwiLFxuICAgIFwiQHR5cGVcIjogXCJ0eXBlXCIsXG4gICAgdmVyYjogXCJ0eXBlXCIsXG4gICAgZGlzcGxheU5hbWU6IFwibmFtZVwiLFxuICAgIG9iamVjdFR5cGU6IFwidHlwZVwiLFxuICAgIHBsYXRmb3JtOiBcImNvbnRleHRcIixcbn07XG5jb25zdCBleHBhbmQgPSB7XG4gICAgYWN0b3I6IHtcbiAgICAgICAgcHJpbWFyeTogXCJpZFwiLFxuICAgICAgICBwcm9wczogYmFzZVByb3BzLFxuICAgIH0sXG4gICAgdGFyZ2V0OiB7XG4gICAgICAgIHByaW1hcnk6IFwiaWRcIixcbiAgICAgICAgcHJvcHM6IGJhc2VQcm9wcyxcbiAgICB9LFxuICAgIG9iamVjdDoge1xuICAgICAgICBwcmltYXJ5OiBcImNvbnRlbnRcIixcbiAgICAgICAgcHJvcHM6IGJhc2VQcm9wcyxcbiAgICB9LFxufTtcblxudHlwZSBDdXN0b21Qcm9wcyA9IHtcbiAgICBba2V5OiBzdHJpbmddOiBzdHJpbmcgfCBudW1iZXIgfCBib29sZWFuIHwgb2JqZWN0IHwgc3RyaW5nW107XG59O1xuXG5jb25zdCBvYmpzID0gbmV3IE1hcCgpO1xuY29uc3QgY3VzdG9tUHJvcHM6IEN1c3RvbVByb3BzID0ge307XG5cbmxldCBmYWlsT25Vbmtub3duT2JqZWN0UHJvcGVydGllcyA9IGZhbHNlO1xubGV0IHdhcm5PblVua25vd25PYmplY3RQcm9wZXJ0aWVzID0gdHJ1ZTtcbmxldCBzcGVjaWFsT2JqcyA9IFtdOyAvLyB0aGUgb2JqZWN0cyBkb24ndCBnZXQgcmVqZWN0ZWQgZm9yIGJhZCBwcm9wc1xuXG5mdW5jdGlvbiBtYXRjaGVzQ3VzdG9tUHJvcCh0eXBlOiBzdHJpbmcsIGtleTogc3RyaW5nKSB7XG4gICAgaWYgKGN1c3RvbVByb3BzW3R5cGVdIGluc3RhbmNlb2YgT2JqZWN0KSB7XG4gICAgICAgIGNvbnN0IG9iaiA9IGN1c3RvbVByb3BzW3R5cGVdIGFzIHN0cmluZ1tdO1xuICAgICAgICBpZiAob2JqLmluY2x1ZGVzKGtleSkpIHtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbn1cblxuZnVuY3Rpb24gcmVuYW1lUHJvcDxUPihvYmo6IFQsIGtleTogc3RyaW5nKTogVCB7XG4gICAgb2JqW3JlbmFtZVtrZXldXSA9IG9ialtrZXldO1xuICAgIGRlbGV0ZSBvYmpba2V5XTtcbiAgICByZXR1cm4gb2JqO1xufVxuXG5mdW5jdGlvbiB2YWxpZGF0ZU9iamVjdDxUPih0eXBlOiBzdHJpbmcsIGluY29taW5nT2JqOiBULCByZXF1aXJlSWQgPSBmYWxzZSkge1xuICAgIC8vIElucHV0IHZhbGlkYXRpb24gd2l0aCBjbGVhciBlcnJvciBtZXNzYWdlc1xuICAgIGlmIChpbmNvbWluZ09iaiA9PT0gbnVsbCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICBgQWN0aXZpdHlTdHJlYW1zIHZhbGlkYXRpb24gZmFpbGVkOiB0aGUgXCIke3R5cGV9XCIgcHJvcGVydHkgaXMgbnVsbC4gRXhhbXBsZTogeyBpZDogXCJ1c2VyQGV4YW1wbGUuY29tXCIsIHR5cGU6IFwicGVyc29uXCIgfWAsXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgaWYgKGluY29taW5nT2JqID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgYEFjdGl2aXR5U3RyZWFtcyB2YWxpZGF0aW9uIGZhaWxlZDogdGhlIFwiJHt0eXBlfVwiIHByb3BlcnR5IGlzIHVuZGVmaW5lZC4gRXhhbXBsZTogeyBpZDogXCJ1c2VyQGV4YW1wbGUuY29tXCIsIHR5cGU6IFwicGVyc29uXCIgfWAsXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBpbmNvbWluZ09iaiA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICBgQWN0aXZpdHlTdHJlYW1zIHZhbGlkYXRpb24gZmFpbGVkOiB0aGUgXCIke3R5cGV9XCIgcHJvcGVydHkgcmVjZWl2ZWQgc3RyaW5nIFwiJHtpbmNvbWluZ09ian1cIiBidXQgZXhwZWN0ZWQgYW4gb2JqZWN0LiBVc2U6IHsgaWQ6IFwiJHtpbmNvbWluZ09ian1cIiwgdHlwZTogXCJwZXJzb25cIiB9YCxcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIGluY29taW5nT2JqICE9PSBcIm9iamVjdFwiIHx8IEFycmF5LmlzQXJyYXkoaW5jb21pbmdPYmopKSB7XG4gICAgICAgIGNvbnN0IHJlY2VpdmVkVHlwZSA9IEFycmF5LmlzQXJyYXkoaW5jb21pbmdPYmopXG4gICAgICAgICAgICA/IFwiYXJyYXlcIlxuICAgICAgICAgICAgOiB0eXBlb2YgaW5jb21pbmdPYmo7XG4gICAgICAgIGNvbnN0IHJlY2VpdmVkVmFsdWUgPSBTdHJpbmcoaW5jb21pbmdPYmopO1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICBgQWN0aXZpdHlTdHJlYW1zIHZhbGlkYXRpb24gZmFpbGVkOiB0aGUgXCIke3R5cGV9XCIgcHJvcGVydHkgbXVzdCBiZSBhbiBvYmplY3QsIHJlY2VpdmVkICR7cmVjZWl2ZWRUeXBlfSAoJHtyZWNlaXZlZFZhbHVlfSkuIEV4YW1wbGU6IHsgaWQ6IFwidXNlckBleGFtcGxlLmNvbVwiLCB0eXBlOiBcInBlcnNvblwiIH1gLFxuICAgICAgICApO1xuICAgIH1cblxuICAgIC8vIFJlcXVpcmUgJ2lkJyBwcm9wZXJ0eSB3aGVuIGV4cGxpY2l0bHkgcmVxdWVzdGVkIChlLmcuLCBPYmplY3QuY3JlYXRlKCkpXG4gICAgY29uc3Qgb2JqID0gaW5jb21pbmdPYmogYXMgQWN0aXZpdHlPYmplY3Q7XG4gICAgaWYgKHJlcXVpcmVJZCAmJiAhb2JqLmlkKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgIGBBY3Rpdml0eVN0cmVhbXMgdmFsaWRhdGlvbiBmYWlsZWQ6IHRoZSBcIiR7dHlwZX1cIiBwcm9wZXJ0eSByZXF1aXJlcyBhbiAnaWQnIHByb3BlcnR5LiBFeGFtcGxlOiB7IGlkOiBcInVzZXJAZXhhbXBsZS5jb21cIiwgdHlwZTogXCJwZXJzb25cIiB9YCxcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBjb25zdCB1bmtub3duS2V5cyA9IE9iamVjdC5rZXlzKGluY29taW5nT2JqKS5maWx0ZXIoXG4gICAgICAgIChrZXk6IHN0cmluZyk6IGJvb2xlYW4gPT4ge1xuICAgICAgICAgICAgcmV0dXJuICFiYXNlUHJvcHNbdHlwZV0uaW5jbHVkZXMoa2V5KTtcbiAgICAgICAgfSxcbiAgICApO1xuXG4gICAgZm9yIChjb25zdCBrZXkgb2YgdW5rbm93bktleXMpIHtcbiAgICAgICAgbGV0IGFvOiBBY3Rpdml0eU9iamVjdCA9IGluY29taW5nT2JqIGFzIEFjdGl2aXR5T2JqZWN0O1xuICAgICAgICBpZiAocmVuYW1lW2tleV0pIHtcbiAgICAgICAgICAgIC8vIHJlbmFtZSBwcm9wZXJ0eSBpbnN0ZWFkIG9mIGZhaWxcbiAgICAgICAgICAgIGFvID0gcmVuYW1lUHJvcChhbywga2V5KTtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKG1hdGNoZXNDdXN0b21Qcm9wKGFvLnR5cGUsIGtleSkpIHtcbiAgICAgICAgICAgIC8vIGN1c3RvbSBwcm9wZXJ0eSBtYXRjaGVzLCBjb250aW51ZVxuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIXNwZWNpYWxPYmpzLmluY2x1ZGVzKGFvLnR5cGUpKSB7XG4gICAgICAgICAgICAvLyBub3QgZGVmaW5lZCBhcyBhIHNwZWNpYWwgcHJvcFxuICAgICAgICAgICAgLy8gZG9uJ3Qga25vdyB3aGF0IHRvIGRvIHdpdGggaXQsIHNvIHRocm93IGVycm9yXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhhbyk7XG4gICAgICAgICAgICBjb25zdCByZWNlaXZlZFZhbHVlID1cbiAgICAgICAgICAgICAgICB0eXBlb2YgYW9ba2V5XSA9PT0gXCJzdHJpbmdcIiA/IGBcIiR7YW9ba2V5XX1cImAgOiBTdHJpbmcoYW9ba2V5XSk7XG4gICAgICAgICAgICBjb25zdCBlcnIgPSBgQWN0aXZpdHlTdHJlYW1zIHZhbGlkYXRpb24gZmFpbGVkOiBwcm9wZXJ0eSBcIiR7a2V5fVwiIHdpdGggdmFsdWUgJHtyZWNlaXZlZFZhbHVlfSBpcyBub3QgYWxsb3dlZCBvbiB0aGUgXCIke3R5cGV9XCIgb2JqZWN0IG9mIHR5cGUgXCIke2FvLnR5cGV9XCIuYDtcbiAgICAgICAgICAgIGlmIChmYWlsT25Vbmtub3duT2JqZWN0UHJvcGVydGllcykge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihlcnIpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHdhcm5PblVua25vd25PYmplY3RQcm9wZXJ0aWVzKSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS53YXJuKGVycik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG59XG5cbmZ1bmN0aW9uIGVuc3VyZVByb3BzKG9iajogQWN0aXZpdHlPYmplY3QpOiBBY3Rpdml0eU9iamVjdCB7XG4gICAgLy8gZW5zdXJlIHRoZSBuYW1lIHByb3BlcnR5LCB3aGljaCBjYW4gZ2VuZXJhbGx5IGJlIGluZmVycmVkIGZyb20gdGhlIGlkXG4gICAgLy8gbmFtZSA9IG9iai5tYXRjaCgvKD8oP1xcdyspOlxcL1xcLykoPzouK0ApPyguKz8pKD86XFwvfCQpLylbMV1cbiAgICByZXR1cm4gb2JqO1xufVxuXG5mdW5jdGlvbiBleHBhbmRTdHJlYW0obWV0YTogQWN0aXZpdHlTdHJlYW0pIHtcbiAgICBjb25zdCBzdHJlYW0gPSB7fTtcbiAgICBmb3IgKGNvbnN0IGtleSBvZiBPYmplY3Qua2V5cyhtZXRhKSkge1xuICAgICAgICBpZiAodHlwZW9mIG1ldGFba2V5XSA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgICAgICAgc3RyZWFtW2tleV0gPSBvYmpzLmdldChtZXRhW2tleV0pIHx8IG1ldGFba2V5XTtcbiAgICAgICAgfSBlbHNlIGlmIChBcnJheS5pc0FycmF5KG1ldGFba2V5XSkpIHtcbiAgICAgICAgICAgIHN0cmVhbVtrZXldID0gW107XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGVudHJ5IG9mIG1ldGFba2V5XSkge1xuICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgZW50cnkgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgc3RyZWFtW2tleV0ucHVzaChvYmpzLmdldChlbnRyeSkgfHwgZW50cnkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHN0cmVhbVtrZXldID0gbWV0YVtrZXldO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gb25seSBleHBhbmQgc3RyaW5nIGludG8gb2JqZWN0cyBpZiB0aGV5IGFyZSBpbiB0aGUgZXhwYW5kIGxpc3RcbiAgICBmb3IgKGNvbnN0IGtleSBvZiBPYmplY3Qua2V5cyhleHBhbmQpKSB7XG4gICAgICAgIGlmICh0eXBlb2Ygc3RyZWFtW2tleV0gPT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgICAgIGNvbnN0IGlkeCA9IGV4cGFuZFtrZXldLnByaW1hcnk7XG4gICAgICAgICAgICBjb25zdCBvYmogPSB7fTtcbiAgICAgICAgICAgIG9ialtpZHhdID0gc3RyZWFtW2tleV07XG4gICAgICAgICAgICBzdHJlYW1ba2V5XSA9IG9iajtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gc3RyZWFtO1xufVxuXG5mdW5jdGlvbiBTdHJlYW0oXG4gICAgbWV0YTogQWN0aXZpdHlTdHJlYW0sXG4pOiBBY3Rpdml0eVN0cmVhbSB8IEFjdGl2aXR5T2JqZWN0IHwgUmVjb3JkPHN0cmluZywgbmV2ZXI+IHtcbiAgICB2YWxpZGF0ZU9iamVjdChcInN0cmVhbVwiLCBtZXRhKTtcbiAgICBpZiAodHlwZW9mIG1ldGEub2JqZWN0ID09PSBcIm9iamVjdFwiKSB7XG4gICAgICAgIHZhbGlkYXRlT2JqZWN0KFwib2JqZWN0XCIsIG1ldGEub2JqZWN0KTtcbiAgICB9XG4gICAgY29uc3Qgc3RyZWFtID0gZXhwYW5kU3RyZWFtKG1ldGEpO1xuICAgIGVlLmVtaXQoXCJhY3Rpdml0eS1zdHJlYW1cIiwgc3RyZWFtKTtcbiAgICByZXR1cm4gc3RyZWFtO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEFjdGl2aXR5T2JqZWN0TWFuYWdlciB7XG4gICAgY3JlYXRlKG9iajogdW5rbm93bik6IHVua25vd247XG4gICAgZGVsZXRlKGlkOiBzdHJpbmcpOiBib29sZWFuO1xuICAgIGxpc3QoKTogSXRlcmFibGVJdGVyYXRvcjx1bmtub3duPjtcbiAgICBnZXQoaWQ6IHN0cmluZywgZXhwYW5kPzogYm9vbGVhbik6IHVua25vd247XG59XG5cbmNvbnN0IF9PYmplY3Q6IEFjdGl2aXR5T2JqZWN0TWFuYWdlciA9IHtcbiAgICBjcmVhdGU6IChvYmo6IEFjdGl2aXR5T2JqZWN0KSA9PiB7XG4gICAgICAgIHZhbGlkYXRlT2JqZWN0KFwib2JqZWN0XCIsIG9iaiwgdHJ1ZSk7IC8vIHJlcXVpcmUgSUQgZm9yIE9iamVjdC5jcmVhdGUoKVxuICAgICAgICBjb25zdCBhbyA9IGVuc3VyZVByb3BzKG9iaik7XG4gICAgICAgIG9ianMuc2V0KGFvLmlkLCBhbyk7XG4gICAgICAgIGVlLmVtaXQoXCJhY3Rpdml0eS1vYmplY3QtY3JlYXRlXCIsIGFvKTtcbiAgICAgICAgcmV0dXJuIGFvO1xuICAgIH0sXG5cbiAgICBkZWxldGU6IChpZCkgPT4ge1xuICAgICAgICBjb25zdCByZXN1bHQgPSBvYmpzLmRlbGV0ZShpZCk7XG4gICAgICAgIGlmIChyZXN1bHQpIHtcbiAgICAgICAgICAgIGVlLmVtaXQoXCJhY3Rpdml0eS1vYmplY3QtZGVsZXRlXCIsIGlkKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH0sXG5cbiAgICBnZXQ6IChpZCwgZXhwYW5kKSA9PiB7XG4gICAgICAgIGxldCBvYmogPSBvYmpzLmdldChpZCk7XG4gICAgICAgIGlmICghb2JqKSB7XG4gICAgICAgICAgICBpZiAoIWV4cGFuZCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBpZDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIG9iaiA9IHsgaWQ6IGlkIH07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGVuc3VyZVByb3BzKG9iaik7XG4gICAgfSxcblxuICAgIGxpc3Q6ICgpOiBJdGVyYWJsZUl0ZXJhdG9yPHVua25vd24+ID0+IG9ianMua2V5cygpLFxufTtcblxuZXhwb3J0IGludGVyZmFjZSBBU0ZhY3RvcnlPcHRpb25zIHtcbiAgICBzcGVjaWFsT2Jqcz86IEFycmF5PHN0cmluZz47XG4gICAgZmFpbE9uVW5rbm93bk9iamVjdFByb3BlcnRpZXM/OiBib29sZWFuO1xuICAgIHdhcm5PblVua25vd25PYmplY3RQcm9wZXJ0aWVzPzogYm9vbGVhbjtcbiAgICBjdXN0b21Qcm9wcz86IEN1c3RvbVByb3BzO1xufVxuXG50eXBlIEV2ZW50Q2FsbGJhY2sgPSAoLi4uYXJnczogdW5rbm93bltdKSA9PiB2b2lkO1xuXG5leHBvcnQgaW50ZXJmYWNlIEFTTWFuYWdlciB7XG4gICAgU3RyZWFtKG1ldGE6IHVua25vd24pOiBBY3Rpdml0eVN0cmVhbSB8IEFjdGl2aXR5T2JqZWN0O1xuICAgIE9iamVjdDogQWN0aXZpdHlPYmplY3RNYW5hZ2VyO1xuICAgIG9uKGV2ZW50OiBzdHJpbmcsIGZ1bmM6IEV2ZW50Q2FsbGJhY2spOiB2b2lkO1xuICAgIG9uY2UoZXZlbnQ6IHN0cmluZywgZnVuYzogRXZlbnRDYWxsYmFjayk6IHZvaWQ7XG4gICAgb2ZmKGV2ZW50OiBzdHJpbmcsIGZ1bmM6IEV2ZW50Q2FsbGJhY2spOiB2b2lkO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gQVNGYWN0b3J5KG9wdHM6IEFTRmFjdG9yeU9wdGlvbnMgPSB7fSk6IEFTTWFuYWdlciB7XG4gICAgc3BlY2lhbE9ianMgPSBvcHRzPy5zcGVjaWFsT2JqcyB8fCBbXTtcbiAgICBmYWlsT25Vbmtub3duT2JqZWN0UHJvcGVydGllcyA9XG4gICAgICAgIHR5cGVvZiBvcHRzLmZhaWxPblVua25vd25PYmplY3RQcm9wZXJ0aWVzID09PSBcImJvb2xlYW5cIlxuICAgICAgICAgICAgPyBvcHRzLmZhaWxPblVua25vd25PYmplY3RQcm9wZXJ0aWVzXG4gICAgICAgICAgICA6IGZhaWxPblVua25vd25PYmplY3RQcm9wZXJ0aWVzO1xuICAgIHdhcm5PblVua25vd25PYmplY3RQcm9wZXJ0aWVzID1cbiAgICAgICAgdHlwZW9mIG9wdHMud2Fybk9uVW5rbm93bk9iamVjdFByb3BlcnRpZXMgPT09IFwiYm9vbGVhblwiXG4gICAgICAgICAgICA/IG9wdHMud2Fybk9uVW5rbm93bk9iamVjdFByb3BlcnRpZXNcbiAgICAgICAgICAgIDogd2Fybk9uVW5rbm93bk9iamVjdFByb3BlcnRpZXM7XG4gICAgZm9yIChjb25zdCBwcm9wTmFtZSBvZiBPYmplY3Qua2V5cyhvcHRzLmN1c3RvbVByb3BzIHx8IHt9KSkge1xuICAgICAgICBpZiAodHlwZW9mIG9wdHMuY3VzdG9tUHJvcHNbcHJvcE5hbWVdID09PSBcIm9iamVjdFwiKSB7XG4gICAgICAgICAgICBjdXN0b21Qcm9wc1twcm9wTmFtZV0gPSBvcHRzLmN1c3RvbVByb3BzW3Byb3BOYW1lXTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICAgIFN0cmVhbTogU3RyZWFtLFxuICAgICAgICBPYmplY3Q6IF9PYmplY3QsXG4gICAgICAgIG9uOiAoZXZlbnQsIGZ1bmMpID0+IGVlLm9uKGV2ZW50LCBmdW5jKSxcbiAgICAgICAgb25jZTogKGV2ZW50LCBmdW5jKSA9PiBlZS5vbmNlKGV2ZW50LCBmdW5jKSxcbiAgICAgICAgb2ZmOiAoZXZlbnQsIGZ1bmNOYW1lKSA9PiBlZS5vZmYoZXZlbnQsIGZ1bmNOYW1lKSxcbiAgICB9IGFzIEFTTWFuYWdlcjtcbn1cblxuLy8gYmlvbWUtaWdub3JlIGxpbnQvc3VzcGljaW91cy9ub0V4cGxpY2l0QW55OiA8ZXhwbGFuYXRpb24+XG4oKGdsb2JhbDogYW55KSA9PiB7XG4gICAgZ2xvYmFsLkFTRmFjdG9yID0gQVNGYWN0b3J5O1xufSkodHlwZW9mIHdpbmRvdyA9PT0gXCJvYmplY3RcIiA/IHdpbmRvdyA6IHt9KTtcbiIKICBdLAogICJtYXBwaW5ncyI6ICI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0VBRUEsSUFBSSxNQUFNLE9BQU8sVUFBVTtBQUFBLEVBQTNCLElBQ0ksU0FBUztBQUFBLEVBU2IsU0FBUyxNQUFNLEdBQUc7QUFBQSxFQVNsQixJQUFJLE9BQU8sUUFBUTtBQUFBLElBQ2pCLE9BQU8sWUFBWSxPQUFPLE9BQU8sSUFBSTtBQUFBLElBTXJDLElBQUksQ0FBQyxJQUFJLE9BQU8sRUFBRTtBQUFBLE1BQVcsU0FBUztBQUFBLEVBQ3hDO0FBQUEsRUFXQSxTQUFTLEVBQUUsQ0FBQyxJQUFJLFNBQVMsTUFBTTtBQUFBLElBQzdCLEtBQUssS0FBSztBQUFBLElBQ1YsS0FBSyxVQUFVO0FBQUEsSUFDZixLQUFLLE9BQU8sUUFBUTtBQUFBO0FBQUEsRUFjdEIsU0FBUyxXQUFXLENBQUMsU0FBUyxPQUFPLElBQUksU0FBUyxNQUFNO0FBQUEsSUFDdEQsSUFBSSxPQUFPLE9BQU8sWUFBWTtBQUFBLE1BQzVCLE1BQU0sSUFBSSxVQUFVLGlDQUFpQztBQUFBLElBQ3ZEO0FBQUEsSUFFQSxJQUFJLFdBQVcsSUFBSSxHQUFHLElBQUksV0FBVyxTQUFTLElBQUksR0FDOUMsTUFBTSxTQUFTLFNBQVMsUUFBUTtBQUFBLElBRXBDLElBQUksQ0FBQyxRQUFRLFFBQVE7QUFBQSxNQUFNLFFBQVEsUUFBUSxPQUFPLFVBQVUsUUFBUTtBQUFBLElBQy9ELFNBQUksQ0FBQyxRQUFRLFFBQVEsS0FBSztBQUFBLE1BQUksUUFBUSxRQUFRLEtBQUssS0FBSyxRQUFRO0FBQUEsSUFDaEU7QUFBQSxjQUFRLFFBQVEsT0FBTyxDQUFDLFFBQVEsUUFBUSxNQUFNLFFBQVE7QUFBQSxJQUUzRCxPQUFPO0FBQUE7QUFBQSxFQVVULFNBQVMsVUFBVSxDQUFDLFNBQVMsS0FBSztBQUFBLElBQ2hDLElBQUksRUFBRSxRQUFRLGlCQUFpQjtBQUFBLE1BQUcsUUFBUSxVQUFVLElBQUk7QUFBQSxJQUNuRDtBQUFBLGFBQU8sUUFBUSxRQUFRO0FBQUE7QUFBQSxFQVU5QixTQUFTLFlBQVksR0FBRztBQUFBLElBQ3RCLEtBQUssVUFBVSxJQUFJO0FBQUEsSUFDbkIsS0FBSyxlQUFlO0FBQUE7QUFBQSxFQVV0QixhQUFhLFVBQVUsYUFBYSxTQUFTLFVBQVUsR0FBRztBQUFBLElBQ3hELElBQUksUUFBUSxDQUFDLEdBQ1QsUUFDQTtBQUFBLElBRUosSUFBSSxLQUFLLGlCQUFpQjtBQUFBLE1BQUcsT0FBTztBQUFBLElBRXBDLEtBQUssUUFBUyxTQUFTLEtBQUssU0FBVTtBQUFBLE1BQ3BDLElBQUksSUFBSSxLQUFLLFFBQVEsSUFBSTtBQUFBLFFBQUcsTUFBTSxLQUFLLFNBQVMsS0FBSyxNQUFNLENBQUMsSUFBSSxJQUFJO0FBQUEsSUFDdEU7QUFBQSxJQUVBLElBQUksT0FBTyx1QkFBdUI7QUFBQSxNQUNoQyxPQUFPLE1BQU0sT0FBTyxPQUFPLHNCQUFzQixNQUFNLENBQUM7QUFBQSxJQUMxRDtBQUFBLElBRUEsT0FBTztBQUFBO0FBQUEsRUFVVCxhQUFhLFVBQVUsWUFBWSxTQUFTLFNBQVMsQ0FBQyxPQUFPO0FBQUEsSUFDM0QsSUFBSSxNQUFNLFNBQVMsU0FBUyxRQUFRLE9BQ2hDLFdBQVcsS0FBSyxRQUFRO0FBQUEsSUFFNUIsSUFBSSxDQUFDO0FBQUEsTUFBVSxPQUFPLENBQUM7QUFBQSxJQUN2QixJQUFJLFNBQVM7QUFBQSxNQUFJLE9BQU8sQ0FBQyxTQUFTLEVBQUU7QUFBQSxJQUVwQyxTQUFTLElBQUksR0FBRyxJQUFJLFNBQVMsUUFBUSxLQUFLLElBQUksTUFBTSxDQUFDLEVBQUcsSUFBSSxHQUFHLEtBQUs7QUFBQSxNQUNsRSxHQUFHLEtBQUssU0FBUyxHQUFHO0FBQUEsSUFDdEI7QUFBQSxJQUVBLE9BQU87QUFBQTtBQUFBLEVBVVQsYUFBYSxVQUFVLGdCQUFnQixTQUFTLGFBQWEsQ0FBQyxPQUFPO0FBQUEsSUFDbkUsSUFBSSxNQUFNLFNBQVMsU0FBUyxRQUFRLE9BQ2hDLFlBQVksS0FBSyxRQUFRO0FBQUEsSUFFN0IsSUFBSSxDQUFDO0FBQUEsTUFBVyxPQUFPO0FBQUEsSUFDdkIsSUFBSSxVQUFVO0FBQUEsTUFBSSxPQUFPO0FBQUEsSUFDekIsT0FBTyxVQUFVO0FBQUE7QUFBQSxFQVVuQixhQUFhLFVBQVUsT0FBTyxTQUFTLElBQUksQ0FBQyxPQUFPLElBQUksSUFBSSxJQUFJLElBQUksSUFBSTtBQUFBLElBQ3JFLElBQUksTUFBTSxTQUFTLFNBQVMsUUFBUTtBQUFBLElBRXBDLElBQUksQ0FBQyxLQUFLLFFBQVE7QUFBQSxNQUFNLE9BQU87QUFBQSxJQUUvQixJQUFJLFlBQVksS0FBSyxRQUFRLE1BQ3pCLE1BQU0sVUFBVSxRQUNoQixNQUNBO0FBQUEsSUFFSixJQUFJLFVBQVUsSUFBSTtBQUFBLE1BQ2hCLElBQUksVUFBVTtBQUFBLFFBQU0sS0FBSyxlQUFlLE9BQU8sVUFBVSxJQUFJLFdBQVcsSUFBSTtBQUFBLE1BRTVFLFFBQVE7QUFBQSxhQUNEO0FBQUEsVUFBRyxPQUFPLFVBQVUsR0FBRyxLQUFLLFVBQVUsT0FBTyxHQUFHO0FBQUEsYUFDaEQ7QUFBQSxVQUFHLE9BQU8sVUFBVSxHQUFHLEtBQUssVUFBVSxTQUFTLEVBQUUsR0FBRztBQUFBLGFBQ3BEO0FBQUEsVUFBRyxPQUFPLFVBQVUsR0FBRyxLQUFLLFVBQVUsU0FBUyxJQUFJLEVBQUUsR0FBRztBQUFBLGFBQ3hEO0FBQUEsVUFBRyxPQUFPLFVBQVUsR0FBRyxLQUFLLFVBQVUsU0FBUyxJQUFJLElBQUksRUFBRSxHQUFHO0FBQUEsYUFDNUQ7QUFBQSxVQUFHLE9BQU8sVUFBVSxHQUFHLEtBQUssVUFBVSxTQUFTLElBQUksSUFBSSxJQUFJLEVBQUUsR0FBRztBQUFBLGFBQ2hFO0FBQUEsVUFBRyxPQUFPLFVBQVUsR0FBRyxLQUFLLFVBQVUsU0FBUyxJQUFJLElBQUksSUFBSSxJQUFJLEVBQUUsR0FBRztBQUFBO0FBQUEsTUFHM0UsS0FBSyxJQUFJLEdBQUcsT0FBTyxJQUFJLE1BQU0sTUFBSyxDQUFDLEVBQUcsSUFBSSxLQUFLLEtBQUs7QUFBQSxRQUNsRCxLQUFLLElBQUksS0FBSyxVQUFVO0FBQUEsTUFDMUI7QUFBQSxNQUVBLFVBQVUsR0FBRyxNQUFNLFVBQVUsU0FBUyxJQUFJO0FBQUEsSUFDNUMsRUFBTztBQUFBLE1BQ0wsSUFBSSxTQUFTLFVBQVUsUUFDbkI7QUFBQSxNQUVKLEtBQUssSUFBSSxFQUFHLElBQUksUUFBUSxLQUFLO0FBQUEsUUFDM0IsSUFBSSxVQUFVLEdBQUc7QUFBQSxVQUFNLEtBQUssZUFBZSxPQUFPLFVBQVUsR0FBRyxJQUFJLFdBQVcsSUFBSTtBQUFBLFFBRWxGLFFBQVE7QUFBQSxlQUNEO0FBQUEsWUFBRyxVQUFVLEdBQUcsR0FBRyxLQUFLLFVBQVUsR0FBRyxPQUFPO0FBQUEsWUFBRztBQUFBLGVBQy9DO0FBQUEsWUFBRyxVQUFVLEdBQUcsR0FBRyxLQUFLLFVBQVUsR0FBRyxTQUFTLEVBQUU7QUFBQSxZQUFHO0FBQUEsZUFDbkQ7QUFBQSxZQUFHLFVBQVUsR0FBRyxHQUFHLEtBQUssVUFBVSxHQUFHLFNBQVMsSUFBSSxFQUFFO0FBQUEsWUFBRztBQUFBLGVBQ3ZEO0FBQUEsWUFBRyxVQUFVLEdBQUcsR0FBRyxLQUFLLFVBQVUsR0FBRyxTQUFTLElBQUksSUFBSSxFQUFFO0FBQUEsWUFBRztBQUFBO0FBQUEsWUFFOUQsSUFBSSxDQUFDO0FBQUEsY0FBTSxLQUFLLElBQUksR0FBRyxPQUFPLElBQUksTUFBTSxNQUFLLENBQUMsRUFBRyxJQUFJLEtBQUssS0FBSztBQUFBLGdCQUM3RCxLQUFLLElBQUksS0FBSyxVQUFVO0FBQUEsY0FDMUI7QUFBQSxZQUVBLFVBQVUsR0FBRyxHQUFHLE1BQU0sVUFBVSxHQUFHLFNBQVMsSUFBSTtBQUFBO0FBQUEsTUFFdEQ7QUFBQTtBQUFBLElBR0YsT0FBTztBQUFBO0FBQUEsRUFZVCxhQUFhLFVBQVUsS0FBSyxTQUFTLEVBQUUsQ0FBQyxPQUFPLElBQUksU0FBUztBQUFBLElBQzFELE9BQU8sWUFBWSxNQUFNLE9BQU8sSUFBSSxTQUFTLEtBQUs7QUFBQTtBQUFBLEVBWXBELGFBQWEsVUFBVSxPQUFPLFNBQVMsSUFBSSxDQUFDLE9BQU8sSUFBSSxTQUFTO0FBQUEsSUFDOUQsT0FBTyxZQUFZLE1BQU0sT0FBTyxJQUFJLFNBQVMsSUFBSTtBQUFBO0FBQUEsRUFhbkQsYUFBYSxVQUFVLGlCQUFpQixTQUFTLGNBQWMsQ0FBQyxPQUFPLElBQUksU0FBUyxNQUFNO0FBQUEsSUFDeEYsSUFBSSxNQUFNLFNBQVMsU0FBUyxRQUFRO0FBQUEsSUFFcEMsSUFBSSxDQUFDLEtBQUssUUFBUTtBQUFBLE1BQU0sT0FBTztBQUFBLElBQy9CLElBQUksQ0FBQyxJQUFJO0FBQUEsTUFDUCxXQUFXLE1BQU0sR0FBRztBQUFBLE1BQ3BCLE9BQU87QUFBQSxJQUNUO0FBQUEsSUFFQSxJQUFJLFlBQVksS0FBSyxRQUFRO0FBQUEsSUFFN0IsSUFBSSxVQUFVLElBQUk7QUFBQSxNQUNoQixJQUNFLFVBQVUsT0FBTyxPQUNoQixDQUFDLFFBQVEsVUFBVSxVQUNuQixDQUFDLFdBQVcsVUFBVSxZQUFZLFVBQ25DO0FBQUEsUUFDQSxXQUFXLE1BQU0sR0FBRztBQUFBLE1BQ3RCO0FBQUEsSUFDRixFQUFPO0FBQUEsTUFDTCxTQUFTLElBQUksR0FBRyxTQUFTLENBQUMsR0FBRyxTQUFTLFVBQVUsT0FBUSxJQUFJLFFBQVEsS0FBSztBQUFBLFFBQ3ZFLElBQ0UsVUFBVSxHQUFHLE9BQU8sTUFDbkIsUUFBUSxDQUFDLFVBQVUsR0FBRyxRQUN0QixXQUFXLFVBQVUsR0FBRyxZQUFZLFNBQ3JDO0FBQUEsVUFDQSxPQUFPLEtBQUssVUFBVSxFQUFFO0FBQUEsUUFDMUI7QUFBQSxNQUNGO0FBQUEsTUFLQSxJQUFJLE9BQU87QUFBQSxRQUFRLEtBQUssUUFBUSxPQUFPLE9BQU8sV0FBVyxJQUFJLE9BQU8sS0FBSztBQUFBLE1BQ3BFO0FBQUEsbUJBQVcsTUFBTSxHQUFHO0FBQUE7QUFBQSxJQUczQixPQUFPO0FBQUE7QUFBQSxFQVVULGFBQWEsVUFBVSxxQkFBcUIsU0FBUyxrQkFBa0IsQ0FBQyxPQUFPO0FBQUEsSUFDN0UsSUFBSTtBQUFBLElBRUosSUFBSSxPQUFPO0FBQUEsTUFDVCxNQUFNLFNBQVMsU0FBUyxRQUFRO0FBQUEsTUFDaEMsSUFBSSxLQUFLLFFBQVE7QUFBQSxRQUFNLFdBQVcsTUFBTSxHQUFHO0FBQUEsSUFDN0MsRUFBTztBQUFBLE1BQ0wsS0FBSyxVQUFVLElBQUk7QUFBQSxNQUNuQixLQUFLLGVBQWU7QUFBQTtBQUFBLElBR3RCLE9BQU87QUFBQTtBQUFBLEVBTVQsYUFBYSxVQUFVLE1BQU0sYUFBYSxVQUFVO0FBQUEsRUFDcEQsYUFBYSxVQUFVLGNBQWMsYUFBYSxVQUFVO0FBQUEsRUFLNUQsYUFBYSxXQUFXO0FBQUEsRUFLeEIsYUFBYSxlQUFlO0FBQUEsRUFLNUIsSUFBb0IsT0FBTyxXQUF2QixhQUErQjtBQUFBLElBQ2pDLE9BQU8sVUFBVTtBQUFBLEVBQ25CO0FBQUE7OztBQy9VQTtBQUdBLElBQWU7OztBQ2NmO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBR0EsSUFBTSxLQUFLLElBQUk7QUFDZixJQUFNLFlBQVk7QUFBQSxFQUNkLFFBQVE7QUFBQSxJQUNKO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxFQUNKO0FBQUEsRUFDQSxRQUFRO0FBQUEsSUFDSjtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxFQUNKO0FBQ0o7QUFDQSxJQUFNLFNBQVM7QUFBQSxFQUNYLE9BQU87QUFBQSxFQUNQLFNBQVM7QUFBQSxFQUNULE1BQU07QUFBQSxFQUNOLGFBQWE7QUFBQSxFQUNiLFlBQVk7QUFBQSxFQUNaLFVBQVU7QUFDZDtBQUNBLElBQU0sU0FBUztBQUFBLEVBQ1gsT0FBTztBQUFBLElB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SUFBTSxVQUFpQztBQUFBLEVBQ25DLFFBQVEsQ0FBQyxRQUF3QjtBQUFBLElBQzdCLGVBQWUsVUFBVSxLQUFLLElBQUk7QUFBQSxJQUNsQyxNQUFNLEtBQUssWUFBWSxHQUFHO0FBQUEsSUFDMUIsS0FBSyxJQUFJLEdBQUcsSUFBSSxFQUFFO0FBQUEsSUFDbEIsR0FBRyxLQUFLLDBCQUEwQixFQUFFO0FBQUEsSUFDcEMsT0FBTztBQUFBO0FBQUEsRUFHWCxRQUFRLENBQUMsT0FBTztBQUFBLElBQ1osTUFBTSxTQUFTLEtBQUssT0FBTyxFQUFFO0FBQUEsSUFDN0IsSUFBSSxRQUFRO0FBQUEsTUFDUixHQUFHLEtBQUssMEJBQTBCLEVBQUU7QUFBQSxJQUN4QztBQUFBLElBQ0EsT0FBTztBQUFBO0FBQUEsRUFHWCxLQUFLLENBQUMsSUFBSSxZQUFXO0FBQUEsSUFDakIsSUFBSSxNQUFNLEtBQUssSUFBSSxFQUFFO0FBQUEsSUFDckIsSUFBSSxDQUFDLEtBQUs7QUFBQSxNQUNOLElBQUksQ0FBQyxTQUFRO0FBQUEsUUFDVCxPQUFPO0FBQUEsTUFDWDtBQUFBLE1BQ0EsTUFBTSxFQUFFLEdBQU87QUFBQSxJQUNuQjtBQUFBLElBQ0EsT0FBTyxZQUFZLEdBQUc7QUFBQTtBQUFBLEVBRzFCLE1BQU0sTUFBaUMsS0FBSyxLQUFLO0FBQ3JEO0FBbUJPLFNBQVMsU0FBUyxDQUFDLE9BQXlCLENBQUMsR0FBYztBQUFBLEVBQzlELGNBQWMsTUFBTSxlQUFlLENBQUM7QUFBQSxFQUNwQyxnQ0FDSSxPQUFPLEtBQUssa0NBQWtDLFlBQ3hDLEtBQUssZ0NBQ0w7QUFBQSxFQUNWLGdDQUNJLE9BQU8sS0FBSyxrQ0FBa0MsWUFDeEMsS0FBSyxnQ0FDTDtBQUFBLEVBQ1YsV0FBVyxZQUFZLE9BQU8sS0FBSyxLQUFLLGVBQWUsQ0FBQyxDQUFDLEdBQUc7QUFBQSxJQUN4RCxJQUFJLE9BQU8sS0FBSyxZQUFZLGNBQWMsVUFBVTtBQUFBLE1BQ2hELFlBQVksWUFBWSxLQUFLLFlBQVk7QUFBQSxJQUM3QztBQUFBLEVBQ0o7QUFBQSxFQUVBLE9BQU87QUFBQSxJQUNIO0FBQUEsSUFDQSxRQUFRO0FBQUEsSUFDUixJQUFJLENBQUMsT0FBTyxTQUFTLEdBQUcsR0FBRyxPQUFPLElBQUk7QUFBQSxJQUN0QyxNQUFNLENBQUMsT0FBTyxTQUFTLEdBQUcsS0FBSyxPQUFPLElBQUk7QUFBQSxJQUMxQyxLQUFLLENBQUMsT0FBTyxhQUFhLEdBQUcsSUFBSSxPQUFPLFFBQVE7QUFBQSxFQUNwRDtBQUFBO0FBQUEsQ0FJSCxDQUFDLFdBQWdCO0FBQUEsRUFDZCxPQUFPLFdBQVc7QUFBQSxHQUNuQixPQUFPLFdBQVcsV0FBVyxTQUFTLENBQUMsQ0FBQzsiLAogICJkZWJ1Z0lkIjogIkJERjRGQTI4ODZCRUNGQjg2NDc1NkUyMTY0NzU2RTIxIiwKICAibmFtZXMiOiBbXQp9
|
|
489
|
+
//# debugId=D5BE26BB63349C2764756E2164756E21
|
|
490
|
+
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2V2ZW50ZW1pdHRlcjMvaW5kZXguanMiLCAiLi4vLi4vc2NoZW1hcy9kaXN0L2NvbnRleHQuanMiLCAiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2V2ZW50ZW1pdHRlcjMvaW5kZXgubWpzIiwgIi4uL3NyYy9hY3Rpdml0eS1zdHJlYW1zLnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWwogICAgIid1c2Ugc3RyaWN0JztcblxudmFyIGhhcyA9IE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHlcbiAgLCBwcmVmaXggPSAnfic7XG5cbi8qKlxuICogQ29uc3RydWN0b3IgdG8gY3JlYXRlIGEgc3RvcmFnZSBmb3Igb3VyIGBFRWAgb2JqZWN0cy5cbiAqIEFuIGBFdmVudHNgIGluc3RhbmNlIGlzIGEgcGxhaW4gb2JqZWN0IHdob3NlIHByb3BlcnRpZXMgYXJlIGV2ZW50IG5hbWVzLlxuICpcbiAqIEBjb25zdHJ1Y3RvclxuICogQHByaXZhdGVcbiAqL1xuZnVuY3Rpb24gRXZlbnRzKCkge31cblxuLy9cbi8vIFdlIHRyeSB0byBub3QgaW5oZXJpdCBmcm9tIGBPYmplY3QucHJvdG90eXBlYC4gSW4gc29tZSBlbmdpbmVzIGNyZWF0aW5nIGFuXG4vLyBpbnN0YW5jZSBpbiB0aGlzIHdheSBpcyBmYXN0ZXIgdGhhbiBjYWxsaW5nIGBPYmplY3QuY3JlYXRlKG51bGwpYCBkaXJlY3RseS5cbi8vIElmIGBPYmplY3QuY3JlYXRlKG51bGwpYCBpcyBub3Qgc3VwcG9ydGVkIHdlIHByZWZpeCB0aGUgZXZlbnQgbmFtZXMgd2l0aCBhXG4vLyBjaGFyYWN0ZXIgdG8gbWFrZSBzdXJlIHRoYXQgdGhlIGJ1aWx0LWluIG9iamVjdCBwcm9wZXJ0aWVzIGFyZSBub3Rcbi8vIG92ZXJyaWRkZW4gb3IgdXNlZCBhcyBhbiBhdHRhY2sgdmVjdG9yLlxuLy9cbmlmIChPYmplY3QuY3JlYXRlKSB7XG4gIEV2ZW50cy5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuXG4gIC8vXG4gIC8vIFRoaXMgaGFjayBpcyBuZWVkZWQgYmVjYXVzZSB0aGUgYF9fcHJvdG9fX2AgcHJvcGVydHkgaXMgc3RpbGwgaW5oZXJpdGVkIGluXG4gIC8vIHNvbWUgb2xkIGJyb3dzZXJzIGxpa2UgQW5kcm9pZCA0LCBpUGhvbmUgNS4xLCBPcGVyYSAxMSBhbmQgU2FmYXJpIDUuXG4gIC8vXG4gIGlmICghbmV3IEV2ZW50cygpLl9fcHJvdG9fXykgcHJlZml4ID0gZmFsc2U7XG59XG5cbi8qKlxuICogUmVwcmVzZW50YXRpb24gb2YgYSBzaW5nbGUgZXZlbnQgbGlzdGVuZXIuXG4gKlxuICogQHBhcmFtIHtGdW5jdGlvbn0gZm4gVGhlIGxpc3RlbmVyIGZ1bmN0aW9uLlxuICogQHBhcmFtIHsqfSBjb250ZXh0IFRoZSBjb250ZXh0IHRvIGludm9rZSB0aGUgbGlzdGVuZXIgd2l0aC5cbiAqIEBwYXJhbSB7Qm9vbGVhbn0gW29uY2U9ZmFsc2VdIFNwZWNpZnkgaWYgdGhlIGxpc3RlbmVyIGlzIGEgb25lLXRpbWUgbGlzdGVuZXIuXG4gKiBAY29uc3RydWN0b3JcbiAqIEBwcml2YXRlXG4gKi9cbmZ1bmN0aW9uIEVFKGZuLCBjb250ZXh0LCBvbmNlKSB7XG4gIHRoaXMuZm4gPSBmbjtcbiAgdGhpcy5jb250ZXh0ID0gY29udGV4dDtcbiAgdGhpcy5vbmNlID0gb25jZSB8fCBmYWxzZTtcbn1cblxuLyoqXG4gKiBBZGQgYSBsaXN0ZW5lciBmb3IgYSBnaXZlbiBldmVudC5cbiAqXG4gKiBAcGFyYW0ge0V2ZW50RW1pdHRlcn0gZW1pdHRlciBSZWZlcmVuY2UgdG8gdGhlIGBFdmVudEVtaXR0ZXJgIGluc3RhbmNlLlxuICogQHBhcmFtIHsoU3RyaW5nfFN5bWJvbCl9IGV2ZW50IFRoZSBldmVudCBuYW1lLlxuICogQHBhcmFtIHtGdW5jdGlvbn0gZm4gVGhlIGxpc3RlbmVyIGZ1bmN0aW9uLlxuICogQHBhcmFtIHsqfSBjb250ZXh0IFRoZSBjb250ZXh0IHRvIGludm9rZSB0aGUgbGlzdGVuZXIgd2l0aC5cbiAqIEBwYXJhbSB7Qm9vbGVhbn0gb25jZSBTcGVjaWZ5IGlmIHRoZSBsaXN0ZW5lciBpcyBhIG9uZS10aW1lIGxpc3RlbmVyLlxuICogQHJldHVybnMge0V2ZW50RW1pdHRlcn1cbiAqIEBwcml2YXRlXG4gKi9cbmZ1bmN0aW9uIGFkZExpc3RlbmVyKGVtaXR0ZXIsIGV2ZW50LCBmbiwgY29udGV4dCwgb25jZSkge1xuICBpZiAodHlwZW9mIGZuICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcignVGhlIGxpc3RlbmVyIG11c3QgYmUgYSBmdW5jdGlvbicpO1xuICB9XG5cbiAgdmFyIGxpc3RlbmVyID0gbmV3IEVFKGZuLCBjb250ZXh0IHx8IGVtaXR0ZXIsIG9uY2UpXG4gICAgLCBldnQgPSBwcmVmaXggPyBwcmVmaXggKyBldmVudCA6IGV2ZW50O1xuXG4gIGlmICghZW1pdHRlci5fZXZlbnRzW2V2dF0pIGVtaXR0ZXIuX2V2ZW50c1tldnRdID0gbGlzdGVuZXIsIGVtaXR0ZXIuX2V2ZW50c0NvdW50Kys7XG4gIGVsc2UgaWYgKCFlbWl0dGVyLl9ldmVudHNbZXZ0XS5mbikgZW1pdHRlci5fZXZlbnRzW2V2dF0ucHVzaChsaXN0ZW5lcik7XG4gIGVsc2UgZW1pdHRlci5fZXZlbnRzW2V2dF0gPSBbZW1pdHRlci5fZXZlbnRzW2V2dF0sIGxpc3RlbmVyXTtcblxuICByZXR1cm4gZW1pdHRlcjtcbn1cblxuLyoqXG4gKiBDbGVhciBldmVudCBieSBuYW1lLlxuICpcbiAqIEBwYXJhbSB7RXZlbnRFbWl0dGVyfSBlbWl0dGVyIFJlZmVyZW5jZSB0byB0aGUgYEV2ZW50RW1pdHRlcmAgaW5zdGFuY2UuXG4gKiBAcGFyYW0geyhTdHJpbmd8U3ltYm9sKX0gZXZ0IFRoZSBFdmVudCBuYW1lLlxuICogQHByaXZhdGVcbiAqL1xuZnVuY3Rpb24gY2xlYXJFdmVudChlbWl0dGVyLCBldnQpIHtcbiAgaWYgKC0tZW1pdHRlci5fZXZlbnRzQ291bnQgPT09IDApIGVtaXR0ZXIuX2V2ZW50cyA9IG5ldyBFdmVudHMoKTtcbiAgZWxzZSBkZWxldGUgZW1pdHRlci5fZXZlbnRzW2V2dF07XG59XG5cbi8qKlxuICogTWluaW1hbCBgRXZlbnRFbWl0dGVyYCBpbnRlcmZhY2UgdGhhdCBpcyBtb2xkZWQgYWdhaW5zdCB0aGUgTm9kZS5qc1xuICogYEV2ZW50RW1pdHRlcmAgaW50ZXJmYWNlLlxuICpcbiAqIEBjb25zdHJ1Y3RvclxuICogQHB1YmxpY1xuICovXG5mdW5jdGlvbiBFdmVudEVtaXR0ZXIoKSB7XG4gIHRoaXMuX2V2ZW50cyA9IG5ldyBFdmVudHMoKTtcbiAgdGhpcy5fZXZlbnRzQ291bnQgPSAwO1xufVxuXG4vKipcbiAqIFJldHVybiBhbiBhcnJheSBsaXN0aW5nIHRoZSBldmVudHMgZm9yIHdoaWNoIHRoZSBlbWl0dGVyIGhhcyByZWdpc3RlcmVkXG4gKiBsaXN0ZW5lcnMuXG4gKlxuICogQHJldHVybnMge0FycmF5fVxuICogQHB1YmxpY1xuICovXG5FdmVudEVtaXR0ZXIucHJvdG90eXBlLmV2ZW50TmFtZXMgPSBmdW5jdGlvbiBldmVudE5hbWVzKCkge1xuICB2YXIgbmFtZXMgPSBbXVxuICAgICwgZXZlbnRzXG4gICAgLCBuYW1lO1xuXG4gIGlmICh0aGlzLl9ldmVudHNDb3VudCA9PT0gMCkgcmV0dXJuIG5hbWVzO1xuXG4gIGZvciAobmFtZSBpbiAoZXZlbnRzID0gdGhpcy5fZXZlbnRzKSkge1xuICAgIGlmIChoYXMuY2FsbChldmVudHMsIG5hbWUpKSBuYW1lcy5wdXNoKHByZWZpeCA/IG5hbWUuc2xpY2UoMSkgOiBuYW1lKTtcbiAgfVxuXG4gIGlmIChPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKSB7XG4gICAgcmV0dXJuIG5hbWVzLmNvbmNhdChPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKGV2ZW50cykpO1xuICB9XG5cbiAgcmV0dXJuIG5hbWVzO1xufTtcblxuLyoqXG4gKiBSZXR1cm4gdGhlIGxpc3RlbmVycyByZWdpc3RlcmVkIGZvciBhIGdpdmVuIGV2ZW50LlxuICpcbiAqIEBwYXJhbSB7KFN0cmluZ3xTeW1ib2wpfSBldmVudCBUaGUgZXZlbnQgbmFtZS5cbiAqIEByZXR1cm5zIHtBcnJheX0gVGhlIHJlZ2lzdGVyZWQgbGlzdGVuZXJzLlxuICogQHB1YmxpY1xuICovXG5FdmVudEVtaXR0ZXIucHJvdG90eXBlLmxpc3RlbmVycyA9IGZ1bmN0aW9uIGxpc3RlbmVycyhldmVudCkge1xuICB2YXIgZXZ0ID0gcHJlZml4ID8gcHJlZml4ICsgZXZlbnQgOiBldmVudFxuICAgICwgaGFuZGxlcnMgPSB0aGlzLl9ldmVudHNbZXZ0XTtcblxuICBpZiAoIWhhbmRsZXJzKSByZXR1cm4gW107XG4gIGlmIChoYW5kbGVycy5mbikgcmV0dXJuIFtoYW5kbGVycy5mbl07XG5cbiAgZm9yICh2YXIgaSA9IDAsIGwgPSBoYW5kbGVycy5sZW5ndGgsIGVlID0gbmV3IEFycmF5KGwpOyBpIDwgbDsgaSsrKSB7XG4gICAgZWVbaV0gPSBoYW5kbGVyc1tpXS5mbjtcbiAgfVxuXG4gIHJldHVybiBlZTtcbn07XG5cbi8qKlxuICogUmV0dXJuIHRoZSBudW1iZXIgb2YgbGlzdGVuZXJzIGxpc3RlbmluZyB0byBhIGdpdmVuIGV2ZW50LlxuICpcbiAqIEBwYXJhbSB7KFN0cmluZ3xTeW1ib2wpfSBldmVudCBUaGUgZXZlbnQgbmFtZS5cbiAqIEByZXR1cm5zIHtOdW1iZXJ9IFRoZSBudW1iZXIgb2YgbGlzdGVuZXJzLlxuICogQHB1YmxpY1xuICovXG5FdmVudEVtaXR0ZXIucHJvdG90eXBlLmxpc3RlbmVyQ291bnQgPSBmdW5jdGlvbiBsaXN0ZW5lckNvdW50KGV2ZW50KSB7XG4gIHZhciBldnQgPSBwcmVmaXggPyBwcmVmaXggKyBldmVudCA6IGV2ZW50XG4gICAgLCBsaXN0ZW5lcnMgPSB0aGlzLl9ldmVudHNbZXZ0XTtcblxuICBpZiAoIWxpc3RlbmVycykgcmV0dXJuIDA7XG4gIGlmIChsaXN0ZW5lcnMuZm4pIHJldHVybiAxO1xuICByZXR1cm4gbGlzdGVuZXJzLmxlbmd0aDtcbn07XG5cbi8qKlxuICogQ2FsbHMgZWFjaCBvZiB0aGUgbGlzdGVuZXJzIHJlZ2lzdGVyZWQgZm9yIGEgZ2l2ZW4gZXZlbnQuXG4gKlxuICogQHBhcmFtIHsoU3RyaW5nfFN5bWJvbCl9IGV2ZW50IFRoZSBldmVudCBuYW1lLlxuICogQHJldHVybnMge0Jvb2xlYW59IGB0cnVlYCBpZiB0aGUgZXZlbnQgaGFkIGxpc3RlbmVycywgZWxzZSBgZmFsc2VgLlxuICogQHB1YmxpY1xuICovXG5FdmVudEVtaXR0ZXIucHJvdG90eXBlLmVtaXQgPSBmdW5jdGlvbiBlbWl0KGV2ZW50LCBhMSwgYTIsIGEzLCBhNCwgYTUpIHtcbiAgdmFyIGV2dCA9IHByZWZpeCA/IHByZWZpeCArIGV2ZW50IDogZXZlbnQ7XG5cbiAgaWYgKCF0aGlzLl9ldmVudHNbZXZ0XSkgcmV0dXJuIGZhbHNlO1xuXG4gIHZhciBsaXN0ZW5lcnMgPSB0aGlzLl9ldmVudHNbZXZ0XVxuICAgICwgbGVuID0gYXJndW1lbnRzLmxlbmd0aFxuICAgICwgYXJnc1xuICAgICwgaTtcblxuICBpZiAobGlzdGVuZXJzLmZuKSB7XG4gICAgaWYgKGxpc3RlbmVycy5vbmNlKSB0aGlzLnJlbW92ZUxpc3RlbmVyKGV2ZW50LCBsaXN0ZW5lcnMuZm4sIHVuZGVmaW5lZCwgdHJ1ZSk7XG5cbiAgICBzd2l0Y2ggKGxlbikge1xuICAgICAgY2FzZSAxOiByZXR1cm4gbGlzdGVuZXJzLmZuLmNhbGwobGlzdGVuZXJzLmNvbnRleHQpLCB0cnVlO1xuICAgICAgY2FzZSAyOiByZXR1cm4gbGlzdGVuZXJzLmZuLmNhbGwobGlzdGVuZXJzLmNvbnRleHQsIGExKSwgdHJ1ZTtcbiAgICAgIGNhc2UgMzogcmV0dXJuIGxpc3RlbmVycy5mbi5jYWxsKGxpc3RlbmVycy5jb250ZXh0LCBhMSwgYTIpLCB0cnVlO1xuICAgICAgY2FzZSA0OiByZXR1cm4gbGlzdGVuZXJzLmZuLmNhbGwobGlzdGVuZXJzLmNvbnRleHQsIGExLCBhMiwgYTMpLCB0cnVlO1xuICAgICAgY2FzZSA1OiByZXR1cm4gbGlzdGVuZXJzLmZuLmNhbGwobGlzdGVuZXJzLmNvbnRleHQsIGExLCBhMiwgYTMsIGE0KSwgdHJ1ZTtcbiAgICAgIGNhc2UgNjogcmV0dXJuIGxpc3RlbmVycy5mbi5jYWxsKGxpc3RlbmVycy5jb250ZXh0LCBhMSwgYTIsIGEzLCBhNCwgYTUpLCB0cnVlO1xuICAgIH1cblxuICAgIGZvciAoaSA9IDEsIGFyZ3MgPSBuZXcgQXJyYXkobGVuIC0xKTsgaSA8IGxlbjsgaSsrKSB7XG4gICAgICBhcmdzW2kgLSAxXSA9IGFyZ3VtZW50c1tpXTtcbiAgICB9XG5cbiAgICBsaXN0ZW5lcnMuZm4uYXBwbHkobGlzdGVuZXJzLmNvbnRleHQsIGFyZ3MpO1xuICB9IGVsc2Uge1xuICAgIHZhciBsZW5ndGggPSBsaXN0ZW5lcnMubGVuZ3RoXG4gICAgICAsIGo7XG5cbiAgICBmb3IgKGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHtcbiAgICAgIGlmIChsaXN0ZW5lcnNbaV0ub25jZSkgdGhpcy5yZW1vdmVMaXN0ZW5lcihldmVudCwgbGlzdGVuZXJzW2ldLmZuLCB1bmRlZmluZWQsIHRydWUpO1xuXG4gICAgICBzd2l0Y2ggKGxlbikge1xuICAgICAgICBjYXNlIDE6IGxpc3RlbmVyc1tpXS5mbi5jYWxsKGxpc3RlbmVyc1tpXS5jb250ZXh0KTsgYnJlYWs7XG4gICAgICAgIGNhc2UgMjogbGlzdGVuZXJzW2ldLmZuLmNhbGwobGlzdGVuZXJzW2ldLmNvbnRleHQsIGExKTsgYnJlYWs7XG4gICAgICAgIGNhc2UgMzogbGlzdGVuZXJzW2ldLmZuLmNhbGwobGlzdGVuZXJzW2ldLmNvbnRleHQsIGExLCBhMik7IGJyZWFrO1xuICAgICAgICBjYXNlIDQ6IGxpc3RlbmVyc1tpXS5mbi5jYWxsKGxpc3RlbmVyc1tpXS5jb250ZXh0LCBhMSwgYTIsIGEzKTsgYnJlYWs7XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgaWYgKCFhcmdzKSBmb3IgKGogPSAxLCBhcmdzID0gbmV3IEFycmF5KGxlbiAtMSk7IGogPCBsZW47IGorKykge1xuICAgICAgICAgICAgYXJnc1tqIC0gMV0gPSBhcmd1bWVudHNbal07XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgbGlzdGVuZXJzW2ldLmZuLmFwcGx5KGxpc3RlbmVyc1tpXS5jb250ZXh0LCBhcmdzKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gdHJ1ZTtcbn07XG5cbi8qKlxuICogQWRkIGEgbGlzdGVuZXIgZm9yIGEgZ2l2ZW4gZXZlbnQuXG4gKlxuICogQHBhcmFtIHsoU3RyaW5nfFN5bWJvbCl9IGV2ZW50IFRoZSBldmVudCBuYW1lLlxuICogQHBhcmFtIHtGdW5jdGlvbn0gZm4gVGhlIGxpc3RlbmVyIGZ1bmN0aW9uLlxuICogQHBhcmFtIHsqfSBbY29udGV4dD10aGlzXSBUaGUgY29udGV4dCB0byBpbnZva2UgdGhlIGxpc3RlbmVyIHdpdGguXG4gKiBAcmV0dXJucyB7RXZlbnRFbWl0dGVyfSBgdGhpc2AuXG4gKiBAcHVibGljXG4gKi9cbkV2ZW50RW1pdHRlci5wcm90b3R5cGUub24gPSBmdW5jdGlvbiBvbihldmVudCwgZm4sIGNvbnRleHQpIHtcbiAgcmV0dXJuIGFkZExpc3RlbmVyKHRoaXMsIGV2ZW50LCBmbiwgY29udGV4dCwgZmFsc2UpO1xufTtcblxuLyoqXG4gKiBBZGQgYSBvbmUtdGltZSBsaXN0ZW5lciBmb3IgYSBnaXZlbiBldmVudC5cbiAqXG4gKiBAcGFyYW0geyhTdHJpbmd8U3ltYm9sKX0gZXZlbnQgVGhlIGV2ZW50IG5hbWUuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmbiBUaGUgbGlzdGVuZXIgZnVuY3Rpb24uXG4gKiBAcGFyYW0geyp9IFtjb250ZXh0PXRoaXNdIFRoZSBjb250ZXh0IHRvIGludm9rZSB0aGUgbGlzdGVuZXIgd2l0aC5cbiAqIEByZXR1cm5zIHtFdmVudEVtaXR0ZXJ9IGB0aGlzYC5cbiAqIEBwdWJsaWNcbiAqL1xuRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5vbmNlID0gZnVuY3Rpb24gb25jZShldmVudCwgZm4sIGNvbnRleHQpIHtcbiAgcmV0dXJuIGFkZExpc3RlbmVyKHRoaXMsIGV2ZW50LCBmbiwgY29udGV4dCwgdHJ1ZSk7XG59O1xuXG4vKipcbiAqIFJlbW92ZSB0aGUgbGlzdGVuZXJzIG9mIGEgZ2l2ZW4gZXZlbnQuXG4gKlxuICogQHBhcmFtIHsoU3RyaW5nfFN5bWJvbCl9IGV2ZW50IFRoZSBldmVudCBuYW1lLlxuICogQHBhcmFtIHtGdW5jdGlvbn0gZm4gT25seSByZW1vdmUgdGhlIGxpc3RlbmVycyB0aGF0IG1hdGNoIHRoaXMgZnVuY3Rpb24uXG4gKiBAcGFyYW0geyp9IGNvbnRleHQgT25seSByZW1vdmUgdGhlIGxpc3RlbmVycyB0aGF0IGhhdmUgdGhpcyBjb250ZXh0LlxuICogQHBhcmFtIHtCb29sZWFufSBvbmNlIE9ubHkgcmVtb3ZlIG9uZS10aW1lIGxpc3RlbmVycy5cbiAqIEByZXR1cm5zIHtFdmVudEVtaXR0ZXJ9IGB0aGlzYC5cbiAqIEBwdWJsaWNcbiAqL1xuRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5yZW1vdmVMaXN0ZW5lciA9IGZ1bmN0aW9uIHJlbW92ZUxpc3RlbmVyKGV2ZW50LCBmbiwgY29udGV4dCwgb25jZSkge1xuICB2YXIgZXZ0ID0gcHJlZml4ID8gcHJlZml4ICsgZXZlbnQgOiBldmVudDtcblxuICBpZiAoIXRoaXMuX2V2ZW50c1tldnRdKSByZXR1cm4gdGhpcztcbiAgaWYgKCFmbikge1xuICAgIGNsZWFyRXZlbnQodGhpcywgZXZ0KTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIHZhciBsaXN0ZW5lcnMgPSB0aGlzLl9ldmVudHNbZXZ0XTtcblxuICBpZiAobGlzdGVuZXJzLmZuKSB7XG4gICAgaWYgKFxuICAgICAgbGlzdGVuZXJzLmZuID09PSBmbiAmJlxuICAgICAgKCFvbmNlIHx8IGxpc3RlbmVycy5vbmNlKSAmJlxuICAgICAgKCFjb250ZXh0IHx8IGxpc3RlbmVycy5jb250ZXh0ID09PSBjb250ZXh0KVxuICAgICkge1xuICAgICAgY2xlYXJFdmVudCh0aGlzLCBldnQpO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBmb3IgKHZhciBpID0gMCwgZXZlbnRzID0gW10sIGxlbmd0aCA9IGxpc3RlbmVycy5sZW5ndGg7IGkgPCBsZW5ndGg7IGkrKykge1xuICAgICAgaWYgKFxuICAgICAgICBsaXN0ZW5lcnNbaV0uZm4gIT09IGZuIHx8XG4gICAgICAgIChvbmNlICYmICFsaXN0ZW5lcnNbaV0ub25jZSkgfHxcbiAgICAgICAgKGNvbnRleHQgJiYgbGlzdGVuZXJzW2ldLmNvbnRleHQgIT09IGNvbnRleHQpXG4gICAgICApIHtcbiAgICAgICAgZXZlbnRzLnB1c2gobGlzdGVuZXJzW2ldKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvL1xuICAgIC8vIFJlc2V0IHRoZSBhcnJheSwgb3IgcmVtb3ZlIGl0IGNvbXBsZXRlbHkgaWYgd2UgaGF2ZSBubyBtb3JlIGxpc3RlbmVycy5cbiAgICAvL1xuICAgIGlmIChldmVudHMubGVuZ3RoKSB0aGlzLl9ldmVudHNbZXZ0XSA9IGV2ZW50cy5sZW5ndGggPT09IDEgPyBldmVudHNbMF0gOiBldmVudHM7XG4gICAgZWxzZSBjbGVhckV2ZW50KHRoaXMsIGV2dCk7XG4gIH1cblxuICByZXR1cm4gdGhpcztcbn07XG5cbi8qKlxuICogUmVtb3ZlIGFsbCBsaXN0ZW5lcnMsIG9yIHRob3NlIG9mIHRoZSBzcGVjaWZpZWQgZXZlbnQuXG4gKlxuICogQHBhcmFtIHsoU3RyaW5nfFN5bWJvbCl9IFtldmVudF0gVGhlIGV2ZW50IG5hbWUuXG4gKiBAcmV0dXJucyB7RXZlbnRFbWl0dGVyfSBgdGhpc2AuXG4gKiBAcHVibGljXG4gKi9cbkV2ZW50RW1pdHRlci5wcm90b3R5cGUucmVtb3ZlQWxsTGlzdGVuZXJzID0gZnVuY3Rpb24gcmVtb3ZlQWxsTGlzdGVuZXJzKGV2ZW50KSB7XG4gIHZhciBldnQ7XG5cbiAgaWYgKGV2ZW50KSB7XG4gICAgZXZ0ID0gcHJlZml4ID8gcHJlZml4ICsgZXZlbnQgOiBldmVudDtcbiAgICBpZiAodGhpcy5fZXZlbnRzW2V2dF0pIGNsZWFyRXZlbnQodGhpcywgZXZ0KTtcbiAgfSBlbHNlIHtcbiAgICB0aGlzLl9ldmVudHMgPSBuZXcgRXZlbnRzKCk7XG4gICAgdGhpcy5fZXZlbnRzQ291bnQgPSAwO1xuICB9XG5cbiAgcmV0dXJuIHRoaXM7XG59O1xuXG4vL1xuLy8gQWxpYXMgbWV0aG9kcyBuYW1lcyBiZWNhdXNlIHBlb3BsZSByb2xsIGxpa2UgdGhhdC5cbi8vXG5FdmVudEVtaXR0ZXIucHJvdG90eXBlLm9mZiA9IEV2ZW50RW1pdHRlci5wcm90b3R5cGUucmVtb3ZlTGlzdGVuZXI7XG5FdmVudEVtaXR0ZXIucHJvdG90eXBlLmFkZExpc3RlbmVyID0gRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5vbjtcblxuLy9cbi8vIEV4cG9zZSB0aGUgcHJlZml4LlxuLy9cbkV2ZW50RW1pdHRlci5wcmVmaXhlZCA9IHByZWZpeDtcblxuLy9cbi8vIEFsbG93IGBFdmVudEVtaXR0ZXJgIHRvIGJlIGltcG9ydGVkIGFzIG1vZHVsZSBuYW1lc3BhY2UuXG4vL1xuRXZlbnRFbWl0dGVyLkV2ZW50RW1pdHRlciA9IEV2ZW50RW1pdHRlcjtcblxuLy9cbi8vIEV4cG9zZSB0aGUgbW9kdWxlLlxuLy9cbmlmICgndW5kZWZpbmVkJyAhPT0gdHlwZW9mIG1vZHVsZSkge1xuICBtb2R1bGUuZXhwb3J0cyA9IEV2ZW50RW1pdHRlcjtcbn1cbiIsCiAgICAiaW1wb3J0IHsgY3JlYXRlUmVxdWlyZSB9IGZyb20gXCJub2RlOm1vZHVsZVwiO1xudmFyIF9fY3JlYXRlID0gT2JqZWN0LmNyZWF0ZTtcbnZhciBfX2dldFByb3RvT2YgPSBPYmplY3QuZ2V0UHJvdG90eXBlT2Y7XG52YXIgX19kZWZQcm9wID0gT2JqZWN0LmRlZmluZVByb3BlcnR5O1xudmFyIF9fZ2V0T3duUHJvcE5hbWVzID0gT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXM7XG52YXIgX19oYXNPd25Qcm9wID0gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eTtcbmZ1bmN0aW9uIF9fYWNjZXNzUHJvcChrZXkpIHtcbiAgcmV0dXJuIHRoaXNba2V5XTtcbn1cbnZhciBfX3RvRVNNQ2FjaGVfbm9kZTtcbnZhciBfX3RvRVNNQ2FjaGVfZXNtO1xudmFyIF9fdG9FU00gPSAobW9kLCBpc05vZGVNb2RlLCB0YXJnZXQpID0+IHtcbiAgdmFyIGNhbkNhY2hlID0gbW9kICE9IG51bGwgJiYgdHlwZW9mIG1vZCA9PT0gXCJvYmplY3RcIjtcbiAgaWYgKGNhbkNhY2hlKSB7XG4gICAgdmFyIGNhY2hlID0gaXNOb2RlTW9kZSA/IF9fdG9FU01DYWNoZV9ub2RlID8/PSBuZXcgV2Vha01hcCA6IF9fdG9FU01DYWNoZV9lc20gPz89IG5ldyBXZWFrTWFwO1xuICAgIHZhciBjYWNoZWQgPSBjYWNoZS5nZXQobW9kKTtcbiAgICBpZiAoY2FjaGVkKVxuICAgICAgcmV0dXJuIGNhY2hlZDtcbiAgfVxuICB0YXJnZXQgPSBtb2QgIT0gbnVsbCA/IF9fY3JlYXRlKF9fZ2V0UHJvdG9PZihtb2QpKSA6IHt9O1xuICBjb25zdCB0byA9IGlzTm9kZU1vZGUgfHwgIW1vZCB8fCAhbW9kLl9fZXNNb2R1bGUgPyBfX2RlZlByb3AodGFyZ2V0LCBcImRlZmF1bHRcIiwgeyB2YWx1ZTogbW9kLCBlbnVtZXJhYmxlOiB0cnVlIH0pIDogdGFyZ2V0O1xuICBmb3IgKGxldCBrZXkgb2YgX19nZXRPd25Qcm9wTmFtZXMobW9kKSlcbiAgICBpZiAoIV9faGFzT3duUHJvcC5jYWxsKHRvLCBrZXkpKVxuICAgICAgX19kZWZQcm9wKHRvLCBrZXksIHtcbiAgICAgICAgZ2V0OiBfX2FjY2Vzc1Byb3AuYmluZChtb2QsIGtleSksXG4gICAgICAgIGVudW1lcmFibGU6IHRydWVcbiAgICAgIH0pO1xuICBpZiAoY2FuQ2FjaGUpXG4gICAgY2FjaGUuc2V0KG1vZCwgdG8pO1xuICByZXR1cm4gdG87XG59O1xudmFyIF9fY29tbW9uSlMgPSAoY2IsIG1vZCkgPT4gKCkgPT4gKG1vZCB8fCBjYigobW9kID0geyBleHBvcnRzOiB7fSB9KS5leHBvcnRzLCBtb2QpLCBtb2QuZXhwb3J0cyk7XG52YXIgX19yZXF1aXJlID0gLyogQF9fUFVSRV9fICovIGNyZWF0ZVJlcXVpcmUoaW1wb3J0Lm1ldGEudXJsKTtcblxuLy8gc3JjL2NvbnRleHQudHNcbnZhciBBUzJfQkFTRV9DT05URVhUX1VSTCA9IFwiaHR0cHM6Ly93d3cudzMub3JnL25zL2FjdGl2aXR5c3RyZWFtc1wiO1xudmFyIFNPQ0tFVEhVQl9CQVNFX0NPTlRFWFRfVVJMID0gXCJodHRwczovL3NvY2tldGh1Yi5vcmcvbnMvY29udGV4dC92MS5qc29ubGRcIjtcbnZhciBQTEFURk9STV9DT05URVhUX1BSRUZJWCA9IFwiaHR0cHM6Ly9zb2NrZXRodWIub3JnL25zL2NvbnRleHQvcGxhdGZvcm0vXCI7XG52YXIgRVJST1JfUExBVEZPUk1fSUQgPSBcImVycm9yXCI7XG52YXIgRVJST1JfUExBVEZPUk1fQ09OVEVYVF9VUkwgPSBcImh0dHBzOi8vc29ja2V0aHViLm9yZy9ucy9jb250ZXh0L3BsYXRmb3JtL2Vycm9yL3YxLmpzb25sZFwiO1xudmFyIElOVEVSTkFMX1BMQVRGT1JNX0lEID0gXCJzb2NrZXRodWI6aW50ZXJuYWxcIjtcbnZhciBJTlRFUk5BTF9QTEFURk9STV9DT05URVhUX1VSTCA9IFwiaHR0cHM6Ly9zb2NrZXRodWIub3JnL25zL2NvbnRleHQvcGxhdGZvcm0vc29ja2V0aHViOmludGVybmFsL3YxLmpzb25sZFwiO1xudmFyIHBsYXRmb3JtQ29udGV4dFRvUGxhdGZvcm1JZCA9IG5ldyBNYXA7XG52YXIgcGxhdGZvcm1Db250ZXh0VG9TY2hlbWFJZCA9IG5ldyBNYXA7XG52YXIgcGxhdGZvcm1Db250ZXh0VG9DcmVkZW50aWFsc1NjaGVtYUlkID0gbmV3IE1hcDtcbmZ1bmN0aW9uIGJ1aWxkQ2Fub25pY2FsQ29udGV4dChwbGF0Zm9ybUNvbnRleHRVcmwpIHtcbiAgcmV0dXJuIFtcbiAgICBBUzJfQkFTRV9DT05URVhUX1VSTCxcbiAgICBTT0NLRVRIVUJfQkFTRV9DT05URVhUX1VSTCxcbiAgICBwbGF0Zm9ybUNvbnRleHRVcmxcbiAgXTtcbn1cbmZ1bmN0aW9uIG5vcm1hbGl6ZUNvbnRleHRBcnJheSh2YWx1ZSkge1xuICBpZiAoIUFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgcmV0dXJuIFtdO1xuICB9XG4gIHJldHVybiB2YWx1ZS5maWx0ZXIoKGVudHJ5KSA9PiB0eXBlb2YgZW50cnkgPT09IFwic3RyaW5nXCIpO1xufVxuZnVuY3Rpb24gZ2V0Q29udGV4dEFycmF5KG1zZykge1xuICByZXR1cm4gbm9ybWFsaXplQ29udGV4dEFycmF5KG1zZ1tcIkBjb250ZXh0XCJdKTtcbn1cbmZ1bmN0aW9uIHJlZ2lzdGVyUGxhdGZvcm1Db250ZXh0KHBsYXRmb3JtSWQsIHBsYXRmb3JtQ29udGV4dFVybCwgc2NoZW1hSWQsIGNyZWRlbnRpYWxzU2NoZW1hSWQpIHtcbiAgcGxhdGZvcm1Db250ZXh0VG9QbGF0Zm9ybUlkLnNldChwbGF0Zm9ybUNvbnRleHRVcmwsIHBsYXRmb3JtSWQpO1xuICBwbGF0Zm9ybUNvbnRleHRUb1NjaGVtYUlkLnNldChwbGF0Zm9ybUNvbnRleHRVcmwsIHNjaGVtYUlkKTtcbiAgcGxhdGZvcm1Db250ZXh0VG9DcmVkZW50aWFsc1NjaGVtYUlkLnNldChwbGF0Zm9ybUNvbnRleHRVcmwsIGNyZWRlbnRpYWxzU2NoZW1hSWQpO1xufVxuZnVuY3Rpb24gcmVzb2x2ZVBsYXRmb3JtQ29udGV4dFVybChtc2cpIHtcbiAgY29uc3QgY29udGV4dHMgPSBnZXRDb250ZXh0QXJyYXkobXNnKTtcbiAgY29uc3QgbWF0Y2hlcyA9IGNvbnRleHRzLmZpbHRlcigoY29udGV4dFVybCkgPT4gcGxhdGZvcm1Db250ZXh0VG9QbGF0Zm9ybUlkLmhhcyhjb250ZXh0VXJsKSk7XG4gIGlmIChtYXRjaGVzLmxlbmd0aCAhPT0gMSkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG4gIHJldHVybiBtYXRjaGVzWzBdO1xufVxuZnVuY3Rpb24gZ2V0UGxhdGZvcm1JZEJ5Q29udGV4dFVybChwbGF0Zm9ybUNvbnRleHRVcmwpIHtcbiAgcmV0dXJuIHBsYXRmb3JtQ29udGV4dFRvUGxhdGZvcm1JZC5nZXQocGxhdGZvcm1Db250ZXh0VXJsKTtcbn1cbmZ1bmN0aW9uIGdldFNjaGVtYUlkQnlDb250ZXh0VXJsKHBsYXRmb3JtQ29udGV4dFVybCkge1xuICByZXR1cm4gcGxhdGZvcm1Db250ZXh0VG9TY2hlbWFJZC5nZXQocGxhdGZvcm1Db250ZXh0VXJsKTtcbn1cbmZ1bmN0aW9uIGdldENyZWRlbnRpYWxzU2NoZW1hSWRCeUNvbnRleHRVcmwocGxhdGZvcm1Db250ZXh0VXJsKSB7XG4gIHJldHVybiBwbGF0Zm9ybUNvbnRleHRUb0NyZWRlbnRpYWxzU2NoZW1hSWQuZ2V0KHBsYXRmb3JtQ29udGV4dFVybCk7XG59XG5leHBvcnQge1xuICByZXNvbHZlUGxhdGZvcm1Db250ZXh0VXJsLFxuICByZWdpc3RlclBsYXRmb3JtQ29udGV4dCxcbiAgZ2V0U2NoZW1hSWRCeUNvbnRleHRVcmwsXG4gIGdldFBsYXRmb3JtSWRCeUNvbnRleHRVcmwsXG4gIGdldENyZWRlbnRpYWxzU2NoZW1hSWRCeUNvbnRleHRVcmwsXG4gIGdldENvbnRleHRBcnJheSxcbiAgYnVpbGRDYW5vbmljYWxDb250ZXh0LFxuICBTT0NLRVRIVUJfQkFTRV9DT05URVhUX1VSTCxcbiAgUExBVEZPUk1fQ09OVEVYVF9QUkVGSVgsXG4gIElOVEVSTkFMX1BMQVRGT1JNX0lELFxuICBJTlRFUk5BTF9QTEFURk9STV9DT05URVhUX1VSTCxcbiAgRVJST1JfUExBVEZPUk1fSUQsXG4gIEVSUk9SX1BMQVRGT1JNX0NPTlRFWFRfVVJMLFxuICBBUzJfQkFTRV9DT05URVhUX1VSTFxufTtcblxuLy8jIGRlYnVnSWQ9QjgyRUNCOTM3M0FDQTZCNDY0NzU2RTIxNjQ3NTZFMjFcbiIsCiAgICAiaW1wb3J0IEV2ZW50RW1pdHRlciBmcm9tICcuL2luZGV4LmpzJ1xuXG5leHBvcnQgeyBFdmVudEVtaXR0ZXIgfVxuZXhwb3J0IGRlZmF1bHQgRXZlbnRFbWl0dGVyXG4iLAogICAgIi8qIVxuICogYWN0aXZpdHktc3RyZWFtc1xuICogICBodHRwczovL2dpdGh1Yi5jb20vc2lsdmVyYnVja2V0L2FjdGl2aXR5LXN0cmVhbXNcbiAqXG4gKiBEZXZlbG9wZWQgYW5kIE1haW50YWluZWQgYnk6XG4gKiAgIE5pY2sgSmVubmluZ3MgPG5pY2tAc2lsdmVyYnVja2V0Lm5ldD5cbiAqXG4gKiBhY3Rpdml0eS1zdHJlYW1zIGlzIHJlbGVhc2VkIHVuZGVyIHRoZSBNSVQgKHNlZSBMSUNFTlNFKS5cbiAqXG4gKiBZb3UgZG9uJ3QgaGF2ZSB0byBkbyBhbnl0aGluZyBzcGVjaWFsIHRvIGNob29zZSBvbmUgbGljZW5zZSBvciB0aGUgb3RoZXJcbiAqIGFuZCB5b3UgZG9uJ3QgaGF2ZSB0byBub3RpZnkgYW55b25lIHdoaWNoIGxpY2Vuc2UgeW91IGFyZSB1c2luZy5cbiAqIFBsZWFzZSBzZWUgdGhlIGNvcnJlc3BvbmRpbmcgbGljZW5zZSBmaWxlIGZvciBkZXRhaWxzIG9mIHRoZXNlIGxpY2Vuc2VzLlxuICogWW91IGFyZSBmcmVlIHRvIHVzZSwgbW9kaWZ5IGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUsIGJ1dCBhbGwgY29weXJpZ2h0XG4gKiBpbmZvcm1hdGlvbiBtdXN0IHJlbWFpbi5cbiAqXG4gKi9cblxuaW1wb3J0IHR5cGUgeyBBY3Rpdml0eU9iamVjdCwgQWN0aXZpdHlTdHJlYW0gfSBmcm9tIFwiQHNvY2tldGh1Yi9zY2hlbWFzXCI7XG5pbXBvcnQge1xuICAgIEFTMl9CQVNFX0NPTlRFWFRfVVJMLFxuICAgIFBMQVRGT1JNX0NPTlRFWFRfUFJFRklYLFxuICAgIFNPQ0tFVEhVQl9CQVNFX0NPTlRFWFRfVVJMLFxufSBmcm9tIFwiQHNvY2tldGh1Yi9zY2hlbWFzL2NvbnRleHRcIjtcbmltcG9ydCBFdmVudEVtaXR0ZXIgZnJvbSBcImV2ZW50ZW1pdHRlcjNcIjtcblxuY29uc3QgZWUgPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG5jb25zdCBiYXNlUHJvcHMgPSB7XG4gICAgc3RyZWFtOiBbXG4gICAgICAgIFwiQGNvbnRleHRcIixcbiAgICAgICAgXCJpZFwiLFxuICAgICAgICBcInR5cGVcIixcbiAgICAgICAgXCJwbGF0Zm9ybVwiLFxuICAgICAgICBcImFjdG9yXCIsXG4gICAgICAgIFwidGFyZ2V0XCIsXG4gICAgICAgIFwib2JqZWN0XCIsXG4gICAgICAgIFwicHVibGlzaGVkXCIsXG4gICAgICAgIFwiZXJyb3JcIixcbiAgICBdLFxuICAgIG9iamVjdDogW1xuICAgICAgICBcImlkXCIsXG4gICAgICAgIFwidHlwZVwiLFxuICAgICAgICBcImNvbnRleHRcIixcbiAgICAgICAgXCJhbGlhc1wiLFxuICAgICAgICBcImF0dGFjaGVkVG9cIixcbiAgICAgICAgXCJhdHRhY2htZW50XCIsXG4gICAgICAgIFwiYXR0cmlidXRlZFRvXCIsXG4gICAgICAgIFwiYXR0cmlidXRlZFdpdGhcIixcbiAgICAgICAgXCJjb25kaXRpb25cIixcbiAgICAgICAgXCJjb250ZW50XCIsXG4gICAgICAgIFwiY29udGVudE1hcFwiLFxuICAgICAgICBcImNvbnRleHRcIixcbiAgICAgICAgXCJjb250ZXh0T2ZcIixcbiAgICAgICAgXCJuYW1lXCIsXG4gICAgICAgIFwiZW5kVGltZVwiLFxuICAgICAgICBcImdlbmVyYXRvclwiLFxuICAgICAgICBcImdlbmVyYXRvck9mXCIsXG4gICAgICAgIFwiZ3JvdXBcIixcbiAgICAgICAgXCJpY29uXCIsXG4gICAgICAgIFwiaW1hZ2VcIixcbiAgICAgICAgXCJpblJlcGx5VG9cIixcbiAgICAgICAgXCJtZW1iZXJzXCIsXG4gICAgICAgIFwibWVtYmVyT2ZcIixcbiAgICAgICAgXCJtZXNzYWdlXCIsXG4gICAgICAgIFwibG9jYXRpb25cIixcbiAgICAgICAgXCJsb2NhdGlvbk9mXCIsXG4gICAgICAgIFwib2JqZWN0T2ZcIixcbiAgICAgICAgXCJvcmlnaW5PZlwiLFxuICAgICAgICBcInByZXNlbmNlXCIsXG4gICAgICAgIFwicHJldmlld1wiLFxuICAgICAgICBcInByZXZpZXdPZlwiLFxuICAgICAgICBcInByb3ZpZGVyXCIsXG4gICAgICAgIFwicHJvdmlkZXJPZlwiLFxuICAgICAgICBcInB1Ymxpc2hlZFwiLFxuICAgICAgICBcInJhdGluZ1wiLFxuICAgICAgICBcInJlbGF0aW9uc2hpcFwiLFxuICAgICAgICBcInJlc3VsdE9mXCIsXG4gICAgICAgIFwicmVwbGllc1wiLFxuICAgICAgICBcInJvbGVcIixcbiAgICAgICAgXCJzY29wZVwiLFxuICAgICAgICBcInNjb3BlT2ZcIixcbiAgICAgICAgXCJzdGFydFRpbWVcIixcbiAgICAgICAgXCJzdGF0dXNcIixcbiAgICAgICAgXCJzdW1tYXJ5XCIsXG4gICAgICAgIFwidG9waWNcIixcbiAgICAgICAgXCJ0YWdcIixcbiAgICAgICAgXCJ0YWdPZlwiLFxuICAgICAgICBcInRhcmdldE9mXCIsXG4gICAgICAgIFwidGl0bGVcIixcbiAgICAgICAgXCJ0aXRsZU1hcFwiLFxuICAgICAgICBcInVwZGF0ZWRcIixcbiAgICAgICAgXCJ1cmxcIixcbiAgICAgICAgXCJ4bXBwOnN0YW56YS1pZFwiLFxuICAgIF0sXG59IGFzIGNvbnN0O1xuY29uc3QgZXhwYW5kID0ge1xuICAgIGFjdG9yOiB7XG4gICAgICAgIHByaW1hcnk6IFwiaWRcIixcbiAgICAgICAgcHJvcHM6IGJhc2VQcm9wcyxcbiAgICB9LFxuICAgIHRhcmdldDoge1xuICAgICAgICBwcmltYXJ5OiBcImlkXCIsXG4gICAgICAgIHByb3BzOiBiYXNlUHJvcHMsXG4gICAgfSxcbiAgICBvYmplY3Q6IHtcbiAgICAgICAgcHJpbWFyeTogXCJjb250ZW50XCIsXG4gICAgICAgIHByb3BzOiBiYXNlUHJvcHMsXG4gICAgfSxcbn0gYXMgY29uc3Q7XG5cbnR5cGUgQ3VzdG9tUHJvcHMgPSBSZWNvcmQ8c3RyaW5nLCBzdHJpbmdbXT47XG5cbnR5cGUgQmFzZVByb3BLZXkgPSBrZXlvZiB0eXBlb2YgYmFzZVByb3BzO1xuXG5jb25zdCBvYmpzID0gbmV3IE1hcDxzdHJpbmcsIEFjdGl2aXR5T2JqZWN0PigpO1xuY29uc3QgY3VzdG9tUHJvcHM6IEN1c3RvbVByb3BzID0ge307XG5cbmxldCBmYWlsT25Vbmtub3duT2JqZWN0UHJvcGVydGllcyA9IGZhbHNlO1xubGV0IHdhcm5PblVua25vd25PYmplY3RQcm9wZXJ0aWVzID0gdHJ1ZTtcbmxldCBzcGVjaWFsT2Jqczogc3RyaW5nW10gPSBbXTsgLy8gdGhlIG9iamVjdHMgZG9uJ3QgZ2V0IHJlamVjdGVkIGZvciBiYWQgcHJvcHNcblxuZnVuY3Rpb24gbWF0Y2hlc0N1c3RvbVByb3AodHlwZTogc3RyaW5nLCBrZXk6IHN0cmluZykge1xuICAgIGNvbnN0IHByb3BzID0gY3VzdG9tUHJvcHNbdHlwZV07XG4gICAgcmV0dXJuIEFycmF5LmlzQXJyYXkocHJvcHMpICYmIHByb3BzLmluY2x1ZGVzKGtleSk7XG59XG5cbmZ1bmN0aW9uIHZhbGlkYXRlT2JqZWN0KFxuICAgIHR5cGU6IEJhc2VQcm9wS2V5LFxuICAgIGluY29taW5nT2JqOiB1bmtub3duLFxuICAgIHJlcXVpcmVJZCA9IGZhbHNlLFxuKSB7XG4gICAgLy8gSW5wdXQgdmFsaWRhdGlvbiB3aXRoIGNsZWFyIGVycm9yIG1lc3NhZ2VzXG4gICAgaWYgKGluY29taW5nT2JqID09PSBudWxsKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgIGBBY3Rpdml0eVN0cmVhbXMgdmFsaWRhdGlvbiBmYWlsZWQ6IHRoZSBcIiR7dHlwZX1cIiBwcm9wZXJ0eSBpcyBudWxsLiBFeGFtcGxlOiB7IGlkOiBcInVzZXJAZXhhbXBsZS5jb21cIiwgdHlwZTogXCJwZXJzb25cIiB9YCxcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBpZiAoaW5jb21pbmdPYmogPT09IHVuZGVmaW5lZCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICBgQWN0aXZpdHlTdHJlYW1zIHZhbGlkYXRpb24gZmFpbGVkOiB0aGUgXCIke3R5cGV9XCIgcHJvcGVydHkgaXMgdW5kZWZpbmVkLiBFeGFtcGxlOiB7IGlkOiBcInVzZXJAZXhhbXBsZS5jb21cIiwgdHlwZTogXCJwZXJzb25cIiB9YCxcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIGluY29taW5nT2JqID09PSBcInN0cmluZ1wiKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgIGBBY3Rpdml0eVN0cmVhbXMgdmFsaWRhdGlvbiBmYWlsZWQ6IHRoZSBcIiR7dHlwZX1cIiBwcm9wZXJ0eSByZWNlaXZlZCBzdHJpbmcgXCIke2luY29taW5nT2JqfVwiIGJ1dCBleHBlY3RlZCBhbiBvYmplY3QuIFVzZTogeyBpZDogXCIke2luY29taW5nT2JqfVwiLCB0eXBlOiBcInBlcnNvblwiIH1gLFxuICAgICAgICApO1xuICAgIH1cblxuICAgIGlmICh0eXBlb2YgaW5jb21pbmdPYmogIT09IFwib2JqZWN0XCIgfHwgQXJyYXkuaXNBcnJheShpbmNvbWluZ09iaikpIHtcbiAgICAgICAgY29uc3QgcmVjZWl2ZWRUeXBlID0gQXJyYXkuaXNBcnJheShpbmNvbWluZ09iailcbiAgICAgICAgICAgID8gXCJhcnJheVwiXG4gICAgICAgICAgICA6IHR5cGVvZiBpbmNvbWluZ09iajtcbiAgICAgICAgY29uc3QgcmVjZWl2ZWRWYWx1ZSA9IFN0cmluZyhpbmNvbWluZ09iaik7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgIGBBY3Rpdml0eVN0cmVhbXMgdmFsaWRhdGlvbiBmYWlsZWQ6IHRoZSBcIiR7dHlwZX1cIiBwcm9wZXJ0eSBtdXN0IGJlIGFuIG9iamVjdCwgcmVjZWl2ZWQgJHtyZWNlaXZlZFR5cGV9ICgke3JlY2VpdmVkVmFsdWV9KS4gRXhhbXBsZTogeyBpZDogXCJ1c2VyQGV4YW1wbGUuY29tXCIsIHR5cGU6IFwicGVyc29uXCIgfWAsXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgLy8gUmVxdWlyZSAnaWQnIHByb3BlcnR5IHdoZW4gZXhwbGljaXRseSByZXF1ZXN0ZWQgKGUuZy4sIE9iamVjdC5jcmVhdGUoKSlcbiAgICBjb25zdCBvYmogPSBpbmNvbWluZ09iaiBhcyBBY3Rpdml0eU9iamVjdDtcbiAgICBpZiAocmVxdWlyZUlkICYmICFvYmouaWQpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgYEFjdGl2aXR5U3RyZWFtcyB2YWxpZGF0aW9uIGZhaWxlZDogdGhlIFwiJHt0eXBlfVwiIHByb3BlcnR5IHJlcXVpcmVzIGFuICdpZCcgcHJvcGVydHkuIEV4YW1wbGU6IHsgaWQ6IFwidXNlckBleGFtcGxlLmNvbVwiLCB0eXBlOiBcInBlcnNvblwiIH1gLFxuICAgICAgICApO1xuICAgIH1cblxuICAgIGNvbnN0IGluY29taW5nUmVjb3JkID0gaW5jb21pbmdPYmogYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gICAgY29uc3QgYWxsb3dlZFByb3BzID0gYmFzZVByb3BzW3R5cGVdIGFzIHJlYWRvbmx5IHN0cmluZ1tdO1xuICAgIGNvbnN0IHVua25vd25LZXlzID0gT2JqZWN0LmtleXMoaW5jb21pbmdSZWNvcmQpLmZpbHRlcihcbiAgICAgICAgKGtleTogc3RyaW5nKTogYm9vbGVhbiA9PiB7XG4gICAgICAgICAgICByZXR1cm4gIWFsbG93ZWRQcm9wcy5pbmNsdWRlcyhrZXkpO1xuICAgICAgICB9LFxuICAgICk7XG5cbiAgICBmb3IgKGNvbnN0IGtleSBvZiB1bmtub3duS2V5cykge1xuICAgICAgICBjb25zdCBhbyA9IGluY29taW5nT2JqIGFzIEFjdGl2aXR5T2JqZWN0O1xuICAgICAgICBpZiAobWF0Y2hlc0N1c3RvbVByb3AoYW8udHlwZSwga2V5KSkge1xuICAgICAgICAgICAgLy8gY3VzdG9tIHByb3BlcnR5IG1hdGNoZXMsIGNvbnRpbnVlXG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghc3BlY2lhbE9ianMuaW5jbHVkZXMoYW8udHlwZSkpIHtcbiAgICAgICAgICAgIC8vIG5vdCBkZWZpbmVkIGFzIGEgc3BlY2lhbCBwcm9wXG4gICAgICAgICAgICAvLyBkb24ndCBrbm93IHdoYXQgdG8gZG8gd2l0aCBpdCwgc28gdGhyb3cgZXJyb3JcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKGFvKTtcbiAgICAgICAgICAgIGNvbnN0IHJlY2VpdmVkVmFsdWUgPVxuICAgICAgICAgICAgICAgIHR5cGVvZiBhb1trZXldID09PSBcInN0cmluZ1wiID8gYFwiJHthb1trZXldfVwiYCA6IFN0cmluZyhhb1trZXldKTtcbiAgICAgICAgICAgIGNvbnN0IGVyciA9IGBBY3Rpdml0eVN0cmVhbXMgdmFsaWRhdGlvbiBmYWlsZWQ6IHByb3BlcnR5IFwiJHtrZXl9XCIgd2l0aCB2YWx1ZSAke3JlY2VpdmVkVmFsdWV9IGlzIG5vdCBhbGxvd2VkIG9uIHRoZSBcIiR7dHlwZX1cIiBvYmplY3Qgb2YgdHlwZSBcIiR7YW8udHlwZX1cIi5gO1xuICAgICAgICAgICAgaWYgKGZhaWxPblVua25vd25PYmplY3RQcm9wZXJ0aWVzKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGVycik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAod2Fybk9uVW5rbm93bk9iamVjdFByb3BlcnRpZXMpIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLndhcm4oZXJyKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbn1cblxuZnVuY3Rpb24gZW5zdXJlUHJvcHMob2JqOiBBY3Rpdml0eU9iamVjdCk6IEFjdGl2aXR5T2JqZWN0IHtcbiAgICAvLyBlbnN1cmUgdGhlIG5hbWUgcHJvcGVydHksIHdoaWNoIGNhbiBnZW5lcmFsbHkgYmUgaW5mZXJyZWQgZnJvbSB0aGUgaWRcbiAgICAvLyBuYW1lID0gb2JqLm1hdGNoKC8oPyg/XFx3Kyk6XFwvXFwvKSg/Oi4rQCk/KC4rPykoPzpcXC98JCkvKVsxXVxuICAgIHJldHVybiBvYmo7XG59XG5cbmZ1bmN0aW9uIGV4cGFuZFN0cmVhbShtZXRhOiBBY3Rpdml0eVN0cmVhbSkge1xuICAgIGNvbnN0IHN0cmVhbTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPSB7fTtcbiAgICBjb25zdCBtZXRhUmVjb3JkID0gbWV0YSBhcyB1bmtub3duIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICAgIGZvciAoY29uc3Qga2V5IG9mIE9iamVjdC5rZXlzKG1ldGFSZWNvcmQpKSB7XG4gICAgICAgIGNvbnN0IHZhbHVlID0gbWV0YVJlY29yZFtrZXldO1xuICAgICAgICBpZiAodHlwZW9mIHZhbHVlID09PSBcInN0cmluZ1wiKSB7XG4gICAgICAgICAgICBzdHJlYW1ba2V5XSA9IG9ianMuZ2V0KHZhbHVlKSB8fCB2YWx1ZTtcbiAgICAgICAgfSBlbHNlIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgICAgICAgICAgY29uc3QgZXhwYW5kZWQ6IEFycmF5PEFjdGl2aXR5T2JqZWN0IHwgc3RyaW5nPiA9IFtdO1xuICAgICAgICAgICAgZm9yIChjb25zdCBlbnRyeSBvZiB2YWx1ZSkge1xuICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgZW50cnkgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgZXhwYW5kZWQucHVzaChvYmpzLmdldChlbnRyeSkgfHwgZW50cnkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHN0cmVhbVtrZXldID0gZXhwYW5kZWQ7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBzdHJlYW1ba2V5XSA9IHZhbHVlO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gb25seSBleHBhbmQgc3RyaW5nIGludG8gb2JqZWN0cyBpZiB0aGV5IGFyZSBpbiB0aGUgZXhwYW5kIGxpc3RcbiAgICBmb3IgKGNvbnN0IGtleSBvZiBPYmplY3Qua2V5cyhleHBhbmQpIGFzIEFycmF5PGtleW9mIHR5cGVvZiBleHBhbmQ+KSB7XG4gICAgICAgIGNvbnN0IHZhbHVlID0gc3RyZWFtW2tleV07XG4gICAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgICAgIGNvbnN0IGlkeCA9IGV4cGFuZFtrZXldLnByaW1hcnk7XG4gICAgICAgICAgICBzdHJlYW1ba2V5XSA9IHsgW2lkeF06IHZhbHVlIH07XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHN0cmVhbSBhcyB1bmtub3duIGFzIEFjdGl2aXR5U3RyZWFtO1xufVxuXG5mdW5jdGlvbiBTdHJlYW0oXG4gICAgbWV0YTogdW5rbm93bixcbik6IEFjdGl2aXR5U3RyZWFtIHwgQWN0aXZpdHlPYmplY3QgfCBSZWNvcmQ8c3RyaW5nLCBuZXZlcj4ge1xuICAgIHZhbGlkYXRlT2JqZWN0KFwic3RyZWFtXCIsIG1ldGEpO1xuICAgIGlmICh0eXBlb2YgKG1ldGEgYXMgQWN0aXZpdHlTdHJlYW0pLm9iamVjdCA9PT0gXCJvYmplY3RcIikge1xuICAgICAgICB2YWxpZGF0ZU9iamVjdChcIm9iamVjdFwiLCAobWV0YSBhcyBBY3Rpdml0eVN0cmVhbSkub2JqZWN0KTtcbiAgICB9XG4gICAgY29uc3Qgc3RyZWFtID0gZXhwYW5kU3RyZWFtKG1ldGEgYXMgQWN0aXZpdHlTdHJlYW0pO1xuICAgIGVlLmVtaXQoXCJhY3Rpdml0eS1zdHJlYW1cIiwgc3RyZWFtKTtcbiAgICByZXR1cm4gc3RyZWFtO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEFjdGl2aXR5T2JqZWN0TWFuYWdlciB7XG4gICAgY3JlYXRlKG9iajogQWN0aXZpdHlPYmplY3QpOiBBY3Rpdml0eU9iamVjdDtcbiAgICBkZWxldGUoaWQ6IHN0cmluZyk6IGJvb2xlYW47XG4gICAgbGlzdCgpOiBJdGVyYWJsZUl0ZXJhdG9yPHN0cmluZz47XG4gICAgZ2V0KGlkOiBzdHJpbmcsIGV4cGFuZD86IGJvb2xlYW4pOiBBY3Rpdml0eU9iamVjdCB8IHN0cmluZztcbn1cblxuY29uc3QgX09iamVjdDogQWN0aXZpdHlPYmplY3RNYW5hZ2VyID0ge1xuICAgIGNyZWF0ZTogKG9iajogQWN0aXZpdHlPYmplY3QpID0+IHtcbiAgICAgICAgdmFsaWRhdGVPYmplY3QoXCJvYmplY3RcIiwgb2JqLCB0cnVlKTsgLy8gcmVxdWlyZSBJRCBmb3IgT2JqZWN0LmNyZWF0ZSgpXG4gICAgICAgIGNvbnN0IGFvID0gZW5zdXJlUHJvcHMob2JqKTtcbiAgICAgICAgb2Jqcy5zZXQoYW8uaWQsIGFvKTtcbiAgICAgICAgZWUuZW1pdChcImFjdGl2aXR5LW9iamVjdC1jcmVhdGVcIiwgYW8pO1xuICAgICAgICByZXR1cm4gYW87XG4gICAgfSxcblxuICAgIGRlbGV0ZTogKGlkKSA9PiB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IG9ianMuZGVsZXRlKGlkKTtcbiAgICAgICAgaWYgKHJlc3VsdCkge1xuICAgICAgICAgICAgZWUuZW1pdChcImFjdGl2aXR5LW9iamVjdC1kZWxldGVcIiwgaWQpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfSxcblxuICAgIGdldDogKGlkLCBleHBhbmQpID0+IHtcbiAgICAgICAgbGV0IG9iaiA9IG9ianMuZ2V0KGlkKTtcbiAgICAgICAgaWYgKCFvYmopIHtcbiAgICAgICAgICAgIGlmICghZXhwYW5kKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGlkO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgb2JqID0geyBpZDogaWQgfSBhcyBBY3Rpdml0eU9iamVjdDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZW5zdXJlUHJvcHMob2JqKTtcbiAgICB9LFxuXG4gICAgbGlzdDogKCk6IEl0ZXJhYmxlSXRlcmF0b3I8c3RyaW5nPiA9PiBvYmpzLmtleXMoKSxcbn07XG5cbmV4cG9ydCBpbnRlcmZhY2UgQVNGYWN0b3J5T3B0aW9ucyB7XG4gICAgc3BlY2lhbE9ianM/OiBBcnJheTxzdHJpbmc+O1xuICAgIGZhaWxPblVua25vd25PYmplY3RQcm9wZXJ0aWVzPzogYm9vbGVhbjtcbiAgICB3YXJuT25Vbmtub3duT2JqZWN0UHJvcGVydGllcz86IGJvb2xlYW47XG4gICAgY3VzdG9tUHJvcHM/OiBDdXN0b21Qcm9wcztcbn1cblxudHlwZSBFdmVudENhbGxiYWNrID0gKC4uLmFyZ3M6IHVua25vd25bXSkgPT4gdm9pZDtcblxuZXhwb3J0IGludGVyZmFjZSBBU01hbmFnZXIge1xuICAgIFN0cmVhbShtZXRhOiBBY3Rpdml0eVN0cmVhbSB8IHVua25vd24pOiBBY3Rpdml0eVN0cmVhbSB8IEFjdGl2aXR5T2JqZWN0O1xuICAgIE9iamVjdDogQWN0aXZpdHlPYmplY3RNYW5hZ2VyO1xuICAgIG9uKGV2ZW50OiBzdHJpbmcsIGZ1bmM6IEV2ZW50Q2FsbGJhY2spOiB2b2lkO1xuICAgIG9uY2UoZXZlbnQ6IHN0cmluZywgZnVuYzogRXZlbnRDYWxsYmFjayk6IHZvaWQ7XG4gICAgb2ZmKGV2ZW50OiBzdHJpbmcsIGZ1bmM6IEV2ZW50Q2FsbGJhY2spOiB2b2lkO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gQVNGYWN0b3J5KG9wdHM6IEFTRmFjdG9yeU9wdGlvbnMgPSB7fSk6IEFTTWFuYWdlciB7XG4gICAgc3BlY2lhbE9ianMgPSBvcHRzPy5zcGVjaWFsT2JqcyB8fCBbXTtcbiAgICBmYWlsT25Vbmtub3duT2JqZWN0UHJvcGVydGllcyA9XG4gICAgICAgIHR5cGVvZiBvcHRzLmZhaWxPblVua25vd25PYmplY3RQcm9wZXJ0aWVzID09PSBcImJvb2xlYW5cIlxuICAgICAgICAgICAgPyBvcHRzLmZhaWxPblVua25vd25PYmplY3RQcm9wZXJ0aWVzXG4gICAgICAgICAgICA6IGZhaWxPblVua25vd25PYmplY3RQcm9wZXJ0aWVzO1xuICAgIHdhcm5PblVua25vd25PYmplY3RQcm9wZXJ0aWVzID1cbiAgICAgICAgdHlwZW9mIG9wdHMud2Fybk9uVW5rbm93bk9iamVjdFByb3BlcnRpZXMgPT09IFwiYm9vbGVhblwiXG4gICAgICAgICAgICA/IG9wdHMud2Fybk9uVW5rbm93bk9iamVjdFByb3BlcnRpZXNcbiAgICAgICAgICAgIDogd2Fybk9uVW5rbm93bk9iamVjdFByb3BlcnRpZXM7XG4gICAgY29uc3QgY3VzdG9tUHJvcHNDb25maWcgPSBvcHRzLmN1c3RvbVByb3BzIHx8IHt9O1xuICAgIGZvciAoY29uc3QgcHJvcE5hbWUgb2YgT2JqZWN0LmtleXMoY3VzdG9tUHJvcHNDb25maWcpKSB7XG4gICAgICAgIGN1c3RvbVByb3BzW3Byb3BOYW1lXSA9IGN1c3RvbVByb3BzQ29uZmlnW3Byb3BOYW1lXTtcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgICBTdHJlYW06IFN0cmVhbSxcbiAgICAgICAgT2JqZWN0OiBfT2JqZWN0LFxuICAgICAgICBvbjogKGV2ZW50LCBmdW5jKSA9PiBlZS5vbihldmVudCwgZnVuYyksXG4gICAgICAgIG9uY2U6IChldmVudCwgZnVuYykgPT4gZWUub25jZShldmVudCwgZnVuYyksXG4gICAgICAgIG9mZjogKGV2ZW50LCBmdW5jTmFtZSkgPT4gZWUub2ZmKGV2ZW50LCBmdW5jTmFtZSksXG4gICAgfSBhcyBBU01hbmFnZXI7XG59XG5cbigoZ2xvYmFsOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPikgPT4ge1xuICAgIGdsb2JhbC5BU0ZhY3RvciA9IEFTRmFjdG9yeTtcbn0pKFxuICAgIHR5cGVvZiBnbG9iYWxUaGlzID09PSBcIm9iamVjdFwiXG4gICAgICAgID8gKGdsb2JhbFRoaXMgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pXG4gICAgICAgIDoge30sXG4pO1xuXG5leHBvcnQge1xuICAgIEFTMl9CQVNFX0NPTlRFWFRfVVJMLFxuICAgIFBMQVRGT1JNX0NPTlRFWFRfUFJFRklYLFxuICAgIFNPQ0tFVEhVQl9CQVNFX0NPTlRFWFRfVVJMLFxufTtcblxuLyoqXG4gKiBCdWlsZCB0aGUgY2Fub25pY2FsIFNvY2tldGh1YiBAY29udGV4dCBhcnJheSBmb3IgYSBwbGF0Zm9ybSBuYW1lLlxuICovXG5leHBvcnQgZnVuY3Rpb24gYnVpbGRDYW5vbmljYWxDb250ZXh0KHBsYXRmb3JtOiBzdHJpbmcpOiBzdHJpbmdbXSB7XG4gICAgY29uc3QgcGxhdGZvcm1VcmwgPSBwbGF0Zm9ybS5zdGFydHNXaXRoKFwiaHR0cHM6Ly9cIilcbiAgICAgICAgPyBwbGF0Zm9ybVxuICAgICAgICA6IGAke1BMQVRGT1JNX0NPTlRFWFRfUFJFRklYfSR7cGxhdGZvcm19L3YxLmpzb25sZGA7XG4gICAgcmV0dXJuIFtBUzJfQkFTRV9DT05URVhUX1VSTCwgU09DS0VUSFVCX0JBU0VfQ09OVEVYVF9VUkwsIHBsYXRmb3JtVXJsXTtcbn1cblxuLyoqXG4gKiBFeHRyYWN0IHRoZSBwbGF0Zm9ybSBJRCBmcm9tIGEgY2Fub25pY2FsIEBjb250ZXh0IGFycmF5LlxuICogUmV0dXJucyB1bmRlZmluZWQgaWYgbm8gcGxhdGZvcm0gY29udGV4dCBVUkwgaXMgZm91bmQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwbGF0Zm9ybUlkRnJvbUNvbnRleHQoXG4gICAgY29udGV4dDogc3RyaW5nW10gfCB1bmtub3duLFxuKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICBpZiAoIUFycmF5LmlzQXJyYXkoY29udGV4dCkpIHtcbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG4gICAgZm9yIChjb25zdCBlbnRyeSBvZiBjb250ZXh0KSB7XG4gICAgICAgIGlmIChcbiAgICAgICAgICAgIHR5cGVvZiBlbnRyeSA9PT0gXCJzdHJpbmdcIiAmJlxuICAgICAgICAgICAgZW50cnkuc3RhcnRzV2l0aChQTEFURk9STV9DT05URVhUX1BSRUZJWClcbiAgICAgICAgKSB7XG4gICAgICAgICAgICBjb25zdCByZXN0ID0gZW50cnkuc2xpY2UoUExBVEZPUk1fQ09OVEVYVF9QUkVGSVgubGVuZ3RoKTtcbiAgICAgICAgICAgIGNvbnN0IHNsYXNoSWR4ID0gcmVzdC5pbmRleE9mKFwiL1wiKTtcbiAgICAgICAgICAgIGlmIChzbGFzaElkeCA+IDApIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gcmVzdC5zbGljZSgwLCBzbGFzaElkeCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbn1cbiIKICBdLAogICJtYXBwaW5ncyI6ICI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7RUFFQSxJQUFJLE1BQU0sT0FBTyxVQUFVO0FBQUEsRUFBM0IsSUFDSSxTQUFTO0FBQUEsRUFTYixTQUFTLE1BQU0sR0FBRztBQUFBLEVBU2xCLElBQUksT0FBTyxRQUFRO0FBQUEsSUFDakIsT0FBTyxZQUFZLE9BQU8sT0FBTyxJQUFJO0FBQUEsSUFNckMsSUFBSSxDQUFDLElBQUksT0FBTyxFQUFFO0FBQUEsTUFBVyxTQUFTO0FBQUEsRUFDeEM7QUFBQSxFQVdBLFNBQVMsRUFBRSxDQUFDLElBQUksU0FBUyxNQUFNO0FBQUEsSUFDN0IsS0FBSyxLQUFLO0FBQUEsSUFDVixLQUFLLFVBQVU7QUFBQSxJQUNmLEtBQUssT0FBTyxRQUFRO0FBQUE7QUFBQSxFQWN0QixTQUFTLFdBQVcsQ0FBQyxTQUFTLE9BQU8sSUFBSSxTQUFTLE1BQU07QUFBQSxJQUN0RCxJQUFJLE9BQU8sT0FBTyxZQUFZO0FBQUEsTUFDNUIsTUFBTSxJQUFJLFVBQVUsaUNBQWlDO0FBQUEsSUFDdkQ7QUFBQSxJQUVBLElBQUksV0FBVyxJQUFJLEdBQUcsSUFBSSxXQUFXLFNBQVMsSUFBSSxHQUM5QyxNQUFNLFNBQVMsU0FBUyxRQUFRO0FBQUEsSUFFcEMsSUFBSSxDQUFDLFFBQVEsUUFBUTtBQUFBLE1BQU0sUUFBUSxRQUFRLE9BQU8sVUFBVSxRQUFRO0FBQUEsSUFDL0QsU0FBSSxDQUFDLFFBQVEs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QUFJLEVBQUU7QUFBQSxJQUNyQixJQUFJLENBQUMsS0FBSztBQUFBLE1BQ04sSUFBSSxDQUFDLFNBQVE7QUFBQSxRQUNULE9BQU87QUFBQSxNQUNYO0FBQUEsTUFDQSxNQUFNLEVBQUUsR0FBTztBQUFBLElBQ25CO0FBQUEsSUFDQSxPQUFPLFlBQVksR0FBRztBQUFBO0FBQUEsRUFHMUIsTUFBTSxNQUFnQyxLQUFLLEtBQUs7QUFDcEQ7QUFtQk8sU0FBUyxTQUFTLENBQUMsT0FBeUIsQ0FBQyxHQUFjO0FBQUEsRUFDOUQsY0FBYyxNQUFNLGVBQWUsQ0FBQztBQUFBLEVBQ3BDLGdDQUNJLE9BQU8sS0FBSyxrQ0FBa0MsWUFDeEMsS0FBSyxnQ0FDTDtBQUFBLEVBQ1YsZ0NBQ0ksT0FBTyxLQUFLLGtDQUFrQyxZQUN4QyxLQUFLLGdDQUNMO0FBQUEsRUFDVixNQUFNLG9CQUFvQixLQUFLLGVBQWUsQ0FBQztBQUFBLEVBQy9DLFdBQVcsWUFBWSxPQUFPLEtBQUssaUJBQWlCLEdBQUc7QUFBQSxJQUNuRCxZQUFZLFlBQVksa0JBQWtCO0FBQUEsRUFDOUM7QUFBQSxFQUVBLE9BQU87QUFBQSxJQUNIO0FBQUEsSUFDQSxRQUFRO0FBQUEsSUFDUixJQUFJLENBQUMsT0FBTyxTQUFTLEdBQUcsR0FBRyxPQUFPLElBQUk7QUFBQSxJQUN0QyxNQUFNLENBQUMsT0FBTyxTQUFTLEdBQUcsS0FBSyxPQUFPLElBQUk7QUFBQSxJQUMxQyxLQUFLLENBQUMsT0FBTyxhQUFhLEdBQUcsSUFBSSxPQUFPLFFBQVE7QUFBQSxFQUNwRDtBQUFBO0FBQUEsQ0FHSCxDQUFDLFdBQW9DO0FBQUEsRUFDbEMsT0FBTyxXQUFXO0FBQUEsR0FFbEIsT0FBTyxlQUFlLFdBQ2YsYUFDRCxDQUFDLENBQ1g7QUFXTyxTQUFTLHFCQUFxQixDQUFDLFVBQTRCO0FBQUEsRUFDOUQsTUFBTSxjQUFjLFNBQVMsV0FBVyxVQUFVLElBQzVDLFdBQ0EsR0FBRywwQkFBMEI7QUFBQSxFQUNuQyxPQUFPLENBQUMsc0JBQXNCLDRCQUE0QixXQUFXO0FBQUE7QUFPbEUsU0FBUyxxQkFBcUIsQ0FDakMsU0FDa0I7QUFBQSxFQUNsQixJQUFJLENBQUMsTUFBTSxRQUFRLE9BQU8sR0FBRztBQUFBLElBQ3pCO0FBQUEsRUFDSjtBQUFBLEVBQ0EsV0FBVyxTQUFTLFNBQVM7QUFBQSxJQUN6QixJQUNJLE9BQU8sVUFBVSxZQUNqQixNQUFNLFdBQVcsdUJBQXVCLEdBQzFDO0FBQUEsTUFDRSxNQUFNLE9BQU8sTUFBTSxNQUFNLHdCQUF3QixNQUFNO0FBQUEsTUFDdkQsTUFBTSxXQUFXLEtBQUssUUFBUSxHQUFHO0FBQUEsTUFDakMsSUFBSSxXQUFXLEdBQUc7QUFBQSxRQUNkLE9BQU8sS0FBSyxNQUFNLEdBQUcsUUFBUTtBQUFBLE1BQ2pDO0FBQUEsSUFDSjtBQUFBLEVBQ0o7QUFBQSxFQUNBO0FBQUE7IiwKICAiZGVidWdJZCI6ICJENUJFMjZCQjYzMzQ5QzI3NjQ3NTZFMjE2NDc1NkUyMSIsCiAgIm5hbWVzIjogW10KfQ==
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
var
|
|
1
|
+
var x=Object.create;var{getPrototypeOf:f,defineProperty:P,getOwnPropertyNames:E}=Object;var d=Object.prototype.hasOwnProperty;function p(J){return this[J]}var v,c,l=(J,G,Q)=>{var W=J!=null&&typeof J==="object";if(W){var $=G?v??=new WeakMap:c??=new WeakMap,z=$.get(J);if(z)return z}Q=J!=null?x(f(J)):{};let Z=G||!J||!J.__esModule?P(Q,"default",{value:J,enumerable:!0}):Q;for(let D of E(J))if(!d.call(Z,D))P(Z,D,{get:p.bind(J,D),enumerable:!0});if(W)$.set(J,Z);return Z};var m=(J,G)=>()=>(G||J((G={exports:{}}).exports,G),G.exports);var u=m((WG,N)=>{var s=Object.prototype.hasOwnProperty,H="~";function X(){}if(Object.create){if(X.prototype=Object.create(null),!new X().__proto__)H=!1}function a(J,G,Q){this.fn=J,this.context=G,this.once=Q||!1}function h(J,G,Q,W,$){if(typeof Q!=="function")throw TypeError("The listener must be a function");var z=new a(Q,W||J,$),Z=H?H+G:G;if(!J._events[Z])J._events[Z]=z,J._eventsCount++;else if(!J._events[Z].fn)J._events[Z].push(z);else J._events[Z]=[J._events[Z],z];return J}function A(J,G){if(--J._eventsCount===0)J._events=new X;else delete J._events[G]}function q(){this._events=new X,this._eventsCount=0}q.prototype.eventNames=function(){var G=[],Q,W;if(this._eventsCount===0)return G;for(W in Q=this._events)if(s.call(Q,W))G.push(H?W.slice(1):W);if(Object.getOwnPropertySymbols)return G.concat(Object.getOwnPropertySymbols(Q));return G};q.prototype.listeners=function(G){var Q=H?H+G:G,W=this._events[Q];if(!W)return[];if(W.fn)return[W.fn];for(var $=0,z=W.length,Z=Array(z);$<z;$++)Z[$]=W[$].fn;return Z};q.prototype.listenerCount=function(G){var Q=H?H+G:G,W=this._events[Q];if(!W)return 0;if(W.fn)return 1;return W.length};q.prototype.emit=function(G,Q,W,$,z,Z){var D=H?H+G:G;if(!this._events[D])return!1;var Y=this._events[D],K=arguments.length,F,V;if(Y.fn){if(Y.once)this.removeListener(G,Y.fn,void 0,!0);switch(K){case 1:return Y.fn.call(Y.context),!0;case 2:return Y.fn.call(Y.context,Q),!0;case 3:return Y.fn.call(Y.context,Q,W),!0;case 4:return Y.fn.call(Y.context,Q,W,$),!0;case 5:return Y.fn.call(Y.context,Q,W,$,z),!0;case 6:return Y.fn.call(Y.context,Q,W,$,z,Z),!0}for(V=1,F=Array(K-1);V<K;V++)F[V-1]=arguments[V];Y.fn.apply(Y.context,F)}else{var O=Y.length,w;for(V=0;V<O;V++){if(Y[V].once)this.removeListener(G,Y[V].fn,void 0,!0);switch(K){case 1:Y[V].fn.call(Y[V].context);break;case 2:Y[V].fn.call(Y[V].context,Q);break;case 3:Y[V].fn.call(Y[V].context,Q,W);break;case 4:Y[V].fn.call(Y[V].context,Q,W,$);break;default:if(!F)for(w=1,F=Array(K-1);w<K;w++)F[w-1]=arguments[w];Y[V].fn.apply(Y[V].context,F)}}}return!0};q.prototype.on=function(G,Q,W){return h(this,G,Q,W,!1)};q.prototype.once=function(G,Q,W){return h(this,G,Q,W,!0)};q.prototype.removeListener=function(G,Q,W,$){var z=H?H+G:G;if(!this._events[z])return this;if(!Q)return A(this,z),this;var Z=this._events[z];if(Z.fn){if(Z.fn===Q&&(!$||Z.once)&&(!W||Z.context===W))A(this,z)}else{for(var D=0,Y=[],K=Z.length;D<K;D++)if(Z[D].fn!==Q||$&&!Z[D].once||W&&Z[D].context!==W)Y.push(Z[D]);if(Y.length)this._events[z]=Y.length===1?Y[0]:Y;else A(this,z)}return this};q.prototype.removeAllListeners=function(G){var Q;if(G){if(Q=H?H+G:G,this._events[Q])A(this,Q)}else this._events=new X,this._eventsCount=0;return this};q.prototype.off=q.prototype.removeListener;q.prototype.addListener=q.prototype.on;q.prefixed=H;q.EventEmitter=q;if(typeof N<"u")N.exports=q});var{createRequire:JG}=(()=>({}));var T="https://www.w3.org/ns/activitystreams",U="https://sockethub.org/ns/context/v1.jsonld",L="https://sockethub.org/ns/context/platform/";var C=l(u(),1);var _=C.default;/*!
|
|
2
2
|
* activity-streams
|
|
3
3
|
* https://github.com/silverbucket/activity-streams
|
|
4
4
|
*
|
|
@@ -13,7 +13,7 @@ var g=Object.create;var{getPrototypeOf:O,defineProperty:N,getOwnPropertyNames:E}
|
|
|
13
13
|
* You are free to use, modify and distribute this software, but all copyright
|
|
14
14
|
* information must remain.
|
|
15
15
|
*
|
|
16
|
-
*/var
|
|
16
|
+
*/var M=new _,I={stream:["@context","id","type","platform","actor","target","object","published","error"],object:["id","type","context","alias","attachedTo","attachment","attributedTo","attributedWith","condition","content","contentMap","context","contextOf","name","endTime","generator","generatorOf","group","icon","image","inReplyTo","members","memberOf","message","location","locationOf","objectOf","originOf","presence","preview","previewOf","provider","providerOf","published","rating","relationship","resultOf","replies","role","scope","scopeOf","startTime","status","summary","topic","tag","tagOf","targetOf","title","titleMap","updated","url","xmpp:stanza-id"]},y={actor:{primary:"id",props:I},target:{primary:"id",props:I},object:{primary:"content",props:I}},B=new Map,j={},S=!1,R=!0,b=[];function i(J,G){let Q=j[J];return Array.isArray(Q)&&Q.includes(G)}function k(J,G,Q=!1){if(G===null)throw Error(`ActivityStreams validation failed: the "${J}" property is null. Example: { id: "user@example.com", type: "person" }`);if(G===void 0)throw Error(`ActivityStreams validation failed: the "${J}" property is undefined. Example: { id: "user@example.com", type: "person" }`);if(typeof G==="string")throw Error(`ActivityStreams validation failed: the "${J}" property received string "${G}" but expected an object. Use: { id: "${G}", type: "person" }`);if(typeof G!=="object"||Array.isArray(G)){let D=Array.isArray(G)?"array":typeof G,Y=String(G);throw Error(`ActivityStreams validation failed: the "${J}" property must be an object, received ${D} (${Y}). Example: { id: "user@example.com", type: "person" }`)}if(Q&&!G.id)throw Error(`ActivityStreams validation failed: the "${J}" property requires an 'id' property. Example: { id: "user@example.com", type: "person" }`);let $=G,z=I[J],Z=Object.keys($).filter((D)=>{return!z.includes(D)});for(let D of Z){let Y=G;if(i(Y.type,D))continue;if(!b.includes(Y.type)){console.log(Y);let K=typeof Y[D]==="string"?`"${Y[D]}"`:String(Y[D]),F=`ActivityStreams validation failed: property "${D}" with value ${K} is not allowed on the "${J}" object of type "${Y.type}".`;if(S)throw Error(F);if(R)console.warn(F)}}}function g(J){return J}function o(J){let G={},Q=J;for(let W of Object.keys(Q)){let $=Q[W];if(typeof $==="string")G[W]=B.get($)||$;else if(Array.isArray($)){let z=[];for(let Z of $)if(typeof Z==="string")z.push(B.get(Z)||Z);G[W]=z}else G[W]=$}for(let W of Object.keys(y)){let $=G[W];if(typeof $==="string"){let z=y[W].primary;G[W]={[z]:$}}}return G}function r(J){if(k("stream",J),typeof J.object==="object")k("object",J.object);let G=o(J);return M.emit("activity-stream",G),G}var n={create:(J)=>{k("object",J,!0);let G=g(J);return B.set(G.id,G),M.emit("activity-object-create",G),G},delete:(J)=>{let G=B.delete(J);if(G)M.emit("activity-object-delete",J);return G},get:(J,G)=>{let Q=B.get(J);if(!Q){if(!G)return J;Q={id:J}}return g(Q)},list:()=>B.keys()};function t(J={}){b=J?.specialObjs||[],S=typeof J.failOnUnknownObjectProperties==="boolean"?J.failOnUnknownObjectProperties:S,R=typeof J.warnOnUnknownObjectProperties==="boolean"?J.warnOnUnknownObjectProperties:R;let G=J.customProps||{};for(let Q of Object.keys(G))j[Q]=G[Q];return{Stream:r,Object:n,on:(Q,W)=>M.on(Q,W),once:(Q,W)=>M.once(Q,W),off:(Q,W)=>M.off(Q,W)}}((J)=>{J.ASFactor=t})(typeof globalThis==="object"?globalThis:{});function zG(J){let G=J.startsWith("https://")?J:`${L}${J}/v1.jsonld`;return[T,U,G]}function DG(J){if(!Array.isArray(J))return;for(let G of J)if(typeof G==="string"&&G.startsWith(L)){let Q=G.slice(L.length),W=Q.indexOf("/");if(W>0)return Q.slice(0,W)}return}export{DG as platformIdFromContext,zG as buildCanonicalContext,U as SOCKETHUB_BASE_CONTEXT_URL,L as PLATFORM_CONTEXT_PREFIX,t as ASFactory,T as AS2_BASE_CONTEXT_URL};
|
|
17
17
|
|
|
18
|
-
//# debugId=
|
|
19
|
-
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vbm9kZV9tb2R1bGVzL2V2ZW50ZW1pdHRlcjMvaW5kZXguanMiLCAiLi4vLi4vbm9kZV9tb2R1bGVzL2V2ZW50ZW1pdHRlcjMvaW5kZXgubWpzIiwgInNyYy9hY3Rpdml0eS1zdHJlYW1zLnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWwogICAgIid1c2Ugc3RyaWN0JztcblxudmFyIGhhcyA9IE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHlcbiAgLCBwcmVmaXggPSAnfic7XG5cbi8qKlxuICogQ29uc3RydWN0b3IgdG8gY3JlYXRlIGEgc3RvcmFnZSBmb3Igb3VyIGBFRWAgb2JqZWN0cy5cbiAqIEFuIGBFdmVudHNgIGluc3RhbmNlIGlzIGEgcGxhaW4gb2JqZWN0IHdob3NlIHByb3BlcnRpZXMgYXJlIGV2ZW50IG5hbWVzLlxuICpcbiAqIEBjb25zdHJ1Y3RvclxuICogQHByaXZhdGVcbiAqL1xuZnVuY3Rpb24gRXZlbnRzKCkge31cblxuLy9cbi8vIFdlIHRyeSB0byBub3QgaW5oZXJpdCBmcm9tIGBPYmplY3QucHJvdG90eXBlYC4gSW4gc29tZSBlbmdpbmVzIGNyZWF0aW5nIGFuXG4vLyBpbnN0YW5jZSBpbiB0aGlzIHdheSBpcyBmYXN0ZXIgdGhhbiBjYWxsaW5nIGBPYmplY3QuY3JlYXRlKG51bGwpYCBkaXJlY3RseS5cbi8vIElmIGBPYmplY3QuY3JlYXRlKG51bGwpYCBpcyBub3Qgc3VwcG9ydGVkIHdlIHByZWZpeCB0aGUgZXZlbnQgbmFtZXMgd2l0aCBhXG4vLyBjaGFyYWN0ZXIgdG8gbWFrZSBzdXJlIHRoYXQgdGhlIGJ1aWx0LWluIG9iamVjdCBwcm9wZXJ0aWVzIGFyZSBub3Rcbi8vIG92ZXJyaWRkZW4gb3IgdXNlZCBhcyBhbiBhdHRhY2sgdmVjdG9yLlxuLy9cbmlmIChPYmplY3QuY3JlYXRlKSB7XG4gIEV2ZW50cy5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuXG4gIC8vXG4gIC8vIFRoaXMgaGFjayBpcyBuZWVkZWQgYmVjYXVzZSB0aGUgYF9fcHJvdG9fX2AgcHJvcGVydHkgaXMgc3RpbGwgaW5oZXJpdGVkIGluXG4gIC8vIHNvbWUgb2xkIGJyb3dzZXJzIGxpa2UgQW5kcm9pZCA0LCBpUGhvbmUgNS4xLCBPcGVyYSAxMSBhbmQgU2FmYXJpIDUuXG4gIC8vXG4gIGlmICghbmV3IEV2ZW50cygpLl9fcHJvdG9fXykgcHJlZml4ID0gZmFsc2U7XG59XG5cbi8qKlxuICogUmVwcmVzZW50YXRpb24gb2YgYSBzaW5nbGUgZXZlbnQgbGlzdGVuZXIuXG4gKlxuICogQHBhcmFtIHtGdW5jdGlvbn0gZm4gVGhlIGxpc3RlbmVyIGZ1bmN0aW9uLlxuICogQHBhcmFtIHsqfSBjb250ZXh0IFRoZSBjb250ZXh0IHRvIGludm9rZSB0aGUgbGlzdGVuZXIgd2l0aC5cbiAqIEBwYXJhbSB7Qm9vbGVhbn0gW29uY2U9ZmFsc2VdIFNwZWNpZnkgaWYgdGhlIGxpc3RlbmVyIGlzIGEgb25lLXRpbWUgbGlzdGVuZXIuXG4gKiBAY29uc3RydWN0b3JcbiAqIEBwcml2YXRlXG4gKi9cbmZ1bmN0aW9uIEVFKGZuLCBjb250ZXh0LCBvbmNlKSB7XG4gIHRoaXMuZm4gPSBmbjtcbiAgdGhpcy5jb250ZXh0ID0gY29udGV4dDtcbiAgdGhpcy5vbmNlID0gb25jZSB8fCBmYWxzZTtcbn1cblxuLyoqXG4gKiBBZGQgYSBsaXN0ZW5lciBmb3IgYSBnaXZlbiBldmVudC5cbiAqXG4gKiBAcGFyYW0ge0V2ZW50RW1pdHRlcn0gZW1pdHRlciBSZWZlcmVuY2UgdG8gdGhlIGBFdmVudEVtaXR0ZXJgIGluc3RhbmNlLlxuICogQHBhcmFtIHsoU3RyaW5nfFN5bWJvbCl9IGV2ZW50IFRoZSBldmVudCBuYW1lLlxuICogQHBhcmFtIHtGdW5jdGlvbn0gZm4gVGhlIGxpc3RlbmVyIGZ1bmN0aW9uLlxuICogQHBhcmFtIHsqfSBjb250ZXh0IFRoZSBjb250ZXh0IHRvIGludm9rZSB0aGUgbGlzdGVuZXIgd2l0aC5cbiAqIEBwYXJhbSB7Qm9vbGVhbn0gb25jZSBTcGVjaWZ5IGlmIHRoZSBsaXN0ZW5lciBpcyBhIG9uZS10aW1lIGxpc3RlbmVyLlxuICogQHJldHVybnMge0V2ZW50RW1pdHRlcn1cbiAqIEBwcml2YXRlXG4gKi9cbmZ1bmN0aW9uIGFkZExpc3RlbmVyKGVtaXR0ZXIsIGV2ZW50LCBmbiwgY29udGV4dCwgb25jZSkge1xuICBpZiAodHlwZW9mIGZuICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcignVGhlIGxpc3RlbmVyIG11c3QgYmUgYSBmdW5jdGlvbicpO1xuICB9XG5cbiAgdmFyIGxpc3RlbmVyID0gbmV3IEVFKGZuLCBjb250ZXh0IHx8IGVtaXR0ZXIsIG9uY2UpXG4gICAgLCBldnQgPSBwcmVmaXggPyBwcmVmaXggKyBldmVudCA6IGV2ZW50O1xuXG4gIGlmICghZW1pdHRlci5fZXZlbnRzW2V2dF0pIGVtaXR0ZXIuX2V2ZW50c1tldnRdID0gbGlzdGVuZXIsIGVtaXR0ZXIuX2V2ZW50c0NvdW50Kys7XG4gIGVsc2UgaWYgKCFlbWl0dGVyLl9ldmVudHNbZXZ0XS5mbikgZW1pdHRlci5fZXZlbnRzW2V2dF0ucHVzaChsaXN0ZW5lcik7XG4gIGVsc2UgZW1pdHRlci5fZXZlbnRzW2V2dF0gPSBbZW1pdHRlci5fZXZlbnRzW2V2dF0sIGxpc3RlbmVyXTtcblxuICByZXR1cm4gZW1pdHRlcjtcbn1cblxuLyoqXG4gKiBDbGVhciBldmVudCBieSBuYW1lLlxuICpcbiAqIEBwYXJhbSB7RXZlbnRFbWl0dGVyfSBlbWl0dGVyIFJlZmVyZW5jZSB0byB0aGUgYEV2ZW50RW1pdHRlcmAgaW5zdGFuY2UuXG4gKiBAcGFyYW0geyhTdHJpbmd8U3ltYm9sKX0gZXZ0IFRoZSBFdmVudCBuYW1lLlxuICogQHByaXZhdGVcbiAqL1xuZnVuY3Rpb24gY2xlYXJFdmVudChlbWl0dGVyLCBldnQpIHtcbiAgaWYgKC0tZW1pdHRlci5fZXZlbnRzQ291bnQgPT09IDApIGVtaXR0ZXIuX2V2ZW50cyA9IG5ldyBFdmVudHMoKTtcbiAgZWxzZSBkZWxldGUgZW1pdHRlci5fZXZlbnRzW2V2dF07XG59XG5cbi8qKlxuICogTWluaW1hbCBgRXZlbnRFbWl0dGVyYCBpbnRlcmZhY2UgdGhhdCBpcyBtb2xkZWQgYWdhaW5zdCB0aGUgTm9kZS5qc1xuICogYEV2ZW50RW1pdHRlcmAgaW50ZXJmYWNlLlxuICpcbiAqIEBjb25zdHJ1Y3RvclxuICogQHB1YmxpY1xuICovXG5mdW5jdGlvbiBFdmVudEVtaXR0ZXIoKSB7XG4gIHRoaXMuX2V2ZW50cyA9IG5ldyBFdmVudHMoKTtcbiAgdGhpcy5fZXZlbnRzQ291bnQgPSAwO1xufVxuXG4vKipcbiAqIFJldHVybiBhbiBhcnJheSBsaXN0aW5nIHRoZSBldmVudHMgZm9yIHdoaWNoIHRoZSBlbWl0dGVyIGhhcyByZWdpc3RlcmVkXG4gKiBsaXN0ZW5lcnMuXG4gKlxuICogQHJldHVybnMge0FycmF5fVxuICogQHB1YmxpY1xuICovXG5FdmVudEVtaXR0ZXIucHJvdG90eXBlLmV2ZW50TmFtZXMgPSBmdW5jdGlvbiBldmVudE5hbWVzKCkge1xuICB2YXIgbmFtZXMgPSBbXVxuICAgICwgZXZlbnRzXG4gICAgLCBuYW1lO1xuXG4gIGlmICh0aGlzLl9ldmVudHNDb3VudCA9PT0gMCkgcmV0dXJuIG5hbWVzO1xuXG4gIGZvciAobmFtZSBpbiAoZXZlbnRzID0gdGhpcy5fZXZlbnRzKSkge1xuICAgIGlmIChoYXMuY2FsbChldmVudHMsIG5hbWUpKSBuYW1lcy5wdXNoKHByZWZpeCA/IG5hbWUuc2xpY2UoMSkgOiBuYW1lKTtcbiAgfVxuXG4gIGlmIChPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKSB7XG4gICAgcmV0dXJuIG5hbWVzLmNvbmNhdChPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKGV2ZW50cykpO1xuICB9XG5cbiAgcmV0dXJuIG5hbWVzO1xufTtcblxuLyoqXG4gKiBSZXR1cm4gdGhlIGxpc3RlbmVycyByZWdpc3RlcmVkIGZvciBhIGdpdmVuIGV2ZW50LlxuICpcbiAqIEBwYXJhbSB7KFN0cmluZ3xTeW1ib2wpfSBldmVudCBUaGUgZXZlbnQgbmFtZS5cbiAqIEByZXR1cm5zIHtBcnJheX0gVGhlIHJlZ2lzdGVyZWQgbGlzdGVuZXJzLlxuICogQHB1YmxpY1xuICovXG5FdmVudEVtaXR0ZXIucHJvdG90eXBlLmxpc3RlbmVycyA9IGZ1bmN0aW9uIGxpc3RlbmVycyhldmVudCkge1xuICB2YXIgZXZ0ID0gcHJlZml4ID8gcHJlZml4ICsgZXZlbnQgOiBldmVudFxuICAgICwgaGFuZGxlcnMgPSB0aGlzLl9ldmVudHNbZXZ0XTtcblxuICBpZiAoIWhhbmRsZXJzKSByZXR1cm4gW107XG4gIGlmIChoYW5kbGVycy5mbikgcmV0dXJuIFtoYW5kbGVycy5mbl07XG5cbiAgZm9yICh2YXIgaSA9IDAsIGwgPSBoYW5kbGVycy5sZW5ndGgsIGVlID0gbmV3IEFycmF5KGwpOyBpIDwgbDsgaSsrKSB7XG4gICAgZWVbaV0gPSBoYW5kbGVyc1tpXS5mbjtcbiAgfVxuXG4gIHJldHVybiBlZTtcbn07XG5cbi8qKlxuICogUmV0dXJuIHRoZSBudW1iZXIgb2YgbGlzdGVuZXJzIGxpc3RlbmluZyB0byBhIGdpdmVuIGV2ZW50LlxuICpcbiAqIEBwYXJhbSB7KFN0cmluZ3xTeW1ib2wpfSBldmVudCBUaGUgZXZlbnQgbmFtZS5cbiAqIEByZXR1cm5zIHtOdW1iZXJ9IFRoZSBudW1iZXIgb2YgbGlzdGVuZXJzLlxuICogQHB1YmxpY1xuICovXG5FdmVudEVtaXR0ZXIucHJvdG90eXBlLmxpc3RlbmVyQ291bnQgPSBmdW5jdGlvbiBsaXN0ZW5lckNvdW50KGV2ZW50KSB7XG4gIHZhciBldnQgPSBwcmVmaXggPyBwcmVmaXggKyBldmVudCA6IGV2ZW50XG4gICAgLCBsaXN0ZW5lcnMgPSB0aGlzLl9ldmVudHNbZXZ0XTtcblxuICBpZiAoIWxpc3RlbmVycykgcmV0dXJuIDA7XG4gIGlmIChsaXN0ZW5lcnMuZm4pIHJldHVybiAxO1xuICByZXR1cm4gbGlzdGVuZXJzLmxlbmd0aDtcbn07XG5cbi8qKlxuICogQ2FsbHMgZWFjaCBvZiB0aGUgbGlzdGVuZXJzIHJlZ2lzdGVyZWQgZm9yIGEgZ2l2ZW4gZXZlbnQuXG4gKlxuICogQHBhcmFtIHsoU3RyaW5nfFN5bWJvbCl9IGV2ZW50IFRoZSBldmVudCBuYW1lLlxuICogQHJldHVybnMge0Jvb2xlYW59IGB0cnVlYCBpZiB0aGUgZXZlbnQgaGFkIGxpc3RlbmVycywgZWxzZSBgZmFsc2VgLlxuICogQHB1YmxpY1xuICovXG5FdmVudEVtaXR0ZXIucHJvdG90eXBlLmVtaXQgPSBmdW5jdGlvbiBlbWl0KGV2ZW50LCBhMSwgYTIsIGEzLCBhNCwgYTUpIHtcbiAgdmFyIGV2dCA9IHByZWZpeCA/IHByZWZpeCArIGV2ZW50IDogZXZlbnQ7XG5cbiAgaWYgKCF0aGlzLl9ldmVudHNbZXZ0XSkgcmV0dXJuIGZhbHNlO1xuXG4gIHZhciBsaXN0ZW5lcnMgPSB0aGlzLl9ldmVudHNbZXZ0XVxuICAgICwgbGVuID0gYXJndW1lbnRzLmxlbmd0aFxuICAgICwgYXJnc1xuICAgICwgaTtcblxuICBpZiAobGlzdGVuZXJzLmZuKSB7XG4gICAgaWYgKGxpc3RlbmVycy5vbmNlKSB0aGlzLnJlbW92ZUxpc3RlbmVyKGV2ZW50LCBsaXN0ZW5lcnMuZm4sIHVuZGVmaW5lZCwgdHJ1ZSk7XG5cbiAgICBzd2l0Y2ggKGxlbikge1xuICAgICAgY2FzZSAxOiByZXR1cm4gbGlzdGVuZXJzLmZuLmNhbGwobGlzdGVuZXJzLmNvbnRleHQpLCB0cnVlO1xuICAgICAgY2FzZSAyOiByZXR1cm4gbGlzdGVuZXJzLmZuLmNhbGwobGlzdGVuZXJzLmNvbnRleHQsIGExKSwgdHJ1ZTtcbiAgICAgIGNhc2UgMzogcmV0dXJuIGxpc3RlbmVycy5mbi5jYWxsKGxpc3RlbmVycy5jb250ZXh0LCBhMSwgYTIpLCB0cnVlO1xuICAgICAgY2FzZSA0OiByZXR1cm4gbGlzdGVuZXJzLmZuLmNhbGwobGlzdGVuZXJzLmNvbnRleHQsIGExLCBhMiwgYTMpLCB0cnVlO1xuICAgICAgY2FzZSA1OiByZXR1cm4gbGlzdGVuZXJzLmZuLmNhbGwobGlzdGVuZXJzLmNvbnRleHQsIGExLCBhMiwgYTMsIGE0KSwgdHJ1ZTtcbiAgICAgIGNhc2UgNjogcmV0dXJuIGxpc3RlbmVycy5mbi5jYWxsKGxpc3RlbmVycy5jb250ZXh0LCBhMSwgYTIsIGEzLCBhNCwgYTUpLCB0cnVlO1xuICAgIH1cblxuICAgIGZvciAoaSA9IDEsIGFyZ3MgPSBuZXcgQXJyYXkobGVuIC0xKTsgaSA8IGxlbjsgaSsrKSB7XG4gICAgICBhcmdzW2kgLSAxXSA9IGFyZ3VtZW50c1tpXTtcbiAgICB9XG5cbiAgICBsaXN0ZW5lcnMuZm4uYXBwbHkobGlzdGVuZXJzLmNvbnRleHQsIGFyZ3MpO1xuICB9IGVsc2Uge1xuICAgIHZhciBsZW5ndGggPSBsaXN0ZW5lcnMubGVuZ3RoXG4gICAgICAsIGo7XG5cbiAgICBmb3IgKGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHtcbiAgICAgIGlmIChsaXN0ZW5lcnNbaV0ub25jZSkgdGhpcy5yZW1vdmVMaXN0ZW5lcihldmVudCwgbGlzdGVuZXJzW2ldLmZuLCB1bmRlZmluZWQsIHRydWUpO1xuXG4gICAgICBzd2l0Y2ggKGxlbikge1xuICAgICAgICBjYXNlIDE6IGxpc3RlbmVyc1tpXS5mbi5jYWxsKGxpc3RlbmVyc1tpXS5jb250ZXh0KTsgYnJlYWs7XG4gICAgICAgIGNhc2UgMjogbGlzdGVuZXJzW2ldLmZuLmNhbGwobGlzdGVuZXJzW2ldLmNvbnRleHQsIGExKTsgYnJlYWs7XG4gICAgICAgIGNhc2UgMzogbGlzdGVuZXJzW2ldLmZuLmNhbGwobGlzdGVuZXJzW2ldLmNvbnRleHQsIGExLCBhMik7IGJyZWFrO1xuICAgICAgICBjYXNlIDQ6IGxpc3RlbmVyc1tpXS5mbi5jYWxsKGxpc3RlbmVyc1tpXS5jb250ZXh0LCBhMSwgYTIsIGEzKTsgYnJlYWs7XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgaWYgKCFhcmdzKSBmb3IgKGogPSAxLCBhcmdzID0gbmV3IEFycmF5KGxlbiAtMSk7IGogPCBsZW47IGorKykge1xuICAgICAgICAgICAgYXJnc1tqIC0gMV0gPSBhcmd1bWVudHNbal07XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgbGlzdGVuZXJzW2ldLmZuLmFwcGx5KGxpc3RlbmVyc1tpXS5jb250ZXh0LCBhcmdzKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gdHJ1ZTtcbn07XG5cbi8qKlxuICogQWRkIGEgbGlzdGVuZXIgZm9yIGEgZ2l2ZW4gZXZlbnQuXG4gKlxuICogQHBhcmFtIHsoU3RyaW5nfFN5bWJvbCl9IGV2ZW50IFRoZSBldmVudCBuYW1lLlxuICogQHBhcmFtIHtGdW5jdGlvbn0gZm4gVGhlIGxpc3RlbmVyIGZ1bmN0aW9uLlxuICogQHBhcmFtIHsqfSBbY29udGV4dD10aGlzXSBUaGUgY29udGV4dCB0byBpbnZva2UgdGhlIGxpc3RlbmVyIHdpdGguXG4gKiBAcmV0dXJucyB7RXZlbnRFbWl0dGVyfSBgdGhpc2AuXG4gKiBAcHVibGljXG4gKi9cbkV2ZW50RW1pdHRlci5wcm90b3R5cGUub24gPSBmdW5jdGlvbiBvbihldmVudCwgZm4sIGNvbnRleHQpIHtcbiAgcmV0dXJuIGFkZExpc3RlbmVyKHRoaXMsIGV2ZW50LCBmbiwgY29udGV4dCwgZmFsc2UpO1xufTtcblxuLyoqXG4gKiBBZGQgYSBvbmUtdGltZSBsaXN0ZW5lciBmb3IgYSBnaXZlbiBldmVudC5cbiAqXG4gKiBAcGFyYW0geyhTdHJpbmd8U3ltYm9sKX0gZXZlbnQgVGhlIGV2ZW50IG5hbWUuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmbiBUaGUgbGlzdGVuZXIgZnVuY3Rpb24uXG4gKiBAcGFyYW0geyp9IFtjb250ZXh0PXRoaXNdIFRoZSBjb250ZXh0IHRvIGludm9rZSB0aGUgbGlzdGVuZXIgd2l0aC5cbiAqIEByZXR1cm5zIHtFdmVudEVtaXR0ZXJ9IGB0aGlzYC5cbiAqIEBwdWJsaWNcbiAqL1xuRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5vbmNlID0gZnVuY3Rpb24gb25jZShldmVudCwgZm4sIGNvbnRleHQpIHtcbiAgcmV0dXJuIGFkZExpc3RlbmVyKHRoaXMsIGV2ZW50LCBmbiwgY29udGV4dCwgdHJ1ZSk7XG59O1xuXG4vKipcbiAqIFJlbW92ZSB0aGUgbGlzdGVuZXJzIG9mIGEgZ2l2ZW4gZXZlbnQuXG4gKlxuICogQHBhcmFtIHsoU3RyaW5nfFN5bWJvbCl9IGV2ZW50IFRoZSBldmVudCBuYW1lLlxuICogQHBhcmFtIHtGdW5jdGlvbn0gZm4gT25seSByZW1vdmUgdGhlIGxpc3RlbmVycyB0aGF0IG1hdGNoIHRoaXMgZnVuY3Rpb24uXG4gKiBAcGFyYW0geyp9IGNvbnRleHQgT25seSByZW1vdmUgdGhlIGxpc3RlbmVycyB0aGF0IGhhdmUgdGhpcyBjb250ZXh0LlxuICogQHBhcmFtIHtCb29sZWFufSBvbmNlIE9ubHkgcmVtb3ZlIG9uZS10aW1lIGxpc3RlbmVycy5cbiAqIEByZXR1cm5zIHtFdmVudEVtaXR0ZXJ9IGB0aGlzYC5cbiAqIEBwdWJsaWNcbiAqL1xuRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5yZW1vdmVMaXN0ZW5lciA9IGZ1bmN0aW9uIHJlbW92ZUxpc3RlbmVyKGV2ZW50LCBmbiwgY29udGV4dCwgb25jZSkge1xuICB2YXIgZXZ0ID0gcHJlZml4ID8gcHJlZml4ICsgZXZlbnQgOiBldmVudDtcblxuICBpZiAoIXRoaXMuX2V2ZW50c1tldnRdKSByZXR1cm4gdGhpcztcbiAgaWYgKCFmbikge1xuICAgIGNsZWFyRXZlbnQodGhpcywgZXZ0KTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIHZhciBsaXN0ZW5lcnMgPSB0aGlzLl9ldmVudHNbZXZ0XTtcblxuICBpZiAobGlzdGVuZXJzLmZuKSB7XG4gICAgaWYgKFxuICAgICAgbGlzdGVuZXJzLmZuID09PSBmbiAmJlxuICAgICAgKCFvbmNlIHx8IGxpc3RlbmVycy5vbmNlKSAmJlxuICAgICAgKCFjb250ZXh0IHx8IGxpc3RlbmVycy5jb250ZXh0ID09PSBjb250ZXh0KVxuICAgICkge1xuICAgICAgY2xlYXJFdmVudCh0aGlzLCBldnQpO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBmb3IgKHZhciBpID0gMCwgZXZlbnRzID0gW10sIGxlbmd0aCA9IGxpc3RlbmVycy5sZW5ndGg7IGkgPCBsZW5ndGg7IGkrKykge1xuICAgICAgaWYgKFxuICAgICAgICBsaXN0ZW5lcnNbaV0uZm4gIT09IGZuIHx8XG4gICAgICAgIChvbmNlICYmICFsaXN0ZW5lcnNbaV0ub25jZSkgfHxcbiAgICAgICAgKGNvbnRleHQgJiYgbGlzdGVuZXJzW2ldLmNvbnRleHQgIT09IGNvbnRleHQpXG4gICAgICApIHtcbiAgICAgICAgZXZlbnRzLnB1c2gobGlzdGVuZXJzW2ldKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvL1xuICAgIC8vIFJlc2V0IHRoZSBhcnJheSwgb3IgcmVtb3ZlIGl0IGNvbXBsZXRlbHkgaWYgd2UgaGF2ZSBubyBtb3JlIGxpc3RlbmVycy5cbiAgICAvL1xuICAgIGlmIChldmVudHMubGVuZ3RoKSB0aGlzLl9ldmVudHNbZXZ0XSA9IGV2ZW50cy5sZW5ndGggPT09IDEgPyBldmVudHNbMF0gOiBldmVudHM7XG4gICAgZWxzZSBjbGVhckV2ZW50KHRoaXMsIGV2dCk7XG4gIH1cblxuICByZXR1cm4gdGhpcztcbn07XG5cbi8qKlxuICogUmVtb3ZlIGFsbCBsaXN0ZW5lcnMsIG9yIHRob3NlIG9mIHRoZSBzcGVjaWZpZWQgZXZlbnQuXG4gKlxuICogQHBhcmFtIHsoU3RyaW5nfFN5bWJvbCl9IFtldmVudF0gVGhlIGV2ZW50IG5hbWUuXG4gKiBAcmV0dXJucyB7RXZlbnRFbWl0dGVyfSBgdGhpc2AuXG4gKiBAcHVibGljXG4gKi9cbkV2ZW50RW1pdHRlci5wcm90b3R5cGUucmVtb3ZlQWxsTGlzdGVuZXJzID0gZnVuY3Rpb24gcmVtb3ZlQWxsTGlzdGVuZXJzKGV2ZW50KSB7XG4gIHZhciBldnQ7XG5cbiAgaWYgKGV2ZW50KSB7XG4gICAgZXZ0ID0gcHJlZml4ID8gcHJlZml4ICsgZXZlbnQgOiBldmVudDtcbiAgICBpZiAodGhpcy5fZXZlbnRzW2V2dF0pIGNsZWFyRXZlbnQodGhpcywgZXZ0KTtcbiAgfSBlbHNlIHtcbiAgICB0aGlzLl9ldmVudHMgPSBuZXcgRXZlbnRzKCk7XG4gICAgdGhpcy5fZXZlbnRzQ291bnQgPSAwO1xuICB9XG5cbiAgcmV0dXJuIHRoaXM7XG59O1xuXG4vL1xuLy8gQWxpYXMgbWV0aG9kcyBuYW1lcyBiZWNhdXNlIHBlb3BsZSByb2xsIGxpa2UgdGhhdC5cbi8vXG5FdmVudEVtaXR0ZXIucHJvdG90eXBlLm9mZiA9IEV2ZW50RW1pdHRlci5wcm90b3R5cGUucmVtb3ZlTGlzdGVuZXI7XG5FdmVudEVtaXR0ZXIucHJvdG90eXBlLmFkZExpc3RlbmVyID0gRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5vbjtcblxuLy9cbi8vIEV4cG9zZSB0aGUgcHJlZml4LlxuLy9cbkV2ZW50RW1pdHRlci5wcmVmaXhlZCA9IHByZWZpeDtcblxuLy9cbi8vIEFsbG93IGBFdmVudEVtaXR0ZXJgIHRvIGJlIGltcG9ydGVkIGFzIG1vZHVsZSBuYW1lc3BhY2UuXG4vL1xuRXZlbnRFbWl0dGVyLkV2ZW50RW1pdHRlciA9IEV2ZW50RW1pdHRlcjtcblxuLy9cbi8vIEV4cG9zZSB0aGUgbW9kdWxlLlxuLy9cbmlmICgndW5kZWZpbmVkJyAhPT0gdHlwZW9mIG1vZHVsZSkge1xuICBtb2R1bGUuZXhwb3J0cyA9IEV2ZW50RW1pdHRlcjtcbn1cbiIsCiAgICAiaW1wb3J0IEV2ZW50RW1pdHRlciBmcm9tICcuL2luZGV4LmpzJ1xuXG5leHBvcnQgeyBFdmVudEVtaXR0ZXIgfVxuZXhwb3J0IGRlZmF1bHQgRXZlbnRFbWl0dGVyXG4iLAogICAgIi8qIVxuICogYWN0aXZpdHktc3RyZWFtc1xuICogICBodHRwczovL2dpdGh1Yi5jb20vc2lsdmVyYnVja2V0L2FjdGl2aXR5LXN0cmVhbXNcbiAqXG4gKiBEZXZlbG9wZWQgYW5kIE1haW50YWluZWQgYnk6XG4gKiAgIE5pY2sgSmVubmluZ3MgPG5pY2tAc2lsdmVyYnVja2V0Lm5ldD5cbiAqXG4gKiBhY3Rpdml0eS1zdHJlYW1zIGlzIHJlbGVhc2VkIHVuZGVyIHRoZSBNSVQgKHNlZSBMSUNFTlNFKS5cbiAqXG4gKiBZb3UgZG9uJ3QgaGF2ZSB0byBkbyBhbnl0aGluZyBzcGVjaWFsIHRvIGNob29zZSBvbmUgbGljZW5zZSBvciB0aGUgb3RoZXJcbiAqIGFuZCB5b3UgZG9uJ3QgaGF2ZSB0byBub3RpZnkgYW55b25lIHdoaWNoIGxpY2Vuc2UgeW91IGFyZSB1c2luZy5cbiAqIFBsZWFzZSBzZWUgdGhlIGNvcnJlc3BvbmRpbmcgbGljZW5zZSBmaWxlIGZvciBkZXRhaWxzIG9mIHRoZXNlIGxpY2Vuc2VzLlxuICogWW91IGFyZSBmcmVlIHRvIHVzZSwgbW9kaWZ5IGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUsIGJ1dCBhbGwgY29weXJpZ2h0XG4gKiBpbmZvcm1hdGlvbiBtdXN0IHJlbWFpbi5cbiAqXG4gKi9cblxuaW1wb3J0IHR5cGUgeyBBY3Rpdml0eU9iamVjdCwgQWN0aXZpdHlTdHJlYW0gfSBmcm9tIFwiQHNvY2tldGh1Yi9zY2hlbWFzXCI7XG5pbXBvcnQgRXZlbnRFbWl0dGVyIGZyb20gXCJldmVudGVtaXR0ZXIzXCI7XG5cbmNvbnN0IGVlID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuY29uc3QgYmFzZVByb3BzID0ge1xuICAgIHN0cmVhbTogW1xuICAgICAgICBcImlkXCIsXG4gICAgICAgIFwidHlwZVwiLFxuICAgICAgICBcImFjdG9yXCIsXG4gICAgICAgIFwidGFyZ2V0XCIsXG4gICAgICAgIFwib2JqZWN0XCIsXG4gICAgICAgIFwiY29udGV4dFwiLFxuICAgICAgICBcImNvbnRleHRcIixcbiAgICAgICAgXCJwdWJsaXNoZWRcIixcbiAgICAgICAgXCJlcnJvclwiLFxuICAgIF0sXG4gICAgb2JqZWN0OiBbXG4gICAgICAgIFwiaWRcIixcbiAgICAgICAgXCJ0eXBlXCIsXG4gICAgICAgIFwiY29udGV4dFwiLFxuICAgICAgICBcImFsaWFzXCIsXG4gICAgICAgIFwiYXR0YWNoZWRUb1wiLFxuICAgICAgICBcImF0dGFjaG1lbnRcIixcbiAgICAgICAgXCJhdHRyaWJ1dGVkVG9cIixcbiAgICAgICAgXCJhdHRyaWJ1dGVkV2l0aFwiLFxuICAgICAgICBcImNvbmRpdGlvblwiLFxuICAgICAgICBcImNvbnRlbnRcIixcbiAgICAgICAgXCJjb250ZW50TWFwXCIsXG4gICAgICAgIFwiY29udGV4dFwiLFxuICAgICAgICBcImNvbnRleHRPZlwiLFxuICAgICAgICBcIm5hbWVcIixcbiAgICAgICAgXCJlbmRUaW1lXCIsXG4gICAgICAgIFwiZ2VuZXJhdG9yXCIsXG4gICAgICAgIFwiZ2VuZXJhdG9yT2ZcIixcbiAgICAgICAgXCJncm91cFwiLFxuICAgICAgICBcImljb25cIixcbiAgICAgICAgXCJpbWFnZVwiLFxuICAgICAgICBcImluUmVwbHlUb1wiLFxuICAgICAgICBcIm1lbWJlcnNcIixcbiAgICAgICAgXCJtZW1iZXJPZlwiLFxuICAgICAgICBcIm1lc3NhZ2VcIixcbiAgICAgICAgXCJsb2NhdGlvblwiLFxuICAgICAgICBcImxvY2F0aW9uT2ZcIixcbiAgICAgICAgXCJvYmplY3RPZlwiLFxuICAgICAgICBcIm9yaWdpbk9mXCIsXG4gICAgICAgIFwicHJlc2VuY2VcIixcbiAgICAgICAgXCJwcmV2aWV3XCIsXG4gICAgICAgIFwicHJldmlld09mXCIsXG4gICAgICAgIFwicHJvdmlkZXJcIixcbiAgICAgICAgXCJwcm92aWRlck9mXCIsXG4gICAgICAgIFwicHVibGlzaGVkXCIsXG4gICAgICAgIFwicmF0aW5nXCIsXG4gICAgICAgIFwicmVsYXRpb25zaGlwXCIsXG4gICAgICAgIFwicmVzdWx0T2ZcIixcbiAgICAgICAgXCJyZXBsaWVzXCIsXG4gICAgICAgIFwicm9sZVwiLFxuICAgICAgICBcInNjb3BlXCIsXG4gICAgICAgIFwic2NvcGVPZlwiLFxuICAgICAgICBcInN0YXJ0VGltZVwiLFxuICAgICAgICBcInN0YXR1c1wiLFxuICAgICAgICBcInN1bW1hcnlcIixcbiAgICAgICAgXCJ0b3BpY1wiLFxuICAgICAgICBcInRhZ1wiLFxuICAgICAgICBcInRhZ09mXCIsXG4gICAgICAgIFwidGFyZ2V0T2ZcIixcbiAgICAgICAgXCJ0aXRsZVwiLFxuICAgICAgICBcInRpdGxlTWFwXCIsXG4gICAgICAgIFwidXBkYXRlZFwiLFxuICAgICAgICBcInVybFwiLFxuICAgICAgICBcInhtcHA6c3RhbnphLWlkXCIsXG4gICAgXSxcbn07XG5jb25zdCByZW5hbWUgPSB7XG4gICAgXCJAaWRcIjogXCJpZFwiLFxuICAgIFwiQHR5cGVcIjogXCJ0eXBlXCIsXG4gICAgdmVyYjogXCJ0eXBlXCIsXG4gICAgZGlzcGxheU5hbWU6IFwibmFtZVwiLFxuICAgIG9iamVjdFR5cGU6IFwidHlwZVwiLFxuICAgIHBsYXRmb3JtOiBcImNvbnRleHRcIixcbn07XG5jb25zdCBleHBhbmQgPSB7XG4gICAgYWN0b3I6IHtcbiAgICAgICAgcHJpbWFyeTogXCJpZFwiLFxuICAgICAgICBwcm9wczogYmFzZVByb3BzLFxuICAgIH0sXG4gICAgdGFyZ2V0OiB7XG4gICAgICAgIHByaW1hcnk6IFwiaWRcIixcbiAgICAgICAgcHJvcHM6IGJhc2VQcm9wcyxcbiAgICB9LFxuICAgIG9iamVjdDoge1xuICAgICAgICBwcmltYXJ5OiBcImNvbnRlbnRcIixcbiAgICAgICAgcHJvcHM6IGJhc2VQcm9wcyxcbiAgICB9LFxufTtcblxudHlwZSBDdXN0b21Qcm9wcyA9IHtcbiAgICBba2V5OiBzdHJpbmddOiBzdHJpbmcgfCBudW1iZXIgfCBib29sZWFuIHwgb2JqZWN0IHwgc3RyaW5nW107XG59O1xuXG5jb25zdCBvYmpzID0gbmV3IE1hcCgpO1xuY29uc3QgY3VzdG9tUHJvcHM6IEN1c3RvbVByb3BzID0ge307XG5cbmxldCBmYWlsT25Vbmtub3duT2JqZWN0UHJvcGVydGllcyA9IGZhbHNlO1xubGV0IHdhcm5PblVua25vd25PYmplY3RQcm9wZXJ0aWVzID0gdHJ1ZTtcbmxldCBzcGVjaWFsT2JqcyA9IFtdOyAvLyB0aGUgb2JqZWN0cyBkb24ndCBnZXQgcmVqZWN0ZWQgZm9yIGJhZCBwcm9wc1xuXG5mdW5jdGlvbiBtYXRjaGVzQ3VzdG9tUHJvcCh0eXBlOiBzdHJpbmcsIGtleTogc3RyaW5nKSB7XG4gICAgaWYgKGN1c3RvbVByb3BzW3R5cGVdIGluc3RhbmNlb2YgT2JqZWN0KSB7XG4gICAgICAgIGNvbnN0IG9iaiA9IGN1c3RvbVByb3BzW3R5cGVdIGFzIHN0cmluZ1tdO1xuICAgICAgICBpZiAob2JqLmluY2x1ZGVzKGtleSkpIHtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbn1cblxuZnVuY3Rpb24gcmVuYW1lUHJvcDxUPihvYmo6IFQsIGtleTogc3RyaW5nKTogVCB7XG4gICAgb2JqW3JlbmFtZVtrZXldXSA9IG9ialtrZXldO1xuICAgIGRlbGV0ZSBvYmpba2V5XTtcbiAgICByZXR1cm4gb2JqO1xufVxuXG5mdW5jdGlvbiB2YWxpZGF0ZU9iamVjdDxUPih0eXBlOiBzdHJpbmcsIGluY29taW5nT2JqOiBULCByZXF1aXJlSWQgPSBmYWxzZSkge1xuICAgIC8vIElucHV0IHZhbGlkYXRpb24gd2l0aCBjbGVhciBlcnJvciBtZXNzYWdlc1xuICAgIGlmIChpbmNvbWluZ09iaiA9PT0gbnVsbCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICBgQWN0aXZpdHlTdHJlYW1zIHZhbGlkYXRpb24gZmFpbGVkOiB0aGUgXCIke3R5cGV9XCIgcHJvcGVydHkgaXMgbnVsbC4gRXhhbXBsZTogeyBpZDogXCJ1c2VyQGV4YW1wbGUuY29tXCIsIHR5cGU6IFwicGVyc29uXCIgfWAsXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgaWYgKGluY29taW5nT2JqID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgYEFjdGl2aXR5U3RyZWFtcyB2YWxpZGF0aW9uIGZhaWxlZDogdGhlIFwiJHt0eXBlfVwiIHByb3BlcnR5IGlzIHVuZGVmaW5lZC4gRXhhbXBsZTogeyBpZDogXCJ1c2VyQGV4YW1wbGUuY29tXCIsIHR5cGU6IFwicGVyc29uXCIgfWAsXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBpbmNvbWluZ09iaiA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICBgQWN0aXZpdHlTdHJlYW1zIHZhbGlkYXRpb24gZmFpbGVkOiB0aGUgXCIke3R5cGV9XCIgcHJvcGVydHkgcmVjZWl2ZWQgc3RyaW5nIFwiJHtpbmNvbWluZ09ian1cIiBidXQgZXhwZWN0ZWQgYW4gb2JqZWN0LiBVc2U6IHsgaWQ6IFwiJHtpbmNvbWluZ09ian1cIiwgdHlwZTogXCJwZXJzb25cIiB9YCxcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIGluY29taW5nT2JqICE9PSBcIm9iamVjdFwiIHx8IEFycmF5LmlzQXJyYXkoaW5jb21pbmdPYmopKSB7XG4gICAgICAgIGNvbnN0IHJlY2VpdmVkVHlwZSA9IEFycmF5LmlzQXJyYXkoaW5jb21pbmdPYmopXG4gICAgICAgICAgICA/IFwiYXJyYXlcIlxuICAgICAgICAgICAgOiB0eXBlb2YgaW5jb21pbmdPYmo7XG4gICAgICAgIGNvbnN0IHJlY2VpdmVkVmFsdWUgPSBTdHJpbmcoaW5jb21pbmdPYmopO1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICBgQWN0aXZpdHlTdHJlYW1zIHZhbGlkYXRpb24gZmFpbGVkOiB0aGUgXCIke3R5cGV9XCIgcHJvcGVydHkgbXVzdCBiZSBhbiBvYmplY3QsIHJlY2VpdmVkICR7cmVjZWl2ZWRUeXBlfSAoJHtyZWNlaXZlZFZhbHVlfSkuIEV4YW1wbGU6IHsgaWQ6IFwidXNlckBleGFtcGxlLmNvbVwiLCB0eXBlOiBcInBlcnNvblwiIH1gLFxuICAgICAgICApO1xuICAgIH1cblxuICAgIC8vIFJlcXVpcmUgJ2lkJyBwcm9wZXJ0eSB3aGVuIGV4cGxpY2l0bHkgcmVxdWVzdGVkIChlLmcuLCBPYmplY3QuY3JlYXRlKCkpXG4gICAgY29uc3Qgb2JqID0gaW5jb21pbmdPYmogYXMgQWN0aXZpdHlPYmplY3Q7XG4gICAgaWYgKHJlcXVpcmVJZCAmJiAhb2JqLmlkKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgIGBBY3Rpdml0eVN0cmVhbXMgdmFsaWRhdGlvbiBmYWlsZWQ6IHRoZSBcIiR7dHlwZX1cIiBwcm9wZXJ0eSByZXF1aXJlcyBhbiAnaWQnIHByb3BlcnR5LiBFeGFtcGxlOiB7IGlkOiBcInVzZXJAZXhhbXBsZS5jb21cIiwgdHlwZTogXCJwZXJzb25cIiB9YCxcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBjb25zdCB1bmtub3duS2V5cyA9IE9iamVjdC5rZXlzKGluY29taW5nT2JqKS5maWx0ZXIoXG4gICAgICAgIChrZXk6IHN0cmluZyk6IGJvb2xlYW4gPT4ge1xuICAgICAgICAgICAgcmV0dXJuICFiYXNlUHJvcHNbdHlwZV0uaW5jbHVkZXMoa2V5KTtcbiAgICAgICAgfSxcbiAgICApO1xuXG4gICAgZm9yIChjb25zdCBrZXkgb2YgdW5rbm93bktleXMpIHtcbiAgICAgICAgbGV0IGFvOiBBY3Rpdml0eU9iamVjdCA9IGluY29taW5nT2JqIGFzIEFjdGl2aXR5T2JqZWN0O1xuICAgICAgICBpZiAocmVuYW1lW2tleV0pIHtcbiAgICAgICAgICAgIC8vIHJlbmFtZSBwcm9wZXJ0eSBpbnN0ZWFkIG9mIGZhaWxcbiAgICAgICAgICAgIGFvID0gcmVuYW1lUHJvcChhbywga2V5KTtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKG1hdGNoZXNDdXN0b21Qcm9wKGFvLnR5cGUsIGtleSkpIHtcbiAgICAgICAgICAgIC8vIGN1c3RvbSBwcm9wZXJ0eSBtYXRjaGVzLCBjb250aW51ZVxuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIXNwZWNpYWxPYmpzLmluY2x1ZGVzKGFvLnR5cGUpKSB7XG4gICAgICAgICAgICAvLyBub3QgZGVmaW5lZCBhcyBhIHNwZWNpYWwgcHJvcFxuICAgICAgICAgICAgLy8gZG9uJ3Qga25vdyB3aGF0IHRvIGRvIHdpdGggaXQsIHNvIHRocm93IGVycm9yXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhhbyk7XG4gICAgICAgICAgICBjb25zdCByZWNlaXZlZFZhbHVlID1cbiAgICAgICAgICAgICAgICB0eXBlb2YgYW9ba2V5XSA9PT0gXCJzdHJpbmdcIiA/IGBcIiR7YW9ba2V5XX1cImAgOiBTdHJpbmcoYW9ba2V5XSk7XG4gICAgICAgICAgICBjb25zdCBlcnIgPSBgQWN0aXZpdHlTdHJlYW1zIHZhbGlkYXRpb24gZmFpbGVkOiBwcm9wZXJ0eSBcIiR7a2V5fVwiIHdpdGggdmFsdWUgJHtyZWNlaXZlZFZhbHVlfSBpcyBub3QgYWxsb3dlZCBvbiB0aGUgXCIke3R5cGV9XCIgb2JqZWN0IG9mIHR5cGUgXCIke2FvLnR5cGV9XCIuYDtcbiAgICAgICAgICAgIGlmIChmYWlsT25Vbmtub3duT2JqZWN0UHJvcGVydGllcykge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihlcnIpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHdhcm5PblVua25vd25PYmplY3RQcm9wZXJ0aWVzKSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS53YXJuKGVycik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG59XG5cbmZ1bmN0aW9uIGVuc3VyZVByb3BzKG9iajogQWN0aXZpdHlPYmplY3QpOiBBY3Rpdml0eU9iamVjdCB7XG4gICAgLy8gZW5zdXJlIHRoZSBuYW1lIHByb3BlcnR5LCB3aGljaCBjYW4gZ2VuZXJhbGx5IGJlIGluZmVycmVkIGZyb20gdGhlIGlkXG4gICAgLy8gbmFtZSA9IG9iai5tYXRjaCgvKD8oP1xcdyspOlxcL1xcLykoPzouK0ApPyguKz8pKD86XFwvfCQpLylbMV1cbiAgICByZXR1cm4gb2JqO1xufVxuXG5mdW5jdGlvbiBleHBhbmRTdHJlYW0obWV0YTogQWN0aXZpdHlTdHJlYW0pIHtcbiAgICBjb25zdCBzdHJlYW0gPSB7fTtcbiAgICBmb3IgKGNvbnN0IGtleSBvZiBPYmplY3Qua2V5cyhtZXRhKSkge1xuICAgICAgICBpZiAodHlwZW9mIG1ldGFba2V5XSA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgICAgICAgc3RyZWFtW2tleV0gPSBvYmpzLmdldChtZXRhW2tleV0pIHx8IG1ldGFba2V5XTtcbiAgICAgICAgfSBlbHNlIGlmIChBcnJheS5pc0FycmF5KG1ldGFba2V5XSkpIHtcbiAgICAgICAgICAgIHN0cmVhbVtrZXldID0gW107XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGVudHJ5IG9mIG1ldGFba2V5XSkge1xuICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgZW50cnkgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgc3RyZWFtW2tleV0ucHVzaChvYmpzLmdldChlbnRyeSkgfHwgZW50cnkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHN0cmVhbVtrZXldID0gbWV0YVtrZXldO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gb25seSBleHBhbmQgc3RyaW5nIGludG8gb2JqZWN0cyBpZiB0aGV5IGFyZSBpbiB0aGUgZXhwYW5kIGxpc3RcbiAgICBmb3IgKGNvbnN0IGtleSBvZiBPYmplY3Qua2V5cyhleHBhbmQpKSB7XG4gICAgICAgIGlmICh0eXBlb2Ygc3RyZWFtW2tleV0gPT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgICAgIGNvbnN0IGlkeCA9IGV4cGFuZFtrZXldLnByaW1hcnk7XG4gICAgICAgICAgICBjb25zdCBvYmogPSB7fTtcbiAgICAgICAgICAgIG9ialtpZHhdID0gc3RyZWFtW2tleV07XG4gICAgICAgICAgICBzdHJlYW1ba2V5XSA9IG9iajtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gc3RyZWFtO1xufVxuXG5mdW5jdGlvbiBTdHJlYW0oXG4gICAgbWV0YTogQWN0aXZpdHlTdHJlYW0sXG4pOiBBY3Rpdml0eVN0cmVhbSB8IEFjdGl2aXR5T2JqZWN0IHwgUmVjb3JkPHN0cmluZywgbmV2ZXI+IHtcbiAgICB2YWxpZGF0ZU9iamVjdChcInN0cmVhbVwiLCBtZXRhKTtcbiAgICBpZiAodHlwZW9mIG1ldGEub2JqZWN0ID09PSBcIm9iamVjdFwiKSB7XG4gICAgICAgIHZhbGlkYXRlT2JqZWN0KFwib2JqZWN0XCIsIG1ldGEub2JqZWN0KTtcbiAgICB9XG4gICAgY29uc3Qgc3RyZWFtID0gZXhwYW5kU3RyZWFtKG1ldGEpO1xuICAgIGVlLmVtaXQoXCJhY3Rpdml0eS1zdHJlYW1cIiwgc3RyZWFtKTtcbiAgICByZXR1cm4gc3RyZWFtO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEFjdGl2aXR5T2JqZWN0TWFuYWdlciB7XG4gICAgY3JlYXRlKG9iajogdW5rbm93bik6IHVua25vd247XG4gICAgZGVsZXRlKGlkOiBzdHJpbmcpOiBib29sZWFuO1xuICAgIGxpc3QoKTogSXRlcmFibGVJdGVyYXRvcjx1bmtub3duPjtcbiAgICBnZXQoaWQ6IHN0cmluZywgZXhwYW5kPzogYm9vbGVhbik6IHVua25vd247XG59XG5cbmNvbnN0IF9PYmplY3Q6IEFjdGl2aXR5T2JqZWN0TWFuYWdlciA9IHtcbiAgICBjcmVhdGU6IChvYmo6IEFjdGl2aXR5T2JqZWN0KSA9PiB7XG4gICAgICAgIHZhbGlkYXRlT2JqZWN0KFwib2JqZWN0XCIsIG9iaiwgdHJ1ZSk7IC8vIHJlcXVpcmUgSUQgZm9yIE9iamVjdC5jcmVhdGUoKVxuICAgICAgICBjb25zdCBhbyA9IGVuc3VyZVByb3BzKG9iaik7XG4gICAgICAgIG9ianMuc2V0KGFvLmlkLCBhbyk7XG4gICAgICAgIGVlLmVtaXQoXCJhY3Rpdml0eS1vYmplY3QtY3JlYXRlXCIsIGFvKTtcbiAgICAgICAgcmV0dXJuIGFvO1xuICAgIH0sXG5cbiAgICBkZWxldGU6IChpZCkgPT4ge1xuICAgICAgICBjb25zdCByZXN1bHQgPSBvYmpzLmRlbGV0ZShpZCk7XG4gICAgICAgIGlmIChyZXN1bHQpIHtcbiAgICAgICAgICAgIGVlLmVtaXQoXCJhY3Rpdml0eS1vYmplY3QtZGVsZXRlXCIsIGlkKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH0sXG5cbiAgICBnZXQ6IChpZCwgZXhwYW5kKSA9PiB7XG4gICAgICAgIGxldCBvYmogPSBvYmpzLmdldChpZCk7XG4gICAgICAgIGlmICghb2JqKSB7XG4gICAgICAgICAgICBpZiAoIWV4cGFuZCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBpZDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIG9iaiA9IHsgaWQ6IGlkIH07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGVuc3VyZVByb3BzKG9iaik7XG4gICAgfSxcblxuICAgIGxpc3Q6ICgpOiBJdGVyYWJsZUl0ZXJhdG9yPHVua25vd24+ID0+IG9ianMua2V5cygpLFxufTtcblxuZXhwb3J0IGludGVyZmFjZSBBU0ZhY3RvcnlPcHRpb25zIHtcbiAgICBzcGVjaWFsT2Jqcz86IEFycmF5PHN0cmluZz47XG4gICAgZmFpbE9uVW5rbm93bk9iamVjdFByb3BlcnRpZXM/OiBib29sZWFuO1xuICAgIHdhcm5PblVua25vd25PYmplY3RQcm9wZXJ0aWVzPzogYm9vbGVhbjtcbiAgICBjdXN0b21Qcm9wcz86IEN1c3RvbVByb3BzO1xufVxuXG50eXBlIEV2ZW50Q2FsbGJhY2sgPSAoLi4uYXJnczogdW5rbm93bltdKSA9PiB2b2lkO1xuXG5leHBvcnQgaW50ZXJmYWNlIEFTTWFuYWdlciB7XG4gICAgU3RyZWFtKG1ldGE6IHVua25vd24pOiBBY3Rpdml0eVN0cmVhbSB8IEFjdGl2aXR5T2JqZWN0O1xuICAgIE9iamVjdDogQWN0aXZpdHlPYmplY3RNYW5hZ2VyO1xuICAgIG9uKGV2ZW50OiBzdHJpbmcsIGZ1bmM6IEV2ZW50Q2FsbGJhY2spOiB2b2lkO1xuICAgIG9uY2UoZXZlbnQ6IHN0cmluZywgZnVuYzogRXZlbnRDYWxsYmFjayk6IHZvaWQ7XG4gICAgb2ZmKGV2ZW50OiBzdHJpbmcsIGZ1bmM6IEV2ZW50Q2FsbGJhY2spOiB2b2lkO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gQVNGYWN0b3J5KG9wdHM6IEFTRmFjdG9yeU9wdGlvbnMgPSB7fSk6IEFTTWFuYWdlciB7XG4gICAgc3BlY2lhbE9ianMgPSBvcHRzPy5zcGVjaWFsT2JqcyB8fCBbXTtcbiAgICBmYWlsT25Vbmtub3duT2JqZWN0UHJvcGVydGllcyA9XG4gICAgICAgIHR5cGVvZiBvcHRzLmZhaWxPblVua25vd25PYmplY3RQcm9wZXJ0aWVzID09PSBcImJvb2xlYW5cIlxuICAgICAgICAgICAgPyBvcHRzLmZhaWxPblVua25vd25PYmplY3RQcm9wZXJ0aWVzXG4gICAgICAgICAgICA6IGZhaWxPblVua25vd25PYmplY3RQcm9wZXJ0aWVzO1xuICAgIHdhcm5PblVua25vd25PYmplY3RQcm9wZXJ0aWVzID1cbiAgICAgICAgdHlwZW9mIG9wdHMud2Fybk9uVW5rbm93bk9iamVjdFByb3BlcnRpZXMgPT09IFwiYm9vbGVhblwiXG4gICAgICAgICAgICA/IG9wdHMud2Fybk9uVW5rbm93bk9iamVjdFByb3BlcnRpZXNcbiAgICAgICAgICAgIDogd2Fybk9uVW5rbm93bk9iamVjdFByb3BlcnRpZXM7XG4gICAgZm9yIChjb25zdCBwcm9wTmFtZSBvZiBPYmplY3Qua2V5cyhvcHRzLmN1c3RvbVByb3BzIHx8IHt9KSkge1xuICAgICAgICBpZiAodHlwZW9mIG9wdHMuY3VzdG9tUHJvcHNbcHJvcE5hbWVdID09PSBcIm9iamVjdFwiKSB7XG4gICAgICAgICAgICBjdXN0b21Qcm9wc1twcm9wTmFtZV0gPSBvcHRzLmN1c3RvbVByb3BzW3Byb3BOYW1lXTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICAgIFN0cmVhbTogU3RyZWFtLFxuICAgICAgICBPYmplY3Q6IF9PYmplY3QsXG4gICAgICAgIG9uOiAoZXZlbnQsIGZ1bmMpID0+IGVlLm9uKGV2ZW50LCBmdW5jKSxcbiAgICAgICAgb25jZTogKGV2ZW50LCBmdW5jKSA9PiBlZS5vbmNlKGV2ZW50LCBmdW5jKSxcbiAgICAgICAgb2ZmOiAoZXZlbnQsIGZ1bmNOYW1lKSA9PiBlZS5vZmYoZXZlbnQsIGZ1bmNOYW1lKSxcbiAgICB9IGFzIEFTTWFuYWdlcjtcbn1cblxuLy8gYmlvbWUtaWdub3JlIGxpbnQvc3VzcGljaW91cy9ub0V4cGxpY2l0QW55OiA8ZXhwbGFuYXRpb24+XG4oKGdsb2JhbDogYW55KSA9PiB7XG4gICAgZ2xvYmFsLkFTRmFjdG9yID0gQVNGYWN0b3J5O1xufSkodHlwZW9mIHdpbmRvdyA9PT0gXCJvYmplY3RcIiA/IHdpbmRvdyA6IHt9KTtcbiIKICBdLAogICJtYXBwaW5ncyI6ICJxWUFFQSxJQUFJLEVBQU0sT0FBTyxVQUFVLGVBQ3ZCLEVBQVMsSUFTYixTQUFTLENBQU0sRUFBRyxFQVNsQixHQUFJLE9BQU8sUUFPVCxHQU5BLEVBQU8sVUFBWSxPQUFPLE9BQU8sSUFBSSxFQU1qQyxDQUFDLElBQUksRUFBTyxFQUFFLFVBQVcsRUFBUyxHQVl4QyxTQUFTLENBQUUsQ0FBQyxFQUFJLEVBQVMsRUFBTSxDQUM3QixLQUFLLEdBQUssRUFDVixLQUFLLFFBQVUsRUFDZixLQUFLLEtBQU8sR0FBUSxHQWN0QixTQUFTLENBQVcsQ0FBQyxFQUFTLEVBQU8sRUFBSSxFQUFTLEVBQU0sQ0FDdEQsR0FBSSxPQUFPLElBQU8sV0FDaEIsTUFBVSxVQUFVLGlDQUFpQyxFQUd2RCxJQUFJLEVBQVcsSUFBSSxFQUFHLEVBQUksR0FBVyxFQUFTLENBQUksRUFDOUMsRUFBTSxFQUFTLEVBQVMsRUFBUSxFQUVw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Z0NBQWtDLFVBQ3hDLEVBQUssOEJBQ0wsRUFDVixFQUNJLE9BQU8sRUFBSyxnQ0FBa0MsVUFDeEMsRUFBSyw4QkFDTCxFQUNWLFFBQVcsS0FBWSxPQUFPLEtBQUssRUFBSyxhQUFlLENBQUMsQ0FBQyxFQUNyRCxHQUFJLE9BQU8sRUFBSyxZQUFZLEtBQWMsU0FDdEMsRUFBWSxHQUFZLEVBQUssWUFBWSxHQUlqRCxNQUFPLENBQ0gsT0FBUSxFQUNSLE9BQVEsRUFDUixHQUFJLENBQUMsRUFBTyxJQUFTLEVBQUcsR0FBRyxFQUFPLENBQUksRUFDdEMsS0FBTSxDQUFDLEVBQU8sSUFBUyxFQUFHLEtBQUssRUFBTyxDQUFJLEVBQzFDLElBQUssQ0FBQyxFQUFPLElBQWEsRUFBRyxJQUFJLEVBQU8sQ0FBUSxDQUNwRCxHQUlILENBQUMsSUFBZ0IsQ0FDZCxFQUFPLFNBQVcsSUFDbkIsT0FBTyxTQUFXLFNBQVcsT0FBUyxDQUFDLENBQUMiLAogICJkZWJ1Z0lkIjogIjE4QzY3QkJERkE4NUJFN0I2NDc1NkUyMTY0NzU2RTIxIiwKICAibmFtZXMiOiBbXQp9
|
|
18
|
+
//# debugId=FF8AB3544218420564756E2164756E21
|
|
19
|
+
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vbm9kZV9tb2R1bGVzL2V2ZW50ZW1pdHRlcjMvaW5kZXguanMiLCAiLi4vc2NoZW1hcy9kaXN0L2NvbnRleHQuanMiLCAiLi4vLi4vbm9kZV9tb2R1bGVzL2V2ZW50ZW1pdHRlcjMvaW5kZXgubWpzIiwgInNyYy9hY3Rpdml0eS1zdHJlYW1zLnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWwogICAgIid1c2Ugc3RyaWN0JztcblxudmFyIGhhcyA9IE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHlcbiAgLCBwcmVmaXggPSAnfic7XG5cbi8qKlxuICogQ29uc3RydWN0b3IgdG8gY3JlYXRlIGEgc3RvcmFnZSBmb3Igb3VyIGBFRWAgb2JqZWN0cy5cbiAqIEFuIGBFdmVudHNgIGluc3RhbmNlIGlzIGEgcGxhaW4gb2JqZWN0IHdob3NlIHByb3BlcnRpZXMgYXJlIGV2ZW50IG5hbWVzLlxuICpcbiAqIEBjb25zdHJ1Y3RvclxuICogQHByaXZhdGVcbiAqL1xuZnVuY3Rpb24gRXZlbnRzKCkge31cblxuLy9cbi8vIFdlIHRyeSB0byBub3QgaW5oZXJpdCBmcm9tIGBPYmplY3QucHJvdG90eXBlYC4gSW4gc29tZSBlbmdpbmVzIGNyZWF0aW5nIGFuXG4vLyBpbnN0YW5jZSBpbiB0aGlzIHdheSBpcyBmYXN0ZXIgdGhhbiBjYWxsaW5nIGBPYmplY3QuY3JlYXRlKG51bGwpYCBkaXJlY3RseS5cbi8vIElmIGBPYmplY3QuY3JlYXRlKG51bGwpYCBpcyBub3Qgc3VwcG9ydGVkIHdlIHByZWZpeCB0aGUgZXZlbnQgbmFtZXMgd2l0aCBhXG4vLyBjaGFyYWN0ZXIgdG8gbWFrZSBzdXJlIHRoYXQgdGhlIGJ1aWx0LWluIG9iamVjdCBwcm9wZXJ0aWVzIGFyZSBub3Rcbi8vIG92ZXJyaWRkZW4gb3IgdXNlZCBhcyBhbiBhdHRhY2sgdmVjdG9yLlxuLy9cbmlmIChPYmplY3QuY3JlYXRlKSB7XG4gIEV2ZW50cy5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuXG4gIC8vXG4gIC8vIFRoaXMgaGFjayBpcyBuZWVkZWQgYmVjYXVzZSB0aGUgYF9fcHJvdG9fX2AgcHJvcGVydHkgaXMgc3RpbGwgaW5oZXJpdGVkIGluXG4gIC8vIHNvbWUgb2xkIGJyb3dzZXJzIGxpa2UgQW5kcm9pZCA0LCBpUGhvbmUgNS4xLCBPcGVyYSAxMSBhbmQgU2FmYXJpIDUuXG4gIC8vXG4gIGlmICghbmV3IEV2ZW50cygpLl9fcHJvdG9fXykgcHJlZml4ID0gZmFsc2U7XG59XG5cbi8qKlxuICogUmVwcmVzZW50YXRpb24gb2YgYSBzaW5nbGUgZXZlbnQgbGlzdGVuZXIuXG4gKlxuICogQHBhcmFtIHtGdW5jdGlvbn0gZm4gVGhlIGxpc3RlbmVyIGZ1bmN0aW9uLlxuICogQHBhcmFtIHsqfSBjb250ZXh0IFRoZSBjb250ZXh0IHRvIGludm9rZSB0aGUgbGlzdGVuZXIgd2l0aC5cbiAqIEBwYXJhbSB7Qm9vbGVhbn0gW29uY2U9ZmFsc2VdIFNwZWNpZnkgaWYgdGhlIGxpc3RlbmVyIGlzIGEgb25lLXRpbWUgbGlzdGVuZXIuXG4gKiBAY29uc3RydWN0b3JcbiAqIEBwcml2YXRlXG4gKi9cbmZ1bmN0aW9uIEVFKGZuLCBjb250ZXh0LCBvbmNlKSB7XG4gIHRoaXMuZm4gPSBmbjtcbiAgdGhpcy5jb250ZXh0ID0gY29udGV4dDtcbiAgdGhpcy5vbmNlID0gb25jZSB8fCBmYWxzZTtcbn1cblxuLyoqXG4gKiBBZGQgYSBsaXN0ZW5lciBmb3IgYSBnaXZlbiBldmVudC5cbiAqXG4gKiBAcGFyYW0ge0V2ZW50RW1pdHRlcn0gZW1pdHRlciBSZWZlcmVuY2UgdG8gdGhlIGBFdmVudEVtaXR0ZXJgIGluc3RhbmNlLlxuICogQHBhcmFtIHsoU3RyaW5nfFN5bWJvbCl9IGV2ZW50IFRoZSBldmVudCBuYW1lLlxuICogQHBhcmFtIHtGdW5jdGlvbn0gZm4gVGhlIGxpc3RlbmVyIGZ1bmN0aW9uLlxuICogQHBhcmFtIHsqfSBjb250ZXh0IFRoZSBjb250ZXh0IHRvIGludm9rZSB0aGUgbGlzdGVuZXIgd2l0aC5cbiAqIEBwYXJhbSB7Qm9vbGVhbn0gb25jZSBTcGVjaWZ5IGlmIHRoZSBsaXN0ZW5lciBpcyBhIG9uZS10aW1lIGxpc3RlbmVyLlxuICogQHJldHVybnMge0V2ZW50RW1pdHRlcn1cbiAqIEBwcml2YXRlXG4gKi9cbmZ1bmN0aW9uIGFkZExpc3RlbmVyKGVtaXR0ZXIsIGV2ZW50LCBmbiwgY29udGV4dCwgb25jZSkge1xuICBpZiAodHlwZW9mIGZuICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcignVGhlIGxpc3RlbmVyIG11c3QgYmUgYSBmdW5jdGlvbicpO1xuICB9XG5cbiAgdmFyIGxpc3RlbmVyID0gbmV3IEVFKGZuLCBjb250ZXh0IHx8IGVtaXR0ZXIsIG9uY2UpXG4gICAgLCBldnQgPSBwcmVmaXggPyBwcmVmaXggKyBldmVudCA6IGV2ZW50O1xuXG4gIGlmICghZW1pdHRlci5fZXZlbnRzW2V2dF0pIGVtaXR0ZXIuX2V2ZW50c1tldnRdID0gbGlzdGVuZXIsIGVtaXR0ZXIuX2V2ZW50c0NvdW50Kys7XG4gIGVsc2UgaWYgKCFlbWl0dGVyLl9ldmVudHNbZXZ0XS5mbikgZW1pdHRlci5fZXZlbnRzW2V2dF0ucHVzaChsaXN0ZW5lcik7XG4gIGVsc2UgZW1pdHRlci5fZXZlbnRzW2V2dF0gPSBbZW1pdHRlci5fZXZlbnRzW2V2dF0sIGxpc3RlbmVyXTtcblxuICByZXR1cm4gZW1pdHRlcjtcbn1cblxuLyoqXG4gKiBDbGVhciBldmVudCBieSBuYW1lLlxuICpcbiAqIEBwYXJhbSB7RXZlbnRFbWl0dGVyfSBlbWl0dGVyIFJlZmVyZW5jZSB0byB0aGUgYEV2ZW50RW1pdHRlcmAgaW5zdGFuY2UuXG4gKiBAcGFyYW0geyhTdHJpbmd8U3ltYm9sKX0gZXZ0IFRoZSBFdmVudCBuYW1lLlxuICogQHByaXZhdGVcbiAqL1xuZnVuY3Rpb24gY2xlYXJFdmVudChlbWl0dGVyLCBldnQpIHtcbiAgaWYgKC0tZW1pdHRlci5fZXZlbnRzQ291bnQgPT09IDApIGVtaXR0ZXIuX2V2ZW50cyA9IG5ldyBFdmVudHMoKTtcbiAgZWxzZSBkZWxldGUgZW1pdHRlci5fZXZlbnRzW2V2dF07XG59XG5cbi8qKlxuICogTWluaW1hbCBgRXZlbnRFbWl0dGVyYCBpbnRlcmZhY2UgdGhhdCBpcyBtb2xkZWQgYWdhaW5zdCB0aGUgTm9kZS5qc1xuICogYEV2ZW50RW1pdHRlcmAgaW50ZXJmYWNlLlxuICpcbiAqIEBjb25zdHJ1Y3RvclxuICogQHB1YmxpY1xuICovXG5mdW5jdGlvbiBFdmVudEVtaXR0ZXIoKSB7XG4gIHRoaXMuX2V2ZW50cyA9IG5ldyBFdmVudHMoKTtcbiAgdGhpcy5fZXZlbnRzQ291bnQgPSAwO1xufVxuXG4vKipcbiAqIFJldHVybiBhbiBhcnJheSBsaXN0aW5nIHRoZSBldmVudHMgZm9yIHdoaWNoIHRoZSBlbWl0dGVyIGhhcyByZWdpc3RlcmVkXG4gKiBsaXN0ZW5lcnMuXG4gKlxuICogQHJldHVybnMge0FycmF5fVxuICogQHB1YmxpY1xuICovXG5FdmVudEVtaXR0ZXIucHJvdG90eXBlLmV2ZW50TmFtZXMgPSBmdW5jdGlvbiBldmVudE5hbWVzKCkge1xuICB2YXIgbmFtZXMgPSBbXVxuICAgICwgZXZlbnRzXG4gICAgLCBuYW1lO1xuXG4gIGlmICh0aGlzLl9ldmVudHNDb3VudCA9PT0gMCkgcmV0dXJuIG5hbWVzO1xuXG4gIGZvciAobmFtZSBpbiAoZXZlbnRzID0gdGhpcy5fZXZlbnRzKSkge1xuICAgIGlmIChoYXMuY2FsbChldmVudHMsIG5hbWUpKSBuYW1lcy5wdXNoKHByZWZpeCA/IG5hbWUuc2xpY2UoMSkgOiBuYW1lKTtcbiAgfVxuXG4gIGlmIChPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKSB7XG4gICAgcmV0dXJuIG5hbWVzLmNvbmNhdChPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKGV2ZW50cykpO1xuICB9XG5cbiAgcmV0dXJuIG5hbWVzO1xufTtcblxuLyoqXG4gKiBSZXR1cm4gdGhlIGxpc3RlbmVycyByZWdpc3RlcmVkIGZvciBhIGdpdmVuIGV2ZW50LlxuICpcbiAqIEBwYXJhbSB7KFN0cmluZ3xTeW1ib2wpfSBldmVudCBUaGUgZXZlbnQgbmFtZS5cbiAqIEByZXR1cm5zIHtBcnJheX0gVGhlIHJlZ2lzdGVyZWQgbGlzdGVuZXJzLlxuICogQHB1YmxpY1xuICovXG5FdmVudEVtaXR0ZXIucHJvdG90eXBlLmxpc3RlbmVycyA9IGZ1bmN0aW9uIGxpc3RlbmVycyhldmVudCkge1xuICB2YXIgZXZ0ID0gcHJlZml4ID8gcHJlZml4ICsgZXZlbnQgOiBldmVudFxuICAgICwgaGFuZGxlcnMgPSB0aGlzLl9ldmVudHNbZXZ0XTtcblxuICBpZiAoIWhhbmRsZXJzKSByZXR1cm4gW107XG4gIGlmIChoYW5kbGVycy5mbikgcmV0dXJuIFtoYW5kbGVycy5mbl07XG5cbiAgZm9yICh2YXIgaSA9IDAsIGwgPSBoYW5kbGVycy5sZW5ndGgsIGVlID0gbmV3IEFycmF5KGwpOyBpIDwgbDsgaSsrKSB7XG4gICAgZWVbaV0gPSBoYW5kbGVyc1tpXS5mbjtcbiAgfVxuXG4gIHJldHVybiBlZTtcbn07XG5cbi8qKlxuICogUmV0dXJuIHRoZSBudW1iZXIgb2YgbGlzdGVuZXJzIGxpc3RlbmluZyB0byBhIGdpdmVuIGV2ZW50LlxuICpcbiAqIEBwYXJhbSB7KFN0cmluZ3xTeW1ib2wpfSBldmVudCBUaGUgZXZlbnQgbmFtZS5cbiAqIEByZXR1cm5zIHtOdW1iZXJ9IFRoZSBudW1iZXIgb2YgbGlzdGVuZXJzLlxuICogQHB1YmxpY1xuICovXG5FdmVudEVtaXR0ZXIucHJvdG90eXBlLmxpc3RlbmVyQ291bnQgPSBmdW5jdGlvbiBsaXN0ZW5lckNvdW50KGV2ZW50KSB7XG4gIHZhciBldnQgPSBwcmVmaXggPyBwcmVmaXggKyBldmVudCA6IGV2ZW50XG4gICAgLCBsaXN0ZW5lcnMgPSB0aGlzLl9ldmVudHNbZXZ0XTtcblxuICBpZiAoIWxpc3RlbmVycykgcmV0dXJuIDA7XG4gIGlmIChsaXN0ZW5lcnMuZm4pIHJldHVybiAxO1xuICByZXR1cm4gbGlzdGVuZXJzLmxlbmd0aDtcbn07XG5cbi8qKlxuICogQ2FsbHMgZWFjaCBvZiB0aGUgbGlzdGVuZXJzIHJlZ2lzdGVyZWQgZm9yIGEgZ2l2ZW4gZXZlbnQuXG4gKlxuICogQHBhcmFtIHsoU3RyaW5nfFN5bWJvbCl9IGV2ZW50IFRoZSBldmVudCBuYW1lLlxuICogQHJldHVybnMge0Jvb2xlYW59IGB0cnVlYCBpZiB0aGUgZXZlbnQgaGFkIGxpc3RlbmVycywgZWxzZSBgZmFsc2VgLlxuICogQHB1YmxpY1xuICovXG5FdmVudEVtaXR0ZXIucHJvdG90eXBlLmVtaXQgPSBmdW5jdGlvbiBlbWl0KGV2ZW50LCBhMSwgYTIsIGEzLCBhNCwgYTUpIHtcbiAgdmFyIGV2dCA9IHByZWZpeCA/IHByZWZpeCArIGV2ZW50IDogZXZlbnQ7XG5cbiAgaWYgKCF0aGlzLl9ldmVudHNbZXZ0XSkgcmV0dXJuIGZhbHNlO1xuXG4gIHZhciBsaXN0ZW5lcnMgPSB0aGlzLl9ldmVudHNbZXZ0XVxuICAgICwgbGVuID0gYXJndW1lbnRzLmxlbmd0aFxuICAgICwgYXJnc1xuICAgICwgaTtcblxuICBpZiAobGlzdGVuZXJzLmZuKSB7XG4gICAgaWYgKGxpc3RlbmVycy5vbmNlKSB0aGlzLnJlbW92ZUxpc3RlbmVyKGV2ZW50LCBsaXN0ZW5lcnMuZm4sIHVuZGVmaW5lZCwgdHJ1ZSk7XG5cbiAgICBzd2l0Y2ggKGxlbikge1xuICAgICAgY2FzZSAxOiByZXR1cm4gbGlzdGVuZXJzLmZuLmNhbGwobGlzdGVuZXJzLmNvbnRleHQpLCB0cnVlO1xuICAgICAgY2FzZSAyOiByZXR1cm4gbGlzdGVuZXJzLmZuLmNhbGwobGlzdGVuZXJzLmNvbnRleHQsIGExKSwgdHJ1ZTtcbiAgICAgIGNhc2UgMzogcmV0dXJuIGxpc3RlbmVycy5mbi5jYWxsKGxpc3RlbmVycy5jb250ZXh0LCBhMSwgYTIpLCB0cnVlO1xuICAgICAgY2FzZSA0OiByZXR1cm4gbGlzdGVuZXJzLmZuLmNhbGwobGlzdGVuZXJzLmNvbnRleHQsIGExLCBhMiwgYTMpLCB0cnVlO1xuICAgICAgY2FzZSA1OiByZXR1cm4gbGlzdGVuZXJzLmZuLmNhbGwobGlzdGVuZXJzLmNvbnRleHQsIGExLCBhMiwgYTMsIGE0KSwgdHJ1ZTtcbiAgICAgIGNhc2UgNjogcmV0dXJuIGxpc3RlbmVycy5mbi5jYWxsKGxpc3RlbmVycy5jb250ZXh0LCBhMSwgYTIsIGEzLCBhNCwgYTUpLCB0cnVlO1xuICAgIH1cblxuICAgIGZvciAoaSA9IDEsIGFyZ3MgPSBuZXcgQXJyYXkobGVuIC0xKTsgaSA8IGxlbjsgaSsrKSB7XG4gICAgICBhcmdzW2kgLSAxXSA9IGFyZ3VtZW50c1tpXTtcbiAgICB9XG5cbiAgICBsaXN0ZW5lcnMuZm4uYXBwbHkobGlzdGVuZXJzLmNvbnRleHQsIGFyZ3MpO1xuICB9IGVsc2Uge1xuICAgIHZhciBsZW5ndGggPSBsaXN0ZW5lcnMubGVuZ3RoXG4gICAgICAsIGo7XG5cbiAgICBmb3IgKGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHtcbiAgICAgIGlmIChsaXN0ZW5lcnNbaV0ub25jZSkgdGhpcy5yZW1vdmVMaXN0ZW5lcihldmVudCwgbGlzdGVuZXJzW2ldLmZuLCB1bmRlZmluZWQsIHRydWUpO1xuXG4gICAgICBzd2l0Y2ggKGxlbikge1xuICAgICAgICBjYXNlIDE6IGxpc3RlbmVyc1tpXS5mbi5jYWxsKGxpc3RlbmVyc1tpXS5jb250ZXh0KTsgYnJlYWs7XG4gICAgICAgIGNhc2UgMjogbGlzdGVuZXJzW2ldLmZuLmNhbGwobGlzdGVuZXJzW2ldLmNvbnRleHQsIGExKTsgYnJlYWs7XG4gICAgICAgIGNhc2UgMzogbGlzdGVuZXJzW2ldLmZuLmNhbGwobGlzdGVuZXJzW2ldLmNvbnRleHQsIGExLCBhMik7IGJyZWFrO1xuICAgICAgICBjYXNlIDQ6IGxpc3RlbmVyc1tpXS5mbi5jYWxsKGxpc3RlbmVyc1tpXS5jb250ZXh0LCBhMSwgYTIsIGEzKTsgYnJlYWs7XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgaWYgKCFhcmdzKSBmb3IgKGogPSAxLCBhcmdzID0gbmV3IEFycmF5KGxlbiAtMSk7IGogPCBsZW47IGorKykge1xuICAgICAgICAgICAgYXJnc1tqIC0gMV0gPSBhcmd1bWVudHNbal07XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgbGlzdGVuZXJzW2ldLmZuLmFwcGx5KGxpc3RlbmVyc1tpXS5jb250ZXh0LCBhcmdzKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gdHJ1ZTtcbn07XG5cbi8qKlxuICogQWRkIGEgbGlzdGVuZXIgZm9yIGEgZ2l2ZW4gZXZlbnQuXG4gKlxuICogQHBhcmFtIHsoU3RyaW5nfFN5bWJvbCl9IGV2ZW50IFRoZSBldmVudCBuYW1lLlxuICogQHBhcmFtIHtGdW5jdGlvbn0gZm4gVGhlIGxpc3RlbmVyIGZ1bmN0aW9uLlxuICogQHBhcmFtIHsqfSBbY29udGV4dD10aGlzXSBUaGUgY29udGV4dCB0byBpbnZva2UgdGhlIGxpc3RlbmVyIHdpdGguXG4gKiBAcmV0dXJucyB7RXZlbnRFbWl0dGVyfSBgdGhpc2AuXG4gKiBAcHVibGljXG4gKi9cbkV2ZW50RW1pdHRlci5wcm90b3R5cGUub24gPSBmdW5jdGlvbiBvbihldmVudCwgZm4sIGNvbnRleHQpIHtcbiAgcmV0dXJuIGFkZExpc3RlbmVyKHRoaXMsIGV2ZW50LCBmbiwgY29udGV4dCwgZmFsc2UpO1xufTtcblxuLyoqXG4gKiBBZGQgYSBvbmUtdGltZSBsaXN0ZW5lciBmb3IgYSBnaXZlbiBldmVudC5cbiAqXG4gKiBAcGFyYW0geyhTdHJpbmd8U3ltYm9sKX0gZXZlbnQgVGhlIGV2ZW50IG5hbWUuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmbiBUaGUgbGlzdGVuZXIgZnVuY3Rpb24uXG4gKiBAcGFyYW0geyp9IFtjb250ZXh0PXRoaXNdIFRoZSBjb250ZXh0IHRvIGludm9rZSB0aGUgbGlzdGVuZXIgd2l0aC5cbiAqIEByZXR1cm5zIHtFdmVudEVtaXR0ZXJ9IGB0aGlzYC5cbiAqIEBwdWJsaWNcbiAqL1xuRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5vbmNlID0gZnVuY3Rpb24gb25jZShldmVudCwgZm4sIGNvbnRleHQpIHtcbiAgcmV0dXJuIGFkZExpc3RlbmVyKHRoaXMsIGV2ZW50LCBmbiwgY29udGV4dCwgdHJ1ZSk7XG59O1xuXG4vKipcbiAqIFJlbW92ZSB0aGUgbGlzdGVuZXJzIG9mIGEgZ2l2ZW4gZXZlbnQuXG4gKlxuICogQHBhcmFtIHsoU3RyaW5nfFN5bWJvbCl9IGV2ZW50IFRoZSBldmVudCBuYW1lLlxuICogQHBhcmFtIHtGdW5jdGlvbn0gZm4gT25seSByZW1vdmUgdGhlIGxpc3RlbmVycyB0aGF0IG1hdGNoIHRoaXMgZnVuY3Rpb24uXG4gKiBAcGFyYW0geyp9IGNvbnRleHQgT25seSByZW1vdmUgdGhlIGxpc3RlbmVycyB0aGF0IGhhdmUgdGhpcyBjb250ZXh0LlxuICogQHBhcmFtIHtCb29sZWFufSBvbmNlIE9ubHkgcmVtb3ZlIG9uZS10aW1lIGxpc3RlbmVycy5cbiAqIEByZXR1cm5zIHtFdmVudEVtaXR0ZXJ9IGB0aGlzYC5cbiAqIEBwdWJsaWNcbiAqL1xuRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5yZW1vdmVMaXN0ZW5lciA9IGZ1bmN0aW9uIHJlbW92ZUxpc3RlbmVyKGV2ZW50LCBmbiwgY29udGV4dCwgb25jZSkge1xuICB2YXIgZXZ0ID0gcHJlZml4ID8gcHJlZml4ICsgZXZlbnQgOiBldmVudDtcblxuICBpZiAoIXRoaXMuX2V2ZW50c1tldnRdKSByZXR1cm4gdGhpcztcbiAgaWYgKCFmbikge1xuICAgIGNsZWFyRXZlbnQodGhpcywgZXZ0KTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIHZhciBsaXN0ZW5lcnMgPSB0aGlzLl9ldmVudHNbZXZ0XTtcblxuICBpZiAobGlzdGVuZXJzLmZuKSB7XG4gICAgaWYgKFxuICAgICAgbGlzdGVuZXJzLmZuID09PSBmbiAmJlxuICAgICAgKCFvbmNlIHx8IGxpc3RlbmVycy5vbmNlKSAmJlxuICAgICAgKCFjb250ZXh0IHx8IGxpc3RlbmVycy5jb250ZXh0ID09PSBjb250ZXh0KVxuICAgICkge1xuICAgICAgY2xlYXJFdmVudCh0aGlzLCBldnQpO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBmb3IgKHZhciBpID0gMCwgZXZlbnRzID0gW10sIGxlbmd0aCA9IGxpc3RlbmVycy5sZW5ndGg7IGkgPCBsZW5ndGg7IGkrKykge1xuICAgICAgaWYgKFxuICAgICAgICBsaXN0ZW5lcnNbaV0uZm4gIT09IGZuIHx8XG4gICAgICAgIChvbmNlICYmICFsaXN0ZW5lcnNbaV0ub25jZSkgfHxcbiAgICAgICAgKGNvbnRleHQgJiYgbGlzdGVuZXJzW2ldLmNvbnRleHQgIT09IGNvbnRleHQpXG4gICAgICApIHtcbiAgICAgICAgZXZlbnRzLnB1c2gobGlzdGVuZXJzW2ldKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvL1xuICAgIC8vIFJlc2V0IHRoZSBhcnJheSwgb3IgcmVtb3ZlIGl0IGNvbXBsZXRlbHkgaWYgd2UgaGF2ZSBubyBtb3JlIGxpc3RlbmVycy5cbiAgICAvL1xuICAgIGlmIChldmVudHMubGVuZ3RoKSB0aGlzLl9ldmVudHNbZXZ0XSA9IGV2ZW50cy5sZW5ndGggPT09IDEgPyBldmVudHNbMF0gOiBldmVudHM7XG4gICAgZWxzZSBjbGVhckV2ZW50KHRoaXMsIGV2dCk7XG4gIH1cblxuICByZXR1cm4gdGhpcztcbn07XG5cbi8qKlxuICogUmVtb3ZlIGFsbCBsaXN0ZW5lcnMsIG9yIHRob3NlIG9mIHRoZSBzcGVjaWZpZWQgZXZlbnQuXG4gKlxuICogQHBhcmFtIHsoU3RyaW5nfFN5bWJvbCl9IFtldmVudF0gVGhlIGV2ZW50IG5hbWUuXG4gKiBAcmV0dXJucyB7RXZlbnRFbWl0dGVyfSBgdGhpc2AuXG4gKiBAcHVibGljXG4gKi9cbkV2ZW50RW1pdHRlci5wcm90b3R5cGUucmVtb3ZlQWxsTGlzdGVuZXJzID0gZnVuY3Rpb24gcmVtb3ZlQWxsTGlzdGVuZXJzKGV2ZW50KSB7XG4gIHZhciBldnQ7XG5cbiAgaWYgKGV2ZW50KSB7XG4gICAgZXZ0ID0gcHJlZml4ID8gcHJlZml4ICsgZXZlbnQgOiBldmVudDtcbiAgICBpZiAodGhpcy5fZXZlbnRzW2V2dF0pIGNsZWFyRXZlbnQodGhpcywgZXZ0KTtcbiAgfSBlbHNlIHtcbiAgICB0aGlzLl9ldmVudHMgPSBuZXcgRXZlbnRzKCk7XG4gICAgdGhpcy5fZXZlbnRzQ291bnQgPSAwO1xuICB9XG5cbiAgcmV0dXJuIHRoaXM7XG59O1xuXG4vL1xuLy8gQWxpYXMgbWV0aG9kcyBuYW1lcyBiZWNhdXNlIHBlb3BsZSByb2xsIGxpa2UgdGhhdC5cbi8vXG5FdmVudEVtaXR0ZXIucHJvdG90eXBlLm9mZiA9IEV2ZW50RW1pdHRlci5wcm90b3R5cGUucmVtb3ZlTGlzdGVuZXI7XG5FdmVudEVtaXR0ZXIucHJvdG90eXBlLmFkZExpc3RlbmVyID0gRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5vbjtcblxuLy9cbi8vIEV4cG9zZSB0aGUgcHJlZml4LlxuLy9cbkV2ZW50RW1pdHRlci5wcmVmaXhlZCA9IHByZWZpeDtcblxuLy9cbi8vIEFsbG93IGBFdmVudEVtaXR0ZXJgIHRvIGJlIGltcG9ydGVkIGFzIG1vZHVsZSBuYW1lc3BhY2UuXG4vL1xuRXZlbnRFbWl0dGVyLkV2ZW50RW1pdHRlciA9IEV2ZW50RW1pdHRlcjtcblxuLy9cbi8vIEV4cG9zZSB0aGUgbW9kdWxlLlxuLy9cbmlmICgndW5kZWZpbmVkJyAhPT0gdHlwZW9mIG1vZHVsZSkge1xuICBtb2R1bGUuZXhwb3J0cyA9IEV2ZW50RW1pdHRlcjtcbn1cbiIsCiAgICAiaW1wb3J0IHsgY3JlYXRlUmVxdWlyZSB9IGZyb20gXCJub2RlOm1vZHVsZVwiO1xudmFyIF9fY3JlYXRlID0gT2JqZWN0LmNyZWF0ZTtcbnZhciBfX2dldFByb3RvT2YgPSBPYmplY3QuZ2V0UHJvdG90eXBlT2Y7XG52YXIgX19kZWZQcm9wID0gT2JqZWN0LmRlZmluZVByb3BlcnR5O1xudmFyIF9fZ2V0T3duUHJvcE5hbWVzID0gT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXM7XG52YXIgX19oYXNPd25Qcm9wID0gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eTtcbmZ1bmN0aW9uIF9fYWNjZXNzUHJvcChrZXkpIHtcbiAgcmV0dXJuIHRoaXNba2V5XTtcbn1cbnZhciBfX3RvRVNNQ2FjaGVfbm9kZTtcbnZhciBfX3RvRVNNQ2FjaGVfZXNtO1xudmFyIF9fdG9FU00gPSAobW9kLCBpc05vZGVNb2RlLCB0YXJnZXQpID0+IHtcbiAgdmFyIGNhbkNhY2hlID0gbW9kICE9IG51bGwgJiYgdHlwZW9mIG1vZCA9PT0gXCJvYmplY3RcIjtcbiAgaWYgKGNhbkNhY2hlKSB7XG4gICAgdmFyIGNhY2hlID0gaXNOb2RlTW9kZSA/IF9fdG9FU01DYWNoZV9ub2RlID8/PSBuZXcgV2Vha01hcCA6IF9fdG9FU01DYWNoZV9lc20gPz89IG5ldyBXZWFrTWFwO1xuICAgIHZhciBjYWNoZWQgPSBjYWNoZS5nZXQobW9kKTtcbiAgICBpZiAoY2FjaGVkKVxuICAgICAgcmV0dXJuIGNhY2hlZDtcbiAgfVxuICB0YXJnZXQgPSBtb2QgIT0gbnVsbCA/IF9fY3JlYXRlKF9fZ2V0UHJvdG9PZihtb2QpKSA6IHt9O1xuICBjb25zdCB0byA9IGlzTm9kZU1vZGUgfHwgIW1vZCB8fCAhbW9kLl9fZXNNb2R1bGUgPyBfX2RlZlByb3AodGFyZ2V0LCBcImRlZmF1bHRcIiwgeyB2YWx1ZTogbW9kLCBlbnVtZXJhYmxlOiB0cnVlIH0pIDogdGFyZ2V0O1xuICBmb3IgKGxldCBrZXkgb2YgX19nZXRPd25Qcm9wTmFtZXMobW9kKSlcbiAgICBpZiAoIV9faGFzT3duUHJvcC5jYWxsKHRvLCBrZXkpKVxuICAgICAgX19kZWZQcm9wKHRvLCBrZXksIHtcbiAgICAgICAgZ2V0OiBfX2FjY2Vzc1Byb3AuYmluZChtb2QsIGtleSksXG4gICAgICAgIGVudW1lcmFibGU6IHRydWVcbiAgICAgIH0pO1xuICBpZiAoY2FuQ2FjaGUpXG4gICAgY2FjaGUuc2V0KG1vZCwgdG8pO1xuICByZXR1cm4gdG87XG59O1xudmFyIF9fY29tbW9uSlMgPSAoY2IsIG1vZCkgPT4gKCkgPT4gKG1vZCB8fCBjYigobW9kID0geyBleHBvcnRzOiB7fSB9KS5leHBvcnRzLCBtb2QpLCBtb2QuZXhwb3J0cyk7XG52YXIgX19yZXF1aXJlID0gLyogQF9fUFVSRV9fICovIGNyZWF0ZVJlcXVpcmUoaW1wb3J0Lm1ldGEudXJsKTtcblxuLy8gc3JjL2NvbnRleHQudHNcbnZhciBBUzJfQkFTRV9DT05URVhUX1VSTCA9IFwiaHR0cHM6Ly93d3cudzMub3JnL25zL2FjdGl2aXR5c3RyZWFtc1wiO1xudmFyIFNPQ0tFVEhVQl9CQVNFX0NPTlRFWFRfVVJMID0gXCJodHRwczovL3NvY2tldGh1Yi5vcmcvbnMvY29udGV4dC92MS5qc29ubGRcIjtcbnZhciBQTEFURk9STV9DT05URVhUX1BSRUZJWCA9IFwiaHR0cHM6Ly9zb2NrZXRodWIub3JnL25zL2NvbnRleHQvcGxhdGZvcm0vXCI7XG52YXIgRVJST1JfUExBVEZPUk1fSUQgPSBcImVycm9yXCI7XG52YXIgRVJST1JfUExBVEZPUk1fQ09OVEVYVF9VUkwgPSBcImh0dHBzOi8vc29ja2V0aHViLm9yZy9ucy9jb250ZXh0L3BsYXRmb3JtL2Vycm9yL3YxLmpzb25sZFwiO1xudmFyIElOVEVSTkFMX1BMQVRGT1JNX0lEID0gXCJzb2NrZXRodWI6aW50ZXJuYWxcIjtcbnZhciBJTlRFUk5BTF9QTEFURk9STV9DT05URVhUX1VSTCA9IFwiaHR0cHM6Ly9zb2NrZXRodWIub3JnL25zL2NvbnRleHQvcGxhdGZvcm0vc29ja2V0aHViOmludGVybmFsL3YxLmpzb25sZFwiO1xudmFyIHBsYXRmb3JtQ29udGV4dFRvUGxhdGZvcm1JZCA9IG5ldyBNYXA7XG52YXIgcGxhdGZvcm1Db250ZXh0VG9TY2hlbWFJZCA9IG5ldyBNYXA7XG52YXIgcGxhdGZvcm1Db250ZXh0VG9DcmVkZW50aWFsc1NjaGVtYUlkID0gbmV3IE1hcDtcbmZ1bmN0aW9uIGJ1aWxkQ2Fub25pY2FsQ29udGV4dChwbGF0Zm9ybUNvbnRleHRVcmwpIHtcbiAgcmV0dXJuIFtcbiAgICBBUzJfQkFTRV9DT05URVhUX1VSTCxcbiAgICBTT0NLRVRIVUJfQkFTRV9DT05URVhUX1VSTCxcbiAgICBwbGF0Zm9ybUNvbnRleHRVcmxcbiAgXTtcbn1cbmZ1bmN0aW9uIG5vcm1hbGl6ZUNvbnRleHRBcnJheSh2YWx1ZSkge1xuICBpZiAoIUFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgcmV0dXJuIFtdO1xuICB9XG4gIHJldHVybiB2YWx1ZS5maWx0ZXIoKGVudHJ5KSA9PiB0eXBlb2YgZW50cnkgPT09IFwic3RyaW5nXCIpO1xufVxuZnVuY3Rpb24gZ2V0Q29udGV4dEFycmF5KG1zZykge1xuICByZXR1cm4gbm9ybWFsaXplQ29udGV4dEFycmF5KG1zZ1tcIkBjb250ZXh0XCJdKTtcbn1cbmZ1bmN0aW9uIHJlZ2lzdGVyUGxhdGZvcm1Db250ZXh0KHBsYXRmb3JtSWQsIHBsYXRmb3JtQ29udGV4dFVybCwgc2NoZW1hSWQsIGNyZWRlbnRpYWxzU2NoZW1hSWQpIHtcbiAgcGxhdGZvcm1Db250ZXh0VG9QbGF0Zm9ybUlkLnNldChwbGF0Zm9ybUNvbnRleHRVcmwsIHBsYXRmb3JtSWQpO1xuICBwbGF0Zm9ybUNvbnRleHRUb1NjaGVtYUlkLnNldChwbGF0Zm9ybUNvbnRleHRVcmwsIHNjaGVtYUlkKTtcbiAgcGxhdGZvcm1Db250ZXh0VG9DcmVkZW50aWFsc1NjaGVtYUlkLnNldChwbGF0Zm9ybUNvbnRleHRVcmwsIGNyZWRlbnRpYWxzU2NoZW1hSWQpO1xufVxuZnVuY3Rpb24gcmVzb2x2ZVBsYXRmb3JtQ29udGV4dFVybChtc2cpIHtcbiAgY29uc3QgY29udGV4dHMgPSBnZXRDb250ZXh0QXJyYXkobXNnKTtcbiAgY29uc3QgbWF0Y2hlcyA9IGNvbnRleHRzLmZpbHRlcigoY29udGV4dFVybCkgPT4gcGxhdGZvcm1Db250ZXh0VG9QbGF0Zm9ybUlkLmhhcyhjb250ZXh0VXJsKSk7XG4gIGlmIChtYXRjaGVzLmxlbmd0aCAhPT0gMSkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG4gIHJldHVybiBtYXRjaGVzWzBdO1xufVxuZnVuY3Rpb24gZ2V0UGxhdGZvcm1JZEJ5Q29udGV4dFVybChwbGF0Zm9ybUNvbnRleHRVcmwpIHtcbiAgcmV0dXJuIHBsYXRmb3JtQ29udGV4dFRvUGxhdGZvcm1JZC5nZXQocGxhdGZvcm1Db250ZXh0VXJsKTtcbn1cbmZ1bmN0aW9uIGdldFNjaGVtYUlkQnlDb250ZXh0VXJsKHBsYXRmb3JtQ29udGV4dFVybCkge1xuICByZXR1cm4gcGxhdGZvcm1Db250ZXh0VG9TY2hlbWFJZC5nZXQocGxhdGZvcm1Db250ZXh0VXJsKTtcbn1cbmZ1bmN0aW9uIGdldENyZWRlbnRpYWxzU2NoZW1hSWRCeUNvbnRleHRVcmwocGxhdGZvcm1Db250ZXh0VXJsKSB7XG4gIHJldHVybiBwbGF0Zm9ybUNvbnRleHRUb0NyZWRlbnRpYWxzU2NoZW1hSWQuZ2V0KHBsYXRmb3JtQ29udGV4dFVybCk7XG59XG5leHBvcnQge1xuICByZXNvbHZlUGxhdGZvcm1Db250ZXh0VXJsLFxuICByZWdpc3RlclBsYXRmb3JtQ29udGV4dCxcbiAgZ2V0U2NoZW1hSWRCeUNvbnRleHRVcmwsXG4gIGdldFBsYXRmb3JtSWRCeUNvbnRleHRVcmwsXG4gIGdldENyZWRlbnRpYWxzU2NoZW1hSWRCeUNvbnRleHRVcmwsXG4gIGdldENvbnRleHRBcnJheSxcbiAgYnVpbGRDYW5vbmljYWxDb250ZXh0LFxuICBTT0NLRVRIVUJfQkFTRV9DT05URVhUX1VSTCxcbiAgUExBVEZPUk1fQ09OVEVYVF9QUkVGSVgsXG4gIElOVEVSTkFMX1BMQVRGT1JNX0lELFxuICBJTlRFUk5BTF9QTEFURk9STV9DT05URVhUX1VSTCxcbiAgRVJST1JfUExBVEZPUk1fSUQsXG4gIEVSUk9SX1BMQVRGT1JNX0NPTlRFWFRfVVJMLFxuICBBUzJfQkFTRV9DT05URVhUX1VSTFxufTtcblxuLy8jIGRlYnVnSWQ9QjgyRUNCOTM3M0FDQTZCNDY0NzU2RTIxNjQ3NTZFMjFcbiIsCiAgICAiaW1wb3J0IEV2ZW50RW1pdHRlciBmcm9tICcuL2luZGV4LmpzJ1xuXG5leHBvcnQgeyBFdmVudEVtaXR0ZXIgfVxuZXhwb3J0IGRlZmF1bHQgRXZlbnRFbWl0dGVyXG4iLAogICAgIi8qIVxuICogYWN0aXZpdHktc3RyZWFtc1xuICogICBodHRwczovL2dpdGh1Yi5jb20vc2lsdmVyYnVja2V0L2FjdGl2aXR5LXN0cmVhbXNcbiAqXG4gKiBEZXZlbG9wZWQgYW5kIE1haW50YWluZWQgYnk6XG4gKiAgIE5pY2sgSmVubmluZ3MgPG5pY2tAc2lsdmVyYnVja2V0Lm5ldD5cbiAqXG4gKiBhY3Rpdml0eS1zdHJlYW1zIGlzIHJlbGVhc2VkIHVuZGVyIHRoZSBNSVQgKHNlZSBMSUNFTlNFKS5cbiAqXG4gKiBZb3UgZG9uJ3QgaGF2ZSB0byBkbyBhbnl0aGluZyBzcGVjaWFsIHRvIGNob29zZSBvbmUgbGljZW5zZSBvciB0aGUgb3RoZXJcbiAqIGFuZCB5b3UgZG9uJ3QgaGF2ZSB0byBub3RpZnkgYW55b25lIHdoaWNoIGxpY2Vuc2UgeW91IGFyZSB1c2luZy5cbiAqIFBsZWFzZSBzZWUgdGhlIGNvcnJlc3BvbmRpbmcgbGljZW5zZSBmaWxlIGZvciBkZXRhaWxzIG9mIHRoZXNlIGxpY2Vuc2VzLlxuICogWW91IGFyZSBmcmVlIHRvIHVzZSwgbW9kaWZ5IGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUsIGJ1dCBhbGwgY29weXJpZ2h0XG4gKiBpbmZvcm1hdGlvbiBtdXN0IHJlbWFpbi5cbiAqXG4gKi9cblxuaW1wb3J0IHR5cGUgeyBBY3Rpdml0eU9iamVjdCwgQWN0aXZpdHlTdHJlYW0gfSBmcm9tIFwiQHNvY2tldGh1Yi9zY2hlbWFzXCI7XG5pbXBvcnQge1xuICAgIEFTMl9CQVNFX0NPTlRFWFRfVVJMLFxuICAgIFBMQVRGT1JNX0NPTlRFWFRfUFJFRklYLFxuICAgIFNPQ0tFVEhVQl9CQVNFX0NPTlRFWFRfVVJMLFxufSBmcm9tIFwiQHNvY2tldGh1Yi9zY2hlbWFzL2NvbnRleHRcIjtcbmltcG9ydCBFdmVudEVtaXR0ZXIgZnJvbSBcImV2ZW50ZW1pdHRlcjNcIjtcblxuY29uc3QgZWUgPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG5jb25zdCBiYXNlUHJvcHMgPSB7XG4gICAgc3RyZWFtOiBbXG4gICAgICAgIFwiQGNvbnRleHRcIixcbiAgICAgICAgXCJpZFwiLFxuICAgICAgICBcInR5cGVcIixcbiAgICAgICAgXCJwbGF0Zm9ybVwiLFxuICAgICAgICBcImFjdG9yXCIsXG4gICAgICAgIFwidGFyZ2V0XCIsXG4gICAgICAgIFwib2JqZWN0XCIsXG4gICAgICAgIFwicHVibGlzaGVkXCIsXG4gICAgICAgIFwiZXJyb3JcIixcbiAgICBdLFxuICAgIG9iamVjdDogW1xuICAgICAgICBcImlkXCIsXG4gICAgICAgIFwidHlwZVwiLFxuICAgICAgICBcImNvbnRleHRcIixcbiAgICAgICAgXCJhbGlhc1wiLFxuICAgICAgICBcImF0dGFjaGVkVG9cIixcbiAgICAgICAgXCJhdHRhY2htZW50XCIsXG4gICAgICAgIFwiYXR0cmlidXRlZFRvXCIsXG4gICAgICAgIFwiYXR0cmlidXRlZFdpdGhcIixcbiAgICAgICAgXCJjb25kaXRpb25cIixcbiAgICAgICAgXCJjb250ZW50XCIsXG4gICAgICAgIFwiY29udGVudE1hcFwiLFxuICAgICAgICBcImNvbnRleHRcIixcbiAgICAgICAgXCJjb250ZXh0T2ZcIixcbiAgICAgICAgXCJuYW1lXCIsXG4gICAgICAgIFwiZW5kVGltZVwiLFxuICAgICAgICBcImdlbmVyYXRvclwiLFxuICAgICAgICBcImdlbmVyYXRvck9mXCIsXG4gICAgICAgIFwiZ3JvdXBcIixcbiAgICAgICAgXCJpY29uXCIsXG4gICAgICAgIFwiaW1hZ2VcIixcbiAgICAgICAgXCJpblJlcGx5VG9cIixcbiAgICAgICAgXCJtZW1iZXJzXCIsXG4gICAgICAgIFwibWVtYmVyT2ZcIixcbiAgICAgICAgXCJtZXNzYWdlXCIsXG4gICAgICAgIFwibG9jYXRpb25cIixcbiAgICAgICAgXCJsb2NhdGlvbk9mXCIsXG4gICAgICAgIFwib2JqZWN0T2ZcIixcbiAgICAgICAgXCJvcmlnaW5PZlwiLFxuICAgICAgICBcInByZXNlbmNlXCIsXG4gICAgICAgIFwicHJldmlld1wiLFxuICAgICAgICBcInByZXZpZXdPZlwiLFxuICAgICAgICBcInByb3ZpZGVyXCIsXG4gICAgICAgIFwicHJvdmlkZXJPZlwiLFxuICAgICAgICBcInB1Ymxpc2hlZFwiLFxuICAgICAgICBcInJhdGluZ1wiLFxuICAgICAgICBcInJlbGF0aW9uc2hpcFwiLFxuICAgICAgICBcInJlc3VsdE9mXCIsXG4gICAgICAgIFwicmVwbGllc1wiLFxuICAgICAgICBcInJvbGVcIixcbiAgICAgICAgXCJzY29wZVwiLFxuICAgICAgICBcInNjb3BlT2ZcIixcbiAgICAgICAgXCJzdGFydFRpbWVcIixcbiAgICAgICAgXCJzdGF0dXNcIixcbiAgICAgICAgXCJzdW1tYXJ5XCIsXG4gICAgICAgIFwidG9waWNcIixcbiAgICAgICAgXCJ0YWdcIixcbiAgICAgICAgXCJ0YWdPZlwiLFxuICAgICAgICBcInRhcmdldE9mXCIsXG4gICAgICAgIFwidGl0bGVcIixcbiAgICAgICAgXCJ0aXRsZU1hcFwiLFxuICAgICAgICBcInVwZGF0ZWRcIixcbiAgICAgICAgXCJ1cmxcIixcbiAgICAgICAgXCJ4bXBwOnN0YW56YS1pZFwiLFxuICAgIF0sXG59IGFzIGNvbnN0O1xuY29uc3QgZXhwYW5kID0ge1xuICAgIGFjdG9yOiB7XG4gICAgICAgIHByaW1hcnk6IFwiaWRcIixcbiAgICAgICAgcHJvcHM6IGJhc2VQcm9wcyxcbiAgICB9LFxuICAgIHRhcmdldDoge1xuICAgICAgICBwcmltYXJ5OiBcImlkXCIsXG4gICAgICAgIHByb3BzOiBiYXNlUHJvcHMsXG4gICAgfSxcbiAgICBvYmplY3Q6IHtcbiAgICAgICAgcHJpbWFyeTogXCJjb250ZW50XCIsXG4gICAgICAgIHByb3BzOiBiYXNlUHJvcHMsXG4gICAgfSxcbn0gYXMgY29uc3Q7XG5cbnR5cGUgQ3VzdG9tUHJvcHMgPSBSZWNvcmQ8c3RyaW5nLCBzdHJpbmdbXT47XG5cbnR5cGUgQmFzZVByb3BLZXkgPSBrZXlvZiB0eXBlb2YgYmFzZVByb3BzO1xuXG5jb25zdCBvYmpzID0gbmV3IE1hcDxzdHJpbmcsIEFjdGl2aXR5T2JqZWN0PigpO1xuY29uc3QgY3VzdG9tUHJvcHM6IEN1c3RvbVByb3BzID0ge307XG5cbmxldCBmYWlsT25Vbmtub3duT2JqZWN0UHJvcGVydGllcyA9IGZhbHNlO1xubGV0IHdhcm5PblVua25vd25PYmplY3RQcm9wZXJ0aWVzID0gdHJ1ZTtcbmxldCBzcGVjaWFsT2Jqczogc3RyaW5nW10gPSBbXTsgLy8gdGhlIG9iamVjdHMgZG9uJ3QgZ2V0IHJlamVjdGVkIGZvciBiYWQgcHJvcHNcblxuZnVuY3Rpb24gbWF0Y2hlc0N1c3RvbVByb3AodHlwZTogc3RyaW5nLCBrZXk6IHN0cmluZykge1xuICAgIGNvbnN0IHByb3BzID0gY3VzdG9tUHJvcHNbdHlwZV07XG4gICAgcmV0dXJuIEFycmF5LmlzQXJyYXkocHJvcHMpICYmIHByb3BzLmluY2x1ZGVzKGtleSk7XG59XG5cbmZ1bmN0aW9uIHZhbGlkYXRlT2JqZWN0KFxuICAgIHR5cGU6IEJhc2VQcm9wS2V5LFxuICAgIGluY29taW5nT2JqOiB1bmtub3duLFxuICAgIHJlcXVpcmVJZCA9IGZhbHNlLFxuKSB7XG4gICAgLy8gSW5wdXQgdmFsaWRhdGlvbiB3aXRoIGNsZWFyIGVycm9yIG1lc3NhZ2VzXG4gICAgaWYgKGluY29taW5nT2JqID09PSBudWxsKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgIGBBY3Rpdml0eVN0cmVhbXMgdmFsaWRhdGlvbiBmYWlsZWQ6IHRoZSBcIiR7dHlwZX1cIiBwcm9wZXJ0eSBpcyBudWxsLiBFeGFtcGxlOiB7IGlkOiBcInVzZXJAZXhhbXBsZS5jb21cIiwgdHlwZTogXCJwZXJzb25cIiB9YCxcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBpZiAoaW5jb21pbmdPYmogPT09IHVuZGVmaW5lZCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICBgQWN0aXZpdHlTdHJlYW1zIHZhbGlkYXRpb24gZmFpbGVkOiB0aGUgXCIke3R5cGV9XCIgcHJvcGVydHkgaXMgdW5kZWZpbmVkLiBFeGFtcGxlOiB7IGlkOiBcInVzZXJAZXhhbXBsZS5jb21cIiwgdHlwZTogXCJwZXJzb25cIiB9YCxcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIGluY29taW5nT2JqID09PSBcInN0cmluZ1wiKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgIGBBY3Rpdml0eVN0cmVhbXMgdmFsaWRhdGlvbiBmYWlsZWQ6IHRoZSBcIiR7dHlwZX1cIiBwcm9wZXJ0eSByZWNlaXZlZCBzdHJpbmcgXCIke2luY29taW5nT2JqfVwiIGJ1dCBleHBlY3RlZCBhbiBvYmplY3QuIFVzZTogeyBpZDogXCIke2luY29taW5nT2JqfVwiLCB0eXBlOiBcInBlcnNvblwiIH1gLFxuICAgICAgICApO1xuICAgIH1cblxuICAgIGlmICh0eXBlb2YgaW5jb21pbmdPYmogIT09IFwib2JqZWN0XCIgfHwgQXJyYXkuaXNBcnJheShpbmNvbWluZ09iaikpIHtcbiAgICAgICAgY29uc3QgcmVjZWl2ZWRUeXBlID0gQXJyYXkuaXNBcnJheShpbmNvbWluZ09iailcbiAgICAgICAgICAgID8gXCJhcnJheVwiXG4gICAgICAgICAgICA6IHR5cGVvZiBpbmNvbWluZ09iajtcbiAgICAgICAgY29uc3QgcmVjZWl2ZWRWYWx1ZSA9IFN0cmluZyhpbmNvbWluZ09iaik7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgIGBBY3Rpdml0eVN0cmVhbXMgdmFsaWRhdGlvbiBmYWlsZWQ6IHRoZSBcIiR7dHlwZX1cIiBwcm9wZXJ0eSBtdXN0IGJlIGFuIG9iamVjdCwgcmVjZWl2ZWQgJHtyZWNlaXZlZFR5cGV9ICgke3JlY2VpdmVkVmFsdWV9KS4gRXhhbXBsZTogeyBpZDogXCJ1c2VyQGV4YW1wbGUuY29tXCIsIHR5cGU6IFwicGVyc29uXCIgfWAsXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgLy8gUmVxdWlyZSAnaWQnIHByb3BlcnR5IHdoZW4gZXhwbGljaXRseSByZXF1ZXN0ZWQgKGUuZy4sIE9iamVjdC5jcmVhdGUoKSlcbiAgICBjb25zdCBvYmogPSBpbmNvbWluZ09iaiBhcyBBY3Rpdml0eU9iamVjdDtcbiAgICBpZiAocmVxdWlyZUlkICYmICFvYmouaWQpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgYEFjdGl2aXR5U3RyZWFtcyB2YWxpZGF0aW9uIGZhaWxlZDogdGhlIFwiJHt0eXBlfVwiIHByb3BlcnR5IHJlcXVpcmVzIGFuICdpZCcgcHJvcGVydHkuIEV4YW1wbGU6IHsgaWQ6IFwidXNlckBleGFtcGxlLmNvbVwiLCB0eXBlOiBcInBlcnNvblwiIH1gLFxuICAgICAgICApO1xuICAgIH1cblxuICAgIGNvbnN0IGluY29taW5nUmVjb3JkID0gaW5jb21pbmdPYmogYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gICAgY29uc3QgYWxsb3dlZFByb3BzID0gYmFzZVByb3BzW3R5cGVdIGFzIHJlYWRvbmx5IHN0cmluZ1tdO1xuICAgIGNvbnN0IHVua25vd25LZXlzID0gT2JqZWN0LmtleXMoaW5jb21pbmdSZWNvcmQpLmZpbHRlcihcbiAgICAgICAgKGtleTogc3RyaW5nKTogYm9vbGVhbiA9PiB7XG4gICAgICAgICAgICByZXR1cm4gIWFsbG93ZWRQcm9wcy5pbmNsdWRlcyhrZXkpO1xuICAgICAgICB9LFxuICAgICk7XG5cbiAgICBmb3IgKGNvbnN0IGtleSBvZiB1bmtub3duS2V5cykge1xuICAgICAgICBjb25zdCBhbyA9IGluY29taW5nT2JqIGFzIEFjdGl2aXR5T2JqZWN0O1xuICAgICAgICBpZiAobWF0Y2hlc0N1c3RvbVByb3AoYW8udHlwZSwga2V5KSkge1xuICAgICAgICAgICAgLy8gY3VzdG9tIHByb3BlcnR5IG1hdGNoZXMsIGNvbnRpbnVlXG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghc3BlY2lhbE9ianMuaW5jbHVkZXMoYW8udHlwZSkpIHtcbiAgICAgICAgICAgIC8vIG5vdCBkZWZpbmVkIGFzIGEgc3BlY2lhbCBwcm9wXG4gICAgICAgICAgICAvLyBkb24ndCBrbm93IHdoYXQgdG8gZG8gd2l0aCBpdCwgc28gdGhyb3cgZXJyb3JcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKGFvKTtcbiAgICAgICAgICAgIGNvbnN0IHJlY2VpdmVkVmFsdWUgPVxuICAgICAgICAgICAgICAgIHR5cGVvZiBhb1trZXldID09PSBcInN0cmluZ1wiID8gYFwiJHthb1trZXldfVwiYCA6IFN0cmluZyhhb1trZXldKTtcbiAgICAgICAgICAgIGNvbnN0IGVyciA9IGBBY3Rpdml0eVN0cmVhbXMgdmFsaWRhdGlvbiBmYWlsZWQ6IHByb3BlcnR5IFwiJHtrZXl9XCIgd2l0aCB2YWx1ZSAke3JlY2VpdmVkVmFsdWV9IGlzIG5vdCBhbGxvd2VkIG9uIHRoZSBcIiR7dHlwZX1cIiBvYmplY3Qgb2YgdHlwZSBcIiR7YW8udHlwZX1cIi5gO1xuICAgICAgICAgICAgaWYgKGZhaWxPblVua25vd25PYmplY3RQcm9wZXJ0aWVzKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGVycik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAod2Fybk9uVW5rbm93bk9iamVjdFByb3BlcnRpZXMpIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLndhcm4oZXJyKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbn1cblxuZnVuY3Rpb24gZW5zdXJlUHJvcHMob2JqOiBBY3Rpdml0eU9iamVjdCk6IEFjdGl2aXR5T2JqZWN0IHtcbiAgICAvLyBlbnN1cmUgdGhlIG5hbWUgcHJvcGVydHksIHdoaWNoIGNhbiBnZW5lcmFsbHkgYmUgaW5mZXJyZWQgZnJvbSB0aGUgaWRcbiAgICAvLyBuYW1lID0gb2JqLm1hdGNoKC8oPyg/XFx3Kyk6XFwvXFwvKSg/Oi4rQCk/KC4rPykoPzpcXC98JCkvKVsxXVxuICAgIHJldHVybiBvYmo7XG59XG5cbmZ1bmN0aW9uIGV4cGFuZFN0cmVhbShtZXRhOiBBY3Rpdml0eVN0cmVhbSkge1xuICAgIGNvbnN0IHN0cmVhbTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPSB7fTtcbiAgICBjb25zdCBtZXRhUmVjb3JkID0gbWV0YSBhcyB1bmtub3duIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICAgIGZvciAoY29uc3Qga2V5IG9mIE9iamVjdC5rZXlzKG1ldGFSZWNvcmQpKSB7XG4gICAgICAgIGNvbnN0IHZhbHVlID0gbWV0YVJlY29yZFtrZXldO1xuICAgICAgICBpZiAodHlwZW9mIHZhbHVlID09PSBcInN0cmluZ1wiKSB7XG4gICAgICAgICAgICBzdHJlYW1ba2V5XSA9IG9ianMuZ2V0KHZhbHVlKSB8fCB2YWx1ZTtcbiAgICAgICAgfSBlbHNlIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgICAgICAgICAgY29uc3QgZXhwYW5kZWQ6IEFycmF5PEFjdGl2aXR5T2JqZWN0IHwgc3RyaW5nPiA9IFtdO1xuICAgICAgICAgICAgZm9yIChjb25zdCBlbnRyeSBvZiB2YWx1ZSkge1xuICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgZW50cnkgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgZXhwYW5kZWQucHVzaChvYmpzLmdldChlbnRyeSkgfHwgZW50cnkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHN0cmVhbVtrZXldID0gZXhwYW5kZWQ7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBzdHJlYW1ba2V5XSA9IHZhbHVlO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gb25seSBleHBhbmQgc3RyaW5nIGludG8gb2JqZWN0cyBpZiB0aGV5IGFyZSBpbiB0aGUgZXhwYW5kIGxpc3RcbiAgICBmb3IgKGNvbnN0IGtleSBvZiBPYmplY3Qua2V5cyhleHBhbmQpIGFzIEFycmF5PGtleW9mIHR5cGVvZiBleHBhbmQ+KSB7XG4gICAgICAgIGNvbnN0IHZhbHVlID0gc3RyZWFtW2tleV07XG4gICAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgICAgIGNvbnN0IGlkeCA9IGV4cGFuZFtrZXldLnByaW1hcnk7XG4gICAgICAgICAgICBzdHJlYW1ba2V5XSA9IHsgW2lkeF06IHZhbHVlIH07XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHN0cmVhbSBhcyB1bmtub3duIGFzIEFjdGl2aXR5U3RyZWFtO1xufVxuXG5mdW5jdGlvbiBTdHJlYW0oXG4gICAgbWV0YTogdW5rbm93bixcbik6IEFjdGl2aXR5U3RyZWFtIHwgQWN0aXZpdHlPYmplY3QgfCBSZWNvcmQ8c3RyaW5nLCBuZXZlcj4ge1xuICAgIHZhbGlkYXRlT2JqZWN0KFwic3RyZWFtXCIsIG1ldGEpO1xuICAgIGlmICh0eXBlb2YgKG1ldGEgYXMgQWN0aXZpdHlTdHJlYW0pLm9iamVjdCA9PT0gXCJvYmplY3RcIikge1xuICAgICAgICB2YWxpZGF0ZU9iamVjdChcIm9iamVjdFwiLCAobWV0YSBhcyBBY3Rpdml0eVN0cmVhbSkub2JqZWN0KTtcbiAgICB9XG4gICAgY29uc3Qgc3RyZWFtID0gZXhwYW5kU3RyZWFtKG1ldGEgYXMgQWN0aXZpdHlTdHJlYW0pO1xuICAgIGVlLmVtaXQoXCJhY3Rpdml0eS1zdHJlYW1cIiwgc3RyZWFtKTtcbiAgICByZXR1cm4gc3RyZWFtO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEFjdGl2aXR5T2JqZWN0TWFuYWdlciB7XG4gICAgY3JlYXRlKG9iajogQWN0aXZpdHlPYmplY3QpOiBBY3Rpdml0eU9iamVjdDtcbiAgICBkZWxldGUoaWQ6IHN0cmluZyk6IGJvb2xlYW47XG4gICAgbGlzdCgpOiBJdGVyYWJsZUl0ZXJhdG9yPHN0cmluZz47XG4gICAgZ2V0KGlkOiBzdHJpbmcsIGV4cGFuZD86IGJvb2xlYW4pOiBBY3Rpdml0eU9iamVjdCB8IHN0cmluZztcbn1cblxuY29uc3QgX09iamVjdDogQWN0aXZpdHlPYmplY3RNYW5hZ2VyID0ge1xuICAgIGNyZWF0ZTogKG9iajogQWN0aXZpdHlPYmplY3QpID0+IHtcbiAgICAgICAgdmFsaWRhdGVPYmplY3QoXCJvYmplY3RcIiwgb2JqLCB0cnVlKTsgLy8gcmVxdWlyZSBJRCBmb3IgT2JqZWN0LmNyZWF0ZSgpXG4gICAgICAgIGNvbnN0IGFvID0gZW5zdXJlUHJvcHMob2JqKTtcbiAgICAgICAgb2Jqcy5zZXQoYW8uaWQsIGFvKTtcbiAgICAgICAgZWUuZW1pdChcImFjdGl2aXR5LW9iamVjdC1jcmVhdGVcIiwgYW8pO1xuICAgICAgICByZXR1cm4gYW87XG4gICAgfSxcblxuICAgIGRlbGV0ZTogKGlkKSA9PiB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IG9ianMuZGVsZXRlKGlkKTtcbiAgICAgICAgaWYgKHJlc3VsdCkge1xuICAgICAgICAgICAgZWUuZW1pdChcImFjdGl2aXR5LW9iamVjdC1kZWxldGVcIiwgaWQpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfSxcblxuICAgIGdldDogKGlkLCBleHBhbmQpID0+IHtcbiAgICAgICAgbGV0IG9iaiA9IG9ianMuZ2V0KGlkKTtcbiAgICAgICAgaWYgKCFvYmopIHtcbiAgICAgICAgICAgIGlmICghZXhwYW5kKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGlkO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgb2JqID0geyBpZDogaWQgfSBhcyBBY3Rpdml0eU9iamVjdDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZW5zdXJlUHJvcHMob2JqKTtcbiAgICB9LFxuXG4gICAgbGlzdDogKCk6IEl0ZXJhYmxlSXRlcmF0b3I8c3RyaW5nPiA9PiBvYmpzLmtleXMoKSxcbn07XG5cbmV4cG9ydCBpbnRlcmZhY2UgQVNGYWN0b3J5T3B0aW9ucyB7XG4gICAgc3BlY2lhbE9ianM/OiBBcnJheTxzdHJpbmc+O1xuICAgIGZhaWxPblVua25vd25PYmplY3RQcm9wZXJ0aWVzPzogYm9vbGVhbjtcbiAgICB3YXJuT25Vbmtub3duT2JqZWN0UHJvcGVydGllcz86IGJvb2xlYW47XG4gICAgY3VzdG9tUHJvcHM/OiBDdXN0b21Qcm9wcztcbn1cblxudHlwZSBFdmVudENhbGxiYWNrID0gKC4uLmFyZ3M6IHVua25vd25bXSkgPT4gdm9pZDtcblxuZXhwb3J0IGludGVyZmFjZSBBU01hbmFnZXIge1xuICAgIFN0cmVhbShtZXRhOiBBY3Rpdml0eVN0cmVhbSB8IHVua25vd24pOiBBY3Rpdml0eVN0cmVhbSB8IEFjdGl2aXR5T2JqZWN0O1xuICAgIE9iamVjdDogQWN0aXZpdHlPYmplY3RNYW5hZ2VyO1xuICAgIG9uKGV2ZW50OiBzdHJpbmcsIGZ1bmM6IEV2ZW50Q2FsbGJhY2spOiB2b2lkO1xuICAgIG9uY2UoZXZlbnQ6IHN0cmluZywgZnVuYzogRXZlbnRDYWxsYmFjayk6IHZvaWQ7XG4gICAgb2ZmKGV2ZW50OiBzdHJpbmcsIGZ1bmM6IEV2ZW50Q2FsbGJhY2spOiB2b2lkO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gQVNGYWN0b3J5KG9wdHM6IEFTRmFjdG9yeU9wdGlvbnMgPSB7fSk6IEFTTWFuYWdlciB7XG4gICAgc3BlY2lhbE9ianMgPSBvcHRzPy5zcGVjaWFsT2JqcyB8fCBbXTtcbiAgICBmYWlsT25Vbmtub3duT2JqZWN0UHJvcGVydGllcyA9XG4gICAgICAgIHR5cGVvZiBvcHRzLmZhaWxPblVua25vd25PYmplY3RQcm9wZXJ0aWVzID09PSBcImJvb2xlYW5cIlxuICAgICAgICAgICAgPyBvcHRzLmZhaWxPblVua25vd25PYmplY3RQcm9wZXJ0aWVzXG4gICAgICAgICAgICA6IGZhaWxPblVua25vd25PYmplY3RQcm9wZXJ0aWVzO1xuICAgIHdhcm5PblVua25vd25PYmplY3RQcm9wZXJ0aWVzID1cbiAgICAgICAgdHlwZW9mIG9wdHMud2Fybk9uVW5rbm93bk9iamVjdFByb3BlcnRpZXMgPT09IFwiYm9vbGVhblwiXG4gICAgICAgICAgICA/IG9wdHMud2Fybk9uVW5rbm93bk9iamVjdFByb3BlcnRpZXNcbiAgICAgICAgICAgIDogd2Fybk9uVW5rbm93bk9iamVjdFByb3BlcnRpZXM7XG4gICAgY29uc3QgY3VzdG9tUHJvcHNDb25maWcgPSBvcHRzLmN1c3RvbVByb3BzIHx8IHt9O1xuICAgIGZvciAoY29uc3QgcHJvcE5hbWUgb2YgT2JqZWN0LmtleXMoY3VzdG9tUHJvcHNDb25maWcpKSB7XG4gICAgICAgIGN1c3RvbVByb3BzW3Byb3BOYW1lXSA9IGN1c3RvbVByb3BzQ29uZmlnW3Byb3BOYW1lXTtcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgICBTdHJlYW06IFN0cmVhbSxcbiAgICAgICAgT2JqZWN0OiBfT2JqZWN0LFxuICAgICAgICBvbjogKGV2ZW50LCBmdW5jKSA9PiBlZS5vbihldmVudCwgZnVuYyksXG4gICAgICAgIG9uY2U6IChldmVudCwgZnVuYykgPT4gZWUub25jZShldmVudCwgZnVuYyksXG4gICAgICAgIG9mZjogKGV2ZW50LCBmdW5jTmFtZSkgPT4gZWUub2ZmKGV2ZW50LCBmdW5jTmFtZSksXG4gICAgfSBhcyBBU01hbmFnZXI7XG59XG5cbigoZ2xvYmFsOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPikgPT4ge1xuICAgIGdsb2JhbC5BU0ZhY3RvciA9IEFTRmFjdG9yeTtcbn0pKFxuICAgIHR5cGVvZiBnbG9iYWxUaGlzID09PSBcIm9iamVjdFwiXG4gICAgICAgID8gKGdsb2JhbFRoaXMgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pXG4gICAgICAgIDoge30sXG4pO1xuXG5leHBvcnQge1xuICAgIEFTMl9CQVNFX0NPTlRFWFRfVVJMLFxuICAgIFBMQVRGT1JNX0NPTlRFWFRfUFJFRklYLFxuICAgIFNPQ0tFVEhVQl9CQVNFX0NPTlRFWFRfVVJMLFxufTtcblxuLyoqXG4gKiBCdWlsZCB0aGUgY2Fub25pY2FsIFNvY2tldGh1YiBAY29udGV4dCBhcnJheSBmb3IgYSBwbGF0Zm9ybSBuYW1lLlxuICovXG5leHBvcnQgZnVuY3Rpb24gYnVpbGRDYW5vbmljYWxDb250ZXh0KHBsYXRmb3JtOiBzdHJpbmcpOiBzdHJpbmdbXSB7XG4gICAgY29uc3QgcGxhdGZvcm1VcmwgPSBwbGF0Zm9ybS5zdGFydHNXaXRoKFwiaHR0cHM6Ly9cIilcbiAgICAgICAgPyBwbGF0Zm9ybVxuICAgICAgICA6IGAke1BMQVRGT1JNX0NPTlRFWFRfUFJFRklYfSR7cGxhdGZvcm19L3YxLmpzb25sZGA7XG4gICAgcmV0dXJuIFtBUzJfQkFTRV9DT05URVhUX1VSTCwgU09DS0VUSFVCX0JBU0VfQ09OVEVYVF9VUkwsIHBsYXRmb3JtVXJsXTtcbn1cblxuLyoqXG4gKiBFeHRyYWN0IHRoZSBwbGF0Zm9ybSBJRCBmcm9tIGEgY2Fub25pY2FsIEBjb250ZXh0IGFycmF5LlxuICogUmV0dXJucyB1bmRlZmluZWQgaWYgbm8gcGxhdGZvcm0gY29udGV4dCBVUkwgaXMgZm91bmQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwbGF0Zm9ybUlkRnJvbUNvbnRleHQoXG4gICAgY29udGV4dDogc3RyaW5nW10gfCB1bmtub3duLFxuKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICBpZiAoIUFycmF5LmlzQXJyYXkoY29udGV4dCkpIHtcbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG4gICAgZm9yIChjb25zdCBlbnRyeSBvZiBjb250ZXh0KSB7XG4gICAgICAgIGlmIChcbiAgICAgICAgICAgIHR5cGVvZiBlbnRyeSA9PT0gXCJzdHJpbmdcIiAmJlxuICAgICAgICAgICAgZW50cnkuc3RhcnRzV2l0aChQTEFURk9STV9DT05URVhUX1BSRUZJWClcbiAgICAgICAgKSB7XG4gICAgICAgICAgICBjb25zdCByZXN0ID0gZW50cnkuc2xpY2UoUExBVEZPUk1fQ09OVEVYVF9QUkVGSVgubGVuZ3RoKTtcbiAgICAgICAgICAgIGNvbnN0IHNsYXNoSWR4ID0gcmVzdC5pbmRleE9mKFwiL1wiKTtcbiAgICAgICAgICAgIGlmIChzbGFzaElkeCA+IDApIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gcmVzdC5zbGljZSgwLCBzbGFzaElkeCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbn1cbiIKICBdLAogICJtYXBwaW5ncyI6ICJvaUJBRUEsSUFBSSxFQUFNLE9BQU8sVUFBVSxlQUN2QixFQUFTLElBU2IsU0FBUyxDQUFNLEVBQUcsRUFTbEIsR0FBSSxPQUFPLFFBT1QsR0FOQSxFQUFPLFVBQVksT0FBTyxPQUFPLElBQUksRUFNakMsQ0FBQyxJQUFJLEVBQU8sRUFBRSxVQUFXLEVBQVMsR0FZeEMsU0FBUyxDQUFFLENBQUMsRUFBSSxFQUFTLEVBQU0sQ0FDN0IsS0FBSyxHQUFLLEVBQ1YsS0FBSyxRQUFVLEVBQ2YsS0FBSyxLQUFPLEdBQVEsR0FjdEIsU0FBUyxDQUFXLENBQUMsRUFBUyxFQUFPLEVBQUksRUFBUyxFQUFNLENBQ3RELEdBQUksT0FBTyxJQUFPLFdBQ2hCLE1BQVUsVUFBVSxpQ0FBaUMsRUFHdkQsSUFBSSxFQUFXLElBQUksRUFBRyxFQUFJLEdBQVcsRUFBUyxDQUFJLEVBQzlDLEVBQU0sRUFBUyxFQUFTLEVBQVEsRUFFcEMsR0FBSSxDQUFDLEVBQVEsUUFBUSxHQUFNLEVBQVEsUUFBUSxHQUFPLEVBQVUsRUFBUSxlQUMvRCxRQUFJLENBQUMsRUFBUSxRQUFRLEdBQUssR0FBSSxFQUFRLFFBQVEsR0FBSyxLQUFLLENBQVEsRUFDaEUsT0FBUSxRQUFRLEdBQU8sQ0FBQyxFQUFRLFFBQVEsR0FBTSxDQUFRLEVBRTNELE9BQU8sRUFVVCxTQUFTLENBQVUsQ0FBQyxFQUFTLEVBQUssQ0FDaEMsR0FBSSxFQUFFLEVBQVEsZUFBaUIsRUFBRyxFQUFRLFFBQVUsSUFBSSxF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TyxhQUFlLFNBQ2YsV0FDRCxDQUFDLENBQ1gsRUFXTyxTQUFTLEVBQXFCLENBQUMsRUFBNEIsQ0FDOUQsSUFBTSxFQUFjLEVBQVMsV0FBVyxVQUFVLEVBQzVDLEVBQ0EsR0FBRyxJQUEwQixjQUNuQyxNQUFPLENBQUMsRUFBc0IsRUFBNEIsQ0FBVyxFQU9sRSxTQUFTLEVBQXFCLENBQ2pDLEVBQ2tCLENBQ2xCLEdBQUksQ0FBQyxNQUFNLFFBQVEsQ0FBTyxFQUN0QixPQUVKLFFBQVcsS0FBUyxFQUNoQixHQUNJLE9BQU8sSUFBVSxVQUNqQixFQUFNLFdBQVcsQ0FBdUIsRUFDMUMsQ0FDRSxJQUFNLEVBQU8sRUFBTSxNQUFNLEVBQXdCLE1BQU0sRUFDakQsRUFBVyxFQUFLLFFBQVEsR0FBRyxFQUNqQyxHQUFJLEVBQVcsRUFDWCxPQUFPLEVBQUssTUFBTSxFQUFHLENBQVEsRUFJekMiLAogICJkZWJ1Z0lkIjogIkZGOEFCMzU0NDIxODQyMDU2NDc1NkUyMTY0NzU2RTIxIiwKICAibmFtZXMiOiBbXQp9
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@sockethub/activity-streams",
|
|
3
|
-
"version": "4.4.0-alpha.
|
|
3
|
+
"version": "4.4.0-alpha.12",
|
|
4
4
|
"description": "A simple tool to facilitate handling and referencing activity streams without unnecessary verbosity",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "./dist/activity-streams.js",
|
|
@@ -43,16 +43,17 @@
|
|
|
43
43
|
"build:js": "bun build ./src/activity-streams.ts --target=browser --sourcemap=inline --format=esm --outdir=dist/",
|
|
44
44
|
"build:minify": "bun build ./src/activity-streams.ts --target=browser --sourcemap=inline --format=esm --outfile=dist/activity-streams.min.js --minify",
|
|
45
45
|
"clean": "rm -rf dist",
|
|
46
|
+
"clean:deps": "rm -rf node_modules",
|
|
46
47
|
"test:browser": "wtr dist/**/*.test.js --node-resolve --puppeteer"
|
|
47
48
|
},
|
|
48
49
|
"dependencies": {
|
|
50
|
+
"@sockethub/schemas": "^3.0.0-alpha.12",
|
|
49
51
|
"eventemitter3": "^5.0.4"
|
|
50
52
|
},
|
|
51
53
|
"devDependencies": {
|
|
52
|
-
"@sockethub/schemas": "^3.0.0-alpha.10",
|
|
53
54
|
"@types/bun": "latest",
|
|
54
55
|
"@web/test-runner": "^0.19.0",
|
|
55
56
|
"@web/test-runner-puppeteer": "^0.17.0"
|
|
56
57
|
},
|
|
57
|
-
"gitHead": "
|
|
58
|
+
"gitHead": "f039dab3c3f67cbbf204476fc397532e973f82a8"
|
|
58
59
|
}
|
|
@@ -2,6 +2,12 @@ import { beforeEach, describe, expect, test } from "bun:test";
|
|
|
2
2
|
import type { ActivityStream } from "@sockethub/schemas";
|
|
3
3
|
import { ASFactory } from "./activity-streams";
|
|
4
4
|
|
|
5
|
+
const IRC_CONTEXT = [
|
|
6
|
+
"https://www.w3.org/ns/activitystreams",
|
|
7
|
+
"https://sockethub.org/ns/context/v1.jsonld",
|
|
8
|
+
"https://sockethub.org/ns/context/platform/irc/v1.jsonld",
|
|
9
|
+
];
|
|
10
|
+
|
|
5
11
|
describe("warn test", () => {
|
|
6
12
|
expect(typeof ASFactory).toEqual("function");
|
|
7
13
|
const activity = ASFactory();
|
|
@@ -9,7 +15,7 @@ describe("warn test", () => {
|
|
|
9
15
|
expect(() => {
|
|
10
16
|
activity.Stream({
|
|
11
17
|
type: "lol",
|
|
12
|
-
|
|
18
|
+
"@context": IRC_CONTEXT,
|
|
13
19
|
actor: "thingy",
|
|
14
20
|
object: { type: "hola", content: "har", secure: true },
|
|
15
21
|
target: ["thingy1", "thingy2"],
|
|
@@ -28,14 +34,14 @@ describe("no special props", () => {
|
|
|
28
34
|
expect(
|
|
29
35
|
activity.Stream({
|
|
30
36
|
type: "send",
|
|
31
|
-
context:
|
|
37
|
+
"@context": IRC_CONTEXT,
|
|
32
38
|
actor: "thingy",
|
|
33
39
|
object: { type: "hola", content: "har" },
|
|
34
40
|
target: ["thingy1", "thingy2"],
|
|
35
41
|
}),
|
|
36
42
|
).toEqual({
|
|
37
43
|
type: "send",
|
|
38
|
-
context:
|
|
44
|
+
"@context": IRC_CONTEXT,
|
|
39
45
|
actor: { id: "thingy" },
|
|
40
46
|
object: { type: "hola", content: "har" },
|
|
41
47
|
target: ["thingy1", "thingy2"],
|
|
@@ -115,24 +121,16 @@ describe("basic tests", () => {
|
|
|
115
121
|
});
|
|
116
122
|
});
|
|
117
123
|
|
|
118
|
-
interface TestActivityStream extends ActivityStream {
|
|
119
|
-
type: string;
|
|
120
|
-
verb?: string;
|
|
121
|
-
context: string;
|
|
122
|
-
platform?: string;
|
|
123
|
-
}
|
|
124
|
-
|
|
125
124
|
describe("stream tests", () => {
|
|
126
|
-
let stream:
|
|
125
|
+
let stream: ActivityStream;
|
|
127
126
|
|
|
128
127
|
beforeEach(() => {
|
|
129
128
|
stream = activity.Stream({
|
|
130
|
-
|
|
131
|
-
platform: "irc",
|
|
129
|
+
type: "lol",
|
|
132
130
|
actor: "thingy1",
|
|
133
|
-
context:
|
|
131
|
+
"@context": IRC_CONTEXT,
|
|
134
132
|
object: {
|
|
135
|
-
|
|
133
|
+
type: "credentials",
|
|
136
134
|
content: "har",
|
|
137
135
|
secure: true,
|
|
138
136
|
},
|
|
@@ -140,11 +138,9 @@ describe("basic tests", () => {
|
|
|
140
138
|
}) as ActivityStream;
|
|
141
139
|
});
|
|
142
140
|
|
|
143
|
-
test("
|
|
141
|
+
test("keeps canonical stream props", () => {
|
|
144
142
|
expect(stream.type).toEqual("lol");
|
|
145
|
-
expect(stream
|
|
146
|
-
expect(stream.context).toEqual("irc");
|
|
147
|
-
expect(stream.platform).toBeUndefined();
|
|
143
|
+
expect(stream["@context"]).toEqual(IRC_CONTEXT);
|
|
148
144
|
});
|
|
149
145
|
|
|
150
146
|
test("expands existing objects", () => {
|
|
@@ -163,13 +159,12 @@ describe("basic tests", () => {
|
|
|
163
159
|
content: "har",
|
|
164
160
|
secure: true,
|
|
165
161
|
});
|
|
166
|
-
expect(stream.object.objectType).toBeUndefined();
|
|
167
162
|
});
|
|
168
163
|
|
|
169
164
|
test("respects specialObj properties", () => {
|
|
170
165
|
const stream2 = activity.Stream({
|
|
171
166
|
type: "lol",
|
|
172
|
-
|
|
167
|
+
"@context": IRC_CONTEXT,
|
|
173
168
|
actor: "thingy",
|
|
174
169
|
object: {
|
|
175
170
|
type: "dude",
|
|
@@ -181,7 +176,7 @@ describe("basic tests", () => {
|
|
|
181
176
|
});
|
|
182
177
|
expect(stream2).toEqual({
|
|
183
178
|
type: "lol",
|
|
184
|
-
context:
|
|
179
|
+
"@context": IRC_CONTEXT,
|
|
185
180
|
actor: { id: "thingy" },
|
|
186
181
|
target: [{ id: "thingy1" }, { id: "thingy2" }],
|
|
187
182
|
object: {
|
|
@@ -197,7 +192,7 @@ describe("basic tests", () => {
|
|
|
197
192
|
expect(() => {
|
|
198
193
|
activity.Stream({
|
|
199
194
|
type: "lol",
|
|
200
|
-
|
|
195
|
+
"@context": IRC_CONTEXT,
|
|
201
196
|
actor: "thingy",
|
|
202
197
|
object: {
|
|
203
198
|
type: "hola",
|
package/src/activity-streams.ts
CHANGED
|
@@ -16,18 +16,23 @@
|
|
|
16
16
|
*/
|
|
17
17
|
|
|
18
18
|
import type { ActivityObject, ActivityStream } from "@sockethub/schemas";
|
|
19
|
+
import {
|
|
20
|
+
AS2_BASE_CONTEXT_URL,
|
|
21
|
+
PLATFORM_CONTEXT_PREFIX,
|
|
22
|
+
SOCKETHUB_BASE_CONTEXT_URL,
|
|
23
|
+
} from "@sockethub/schemas/context";
|
|
19
24
|
import EventEmitter from "eventemitter3";
|
|
20
25
|
|
|
21
26
|
const ee = new EventEmitter();
|
|
22
27
|
const baseProps = {
|
|
23
28
|
stream: [
|
|
29
|
+
"@context",
|
|
24
30
|
"id",
|
|
25
31
|
"type",
|
|
32
|
+
"platform",
|
|
26
33
|
"actor",
|
|
27
34
|
"target",
|
|
28
35
|
"object",
|
|
29
|
-
"context",
|
|
30
|
-
"context",
|
|
31
36
|
"published",
|
|
32
37
|
"error",
|
|
33
38
|
],
|
|
@@ -86,15 +91,7 @@ const baseProps = {
|
|
|
86
91
|
"url",
|
|
87
92
|
"xmpp:stanza-id",
|
|
88
93
|
],
|
|
89
|
-
};
|
|
90
|
-
const rename = {
|
|
91
|
-
"@id": "id",
|
|
92
|
-
"@type": "type",
|
|
93
|
-
verb: "type",
|
|
94
|
-
displayName: "name",
|
|
95
|
-
objectType: "type",
|
|
96
|
-
platform: "context",
|
|
97
|
-
};
|
|
94
|
+
} as const;
|
|
98
95
|
const expand = {
|
|
99
96
|
actor: {
|
|
100
97
|
primary: "id",
|
|
@@ -108,36 +105,29 @@ const expand = {
|
|
|
108
105
|
primary: "content",
|
|
109
106
|
props: baseProps,
|
|
110
107
|
},
|
|
111
|
-
};
|
|
108
|
+
} as const;
|
|
112
109
|
|
|
113
|
-
type CustomProps =
|
|
114
|
-
[key: string]: string | number | boolean | object | string[];
|
|
115
|
-
};
|
|
110
|
+
type CustomProps = Record<string, string[]>;
|
|
116
111
|
|
|
117
|
-
|
|
112
|
+
type BasePropKey = keyof typeof baseProps;
|
|
113
|
+
|
|
114
|
+
const objs = new Map<string, ActivityObject>();
|
|
118
115
|
const customProps: CustomProps = {};
|
|
119
116
|
|
|
120
117
|
let failOnUnknownObjectProperties = false;
|
|
121
118
|
let warnOnUnknownObjectProperties = true;
|
|
122
|
-
let specialObjs = []; // the objects don't get rejected for bad props
|
|
119
|
+
let specialObjs: string[] = []; // the objects don't get rejected for bad props
|
|
123
120
|
|
|
124
121
|
function matchesCustomProp(type: string, key: string) {
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
if (obj.includes(key)) {
|
|
128
|
-
return true;
|
|
129
|
-
}
|
|
130
|
-
}
|
|
131
|
-
return false;
|
|
132
|
-
}
|
|
133
|
-
|
|
134
|
-
function renameProp<T>(obj: T, key: string): T {
|
|
135
|
-
obj[rename[key]] = obj[key];
|
|
136
|
-
delete obj[key];
|
|
137
|
-
return obj;
|
|
122
|
+
const props = customProps[type];
|
|
123
|
+
return Array.isArray(props) && props.includes(key);
|
|
138
124
|
}
|
|
139
125
|
|
|
140
|
-
function validateObject
|
|
126
|
+
function validateObject(
|
|
127
|
+
type: BasePropKey,
|
|
128
|
+
incomingObj: unknown,
|
|
129
|
+
requireId = false,
|
|
130
|
+
) {
|
|
141
131
|
// Input validation with clear error messages
|
|
142
132
|
if (incomingObj === null) {
|
|
143
133
|
throw new Error(
|
|
@@ -175,20 +165,16 @@ function validateObject<T>(type: string, incomingObj: T, requireId = false) {
|
|
|
175
165
|
);
|
|
176
166
|
}
|
|
177
167
|
|
|
178
|
-
const
|
|
168
|
+
const incomingRecord = incomingObj as Record<string, unknown>;
|
|
169
|
+
const allowedProps = baseProps[type] as readonly string[];
|
|
170
|
+
const unknownKeys = Object.keys(incomingRecord).filter(
|
|
179
171
|
(key: string): boolean => {
|
|
180
|
-
return !
|
|
172
|
+
return !allowedProps.includes(key);
|
|
181
173
|
},
|
|
182
174
|
);
|
|
183
175
|
|
|
184
176
|
for (const key of unknownKeys) {
|
|
185
|
-
|
|
186
|
-
if (rename[key]) {
|
|
187
|
-
// rename property instead of fail
|
|
188
|
-
ao = renameProp(ao, key);
|
|
189
|
-
continue;
|
|
190
|
-
}
|
|
191
|
-
|
|
177
|
+
const ao = incomingObj as ActivityObject;
|
|
192
178
|
if (matchesCustomProp(ao.type, key)) {
|
|
193
179
|
// custom property matches, continue
|
|
194
180
|
continue;
|
|
@@ -218,51 +204,53 @@ function ensureProps(obj: ActivityObject): ActivityObject {
|
|
|
218
204
|
}
|
|
219
205
|
|
|
220
206
|
function expandStream(meta: ActivityStream) {
|
|
221
|
-
const stream = {};
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
stream[key] =
|
|
227
|
-
|
|
207
|
+
const stream: Record<string, unknown> = {};
|
|
208
|
+
const metaRecord = meta as unknown as Record<string, unknown>;
|
|
209
|
+
for (const key of Object.keys(metaRecord)) {
|
|
210
|
+
const value = metaRecord[key];
|
|
211
|
+
if (typeof value === "string") {
|
|
212
|
+
stream[key] = objs.get(value) || value;
|
|
213
|
+
} else if (Array.isArray(value)) {
|
|
214
|
+
const expanded: Array<ActivityObject | string> = [];
|
|
215
|
+
for (const entry of value) {
|
|
228
216
|
if (typeof entry === "string") {
|
|
229
|
-
|
|
217
|
+
expanded.push(objs.get(entry) || entry);
|
|
230
218
|
}
|
|
231
219
|
}
|
|
220
|
+
stream[key] = expanded;
|
|
232
221
|
} else {
|
|
233
|
-
stream[key] =
|
|
222
|
+
stream[key] = value;
|
|
234
223
|
}
|
|
235
224
|
}
|
|
236
225
|
|
|
237
226
|
// only expand string into objects if they are in the expand list
|
|
238
|
-
for (const key of Object.keys(expand)) {
|
|
239
|
-
|
|
227
|
+
for (const key of Object.keys(expand) as Array<keyof typeof expand>) {
|
|
228
|
+
const value = stream[key];
|
|
229
|
+
if (typeof value === "string") {
|
|
240
230
|
const idx = expand[key].primary;
|
|
241
|
-
|
|
242
|
-
obj[idx] = stream[key];
|
|
243
|
-
stream[key] = obj;
|
|
231
|
+
stream[key] = { [idx]: value };
|
|
244
232
|
}
|
|
245
233
|
}
|
|
246
|
-
return stream;
|
|
234
|
+
return stream as unknown as ActivityStream;
|
|
247
235
|
}
|
|
248
236
|
|
|
249
237
|
function Stream(
|
|
250
|
-
meta:
|
|
238
|
+
meta: unknown,
|
|
251
239
|
): ActivityStream | ActivityObject | Record<string, never> {
|
|
252
240
|
validateObject("stream", meta);
|
|
253
|
-
if (typeof meta.object === "object") {
|
|
254
|
-
validateObject("object", meta.object);
|
|
241
|
+
if (typeof (meta as ActivityStream).object === "object") {
|
|
242
|
+
validateObject("object", (meta as ActivityStream).object);
|
|
255
243
|
}
|
|
256
|
-
const stream = expandStream(meta);
|
|
244
|
+
const stream = expandStream(meta as ActivityStream);
|
|
257
245
|
ee.emit("activity-stream", stream);
|
|
258
246
|
return stream;
|
|
259
247
|
}
|
|
260
248
|
|
|
261
249
|
export interface ActivityObjectManager {
|
|
262
|
-
create(obj:
|
|
250
|
+
create(obj: ActivityObject): ActivityObject;
|
|
263
251
|
delete(id: string): boolean;
|
|
264
|
-
list(): IterableIterator<
|
|
265
|
-
get(id: string, expand?: boolean):
|
|
252
|
+
list(): IterableIterator<string>;
|
|
253
|
+
get(id: string, expand?: boolean): ActivityObject | string;
|
|
266
254
|
}
|
|
267
255
|
|
|
268
256
|
const _Object: ActivityObjectManager = {
|
|
@@ -288,12 +276,12 @@ const _Object: ActivityObjectManager = {
|
|
|
288
276
|
if (!expand) {
|
|
289
277
|
return id;
|
|
290
278
|
}
|
|
291
|
-
obj = { id: id };
|
|
279
|
+
obj = { id: id } as ActivityObject;
|
|
292
280
|
}
|
|
293
281
|
return ensureProps(obj);
|
|
294
282
|
},
|
|
295
283
|
|
|
296
|
-
list: (): IterableIterator<
|
|
284
|
+
list: (): IterableIterator<string> => objs.keys(),
|
|
297
285
|
};
|
|
298
286
|
|
|
299
287
|
export interface ASFactoryOptions {
|
|
@@ -306,7 +294,7 @@ export interface ASFactoryOptions {
|
|
|
306
294
|
type EventCallback = (...args: unknown[]) => void;
|
|
307
295
|
|
|
308
296
|
export interface ASManager {
|
|
309
|
-
Stream(meta: unknown): ActivityStream | ActivityObject;
|
|
297
|
+
Stream(meta: ActivityStream | unknown): ActivityStream | ActivityObject;
|
|
310
298
|
Object: ActivityObjectManager;
|
|
311
299
|
on(event: string, func: EventCallback): void;
|
|
312
300
|
once(event: string, func: EventCallback): void;
|
|
@@ -323,10 +311,9 @@ export function ASFactory(opts: ASFactoryOptions = {}): ASManager {
|
|
|
323
311
|
typeof opts.warnOnUnknownObjectProperties === "boolean"
|
|
324
312
|
? opts.warnOnUnknownObjectProperties
|
|
325
313
|
: warnOnUnknownObjectProperties;
|
|
326
|
-
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
}
|
|
314
|
+
const customPropsConfig = opts.customProps || {};
|
|
315
|
+
for (const propName of Object.keys(customPropsConfig)) {
|
|
316
|
+
customProps[propName] = customPropsConfig[propName];
|
|
330
317
|
}
|
|
331
318
|
|
|
332
319
|
return {
|
|
@@ -338,7 +325,51 @@ export function ASFactory(opts: ASFactoryOptions = {}): ASManager {
|
|
|
338
325
|
} as ASManager;
|
|
339
326
|
}
|
|
340
327
|
|
|
341
|
-
|
|
342
|
-
((global: any) => {
|
|
328
|
+
((global: Record<string, unknown>) => {
|
|
343
329
|
global.ASFactor = ASFactory;
|
|
344
|
-
})(
|
|
330
|
+
})(
|
|
331
|
+
typeof globalThis === "object"
|
|
332
|
+
? (globalThis as Record<string, unknown>)
|
|
333
|
+
: {},
|
|
334
|
+
);
|
|
335
|
+
|
|
336
|
+
export {
|
|
337
|
+
AS2_BASE_CONTEXT_URL,
|
|
338
|
+
PLATFORM_CONTEXT_PREFIX,
|
|
339
|
+
SOCKETHUB_BASE_CONTEXT_URL,
|
|
340
|
+
};
|
|
341
|
+
|
|
342
|
+
/**
|
|
343
|
+
* Build the canonical Sockethub @context array for a platform name.
|
|
344
|
+
*/
|
|
345
|
+
export function buildCanonicalContext(platform: string): string[] {
|
|
346
|
+
const platformUrl = platform.startsWith("https://")
|
|
347
|
+
? platform
|
|
348
|
+
: `${PLATFORM_CONTEXT_PREFIX}${platform}/v1.jsonld`;
|
|
349
|
+
return [AS2_BASE_CONTEXT_URL, SOCKETHUB_BASE_CONTEXT_URL, platformUrl];
|
|
350
|
+
}
|
|
351
|
+
|
|
352
|
+
/**
|
|
353
|
+
* Extract the platform ID from a canonical @context array.
|
|
354
|
+
* Returns undefined if no platform context URL is found.
|
|
355
|
+
*/
|
|
356
|
+
export function platformIdFromContext(
|
|
357
|
+
context: string[] | unknown,
|
|
358
|
+
): string | undefined {
|
|
359
|
+
if (!Array.isArray(context)) {
|
|
360
|
+
return undefined;
|
|
361
|
+
}
|
|
362
|
+
for (const entry of context) {
|
|
363
|
+
if (
|
|
364
|
+
typeof entry === "string" &&
|
|
365
|
+
entry.startsWith(PLATFORM_CONTEXT_PREFIX)
|
|
366
|
+
) {
|
|
367
|
+
const rest = entry.slice(PLATFORM_CONTEXT_PREFIX.length);
|
|
368
|
+
const slashIdx = rest.indexOf("/");
|
|
369
|
+
if (slashIdx > 0) {
|
|
370
|
+
return rest.slice(0, slashIdx);
|
|
371
|
+
}
|
|
372
|
+
}
|
|
373
|
+
}
|
|
374
|
+
return undefined;
|
|
375
|
+
}
|