@sockethub/client 5.0.0-alpha.3 → 5.0.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.
@@ -1,2600 +1,602 @@
1
- (function webpackUniversalModuleDefinition(root, factory) {
2
- if(typeof exports === 'object' && typeof module === 'object')
3
- module.exports = factory();
4
- else if(typeof define === 'function' && define.amd)
5
- define([], factory);
6
- else {
7
- var a = factory();
8
- for(var i in a) (typeof exports === 'object' ? exports : root)[i] = a[i];
9
- }
10
- })(self, function() {
11
- return /******/ (() => { // webpackBootstrap
12
- /******/ var __webpack_modules__ = ({
13
-
14
- /***/ 423:
15
- /***/ ((module, __unused_webpack_exports, __webpack_require__) => {
16
-
17
- "use strict";
18
-
19
-
20
- var isValue = __webpack_require__(132)
21
- , isPlainFunction = __webpack_require__(421)
22
- , assign = __webpack_require__(240)
23
- , normalizeOpts = __webpack_require__(343)
24
- , contains = __webpack_require__(50);
25
-
26
- var d = (module.exports = function (dscr, value/*, options*/) {
27
- var c, e, w, options, desc;
28
- if (arguments.length < 2 || typeof dscr !== "string") {
29
- options = value;
30
- value = dscr;
31
- dscr = null;
32
- } else {
33
- options = arguments[2];
34
- }
35
- if (isValue(dscr)) {
36
- c = contains.call(dscr, "c");
37
- e = contains.call(dscr, "e");
38
- w = contains.call(dscr, "w");
39
- } else {
40
- c = w = true;
41
- e = false;
42
- }
43
-
44
- desc = { value: value, configurable: c, enumerable: e, writable: w };
45
- return !options ? desc : assign(normalizeOpts(options), desc);
46
- });
47
-
48
- d.gs = function (dscr, get, set/*, options*/) {
49
- var c, e, options, desc;
50
- if (typeof dscr !== "string") {
51
- options = set;
52
- set = get;
53
- get = dscr;
54
- dscr = null;
55
- } else {
56
- options = arguments[3];
57
- }
58
- if (!isValue(get)) {
59
- get = undefined;
60
- } else if (!isPlainFunction(get)) {
61
- options = get;
62
- get = set = undefined;
63
- } else if (!isValue(set)) {
64
- set = undefined;
65
- } else if (!isPlainFunction(set)) {
66
- options = set;
67
- set = undefined;
68
- }
69
- if (isValue(dscr)) {
70
- c = contains.call(dscr, "c");
71
- e = contains.call(dscr, "e");
72
- } else {
73
- c = true;
74
- e = false;
75
- }
76
-
77
- desc = { get: get, set: set, configurable: c, enumerable: e };
78
- return !options ? desc : assign(normalizeOpts(options), desc);
79
- };
80
-
81
-
82
- /***/ }),
83
-
84
- /***/ 91:
85
- /***/ ((module) => {
86
-
87
- "use strict";
88
-
89
-
90
- // eslint-disable-next-line no-empty-function
91
- module.exports = function () {};
92
-
93
-
94
- /***/ }),
95
-
96
- /***/ 240:
97
- /***/ ((module, __unused_webpack_exports, __webpack_require__) => {
98
-
99
- "use strict";
100
-
101
-
102
- module.exports = __webpack_require__(229)() ? Object.assign : __webpack_require__(640);
103
-
104
-
105
- /***/ }),
106
-
107
- /***/ 229:
108
- /***/ ((module) => {
109
-
110
- "use strict";
111
-
112
-
113
- module.exports = function () {
114
- var assign = Object.assign, obj;
115
- if (typeof assign !== "function") return false;
116
- obj = { foo: "raz" };
117
- assign(obj, { bar: "dwa" }, { trzy: "trzy" });
118
- return obj.foo + obj.bar + obj.trzy === "razdwatrzy";
119
- };
120
-
121
-
122
- /***/ }),
123
-
124
- /***/ 640:
125
- /***/ ((module, __unused_webpack_exports, __webpack_require__) => {
126
-
127
- "use strict";
128
-
129
-
130
- var keys = __webpack_require__(255)
131
- , value = __webpack_require__(110)
132
- , max = Math.max;
133
-
134
- module.exports = function (dest, src/*, …srcn*/) {
135
- var error, i, length = max(arguments.length, 2), assign;
136
- dest = Object(value(dest));
137
- assign = function (key) {
138
- try {
139
- dest[key] = src[key];
140
- } catch (e) {
141
- if (!error) error = e;
142
- }
143
- };
144
- for (i = 1; i < length; ++i) {
145
- src = arguments[i];
146
- keys(src).forEach(assign);
147
- }
148
- if (error !== undefined) throw error;
149
- return dest;
150
- };
151
-
152
-
153
- /***/ }),
154
-
155
- /***/ 515:
156
- /***/ ((module, __unused_webpack_exports, __webpack_require__) => {
157
-
158
- "use strict";
159
-
160
-
161
- var _undefined = __webpack_require__(91)(); // Support ES3 engines
162
-
163
- module.exports = function (val) { return val !== _undefined && val !== null; };
164
-
165
-
166
- /***/ }),
167
-
168
- /***/ 255:
169
- /***/ ((module, __unused_webpack_exports, __webpack_require__) => {
170
-
171
- "use strict";
172
-
173
-
174
- module.exports = __webpack_require__(291)() ? Object.keys : __webpack_require__(184);
175
-
176
-
177
- /***/ }),
178
-
179
- /***/ 291:
180
- /***/ ((module) => {
181
-
182
- "use strict";
183
-
184
-
185
- module.exports = function () {
186
- try {
187
- Object.keys("primitive");
188
- return true;
189
- } catch (e) {
190
- return false;
191
- }
192
- };
193
-
194
-
195
- /***/ }),
196
-
197
- /***/ 184:
198
- /***/ ((module, __unused_webpack_exports, __webpack_require__) => {
199
-
200
- "use strict";
201
-
202
-
203
- var isValue = __webpack_require__(515);
204
-
205
- var keys = Object.keys;
206
-
207
- module.exports = function (object) { return keys(isValue(object) ? Object(object) : object); };
208
-
209
-
210
- /***/ }),
211
-
212
- /***/ 343:
213
- /***/ ((module, __unused_webpack_exports, __webpack_require__) => {
214
-
215
- "use strict";
216
-
217
-
218
- var isValue = __webpack_require__(515);
219
-
220
- var forEach = Array.prototype.forEach, create = Object.create;
221
-
222
- var process = function (src, obj) {
223
- var key;
224
- for (key in src) obj[key] = src[key];
225
- };
226
-
227
- // eslint-disable-next-line no-unused-vars
228
- module.exports = function (opts1/*, …options*/) {
229
- var result = create(null);
230
- forEach.call(arguments, function (options) {
231
- if (!isValue(options)) return;
232
- process(Object(options), result);
233
- });
234
- return result;
235
- };
236
-
237
-
238
- /***/ }),
239
-
240
- /***/ 979:
241
- /***/ ((module) => {
242
-
243
- "use strict";
244
-
245
-
246
- module.exports = function (fn) {
247
- if (typeof fn !== "function") throw new TypeError(fn + " is not a function");
248
- return fn;
249
- };
250
-
251
-
252
- /***/ }),
253
-
254
- /***/ 110:
255
- /***/ ((module, __unused_webpack_exports, __webpack_require__) => {
256
-
257
- "use strict";
258
-
259
-
260
- var isValue = __webpack_require__(515);
261
-
262
- module.exports = function (value) {
263
- if (!isValue(value)) throw new TypeError("Cannot use null or undefined");
264
- return value;
265
- };
266
-
267
-
268
- /***/ }),
269
-
270
- /***/ 50:
271
- /***/ ((module, __unused_webpack_exports, __webpack_require__) => {
272
-
273
- "use strict";
274
-
275
-
276
- module.exports = __webpack_require__(459)() ? String.prototype.contains : __webpack_require__(131);
277
-
278
-
279
- /***/ }),
280
-
281
- /***/ 459:
282
- /***/ ((module) => {
283
-
284
- "use strict";
285
-
286
-
287
- var str = "razdwatrzy";
288
-
289
- module.exports = function () {
290
- if (typeof str.contains !== "function") return false;
291
- return str.contains("dwa") === true && str.contains("foo") === false;
292
- };
293
-
294
-
295
- /***/ }),
296
-
297
- /***/ 131:
298
- /***/ ((module) => {
299
-
300
- "use strict";
301
-
302
-
303
- var indexOf = String.prototype.indexOf;
304
-
305
- module.exports = function (searchString/*, position*/) {
306
- return indexOf.call(this, searchString, arguments[1]) > -1;
307
- };
308
-
309
-
310
- /***/ }),
311
-
312
- /***/ 360:
313
- /***/ ((module, exports, __webpack_require__) => {
314
-
315
- "use strict";
316
-
317
-
318
- var d = __webpack_require__(423)
319
- , callable = __webpack_require__(979)
320
-
321
- , apply = Function.prototype.apply, call = Function.prototype.call
322
- , create = Object.create, defineProperty = Object.defineProperty
323
- , defineProperties = Object.defineProperties
324
- , hasOwnProperty = Object.prototype.hasOwnProperty
325
- , descriptor = { configurable: true, enumerable: false, writable: true }
326
-
327
- , on, once, off, emit, methods, descriptors, base;
328
-
329
- on = function (type, listener) {
330
- var data;
331
-
332
- callable(listener);
333
-
334
- if (!hasOwnProperty.call(this, '__ee__')) {
335
- data = descriptor.value = create(null);
336
- defineProperty(this, '__ee__', descriptor);
337
- descriptor.value = null;
338
- } else {
339
- data = this.__ee__;
340
- }
341
- if (!data[type]) data[type] = listener;
342
- else if (typeof data[type] === 'object') data[type].push(listener);
343
- else data[type] = [data[type], listener];
344
-
345
- return this;
346
- };
347
-
348
- once = function (type, listener) {
349
- var once, self;
350
-
351
- callable(listener);
352
- self = this;
353
- on.call(this, type, once = function () {
354
- off.call(self, type, once);
355
- apply.call(listener, this, arguments);
356
- });
357
-
358
- once.__eeOnceListener__ = listener;
359
- return this;
360
- };
361
-
362
- off = function (type, listener) {
363
- var data, listeners, candidate, i;
364
-
365
- callable(listener);
366
-
367
- if (!hasOwnProperty.call(this, '__ee__')) return this;
368
- data = this.__ee__;
369
- if (!data[type]) return this;
370
- listeners = data[type];
371
-
372
- if (typeof listeners === 'object') {
373
- for (i = 0; (candidate = listeners[i]); ++i) {
374
- if ((candidate === listener) ||
375
- (candidate.__eeOnceListener__ === listener)) {
376
- if (listeners.length === 2) data[type] = listeners[i ? 0 : 1];
377
- else listeners.splice(i, 1);
378
- }
379
- }
380
- } else {
381
- if ((listeners === listener) ||
382
- (listeners.__eeOnceListener__ === listener)) {
383
- delete data[type];
384
- }
385
- }
386
-
387
- return this;
388
- };
389
-
390
- emit = function (type) {
391
- var i, l, listener, listeners, args;
392
-
393
- if (!hasOwnProperty.call(this, '__ee__')) return;
394
- listeners = this.__ee__[type];
395
- if (!listeners) return;
396
-
397
- if (typeof listeners === 'object') {
398
- l = arguments.length;
399
- args = new Array(l - 1);
400
- for (i = 1; i < l; ++i) args[i - 1] = arguments[i];
401
-
402
- listeners = listeners.slice();
403
- for (i = 0; (listener = listeners[i]); ++i) {
404
- apply.call(listener, this, args);
405
- }
406
- } else {
407
- switch (arguments.length) {
408
- case 1:
409
- call.call(listeners, this);
410
- break;
411
- case 2:
412
- call.call(listeners, this, arguments[1]);
413
- break;
414
- case 3:
415
- call.call(listeners, this, arguments[1], arguments[2]);
416
- break;
417
- default:
418
- l = arguments.length;
419
- args = new Array(l - 1);
420
- for (i = 1; i < l; ++i) {
421
- args[i - 1] = arguments[i];
422
- }
423
- apply.call(listeners, this, args);
424
- }
425
- }
426
- };
427
-
428
- methods = {
429
- on: on,
430
- once: once,
431
- off: off,
432
- emit: emit
433
- };
434
-
435
- descriptors = {
436
- on: d(on),
437
- once: d(once),
438
- off: d(off),
439
- emit: d(emit)
440
- };
441
-
442
- base = defineProperties({}, descriptors);
443
-
444
- module.exports = exports = function (o) {
445
- return (o == null) ? create(base) : defineProperties(Object(o), descriptors);
446
- };
447
- exports.methods = methods;
448
-
449
-
450
- /***/ }),
451
-
452
- /***/ 414:
453
- /***/ ((module, __unused_webpack_exports, __webpack_require__) => {
454
-
455
- "use strict";
456
-
457
-
458
- var isPrototype = __webpack_require__(670);
459
-
460
- module.exports = function (value) {
461
- if (typeof value !== "function") return false;
462
-
463
- if (!hasOwnProperty.call(value, "length")) return false;
464
-
465
- try {
466
- if (typeof value.length !== "number") return false;
467
- if (typeof value.call !== "function") return false;
468
- if (typeof value.apply !== "function") return false;
469
- } catch (error) {
470
- return false;
471
- }
472
-
473
- return !isPrototype(value);
474
- };
475
-
476
-
477
- /***/ }),
478
-
479
- /***/ 783:
480
- /***/ ((module, __unused_webpack_exports, __webpack_require__) => {
481
-
482
- "use strict";
483
-
484
-
485
- var isValue = __webpack_require__(132);
486
-
487
- // prettier-ignore
488
- var possibleTypes = { "object": true, "function": true, "undefined": true /* document.all */ };
489
-
490
- module.exports = function (value) {
491
- if (!isValue(value)) return false;
492
- return hasOwnProperty.call(possibleTypes, typeof value);
493
- };
494
-
495
-
496
- /***/ }),
497
-
498
- /***/ 421:
499
- /***/ ((module, __unused_webpack_exports, __webpack_require__) => {
500
-
501
- "use strict";
502
-
503
-
504
- var isFunction = __webpack_require__(414);
505
-
506
- var classRe = /^\s*class[\s{/}]/, functionToString = Function.prototype.toString;
507
-
508
- module.exports = function (value) {
509
- if (!isFunction(value)) return false;
510
- if (classRe.test(functionToString.call(value))) return false;
511
- return true;
512
- };
513
-
514
-
515
- /***/ }),
516
-
517
- /***/ 670:
518
- /***/ ((module, __unused_webpack_exports, __webpack_require__) => {
519
-
520
- "use strict";
521
-
522
-
523
- var isObject = __webpack_require__(783);
524
-
525
- module.exports = function (value) {
526
- if (!isObject(value)) return false;
527
- try {
528
- if (!value.constructor) return false;
529
- return value.constructor.prototype === value;
530
- } catch (error) {
531
- return false;
532
- }
533
- };
534
-
535
-
536
- /***/ }),
537
-
538
- /***/ 132:
539
- /***/ ((module) => {
540
-
541
- "use strict";
542
-
543
-
544
- // ES3 safe
545
- var _undefined = void 0;
546
-
547
- module.exports = function (value) { return value !== _undefined && value !== null; };
548
-
549
-
550
- /***/ }),
551
-
552
- /***/ 744:
553
- /***/ ((module, __unused_webpack_exports, __webpack_require__) => {
554
-
555
- /*!
556
- * activity-streams
557
- * https://github.com/silverbucket/activity-streams
558
- *
559
- * Developed and Maintained by:
560
- * Nick Jennings <nick@silverbucket.net>
561
- *
562
- * activity-streams is released under the MIT (see LICENSE).
563
- *
564
- * You don't have to do anything special to choose one license or the other
565
- * and you don't have to notify anyone which license you are using.
566
- * Please see the corresponding license file for details of these licenses.
567
- * You are free to use, modify and distribute this software, but all copyright
568
- * information must remain.
569
- *
570
- */
571
-
572
-
573
- const EventEmitter = __webpack_require__(360);
574
-
575
- const ee = EventEmitter(),
576
- baseProps = {
577
- stream: [
578
- 'id', 'type', 'actor', 'target', 'object', 'context', 'context',
579
- 'published', 'error'
580
- ],
581
- object: [
582
- 'id', 'type', 'context',
583
- 'alias', 'attachedTo', 'attachment', 'attributedTo', 'attributedWith',
584
- 'content', 'contentMap', 'context', 'contextOf', 'name', 'endTime', 'generator',
585
- 'generatorOf', 'group', 'icon', 'image', 'inReplyTo', 'members', 'memberOf',
586
- 'message', 'location', 'locationOf', 'objectOf', 'originOf', 'presence',
587
- 'preview', 'previewOf', 'provider', 'providerOf', 'published', 'rating',
588
- 'relationship', 'resultOf', 'replies', 'role', 'scope', 'scopeOf', 'startTime',
589
- 'status', 'summary', 'topic', 'tag', 'tagOf', 'targetOf', 'title', 'titleMap',
590
- 'updated', 'url'
591
- ]
592
- },
593
- rename = {
594
- '@id': 'id',
595
- '@type': 'type',
596
- 'verb': 'type',
597
- 'displayName': 'name',
598
- 'objectType': 'type',
599
- 'platform': 'context'
600
- },
601
- expand = {
602
- 'actor' : {
603
- 'primary': 'id',
604
- 'props': baseProps
605
- },
606
- 'target': {
607
- 'primary': 'id',
608
- 'props': baseProps
609
- },
610
- 'object': {
611
- 'primary': 'content',
612
- 'props': baseProps
613
- }
614
- };
615
-
616
- let objs = new Map(),
617
- failOnUnknownObjectProperties = false,
618
- specialObjs = [], // the objects don't get rejected for bad props
619
- customProps = {};
620
-
621
-
622
- function matchesCustomProp(type, key) {
623
- return !!((typeof customProps[type] === 'object') && (customProps[type].includes(key)));
624
- }
625
-
626
- function renameProp(obj, key) {
627
- obj[rename[key]] = obj[key];
628
- delete obj[key];
629
- return obj;
630
- }
631
-
632
- function validateObject(type, obj = {}) {
633
- const unknownKeys = Object.keys(obj).filter((key) => {
634
- if (! baseProps[type].includes(key)) {
635
- return key;
636
- }
637
- });
638
-
639
- for (let key of unknownKeys) {
640
- if (rename[key]) {
641
- // rename property instead of fail
642
- obj = renameProp(obj, key)
643
- continue;
644
- }
645
-
646
- if (matchesCustomProp(obj.type, key)) {
647
- // custom property matches, continue
648
- continue;
649
- }
650
-
651
- if (! specialObjs.includes(obj.type)) {
652
- // not defined as a special prop
653
- // don't know what to do with it, so throw error
654
- const err = `invalid property: "${key}"`;
655
- if (failOnUnknownObjectProperties) {
656
- throw new Error(err);
657
- } else {
658
- console.warn(err);
659
- }
660
- }
661
- }
662
- }
663
-
664
-
665
- function ensureProps(obj) {
666
- // ensure the name property, which can general be inferred from the id
667
- // name = obj.match(/(?(?\w+):\/\/)(?:.+@)?(.+?)(?:\/|$)/)[1]
668
- return obj;
669
- }
670
-
671
- function expandStream(meta) {
672
- let stream = {};
673
- for (let key of Object.keys(meta)) {
674
- if (typeof meta[key] === 'string') {
675
- stream[key] = objs.get(meta[key]) || meta[key];
676
- } else if (Array.isArray(meta[key])) {
677
- stream[key] = [];
678
- for (let entry of meta[key]) {
679
- if (typeof entry === 'string') {
680
- stream[key].push(objs.get(entry) || entry);
681
- }
682
- }
683
- } else {
684
- stream[key] = meta[key];
685
- }
686
- }
687
-
688
- // only expand string into objects if they are in the expand list
689
- for (let key of Object.keys(expand)) {
690
- if (typeof stream[key] === 'string') {
691
- const idx = expand[key].primary;
692
- let obj = {};
693
- obj[idx] = stream[key];
694
- stream[key] = obj;
695
- }
696
- }
697
- return stream;
698
- }
699
-
700
- function Stream(meta) {
701
- validateObject('stream', meta);
702
- if (typeof meta.object === 'object') {
703
- validateObject('object', meta.object);
704
- }
705
- const stream = expandStream(meta)
706
- ee.emit('activity-stream', stream);
707
- return stream;
708
- }
709
-
710
-
711
- const _Object = {
712
- create: function (obj) {
713
- validateObject('object', obj);
714
- obj = ensureProps(obj);
715
- objs.set(obj.id, obj);
716
- ee.emit('activity-object-create', obj);
717
- return obj;
718
- },
719
-
720
- delete: function (id) {
721
- const result = objs.delete(id);
722
- if (result) {
723
- ee.emit('activity-object-delete', id);
724
- }
725
- return result;
726
- },
727
-
728
- get: function (id, expand) {
729
- let obj = objs.get(id);
730
- if (! obj) {
731
- if (! expand) {
732
- return id;
733
- }
734
- obj = {'id': id};
735
- }
736
- return ensureProps(obj);
737
- },
738
-
739
- list: function () {
740
- return objs.keys();
741
- }
742
- };
743
-
744
-
745
- function ASFactory(opts = {}) {
746
- specialObjs = opts.specialObjs || [];
747
- failOnUnknownObjectProperties = typeof opts.failOnUnknownObjectProperties === 'boolean' ? opts.failOnUnknownObjectProperties : false;
748
- for (let propName of Object.keys(opts.customProps || {})) {
749
- if (typeof opts.customProps[propName] === 'object') {
750
- customProps[propName] = opts.customProps[propName];
751
- }
752
- }
753
-
754
- return {
755
- Stream: Stream,
756
- Object: _Object,
757
- on: function (event, func) {
758
- return ee.on(event, func);
759
- },
760
- once: function (event, func) {
761
- return ee.once(event, func);
762
- },
763
- off: function (event, funcName) {
764
- return ee.off(event, funcName);
765
- }
766
- };
767
- }
768
-
769
- if ( true && module.exports) {
770
- module.exports = ASFactory
771
- }
772
- if (typeof window === 'object') {
773
- window.ASFactory = ASFactory;
774
- }
775
-
776
-
777
- /***/ }),
778
-
779
- /***/ 650:
780
- /***/ (function(module, exports, __webpack_require__) {
781
-
782
- "use strict";
783
-
784
- var __importDefault = (this && this.__importDefault) || function (mod) {
785
- return (mod && mod.__esModule) ? mod : { "default": mod };
786
- };
787
- Object.defineProperty(exports, "__esModule", ({ value: true }));
788
- const eventemitter2_1 = __webpack_require__(387);
789
- const activity_streams_1 = __importDefault(__webpack_require__(744));
790
- class SockethubClient {
791
- constructor(socket) {
792
- this.events = {
793
- 'credentials': new Map(),
794
- 'activity-object': new Map(),
795
- 'connect': new Map(),
796
- 'join': new Map()
797
- };
798
- this.online = false;
799
- this.debug = true;
800
- if (!socket) {
801
- throw new Error('SockethubClient requires a socket.io instance');
802
- }
803
- this._socket = socket;
804
- // @ts-ignore
805
- this.ActivityStreams = (0, activity_streams_1.default)({ specialObjs: ['credentials'] });
806
- this.socket = this.createPublicEmitter();
807
- this.registerSocketIOHandlers();
808
- this.ActivityStreams.on('activity-object-create', (obj) => {
809
- socket.emit('activity-object', obj, (err) => {
810
- if (err) {
811
- console.error('failed to create activity-object ', err);
812
- }
813
- else {
814
- this.eventActivityObject(obj);
815
- }
816
- });
817
- });
818
- socket.on('activity-object', (obj) => {
819
- this.ActivityStreams.Object.create(obj);
820
- });
821
- }
822
- createPublicEmitter() {
823
- let socket = new eventemitter2_1.EventEmitter2({
824
- wildcard: true,
825
- verboseMemoryLeak: false
826
- });
827
- // @ts-ignore
828
- socket._emit = socket.emit;
829
- socket.emit = (event, content, callback) => {
830
- if (event === 'credentials') {
831
- this.eventCredentials(content);
832
- }
833
- else if (event === 'activity-object') {
834
- this.eventActivityObject(content);
835
- }
836
- else if (event === 'message') {
837
- this.eventMessage(content);
838
- }
839
- this._socket.emit(event, content, callback);
840
- };
841
- return socket;
842
- }
843
- eventActivityObject(content) {
844
- if (content.id) {
845
- this.events['activity-object'].set(content.id, content);
846
- }
847
- }
848
- eventCredentials(content) {
849
- if ((content.object) && (content.object.type === 'credentials')) {
850
- this.events['credentials'].set(content.actor.id || content.actor, content);
851
- }
852
- }
853
- eventMessage(content) {
854
- if (!this.online) {
855
- return;
856
- }
857
- // either store or delete the specified content onto the storedJoins map,
858
- // for reply once we're back online.
859
- const key = SockethubClient.getKey(content);
860
- if (content.type === 'join' || content.type === 'connect') {
861
- this.events[content.type].set(key, content);
862
- }
863
- else if (content.type === 'leave') {
864
- this.events['join'].delete(key);
865
- }
866
- else if (content.type === 'disconnect') {
867
- this.events['connect'].delete(key);
868
- }
869
- }
870
- static getKey(content) {
871
- var _a;
872
- let actor = ((_a = content.actor) === null || _a === void 0 ? void 0 : _a.id) || content.actor;
873
- if (!actor) {
874
- throw new Error("actor property not present for message type: " + (content === null || content === void 0 ? void 0 : content.type));
875
- }
876
- let target = content.target ? content.target.id || content.target : '';
877
- return actor + '-' + target;
878
- }
879
- log(msg, obj) {
880
- if (this.debug) {
881
- // eslint-disable-next-line security-node/detect-crlf
882
- console.log(msg, obj);
883
- }
884
- }
885
- registerSocketIOHandlers() {
886
- // middleware for events which don't deal in AS objects
887
- const callHandler = (event) => {
888
- return (obj, cb) => {
889
- if (event === 'connect') {
890
- this.online = true;
891
- this.replay('activity-object', this.events['activity-object']);
892
- this.replay('credentials', this.events['credentials']);
893
- this.replay('message', this.events['connect']);
894
- this.replay('message', this.events['join']);
895
- }
896
- else if (event === 'disconnect') {
897
- this.online = false;
898
- }
899
- this.socket._emit(event, obj, cb);
900
- };
901
- };
902
- // register for events that give us information on connection status
903
- this._socket.on('connect', callHandler('connect'));
904
- this._socket.on('connect_error', callHandler('connect_error'));
905
- this._socket.on('disconnect', callHandler('disconnect'));
906
- // use as a middleware to receive incoming Sockethub messages and unpack them
907
- // using the ActivityStreams library before passing them along to the app.
908
- this._socket.on('message', (obj, cb) => {
909
- this.socket._emit('message', this.ActivityStreams.Stream(obj), cb);
910
- });
911
- }
912
- replay(name, asMap) {
913
- asMap.forEach((obj) => {
914
- this.log(`replaying ${name}`, obj);
915
- this._socket.emit(name, obj);
916
- });
917
- }
918
- ;
919
- }
920
- if ( true && module.exports) {
921
- module.exports = SockethubClient;
922
- }
923
- if (true) {
924
- exports = SockethubClient; // lgtm [js/useless-assignment-to-local]
925
- }
926
- // @ts-ignore
927
- if (typeof window === 'object') {
928
- // @ts-ignore
929
- window.SockethubClient = SockethubClient;
930
- }
931
- //# sourceMappingURL=/sockethub-client.js.map
932
-
933
- /***/ }),
934
-
935
- /***/ 387:
936
- /***/ ((module, exports, __webpack_require__) => {
937
-
938
- var __WEBPACK_AMD_DEFINE_RESULT__;/*!
939
- * EventEmitter2
940
- * https://github.com/hij1nx/EventEmitter2
941
- *
942
- * Copyright (c) 2013 hij1nx
943
- * Licensed under the MIT license.
944
- */
945
- ;!function(undefined) {
946
- var hasOwnProperty= Object.hasOwnProperty;
947
- var isArray = Array.isArray ? Array.isArray : function _isArray(obj) {
948
- return Object.prototype.toString.call(obj) === "[object Array]";
949
- };
950
- var defaultMaxListeners = 10;
951
- var nextTickSupported= typeof process=='object' && typeof process.nextTick=='function';
952
- var symbolsSupported= typeof Symbol==='function';
953
- var reflectSupported= typeof Reflect === 'object';
954
- var setImmediateSupported= typeof setImmediate === 'function';
955
- var _setImmediate= setImmediateSupported ? setImmediate : setTimeout;
956
- var ownKeys= symbolsSupported? (reflectSupported && typeof Reflect.ownKeys==='function'? Reflect.ownKeys : function(obj){
957
- var arr= Object.getOwnPropertyNames(obj);
958
- arr.push.apply(arr, Object.getOwnPropertySymbols(obj));
959
- return arr;
960
- }) : Object.keys;
961
-
962
- function init() {
963
- this._events = {};
964
- if (this._conf) {
965
- configure.call(this, this._conf);
966
- }
967
- }
968
-
969
- function configure(conf) {
970
- if (conf) {
971
- this._conf = conf;
972
-
973
- conf.delimiter && (this.delimiter = conf.delimiter);
974
-
975
- if(conf.maxListeners!==undefined){
976
- this._maxListeners= conf.maxListeners;
977
- }
978
-
979
- conf.wildcard && (this.wildcard = conf.wildcard);
980
- conf.newListener && (this._newListener = conf.newListener);
981
- conf.removeListener && (this._removeListener = conf.removeListener);
982
- conf.verboseMemoryLeak && (this.verboseMemoryLeak = conf.verboseMemoryLeak);
983
- conf.ignoreErrors && (this.ignoreErrors = conf.ignoreErrors);
984
-
985
- if (this.wildcard) {
986
- this.listenerTree = {};
987
- }
988
- }
989
- }
990
-
991
- function logPossibleMemoryLeak(count, eventName) {
992
- var errorMsg = '(node) warning: possible EventEmitter memory ' +
993
- 'leak detected. ' + count + ' listeners added. ' +
994
- 'Use emitter.setMaxListeners() to increase limit.';
995
-
996
- if(this.verboseMemoryLeak){
997
- errorMsg += ' Event name: ' + eventName + '.';
998
- }
999
-
1000
- if(typeof process !== 'undefined' && process.emitWarning){
1001
- var e = new Error(errorMsg);
1002
- e.name = 'MaxListenersExceededWarning';
1003
- e.emitter = this;
1004
- e.count = count;
1005
- process.emitWarning(e);
1006
- } else {
1007
- console.error(errorMsg);
1008
-
1009
- if (console.trace){
1010
- console.trace();
1011
- }
1012
- }
1013
- }
1014
-
1015
- var toArray = function (a, b, c) {
1016
- var n = arguments.length;
1017
- switch (n) {
1018
- case 0:
1019
- return [];
1020
- case 1:
1021
- return [a];
1022
- case 2:
1023
- return [a, b];
1024
- case 3:
1025
- return [a, b, c];
1026
- default:
1027
- var arr = new Array(n);
1028
- while (n--) {
1029
- arr[n] = arguments[n];
1030
- }
1031
- return arr;
1032
- }
1033
- };
1034
-
1035
- function toObject(keys, values) {
1036
- var obj = {};
1037
- var key;
1038
- var len = keys.length;
1039
- var valuesCount = values ? value.length : 0;
1040
- for (var i = 0; i < len; i++) {
1041
- key = keys[i];
1042
- obj[key] = i < valuesCount ? values[i] : undefined;
1043
- }
1044
- return obj;
1045
- }
1046
-
1047
- function TargetObserver(emitter, target, options) {
1048
- this._emitter = emitter;
1049
- this._target = target;
1050
- this._listeners = {};
1051
- this._listenersCount = 0;
1052
-
1053
- var on, off;
1054
-
1055
- if (options.on || options.off) {
1056
- on = options.on;
1057
- off = options.off;
1058
- }
1059
-
1060
- if (target.addEventListener) {
1061
- on = target.addEventListener;
1062
- off = target.removeEventListener;
1063
- } else if (target.addListener) {
1064
- on = target.addListener;
1065
- off = target.removeListener;
1066
- } else if (target.on) {
1067
- on = target.on;
1068
- off = target.off;
1069
- }
1070
-
1071
- if (!on && !off) {
1072
- throw Error('target does not implement any known event API');
1073
- }
1074
-
1075
- if (typeof on !== 'function') {
1076
- throw TypeError('on method must be a function');
1077
- }
1078
-
1079
- if (typeof off !== 'function') {
1080
- throw TypeError('off method must be a function');
1081
- }
1082
-
1083
- this._on = on;
1084
- this._off = off;
1085
-
1086
- var _observers= emitter._observers;
1087
- if(_observers){
1088
- _observers.push(this);
1089
- }else{
1090
- emitter._observers= [this];
1091
- }
1092
- }
1093
-
1094
- Object.assign(TargetObserver.prototype, {
1095
- subscribe: function(event, localEvent, reducer){
1096
- var observer= this;
1097
- var target= this._target;
1098
- var emitter= this._emitter;
1099
- var listeners= this._listeners;
1100
- var handler= function(){
1101
- var args= toArray.apply(null, arguments);
1102
- var eventObj= {
1103
- data: args,
1104
- name: localEvent,
1105
- original: event
1106
- };
1107
- if(reducer){
1108
- var result= reducer.call(target, eventObj);
1109
- if(result!==false){
1110
- emitter.emit.apply(emitter, [eventObj.name].concat(args))
1111
- }
1112
- return;
1113
- }
1114
- emitter.emit.apply(emitter, [localEvent].concat(args));
1115
- };
1116
-
1117
-
1118
- if(listeners[event]){
1119
- throw Error('Event \'' + event + '\' is already listening');
1120
- }
1121
-
1122
- this._listenersCount++;
1123
-
1124
- if(emitter._newListener && emitter._removeListener && !observer._onNewListener){
1125
-
1126
- this._onNewListener = function (_event) {
1127
- if (_event === localEvent && listeners[event] === null) {
1128
- listeners[event] = handler;
1129
- observer._on.call(target, event, handler);
1130
- }
1131
- };
1132
-
1133
- emitter.on('newListener', this._onNewListener);
1134
-
1135
- this._onRemoveListener= function(_event){
1136
- if(_event === localEvent && !emitter.hasListeners(_event) && listeners[event]){
1137
- listeners[event]= null;
1138
- observer._off.call(target, event, handler);
1139
- }
1140
- };
1141
-
1142
- listeners[event]= null;
1143
-
1144
- emitter.on('removeListener', this._onRemoveListener);
1145
- }else{
1146
- listeners[event]= handler;
1147
- observer._on.call(target, event, handler);
1148
- }
1149
- },
1150
-
1151
- unsubscribe: function(event){
1152
- var observer= this;
1153
- var listeners= this._listeners;
1154
- var emitter= this._emitter;
1155
- var handler;
1156
- var events;
1157
- var off= this._off;
1158
- var target= this._target;
1159
- var i;
1160
-
1161
- if(event && typeof event!=='string'){
1162
- throw TypeError('event must be a string');
1163
- }
1164
-
1165
- function clearRefs(){
1166
- if(observer._onNewListener){
1167
- emitter.off('newListener', observer._onNewListener);
1168
- emitter.off('removeListener', observer._onRemoveListener);
1169
- observer._onNewListener= null;
1170
- observer._onRemoveListener= null;
1171
- }
1172
- var index= findTargetIndex.call(emitter, observer);
1173
- emitter._observers.splice(index, 1);
1174
- }
1175
-
1176
- if(event){
1177
- handler= listeners[event];
1178
- if(!handler) return;
1179
- off.call(target, event, handler);
1180
- delete listeners[event];
1181
- if(!--this._listenersCount){
1182
- clearRefs();
1183
- }
1184
- }else{
1185
- events= ownKeys(listeners);
1186
- i= events.length;
1187
- while(i-->0){
1188
- event= events[i];
1189
- off.call(target, event, listeners[event]);
1190
- }
1191
- this._listeners= {};
1192
- this._listenersCount= 0;
1193
- clearRefs();
1194
- }
1195
- }
1196
- });
1197
-
1198
- function resolveOptions(options, schema, reducers, allowUnknown) {
1199
- var computedOptions = Object.assign({}, schema);
1200
-
1201
- if (!options) return computedOptions;
1202
-
1203
- if (typeof options !== 'object') {
1204
- throw TypeError('options must be an object')
1205
- }
1206
-
1207
- var keys = Object.keys(options);
1208
- var length = keys.length;
1209
- var option, value;
1210
- var reducer;
1211
-
1212
- function reject(reason) {
1213
- throw Error('Invalid "' + option + '" option value' + (reason ? '. Reason: ' + reason : ''))
1214
- }
1215
-
1216
- for (var i = 0; i < length; i++) {
1217
- option = keys[i];
1218
- if (!allowUnknown && !hasOwnProperty.call(schema, option)) {
1219
- throw Error('Unknown "' + option + '" option');
1220
- }
1221
- value = options[option];
1222
- if (value !== undefined) {
1223
- reducer = reducers[option];
1224
- computedOptions[option] = reducer ? reducer(value, reject) : value;
1225
- }
1226
- }
1227
- return computedOptions;
1228
- }
1229
-
1230
- function constructorReducer(value, reject) {
1231
- if (typeof value !== 'function' || !value.hasOwnProperty('prototype')) {
1232
- reject('value must be a constructor');
1233
- }
1234
- return value;
1235
- }
1236
-
1237
- function makeTypeReducer(types) {
1238
- var message= 'value must be type of ' + types.join('|');
1239
- var len= types.length;
1240
- var firstType= types[0];
1241
- var secondType= types[1];
1242
-
1243
- if (len === 1) {
1244
- return function (v, reject) {
1245
- if (typeof v === firstType) {
1246
- return v;
1247
- }
1248
- reject(message);
1249
- }
1250
- }
1251
-
1252
- if (len === 2) {
1253
- return function (v, reject) {
1254
- var kind= typeof v;
1255
- if (kind === firstType || kind === secondType) return v;
1256
- reject(message);
1257
- }
1258
- }
1259
-
1260
- return function (v, reject) {
1261
- var kind = typeof v;
1262
- var i = len;
1263
- while (i-- > 0) {
1264
- if (kind === types[i]) return v;
1265
- }
1266
- reject(message);
1267
- }
1268
- }
1269
-
1270
- var functionReducer= makeTypeReducer(['function']);
1271
-
1272
- var objectFunctionReducer= makeTypeReducer(['object', 'function']);
1273
-
1274
- function makeCancelablePromise(Promise, executor, options) {
1275
- var isCancelable;
1276
- var callbacks;
1277
- var timer= 0;
1278
- var subscriptionClosed;
1279
-
1280
- var promise = new Promise(function (resolve, reject, onCancel) {
1281
- options= resolveOptions(options, {
1282
- timeout: 0,
1283
- overload: false
1284
- }, {
1285
- timeout: function(value, reject){
1286
- value*= 1;
1287
- if (typeof value !== 'number' || value < 0 || !Number.isFinite(value)) {
1288
- reject('timeout must be a positive number');
1289
- }
1290
- return value;
1291
- }
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
1292
14
  });
1293
-
1294
- isCancelable = !options.overload && typeof Promise.prototype.cancel === 'function' && typeof onCancel === 'function';
1295
-
1296
- function cleanup() {
1297
- if (callbacks) {
1298
- callbacks = null;
1299
- }
1300
- if (timer) {
1301
- clearTimeout(timer);
1302
- timer = 0;
1303
- }
1304
- }
1305
-
1306
- var _resolve= function(value){
1307
- cleanup();
1308
- resolve(value);
1309
- };
1310
-
1311
- var _reject= function(err){
1312
- cleanup();
1313
- reject(err);
1314
- };
1315
-
1316
- if (isCancelable) {
1317
- executor(_resolve, _reject, onCancel);
1318
- } else {
1319
- callbacks = [function(reason){
1320
- _reject(reason || Error('canceled'));
1321
- }];
1322
- executor(_resolve, _reject, function (cb) {
1323
- if (subscriptionClosed) {
1324
- throw Error('Unable to subscribe on cancel event asynchronously')
1325
- }
1326
- if (typeof cb !== 'function') {
1327
- throw TypeError('onCancel callback must be a function');
1328
- }
1329
- callbacks.push(cb);
1330
- });
1331
- subscriptionClosed= true;
1332
- }
1333
-
1334
- if (options.timeout > 0) {
1335
- timer= setTimeout(function(){
1336
- var reason= Error('timeout');
1337
- reason.code = 'ETIMEDOUT'
1338
- timer= 0;
1339
- promise.cancel(reason);
1340
- reject(reason);
1341
- }, options.timeout);
1342
- }
1343
- });
1344
-
1345
- if (!isCancelable) {
1346
- promise.cancel = function (reason) {
1347
- if (!callbacks) {
1348
- return;
1349
- }
1350
- var length = callbacks.length;
1351
- for (var i = 1; i < length; i++) {
1352
- callbacks[i](reason);
1353
- }
1354
- // internal callback to reject the promise
1355
- callbacks[0](reason);
1356
- callbacks = null;
1357
- };
1358
- }
1359
-
1360
- return promise;
1361
- }
1362
-
1363
- function findTargetIndex(observer) {
1364
- var observers = this._observers;
1365
- if(!observers){
1366
- return -1;
1367
- }
1368
- var len = observers.length;
1369
- for (var i = 0; i < len; i++) {
1370
- if (observers[i]._target === observer) return i;
1371
- }
1372
- return -1;
1373
- }
1374
-
1375
- // Attention, function return type now is array, always !
1376
- // It has zero elements if no any matches found and one or more
1377
- // elements (leafs) if there are matches
1378
- //
1379
- function searchListenerTree(handlers, type, tree, i, typeLength) {
1380
- if (!tree) {
1381
- return null;
1382
- }
1383
-
1384
- if (i === 0) {
1385
- var kind = typeof type;
1386
- if (kind === 'string') {
1387
- var ns, n, l = 0, j = 0, delimiter = this.delimiter, dl = delimiter.length;
1388
- if ((n = type.indexOf(delimiter)) !== -1) {
1389
- ns = new Array(5);
1390
- do {
1391
- ns[l++] = type.slice(j, n);
1392
- j = n + dl;
1393
- } while ((n = type.indexOf(delimiter, j)) !== -1);
1394
-
1395
- ns[l++] = type.slice(j);
1396
- type = ns;
1397
- typeLength = l;
1398
- } else {
1399
- type = [type];
1400
- typeLength = 1;
1401
- }
1402
- } else if (kind === 'object') {
1403
- typeLength = type.length;
1404
- } else {
1405
- type = [type];
1406
- typeLength = 1;
1407
- }
1408
- }
1409
-
1410
- var listeners= null, branch, xTree, xxTree, isolatedBranch, endReached, currentType = type[i],
1411
- nextType = type[i + 1], branches, _listeners;
1412
-
1413
- if (i === typeLength) {
1414
- //
1415
- // If at the end of the event(s) list and the tree has listeners
1416
- // invoke those listeners.
1417
- //
1418
-
1419
- if(tree._listeners) {
1420
- if (typeof tree._listeners === 'function') {
1421
- handlers && handlers.push(tree._listeners);
1422
- listeners = [tree];
1423
- } else {
1424
- handlers && handlers.push.apply(handlers, tree._listeners);
1425
- listeners = [tree];
1426
- }
1427
- }
1428
- } else {
1429
-
1430
- if (currentType === '*') {
1431
- //
1432
- // If the event emitted is '*' at this part
1433
- // or there is a concrete match at this patch
1434
- //
1435
- branches = ownKeys(tree);
1436
- n = branches.length;
1437
- while (n-- > 0) {
1438
- branch = branches[n];
1439
- if (branch !== '_listeners') {
1440
- _listeners = searchListenerTree(handlers, type, tree[branch], i + 1, typeLength);
1441
- if (_listeners) {
1442
- if (listeners) {
1443
- listeners.push.apply(listeners, _listeners);
1444
- } else {
1445
- listeners = _listeners;
1446
- }
1447
- }
1448
- }
1449
- }
1450
- return listeners;
1451
- } else if (currentType === '**') {
1452
- endReached = (i + 1 === typeLength || (i + 2 === typeLength && nextType === '*'));
1453
- if (endReached && tree._listeners) {
1454
- // The next element has a _listeners, add it to the handlers.
1455
- listeners = searchListenerTree(handlers, type, tree, typeLength, typeLength);
1456
- }
1457
-
1458
- branches = ownKeys(tree);
1459
- n = branches.length;
1460
- while (n-- > 0) {
1461
- branch = branches[n];
1462
- if (branch !== '_listeners') {
1463
- if (branch === '*' || branch === '**') {
1464
- if (tree[branch]._listeners && !endReached) {
1465
- _listeners = searchListenerTree(handlers, type, tree[branch], typeLength, typeLength);
1466
- if (_listeners) {
1467
- if (listeners) {
1468
- listeners.push.apply(listeners, _listeners);
1469
- } else {
1470
- listeners = _listeners;
1471
- }
1472
- }
1473
- }
1474
- _listeners = searchListenerTree(handlers, type, tree[branch], i, typeLength);
1475
- } else if (branch === nextType) {
1476
- _listeners = searchListenerTree(handlers, type, tree[branch], i + 2, typeLength);
1477
- } else {
1478
- // No match on this one, shift into the tree but not in the type array.
1479
- _listeners = searchListenerTree(handlers, type, tree[branch], i, typeLength);
1480
- }
1481
- if (_listeners) {
1482
- if (listeners) {
1483
- listeners.push.apply(listeners, _listeners);
1484
- } else {
1485
- listeners = _listeners;
1486
- }
1487
- }
1488
- }
1489
- }
1490
- return listeners;
1491
- } else if (tree[currentType]) {
1492
- listeners = searchListenerTree(handlers, type, tree[currentType], i + 1, typeLength);
1493
- }
1494
- }
1495
-
1496
- xTree = tree['*'];
1497
- if (xTree) {
1498
- //
1499
- // If the listener tree will allow any match for this part,
1500
- // then recursively explore all branches of the tree
1501
- //
1502
- searchListenerTree(handlers, type, xTree, i + 1, typeLength);
1503
- }
1504
-
1505
- xxTree = tree['**'];
1506
- if (xxTree) {
1507
- if (i < typeLength) {
1508
- if (xxTree._listeners) {
1509
- // If we have a listener on a '**', it will catch all, so add its handler.
1510
- searchListenerTree(handlers, type, xxTree, typeLength, typeLength);
1511
- }
1512
-
1513
- // Build arrays of matching next branches and others.
1514
- branches= ownKeys(xxTree);
1515
- n= branches.length;
1516
- while(n-->0){
1517
- branch= branches[n];
1518
- if (branch !== '_listeners') {
1519
- if (branch === nextType) {
1520
- // We know the next element will match, so jump twice.
1521
- searchListenerTree(handlers, type, xxTree[branch], i + 2, typeLength);
1522
- } else if (branch === currentType) {
1523
- // Current node matches, move into the tree.
1524
- searchListenerTree(handlers, type, xxTree[branch], i + 1, typeLength);
1525
- } else {
1526
- isolatedBranch = {};
1527
- isolatedBranch[branch] = xxTree[branch];
1528
- searchListenerTree(handlers, type, {'**': isolatedBranch}, i + 1, typeLength);
1529
- }
1530
- }
1531
- }
1532
- } else if (xxTree._listeners) {
1533
- // We have reached the end and still on a '**'
1534
- searchListenerTree(handlers, type, xxTree, typeLength, typeLength);
1535
- } else if (xxTree['*'] && xxTree['*']._listeners) {
1536
- searchListenerTree(handlers, type, xxTree['*'], typeLength, typeLength);
1537
- }
1538
- }
1539
-
1540
- return listeners;
1541
- }
1542
-
1543
- function growListenerTree(type, listener, prepend) {
1544
- var len = 0, j = 0, i, delimiter = this.delimiter, dl= delimiter.length, ns;
1545
-
1546
- if(typeof type==='string') {
1547
- if ((i = type.indexOf(delimiter)) !== -1) {
1548
- ns = new Array(5);
1549
- do {
1550
- ns[len++] = type.slice(j, i);
1551
- j = i + dl;
1552
- } while ((i = type.indexOf(delimiter, j)) !== -1);
1553
-
1554
- ns[len++] = type.slice(j);
1555
- }else{
1556
- ns= [type];
1557
- len= 1;
1558
- }
1559
- }else{
1560
- ns= type;
1561
- len= type.length;
1562
- }
1563
-
1564
- //
1565
- // Looks for two consecutive '**', if so, don't add the event at all.
1566
- //
1567
- if (len > 1) {
1568
- for (i = 0; i + 1 < len; i++) {
1569
- if (ns[i] === '**' && ns[i + 1] === '**') {
1570
- return;
1571
- }
1572
- }
1573
- }
1574
-
1575
-
1576
-
1577
- var tree = this.listenerTree, name;
1578
-
1579
- for (i = 0; i < len; i++) {
1580
- name = ns[i];
1581
-
1582
- tree = tree[name] || (tree[name] = {});
1583
-
1584
- if (i === len - 1) {
1585
- if (!tree._listeners) {
1586
- tree._listeners = listener;
1587
- } else {
1588
- if (typeof tree._listeners === 'function') {
1589
- tree._listeners = [tree._listeners];
1590
- }
1591
-
1592
- if (prepend) {
1593
- tree._listeners.unshift(listener);
1594
- } else {
1595
- tree._listeners.push(listener);
1596
- }
1597
-
1598
- if (
1599
- !tree._listeners.warned &&
1600
- this._maxListeners > 0 &&
1601
- tree._listeners.length > this._maxListeners
1602
- ) {
1603
- tree._listeners.warned = true;
1604
- logPossibleMemoryLeak.call(this, tree._listeners.length, name);
1605
- }
1606
- }
1607
- return true;
1608
- }
1609
- }
1610
-
1611
- return true;
1612
- }
1613
-
1614
- function collectTreeEvents(tree, events, root, asArray){
1615
- var branches= ownKeys(tree);
1616
- var i= branches.length;
1617
- var branch, branchName, path;
1618
- var hasListeners= tree['_listeners'];
1619
- var isArrayPath;
1620
-
1621
- while(i-->0){
1622
- branchName= branches[i];
1623
-
1624
- branch= tree[branchName];
1625
-
1626
- if(branchName==='_listeners'){
1627
- path= root;
1628
- }else {
1629
- path = root ? root.concat(branchName) : [branchName];
1630
- }
1631
-
1632
- isArrayPath= asArray || typeof branchName==='symbol';
1633
-
1634
- hasListeners && events.push(isArrayPath? path : path.join(this.delimiter));
1635
-
1636
- if(typeof branch==='object'){
1637
- collectTreeEvents.call(this, branch, events, path, isArrayPath);
1638
- }
1639
- }
1640
-
1641
- return events;
1642
- }
1643
-
1644
- function recursivelyGarbageCollect(root) {
1645
- var keys = ownKeys(root);
1646
- var i= keys.length;
1647
- var obj, key, flag;
1648
- while(i-->0){
1649
- key = keys[i];
1650
- obj = root[key];
1651
-
1652
- if(obj){
1653
- flag= true;
1654
- if(key !== '_listeners' && !recursivelyGarbageCollect(obj)){
1655
- delete root[key];
1656
- }
1657
- }
1658
- }
1659
-
1660
- return flag;
1661
- }
1662
-
1663
- function Listener(emitter, event, listener){
1664
- this.emitter= emitter;
1665
- this.event= event;
1666
- this.listener= listener;
1667
- }
1668
-
1669
- Listener.prototype.off= function(){
1670
- this.emitter.off(this.event, this.listener);
1671
- return this;
1672
- };
1673
-
1674
- function setupListener(event, listener, options){
1675
- if (options === true) {
1676
- promisify = true;
1677
- } else if (options === false) {
1678
- async = true;
1679
- } else {
1680
- if (!options || typeof options !== 'object') {
1681
- throw TypeError('options should be an object or true');
1682
- }
1683
- var async = options.async;
1684
- var promisify = options.promisify;
1685
- var nextTick = options.nextTick;
1686
- var objectify = options.objectify;
1687
- }
1688
-
1689
- if (async || nextTick || promisify) {
1690
- var _listener = listener;
1691
- var _origin = listener._origin || listener;
1692
-
1693
- if (nextTick && !nextTickSupported) {
1694
- throw Error('process.nextTick is not supported');
1695
- }
1696
-
1697
- if (promisify === undefined) {
1698
- promisify = listener.constructor.name === 'AsyncFunction';
1699
- }
1700
-
1701
- listener = function () {
1702
- var args = arguments;
1703
- var context = this;
1704
- var event = this.event;
1705
-
1706
- return promisify ? (nextTick ? Promise.resolve() : new Promise(function (resolve) {
1707
- _setImmediate(resolve);
1708
- }).then(function () {
1709
- context.event = event;
1710
- return _listener.apply(context, args)
1711
- })) : (nextTick ? process.nextTick : _setImmediate)(function () {
1712
- context.event = event;
1713
- _listener.apply(context, args)
1714
- });
1715
- };
1716
-
1717
- listener._async = true;
1718
- listener._origin = _origin;
1719
- }
1720
-
1721
- return [listener, objectify? new Listener(this, event, listener): this];
1722
- }
1723
-
1724
- function EventEmitter(conf) {
1725
- this._events = {};
1726
- this._newListener = false;
1727
- this._removeListener = false;
1728
- this.verboseMemoryLeak = false;
1729
- configure.call(this, conf);
1730
- }
1731
-
1732
- EventEmitter.EventEmitter2 = EventEmitter; // backwards compatibility for exporting EventEmitter property
1733
-
1734
- EventEmitter.prototype.listenTo= function(target, events, options){
1735
- if(typeof target!=='object'){
1736
- throw TypeError('target musts be an object');
1737
- }
1738
-
1739
- var emitter= this;
1740
-
1741
- options = resolveOptions(options, {
1742
- on: undefined,
1743
- off: undefined,
1744
- reducers: undefined
1745
- }, {
1746
- on: functionReducer,
1747
- off: functionReducer,
1748
- reducers: objectFunctionReducer
1749
- });
1750
-
1751
- function listen(events){
1752
- if(typeof events!=='object'){
1753
- throw TypeError('events must be an object');
1754
- }
1755
-
1756
- var reducers= options.reducers;
1757
- var index= findTargetIndex.call(emitter, target);
1758
- var observer;
1759
-
1760
- if(index===-1){
1761
- observer= new TargetObserver(emitter, target, options);
1762
- }else{
1763
- observer= emitter._observers[index];
1764
- }
1765
-
1766
- var keys= ownKeys(events);
1767
- var len= keys.length;
1768
- var event;
1769
- var isSingleReducer= typeof reducers==='function';
1770
-
1771
- for(var i=0; i<len; i++){
1772
- event= keys[i];
1773
- observer.subscribe(
1774
- event,
1775
- events[event] || event,
1776
- isSingleReducer ? reducers : reducers && reducers[event]
1777
- );
1778
- }
1779
- }
1780
-
1781
- isArray(events)?
1782
- listen(toObject(events)) :
1783
- (typeof events==='string'? listen(toObject(events.split(/\s+/))): listen(events));
1784
-
1785
- return this;
1786
- };
1787
-
1788
- EventEmitter.prototype.stopListeningTo = function (target, event) {
1789
- var observers = this._observers;
1790
-
1791
- if(!observers){
1792
- return false;
1793
- }
1794
-
1795
- var i = observers.length;
1796
- var observer;
1797
- var matched= false;
1798
-
1799
- if(target && typeof target!=='object'){
1800
- throw TypeError('target should be an object');
1801
- }
1802
-
1803
- while (i-- > 0) {
1804
- observer = observers[i];
1805
- if (!target || observer._target === target) {
1806
- observer.unsubscribe(event);
1807
- matched= true;
1808
- }
1809
- }
1810
-
1811
- return matched;
1812
- };
1813
-
1814
- // By default EventEmitters will print a warning if more than
1815
- // 10 listeners are added to it. This is a useful default which
1816
- // helps finding memory leaks.
1817
- //
1818
- // Obviously not all Emitters should be limited to 10. This function allows
1819
- // that to be increased. Set to zero for unlimited.
1820
-
1821
- EventEmitter.prototype.delimiter = '.';
1822
-
1823
- EventEmitter.prototype.setMaxListeners = function(n) {
1824
- if (n !== undefined) {
1825
- this._maxListeners = n;
1826
- if (!this._conf) this._conf = {};
1827
- this._conf.maxListeners = n;
1828
- }
1829
- };
1830
-
1831
- EventEmitter.prototype.getMaxListeners = function() {
1832
- return this._maxListeners;
1833
- };
1834
-
1835
- EventEmitter.prototype.event = '';
1836
-
1837
- EventEmitter.prototype.once = function(event, fn, options) {
1838
- return this._once(event, fn, false, options);
1839
- };
1840
-
1841
- EventEmitter.prototype.prependOnceListener = function(event, fn, options) {
1842
- return this._once(event, fn, true, options);
1843
- };
1844
-
1845
- EventEmitter.prototype._once = function(event, fn, prepend, options) {
1846
- return this._many(event, 1, fn, prepend, options);
1847
- };
1848
-
1849
- EventEmitter.prototype.many = function(event, ttl, fn, options) {
1850
- return this._many(event, ttl, fn, false, options);
1851
- };
1852
-
1853
- EventEmitter.prototype.prependMany = function(event, ttl, fn, options) {
1854
- return this._many(event, ttl, fn, true, options);
1855
- };
1856
-
1857
- EventEmitter.prototype._many = function(event, ttl, fn, prepend, options) {
1858
- var self = this;
1859
-
1860
- if (typeof fn !== 'function') {
1861
- throw new Error('many only accepts instances of Function');
1862
- }
1863
-
1864
- function listener() {
1865
- if (--ttl === 0) {
1866
- self.off(event, listener);
1867
- }
1868
- return fn.apply(this, arguments);
1869
- }
1870
-
1871
- listener._origin = fn;
1872
-
1873
- return this._on(event, listener, prepend, options);
1874
- };
1875
-
1876
- EventEmitter.prototype.emit = function() {
1877
- if (!this._events && !this._all) {
1878
- return false;
1879
- }
1880
-
1881
- this._events || init.call(this);
1882
-
1883
- var type = arguments[0], ns, wildcard= this.wildcard;
1884
- var args,l,i,j, containsSymbol;
1885
-
1886
- if (type === 'newListener' && !this._newListener) {
1887
- if (!this._events.newListener) {
1888
- return false;
1889
- }
1890
- }
1891
-
1892
- if (wildcard) {
1893
- ns= type;
1894
- if(type!=='newListener' && type!=='removeListener'){
1895
- if (typeof type === 'object') {
1896
- l = type.length;
1897
- if (symbolsSupported) {
1898
- for (i = 0; i < l; i++) {
1899
- if (typeof type[i] === 'symbol') {
1900
- containsSymbol = true;
1901
- break;
1902
- }
1903
- }
1904
- }
1905
- if (!containsSymbol) {
1906
- type = type.join(this.delimiter);
1907
- }
1908
- }
1909
- }
1910
- }
1911
-
1912
- var al = arguments.length;
1913
- var handler;
1914
-
1915
- if (this._all && this._all.length) {
1916
- handler = this._all.slice();
1917
-
1918
- for (i = 0, l = handler.length; i < l; i++) {
1919
- this.event = type;
1920
- switch (al) {
1921
- case 1:
1922
- handler[i].call(this, type);
1923
- break;
1924
- case 2:
1925
- handler[i].call(this, type, arguments[1]);
1926
- break;
1927
- case 3:
1928
- handler[i].call(this, type, arguments[1], arguments[2]);
1929
- break;
1930
- default:
1931
- handler[i].apply(this, arguments);
1932
- }
1933
- }
1934
- }
1935
-
1936
- if (wildcard) {
1937
- handler = [];
1938
- searchListenerTree.call(this, handler, ns, this.listenerTree, 0, l);
1939
- } else {
1940
- handler = this._events[type];
1941
- if (typeof handler === 'function') {
1942
- this.event = type;
1943
- switch (al) {
1944
- case 1:
1945
- handler.call(this);
1946
- break;
1947
- case 2:
1948
- handler.call(this, arguments[1]);
1949
- break;
1950
- case 3:
1951
- handler.call(this, arguments[1], arguments[2]);
1952
- break;
1953
- default:
1954
- args = new Array(al - 1);
1955
- for (j = 1; j < al; j++) args[j - 1] = arguments[j];
1956
- handler.apply(this, args);
1957
- }
1958
- return true;
1959
- } else if (handler) {
1960
- // need to make copy of handlers because list can change in the middle
1961
- // of emit call
1962
- handler = handler.slice();
1963
- }
1964
- }
1965
-
1966
- if (handler && handler.length) {
1967
- if (al > 3) {
1968
- args = new Array(al - 1);
1969
- for (j = 1; j < al; j++) args[j - 1] = arguments[j];
1970
- }
1971
- for (i = 0, l = handler.length; i < l; i++) {
1972
- this.event = type;
1973
- switch (al) {
1974
- case 1:
1975
- handler[i].call(this);
1976
- break;
1977
- case 2:
1978
- handler[i].call(this, arguments[1]);
1979
- break;
1980
- case 3:
1981
- handler[i].call(this, arguments[1], arguments[2]);
1982
- break;
1983
- default:
1984
- handler[i].apply(this, args);
1985
- }
1986
- }
1987
- return true;
1988
- } else if (!this.ignoreErrors && !this._all && type === 'error') {
1989
- if (arguments[1] instanceof Error) {
1990
- throw arguments[1]; // Unhandled 'error' event
1991
- } else {
1992
- throw new Error("Uncaught, unspecified 'error' event.");
1993
- }
1994
- }
1995
-
1996
- return !!this._all;
1997
- };
1998
-
1999
- EventEmitter.prototype.emitAsync = function() {
2000
- if (!this._events && !this._all) {
2001
- return false;
2002
- }
2003
-
2004
- this._events || init.call(this);
2005
-
2006
- var type = arguments[0], wildcard= this.wildcard, ns, containsSymbol;
2007
- var args,l,i,j;
2008
-
2009
- if (type === 'newListener' && !this._newListener) {
2010
- if (!this._events.newListener) { return Promise.resolve([false]); }
2011
- }
2012
-
2013
- if (wildcard) {
2014
- ns= type;
2015
- if(type!=='newListener' && type!=='removeListener'){
2016
- if (typeof type === 'object') {
2017
- l = type.length;
2018
- if (symbolsSupported) {
2019
- for (i = 0; i < l; i++) {
2020
- if (typeof type[i] === 'symbol') {
2021
- containsSymbol = true;
2022
- break;
2023
- }
2024
- }
2025
- }
2026
- if (!containsSymbol) {
2027
- type = type.join(this.delimiter);
2028
- }
2029
- }
2030
- }
2031
- }
2032
-
2033
- var promises= [];
2034
-
2035
- var al = arguments.length;
2036
- var handler;
2037
-
2038
- if (this._all) {
2039
- for (i = 0, l = this._all.length; i < l; i++) {
2040
- this.event = type;
2041
- switch (al) {
2042
- case 1:
2043
- promises.push(this._all[i].call(this, type));
2044
- break;
2045
- case 2:
2046
- promises.push(this._all[i].call(this, type, arguments[1]));
2047
- break;
2048
- case 3:
2049
- promises.push(this._all[i].call(this, type, arguments[1], arguments[2]));
2050
- break;
2051
- default:
2052
- promises.push(this._all[i].apply(this, arguments));
2053
- }
2054
- }
2055
- }
2056
-
2057
- if (wildcard) {
2058
- handler = [];
2059
- searchListenerTree.call(this, handler, ns, this.listenerTree, 0);
2060
- } else {
2061
- handler = this._events[type];
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;
2062
78
  }
2063
-
2064
- if (typeof handler === 'function') {
2065
- this.event = type;
2066
- switch (al) {
2067
- case 1:
2068
- promises.push(handler.call(this));
2069
- break;
2070
- case 2:
2071
- promises.push(handler.call(this, arguments[1]));
2072
- break;
2073
- case 3:
2074
- promises.push(handler.call(this, arguments[1], arguments[2]));
2075
- break;
2076
- default:
2077
- args = new Array(al - 1);
2078
- for (j = 1; j < al; j++) args[j - 1] = arguments[j];
2079
- promises.push(handler.apply(this, args));
2080
- }
2081
- } else if (handler && handler.length) {
2082
- handler = handler.slice();
2083
- if (al > 3) {
2084
- args = new Array(al - 1);
2085
- for (j = 1; j < al; j++) args[j - 1] = arguments[j];
2086
- }
2087
- for (i = 0, l = handler.length; i < l; i++) {
2088
- this.event = type;
2089
- switch (al) {
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) {
2090
98
  case 1:
2091
- promises.push(handler[i].call(this));
2092
- break;
99
+ return listeners.fn.call(listeners.context), true;
2093
100
  case 2:
2094
- promises.push(handler[i].call(this, arguments[1]));
2095
- break;
101
+ return listeners.fn.call(listeners.context, a1), true;
2096
102
  case 3:
2097
- promises.push(handler[i].call(this, arguments[1], arguments[2]));
2098
- break;
2099
- default:
2100
- promises.push(handler[i].apply(this, args));
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);
2101
139
  }
2102
140
  }
2103
- } else if (!this.ignoreErrors && !this._all && type === 'error') {
2104
- if (arguments[1] instanceof Error) {
2105
- return Promise.reject(arguments[1]); // Unhandled 'error' event
2106
- } else {
2107
- return Promise.reject("Uncaught, unspecified 'error' event.");
2108
- }
2109
141
  }
2110
-
2111
- return Promise.all(promises);
2112
- };
2113
-
2114
- EventEmitter.prototype.on = function(type, listener, options) {
2115
- return this._on(type, listener, false, options);
2116
- };
2117
-
2118
- EventEmitter.prototype.prependListener = function(type, listener, options) {
2119
- return this._on(type, listener, true, options);
2120
- };
2121
-
2122
- EventEmitter.prototype.onAny = function(fn) {
2123
- return this._onAny(fn, false);
142
+ return true;
2124
143
  };
2125
-
2126
- EventEmitter.prototype.prependAny = function(fn) {
2127
- return this._onAny(fn, true);
144
+ EventEmitter.prototype.on = function on(event, fn, context) {
145
+ return addListener(this, event, fn, context, false);
2128
146
  };
2129
-
2130
- EventEmitter.prototype.addListener = EventEmitter.prototype.on;
2131
-
2132
- EventEmitter.prototype._onAny = function(fn, prepend){
2133
- if (typeof fn !== 'function') {
2134
- throw new Error('onAny only accepts instances of Function');
2135
- }
2136
-
2137
- if (!this._all) {
2138
- this._all = [];
2139
- }
2140
-
2141
- // Add the function to the event listener collection.
2142
- if(prepend){
2143
- this._all.unshift(fn);
2144
- }else{
2145
- this._all.push(fn);
2146
- }
2147
-
2148
- return this;
147
+ EventEmitter.prototype.once = function once(event, fn, context) {
148
+ return addListener(this, event, fn, context, true);
2149
149
  };
2150
-
2151
- EventEmitter.prototype._on = function(type, listener, prepend, options) {
2152
- if (typeof type === 'function') {
2153
- this._onAny(type, listener);
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);
2154
156
  return this;
2155
157
  }
2156
-
2157
- if (typeof listener !== 'function') {
2158
- throw new Error('on only accepts instances of Function');
2159
- }
2160
- this._events || init.call(this);
2161
-
2162
- var returnValue= this, temp;
2163
-
2164
- if (options !== undefined) {
2165
- temp = setupListener.call(this, type, listener, options);
2166
- listener = temp[0];
2167
- returnValue = temp[1];
2168
- }
2169
-
2170
- // To avoid recursion in the case that type == "newListeners"! Before
2171
- // adding it to the listeners, first emit "newListeners".
2172
- if (this._newListener) {
2173
- this.emit('newListener', type, listener);
2174
- }
2175
-
2176
- if (this.wildcard) {
2177
- growListenerTree.call(this, type, listener, prepend);
2178
- return returnValue;
2179
- }
2180
-
2181
- if (!this._events[type]) {
2182
- // Optimize the case of one listener. Don't need the extra array object.
2183
- this._events[type] = listener;
2184
- } else {
2185
- if (typeof this._events[type] === 'function') {
2186
- // Change to array.
2187
- this._events[type] = [this._events[type]];
2188
- }
2189
-
2190
- // If we've already got an array, just add
2191
- if(prepend){
2192
- this._events[type].unshift(listener);
2193
- }else{
2194
- this._events[type].push(listener);
2195
- }
2196
-
2197
- // Check for listener leak
2198
- if (
2199
- !this._events[type].warned &&
2200
- this._maxListeners > 0 &&
2201
- this._events[type].length > this._maxListeners
2202
- ) {
2203
- this._events[type].warned = true;
2204
- logPossibleMemoryLeak.call(this, this._events[type].length, type);
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);
2205
162
  }
2206
- }
2207
-
2208
- return returnValue;
2209
- };
2210
-
2211
- EventEmitter.prototype.off = function(type, listener) {
2212
- if (typeof listener !== 'function') {
2213
- throw new Error('removeListener only takes instances of Function');
2214
- }
2215
-
2216
- var handlers,leafs=[];
2217
-
2218
- if(this.wildcard) {
2219
- var ns = typeof type === 'string' ? type.split(this.delimiter) : type.slice();
2220
- leafs = searchListenerTree.call(this, null, ns, this.listenerTree, 0);
2221
- if(!leafs) return this;
2222
163
  } else {
2223
- // does not use listeners(), so no side effect of creating _events[type]
2224
- if (!this._events[type]) return this;
2225
- handlers = this._events[type];
2226
- leafs.push({_listeners:handlers});
2227
- }
2228
-
2229
- for (var iLeaf=0; iLeaf<leafs.length; iLeaf++) {
2230
- var leaf = leafs[iLeaf];
2231
- handlers = leaf._listeners;
2232
- if (isArray(handlers)) {
2233
-
2234
- var position = -1;
2235
-
2236
- for (var i = 0, length = handlers.length; i < length; i++) {
2237
- if (handlers[i] === listener ||
2238
- (handlers[i].listener && handlers[i].listener === listener) ||
2239
- (handlers[i]._origin && handlers[i]._origin === listener)) {
2240
- position = i;
2241
- break;
2242
- }
2243
- }
2244
-
2245
- if (position < 0) {
2246
- continue;
2247
- }
2248
-
2249
- if(this.wildcard) {
2250
- leaf._listeners.splice(position, 1);
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]);
2251
167
  }
2252
- else {
2253
- this._events[type].splice(position, 1);
2254
- }
2255
-
2256
- if (handlers.length === 0) {
2257
- if(this.wildcard) {
2258
- delete leaf._listeners;
2259
- }
2260
- else {
2261
- delete this._events[type];
2262
- }
2263
- }
2264
- if (this._removeListener)
2265
- this.emit("removeListener", type, listener);
2266
-
2267
- return this;
2268
- }
2269
- else if (handlers === listener ||
2270
- (handlers.listener && handlers.listener === listener) ||
2271
- (handlers._origin && handlers._origin === listener)) {
2272
- if(this.wildcard) {
2273
- delete leaf._listeners;
2274
- }
2275
- else {
2276
- delete this._events[type];
2277
- }
2278
- if (this._removeListener)
2279
- this.emit("removeListener", type, listener);
2280
168
  }
169
+ if (events.length)
170
+ this._events[evt] = events.length === 1 ? events[0] : events;
171
+ else
172
+ clearEvent(this, evt);
2281
173
  }
2282
-
2283
- this.listenerTree && recursivelyGarbageCollect(this.listenerTree);
2284
-
2285
174
  return this;
2286
175
  };
2287
-
2288
- EventEmitter.prototype.offAny = function(fn) {
2289
- var i = 0, l = 0, fns;
2290
- if (fn && this._all && this._all.length > 0) {
2291
- fns = this._all;
2292
- for(i = 0, l = fns.length; i < l; i++) {
2293
- if(fn === fns[i]) {
2294
- fns.splice(i, 1);
2295
- if (this._removeListener)
2296
- this.emit("removeListenerAny", fn);
2297
- return this;
2298
- }
2299
- }
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);
2300
182
  } else {
2301
- fns = this._all;
2302
- if (this._removeListener) {
2303
- for(i = 0, l = fns.length; i < l; i++)
2304
- this.emit("removeListenerAny", fns[i]);
2305
- }
2306
- this._all = [];
183
+ this._events = new Events;
184
+ this._eventsCount = 0;
2307
185
  }
2308
186
  return this;
2309
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
+ });
2310
196
 
2311
- EventEmitter.prototype.removeListener = EventEmitter.prototype.off;
197
+ // ../../node_modules/eventemitter3/index.mjs
198
+ var import__ = __toESM(require_eventemitter3(), 1);
199
+ var eventemitter3_default = import__.default;
2312
200
 
2313
- EventEmitter.prototype.removeAllListeners = function (type) {
2314
- if (type === undefined) {
2315
- !this._events || init.call(this);
2316
- return this;
201
+ // ../activity-streams/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;
2317
319
  }
2318
-
2319
- if (this.wildcard) {
2320
- var leafs = searchListenerTree.call(this, null, type, this.listenerTree, 0), leaf, i;
2321
- if (!leafs) return this;
2322
- for (i = 0; i < leafs.length; i++) {
2323
- leaf = leafs[i];
2324
- leaf._listeners = null;
2325
- }
2326
- this.listenerTree && recursivelyGarbageCollect(this.listenerTree);
2327
- } else if (this._events) {
2328
- this._events[type] = null;
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;
2329
355
  }
2330
- return this;
2331
- };
2332
-
2333
- EventEmitter.prototype.listeners = function (type) {
2334
- var _events = this._events;
2335
- var keys, listeners, allListeners;
2336
- var i;
2337
- var listenerTree;
2338
-
2339
- if (type === undefined) {
2340
- if (this.wildcard) {
2341
- throw Error('event name required for wildcard emitter');
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);
2342
365
  }
2343
-
2344
- if (!_events) {
2345
- return [];
366
+ if (warnOnUnknownObjectProperties) {
367
+ console.warn(err);
2346
368
  }
2347
-
2348
- keys = ownKeys(_events);
2349
- i = keys.length;
2350
- allListeners = [];
2351
- while (i-- > 0) {
2352
- listeners = _events[keys[i]];
2353
- if (typeof listeners === 'function') {
2354
- allListeners.push(listeners);
2355
- } else {
2356
- allListeners.push.apply(allListeners, listeners);
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);
2357
385
  }
2358
386
  }
2359
- return allListeners;
2360
387
  } else {
2361
- if (this.wildcard) {
2362
- listenerTree= this.listenerTree;
2363
- if(!listenerTree) return [];
2364
- var handlers = [];
2365
- var ns = typeof type === 'string' ? type.split(this.delimiter) : type.slice();
2366
- searchListenerTree.call(this, handlers, ns, listenerTree, 0);
2367
- return handlers;
2368
- }
2369
-
2370
- if (!_events) {
2371
- return [];
2372
- }
2373
-
2374
- listeners = _events[type];
2375
-
2376
- if (!listeners) {
2377
- return [];
2378
- }
2379
- return typeof listeners === 'function' ? [listeners] : listeners;
388
+ stream[key] = meta[key];
2380
389
  }
2381
- };
2382
-
2383
- EventEmitter.prototype.eventNames = function(nsAsArray){
2384
- var _events= this._events;
2385
- return this.wildcard? collectTreeEvents.call(this, this.listenerTree, [], null, nsAsArray) : (_events? ownKeys(_events) : []);
2386
- };
2387
-
2388
- EventEmitter.prototype.listenerCount = function(type) {
2389
- return this.listeners(type).length;
2390
- };
2391
-
2392
- EventEmitter.prototype.hasListeners = function (type) {
2393
- if (this.wildcard) {
2394
- var handlers = [];
2395
- var ns = typeof type === 'string' ? type.split(this.delimiter) : type.slice();
2396
- searchListenerTree.call(this, handlers, ns, this.listenerTree, 0);
2397
- return handlers.length > 0;
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;
2398
397
  }
2399
-
2400
- var _events = this._events;
2401
- var _all = this._all;
2402
-
2403
- return !!(_all && _all.length || _events && (type === undefined ? ownKeys(_events).length : _events[type]));
2404
- };
2405
-
2406
- EventEmitter.prototype.listenersAny = function() {
2407
-
2408
- if(this._all) {
2409
- return this._all;
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);
2410
422
  }
2411
- else {
2412
- return [];
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 };
2413
432
  }
2414
-
2415
- };
2416
-
2417
- EventEmitter.prototype.waitFor = function (event, options) {
2418
- var self = this;
2419
- var type = typeof options;
2420
- if (type === 'number') {
2421
- options = {timeout: options};
2422
- } else if (type === 'function') {
2423
- options = {filter: options};
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];
2424
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 : {});
2425
457
 
2426
- options= resolveOptions(options, {
2427
- timeout: 0,
2428
- filter: undefined,
2429
- handleError: false,
2430
- Promise: Promise,
2431
- overload: false
2432
- }, {
2433
- filter: functionReducer,
2434
- Promise: constructorReducer
2435
- });
2436
-
2437
- return makeCancelablePromise(options.Promise, function (resolve, reject, onCancel) {
2438
- function listener() {
2439
- var filter= options.filter;
2440
- if (filter && !filter.apply(self, arguments)) {
2441
- return;
2442
- }
2443
- self.off(event, listener);
2444
- if (options.handleError) {
2445
- var err = arguments[0];
2446
- err ? reject(err) : resolve(toArray.apply(null, arguments).slice(1));
458
+ // src/sockethub-client.ts
459
+ class SockethubClient {
460
+ events = {
461
+ credentials: new Map,
462
+ "activity-object": new Map,
463
+ connect: new Map,
464
+ join: new Map
465
+ };
466
+ _socket;
467
+ ActivityStreams;
468
+ socket;
469
+ debug = true;
470
+ constructor(socket) {
471
+ if (!socket) {
472
+ throw new Error("SockethubClient requires a socket.io instance");
473
+ }
474
+ this._socket = socket;
475
+ this.socket = this.createPublicEmitter();
476
+ this.registerSocketIOHandlers();
477
+ this.initActivityStreams();
478
+ this.ActivityStreams.on("activity-object-create", (obj) => {
479
+ socket.emit("activity-object", obj, (err) => {
480
+ if (err) {
481
+ console.error("failed to create activity-object ", err);
2447
482
  } else {
2448
- resolve(toArray.apply(null, arguments));
483
+ this.eventActivityObject(obj);
2449
484
  }
2450
- }
2451
-
2452
- onCancel(function(){
2453
- self.off(event, listener);
2454
485
  });
2455
-
2456
- self._on(event, listener, false);
2457
- }, {
2458
- timeout: options.timeout,
2459
- overload: options.overload
2460
- })
2461
- };
2462
-
2463
- function once(emitter, name, options) {
2464
- options= resolveOptions(options, {
2465
- Promise: Promise,
2466
- timeout: 0,
2467
- overload: false
2468
- }, {
2469
- Promise: constructorReducer
2470
486
  });
2471
-
2472
- var _Promise= options.Promise;
2473
-
2474
- return makeCancelablePromise(_Promise, function(resolve, reject, onCancel){
2475
- var handler;
2476
- if (typeof emitter.addEventListener === 'function') {
2477
- handler= function () {
2478
- resolve(toArray.apply(null, arguments));
2479
- };
2480
-
2481
- onCancel(function(){
2482
- emitter.removeEventListener(name, handler);
2483
- });
2484
-
2485
- emitter.addEventListener(
2486
- name,
2487
- handler,
2488
- {once: true}
2489
- );
2490
- return;
2491
- }
2492
-
2493
- var eventListener = function(){
2494
- errorListener && emitter.removeListener('error', errorListener);
2495
- resolve(toArray.apply(null, arguments));
487
+ socket.on("activity-object", (obj) => {
488
+ this.ActivityStreams.Object.create(obj);
489
+ });
490
+ }
491
+ initActivityStreams() {
492
+ this.ActivityStreams = ASFactory({ specialObjs: ["credentials"] });
493
+ }
494
+ clearCredentials() {
495
+ this.events.credentials.clear();
496
+ }
497
+ createPublicEmitter() {
498
+ const socket = new eventemitter3_default;
499
+ socket._emit = socket.emit;
500
+ socket.emit = (event, content, callback) => {
501
+ if (event === "credentials") {
502
+ this.eventCredentials(content);
503
+ } else if (event === "activity-object") {
504
+ this.eventActivityObject(content);
505
+ } else if (event === "message") {
506
+ this.eventMessage(content);
507
+ }
508
+ this._socket.emit(event, content, callback);
509
+ };
510
+ socket.connected = false;
511
+ socket.disconnect = () => {
512
+ this._socket.disconnect();
513
+ };
514
+ socket.connect = () => {
515
+ this._socket.connect();
516
+ };
517
+ return socket;
518
+ }
519
+ eventActivityObject(content) {
520
+ if (content.id) {
521
+ this.events["activity-object"].set(content.id, content);
522
+ }
523
+ }
524
+ eventCredentials(content) {
525
+ if (content.object && content.object.type === "credentials") {
526
+ const key = content.actor.id || content.actor;
527
+ this.events.credentials.set(key, content);
528
+ }
529
+ }
530
+ eventMessage(content) {
531
+ if (!this._socket.connected) {
532
+ return;
533
+ }
534
+ const key = SockethubClient.getKey(content);
535
+ if (content.type === "join" || content.type === "connect") {
536
+ this.events[content.type].set(key, content);
537
+ } else if (content.type === "leave") {
538
+ this.events.join.delete(key);
539
+ } else if (content.type === "disconnect") {
540
+ this.events.connect.delete(key);
541
+ }
542
+ }
543
+ static getKey(content) {
544
+ const actor = content.actor?.id || content.actor;
545
+ if (!actor) {
546
+ throw new Error(`actor property not present for message type: ${content?.type}`);
547
+ }
548
+ const target = content.target ? content.target.id || content.target : "";
549
+ return `${actor}-${target}`;
550
+ }
551
+ log(msg, obj) {
552
+ if (this.debug) {
553
+ console.log(msg, obj);
554
+ }
555
+ }
556
+ registerSocketIOHandlers() {
557
+ const callHandler = (event) => {
558
+ return async (obj) => {
559
+ if (event === "connect") {
560
+ this.socket.id = this._socket.id;
561
+ this.socket.connected = true;
562
+ this.replay("activity-object", this.events["activity-object"]);
563
+ this.replay("credentials", this.events.credentials);
564
+ this.replay("message", this.events.connect);
565
+ this.replay("message", this.events.join);
566
+ } else if (event === "disconnect") {
567
+ this.socket.connected = false;
568
+ }
569
+ this.socket._emit(event, obj);
2496
570
  };
2497
-
2498
- var errorListener;
2499
-
2500
- if (name !== 'error') {
2501
- errorListener = function (err){
2502
- emitter.removeListener(name, eventListener);
2503
- reject(err);
2504
- };
2505
-
2506
- emitter.once('error', errorListener);
2507
- }
2508
-
2509
- onCancel(function(){
2510
- errorListener && emitter.removeListener('error', errorListener);
2511
- emitter.removeListener(name, eventListener);
2512
- });
2513
-
2514
- emitter.once(name, eventListener);
2515
- }, {
2516
- timeout: options.timeout,
2517
- overload: options.overload
571
+ };
572
+ this._socket.on("connect", callHandler("connect"));
573
+ this._socket.on("connect_error", callHandler("connect_error"));
574
+ this._socket.on("disconnect", callHandler("disconnect"));
575
+ this._socket.on("message", (obj) => {
576
+ this.socket._emit("message", this.ActivityStreams.Stream(obj));
2518
577
  });
2519
578
  }
2520
-
2521
- var prototype= EventEmitter.prototype;
2522
-
2523
- Object.defineProperties(EventEmitter, {
2524
- defaultMaxListeners: {
2525
- get: function () {
2526
- return prototype._maxListeners;
2527
- },
2528
- set: function (n) {
2529
- if (typeof n !== 'number' || n < 0 || Number.isNaN(n)) {
2530
- throw TypeError('n must be a non-negative number')
2531
- }
2532
- prototype._maxListeners = n;
2533
- },
2534
- enumerable: true
2535
- },
2536
- once: {
2537
- value: once,
2538
- writable: true,
2539
- configurable: true
579
+ hasActorId(obj) {
580
+ return "actor" in obj && obj.actor !== null && typeof obj.actor === "object" && "id" in obj.actor && typeof obj.actor.id === "string";
581
+ }
582
+ replay(name, asMap) {
583
+ for (const obj of asMap.values()) {
584
+ const expandedObj = this.ActivityStreams.Stream(obj);
585
+ let id = expandedObj?.id;
586
+ if (this.hasActorId(expandedObj)) {
587
+ id = expandedObj.actor.id;
588
+ }
589
+ this.log(`replaying ${name} for ${id}`);
590
+ this._socket.emit(name, expandedObj);
2540
591
  }
2541
- });
2542
-
2543
- Object.defineProperties(prototype, {
2544
- _maxListeners: {
2545
- value: defaultMaxListeners,
2546
- writable: true,
2547
- configurable: true
2548
- },
2549
- _observers: {value: null, writable: true, configurable: true}
2550
- });
2551
-
2552
- if (true) {
2553
- // AMD. Register as an anonymous module.
2554
- !(__WEBPACK_AMD_DEFINE_RESULT__ = (function() {
2555
- return EventEmitter;
2556
- }).call(exports, __webpack_require__, exports, module),
2557
- __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));
2558
- } else { var _global; }
2559
- }();
2560
-
2561
-
2562
- /***/ })
592
+ }
593
+ }
594
+ ((global) => {
595
+ global.SockethubClient = SockethubClient;
596
+ })(typeof window === "object" ? window : {});
597
+ export {
598
+ SockethubClient as default
599
+ };
2563
600
 
2564
- /******/ });
2565
- /************************************************************************/
2566
- /******/ // The module cache
2567
- /******/ var __webpack_module_cache__ = {};
2568
- /******/
2569
- /******/ // The require function
2570
- /******/ function __webpack_require__(moduleId) {
2571
- /******/ // Check if module is in cache
2572
- /******/ var cachedModule = __webpack_module_cache__[moduleId];
2573
- /******/ if (cachedModule !== undefined) {
2574
- /******/ return cachedModule.exports;
2575
- /******/ }
2576
- /******/ // Create a new module (and put it into the cache)
2577
- /******/ var module = __webpack_module_cache__[moduleId] = {
2578
- /******/ // no module.id needed
2579
- /******/ // no module.loaded needed
2580
- /******/ exports: {}
2581
- /******/ };
2582
- /******/
2583
- /******/ // Execute the module function
2584
- /******/ __webpack_modules__[moduleId].call(module.exports, module, module.exports, __webpack_require__);
2585
- /******/
2586
- /******/ // Return the exports of the module
2587
- /******/ return module.exports;
2588
- /******/ }
2589
- /******/
2590
- /************************************************************************/
2591
- /******/
2592
- /******/ // startup
2593
- /******/ // Load entry module and return exports
2594
- /******/ // This entry module is referenced by other modules so it can't be inlined
2595
- /******/ var __webpack_exports__ = __webpack_require__(650);
2596
- /******/
2597
- /******/ return __webpack_exports__;
2598
- /******/ })()
2599
- ;
2600
- });
601
+ //# debugId=1230AAC3408D79F264756E2164756E21
602
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2V2ZW50ZW1pdHRlcjMvaW5kZXguanMiLCAiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2V2ZW50ZW1pdHRlcjMvaW5kZXgubWpzIiwgIi4uLy4uL2FjdGl2aXR5LXN0cmVhbXMvc3JjL2FjdGl2aXR5LXN0cmVhbXMudHMiLCAiLi4vc3JjL3NvY2tldGh1Yi1jbGllbnQudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbCiAgICAiJ3VzZSBzdHJpY3QnO1xuXG52YXIgaGFzID0gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eVxuICAsIHByZWZpeCA9ICd+JztcblxuLyoqXG4gKiBDb25zdHJ1Y3RvciB0byBjcmVhdGUgYSBzdG9yYWdlIGZvciBvdXIgYEVFYCBvYmplY3RzLlxuICogQW4gYEV2ZW50c2AgaW5zdGFuY2UgaXMgYSBwbGFpbiBvYmplY3Qgd2hvc2UgcHJvcGVydGllcyBhcmUgZXZlbnQgbmFtZXMuXG4gKlxuICogQGNvbnN0cnVjdG9yXG4gKiBAcHJpdmF0ZVxuICovXG5mdW5jdGlvbiBFdmVudHMoKSB7fVxuXG4vL1xuLy8gV2UgdHJ5IHRvIG5vdCBpbmhlcml0IGZyb20gYE9iamVjdC5wcm90b3R5cGVgLiBJbiBzb21lIGVuZ2luZXMgY3JlYXRpbmcgYW5cbi8vIGluc3RhbmNlIGluIHRoaXMgd2F5IGlzIGZhc3RlciB0aGFuIGNhbGxpbmcgYE9iamVjdC5jcmVhdGUobnVsbClgIGRpcmVjdGx5LlxuLy8gSWYgYE9iamVjdC5jcmVhdGUobnVsbClgIGlzIG5vdCBzdXBwb3J0ZWQgd2UgcHJlZml4IHRoZSBldmVudCBuYW1lcyB3aXRoIGFcbi8vIGNoYXJhY3RlciB0byBtYWtlIHN1cmUgdGhhdCB0aGUgYnVpbHQtaW4gb2JqZWN0IHByb3BlcnRpZXMgYXJlIG5vdFxuLy8gb3ZlcnJpZGRlbiBvciB1c2VkIGFzIGFuIGF0dGFjayB2ZWN0b3IuXG4vL1xuaWYgKE9iamVjdC5jcmVhdGUpIHtcbiAgRXZlbnRzLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG5cbiAgLy9cbiAgLy8gVGhpcyBoYWNrIGlzIG5lZWRlZCBiZWNhdXNlIHRoZSBgX19wcm90b19fYCBwcm9wZXJ0eSBpcyBzdGlsbCBpbmhlcml0ZWQgaW5cbiAgLy8gc29tZSBvbGQgYnJvd3NlcnMgbGlrZSBBbmRyb2lkIDQsIGlQaG9uZSA1LjEsIE9wZXJhIDExIGFuZCBTYWZhcmkgNS5cbiAgLy9cbiAgaWYgKCFuZXcgRXZlbnRzKCkuX19wcm90b19fKSBwcmVmaXggPSBmYWxzZTtcbn1cblxuLyoqXG4gKiBSZXByZXNlbnRhdGlvbiBvZiBhIHNpbmdsZSBldmVudCBsaXN0ZW5lci5cbiAqXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmbiBUaGUgbGlzdGVuZXIgZnVuY3Rpb24uXG4gKiBAcGFyYW0geyp9IGNvbnRleHQgVGhlIGNvbnRleHQgdG8gaW52b2tlIHRoZSBsaXN0ZW5lciB3aXRoLlxuICogQHBhcmFtIHtCb29sZWFufSBbb25jZT1mYWxzZV0gU3BlY2lmeSBpZiB0aGUgbGlzdGVuZXIgaXMgYSBvbmUtdGltZSBsaXN0ZW5lci5cbiAqIEBjb25zdHJ1Y3RvclxuICogQHByaXZhdGVcbiAqL1xuZnVuY3Rpb24gRUUoZm4sIGNvbnRleHQsIG9uY2UpIHtcbiAgdGhpcy5mbiA9IGZuO1xuICB0aGlzLmNvbnRleHQgPSBjb250ZXh0O1xuICB0aGlzLm9uY2UgPSBvbmNlIHx8IGZhbHNlO1xufVxuXG4vKipcbiAqIEFkZCBhIGxpc3RlbmVyIGZvciBhIGdpdmVuIGV2ZW50LlxuICpcbiAqIEBwYXJhbSB7RXZlbnRFbWl0dGVyfSBlbWl0dGVyIFJlZmVyZW5jZSB0byB0aGUgYEV2ZW50RW1pdHRlcmAgaW5zdGFuY2UuXG4gKiBAcGFyYW0geyhTdHJpbmd8U3ltYm9sKX0gZXZlbnQgVGhlIGV2ZW50IG5hbWUuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmbiBUaGUgbGlzdGVuZXIgZnVuY3Rpb24uXG4gKiBAcGFyYW0geyp9IGNvbnRleHQgVGhlIGNvbnRleHQgdG8gaW52b2tlIHRoZSBsaXN0ZW5lciB3aXRoLlxuICogQHBhcmFtIHtCb29sZWFufSBvbmNlIFNwZWNpZnkgaWYgdGhlIGxpc3RlbmVyIGlzIGEgb25lLXRpbWUgbGlzdGVuZXIuXG4gKiBAcmV0dXJucyB7RXZlbnRFbWl0dGVyfVxuICogQHByaXZhdGVcbiAqL1xuZnVuY3Rpb24gYWRkTGlzdGVuZXIoZW1pdHRlciwgZXZlbnQsIGZuLCBjb250ZXh0LCBvbmNlKSB7XG4gIGlmICh0eXBlb2YgZm4gIT09ICdmdW5jdGlvbicpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdUaGUgbGlzdGVuZXIgbXVzdCBiZSBhIGZ1bmN0aW9uJyk7XG4gIH1cblxuICB2YXIgbGlzdGVuZXIgPSBuZXcgRUUoZm4sIGNvbnRleHQgfHwgZW1pdHRlciwgb25jZSlcbiAgICAsIGV2dCA9IHByZWZpeCA/IHByZWZpeCArIGV2ZW50IDogZXZlbnQ7XG5cbiAgaWYgKCFlbWl0dGVyLl9ldmVudHNbZXZ0XSkgZW1pdHRlci5fZXZlbnRzW2V2dF0gPSBsaXN0ZW5lciwgZW1pdHRlci5fZXZlbnRzQ291bnQrKztcbiAgZWxzZSBpZiAoIWVtaXR0ZXIuX2V2ZW50c1tldnRdLmZuKSBlbWl0dGVyLl9ldmVudHNbZXZ0XS5wdXNoKGxpc3RlbmVyKTtcbiAgZWxzZSBlbWl0dGVyLl9ldmVudHNbZXZ0XSA9IFtlbWl0dGVyLl9ldmVudHNbZXZ0XSwgbGlzdGVuZXJdO1xuXG4gIHJldHVybiBlbWl0dGVyO1xufVxuXG4vKipcbiAqIENsZWFyIGV2ZW50IGJ5IG5hbWUuXG4gKlxuICogQHBhcmFtIHtFdmVudEVtaXR0ZXJ9IGVtaXR0ZXIgUmVmZXJlbmNlIHRvIHRoZSBgRXZlbnRFbWl0dGVyYCBpbnN0YW5jZS5cbiAqIEBwYXJhbSB7KFN0cmluZ3xTeW1ib2wpfSBldnQgVGhlIEV2ZW50IG5hbWUuXG4gKiBAcHJpdmF0ZVxuICovXG5mdW5jdGlvbiBjbGVhckV2ZW50KGVtaXR0ZXIsIGV2dCkge1xuICBpZiAoLS1lbWl0dGVyLl9ldmVudHNDb3VudCA9PT0gMCkgZW1pdHRlci5fZXZlbnRzID0gbmV3IEV2ZW50cygpO1xuICBlbHNlIGRlbGV0ZSBlbWl0dGVyLl9ldmVudHNbZXZ0XTtcbn1cblxuLyoqXG4gKiBNaW5pbWFsIGBFdmVudEVtaXR0ZXJgIGludGVyZmFjZSB0aGF0IGlzIG1vbGRlZCBhZ2FpbnN0IHRoZSBOb2RlLmpzXG4gKiBgRXZlbnRFbWl0dGVyYCBpbnRlcmZhY2UuXG4gKlxuICogQGNvbnN0cnVjdG9yXG4gKiBAcHVibGljXG4gKi9cbmZ1bmN0aW9uIEV2ZW50RW1pdHRlcigpIHtcbiAgdGhpcy5fZXZlbnRzID0gbmV3IEV2ZW50cygpO1xuICB0aGlzLl9ldmVudHNDb3VudCA9IDA7XG59XG5cbi8qKlxuICogUmV0dXJuIGFuIGFycmF5IGxpc3RpbmcgdGhlIGV2ZW50cyBmb3Igd2hpY2ggdGhlIGVtaXR0ZXIgaGFzIHJlZ2lzdGVyZWRcbiAqIGxpc3RlbmVycy5cbiAqXG4gKiBAcmV0dXJucyB7QXJyYXl9XG4gKiBAcHVibGljXG4gKi9cbkV2ZW50RW1pdHRlci5wcm90b3R5cGUuZXZlbnROYW1lcyA9IGZ1bmN0aW9uIGV2ZW50TmFtZXMoKSB7XG4gIHZhciBuYW1lcyA9IFtdXG4gICAgLCBldmVudHNcbiAgICAsIG5hbWU7XG5cbiAgaWYgKHRoaXMuX2V2ZW50c0NvdW50ID09PSAwKSByZXR1cm4gbmFtZXM7XG5cbiAgZm9yIChuYW1lIGluIChldmVudHMgPSB0aGlzLl9ldmVudHMpKSB7XG4gICAgaWYgKGhhcy5jYWxsKGV2ZW50cywgbmFtZSkpIG5hbWVzLnB1c2gocHJlZml4ID8gbmFtZS5zbGljZSgxKSA6IG5hbWUpO1xuICB9XG5cbiAgaWYgKE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMpIHtcbiAgICByZXR1cm4gbmFtZXMuY29uY2F0KE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMoZXZlbnRzKSk7XG4gIH1cblxuICByZXR1cm4gbmFtZXM7XG59O1xuXG4vKipcbiAqIFJldHVybiB0aGUgbGlzdGVuZXJzIHJlZ2lzdGVyZWQgZm9yIGEgZ2l2ZW4gZXZlbnQuXG4gKlxuICogQHBhcmFtIHsoU3RyaW5nfFN5bWJvbCl9IGV2ZW50IFRoZSBldmVudCBuYW1lLlxuICogQHJldHVybnMge0FycmF5fSBUaGUgcmVnaXN0ZXJlZCBsaXN0ZW5lcnMuXG4gKiBAcHVibGljXG4gKi9cbkV2ZW50RW1pdHRlci5wcm90b3R5cGUubGlzdGVuZXJzID0gZnVuY3Rpb24gbGlzdGVuZXJzKGV2ZW50KSB7XG4gIHZhciBldnQgPSBwcmVmaXggPyBwcmVmaXggKyBldmVudCA6IGV2ZW50XG4gICAgLCBoYW5kbGVycyA9IHRoaXMuX2V2ZW50c1tldnRdO1xuXG4gIGlmICghaGFuZGxlcnMpIHJldHVybiBbXTtcbiAgaWYgKGhhbmRsZXJzLmZuKSByZXR1cm4gW2hhbmRsZXJzLmZuXTtcblxuICBmb3IgKHZhciBpID0gMCwgbCA9IGhhbmRsZXJzLmxlbmd0aCwgZWUgPSBuZXcgQXJyYXkobCk7IGkgPCBsOyBpKyspIHtcbiAgICBlZVtpXSA9IGhhbmRsZXJzW2ldLmZuO1xuICB9XG5cbiAgcmV0dXJuIGVlO1xufTtcblxuLyoqXG4gKiBSZXR1cm4gdGhlIG51bWJlciBvZiBsaXN0ZW5lcnMgbGlzdGVuaW5nIHRvIGEgZ2l2ZW4gZXZlbnQuXG4gKlxuICogQHBhcmFtIHsoU3RyaW5nfFN5bWJvbCl9IGV2ZW50IFRoZSBldmVudCBuYW1lLlxuICogQHJldHVybnMge051bWJlcn0gVGhlIG51bWJlciBvZiBsaXN0ZW5lcnMuXG4gKiBAcHVibGljXG4gKi9cbkV2ZW50RW1pdHRlci5wcm90b3R5cGUubGlzdGVuZXJDb3VudCA9IGZ1bmN0aW9uIGxpc3RlbmVyQ291bnQoZXZlbnQpIHtcbiAgdmFyIGV2dCA9IHByZWZpeCA/IHByZWZpeCArIGV2ZW50IDogZXZlbnRcbiAgICAsIGxpc3RlbmVycyA9IHRoaXMuX2V2ZW50c1tldnRdO1xuXG4gIGlmICghbGlzdGVuZXJzKSByZXR1cm4gMDtcbiAgaWYgKGxpc3RlbmVycy5mbikgcmV0dXJuIDE7XG4gIHJldHVybiBsaXN0ZW5lcnMubGVuZ3RoO1xufTtcblxuLyoqXG4gKiBDYWxscyBlYWNoIG9mIHRoZSBsaXN0ZW5lcnMgcmVnaXN0ZXJlZCBmb3IgYSBnaXZlbiBldmVudC5cbiAqXG4gKiBAcGFyYW0geyhTdHJpbmd8U3ltYm9sKX0gZXZlbnQgVGhlIGV2ZW50IG5hbWUuXG4gKiBAcmV0dXJucyB7Qm9vbGVhbn0gYHRydWVgIGlmIHRoZSBldmVudCBoYWQgbGlzdGVuZXJzLCBlbHNlIGBmYWxzZWAuXG4gKiBAcHVibGljXG4gKi9cbkV2ZW50RW1pdHRlci5wcm90b3R5cGUuZW1pdCA9IGZ1bmN0aW9uIGVtaXQoZXZlbnQsIGExLCBhMiwgYTMsIGE0LCBhNSkge1xuICB2YXIgZXZ0ID0gcHJlZml4ID8gcHJlZml4ICsgZXZlbnQgOiBldmVudDtcblxuICBpZiAoIXRoaXMuX2V2ZW50c1tldnRdKSByZXR1cm4gZmFsc2U7XG5cbiAgdmFyIGxpc3RlbmVycyA9IHRoaXMuX2V2ZW50c1tldnRdXG4gICAgLCBsZW4gPSBhcmd1bWVudHMubGVuZ3RoXG4gICAgLCBhcmdzXG4gICAgLCBpO1xuXG4gIGlmIChsaXN0ZW5lcnMuZm4pIHtcbiAgICBpZiAobGlzdGVuZXJzLm9uY2UpIHRoaXMucmVtb3ZlTGlzdGVuZXIoZXZlbnQsIGxpc3RlbmVycy5mbiwgdW5kZWZpbmVkLCB0cnVlKTtcblxuICAgIHN3aXRjaCAobGVuKSB7XG4gICAgICBjYXNlIDE6IHJldHVybiBsaXN0ZW5lcnMuZm4uY2FsbChsaXN0ZW5lcnMuY29udGV4dCksIHRydWU7XG4gICAgICBjYXNlIDI6IHJldHVybiBsaXN0ZW5lcnMuZm4uY2FsbChsaXN0ZW5lcnMuY29udGV4dCwgYTEpLCB0cnVlO1xuICAgICAgY2FzZSAzOiByZXR1cm4gbGlzdGVuZXJzLmZuLmNhbGwobGlzdGVuZXJzLmNvbnRleHQsIGExLCBhMiksIHRydWU7XG4gICAgICBjYXNlIDQ6IHJldHVybiBsaXN0ZW5lcnMuZm4uY2FsbChsaXN0ZW5lcnMuY29udGV4dCwgYTEsIGEyLCBhMyksIHRydWU7XG4gICAgICBjYXNlIDU6IHJldHVybiBsaXN0ZW5lcnMuZm4uY2FsbChsaXN0ZW5lcnMuY29udGV4dCwgYTEsIGEyLCBhMywgYTQpLCB0cnVlO1xuICAgICAgY2FzZSA2OiByZXR1cm4gbGlzdGVuZXJzLmZuLmNhbGwobGlzdGVuZXJzLmNvbnRleHQsIGExLCBhMiwgYTMsIGE0LCBhNSksIHRydWU7XG4gICAgfVxuXG4gICAgZm9yIChpID0gMSwgYXJncyA9IG5ldyBBcnJheShsZW4gLTEpOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgIGFyZ3NbaSAtIDFdID0gYXJndW1lbnRzW2ldO1xuICAgIH1cblxuICAgIGxpc3RlbmVycy5mbi5hcHBseShsaXN0ZW5lcnMuY29udGV4dCwgYXJncyk7XG4gIH0gZWxzZSB7XG4gICAgdmFyIGxlbmd0aCA9IGxpc3RlbmVycy5sZW5ndGhcbiAgICAgICwgajtcblxuICAgIGZvciAoaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykge1xuICAgICAgaWYgKGxpc3RlbmVyc1tpXS5vbmNlKSB0aGlzLnJlbW92ZUxpc3RlbmVyKGV2ZW50LCBsaXN0ZW5lcnNbaV0uZm4sIHVuZGVmaW5lZCwgdHJ1ZSk7XG5cbiAgICAgIHN3aXRjaCAobGVuKSB7XG4gICAgICAgIGNhc2UgMTogbGlzdGVuZXJzW2ldLmZuLmNhbGwobGlzdGVuZXJzW2ldLmNvbnRleHQpOyBicmVhaztcbiAgICAgICAgY2FzZSAyOiBsaXN0ZW5lcnNbaV0uZm4uY2FsbChsaXN0ZW5lcnNbaV0uY29udGV4dCwgYTEpOyBicmVhaztcbiAgICAgICAgY2FzZSAzOiBsaXN0ZW5lcnNbaV0uZm4uY2FsbChsaXN0ZW5lcnNbaV0uY29udGV4dCwgYTEsIGEyKTsgYnJlYWs7XG4gICAgICAgIGNhc2UgNDogbGlzdGVuZXJzW2ldLmZuLmNhbGwobGlzdGVuZXJzW2ldLmNvbnRleHQsIGExLCBhMiwgYTMpOyBicmVhaztcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICBpZiAoIWFyZ3MpIGZvciAoaiA9IDEsIGFyZ3MgPSBuZXcgQXJyYXkobGVuIC0xKTsgaiA8IGxlbjsgaisrKSB7XG4gICAgICAgICAgICBhcmdzW2ogLSAxXSA9IGFyZ3VtZW50c1tqXTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBsaXN0ZW5lcnNbaV0uZm4uYXBwbHkobGlzdGVuZXJzW2ldLmNvbnRleHQsIGFyZ3MpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiB0cnVlO1xufTtcblxuLyoqXG4gKiBBZGQgYSBsaXN0ZW5lciBmb3IgYSBnaXZlbiBldmVudC5cbiAqXG4gKiBAcGFyYW0geyhTdHJpbmd8U3ltYm9sKX0gZXZlbnQgVGhlIGV2ZW50IG5hbWUuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmbiBUaGUgbGlzdGVuZXIgZnVuY3Rpb24uXG4gKiBAcGFyYW0geyp9IFtjb250ZXh0PXRoaXNdIFRoZSBjb250ZXh0IHRvIGludm9rZSB0aGUgbGlzdGVuZXIgd2l0aC5cbiAqIEByZXR1cm5zIHtFdmVudEVtaXR0ZXJ9IGB0aGlzYC5cbiAqIEBwdWJsaWNcbiAqL1xuRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5vbiA9IGZ1bmN0aW9uIG9uKGV2ZW50LCBmbiwgY29udGV4dCkge1xuICByZXR1cm4gYWRkTGlzdGVuZXIodGhpcywgZXZlbnQsIGZuLCBjb250ZXh0LCBmYWxzZSk7XG59O1xuXG4vKipcbiAqIEFkZCBhIG9uZS10aW1lIGxpc3RlbmVyIGZvciBhIGdpdmVuIGV2ZW50LlxuICpcbiAqIEBwYXJhbSB7KFN0cmluZ3xTeW1ib2wpfSBldmVudCBUaGUgZXZlbnQgbmFtZS5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZuIFRoZSBsaXN0ZW5lciBmdW5jdGlvbi5cbiAqIEBwYXJhbSB7Kn0gW2NvbnRleHQ9dGhpc10gVGhlIGNvbnRleHQgdG8gaW52b2tlIHRoZSBsaXN0ZW5lciB3aXRoLlxuICogQHJldHVybnMge0V2ZW50RW1pdHRlcn0gYHRoaXNgLlxuICogQHB1YmxpY1xuICovXG5FdmVudEVtaXR0ZXIucHJvdG90eXBlLm9uY2UgPSBmdW5jdGlvbiBvbmNlKGV2ZW50LCBmbiwgY29udGV4dCkge1xuICByZXR1cm4gYWRkTGlzdGVuZXIodGhpcywgZXZlbnQsIGZuLCBjb250ZXh0LCB0cnVlKTtcbn07XG5cbi8qKlxuICogUmVtb3ZlIHRoZSBsaXN0ZW5lcnMgb2YgYSBnaXZlbiBldmVudC5cbiAqXG4gKiBAcGFyYW0geyhTdHJpbmd8U3ltYm9sKX0gZXZlbnQgVGhlIGV2ZW50IG5hbWUuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmbiBPbmx5IHJlbW92ZSB0aGUgbGlzdGVuZXJzIHRoYXQgbWF0Y2ggdGhpcyBmdW5jdGlvbi5cbiAqIEBwYXJhbSB7Kn0gY29udGV4dCBPbmx5IHJlbW92ZSB0aGUgbGlzdGVuZXJzIHRoYXQgaGF2ZSB0aGlzIGNvbnRleHQuXG4gKiBAcGFyYW0ge0Jvb2xlYW59IG9uY2UgT25seSByZW1vdmUgb25lLXRpbWUgbGlzdGVuZXJzLlxuICogQHJldHVybnMge0V2ZW50RW1pdHRlcn0gYHRoaXNgLlxuICogQHB1YmxpY1xuICovXG5FdmVudEVtaXR0ZXIucHJvdG90eXBlLnJlbW92ZUxpc3RlbmVyID0gZnVuY3Rpb24gcmVtb3ZlTGlzdGVuZXIoZXZlbnQsIGZuLCBjb250ZXh0LCBvbmNlKSB7XG4gIHZhciBldnQgPSBwcmVmaXggPyBwcmVmaXggKyBldmVudCA6IGV2ZW50O1xuXG4gIGlmICghdGhpcy5fZXZlbnRzW2V2dF0pIHJldHVybiB0aGlzO1xuICBpZiAoIWZuKSB7XG4gICAgY2xlYXJFdmVudCh0aGlzLCBldnQpO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgdmFyIGxpc3RlbmVycyA9IHRoaXMuX2V2ZW50c1tldnRdO1xuXG4gIGlmIChsaXN0ZW5lcnMuZm4pIHtcbiAgICBpZiAoXG4gICAgICBsaXN0ZW5lcnMuZm4gPT09IGZuICYmXG4gICAgICAoIW9uY2UgfHwgbGlzdGVuZXJzLm9uY2UpICYmXG4gICAgICAoIWNvbnRleHQgfHwgbGlzdGVuZXJzLmNvbnRleHQgPT09IGNvbnRleHQpXG4gICAgKSB7XG4gICAgICBjbGVhckV2ZW50KHRoaXMsIGV2dCk7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIGZvciAodmFyIGkgPSAwLCBldmVudHMgPSBbXSwgbGVuZ3RoID0gbGlzdGVuZXJzLmxlbmd0aDsgaSA8IGxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAoXG4gICAgICAgIGxpc3RlbmVyc1tpXS5mbiAhPT0gZm4gfHxcbiAgICAgICAgKG9uY2UgJiYgIWxpc3RlbmVyc1tpXS5vbmNlKSB8fFxuICAgICAgICAoY29udGV4dCAmJiBsaXN0ZW5lcnNbaV0uY29udGV4dCAhPT0gY29udGV4dClcbiAgICAgICkge1xuICAgICAgICBldmVudHMucHVzaChsaXN0ZW5lcnNbaV0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vXG4gICAgLy8gUmVzZXQgdGhlIGFycmF5LCBvciByZW1vdmUgaXQgY29tcGxldGVseSBpZiB3ZSBoYXZlIG5vIG1vcmUgbGlzdGVuZXJzLlxuICAgIC8vXG4gICAgaWYgKGV2ZW50cy5sZW5ndGgpIHRoaXMuX2V2ZW50c1tldnRdID0gZXZlbnRzLmxlbmd0aCA9PT0gMSA/IGV2ZW50c1swXSA6IGV2ZW50cztcbiAgICBlbHNlIGNsZWFyRXZlbnQodGhpcywgZXZ0KTtcbiAgfVxuXG4gIHJldHVybiB0aGlzO1xufTtcblxuLyoqXG4gKiBSZW1vdmUgYWxsIGxpc3RlbmVycywgb3IgdGhvc2Ugb2YgdGhlIHNwZWNpZmllZCBldmVudC5cbiAqXG4gKiBAcGFyYW0geyhTdHJpbmd8U3ltYm9sKX0gW2V2ZW50XSBUaGUgZXZlbnQgbmFtZS5cbiAqIEByZXR1cm5zIHtFdmVudEVtaXR0ZXJ9IGB0aGlzYC5cbiAqIEBwdWJsaWNcbiAqL1xuRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5yZW1vdmVBbGxMaXN0ZW5lcnMgPSBmdW5jdGlvbiByZW1vdmVBbGxMaXN0ZW5lcnMoZXZlbnQpIHtcbiAgdmFyIGV2dDtcblxuICBpZiAoZXZlbnQpIHtcbiAgICBldnQgPSBwcmVmaXggPyBwcmVmaXggKyBldmVudCA6IGV2ZW50O1xuICAgIGlmICh0aGlzLl9ldmVudHNbZXZ0XSkgY2xlYXJFdmVudCh0aGlzLCBldnQpO1xuICB9IGVsc2Uge1xuICAgIHRoaXMuX2V2ZW50cyA9IG5ldyBFdmVudHMoKTtcbiAgICB0aGlzLl9ldmVudHNDb3VudCA9IDA7XG4gIH1cblxuICByZXR1cm4gdGhpcztcbn07XG5cbi8vXG4vLyBBbGlhcyBtZXRob2RzIG5hbWVzIGJlY2F1c2UgcGVvcGxlIHJvbGwgbGlrZSB0aGF0LlxuLy9cbkV2ZW50RW1pdHRlci5wcm90b3R5cGUub2ZmID0gRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5yZW1vdmVMaXN0ZW5lcjtcbkV2ZW50RW1pdHRlci5wcm90b3R5cGUuYWRkTGlzdGVuZXIgPSBFdmVudEVtaXR0ZXIucHJvdG90eXBlLm9uO1xuXG4vL1xuLy8gRXhwb3NlIHRoZSBwcmVmaXguXG4vL1xuRXZlbnRFbWl0dGVyLnByZWZpeGVkID0gcHJlZml4O1xuXG4vL1xuLy8gQWxsb3cgYEV2ZW50RW1pdHRlcmAgdG8gYmUgaW1wb3J0ZWQgYXMgbW9kdWxlIG5hbWVzcGFjZS5cbi8vXG5FdmVudEVtaXR0ZXIuRXZlbnRFbWl0dGVyID0gRXZlbnRFbWl0dGVyO1xuXG4vL1xuLy8gRXhwb3NlIHRoZSBtb2R1bGUuXG4vL1xuaWYgKCd1bmRlZmluZWQnICE9PSB0eXBlb2YgbW9kdWxlKSB7XG4gIG1vZHVsZS5leHBvcnRzID0gRXZlbnRFbWl0dGVyO1xufVxuIiwKICAgICJpbXBvcnQgRXZlbnRFbWl0dGVyIGZyb20gJy4vaW5kZXguanMnXG5cbmV4cG9ydCB7IEV2ZW50RW1pdHRlciB9XG5leHBvcnQgZGVmYXVsdCBFdmVudEVtaXR0ZXJcbiIsCiAgICAiLyohXG4gKiBhY3Rpdml0eS1zdHJlYW1zXG4gKiAgIGh0dHBzOi8vZ2l0aHViLmNvbS9zaWx2ZXJidWNrZXQvYWN0aXZpdHktc3RyZWFtc1xuICpcbiAqIERldmVsb3BlZCBhbmQgTWFpbnRhaW5lZCBieTpcbiAqICAgTmljayBKZW5uaW5ncyA8bmlja0BzaWx2ZXJidWNrZXQubmV0PlxuICpcbiAqIGFjdGl2aXR5LXN0cmVhbXMgaXMgcmVsZWFzZWQgdW5kZXIgdGhlIE1JVCAoc2VlIExJQ0VOU0UpLlxuICpcbiAqIFlvdSBkb24ndCBoYXZlIHRvIGRvIGFueXRoaW5nIHNwZWNpYWwgdG8gY2hvb3NlIG9uZSBsaWNlbnNlIG9yIHRoZSBvdGhlclxuICogYW5kIHlvdSBkb24ndCBoYXZlIHRvIG5vdGlmeSBhbnlvbmUgd2hpY2ggbGljZW5zZSB5b3UgYXJlIHVzaW5nLlxuICogUGxlYXNlIHNlZSB0aGUgY29ycmVzcG9uZGluZyBsaWNlbnNlIGZpbGUgZm9yIGRldGFpbHMgb2YgdGhlc2UgbGljZW5zZXMuXG4gKiBZb3UgYXJlIGZyZWUgdG8gdXNlLCBtb2RpZnkgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSwgYnV0IGFsbCBjb3B5cmlnaHRcbiAqIGluZm9ybWF0aW9uIG11c3QgcmVtYWluLlxuICpcbiAqL1xuXG5pbXBvcnQgdHlwZSB7IEFjdGl2aXR5T2JqZWN0LCBBY3Rpdml0eVN0cmVhbSB9IGZyb20gXCJAc29ja2V0aHViL3NjaGVtYXNcIjtcbmltcG9ydCBFdmVudEVtaXR0ZXIgZnJvbSBcImV2ZW50ZW1pdHRlcjNcIjtcblxuY29uc3QgZWUgPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG5jb25zdCBiYXNlUHJvcHMgPSB7XG4gICAgc3RyZWFtOiBbXG4gICAgICAgIFwiaWRcIixcbiAgICAgICAgXCJ0eXBlXCIsXG4gICAgICAgIFwiYWN0b3JcIixcbiAgICAgICAgXCJ0YXJnZXRcIixcbiAgICAgICAgXCJvYmplY3RcIixcbiAgICAgICAgXCJjb250ZXh0XCIsXG4gICAgICAgIFwiY29udGV4dFwiLFxuICAgICAgICBcInB1Ymxpc2hlZFwiLFxuICAgICAgICBcImVycm9yXCIsXG4gICAgXSxcbiAgICBvYmplY3Q6IFtcbiAgICAgICAgXCJpZFwiLFxuICAgICAgICBcInR5cGVcIixcbiAgICAgICAgXCJjb250ZXh0XCIsXG4gICAgICAgIFwiYWxpYXNcIixcbiAgICAgICAgXCJhdHRhY2hlZFRvXCIsXG4gICAgICAgIFwiYXR0YWNobWVudFwiLFxuICAgICAgICBcImF0dHJpYnV0ZWRUb1wiLFxuICAgICAgICBcImF0dHJpYnV0ZWRXaXRoXCIsXG4gICAgICAgIFwiY29uZGl0aW9uXCIsXG4gICAgICAgIFwiY29udGVudFwiLFxuICAgICAgICBcImNvbnRlbnRNYXBcIixcbiAgICAgICAgXCJjb250ZXh0XCIsXG4gICAgICAgIFwiY29udGV4dE9mXCIsXG4gICAgICAgIFwibmFtZVwiLFxuICAgICAgICBcImVuZFRpbWVcIixcbiAgICAgICAgXCJnZW5lcmF0b3JcIixcbiAgICAgICAgXCJnZW5lcmF0b3JPZlwiLFxuICAgICAgICBcImdyb3VwXCIsXG4gICAgICAgIFwiaWNvblwiLFxuICAgICAgICBcImltYWdlXCIsXG4gICAgICAgIFwiaW5SZXBseVRvXCIsXG4gICAgICAgIFwibWVtYmVyc1wiLFxuICAgICAgICBcIm1lbWJlck9mXCIsXG4gICAgICAgIFwibWVzc2FnZVwiLFxuICAgICAgICBcImxvY2F0aW9uXCIsXG4gICAgICAgIFwibG9jYXRpb25PZlwiLFxuICAgICAgICBcIm9iamVjdE9mXCIsXG4gICAgICAgIFwib3JpZ2luT2ZcIixcbiAgICAgICAgXCJwcmVzZW5jZVwiLFxuICAgICAgICBcInByZXZpZXdcIixcbiAgICAgICAgXCJwcmV2aWV3T2ZcIixcbiAgICAgICAgXCJwcm92aWRlclwiLFxuICAgICAgICBcInByb3ZpZGVyT2ZcIixcbiAgICAgICAgXCJwdWJsaXNoZWRcIixcbiAgICAgICAgXCJyYXRpbmdcIixcbiAgICAgICAgXCJyZWxhdGlvbnNoaXBcIixcbiAgICAgICAgXCJyZXN1bHRPZlwiLFxuICAgICAgICBcInJlcGxpZXNcIixcbiAgICAgICAgXCJyb2xlXCIsXG4gICAgICAgIFwic2NvcGVcIixcbiAgICAgICAgXCJzY29wZU9mXCIsXG4gICAgICAgIFwic3RhcnRUaW1lXCIsXG4gICAgICAgIFwic3RhdHVzXCIsXG4gICAgICAgIFwic3VtbWFyeVwiLFxuICAgICAgICBcInRvcGljXCIsXG4gICAgICAgIFwidGFnXCIsXG4gICAgICAgIFwidGFnT2ZcIixcbiAgICAgICAgXCJ0YXJnZXRPZlwiLFxuICAgICAgICBcInRpdGxlXCIsXG4gICAgICAgIFwidGl0bGVNYXBcIixcbiAgICAgICAgXCJ1cGRhdGVkXCIsXG4gICAgICAgIFwidXJsXCIsXG4gICAgICAgIFwieG1wcDpzdGFuemEtaWRcIixcbiAgICBdLFxufTtcbmNvbnN0IHJlbmFtZSA9IHtcbiAgICBcIkBpZFwiOiBcImlkXCIsXG4gICAgXCJAdHlwZVwiOiBcInR5cGVcIixcbiAgICB2ZXJiOiBcInR5cGVcIixcbiAgICBkaXNwbGF5TmFtZTogXCJuYW1lXCIsXG4gICAgb2JqZWN0VHlwZTogXCJ0eXBlXCIsXG4gICAgcGxhdGZvcm06IFwiY29udGV4dFwiLFxufTtcbmNvbnN0IGV4cGFuZCA9IHtcbiAgICBhY3Rvcjoge1xuICAgICAgICBwcmltYXJ5OiBcImlkXCIsXG4gICAgICAgIHByb3BzOiBiYXNlUHJvcHMsXG4gICAgfSxcbiAgICB0YXJnZXQ6IHtcbiAgICAgICAgcHJpbWFyeTogXCJpZFwiLFxuICAgICAgICBwcm9wczogYmFzZVByb3BzLFxuICAgIH0sXG4gICAgb2JqZWN0OiB7XG4gICAgICAgIHByaW1hcnk6IFwiY29udGVudFwiLFxuICAgICAgICBwcm9wczogYmFzZVByb3BzLFxuICAgIH0sXG59O1xuXG50eXBlIEN1c3RvbVByb3BzID0ge1xuICAgIFtrZXk6IHN0cmluZ106IHN0cmluZyB8IG51bWJlciB8IGJvb2xlYW4gfCBvYmplY3QgfCBzdHJpbmdbXTtcbn07XG5cbmNvbnN0IG9ianMgPSBuZXcgTWFwKCk7XG5jb25zdCBjdXN0b21Qcm9wczogQ3VzdG9tUHJvcHMgPSB7fTtcblxubGV0IGZhaWxPblVua25vd25PYmplY3RQcm9wZXJ0aWVzID0gZmFsc2U7XG5sZXQgd2Fybk9uVW5rbm93bk9iamVjdFByb3BlcnRpZXMgPSB0cnVlO1xubGV0IHNwZWNpYWxPYmpzID0gW107IC8vIHRoZSBvYmplY3RzIGRvbid0IGdldCByZWplY3RlZCBmb3IgYmFkIHByb3BzXG5cbmZ1bmN0aW9uIG1hdGNoZXNDdXN0b21Qcm9wKHR5cGU6IHN0cmluZywga2V5OiBzdHJpbmcpIHtcbiAgICBpZiAoY3VzdG9tUHJvcHNbdHlwZV0gaW5zdGFuY2VvZiBPYmplY3QpIHtcbiAgICAgICAgY29uc3Qgb2JqID0gY3VzdG9tUHJvcHNbdHlwZV0gYXMgc3RyaW5nW107XG4gICAgICAgIGlmIChvYmouaW5jbHVkZXMoa2V5KSkge1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xufVxuXG5mdW5jdGlvbiByZW5hbWVQcm9wPFQ+KG9iajogVCwga2V5OiBzdHJpbmcpOiBUIHtcbiAgICBvYmpbcmVuYW1lW2tleV1dID0gb2JqW2tleV07XG4gICAgZGVsZXRlIG9ialtrZXldO1xuICAgIHJldHVybiBvYmo7XG59XG5cbmZ1bmN0aW9uIHZhbGlkYXRlT2JqZWN0PFQ+KHR5cGU6IHN0cmluZywgaW5jb21pbmdPYmo6IFQsIHJlcXVpcmVJZCA9IGZhbHNlKSB7XG4gICAgLy8gSW5wdXQgdmFsaWRhdGlvbiB3aXRoIGNsZWFyIGVycm9yIG1lc3NhZ2VzXG4gICAgaWYgKGluY29taW5nT2JqID09PSBudWxsKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgIGBBY3Rpdml0eVN0cmVhbXMgdmFsaWRhdGlvbiBmYWlsZWQ6IHRoZSBcIiR7dHlwZX1cIiBwcm9wZXJ0eSBpcyBudWxsLiBFeGFtcGxlOiB7IGlkOiBcInVzZXJAZXhhbXBsZS5jb21cIiwgdHlwZTogXCJwZXJzb25cIiB9YCxcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBpZiAoaW5jb21pbmdPYmogPT09IHVuZGVmaW5lZCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICBgQWN0aXZpdHlTdHJlYW1zIHZhbGlkYXRpb24gZmFpbGVkOiB0aGUgXCIke3R5cGV9XCIgcHJvcGVydHkgaXMgdW5kZWZpbmVkLiBFeGFtcGxlOiB7IGlkOiBcInVzZXJAZXhhbXBsZS5jb21cIiwgdHlwZTogXCJwZXJzb25cIiB9YCxcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIGluY29taW5nT2JqID09PSBcInN0cmluZ1wiKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgIGBBY3Rpdml0eVN0cmVhbXMgdmFsaWRhdGlvbiBmYWlsZWQ6IHRoZSBcIiR7dHlwZX1cIiBwcm9wZXJ0eSByZWNlaXZlZCBzdHJpbmcgXCIke2luY29taW5nT2JqfVwiIGJ1dCBleHBlY3RlZCBhbiBvYmplY3QuIFVzZTogeyBpZDogXCIke2luY29taW5nT2JqfVwiLCB0eXBlOiBcInBlcnNvblwiIH1gLFxuICAgICAgICApO1xuICAgIH1cblxuICAgIGlmICh0eXBlb2YgaW5jb21pbmdPYmogIT09IFwib2JqZWN0XCIgfHwgQXJyYXkuaXNBcnJheShpbmNvbWluZ09iaikpIHtcbiAgICAgICAgY29uc3QgcmVjZWl2ZWRUeXBlID0gQXJyYXkuaXNBcnJheShpbmNvbWluZ09iailcbiAgICAgICAgICAgID8gXCJhcnJheVwiXG4gICAgICAgICAgICA6IHR5cGVvZiBpbmNvbWluZ09iajtcbiAgICAgICAgY29uc3QgcmVjZWl2ZWRWYWx1ZSA9IFN0cmluZyhpbmNvbWluZ09iaik7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgIGBBY3Rpdml0eVN0cmVhbXMgdmFsaWRhdGlvbiBmYWlsZWQ6IHRoZSBcIiR7dHlwZX1cIiBwcm9wZXJ0eSBtdXN0IGJlIGFuIG9iamVjdCwgcmVjZWl2ZWQgJHtyZWNlaXZlZFR5cGV9ICgke3JlY2VpdmVkVmFsdWV9KS4gRXhhbXBsZTogeyBpZDogXCJ1c2VyQGV4YW1wbGUuY29tXCIsIHR5cGU6IFwicGVyc29uXCIgfWAsXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgLy8gUmVxdWlyZSAnaWQnIHByb3BlcnR5IHdoZW4gZXhwbGljaXRseSByZXF1ZXN0ZWQgKGUuZy4sIE9iamVjdC5jcmVhdGUoKSlcbiAgICBjb25zdCBvYmogPSBpbmNvbWluZ09iaiBhcyBBY3Rpdml0eU9iamVjdDtcbiAgICBpZiAocmVxdWlyZUlkICYmICFvYmouaWQpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgYEFjdGl2aXR5U3RyZWFtcyB2YWxpZGF0aW9uIGZhaWxlZDogdGhlIFwiJHt0eXBlfVwiIHByb3BlcnR5IHJlcXVpcmVzIGFuICdpZCcgcHJvcGVydHkuIEV4YW1wbGU6IHsgaWQ6IFwidXNlckBleGFtcGxlLmNvbVwiLCB0eXBlOiBcInBlcnNvblwiIH1gLFxuICAgICAgICApO1xuICAgIH1cblxuICAgIGNvbnN0IHVua25vd25LZXlzID0gT2JqZWN0LmtleXMoaW5jb21pbmdPYmopLmZpbHRlcihcbiAgICAgICAgKGtleTogc3RyaW5nKTogYm9vbGVhbiA9PiB7XG4gICAgICAgICAgICByZXR1cm4gIWJhc2VQcm9wc1t0eXBlXS5pbmNsdWRlcyhrZXkpO1xuICAgICAgICB9LFxuICAgICk7XG5cbiAgICBmb3IgKGNvbnN0IGtleSBvZiB1bmtub3duS2V5cykge1xuICAgICAgICBsZXQgYW86IEFjdGl2aXR5T2JqZWN0ID0gaW5jb21pbmdPYmogYXMgQWN0aXZpdHlPYmplY3Q7XG4gICAgICAgIGlmIChyZW5hbWVba2V5XSkge1xuICAgICAgICAgICAgLy8gcmVuYW1lIHByb3BlcnR5IGluc3RlYWQgb2YgZmFpbFxuICAgICAgICAgICAgYW8gPSByZW5hbWVQcm9wKGFvLCBrZXkpO1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAobWF0Y2hlc0N1c3RvbVByb3AoYW8udHlwZSwga2V5KSkge1xuICAgICAgICAgICAgLy8gY3VzdG9tIHByb3BlcnR5IG1hdGNoZXMsIGNvbnRpbnVlXG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghc3BlY2lhbE9ianMuaW5jbHVkZXMoYW8udHlwZSkpIHtcbiAgICAgICAgICAgIC8vIG5vdCBkZWZpbmVkIGFzIGEgc3BlY2lhbCBwcm9wXG4gICAgICAgICAgICAvLyBkb24ndCBrbm93IHdoYXQgdG8gZG8gd2l0aCBpdCwgc28gdGhyb3cgZXJyb3JcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKGFvKTtcbiAgICAgICAgICAgIGNvbnN0IHJlY2VpdmVkVmFsdWUgPVxuICAgICAgICAgICAgICAgIHR5cGVvZiBhb1trZXldID09PSBcInN0cmluZ1wiID8gYFwiJHthb1trZXldfVwiYCA6IFN0cmluZyhhb1trZXldKTtcbiAgICAgICAgICAgIGNvbnN0IGVyciA9IGBBY3Rpdml0eVN0cmVhbXMgdmFsaWRhdGlvbiBmYWlsZWQ6IHByb3BlcnR5IFwiJHtrZXl9XCIgd2l0aCB2YWx1ZSAke3JlY2VpdmVkVmFsdWV9IGlzIG5vdCBhbGxvd2VkIG9uIHRoZSBcIiR7dHlwZX1cIiBvYmplY3Qgb2YgdHlwZSBcIiR7YW8udHlwZX1cIi5gO1xuICAgICAgICAgICAgaWYgKGZhaWxPblVua25vd25PYmplY3RQcm9wZXJ0aWVzKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGVycik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAod2Fybk9uVW5rbm93bk9iamVjdFByb3BlcnRpZXMpIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLndhcm4oZXJyKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbn1cblxuZnVuY3Rpb24gZW5zdXJlUHJvcHMob2JqOiBBY3Rpdml0eU9iamVjdCk6IEFjdGl2aXR5T2JqZWN0IHtcbiAgICAvLyBlbnN1cmUgdGhlIG5hbWUgcHJvcGVydHksIHdoaWNoIGNhbiBnZW5lcmFsbHkgYmUgaW5mZXJyZWQgZnJvbSB0aGUgaWRcbiAgICAvLyBuYW1lID0gb2JqLm1hdGNoKC8oPyg/XFx3Kyk6XFwvXFwvKSg/Oi4rQCk/KC4rPykoPzpcXC98JCkvKVsxXVxuICAgIHJldHVybiBvYmo7XG59XG5cbmZ1bmN0aW9uIGV4cGFuZFN0cmVhbShtZXRhOiBBY3Rpdml0eVN0cmVhbSkge1xuICAgIGNvbnN0IHN0cmVhbSA9IHt9O1xuICAgIGZvciAoY29uc3Qga2V5IG9mIE9iamVjdC5rZXlzKG1ldGEpKSB7XG4gICAgICAgIGlmICh0eXBlb2YgbWV0YVtrZXldID09PSBcInN0cmluZ1wiKSB7XG4gICAgICAgICAgICBzdHJlYW1ba2V5XSA9IG9ianMuZ2V0KG1ldGFba2V5XSkgfHwgbWV0YVtrZXldO1xuICAgICAgICB9IGVsc2UgaWYgKEFycmF5LmlzQXJyYXkobWV0YVtrZXldKSkge1xuICAgICAgICAgICAgc3RyZWFtW2tleV0gPSBbXTtcbiAgICAgICAgICAgIGZvciAoY29uc3QgZW50cnkgb2YgbWV0YVtrZXldKSB7XG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBlbnRyeSA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgICAgICAgICAgICAgICBzdHJlYW1ba2V5XS5wdXNoKG9ianMuZ2V0KGVudHJ5KSB8fCBlbnRyeSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgc3RyZWFtW2tleV0gPSBtZXRhW2tleV07XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBvbmx5IGV4cGFuZCBzdHJpbmcgaW50byBvYmplY3RzIGlmIHRoZXkgYXJlIGluIHRoZSBleHBhbmQgbGlzdFxuICAgIGZvciAoY29uc3Qga2V5IG9mIE9iamVjdC5rZXlzKGV4cGFuZCkpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBzdHJlYW1ba2V5XSA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgICAgICAgY29uc3QgaWR4ID0gZXhwYW5kW2tleV0ucHJpbWFyeTtcbiAgICAgICAgICAgIGNvbnN0IG9iaiA9IHt9O1xuICAgICAgICAgICAgb2JqW2lkeF0gPSBzdHJlYW1ba2V5XTtcbiAgICAgICAgICAgIHN0cmVhbVtrZXldID0gb2JqO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBzdHJlYW07XG59XG5cbmZ1bmN0aW9uIFN0cmVhbShcbiAgICBtZXRhOiBBY3Rpdml0eVN0cmVhbSxcbik6IEFjdGl2aXR5U3RyZWFtIHwgQWN0aXZpdHlPYmplY3QgfCBSZWNvcmQ8c3RyaW5nLCBuZXZlcj4ge1xuICAgIHZhbGlkYXRlT2JqZWN0KFwic3RyZWFtXCIsIG1ldGEpO1xuICAgIGlmICh0eXBlb2YgbWV0YS5vYmplY3QgPT09IFwib2JqZWN0XCIpIHtcbiAgICAgICAgdmFsaWRhdGVPYmplY3QoXCJvYmplY3RcIiwgbWV0YS5vYmplY3QpO1xuICAgIH1cbiAgICBjb25zdCBzdHJlYW0gPSBleHBhbmRTdHJlYW0obWV0YSk7XG4gICAgZWUuZW1pdChcImFjdGl2aXR5LXN0cmVhbVwiLCBzdHJlYW0pO1xuICAgIHJldHVybiBzdHJlYW07XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQWN0aXZpdHlPYmplY3RNYW5hZ2VyIHtcbiAgICBjcmVhdGUob2JqOiB1bmtub3duKTogdW5rbm93bjtcbiAgICBkZWxldGUoaWQ6IHN0cmluZyk6IGJvb2xlYW47XG4gICAgbGlzdCgpOiBJdGVyYWJsZUl0ZXJhdG9yPHVua25vd24+O1xuICAgIGdldChpZDogc3RyaW5nLCBleHBhbmQ/OiBib29sZWFuKTogdW5rbm93bjtcbn1cblxuY29uc3QgX09iamVjdDogQWN0aXZpdHlPYmplY3RNYW5hZ2VyID0ge1xuICAgIGNyZWF0ZTogKG9iajogQWN0aXZpdHlPYmplY3QpID0+IHtcbiAgICAgICAgdmFsaWRhdGVPYmplY3QoXCJvYmplY3RcIiwgb2JqLCB0cnVlKTsgLy8gcmVxdWlyZSBJRCBmb3IgT2JqZWN0LmNyZWF0ZSgpXG4gICAgICAgIGNvbnN0IGFvID0gZW5zdXJlUHJvcHMob2JqKTtcbiAgICAgICAgb2Jqcy5zZXQoYW8uaWQsIGFvKTtcbiAgICAgICAgZWUuZW1pdChcImFjdGl2aXR5LW9iamVjdC1jcmVhdGVcIiwgYW8pO1xuICAgICAgICByZXR1cm4gYW87XG4gICAgfSxcblxuICAgIGRlbGV0ZTogKGlkKSA9PiB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IG9ianMuZGVsZXRlKGlkKTtcbiAgICAgICAgaWYgKHJlc3VsdCkge1xuICAgICAgICAgICAgZWUuZW1pdChcImFjdGl2aXR5LW9iamVjdC1kZWxldGVcIiwgaWQpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfSxcblxuICAgIGdldDogKGlkLCBleHBhbmQpID0+IHtcbiAgICAgICAgbGV0IG9iaiA9IG9ianMuZ2V0KGlkKTtcbiAgICAgICAgaWYgKCFvYmopIHtcbiAgICAgICAgICAgIGlmICghZXhwYW5kKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGlkO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgb2JqID0geyBpZDogaWQgfTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZW5zdXJlUHJvcHMob2JqKTtcbiAgICB9LFxuXG4gICAgbGlzdDogKCk6IEl0ZXJhYmxlSXRlcmF0b3I8dW5rbm93bj4gPT4gb2Jqcy5rZXlzKCksXG59O1xuXG5leHBvcnQgaW50ZXJmYWNlIEFTRmFjdG9yeU9wdGlvbnMge1xuICAgIHNwZWNpYWxPYmpzPzogQXJyYXk8c3RyaW5nPjtcbiAgICBmYWlsT25Vbmtub3duT2JqZWN0UHJvcGVydGllcz86IGJvb2xlYW47XG4gICAgd2Fybk9uVW5rbm93bk9iamVjdFByb3BlcnRpZXM/OiBib29sZWFuO1xuICAgIGN1c3RvbVByb3BzPzogQ3VzdG9tUHJvcHM7XG59XG5cbnR5cGUgRXZlbnRDYWxsYmFjayA9ICguLi5hcmdzOiB1bmtub3duW10pID0+IHZvaWQ7XG5cbmV4cG9ydCBpbnRlcmZhY2UgQVNNYW5hZ2VyIHtcbiAgICBTdHJlYW0obWV0YTogdW5rbm93bik6IEFjdGl2aXR5U3RyZWFtIHwgQWN0aXZpdHlPYmplY3Q7XG4gICAgT2JqZWN0OiBBY3Rpdml0eU9iamVjdE1hbmFnZXI7XG4gICAgb24oZXZlbnQ6IHN0cmluZywgZnVuYzogRXZlbnRDYWxsYmFjayk6IHZvaWQ7XG4gICAgb25jZShldmVudDogc3RyaW5nLCBmdW5jOiBFdmVudENhbGxiYWNrKTogdm9pZDtcbiAgICBvZmYoZXZlbnQ6IHN0cmluZywgZnVuYzogRXZlbnRDYWxsYmFjayk6IHZvaWQ7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBBU0ZhY3Rvcnkob3B0czogQVNGYWN0b3J5T3B0aW9ucyA9IHt9KTogQVNNYW5hZ2VyIHtcbiAgICBzcGVjaWFsT2JqcyA9IG9wdHM/LnNwZWNpYWxPYmpzIHx8IFtdO1xuICAgIGZhaWxPblVua25vd25PYmplY3RQcm9wZXJ0aWVzID1cbiAgICAgICAgdHlwZW9mIG9wdHMuZmFpbE9uVW5rbm93bk9iamVjdFByb3BlcnRpZXMgPT09IFwiYm9vbGVhblwiXG4gICAgICAgICAgICA/IG9wdHMuZmFpbE9uVW5rbm93bk9iamVjdFByb3BlcnRpZXNcbiAgICAgICAgICAgIDogZmFpbE9uVW5rbm93bk9iamVjdFByb3BlcnRpZXM7XG4gICAgd2Fybk9uVW5rbm93bk9iamVjdFByb3BlcnRpZXMgPVxuICAgICAgICB0eXBlb2Ygb3B0cy53YXJuT25Vbmtub3duT2JqZWN0UHJvcGVydGllcyA9PT0gXCJib29sZWFuXCJcbiAgICAgICAgICAgID8gb3B0cy53YXJuT25Vbmtub3duT2JqZWN0UHJvcGVydGllc1xuICAgICAgICAgICAgOiB3YXJuT25Vbmtub3duT2JqZWN0UHJvcGVydGllcztcbiAgICBmb3IgKGNvbnN0IHByb3BOYW1lIG9mIE9iamVjdC5rZXlzKG9wdHMuY3VzdG9tUHJvcHMgfHwge30pKSB7XG4gICAgICAgIGlmICh0eXBlb2Ygb3B0cy5jdXN0b21Qcm9wc1twcm9wTmFtZV0gPT09IFwib2JqZWN0XCIpIHtcbiAgICAgICAgICAgIGN1c3RvbVByb3BzW3Byb3BOYW1lXSA9IG9wdHMuY3VzdG9tUHJvcHNbcHJvcE5hbWVdO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgICAgU3RyZWFtOiBTdHJlYW0sXG4gICAgICAgIE9iamVjdDogX09iamVjdCxcbiAgICAgICAgb246IChldmVudCwgZnVuYykgPT4gZWUub24oZXZlbnQsIGZ1bmMpLFxuICAgICAgICBvbmNlOiAoZXZlbnQsIGZ1bmMpID0+IGVlLm9uY2UoZXZlbnQsIGZ1bmMpLFxuICAgICAgICBvZmY6IChldmVudCwgZnVuY05hbWUpID0+IGVlLm9mZihldmVudCwgZnVuY05hbWUpLFxuICAgIH0gYXMgQVNNYW5hZ2VyO1xufVxuXG4vLyBiaW9tZS1pZ25vcmUgbGludC9zdXNwaWNpb3VzL25vRXhwbGljaXRBbnk6IDxleHBsYW5hdGlvbj5cbigoZ2xvYmFsOiBhbnkpID0+IHtcbiAgICBnbG9iYWwuQVNGYWN0b3IgPSBBU0ZhY3Rvcnk7XG59KSh0eXBlb2Ygd2luZG93ID09PSBcIm9iamVjdFwiID8gd2luZG93IDoge30pO1xuIiwKICAgICJpbXBvcnQgeyBBU0ZhY3RvcnksIHR5cGUgQVNNYW5hZ2VyIH0gZnJvbSBcIkBzb2NrZXRodWIvYWN0aXZpdHktc3RyZWFtc1wiO1xuaW1wb3J0IHR5cGUge1xuICAgIEFjdGl2aXR5T2JqZWN0LFxuICAgIEFjdGl2aXR5U3RyZWFtLFxuICAgIEJhc2VBY3Rpdml0eU9iamVjdCxcbn0gZnJvbSBcIkBzb2NrZXRodWIvc2NoZW1hc1wiO1xuaW1wb3J0IEV2ZW50RW1pdHRlciBmcm9tIFwiZXZlbnRlbWl0dGVyM1wiO1xuaW1wb3J0IHR5cGUgeyBTb2NrZXQgfSBmcm9tIFwic29ja2V0LmlvLWNsaWVudFwiO1xuXG5leHBvcnQgaW50ZXJmYWNlIEV2ZW50TWFwcGluZyB7XG4gICAgY3JlZGVudGlhbHM6IE1hcDxzdHJpbmcsIEFjdGl2aXR5U3RyZWFtPjtcbiAgICBcImFjdGl2aXR5LW9iamVjdFwiOiBNYXA8c3RyaW5nLCBCYXNlQWN0aXZpdHlPYmplY3Q+O1xuICAgIGNvbm5lY3Q6IE1hcDxzdHJpbmcsIEFjdGl2aXR5U3RyZWFtPjtcbiAgICBqb2luOiBNYXA8c3RyaW5nLCBBY3Rpdml0eVN0cmVhbT47XG59XG5cbmludGVyZmFjZSBDdXN0b21FbWl0dGVyIGV4dGVuZHMgRXZlbnRFbWl0dGVyIHtcbiAgICBfZW1pdChzOiBzdHJpbmcsIG86IHVua25vd24sIGM/OiB1bmtub3duKTogdm9pZDtcbiAgICBjb25uZWN0KCk6IHZvaWQ7XG4gICAgZGlzY29ubmVjdCgpOiB2b2lkO1xuICAgIGNvbm5lY3RlZDogYm9vbGVhbjtcbiAgICBpZDogc3RyaW5nO1xufVxuXG4vKipcbiAqIFNvY2tldGh1YkNsaWVudCAtIENsaWVudCBsaWJyYXJ5IGZvciBTb2NrZXRodWIgcHJvdG9jb2wgZ2F0ZXdheVxuICpcbiAqIEEgSmF2YVNjcmlwdCBjbGllbnQgZm9yIGNvbm5lY3RpbmcgdG8gU29ja2V0aHViIHNlcnZlcnMuIFByb3ZpZGVzIGEgaGlnaC1sZXZlbFxuICogQVBJIGZvciBzZW5kaW5nIGFuZCByZWNlaXZpbmcgQWN0aXZpdHlTdHJlYW1zIG1lc3NhZ2VzIG92ZXIgU29ja2V0LklPLCB3aXRoXG4gKiBhdXRvbWF0aWMgc3RhdGUgbWFuYWdlbWVudCBhbmQgcmVjb25uZWN0aW9uIGhhbmRsaW5nLlxuICpcbiAqIFNvY2tldGh1YiBhY3RzIGFzIGEgcHJvdG9jb2wgZ2F0ZXdheSwgdHJhbnNsYXRpbmcgQWN0aXZpdHlTdHJlYW1zIG1lc3NhZ2VzIGludG9cbiAqIHZhcmlvdXMgcHJvdG9jb2xzIChYTVBQLCBJUkMsIFJTUywgZXRjLikuIFRoaXMgY2xpZW50IGhhbmRsZXMgdGhlIGNvbW11bmljYXRpb25cbiAqIHdpdGggdGhlIFNvY2tldGh1YiBzZXJ2ZXIsIGluY2x1ZGluZyBjcmVkZW50aWFsIG1hbmFnZW1lbnQsIGNvbm5lY3Rpb24gc3RhdGUsXG4gKiBhbmQgYXV0b21hdGljIHJlY29ubmVjdGlvbi5cbiAqXG4gKiAjIyBBdXRvbWF0aWMgUmVjb25uZWN0aW9uICYgU3RhdGUgUmVwbGF5XG4gKlxuICogVGhpcyBjbGllbnQgYXV0b21hdGljYWxseSBoYW5kbGVzIHRyYW5zaWVudCBuZXR3b3JrIGRpc2Nvbm5lY3Rpb25zIGJ5IHN0b3JpbmdcbiAqIGNvbm5lY3Rpb24gc3RhdGUgaW4gbWVtb3J5IGFuZCByZXBsYXlpbmcgaXQgd2hlbiB0aGUgc29ja2V0IHJlY29ubmVjdHMuXG4gKlxuICogIyMjIFNlY3VyaXR5IE1vZGVsXG4gKlxuICogKipTdG9yYWdlIExvY2F0aW9uOioqXG4gKiAtIEFsbCBjcmVkZW50aWFscyBhbmQgc3RhdGUgYXJlIHN0b3JlZCBPTkxZIGluIEphdmFTY3JpcHQgbWVtb3J5IChoZWFwKVxuICogLSBOb3RoaW5nIGlzIHBlcnNpc3RlZCB0byBsb2NhbFN0b3JhZ2UsIHNlc3Npb25TdG9yYWdlLCBjb29raWVzLCBvciBkaXNrXG4gKiAtIE1lbW9yeSBpcyBjbGVhcmVkIHdoZW4gdGhlIGJyb3dzZXIgdGFiIGNsb3NlcyBvciBwYWdlIHJlZnJlc2hlc1xuICpcbiAqICoqUmVwbGF5IFRyaWdnZXJzOioqXG4gKiAtIEF1dG9tYXRpYyByZXBsYXkgb2NjdXJzIG9uIFNvY2tldC5JTyByZWNvbm5lY3Rpb24gZXZlbnRzXG4gKiAtIFR5cGljYWxseSB0cmlnZ2VyZWQgYnkgYnJpZWYgbmV0d29yayBpbnRlcnJ1cHRpb25zIChXaUZpIHN3aXRjaGluZywgbW9iaWxlIG5ldHdvcmsgYmxpcHMpXG4gKiAtIERvZXMgTk9UIG9jY3VyIG9uIHBhZ2UgcmVmcmVzaCAobmV3IFNvY2tldGh1YkNsaWVudCBpbnN0YW5jZSA9IGVtcHR5IHN0YXRlKVxuICpcbiAqICoqU2VydmVyIFJlc3RhcnQgQmVoYXZpb3I6KipcbiAqIC0gSWYgc2VydmVyIHJlc3RhcnRzLCBjbGllbnQgc29ja2V0IHdpbGwgcmVjb25uZWN0IGFuZCByZXBsYXkgY3JlZGVudGlhbHNcbiAqIC0gU2VydmVyIG11c3QgaGFuZGxlIHJlcGxheWVkIGNyZWRlbnRpYWxzIGFwcHJvcHJpYXRlbHkgKHZhbGlkYXRlLCByZWplY3Qgc3RhbGUgc2Vzc2lvbnMsIGV0Yy4pXG4gKiAtIEFwcGxpY2F0aW9ucyBzaG91bGQgaW1wbGVtZW50IHByb3BlciBzZXNzaW9uIHZhbGlkYXRpb24gc2VydmVyLXNpZGVcbiAqXG4gKiAqKkxpZmV0aW1lOioqXG4gKiAtIENyZWRlbnRpYWxzIGV4aXN0IG9ubHkgZHVyaW5nIHRoZSBicm93c2VyIHRhYidzIGxpZmV0aW1lXG4gKiAtIENsZWFyZWQgb24gcGFnZSByZWxvYWQsIHRhYiBjbG9zZSwgb3IgbWFudWFsIGRpc2Nvbm5lY3RcbiAqIC0gTm90IGFjY2Vzc2libGUgYWNyb3NzIHRhYnMgb3IgYWZ0ZXIgYnJvd3NlciByZXN0YXJ0XG4gKlxuICogKipXaGF0IEdldHMgUmVwbGF5ZWQ6KipcbiAqIC0gQ3JlZGVudGlhbHMgKHVzZXJuYW1lL3Bhc3N3b3JkL3Rva2VucyBzZW50IHZpYSBjcmVkZW50aWFscyBldmVudClcbiAqIC0gQWN0aXZpdHkgT2JqZWN0cyAoYWN0b3IgZGVmaW5pdGlvbnMpXG4gKiAtIENvbm5lY3QgY29tbWFuZHMgKHBsYXRmb3JtIGNvbm5lY3Rpb25zKVxuICogLSBKb2luIGNvbW1hbmRzIChyb29tL2NoYW5uZWwgam9pbnMpXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIC8vIENyZWF0ZSBjbGllbnRcbiAqIGNvbnN0IHNvY2tldCA9IGlvKCdodHRwOi8vbG9jYWxob3N0OjEwNTUwJyk7XG4gKiBjb25zdCBjbGllbnQgPSBuZXcgU29ja2V0aHViQ2xpZW50KHNvY2tldCk7XG4gKlxuICogLy8gU2VuZCBjcmVkZW50aWFscyAtIHRoZXNlIHdpbGwgYmUgcmVwbGF5ZWQgb24gcmVjb25uZWN0aW9uXG4gKiBjbGllbnQuc29ja2V0LmVtaXQoJ2NyZWRlbnRpYWxzJywge1xuICogICBhY3RvcjogJ3VzZXJAZXhhbXBsZS5jb20nLFxuICogICBvYmplY3Q6IHsgdXNlcm5hbWU6ICd1c2VyJywgcGFzc3dvcmQ6ICdwYXNzJyB9XG4gKiB9KTtcbiAqXG4gKiAvLyBJZiBuZXR3b3JrIGRpc2Nvbm5lY3RzIGFuZCByZWNvbm5lY3RzLCBjcmVkZW50aWFscyBhcmUgYXV0b21hdGljYWxseSByZXBsYXllZFxuICogLy8gSWYgcGFnZSByZWZyZXNoZXMsIGNyZWRlbnRpYWxzIGFyZSBsb3N0IGFuZCBtdXN0IGJlIHJlc2VudFxuICogYGBgXG4gKi9cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFNvY2tldGh1YkNsaWVudCB7XG4gICAgLyoqXG4gICAgICogSW4tbWVtb3J5IHN0b3JhZ2UgZm9yIGNsaWVudCBzdGF0ZSB0aGF0IHNob3VsZCBiZSByZXBsYXllZCBvbiByZWNvbm5lY3Rpb24uXG4gICAgICpcbiAgICAgKiBTZWN1cml0eTogU3RvcmVkIE9OTFkgaW4gSmF2YVNjcmlwdCBoZWFwIG1lbW9yeS4gTmV2ZXIgcGVyc2lzdGVkIHRvIGRpc2ssXG4gICAgICogbG9jYWxTdG9yYWdlLCBvciBhbnkgcGVybWFuZW50IHN0b3JhZ2UuIENsZWFyZWQgb24gcGFnZSByZWxvYWQuXG4gICAgICovXG4gICAgcHJpdmF0ZSBldmVudHM6IEV2ZW50TWFwcGluZyA9IHtcbiAgICAgICAgY3JlZGVudGlhbHM6IG5ldyBNYXAoKSxcbiAgICAgICAgXCJhY3Rpdml0eS1vYmplY3RcIjogbmV3IE1hcCgpLFxuICAgICAgICBjb25uZWN0OiBuZXcgTWFwKCksXG4gICAgICAgIGpvaW46IG5ldyBNYXAoKSxcbiAgICB9O1xuICAgIHByaXZhdGUgX3NvY2tldDogU29ja2V0O1xuICAgIHB1YmxpYyBBY3Rpdml0eVN0cmVhbXM6IEFTTWFuYWdlcjtcbiAgICBwdWJsaWMgc29ja2V0OiBDdXN0b21FbWl0dGVyO1xuICAgIHB1YmxpYyBkZWJ1ZyA9IHRydWU7XG5cbiAgICBjb25zdHJ1Y3Rvcihzb2NrZXQ6IFNvY2tldCkge1xuICAgICAgICBpZiAoIXNvY2tldCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiU29ja2V0aHViQ2xpZW50IHJlcXVpcmVzIGEgc29ja2V0LmlvIGluc3RhbmNlXCIpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX3NvY2tldCA9IHNvY2tldDtcblxuICAgICAgICB0aGlzLnNvY2tldCA9IHRoaXMuY3JlYXRlUHVibGljRW1pdHRlcigpO1xuICAgICAgICB0aGlzLnJlZ2lzdGVyU29ja2V0SU9IYW5kbGVycygpO1xuICAgICAgICB0aGlzLmluaXRBY3Rpdml0eVN0cmVhbXMoKTtcblxuICAgICAgICB0aGlzLkFjdGl2aXR5U3RyZWFtcy5vbihcbiAgICAgICAgICAgIFwiYWN0aXZpdHktb2JqZWN0LWNyZWF0ZVwiLFxuICAgICAgICAgICAgKG9iajogQWN0aXZpdHlPYmplY3QpID0+IHtcbiAgICAgICAgICAgICAgICBzb2NrZXQuZW1pdChcImFjdGl2aXR5LW9iamVjdFwiLCBvYmosIChlcnI6IG5ldmVyKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChlcnIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXCJmYWlsZWQgdG8gY3JlYXRlIGFjdGl2aXR5LW9iamVjdCBcIiwgZXJyKTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZXZlbnRBY3Rpdml0eU9iamVjdChvYmopO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9LFxuICAgICAgICApO1xuXG4gICAgICAgIHNvY2tldC5vbihcImFjdGl2aXR5LW9iamVjdFwiLCAob2JqKSA9PiB7XG4gICAgICAgICAgICB0aGlzLkFjdGl2aXR5U3RyZWFtcy5PYmplY3QuY3JlYXRlKG9iaik7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIGluaXRBY3Rpdml0eVN0cmVhbXMoKSB7XG4gICAgICAgIHRoaXMuQWN0aXZpdHlTdHJlYW1zID0gQVNGYWN0b3J5KHsgc3BlY2lhbE9ianM6IFtcImNyZWRlbnRpYWxzXCJdIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENsZWFyIHN0b3JlZCBjcmVkZW50aWFscyB0byBwcmV2ZW50IGF1dG9tYXRpYyByZXBsYXkgb24gcmVjb25uZWN0aW9uLlxuICAgICAqXG4gICAgICogVGhpcyBtZXRob2QgcmVtb3ZlcyBhbGwgc3RvcmVkIGNyZWRlbnRpYWxzIGZyb20gbWVtb3J5LiBVc2VmdWwgZm9yXG4gICAgICogc2VjdXJpdHktc2Vuc2l0aXZlIGFwcGxpY2F0aW9ucyB0aGF0IHdhbnQgdG8gcHJldmVudCBhdXRvbWF0aWMgY3JlZGVudGlhbFxuICAgICAqIHJlcGxheSB3aGVuIHRoZSBzb2NrZXQgcmVjb25uZWN0cy5cbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIC8vIENsZWFyIGNyZWRlbnRpYWxzIG9uIGRpc2Nvbm5lY3RcbiAgICAgKiBzYy5zb2NrZXQub24oJ2Rpc2Nvbm5lY3QnLCAoKSA9PiB7XG4gICAgICogICBzYy5jbGVhckNyZWRlbnRpYWxzKCk7XG4gICAgICogfSk7XG4gICAgICogYGBgXG4gICAgICovXG4gICAgcHVibGljIGNsZWFyQ3JlZGVudGlhbHMoKTogdm9pZCB7XG4gICAgICAgIHRoaXMuZXZlbnRzLmNyZWRlbnRpYWxzLmNsZWFyKCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBjcmVhdGVQdWJsaWNFbWl0dGVyKCk6IEN1c3RvbUVtaXR0ZXIge1xuICAgICAgICBjb25zdCBzb2NrZXQgPSBuZXcgRXZlbnRFbWl0dGVyKCkgYXMgQ3VzdG9tRW1pdHRlcjtcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9iYW4tdHMtY29tbWVudFxuICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgIHNvY2tldC5fZW1pdCA9IHNvY2tldC5lbWl0O1xuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L2Jhbi10cy1jb21tZW50XG4gICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgc29ja2V0LmVtaXQgPSAoZXZlbnQsIGNvbnRlbnQsIGNhbGxiYWNrKTogdm9pZCA9PiB7XG4gICAgICAgICAgICBpZiAoZXZlbnQgPT09IFwiY3JlZGVudGlhbHNcIikge1xuICAgICAgICAgICAgICAgIHRoaXMuZXZlbnRDcmVkZW50aWFscyhjb250ZW50KTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoZXZlbnQgPT09IFwiYWN0aXZpdHktb2JqZWN0XCIpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmV2ZW50QWN0aXZpdHlPYmplY3QoY29udGVudCk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGV2ZW50ID09PSBcIm1lc3NhZ2VcIikge1xuICAgICAgICAgICAgICAgIHRoaXMuZXZlbnRNZXNzYWdlKGNvbnRlbnQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5fc29ja2V0LmVtaXQoZXZlbnQgYXMgc3RyaW5nLCBjb250ZW50LCBjYWxsYmFjayk7XG4gICAgICAgIH07XG4gICAgICAgIHNvY2tldC5jb25uZWN0ZWQgPSBmYWxzZTtcbiAgICAgICAgc29ja2V0LmRpc2Nvbm5lY3QgPSAoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLl9zb2NrZXQuZGlzY29ubmVjdCgpO1xuICAgICAgICB9O1xuICAgICAgICBzb2NrZXQuY29ubmVjdCA9ICgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuX3NvY2tldC5jb25uZWN0KCk7XG4gICAgICAgIH07XG4gICAgICAgIHJldHVybiBzb2NrZXQ7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBldmVudEFjdGl2aXR5T2JqZWN0KGNvbnRlbnQ6IEFjdGl2aXR5T2JqZWN0KSB7XG4gICAgICAgIGlmIChjb250ZW50LmlkKSB7XG4gICAgICAgICAgICB0aGlzLmV2ZW50c1tcImFjdGl2aXR5LW9iamVjdFwiXS5zZXQoY29udGVudC5pZCwgY29udGVudCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIGV2ZW50Q3JlZGVudGlhbHMoY29udGVudDogQWN0aXZpdHlTdHJlYW0pIHtcbiAgICAgICAgaWYgKGNvbnRlbnQub2JqZWN0ICYmIGNvbnRlbnQub2JqZWN0LnR5cGUgPT09IFwiY3JlZGVudGlhbHNcIikge1xuICAgICAgICAgICAgY29uc3Qga2V5OiBzdHJpbmcgPVxuICAgICAgICAgICAgICAgIGNvbnRlbnQuYWN0b3IuaWQgfHwgKGNvbnRlbnQuYWN0b3IgYXMgdW5rbm93biBhcyBzdHJpbmcpO1xuICAgICAgICAgICAgdGhpcy5ldmVudHMuY3JlZGVudGlhbHMuc2V0KGtleSwgY29udGVudCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIGV2ZW50TWVzc2FnZShjb250ZW50OiBCYXNlQWN0aXZpdHlPYmplY3QpIHtcbiAgICAgICAgaWYgKCF0aGlzLl9zb2NrZXQuY29ubmVjdGVkKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgLy8gZWl0aGVyIHN0b3JlcyBvciBkZWxldGUgdGhlIHNwZWNpZmllZCBjb250ZW50IG9udG8gdGhlIHN0b3JlZEpvaW5zIG1hcCxcbiAgICAgICAgLy8gZm9yIHJlcGx5IG9uY2Ugd2UncmUgYmFjayBvbmxpbmUuXG4gICAgICAgIGNvbnN0IGtleSA9IFNvY2tldGh1YkNsaWVudC5nZXRLZXkoY29udGVudCBhcyBBY3Rpdml0eVN0cmVhbSk7XG4gICAgICAgIGlmIChjb250ZW50LnR5cGUgPT09IFwiam9pblwiIHx8IGNvbnRlbnQudHlwZSA9PT0gXCJjb25uZWN0XCIpIHtcbiAgICAgICAgICAgIHRoaXMuZXZlbnRzW2NvbnRlbnQudHlwZV0uc2V0KGtleSwgY29udGVudCBhcyBBY3Rpdml0eVN0cmVhbSk7XG4gICAgICAgIH0gZWxzZSBpZiAoY29udGVudC50eXBlID09PSBcImxlYXZlXCIpIHtcbiAgICAgICAgICAgIHRoaXMuZXZlbnRzLmpvaW4uZGVsZXRlKGtleSk7XG4gICAgICAgIH0gZWxzZSBpZiAoY29udGVudC50eXBlID09PSBcImRpc2Nvbm5lY3RcIikge1xuICAgICAgICAgICAgdGhpcy5ldmVudHMuY29ubmVjdC5kZWxldGUoa2V5KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgc3RhdGljIGdldEtleShjb250ZW50OiBBY3Rpdml0eVN0cmVhbSkge1xuICAgICAgICBjb25zdCBhY3RvciA9IGNvbnRlbnQuYWN0b3I/LmlkIHx8IGNvbnRlbnQuYWN0b3I7XG4gICAgICAgIGlmICghYWN0b3IpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgICAgICBgYWN0b3IgcHJvcGVydHkgbm90IHByZXNlbnQgZm9yIG1lc3NhZ2UgdHlwZTogJHtjb250ZW50Py50eXBlfWAsXG4gICAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHRhcmdldCA9IGNvbnRlbnQudGFyZ2V0XG4gICAgICAgICAgICA/IGNvbnRlbnQudGFyZ2V0LmlkIHx8IGNvbnRlbnQudGFyZ2V0XG4gICAgICAgICAgICA6IFwiXCI7XG4gICAgICAgIHJldHVybiBgJHthY3Rvcn0tJHt0YXJnZXR9YDtcbiAgICB9XG5cbiAgICBwcml2YXRlIGxvZyhtc2c6IHN0cmluZywgb2JqPzogdW5rbm93bikge1xuICAgICAgICBpZiAodGhpcy5kZWJ1Zykge1xuICAgICAgICAgICAgY29uc29sZS5sb2cobXNnLCBvYmopO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSByZWdpc3RlclNvY2tldElPSGFuZGxlcnMoKSB7XG4gICAgICAgIC8vIG1pZGRsZXdhcmUgZm9yIGV2ZW50cyB3aGljaCBkb24ndCBkZWFsIGluIEFTIG9iamVjdHNcbiAgICAgICAgY29uc3QgY2FsbEhhbmRsZXIgPSAoZXZlbnQ6IHN0cmluZykgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIGFzeW5jIChvYmo/OiB1bmtub3duKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKGV2ZW50ID09PSBcImNvbm5lY3RcIikge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnNvY2tldC5pZCA9IHRoaXMuX3NvY2tldC5pZDtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zb2NrZXQuY29ubmVjdGVkID0gdHJ1ZTtcblxuICAgICAgICAgICAgICAgICAgICAvKipcbiAgICAgICAgICAgICAgICAgICAgICogQXV0b21hdGljIHN0YXRlIHJlcGxheSBvbiByZWNvbm5lY3Rpb24uXG4gICAgICAgICAgICAgICAgICAgICAqXG4gICAgICAgICAgICAgICAgICAgICAqIFdoZW4gU29ja2V0LklPIHJlY29ubmVjdHMgYWZ0ZXIgYSBuZXR3b3JrIGludGVycnVwdGlvbiwgd2UgYXV0b21hdGljYWxseVxuICAgICAgICAgICAgICAgICAgICAgKiByZXBsYXkgYWxsIHN0b3JlZCBzdGF0ZSB0byByZXN0b3JlIHRoZSBzZXNzaW9uIHNlYW1sZXNzbHk6XG4gICAgICAgICAgICAgICAgICAgICAqXG4gICAgICAgICAgICAgICAgICAgICAqIDEuIEFjdGl2aXR5IE9iamVjdHMgKGFjdG9yIGRlZmluaXRpb25zKVxuICAgICAgICAgICAgICAgICAgICAgKiAyLiBDcmVkZW50aWFscyAoYXV0aGVudGljYXRpb24pXG4gICAgICAgICAgICAgICAgICAgICAqIDMuIENvbm5lY3QgY29tbWFuZHMgKHBsYXRmb3JtIGNvbm5lY3Rpb25zKVxuICAgICAgICAgICAgICAgICAgICAgKiA0LiBKb2luIGNvbW1hbmRzIChyb29tL2NoYW5uZWwgbWVtYmVyc2hpcHMpXG4gICAgICAgICAgICAgICAgICAgICAqXG4gICAgICAgICAgICAgICAgICAgICAqIFRoaXMgYWxsb3dzIHRoZSBjbGllbnQgdG8gc3Vydml2ZSBicmllZiBuZXR3b3JrIGJsaXBzIHdpdGhvdXQgcmVxdWlyaW5nXG4gICAgICAgICAgICAgICAgICAgICAqIHVzZXIgaW50ZXJ2ZW50aW9uLiBIb3dldmVyLCB0aGUgc2VydmVyIG11c3QgcHJvcGVybHkgdmFsaWRhdGUgcmVwbGF5ZWRcbiAgICAgICAgICAgICAgICAgICAgICogY3JlZGVudGlhbHMgYXMgdGhleSBtYXkgYmUgc3RhbGUgb3IgcmV2b2tlZC5cbiAgICAgICAgICAgICAgICAgICAgICovXG4gICAgICAgICAgICAgICAgICAgIHRoaXMucmVwbGF5KFxuICAgICAgICAgICAgICAgICAgICAgICAgXCJhY3Rpdml0eS1vYmplY3RcIixcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZXZlbnRzW1wiYWN0aXZpdHktb2JqZWN0XCJdLFxuICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnJlcGxheShcImNyZWRlbnRpYWxzXCIsIHRoaXMuZXZlbnRzLmNyZWRlbnRpYWxzKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5yZXBsYXkoXCJtZXNzYWdlXCIsIHRoaXMuZXZlbnRzLmNvbm5lY3QpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnJlcGxheShcIm1lc3NhZ2VcIiwgdGhpcy5ldmVudHMuam9pbik7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChldmVudCA9PT0gXCJkaXNjb25uZWN0XCIpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zb2NrZXQuY29ubmVjdGVkID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHRoaXMuc29ja2V0Ll9lbWl0KGV2ZW50LCBvYmopO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgfTtcblxuICAgICAgICAvLyByZWdpc3RlciBmb3IgZXZlbnRzIHRoYXQgZ2l2ZSB1cyBpbmZvcm1hdGlvbiBvbiBjb25uZWN0aW9uIHN0YXR1c1xuICAgICAgICB0aGlzLl9zb2NrZXQub24oXCJjb25uZWN0XCIsIGNhbGxIYW5kbGVyKFwiY29ubmVjdFwiKSk7XG4gICAgICAgIHRoaXMuX3NvY2tldC5vbihcImNvbm5lY3RfZXJyb3JcIiwgY2FsbEhhbmRsZXIoXCJjb25uZWN0X2Vycm9yXCIpKTtcbiAgICAgICAgdGhpcy5fc29ja2V0Lm9uKFwiZGlzY29ubmVjdFwiLCBjYWxsSGFuZGxlcihcImRpc2Nvbm5lY3RcIikpO1xuXG4gICAgICAgIC8vIHVzZSBhcyBtaWRkbGV3YXJlIHRvIHJlY2VpdmUgaW5jb21pbmcgU29ja2V0aHViIG1lc3NhZ2VzIGFuZCB1bnBhY2sgdGhlbVxuICAgICAgICAvLyB1c2luZyB0aGUgQWN0aXZpdHlTdHJlYW1zIGxpYnJhcnkgYmVmb3JlIHBhc3NpbmcgdGhlbSBhbG9uZyB0byB0aGUgYXBwLlxuICAgICAgICB0aGlzLl9zb2NrZXQub24oXCJtZXNzYWdlXCIsIChvYmopID0+IHtcbiAgICAgICAgICAgIHRoaXMuc29ja2V0Ll9lbWl0KFwibWVzc2FnZVwiLCB0aGlzLkFjdGl2aXR5U3RyZWFtcy5TdHJlYW0ob2JqKSk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFR5cGUgZ3VhcmQgdG8gY2hlY2sgaWYgYW4gb2JqZWN0IGlzIGFuIEFjdGl2aXR5U3RyZWFtIHdpdGggYSB2YWxpZCBhY3Rvci5pZC5cbiAgICAgKi9cbiAgICBwcml2YXRlIGhhc0FjdG9ySWQoXG4gICAgICAgIG9iajogQWN0aXZpdHlTdHJlYW0gfCBBY3Rpdml0eU9iamVjdCxcbiAgICApOiBvYmogaXMgQWN0aXZpdHlTdHJlYW0ge1xuICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgXCJhY3RvclwiIGluIG9iaiAmJlxuICAgICAgICAgICAgb2JqLmFjdG9yICE9PSBudWxsICYmXG4gICAgICAgICAgICB0eXBlb2Ygb2JqLmFjdG9yID09PSBcIm9iamVjdFwiICYmXG4gICAgICAgICAgICBcImlkXCIgaW4gb2JqLmFjdG9yICYmXG4gICAgICAgICAgICB0eXBlb2Ygb2JqLmFjdG9yLmlkID09PSBcInN0cmluZ1wiXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmVwbGF5cyBwcmV2aW91c2x5IHNlbnQgZXZlbnRzIHRvIHRoZSBzZXJ2ZXIgYWZ0ZXIgcmVjb25uZWN0aW9uLlxuICAgICAqXG4gICAgICogVGhpcyBtZXRob2QgaXMgY2FsbGVkIGF1dG9tYXRpY2FsbHkgd2hlbiB0aGUgU29ja2V0LklPIGNvbm5lY3Rpb24gaXNcbiAgICAgKiByZS1lc3RhYmxpc2hlZCBhZnRlciBhIHRyYW5zaWVudCBuZXR3b3JrIGludGVycnVwdGlvbi4gSXQgcmVzZW5kc1xuICAgICAqIGNyZWRlbnRpYWxzIGFuZCBjb25uZWN0aW9uIHN0YXRlIHNvIHRoZSB1c2VyIGRvZXNuJ3QgbmVlZCB0byBtYW51YWxseVxuICAgICAqIHJlLWF1dGhlbnRpY2F0ZSBvciByZWpvaW4gY2hhbm5lbHMuXG4gICAgICpcbiAgICAgKiBTZWN1cml0eSBjb25zaWRlcmF0aW9uczpcbiAgICAgKiAtIE9ubHkgcmVwbGF5cyBldmVudHMgc3RvcmVkIGluIG1lbW9yeSBkdXJpbmcgdGhpcyBzZXNzaW9uXG4gICAgICogLSBEb2VzIG5vdCByZXBsYXkgYWZ0ZXIgcGFnZSByZWZyZXNoIChtZW1vcnkgY2xlYXJlZClcbiAgICAgKiAtIFNlcnZlciBzaG91bGQgdmFsaWRhdGUgcmVwbGF5ZWQgY3JlZGVudGlhbHMgKG1heSBiZSBzdGFsZS9yZXZva2VkKVxuICAgICAqXG4gICAgICogQHBhcmFtIG5hbWUgLSBFdmVudCBuYW1lIHRvIGVtaXQgKFwiY3JlZGVudGlhbHNcIiwgXCJhY3Rpdml0eS1vYmplY3RcIiwgXCJtZXNzYWdlXCIpXG4gICAgICogQHBhcmFtIGFzTWFwIC0gTWFwIG9mIGV2ZW50cyB0byByZXBsYXlcbiAgICAgKi9cbiAgICBwcml2YXRlIHJlcGxheShcbiAgICAgICAgbmFtZTogc3RyaW5nLFxuICAgICAgICBhc01hcDogTWFwPHN0cmluZywgQWN0aXZpdHlTdHJlYW0gfCBCYXNlQWN0aXZpdHlPYmplY3Q+LFxuICAgICkge1xuICAgICAgICBmb3IgKGNvbnN0IG9iaiBvZiBhc01hcC52YWx1ZXMoKSkge1xuICAgICAgICAgICAgY29uc3QgZXhwYW5kZWRPYmogPSB0aGlzLkFjdGl2aXR5U3RyZWFtcy5TdHJlYW0ob2JqKTtcbiAgICAgICAgICAgIGxldCBpZCA9IGV4cGFuZGVkT2JqPy5pZDtcbiAgICAgICAgICAgIGlmICh0aGlzLmhhc0FjdG9ySWQoZXhwYW5kZWRPYmopKSB7XG4gICAgICAgICAgICAgICAgaWQgPSBleHBhbmRlZE9iai5hY3Rvci5pZDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMubG9nKGByZXBsYXlpbmcgJHtuYW1lfSBmb3IgJHtpZH1gKTtcbiAgICAgICAgICAgIHRoaXMuX3NvY2tldC5lbWl0KG5hbWUsIGV4cGFuZGVkT2JqKTtcbiAgICAgICAgfVxuICAgIH1cbn1cblxuLy8gYmlvbWUtaWdub3JlIGxpbnQvc3VzcGljaW91cy9ub0V4cGxpY2l0QW55OiA8ZXhwbGFuYXRpb24+XG4oKGdsb2JhbDogYW55KSA9PiB7XG4gICAgZ2xvYmFsLlNvY2tldGh1YkNsaWVudCA9IFNvY2tldGh1YkNsaWVudDtcbiAgICAvLyBAdHMtaWdub3JlXG59KSh0eXBlb2Ygd2luZG93ID09PSBcIm9iamVjdFwiID8gd2luZG93IDoge30pO1xuIgogIF0sCiAgIm1hcHBpbmdzIjogIjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7RUFFQSxJQUFJLE1BQU0sT0FBTyxVQUFVO0FBQUEsRUFBM0IsSUFDSSxTQUFTO0FBQUEsRUFTYixTQUFTLE1BQU0sR0FBRztBQUFBLEVBU2xCLElBQUksT0FBTyxRQUFRO0FBQUEsSUFDakIsT0FBTyxZQUFZLE9BQU8sT0FBTyxJQUFJO0FBQUEsSUFNckMsSUFBSSxDQUFDLElBQUksT0FBTyxFQUFFO0FBQUEsTUFBVyxTQUFTO0FBQUEsRUFDeEM7QUFBQSxFQVdBLFNBQVMsRUFBRSxDQUFDLElBQUksU0FBUyxNQUFNO0FBQUEsSUFDN0IsS0FBSyxL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SyxHQUFHO0FBQUEsSUFDeEI7QUFBQTtBQUFBLEVBR0ksd0JBQXdCLEdBQUc7QUFBQSxJQUUvQixNQUFNLGNBQWMsQ0FBQyxVQUFrQjtBQUFBLE1BQ25DLE9BQU8sT0FBTyxRQUFrQjtBQUFBLFFBQzVCLElBQUksVUFBVSxXQUFXO0FBQUEsVUFDckIsS0FBSyxPQUFPLEtBQUssS0FBSyxRQUFRO0FBQUEsVUFDOUIsS0FBSyxPQUFPLFlBQVk7QUFBQSxVQWlCeEIsS0FBSyxPQUNELG1CQUNBLEtBQUssT0FBTyxrQkFDaEI7QUFBQSxVQUNBLEtBQUssT0FBTyxlQUFlLEtBQUssT0FBTyxXQUFXO0FBQUEsVUFDbEQsS0FBSyxPQUFPLFdBQVcsS0FBSyxPQUFPLE9BQU87QUFBQSxVQUMxQyxLQUFLLE9BQU8sV0FBVyxLQUFLLE9BQU8sSUFBSTtBQUFBLFFBQzNDLEVBQU8sU0FBSSxVQUFVLGNBQWM7QUFBQSxVQUMvQixLQUFLLE9BQU8sWUFBWTtBQUFBLFFBQzVCO0FBQUEsUUFDQSxLQUFLLE9BQU8sTUFBTSxPQUFPLEdBQUc7QUFBQTtBQUFBO0FBQUEsSUFLcEMsS0FBSyxRQUFRLEdBQUcsV0FBVyxZQUFZLFNBQVMsQ0FBQztBQUFBLElBQ2pELEtBQUssUUFBUSxHQUFHLGlCQUFpQixZQUFZLGVBQWUsQ0FBQztBQUFBLElBQzdELEtBQUssUUFBUSxHQUFHLGNBQWMsWUFBWSxZQUFZLENBQUM7QUFBQSxJQUl2RCxLQUFLLFFBQVEsR0FBRyxXQUFXLENBQUMsUUFBUTtBQUFBLE1BQ2hDLEtBQUssT0FBTyxNQUFNLFdBQVcsS0FBSyxnQkFBZ0IsT0FBTyxHQUFHLENBQUM7QUFBQSxLQUNoRTtBQUFBO0FBQUEsRUFNRyxVQUFVLENBQ2QsS0FDcUI7QUFBQSxJQUNyQixPQUNJLFdBQVcsT0FDWCxJQUFJLFVBQVUsUUFDZCxPQUFPLElBQUksVUFBVSxZQUNyQixRQUFRLElBQUksU0FDWixPQUFPLElBQUksTUFBTSxPQUFPO0FBQUE7QUFBQSxFQW9CeEIsTUFBTSxDQUNWLE1BQ0EsT0FDRjtBQUFBLElBQ0UsV0FBVyxPQUFPLE1BQU0sT0FBTyxHQUFHO0FBQUEsTUFDOUIsTUFBTSxjQUFjLEtBQUssZ0JBQWdCLE9BQU8sR0FBRztBQUFBLE1BQ25ELElBQUksS0FBSyxhQUFhO0FBQUEsTUFDdEIsSUFBSSxLQUFLLFdBQVcsV0FBVyxHQUFHO0FBQUEsUUFDOUIsS0FBSyxZQUFZLE1BQU07QUFBQSxNQUMzQjtBQUFBLE1BQ0EsS0FBSyxJQUFJLGFBQWEsWUFBWSxJQUFJO0FBQUEsTUFDdEMsS0FBSyxRQUFRLEtBQUssTUFBTSxXQUFXO0FBQUEsSUFDdkM7QUFBQTtBQUVSO0FBQUEsQ0FHQyxDQUFDLFdBQWdCO0FBQUEsRUFDZCxPQUFPLGtCQUFrQjtBQUFBLEdBRTFCLE9BQU8sV0FBVyxXQUFXLFNBQVMsQ0FBQyxDQUFDOyIsCiAgImRlYnVnSWQiOiAiMTIzMEFBQzM0MDhENzlGMjY0NzU2RTIxNjQ3NTZFMjEiLAogICJuYW1lcyI6IFtdCn0=