@textbus/collaborate 2.0.0-alpha.75 → 2.0.0-alpha.77

Sign up to get free protection for your applications and to get access to all the features.
@@ -1,3 +1 @@
1
1
  export * from './collaborate-cursor';
2
- export * from './local-to-remote';
3
- export * from './remote-to-local';
@@ -1,4 +1,2 @@
1
1
  export * from './collaborate-cursor';
2
- export * from './local-to-remote';
3
- export * from './remote-to-local';
4
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiX2FwaS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9jb2xsYWIvX2FwaS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxjQUFjLHNCQUFzQixDQUFBO0FBQ3BDLGNBQWMsbUJBQW1CLENBQUE7QUFDakMsY0FBYyxtQkFBbUIsQ0FBQSIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCAqIGZyb20gJy4vY29sbGFib3JhdGUtY3Vyc29yJ1xuZXhwb3J0ICogZnJvbSAnLi9sb2NhbC10by1yZW1vdGUnXG5leHBvcnQgKiBmcm9tICcuL3JlbW90ZS10by1sb2NhbCdcbiJdfQ==
2
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiX2FwaS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9jb2xsYWIvX2FwaS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxjQUFjLHNCQUFzQixDQUFBIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0ICogZnJvbSAnLi9jb2xsYWJvcmF0ZS1jdXJzb3InXG4iXX0=
@@ -18,15 +18,13 @@ export declare class Collaborate implements History {
18
18
  onPush: Observable<void>;
19
19
  get canBack(): boolean;
20
20
  get canForward(): boolean;
21
- private localToRemote;
22
- private remoteToLocal;
23
21
  private backEvent;
24
22
  private forwardEvent;
25
23
  private changeEvent;
26
24
  private pushEvent;
27
25
  private manager;
28
26
  private subscriptions;
29
- private updateFromSelf;
27
+ private updateFromRemote;
30
28
  private selectionChangeEvent;
31
29
  constructor(rootComponentRef: RootComponentRef, collaborateCursor: CollaborateCursor, translator: Translator, renderer: Renderer, registry: Registry, selection: Selection, starter: Starter);
32
30
  setup(): void;
@@ -36,4 +34,14 @@ export declare class Collaborate implements History {
36
34
  forward(): void;
37
35
  destroy(): void;
38
36
  private listen2;
37
+ private syncContent;
38
+ private syncSlot;
39
+ private syncSlots;
40
+ private syncComponent;
41
+ private runLocalUpdate;
42
+ private runRemoteUpdate;
43
+ private createSharedComponentByComponent;
44
+ private createSharedSlotBySlot;
45
+ private createComponentBySharedComponent;
46
+ private createSlotBySharedSlot;
39
47
  }
@@ -8,12 +8,11 @@ var __metadata = (this && this.__metadata) || function (k, v) {
8
8
  if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
9
9
  };
10
10
  import { Injectable } from '@tanbo/di';
11
- import { filter, microTask, Subject } from '@tanbo/stream';
12
- import { RootComponentRef, Starter, Translator, Registry, Selection, Renderer } from '@textbus/core';
13
- import { Doc as YDoc, UndoManager } from 'yjs';
14
- import { LocalToRemote } from './collab/local-to-remote';
15
- import { RemoteToLocal } from './collab/remote-to-local';
11
+ import { merge, microTask, Subject } from '@tanbo/stream';
12
+ import { RootComponentRef, Starter, Translator, Registry, Selection, Renderer, Slot, makeError } from '@textbus/core';
13
+ import { Doc as YDoc, Map as YMap, Text as YText, Array as YArray, UndoManager } from 'yjs';
16
14
  import { CollaborateCursor } from './collab/_api';
15
+ const collaborateErrorFn = makeError('Collaborate');
17
16
  let Collaborate = class Collaborate {
18
17
  constructor(rootComponentRef, collaborateCursor, translator, renderer, registry, selection, starter) {
19
18
  Object.defineProperty(this, "rootComponentRef", {
@@ -94,18 +93,6 @@ let Collaborate = class Collaborate {
94
93
  writable: true,
95
94
  value: void 0
96
95
  });
97
- Object.defineProperty(this, "localToRemote", {
98
- enumerable: true,
99
- configurable: true,
100
- writable: true,
101
- value: new LocalToRemote()
102
- });
103
- Object.defineProperty(this, "remoteToLocal", {
104
- enumerable: true,
105
- configurable: true,
106
- writable: true,
107
- value: new RemoteToLocal(this.yDoc, this.translator, this.selection, this.registry)
108
- });
109
96
  Object.defineProperty(this, "backEvent", {
110
97
  enumerable: true,
111
98
  configurable: true,
@@ -142,11 +129,11 @@ let Collaborate = class Collaborate {
142
129
  writable: true,
143
130
  value: []
144
131
  });
145
- Object.defineProperty(this, "updateFromSelf", {
132
+ Object.defineProperty(this, "updateFromRemote", {
146
133
  enumerable: true,
147
134
  configurable: true,
148
135
  writable: true,
149
- value: true
136
+ value: false
150
137
  });
151
138
  Object.defineProperty(this, "selectionChangeEvent", {
152
139
  enumerable: true,
@@ -201,28 +188,311 @@ let Collaborate = class Collaborate {
201
188
  this.manager = new UndoManager(root, {
202
189
  trackedOrigins: new Set([this.yDoc])
203
190
  });
204
- root.observeDeep((events, transaction) => {
205
- if (transaction.origin === this.yDoc) {
206
- return;
207
- }
208
- this.updateFromSelf = false;
209
- this.remoteToLocal.transform(events, rootComponent);
210
- this.renderer.render();
211
- this.selection.restore();
212
- this.updateFromSelf = true;
213
- });
214
- this.subscriptions.push(this.rootComponentRef.component.changeMarker.onChange.pipe(filter(() => {
215
- return this.updateFromSelf;
216
- }), microTask()).subscribe((operations) => {
217
- this.yDoc.transact(() => {
218
- operations.forEach(operation => {
219
- this.localToRemote.transform(operation, root);
220
- });
221
- }, this.yDoc);
191
+ this.syncContent(root, rootComponent.slots.get(0));
192
+ this.subscriptions.push(merge(rootComponent.changeMarker.onForceChange, rootComponent.changeMarker.onChange).pipe(microTask()).subscribe(() => {
222
193
  this.renderer.render();
223
194
  this.selection.restore();
224
195
  }));
225
196
  }
197
+ syncContent(content, slot) {
198
+ content.observe((ev, tr) => {
199
+ this.runRemoteUpdate(tr, () => {
200
+ slot.retain(0);
201
+ ev.delta.forEach(action => {
202
+ if (Reflect.has(action, 'retain')) {
203
+ if (action.attributes) {
204
+ slot.retain(action.retain, Object.keys(action.attributes).map(key => {
205
+ return [this.registry.getFormatter(key), action.attributes[key]];
206
+ }));
207
+ }
208
+ slot.retain(action.retain);
209
+ }
210
+ else if (action.insert) {
211
+ const index = slot.index;
212
+ let length = 1;
213
+ if (typeof action.insert === 'string') {
214
+ length = action.insert.length;
215
+ const attrs = action.attributes ? Object.keys(action.attributes).map(key => {
216
+ return [this.registry.getFormatter(key), action.attributes[key]];
217
+ }) : [];
218
+ slot.insert(action.insert, attrs);
219
+ }
220
+ else {
221
+ const sharedComponent = action.insert;
222
+ const component = this.createComponentBySharedComponent(sharedComponent);
223
+ this.syncSlots(sharedComponent.get('slots'), component.slots);
224
+ this.syncComponent(sharedComponent, component);
225
+ slot.insert(component);
226
+ }
227
+ if (this.selection.isSelected) {
228
+ if (slot === this.selection.startSlot && this.selection.startOffset >= index) {
229
+ this.selection.setStart(slot, this.selection.startOffset + length);
230
+ }
231
+ if (slot === this.selection.endSlot && this.selection.endOffset >= index) {
232
+ this.selection.setEnd(slot, this.selection.endOffset + length);
233
+ }
234
+ }
235
+ }
236
+ else if (action.delete) {
237
+ const index = slot.index;
238
+ slot.retain(slot.index);
239
+ slot.delete(action.delete);
240
+ if (this.selection.isSelected) {
241
+ if (slot === this.selection.startSlot && this.selection.startOffset >= index) {
242
+ this.selection.setStart(slot, this.selection.startOffset - action.delete);
243
+ }
244
+ if (slot === this.selection.endSlot && this.selection.endOffset >= index) {
245
+ this.selection.setEnd(slot, this.selection.endOffset - action.delete);
246
+ }
247
+ }
248
+ }
249
+ else if (action.attributes) {
250
+ slot.updateState(draft => {
251
+ Object.assign(draft, action.attributes);
252
+ });
253
+ }
254
+ });
255
+ });
256
+ });
257
+ slot.onContentChange.subscribe(actions => {
258
+ this.runLocalUpdate(() => {
259
+ var _a;
260
+ let offset = 0;
261
+ let length = 0;
262
+ for (const action of actions) {
263
+ if (action.type === 'retain') {
264
+ if (action.formats) {
265
+ content.format(offset, action.offset, action.formats);
266
+ }
267
+ else {
268
+ offset = action.offset;
269
+ }
270
+ }
271
+ else if (action.type === 'insert') {
272
+ const delta = content.toDelta();
273
+ const isEmpty = delta.length === 1 && delta[0].insert === Slot.emptyPlaceholder;
274
+ if (typeof action.content === 'string') {
275
+ length = action.content.length;
276
+ content.insert(offset, action.content);
277
+ }
278
+ else {
279
+ length = 1;
280
+ const component = slot.getContentAtIndex(offset);
281
+ const sharedComponent = this.createSharedComponentByComponent(component);
282
+ content.insertEmbed(offset, sharedComponent);
283
+ }
284
+ if (action.formats) {
285
+ content.format(offset, length, action.formats);
286
+ }
287
+ if (isEmpty && offset === 0) {
288
+ content.delete(content.length - 1, 1);
289
+ }
290
+ offset += length;
291
+ }
292
+ else if (action.type === 'delete') {
293
+ const delta = content.toDelta();
294
+ content.delete(offset, action.count);
295
+ if (content.length === 0) {
296
+ content.insert(0, '\n', (_a = delta[0]) === null || _a === void 0 ? void 0 : _a.attributes);
297
+ }
298
+ }
299
+ }
300
+ });
301
+ });
302
+ }
303
+ syncSlot(remoteSlot, slot) {
304
+ remoteSlot.observe((ev, tr) => {
305
+ this.runRemoteUpdate(tr, () => {
306
+ ev.keysChanged.forEach(key => {
307
+ if (key === 'state') {
308
+ const state = ev.target.get('state');
309
+ slot.updateState(draft => {
310
+ Object.assign(draft, state);
311
+ });
312
+ }
313
+ });
314
+ });
315
+ });
316
+ slot.onStateChange.subscribe(actions => {
317
+ this.runLocalUpdate(() => {
318
+ actions.forEach(action => {
319
+ remoteSlot.set('state', action.value);
320
+ });
321
+ });
322
+ });
323
+ }
324
+ syncSlots(remoteSlots, slots) {
325
+ remoteSlots.observe((ev, tr) => {
326
+ this.runRemoteUpdate(tr, () => {
327
+ ev.delta.forEach(action => {
328
+ if (Reflect.has(action, 'retain')) {
329
+ slots.retain(action.retain);
330
+ }
331
+ else if (action.insert) {
332
+ action.insert.forEach(item => {
333
+ const slot = this.createSlotBySharedSlot(item);
334
+ slots.insert(slot);
335
+ this.syncContent(item.get('content'), slot);
336
+ this.syncSlot(item, slot);
337
+ });
338
+ }
339
+ else if (action.delete) {
340
+ slots.retain(slots.index);
341
+ slots.delete(action.delete);
342
+ }
343
+ });
344
+ });
345
+ });
346
+ slots.onChange.subscribe(operations => {
347
+ this.runLocalUpdate(() => {
348
+ const applyActions = operations.apply;
349
+ let index;
350
+ applyActions.forEach(action => {
351
+ if (action.type === 'retain') {
352
+ index = action.offset;
353
+ }
354
+ else if (action.type === 'insertSlot') {
355
+ const slot = slots.get(index);
356
+ const sharedSlot = this.createSharedSlotBySlot(slot);
357
+ remoteSlots.insert(index, [sharedSlot]);
358
+ index++;
359
+ }
360
+ else if (action.type === 'delete') {
361
+ remoteSlots.delete(index, action.count);
362
+ }
363
+ });
364
+ });
365
+ });
366
+ }
367
+ syncComponent(remoteComponent, component) {
368
+ remoteComponent.observe((ev, tr) => {
369
+ this.runRemoteUpdate(tr, () => {
370
+ ev.keysChanged.forEach(key => {
371
+ if (key === 'state') {
372
+ const state = ev.target.get('state');
373
+ component.updateState(draft => {
374
+ Object.assign(draft, state);
375
+ });
376
+ }
377
+ });
378
+ });
379
+ });
380
+ component.onStateChange.subscribe(newState => {
381
+ this.runLocalUpdate(() => {
382
+ remoteComponent.set('state', newState);
383
+ });
384
+ });
385
+ }
386
+ runLocalUpdate(fn) {
387
+ if (this.updateFromRemote) {
388
+ return;
389
+ }
390
+ fn();
391
+ }
392
+ runRemoteUpdate(tr, fn) {
393
+ if (!tr.origin) {
394
+ return;
395
+ }
396
+ this.updateFromRemote = true;
397
+ fn();
398
+ this.updateFromRemote = false;
399
+ }
400
+ createSharedComponentByComponent(component) {
401
+ const sharedComponent = new YMap();
402
+ sharedComponent.set('state', component.state);
403
+ sharedComponent.set('name', component.name);
404
+ const sharedSlots = new YArray();
405
+ sharedComponent.set('slots', sharedSlots);
406
+ component.slots.toArray().forEach(slot => {
407
+ const sharedSlot = this.createSharedSlotBySlot(slot);
408
+ sharedSlots.push([sharedSlot]);
409
+ });
410
+ this.syncSlots(sharedSlots, component.slots);
411
+ this.syncComponent(sharedComponent, component);
412
+ return sharedComponent;
413
+ }
414
+ createSharedSlotBySlot(slot) {
415
+ const sharedSlot = new YMap();
416
+ sharedSlot.set('schema', slot.schema);
417
+ sharedSlot.set('state', slot.state);
418
+ const sharedContent = new YText();
419
+ sharedSlot.set('content', sharedContent);
420
+ let offset = 0;
421
+ slot.toDelta().forEach(i => {
422
+ let formats = {};
423
+ if (i.formats) {
424
+ i.formats.forEach(item => {
425
+ formats[item[0].name] = item[1];
426
+ });
427
+ }
428
+ else {
429
+ formats = null;
430
+ }
431
+ if (typeof i.insert === 'string') {
432
+ sharedContent.insert(offset, i.insert, formats);
433
+ }
434
+ else {
435
+ const sharedComponent = this.createSharedComponentByComponent(i.insert);
436
+ sharedContent.insertEmbed(offset, sharedComponent, formats);
437
+ }
438
+ offset += i.insert.length;
439
+ });
440
+ this.syncContent(sharedContent, slot);
441
+ this.syncSlot(sharedSlot, slot);
442
+ return sharedSlot;
443
+ }
444
+ createComponentBySharedComponent(yMap) {
445
+ const sharedSlots = yMap.get('slots');
446
+ const slots = [];
447
+ sharedSlots.map(sharedSlot => {
448
+ const slot = this.createSlotBySharedSlot(sharedSlot);
449
+ slots.push(slot);
450
+ });
451
+ const name = yMap.get('name');
452
+ const instance = this.translator.createComponentByData(name, {
453
+ state: yMap.get('state'),
454
+ slots
455
+ });
456
+ if (instance) {
457
+ instance.slots.toArray().forEach((slot, index) => {
458
+ const sharedSlot = sharedSlots.get(index);
459
+ this.syncSlot(sharedSlot, slot);
460
+ this.syncContent(sharedSlot.get('content'), slot);
461
+ });
462
+ return instance;
463
+ }
464
+ throw collaborateErrorFn(`cannot find component factory \`${name}\`.`);
465
+ }
466
+ createSlotBySharedSlot(sharedSlot) {
467
+ const content = sharedSlot.get('content');
468
+ const delta = content.toDelta();
469
+ const slot = this.translator.createSlot({
470
+ schema: sharedSlot.get('schema'),
471
+ state: sharedSlot.get('state'),
472
+ formats: {},
473
+ content: []
474
+ });
475
+ for (const action of delta) {
476
+ if (action.insert) {
477
+ if (typeof action.insert === 'string') {
478
+ slot.insert(action.insert, action.attributes ? Object.keys(action.attributes).map(key => {
479
+ return [this.registry.getFormatter(key), action.attributes[key]];
480
+ }) : []);
481
+ }
482
+ else {
483
+ const sharedComponent = action.insert;
484
+ const component = this.createComponentBySharedComponent(sharedComponent);
485
+ slot.insert(component);
486
+ this.syncSlots(sharedComponent.get('slots'), component.slots);
487
+ this.syncComponent(sharedComponent, component);
488
+ }
489
+ }
490
+ else {
491
+ throw collaborateErrorFn('unexpected delta action.');
492
+ }
493
+ }
494
+ return slot;
495
+ }
226
496
  };
227
497
  Collaborate = __decorate([
228
498
  Injectable(),
@@ -235,4 +505,4 @@ Collaborate = __decorate([
235
505
  Starter])
236
506
  ], Collaborate);
237
507
  export { Collaborate };
238
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29sbGFib3JhdGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvY29sbGFib3JhdGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7O0FBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLFdBQVcsQ0FBQTtBQUN0QyxPQUFPLEVBQUUsTUFBTSxFQUFFLFNBQVMsRUFBYyxPQUFPLEVBQWdCLE1BQU0sZUFBZSxDQUFBO0FBQ3BGLE9BQU8sRUFDTCxnQkFBZ0IsRUFDaEIsT0FBTyxFQUNQLFVBQVUsRUFDVixRQUFRLEVBQ1IsU0FBUyxFQUVBLFFBQVEsRUFDbEIsTUFBTSxlQUFlLENBQUE7QUFDdEIsT0FBTyxFQUFFLEdBQUcsSUFBSSxJQUFJLEVBQUUsV0FBVyxFQUFFLE1BQU0sS0FBSyxDQUFBO0FBQzlDLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQTtBQUN4RCxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sMEJBQTBCLENBQUE7QUFDeEQsT0FBTyxFQUFFLGlCQUFpQixFQUFtQixNQUFNLGVBQWUsQ0FBQTtBQUdsRSxJQUFhLFdBQVcsR0FBeEIsTUFBYSxXQUFXO0lBK0J0QixZQUFvQixnQkFBa0MsRUFDbEMsaUJBQW9DLEVBQ3BDLFVBQXNCLEVBQ3RCLFFBQWtCLEVBQ2xCLFFBQWtCLEVBQ2xCLFNBQW9CLEVBQ3BCLE9BQWdCOzs7OzttQkFOaEI7Ozs7OzttQkFDQTs7Ozs7O21CQUNBOzs7Ozs7bUJBQ0E7Ozs7OzttQkFDQTs7Ozs7O21CQUNBOzs7Ozs7bUJBQ0E7O1FBcENwQjs7Ozs7V0FBNkM7UUFDN0M7Ozs7bUJBQU8sSUFBSSxJQUFJLEVBQUU7V0FBQTtRQUNqQjs7Ozs7V0FBd0I7UUFDeEI7Ozs7O1dBQTJCO1FBQzNCOzs7OztXQUF5QjtRQUN6Qjs7Ozs7V0FBd0I7UUFVeEI7Ozs7bUJBQXdCLElBQUksYUFBYSxFQUFFO1dBQUE7UUFDM0M7Ozs7bUJBQXdCLElBQUksYUFBYSxDQUFDLElBQUks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Q0FBQyxDQUFDLENBQ0gsQ0FBQTtJQUNILENBQUM7Q0FDRixDQUFBO0FBbkhZLFdBQVc7SUFEdkIsVUFBVSxFQUFFO3FDQWdDMkIsZ0JBQWdCO1FBQ2YsaUJBQWlCO1FBQ3hCLFVBQVU7UUFDWixRQUFRO1FBQ1IsUUFBUTtRQUNQLFNBQVM7UUFDWCxPQUFPO0dBckN6QixXQUFXLENBbUh2QjtTQW5IWSxXQUFXIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0YWJsZSB9IGZyb20gJ0B0YW5iby9kaSdcbmltcG9ydCB7IGZpbHRlciwgbWljcm9UYXNrLCBPYnNlcnZhYmxlLCBTdWJqZWN0LCBTdWJzY3JpcHRpb24gfSBmcm9tICdAdGFuYm8vc3RyZWFtJ1xuaW1wb3J0IHtcbiAgUm9vdENvbXBvbmVudFJlZixcbiAgU3RhcnRlcixcbiAgVHJhbnNsYXRvcixcbiAgUmVnaXN0cnksXG4gIFNlbGVjdGlvbixcbiAgU2VsZWN0aW9uUGF0aHMsXG4gIEhpc3RvcnksIFJlbmRlcmVyXG59IGZyb20gJ0B0ZXh0YnVzL2NvcmUnXG5pbXBvcnQgeyBEb2MgYXMgWURvYywgVW5kb01hbmFnZXIgfSBmcm9tICd5anMnXG5pbXBvcnQgeyBMb2NhbFRvUmVtb3RlIH0gZnJvbSAnLi9jb2xsYWIvbG9jYWwtdG8tcmVtb3RlJ1xuaW1wb3J0IHsgUmVtb3RlVG9Mb2NhbCB9IGZyb20gJy4vY29sbGFiL3JlbW90ZS10by1sb2NhbCdcbmltcG9ydCB7IENvbGxhYm9yYXRlQ3Vyc29yLCBSZW1vdGVTZWxlY3Rpb24gfSBmcm9tICcuL2NvbGxhYi9fYXBpJ1xuXG5ASW5qZWN0YWJsZSgpXG5leHBvcnQgY2xhc3MgQ29sbGFib3JhdGUgaW1wbGVtZW50cyBIaXN0b3J5IHtcbiAgb25TZWxlY3Rpb25DaGFuZ2U6IE9ic2VydmFibGU8U2VsZWN0aW9uUGF0aHM+XG4gIHlEb2MgPSBuZXcgWURvYygpXG4gIG9uQmFjazogT2JzZXJ2YWJsZTx2b2lkPlxuICBvbkZvcndhcmQ6IE9ic2VydmFibGU8dm9pZD5cbiAgb25DaGFuZ2U6IE9ic2VydmFibGU8YW55PlxuICBvblB1c2g6IE9ic2VydmFibGU8dm9pZD5cblxuICBnZXQgY2FuQmFjaygpIHtcbiAgICByZXR1cm4gdGhpcy5tYW5hZ2VyPy5jYW5VbmRvKClcbiAgfVxuXG4gIGdldCBjYW5Gb3J3YXJkKCkge1xuICAgIHJldHVybiB0aGlzLm1hbmFnZXI/LmNhblJlZG8oKVxuICB9XG5cbiAgcHJpdmF0ZSBsb2NhbFRvUmVtb3RlID0gbmV3IExvY2FsVG9SZW1vdGUoKVxuICBwcml2YXRlIHJlbW90ZVRvTG9jYWwgPSBuZXcgUmVtb3RlVG9Mb2NhbCh0aGlzLnlEb2MsIHRoaXMudHJhbnNsYXRvciwgdGhpcy5zZWxlY3Rpb24sIHRoaXMucmVnaXN0cnkpXG5cbiAgcHJpdmF0ZSBiYWNrRXZlbnQgPSBuZXcgU3ViamVjdDx2b2lkPigpXG4gIHByaXZhdGUgZm9yd2FyZEV2ZW50ID0gbmV3IFN1YmplY3Q8dm9pZD4oKVxuICBwcml2YXRlIGNoYW5nZUV2ZW50ID0gbmV3IFN1YmplY3Q8dm9pZD4oKVxuICBwcml2YXRlIHB1c2hFdmVudCA9IG5ldyBTdWJqZWN0PHZvaWQ+KClcblxuICBwcml2YXRlIG1hbmFnZXIhOiBVbmRvTWFuYWdlclxuXG4gIHByaXZhdGUgc3Vic2NyaXB0aW9uczogU3Vic2NyaXB0aW9uW10gPSBbXVxuICBwcml2YXRlIHVwZGF0ZUZyb21TZWxmID0gdHJ1ZVxuXG4gIHByaXZhdGUgc2VsZWN0aW9uQ2hhbmdlRXZlbnQgPSBuZXcgU3ViamVjdDxTZWxlY3Rpb25QYXRocz4oKVxuXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgcm9vdENvbXBvbmVudFJlZjogUm9vdENvbXBvbmVudFJlZixcbiAgICAgICAgICAgICAgcHJpdmF0ZSBjb2xsYWJvcmF0ZUN1cnNvcjogQ29sbGFib3JhdGVDdXJzb3IsXG4gICAgICAgICAgICAgIHByaXZhdGUgdHJhbnNsYXRvcjogVHJhbnNsYXRvcixcbiAgICAgICAgICAgICAgcHJpdmF0ZSByZW5kZXJlcjogUmVuZGVyZXIsXG4gICAgICAgICAgICAgIHByaXZhdGUgcmVnaXN0cnk6IFJlZ2lzdHJ5LFxuICAgICAgICAgICAgICBwcml2YXRlIHNlbGVjdGlvbjogU2VsZWN0aW9uLFxuICAgICAgICAgICAgICBwcml2YXRlIHN0YXJ0ZXI6IFN0YXJ0ZXIpIHtcbiAgICB0aGlzLm9uU2VsZWN0aW9uQ2hhbmdlID0gdGhpcy5zZWxlY3Rpb25DaGFuZ2VFdmVudC5hc09ic2VydmFibGUoKVxuICAgIHRoaXMub25CYWNrID0gdGhpcy5iYWNrRXZlbnQuYXNPYnNlcnZhYmxlKClcbiAgICB0aGlzLm9uRm9yd2FyZCA9IHRoaXMuZm9yd2FyZEV2ZW50LmFzT2JzZXJ2YWJsZSgpXG4gICAgdGhpcy5vbkNoYW5nZSA9IHRoaXMuY2hhbmdlRXZlbnQuYXNPYnNlcnZhYmxlKClcbiAgICB0aGlzLm9uUHVzaCA9IHRoaXMucHVzaEV2ZW50LmFzT2JzZXJ2YWJsZSgpXG4gIH1cblxuICBzZXR1cCgpIHtcbiAgICB0aGlzLnN1YnNjcmlwdGlvbnMucHVzaChcbiAgICAgIHRoaXMuc3RhcnRlci5vblJlYWR5LnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgIHRoaXMubGlzdGVuMigpXG4gICAgICB9KSxcbiAgICAgIHRoaXMuc2VsZWN0aW9uLm9uQ2hhbmdlLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgIGNvbnN0IHBhdGhzID0gdGhpcy5zZWxlY3Rpb24uZ2V0UGF0aHMoKVxuICAgICAgICB0aGlzLnNlbGVjdGlvbkNoYW5nZUV2ZW50Lm5leHQocGF0aHMpXG4gICAgICB9KVxuICAgIClcbiAgfVxuXG4gIHVwZGF0ZVJlbW90ZVNlbGVjdGlvbihwYXRoczogUmVtb3RlU2VsZWN0aW9uW10pIHtcbiAgICB0aGlzLmNvbGxhYm9yYXRlQ3Vyc29yLmRyYXcocGF0aHMpXG4gIH1cblxuICBsaXN0ZW4oKSB7XG4gICAgLy9cbiAgfVxuXG4gIGJhY2soKSB7XG4gICAgaWYgKHRoaXMuY2FuQmFjaykge1xuICAgICAgdGhpcy5tYW5hZ2VyLnVuZG8oKVxuICAgIH1cbiAgfVxuXG4gIGZvcndhcmQoKSB7XG4gICAgaWYgKHRoaXMuY2FuRm9yd2FyZCkge1xuICAgICAgdGhpcy5tYW5hZ2VyLnJlZG8oKVxuICAgIH1cbiAgfVxuXG4gIGRlc3Ryb3koKSB7XG4gICAgdGhpcy5zdWJzY3JpcHRpb25zLmZvckVhY2goaSA9PiBpLnVuc3Vic2NyaWJlKCkpXG4gIH1cblxuICBwcml2YXRlIGxpc3RlbjIoKSB7XG4gICAgY29uc3Qgcm9vdCA9IHRoaXMueURvYy5nZXRUZXh0KCdjb250ZW50JylcbiAgICBjb25zdCByb290Q29tcG9uZW50ID0gdGhpcy5yb290Q29tcG9uZW50UmVmLmNvbXBvbmVudCFcbiAgICB0aGlzLm1hbmFnZXIgPSBuZXcgVW5kb01hbmFnZXIocm9vdCwge1xuICAgICAgdHJhY2tlZE9yaWdpbnM6IG5ldyBTZXQ8YW55PihbdGhpcy55RG9jXSlcbiAgICB9KVxuICAgIHJvb3Qub2JzZXJ2ZURlZXAoKGV2ZW50cywgdHJhbnNhY3Rpb24pID0+IHtcbiAgICAgIGlmICh0cmFuc2FjdGlvbi5vcmlnaW4gPT09IHRoaXMueURvYykge1xuICAgICAgICByZXR1cm5cbiAgICAgIH1cbiAgICAgIHRoaXMudXBkYXRlRnJvbVNlbGYgPSBmYWxzZVxuXG4gICAgICB0aGlzLnJlbW90ZVRvTG9jYWwudHJhbnNmb3JtKGV2ZW50cywgcm9vdENvbXBvbmVudClcbiAgICAgIHRoaXMucmVuZGVyZXIucmVuZGVyKClcbiAgICAgIHRoaXMuc2VsZWN0aW9uLnJlc3RvcmUoKVxuICAgICAgdGhpcy51cGRhdGVGcm9tU2VsZiA9IHRydWVcbiAgICB9KVxuICAgIHRoaXMuc3Vic2NyaXB0aW9ucy5wdXNoKFxuICAgICAgdGhpcy5yb290Q29tcG9uZW50UmVmLmNvbXBvbmVudC5jaGFuZ2VNYXJrZXIub25DaGFuZ2UucGlwZShcbiAgICAgICAgZmlsdGVyKCgpID0+IHtcbiAgICAgICAgICByZXR1cm4gdGhpcy51cGRhdGVGcm9tU2VsZlxuICAgICAgICB9KSxcbiAgICAgICAgbWljcm9UYXNrKClcbiAgICAgICkuc3Vic2NyaWJlKChvcGVyYXRpb25zKSA9PiB7XG4gICAgICAgIHRoaXMueURvYy50cmFuc2FjdCgoKSA9PiB7XG4gICAgICAgICAgb3BlcmF0aW9ucy5mb3JFYWNoKG9wZXJhdGlvbiA9PiB7XG4gICAgICAgICAgICB0aGlzLmxvY2FsVG9SZW1vdGUudHJhbnNmb3JtKG9wZXJhdGlvbiwgcm9vdClcbiAgICAgICAgICB9KVxuICAgICAgICB9LCB0aGlzLnlEb2MpXG4gICAgICAgIHRoaXMucmVuZGVyZXIucmVuZGVyKClcbiAgICAgICAgdGhpcy5zZWxlY3Rpb24ucmVzdG9yZSgpXG4gICAgICB9KVxuICAgIClcbiAgfVxufVxuIl19
508
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29sbGFib3JhdGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvY29sbGFib3JhdGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7O0FBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLFdBQVcsQ0FBQTtBQUN0QyxPQUFPLEVBQUUsS0FBSyxFQUFFLFNBQVMsRUFBYyxPQUFPLEVBQWdCLE1BQU0sZUFBZSxDQUFBO0FBQ25GLE9BQU8sRUFDTCxnQkFBZ0IsRUFDaEIsT0FBTyxFQUNQLFVBQVUsRUFDVixRQUFRLEVBQ1IsU0FBUyxFQUVBLFFBQVEsRUFBRSxJQUFJLEVBQXFCLFNBQVMsRUFDdEQsTUFBTSxlQUFlLENBQUE7QUFDdEIsT0FBTyxFQUNMLEdBQUcsSUFBSSxJQUFJLEVBQ1gsR0FBRyxJQUFJLElBQUksRUFDWCxJQUFJLElBQUksS0FBSyxFQUNiLEtBQUssSUFBSSxNQUFNLEVBQ2YsV0FBVyxFQUVaLE1BQU0sS0FBSyxDQUFBO0FBRVosT0FBTyxFQUFFLGlCQUFpQixFQUFtQixNQUFNLGVBQWUsQ0FBQTtBQUVsRSxNQUFNLGtCQUFrQixHQUFHLFNBQVMsQ0FBQyxhQUFhLENBQUMsQ0FBQTtBQUduRCxJQUFhLFdBQVcsR0FBeEIsTUFBYSxXQUFXO0lBNEJ0QixZQUFvQixnQkFBa0MsRUFDbEMsaUJBQW9DLEVBQ3BDLFVBQXNCLEVBQ3RCLFFBQWtCLEVBQ2xCLFFBQWtCLEVBQ2xCLFNBQW9CLEVBQ3BCLE9BQWdCOzs7OzttQkFOaEI7Ozs7OzttQkFDQTs7Ozs7O21CQUNBOzs7Ozs7bUJBQ0E7Ozs7OzttQkFDQTs7Ozs7O21CQUNBOzs7Ozs7bUJBQ0E7O1FBakNwQjs7Ozs7V0FBNkM7UUFDN0M7Ozs7bUJBQU8sSUFBSSxJQUFJLEVBQUU7V0FBQTtRQUNqQjs7Ozs7V0FBd0I7UUFDeEI7Ozs7O1dBQTJCO1FBQzNCOzs7OztXQUF5QjtRQUN6Qjs7Ozs7V0FBd0I7UUFVeEI7Ozs7bUJBQW9CLElBQUksT0FBTyxFQUFR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QUMsU0FBUyxDQUFDLFNBQVMsSUFBSSxJQUFJLENBQUMsU0FBUyxDQUFDLFdBQVksSUFBSSxLQUFLLEVBQUU7Z0NBQzdFLElBQUksQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLFdBQVksR0FBRyxNQUFNLENBQUMsQ0FBQTs2QkFDcEU7NEJBQ0QsSUFBSSxJQUFJLEtBQUssSUFBSSxDQUFDLFNBQVMsQ0FBQyxPQUFPLElBQUksSUFBSSxDQUFDLFNBQVMsQ0FBQyxTQUFVLElBQUksS0FBSyxFQUFFO2dDQUN6RSxJQUFJLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxTQUFVLEdBQUcsTUFBTSxDQUFDLENBQUE7NkJBQ2hFO3lCQUNGO3FCQUNGO3lCQUFNLElBQUksTUFBTSxDQUFDLE1BQU0sRUFBRTt3QkFDeEIsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQTt3QkFDeEIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUE7d0JBQ3ZCLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFBO3dCQUMxQixJQUFJLElBQUksQ0FBQyxTQUFTLENBQUMsVUFBVSxFQUFFOzRCQUM3QixJQUFJLElBQUksS0FBSyxJQUFJLENBQUMsU0FBUyxDQUFDLFNBQVMsSUFBSSxJQUFJLENBQUMsU0FBUyxDQUFDLFdBQVksSUFBSSxLQUFLLEVBQUU7Z0NBQzdFLElBQUksQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLFdBQVksR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUE7NkJBQzNFOzRCQUNELElBQUksSUFBSSxLQUFLLElBQUksQ0FBQyxTQUFTLENBQUMsT0FBTyxJQUFJLElBQUksQ0FBQyxTQUFTLENBQUMsU0FBVSxJQUFJLEtBQUssRUFBRTtnQ0FDekUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsU0FBVSxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQTs2QkFDdkU7eUJBQ0Y7cUJBQ0Y7eUJBQU0sSUFBSSxNQUFNLENBQUMsVUFBVSxFQUFFO3dCQUM1QixJQUFJLENBQUMsV0FBVyxDQUFDLEtBQUssQ0FBQyxFQUFFOzRCQUN2QixNQUFNLENBQUMsTUFBTSxDQUFDLEtBQUssRUFBRSxNQUFNLENBQUMsVUFBVSxDQUFDLENBQUE7d0JBQ3pDLENBQUMsQ0FBQyxDQUFBO3FCQUNIO2dCQUNILENBQUMsQ0FBQyxDQUFBO1lBQ0osQ0FBQyxDQUFDLENBQUE7UUFDSixDQUFDLENBQUMsQ0FBQTtRQUVGLElBQUksQ0FBQyxlQUFlLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxFQUFFO1lBQ3ZDLElBQUksQ0FBQyxjQUFjLENBQUMsR0FBRyxFQUFFOztnQkFDdkIsSUFBSSxNQUFNLEdBQUcsQ0FBQyxDQUFBO2dCQUNkLElBQUksTUFBTSxHQUFHLENBQUMsQ0FBQTtnQkFDZCxLQUFLLE1BQU0sTUFBTSxJQUFJLE9BQU8sRUFBRTtvQkFDNUIsSUFBSSxNQUFNLENBQUMsSUFBSSxLQUFLLFFBQVEsRUFBRTt3QkFDNUIsSUFBSSxNQUFNLENBQUMsT0FBTyxFQUFFOzRCQUNsQixPQUFPLENBQUMsTUFBTSxDQUFDLE1BQU0sRUFBRSxNQUFNLENBQUMsTUFBTSxFQUFFLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQTt5QkFDdEQ7NkJBQU07NEJBQ0wsTUFBTSxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUE7eUJBQ3ZCO3FCQUNGO3lCQUFNLElBQUksTUFBTSxDQUFDLElBQUksS0FBSyxRQUFRLEVBQUU7d0JBQ25DLE1BQU0sS0FBSyxHQUFHLE9BQU8sQ0FBQyxPQUFPLEVBQUUsQ0FBQTt3QkFDL0IsTUFBTSxPQUFPLEdBQUcsS0FBSyxDQUFDLE1BQU0sS0FBSyxDQUFDLElBQUksS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sS0FBSyxJQUFJLENBQUMsZ0JBQWdCLENBQUE7d0JBQy9FLElBQUksT0FBTyxNQUFNLENBQUMsT0FBTyxLQUFLLFFBQVEsRUFBRTs0QkFDdEMsTUFBTSxHQUFHLE1BQU0sQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFBOzRCQUM5QixPQUFPLENBQUMsTUFBTSxDQUFDLE1BQU0sRUFBRSxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUE7eUJBQ3ZDOzZCQUFNOzRCQUNMLE1BQU0sR0FBRyxDQUFDLENBQUE7NEJBQ1YsTUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLGlCQUFpQixDQUFDLE1BQU0sQ0FBc0IsQ0FBQTs0QkFDckUsTUFBTSxlQUFlLEdBQUcsSUFBSSxDQUFDLGdDQUFnQyxDQUFDLFNBQVMsQ0FBQyxDQUFBOzRCQUN4RSxPQUFPLENBQUMsV0FBVyxDQUFDLE1BQU0sRUFBRSxlQUFlLENBQUMsQ0FBQTt5QkFDN0M7d0JBQ0QsSUFBSSxNQUFNLENBQUMsT0FBTyxFQUFFOzRCQUNsQixPQUFPLENBQUMsTUFBTSxDQUFDLE1BQU0sRUFBRSxNQUFNLEVBQUUsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFBO3lCQUMvQzt3QkFDRCxJQUFJLE9BQU8sSUFBSSxNQUFNLEtBQUssQ0FBQyxFQUFFOzRCQUMzQixPQUFPLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFBO3lCQUN0Qzt3QkFDRCxNQUFNLElBQUksTUFBTSxDQUFBO3FCQUNqQjt5QkFBTSxJQUFJLE1BQU0sQ0FBQyxJQUFJLEtBQUssUUFBUSxFQUFFO3dCQUNuQyxNQUFNLEtBQUssR0FBRyxPQUFPLENBQUMsT0FBTyxFQUFFLENBQUE7d0JBQy9CLE9BQU8sQ0FBQyxNQUFNLENBQUMsTUFBTSxFQUFFLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQTt3QkFDcEMsSUFBSSxPQUFPLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRTs0QkFDeEIsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsSUFBSSxFQUFFLE1BQUEsS0FBSyxDQUFDLENBQUMsQ0FBQywwQ0FBRSxVQUFVLENBQUMsQ0FBQTt5QkFDOUM7cUJBQ0Y7aUJBQ0Y7WUFDSCxDQUFDLENBQUMsQ0FBQTtRQUNKLENBQUMsQ0FBQyxDQUFBO0lBQ0osQ0FBQztJQUVPLFFBQVEsQ0FBQyxVQUFxQixFQUFFLElBQVU7UUFDaEQsVUFBVSxDQUFDLE9BQU8sQ0FBQyxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRTtZQUM1QixJQUFJLENBQUMsZUFBZSxDQUFDLEVBQUUsRUFBRSxHQUFHLEVBQUU7Z0JBQzVCLEVBQUUsQ0FBQyxXQUFXLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxFQUFFO29CQUMzQixJQUFJLEdBQUcsS0FBSyxPQUFPLEVBQUU7d0JBQ25CLE1BQU0sS0FBSyxHQUFJLEVBQUUsQ0FBQyxNQUFvQixDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsQ0FBQTt3QkFDbkQsSUFBSSxDQUFDLFdBQVcsQ0FBQyxLQUFLLENBQUMsRUFBRTs0QkFDdkIsTUFBTSxDQUFDLE1BQU0sQ0FBQyxLQUFLLEVBQUUsS0FBSyxDQUFDLENBQUE7d0JBQzdCLENBQUMsQ0FBQyxDQUFBO3FCQUNIO2dCQUNILENBQUMsQ0FBQyxDQUFBO1lBQ0osQ0FBQyxDQUFDLENBQUE7UUFDSixDQUFDLENBQUMsQ0FBQTtRQUVGLElBQUksQ0FBQyxhQUFhLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxFQUFFO1lBQ3JDLElBQUksQ0FBQyxjQUFjLENBQUMsR0FBRyxFQUFFO2dCQUN2QixPQUFPLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxFQUFFO29CQUN2QixVQUFVLENBQUMsR0FBRyxDQUFDLE9BQU8sRUFBRSxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUE7Z0JBQ3ZDLENBQUMsQ0FBQyxDQUFBO1lBQ0osQ0FBQyxDQUFDLENBQUE7UUFDSixDQUFDLENBQUMsQ0FBQTtJQUNKLENBQUM7SUFFTyxTQUFTLENBQUMsV0FBd0IsRUFBRSxLQUFZO1FBQ3RELFdBQVcsQ0FBQyxPQUFPLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUU7WUFDN0IsSUFBSSxDQUFDLGVBQWUsQ0FBQyxFQUFFLEVBQUUsR0FBRyxFQUFFO2dCQUM1QixFQUFFLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsRUFBRTtvQkFDeEIsSUFBSSxPQUFPLENBQUMsR0FBRyxDQUFDLE1BQU0sRUFBRSxRQUFRLENBQUMsRUFBRTt3QkFDakMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsTUFBTyxDQUFDLENBQUE7cUJBQzdCO3lCQUFNLElBQUksTUFBTSxDQUFDLE1BQU0sRUFBRTt3QkFDdkIsTUFBTSxDQUFDLE1BQTJCLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxFQUFFOzRCQUNqRCxNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsc0JBQXNCLENBQUMsSUFBSSxDQUFDLENBQUE7NEJBQzlDLEtBQUssQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUE7NEJBQ2xCLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQTs0QkFDM0MsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLENBQUE7d0JBQzNCLENBQUMsQ0FBQyxDQUFBO3FCQUNIO3lCQUFNLElBQUksTUFBTSxDQUFDLE1BQU0sRUFBRTt3QkFDeEIsS0FBSyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUE7d0JBQ3pCLEtBQUssQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFBO3FCQUM1QjtnQkFDSCxDQUFDLENBQUMsQ0FBQTtZQUNKLENBQUMsQ0FBQyxDQUFBO1FBQ0osQ0FBQyxDQUFDLENBQUE7UUFFRixLQUFLLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxVQUFVLENBQUMsRUFBRTtZQUNwQyxJQUFJLENBQUMsY0FBYyxDQUFDLEdBQUcsRUFBRTtnQkFDdkIsTUFBTSxZQUFZLEdBQUcsVUFBVSxDQUFDLEtBQUssQ0FBQTtnQkFDckMsSUFBSSxLQUFhLENBQUE7Z0JBQ2pCLFlBQVksQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLEVBQUU7b0JBQzVCLElBQUksTUFBTSxDQUFDLElBQUksS0FBSyxRQUFRLEVBQUU7d0JBQzVCLEtBQUssR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFBO3FCQUN0Qjt5QkFBTSxJQUFJLE1BQU0sQ0FBQyxJQUFJLEtBQUssWUFBWSxFQUFFO3dCQUN2QyxNQUFNLElBQUksR0FBRyxLQUFLLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBRSxDQUFBO3dCQUM5QixNQUFNLFVBQVUsR0FBRyxJQUFJLENBQUMsc0JBQXNCLENBQUMsSUFBSSxDQUFDLENBQUE7d0JBQ3BELFdBQVcsQ0FBQyxNQUFNLENBQUMsS0FBSyxFQUFFLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQTt3QkFDdkMsS0FBSyxFQUFFLENBQUE7cUJBQ1I7eUJBQU0sSUFBSSxNQUFNLENBQUMsSUFBSSxLQUFLLFFBQVEsRUFBRTt3QkFDbkMsV0FBVyxDQUFDLE1BQU0sQ0FBQyxLQUFLLEVBQUUsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFBO3FCQUN4QztnQkFDSCxDQUFDLENBQUMsQ0FBQTtZQUNKLENBQUMsQ0FBQyxDQUFBO1FBQ0osQ0FBQyxDQUFDLENBQUE7SUFDSixDQUFDO0lBRU8sYUFBYSxDQUFDLGVBQTBCLEVBQUUsU0FBNEI7UUFDNUUsZUFBZSxDQUFDLE9BQU8sQ0FBQyxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRTtZQUNqQyxJQUFJLENBQUMsZUFBZSxDQUFDLEVBQUUsRUFBRSxHQUFHLEVBQUU7Z0JBQzVCLEVBQUUsQ0FBQyxXQUFXLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxFQUFFO29CQUMzQixJQUFJLEdBQUcsS0FBSyxPQUFPLEVBQUU7d0JBQ25CLE1BQU0sS0FBSyxHQUFJLEVBQUUsQ0FBQyxNQUFvQixDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsQ0FBQTt3QkFDbkQsU0FBUyxDQUFDLFdBQVcsQ0FBQyxLQUFLLENBQUMsRUFBRTs0QkFDNUIsTUFBTSxDQUFDLE1BQU0sQ0FBQyxLQUFLLEVBQUUsS0FBSyxDQUFDLENBQUE7d0JBQzdCLENBQUMsQ0FBQyxDQUFBO3FCQUNIO2dCQUNILENBQUMsQ0FBQyxDQUFBO1lBQ0osQ0FBQyxDQUFDLENBQUE7UUFDSixDQUFDLENBQUMsQ0FBQTtRQUVGLFNBQVMsQ0FBQyxhQUFhLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQyxFQUFFO1lBQzNDLElBQUksQ0FBQyxjQUFjLENBQUMsR0FBRyxFQUFFO2dCQUN2QixlQUFlLENBQUMsR0FBRyxDQUFDLE9BQU8sRUFBRSxRQUFRLENBQUMsQ0FBQTtZQUN4QyxDQUFDLENBQUMsQ0FBQTtRQUNKLENBQUMsQ0FBQyxDQUFBO0lBQ0osQ0FBQztJQUVPLGNBQWMsQ0FBQyxFQUFjO1FBQ25DLElBQUksSUFBSSxDQUFDLGdCQUFnQixFQUFFO1lBQ3pCLE9BQU07U0FDUDtRQUNELEVBQUUsRUFBRSxDQUFBO0lBQ04sQ0FBQztJQUVPLGVBQWUsQ0FBQyxFQUFlLEVBQUUsRUFBYztRQUNyRCxJQUFJLENBQUMsRUFBRSxDQUFDLE1BQU0sRUFBRTtZQUNkLE9BQU07U0FDUDtRQUNELElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxJQUFJLENBQUE7UUFDNUIsRUFBRSxFQUFFLENBQUE7UUFDSixJQUFJLENBQUMsZ0JBQWdCLEdBQUcsS0FBSyxDQUFBO0lBQy9CLENBQUM7SUFFTyxnQ0FBZ0MsQ0FBQyxTQUE0QjtRQUNuRSxNQUFNLGVBQWUsR0FBRyxJQUFJLElBQUksRUFBRSxDQUFBO1FBQ2xDLGVBQWUsQ0FBQyxHQUFHLENBQUMsT0FBTyxFQUFFLFNBQVMsQ0FBQyxLQUFLLENBQUMsQ0FBQTtRQUM3QyxlQUFlLENBQUMsR0FBRyxDQUFDLE1BQU0sRUFBRSxTQUFTLENBQUMsSUFBSSxDQUFDLENBQUE7UUFDM0MsTUFBTSxXQUFXLEdBQUcsSUFBSSxNQUFNLEVBQUUsQ0FBQTtRQUNoQyxlQUFlLENBQUMsR0FBRyxDQUFDLE9BQU8sRUFBRSxXQUFXLENBQUMsQ0FBQTtRQUN6QyxTQUFTLENBQUMsS0FBSyxDQUFDLE9BQU8sRUFBRSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsRUFBRTtZQUN2QyxNQUFNLFVBQVUsR0FBRyxJQUFJLENBQUMsc0JBQXNCLENBQUMsSUFBSSxDQUFDLENBQUE7WUFDcEQsV0FBVyxDQUFDLElBQUksQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUE7UUFDaEMsQ0FBQyxDQUFDLENBQUE7UUFDRixJQUFJLENBQUMsU0FBUyxDQUFDLFdBQVcsRUFBRSxTQUFTLENBQUMsS0FBSyxDQUFDLENBQUE7UUFDNUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxlQUFlLEVBQUUsU0FBUyxDQUFDLENBQUE7UUFDOUMsT0FBTyxlQUFlLENBQUE7SUFDeEIsQ0FBQztJQUVPLHNCQUFzQixDQUFDLElBQVU7UUFDdkMsTUFBTSxVQUFVLEdBQUcsSUFBSSxJQUFJLEVBQUUsQ0FBQTtRQUM3QixVQUFVLENBQUMsR0FBRyxDQUFDLFFBQVEsRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUE7UUFDckMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFBO1FBQ25DLE1BQU0sYUFBYSxHQUFHLElBQUksS0FBSyxFQUFFLENBQUE7UUFDakMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxTQUFTLEVBQUUsYUFBYSxDQUFDLENBQUE7UUFDeEMsSUFBSSxNQUFNLEdBQUcsQ0FBQyxDQUFBO1FBQ2QsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRTtZQUN6QixJQUFJLE9BQU8sR0FBUSxFQUFFLENBQUE7WUFDckIsSUFBSSxDQUFDLENBQUMsT0FBTyxFQUFFO2dCQUNiLENBQUMsQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxFQUFFO29CQUN2QixPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQTtnQkFDakMsQ0FBQyxDQUFDLENBQUE7YUFDSDtpQkFBTTtnQkFDTCxPQUFPLEdBQUcsSUFBSSxDQUFBO2FBQ2Y7WUFDRCxJQUFJLE9BQU8sQ0FBQyxDQUFDLE1BQU0sS0FBSyxRQUFRLEVBQUU7Z0JBQ2hDLGFBQWEsQ0FBQyxNQUFNLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQyxNQUFNLEVBQUUsT0FBTyxDQUFDLENBQUE7YUFDaEQ7aUJBQU07Z0JBQ0wsTUFBTSxlQUFlLEdBQUcsSUFBSSxDQUFDLGdDQUFnQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQTtnQkFDdkUsYUFBYSxDQUFDLFdBQVcsQ0FBQyxNQUFNLEVBQUUsZUFBZSxFQUFFLE9BQU8sQ0FBQyxDQUFBO2FBQzVEO1lBQ0QsTUFBTSxJQUFJLENBQUMsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFBO1FBQzNCLENBQUMsQ0FBQyxDQUFBO1FBQ0YsSUFBSSxDQUFDLFdBQVcsQ0FBQyxhQUFhLEVBQUUsSUFBSSxDQUFDLENBQUE7UUFDckMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxVQUFVLEVBQUUsSUFBSSxDQUFDLENBQUE7UUFDL0IsT0FBTyxVQUFVLENBQUE7SUFDbkIsQ0FBQztJQUVPLGdDQUFnQyxDQUFDLElBQWU7UUFDdEQsTUFBTSxXQUFXLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQXNCLENBQUE7UUFDMUQsTUFBTSxLQUFLLEdBQVcsRUFBRSxDQUFBO1FBQ3hCLFdBQVcsQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFDLEVBQUU7WUFDM0IsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLHNCQUFzQixDQUFDLFVBQVUsQ0FBQyxDQUFBO1lBQ3BELEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUE7UUFDbEIsQ0FBQyxDQUFDLENBQUE7UUFDRixNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFBO1FBQzdCLE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMscUJBQXFCLENBQUMsSUFBSSxFQUFFO1lBQzNELEtBQUssRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQztZQUN4QixLQUFLO1NBQ04sQ0FBQyxDQUFBO1FBQ0YsSUFBSSxRQUFRLEVBQUU7WUFDWixRQUFRLENBQUMsS0FBSyxDQUFDLE9BQU8sRUFBRSxDQUFDLE9BQU8sQ0FBQyxDQUFDLElBQUksRUFBRSxLQUFLLEVBQUUsRUFBRTtnQkFDL0MsTUFBTSxVQUFVLEdBQUcsV0FBVyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQTtnQkFDekMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxVQUFVLEVBQUUsSUFBSSxDQUFDLENBQUE7Z0JBQy9CLElBQUksQ0FBQyxXQUFXLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQTtZQUNuRCxDQUFDLENBQUMsQ0FBQTtZQUNGLE9BQU8sUUFBUSxDQUFBO1NBQ2hCO1FBQ0QsTUFBTSxrQkFBa0IsQ0FBQyxtQ0FBbUMsSUFBSSxLQUFLLENBQUMsQ0FBQTtJQUN4RSxDQUFDO0lBRU8sc0JBQXNCLENBQUMsVUFBcUI7UUFDbEQsTUFBTSxPQUFPLEdBQUcsVUFBVSxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQVUsQ0FBQTtRQUNsRCxNQUFNLEtBQUssR0FBRyxPQUFPLENBQUMsT0FBTyxFQUFFLENBQUE7UUFFL0IsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxVQUFVLENBQUM7WUFDdEMsTUFBTSxFQUFFLFVBQVUsQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDO1lBQ2hDLEtBQUssRUFBRSxVQUFVLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQztZQUM5QixPQUFPLEVBQUUsRUFBRTtZQUNYLE9BQU8sRUFBRSxFQUFFO1NBQ1osQ0FBQyxDQUFBO1FBRUYsS0FBSyxNQUFNLE1BQU0sSUFBSSxLQUFLLEVBQUU7WUFDMUIsSUFBSSxNQUFNLENBQUMsTUFBTSxFQUFFO2dCQUNqQixJQUFJLE9BQU8sTUFBTSxDQUFDLE1BQU0sS0FBSyxRQUFRLEVBQUU7b0JBQ3JDLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLE1BQU0sRUFBRSxNQUFNLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEVBQUU7d0JBQ3RGLE9BQU8sQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLFlBQVksQ0FBQyxHQUFHLENBQUUsRUFBRSxNQUFNLENBQUMsVUFBVyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUE7b0JBQ3BFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQTtpQkFDVDtxQkFBTTtvQkFDTCxNQUFNLGVBQWUsR0FBRyxNQUFNLENBQUMsTUFBbUIsQ0FBQTtvQkFDbEQsTUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLGdDQUFnQyxDQUFDLGVBQWUsQ0FBQyxDQUFBO29CQUN4RSxJQUFJLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxDQUFBO29CQUN0QixJQUFJLENBQUMsU0FBUyxDQUFDLGVBQWUsQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLEVBQUUsU0FBUyxDQUFDLEtBQUssQ0FBQyxDQUFBO29CQUM3RCxJQUFJLENBQUMsYUFBYSxDQUFDLGVBQWUsRUFBRSxTQUFTLENBQUMsQ0FBQTtpQkFDL0M7YUFDRjtpQkFBTTtnQkFDTCxNQUFNLGtCQUFrQixDQUFDLDBCQUEwQixDQUFDLENBQUE7YUFDckQ7U0FDRjtRQUNELE9BQU8sSUFBSSxDQUFBO0lBQ2IsQ0FBQztDQUNGLENBQUE7QUE1WVksV0FBVztJQUR2QixVQUFVLEVBQUU7cUNBNkIyQixnQkFBZ0I7UUFDZixpQkFBaUI7UUFDeEIsVUFBVTtRQUNaLFFBQVE7UUFDUixRQUFRO1FBQ1AsU0FBUztRQUNYLE9BQU87R0FsQ3pCLFdBQVcsQ0E0WXZCO1NBNVlZLFdBQVciLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RhYmxlIH0gZnJvbSAnQHRhbmJvL2RpJ1xuaW1wb3J0IHsgbWVyZ2UsIG1pY3JvVGFzaywgT2JzZXJ2YWJsZSwgU3ViamVjdCwgU3Vic2NyaXB0aW9uIH0gZnJvbSAnQHRhbmJvL3N0cmVhbSdcbmltcG9ydCB7XG4gIFJvb3RDb21wb25lbnRSZWYsXG4gIFN0YXJ0ZXIsXG4gIFRyYW5zbGF0b3IsXG4gIFJlZ2lzdHJ5LFxuICBTZWxlY3Rpb24sXG4gIFNlbGVjdGlvblBhdGhzLFxuICBIaXN0b3J5LCBSZW5kZXJlciwgU2xvdCwgQ29tcG9uZW50SW5zdGFuY2UsIG1ha2VFcnJvciwgU2xvdHMsIEZvcm1hdHNcbn0gZnJvbSAnQHRleHRidXMvY29yZSdcbmltcG9ydCB7XG4gIERvYyBhcyBZRG9jLFxuICBNYXAgYXMgWU1hcCxcbiAgVGV4dCBhcyBZVGV4dCxcbiAgQXJyYXkgYXMgWUFycmF5LFxuICBVbmRvTWFuYWdlcixcbiAgVHJhbnNhY3Rpb25cbn0gZnJvbSAneWpzJ1xuXG5pbXBvcnQgeyBDb2xsYWJvcmF0ZUN1cnNvciwgUmVtb3RlU2VsZWN0aW9uIH0gZnJvbSAnLi9jb2xsYWIvX2FwaSdcblxuY29uc3QgY29sbGFib3JhdGVFcnJvckZuID0gbWFrZUVycm9yKCdDb2xsYWJvcmF0ZScpXG5cbkBJbmplY3RhYmxlKClcbmV4cG9ydCBjbGFzcyBDb2xsYWJvcmF0ZSBpbXBsZW1lbnRzIEhpc3Rvcnkge1xuICBvblNlbGVjdGlvbkNoYW5nZTogT2JzZXJ2YWJsZTxTZWxlY3Rpb25QYXRocz5cbiAgeURvYyA9IG5ldyBZRG9jKClcbiAgb25CYWNrOiBPYnNlcnZhYmxlPHZvaWQ+XG4gIG9uRm9yd2FyZDogT2JzZXJ2YWJsZTx2b2lkPlxuICBvbkNoYW5nZTogT2JzZXJ2YWJsZTxhbnk+XG4gIG9uUHVzaDogT2JzZXJ2YWJsZTx2b2lkPlxuXG4gIGdldCBjYW5CYWNrKCkge1xuICAgIHJldHVybiB0aGlzLm1hbmFnZXI/LmNhblVuZG8oKVxuICB9XG5cbiAgZ2V0IGNhbkZvcndhcmQoKSB7XG4gICAgcmV0dXJuIHRoaXMubWFuYWdlcj8uY2FuUmVkbygpXG4gIH1cblxuICBwcml2YXRlIGJhY2tFdmVudCA9IG5ldyBTdWJqZWN0PHZvaWQ+KClcbiAgcHJpdmF0ZSBmb3J3YXJkRXZlbnQgPSBuZXcgU3ViamVjdDx2b2lkPigpXG4gIHByaXZhdGUgY2hhbmdlRXZlbnQgPSBuZXcgU3ViamVjdDx2b2lkPigpXG4gIHByaXZhdGUgcHVzaEV2ZW50ID0gbmV3IFN1YmplY3Q8dm9pZD4oKVxuXG4gIHByaXZhdGUgbWFuYWdlciE6IFVuZG9NYW5hZ2VyXG5cbiAgcHJpdmF0ZSBzdWJzY3JpcHRpb25zOiBTdWJzY3JpcHRpb25bXSA9IFtdXG4gIHByaXZhdGUgdXBkYXRlRnJvbVJlbW90ZSA9IGZhbHNlXG5cbiAgcHJpdmF0ZSBzZWxlY3Rpb25DaGFuZ2VFdmVudCA9IG5ldyBTdWJqZWN0PFNlbGVjdGlvblBhdGhzPigpXG5cbiAgY29uc3RydWN0b3IocHJpdmF0ZSByb290Q29tcG9uZW50UmVmOiBSb290Q29tcG9uZW50UmVmLFxuICAgICAgICAgICAgICBwcml2YXRlIGNvbGxhYm9yYXRlQ3Vyc29yOiBDb2xsYWJvcmF0ZUN1cnNvcixcbiAgICAgICAgICAgICAgcHJpdmF0ZSB0cmFuc2xhdG9yOiBUcmFuc2xhdG9yLFxuICAgICAgICAgICAgICBwcml2YXRlIHJlbmRlcmVyOiBSZW5kZXJlcixcbiAgICAgICAgICAgICAgcHJpdmF0ZSByZWdpc3RyeTogUmVnaXN0cnksXG4gICAgICAgICAgICAgIHByaXZhdGUgc2VsZWN0aW9uOiBTZWxlY3Rpb24sXG4gICAgICAgICAgICAgIHByaXZhdGUgc3RhcnRlcjogU3RhcnRlcikge1xuICAgIHRoaXMub25TZWxlY3Rpb25DaGFuZ2UgPSB0aGlzLnNlbGVjdGlvbkNoYW5nZUV2ZW50LmFzT2JzZXJ2YWJsZSgpXG4gICAgdGhpcy5vbkJhY2sgPSB0aGlzLmJhY2tFdmVudC5hc09ic2VydmFibGUoKVxuICAgIHRoaXMub25Gb3J3YXJkID0gdGhpcy5mb3J3YXJkRXZlbnQuYXNPYnNlcnZhYmxlKClcbiAgICB0aGlzLm9uQ2hhbmdlID0gdGhpcy5jaGFuZ2VFdmVudC5hc09ic2VydmFibGUoKVxuICAgIHRoaXMub25QdXNoID0gdGhpcy5wdXNoRXZlbnQuYXNPYnNlcnZhYmxlKClcbiAgfVxuXG4gIHNldHVwKCkge1xuICAgIHRoaXMuc3Vic2NyaXB0aW9ucy5wdXNoKFxuICAgICAgdGhpcy5zdGFydGVyLm9uUmVhZHkuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgdGhpcy5saXN0ZW4yKClcbiAgICAgIH0pLFxuICAgICAgdGhpcy5zZWxlY3Rpb24ub25DaGFuZ2Uuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgY29uc3QgcGF0aHMgPSB0aGlzLnNlbGVjdGlvbi5nZXRQYXRocygpXG4gICAgICAgIHRoaXMuc2VsZWN0aW9uQ2hhbmdlRXZlbnQubmV4dChwYXRocylcbiAgICAgIH0pXG4gICAgKVxuICB9XG5cbiAgdXBkYXRlUmVtb3RlU2VsZWN0aW9uKHBhdGhzOiBSZW1vdGVTZWxlY3Rpb25bXSkge1xuICAgIHRoaXMuY29sbGFib3JhdGVDdXJzb3IuZHJhdyhwYXRocylcbiAgfVxuXG4gIGxpc3RlbigpIHtcbiAgICAvL1xuICB9XG5cbiAgYmFjaygpIHtcbiAgICBpZiAodGhpcy5jYW5CYWNrKSB7XG4gICAgICB0aGlzLm1hbmFnZXIudW5kbygpXG4gICAgfVxuICB9XG5cbiAgZm9yd2FyZCgpIHtcbiAgICBpZiAodGhpcy5jYW5Gb3J3YXJkKSB7XG4gICAgICB0aGlzLm1hbmFnZXIucmVkbygpXG4gICAgfVxuICB9XG5cbiAgZGVzdHJveSgpIHtcbiAgICB0aGlzLnN1YnNjcmlwdGlvbnMuZm9yRWFjaChpID0+IGkudW5zdWJzY3JpYmUoKSlcbiAgfVxuXG4gIHByaXZhdGUgbGlzdGVuMigpIHtcbiAgICBjb25zdCByb290ID0gdGhpcy55RG9jLmdldFRleHQoJ2NvbnRlbnQnKVxuICAgIGNvbnN0IHJvb3RDb21wb25lbnQgPSB0aGlzLnJvb3RDb21wb25lbnRSZWYuY29tcG9uZW50IVxuICAgIHRoaXMubWFuYWdlciA9IG5ldyBVbmRvTWFuYWdlcihyb290LCB7XG4gICAgICB0cmFja2VkT3JpZ2luczogbmV3IFNldDxhbnk+KFt0aGlzLnlEb2NdKVxuICAgIH0pXG4gICAgdGhpcy5zeW5jQ29udGVudChyb290LCByb290Q29tcG9uZW50LnNsb3RzLmdldCgwKSEpXG5cbiAgICB0aGlzLnN1YnNjcmlwdGlvbnMucHVzaChcbiAgICAgIG1lcmdlKFxuICAgICAgICByb290Q29tcG9uZW50LmNoYW5nZU1hcmtlci5vbkZvcmNlQ2hhbmdlLFxuICAgICAgICByb290Q29tcG9uZW50LmNoYW5nZU1hcmtlci5vbkNoYW5nZVxuICAgICAgKS5waXBlKFxuICAgICAgICBtaWNyb1Rhc2soKVxuICAgICAgKS5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICB0aGlzLnJlbmRlcmVyLnJlbmRlcigpXG4gICAgICAgIHRoaXMuc2VsZWN0aW9uLnJlc3RvcmUoKVxuICAgICAgfSlcbiAgICApXG4gIH1cblxuICBwcml2YXRlIHN5bmNDb250ZW50KGNvbnRlbnQ6IFlUZXh0LCBzbG90OiBTbG90KSB7XG4gICAgY29udGVudC5vYnNlcnZlKChldiwgdHIpID0+IHtcbiAgICAgIHRoaXMucnVuUmVtb3RlVXBkYXRlKHRyLCAoKSA9PiB7XG4gICAgICAgIHNsb3QucmV0YWluKDApXG4gICAgICAgIGV2LmRlbHRhLmZvckVhY2goYWN0aW9uID0+IHtcbiAgICAgICAgICBpZiAoUmVmbGVjdC5oYXMoYWN0aW9uLCAncmV0YWluJykpIHtcbiAgICAgICAgICAgIGlmIChhY3Rpb24uYXR0cmlidXRlcykge1xuICAgICAgICAgICAgICBzbG90LnJldGFpbihhY3Rpb24ucmV0YWluISwgT2JqZWN0LmtleXMoYWN0aW9uLmF0dHJpYnV0ZXMpLm1hcChrZXkgPT4ge1xuICAgICAgICAgICAgICAgIHJldHVybiBbdGhpcy5yZWdpc3RyeS5nZXRGb3JtYXR0ZXIoa2V5KSEsIGFjdGlvbi5hdHRyaWJ1dGVzIVtrZXldXVxuICAgICAgICAgICAgICB9KSlcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHNsb3QucmV0YWluKGFjdGlvbi5yZXRhaW4hKVxuICAgICAgICAgIH0gZWxzZSBpZiAoYWN0aW9uLmluc2VydCkge1xuICAgICAgICAgICAgY29uc3QgaW5kZXggPSBzbG90LmluZGV4XG4gICAgICAgICAgICBsZXQgbGVuZ3RoID0gMVxuICAgICAgICAgICAgaWYgKHR5cGVvZiBhY3Rpb24uaW5zZXJ0ID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgICBsZW5ndGggPSBhY3Rpb24uaW5zZXJ0Lmxlbmd0aFxuICAgICAgICAgICAgICBjb25zdCBhdHRyczogRm9ybWF0cyA9IGFjdGlvbi5hdHRyaWJ1dGVzID8gT2JqZWN0LmtleXMoYWN0aW9uLmF0dHJpYnV0ZXMpLm1hcChrZXkgPT4ge1xuICAgICAgICAgICAgICAgIHJldHVybiBbdGhpcy5yZWdpc3RyeS5nZXRGb3JtYXR0ZXIoa2V5KSEsIGFjdGlvbi5hdHRyaWJ1dGVzIVtrZXldXVxuICAgICAgICAgICAgICB9KSA6IFtdXG4gICAgICAgICAgICAgIHNsb3QuaW5zZXJ0KGFjdGlvbi5pbnNlcnQsIGF0dHJzKVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgY29uc3Qgc2hhcmVkQ29tcG9uZW50ID0gYWN0aW9uLmluc2VydCBhcyBZTWFwPGFueT5cbiAgICAgICAgICAgICAgY29uc3QgY29tcG9uZW50ID0gdGhpcy5jcmVhdGVDb21wb25lbnRCeVNoYXJlZENvbXBvbmVudChzaGFyZWRDb21wb25lbnQpXG4gICAgICAgICAgICAgIHRoaXMuc3luY1Nsb3RzKHNoYXJlZENvbXBvbmVudC5nZXQoJ3Nsb3RzJyksIGNvbXBvbmVudC5zbG90cylcbiAgICAgICAgICAgICAgdGhpcy5zeW5jQ29tcG9uZW50KHNoYXJlZENvbXBvbmVudCwgY29tcG9uZW50KVxuICAgICAgICAgICAgICBzbG90Lmluc2VydChjb21wb25lbnQpXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAodGhpcy5zZWxlY3Rpb24uaXNTZWxlY3RlZCkge1xuICAgICAgICAgICAgICBpZiAoc2xvdCA9PT0gdGhpcy5zZWxlY3Rpb24uc3RhcnRTbG90ICYmIHRoaXMuc2VsZWN0aW9uLnN0YXJ0T2Zmc2V0ISA+PSBpbmRleCkge1xuICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0aW9uLnNldFN0YXJ0KHNsb3QsIHRoaXMuc2VsZWN0aW9uLnN0YXJ0T2Zmc2V0ISArIGxlbmd0aClcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBpZiAoc2xvdCA9PT0gdGhpcy5zZWxlY3Rpb24uZW5kU2xvdCAmJiB0aGlzLnNlbGVjdGlvbi5lbmRPZmZzZXQhID49IGluZGV4KSB7XG4gICAgICAgICAgICAgICAgdGhpcy5zZWxlY3Rpb24uc2V0RW5kKHNsb3QsIHRoaXMuc2VsZWN0aW9uLmVuZE9mZnNldCEgKyBsZW5ndGgpXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2UgaWYgKGFjdGlvbi5kZWxldGUpIHtcbiAgICAgICAgICAgIGNvbnN0IGluZGV4ID0gc2xvdC5pbmRleFxuICAgICAgICAgICAgc2xvdC5yZXRhaW4oc2xvdC5pbmRleClcbiAgICAgICAgICAgIHNsb3QuZGVsZXRlKGFjdGlvbi5kZWxldGUpXG4gICAgICAgICAgICBpZiAodGhpcy5zZWxlY3Rpb24uaXNTZWxlY3RlZCkge1xuICAgICAgICAgICAgICBpZiAoc2xvdCA9PT0gdGhpcy5zZWxlY3Rpb24uc3RhcnRTbG90ICYmIHRoaXMuc2VsZWN0aW9uLnN0YXJ0T2Zmc2V0ISA+PSBpbmRleCkge1xuICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0aW9uLnNldFN0YXJ0KHNsb3QsIHRoaXMuc2VsZWN0aW9uLnN0YXJ0T2Zmc2V0ISAtIGFjdGlvbi5kZWxldGUpXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgaWYgKHNsb3QgPT09IHRoaXMuc2VsZWN0aW9uLmVuZFNsb3QgJiYgdGhpcy5zZWxlY3Rpb24uZW5kT2Zmc2V0ISA+PSBpbmRleCkge1xuICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0aW9uLnNldEVuZChzbG90LCB0aGlzLnNlbGVjdGlvbi5lbmRPZmZzZXQhIC0gYWN0aW9uLmRlbGV0ZSlcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSBpZiAoYWN0aW9uLmF0dHJpYnV0ZXMpIHtcbiAgICAgICAgICAgIHNsb3QudXBkYXRlU3RhdGUoZHJhZnQgPT4ge1xuICAgICAgICAgICAgICBPYmplY3QuYXNzaWduKGRyYWZ0LCBhY3Rpb24uYXR0cmlidXRlcylcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgfVxuICAgICAgICB9KVxuICAgICAgfSlcbiAgICB9KVxuXG4gICAgc2xvdC5vbkNvbnRlbnRDaGFuZ2Uuc3Vic2NyaWJlKGFjdGlvbnMgPT4ge1xuICAgICAgdGhpcy5ydW5Mb2NhbFVwZGF0ZSgoKSA9PiB7XG4gICAgICAgIGxldCBvZmZzZXQgPSAwXG4gICAgICAgIGxldCBsZW5ndGggPSAwXG4gICAgICAgIGZvciAoY29uc3QgYWN0aW9uIG9mIGFjdGlvbnMpIHtcbiAgICAgICAgICBpZiAoYWN0aW9uLnR5cGUgPT09ICdyZXRhaW4nKSB7XG4gICAgICAgICAgICBpZiAoYWN0aW9uLmZvcm1hdHMpIHtcbiAgICAgICAgICAgICAgY29udGVudC5mb3JtYXQob2Zmc2V0LCBhY3Rpb24ub2Zmc2V0LCBhY3Rpb24uZm9ybWF0cylcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIG9mZnNldCA9IGFjdGlvbi5vZmZzZXRcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2UgaWYgKGFjdGlvbi50eXBlID09PSAnaW5zZXJ0Jykge1xuICAgICAgICAgICAgY29uc3QgZGVsdGEgPSBjb250ZW50LnRvRGVsdGEoKVxuICAgICAgICAgICAgY29uc3QgaXNFbXB0eSA9IGRlbHRhLmxlbmd0aCA9PT0gMSAmJiBkZWx0YVswXS5pbnNlcnQgPT09IFNsb3QuZW1wdHlQbGFjZWhvbGRlclxuICAgICAgICAgICAgaWYgKHR5cGVvZiBhY3Rpb24uY29udGVudCA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgICAgbGVuZ3RoID0gYWN0aW9uLmNvbnRlbnQubGVuZ3RoXG4gICAgICAgICAgICAgIGNvbnRlbnQuaW5zZXJ0KG9mZnNldCwgYWN0aW9uLmNvbnRlbnQpXG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBsZW5ndGggPSAxXG4gICAgICAgICAgICAgIGNvbnN0IGNvbXBvbmVudCA9IHNsb3QuZ2V0Q29udGVudEF0SW5kZXgob2Zmc2V0KSBhcyBDb21wb25lbnRJbnN0YW5jZVxuICAgICAgICAgICAgICBjb25zdCBzaGFyZWRDb21wb25lbnQgPSB0aGlzLmNyZWF0ZVNoYXJlZENvbXBvbmVudEJ5Q29tcG9uZW50KGNvbXBvbmVudClcbiAgICAgICAgICAgICAgY29udGVudC5pbnNlcnRFbWJlZChvZmZzZXQsIHNoYXJlZENvbXBvbmVudClcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChhY3Rpb24uZm9ybWF0cykge1xuICAgICAgICAgICAgICBjb250ZW50LmZvcm1hdChvZmZzZXQsIGxlbmd0aCwgYWN0aW9uLmZvcm1hdHMpXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoaXNFbXB0eSAmJiBvZmZzZXQgPT09IDApIHtcbiAgICAgICAgICAgICAgY29udGVudC5kZWxldGUoY29udGVudC5sZW5ndGggLSAxLCAxKVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgb2Zmc2V0ICs9IGxlbmd0aFxuICAgICAgICAgIH0gZWxzZSBpZiAoYWN0aW9uLnR5cGUgPT09ICdkZWxldGUnKSB7XG4gICAgICAgICAgICBjb25zdCBkZWx0YSA9IGNvbnRlbnQudG9EZWx0YSgpXG4gICAgICAgICAgICBjb250ZW50LmRlbGV0ZShvZmZzZXQsIGFjdGlvbi5jb3VudClcbiAgICAgICAgICAgIGlmIChjb250ZW50Lmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgICBjb250ZW50Lmluc2VydCgwLCAnXFxuJywgZGVsdGFbMF0/LmF0dHJpYnV0ZXMpXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9KVxuICAgIH0pXG4gIH1cblxuICBwcml2YXRlIHN5bmNTbG90KHJlbW90ZVNsb3Q6IFlNYXA8YW55Piwgc2xvdDogU2xvdCkge1xuICAgIHJlbW90ZVNsb3Qub2JzZXJ2ZSgoZXYsIHRyKSA9PiB7XG4gICAgICB0aGlzLnJ1blJlbW90ZVVwZGF0ZSh0ciwgKCkgPT4ge1xuICAgICAgICBldi5rZXlzQ2hhbmdlZC5mb3JFYWNoKGtleSA9PiB7XG4gICAgICAgICAgaWYgKGtleSA9PT0gJ3N0YXRlJykge1xuICAgICAgICAgICAgY29uc3Qgc3RhdGUgPSAoZXYudGFyZ2V0IGFzIFlNYXA8YW55PikuZ2V0KCdzdGF0ZScpXG4gICAgICAgICAgICBzbG90LnVwZGF0ZVN0YXRlKGRyYWZ0ID0+IHtcbiAgICAgICAgICAgICAgT2JqZWN0LmFzc2lnbihkcmFmdCwgc3RhdGUpXG4gICAgICAgICAgICB9KVxuICAgICAgICAgIH1cbiAgICAgICAgfSlcbiAgICAgIH0pXG4gICAgfSlcblxuICAgIHNsb3Qub25TdGF0ZUNoYW5nZS5zdWJzY3JpYmUoYWN0aW9ucyA9PiB7XG4gICAgICB0aGlzLnJ1bkxvY2FsVXBkYXRlKCgpID0+IHtcbiAgICAgICAgYWN0aW9ucy5mb3JFYWNoKGFjdGlvbiA9PiB7XG4gICAgICAgICAgcmVtb3RlU2xvdC5zZXQoJ3N0YXRlJywgYWN0aW9uLnZhbHVlKVxuICAgICAgICB9KVxuICAgICAgfSlcbiAgICB9KVxuICB9XG5cbiAgcHJpdmF0ZSBzeW5jU2xvdHMocmVtb3RlU2xvdHM6IFlBcnJheTxhbnk+LCBzbG90czogU2xvdHMpIHtcbiAgICByZW1vdGVTbG90cy5vYnNlcnZlKChldiwgdHIpID0+IHtcbiAgICAgIHRoaXMucnVuUmVtb3RlVXBkYXRlKHRyLCAoKSA9PiB7XG4gICAgICAgIGV2LmRlbHRhLmZvckVhY2goYWN0aW9uID0+IHtcbiAgICAgICAgICBpZiAoUmVmbGVjdC5oYXMoYWN0aW9uLCAncmV0YWluJykpIHtcbiAgICAgICAgICAgIHNsb3RzLnJldGFpbihhY3Rpb24ucmV0YWluISlcbiAgICAgICAgICB9IGVsc2UgaWYgKGFjdGlvbi5pbnNlcnQpIHtcbiAgICAgICAgICAgIChhY3Rpb24uaW5zZXJ0IGFzIEFycmF5PFlNYXA8YW55Pj4pLmZvckVhY2goaXRlbSA9PiB7XG4gICAgICAgICAgICAgIGNvbnN0IHNsb3QgPSB0aGlzLmNyZWF0ZVNsb3RCeVNoYXJlZFNsb3QoaXRlbSlcbiAgICAgICAgICAgICAgc2xvdHMuaW5zZXJ0KHNsb3QpXG4gICAgICAgICAgICAgIHRoaXMuc3luY0NvbnRlbnQoaXRlbS5nZXQoJ2NvbnRlbnQnKSwgc2xvdClcbiAgICAgICAgICAgICAgdGhpcy5zeW5jU2xvdChpdGVtLCBzbG90KVxuICAgICAgICAgICAgfSlcbiAgICAgICAgICB9IGVsc2UgaWYgKGFjdGlvbi5kZWxldGUpIHtcbiAgICAgICAgICAgIHNsb3RzLnJldGFpbihzbG90cy5pbmRleClcbiAgICAgICAgICAgIHNsb3RzLmRlbGV0ZShhY3Rpb24uZGVsZXRlKVxuICAgICAgICAgIH1cbiAgICAgICAgfSlcbiAgICAgIH0pXG4gICAgfSlcblxuICAgIHNsb3RzLm9uQ2hhbmdlLnN1YnNjcmliZShvcGVyYXRpb25zID0+IHtcbiAgICAgIHRoaXMucnVuTG9jYWxVcGRhdGUoKCkgPT4ge1xuICAgICAgICBjb25zdCBhcHBseUFjdGlvbnMgPSBvcGVyYXRpb25zLmFwcGx5XG4gICAgICAgIGxldCBpbmRleDogbnVtYmVyXG4gICAgICAgIGFwcGx5QWN0aW9ucy5mb3JFYWNoKGFjdGlvbiA9PiB7XG4gICAgICAgICAgaWYgKGFjdGlvbi50eXBlID09PSAncmV0YWluJykge1xuICAgICAgICAgICAgaW5kZXggPSBhY3Rpb24ub2Zmc2V0XG4gICAgICAgICAgfSBlbHNlIGlmIChhY3Rpb24udHlwZSA9PT0gJ2luc2VydFNsb3QnKSB7XG4gICAgICAgICAgICBjb25zdCBzbG90ID0gc2xvdHMuZ2V0KGluZGV4KSFcbiAgICAgICAgICAgIGNvbnN0IHNoYXJlZFNsb3QgPSB0aGlzLmNyZWF0ZVNoYXJlZFNsb3RCeVNsb3Qoc2xvdClcbiAgICAgICAgICAgIHJlbW90ZVNsb3RzLmluc2VydChpbmRleCwgW3NoYXJlZFNsb3RdKVxuICAgICAgICAgICAgaW5kZXgrK1xuICAgICAgICAgIH0gZWxzZSBpZiAoYWN0aW9uLnR5cGUgPT09ICdkZWxldGUnKSB7XG4gICAgICAgICAgICByZW1vdGVTbG90cy5kZWxldGUoaW5kZXgsIGFjdGlvbi5jb3VudClcbiAgICAgICAgICB9XG4gICAgICAgIH0pXG4gICAgICB9KVxuICAgIH0pXG4gIH1cblxuICBwcml2YXRlIHN5bmNDb21wb25lbnQocmVtb3RlQ29tcG9uZW50OiBZTWFwPGFueT4sIGNvbXBvbmVudDogQ29tcG9uZW50SW5zdGFuY2UpIHtcbiAgICByZW1vdGVDb21wb25lbnQub2JzZXJ2ZSgoZXYsIHRyKSA9PiB7XG4gICAgICB0aGlzLnJ1blJlbW90ZVVwZGF0ZSh0ciwgKCkgPT4ge1xuICAgICAgICBldi5rZXlzQ2hhbmdlZC5mb3JFYWNoKGtleSA9PiB7XG4gICAgICAgICAgaWYgKGtleSA9PT0gJ3N0YXRlJykge1xuICAgICAgICAgICAgY29uc3Qgc3RhdGUgPSAoZXYudGFyZ2V0IGFzIFlNYXA8YW55PikuZ2V0KCdzdGF0ZScpXG4gICAgICAgICAgICBjb21wb25lbnQudXBkYXRlU3RhdGUoZHJhZnQgPT4ge1xuICAgICAgICAgICAgICBPYmplY3QuYXNzaWduKGRyYWZ0LCBzdGF0ZSlcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgfVxuICAgICAgICB9KVxuICAgICAgfSlcbiAgICB9KVxuXG4gICAgY29tcG9uZW50Lm9uU3RhdGVDaGFuZ2Uuc3Vic2NyaWJlKG5ld1N0YXRlID0+IHtcbiAgICAgIHRoaXMucnVuTG9jYWxVcGRhdGUoKCkgPT4ge1xuICAgICAgICByZW1vdGVDb21wb25lbnQuc2V0KCdzdGF0ZScsIG5ld1N0YXRlKVxuICAgICAgfSlcbiAgICB9KVxuICB9XG5cbiAgcHJpdmF0ZSBydW5Mb2NhbFVwZGF0ZShmbjogKCkgPT4gdm9pZCkge1xuICAgIGlmICh0aGlzLnVwZGF0ZUZyb21SZW1vdGUpIHtcbiAgICAgIHJldHVyblxuICAgIH1cbiAgICBmbigpXG4gIH1cblxuICBwcml2YXRlIHJ1blJlbW90ZVVwZGF0ZSh0cjogVHJhbnNhY3Rpb24sIGZuOiAoKSA9PiB2b2lkKSB7XG4gICAgaWYgKCF0ci5vcmlnaW4pIHtcbiAgICAgIHJldHVyblxuICAgIH1cbiAgICB0aGlzLnVwZGF0ZUZyb21SZW1vdGUgPSB0cnVlXG4gICAgZm4oKVxuICAgIHRoaXMudXBkYXRlRnJvbVJlbW90ZSA9IGZhbHNlXG4gIH1cblxuICBwcml2YXRlIGNyZWF0ZVNoYXJlZENvbXBvbmVudEJ5Q29tcG9uZW50KGNvbXBvbmVudDogQ29tcG9uZW50SW5zdGFuY2UpOiBZTWFwPGFueT4ge1xuICAgIGNvbnN0IHNoYXJlZENvbXBvbmVudCA9IG5ldyBZTWFwKClcbiAgICBzaGFyZWRDb21wb25lbnQuc2V0KCdzdGF0ZScsIGNvbXBvbmVudC5zdGF0ZSlcbiAgICBzaGFyZWRDb21wb25lbnQuc2V0KCduYW1lJywgY29tcG9uZW50Lm5hbWUpXG4gICAgY29uc3Qgc2hhcmVkU2xvdHMgPSBuZXcgWUFycmF5KClcbiAgICBzaGFyZWRDb21wb25lbnQuc2V0KCdzbG90cycsIHNoYXJlZFNsb3RzKVxuICAgIGNvbXBvbmVudC5zbG90cy50b0FycmF5KCkuZm9yRWFjaChzbG90ID0+IHtcbiAgICAgIGNvbnN0IHNoYXJlZFNsb3QgPSB0aGlzLmNyZWF0ZVNoYXJlZFNsb3RCeVNsb3Qoc2xvdClcbiAgICAgIHNoYXJlZFNsb3RzLnB1c2goW3NoYXJlZFNsb3RdKVxuICAgIH0pXG4gICAgdGhpcy5zeW5jU2xvdHMoc2hhcmVkU2xvdHMsIGNvbXBvbmVudC5zbG90cylcbiAgICB0aGlzLnN5bmNDb21wb25lbnQoc2hhcmVkQ29tcG9uZW50LCBjb21wb25lbnQpXG4gICAgcmV0dXJuIHNoYXJlZENvbXBvbmVudFxuICB9XG5cbiAgcHJpdmF0ZSBjcmVhdGVTaGFyZWRTbG90QnlTbG90KHNsb3Q6IFNsb3QpOiBZTWFwPGFueT4ge1xuICAgIGNvbnN0IHNoYXJlZFNsb3QgPSBuZXcgWU1hcCgpXG4gICAgc2hhcmVkU2xvdC5zZXQoJ3NjaGVtYScsIHNsb3Quc2NoZW1hKVxuICAgIHNoYXJlZFNsb3Quc2V0KCdzdGF0ZScsIHNsb3Quc3RhdGUpXG4gICAgY29uc3Qgc2hhcmVkQ29udGVudCA9IG5ldyBZVGV4dCgpXG4gICAgc2hhcmVkU2xvdC5zZXQoJ2NvbnRlbnQnLCBzaGFyZWRDb250ZW50KVxuICAgIGxldCBvZmZzZXQgPSAwXG4gICAgc2xvdC50b0RlbHRhKCkuZm9yRWFjaChpID0+IHtcbiAgICAgIGxldCBmb3JtYXRzOiBhbnkgPSB7fVxuICAgICAgaWYgKGkuZm9ybWF0cykge1xuICAgICAgICBpLmZvcm1hdHMuZm9yRWFjaChpdGVtID0+IHtcbiAgICAgICAgICBmb3JtYXRzW2l0ZW1bMF0ubmFtZV0gPSBpdGVtWzFdXG4gICAgICAgIH0pXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBmb3JtYXRzID0gbnVsbFxuICAgICAgfVxuICAgICAgaWYgKHR5cGVvZiBpLmluc2VydCA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgc2hhcmVkQ29udGVudC5pbnNlcnQob2Zmc2V0LCBpLmluc2VydCwgZm9ybWF0cylcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IHNoYXJlZENvbXBvbmVudCA9IHRoaXMuY3JlYXRlU2hhcmVkQ29tcG9uZW50QnlDb21wb25lbnQoaS5pbnNlcnQpXG4gICAgICAgIHNoYXJlZENvbnRlbnQuaW5zZXJ0RW1iZWQob2Zmc2V0LCBzaGFyZWRDb21wb25lbnQsIGZvcm1hdHMpXG4gICAgICB9XG4gICAgICBvZmZzZXQgKz0gaS5pbnNlcnQubGVuZ3RoXG4gICAgfSlcbiAgICB0aGlzLnN5bmNDb250ZW50KHNoYXJlZENvbnRlbnQsIHNsb3QpXG4gICAgdGhpcy5zeW5jU2xvdChzaGFyZWRTbG90LCBzbG90KVxuICAgIHJldHVybiBzaGFyZWRTbG90XG4gIH1cblxuICBwcml2YXRlIGNyZWF0ZUNvbXBvbmVudEJ5U2hhcmVkQ29tcG9uZW50KHlNYXA6IFlNYXA8YW55Pik6IENvbXBvbmVudEluc3RhbmNlIHtcbiAgICBjb25zdCBzaGFyZWRTbG90cyA9IHlNYXAuZ2V0KCdzbG90cycpIGFzIFlBcnJheTxZTWFwPGFueT4+XG4gICAgY29uc3Qgc2xvdHM6IFNsb3RbXSA9IFtdXG4gICAgc2hhcmVkU2xvdHMubWFwKHNoYXJlZFNsb3QgPT4ge1xuICAgICAgY29uc3Qgc2xvdCA9IHRoaXMuY3JlYXRlU2xvdEJ5U2hhcmVkU2xvdChzaGFyZWRTbG90KVxuICAgICAgc2xvdHMucHVzaChzbG90KVxuICAgIH0pXG4gICAgY29uc3QgbmFtZSA9IHlNYXAuZ2V0KCduYW1lJylcbiAgICBjb25zdCBpbnN0YW5jZSA9IHRoaXMudHJhbnNsYXRvci5jcmVhdGVDb21wb25lbnRCeURhdGEobmFtZSwge1xuICAgICAgc3RhdGU6IHlNYXAuZ2V0KCdzdGF0ZScpLFxuICAgICAgc2xvdHNcbiAgICB9KVxuICAgIGlmIChpbnN0YW5jZSkge1xuICAgICAgaW5zdGFuY2Uuc2xvdHMudG9BcnJheSgpLmZvckVhY2goKHNsb3QsIGluZGV4KSA9PiB7XG4gICAgICAgIGNvbnN0IHNoYXJlZFNsb3QgPSBzaGFyZWRTbG90cy5nZXQoaW5kZXgpXG4gICAgICAgIHRoaXMuc3luY1Nsb3Qoc2hhcmVkU2xvdCwgc2xvdClcbiAgICAgICAgdGhpcy5zeW5jQ29udGVudChzaGFyZWRTbG90LmdldCgnY29udGVudCcpLCBzbG90KVxuICAgICAgfSlcbiAgICAgIHJldHVybiBpbnN0YW5jZVxuICAgIH1cbiAgICB0aHJvdyBjb2xsYWJvcmF0ZUVycm9yRm4oYGNhbm5vdCBmaW5kIGNvbXBvbmVudCBmYWN0b3J5IFxcYCR7bmFtZX1cXGAuYClcbiAgfVxuXG4gIHByaXZhdGUgY3JlYXRlU2xvdEJ5U2hhcmVkU2xvdChzaGFyZWRTbG90OiBZTWFwPGFueT4pOiBTbG90IHtcbiAgICBjb25zdCBjb250ZW50ID0gc2hhcmVkU2xvdC5nZXQoJ2NvbnRlbnQnKSBhcyBZVGV4dFxuICAgIGNvbnN0IGRlbHRhID0gY29udGVudC50b0RlbHRhKClcblxuICAgIGNvbnN0IHNsb3QgPSB0aGlzLnRyYW5zbGF0b3IuY3JlYXRlU2xvdCh7XG4gICAgICBzY2hlbWE6IHNoYXJlZFNsb3QuZ2V0KCdzY2hlbWEnKSxcbiAgICAgIHN0YXRlOiBzaGFyZWRTbG90LmdldCgnc3RhdGUnKSxcbiAgICAgIGZvcm1hdHM6IHt9LFxuICAgICAgY29udGVudDogW11cbiAgICB9KVxuXG4gICAgZm9yIChjb25zdCBhY3Rpb24gb2YgZGVsdGEpIHtcbiAgICAgIGlmIChhY3Rpb24uaW5zZXJ0KSB7XG4gICAgICAgIGlmICh0eXBlb2YgYWN0aW9uLmluc2VydCA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICBzbG90Lmluc2VydChhY3Rpb24uaW5zZXJ0LCBhY3Rpb24uYXR0cmlidXRlcyA/IE9iamVjdC5rZXlzKGFjdGlvbi5hdHRyaWJ1dGVzKS5tYXAoa2V5ID0+IHtcbiAgICAgICAgICAgIHJldHVybiBbdGhpcy5yZWdpc3RyeS5nZXRGb3JtYXR0ZXIoa2V5KSEsIGFjdGlvbi5hdHRyaWJ1dGVzIVtrZXldXVxuICAgICAgICAgIH0pIDogW10pXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY29uc3Qgc2hhcmVkQ29tcG9uZW50ID0gYWN0aW9uLmluc2VydCBhcyBZTWFwPGFueT5cbiAgICAgICAgICBjb25zdCBjb21wb25lbnQgPSB0aGlzLmNyZWF0ZUNvbXBvbmVudEJ5U2hhcmVkQ29tcG9uZW50KHNoYXJlZENvbXBvbmVudClcbiAgICAgICAgICBzbG90Lmluc2VydChjb21wb25lbnQpXG4gICAgICAgICAgdGhpcy5zeW5jU2xvdHMoc2hhcmVkQ29tcG9uZW50LmdldCgnc2xvdHMnKSwgY29tcG9uZW50LnNsb3RzKVxuICAgICAgICAgIHRoaXMuc3luY0NvbXBvbmVudChzaGFyZWRDb21wb25lbnQsIGNvbXBvbmVudClcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhyb3cgY29sbGFib3JhdGVFcnJvckZuKCd1bmV4cGVjdGVkIGRlbHRhIGFjdGlvbi4nKVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gc2xvdFxuICB9XG59XG4iXX0=
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@textbus/collaborate",
3
- "version": "2.0.0-alpha.75",
3
+ "version": "2.0.0-alpha.77",
4
4
  "description": "Textbus is a rich text editor and framework that is highly customizable and extensible to achieve rich wysiwyg effects.",
5
5
  "main": "./bundles/public-api.js",
6
6
  "module": "./bundles/public-api.js",
@@ -27,8 +27,8 @@
27
27
  "dependencies": {
28
28
  "@tanbo/di": "^1.0.7",
29
29
  "@tanbo/stream": "^1.0.0",
30
- "@textbus/browser": "^2.0.0-alpha.75",
31
- "@textbus/core": "^2.0.0-alpha.74",
30
+ "@textbus/browser": "^2.0.0-alpha.77",
31
+ "@textbus/core": "^2.0.0-alpha.77",
32
32
  "reflect-metadata": "^0.1.13",
33
33
  "y-protocols": "^1.0.5",
34
34
  "yjs": "^13.5.27"
@@ -44,5 +44,5 @@
44
44
  "bugs": {
45
45
  "url": "https://github.com/textbus/textbus.git/issues"
46
46
  },
47
- "gitHead": "3f3dafa7e3389defc867b077354eb509968dd8f2"
47
+ "gitHead": "45633eb76846d20f1174586ab90a9aaaee4ce055"
48
48
  }
@@ -1,3 +1 @@
1
1
  export * from './collaborate-cursor'
2
- export * from './local-to-remote'
3
- export * from './remote-to-local'