@sockethub/activity-streams 4.4.0-alpha.4 → 4.4.0-alpha.5
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 +109 -9
- package/dist/activity-streams.js +462 -0
- package/dist/activity-streams.min.js +19 -2
- package/package.json +27 -31
- package/coverage/tmp/coverage-39176-1663949475687-0.json +0 -1
- package/dist/activity-streams.min.js.LICENSE.txt +0 -16
- package/karma.config.js +0 -22
- package/src/activity-streams.d.ts +0 -1
- package/src/activity-streams.js +0 -224
- package/src/activity-streams.test.js +0 -192
- package/webpack.config.js +0 -10
|
@@ -0,0 +1,462 @@
|
|
|
1
|
+
var __create = Object.create;
|
|
2
|
+
var __getProtoOf = Object.getPrototypeOf;
|
|
3
|
+
var __defProp = Object.defineProperty;
|
|
4
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
5
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
6
|
+
var __toESM = (mod, isNodeMode, target) => {
|
|
7
|
+
target = mod != null ? __create(__getProtoOf(mod)) : {};
|
|
8
|
+
const to = isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target;
|
|
9
|
+
for (let key of __getOwnPropNames(mod))
|
|
10
|
+
if (!__hasOwnProp.call(to, key))
|
|
11
|
+
__defProp(to, key, {
|
|
12
|
+
get: () => mod[key],
|
|
13
|
+
enumerable: true
|
|
14
|
+
});
|
|
15
|
+
return to;
|
|
16
|
+
};
|
|
17
|
+
var __commonJS = (cb, mod) => () => (mod || cb((mod = { exports: {} }).exports, mod), mod.exports);
|
|
18
|
+
|
|
19
|
+
// ../../node_modules/eventemitter3/index.js
|
|
20
|
+
var require_eventemitter3 = __commonJS((exports, module) => {
|
|
21
|
+
var has = Object.prototype.hasOwnProperty;
|
|
22
|
+
var prefix = "~";
|
|
23
|
+
function Events() {}
|
|
24
|
+
if (Object.create) {
|
|
25
|
+
Events.prototype = Object.create(null);
|
|
26
|
+
if (!new Events().__proto__)
|
|
27
|
+
prefix = false;
|
|
28
|
+
}
|
|
29
|
+
function EE(fn, context, once) {
|
|
30
|
+
this.fn = fn;
|
|
31
|
+
this.context = context;
|
|
32
|
+
this.once = once || false;
|
|
33
|
+
}
|
|
34
|
+
function addListener(emitter, event, fn, context, once) {
|
|
35
|
+
if (typeof fn !== "function") {
|
|
36
|
+
throw new TypeError("The listener must be a function");
|
|
37
|
+
}
|
|
38
|
+
var listener = new EE(fn, context || emitter, once), evt = prefix ? prefix + event : event;
|
|
39
|
+
if (!emitter._events[evt])
|
|
40
|
+
emitter._events[evt] = listener, emitter._eventsCount++;
|
|
41
|
+
else if (!emitter._events[evt].fn)
|
|
42
|
+
emitter._events[evt].push(listener);
|
|
43
|
+
else
|
|
44
|
+
emitter._events[evt] = [emitter._events[evt], listener];
|
|
45
|
+
return emitter;
|
|
46
|
+
}
|
|
47
|
+
function clearEvent(emitter, evt) {
|
|
48
|
+
if (--emitter._eventsCount === 0)
|
|
49
|
+
emitter._events = new Events;
|
|
50
|
+
else
|
|
51
|
+
delete emitter._events[evt];
|
|
52
|
+
}
|
|
53
|
+
function EventEmitter() {
|
|
54
|
+
this._events = new Events;
|
|
55
|
+
this._eventsCount = 0;
|
|
56
|
+
}
|
|
57
|
+
EventEmitter.prototype.eventNames = function eventNames() {
|
|
58
|
+
var names = [], events, name;
|
|
59
|
+
if (this._eventsCount === 0)
|
|
60
|
+
return names;
|
|
61
|
+
for (name in events = this._events) {
|
|
62
|
+
if (has.call(events, name))
|
|
63
|
+
names.push(prefix ? name.slice(1) : name);
|
|
64
|
+
}
|
|
65
|
+
if (Object.getOwnPropertySymbols) {
|
|
66
|
+
return names.concat(Object.getOwnPropertySymbols(events));
|
|
67
|
+
}
|
|
68
|
+
return names;
|
|
69
|
+
};
|
|
70
|
+
EventEmitter.prototype.listeners = function listeners(event) {
|
|
71
|
+
var evt = prefix ? prefix + event : event, handlers = this._events[evt];
|
|
72
|
+
if (!handlers)
|
|
73
|
+
return [];
|
|
74
|
+
if (handlers.fn)
|
|
75
|
+
return [handlers.fn];
|
|
76
|
+
for (var i = 0, l = handlers.length, ee = new Array(l);i < l; i++) {
|
|
77
|
+
ee[i] = handlers[i].fn;
|
|
78
|
+
}
|
|
79
|
+
return ee;
|
|
80
|
+
};
|
|
81
|
+
EventEmitter.prototype.listenerCount = function listenerCount(event) {
|
|
82
|
+
var evt = prefix ? prefix + event : event, listeners = this._events[evt];
|
|
83
|
+
if (!listeners)
|
|
84
|
+
return 0;
|
|
85
|
+
if (listeners.fn)
|
|
86
|
+
return 1;
|
|
87
|
+
return listeners.length;
|
|
88
|
+
};
|
|
89
|
+
EventEmitter.prototype.emit = function emit(event, a1, a2, a3, a4, a5) {
|
|
90
|
+
var evt = prefix ? prefix + event : event;
|
|
91
|
+
if (!this._events[evt])
|
|
92
|
+
return false;
|
|
93
|
+
var listeners = this._events[evt], len = arguments.length, args, i;
|
|
94
|
+
if (listeners.fn) {
|
|
95
|
+
if (listeners.once)
|
|
96
|
+
this.removeListener(event, listeners.fn, undefined, true);
|
|
97
|
+
switch (len) {
|
|
98
|
+
case 1:
|
|
99
|
+
return listeners.fn.call(listeners.context), true;
|
|
100
|
+
case 2:
|
|
101
|
+
return listeners.fn.call(listeners.context, a1), true;
|
|
102
|
+
case 3:
|
|
103
|
+
return listeners.fn.call(listeners.context, a1, a2), true;
|
|
104
|
+
case 4:
|
|
105
|
+
return listeners.fn.call(listeners.context, a1, a2, a3), true;
|
|
106
|
+
case 5:
|
|
107
|
+
return listeners.fn.call(listeners.context, a1, a2, a3, a4), true;
|
|
108
|
+
case 6:
|
|
109
|
+
return listeners.fn.call(listeners.context, a1, a2, a3, a4, a5), true;
|
|
110
|
+
}
|
|
111
|
+
for (i = 1, args = new Array(len - 1);i < len; i++) {
|
|
112
|
+
args[i - 1] = arguments[i];
|
|
113
|
+
}
|
|
114
|
+
listeners.fn.apply(listeners.context, args);
|
|
115
|
+
} else {
|
|
116
|
+
var length = listeners.length, j;
|
|
117
|
+
for (i = 0;i < length; i++) {
|
|
118
|
+
if (listeners[i].once)
|
|
119
|
+
this.removeListener(event, listeners[i].fn, undefined, true);
|
|
120
|
+
switch (len) {
|
|
121
|
+
case 1:
|
|
122
|
+
listeners[i].fn.call(listeners[i].context);
|
|
123
|
+
break;
|
|
124
|
+
case 2:
|
|
125
|
+
listeners[i].fn.call(listeners[i].context, a1);
|
|
126
|
+
break;
|
|
127
|
+
case 3:
|
|
128
|
+
listeners[i].fn.call(listeners[i].context, a1, a2);
|
|
129
|
+
break;
|
|
130
|
+
case 4:
|
|
131
|
+
listeners[i].fn.call(listeners[i].context, a1, a2, a3);
|
|
132
|
+
break;
|
|
133
|
+
default:
|
|
134
|
+
if (!args)
|
|
135
|
+
for (j = 1, args = new Array(len - 1);j < len; j++) {
|
|
136
|
+
args[j - 1] = arguments[j];
|
|
137
|
+
}
|
|
138
|
+
listeners[i].fn.apply(listeners[i].context, args);
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
return true;
|
|
143
|
+
};
|
|
144
|
+
EventEmitter.prototype.on = function on(event, fn, context) {
|
|
145
|
+
return addListener(this, event, fn, context, false);
|
|
146
|
+
};
|
|
147
|
+
EventEmitter.prototype.once = function once(event, fn, context) {
|
|
148
|
+
return addListener(this, event, fn, context, true);
|
|
149
|
+
};
|
|
150
|
+
EventEmitter.prototype.removeListener = function removeListener(event, fn, context, once) {
|
|
151
|
+
var evt = prefix ? prefix + event : event;
|
|
152
|
+
if (!this._events[evt])
|
|
153
|
+
return this;
|
|
154
|
+
if (!fn) {
|
|
155
|
+
clearEvent(this, evt);
|
|
156
|
+
return this;
|
|
157
|
+
}
|
|
158
|
+
var listeners = this._events[evt];
|
|
159
|
+
if (listeners.fn) {
|
|
160
|
+
if (listeners.fn === fn && (!once || listeners.once) && (!context || listeners.context === context)) {
|
|
161
|
+
clearEvent(this, evt);
|
|
162
|
+
}
|
|
163
|
+
} else {
|
|
164
|
+
for (var i = 0, events = [], length = listeners.length;i < length; i++) {
|
|
165
|
+
if (listeners[i].fn !== fn || once && !listeners[i].once || context && listeners[i].context !== context) {
|
|
166
|
+
events.push(listeners[i]);
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
if (events.length)
|
|
170
|
+
this._events[evt] = events.length === 1 ? events[0] : events;
|
|
171
|
+
else
|
|
172
|
+
clearEvent(this, evt);
|
|
173
|
+
}
|
|
174
|
+
return this;
|
|
175
|
+
};
|
|
176
|
+
EventEmitter.prototype.removeAllListeners = function removeAllListeners(event) {
|
|
177
|
+
var evt;
|
|
178
|
+
if (event) {
|
|
179
|
+
evt = prefix ? prefix + event : event;
|
|
180
|
+
if (this._events[evt])
|
|
181
|
+
clearEvent(this, evt);
|
|
182
|
+
} else {
|
|
183
|
+
this._events = new Events;
|
|
184
|
+
this._eventsCount = 0;
|
|
185
|
+
}
|
|
186
|
+
return this;
|
|
187
|
+
};
|
|
188
|
+
EventEmitter.prototype.off = EventEmitter.prototype.removeListener;
|
|
189
|
+
EventEmitter.prototype.addListener = EventEmitter.prototype.on;
|
|
190
|
+
EventEmitter.prefixed = prefix;
|
|
191
|
+
EventEmitter.EventEmitter = EventEmitter;
|
|
192
|
+
if (typeof module !== "undefined") {
|
|
193
|
+
module.exports = EventEmitter;
|
|
194
|
+
}
|
|
195
|
+
});
|
|
196
|
+
|
|
197
|
+
// ../../node_modules/eventemitter3/index.mjs
|
|
198
|
+
var import__ = __toESM(require_eventemitter3(), 1);
|
|
199
|
+
var eventemitter3_default = import__.default;
|
|
200
|
+
|
|
201
|
+
// src/activity-streams.ts
|
|
202
|
+
/*!
|
|
203
|
+
* activity-streams
|
|
204
|
+
* https://github.com/silverbucket/activity-streams
|
|
205
|
+
*
|
|
206
|
+
* Developed and Maintained by:
|
|
207
|
+
* Nick Jennings <nick@silverbucket.net>
|
|
208
|
+
*
|
|
209
|
+
* activity-streams is released under the MIT (see LICENSE).
|
|
210
|
+
*
|
|
211
|
+
* You don't have to do anything special to choose one license or the other
|
|
212
|
+
* and you don't have to notify anyone which license you are using.
|
|
213
|
+
* Please see the corresponding license file for details of these licenses.
|
|
214
|
+
* You are free to use, modify and distribute this software, but all copyright
|
|
215
|
+
* information must remain.
|
|
216
|
+
*
|
|
217
|
+
*/
|
|
218
|
+
var ee = new eventemitter3_default;
|
|
219
|
+
var baseProps = {
|
|
220
|
+
stream: [
|
|
221
|
+
"id",
|
|
222
|
+
"type",
|
|
223
|
+
"actor",
|
|
224
|
+
"target",
|
|
225
|
+
"object",
|
|
226
|
+
"context",
|
|
227
|
+
"context",
|
|
228
|
+
"published",
|
|
229
|
+
"error"
|
|
230
|
+
],
|
|
231
|
+
object: [
|
|
232
|
+
"id",
|
|
233
|
+
"type",
|
|
234
|
+
"context",
|
|
235
|
+
"alias",
|
|
236
|
+
"attachedTo",
|
|
237
|
+
"attachment",
|
|
238
|
+
"attributedTo",
|
|
239
|
+
"attributedWith",
|
|
240
|
+
"condition",
|
|
241
|
+
"content",
|
|
242
|
+
"contentMap",
|
|
243
|
+
"context",
|
|
244
|
+
"contextOf",
|
|
245
|
+
"name",
|
|
246
|
+
"endTime",
|
|
247
|
+
"generator",
|
|
248
|
+
"generatorOf",
|
|
249
|
+
"group",
|
|
250
|
+
"icon",
|
|
251
|
+
"image",
|
|
252
|
+
"inReplyTo",
|
|
253
|
+
"members",
|
|
254
|
+
"memberOf",
|
|
255
|
+
"message",
|
|
256
|
+
"location",
|
|
257
|
+
"locationOf",
|
|
258
|
+
"objectOf",
|
|
259
|
+
"originOf",
|
|
260
|
+
"presence",
|
|
261
|
+
"preview",
|
|
262
|
+
"previewOf",
|
|
263
|
+
"provider",
|
|
264
|
+
"providerOf",
|
|
265
|
+
"published",
|
|
266
|
+
"rating",
|
|
267
|
+
"relationship",
|
|
268
|
+
"resultOf",
|
|
269
|
+
"replies",
|
|
270
|
+
"role",
|
|
271
|
+
"scope",
|
|
272
|
+
"scopeOf",
|
|
273
|
+
"startTime",
|
|
274
|
+
"status",
|
|
275
|
+
"summary",
|
|
276
|
+
"topic",
|
|
277
|
+
"tag",
|
|
278
|
+
"tagOf",
|
|
279
|
+
"targetOf",
|
|
280
|
+
"title",
|
|
281
|
+
"titleMap",
|
|
282
|
+
"updated",
|
|
283
|
+
"url",
|
|
284
|
+
"xmpp:stanza-id"
|
|
285
|
+
]
|
|
286
|
+
};
|
|
287
|
+
var rename = {
|
|
288
|
+
"@id": "id",
|
|
289
|
+
"@type": "type",
|
|
290
|
+
verb: "type",
|
|
291
|
+
displayName: "name",
|
|
292
|
+
objectType: "type",
|
|
293
|
+
platform: "context"
|
|
294
|
+
};
|
|
295
|
+
var expand = {
|
|
296
|
+
actor: {
|
|
297
|
+
primary: "id",
|
|
298
|
+
props: baseProps
|
|
299
|
+
},
|
|
300
|
+
target: {
|
|
301
|
+
primary: "id",
|
|
302
|
+
props: baseProps
|
|
303
|
+
},
|
|
304
|
+
object: {
|
|
305
|
+
primary: "content",
|
|
306
|
+
props: baseProps
|
|
307
|
+
}
|
|
308
|
+
};
|
|
309
|
+
var objs = new Map;
|
|
310
|
+
var customProps = {};
|
|
311
|
+
var failOnUnknownObjectProperties = false;
|
|
312
|
+
var warnOnUnknownObjectProperties = true;
|
|
313
|
+
var specialObjs = [];
|
|
314
|
+
function matchesCustomProp(type, key) {
|
|
315
|
+
if (customProps[type] instanceof Object) {
|
|
316
|
+
const obj = customProps[type];
|
|
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;
|
|
327
|
+
}
|
|
328
|
+
function validateObject(type, incomingObj, requireId = false) {
|
|
329
|
+
if (incomingObj === null) {
|
|
330
|
+
throw new Error(`ActivityStreams validation failed: the "${type}" property is null. Example: { id: "user@example.com", type: "person" }`);
|
|
331
|
+
}
|
|
332
|
+
if (incomingObj === undefined) {
|
|
333
|
+
throw new Error(`ActivityStreams validation failed: the "${type}" property is undefined. Example: { id: "user@example.com", type: "person" }`);
|
|
334
|
+
}
|
|
335
|
+
if (typeof incomingObj === "string") {
|
|
336
|
+
throw new Error(`ActivityStreams validation failed: the "${type}" property received string "${incomingObj}" but expected an object. Use: { id: "${incomingObj}", type: "person" }`);
|
|
337
|
+
}
|
|
338
|
+
if (typeof incomingObj !== "object" || Array.isArray(incomingObj)) {
|
|
339
|
+
const receivedType = Array.isArray(incomingObj) ? "array" : typeof incomingObj;
|
|
340
|
+
const receivedValue = String(incomingObj);
|
|
341
|
+
throw new Error(`ActivityStreams validation failed: the "${type}" property must be an object, received ${receivedType} (${receivedValue}). Example: { id: "user@example.com", type: "person" }`);
|
|
342
|
+
}
|
|
343
|
+
const obj = incomingObj;
|
|
344
|
+
if (requireId && !obj.id) {
|
|
345
|
+
throw new Error(`ActivityStreams validation failed: the "${type}" property requires an 'id' property. Example: { id: "user@example.com", type: "person" }`);
|
|
346
|
+
}
|
|
347
|
+
const unknownKeys = Object.keys(incomingObj).filter((key) => {
|
|
348
|
+
return !baseProps[type].includes(key);
|
|
349
|
+
});
|
|
350
|
+
for (const key of unknownKeys) {
|
|
351
|
+
let ao = incomingObj;
|
|
352
|
+
if (rename[key]) {
|
|
353
|
+
ao = renameProp(ao, key);
|
|
354
|
+
continue;
|
|
355
|
+
}
|
|
356
|
+
if (matchesCustomProp(ao.type, key)) {
|
|
357
|
+
continue;
|
|
358
|
+
}
|
|
359
|
+
if (!specialObjs.includes(ao.type)) {
|
|
360
|
+
console.log(ao);
|
|
361
|
+
const receivedValue = typeof ao[key] === "string" ? `"${ao[key]}"` : String(ao[key]);
|
|
362
|
+
const err = `ActivityStreams validation failed: property "${key}" with value ${receivedValue} is not allowed on the "${type}" object of type "${ao.type}".`;
|
|
363
|
+
if (failOnUnknownObjectProperties) {
|
|
364
|
+
throw new Error(err);
|
|
365
|
+
}
|
|
366
|
+
if (warnOnUnknownObjectProperties) {
|
|
367
|
+
console.warn(err);
|
|
368
|
+
}
|
|
369
|
+
}
|
|
370
|
+
}
|
|
371
|
+
}
|
|
372
|
+
function ensureProps(obj) {
|
|
373
|
+
return obj;
|
|
374
|
+
}
|
|
375
|
+
function expandStream(meta) {
|
|
376
|
+
const stream = {};
|
|
377
|
+
for (const key of Object.keys(meta)) {
|
|
378
|
+
if (typeof meta[key] === "string") {
|
|
379
|
+
stream[key] = objs.get(meta[key]) || meta[key];
|
|
380
|
+
} else if (Array.isArray(meta[key])) {
|
|
381
|
+
stream[key] = [];
|
|
382
|
+
for (const entry of meta[key]) {
|
|
383
|
+
if (typeof entry === "string") {
|
|
384
|
+
stream[key].push(objs.get(entry) || entry);
|
|
385
|
+
}
|
|
386
|
+
}
|
|
387
|
+
} else {
|
|
388
|
+
stream[key] = meta[key];
|
|
389
|
+
}
|
|
390
|
+
}
|
|
391
|
+
for (const key of Object.keys(expand)) {
|
|
392
|
+
if (typeof stream[key] === "string") {
|
|
393
|
+
const idx = expand[key].primary;
|
|
394
|
+
const obj = {};
|
|
395
|
+
obj[idx] = stream[key];
|
|
396
|
+
stream[key] = obj;
|
|
397
|
+
}
|
|
398
|
+
}
|
|
399
|
+
return stream;
|
|
400
|
+
}
|
|
401
|
+
function Stream(meta) {
|
|
402
|
+
validateObject("stream", meta);
|
|
403
|
+
if (typeof meta.object === "object") {
|
|
404
|
+
validateObject("object", meta.object);
|
|
405
|
+
}
|
|
406
|
+
const stream = expandStream(meta);
|
|
407
|
+
ee.emit("activity-stream", stream);
|
|
408
|
+
return stream;
|
|
409
|
+
}
|
|
410
|
+
var _Object = {
|
|
411
|
+
create: (obj) => {
|
|
412
|
+
validateObject("object", obj, true);
|
|
413
|
+
const ao = ensureProps(obj);
|
|
414
|
+
objs.set(ao.id, ao);
|
|
415
|
+
ee.emit("activity-object-create", ao);
|
|
416
|
+
return ao;
|
|
417
|
+
},
|
|
418
|
+
delete: (id) => {
|
|
419
|
+
const result = objs.delete(id);
|
|
420
|
+
if (result) {
|
|
421
|
+
ee.emit("activity-object-delete", id);
|
|
422
|
+
}
|
|
423
|
+
return result;
|
|
424
|
+
},
|
|
425
|
+
get: (id, expand2) => {
|
|
426
|
+
let obj = objs.get(id);
|
|
427
|
+
if (!obj) {
|
|
428
|
+
if (!expand2) {
|
|
429
|
+
return id;
|
|
430
|
+
}
|
|
431
|
+
obj = { id };
|
|
432
|
+
}
|
|
433
|
+
return ensureProps(obj);
|
|
434
|
+
},
|
|
435
|
+
list: () => objs.keys()
|
|
436
|
+
};
|
|
437
|
+
function ASFactory(opts = {}) {
|
|
438
|
+
specialObjs = opts?.specialObjs || [];
|
|
439
|
+
failOnUnknownObjectProperties = typeof opts.failOnUnknownObjectProperties === "boolean" ? opts.failOnUnknownObjectProperties : failOnUnknownObjectProperties;
|
|
440
|
+
warnOnUnknownObjectProperties = typeof opts.warnOnUnknownObjectProperties === "boolean" ? opts.warnOnUnknownObjectProperties : warnOnUnknownObjectProperties;
|
|
441
|
+
for (const propName of Object.keys(opts.customProps || {})) {
|
|
442
|
+
if (typeof opts.customProps[propName] === "object") {
|
|
443
|
+
customProps[propName] = opts.customProps[propName];
|
|
444
|
+
}
|
|
445
|
+
}
|
|
446
|
+
return {
|
|
447
|
+
Stream,
|
|
448
|
+
Object: _Object,
|
|
449
|
+
on: (event, func) => ee.on(event, func),
|
|
450
|
+
once: (event, func) => ee.once(event, func),
|
|
451
|
+
off: (event, funcName) => ee.off(event, funcName)
|
|
452
|
+
};
|
|
453
|
+
}
|
|
454
|
+
((global) => {
|
|
455
|
+
global.ASFactor = ASFactory;
|
|
456
|
+
})(typeof window === "object" ? window : {});
|
|
457
|
+
export {
|
|
458
|
+
ASFactory
|
|
459
|
+
};
|
|
460
|
+
|
|
461
|
+
//# debugId=BDF4FA2886BECFB864756E2164756E21
|
|
462
|
+
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2V2ZW50ZW1pdHRlcjMvaW5kZXguanMiLCAiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2V2ZW50ZW1pdHRlcjMvaW5kZXgubWpzIiwgIi4uL3NyYy9hY3Rpdml0eS1zdHJlYW1zLnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWwogICAgIid1c2Ugc3RyaWN0JztcblxudmFyIGhhcyA9IE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHlcbiAgLCBwcmVmaXggPSAnfic7XG5cbi8qKlxuICogQ29uc3RydWN0b3IgdG8gY3JlYXRlIGEgc3RvcmFnZSBmb3Igb3VyIGBFRWAgb2JqZWN0cy5cbiAqIEFuIGBFdmVudHNgIGluc3RhbmNlIGlzIGEgcGxhaW4gb2JqZWN0IHdob3NlIHByb3BlcnRpZXMgYXJlIGV2ZW50IG5hbWVzLlxuICpcbiAqIEBjb25zdHJ1Y3RvclxuICogQHByaXZhdGVcbiAqL1xuZnVuY3Rpb24gRXZlbnRzKCkge31cblxuLy9cbi8vIFdlIHRyeSB0byBub3QgaW5oZXJpdCBmcm9tIGBPYmplY3QucHJvdG90eXBlYC4gSW4gc29tZSBlbmdpbmVzIGNyZWF0aW5nIGFuXG4vLyBpbnN0YW5jZSBpbiB0aGlzIHdheSBpcyBmYXN0ZXIgdGhhbiBjYWxsaW5nIGBPYmplY3QuY3JlYXRlKG51bGwpYCBkaXJlY3RseS5cbi8vIElmIGBPYmplY3QuY3JlYXRlKG51bGwpYCBpcyBub3Qgc3VwcG9ydGVkIHdlIHByZWZpeCB0aGUgZXZlbnQgbmFtZXMgd2l0aCBhXG4vLyBjaGFyYWN0ZXIgdG8gbWFrZSBzdXJlIHRoYXQgdGhlIGJ1aWx0LWluIG9iamVjdCBwcm9wZXJ0aWVzIGFyZSBub3Rcbi8vIG92ZXJyaWRkZW4gb3IgdXNlZCBhcyBhbiBhdHRhY2sgdmVjdG9yLlxuLy9cbmlmIChPYmplY3QuY3JlYXRlKSB7XG4gIEV2ZW50cy5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuXG4gIC8vXG4gIC8vIFRoaXMgaGFjayBpcyBuZWVkZWQgYmVjYXVzZSB0aGUgYF9fcHJvdG9fX2AgcHJvcGVydHkgaXMgc3RpbGwgaW5oZXJpdGVkIGluXG4gIC8vIHNvbWUgb2xkIGJyb3dzZXJzIGxpa2UgQW5kcm9pZCA0LCBpUGhvbmUgNS4xLCBPcGVyYSAxMSBhbmQgU2FmYXJpIDUuXG4gIC8vXG4gIGlmICghbmV3IEV2ZW50cygpLl9fcHJvdG9fXykgcHJlZml4ID0gZmFsc2U7XG59XG5cbi8qKlxuICogUmVwcmVzZW50YXRpb24gb2YgYSBzaW5nbGUgZXZlbnQgbGlzdGVuZXIuXG4gKlxuICogQHBhcmFtIHtGdW5jdGlvbn0gZm4gVGhlIGxpc3RlbmVyIGZ1bmN0aW9uLlxuICogQHBhcmFtIHsqfSBjb250ZXh0IFRoZSBjb250ZXh0IHRvIGludm9rZSB0aGUgbGlzdGVuZXIgd2l0aC5cbiAqIEBwYXJhbSB7Qm9vbGVhbn0gW29uY2U9ZmFsc2VdIFNwZWNpZnkgaWYgdGhlIGxpc3RlbmVyIGlzIGEgb25lLXRpbWUgbGlzdGVuZXIuXG4gKiBAY29uc3RydWN0b3JcbiAqIEBwcml2YXRlXG4gKi9cbmZ1bmN0aW9uIEVFKGZuLCBjb250ZXh0LCBvbmNlKSB7XG4gIHRoaXMuZm4gPSBmbjtcbiAgdGhpcy5jb250ZXh0ID0gY29udGV4dDtcbiAgdGhpcy5vbmNlID0gb25jZSB8fCBmYWxzZTtcbn1cblxuLyoqXG4gKiBBZGQgYSBsaXN0ZW5lciBmb3IgYSBnaXZlbiBldmVudC5cbiAqXG4gKiBAcGFyYW0ge0V2ZW50RW1pdHRlcn0gZW1pdHRlciBSZWZlcmVuY2UgdG8gdGhlIGBFdmVudEVtaXR0ZXJgIGluc3RhbmNlLlxuICogQHBhcmFtIHsoU3RyaW5nfFN5bWJvbCl9IGV2ZW50IFRoZSBldmVudCBuYW1lLlxuICogQHBhcmFtIHtGdW5jdGlvbn0gZm4gVGhlIGxpc3RlbmVyIGZ1bmN0aW9uLlxuICogQHBhcmFtIHsqfSBjb250ZXh0IFRoZSBjb250ZXh0IHRvIGludm9rZSB0aGUgbGlzdGVuZXIgd2l0aC5cbiAqIEBwYXJhbSB7Qm9vbGVhbn0gb25jZSBTcGVjaWZ5IGlmIHRoZSBsaXN0ZW5lciBpcyBhIG9uZS10aW1lIGxpc3RlbmVyLlxuICogQHJldHVybnMge0V2ZW50RW1pdHRlcn1cbiAqIEBwcml2YXRlXG4gKi9cbmZ1bmN0aW9uIGFkZExpc3RlbmVyKGVtaXR0ZXIsIGV2ZW50LCBmbiwgY29udGV4dCwgb25jZSkge1xuICBpZiAodHlwZW9mIGZuICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcignVGhlIGxpc3RlbmVyIG11c3QgYmUgYSBmdW5jdGlvbicpO1xuICB9XG5cbiAgdmFyIGxpc3RlbmVyID0gbmV3IEVFKGZuLCBjb250ZXh0IHx8IGVtaXR0ZXIsIG9uY2UpXG4gICAgLCBldnQgPSBwcmVmaXggPyBwcmVmaXggKyBldmVudCA6IGV2ZW50O1xuXG4gIGlmICghZW1pdHRlci5fZXZlbnRzW2V2dF0pIGVtaXR0ZXIuX2V2ZW50c1tldnRdID0gbGlzdGVuZXIsIGVtaXR0ZXIuX2V2ZW50c0NvdW50Kys7XG4gIGVsc2UgaWYgKCFlbWl0dGVyLl9ldmVudHNbZXZ0XS5mbikgZW1pdHRlci5fZXZlbnRzW2V2dF0ucHVzaChsaXN0ZW5lcik7XG4gIGVsc2UgZW1pdHRlci5fZXZlbnRzW2V2dF0gPSBbZW1pdHRlci5fZXZlbnRzW2V2dF0sIGxpc3RlbmVyXTtcblxuICByZXR1cm4gZW1pdHRlcjtcbn1cblxuLyoqXG4gKiBDbGVhciBldmVudCBieSBuYW1lLlxuICpcbiAqIEBwYXJhbSB7RXZlbnRFbWl0dGVyfSBlbWl0dGVyIFJlZmVyZW5jZSB0byB0aGUgYEV2ZW50RW1pdHRlcmAgaW5zdGFuY2UuXG4gKiBAcGFyYW0geyhTdHJpbmd8U3ltYm9sKX0gZXZ0IFRoZSBFdmVudCBuYW1lLlxuICogQHByaXZhdGVcbiAqL1xuZnVuY3Rpb24gY2xlYXJFdmVudChlbWl0dGVyLCBldnQpIHtcbiAgaWYgKC0tZW1pdHRlci5fZXZlbnRzQ291bnQgPT09IDApIGVtaXR0ZXIuX2V2ZW50cyA9IG5ldyBFdmVudHMoKTtcbiAgZWxzZSBkZWxldGUgZW1pdHRlci5fZXZlbnRzW2V2dF07XG59XG5cbi8qKlxuICogTWluaW1hbCBgRXZlbnRFbWl0dGVyYCBpbnRlcmZhY2UgdGhhdCBpcyBtb2xkZWQgYWdhaW5zdCB0aGUgTm9kZS5qc1xuICogYEV2ZW50RW1pdHRlcmAgaW50ZXJmYWNlLlxuICpcbiAqIEBjb25zdHJ1Y3RvclxuICogQHB1YmxpY1xuICovXG5mdW5jdGlvbiBFdmVudEVtaXR0ZXIoKSB7XG4gIHRoaXMuX2V2ZW50cyA9IG5ldyBFdmVudHMoKTtcbiAgdGhpcy5fZXZlbnRzQ291bnQgPSAwO1xufVxuXG4vKipcbiAqIFJldHVybiBhbiBhcnJheSBsaXN0aW5nIHRoZSBldmVudHMgZm9yIHdoaWNoIHRoZSBlbWl0dGVyIGhhcyByZWdpc3RlcmVkXG4gKiBsaXN0ZW5lcnMuXG4gKlxuICogQHJldHVybnMge0FycmF5fVxuICogQHB1YmxpY1xuICovXG5FdmVudEVtaXR0ZXIucHJvdG90eXBlLmV2ZW50TmFtZXMgPSBmdW5jdGlvbiBldmVudE5hbWVzKCkge1xuICB2YXIgbmFtZXMgPSBbXVxuICAgICwgZXZlbnRzXG4gICAgLCBuYW1lO1xuXG4gIGlmICh0aGlzLl9ldmVudHNDb3VudCA9PT0gMCkgcmV0dXJuIG5hbWVzO1xuXG4gIGZvciAobmFtZSBpbiAoZXZlbnRzID0gdGhpcy5fZXZlbnRzKSkge1xuICAgIGlmIChoYXMuY2FsbChldmVudHMsIG5hbWUpKSBuYW1lcy5wdXNoKHByZWZpeCA/IG5hbWUuc2xpY2UoMSkgOiBuYW1lKTtcbiAgfVxuXG4gIGlmIChPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKSB7XG4gICAgcmV0dXJuIG5hbWVzLmNvbmNhdChPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKGV2ZW50cykpO1xuICB9XG5cbiAgcmV0dXJuIG5hbWVzO1xufTtcblxuLyoqXG4gKiBSZXR1cm4gdGhlIGxpc3RlbmVycyByZWdpc3RlcmVkIGZvciBhIGdpdmVuIGV2ZW50LlxuICpcbiAqIEBwYXJhbSB7KFN0cmluZ3xTeW1ib2wpfSBldmVudCBUaGUgZXZlbnQgbmFtZS5cbiAqIEByZXR1cm5zIHtBcnJheX0gVGhlIHJlZ2lzdGVyZWQgbGlzdGVuZXJzLlxuICogQHB1YmxpY1xuICovXG5FdmVudEVtaXR0ZXIucHJvdG90eXBlLmxpc3RlbmVycyA9IGZ1bmN0aW9uIGxpc3RlbmVycyhldmVudCkge1xuICB2YXIgZXZ0ID0gcHJlZml4ID8gcHJlZml4ICsgZXZlbnQgOiBldmVudFxuICAgICwgaGFuZGxlcnMgPSB0aGlzLl9ldmVudHNbZXZ0XTtcblxuICBpZiAoIWhhbmRsZXJzKSByZXR1cm4gW107XG4gIGlmIChoYW5kbGVycy5mbikgcmV0dXJuIFtoYW5kbGVycy5mbl07XG5cbiAgZm9yICh2YXIgaSA9IDAsIGwgPSBoYW5kbGVycy5sZW5ndGgsIGVlID0gbmV3IEFycmF5KGwpOyBpIDwgbDsgaSsrKSB7XG4gICAgZWVbaV0gPSBoYW5kbGVyc1tpXS5mbjtcbiAgfVxuXG4gIHJldHVybiBlZTtcbn07XG5cbi8qKlxuICogUmV0dXJuIHRoZSBudW1iZXIgb2YgbGlzdGVuZXJzIGxpc3RlbmluZyB0byBhIGdpdmVuIGV2ZW50LlxuICpcbiAqIEBwYXJhbSB7KFN0cmluZ3xTeW1ib2wpfSBldmVudCBUaGUgZXZlbnQgbmFtZS5cbiAqIEByZXR1cm5zIHtOdW1iZXJ9IFRoZSBudW1iZXIgb2YgbGlzdGVuZXJzLlxuICogQHB1YmxpY1xuICovXG5FdmVudEVtaXR0ZXIucHJvdG90eXBlLmxpc3RlbmVyQ291bnQgPSBmdW5jdGlvbiBsaXN0ZW5lckNvdW50KGV2ZW50KSB7XG4gIHZhciBldnQgPSBwcmVmaXggPyBwcmVmaXggKyBldmVudCA6IGV2ZW50XG4gICAgLCBsaXN0ZW5lcnMgPSB0aGlzLl9ldmVudHNbZXZ0XTtcblxuICBpZiAoIWxpc3RlbmVycykgcmV0dXJuIDA7XG4gIGlmIChsaXN0ZW5lcnMuZm4pIHJldHVybiAxO1xuICByZXR1cm4gbGlzdGVuZXJzLmxlbmd0aDtcbn07XG5cbi8qKlxuICogQ2FsbHMgZWFjaCBvZiB0aGUgbGlzdGVuZXJzIHJlZ2lzdGVyZWQgZm9yIGEgZ2l2ZW4gZXZlbnQuXG4gKlxuICogQHBhcmFtIHsoU3RyaW5nfFN5bWJvbCl9IGV2ZW50IFRoZSBldmVudCBuYW1lLlxuICogQHJldHVybnMge0Jvb2xlYW59IGB0cnVlYCBpZiB0aGUgZXZlbnQgaGFkIGxpc3RlbmVycywgZWxzZSBgZmFsc2VgLlxuICogQHB1YmxpY1xuICovXG5FdmVudEVtaXR0ZXIucHJvdG90eXBlLmVtaXQgPSBmdW5jdGlvbiBlbWl0KGV2ZW50LCBhMSwgYTIsIGEzLCBhNCwgYTUpIHtcbiAgdmFyIGV2dCA9IHByZWZpeCA/IHByZWZpeCArIGV2ZW50IDogZXZlbnQ7XG5cbiAgaWYgKCF0aGlzLl9ldmVudHNbZXZ0XSkgcmV0dXJuIGZhbHNlO1xuXG4gIHZhciBsaXN0ZW5lcnMgPSB0aGlzLl9ldmVudHNbZXZ0XVxuICAgICwgbGVuID0gYXJndW1lbnRzLmxlbmd0aFxuICAgICwgYXJnc1xuICAgICwgaTtcblxuICBpZiAobGlzdGVuZXJzLmZuKSB7XG4gICAgaWYgKGxpc3RlbmVycy5vbmNlKSB0aGlzLnJlbW92ZUxpc3RlbmVyKGV2ZW50LCBsaXN0ZW5lcnMuZm4sIHVuZGVmaW5lZCwgdHJ1ZSk7XG5cbiAgICBzd2l0Y2ggKGxlbikge1xuICAgICAgY2FzZSAxOiByZXR1cm4gbGlzdGVuZXJzLmZuLmNhbGwobGlzdGVuZXJzLmNvbnRleHQpLCB0cnVlO1xuICAgICAgY2FzZSAyOiByZXR1cm4gbGlzdGVuZXJzLmZuLmNhbGwobGlzdGVuZXJzLmNvbnRleHQsIGExKSwgdHJ1ZTtcbiAgICAgIGNhc2UgMzogcmV0dXJuIGxpc3RlbmVycy5mbi5jYWxsKGxpc3RlbmVycy5jb250ZXh0LCBhMSwgYTIpLCB0cnVlO1xuICAgICAgY2FzZSA0OiByZXR1cm4gbGlzdGVuZXJzLmZuLmNhbGwobGlzdGVuZXJzLmNvbnRleHQsIGExLCBhMiwgYTMpLCB0cnVlO1xuICAgICAgY2FzZSA1OiByZXR1cm4gbGlzdGVuZXJzLmZuLmNhbGwobGlzdGVuZXJzLmNvbnRleHQsIGExLCBhMiwgYTMsIGE0KSwgdHJ1ZTtcbiAgICAgIGNhc2UgNjogcmV0dXJuIGxpc3RlbmVycy5mbi5jYWxsKGxpc3RlbmVycy5jb250ZXh0LCBhMSwgYTIsIGEzLCBhNCwgYTUpLCB0cnVlO1xuICAgIH1cblxuICAgIGZvciAoaSA9IDEsIGFyZ3MgPSBuZXcgQXJyYXkobGVuIC0xKTsgaSA8IGxlbjsgaSsrKSB7XG4gICAgICBhcmdzW2kgLSAxXSA9IGFyZ3VtZW50c1tpXTtcbiAgICB9XG5cbiAgICBsaXN0ZW5lcnMuZm4uYXBwbHkobGlzdGVuZXJzLmNvbnRleHQsIGFyZ3MpO1xuICB9IGVsc2Uge1xuICAgIHZhciBsZW5ndGggPSBsaXN0ZW5lcnMubGVuZ3RoXG4gICAgICAsIGo7XG5cbiAgICBmb3IgKGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHtcbiAgICAgIGlmIChsaXN0ZW5lcnNbaV0ub25jZSkgdGhpcy5yZW1vdmVMaXN0ZW5lcihldmVudCwgbGlzdGVuZXJzW2ldLmZuLCB1bmRlZmluZWQsIHRydWUpO1xuXG4gICAgICBzd2l0Y2ggKGxlbikge1xuICAgICAgICBjYXNlIDE6IGxpc3RlbmVyc1tpXS5mbi5jYWxsKGxpc3RlbmVyc1tpXS5jb250ZXh0KTsgYnJlYWs7XG4gICAgICAgIGNhc2UgMjogbGlzdGVuZXJzW2ldLmZuLmNhbGwobGlzdGVuZXJzW2ldLmNvbnRleHQsIGExKTsgYnJlYWs7XG4gICAgICAgIGNhc2UgMzogbGlzdGVuZXJzW2ldLmZuLmNhbGwobGlzdGVuZXJzW2ldLmNvbnRleHQsIGExLCBhMik7IGJyZWFrO1xuICAgICAgICBjYXNlIDQ6IGxpc3RlbmVyc1tpXS5mbi5jYWxsKGxpc3RlbmVyc1tpXS5jb250ZXh0LCBhMSwgYTIsIGEzKTsgYnJlYWs7XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgaWYgKCFhcmdzKSBmb3IgKGogPSAxLCBhcmdzID0gbmV3IEFycmF5KGxlbiAtMSk7IGogPCBsZW47IGorKykge1xuICAgICAgICAgICAgYXJnc1tqIC0gMV0gPSBhcmd1bWVudHNbal07XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgbGlzdGVuZXJzW2ldLmZuLmFwcGx5KGxpc3RlbmVyc1tpXS5jb250ZXh0LCBhcmdzKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gdHJ1ZTtcbn07XG5cbi8qKlxuICogQWRkIGEgbGlzdGVuZXIgZm9yIGEgZ2l2ZW4gZXZlbnQuXG4gKlxuICogQHBhcmFtIHsoU3RyaW5nfFN5bWJvbCl9IGV2ZW50IFRoZSBldmVudCBuYW1lLlxuICogQHBhcmFtIHtGdW5jdGlvbn0gZm4gVGhlIGxpc3RlbmVyIGZ1bmN0aW9uLlxuICogQHBhcmFtIHsqfSBbY29udGV4dD10aGlzXSBUaGUgY29udGV4dCB0byBpbnZva2UgdGhlIGxpc3RlbmVyIHdpdGguXG4gKiBAcmV0dXJucyB7RXZlbnRFbWl0dGVyfSBgdGhpc2AuXG4gKiBAcHVibGljXG4gKi9cbkV2ZW50RW1pdHRlci5wcm90b3R5cGUub24gPSBmdW5jdGlvbiBvbihldmVudCwgZm4sIGNvbnRleHQpIHtcbiAgcmV0dXJuIGFkZExpc3RlbmVyKHRoaXMsIGV2ZW50LCBmbiwgY29udGV4dCwgZmFsc2UpO1xufTtcblxuLyoqXG4gKiBBZGQgYSBvbmUtdGltZSBsaXN0ZW5lciBmb3IgYSBnaXZlbiBldmVudC5cbiAqXG4gKiBAcGFyYW0geyhTdHJpbmd8U3ltYm9sKX0gZXZlbnQgVGhlIGV2ZW50IG5hbWUuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmbiBUaGUgbGlzdGVuZXIgZnVuY3Rpb24uXG4gKiBAcGFyYW0geyp9IFtjb250ZXh0PXRoaXNdIFRoZSBjb250ZXh0IHRvIGludm9rZSB0aGUgbGlzdGVuZXIgd2l0aC5cbiAqIEByZXR1cm5zIHtFdmVudEVtaXR0ZXJ9IGB0aGlzYC5cbiAqIEBwdWJsaWNcbiAqL1xuRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5vbmNlID0gZnVuY3Rpb24gb25jZShldmVudCwgZm4sIGNvbnRleHQpIHtcbiAgcmV0dXJuIGFkZExpc3RlbmVyKHRoaXMsIGV2ZW50LCBmbiwgY29udGV4dCwgdHJ1ZSk7XG59O1xuXG4vKipcbiAqIFJlbW92ZSB0aGUgbGlzdGVuZXJzIG9mIGEgZ2l2ZW4gZXZlbnQuXG4gKlxuICogQHBhcmFtIHsoU3RyaW5nfFN5bWJvbCl9IGV2ZW50IFRoZSBldmVudCBuYW1lLlxuICogQHBhcmFtIHtGdW5jdGlvbn0gZm4gT25seSByZW1vdmUgdGhlIGxpc3RlbmVycyB0aGF0IG1hdGNoIHRoaXMgZnVuY3Rpb24uXG4gKiBAcGFyYW0geyp9IGNvbnRleHQgT25seSByZW1vdmUgdGhlIGxpc3RlbmVycyB0aGF0IGhhdmUgdGhpcyBjb250ZXh0LlxuICogQHBhcmFtIHtCb29sZWFufSBvbmNlIE9ubHkgcmVtb3ZlIG9uZS10aW1lIGxpc3RlbmVycy5cbiAqIEByZXR1cm5zIHtFdmVudEVtaXR0ZXJ9IGB0aGlzYC5cbiAqIEBwdWJsaWNcbiAqL1xuRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5yZW1vdmVMaXN0ZW5lciA9IGZ1bmN0aW9uIHJlbW92ZUxpc3RlbmVyKGV2ZW50LCBmbiwgY29udGV4dCwgb25jZSkge1xuICB2YXIgZXZ0ID0gcHJlZml4ID8gcHJlZml4ICsgZXZlbnQgOiBldmVudDtcblxuICBpZiAoIXRoaXMuX2V2ZW50c1tldnRdKSByZXR1cm4gdGhpcztcbiAgaWYgKCFmbikge1xuICAgIGNsZWFyRXZlbnQodGhpcywgZXZ0KTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIHZhciBsaXN0ZW5lcnMgPSB0aGlzLl9ldmVudHNbZXZ0XTtcblxuICBpZiAobGlzdGVuZXJzLmZuKSB7XG4gICAgaWYgKFxuICAgICAgbGlzdGVuZXJzLmZuID09PSBmbiAmJlxuICAgICAgKCFvbmNlIHx8IGxpc3RlbmVycy5vbmNlKSAmJlxuICAgICAgKCFjb250ZXh0IHx8IGxpc3RlbmVycy5jb250ZXh0ID09PSBjb250ZXh0KVxuICAgICkge1xuICAgICAgY2xlYXJFdmVudCh0aGlzLCBldnQpO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBmb3IgKHZhciBpID0gMCwgZXZlbnRzID0gW10sIGxlbmd0aCA9IGxpc3RlbmVycy5sZW5ndGg7IGkgPCBsZW5ndGg7IGkrKykge1xuICAgICAgaWYgKFxuICAgICAgICBsaXN0ZW5lcnNbaV0uZm4gIT09IGZuIHx8XG4gICAgICAgIChvbmNlICYmICFsaXN0ZW5lcnNbaV0ub25jZSkgfHxcbiAgICAgICAgKGNvbnRleHQgJiYgbGlzdGVuZXJzW2ldLmNvbnRleHQgIT09IGNvbnRleHQpXG4gICAgICApIHtcbiAgICAgICAgZXZlbnRzLnB1c2gobGlzdGVuZXJzW2ldKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvL1xuICAgIC8vIFJlc2V0IHRoZSBhcnJheSwgb3IgcmVtb3ZlIGl0IGNvbXBsZXRlbHkgaWYgd2UgaGF2ZSBubyBtb3JlIGxpc3RlbmVycy5cbiAgICAvL1xuICAgIGlmIChldmVudHMubGVuZ3RoKSB0aGlzLl9ldmVudHNbZXZ0XSA9IGV2ZW50cy5sZW5ndGggPT09IDEgPyBldmVudHNbMF0gOiBldmVudHM7XG4gICAgZWxzZSBjbGVhckV2ZW50KHRoaXMsIGV2dCk7XG4gIH1cblxuICByZXR1cm4gdGhpcztcbn07XG5cbi8qKlxuICogUmVtb3ZlIGFsbCBsaXN0ZW5lcnMsIG9yIHRob3NlIG9mIHRoZSBzcGVjaWZpZWQgZXZlbnQuXG4gKlxuICogQHBhcmFtIHsoU3RyaW5nfFN5bWJvbCl9IFtldmVudF0gVGhlIGV2ZW50IG5hbWUuXG4gKiBAcmV0dXJucyB7RXZlbnRFbWl0dGVyfSBgdGhpc2AuXG4gKiBAcHVibGljXG4gKi9cbkV2ZW50RW1pdHRlci5wcm90b3R5cGUucmVtb3ZlQWxsTGlzdGVuZXJzID0gZnVuY3Rpb24gcmVtb3ZlQWxsTGlzdGVuZXJzKGV2ZW50KSB7XG4gIHZhciBldnQ7XG5cbiAgaWYgKGV2ZW50KSB7XG4gICAgZXZ0ID0gcHJlZml4ID8gcHJlZml4ICsgZXZlbnQgOiBldmVudDtcbiAgICBpZiAodGhpcy5fZXZlbnRzW2V2dF0pIGNsZWFyRXZlbnQodGhpcywgZXZ0KTtcbiAgfSBlbHNlIHtcbiAgICB0aGlzLl9ldmVudHMgPSBuZXcgRXZlbnRzKCk7XG4gICAgdGhpcy5fZXZlbnRzQ291bnQgPSAwO1xuICB9XG5cbiAgcmV0dXJuIHRoaXM7XG59O1xuXG4vL1xuLy8gQWxpYXMgbWV0aG9kcyBuYW1lcyBiZWNhdXNlIHBlb3BsZSByb2xsIGxpa2UgdGhhdC5cbi8vXG5FdmVudEVtaXR0ZXIucHJvdG90eXBlLm9mZiA9IEV2ZW50RW1pdHRlci5wcm90b3R5cGUucmVtb3ZlTGlzdGVuZXI7XG5FdmVudEVtaXR0ZXIucHJvdG90eXBlLmFkZExpc3RlbmVyID0gRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5vbjtcblxuLy9cbi8vIEV4cG9zZSB0aGUgcHJlZml4LlxuLy9cbkV2ZW50RW1pdHRlci5wcmVmaXhlZCA9IHByZWZpeDtcblxuLy9cbi8vIEFsbG93IGBFdmVudEVtaXR0ZXJgIHRvIGJlIGltcG9ydGVkIGFzIG1vZHVsZSBuYW1lc3BhY2UuXG4vL1xuRXZlbnRFbWl0dGVyLkV2ZW50RW1pdHRlciA9IEV2ZW50RW1pdHRlcjtcblxuLy9cbi8vIEV4cG9zZSB0aGUgbW9kdWxlLlxuLy9cbmlmICgndW5kZWZpbmVkJyAhPT0gdHlwZW9mIG1vZHVsZSkge1xuICBtb2R1bGUuZXhwb3J0cyA9IEV2ZW50RW1pdHRlcjtcbn1cbiIsCiAgICAiaW1wb3J0IEV2ZW50RW1pdHRlciBmcm9tICcuL2luZGV4LmpzJ1xuXG5leHBvcnQgeyBFdmVudEVtaXR0ZXIgfVxuZXhwb3J0IGRlZmF1bHQgRXZlbnRFbWl0dGVyXG4iLAogICAgIi8qIVxuICogYWN0aXZpdHktc3RyZWFtc1xuICogICBodHRwczovL2dpdGh1Yi5jb20vc2lsdmVyYnVja2V0L2FjdGl2aXR5LXN0cmVhbXNcbiAqXG4gKiBEZXZlbG9wZWQgYW5kIE1haW50YWluZWQgYnk6XG4gKiAgIE5pY2sgSmVubmluZ3MgPG5pY2tAc2lsdmVyYnVja2V0Lm5ldD5cbiAqXG4gKiBhY3Rpdml0eS1zdHJlYW1zIGlzIHJlbGVhc2VkIHVuZGVyIHRoZSBNSVQgKHNlZSBMSUNFTlNFKS5cbiAqXG4gKiBZb3UgZG9uJ3QgaGF2ZSB0byBkbyBhbnl0aGluZyBzcGVjaWFsIHRvIGNob29zZSBvbmUgbGljZW5zZSBvciB0aGUgb3RoZXJcbiAqIGFuZCB5b3UgZG9uJ3QgaGF2ZSB0byBub3RpZnkgYW55b25lIHdoaWNoIGxpY2Vuc2UgeW91IGFyZSB1c2luZy5cbiAqIFBsZWFzZSBzZWUgdGhlIGNvcnJlc3BvbmRpbmcgbGljZW5zZSBmaWxlIGZvciBkZXRhaWxzIG9mIHRoZXNlIGxpY2Vuc2VzLlxuICogWW91IGFyZSBmcmVlIHRvIHVzZSwgbW9kaWZ5IGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUsIGJ1dCBhbGwgY29weXJpZ2h0XG4gKiBpbmZvcm1hdGlvbiBtdXN0IHJlbWFpbi5cbiAqXG4gKi9cblxuaW1wb3J0IHR5cGUgeyBBY3Rpdml0eU9iamVjdCwgQWN0aXZpdHlTdHJlYW0gfSBmcm9tIFwiQHNvY2tldGh1Yi9zY2hlbWFzXCI7XG5pbXBvcnQgRXZlbnRFbWl0dGVyIGZyb20gXCJldmVudGVtaXR0ZXIzXCI7XG5cbmNvbnN0IGVlID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuY29uc3QgYmFzZVByb3BzID0ge1xuICAgIHN0cmVhbTogW1xuICAgICAgICBcImlkXCIsXG4gICAgICAgIFwidHlwZVwiLFxuICAgICAgICBcImFjdG9yXCIsXG4gICAgICAgIFwidGFyZ2V0XCIsXG4gICAgICAgIFwib2JqZWN0XCIsXG4gICAgICAgIFwiY29udGV4dFwiLFxuICAgICAgICBcImNvbnRleHRcIixcbiAgICAgICAgXCJwdWJsaXNoZWRcIixcbiAgICAgICAgXCJlcnJvclwiLFxuICAgIF0sXG4gICAgb2JqZWN0OiBbXG4gICAgICAgIFwiaWRcIixcbiAgICAgICAgXCJ0eXBlXCIsXG4gICAgICAgIFwiY29udGV4dFwiLFxuICAgICAgICBcImFsaWFzXCIsXG4gICAgICAgIFwiYXR0YWNoZWRUb1wiLFxuICAgICAgICBcImF0dGFjaG1lbnRcIixcbiAgICAgICAgXCJhdHRyaWJ1dGVkVG9cIixcbiAgICAgICAgXCJhdHRyaWJ1dGVkV2l0aFwiLFxuICAgICAgICBcImNvbmRpdGlvblwiLFxuICAgICAgICBcImNvbnRlbnRcIixcbiAgICAgICAgXCJjb250ZW50TWFwXCIsXG4gICAgICAgIFwiY29udGV4dFwiLFxuICAgICAgICBcImNvbnRleHRPZlwiLFxuICAgICAgICBcIm5hbWVcIixcbiAgICAgICAgXCJlbmRUaW1lXCIsXG4gICAgICAgIFwiZ2VuZXJhdG9yXCIsXG4gICAgICAgIFwiZ2VuZXJhdG9yT2ZcIixcbiAgICAgICAgXCJncm91cFwiLFxuICAgICAgICBcImljb25cIixcbiAgICAgICAgXCJpbWFnZVwiLFxuICAgICAgICBcImluUmVwbHlUb1wiLFxuICAgICAgICBcIm1lbWJlcnNcIixcbiAgICAgICAgXCJtZW1iZXJPZlwiLFxuICAgICAgICBcIm1lc3NhZ2VcIixcbiAgICAgICAgXCJsb2NhdGlvblwiLFxuICAgICAgICBcImxvY2F0aW9uT2ZcIixcbiAgICAgICAgXCJvYmplY3RPZlwiLFxuICAgICAgICBcIm9yaWdpbk9mXCIsXG4gICAgICAgIFwicHJlc2VuY2VcIixcbiAgICAgICAgXCJwcmV2aWV3XCIsXG4gICAgICAgIFwicHJldmlld09mXCIsXG4gICAgICAgIFwicHJvdmlkZXJcIixcbiAgICAgICAgXCJwcm92aWRlck9mXCIsXG4gICAgICAgIFwicHVibGlzaGVkXCIsXG4gICAgICAgIFwicmF0aW5nXCIsXG4gICAgICAgIFwicmVsYXRpb25zaGlwXCIsXG4gICAgICAgIFwicmVzdWx0T2ZcIixcbiAgICAgICAgXCJyZXBsaWVzXCIsXG4gICAgICAgIFwicm9sZVwiLFxuICAgICAgICBcInNjb3BlXCIsXG4gICAgICAgIFwic2NvcGVPZlwiLFxuICAgICAgICBcInN0YXJ0VGltZVwiLFxuICAgICAgICBcInN0YXR1c1wiLFxuICAgICAgICBcInN1bW1hcnlcIixcbiAgICAgICAgXCJ0b3BpY1wiLFxuICAgICAgICBcInRhZ1wiLFxuICAgICAgICBcInRhZ09mXCIsXG4gICAgICAgIFwidGFyZ2V0T2ZcIixcbiAgICAgICAgXCJ0aXRsZVwiLFxuICAgICAgICBcInRpdGxlTWFwXCIsXG4gICAgICAgIFwidXBkYXRlZFwiLFxuICAgICAgICBcInVybFwiLFxuICAgICAgICBcInhtcHA6c3RhbnphLWlkXCIsXG4gICAgXSxcbn07XG5jb25zdCByZW5hbWUgPSB7XG4gICAgXCJAaWRcIjogXCJpZFwiLFxuICAgIFwiQHR5cGVcIjogXCJ0eXBlXCIsXG4gICAgdmVyYjogXCJ0eXBlXCIsXG4gICAgZGlzcGxheU5hbWU6IFwibmFtZVwiLFxuICAgIG9iamVjdFR5cGU6IFwidHlwZVwiLFxuICAgIHBsYXRmb3JtOiBcImNvbnRleHRcIixcbn07XG5jb25zdCBleHBhbmQgPSB7XG4gICAgYWN0b3I6IHtcbiAgICAgICAgcHJpbWFyeTogXCJpZFwiLFxuICAgICAgICBwcm9wczogYmFzZVByb3BzLFxuICAgIH0sXG4gICAgdGFyZ2V0OiB7XG4gICAgICAgIHByaW1hcnk6IFwiaWRcIixcbiAgICAgICAgcHJvcHM6IGJhc2VQcm9wcyxcbiAgICB9LFxuICAgIG9iamVjdDoge1xuICAgICAgICBwcmltYXJ5OiBcImNvbnRlbnRcIixcbiAgICAgICAgcHJvcHM6IGJhc2VQcm9wcyxcbiAgICB9LFxufTtcblxudHlwZSBDdXN0b21Qcm9wcyA9IHtcbiAgICBba2V5OiBzdHJpbmddOiBzdHJpbmcgfCBudW1iZXIgfCBib29sZWFuIHwgb2JqZWN0IHwgc3RyaW5nW107XG59O1xuXG5jb25zdCBvYmpzID0gbmV3IE1hcCgpO1xuY29uc3QgY3VzdG9tUHJvcHM6IEN1c3RvbVByb3BzID0ge307XG5cbmxldCBmYWlsT25Vbmtub3duT2JqZWN0UHJvcGVydGllcyA9IGZhbHNlO1xubGV0IHdhcm5PblVua25vd25PYmplY3RQcm9wZXJ0aWVzID0gdHJ1ZTtcbmxldCBzcGVjaWFsT2JqcyA9IFtdOyAvLyB0aGUgb2JqZWN0cyBkb24ndCBnZXQgcmVqZWN0ZWQgZm9yIGJhZCBwcm9wc1xuXG5mdW5jdGlvbiBtYXRjaGVzQ3VzdG9tUHJvcCh0eXBlOiBzdHJpbmcsIGtleTogc3RyaW5nKSB7XG4gICAgaWYgKGN1c3RvbVByb3BzW3R5cGVdIGluc3RhbmNlb2YgT2JqZWN0KSB7XG4gICAgICAgIGNvbnN0IG9iaiA9IGN1c3RvbVByb3BzW3R5cGVdIGFzIHN0cmluZ1tdO1xuICAgICAgICBpZiAob2JqLmluY2x1ZGVzKGtleSkpIHtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbn1cblxuZnVuY3Rpb24gcmVuYW1lUHJvcDxUPihvYmo6IFQsIGtleTogc3RyaW5nKTogVCB7XG4gICAgb2JqW3JlbmFtZVtrZXldXSA9IG9ialtrZXldO1xuICAgIGRlbGV0ZSBvYmpba2V5XTtcbiAgICByZXR1cm4gb2JqO1xufVxuXG5mdW5jdGlvbiB2YWxpZGF0ZU9iamVjdDxUPih0eXBlOiBzdHJpbmcsIGluY29taW5nT2JqOiBULCByZXF1aXJlSWQgPSBmYWxzZSkge1xuICAgIC8vIElucHV0IHZhbGlkYXRpb24gd2l0aCBjbGVhciBlcnJvciBtZXNzYWdlc1xuICAgIGlmIChpbmNvbWluZ09iaiA9PT0gbnVsbCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICBgQWN0aXZpdHlTdHJlYW1zIHZhbGlkYXRpb24gZmFpbGVkOiB0aGUgXCIke3R5cGV9XCIgcHJvcGVydHkgaXMgbnVsbC4gRXhhbXBsZTogeyBpZDogXCJ1c2VyQGV4YW1wbGUuY29tXCIsIHR5cGU6IFwicGVyc29uXCIgfWAsXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgaWYgKGluY29taW5nT2JqID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgYEFjdGl2aXR5U3RyZWFtcyB2YWxpZGF0aW9uIGZhaWxlZDogdGhlIFwiJHt0eXBlfVwiIHByb3BlcnR5IGlzIHVuZGVmaW5lZC4gRXhhbXBsZTogeyBpZDogXCJ1c2VyQGV4YW1wbGUuY29tXCIsIHR5cGU6IFwicGVyc29uXCIgfWAsXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBpbmNvbWluZ09iaiA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICBgQWN0aXZpdHlTdHJlYW1zIHZhbGlkYXRpb24gZmFpbGVkOiB0aGUgXCIke3R5cGV9XCIgcHJvcGVydHkgcmVjZWl2ZWQgc3RyaW5nIFwiJHtpbmNvbWluZ09ian1cIiBidXQgZXhwZWN0ZWQgYW4gb2JqZWN0LiBVc2U6IHsgaWQ6IFwiJHtpbmNvbWluZ09ian1cIiwgdHlwZTogXCJwZXJzb25cIiB9YCxcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIGluY29taW5nT2JqICE9PSBcIm9iamVjdFwiIHx8IEFycmF5LmlzQXJyYXkoaW5jb21pbmdPYmopKSB7XG4gICAgICAgIGNvbnN0IHJlY2VpdmVkVHlwZSA9IEFycmF5LmlzQXJyYXkoaW5jb21pbmdPYmopXG4gICAgICAgICAgICA/IFwiYXJyYXlcIlxuICAgICAgICAgICAgOiB0eXBlb2YgaW5jb21pbmdPYmo7XG4gICAgICAgIGNvbnN0IHJlY2VpdmVkVmFsdWUgPSBTdHJpbmcoaW5jb21pbmdPYmopO1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICBgQWN0aXZpdHlTdHJlYW1zIHZhbGlkYXRpb24gZmFpbGVkOiB0aGUgXCIke3R5cGV9XCIgcHJvcGVydHkgbXVzdCBiZSBhbiBvYmplY3QsIHJlY2VpdmVkICR7cmVjZWl2ZWRUeXBlfSAoJHtyZWNlaXZlZFZhbHVlfSkuIEV4YW1wbGU6IHsgaWQ6IFwidXNlckBleGFtcGxlLmNvbVwiLCB0eXBlOiBcInBlcnNvblwiIH1gLFxuICAgICAgICApO1xuICAgIH1cblxuICAgIC8vIFJlcXVpcmUgJ2lkJyBwcm9wZXJ0eSB3aGVuIGV4cGxpY2l0bHkgcmVxdWVzdGVkIChlLmcuLCBPYmplY3QuY3JlYXRlKCkpXG4gICAgY29uc3Qgb2JqID0gaW5jb21pbmdPYmogYXMgQWN0aXZpdHlPYmplY3Q7XG4gICAgaWYgKHJlcXVpcmVJZCAmJiAhb2JqLmlkKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgIGBBY3Rpdml0eVN0cmVhbXMgdmFsaWRhdGlvbiBmYWlsZWQ6IHRoZSBcIiR7dHlwZX1cIiBwcm9wZXJ0eSByZXF1aXJlcyBhbiAnaWQnIHByb3BlcnR5LiBFeGFtcGxlOiB7IGlkOiBcInVzZXJAZXhhbXBsZS5jb21cIiwgdHlwZTogXCJwZXJzb25cIiB9YCxcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBjb25zdCB1bmtub3duS2V5cyA9IE9iamVjdC5rZXlzKGluY29taW5nT2JqKS5maWx0ZXIoXG4gICAgICAgIChrZXk6IHN0cmluZyk6IGJvb2xlYW4gPT4ge1xuICAgICAgICAgICAgcmV0dXJuICFiYXNlUHJvcHNbdHlwZV0uaW5jbHVkZXMoa2V5KTtcbiAgICAgICAgfSxcbiAgICApO1xuXG4gICAgZm9yIChjb25zdCBrZXkgb2YgdW5rbm93bktleXMpIHtcbiAgICAgICAgbGV0IGFvOiBBY3Rpdml0eU9iamVjdCA9IGluY29taW5nT2JqIGFzIEFjdGl2aXR5T2JqZWN0O1xuICAgICAgICBpZiAocmVuYW1lW2tleV0pIHtcbiAgICAgICAgICAgIC8vIHJlbmFtZSBwcm9wZXJ0eSBpbnN0ZWFkIG9mIGZhaWxcbiAgICAgICAgICAgIGFvID0gcmVuYW1lUHJvcChhbywga2V5KTtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKG1hdGNoZXNDdXN0b21Qcm9wKGFvLnR5cGUsIGtleSkpIHtcbiAgICAgICAgICAgIC8vIGN1c3RvbSBwcm9wZXJ0eSBtYXRjaGVzLCBjb250aW51ZVxuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIXNwZWNpYWxPYmpzLmluY2x1ZGVzKGFvLnR5cGUpKSB7XG4gICAgICAgICAgICAvLyBub3QgZGVmaW5lZCBhcyBhIHNwZWNpYWwgcHJvcFxuICAgICAgICAgICAgLy8gZG9uJ3Qga25vdyB3aGF0IHRvIGRvIHdpdGggaXQsIHNvIHRocm93IGVycm9yXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhhbyk7XG4gICAgICAgICAgICBjb25zdCByZWNlaXZlZFZhbHVlID1cbiAgICAgICAgICAgICAgICB0eXBlb2YgYW9ba2V5XSA9PT0gXCJzdHJpbmdcIiA/IGBcIiR7YW9ba2V5XX1cImAgOiBTdHJpbmcoYW9ba2V5XSk7XG4gICAgICAgICAgICBjb25zdCBlcnIgPSBgQWN0aXZpdHlTdHJlYW1zIHZhbGlkYXRpb24gZmFpbGVkOiBwcm9wZXJ0eSBcIiR7a2V5fVwiIHdpdGggdmFsdWUgJHtyZWNlaXZlZFZhbHVlfSBpcyBub3QgYWxsb3dlZCBvbiB0aGUgXCIke3R5cGV9XCIgb2JqZWN0IG9mIHR5cGUgXCIke2FvLnR5cGV9XCIuYDtcbiAgICAgICAgICAgIGlmIChmYWlsT25Vbmtub3duT2JqZWN0UHJvcGVydGllcykge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihlcnIpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHdhcm5PblVua25vd25PYmplY3RQcm9wZXJ0aWVzKSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS53YXJuKGVycik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG59XG5cbmZ1bmN0aW9uIGVuc3VyZVByb3BzKG9iajogQWN0aXZpdHlPYmplY3QpOiBBY3Rpdml0eU9iamVjdCB7XG4gICAgLy8gZW5zdXJlIHRoZSBuYW1lIHByb3BlcnR5LCB3aGljaCBjYW4gZ2VuZXJhbGx5IGJlIGluZmVycmVkIGZyb20gdGhlIGlkXG4gICAgLy8gbmFtZSA9IG9iai5tYXRjaCgvKD8oP1xcdyspOlxcL1xcLykoPzouK0ApPyguKz8pKD86XFwvfCQpLylbMV1cbiAgICByZXR1cm4gb2JqO1xufVxuXG5mdW5jdGlvbiBleHBhbmRTdHJlYW0obWV0YTogQWN0aXZpdHlTdHJlYW0pIHtcbiAgICBjb25zdCBzdHJlYW0gPSB7fTtcbiAgICBmb3IgKGNvbnN0IGtleSBvZiBPYmplY3Qua2V5cyhtZXRhKSkge1xuICAgICAgICBpZiAodHlwZW9mIG1ldGFba2V5XSA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgICAgICAgc3RyZWFtW2tleV0gPSBvYmpzLmdldChtZXRhW2tleV0pIHx8IG1ldGFba2V5XTtcbiAgICAgICAgfSBlbHNlIGlmIChBcnJheS5pc0FycmF5KG1ldGFba2V5XSkpIHtcbiAgICAgICAgICAgIHN0cmVhbVtrZXldID0gW107XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGVudHJ5IG9mIG1ldGFba2V5XSkge1xuICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgZW50cnkgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgc3RyZWFtW2tleV0ucHVzaChvYmpzLmdldChlbnRyeSkgfHwgZW50cnkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHN0cmVhbVtrZXldID0gbWV0YVtrZXldO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gb25seSBleHBhbmQgc3RyaW5nIGludG8gb2JqZWN0cyBpZiB0aGV5IGFyZSBpbiB0aGUgZXhwYW5kIGxpc3RcbiAgICBmb3IgKGNvbnN0IGtleSBvZiBPYmplY3Qua2V5cyhleHBhbmQpKSB7XG4gICAgICAgIGlmICh0eXBlb2Ygc3RyZWFtW2tleV0gPT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgICAgIGNvbnN0IGlkeCA9IGV4cGFuZFtrZXldLnByaW1hcnk7XG4gICAgICAgICAgICBjb25zdCBvYmogPSB7fTtcbiAgICAgICAgICAgIG9ialtpZHhdID0gc3RyZWFtW2tleV07XG4gICAgICAgICAgICBzdHJlYW1ba2V5XSA9IG9iajtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gc3RyZWFtO1xufVxuXG5mdW5jdGlvbiBTdHJlYW0oXG4gICAgbWV0YTogQWN0aXZpdHlTdHJlYW0sXG4pOiBBY3Rpdml0eVN0cmVhbSB8IEFjdGl2aXR5T2JqZWN0IHwgUmVjb3JkPHN0cmluZywgbmV2ZXI+IHtcbiAgICB2YWxpZGF0ZU9iamVjdChcInN0cmVhbVwiLCBtZXRhKTtcbiAgICBpZiAodHlwZW9mIG1ldGEub2JqZWN0ID09PSBcIm9iamVjdFwiKSB7XG4gICAgICAgIHZhbGlkYXRlT2JqZWN0KFwib2JqZWN0XCIsIG1ldGEub2JqZWN0KTtcbiAgICB9XG4gICAgY29uc3Qgc3RyZWFtID0gZXhwYW5kU3RyZWFtKG1ldGEpO1xuICAgIGVlLmVtaXQoXCJhY3Rpdml0eS1zdHJlYW1cIiwgc3RyZWFtKTtcbiAgICByZXR1cm4gc3RyZWFtO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEFjdGl2aXR5T2JqZWN0TWFuYWdlciB7XG4gICAgY3JlYXRlKG9iajogdW5rbm93bik6IHVua25vd247XG4gICAgZGVsZXRlKGlkOiBzdHJpbmcpOiBib29sZWFuO1xuICAgIGxpc3QoKTogSXRlcmFibGVJdGVyYXRvcjx1bmtub3duPjtcbiAgICBnZXQoaWQ6IHN0cmluZywgZXhwYW5kPzogYm9vbGVhbik6IHVua25vd247XG59XG5cbmNvbnN0IF9PYmplY3Q6IEFjdGl2aXR5T2JqZWN0TWFuYWdlciA9IHtcbiAgICBjcmVhdGU6IChvYmo6IEFjdGl2aXR5T2JqZWN0KSA9PiB7XG4gICAgICAgIHZhbGlkYXRlT2JqZWN0KFwib2JqZWN0XCIsIG9iaiwgdHJ1ZSk7IC8vIHJlcXVpcmUgSUQgZm9yIE9iamVjdC5jcmVhdGUoKVxuICAgICAgICBjb25zdCBhbyA9IGVuc3VyZVByb3BzKG9iaik7XG4gICAgICAgIG9ianMuc2V0KGFvLmlkLCBhbyk7XG4gICAgICAgIGVlLmVtaXQoXCJhY3Rpdml0eS1vYmplY3QtY3JlYXRlXCIsIGFvKTtcbiAgICAgICAgcmV0dXJuIGFvO1xuICAgIH0sXG5cbiAgICBkZWxldGU6IChpZCkgPT4ge1xuICAgICAgICBjb25zdCByZXN1bHQgPSBvYmpzLmRlbGV0ZShpZCk7XG4gICAgICAgIGlmIChyZXN1bHQpIHtcbiAgICAgICAgICAgIGVlLmVtaXQoXCJhY3Rpdml0eS1vYmplY3QtZGVsZXRlXCIsIGlkKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH0sXG5cbiAgICBnZXQ6IChpZCwgZXhwYW5kKSA9PiB7XG4gICAgICAgIGxldCBvYmogPSBvYmpzLmdldChpZCk7XG4gICAgICAgIGlmICghb2JqKSB7XG4gICAgICAgICAgICBpZiAoIWV4cGFuZCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBpZDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIG9iaiA9IHsgaWQ6IGlkIH07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGVuc3VyZVByb3BzKG9iaik7XG4gICAgfSxcblxuICAgIGxpc3Q6ICgpOiBJdGVyYWJsZUl0ZXJhdG9yPHVua25vd24+ID0+IG9ianMua2V5cygpLFxufTtcblxuZXhwb3J0IGludGVyZmFjZSBBU0ZhY3RvcnlPcHRpb25zIHtcbiAgICBzcGVjaWFsT2Jqcz86IEFycmF5PHN0cmluZz47XG4gICAgZmFpbE9uVW5rbm93bk9iamVjdFByb3BlcnRpZXM/OiBib29sZWFuO1xuICAgIHdhcm5PblVua25vd25PYmplY3RQcm9wZXJ0aWVzPzogYm9vbGVhbjtcbiAgICBjdXN0b21Qcm9wcz86IEN1c3RvbVByb3BzO1xufVxuXG50eXBlIEV2ZW50Q2FsbGJhY2sgPSAoLi4uYXJnczogdW5rbm93bltdKSA9PiB2b2lkO1xuXG5leHBvcnQgaW50ZXJmYWNlIEFTTWFuYWdlciB7XG4gICAgU3RyZWFtKG1ldGE6IHVua25vd24pOiBBY3Rpdml0eVN0cmVhbSB8IEFjdGl2aXR5T2JqZWN0O1xuICAgIE9iamVjdDogQWN0aXZpdHlPYmplY3RNYW5hZ2VyO1xuICAgIG9uKGV2ZW50OiBzdHJpbmcsIGZ1bmM6IEV2ZW50Q2FsbGJhY2spOiB2b2lkO1xuICAgIG9uY2UoZXZlbnQ6IHN0cmluZywgZnVuYzogRXZlbnRDYWxsYmFjayk6IHZvaWQ7XG4gICAgb2ZmKGV2ZW50OiBzdHJpbmcsIGZ1bmM6IEV2ZW50Q2FsbGJhY2spOiB2b2lkO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gQVNGYWN0b3J5KG9wdHM6IEFTRmFjdG9yeU9wdGlvbnMgPSB7fSk6IEFTTWFuYWdlciB7XG4gICAgc3BlY2lhbE9ianMgPSBvcHRzPy5zcGVjaWFsT2JqcyB8fCBbXTtcbiAgICBmYWlsT25Vbmtub3duT2JqZWN0UHJvcGVydGllcyA9XG4gICAgICAgIHR5cGVvZiBvcHRzLmZhaWxPblVua25vd25PYmplY3RQcm9wZXJ0aWVzID09PSBcImJvb2xlYW5cIlxuICAgICAgICAgICAgPyBvcHRzLmZhaWxPblVua25vd25PYmplY3RQcm9wZXJ0aWVzXG4gICAgICAgICAgICA6IGZhaWxPblVua25vd25PYmplY3RQcm9wZXJ0aWVzO1xuICAgIHdhcm5PblVua25vd25PYmplY3RQcm9wZXJ0aWVzID1cbiAgICAgICAgdHlwZW9mIG9wdHMud2Fybk9uVW5rbm93bk9iamVjdFByb3BlcnRpZXMgPT09IFwiYm9vbGVhblwiXG4gICAgICAgICAgICA/IG9wdHMud2Fybk9uVW5rbm93bk9iamVjdFByb3BlcnRpZXNcbiAgICAgICAgICAgIDogd2Fybk9uVW5rbm93bk9iamVjdFByb3BlcnRpZXM7XG4gICAgZm9yIChjb25zdCBwcm9wTmFtZSBvZiBPYmplY3Qua2V5cyhvcHRzLmN1c3RvbVByb3BzIHx8IHt9KSkge1xuICAgICAgICBpZiAodHlwZW9mIG9wdHMuY3VzdG9tUHJvcHNbcHJvcE5hbWVdID09PSBcIm9iamVjdFwiKSB7XG4gICAgICAgICAgICBjdXN0b21Qcm9wc1twcm9wTmFtZV0gPSBvcHRzLmN1c3RvbVByb3BzW3Byb3BOYW1lXTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICAgIFN0cmVhbTogU3RyZWFtLFxuICAgICAgICBPYmplY3Q6IF9PYmplY3QsXG4gICAgICAgIG9uOiAoZXZlbnQsIGZ1bmMpID0+IGVlLm9uKGV2ZW50LCBmdW5jKSxcbiAgICAgICAgb25jZTogKGV2ZW50LCBmdW5jKSA9PiBlZS5vbmNlKGV2ZW50LCBmdW5jKSxcbiAgICAgICAgb2ZmOiAoZXZlbnQsIGZ1bmNOYW1lKSA9PiBlZS5vZmYoZXZlbnQsIGZ1bmNOYW1lKSxcbiAgICB9IGFzIEFTTWFuYWdlcjtcbn1cblxuLy8gYmlvbWUtaWdub3JlIGxpbnQvc3VzcGljaW91cy9ub0V4cGxpY2l0QW55OiA8ZXhwbGFuYXRpb24+XG4oKGdsb2JhbDogYW55KSA9PiB7XG4gICAgZ2xvYmFsLkFTRmFjdG9yID0gQVNGYWN0b3J5O1xufSkodHlwZW9mIHdpbmRvdyA9PT0gXCJvYmplY3RcIiA/IHdpbmRvdyA6IHt9KTtcbiIKICBdLAogICJtYXBwaW5ncyI6ICI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0VBRUEsSUFBSSxNQUFNLE9BQU8sVUFBVTtBQUFBLEVBQTNCLElBQ0ksU0FBUztBQUFBLEVBU2IsU0FBUyxNQUFNLEdBQUc7QUFBQSxFQVNsQixJQUFJLE9BQU8sUUFBUTtBQUFBLElBQ2pCLE9BQU8sWUFBWSxPQUFPLE9BQU8sSUFBSTtBQUFBLElBTXJDLElBQUksQ0FBQyxJQUFJLE9BQU8sRUFBRTtBQUFBLE1BQVcsU0FBUztBQUFBLEVBQ3hDO0FBQUEsRUFXQSxTQUFTLEVBQUUsQ0FBQyxJQUFJLFNBQVMsTUFBTTtBQUFBLElBQzdCLEtBQUssS0FBSztBQUFBLElBQ1YsS0FBSyxVQUFVO0FBQUEsSUFDZixLQUFLLE9BQU8sUUFBUTtBQUFBO0FBQUEsRUFjdEIsU0FBUyxXQUFXLENBQUMsU0FBUyxPQUFPLElBQUksU0FBUyxNQUFNO0FBQUEsSUFDdEQs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QUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBR0EsSUFBTSxLQUFLLElBQUk7QUFDZixJQUFNLFlBQVk7QUFBQSxFQUNkLFFBQVE7QUFBQSxJQUNKO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxFQUNKO0FBQUEsRUFDQSxRQUFRO0FBQUEsSUFDSjtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxFQUNKO0FBQ0o7QUFDQSxJQUFNLFNBQVM7QUFBQSxFQUNYLE9BQU87QUFBQSxFQUNQLFNBQVM7QUFBQSxFQUNULE1BQU07QUFBQSxFQUNOLGFBQWE7QUFBQSxFQUNiLFlBQVk7QUFBQSxFQUNaLFVBQVU7QUFDZDtBQUNBLElBQU0sU0FBUztBQUFBLEVBQ1gsT0FBTztBQUFBLElB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SUFBTSxVQUFpQztBQUFBLEVBQ25DLFFBQVEsQ0FBQyxRQUF3QjtBQUFBLElBQzdCLGVBQWUsVUFBVSxLQUFLLElBQUk7QUFBQSxJQUNsQyxNQUFNLEtBQUssWUFBWSxHQUFHO0FBQUEsSUFDMUIsS0FBSyxJQUFJLEdBQUcsSUFBSSxFQUFFO0FBQUEsSUFDbEIsR0FBRyxLQUFLLDBCQUEwQixFQUFFO0FBQUEsSUFDcEMsT0FBTztBQUFBO0FBQUEsRUFHWCxRQUFRLENBQUMsT0FBTztBQUFBLElBQ1osTUFBTSxTQUFTLEtBQUssT0FBTyxFQUFFO0FBQUEsSUFDN0IsSUFBSSxRQUFRO0FBQUEsTUFDUixHQUFHLEtBQUssMEJBQTBCLEVBQUU7QUFBQSxJQUN4QztBQUFBLElBQ0EsT0FBTztBQUFBO0FBQUEsRUFHWCxLQUFLLENBQUMsSUFBSSxZQUFXO0FBQUEsSUFDakIsSUFBSSxNQUFNLEtBQUssSUFBSSxFQUFFO0FBQUEsSUFDckIsSUFBSSxDQUFDLEtBQUs7QUFBQSxNQUNOLElBQUksQ0FBQyxTQUFRO0FBQUEsUUFDVCxPQUFPO0FBQUEsTUFDWDtBQUFBLE1BQ0EsTUFBTSxFQUFFLEdBQU87QUFBQSxJQUNuQjtBQUFBLElBQ0EsT0FBTyxZQUFZLEdBQUc7QUFBQTtBQUFBLEVBRzFCLE1BQU0sTUFBaUMsS0FBSyxLQUFLO0FBQ3JEO0FBbUJPLFNBQVMsU0FBUyxDQUFDLE9BQXlCLENBQUMsR0FBYztBQUFBLEVBQzlELGNBQWMsTUFBTSxlQUFlLENBQUM7QUFBQSxFQUNwQyxnQ0FDSSxPQUFPLEtBQUssa0NBQWtDLFlBQ3hDLEtBQUssZ0NBQ0w7QUFBQSxFQUNWLGdDQUNJLE9BQU8sS0FBSyxrQ0FBa0MsWUFDeEMsS0FBSyxnQ0FDTDtBQUFBLEVBQ1YsV0FBVyxZQUFZLE9BQU8sS0FBSyxLQUFLLGVBQWUsQ0FBQyxDQUFDLEdBQUc7QUFBQSxJQUN4RCxJQUFJLE9BQU8sS0FBSyxZQUFZLGNBQWMsVUFBVTtBQUFBLE1BQ2hELFlBQVksWUFBWSxLQUFLLFlBQVk7QUFBQSxJQUM3QztBQUFBLEVBQ0o7QUFBQSxFQUVBLE9BQU87QUFBQSxJQUNIO0FBQUEsSUFDQSxRQUFRO0FBQUEsSUFDUixJQUFJLENBQUMsT0FBTyxTQUFTLEdBQUcsR0FBRyxPQUFPLElBQUk7QUFBQSxJQUN0QyxNQUFNLENBQUMsT0FBTyxTQUFTLEdBQUcsS0FBSyxPQUFPLElBQUk7QUFBQSxJQUMxQyxLQUFLLENBQUMsT0FBTyxhQUFhLEdBQUcsSUFBSSxPQUFPLFFBQVE7QUFBQSxFQUNwRDtBQUFBO0FBQUEsQ0FJSCxDQUFDLFdBQWdCO0FBQUEsRUFDZCxPQUFPLFdBQVc7QUFBQSxHQUNuQixPQUFPLFdBQVcsV0FBVyxTQUFTLENBQUMsQ0FBQzsiLAogICJkZWJ1Z0lkIjogIkJERjRGQTI4ODZCRUNGQjg2NDc1NkUyMTY0NzU2RTIxIiwKICAibmFtZXMiOiBbXQp9
|