@fireflysemantics/slice 17.0.14 → 17.0.16

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.
@@ -7,36 +7,43 @@ import { Slice } from './Slice';
7
7
  * This `todoFactory` code will be used to illustrate the API examples. The following
8
8
  * utilities are used in the tests and the API Typedoc examples contained here.
9
9
  * @example Utilities for API Examples
10
- ```
11
- export const enum TodoSliceEnum {
12
- COMPLETE = "Complete",
13
- INCOMPLETE = "Incomplete"
14
- }
15
-
16
- export class Todo {
17
- constructor(public complete: boolean, public title: string,public gid?:string, public id?:string) {}
18
- }
19
-
20
- export let todos = [new Todo(false, "You complete me!"), new Todo(true, "You completed me!")];
21
-
22
- export function todosFactory():Todo[] {
23
- return [new Todo(false, "You complete me!"), new Todo(true, "You completed me!")];
24
- }
25
- ```
10
+ * ```
11
+ * export const enum TodoSliceEnum {
12
+ * COMPLETE = "Complete",
13
+ * INCOMPLETE = "Incomplete"
14
+ * }
15
+ * export class Todo {
16
+ * constructor(
17
+ * public complete: boolean,
18
+ * public title: string,
19
+ * public gid?:string,
20
+ * public id?:string) {}
21
+ * }
22
+ *
23
+ * export let todos = [new Todo(false, "You complete me!"), new Todo(true, "You completed me!")];
24
+ *
25
+ * export function todosFactory():Todo[] {
26
+ * return [new Todo(false, "You complete me!"), new Todo(true, "You completed me!")];
27
+ * }
28
+ * ```
26
29
  */
27
30
  export class EStore extends AbstractStore {
28
31
  /**
29
32
  * Store constructor (Initialization with element is optional)
30
33
  *
31
34
  * perform initial notification to all observers,
32
- * such that function like {@link combineLatest}{}
35
+ * such that functions like {@link combineLatest}{}
33
36
  * will execute at least once.
34
- * @param entities
35
- * @example Dynamic `EStore<Todo>` Creation
36
- ```
37
- // Initialize the Store
38
- let store: EStore<Todo> = new EStore<Todo>(todosFactory());
39
- ```*/
37
+ *
38
+ * @param entities The entities to initialize the store with.
39
+ * @param config The optional configuration instance.
40
+ *
41
+ * @example EStore<Todo> Creation
42
+ * ```
43
+ * // Initialize the Store
44
+ * let store: EStore<Todo> = new EStore<Todo>(todosFactory());
45
+ * ```
46
+ */
40
47
  constructor(entities = [], config) {
41
48
  super(config);
42
49
  /**
@@ -91,7 +98,7 @@ export class EStore extends AbstractStore {
91
98
  this.notifyDelta.next(delta);
92
99
  }
93
100
  /**
94
- * Calls complete on all {@link BehaviorSubject} instances.
101
+ * Calls complete on all EStore {@link ReplaySubject} instances.
95
102
  *
96
103
  * Call destroy when disposing of the store.
97
104
  */
@@ -99,7 +106,7 @@ export class EStore extends AbstractStore {
99
106
  super.destroy();
100
107
  this.notifyLoading.complete();
101
108
  this.notifyActive.complete();
102
- this.slices.forEach(slice => slice.destroy());
109
+ this.slices.forEach((slice) => slice.destroy());
103
110
  }
104
111
  /**
105
112
  * Toggles the entity:
@@ -108,16 +115,15 @@ export class EStore extends AbstractStore {
108
115
  * it will be deleted. If the store
109
116
  * does not contains the entity,
110
117
  * it is added.
111
- * @param e
112
- * @example Toggle the `Todo` instance
113
- ```
114
- estore.post(todo);
115
- // Remove todo
116
- estore.toggle(todo);
117
- // Add it back
118
- estore.toggle(todo);
119
-
120
- ```
118
+ * @param e The entity to toggle
119
+ * @example Toggle the Todo instance
120
+ * ```
121
+ * estore.post(todo);
122
+ * // Remove todo
123
+ * estore.toggle(todo);
124
+ * // Add it back
125
+ * estore.toggle(todo);
126
+ * ```
121
127
  */
122
128
  toggle(e) {
123
129
  if (this.contains(e)) {
@@ -138,11 +144,11 @@ export class EStore extends AbstractStore {
138
144
  * change detection in the event that it maintains
139
145
  * a reference to the `active` state `Map` instance.
140
146
  *
141
- * @example Add a `todo1` and `todo2` as active
142
- ```
143
- addActive(todo1);
144
- addActive(todo2);
145
- ```
147
+ * @example Add todo1 and todo2 as active
148
+ * ```
149
+ * addActive(todo1);
150
+ * addActive(todo2);
151
+ * ```
146
152
  */
147
153
  addActive(e) {
148
154
  if (this.contains(e)) {
@@ -156,18 +162,18 @@ export class EStore extends AbstractStore {
156
162
  }
157
163
  }
158
164
  /**
159
- * Delete an entity as active.
165
+ * Delete an active entity.
160
166
  *
161
167
  * Also we clone the map prior to broadcasting it with
162
168
  * `notifyActive` to make sure we will trigger Angular
163
169
  * change detection in the event that it maintains
164
170
  * a reference to the `active` state `Map` instance.
165
171
  *
166
- * @example Mark a `todo` instance as active
167
- ```
168
- deleteActive(todo1);
169
- deleteActive(todo2);
170
- ```
172
+ * @example Remove todo1 and todo2 as active entities
173
+ * ```
174
+ * deleteActive(todo1);
175
+ * deleteActive(todo2);
176
+ * ```
171
177
  */
172
178
  deleteActive(e) {
173
179
  this.active.delete(e.gid);
@@ -181,23 +187,23 @@ export class EStore extends AbstractStore {
181
187
  * change detection in the event that it maintains
182
188
  * a reference to the `active` state `Map` instance.
183
189
  *
184
- * @example Mark a `todo` instance as active
185
- ```
186
- deleteActive(todo1);
187
- deleteActive(todo2);
188
- ```
190
+ * @example Clear active todo instances
191
+ * ```
192
+ * store.clearActive();
193
+ * ```
189
194
  */
190
195
  clearActive() {
191
196
  this.active.clear();
192
197
  this.notifyActive.next(new Map(this.active));
193
198
  }
194
199
  /**
195
- * Observe the active entity.
200
+ * Observe the active entities.
201
+ *
196
202
  * @example
197
- <pre>
198
- let active$ = source.observeActive();
199
- </pre>
200
- */
203
+ * ```
204
+ * let active$ = store.observeActive();
205
+ * ```
206
+ */
201
207
  observeActive() {
202
208
  return this.notifyActive.asObservable();
203
209
  }
@@ -220,35 +226,91 @@ export class EStore extends AbstractStore {
220
226
  }
221
227
  /**
222
228
  * @return A snapshot of the loading state.
229
+ * @example Create a reference to the loading state
230
+ * ```
231
+ * const loading:boolean = todoStore.loading;
232
+ * ```
223
233
  */
224
234
  get loading() {
225
235
  return this._loading;
226
236
  }
227
237
  /**
228
238
  * Observe loading.
239
+ *
240
+ * Note that this obverable piped through
241
+ * `takeWhile(v->v, true), such that it will
242
+ * complete after each emission.
243
+ *
244
+ * See:
245
+ * https://fireflysemantics.medium.com/waiting-on-estore-to-load-8dcbe161613c
246
+ *
247
+ * For more details.
248
+ * Also note that v=>v is the same as v=>v!=false
249
+ *
229
250
  * @example
230
- <pre>
231
- let loading$ = source.observeLoading();
232
- </pre>
233
-
234
- Note that this obverable piped through
235
- `takeWhile(v->v, true), such that it will
236
- complete after each emission.
237
-
238
- See:
239
- https://medium.com/@ole.ersoy/waiting-on-estore-to-load-8dcbe161613c
240
-
241
- For more details.
242
- */
251
+ * ```
252
+ * const observeLoadingHandler: Observer<boolean> = {
253
+ * complete: () => {
254
+ * console.log(`Data Loaded and Observable Marked as Complete`);
255
+ * }, // completeHandler
256
+ * error: () => {
257
+ * console.log(`Any Errors?`);
258
+ * }, // errorHandler
259
+ * next: (l) => {
260
+ * console.log(`Data loaded and loading is ${l}`);
261
+ * },
262
+ * };
263
+ *
264
+ * const observeLoadingResubscribeHandler: Observer<boolean> = {
265
+ * complete: () => {
266
+ * console.log(`Data Loaded and Resubscribe Observable Marked as Complete`);
267
+ * }, // completeHandler
268
+ * error: () => {
269
+ * console.log(`Any Resubscribe Errors?`);
270
+ * }, // errorHandler
271
+ * next: (l) => {
272
+ * console.log(`Data loaded and resusbscribe loading value is ${l}`);
273
+ * },
274
+ * };
275
+ *
276
+ * const todoStore: EStore<Todo> = new EStore();
277
+ * //============================================
278
+ * // Loading is true by default
279
+ * //============================================
280
+ * console.log(`The initial value of loading is ${todoStore.loading}`);
281
+ * //============================================
282
+ * // Observe Loading
283
+ * //============================================
284
+ * let loading$: Observable<boolean> = todoStore.observeLoading();
285
+ * loading$.subscribe((l) => console.log(`The value of loading is ${l}`));
286
+ *
287
+ * todoStore.loading = false;
288
+ * loading$.subscribe(observeLoadingHandler);
289
+ * //============================================
290
+ * // The subscription no longer fires
291
+ * //============================================
292
+ * todoStore.loading = true;
293
+ * todoStore.loading = false;
294
+ *
295
+ * //============================================
296
+ * // The subscription no longer fires,
297
+ * // so if we want to observe loading again
298
+ * // resusbscribe.
299
+ * //============================================
300
+ * todoStore.loading = true;
301
+ * loading$ = todoStore.observeLoading();
302
+ * loading$.subscribe(observeLoadingResubscribeHandler);
303
+ * todoStore.loading = false;
304
+ * ```
305
+ */
243
306
  observeLoading() {
244
- return this.notifyLoading.asObservable().
245
- pipe(takeWhile(v => v, true));
307
+ return this.notifyLoading.asObservable().pipe(takeWhile((v) => v, true));
246
308
  }
247
309
  /**
248
310
  * Notfiies when loading has completed.
249
311
  */
250
312
  observeLoadingComplete() {
251
- return this.observeLoading().pipe(filter(loading => loading == false), switchMap(() => of(true)));
313
+ return this.observeLoading().pipe(filter((loading) => loading == false), switchMap(() => of(true)));
252
314
  }
253
315
  /**
254
316
  * Sets the current searching state and notifies observers.
@@ -280,14 +342,13 @@ export class EStore extends AbstractStore {
280
342
  For more details.
281
343
  */
282
344
  observeSearching() {
283
- return this.notifySearching.asObservable().
284
- pipe(takeWhile(v => v, true));
345
+ return this.notifySearching.asObservable().pipe(takeWhile((v) => v, true));
285
346
  }
286
347
  /**
287
348
  * Notfiies when searching has completed.
288
349
  */
289
350
  observeSearchingComplete() {
290
- return this.observeSearching().pipe(filter(searching => searching == false), switchMap(() => of(true)));
351
+ return this.observeSearching().pipe(filter((searching) => searching == false), switchMap(() => of(true)));
291
352
  }
292
353
  /**
293
354
  * Adds a slice to the store and keys it by the slices label.
@@ -332,10 +393,11 @@ export class EStore extends AbstractStore {
332
393
  /**
333
394
  * Post (Add a new) element(s) to the store.
334
395
  * @param e An indiidual entity or an array of entities
335
- * @example Post a `todo`.
336
- ```
337
- store.post(todo);
338
- ```
396
+ * @example Post a Todo instance.
397
+ *
398
+ *```
399
+ * store.post(todo);
400
+ *```
339
401
  */
340
402
  post(e) {
341
403
  if (!Array.isArray(e)) {
@@ -345,7 +407,7 @@ export class EStore extends AbstractStore {
345
407
  e[this.GUID_KEY] = guid;
346
408
  this.entries.set(guid, e);
347
409
  this.updateIDEntry(e);
348
- Array.from(this.slices.values()).forEach(s => {
410
+ Array.from(this.slices.values()).forEach((s) => {
349
411
  s.post(e);
350
412
  });
351
413
  //Create a new array reference to trigger Angular change detection.
@@ -358,15 +420,15 @@ export class EStore extends AbstractStore {
358
420
  }
359
421
  }
360
422
  /**
361
- * Post elements to the store.
423
+ * Post N entities to the store.
362
424
  * @param ...e
363
- * @example Post two `Todo` instances.
364
- ```
365
- store.post(todo1, todo2);
366
- ```
425
+ * @example Post two Todo instances.
426
+ * ```
427
+ * store.post(todo1, todo2);
428
+ * ```
367
429
  */
368
430
  postN(...e) {
369
- e.forEach(e => {
431
+ e.forEach((e) => {
370
432
  const guid = e[this.GUID_KEY]
371
433
  ? e[this.GUID_KEY]
372
434
  : GUID();
@@ -374,7 +436,7 @@ export class EStore extends AbstractStore {
374
436
  this.entries.set(guid, e);
375
437
  this.updateIDEntry(e);
376
438
  });
377
- Array.from(this.slices.values()).forEach(s => {
439
+ Array.from(this.slices.values()).forEach((s) => {
378
440
  s.postA(e);
379
441
  });
380
442
  //Create a new array reference to trigger Angular change detection.
@@ -385,21 +447,22 @@ export class EStore extends AbstractStore {
385
447
  /**
386
448
  * Post (Add) an array of elements to the store.
387
449
  * @param e
388
- * @example Post a `Todo` array.
389
- ```
390
- store.post([todo1, todo2]);
391
- ```
450
+ * @example Post a Todo array.
451
+ *
452
+ * ```
453
+ * store.post([todo1, todo2]);
454
+ * ```
392
455
  */
393
456
  postA(e) {
394
457
  this.postN(...e);
395
458
  }
396
459
  /**
397
- * Put (Update) an element.
460
+ * Put (Update) an entity.
398
461
  * @param e
399
462
  * @example Put a Todo instance.
400
- ```
401
- store.put(todo1);
402
- ```
463
+ * ```
464
+ * store.put(todo1);
465
+ * ```
403
466
  */
404
467
  put(e) {
405
468
  if (!Array.isArray(e)) {
@@ -410,7 +473,7 @@ export class EStore extends AbstractStore {
410
473
  this.notify.next(v);
411
474
  const delta = { type: "Put" /* ActionTypes.PUT */, entries: [e] };
412
475
  this.notifyDelta.next(delta);
413
- Array.from(this.slices.values()).forEach(s => {
476
+ Array.from(this.slices.values()).forEach((s) => {
414
477
  s.put(e);
415
478
  });
416
479
  }
@@ -421,25 +484,26 @@ export class EStore extends AbstractStore {
421
484
  /**
422
485
  * Put (Update) an element or add an element that was read from a persistence source
423
486
  * and thus already has an assigned global id`.
424
- * @param e
425
- * @example Put Todo instances.
426
- ```
427
- store.put(todo1, todo2);
428
- ```
487
+ * @param e The enetity instances to update.
488
+ * @example Put N Todo instances.
489
+ *
490
+ * ```
491
+ * store.put(todo1, todo2);
492
+ * ```
429
493
  */
430
494
  putN(...e) {
431
495
  this.putA(e);
432
496
  }
433
497
  /**
434
- * Put (Update) the array of elements.
435
- * @param e
436
- * @example Put Todo instances.
437
- ```
438
- store.put([todo1, todo2]);
439
- ```
498
+ * Put (Update) the array of enntities.
499
+ * @param e The array of enntities to update
500
+ * @example Put an array of Todo instances.
501
+ * ```
502
+ * store.put([todo1, todo2]);
503
+ * ```
440
504
  */
441
505
  putA(e) {
442
- e.forEach(e => {
506
+ e.forEach((e) => {
443
507
  let guid = e[this.GUID_KEY];
444
508
  this.entries.set(guid, e);
445
509
  this.updateIDEntry(e);
@@ -449,7 +513,7 @@ export class EStore extends AbstractStore {
449
513
  this.notify.next(v);
450
514
  const delta = { type: "Put" /* ActionTypes.PUT */, entries: e };
451
515
  this.notifyDelta.next(delta);
452
- Array.from(this.slices.values()).forEach(s => {
516
+ Array.from(this.slices.values()).forEach((s) => {
453
517
  s.putA(e);
454
518
  });
455
519
  }
@@ -457,9 +521,9 @@ export class EStore extends AbstractStore {
457
521
  * Delete (Update) the array of elements.
458
522
  * @param e
459
523
  * @example Delete todo1.
460
- ```
461
- store.delete(todo1]);
462
- ```
524
+ * ```
525
+ * store.delete(todo1]);
526
+ * ```
463
527
  */
464
528
  delete(e) {
465
529
  if (!Array.isArray(e)) {
@@ -467,14 +531,14 @@ export class EStore extends AbstractStore {
467
531
  const guid = e[this.GUID_KEY];
468
532
  this.entries.delete(guid);
469
533
  this.deleteIDEntry(e);
470
- Array.from(this.slices.values()).forEach(s => {
534
+ Array.from(this.slices.values()).forEach((s) => {
471
535
  s.entries.delete(guid);
472
536
  });
473
537
  //Create a new array reference to trigger Angular change detection.
474
538
  let v = [...Array.from(this.entries.values())];
475
539
  const delta = { type: "Delete" /* ActionTypes.DELETE */, entries: [e] };
476
540
  this.notifyAll(v, delta);
477
- Array.from(this.slices.values()).forEach(s => {
541
+ Array.from(this.slices.values()).forEach((s) => {
478
542
  s.delete(e);
479
543
  });
480
544
  }
@@ -485,29 +549,29 @@ export class EStore extends AbstractStore {
485
549
  /**
486
550
  * Delete N elements.
487
551
  * @param ...e
488
- * @example Put Todo instances.
489
- ```
490
- store.delete(todo1, todo2);
491
- ```
552
+ * @example Delete N Todo instance argument.
553
+ * ```
554
+ * store.deleteN(todo1, todo2);
555
+ * ```
492
556
  */
493
557
  deleteN(...e) {
494
558
  this.deleteA(e);
495
559
  }
496
560
  /**
497
- * Delete N elements.
498
- * @param ...e
499
- * @example Put Todo instances.
500
- ```
501
- store.delete(todo1, todo2);
502
- ```
561
+ * Delete an array of elements.
562
+ * @param e The array of instances to be deleted
563
+ * @example Delete the array of Todo instances.
564
+ * ```
565
+ * store.deleteA([todo1, todo2]);
566
+ * ```
503
567
  */
504
568
  deleteA(e) {
505
- e.forEach(e => {
569
+ e.forEach((e) => {
506
570
  this.deleteActive(e);
507
571
  const guid = e[this.GUID_KEY];
508
572
  this.entries.delete(guid);
509
573
  this.deleteIDEntry(e);
510
- Array.from(this.slices.values()).forEach(s => {
574
+ Array.from(this.slices.values()).forEach((s) => {
511
575
  s.entries.delete(guid);
512
576
  });
513
577
  });
@@ -515,21 +579,21 @@ export class EStore extends AbstractStore {
515
579
  let v = [...Array.from(this.entries.values())];
516
580
  const delta = { type: "Delete" /* ActionTypes.DELETE */, entries: e };
517
581
  this.notifyAll(v, delta);
518
- Array.from(this.slices.values()).forEach(s => {
582
+ Array.from(this.slices.values()).forEach((s) => {
519
583
  s.deleteA(e);
520
584
  });
521
585
  }
522
586
  /**
523
587
  * Delete elements by {@link Predicate}.
524
588
  * @param p The predicate.
525
- * @example Put Todo instances.
526
- ```
527
- store.delete(todo1, todo2);
528
- ```
589
+ * @example Delete the Todo instances.
590
+ * ```
591
+ * store.delete(todo1, todo2);
592
+ * ```
529
593
  */
530
594
  deleteP(p) {
531
595
  const d = [];
532
- Array.from(this.entries.values()).forEach(e => {
596
+ Array.from(this.entries.values()).forEach((e) => {
533
597
  if (p(e)) {
534
598
  d.push(e);
535
599
  const id = e[this.GUID_KEY];
@@ -542,7 +606,7 @@ export class EStore extends AbstractStore {
542
606
  let v = [...Array.from(this.entries.values())];
543
607
  const delta = { type: "Delete" /* ActionTypes.DELETE */, entries: d };
544
608
  this.notifyAll(v, delta);
545
- Array.from(this.slices.values()).forEach(s => {
609
+ Array.from(this.slices.values()).forEach((s) => {
546
610
  s.deleteA(d);
547
611
  });
548
612
  }
@@ -575,18 +639,18 @@ export class EStore extends AbstractStore {
575
639
  * send their own delta notification.
576
640
  *
577
641
  * @example Reset the store.
578
- ```
579
- store.reset();
580
- ```
642
+ * ```
643
+ * store.reset();
644
+ * ```
581
645
  */
582
646
  reset() {
583
647
  const delta = {
584
648
  type: "Reset" /* ActionTypes.RESET */,
585
- entries: Array.from(this.entries.values())
649
+ entries: Array.from(this.entries.values()),
586
650
  };
587
651
  this.notifyAll([], delta);
588
652
  this.entries = new Map();
589
- Array.from(this.slices.values()).forEach(s => {
653
+ Array.from(this.slices.values()).forEach((s) => {
590
654
  s.reset();
591
655
  });
592
656
  }
@@ -601,4 +665,4 @@ export class EStore extends AbstractStore {
601
665
  this.notifyLoading.next(this.loading);
602
666
  }
603
667
  }
604
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRVN0b3JlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcHJvamVjdHMvc2xpY2Uvc3JjL2xpYi9FU3RvcmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBRWhELE9BQU8sRUFBRSxJQUFJLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFHbkMsT0FBTyxFQUFFLGFBQWEsRUFBRSxFQUFFLEVBQWMsTUFBTSxNQUFNLENBQUM7QUFDckQsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLEVBQUUsU0FBUyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDOUQsT0FBTyxFQUFFLEtBQUssRUFBRSxNQUFNLFNBQVMsQ0FBQztBQUVoQzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FvQkc7QUFFSCxNQUFNLE9BQU8sTUFBVSxTQUFRLGFBQWdCO0lBQzdDOzs7Ozs7Ozs7OztPQVdHO0lBQ0gsWUFBWSxXQUFnQixFQUFFLEVBQUUsTUFBb0I7UUFDbEQsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBNENoQjs7V0FFRztRQUNLLGlCQUFZLEdBQUcsSUFBSSxhQUFhLENBQWlCLENBQUMsQ0FBQyxDQUFDO1FBRzVEOzs7O1dBSUc7UUFDSSxXQUFNLEdBQW1CLElBQUksR0FBRyxFQUFFLENBQUM7UUF3RzFDOzs7OztXQUtHO1FBQ0ssa0JBQWEsR0FBRyxJQUFJLGFBQWEsQ0FBVSxDQUFDLENBQUMsQ0FBQztRQUV0RDs7Ozs7Ozs7OztXQVVHO1FBQ0ssYUFBUSxHQUFZLElBQUksQ0FBQztRQStEakM7Ozs7O1dBS0c7UUFDSyxvQkFBZSxHQUFHLElBQUksYUFBYSxDQUFVLENBQUMsQ0FBQyxDQUFDO1FBRXhEOzs7OztXQUtHO1FBQ0ssZUFBVSxHQUFZLEtBQUssQ0FBQztRQStDcEM7O1dBRUc7UUFDSyxXQUFNLEdBQTBCLElBQUksR0FBRyxFQUFFLENBQUM7UUFoVGhELE1BQU0sS0FBSyxH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QUFDLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDeEMsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQWJzdHJhY3RTdG9yZSB9IGZyb20gJy4vQWJzdHJhY3RTdG9yZSc7XG5pbXBvcnQgeyBTdG9yZUNvbmZpZyB9IGZyb20gJy4vbW9kZWxzL1N0b3JlQ29uZmlnJztcbmltcG9ydCB7IEdVSUQgfSBmcm9tICcuL3V0aWxpdGllcyc7XG5cbmltcG9ydCB7IEFjdGlvblR5cGVzLCBQcmVkaWNhdGUsIERlbHRhIH0gZnJvbSAnLi9tb2RlbHMvJztcbmltcG9ydCB7IFJlcGxheVN1YmplY3QsIG9mLCBPYnNlcnZhYmxlIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyB0YWtlV2hpbGUsIGZpbHRlciwgc3dpdGNoTWFwIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuaW1wb3J0IHsgU2xpY2UgfSBmcm9tICcuL1NsaWNlJztcblxuLyoqXG4gKiBUaGlzIGB0b2RvRmFjdG9yeWAgY29kZSB3aWxsIGJlIHVzZWQgdG8gaWxsdXN0cmF0ZSB0aGUgQVBJIGV4YW1wbGVzLiAgVGhlIGZvbGxvd2luZ1xuICogdXRpbGl0aWVzIGFyZSB1c2VkIGluIHRoZSB0ZXN0cyBhbmQgdGhlIEFQSSBUeXBlZG9jIGV4YW1wbGVzIGNvbnRhaW5lZCBoZXJlLlxuICogQGV4YW1wbGUgVXRpbGl0aWVzIGZvciBBUEkgRXhhbXBsZXNcbmBgYFxuZXhwb3J0IGNvbnN0IGVudW0gVG9kb1NsaWNlRW51bSB7XG4gIENPTVBMRVRFID0gXCJDb21wbGV0ZVwiLFxuICBJTkNPTVBMRVRFID0gXCJJbmNvbXBsZXRlXCJcbn1cblxuZXhwb3J0IGNsYXNzIFRvZG8ge1xuICBjb25zdHJ1Y3RvcihwdWJsaWMgY29tcGxldGU6IGJvb2xlYW4sIHB1YmxpYyB0aXRsZTogc3RyaW5nLHB1YmxpYyBnaWQ/OnN0cmluZywgcHVibGljIGlkPzpzdHJpbmcpIHt9XG59XG5cbmV4cG9ydCBsZXQgdG9kb3MgPSBbbmV3IFRvZG8oZmFsc2UsIFwiWW91IGNvbXBsZXRlIG1lIVwiKSwgbmV3IFRvZG8odHJ1ZSwgXCJZb3UgY29tcGxldGVkIG1lIVwiKV07XG5cbmV4cG9ydCBmdW5jdGlvbiB0b2Rvc0ZhY3RvcnkoKTpUb2RvW10ge1xuICByZXR1cm4gW25ldyBUb2RvKGZhbHNlLCBcIllvdSBjb21wbGV0ZSBtZSFcIiksIG5ldyBUb2RvKHRydWUsIFwiWW91IGNvbXBsZXRlZCBtZSFcIildO1xufVxuIGBgYCBcbiAqL1xuXG5leHBvcnQgY2xhc3MgRVN0b3JlPEU+IGV4dGVuZHMgQWJzdHJhY3RTdG9yZTxFPiB7XG4gIC8qKlxuICAgKiBTdG9yZSBjb25zdHJ1Y3RvciAoSW5pdGlhbGl6YXRpb24gd2l0aCBlbGVtZW50IGlzIG9wdGlvbmFsKVxuICAgKlxuICAgKiBwZXJmb3JtIGluaXRpYWwgbm90aWZpY2F0aW9uIHRvIGFsbCBvYnNlcnZlcnMsXG4gICAqIHN1Y2ggdGhhdCBmdW5jdGlvbiBsaWtlIHtAbGluayBjb21iaW5lTGF0ZXN0fXt9XG4gICAqIHdpbGwgZXhlY3V0ZSBhdCBsZWFzdCBvbmNlLlxuICAgKiBAcGFyYW0gZW50aXRpZXNcbiAgICogQGV4YW1wbGUgRHluYW1pYyBgRVN0b3JlPFRvZG8+YCBDcmVhdGlvbiBcbmBgYFxuLy8gSW5pdGlhbGl6ZSB0aGUgU3RvcmVcbmxldCBzdG9yZTogRVN0b3JlPFRvZG8+ID0gbmV3IEVTdG9yZTxUb2RvPih0b2Rvc0ZhY3RvcnkoKSk7XG5gYGAqL1xuICBjb25zdHJ1Y3RvcihlbnRpdGllczogRVtdID0gW10sIGNvbmZpZz86IFN0b3JlQ29uZmlnKSB7XG4gICAgc3VwZXIoY29uZmlnKTtcbiAgICBjb25zdCBkZWx0YTogRGVsdGE8RT4gPSB7IHR5cGU6IEFjdGlvblR5cGVzLklOVElBTElaRSwgZW50cmllczogZW50aXRpZXMgfTtcbiAgICB0aGlzLnBvc3QoZW50aXRpZXMpXG4gICAgdGhpcy5ub3RpZnlEZWx0YS5uZXh0KGRlbHRhKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDYWxscyBjb21wbGV0ZSBvbiBhbGwge0BsaW5rIEJlaGF2aW9yU3ViamVjdH0gaW5zdGFuY2VzLlxuICAgKiBcbiAgICogQ2FsbCBkZXN0cm95IHdoZW4gZGlzcG9zaW5nIG9mIHRoZSBzdG9yZS5cbiAgICovXG4gIG92ZXJyaWRlIGRlc3Ryb3koKSB7XG4gICAgc3VwZXIuZGVzdHJveSgpXG4gICAgdGhpcy5ub3RpZnlMb2FkaW5nLmNvbXBsZXRlKClcbiAgICB0aGlzLm5vdGlmeUFjdGl2ZS5jb21wbGV0ZSgpXG4gICAgdGhpcy5zbGljZXMuZm9yRWFjaChzbGljZSA9PiBzbGljZS5kZXN0cm95KCkpXG4gIH1cblxuICAvKipcbiAgICogVG9nZ2xlcyB0aGUgZW50aXR5OlxuICAgKiBcbiAgICogSWYgdGhlIHN0b3JlIGNvbnRhaW5zIHRoZSBlbnRpdHlcbiAgICogaXQgd2lsbCBiZSBkZWxldGVkLiAgSWYgdGhlIHN0b3JlIFxuICAgKiBkb2VzIG5vdCBjb250YWlucyB0aGUgZW50aXR5LFxuICAgKiBpdCBpcyBhZGRlZC5cbiAgICogQHBhcmFtIGUgXG4gICAqIEBleGFtcGxlIFRvZ2dsZSB0aGUgYFRvZG9gIGluc3RhbmNlXG5gYGBcbmVzdG9yZS5wb3N0KHRvZG8pO1xuLy8gUmVtb3ZlIHRvZG9cbmVzdG9yZS50b2dnbGUodG9kbyk7XG4vLyBBZGQgaXQgYmFja1xuZXN0b3JlLnRvZ2dsZSh0b2RvKTtcblxuYGBgXG4gICAqL1xuICBwdWJsaWMgdG9nZ2xlKGU6IEUpIHtcbiAgICBpZiAodGhpcy5jb250YWlucyhlKSkge1xuICAgICAgdGhpcy5kZWxldGUoZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMucG9zdChlKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogTm90aWZpZXMgb2JzZXJ2ZXJzIHdoZW4gdGhlIHN0b3JlIGlzIGVtcHR5LlxuICAgKi9cbiAgcHJpdmF0ZSBub3RpZnlBY3RpdmUgPSBuZXcgUmVwbGF5U3ViamVjdDxNYXA8c3RyaW5nLCBFPj4oMSk7XG5cblxuICAvKipcbiAgICogYE1hcGAgb2YgYWN0aXZlIGVudHRpZXMuIFRoZSBpbnN0YW5jZSBpcyBwdWJsaWMgYW5kIGNhbiBiZSB1c2VkXG4gICAqIGRpcmVjdGx5IHRvIGFkZCBhbmQgcmVtb3ZlIGFjdGl2ZSBlbnRpdGllcywgaG93ZXZlciB3ZSByZWNvbW1lbmRcbiAgICogdXNpbmcgdGhlIHtAbGluayBhZGRBY3RpdmV9IGFuZCB7QGxpbmsgZGVsZXRlQWN0aXZlfSBtZXRob2RzLlxuICAgKi9cbiAgcHVibGljIGFjdGl2ZTogTWFwPHN0cmluZywgRT4gPSBuZXcgTWFwKCk7XG5cbiAgLyoqXG4gICAqIEFkZCBtdWx0aXBsZSBlbnRpdHkgZW50aXRpZXMgdG8gYWN0aXZlLlxuICAgKiBcbiAgICogSWYgdGhlIGVudGl0eSBpcyBub3QgY29udGFpbmVkIGluIHRoZSBzdG9yZSBpdCBpcyBhZGRlZFxuICAgKiB0byB0aGUgc3RvcmUgYmVmb3JlIGl0IGlzIGFkZGVkIHRvIGBhY3RpdmVgLlxuICAgKiBcbiAgICogQWxzbyB3ZSBjbG9uZSB0aGUgbWFwIHByaW9yIHRvIGJyb2FkY2FzdGluZyBpdCB3aXRoXG4gICAqIGBub3RpZnlBY3RpdmVgIHRvIG1ha2Ugc3VyZSB3ZSB3aWxsIHRyaWdnZXIgQW5ndWxhciBcbiAgICogY2hhbmdlIGRldGVjdGlvbiBpbiB0aGUgZXZlbnQgdGhhdCBpdCBtYWludGFpbnMgXG4gICAqIGEgcmVmZXJlbmNlIHRvIHRoZSBgYWN0aXZlYCBzdGF0ZSBgTWFwYCBpbnN0YW5jZS5cbiAgICogXG4gICAqIEBleGFtcGxlIEFkZCBhIGB0b2RvMWAgYW5kIGB0b2RvMmAgYXMgYWN0aXZlXG5gYGBcbmFkZEFjdGl2ZSh0b2RvMSk7XG5hZGRBY3RpdmUodG9kbzIpO1xuYGBgXG4gICAqL1xuICBwdWJsaWMgYWRkQWN0aXZlKGU6IEUpIHtcbiAgICBpZiAodGhpcy5jb250YWlucyhlKSkge1xuICAgICAgdGhpcy5hY3RpdmUuc2V0KCg8YW55PmUpLmdpZCwgZSk7XG4gICAgICB0aGlzLm5vdGlmeUFjdGl2ZS5uZXh0KG5ldyBNYXAodGhpcy5hY3RpdmUpKTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICB0aGlzLnBvc3QoZSk7XG4gICAgICB0aGlzLmFjdGl2ZS5zZXQoKDxhbnk+ZSkuZ2lkLCBlKTtcbiAgICAgIHRoaXMubm90aWZ5QWN0aXZlLm5leHQobmV3IE1hcCh0aGlzLmFjdGl2ZSkpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBEZWxldGUgYW4gZW50aXR5IGFzIGFjdGl2ZS5cbiAgICogXG4gICAqIEFsc28gd2UgY2xvbmUgdGhlIG1hcCBwcmlvciB0byBicm9hZGNhc3RpbmcgaXQgd2l0aFxuICAgKiBgbm90aWZ5QWN0aXZlYCB0byBtYWtlIHN1cmUgd2Ugd2lsbCB0cmlnZ2VyIEFuZ3VsYXIgXG4gICAqIGNoYW5nZSBkZXRlY3Rpb24gaW4gdGhlIGV2ZW50IHRoYXQgaXQgbWFpbnRhaW5zIFxuICAgKiBhIHJlZmVyZW5jZSB0byB0aGUgYGFjdGl2ZWAgc3RhdGUgYE1hcGAgaW5zdGFuY2UuXG4gICAqIFxuICAgKiBAZXhhbXBsZSBNYXJrIGEgYHRvZG9gIGluc3RhbmNlIGFzIGFjdGl2ZVxuICBgYGBcbmRlbGV0ZUFjdGl2ZSh0b2RvMSk7XG5kZWxldGVBY3RpdmUodG9kbzIpO1xuICBgYGBcbiAgICovXG4gIHB1YmxpYyBkZWxldGVBY3RpdmUoZTogRSkge1xuICAgIHRoaXMuYWN0aXZlLmRlbGV0ZSgoPGFueT5lKS5naWQpO1xuICAgIHRoaXMubm90aWZ5QWN0aXZlLm5leHQobmV3IE1hcCh0aGlzLmFjdGl2ZSkpO1xuICB9XG5cbiAgLyoqXG4gICAqIENsZWFyIC8gcmVzZXQgdGhlIGFjdGl2ZSBlbnRpdHkgbWFwLlxuICAgKiBcbiAgICogQWxzbyB3ZSBjbG9uZSB0aGUgbWFwIHByaW9yIHRvIGJyb2FkY2FzdGluZyBpdCB3aXRoXG4gICAqIGBub3RpZnlBY3RpdmVgIHRvIG1ha2Ugc3VyZSB3ZSB3aWxsIHRyaWdnZXIgQW5ndWxhciBcbiAgICogY2hhbmdlIGRldGVjdGlvbiBpbiB0aGUgZXZlbnQgdGhhdCBpdCBtYWludGFpbnMgXG4gICAqIGEgcmVmZXJlbmNlIHRvIHRoZSBgYWN0aXZlYCBzdGF0ZSBgTWFwYCBpbnN0YW5jZS5cbiAgICogXG4gICAqIEBleGFtcGxlIE1hcmsgYSBgdG9kb2AgaW5zdGFuY2UgYXMgYWN0aXZlXG4gIGBgYFxuZGVsZXRlQWN0aXZlKHRvZG8xKTtcbmRlbGV0ZUFjdGl2ZSh0b2RvMik7XG4gIGBgYFxuICAgKi9cbiAgY2xlYXJBY3RpdmUoKSB7XG4gICAgdGhpcy5hY3RpdmUuY2xlYXIoKTtcbiAgICB0aGlzLm5vdGlmeUFjdGl2ZS5uZXh0KG5ldyBNYXAodGhpcy5hY3RpdmUpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBPYnNlcnZlIHRoZSBhY3RpdmUgZW50aXR5LlxuICAgKiBAZXhhbXBsZVxuICAgICA8cHJlPlxuICAgIGxldCBhY3RpdmUkID0gc291cmNlLm9ic2VydmVBY3RpdmUoKTtcbiAgICA8L3ByZT5cbiAgKi9cbiAgcHVibGljIG9ic2VydmVBY3RpdmUoKSB7XG4gICAgcmV0dXJuIHRoaXMubm90aWZ5QWN0aXZlLmFzT2JzZXJ2YWJsZSgpXG4gIH1cblxuICAvKipcbiAgICogT2JzZXJ2ZSB0aGUgYWN0aXZlIGVudGl0eS5cbiAgICogQGV4YW1wbGVcbiAgICAgPHByZT5cbiAgICBsZXQgYWN0aXZlJCA9IHNvdXJjZS5hY3RpdmVTbmFwc2hvdCgpO1xuICAgIDwvcHJlPlxuICAqL1xuICAgIHB1YmxpYyBhY3RpdmVTbmFwc2hvdCgpIHtcbiAgICAgIHJldHVybiBBcnJheS5mcm9tKHRoaXMuYWN0aXZlLnZhbHVlcygpKVxuICB9XG5cblxuICAvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBMT0FESU5HXG4gIC8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgLyoqXG4gICAqIE9ic2VydmFibGUgb2YgZXJyb3JzIG9jY3VycmVkIGR1cmluZyBhIGxvYWQgcmVxdWVzdC5cbiAgICogXG4gICAqIFRoZSBlcnJvciBPYnNlcnZhYmxlIHNob3VsZCBiZSBjcmVhdGVkIGJ5IHRoZSBcbiAgICogY2xpZW50LlxuICAgKi9cbiAgcHVibGljIGxvYWRpbmdFcnJvciE6IE9ic2VydmFibGU8YW55PjtcblxuICAvKipcbiAgICogTm90aWZpZXMgb2JzZXJ2ZXJzIHdoZW4gdGhlIHN0b3JlIGlzIGxvYWRpbmcuXG4gICAqIFxuICAgKiBUaGlzIGlzIGEgY29tbW9uIHBhdHRlcm4gZm91bmQgd2hlbiBpbXBsZW1lbnRpbmdcbiAgICogYE9ic2VydmFibGVgIGRhdGEgc291cmNlcy5cbiAgICovXG4gIHByaXZhdGUgbm90aWZ5TG9hZGluZyA9IG5ldyBSZXBsYXlTdWJqZWN0PGJvb2xlYW4+KDEpO1xuXG4gIC8qKlxuICAgKiBUaGUgY3VycmVudCBsb2FkaW5nIHN0YXRlLiAgVXNlIGxvYWRpbmcgd2hlbiBmZXRjaGluZyBuZXdcbiAgICogZGF0YSBmb3IgdGhlIHN0b3JlLiAgVGhlIGRlZmF1bHQgbG9hZGluZyBzdGF0ZSBpcyBgdHJ1ZWAuXG4gICAqIFxuICAgKiBUaGlzIGlzIHN1Y2ggdGhhdCBpZiBkYXRhIGlzIGZldGNoZWQgYXN5bmNocm9ub3VzbHkgXG4gICAqIGluIGEgc2VydmljZSwgY29tcG9uZW50cyBjYW4gd2FpdCBvbiBsb2FkaW5nIG5vdGlmaWNhdGlvblxuICAgKiBiZWZvcmUgYXR0ZW1wdGluZyB0byByZXRyaWV2ZSBkYXRhIGZyb20gdGhlIHNlcnZpY2UuXG4gICAqXG4gICAqIExvYWRpbmcgY291bGQgYmUgYmFzZWQgb24gYSBjb21wb3NpdGUgcmVzcG9uc2UuICBGb3IgZXhhbXBsZVxuICAgKiB3aGVuIHRoZSBzdG9jayBhbmQgbXV0dWFsIGZ1bmRzIGhhdmUgbG9hZGVkLCBzZXQgbG9hZGluZyB0byBgZmFsc2VgLlxuICAgKi9cbiAgcHJpdmF0ZSBfbG9hZGluZzogYm9vbGVhbiA9IHRydWU7XG5cbiAgLyoqXG4gICAqIFNldHMgdGhlIGN1cnJlbnQgbG9hZGluZyBzdGF0ZSBhbmQgbm90aWZpZXMgb2JzZXJ2ZXJzLlxuICAgKi9cbiAgc2V0IGxvYWRpbmcobG9hZGluZzogYm9vbGVhbikge1xuICAgIHRoaXMuX2xvYWRpbmcgPSBsb2FkaW5nO1xuICAgIHRoaXMubm90aWZ5TG9hZGluZy5uZXh0KHRoaXMuX2xvYWRpbmcpO1xuICB9XG5cbiAgLyoqXG4gICAqIEByZXR1cm4gQSBzbmFwc2hvdCBvZiB0aGUgbG9hZGluZyBzdGF0ZS5cbiAgICovXG4gIGdldCBsb2FkaW5nKCkge1xuICAgIHJldHVybiB0aGlzLl9sb2FkaW5nO1xuICB9XG5cbiAgLyoqXG4gICAqIE9ic2VydmUgbG9hZGluZy5cbiAgICogQGV4YW1wbGVcbiAgICAgPHByZT5cbiAgICBsZXQgbG9hZGluZyQgPSBzb3VyY2Uub2JzZXJ2ZUxvYWRpbmcoKTtcbiAgICA8L3ByZT5cblxuICAgIE5vdGUgdGhhdCB0aGlzIG9idmVyYWJsZSBwaXBlZCB0aHJvdWdoXG4gICAgYHRha2VXaGlsZSh2LT52LCB0cnVlKSwgc3VjaCB0aGF0IGl0IHdpbGwgXG4gICAgY29tcGxldGUgYWZ0ZXIgZWFjaCBlbWlzc2lvbi5cblxuICAgIFNlZTpcbiAgICBodHRwczovL21lZGl1bS5jb20vQG9sZS5lcnNveS93YWl0aW5nLW9uLWVzdG9yZS10by1sb2FkLThkY2JlMTYxNjEzY1xuXG4gICAgRm9yIG1vcmUgZGV0YWlscy5cbiAgKi9cbiAgcHVibGljIG9ic2VydmVMb2FkaW5nKCkge1xuICAgIHJldHVybiB0aGlzLm5vdGlmeUxvYWRpbmcuYXNPYnNlcnZhYmxlKCkuXG4gICAgICBwaXBlKHRha2VXaGlsZSh2ID0+IHYsIHRydWUpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBOb3RmaWllcyB3aGVuIGxvYWRpbmcgaGFzIGNvbXBsZXRlZC5cbiAgICovXG4gIHB1YmxpYyBvYnNlcnZlTG9hZGluZ0NvbXBsZXRlKCkge1xuICAgIHJldHVybiB0aGlzLm9ic2VydmVMb2FkaW5nKCkucGlwZShcbiAgICAgIGZpbHRlcihsb2FkaW5nID0+IGxvYWRpbmcgPT0gZmFsc2UpLFxuICAgICAgc3dpdGNoTWFwKCgpID0+IG9mKHRydWUpKSlcbiAgfVxuXG5cblxuXG5cblxuICAvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBTRUFSQ0hJTkdcbiAgLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLyoqXG4gICAqIE9ic2VydmFibGUgb2YgZXJyb3JzIG9jY3VycmVkIGR1cmluZyBhIHNlYXJjaCByZXF1ZXN0LlxuICAgKiBcbiAgICogVGhlIGVycm9yIE9ic2VydmFibGUgc2hvdWxkIGJlIGNyZWF0ZWQgYnkgdGhlIFxuICAgKiBjbGllbnQuXG4gICAqL1xuICBwdWJsaWMgc2VhcmNoRXJyb3IhOiBPYnNlcnZhYmxlPGFueT47XG5cbiAgLyoqXG4gICAqIE5vdGlmaWVzIG9ic2VydmVycyB0aGF0IGEgc2VhcmNoIGlzIGluIHByb2dyZXNzLlxuICAgKiBcbiAgICogVGhpcyBpcyBhIGNvbW1vbiBwYXR0ZXJuIGZvdW5kIHdoZW4gaW1wbGVtZW50aW5nXG4gICAqIGBPYnNlcnZhYmxlYCBkYXRhIHNvdXJjZXMuXG4gICAqL1xuICBwcml2YXRlIG5vdGlmeVNlYXJjaGluZyA9IG5ldyBSZXBsYXlTdWJqZWN0PGJvb2xlYW4+KDEpO1xuXG4gIC8qKlxuICAgKiBUaGUgY3VycmVudCBgc2VhcmNoaW5nYCBzdGF0ZS4gIFVzZSBgc2VhcmNoaW5nYFxuICAgKiBmb3IgZXhhbXBsZSB0byBkaXNwbGF5IGEgc3Bpbm5uZXIgXG4gICAqIHdoZW4gcGVyZm9ybWluZyBhIHNlYXJjaC4gIFxuICAgKiBUaGUgZGVmYXVsdCBgc2VhcmNoaW5nYCBzdGF0ZSBpcyBgZmFsc2VgLlxuICAgKi9cbiAgcHJpdmF0ZSBfc2VhcmNoaW5nOiBib29sZWFuID0gZmFsc2U7XG5cbiAgLyoqXG4gICAqIFNldHMgdGhlIGN1cnJlbnQgc2VhcmNoaW5nIHN0YXRlIGFuZCBub3RpZmllcyBvYnNlcnZlcnMuXG4gICAqL1xuICBzZXQgc2VhcmNoaW5nKHNlYXJjaGluZzogYm9vbGVhbikge1xuICAgIHRoaXMuX3NlYXJjaGluZyA9IHNlYXJjaGluZztcbiAgICB0aGlzLm5vdGlmeVNlYXJjaGluZy5uZXh0KHRoaXMuX3NlYXJjaGluZyk7XG4gIH1cblxuICAvKipcbiAgICogQHJldHVybiBBIHNuYXBzaG90IG9mIHRoZSBzZWFyY2hpbmcgc3RhdGUuXG4gICAqL1xuICBnZXQgc2VhcmNoaW5nKCkge1xuICAgIHJldHVybiB0aGlzLl9zZWFyY2hpbmc7XG4gIH1cblxuICAvKipcbiAgICogT2JzZXJ2ZSBzZWFyY2hpbmcuXG4gICAqIEBleGFtcGxlXG4gICAgIDxwcmU+XG4gICAgbGV0IHNlYXJjaGluZyQgPSBzb3VyY2Uub2JzZXJ2ZVNlYXJjaGluZygpO1xuICAgIDwvcHJlPlxuICBcbiAgICBOb3RlIHRoYXQgdGhpcyBvYnZlcmFibGUgcGlwZWQgdGhyb3VnaFxuICAgIGB0YWtlV2hpbGUodi0+diwgdHJ1ZSksIHN1Y2ggdGhhdCBpdCB3aWxsIFxuICAgIGNvbXBsZXRlIGFmdGVyIGVhY2ggZW1pc3Npb24uXG4gIFxuICAgIFNlZTpcbiAgICBodHRwczovL21lZGl1bS5jb20vQG9sZS5lcnNveS93YWl0aW5nLW9uLWVzdG9yZS10by1sb2FkLThkY2JlMTYxNjEzY1xuICBcbiAgICBGb3IgbW9yZSBkZXRhaWxzLlxuICAqL1xuICBwdWJsaWMgb2JzZXJ2ZVNlYXJjaGluZygpOiBPYnNlcnZhYmxlPGJvb2xlYW4+IHtcbiAgICByZXR1cm4gdGhpcy5ub3RpZnlTZWFyY2hpbmcuYXNPYnNlcnZhYmxlKCkuXG4gICAgICBwaXBlKHRha2VXaGlsZSh2ID0+IHYsIHRydWUpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBOb3RmaWllcyB3aGVuIHNlYXJjaGluZyBoYXMgY29tcGxldGVkLlxuICAgKi9cbiAgcHVibGljIG9ic2VydmVTZWFyY2hpbmdDb21wbGV0ZSgpOiBPYnNlcnZhYmxlPGJvb2xlYW4+IHtcbiAgICByZXR1cm4gdGhpcy5vYnNlcnZlU2VhcmNoaW5nKCkucGlwZShcbiAgICAgIGZpbHRlcihzZWFyY2hpbmcgPT4gc2VhcmNoaW5nID09IGZhbHNlKSxcbiAgICAgIHN3aXRjaE1hcCgoKSA9PiBvZih0cnVlKSkpXG4gIH1cblxuICAvKipcbiAgICogU3RvcmUgc2xpY2VzXG4gICAqL1xuICBwcml2YXRlIHNsaWNlczogTWFwPHN0cmluZywgU2xpY2U8RT4+ID0gbmV3IE1hcCgpO1xuXG4gIC8qKlxuICAgKiBBZGRzIGEgc2xpY2UgdG8gdGhlIHN0b3JlIGFuZCBrZXlzIGl0IGJ5IHRoZSBzbGljZXMgbGFiZWwuXG4gICAqXG4gICAqIEBwYXJhbSBwXG4gICAqIEBwYXJhbSBsYWJlbFxuICAgKiBcbiAgICogQGV4YW1wbGUgU2V0dXAgYSBUb2RvIFNsaWNlIGZvciBDT01QTEVURSBUb2Rvc1xuYGBgXG5zb3VyY2UuYWRkU2xpY2UodG9kbyA9PiB0b2RvLmNvbXBsZXRlLCBUb2RvU2xpY2VzLkNPTVBMRVRFKTtcbmBgYFxuICAgKi9cbiAgYWRkU2xpY2UocDogUHJlZGljYXRlPEU+LCBsYWJlbDogc3RyaW5nKSB7XG4gICAgY29uc3Qgc2xpY2U6IFNsaWNlPEU+ID0gbmV3IFNsaWNlKFxuICAgICAgbGFiZWwsXG4gICAgICBwLFxuICAgICAgdGhpcylcbiAgICB0aGlzLnNsaWNlcy5zZXQoc2xpY2UubGFiZWwsIHNsaWNlKVxuICB9XG5cbiAgLyoqXG4gICAqIFJlbW92ZSBhIHNsaWNlXG4gICAqIEBwYXJhbSBsYWJlbCBUaGUgbGFiZWwgaWRlbnRpZnlpbmcgdGhlIHNsaWNlXG4gICAqIFxuICAgKiBAZXhhbXBsZSBSZW1vdmUgdGhlIFRvZG9TbGljZXMuQ09NUExFVEUgU2xpY2VcbmBgYFxuc291cmNlLnJlbW92ZVNsaWNlKFRvZG9TbGljZXMuQ09NUExFVEUpO1xuYGBgXG4gICAqL1xuICByZW1vdmVTbGljZShsYWJlbDogc3RyaW5nKSB7XG4gICAgdGhpcy5zbGljZXMuZGVsZXRlKGxhYmVsKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgYSBzbGljZVxuICAgKiBAcGFyYW0gbGFiZWwgVGhlIGxhYmVsIGlkZW50aWZ5aW5nIHRoZSBzbGljZVxuICAgKiBAcmV0dXJuIFRoZSBTbGljZSBpbnN0YW5jZSBvciB1bmRlZmluZWQgXG4gICAqIFxuICAgKiBAZXhhbXBsZSBHZXQgdGhlIFRvZG9TbGljZXMuQ09NUExFVEUgc2xpY2VcbmBgYFxuc291cmNlLmdldFNsaWNlKFRvZG9TbGljZXMuQ09NUExFVEUpO1xuYGBgXG4gICAqL1xuICBnZXRTbGljZShsYWJlbDogc3RyaW5nKTogU2xpY2U8RT4gfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLnNsaWNlcy5nZXQobGFiZWwpO1xuICB9XG5cbiAgLyoqXG4gICAqIFBvc3QgKEFkZCBhIG5ldykgZWxlbWVudChzKSB0byB0aGUgc3RvcmUuXG4gICAqIEBwYXJhbSBlIEFuIGluZGlpZHVhbCBlbnRpdHkgb3IgYW4gYXJyYXkgb2YgZW50aXRpZXNcbiAgICogQGV4YW1wbGUgUG9zdCBhIGB0b2RvYC5cbmBgYFxuc3RvcmUucG9zdCh0b2RvKTtcbmBgYFxuICAgKi9cbiAgcG9zdChlOiBFIHwgRVtdKSB7XG4gICAgaWYgKCFBcnJheS5pc0FycmF5KGUpKSB7XG4gICAgICBjb25zdCBndWlkOiBzdHJpbmcgPSAoPGFueT5lKVt0aGlzLkdVSURfS0VZXVxuICAgICAgICA/ICg8YW55PmUpW3RoaXMuR1VJRF9LRVldXG4gICAgICAgIDogR1VJRCgpO1xuICAgICAgKDxhbnk+ZSlbdGhpcy5HVUlEX0tFWV0gPSBndWlkO1xuICAgICAgdGhpcy5lbnRyaWVzLnNldChndWlkLCBlKTtcbiAgICAgIHRoaXMudXBkYXRlSURFbnRyeShlKTtcbiAgICAgIEFycmF5LmZyb20odGhpcy5zbGljZXMudmFsdWVzKCkpLmZvckVhY2gocyA9PiB7XG4gICAgICAgIHMucG9zdChlKTtcbiAgICAgIH0pO1xuICAgICAgLy9DcmVhdGUgYSBuZXcgYXJyYXkgcmVmZXJlbmNlIHRvIHRyaWdnZXIgQW5ndWxhciBjaGFuZ2UgZGV0ZWN0aW9uLlxuICAgICAgbGV0IHY6IEVbXSA9IFsuLi5BcnJheS5mcm9tKHRoaXMuZW50cmllcy52YWx1ZXMoKSldO1xuICAgICAgY29uc3QgZGVsdGE6IERlbHRhPEU+ID0geyB0eXBlOiBBY3Rpb25UeXBlcy5QT1NULCBlbnRyaWVzOiBbZV0gfTtcbiAgICAgIHRoaXMubm90aWZ5QWxsKHYsIGRlbHRhKTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICB0aGlzLnBvc3RBKGUpXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFBvc3QgZWxlbWVudHMgdG8gdGhlIHN0b3JlLlxuICAgKiBAcGFyYW0gLi4uZVxuICAgKiBAZXhhbXBsZSBQb3N0IHR3byBgVG9kb2AgaW5zdGFuY2VzLlxuYGBgXG5zdG9yZS5wb3N0KHRvZG8xLCB0b2RvMik7XG5gYGBcbiAgICovXG4gIHBvc3ROKC4uLmU6IEVbXSkge1xuICAgIGUuZm9yRWFjaChlID0+IHtcbiAgICAgIGNvbnN0IGd1aWQ6IHN0cmluZyA9ICg8YW55PmUpW3RoaXMuR1VJRF9LRVldXG4gICAgICAgID8gKDxhbnk+ZSlbdGhpcy5HVUlEX0tFWV1cbiAgICAgICAgOiBHVUlEKCk7XG4gICAgICAoPGFueT5lKVt0aGlzLkdVSURfS0VZXSA9IGd1aWQ7XG4gICAgICB0aGlzLmVudHJpZXMuc2V0KGd1aWQsIGUpO1xuICAgICAgdGhpcy51cGRhdGVJREVudHJ5KGUpO1xuICAgIH0pO1xuICAgIEFycmF5LmZyb20odGhpcy5zbGljZXMudmFsdWVzKCkpLmZvckVhY2gocyA9PiB7XG4gICAgICBzLnBvc3RBKGUpO1xuICAgIH0pO1xuICAgIC8vQ3JlYXRlIGEgbmV3IGFycmF5IHJlZmVyZW5jZSB0byB0cmlnZ2VyIEFuZ3VsYXIgY2hhbmdlIGRldGVjdGlvbi5cbiAgICBsZXQgdjogRVtdID0gWy4uLkFycmF5LmZyb20odGhpcy5lbnRyaWVzLnZhbHVlcygpKV07XG4gICAgY29uc3QgZGVsdGE6IERlbHRhPEU+ID0geyB0eXBlOiBBY3Rpb25UeXBlcy5QT1NULCBlbnRyaWVzOiBlIH07XG4gICAgdGhpcy5ub3RpZnlBbGwodiwgZGVsdGEpO1xuICB9XG5cbiAgLyoqXG4gICAqIFBvc3QgKEFkZCkgYW4gYXJyYXkgb2YgZWxlbWVudHMgdG8gdGhlIHN0b3JlLlxuICAgKiBAcGFyYW0gZVxuICAgKiBAZXhhbXBsZSBQb3N0IGEgYFRvZG9gIGFycmF5LlxuYGBgXG5zdG9yZS5wb3N0KFt0b2RvMSwgdG9kbzJdKTtcbmBgYFxuICAgKi9cbiAgcG9zdEEoZTogRVtdKSB7XG4gICAgdGhpcy5wb3N0TiguLi5lKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBQdXQgKFVwZGF0ZSkgYW4gZWxlbWVudC5cbiAgICogQHBhcmFtIGVcbiAgICogQGV4YW1wbGUgUHV0IGEgVG9kbyBpbnN0YW5jZS5cbmBgYFxuc3RvcmUucHV0KHRvZG8xKTtcbmBgYFxuICAgKi9cbiAgcHV0KGU6IEUgfCBFW10pIHtcbiAgICBpZiAoIUFycmF5LmlzQXJyYXkoZSkpIHtcbiAgICAgIGxldCBpZDogc3RyaW5nID0gKDxhbnk+ZSlbdGhpcy5HVUlEX0tFWV07XG4gICAgICB0aGlzLmVudHJpZXMuc2V0KGlkLCBlKTtcbiAgICAgIHRoaXMudXBkYXRlSURFbnRyeShlKTtcbiAgICAgIGxldCB2OiBFW10gPSBbLi4uQXJyYXkuZnJvbSh0aGlzLmVudHJpZXMudmFsdWVzKCkpXTtcbiAgICAgIHRoaXMubm90aWZ5Lm5leHQodik7XG4gICAgICBjb25zdCBkZWx0YTogRGVsdGE8RT4gPSB7IHR5cGU6IEFjdGlvblR5cGVzLlBVVCwgZW50cmllczogW2VdIH07XG4gICAgICB0aGlzLm5vdGlmeURlbHRhLm5leHQoZGVsdGEpO1xuICAgICAgQXJyYXkuZnJvbSh0aGlzLnNsaWNlcy52YWx1ZXMoKSkuZm9yRWFjaChzID0+IHtcbiAgICAgICAgcy5wdXQoZSk7XG4gICAgICB9KTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICB0aGlzLnB1dEEoZSlcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUHV0IChVcGRhdGUpIGFuIGVsZW1lbnQgb3IgYWRkIGFuIGVsZW1lbnQgdGhhdCB3YXMgcmVhZCBmcm9tIGEgcGVyc2lzdGVuY2Ugc291cmNlXG4gICAqIGFuZCB0aHVzIGFscmVhZHkgaGFzIGFuIGFzc2lnbmVkIGdsb2JhbCBpZGAuXG4gICAqIEBwYXJhbSBlXG4gICAqIEBleGFtcGxlIFB1dCBUb2RvIGluc3RhbmNlcy5cbmBgYFxuc3RvcmUucHV0KHRvZG8xLCB0b2RvMik7XG5gYGBcbiAgICovXG4gIHB1dE4oLi4uZTogRVtdKSB7XG4gICAgdGhpcy5wdXRBKGUpO1xuICB9XG5cbiAgLyoqXG4gICAqIFB1dCAoVXBkYXRlKSB0aGUgYXJyYXkgb2YgZWxlbWVudHMuXG4gICAqIEBwYXJhbSBlXG4gICAqIEBleGFtcGxlIFB1dCBUb2RvIGluc3RhbmNlcy5cbmBgYFxuc3RvcmUucHV0KFt0b2RvMSwgdG9kbzJdKTtcbmBgYFxuICAgKi9cbiAgcHV0QShlOiBFW10pIHtcbiAgICBlLmZvckVhY2goZSA9PiB7XG4gICAgICBsZXQgZ3VpZDogc3RyaW5nID0gKDxhbnk+ZSlbdGhpcy5HVUlEX0tFWV1cbiAgICAgIHRoaXMuZW50cmllcy5zZXQoZ3VpZCwgZSlcbiAgICAgIHRoaXMudXBkYXRlSURFbnRyeShlKTtcbiAgICB9KTtcbiAgICAvL0NyZWF0ZSBhIG5ldyBhcnJheSByZWZlcmVuY2UgdG8gdHJpZ2dlciBBbmd1bGFyIGNoYW5nZSBkZXRlY3Rpb24uXG4gICAgbGV0IHY6IEVbXSA9IFsuLi5BcnJheS5mcm9tKHRoaXMuZW50cmllcy52YWx1ZXMoKSldO1xuICAgIHRoaXMubm90aWZ5Lm5leHQodik7XG4gICAgY29uc3QgZGVsdGE6IERlbHRhPEU+ID0geyB0eXBlOiBBY3Rpb25UeXBlcy5QVVQsIGVudHJpZXM6IGUgfTtcbiAgICB0aGlzLm5vdGlmeURlbHRhLm5leHQoZGVsdGEpO1xuICAgIEFycmF5LmZyb20odGhpcy5zbGljZXMudmFsdWVzKCkpLmZvckVhY2gocyA9PiB7XG4gICAgICBzLnB1dEEoZSk7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogRGVsZXRlIChVcGRhdGUpIHRoZSBhcnJheSBvZiBlbGVtZW50cy5cbiAgICogQHBhcmFtIGVcbiAgICogQGV4YW1wbGUgRGVsZXRlIHRvZG8xLlxuYGBgXG5zdG9yZS5kZWxldGUodG9kbzFdKTtcbmBgYFxuICAgKi9cbiAgZGVsZXRlKGU6IEUgfCBFW10pIHtcbiAgICBpZiAoIUFycmF5LmlzQXJyYXkoZSkpIHtcbiAgICAgIHRoaXMuZGVsZXRlQWN0aXZlKGUpO1xuICAgICAgY29uc3QgZ3VpZCA9ICg8YW55PmUpW3RoaXMuR1VJRF9LRVldO1xuICAgICAgdGhpcy5lbnRyaWVzLmRlbGV0ZShndWlkKTtcbiAgICAgIHRoaXMuZGVsZXRlSURFbnRyeShlKTtcbiAgICAgIEFycmF5LmZyb20odGhpcy5zbGljZXMudmFsdWVzKCkpLmZvckVhY2gocyA9PiB7XG4gICAgICAgIHMuZW50cmllcy5kZWxldGUoZ3VpZCk7XG4gICAgICB9KTtcbiAgICAgIC8vQ3JlYXRlIGEgbmV3IGFycmF5IHJlZmVyZW5jZSB0byB0cmlnZ2VyIEFuZ3VsYXIgY2hhbmdlIGRldGVjdGlvbi5cbiAgICAgIGxldCB2OiBFW10gPSBbLi4uQXJyYXkuZnJvbSh0aGlzLmVudHJpZXMudmFsdWVzKCkpXTtcbiAgICAgIGNvbnN0IGRlbHRhOiBEZWx0YTxFPiA9IHsgdHlwZTogQWN0aW9uVHlwZXMuREVMRVRFLCBlbnRyaWVzOiBbZV0gfTtcbiAgICAgIHRoaXMubm90aWZ5QWxsKHYsIGRlbHRhKTtcbiAgICAgIEFycmF5LmZyb20odGhpcy5zbGljZXMudmFsdWVzKCkpLmZvckVhY2gocyA9PiB7XG4gICAgICAgIHMuZGVsZXRlKGUpO1xuICAgICAgfSk7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgdGhpcy5kZWxldGVBKGUpXG4gICAgfVxuXG4gIH1cblxuICAvKipcbiAgICogRGVsZXRlIE4gZWxlbWVudHMuXG4gICAqIEBwYXJhbSAuLi5lXG4gICAqIEBleGFtcGxlIFB1dCBUb2RvIGluc3RhbmNlcy5cbmBgYFxuc3RvcmUuZGVsZXRlKHRvZG8xLCB0b2RvMik7XG5gYGBcbiAgICovXG4gIGRlbGV0ZU4oLi4uZTogRVtdKSB7XG4gICAgdGhpcy5kZWxldGVBKGUpO1xuICB9XG5cbiAgLyoqXG4gICAqIERlbGV0ZSBOIGVsZW1lbnRzLlxuICAgKiBAcGFyYW0gLi4uZVxuICAgKiBAZXhhbXBsZSBQdXQgVG9kbyBpbnN0YW5jZXMuXG5gYGBcbnN0b3JlLmRlbGV0ZSh0b2RvMSwgdG9kbzIpO1xuYGBgXG4gICAqL1xuICBkZWxldGVBKGU6IEVbXSkge1xuICAgIGUuZm9yRWFjaChlID0+IHtcbiAgICAgIHRoaXMuZGVsZXRlQWN0aXZlKGUpO1xuICAgICAgY29uc3QgZ3VpZCA9ICg8YW55PmUpW3RoaXMuR1VJRF9LRVldO1xuICAgICAgdGhpcy5lbnRyaWVzLmRlbGV0ZShndWlkKTtcbiAgICAgIHRoaXMuZGVsZXRlSURFbnRyeShlKTtcbiAgICAgIEFycmF5LmZyb20odGhpcy5zbGljZXMudmFsdWVzKCkpLmZvckVhY2gocyA9PiB7XG4gICAgICAgIHMuZW50cmllcy5kZWxldGUoZ3VpZCk7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgICAvL0NyZWF0ZSBhIG5ldyBhcnJheSByZWZlcmVuY2UgdG8gdHJpZ2dlciBBbmd1bGFyIGNoYW5nZSBkZXRlY3Rpb24uXG4gICAgbGV0IHY6IEVbXSA9IFsuLi5BcnJheS5mcm9tKHRoaXMuZW50cmllcy52YWx1ZXMoKSldO1xuICAgIGNvbnN0IGRlbHRhOiBEZWx0YTxFPiA9IHsgdHlwZTogQWN0aW9uVHlwZXMuREVMRVRFLCBlbnRyaWVzOiBlIH07XG4gICAgdGhpcy5ub3RpZnlBbGwodiwgZGVsdGEpO1xuICAgIEFycmF5LmZyb20odGhpcy5zbGljZXMudmFsdWVzKCkpLmZvckVhY2gocyA9PiB7XG4gICAgICBzLmRlbGV0ZUEoZSk7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogRGVsZXRlIGVsZW1lbnRzIGJ5IHtAbGluayBQcmVkaWNhdGV9LlxuICAgKiBAcGFyYW0gcCBUaGUgcHJlZGljYXRlLlxuICAgKiBAZXhhbXBsZSBQdXQgVG9kbyBpbnN0YW5jZXMuXG5gYGBcbnN0b3JlLmRlbGV0ZSh0b2RvMSwgdG9kbzIpO1xuYGBgXG4gICAqL1xuICBkZWxldGVQKHA6IFByZWRpY2F0ZTxFPikge1xuICAgIGNvbnN0IGQ6IEVbXSA9IFtdO1xuICAgIEFycmF5LmZyb20odGhpcy5lbnRyaWVzLnZhbHVlcygpKS5mb3JFYWNoKGUgPT4ge1xuICAgICAgaWYgKHAoZSkpIHtcbiAgICAgICAgZC5wdXNoKGUpO1xuICAgICAgICBjb25zdCBpZCA9ICg8YW55PmUpW3RoaXMuR1VJRF9LRVldO1xuICAgICAgICB0aGlzLmVudHJpZXMuZGVsZXRlKGlkKTtcbiAgICAgICAgdGhpcy5kZWxldGVBY3RpdmUoZSk7XG4gICAgICAgIHRoaXMuZGVsZXRlSURFbnRyeShlKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICAvL0NyZWF0ZSBhIG5ldyBhcnJheSByZWZlcmVuY2UgdG8gdHJpZ2dlciBBbmd1bGFyIGNoYW5nZSBkZXRlY3Rpb24uXG4gICAgbGV0IHY6IEVbXSA9IFsuLi5BcnJheS5mcm9tKHRoaXMuZW50cmllcy52YWx1ZXMoKSldO1xuICAgIGNvbnN0IGRlbHRhOiBEZWx0YTxFPiA9IHsgdHlwZTogQWN0aW9uVHlwZXMuREVMRVRFLCBlbnRyaWVzOiBkIH07XG4gICAgdGhpcy5ub3RpZnlBbGwodiwgZGVsdGEpO1xuICAgIEFycmF5LmZyb20odGhpcy5zbGljZXMudmFsdWVzKCkpLmZvckVhY2gocyA9PiB7XG4gICAgICBzLmRlbGV0ZUEoZCk7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogSWYgdGhlIGVudGl0eSBoYXMgdGhlIGBpZGAga2V5IGluaXRpYWxpemVkIHdpdGggYSB2YWx1ZSxcbiAgICogdGhlbiBhbHNvIGFkZCB0aGUgZW50aXR5IHRvIHRoZSBgaWRFbnRyaWVzYC5cbiAgICpcbiAgICogQHBhcmFtIGUgVGhlIGVsZW1lbnQgdG8gYmUgYWRkZWQgdG8gdGhlIGBpZEVudHJpZXNgLlxuICAgKi9cbiAgcHJpdmF0ZSB1cGRhdGVJREVudHJ5KGU6IEUpIHtcbiAgICBpZiAoKDxhbnk+ZSlbdGhpcy5JRF9LRVldKSB7XG4gICAgICB0aGlzLmlkRW50cmllcy5zZXQoKDxhbnk+ZSlbdGhpcy5JRF9LRVldLCBlKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogSWYgdGhlIGVudGl0eSBoYXMgdGhlIGBpZGAga2V5IGluaXRpYWxpemVkIHdpdGggYSB2YWx1ZSxcbiAgICogdGhlbiBhbHNvIGRlbGV0ZSB0aGUgZW50aXR5IHRvIHRoZSBgaWRFbnRyaWVzYC5cbiAgICpcbiAgICogQHBhcmFtIGUgVGhlIGVsZW1lbnQgdG8gYmUgYWRkZWQgdG8gdGhlIGBpZEVudHJpZXNgLlxuICAgKi9cbiAgcHJpdmF0ZSBkZWxldGVJREVudHJ5KGU6IEUpIHtcbiAgICBpZiAoKDxhbnk+ZSlbdGhpcy5JRF9LRVldKSB7XG4gICAgICB0aGlzLmlkRW50cmllcy5kZWxldGUoKDxhbnk+ZSlbdGhpcy5JRF9LRVldKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUmVzZXRzIHRoZSBzdG9yZSBhbmQgYWxsIGNvbnRhaW5lZCBzbGljZSBpbnN0YW5jZXMgdG8gZW1wdHkuXG4gICAqIEFsc28gcGVyZm9ybSBkZWx0YSBub3RpZmljYXRpb24gdGhhdCBzZW5kcyBhbGwgY3VycmVudCBzdG9yZSBlbnRyaWVzLlxuICAgKiBUaGUgQWN0aW9uVHlwZS5SRVNFVCBjb2RlIGlzIHNlbnQgd2l0aCB0aGUgZGVsdGEgbm90aWZpY2F0aW9uLiAgU2xpY2VzXG4gICAqIHNlbmQgdGhlaXIgb3duIGRlbHRhIG5vdGlmaWNhdGlvbi5cbiAgICogXG4gICAqIEBleGFtcGxlIFJlc2V0IHRoZSBzdG9yZS5cbmBgYFxuc3RvcmUucmVzZXQoKTtcbmBgYFxuICAgKi9cbiAgcmVzZXQoKSB7XG4gICAgY29uc3QgZGVsdGE6IERlbHRhPEU+ID0ge1xuICAgICAgdHlwZTogQWN0aW9uVHlwZXMuUkVTRVQsXG4gICAgICBlbnRyaWVzOiBBcnJheS5mcm9tKHRoaXMuZW50cmllcy52YWx1ZXMoKSlcbiAgICB9O1xuICAgIHRoaXMubm90aWZ5QWxsKFtdLCBkZWx0YSk7XG4gICAgdGhpcy5lbnRyaWVzID0gbmV3IE1hcCgpO1xuICAgIEFycmF5LmZyb20odGhpcy5zbGljZXMudmFsdWVzKCkpLmZvckVhY2gocyA9PiB7XG4gICAgICBzLnJlc2V0KCk7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogQ2FsbCBhbGwgdGhlIG5vdGlmaWVycyBhdCBvbmNlLlxuICAgKlxuICAgKiBAcGFyYW0gdlxuICAgKiBAcGFyYW0gZGVsdGFcbiAgICovXG4gIHByb3RlY3RlZCBvdmVycmlkZSBub3RpZnlBbGwodjogRVtdLCBkZWx0YTogRGVsdGE8RT4pIHtcbiAgICBzdXBlci5ub3RpZnlBbGwodiwgZGVsdGEpO1xuICAgIHRoaXMubm90aWZ5TG9hZGluZy5uZXh0KHRoaXMubG9hZGluZyk7XG4gIH1cbn0iXX0=
668
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRVN0b3JlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcHJvamVjdHMvc2xpY2Uvc3JjL2xpYi9FU3RvcmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBRWhELE9BQU8sRUFBRSxJQUFJLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFHbkMsT0FBTyxFQUFFLGFBQWEsRUFBRSxFQUFFLEVBQTZCLE1BQU0sTUFBTSxDQUFDO0FBQ3BFLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxFQUFFLFNBQVMsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQzlELE9BQU8sRUFBRSxLQUFLLEVBQUUsTUFBTSxTQUFTLENBQUM7QUFFaEM7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBdUJHO0FBQ0gsTUFBTSxPQUFPLE1BQVUsU0FBUSxhQUFnQjtJQUM3Qzs7Ozs7Ozs7Ozs7Ozs7O09BZUc7SUFDSCxZQUFZLFdBQWdCLEVBQUUsRUFBRSxNQUFvQjtRQUNsRCxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUM7UUEyQ2hCOztXQUVHO1FBQ0ssaUJBQVksR0FBRyxJQUFJLGFBQWEsQ0FBaUIsQ0FBQyxDQUFDLENBQUM7UUFFNUQ7Ozs7V0FJRztRQUNJLFdBQU0sR0FBbUIsSUFBSSxHQUFHLEVBQUUsQ0FBQztRQXNHMUM7Ozs7O1dBS0c7UUFDSyxrQkFBYSxHQUFHLElBQUksYUFBYSxDQUFVLENBQUMsQ0FBQyxDQUFDO1FBRXREOzs7Ozs7Ozs7O1dBVUc7UUFDSyxhQUFRLEdBQVksSUFBSSxDQUFDO1FBbUhqQzs7Ozs7V0FLRztRQUNLLG9CQUFlLEdBQUcsSUFBSSxhQUFhLENBQVUsQ0FBQyxDQUFDLENBQUM7UUFFeEQ7Ozs7O1dBS0c7UUFDSyxlQUFVLEdBQVksS0FBSyxDQUFDO1FBK0NwQzs7V0FFRztRQUNLLFdBQU0sR0FBMEIsSUFBSSxHQUFHLEVBQUUsQ0FBQztRQWhXaEQsTUFB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QUFLLEVBQUUsQ0FBQztRQUNaLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVEOzs7OztPQUtHO0lBQ2dCLFNBQVMsQ0FBQyxDQUFNLEVBQUUsS0FBZTtRQUNsRCxLQUFLLENBQUMsU0FBUyxDQUFDLENBQUMsRUFBRSxLQUFLLENBQUMsQ0FBQztRQUMxQixJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDeEMsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQWJzdHJhY3RTdG9yZSB9IGZyb20gJy4vQWJzdHJhY3RTdG9yZSc7XG5pbXBvcnQgeyBTdG9yZUNvbmZpZyB9IGZyb20gJy4vbW9kZWxzL1N0b3JlQ29uZmlnJztcbmltcG9ydCB7IEdVSUQgfSBmcm9tICcuL3V0aWxpdGllcyc7XG5cbmltcG9ydCB7IEFjdGlvblR5cGVzLCBQcmVkaWNhdGUsIERlbHRhIH0gZnJvbSAnLi9tb2RlbHMvJztcbmltcG9ydCB7IFJlcGxheVN1YmplY3QsIG9mLCBPYnNlcnZhYmxlLCBjb21iaW5lTGF0ZXN0IH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyB0YWtlV2hpbGUsIGZpbHRlciwgc3dpdGNoTWFwIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuaW1wb3J0IHsgU2xpY2UgfSBmcm9tICcuL1NsaWNlJztcblxuLyoqXG4gKiBUaGlzIGB0b2RvRmFjdG9yeWAgY29kZSB3aWxsIGJlIHVzZWQgdG8gaWxsdXN0cmF0ZSB0aGUgQVBJIGV4YW1wbGVzLiAgVGhlIGZvbGxvd2luZ1xuICogdXRpbGl0aWVzIGFyZSB1c2VkIGluIHRoZSB0ZXN0cyBhbmQgdGhlIEFQSSBUeXBlZG9jIGV4YW1wbGVzIGNvbnRhaW5lZCBoZXJlLlxuICogQGV4YW1wbGUgVXRpbGl0aWVzIGZvciBBUEkgRXhhbXBsZXNcbiAqIGBgYFxuICogZXhwb3J0IGNvbnN0IGVudW0gVG9kb1NsaWNlRW51bSB7XG4gKiAgICBDT01QTEVURSA9IFwiQ29tcGxldGVcIixcbiAqICAgIElOQ09NUExFVEUgPSBcIkluY29tcGxldGVcIlxuICogfVxuICogZXhwb3J0IGNsYXNzIFRvZG8ge1xuICogICAgY29uc3RydWN0b3IoXG4gKiAgICAgICAgIHB1YmxpYyBjb21wbGV0ZTogYm9vbGVhbixcbiAqICAgICAgICAgcHVibGljIHRpdGxlOiBzdHJpbmcsXG4gKiAgICAgICAgIHB1YmxpYyBnaWQ/OnN0cmluZyxcbiAqICAgICAgICAgcHVibGljIGlkPzpzdHJpbmcpIHt9XG4gKiB9XG4gKlxuICogZXhwb3J0IGxldCB0b2RvcyA9IFtuZXcgVG9kbyhmYWxzZSwgXCJZb3UgY29tcGxldGUgbWUhXCIpLCBuZXcgVG9kbyh0cnVlLCBcIllvdSBjb21wbGV0ZWQgbWUhXCIpXTtcbiAqXG4gKiBleHBvcnQgZnVuY3Rpb24gdG9kb3NGYWN0b3J5KCk6VG9kb1tdIHtcbiAqICAgcmV0dXJuIFtuZXcgVG9kbyhmYWxzZSwgXCJZb3UgY29tcGxldGUgbWUhXCIpLCBuZXcgVG9kbyh0cnVlLCBcIllvdSBjb21wbGV0ZWQgbWUhXCIpXTtcbiAqIH1cbiAqIGBgYFxuICovXG5leHBvcnQgY2xhc3MgRVN0b3JlPEU+IGV4dGVuZHMgQWJzdHJhY3RTdG9yZTxFPiB7XG4gIC8qKlxuICAgKiBTdG9yZSBjb25zdHJ1Y3RvciAoSW5pdGlhbGl6YXRpb24gd2l0aCBlbGVtZW50IGlzIG9wdGlvbmFsKVxuICAgKlxuICAgKiBwZXJmb3JtIGluaXRpYWwgbm90aWZpY2F0aW9uIHRvIGFsbCBvYnNlcnZlcnMsXG4gICAqIHN1Y2ggdGhhdCBmdW5jdGlvbnMgbGlrZSB7QGxpbmsgY29tYmluZUxhdGVzdH17fVxuICAgKiB3aWxsIGV4ZWN1dGUgYXQgbGVhc3Qgb25jZS5cbiAgICogXG4gICAqIEBwYXJhbSBlbnRpdGllcyBUaGUgZW50aXRpZXMgdG8gaW5pdGlhbGl6ZSB0aGUgc3RvcmUgd2l0aC5cbiAgICogQHBhcmFtIGNvbmZpZyBUaGUgb3B0aW9uYWwgY29uZmlndXJhdGlvbiBpbnN0YW5jZS5cbiAgICogXG4gICAqIEBleGFtcGxlIEVTdG9yZTxUb2RvPiBDcmVhdGlvblxuICAgKiBgYGBcbiAgICogLy8gSW5pdGlhbGl6ZSB0aGUgU3RvcmVcbiAgICogbGV0IHN0b3JlOiBFU3RvcmU8VG9kbz4gPSBuZXcgRVN0b3JlPFRvZG8+KHRvZG9zRmFjdG9yeSgpKTtcbiAgICogYGBgXG4gICAqL1xuICBjb25zdHJ1Y3RvcihlbnRpdGllczogRVtdID0gW10sIGNvbmZpZz86IFN0b3JlQ29uZmlnKSB7XG4gICAgc3VwZXIoY29uZmlnKTtcbiAgICBjb25zdCBkZWx0YTogRGVsdGE8RT4gPSB7IHR5cGU6IEFjdGlvblR5cGVzLklOVElBTElaRSwgZW50cmllczogZW50aXRpZXMgfTtcbiAgICB0aGlzLnBvc3QoZW50aXRpZXMpO1xuICAgIHRoaXMubm90aWZ5RGVsdGEubmV4dChkZWx0YSk7XG4gIH1cblxuICAvKipcbiAgICogQ2FsbHMgY29tcGxldGUgb24gYWxsIEVTdG9yZSB7QGxpbmsgUmVwbGF5U3ViamVjdH0gaW5zdGFuY2VzLlxuICAgKlxuICAgKiBDYWxsIGRlc3Ryb3kgd2hlbiBkaXNwb3Npbmcgb2YgdGhlIHN0b3JlLlxuICAgKi9cbiAgb3ZlcnJpZGUgZGVzdHJveSgpIHtcbiAgICBzdXBlci5kZXN0cm95KCk7XG4gICAgdGhpcy5ub3RpZnlMb2FkaW5nLmNvbXBsZXRlKCk7XG4gICAgdGhpcy5ub3RpZnlBY3RpdmUuY29tcGxldGUoKTtcbiAgICB0aGlzLnNsaWNlcy5mb3JFYWNoKChzbGljZSkgPT4gc2xpY2UuZGVzdHJveSgpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUb2dnbGVzIHRoZSBlbnRpdHk6XG4gICAqXG4gICAqIElmIHRoZSBzdG9yZSBjb250YWlucyB0aGUgZW50aXR5XG4gICAqIGl0IHdpbGwgYmUgZGVsZXRlZC4gIElmIHRoZSBzdG9yZVxuICAgKiBkb2VzIG5vdCBjb250YWlucyB0aGUgZW50aXR5LFxuICAgKiBpdCBpcyBhZGRlZC5cbiAgICogQHBhcmFtIGUgVGhlIGVudGl0eSB0byB0b2dnbGVcbiAgICogQGV4YW1wbGUgVG9nZ2xlIHRoZSBUb2RvIGluc3RhbmNlXG4gICAqIGBgYFxuICAgKiBlc3RvcmUucG9zdCh0b2RvKTtcbiAgICogLy8gUmVtb3ZlIHRvZG9cbiAgICogZXN0b3JlLnRvZ2dsZSh0b2RvKTtcbiAgICogLy8gQWRkIGl0IGJhY2tcbiAgICogZXN0b3JlLnRvZ2dsZSh0b2RvKTtcbiAgICogYGBgXG4gICAqL1xuICBwdWJsaWMgdG9nZ2xlKGU6IEUpIHtcbiAgICBpZiAodGhpcy5jb250YWlucyhlKSkge1xuICAgICAgdGhpcy5kZWxldGUoZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMucG9zdChlKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogTm90aWZpZXMgb2JzZXJ2ZXJzIHdoZW4gdGhlIHN0b3JlIGlzIGVtcHR5LlxuICAgKi9cbiAgcHJpdmF0ZSBub3RpZnlBY3RpdmUgPSBuZXcgUmVwbGF5U3ViamVjdDxNYXA8c3RyaW5nLCBFPj4oMSk7XG5cbiAgLyoqXG4gICAqIGBNYXBgIG9mIGFjdGl2ZSBlbnR0aWVzLiBUaGUgaW5zdGFuY2UgaXMgcHVibGljIGFuZCBjYW4gYmUgdXNlZFxuICAgKiBkaXJlY3RseSB0byBhZGQgYW5kIHJlbW92ZSBhY3RpdmUgZW50aXRpZXMsIGhvd2V2ZXIgd2UgcmVjb21tZW5kXG4gICAqIHVzaW5nIHRoZSB7QGxpbmsgYWRkQWN0aXZlfSBhbmQge0BsaW5rIGRlbGV0ZUFjdGl2ZX0gbWV0aG9kcy5cbiAgICovXG4gIHB1YmxpYyBhY3RpdmU6IE1hcDxzdHJpbmcsIEU+ID0gbmV3IE1hcCgpO1xuXG4gIC8qKlxuICAgKiBBZGQgbXVsdGlwbGUgZW50aXR5IGVudGl0aWVzIHRvIGFjdGl2ZS5cbiAgICpcbiAgICogSWYgdGhlIGVudGl0eSBpcyBub3QgY29udGFpbmVkIGluIHRoZSBzdG9yZSBpdCBpcyBhZGRlZFxuICAgKiB0byB0aGUgc3RvcmUgYmVmb3JlIGl0IGlzIGFkZGVkIHRvIGBhY3RpdmVgLlxuICAgKlxuICAgKiBBbHNvIHdlIGNsb25lIHRoZSBtYXAgcHJpb3IgdG8gYnJvYWRjYXN0aW5nIGl0IHdpdGhcbiAgICogYG5vdGlmeUFjdGl2ZWAgdG8gbWFrZSBzdXJlIHdlIHdpbGwgdHJpZ2dlciBBbmd1bGFyXG4gICAqIGNoYW5nZSBkZXRlY3Rpb24gaW4gdGhlIGV2ZW50IHRoYXQgaXQgbWFpbnRhaW5zXG4gICAqIGEgcmVmZXJlbmNlIHRvIHRoZSBgYWN0aXZlYCBzdGF0ZSBgTWFwYCBpbnN0YW5jZS5cbiAgICpcbiAgICogQGV4YW1wbGUgQWRkIHRvZG8xIGFuZCB0b2RvMiBhcyBhY3RpdmVcbiAgICogYGBgXG4gICAqIGFkZEFjdGl2ZSh0b2RvMSk7XG4gICAqIGFkZEFjdGl2ZSh0b2RvMik7XG4gICAqIGBgYFxuICAgKi9cbiAgcHVibGljIGFkZEFjdGl2ZShlOiBFKSB7XG4gICAgaWYgKHRoaXMuY29udGFpbnMoZSkpIHtcbiAgICAgIHRoaXMuYWN0aXZlLnNldCgoPGFueT5lKS5naWQsIGUpO1xuICAgICAgdGhpcy5ub3RpZnlBY3RpdmUubmV4dChuZXcgTWFwKHRoaXMuYWN0aXZlKSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMucG9zdChlKTtcbiAgICAgIHRoaXMuYWN0aXZlLnNldCgoPGFueT5lKS5naWQsIGUpO1xuICAgICAgdGhpcy5ub3RpZnlBY3RpdmUubmV4dChuZXcgTWFwKHRoaXMuYWN0aXZlKSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIERlbGV0ZSBhbiBhY3RpdmUgZW50aXR5LlxuICAgKlxuICAgKiBBbHNvIHdlIGNsb25lIHRoZSBtYXAgcHJpb3IgdG8gYnJvYWRjYXN0aW5nIGl0IHdpdGhcbiAgICogYG5vdGlmeUFjdGl2ZWAgdG8gbWFrZSBzdXJlIHdlIHdpbGwgdHJpZ2dlciBBbmd1bGFyXG4gICAqIGNoYW5nZSBkZXRlY3Rpb24gaW4gdGhlIGV2ZW50IHRoYXQgaXQgbWFpbnRhaW5zXG4gICAqIGEgcmVmZXJlbmNlIHRvIHRoZSBgYWN0aXZlYCBzdGF0ZSBgTWFwYCBpbnN0YW5jZS5cbiAgICpcbiAgICogQGV4YW1wbGUgUmVtb3ZlIHRvZG8xIGFuZCB0b2RvMiBhcyBhY3RpdmUgZW50aXRpZXNcbiAgICogYGBgXG4gICAqIGRlbGV0ZUFjdGl2ZSh0b2RvMSk7XG4gICAqIGRlbGV0ZUFjdGl2ZSh0b2RvMik7XG4gICAqIGBgYFxuICAgKi9cbiAgcHVibGljIGRlbGV0ZUFjdGl2ZShlOiBFKSB7XG4gICAgdGhpcy5hY3RpdmUuZGVsZXRlKCg8YW55PmUpLmdpZCk7XG4gICAgdGhpcy5ub3RpZnlBY3RpdmUubmV4dChuZXcgTWFwKHRoaXMuYWN0aXZlKSk7XG4gIH1cblxuICAvKipcbiAgICogQ2xlYXIgLyByZXNldCB0aGUgYWN0aXZlIGVudGl0eSBtYXAuXG4gICAqXG4gICAqIEFsc28gd2UgY2xvbmUgdGhlIG1hcCBwcmlvciB0byBicm9hZGNhc3RpbmcgaXQgd2l0aFxuICAgKiBgbm90aWZ5QWN0aXZlYCB0byBtYWtlIHN1cmUgd2Ugd2lsbCB0cmlnZ2VyIEFuZ3VsYXJcbiAgICogY2hhbmdlIGRldGVjdGlvbiBpbiB0aGUgZXZlbnQgdGhhdCBpdCBtYWludGFpbnNcbiAgICogYSByZWZlcmVuY2UgdG8gdGhlIGBhY3RpdmVgIHN0YXRlIGBNYXBgIGluc3RhbmNlLlxuICAgKlxuICAgKiBAZXhhbXBsZSBDbGVhciBhY3RpdmUgdG9kbyBpbnN0YW5jZXNcbiAgICogYGBgXG4gICAqIHN0b3JlLmNsZWFyQWN0aXZlKCk7XG4gICAqIGBgYFxuICAgKi9cbiAgY2xlYXJBY3RpdmUoKSB7XG4gICAgdGhpcy5hY3RpdmUuY2xlYXIoKTtcbiAgICB0aGlzLm5vdGlmeUFjdGl2ZS5uZXh0KG5ldyBNYXAodGhpcy5hY3RpdmUpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBPYnNlcnZlIHRoZSBhY3RpdmUgZW50aXRpZXMuXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGBgYFxuICAgKiBsZXQgYWN0aXZlJCA9IHN0b3JlLm9ic2VydmVBY3RpdmUoKTtcbiAgICogYGBgXG4gICAqL1xuICBwdWJsaWMgb2JzZXJ2ZUFjdGl2ZSgpIHtcbiAgICByZXR1cm4gdGhpcy5ub3RpZnlBY3RpdmUuYXNPYnNlcnZhYmxlKCk7XG4gIH1cblxuICAvKipcbiAgICogT2JzZXJ2ZSB0aGUgYWN0aXZlIGVudGl0eS5cbiAgICogQGV4YW1wbGVcbiAgICAgPHByZT5cbiAgICBsZXQgYWN0aXZlJCA9IHNvdXJjZS5hY3RpdmVTbmFwc2hvdCgpO1xuICAgIDwvcHJlPlxuICAqL1xuICBwdWJsaWMgYWN0aXZlU25hcHNob3QoKSB7XG4gICAgcmV0dXJuIEFycmF5LmZyb20odGhpcy5hY3RpdmUudmFsdWVzKCkpO1xuICB9XG5cbiAgLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gTE9BRElOR1xuICAvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gIC8qKlxuICAgKiBPYnNlcnZhYmxlIG9mIGVycm9ycyBvY2N1cnJlZCBkdXJpbmcgYSBsb2FkIHJlcXVlc3QuXG4gICAqXG4gICAqIFRoZSBlcnJvciBPYnNlcnZhYmxlIHNob3VsZCBiZSBjcmVhdGVkIGJ5IHRoZVxuICAgKiBjbGllbnQuXG4gICAqL1xuICBwdWJsaWMgbG9hZGluZ0Vycm9yITogT2JzZXJ2YWJsZTxhbnk+O1xuXG4gIC8qKlxuICAgKiBOb3RpZmllcyBvYnNlcnZlcnMgd2hlbiB0aGUgc3RvcmUgaXMgbG9hZGluZy5cbiAgICpcbiAgICogVGhpcyBpcyBhIGNvbW1vbiBwYXR0ZXJuIGZvdW5kIHdoZW4gaW1wbGVtZW50aW5nXG4gICAqIGBPYnNlcnZhYmxlYCBkYXRhIHNvdXJjZXMuXG4gICAqL1xuICBwcml2YXRlIG5vdGlmeUxvYWRpbmcgPSBuZXcgUmVwbGF5U3ViamVjdDxib29sZWFuPigxKTtcblxuICAvKipcbiAgICogVGhlIGN1cnJlbnQgbG9hZGluZyBzdGF0ZS4gIFVzZSBsb2FkaW5nIHdoZW4gZmV0Y2hpbmcgbmV3XG4gICAqIGRhdGEgZm9yIHRoZSBzdG9yZS4gIFRoZSBkZWZhdWx0IGxvYWRpbmcgc3RhdGUgaXMgYHRydWVgLlxuICAgKlxuICAgKiBUaGlzIGlzIHN1Y2ggdGhhdCBpZiBkYXRhIGlzIGZldGNoZWQgYXN5bmNocm9ub3VzbHlcbiAgICogaW4gYSBzZXJ2aWNlLCBjb21wb25lbnRzIGNhbiB3YWl0IG9uIGxvYWRpbmcgbm90aWZpY2F0aW9uXG4gICAqIGJlZm9yZSBhdHRlbXB0aW5nIHRvIHJldHJpZXZlIGRhdGEgZnJvbSB0aGUgc2VydmljZS5cbiAgICpcbiAgICogTG9hZGluZyBjb3VsZCBiZSBiYXNlZCBvbiBhIGNvbXBvc2l0ZSByZXNwb25zZS4gIEZvciBleGFtcGxlXG4gICAqIHdoZW4gdGhlIHN0b2NrIGFuZCBtdXR1YWwgZnVuZHMgaGF2ZSBsb2FkZWQsIHNldCBsb2FkaW5nIHRvIGBmYWxzZWAuXG4gICAqL1xuICBwcml2YXRlIF9sb2FkaW5nOiBib29sZWFuID0gdHJ1ZTtcblxuICAvKipcbiAgICogU2V0cyB0aGUgY3VycmVudCBsb2FkaW5nIHN0YXRlIGFuZCBub3RpZmllcyBvYnNlcnZlcnMuXG4gICAqL1xuICBzZXQgbG9hZGluZyhsb2FkaW5nOiBib29sZWFuKSB7XG4gICAgdGhpcy5fbG9hZGluZyA9IGxvYWRpbmc7XG4gICAgdGhpcy5ub3RpZnlMb2FkaW5nLm5leHQodGhpcy5fbG9hZGluZyk7XG4gIH1cblxuICAvKipcbiAgICogQHJldHVybiBBIHNuYXBzaG90IG9mIHRoZSBsb2FkaW5nIHN0YXRlLlxuICAgKiBAZXhhbXBsZSBDcmVhdGUgYSByZWZlcmVuY2UgdG8gdGhlIGxvYWRpbmcgc3RhdGVcbiAgICogYGBgXG4gICAqIGNvbnN0IGxvYWRpbmc6Ym9vbGVhbiA9IHRvZG9TdG9yZS5sb2FkaW5nO1xuICAgKiBgYGBcbiAgICovXG4gIGdldCBsb2FkaW5nKCkge1xuICAgIHJldHVybiB0aGlzLl9sb2FkaW5nO1xuICB9XG5cbiAgLyoqXG4gICAqIE9ic2VydmUgbG9hZGluZy5cbiAgICpcbiAgICogTm90ZSB0aGF0IHRoaXMgb2J2ZXJhYmxlIHBpcGVkIHRocm91Z2hcbiAgICogYHRha2VXaGlsZSh2LT52LCB0cnVlKSwgc3VjaCB0aGF0IGl0IHdpbGxcbiAgICogY29tcGxldGUgYWZ0ZXIgZWFjaCBlbWlzc2lvbi5cbiAgICpcbiAgICogU2VlOlxuICAgKiBodHRwczovL2ZpcmVmbHlzZW1hbnRpY3MubWVkaXVtLmNvbS93YWl0aW5nLW9uLWVzdG9yZS10by1sb2FkLThkY2JlMTYxNjEzY1xuICAgKlxuICAgKiBGb3IgbW9yZSBkZXRhaWxzLlxuICAgKiBBbHNvIG5vdGUgdGhhdCB2PT52IGlzIHRoZSBzYW1lIGFzIHY9PnYhPWZhbHNlXG4gICAqIFxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGBcbiAgICogY29uc3Qgb2JzZXJ2ZUxvYWRpbmdIYW5kbGVyOiBPYnNlcnZlcjxib29sZWFuPiA9IHtcbiAgICogICBjb21wbGV0ZTogKCkgPT4ge1xuICAgKiAgICAgY29uc29sZS5sb2coYERhdGEgTG9hZGVkIGFuZCBPYnNlcnZhYmxlIE1hcmtlZCBhcyBDb21wbGV0ZWApO1xuICAgKiAgIH0sIC8vIGNvbXBsZXRlSGFuZGxlclxuICAgKiAgIGVycm9yOiAoKSA9PiB7XG4gICAqICAgICBjb25zb2xlLmxvZyhgQW55IEVycm9ycz9gKTtcbiAgICogICB9LCAvLyBlcnJvckhhbmRsZXJcbiAgICogICBuZXh0OiAobCkgPT4ge1xuICAgKiAgICAgY29uc29sZS5sb2coYERhdGEgbG9hZGVkIGFuZCBsb2FkaW5nIGlzICR7bH1gKTtcbiAgICogICB9LFxuICAgKiB9O1xuICAgKlxuICAgKiBjb25zdCBvYnNlcnZlTG9hZGluZ1Jlc3Vic2NyaWJlSGFuZGxlcjogT2JzZXJ2ZXI8Ym9vbGVhbj4gPSB7XG4gICAqICAgY29tcGxldGU6ICgpID0+IHtcbiAgICogICAgIGNvbnNvbGUubG9nKGBEYXRhIExvYWRlZCBhbmQgUmVzdWJzY3JpYmUgT2JzZXJ2YWJsZSBNYXJrZWQgYXMgQ29tcGxldGVgKTtcbiAgICogICB9LCAvLyBjb21wbGV0ZUhhbmRsZXJcbiAgICogICBlcnJvcjogKCkgPT4ge1xuICAgKiAgICAgY29uc29sZS5sb2coYEFueSBSZXN1YnNjcmliZSBFcnJvcnM/YCk7XG4gICAqICAgfSwgLy8gZXJyb3JIYW5kbGVyXG4gICAqICAgbmV4dDogKGwpID0+IHtcbiAgICogICAgIGNvbnNvbGUubG9nKGBEYXRhIGxvYWRlZCBhbmQgcmVzdXNic2NyaWJlIGxvYWRpbmcgIHZhbHVlIGlzICR7bH1gKTtcbiAgICogICB9LFxuICAgKiB9O1xuICAgKlxuICAgKiBjb25zdCB0b2RvU3RvcmU6IEVTdG9yZTxUb2RvPiA9IG5ldyBFU3RvcmUoKTtcbiAgICogLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAgKiAvLyBMb2FkaW5nIGlzIHRydWUgYnkgZGVmYXVsdFxuICAgKiAvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gICAqIGNvbnNvbGUubG9nKGBUaGUgaW5pdGlhbCB2YWx1ZSBvZiBsb2FkaW5nIGlzICR7dG9kb1N0b3JlLmxvYWRpbmd9YCk7XG4gICAqIC8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgICogLy8gT2JzZXJ2ZSBMb2FkaW5nXG4gICAqIC8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgICogbGV0IGxvYWRpbmckOiBPYnNlcnZhYmxlPGJvb2xlYW4+ID0gdG9kb1N0b3JlLm9ic2VydmVMb2FkaW5nKCk7XG4gICAqIGxvYWRpbmckLnN1YnNjcmliZSgobCkgPT4gY29uc29sZS5sb2coYFRoZSB2YWx1ZSBvZiBsb2FkaW5nIGlzICR7bH1gKSk7XG4gICAqXG4gICAqIHRvZG9TdG9yZS5sb2FkaW5nID0gZmFsc2U7XG4gICAqIGxvYWRpbmckLnN1YnNjcmliZShvYnNlcnZlTG9hZGluZ0hhbmRsZXIpO1xuICAgKiAvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gICAqIC8vIFRoZSBzdWJzY3JpcHRpb24gbm8gbG9uZ2VyIGZpcmVzXG4gICAqIC8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgICogdG9kb1N0b3JlLmxvYWRpbmcgPSB0cnVlO1xuICAgKiB0b2RvU3RvcmUubG9hZGluZyA9IGZhbHNlO1xuICAgKlxuICAgKiAvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gICAqIC8vIFRoZSBzdWJzY3JpcHRpb24gbm8gbG9uZ2VyIGZpcmVzLFxuICAgKiAvLyBzbyBpZiB3ZSB3YW50IHRvIG9ic2VydmUgbG9hZGluZyBhZ2FpblxuICAgKiAvLyByZXN1c2JzY3JpYmUuXG4gICAqIC8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgICogdG9kb1N0b3JlLmxvYWRpbmcgPSB0cnVlO1xuICAgKiBsb2FkaW5nJCA9IHRvZG9TdG9yZS5vYnNlcnZlTG9hZGluZygpO1xuICAgKiBsb2FkaW5nJC5zdWJzY3JpYmUob2JzZXJ2ZUxvYWRpbmdSZXN1YnNjcmliZUhhbmRsZXIpO1xuICAgKiB0b2RvU3RvcmUubG9hZGluZyA9IGZhbHNlO1xuICAgKiBgYGBcbiAgICovXG4gIHB1YmxpYyBvYnNlcnZlTG9hZGluZygpIHtcbiAgICByZXR1cm4gdGhpcy5ub3RpZnlMb2FkaW5nLmFzT2JzZXJ2YWJsZSgpLnBpcGUodGFrZVdoaWxlKCh2KSA9PiB2LCB0cnVlKSk7XG4gIH1cblxuICAvKipcbiAgICogTm90ZmlpZXMgd2hlbiBsb2FkaW5nIGhhcyBjb21wbGV0ZWQuXG4gICAqL1xuICBwdWJsaWMgb2JzZXJ2ZUxvYWRpbmdDb21wbGV0ZSgpIHtcbiAgICByZXR1cm4gdGhpcy5vYnNlcnZlTG9hZGluZygpLnBpcGUoXG4gICAgICBmaWx0ZXIoKGxvYWRpbmcpID0+IGxvYWRpbmcgPT0gZmFsc2UpLFxuICAgICAgc3dpdGNoTWFwKCgpID0+IG9mKHRydWUpKVxuICAgICk7XG4gIH1cblxuICAvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBTRUFSQ0hJTkdcbiAgLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLyoqXG4gICAqIE9ic2VydmFibGUgb2YgZXJyb3JzIG9jY3VycmVkIGR1cmluZyBhIHNlYXJjaCByZXF1ZXN0LlxuICAgKlxuICAgKiBUaGUgZXJyb3IgT2JzZXJ2YWJsZSBzaG91bGQgYmUgY3JlYXRlZCBieSB0aGVcbiAgICogY2xpZW50LlxuICAgKi9cbiAgcHVibGljIHNlYXJjaEVycm9yITogT2JzZXJ2YWJsZTxhbnk+O1xuXG4gIC8qKlxuICAgKiBOb3RpZmllcyBvYnNlcnZlcnMgdGhhdCBhIHNlYXJjaCBpcyBpbiBwcm9ncmVzcy5cbiAgICpcbiAgICogVGhpcyBpcyBhIGNvbW1vbiBwYXR0ZXJuIGZvdW5kIHdoZW4gaW1wbGVtZW50aW5nXG4gICAqIGBPYnNlcnZhYmxlYCBkYXRhIHNvdXJjZXMuXG4gICAqL1xuICBwcml2YXRlIG5vdGlmeVNlYXJjaGluZyA9IG5ldyBSZXBsYXlTdWJqZWN0PGJvb2xlYW4+KDEpO1xuXG4gIC8qKlxuICAgKiBUaGUgY3VycmVudCBgc2VhcmNoaW5nYCBzdGF0ZS4gIFVzZSBgc2VhcmNoaW5nYFxuICAgKiBmb3IgZXhhbXBsZSB0byBkaXNwbGF5IGEgc3Bpbm5uZXJcbiAgICogd2hlbiBwZXJmb3JtaW5nIGEgc2VhcmNoLlxuICAgKiBUaGUgZGVmYXVsdCBgc2VhcmNoaW5nYCBzdGF0ZSBpcyBgZmFsc2VgLlxuICAgKi9cbiAgcHJpdmF0ZSBfc2VhcmNoaW5nOiBib29sZWFuID0gZmFsc2U7XG5cbiAgLyoqXG4gICAqIFNldHMgdGhlIGN1cnJlbnQgc2VhcmNoaW5nIHN0YXRlIGFuZCBub3RpZmllcyBvYnNlcnZlcnMuXG4gICAqL1xuICBzZXQgc2VhcmNoaW5nKHNlYXJjaGluZzogYm9vbGVhbikge1xuICAgIHRoaXMuX3NlYXJjaGluZyA9IHNlYXJjaGluZztcbiAgICB0aGlzLm5vdGlmeVNlYXJjaGluZy5uZXh0KHRoaXMuX3NlYXJjaGluZyk7XG4gIH1cblxuICAvKipcbiAgICogQHJldHVybiBBIHNuYXBzaG90IG9mIHRoZSBzZWFyY2hpbmcgc3RhdGUuXG4gICAqL1xuICBnZXQgc2VhcmNoaW5nKCkge1xuICAgIHJldHVybiB0aGlzLl9zZWFyY2hpbmc7XG4gIH1cblxuICAvKipcbiAgICogT2JzZXJ2ZSBzZWFyY2hpbmcuXG4gICAqIEBleGFtcGxlXG4gICAgIDxwcmU+XG4gICAgbGV0IHNlYXJjaGluZyQgPSBzb3VyY2Uub2JzZXJ2ZVNlYXJjaGluZygpO1xuICAgIDwvcHJlPlxuICBcbiAgICBOb3RlIHRoYXQgdGhpcyBvYnZlcmFibGUgcGlwZWQgdGhyb3VnaFxuICAgIGB0YWtlV2hpbGUodi0+diwgdHJ1ZSksIHN1Y2ggdGhhdCBpdCB3aWxsIFxuICAgIGNvbXBsZXRlIGFmdGVyIGVhY2ggZW1pc3Npb24uXG4gIFxuICAgIFNlZTpcbiAgICBodHRwczovL21lZGl1bS5jb20vQG9sZS5lcnNveS93YWl0aW5nLW9uLWVzdG9yZS10by1sb2FkLThkY2JlMTYxNjEzY1xuICBcbiAgICBGb3IgbW9yZSBkZXRhaWxzLlxuICAqL1xuICBwdWJsaWMgb2JzZXJ2ZVNlYXJjaGluZygpOiBPYnNlcnZhYmxlPGJvb2xlYW4+IHtcbiAgICByZXR1cm4gdGhpcy5ub3RpZnlTZWFyY2hpbmcuYXNPYnNlcnZhYmxlKCkucGlwZSh0YWtlV2hpbGUoKHYpID0+IHYsIHRydWUpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBOb3RmaWllcyB3aGVuIHNlYXJjaGluZyBoYXMgY29tcGxldGVkLlxuICAgKi9cbiAgcHVibGljIG9ic2VydmVTZWFyY2hpbmdDb21wbGV0ZSgpOiBPYnNlcnZhYmxlPGJvb2xlYW4+IHtcbiAgICByZXR1cm4gdGhpcy5vYnNlcnZlU2VhcmNoaW5nKCkucGlwZShcbiAgICAgIGZpbHRlcigoc2VhcmNoaW5nKSA9PiBzZWFyY2hpbmcgPT0gZmFsc2UpLFxuICAgICAgc3dpdGNoTWFwKCgpID0+IG9mKHRydWUpKVxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogU3RvcmUgc2xpY2VzXG4gICAqL1xuICBwcml2YXRlIHNsaWNlczogTWFwPHN0cmluZywgU2xpY2U8RT4+ID0gbmV3IE1hcCgpO1xuXG4gIC8qKlxuICAgKiBBZGRzIGEgc2xpY2UgdG8gdGhlIHN0b3JlIGFuZCBrZXlzIGl0IGJ5IHRoZSBzbGljZXMgbGFiZWwuXG4gICAqXG4gICAqIEBwYXJhbSBwXG4gICAqIEBwYXJhbSBsYWJlbFxuICAgKiBcbiAgICogQGV4YW1wbGUgU2V0dXAgYSBUb2RvIFNsaWNlIGZvciBDT01QTEVURSBUb2Rvc1xuYGBgXG5zb3VyY2UuYWRkU2xpY2UodG9kbyA9PiB0b2RvLmNvbXBsZXRlLCBUb2RvU2xpY2VzLkNPTVBMRVRFKTtcbmBgYFxuICAgKi9cbiAgYWRkU2xpY2UocDogUHJlZGljYXRlPEU+LCBsYWJlbDogc3RyaW5nKSB7XG4gICAgY29uc3Qgc2xpY2U6IFNsaWNlPEU+ID0gbmV3IFNsaWNlKGxhYmVsLCBwLCB0aGlzKTtcbiAgICB0aGlzLnNsaWNlcy5zZXQoc2xpY2UubGFiZWwsIHNsaWNlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZW1vdmUgYSBzbGljZVxuICAgKiBAcGFyYW0gbGFiZWwgVGhlIGxhYmVsIGlkZW50aWZ5aW5nIHRoZSBzbGljZVxuICAgKiBcbiAgICogQGV4YW1wbGUgUmVtb3ZlIHRoZSBUb2RvU2xpY2VzLkNPTVBMRVRFIFNsaWNlXG5gYGBcbnNvdXJjZS5yZW1vdmVTbGljZShUb2RvU2xpY2VzLkNPTVBMRVRFKTtcbmBgYFxuICAgKi9cbiAgcmVtb3ZlU2xpY2UobGFiZWw6IHN0cmluZykge1xuICAgIHRoaXMuc2xpY2VzLmRlbGV0ZShsYWJlbCk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IGEgc2xpY2VcbiAgICogQHBhcmFtIGxhYmVsIFRoZSBsYWJlbCBpZGVudGlmeWluZyB0aGUgc2xpY2VcbiAgICogQHJldHVybiBUaGUgU2xpY2UgaW5zdGFuY2Ugb3IgdW5kZWZpbmVkIFxuICAgKiBcbiAgICogQGV4YW1wbGUgR2V0IHRoZSBUb2RvU2xpY2VzLkNPTVBMRVRFIHNsaWNlXG5gYGBcbnNvdXJjZS5nZXRTbGljZShUb2RvU2xpY2VzLkNPTVBMRVRFKTtcbmBgYFxuICAgKi9cbiAgZ2V0U2xpY2UobGFiZWw6IHN0cmluZyk6IFNsaWNlPEU+IHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5zbGljZXMuZ2V0KGxhYmVsKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBQb3N0IChBZGQgYSBuZXcpIGVsZW1lbnQocykgdG8gdGhlIHN0b3JlLlxuICAgKiBAcGFyYW0gZSBBbiBpbmRpaWR1YWwgZW50aXR5IG9yIGFuIGFycmF5IG9mIGVudGl0aWVzXG4gICAqIEBleGFtcGxlIFBvc3QgYSBUb2RvIGluc3RhbmNlLlxuICAgKlxuICAgKmBgYFxuICAgKiBzdG9yZS5wb3N0KHRvZG8pO1xuICAgKmBgYFxuICAgKi9cbiAgcG9zdChlOiBFIHwgRVtdKSB7XG4gICAgaWYgKCFBcnJheS5pc0FycmF5KGUpKSB7XG4gICAgICBjb25zdCBndWlkOiBzdHJpbmcgPSAoPGFueT5lKVt0aGlzLkdVSURfS0VZXVxuICAgICAgICA/ICg8YW55PmUpW3RoaXMuR1VJRF9LRVldXG4gICAgICAgIDogR1VJRCgpO1xuICAgICAgKDxhbnk+ZSlbdGhpcy5HVUlEX0tFWV0gPSBndWlkO1xuICAgICAgdGhpcy5lbnRyaWVzLnNldChndWlkLCBlKTtcbiAgICAgIHRoaXMudXBkYXRlSURFbnRyeShlKTtcbiAgICAgIEFycmF5LmZyb20odGhpcy5zbGljZXMudmFsdWVzKCkpLmZvckVhY2goKHMpID0+IHtcbiAgICAgICAgcy5wb3N0KGUpO1xuICAgICAgfSk7XG4gICAgICAvL0NyZWF0ZSBhIG5ldyBhcnJheSByZWZlcmVuY2UgdG8gdHJpZ2dlciBBbmd1bGFyIGNoYW5nZSBkZXRlY3Rpb24uXG4gICAgICBsZXQgdjogRVtdID0gWy4uLkFycmF5LmZyb20odGhpcy5lbnRyaWVzLnZhbHVlcygpKV07XG4gICAgICBjb25zdCBkZWx0YTogRGVsdGE8RT4gPSB7IHR5cGU6IEFjdGlvblR5cGVzLlBPU1QsIGVudHJpZXM6IFtlXSB9O1xuICAgICAgdGhpcy5ub3RpZnlBbGwodiwgZGVsdGEpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnBvc3RBKGUpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBQb3N0IE4gZW50aXRpZXMgdG8gdGhlIHN0b3JlLlxuICAgKiBAcGFyYW0gLi4uZVxuICAgKiBAZXhhbXBsZSBQb3N0IHR3byBUb2RvIGluc3RhbmNlcy5cbiAgICogYGBgXG4gICAqIHN0b3JlLnBvc3QodG9kbzEsIHRvZG8yKTtcbiAgICogYGBgXG4gICAqL1xuICBwb3N0TiguLi5lOiBFW10pIHtcbiAgICBlLmZvckVhY2goKGUpID0+IHtcbiAgICAgIGNvbnN0IGd1aWQ6IHN0cmluZyA9ICg8YW55PmUpW3RoaXMuR1VJRF9LRVldXG4gICAgICAgID8gKDxhbnk+ZSlbdGhpcy5HVUlEX0tFWV1cbiAgICAgICAgOiBHVUlEKCk7XG4gICAgICAoPGFueT5lKVt0aGlzLkdVSURfS0VZXSA9IGd1aWQ7XG4gICAgICB0aGlzLmVudHJpZXMuc2V0KGd1aWQsIGUpO1xuICAgICAgdGhpcy51cGRhdGVJREVudHJ5KGUpO1xuICAgIH0pO1xuICAgIEFycmF5LmZyb20odGhpcy5zbGljZXMudmFsdWVzKCkpLmZvckVhY2goKHMpID0+IHtcbiAgICAgIHMucG9zdEEoZSk7XG4gICAgfSk7XG4gICAgLy9DcmVhdGUgYSBuZXcgYXJyYXkgcmVmZXJlbmNlIHRvIHRyaWdnZXIgQW5ndWxhciBjaGFuZ2UgZGV0ZWN0aW9uLlxuICAgIGxldCB2OiBFW10gPSBbLi4uQXJyYXkuZnJvbSh0aGlzLmVudHJpZXMudmFsdWVzKCkpXTtcbiAgICBjb25zdCBkZWx0YTogRGVsdGE8RT4gPSB7IHR5cGU6IEFjdGlvblR5cGVzLlBPU1QsIGVudHJpZXM6IGUgfTtcbiAgICB0aGlzLm5vdGlmeUFsbCh2LCBkZWx0YSk7XG4gIH1cblxuICAvKipcbiAgICogUG9zdCAoQWRkKSBhbiBhcnJheSBvZiBlbGVtZW50cyB0byB0aGUgc3RvcmUuXG4gICAqIEBwYXJhbSBlXG4gICAqIEBleGFtcGxlIFBvc3QgYSBUb2RvIGFycmF5LlxuICAgKlxuICAgKiBgYGBcbiAgICogc3RvcmUucG9zdChbdG9kbzEsIHRvZG8yXSk7XG4gICAqIGBgYFxuICAgKi9cbiAgcG9zdEEoZTogRVtdKSB7XG4gICAgdGhpcy5wb3N0TiguLi5lKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBQdXQgKFVwZGF0ZSkgYW4gZW50aXR5LlxuICAgKiBAcGFyYW0gZVxuICAgKiBAZXhhbXBsZSBQdXQgYSBUb2RvIGluc3RhbmNlLlxuICAgKiBgYGBcbiAgICogc3RvcmUucHV0KHRvZG8xKTtcbiAgICogYGBgXG4gICAqL1xuICBwdXQoZTogRSB8IEVbXSkge1xuICAgIGlmICghQXJyYXkuaXNBcnJheShlKSkge1xuICAgICAgbGV0IGlkOiBzdHJpbmcgPSAoPGFueT5lKVt0aGlzLkdVSURfS0VZXTtcbiAgICAgIHRoaXMuZW50cmllcy5zZXQoaWQsIGUpO1xuICAgICAgdGhpcy51cGRhdGVJREVudHJ5KGUpO1xuICAgICAgbGV0IHY6IEVbXSA9IFsuLi5BcnJheS5mcm9tKHRoaXMuZW50cmllcy52YWx1ZXMoKSldO1xuICAgICAgdGhpcy5ub3RpZnkubmV4dCh2KTtcbiAgICAgIGNvbnN0IGRlbHRhOiBEZWx0YTxFPiA9IHsgdHlwZTogQWN0aW9uVHlwZXMuUFVULCBlbnRyaWVzOiBbZV0gfTtcbiAgICAgIHRoaXMubm90aWZ5RGVsdGEubmV4dChkZWx0YSk7XG4gICAgICBBcnJheS5mcm9tKHRoaXMuc2xpY2VzLnZhbHVlcygpKS5mb3JFYWNoKChzKSA9PiB7XG4gICAgICAgIHMucHV0KGUpO1xuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMucHV0QShlKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUHV0IChVcGRhdGUpIGFuIGVsZW1lbnQgb3IgYWRkIGFuIGVsZW1lbnQgdGhhdCB3YXMgcmVhZCBmcm9tIGEgcGVyc2lzdGVuY2Ugc291cmNlXG4gICAqIGFuZCB0aHVzIGFscmVhZHkgaGFzIGFuIGFzc2lnbmVkIGdsb2JhbCBpZGAuXG4gICAqIEBwYXJhbSBlIFRoZSBlbmV0aXR5IGluc3RhbmNlcyB0byB1cGRhdGUuXG4gICAqIEBleGFtcGxlIFB1dCBOIFRvZG8gaW5zdGFuY2VzLlxuICAgKlxuICAgKiBgYGBcbiAgICogc3RvcmUucHV0KHRvZG8xLCB0b2RvMik7XG4gICAqIGBgYFxuICAgKi9cbiAgcHV0TiguLi5lOiBFW10pIHtcbiAgICB0aGlzLnB1dEEoZSk7XG4gIH1cblxuICAvKipcbiAgICogUHV0IChVcGRhdGUpIHRoZSBhcnJheSBvZiBlbm50aXRpZXMuXG4gICAqIEBwYXJhbSBlIFRoZSBhcnJheSBvZiBlbm50aXRpZXMgdG8gdXBkYXRlXG4gICAqIEBleGFtcGxlIFB1dCBhbiBhcnJheSBvZiBUb2RvIGluc3RhbmNlcy5cbiAgICogYGBgXG4gICAqIHN0b3JlLnB1dChbdG9kbzEsIHRvZG8yXSk7XG4gICAqIGBgYFxuICAgKi9cbiAgcHV0QShlOiBFW10pIHtcbiAgICBlLmZvckVhY2goKGUpID0+IHtcbiAgICAgIGxldCBndWlkOiBzdHJpbmcgPSAoPGFueT5lKVt0aGlzLkdVSURfS0VZXTtcbiAgICAgIHRoaXMuZW50cmllcy5zZXQoZ3VpZCwgZSk7XG4gICAgICB0aGlzLnVwZGF0ZUlERW50cnkoZSk7XG4gICAgfSk7XG4gICAgLy9DcmVhdGUgYSBuZXcgYXJyYXkgcmVmZXJlbmNlIHRvIHRyaWdnZXIgQW5ndWxhciBjaGFuZ2UgZGV0ZWN0aW9uLlxuICAgIGxldCB2OiBFW10gPSBbLi4uQXJyYXkuZnJvbSh0aGlzLmVudHJpZXMudmFsdWVzKCkpXTtcbiAgICB0aGlzLm5vdGlmeS5uZXh0KHYpO1xuICAgIGNvbnN0IGRlbHRhOiBEZWx0YTxFPiA9IHsgdHlwZTogQWN0aW9uVHlwZXMuUFVULCBlbnRyaWVzOiBlIH07XG4gICAgdGhpcy5ub3RpZnlEZWx0YS5uZXh0KGRlbHRhKTtcbiAgICBBcnJheS5mcm9tKHRoaXMuc2xpY2VzLnZhbHVlcygpKS5mb3JFYWNoKChzKSA9PiB7XG4gICAgICBzLnB1dEEoZSk7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogRGVsZXRlIChVcGRhdGUpIHRoZSBhcnJheSBvZiBlbGVtZW50cy5cbiAgICogQHBhcmFtIGVcbiAgICogQGV4YW1wbGUgRGVsZXRlIHRvZG8xLlxuICAgKiBgYGBcbiAgICogc3RvcmUuZGVsZXRlKHRvZG8xXSk7XG4gICAqIGBgYFxuICAgKi9cbiAgZGVsZXRlKGU6IEUgfCBFW10pIHtcbiAgICBpZiAoIUFycmF5LmlzQXJyYXkoZSkpIHtcbiAgICAgIHRoaXMuZGVsZXRlQWN0aXZlKGUpO1xuICAgICAgY29uc3QgZ3VpZCA9ICg8YW55PmUpW3RoaXMuR1VJRF9LRVldO1xuICAgICAgdGhpcy5lbnRyaWVzLmRlbGV0ZShndWlkKTtcbiAgICAgIHRoaXMuZGVsZXRlSURFbnRyeShlKTtcbiAgICAgIEFycmF5LmZyb20odGhpcy5zbGljZXMudmFsdWVzKCkpLmZvckVhY2goKHMpID0+IHtcbiAgICAgICAgcy5lbnRyaWVzLmRlbGV0ZShndWlkKTtcbiAgICAgIH0pO1xuICAgICAgLy9DcmVhdGUgYSBuZXcgYXJyYXkgcmVmZXJlbmNlIHRvIHRyaWdnZXIgQW5ndWxhciBjaGFuZ2UgZGV0ZWN0aW9uLlxuICAgICAgbGV0IHY6IEVbXSA9IFsuLi5BcnJheS5mcm9tKHRoaXMuZW50cmllcy52YWx1ZXMoKSldO1xuICAgICAgY29uc3QgZGVsdGE6IERlbHRhPEU+ID0geyB0eXBlOiBBY3Rpb25UeXBlcy5ERUxFVEUsIGVudHJpZXM6IFtlXSB9O1xuICAgICAgdGhpcy5ub3RpZnlBbGwodiwgZGVsdGEpO1xuICAgICAgQXJyYXkuZnJvbSh0aGlzLnNsaWNlcy52YWx1ZXMoKSkuZm9yRWFjaCgocykgPT4ge1xuICAgICAgICBzLmRlbGV0ZShlKTtcbiAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmRlbGV0ZUEoZSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIERlbGV0ZSBOIGVsZW1lbnRzLlxuICAgKiBAcGFyYW0gLi4uZVxuICAgKiBAZXhhbXBsZSBEZWxldGUgTiBUb2RvIGluc3RhbmNlIGFyZ3VtZW50LlxuICAgKiBgYGBcbiAgICogc3RvcmUuZGVsZXRlTih0b2RvMSwgdG9kbzIpO1xuICAgKiBgYGBcbiAgICovXG4gIGRlbGV0ZU4oLi4uZTogRVtdKSB7XG4gICAgdGhpcy5kZWxldGVBKGUpO1xuICB9XG5cbiAgLyoqXG4gICAqIERlbGV0ZSBhbiBhcnJheSBvZiBlbGVtZW50cy5cbiAgICogQHBhcmFtIGUgVGhlIGFycmF5IG9mIGluc3RhbmNlcyB0byBiZSBkZWxldGVkXG4gICAqIEBleGFtcGxlIERlbGV0ZSB0aGUgYXJyYXkgb2YgVG9kbyBpbnN0YW5jZXMuXG4gICAqIGBgYFxuICAgKiBzdG9yZS5kZWxldGVBKFt0b2RvMSwgdG9kbzJdKTtcbiAgICogYGBgXG4gICAqL1xuICBkZWxldGVBKGU6IEVbXSkge1xuICAgIGUuZm9yRWFjaCgoZSkgPT4ge1xuICAgICAgdGhpcy5kZWxldGVBY3RpdmUoZSk7XG4gICAgICBjb25zdCBndWlkID0gKDxhbnk+ZSlbdGhpcy5HVUlEX0tFWV07XG4gICAgICB0aGlzLmVudHJpZXMuZGVsZXRlKGd1aWQpO1xuICAgICAgdGhpcy5kZWxldGVJREVudHJ5KGUpO1xuICAgICAgQXJyYXkuZnJvbSh0aGlzLnNsaWNlcy52YWx1ZXMoKSkuZm9yRWFjaCgocykgPT4ge1xuICAgICAgICBzLmVudHJpZXMuZGVsZXRlKGd1aWQpO1xuICAgICAgfSk7XG4gICAgfSk7XG4gICAgLy9DcmVhdGUgYSBuZXcgYXJyYXkgcmVmZXJlbmNlIHRvIHRyaWdnZXIgQW5ndWxhciBjaGFuZ2UgZGV0ZWN0aW9uLlxuICAgIGxldCB2OiBFW10gPSBbLi4uQXJyYXkuZnJvbSh0aGlzLmVudHJpZXMudmFsdWVzKCkpXTtcbiAgICBjb25zdCBkZWx0YTogRGVsdGE8RT4gPSB7IHR5cGU6IEFjdGlvblR5cGVzLkRFTEVURSwgZW50cmllczogZSB9O1xuICAgIHRoaXMubm90aWZ5QWxsKHYsIGRlbHRhKTtcbiAgICBBcnJheS5mcm9tKHRoaXMuc2xpY2VzLnZhbHVlcygpKS5mb3JFYWNoKChzKSA9PiB7XG4gICAgICBzLmRlbGV0ZUEoZSk7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogRGVsZXRlIGVsZW1lbnRzIGJ5IHtAbGluayBQcmVkaWNhdGV9LlxuICAgKiBAcGFyYW0gcCBUaGUgcHJlZGljYXRlLlxuICAgKiBAZXhhbXBsZSBEZWxldGUgdGhlIFRvZG8gaW5zdGFuY2VzLlxuICAgKiBgYGBcbiAgICogc3RvcmUuZGVsZXRlKHRvZG8xLCB0b2RvMik7XG4gICAqIGBgYFxuICAgKi9cbiAgZGVsZXRlUChwOiBQcmVkaWNhdGU8RT4pIHtcbiAgICBjb25zdCBkOiBFW10gPSBbXTtcbiAgICBBcnJheS5mcm9tKHRoaXMuZW50cmllcy52YWx1ZXMoKSkuZm9yRWFjaCgoZSkgPT4ge1xuICAgICAgaWYgKHAoZSkpIHtcbiAgICAgICAgZC5wdXNoKGUpO1xuICAgICAgICBjb25zdCBpZCA9ICg8YW55PmUpW3RoaXMuR1VJRF9LRVldO1xuICAgICAgICB0aGlzLmVudHJpZXMuZGVsZXRlKGlkKTtcbiAgICAgICAgdGhpcy5kZWxldGVBY3RpdmUoZSk7XG4gICAgICAgIHRoaXMuZGVsZXRlSURFbnRyeShlKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICAvL0NyZWF0ZSBhIG5ldyBhcnJheSByZWZlcmVuY2UgdG8gdHJpZ2dlciBBbmd1bGFyIGNoYW5nZSBkZXRlY3Rpb24uXG4gICAgbGV0IHY6IEVbXSA9IFsuLi5BcnJheS5mcm9tKHRoaXMuZW50cmllcy52YWx1ZXMoKSldO1xuICAgIGNvbnN0IGRlbHRhOiBEZWx0YTxFPiA9IHsgdHlwZTogQWN0aW9uVHlwZXMuREVMRVRFLCBlbnRyaWVzOiBkIH07XG4gICAgdGhpcy5ub3RpZnlBbGwodiwgZGVsdGEpO1xuICAgIEFycmF5LmZyb20odGhpcy5zbGljZXMudmFsdWVzKCkpLmZvckVhY2goKHMpID0+IHtcbiAgICAgIHMuZGVsZXRlQShkKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJZiB0aGUgZW50aXR5IGhhcyB0aGUgYGlkYCBrZXkgaW5pdGlhbGl6ZWQgd2l0aCBhIHZhbHVlLFxuICAgKiB0aGVuIGFsc28gYWRkIHRoZSBlbnRpdHkgdG8gdGhlIGBpZEVudHJpZXNgLlxuICAgKlxuICAgKiBAcGFyYW0gZSBUaGUgZWxlbWVudCB0byBiZSBhZGRlZCB0byB0aGUgYGlkRW50cmllc2AuXG4gICAqL1xuICBwcml2YXRlIHVwZGF0ZUlERW50cnkoZTogRSkge1xuICAgIGlmICgoPGFueT5lKVt0aGlzLklEX0tFWV0pIHtcbiAgICAgIHRoaXMuaWRFbnRyaWVzLnNldCgoPGFueT5lKVt0aGlzLklEX0tFWV0sIGUpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBJZiB0aGUgZW50aXR5IGhhcyB0aGUgYGlkYCBrZXkgaW5pdGlhbGl6ZWQgd2l0aCBhIHZhbHVlLFxuICAgKiB0aGVuIGFsc28gZGVsZXRlIHRoZSBlbnRpdHkgdG8gdGhlIGBpZEVudHJpZXNgLlxuICAgKlxuICAgKiBAcGFyYW0gZSBUaGUgZWxlbWVudCB0byBiZSBhZGRlZCB0byB0aGUgYGlkRW50cmllc2AuXG4gICAqL1xuICBwcml2YXRlIGRlbGV0ZUlERW50cnkoZTogRSkge1xuICAgIGlmICgoPGFueT5lKVt0aGlzLklEX0tFWV0pIHtcbiAgICAgIHRoaXMuaWRFbnRyaWVzLmRlbGV0ZSgoPGFueT5lKVt0aGlzLklEX0tFWV0pO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSZXNldHMgdGhlIHN0b3JlIGFuZCBhbGwgY29udGFpbmVkIHNsaWNlIGluc3RhbmNlcyB0byBlbXB0eS5cbiAgICogQWxzbyBwZXJmb3JtIGRlbHRhIG5vdGlmaWNhdGlvbiB0aGF0IHNlbmRzIGFsbCBjdXJyZW50IHN0b3JlIGVudHJpZXMuXG4gICAqIFRoZSBBY3Rpb25UeXBlLlJFU0VUIGNvZGUgaXMgc2VudCB3aXRoIHRoZSBkZWx0YSBub3RpZmljYXRpb24uICBTbGljZXNcbiAgICogc2VuZCB0aGVpciBvd24gZGVsdGEgbm90aWZpY2F0aW9uLlxuICAgKlxuICAgKiBAZXhhbXBsZSBSZXNldCB0aGUgc3RvcmUuXG4gICAqIGBgYFxuICAgKiBzdG9yZS5yZXNldCgpO1xuICAgKiBgYGBcbiAgICovXG4gIHJlc2V0KCkge1xuICAgIGNvbnN0IGRlbHRhOiBEZWx0YTxFPiA9IHtcbiAgICAgIHR5cGU6IEFjdGlvblR5cGVzLlJFU0VULFxuICAgICAgZW50cmllczogQXJyYXkuZnJvbSh0aGlzLmVudHJpZXMudmFsdWVzKCkpLFxuICAgIH07XG4gICAgdGhpcy5ub3RpZnlBbGwoW10sIGRlbHRhKTtcbiAgICB0aGlzLmVudHJpZXMgPSBuZXcgTWFwKCk7XG4gICAgQXJyYXkuZnJvbSh0aGlzLnNsaWNlcy52YWx1ZXMoKSkuZm9yRWFjaCgocykgPT4ge1xuICAgICAgcy5yZXNldCgpO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIENhbGwgYWxsIHRoZSBub3RpZmllcnMgYXQgb25jZS5cbiAgICpcbiAgICogQHBhcmFtIHZcbiAgICogQHBhcmFtIGRlbHRhXG4gICAqL1xuICBwcm90ZWN0ZWQgb3ZlcnJpZGUgbm90aWZ5QWxsKHY6IEVbXSwgZGVsdGE6IERlbHRhPEU+KSB7XG4gICAgc3VwZXIubm90aWZ5QWxsKHYsIGRlbHRhKTtcbiAgICB0aGlzLm5vdGlmeUxvYWRpbmcubmV4dCh0aGlzLmxvYWRpbmcpO1xuICB9XG59XG4iXX0=