@textbus/collaborate 2.0.0-beta.5 → 2.0.0-beta.8

Sign up to get free protection for your applications and to get access to all the features.
@@ -1,33 +1,39 @@
1
1
  import { SelectionBridge } from '@textbus/browser';
2
- import { Selection, SelectionPaths } from '@textbus/core';
2
+ import { Selection, SelectionPaths, Range as TBRange } from '@textbus/core';
3
3
  export interface RemoteSelection {
4
4
  color: string;
5
5
  username: string;
6
6
  paths: SelectionPaths;
7
7
  }
8
- export interface SelectionRect {
9
- color: string;
10
- username: string;
8
+ export interface Rect {
11
9
  x: number;
12
10
  y: number;
13
11
  width: number;
14
12
  height: number;
15
13
  }
14
+ export interface SelectionRect extends Rect {
15
+ color: string;
16
+ username: string;
17
+ }
16
18
  export interface RemoteSelectionCursor {
17
19
  cursor: HTMLElement;
18
20
  anchor: HTMLElement;
19
21
  userTip: HTMLElement;
20
22
  }
23
+ export declare abstract class CollaborateCursorAwarenessDelegate {
24
+ abstract getRects(range: TBRange, nativeRange: Range): false | Rect[];
25
+ }
21
26
  export declare class CollaborateCursor {
22
27
  private container;
23
28
  private document;
29
+ private awarenessDelegate;
24
30
  private nativeSelection;
25
31
  private selection;
26
32
  private canvas;
27
33
  private context;
28
34
  private tooltips;
29
35
  private onRectsChange;
30
- constructor(container: HTMLElement, document: Document, nativeSelection: SelectionBridge, selection: Selection);
36
+ constructor(container: HTMLElement, document: Document, awarenessDelegate: CollaborateCursorAwarenessDelegate, nativeSelection: SelectionBridge, selection: Selection);
31
37
  draw(paths: RemoteSelection[]): void;
32
38
  private drawUserCursor;
33
39
  private getUserCursor;
@@ -10,12 +10,14 @@ var __metadata = (this && this.__metadata) || function (k, v) {
10
10
  var __param = (this && this.__param) || function (paramIndex, decorator) {
11
11
  return function (target, key) { decorator(target, key, paramIndex); }
12
12
  };
13
- import { Inject, Injectable } from '@tanbo/di';
13
+ import { Inject, Injectable, Optional } from '@tanbo/di';
14
14
  import { createElement, EDITABLE_DOCUMENT, EDITOR_CONTAINER, getLayoutRectByRange, SelectionBridge } from '@textbus/browser';
15
15
  import { Selection } from '@textbus/core';
16
16
  import { Subject } from '@tanbo/stream';
17
+ export class CollaborateCursorAwarenessDelegate {
18
+ }
17
19
  let CollaborateCursor = class CollaborateCursor {
18
- constructor(container, document, nativeSelection, selection) {
20
+ constructor(container, document, awarenessDelegate, nativeSelection, selection) {
19
21
  Object.defineProperty(this, "container", {
20
22
  enumerable: true,
21
23
  configurable: true,
@@ -28,6 +30,12 @@ let CollaborateCursor = class CollaborateCursor {
28
30
  writable: true,
29
31
  value: document
30
32
  });
33
+ Object.defineProperty(this, "awarenessDelegate", {
34
+ enumerable: true,
35
+ configurable: true,
36
+ writable: true,
37
+ value: awarenessDelegate
38
+ });
31
39
  Object.defineProperty(this, "nativeSelection", {
32
40
  enumerable: true,
33
41
  configurable: true,
@@ -109,44 +117,57 @@ let CollaborateCursor = class CollaborateCursor {
109
117
  const startSlot = this.selection.findSlotByPaths(item.paths.start);
110
118
  const endOffset = item.paths.end.pop();
111
119
  const endSlot = this.selection.findSlotByPaths(item.paths.end);
112
- if (startSlot && endSlot) {
113
- const position = this.nativeSelection.getPositionByRange({
120
+ if (!startSlot || !endSlot) {
121
+ return;
122
+ }
123
+ const { start, end } = this.nativeSelection.getPositionByRange({
124
+ startOffset,
125
+ endOffset,
126
+ startSlot,
127
+ endSlot
128
+ });
129
+ if (!start || !end) {
130
+ return;
131
+ }
132
+ const nativeRange = this.document.createRange();
133
+ nativeRange.setStart(start.node, start.offset);
134
+ nativeRange.setEnd(end.node, end.offset);
135
+ let rects = false;
136
+ if (this.awarenessDelegate) {
137
+ rects = this.awarenessDelegate.getRects({
114
138
  startOffset,
115
139
  endOffset,
116
140
  startSlot,
117
141
  endSlot
142
+ }, nativeRange);
143
+ }
144
+ if (!rects) {
145
+ rects = nativeRange.getClientRects();
146
+ }
147
+ const selectionRects = [];
148
+ for (let i = rects.length - 1; i >= 0; i--) {
149
+ const rect = rects[i];
150
+ selectionRects.push({
151
+ color: item.color,
152
+ username: item.username,
153
+ x: rect.x - containerRect.x,
154
+ y: rect.y - containerRect.y,
155
+ width: rect.width,
156
+ height: rect.height,
118
157
  });
119
- if (position.start && position.end) {
120
- const nativeRange = this.document.createRange();
121
- nativeRange.setStart(position.start.node, position.start.offset);
122
- nativeRange.setEnd(position.end.node, position.end.offset);
123
- const rects = nativeRange.getClientRects();
124
- const selectionRects = [];
125
- for (let i = rects.length - 1; i >= 0; i--) {
126
- const rect = rects[i];
127
- selectionRects.push({
128
- color: item.color,
129
- username: item.username,
130
- x: rect.x - containerRect.x,
131
- y: rect.y - containerRect.y,
132
- width: rect.width,
133
- height: rect.height,
134
- });
135
- }
136
- this.onRectsChange.next(selectionRects);
137
- const cursorRange = nativeRange.cloneRange();
138
- cursorRange.collapse(!item.paths.focusEnd);
139
- const cursorRect = getLayoutRectByRange(cursorRange);
140
- users.push({
141
- username: item.username,
142
- color: item.color,
143
- x: cursorRect.x - containerRect.x,
144
- y: cursorRect.y - containerRect.y,
145
- width: 2,
146
- height: cursorRect.height
147
- });
148
- }
149
158
  }
159
+ this.onRectsChange.next(selectionRects);
160
+ const cursorRange = nativeRange.cloneRange();
161
+ cursorRange.collapse(!item.paths.focusEnd);
162
+ const cursorRect = getLayoutRectByRange(cursorRange);
163
+ users.push({
164
+ username: item.username,
165
+ color: item.color,
166
+ x: cursorRect.x - containerRect.x,
167
+ y: cursorRect.y - containerRect.y,
168
+ width: 2,
169
+ height: cursorRect.height
170
+ });
150
171
  });
151
172
  this.drawUserCursor(users);
152
173
  }
@@ -236,10 +257,12 @@ CollaborateCursor = __decorate([
236
257
  Injectable(),
237
258
  __param(0, Inject(EDITOR_CONTAINER)),
238
259
  __param(1, Inject(EDITABLE_DOCUMENT)),
260
+ __param(2, Optional()),
239
261
  __metadata("design:paramtypes", [HTMLElement,
240
262
  Document,
263
+ CollaborateCursorAwarenessDelegate,
241
264
  SelectionBridge,
242
265
  Selection])
243
266
  ], CollaborateCursor);
244
267
  export { CollaborateCursor };
245
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29sbGFib3JhdGUtY3Vyc29yLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL2NvbGxhYm9yYXRlLWN1cnNvci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7QUFBQSxPQUFPLEVBQUUsTUFBTSxFQUFFLFVBQVUsRUFBRSxNQUFNLFdBQVcsQ0FBQTtBQUM5QyxPQUFPLEVBQ0wsYUFBYSxFQUNiLGlCQUFpQixFQUNqQixnQkFBZ0IsRUFDaEIsb0JBQW9CLEVBQ3BCLGVBQWUsRUFDaEIsTUFBTSxrQkFBa0IsQ0FBQTtBQUN6QixPQUFPLEVBQUUsU0FBUyxFQUFrQixNQUFNLGVBQWUsQ0FBQTtBQUN6RCxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sZUFBZSxDQUFBO0FBd0J2QyxJQUFhLGlCQUFpQixHQUE5QixNQUFhLGlCQUFpQjtJQTRCNUIsWUFBOEMsU0FBc0IsRUFDckIsUUFBa0IsRUFDN0MsZUFBZ0MsRUFDaEMsU0FBb0I7Ozs7O21CQUhNOzs7Ozs7bUJBQ0M7Ozs7OzttQkFDM0I7Ozs7OzttQkFDQTs7UUE5QnBCOzs7O21CQUFpQixhQUFhLENBQUMsUUFBUSxFQUFFO2dCQUN2QyxNQUFNLEVBQUU7b0JBQ04sUUFBUSxFQUFFLFVBQVU7b0JBQ3BCLE9BQU8sRUFBRSxHQUFHO29CQUNaLElBQUksRUFBRSxDQUFDO29CQUNQLEdBQUcsRUFBRSxDQUFDO29CQUNOLEtBQUssRUFBRSxNQUFNO29CQUNiLE1BQU0sRUFBRSxNQUFNO29CQUNkLGFBQWEsRUFBRSxNQUFNO2lCQUN0QjthQUNGLENBQXNCO1dBQUE7UUFDdkI7Ozs7bUJBQWtCLElBQUksQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBRTtXQUFBO1FBQy9DOzs7O21CQUFtQixhQUFhLENBQUMsS0FBSyxFQUFFO2dCQUN0QyxNQUFNLEVBQUU7b0JBQ04sUUFBUSxFQUFFLFVBQVU7b0JBQ3BCLElBQUksRUFBRSxDQUFDO29CQUNQLEdBQUcsRUFBRSxD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b20gJ0B0YW5iby9kaSdcbmltcG9ydCB7XG4gIGNyZWF0ZUVsZW1lbnQsXG4gIEVESVRBQkxFX0RPQ1VNRU5ULFxuICBFRElUT1JfQ09OVEFJTkVSLFxuICBnZXRMYXlvdXRSZWN0QnlSYW5nZSxcbiAgU2VsZWN0aW9uQnJpZGdlXG59IGZyb20gJ0B0ZXh0YnVzL2Jyb3dzZXInXG5pbXBvcnQgeyBTZWxlY3Rpb24sIFNlbGVjdGlvblBhdGhzIH0gZnJvbSAnQHRleHRidXMvY29yZSdcbmltcG9ydCB7IFN1YmplY3QgfSBmcm9tICdAdGFuYm8vc3RyZWFtJ1xuXG5leHBvcnQgaW50ZXJmYWNlIFJlbW90ZVNlbGVjdGlvbiB7XG4gIGNvbG9yOiBzdHJpbmdcbiAgdXNlcm5hbWU6IHN0cmluZ1xuICBwYXRoczogU2VsZWN0aW9uUGF0aHNcbn1cblxuZXhwb3J0IGludGVyZmFjZSBTZWxlY3Rpb25SZWN0IHtcbiAgY29sb3I6IHN0cmluZ1xuICB1c2VybmFtZTogc3RyaW5nXG4gIHg6IG51bWJlclxuICB5OiBudW1iZXJcbiAgd2lkdGg6IG51bWJlclxuICBoZWlnaHQ6IG51bWJlclxufVxuXG5leHBvcnQgaW50ZXJmYWNlIFJlbW90ZVNlbGVjdGlvbkN1cnNvciB7XG4gIGN1cnNvcjogSFRNTEVsZW1lbnRcbiAgYW5jaG9yOiBIVE1MRWxlbWVudFxuICB1c2VyVGlwOiBIVE1MRWxlbWVudFxufVxuXG5ASW5qZWN0YWJsZSgpXG5leHBvcnQgY2xhc3MgQ29sbGFib3JhdGVDdXJzb3Ige1xuICBwcml2YXRlIGNhbnZhcyA9IGNyZWF0ZUVsZW1lbnQoJ2NhbnZhcycsIHtcbiAgICBzdHlsZXM6IHtcbiAgICAgIHBvc2l0aW9uOiAnYWJzb2x1dGUnLFxuICAgICAgb3BhY2l0eTogMC41LFxuICAgICAgbGVmdDogMCxcbiAgICAgIHRvcDogMCxcbiAgICAgIHdpZHRoOiAnMTAwJScsXG4gICAgICBoZWlnaHQ6ICcxMDAlJyxcbiAgICAgIHBvaW50ZXJFdmVudHM6ICdub25lJ1xuICAgIH1cbiAgfSkgYXMgSFRNTENhbnZhc0VsZW1lbnRcbiAgcHJpdmF0ZSBjb250ZXh0ID0gdGhpcy5jYW52YXMuZ2V0Q29udGV4dCgnMmQnKSFcbiAgcHJpdmF0ZSB0b29sdGlwcyA9IGNyZWF0ZUVsZW1lbnQoJ2RpdicsIHtcbiAgICBzdHlsZXM6IHtcbiAgICAgIHBvc2l0aW9uOiAnYWJzb2x1dGUnLFxuICAgICAgbGVmdDogMCxcbiAgICAgIHRvcDogMCxcbiAgICAgIHdpZHRoOiAnMTAwJScsXG4gICAgICBoZWlnaHQ6ICcxMDAlJyxcbiAgICAgIHBvaW50ZXJFdmVudHM6ICdub25lJyxcbiAgICAgIGZvbnRTaXplOiAnMTJweCcsXG4gICAgICB6SW5kZXg6IDEwXG4gICAgfVxuICB9KVxuXG4gIHByaXZhdGUgb25SZWN0c0NoYW5nZSA9IG5ldyBTdWJqZWN0PFNlbGVjdGlvblJlY3RbXT4oKVxuXG4gIGNvbnN0cnVjdG9yKEBJbmplY3QoRURJVE9SX0NPTlRBSU5FUikgcHJpdmF0ZSBjb250YWluZXI6IEhUTUxFbGVtZW50LFxuICAgICAgICAgICAgICBASW5qZWN0KEVESVRBQkxFX0RPQ1VNRU5UKSBwcml2YXRlIGRvY3VtZW50OiBEb2N1bWVudCxcbiAgICAgICAgICAgICAgcHJpdmF0ZSBuYXRpdmVTZWxlY3Rpb246IFNlbGVjdGlvbkJyaWRnZSxcbiAgICAgICAgICAgICAgcHJpdmF0ZSBzZWxlY3Rpb246IFNlbGVjdGlvbikge1xuICAgIGNvbnRhaW5lci5wcmVwZW5kKHRoaXMuY2FudmFzLCB0aGlzLnRvb2x0aXBzKVxuICAgIHRoaXMub25SZWN0c0NoYW5nZS5zdWJzY3JpYmUocmVjdHMgPT4ge1xuICAgICAgZm9yIChjb25zdCByZWN0IG9mIHJlY3RzKSB7XG4gICAgICAgIHRoaXMuY29udGV4dC5maWxsU3R5bGUgPSByZWN0LmNvbG9yXG4gICAgICAgIHRoaXMuY29udGV4dC5iZWdpblBhdGgoKVxuICAgICAgICB0aGlzLmNvbnRleHQucmVjdChyZWN0LngsIHJlY3QueSwgcmVjdC53aWR0aCwgcmVjdC5oZWlnaHQpXG4gICAgICAgIHRoaXMuY29udGV4dC5maWxsKClcbiAgICAgICAgdGhpcy5jb250ZXh0LmNsb3NlUGF0aCgpXG4gICAgICB9XG4gICAgfSlcbiAgfVxuXG4gIGRyYXcocGF0aHM6IFJlbW90ZVNlbGVjdGlvbltdKSB7XG4gICAgY29uc3QgY29udGFpbmVyUmVjdCA9IHRoaXMuY29udGFpbmVyLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpXG4gICAgdGhpcy5jYW52YXMud2lkdGggPSBjb250YWluZXJSZWN0LndpZHRoXG4gICAgdGhpcy5jYW52YXMuaGVpZ2h0ID0gY29udGFpbmVyUmVjdC5oZWlnaHRcbiAgICB0aGlzLmNvbnRleHQuY2xlYXJSZWN0KDAsIDAsIHRoaXMuY2FudmFzLndpZHRoLCB0aGlzLmNhbnZhcy5oZWlnaHQpXG5cbiAgICBjb25zdCB1c2VyczogU2VsZWN0aW9uUmVjdFtdID0gW11cblxuXG4gICAgcGF0aHMuZmlsdGVyKGkgPT4ge1xuICAgICAgcmV0dXJuIGkucGF0aHMuc3RhcnQubGVuZ3RoICYmIGkucGF0aHMuZW5kLmxlbmd0aFxuICAgIH0pLmZvckVhY2goaXRlbSA9PiB7XG4gICAgICBjb25zdCBzdGFydE9mZnNldCA9IGl0ZW0ucGF0aHMuc3RhcnQucG9wKCkhXG4gICAgICBjb25zdCBzdGFydFNsb3QgPSB0aGlzLnNlbGVjdGlvbi5maW5kU2xvdEJ5UGF0aHMoaXRlbS5wYXRocy5zdGFydClcbiAgICAgIGNvbnN0IGVuZE9mZnNldCA9IGl0ZW0ucGF0aHMuZW5kLnBvcCgpIVxuICAgICAgY29uc3QgZW5kU2xvdCA9IHRoaXMuc2VsZWN0aW9uLmZpbmRTbG90QnlQYXRocyhpdGVtLnBhdGhzLmVuZClcblxuICAgICAgaWYgKHN0YXJ0U2xvdCAmJiBlbmRTbG90KSB7XG4gICAgICAgIGNvbnN0IHBvc2l0aW9uID0gdGhpcy5uYXRpdmVTZWxlY3Rpb24uZ2V0UG9zaXRpb25CeVJhbmdlKHtcbiAgICAgICAgICBzdGFydE9mZnNldCxcbiAgICAgICAgICBlbmRPZmZzZXQsXG4gICAgICAgICAgc3RhcnRTbG90LFxuICAgICAgICAgIGVuZFNsb3RcbiAgICAgICAgfSlcbiAgICAgICAgaWYgKHBvc2l0aW9uLnN0YXJ0ICYmIHBvc2l0aW9uLmVuZCkge1xuICAgICAgICAgIGNvbnN0IG5hdGl2ZVJhbmdlID0gdGhpcy5kb2N1bWVudC5jcmVhdGVSYW5nZSgpXG4gICAgICAgICAgbmF0aXZlUmFuZ2Uuc2V0U3RhcnQocG9zaXRpb24uc3RhcnQubm9kZSwgcG9zaXRpb24uc3RhcnQub2Zmc2V0KVxuICAgICAgICAgIG5hdGl2ZVJhbmdlLnNldEVuZChwb3NpdGlvbi5lbmQubm9kZSwgcG9zaXRpb24uZW5kLm9mZnNldClcblxuICAgICAgICAgIGNvbnN0IHJlY3RzID0gbmF0aXZlUmFuZ2UuZ2V0Q2xpZW50UmVjdHMoKVxuICAgICAgICAgIGNvbnN0IHNlbGVjdGlvblJlY3RzOiBTZWxlY3Rpb25SZWN0W10gPSBbXVxuICAgICAgICAgIGZvciAobGV0IGkgPSByZWN0cy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgICAgICAgICAgY29uc3QgcmVjdCA9IHJlY3RzW2ldXG4gICAgICAgICAgICBzZWxlY3Rpb25SZWN0cy5wdXNoKHtcbiAgICAgICAgICAgICAgY29sb3I6IGl0ZW0uY29sb3IsXG4gICAgICAgICAgICAgIHVzZXJuYW1lOiBpdGVtLnVzZXJuYW1lLFxuICAgICAgICAgICAgICB4OiByZWN0LnggLSBjb250YWluZXJSZWN0LngsXG4gICAgICAgICAgICAgIHk6IHJlY3QueSAtIGNvbnRhaW5lclJlY3QueSxcbiAgICAgICAgICAgICAgd2lkdGg6IHJlY3Qud2lkdGgsXG4gICAgICAgICAgICAgIGhlaWdodDogcmVjdC5oZWlnaHQsXG4gICAgICAgICAgICB9KVxuICAgICAgICAgIH1cbiAgICAgICAgICB0aGlzLm9uUmVjdHNDaGFuZ2UubmV4dChzZWxlY3Rpb25SZWN0cylcblxuICAgICAgICAgIGNvbnN0IGN1cnNvclJhbmdlID0gbmF0aXZlUmFuZ2UuY2xvbmVSYW5nZSgpXG4gICAgICAgICAgY3Vyc29yUmFuZ2UuY29sbGFwc2UoIWl0ZW0ucGF0aHMuZm9jdXNFbmQpXG5cbiAgICAgICAgICBjb25zdCBjdXJzb3JSZWN0ID0gZ2V0TGF5b3V0UmVjdEJ5UmFuZ2UoY3Vyc29yUmFuZ2UpXG5cbiAgICAgICAgICB1c2Vycy5wdXNoKHtcbiAgICAgICAgICAgIHVzZXJuYW1lOiBpdGVtLnVzZXJuYW1lLFxuICAgICAgICAgICAgY29sb3I6IGl0ZW0uY29sb3IsXG4gICAgICAgICAgICB4OiBjdXJzb3JSZWN0LnggLSBjb250YWluZXJSZWN0LngsXG4gICAgICAgICAgICB5OiBjdXJzb3JSZWN0LnkgLSBjb250YWluZXJSZWN0LnksXG4gICAgICAgICAgICB3aWR0aDogMixcbiAgICAgICAgICAgIGhlaWdodDogY3Vyc29yUmVjdC5oZWlnaHRcbiAgICAgICAgICB9KVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSlcbiAgICB0aGlzLmRyYXdVc2VyQ3Vyc29yKHVzZXJzKVxuICB9XG5cbiAgcHJpdmF0ZSBkcmF3VXNlckN1cnNvcihyZWN0czogU2VsZWN0aW9uUmVjdFtdKSB7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCByZWN0cy5sZW5ndGg7IGkrKykge1xuICAgICAgY29uc3QgcmVjdCA9IHJlY3RzW2ldXG4gICAgICBjb25zdCB7Y3Vyc29yLCB1c2VyVGlwLCBhbmNob3J9ID0gdGhpcy5nZXRVc2VyQ3Vyc29yKGkpXG4gICAgICBPYmplY3QuYXNzaWduKGN1cnNvci5zdHlsZSwge1xuICAgICAgICBsZWZ0OiByZWN0LnggKyAncHgnLFxuICAgICAgICB0b3A6IHJlY3QueSArICdweCcsXG4gICAgICAgIHdpZHRoOiByZWN0LndpZHRoICsgJ3B4JyxcbiAgICAgICAgaGVpZ2h0OiByZWN0LmhlaWdodCArICdweCcsXG4gICAgICAgIGJhY2tncm91bmQ6IHJlY3QuY29sb3IsXG4gICAgICAgIGRpc3BsYXk6ICdibG9jaydcbiAgICAgIH0pXG4gICAgICBhbmNob3Iuc3R5bGUuYmFja2dyb3VuZCA9IHJlY3QuY29sb3JcbiAgICAgIHVzZXJUaXAuaW5uZXJUZXh0ID0gcmVjdC51c2VybmFtZVxuICAgICAgdXNlclRpcC5zdHlsZS5iYWNrZ3JvdW5kID0gcmVjdC5jb2xvclxuICAgIH1cblxuICAgIGZvciAobGV0IGkgPSByZWN0cy5sZW5ndGg7IGkgPCB0aGlzLnRvb2x0aXBzLmNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7XG4gICAgICB0aGlzLnRvb2x0aXBzLnJlbW92ZUNoaWxkKHRoaXMudG9vbHRpcHMuY2hpbGRyZW5baV0pXG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBnZXRVc2VyQ3Vyc29yKGluZGV4OiBudW1iZXIpOiBSZW1vdGVTZWxlY3Rpb25DdXJzb3Ige1xuICAgIGxldCBjaGlsZDogSFRNTEVsZW1lbnQgPSB0aGlzLnRvb2x0aXBzLmNoaWxkcmVuW2luZGV4XSBhcyBIVE1MRWxlbWVudFxuICAgIGlmIChjaGlsZCkge1xuICAgICAgY29uc3QgYW5jaG9yID0gY2hpbGQuY2hpbGRyZW5bMF0gYXMgSFRNTEVsZW1lbnRcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGN1cnNvcjogY2hpbGQsXG4gICAgICAgIGFuY2hvcixcbiAgICAgICAgdXNlclRpcDogYW5jaG9yLmNoaWxkcmVuWzBdIGFzIEhUTUxFbGVtZW50XG4gICAgICB9XG4gICAgfVxuICAgIGNvbnN0IHVzZXJUaXAgPSBjcmVhdGVFbGVtZW50KCdzcGFuJywge1xuICAgICAgc3R5bGVzOiB7XG4gICAgICAgIHBvc2l0aW9uOiAnYWJzb2x1dGUnLFxuICAgICAgICBkaXNwbGF5OiAnbm9uZScsXG4gICAgICAgIGxlZnQ6ICc1MCUnLFxuICAgICAgICB0cmFuc2Zvcm06ICd0cmFuc2xhdGVYKC01MCUpJyxcbiAgICAgICAgbWFyZ2luQm90dG9tOiAnMnB4JyxcbiAgICAgICAgYm90dG9tOiAnMTAwJScsXG4gICAgICAgIHdoaXRlU3BhY2U6ICdub3dyYXAnLFxuICAgICAgICBjb2xvcjogJyNmZmYnLFxuICAgICAgICBib3hTaGFkb3c6ICcwIDFweCAycHggcmdiYSgwLDAsMCwuMSknLFxuICAgICAgICBib3JkZXJSYWRpdXM6ICczcHgnLFxuICAgICAgICBwYWRkaW5nOiAnM3B4IDVweCcsXG4gICAgICAgIHBvaW50ZXJFdmVudHM6ICdub25lJyxcbiAgICAgIH1cbiAgICB9KVxuXG4gICAgY29uc3QgYW5jaG9yID0gY3JlYXRlRWxlbWVudCgnc3BhbicsIHtcbiAgICAgIHN0eWxlczoge1xuICAgICAgICBwb3NpdGlvbjogJ2Fic29sdXRlJyxcbiAgICAgICAgdG9wOiAnLTJweCcsXG4gICAgICAgIGxlZnQ6ICctMnB4JyxcbiAgICAgICAgd2lkdGg6ICc2cHgnLFxuICAgICAgICBoZWlnaHQ6ICc2cHgnLFxuICAgICAgICBwb2ludGVyRXZlbnRzOiAnYXV0bycsXG4gICAgICAgIHBvaW50ZXI6ICdjdXJzb3InLFxuICAgICAgfSxcbiAgICAgIGNoaWxkcmVuOiBbdXNlclRpcF0sXG4gICAgICBvbjoge1xuICAgICAgICBtb3VzZWVudGVyKCkge1xuICAgICAgICAgIHVzZXJUaXAuc3R5bGUuZGlzcGxheSA9ICdibG9jaydcbiAgICAgICAgfSxcbiAgICAgICAgbW91c2VsZWF2ZSgpIHtcbiAgICAgICAgICB1c2VyVGlwLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSdcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pXG4gICAgY2hpbGQgPSBjcmVhdGVFbGVtZW50KCdzcGFuJywge1xuICAgICAgc3R5bGVzOiB7XG4gICAgICAgIHBvc2l0aW9uOiAnYWJzb2x1dGUnLFxuICAgICAgfSxcbiAgICAgIGNoaWxkcmVuOiBbXG4gICAgICAgIGFuY2hvclxuICAgICAgXVxuICAgIH0pXG4gICAgdGhpcy50b29sdGlwcy5hcHBlbmQoY2hpbGQpXG4gICAgcmV0dXJuIHtcbiAgICAgIGN1cnNvcjogY2hpbGQsXG4gICAgICBhbmNob3IsXG4gICAgICB1c2VyVGlwXG4gICAgfVxuICB9XG59XG4iXX0=
268
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29sbGFib3JhdGUtY3Vyc29yLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL2NvbGxhYm9yYXRlLWN1cnNvci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7QUFBQSxPQUFPLEVBQUUsTUFBTSxFQUFFLFVBQVUsRUFBRSxRQUFRLEVBQUUsTUFBTSxXQUFXLENBQUE7QUFDeEQsT0FBTyxFQUNMLGFBQWEsRUFDYixpQkFBaUIsRUFDakIsZ0JBQWdCLEVBQ2hCLG9CQUFvQixFQUNwQixlQUFlLEVBQ2hCLE1BQU0sa0JBQWtCLENBQUE7QUFDekIsT0FBTyxFQUFFLFNBQVMsRUFBb0MsTUFBTSxlQUFlLENBQUE7QUFDM0UsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLGVBQWUsQ0FBQTtBQTBCdkMsTUFBTSxPQUFnQixrQ0FBa0M7Q0FFdkQ7QUFHRCxJQUFhLGlCQUFpQixHQUE5QixNQUFhLGlCQUFpQjtJQTRCNUIsWUFBOEMsU0FBc0IsRUFDckIsUUFBa0IsRUFDakMsaUJBQXFELEVBQ2pFLGVBQWdDLEVBQ2hDLFNBQW9COzs7OzttQkFKTTs7Ozs7O21CQUNDOzs7Ozs7bUJBQ2Y7Ozs7OzttQkFDWjs7Ozs7O21CQUNBOztRQS9CcEI7Ozs7bUJBQWlCLGFBQWEsQ0FBQyxRQUFRLEVBQUU7Z0JBQ3ZDLE1BQU0sRUFBRTtvQkFDTixRQUFRLEVBQUUsVUFBVTtvQkFDcEIsT0FBTyxFQUFFLEdBQUc7b0JBQ1osSUFBSSxFQUFFLENBQUM7b0JBQ1AsR0FBRyxFQUFFLENBQUM7b0JBQ04sS0FBSyxFQUFFLE1BQU07b0JBQ2IsTUFBTSxFQUFFLE1BQU07b0JBQ2QsYUFBYSxFQUFFLE1BQU07aUJBQ3RCO2FBQ0YsQ0FBc0I7V0FBQTtRQUN2Qjs7OzttQkFBa0IsSUFBSSxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFFO1dBQUE7UUFDL0M7Ozs7bUJBQW1CLGFBQWEsQ0FBQyxLQUFLLEVBQUU7Z0JBQ3RDLE1BQU0sRUFB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Q1IsQ0FBQTtJQUNILENBQUM7Q0FDRixDQUFBO0FBN01ZLGlCQUFpQjtJQUQ3QixVQUFVLEVBQUU7SUE2QkUsV0FBQSxNQUFNLENBQUMsZ0JBQWdCLENBQUMsQ0FBQTtJQUN4QixXQUFBLE1BQU0sQ0FBQyxpQkFBaUIsQ0FBQyxDQUFBO0lBQ3pCLFdBQUEsUUFBUSxFQUFFLENBQUE7cUNBRmtDLFdBQVc7UUFDWCxRQUFRO1FBQ2Qsa0NBQWtDO1FBQ2hELGVBQWU7UUFDckIsU0FBUztHQWhDN0IsaUJBQWlCLENBNk03QjtTQTdNWSxpQkFBaUIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3QsIEluamVjdGFibGUsIE9wdGlvbmFsIH0gZnJvbSAnQHRhbmJvL2RpJ1xuaW1wb3J0IHtcbiAgY3JlYXRlRWxlbWVudCxcbiAgRURJVEFCTEVfRE9DVU1FTlQsXG4gIEVESVRPUl9DT05UQUlORVIsXG4gIGdldExheW91dFJlY3RCeVJhbmdlLFxuICBTZWxlY3Rpb25CcmlkZ2Vcbn0gZnJvbSAnQHRleHRidXMvYnJvd3NlcidcbmltcG9ydCB7IFNlbGVjdGlvbiwgU2VsZWN0aW9uUGF0aHMsIFJhbmdlIGFzIFRCUmFuZ2UgfSBmcm9tICdAdGV4dGJ1cy9jb3JlJ1xuaW1wb3J0IHsgU3ViamVjdCB9IGZyb20gJ0B0YW5iby9zdHJlYW0nXG5cbmV4cG9ydCBpbnRlcmZhY2UgUmVtb3RlU2VsZWN0aW9uIHtcbiAgY29sb3I6IHN0cmluZ1xuICB1c2VybmFtZTogc3RyaW5nXG4gIHBhdGhzOiBTZWxlY3Rpb25QYXRoc1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFJlY3Qge1xuICB4OiBudW1iZXJcbiAgeTogbnVtYmVyXG4gIHdpZHRoOiBudW1iZXJcbiAgaGVpZ2h0OiBudW1iZXJcbn1cblxuZXhwb3J0IGludGVyZmFjZSBTZWxlY3Rpb25SZWN0IGV4dGVuZHMgUmVjdCB7XG4gIGNvbG9yOiBzdHJpbmdcbiAgdXNlcm5hbWU6IHN0cmluZ1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFJlbW90ZVNlbGVjdGlvbkN1cnNvciB7XG4gIGN1cnNvcjogSFRNTEVsZW1lbnRcbiAgYW5jaG9yOiBIVE1MRWxlbWVudFxuICB1c2VyVGlwOiBIVE1MRWxlbWVudFxufVxuXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgQ29sbGFib3JhdGVDdXJzb3JBd2FyZW5lc3NEZWxlZ2F0ZSB7XG4gIGFic3RyYWN0IGdldFJlY3RzKHJhbmdlOiBUQlJhbmdlLCBuYXRpdmVSYW5nZTogUmFuZ2UpOiBmYWxzZSB8IFJlY3RbXVxufVxuXG5ASW5qZWN0YWJsZSgpXG5leHBvcnQgY2xhc3MgQ29sbGFib3JhdGVDdXJzb3Ige1xuICBwcml2YXRlIGNhbnZhcyA9IGNyZWF0ZUVsZW1lbnQoJ2NhbnZhcycsIHtcbiAgICBzdHlsZXM6IHtcbiAgICAgIHBvc2l0aW9uOiAnYWJzb2x1dGUnLFxuICAgICAgb3BhY2l0eTogMC41LFxuICAgICAgbGVmdDogMCxcbiAgICAgIHRvcDogMCxcbiAgICAgIHdpZHRoOiAnMTAwJScsXG4gICAgICBoZWlnaHQ6ICcxMDAlJyxcbiAgICAgIHBvaW50ZXJFdmVudHM6ICdub25lJ1xuICAgIH1cbiAgfSkgYXMgSFRNTENhbnZhc0VsZW1lbnRcbiAgcHJpdmF0ZSBjb250ZXh0ID0gdGhpcy5jYW52YXMuZ2V0Q29udGV4dCgnMmQnKSFcbiAgcHJpdmF0ZSB0b29sdGlwcyA9IGNyZWF0ZUVsZW1lbnQoJ2RpdicsIHtcbiAgICBzdHlsZXM6IHtcbiAgICAgIHBvc2l0aW9uOiAnYWJzb2x1dGUnLFxuICAgICAgbGVmdDogMCxcbiAgICAgIHRvcDogMCxcbiAgICAgIHdpZHRoOiAnMTAwJScsXG4gICAgICBoZWlnaHQ6ICcxMDAlJyxcbiAgICAgIHBvaW50ZXJFdmVudHM6ICdub25lJyxcbiAgICAgIGZvbnRTaXplOiAnMTJweCcsXG4gICAgICB6SW5kZXg6IDEwXG4gICAgfVxuICB9KVxuXG4gIHByaXZhdGUgb25SZWN0c0NoYW5nZSA9IG5ldyBTdWJqZWN0PFNlbGVjdGlvblJlY3RbXT4oKVxuXG4gIGNvbnN0cnVjdG9yKEBJbmplY3QoRURJVE9SX0NPTlRBSU5FUikgcHJpdmF0ZSBjb250YWluZXI6IEhUTUxFbGVtZW50LFxuICAgICAgICAgICAgICBASW5qZWN0KEVESVRBQkxFX0RPQ1VNRU5UKSBwcml2YXRlIGRvY3VtZW50OiBEb2N1bWVudCxcbiAgICAgICAgICAgICAgQE9wdGlvbmFsKCkgcHJpdmF0ZSBhd2FyZW5lc3NEZWxlZ2F0ZTogQ29sbGFib3JhdGVDdXJzb3JBd2FyZW5lc3NEZWxlZ2F0ZSxcbiAgICAgICAgICAgICAgcHJpdmF0ZSBuYXRpdmVTZWxlY3Rpb246IFNlbGVjdGlvbkJyaWRnZSxcbiAgICAgICAgICAgICAgcHJpdmF0ZSBzZWxlY3Rpb246IFNlbGVjdGlvbikge1xuICAgIGNvbnRhaW5lci5wcmVwZW5kKHRoaXMuY2FudmFzLCB0aGlzLnRvb2x0aXBzKVxuICAgIHRoaXMub25SZWN0c0NoYW5nZS5zdWJzY3JpYmUocmVjdHMgPT4ge1xuICAgICAgZm9yIChjb25zdCByZWN0IG9mIHJlY3RzKSB7XG4gICAgICAgIHRoaXMuY29udGV4dC5maWxsU3R5bGUgPSByZWN0LmNvbG9yXG4gICAgICAgIHRoaXMuY29udGV4dC5iZWdpblBhdGgoKVxuICAgICAgICB0aGlzLmNvbnRleHQucmVjdChyZWN0LngsIHJlY3QueSwgcmVjdC53aWR0aCwgcmVjdC5oZWlnaHQpXG4gICAgICAgIHRoaXMuY29udGV4dC5maWxsKClcbiAgICAgICAgdGhpcy5jb250ZXh0LmNsb3NlUGF0aCgpXG4gICAgICB9XG4gICAgfSlcbiAgfVxuXG4gIGRyYXcocGF0aHM6IFJlbW90ZVNlbGVjdGlvbltdKSB7XG4gICAgY29uc3QgY29udGFpbmVyUmVjdCA9IHRoaXMuY29udGFpbmVyLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpXG4gICAgdGhpcy5jYW52YXMud2lkdGggPSBjb250YWluZXJSZWN0LndpZHRoXG4gICAgdGhpcy5jYW52YXMuaGVpZ2h0ID0gY29udGFpbmVyUmVjdC5oZWlnaHRcbiAgICB0aGlzLmNvbnRleHQuY2xlYXJSZWN0KDAsIDAsIHRoaXMuY2FudmFzLndpZHRoLCB0aGlzLmNhbnZhcy5oZWlnaHQpXG5cbiAgICBjb25zdCB1c2VyczogU2VsZWN0aW9uUmVjdFtdID0gW11cblxuXG4gICAgcGF0aHMuZmlsdGVyKGkgPT4ge1xuICAgICAgcmV0dXJuIGkucGF0aHMuc3RhcnQubGVuZ3RoICYmIGkucGF0aHMuZW5kLmxlbmd0aFxuICAgIH0pLmZvckVhY2goaXRlbSA9PiB7XG4gICAgICBjb25zdCBzdGFydE9mZnNldCA9IGl0ZW0ucGF0aHMuc3RhcnQucG9wKCkhXG4gICAgICBjb25zdCBzdGFydFNsb3QgPSB0aGlzLnNlbGVjdGlvbi5maW5kU2xvdEJ5UGF0aHMoaXRlbS5wYXRocy5zdGFydClcbiAgICAgIGNvbnN0IGVuZE9mZnNldCA9IGl0ZW0ucGF0aHMuZW5kLnBvcCgpIVxuICAgICAgY29uc3QgZW5kU2xvdCA9IHRoaXMuc2VsZWN0aW9uLmZpbmRTbG90QnlQYXRocyhpdGVtLnBhdGhzLmVuZClcbiAgICAgIGlmICghc3RhcnRTbG90IHx8ICFlbmRTbG90KSB7XG4gICAgICAgIHJldHVyblxuICAgICAgfVxuXG4gICAgICBjb25zdCB7c3RhcnQsIGVuZH0gPSB0aGlzLm5hdGl2ZVNlbGVjdGlvbi5nZXRQb3NpdGlvbkJ5UmFuZ2Uoe1xuICAgICAgICBzdGFydE9mZnNldCxcbiAgICAgICAgZW5kT2Zmc2V0LFxuICAgICAgICBzdGFydFNsb3QsXG4gICAgICAgIGVuZFNsb3RcbiAgICAgIH0pXG4gICAgICBpZiAoIXN0YXJ0IHx8ICFlbmQpIHtcbiAgICAgICAgcmV0dXJuXG4gICAgICB9XG4gICAgICBjb25zdCBuYXRpdmVSYW5nZSA9IHRoaXMuZG9jdW1lbnQuY3JlYXRlUmFuZ2UoKVxuICAgICAgbmF0aXZlUmFuZ2Uuc2V0U3RhcnQoc3RhcnQubm9kZSwgc3RhcnQub2Zmc2V0KVxuICAgICAgbmF0aXZlUmFuZ2Uuc2V0RW5kKGVuZC5ub2RlLCBlbmQub2Zmc2V0KVxuXG4gICAgICBsZXQgcmVjdHM6IFJlY3RbXSB8IERPTVJlY3RMaXN0IHwgZmFsc2UgPSBmYWxzZVxuICAgICAgaWYgKHRoaXMuYXdhcmVuZXNzRGVsZWdhdGUpIHtcbiAgICAgICAgcmVjdHMgPSB0aGlzLmF3YXJlbmVzc0RlbGVnYXRlLmdldFJlY3RzKHtcbiAgICAgICAgICBzdGFydE9mZnNldCxcbiAgICAgICAgICBlbmRPZmZzZXQsXG4gICAgICAgICAgc3RhcnRTbG90LFxuICAgICAgICAgIGVuZFNsb3RcbiAgICAgICAgfSwgbmF0aXZlUmFuZ2UpXG4gICAgICB9XG4gICAgICBpZiAoIXJlY3RzKSB7XG4gICAgICAgIHJlY3RzID0gbmF0aXZlUmFuZ2UuZ2V0Q2xpZW50UmVjdHMoKVxuICAgICAgfVxuICAgICAgY29uc3Qgc2VsZWN0aW9uUmVjdHM6IFNlbGVjdGlvblJlY3RbXSA9IFtdXG4gICAgICBmb3IgKGxldCBpID0gcmVjdHMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICAgICAgY29uc3QgcmVjdCA9IHJlY3RzW2ldXG4gICAgICAgIHNlbGVjdGlvblJlY3RzLnB1c2goe1xuICAgICAgICAgIGNvbG9yOiBpdGVtLmNvbG9yLFxuICAgICAgICAgIHVzZXJuYW1lOiBpdGVtLnVzZXJuYW1lLFxuICAgICAgICAgIHg6IHJlY3QueCAtIGNvbnRhaW5lclJlY3QueCxcbiAgICAgICAgICB5OiByZWN0LnkgLSBjb250YWluZXJSZWN0LnksXG4gICAgICAgICAgd2lkdGg6IHJlY3Qud2lkdGgsXG4gICAgICAgICAgaGVpZ2h0OiByZWN0LmhlaWdodCxcbiAgICAgICAgfSlcbiAgICAgIH1cbiAgICAgIHRoaXMub25SZWN0c0NoYW5nZS5uZXh0KHNlbGVjdGlvblJlY3RzKVxuXG4gICAgICBjb25zdCBjdXJzb3JSYW5nZSA9IG5hdGl2ZVJhbmdlLmNsb25lUmFuZ2UoKVxuICAgICAgY3Vyc29yUmFuZ2UuY29sbGFwc2UoIWl0ZW0ucGF0aHMuZm9jdXNFbmQpXG5cbiAgICAgIGNvbnN0IGN1cnNvclJlY3QgPSBnZXRMYXlvdXRSZWN0QnlSYW5nZShjdXJzb3JSYW5nZSlcblxuICAgICAgdXNlcnMucHVzaCh7XG4gICAgICAgIHVzZXJuYW1lOiBpdGVtLnVzZXJuYW1lLFxuICAgICAgICBjb2xvcjogaXRlbS5jb2xvcixcbiAgICAgICAgeDogY3Vyc29yUmVjdC54IC0gY29udGFpbmVyUmVjdC54LFxuICAgICAgICB5OiBjdXJzb3JSZWN0LnkgLSBjb250YWluZXJSZWN0LnksXG4gICAgICAgIHdpZHRoOiAyLFxuICAgICAgICBoZWlnaHQ6IGN1cnNvclJlY3QuaGVpZ2h0XG4gICAgICB9KVxuICAgIH0pXG4gICAgdGhpcy5kcmF3VXNlckN1cnNvcih1c2VycylcbiAgfVxuXG4gIHByaXZhdGUgZHJhd1VzZXJDdXJzb3IocmVjdHM6IFNlbGVjdGlvblJlY3RbXSkge1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcmVjdHMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGNvbnN0IHJlY3QgPSByZWN0c1tpXVxuICAgICAgY29uc3Qge2N1cnNvciwgdXNlclRpcCwgYW5jaG9yfSA9IHRoaXMuZ2V0VXNlckN1cnNvcihpKVxuICAgICAgT2JqZWN0LmFzc2lnbihjdXJzb3Iuc3R5bGUsIHtcbiAgICAgICAgbGVmdDogcmVjdC54ICsgJ3B4JyxcbiAgICAgICAgdG9wOiByZWN0LnkgKyAncHgnLFxuICAgICAgICB3aWR0aDogcmVjdC53aWR0aCArICdweCcsXG4gICAgICAgIGhlaWdodDogcmVjdC5oZWlnaHQgKyAncHgnLFxuICAgICAgICBiYWNrZ3JvdW5kOiByZWN0LmNvbG9yLFxuICAgICAgICBkaXNwbGF5OiAnYmxvY2snXG4gICAgICB9KVxuICAgICAgYW5jaG9yLnN0eWxlLmJhY2tncm91bmQgPSByZWN0LmNvbG9yXG4gICAgICB1c2VyVGlwLmlubmVyVGV4dCA9IHJlY3QudXNlcm5hbWVcbiAgICAgIHVzZXJUaXAuc3R5bGUuYmFja2dyb3VuZCA9IHJlY3QuY29sb3JcbiAgICB9XG5cbiAgICBmb3IgKGxldCBpID0gcmVjdHMubGVuZ3RoOyBpIDwgdGhpcy50b29sdGlwcy5jaGlsZHJlbi5sZW5ndGg7IGkrKykge1xuICAgICAgdGhpcy50b29sdGlwcy5yZW1vdmVDaGlsZCh0aGlzLnRvb2x0aXBzLmNoaWxkcmVuW2ldKVxuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgZ2V0VXNlckN1cnNvcihpbmRleDogbnVtYmVyKTogUmVtb3RlU2VsZWN0aW9uQ3Vyc29yIHtcbiAgICBsZXQgY2hpbGQ6IEhUTUxFbGVtZW50ID0gdGhpcy50b29sdGlwcy5jaGlsZHJlbltpbmRleF0gYXMgSFRNTEVsZW1lbnRcbiAgICBpZiAoY2hpbGQpIHtcbiAgICAgIGNvbnN0IGFuY2hvciA9IGNoaWxkLmNoaWxkcmVuWzBdIGFzIEhUTUxFbGVtZW50XG4gICAgICByZXR1cm4ge1xuICAgICAgICBjdXJzb3I6IGNoaWxkLFxuICAgICAgICBhbmNob3IsXG4gICAgICAgIHVzZXJUaXA6IGFuY2hvci5jaGlsZHJlblswXSBhcyBIVE1MRWxlbWVudFxuICAgICAgfVxuICAgIH1cbiAgICBjb25zdCB1c2VyVGlwID0gY3JlYXRlRWxlbWVudCgnc3BhbicsIHtcbiAgICAgIHN0eWxlczoge1xuICAgICAgICBwb3NpdGlvbjogJ2Fic29sdXRlJyxcbiAgICAgICAgZGlzcGxheTogJ25vbmUnLFxuICAgICAgICBsZWZ0OiAnNTAlJyxcbiAgICAgICAgdHJhbnNmb3JtOiAndHJhbnNsYXRlWCgtNTAlKScsXG4gICAgICAgIG1hcmdpbkJvdHRvbTogJzJweCcsXG4gICAgICAgIGJvdHRvbTogJzEwMCUnLFxuICAgICAgICB3aGl0ZVNwYWNlOiAnbm93cmFwJyxcbiAgICAgICAgY29sb3I6ICcjZmZmJyxcbiAgICAgICAgYm94U2hhZG93OiAnMCAxcHggMnB4IHJnYmEoMCwwLDAsLjEpJyxcbiAgICAgICAgYm9yZGVyUmFkaXVzOiAnM3B4JyxcbiAgICAgICAgcGFkZGluZzogJzNweCA1cHgnLFxuICAgICAgICBwb2ludGVyRXZlbnRzOiAnbm9uZScsXG4gICAgICB9XG4gICAgfSlcblxuICAgIGNvbnN0IGFuY2hvciA9IGNyZWF0ZUVsZW1lbnQoJ3NwYW4nLCB7XG4gICAgICBzdHlsZXM6IHtcbiAgICAgICAgcG9zaXRpb246ICdhYnNvbHV0ZScsXG4gICAgICAgIHRvcDogJy0ycHgnLFxuICAgICAgICBsZWZ0OiAnLTJweCcsXG4gICAgICAgIHdpZHRoOiAnNnB4JyxcbiAgICAgICAgaGVpZ2h0OiAnNnB4JyxcbiAgICAgICAgcG9pbnRlckV2ZW50czogJ2F1dG8nLFxuICAgICAgICBwb2ludGVyOiAnY3Vyc29yJyxcbiAgICAgIH0sXG4gICAgICBjaGlsZHJlbjogW3VzZXJUaXBdLFxuICAgICAgb246IHtcbiAgICAgICAgbW91c2VlbnRlcigpIHtcbiAgICAgICAgICB1c2VyVGlwLnN0eWxlLmRpc3BsYXkgPSAnYmxvY2snXG4gICAgICAgIH0sXG4gICAgICAgIG1vdXNlbGVhdmUoKSB7XG4gICAgICAgICAgdXNlclRpcC5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KVxuICAgIGNoaWxkID0gY3JlYXRlRWxlbWVudCgnc3BhbicsIHtcbiAgICAgIHN0eWxlczoge1xuICAgICAgICBwb3NpdGlvbjogJ2Fic29sdXRlJyxcbiAgICAgIH0sXG4gICAgICBjaGlsZHJlbjogW1xuICAgICAgICBhbmNob3JcbiAgICAgIF1cbiAgICB9KVxuICAgIHRoaXMudG9vbHRpcHMuYXBwZW5kKGNoaWxkKVxuICAgIHJldHVybiB7XG4gICAgICBjdXJzb3I6IGNoaWxkLFxuICAgICAgYW5jaG9yLFxuICAgICAgdXNlclRpcFxuICAgIH1cbiAgfVxufVxuIl19
@@ -1,5 +1,5 @@
1
1
  import { Observable } from '@tanbo/stream';
2
- import { RootComponentRef, Starter, Translator, Registry, Selection, SelectionPaths, History, Renderer } from '@textbus/core';
2
+ import { History, Registry, Renderer, RootComponentRef, Selection, SelectionPaths, Starter, Translator } from '@textbus/core';
3
3
  import { Doc as YDoc } from 'yjs';
4
4
  import { CollaborateCursor, RemoteSelection } from './collaborate-cursor';
5
5
  export declare class Collaborate implements History {
@@ -8,10 +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 { 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';
11
+ import { microTask, Subject } from '@tanbo/stream';
12
+ import { ContentType, makeError, Registry, Renderer, RootComponentRef, Selection, Slot, Starter, Translator } from '@textbus/core';
13
+ import { Array as YArray, Doc as YDoc, Map as YMap, Text as YText, UndoManager } from 'yjs';
14
14
  import { CollaborateCursor } from './collaborate-cursor';
15
+ import { createUnknownComponent } from './unknown.component';
15
16
  const collaborateErrorFn = makeError('Collaborate');
16
17
  let Collaborate = class Collaborate {
17
18
  constructor(rootComponentRef, collaborateCursor, translator, renderer, registry, selection, starter) {
@@ -219,7 +220,9 @@ let Collaborate = class Collaborate {
219
220
  trackedOrigins: new Set([this.yDoc])
220
221
  });
221
222
  this.syncContent(root, rootComponent.slots.get(0));
222
- this.subscriptions.push(merge(rootComponent.changeMarker.onForceChange, rootComponent.changeMarker.onChange).pipe(microTask()).subscribe(() => {
223
+ this.subscriptions.push(rootComponent.changeMarker.onForceChange.pipe(microTask()).subscribe(() => {
224
+ this.renderer.render();
225
+ }), rootComponent.changeMarker.onChange.pipe(microTask()).subscribe(() => {
223
226
  this.yDoc.transact(() => {
224
227
  this.updateRemoteActions.forEach(fn => {
225
228
  fn();
@@ -255,7 +258,8 @@ let Collaborate = class Collaborate {
255
258
  }
256
259
  else {
257
260
  const sharedComponent = action.insert;
258
- const component = this.createComponentBySharedComponent(sharedComponent);
261
+ const canInsertInlineComponent = slot.schema.includes(ContentType.InlineComponent);
262
+ const component = this.createComponentBySharedComponent(sharedComponent, canInsertInlineComponent);
259
263
  this.syncSlots(sharedComponent.get('slots'), component);
260
264
  this.syncComponent(sharedComponent, component);
261
265
  slot.insert(component);
@@ -347,6 +351,11 @@ let Collaborate = class Collaborate {
347
351
  }
348
352
  });
349
353
  });
354
+ sub.add(slot.onChildComponentRemove.subscribe(components => {
355
+ components.forEach(c => {
356
+ this.cleanSubscriptionsByComponent(c);
357
+ });
358
+ }));
350
359
  this.contentSyncCaches.set(slot, () => {
351
360
  content.unobserve(syncRemote);
352
361
  sub.unsubscribe();
@@ -382,9 +391,11 @@ let Collaborate = class Collaborate {
382
391
  const slots = component.slots;
383
392
  const syncRemote = (ev, tr) => {
384
393
  this.runRemoteUpdate(tr, () => {
394
+ let index = 0;
385
395
  ev.delta.forEach(action => {
386
396
  if (Reflect.has(action, 'retain')) {
387
397
  slots.retain(action.retain);
398
+ index += action.retain;
388
399
  }
389
400
  else if (action.insert) {
390
401
  action.insert.forEach(item => {
@@ -392,10 +403,11 @@ let Collaborate = class Collaborate {
392
403
  slots.insert(slot);
393
404
  this.syncContent(item.get('content'), slot);
394
405
  this.syncSlot(item, slot);
406
+ index++;
395
407
  });
396
408
  }
397
409
  else if (action.delete) {
398
- slots.retain(slots.index);
410
+ slots.retain(index);
399
411
  slots.delete(action.delete);
400
412
  }
401
413
  });
@@ -417,14 +429,16 @@ let Collaborate = class Collaborate {
417
429
  index++;
418
430
  }
419
431
  else if (action.type === 'delete') {
420
- slots.slice(index, index + action.count).forEach(slot => {
421
- this.cleanSubscriptionsBySlot(slot);
422
- });
423
432
  remoteSlots.delete(index, action.count);
424
433
  }
425
434
  });
426
435
  });
427
436
  });
437
+ sub.add(slots.onChildSlotRemove.subscribe(slots => {
438
+ slots.forEach(slot => {
439
+ this.cleanSubscriptionsBySlot(slot);
440
+ });
441
+ }));
428
442
  this.slotsSyncCaches.set(component, () => {
429
443
  remoteSlots.unobserve(syncRemote);
430
444
  sub.unsubscribe();
@@ -512,7 +526,7 @@ let Collaborate = class Collaborate {
512
526
  this.syncSlot(sharedSlot, slot);
513
527
  return sharedSlot;
514
528
  }
515
- createComponentBySharedComponent(yMap) {
529
+ createComponentBySharedComponent(yMap, canInsertInlineComponent) {
516
530
  const sharedSlots = yMap.get('slots');
517
531
  const slots = [];
518
532
  sharedSlots.forEach(sharedSlot => {
@@ -526,13 +540,17 @@ let Collaborate = class Collaborate {
526
540
  });
527
541
  if (instance) {
528
542
  instance.slots.toArray().forEach((slot, index) => {
529
- const sharedSlot = sharedSlots.get(index);
543
+ let sharedSlot = sharedSlots.get(index);
544
+ if (!sharedSlot) {
545
+ sharedSlot = this.createSharedSlotBySlot(slot);
546
+ sharedSlots.push([sharedSlot]);
547
+ }
530
548
  this.syncSlot(sharedSlot, slot);
531
549
  this.syncContent(sharedSlot.get('content'), slot);
532
550
  });
533
551
  return instance;
534
552
  }
535
- throw collaborateErrorFn(`cannot find component factory \`${name}\`.`);
553
+ return createUnknownComponent(name, canInsertInlineComponent).createInstance(this.starter);
536
554
  }
537
555
  createSlotBySharedSlot(sharedSlot) {
538
556
  const content = sharedSlot.get('content');
@@ -550,7 +568,8 @@ let Collaborate = class Collaborate {
550
568
  }
551
569
  else {
552
570
  const sharedComponent = action.insert;
553
- const component = this.createComponentBySharedComponent(sharedComponent);
571
+ const canInsertInlineComponent = slot.schema.includes(ContentType.InlineComponent);
572
+ const component = this.createComponentBySharedComponent(sharedComponent, canInsertInlineComponent);
554
573
  slot.insert(component);
555
574
  this.syncSlots(sharedComponent.get('slots'), component);
556
575
  this.syncComponent(sharedComponent, component);
@@ -608,4 +627,4 @@ function makeFormats(registry, attrs) {
608
627
  }
609
628
  return formats;
610
629
  }
611
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29sbGFib3JhdGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvY29sbGFib3JhdGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7O0FBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLFdBQVcsQ0FBQTtBQUN0QyxPQUFPLEVBQUUsS0FBSyxFQUFFLFNBQVMsRUFBYyxPQUFPLEVBQWdCLE1BQU0sZUFBZSxDQUFBO0FBQ25GLE9BQU8sRUFDTCxnQkFBZ0IsRUFDaEIsT0FBTyxFQUNQLFVBQVUsRUFDVixRQUFRLEVBQ1IsU0FBUyxFQUVBLFFBQVEsRUFBRSxJQUFJLEVBQXFCLFNBQVMsRUFDdEQsTUFBTSxlQUFlLENBQUE7QUFDdEIsT0FBTyxFQUNMLEdBQUcsSUFBSSxJQUFJLEVBQ1gsR0FBRyxJQUFJLElBQUksRUFDWCxJQUFJLElBQUksS0FBSyxFQUNiLEtBQUssSUFBSSxNQUFNLEVBQ2YsV0FBVyxFQUVaLE1BQU0sS0FBSyxDQUFBO0FBRVosT0FBTyxFQUFFLGlCQUFpQixFQUFtQixNQUFNLHNCQUFzQixDQUFBO0FBRXpFLE1BQU0sa0JBQWtCLEdBQUcsU0FBUyxDQUFDLGFBQWEsQ0FBQyxDQUFBO0FBR25ELElBQWEsV0FBVyxHQUF4QixNQUFhLFdBQVc7SUFtQ3RCLFlBQW9CLGdCQUFrQyxFQUNsQyxpQkFBb0MsRUFDcEMsVUFBc0IsRUFDdEIsUUFBa0IsRUFDbEIsUUFBa0IsRUFDbEIsU0FBb0IsRUFDcEIsT0FBZ0I7Ozs7O21CQU5oQjs7Ozs7O21CQUNBOzs7Ozs7bUJBQ0E7Ozs7OzttQkFDQTs7Ozs7O21CQUNBOzs7Ozs7bUJBQ0E7Ozs7OzttQkFDQTs7UUF4Q3BCOzs7OztXQUE2QztRQUM3Qzs7OzttQkFBTyxJQUFJLElBQUksRUFBRTtXQUFBO1FBQ2pCOzs7OztXQUF3QjtRQUN4Qjs7Ozs7V0FBMkI7UUFDM0I7Ozs7O1dBQXlCO1FBQ3pCOzs7OztXQUF3QjtRQVV4Qjs7OzttQkFBb0IsSUFBSSxPQUFPLEVB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SSxDQUFDLHdCQUF3QixDQUFDLElBQUksQ0FBQyxDQUFBO1FBQ3JDLENBQUMsQ0FBQyxDQUFBO0lBQ0osQ0FBQztDQUNGLENBQUE7QUFsZFksV0FBVztJQUR2QixVQUFVLEVBQUU7cUNBb0MyQixnQkFBZ0I7UUFDZixpQkFBaUI7UUFDeEIsVUFBVTtRQUNaLFFBQVE7UUFDUixRQUFRO1FBQ1AsU0FBUztRQUNYLE9BQU87R0F6Q3pCLFdBQVcsQ0FrZHZCO1NBbGRZLFdBQVc7QUFvZHhCLFNBQVMsV0FBVyxDQUFDLFFBQWtCLEVBQUUsS0FBVztJQUNsRCxNQUFNLE9BQU8sR0FBWSxFQUFFLENBQUE7SUFDM0IsSUFBSSxLQUFLLEVBQUU7UUFDVCxNQUFNLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsRUFBRTtZQUMzQixNQUFNLFNBQVMsR0FBRyxRQUFRLENBQUMsWUFBWSxDQUFDLEdBQUcsQ0FBQyxDQUFBO1lBQzVDLElBQUksU0FBUyxFQUFFO2dCQUNiLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQyxTQUFTLEVBQUUsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQTthQUN0QztRQUNILENBQUMsQ0FBQyxDQUFBO0tBQ0g7SUFDRCxPQUFPLE9BQU8sQ0FBQTtBQUNoQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0YWJsZSB9IGZyb20gJ0B0YW5iby9kaSdcbmltcG9ydCB7IG1lcmdlLCBtaWNyb1Rhc2ssIE9ic2VydmFibGUsIFN1YmplY3QsIFN1YnNjcmlwdGlvbiB9IGZyb20gJ0B0YW5iby9zdHJlYW0nXG5pbXBvcnQge1xuICBSb290Q29tcG9uZW50UmVmLFxuICBTdGFydGVyLFxuICBUcmFuc2xhdG9yLFxuICBSZWdpc3RyeSxcbiAgU2VsZWN0aW9uLFxuICBTZWxlY3Rpb25QYXRocyxcbiAgSGlzdG9yeSwgUmVuZGVyZXIsIFNsb3QsIENvbXBvbmVudEluc3RhbmNlLCBtYWtlRXJyb3IsIEZvcm1hdHNcbn0gZnJvbSAnQHRleHRidXMvY29yZSdcbmltcG9ydCB7XG4gIERvYyBhcyBZRG9jLFxuICBNYXAgYXMgWU1hcCxcbiAgVGV4dCBhcyBZVGV4dCxcbiAgQXJyYXkgYXMgWUFycmF5LFxuICBVbmRvTWFuYWdlcixcbiAgVHJhbnNhY3Rpb25cbn0gZnJvbSAneWpzJ1xuXG5pbXBvcnQgeyBDb2xsYWJvcmF0ZUN1cnNvciwgUmVtb3RlU2VsZWN0aW9uIH0gZnJvbSAnLi9jb2xsYWJvcmF0ZS1jdXJzb3InXG5cbmNvbnN0IGNvbGxhYm9yYXRlRXJyb3JGbiA9IG1ha2VFcnJvcignQ29sbGFib3JhdGUnKVxuXG5ASW5qZWN0YWJsZSgpXG5leHBvcnQgY2xhc3MgQ29sbGFib3JhdGUgaW1wbGVtZW50cyBIaXN0b3J5IHtcbiAgb25TZWxlY3Rpb25DaGFuZ2U6IE9ic2VydmFibGU8U2VsZWN0aW9uUGF0aHM+XG4gIHlEb2MgPSBuZXcgWURvYygpXG4gIG9uQmFjazogT2JzZXJ2YWJsZTx2b2lkPlxuICBvbkZvcndhcmQ6IE9ic2VydmFibGU8dm9pZD5cbiAgb25DaGFuZ2U6IE9ic2VydmFibGU8YW55PlxuICBvblB1c2g6IE9ic2VydmFibGU8dm9pZD5cblxuICBnZXQgY2FuQmFjaygpIHtcbiAgICByZXR1cm4gdGhpcy5tYW5hZ2VyPy5jYW5VbmRvKClcbiAgfVxuXG4gIGdldCBjYW5Gb3J3YXJkKCkge1xuICAgIHJldHVybiB0aGlzLm1hbmFnZXI/LmNhblJlZG8oKVxuICB9XG5cbiAgcHJpdmF0ZSBiYWNrRXZlbnQgPSBuZXcgU3ViamVjdDx2b2lkPigpXG4gIHByaXZhdGUgZm9yd2FyZEV2ZW50ID0gbmV3IFN1YmplY3Q8dm9pZD4oKVxuICBwcml2YXRlIGNoYW5nZUV2ZW50ID0gbmV3IFN1YmplY3Q8dm9pZD4oKVxuICBwcml2YXRlIHB1c2hFdmVudCA9IG5ldyBTdWJqZWN0PHZvaWQ+KClcblxuICBwcml2YXRlIG1hbmFnZXIhOiBVbmRvTWFuYWdlclxuXG4gIHByaXZhdGUgc3Vic2NyaXB0aW9uczogU3Vic2NyaXB0aW9uW10gPSBbXVxuICBwcml2YXRlIHVwZGF0ZUZyb21SZW1vdGUgPSBmYWxzZVxuXG4gIHByaXZhdGUgY29udGVudFN5bmNDYWNoZXMgPSBuZXcgV2Vha01hcDxTbG90LCAoKSA9PiB2b2lkPigpXG4gIHByaXZhdGUgc2xvdFN0YXRlU3luY0NhY2hlcyA9IG5ldyBXZWFrTWFwPFNsb3QsICgpID0+IHZvaWQ+KClcbiAgcHJpdmF0ZSBzbG90c1N5bmNDYWNoZXMgPSBuZXcgV2Vha01hcDxDb21wb25lbnRJbnN0YW5jZSwgKCkgPT4gdm9pZD4oKVxuICBwcml2YXRlIGNvbXBvbmVudFN0YXRlU3luY0NhY2hlcyA9IG5ldyBXZWFrTWFwPENvbXBvbmVudEluc3RhbmNlLCAoKSA9PiB2b2lkPigpXG5cbiAgcHJpdmF0ZSBzZWxlY3Rpb25DaGFuZ2VFdmVudCA9IG5ldyBTdWJqZWN0PFNlbGVjdGlvblBhdGhzPigpXG5cbiAgcHJpdmF0ZSB1cGRhdGVSZW1vdGVBY3Rpb25zOiBBcnJheTwoKSA9PiB2b2lkPiA9IFtdXG5cbiAgY29uc3RydWN0b3IocHJpdmF0ZSByb290Q29tcG9uZW50UmVmOiBSb290Q29tcG9uZW50UmVmLFxuICAgICAgICAgICAgICBwcml2YXRlIGNvbGxhYm9yYXRlQ3Vyc29yOiBDb2xsYWJvcmF0ZUN1cnNvcixcbiAgICAgICAgICAgICAgcHJpdmF0ZSB0cmFuc2xhdG9yOiBUcmFuc2xhdG9yLFxuICAgICAgICAgICAgICBwcml2YXRlIHJlbmRlcmVyOiBSZW5kZXJlcixcbiAgICAgICAgICAgICAgcHJpdmF0ZSByZWdpc3RyeTogUmVnaXN0cnksXG4gICAgICAgICAgICAgIHByaXZhdGUgc2VsZWN0aW9uOiBTZWxlY3Rpb24sXG4gICAgICAgICAgICAgIHByaXZhdGUgc3RhcnRlcjogU3RhcnRlcikge1xuICAgIHRoaXMub25TZWxlY3Rpb25DaGFuZ2UgPSB0aGlzLnNlbGVjdGlvbkNoYW5nZUV2ZW50LmFzT2JzZXJ2YWJsZSgpXG4gICAgdGhpcy5vbkJhY2sgPSB0aGlzLmJhY2tFdmVudC5hc09ic2VydmFibGUoKVxuICAgIHRoaXMub25Gb3J3YXJkID0gdGhpcy5mb3J3YXJkRXZlbnQuYXNPYnNlcnZhYmxlKClcbiAgICB0aGlzLm9uQ2hhbmdlID0gdGhpcy5jaGFuZ2VFdmVudC5hc09ic2VydmFibGUoKVxuICAgIHRoaXMub25QdXNoID0gdGhpcy5wdXNoRXZlbnQuYXNPYnNlcnZhYmxlKClcbiAgfVxuXG4gIHNldHVwKCkge1xuICAgIHRoaXMuc3Vic2NyaXB0aW9ucy5wdXNoKFxuICAgICAgdGhpcy5zdGFydGVyLm9uUmVhZHkuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgdGhpcy5saXN0ZW4yKClcbiAgICAgIH0pLFxuICAgICAgdGhpcy5zZWxlY3Rpb24ub25DaGFuZ2Uuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgY29uc3QgcGF0aHMgPSB0aGlzLnNlbGVjdGlvbi5nZXRQYXRocygpXG4gICAgICAgIHRoaXMuc2VsZWN0aW9uQ2hhbmdlRXZlbnQubmV4dChwYXRocylcbiAgICAgIH0pXG4gICAgKVxuICB9XG5cbiAgdXBkYXRlUmVtb3RlU2VsZWN0aW9uKHBhdGhzOiBSZW1vdGVTZWxlY3Rpb25bXSkge1xuICAgIHRoaXMuY29sbGFib3JhdGVDdXJzb3IuZHJhdyhwYXRocylcbiAgfVxuXG4gIGxpc3RlbigpIHtcbiAgICAvL1xuICB9XG5cbiAgYmFjaygpIHtcbiAgICBpZiAodGhpcy5jYW5CYWNrKSB7XG4gICAgICB0aGlzLm1hbmFnZXIudW5kbygpXG4gICAgfVxuICB9XG5cbiAgZm9yd2FyZCgpIHtcbiAgICBpZiAodGhpcy5jYW5Gb3J3YXJkKSB7XG4gICAgICB0aGlzLm1hbmFnZXIucmVkbygpXG4gICAgfVxuICB9XG5cbiAgZGVzdHJveSgpIHtcbiAgICB0aGlzLnN1YnNjcmlwdGlvbnMuZm9yRWFjaChpID0+IGkudW5zdWJzY3JpYmUoKSlcbiAgfVxuXG4gIHByaXZhdGUgbGlzdGVuMigpIHtcbiAgICBjb25zdCByb290ID0gdGhpcy55RG9jLmdldFRleHQoJ2NvbnRlbnQnKVxuICAgIGNvbnN0IHJvb3RDb21wb25lbnQgPSB0aGlzLnJvb3RDb21wb25lbnRSZWYuY29tcG9uZW50IVxuICAgIHRoaXMubWFuYWdlciA9IG5ldyBVbmRvTWFuYWdlcihyb290LCB7XG4gICAgICB0cmFja2VkT3JpZ2luczogbmV3IFNldDxhbnk+KFt0aGlzLnlEb2NdKVxuICAgIH0pXG4gICAgdGhpcy5zeW5jQ29udGVudChyb290LCByb290Q29tcG9uZW50LnNsb3RzLmdldCgwKSEpXG5cbiAgICB0aGlzLnN1YnNjcmlwdGlvbnMucHVzaChcbiAgICAgIG1lcmdlKFxuICAgICAgICByb290Q29tcG9uZW50LmNoYW5nZU1hcmtlci5vbkZvcmNlQ2hhbmdlLFxuICAgICAgICByb290Q29tcG9uZW50LmNoYW5nZU1hcmtlci5vbkNoYW5nZVxuICAgICAgKS5waXBlKFxuICAgICAgICBtaWNyb1Rhc2soKVxuICAgICAgKS5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICB0aGlzLnlEb2MudHJhbnNhY3QoKCkgPT4ge1xuICAgICAgICAgIHRoaXMudXBkYXRlUmVtb3RlQWN0aW9ucy5mb3JFYWNoKGZuID0+IHtcbiAgICAgICAgICAgIGZuKClcbiAgICAgICAgICB9KVxuICAgICAgICAgIHRoaXMudXBkYXRlUmVtb3RlQWN0aW9ucyA9IFtdXG4gICAgICAgIH0sIHRoaXMueURvYylcbiAgICAgICAgdGhpcy5yZW5kZXJlci5yZW5kZXIoKVxuICAgICAgICB0aGlzLnNlbGVjdGlvbi5yZXN0b3JlKClcbiAgICAgIH0pXG4gICAgKVxuICB9XG5cbiAgcHJpdmF0ZSBzeW5jQ29udGVudChjb250ZW50OiBZVGV4dCwgc2xvdDogU2xvdCkge1xuICAgIGNvbnN0IHN5bmNSZW1vdGUgPSAoZXYsIHRyKSA9PiB7XG4gICAgICB0aGlzLnJ1blJlbW90ZVVwZGF0ZSh0ciwgKCkgPT4ge1xuICAgICAgICBzbG90LnJldGFpbigwKVxuICAgICAgICBldi5kZWx0YS5mb3JFYWNoKGFjdGlvbiA9PiB7XG4gICAgICAgICAgaWYgKFJlZmxlY3QuaGFzKGFjdGlvbiwgJ3JldGFpbicpKSB7XG4gICAgICAgICAgICBpZiAoYWN0aW9uLmF0dHJpYnV0ZXMpIHtcbiAgICAgICAgICAgICAgY29uc3QgZm9ybWF0cyA9IG1ha2VGb3JtYXRzKHRoaXMucmVnaXN0cnksIGFjdGlvbi5hdHRyaWJ1dGVzKVxuICAgICAgICAgICAgICBpZiAoZm9ybWF0cy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICBzbG90LnJldGFpbihhY3Rpb24ucmV0YWluISwgZm9ybWF0cylcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgc2xvdC5yZXRhaW4oYWN0aW9uLnJldGFpbilcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2UgaWYgKGFjdGlvbi5pbnNlcnQpIHtcbiAgICAgICAgICAgIGNvbnN0IGluZGV4ID0gc2xvdC5pbmRleFxuICAgICAgICAgICAgbGV0IGxlbmd0aCA9IDFcbiAgICAgICAgICAgIGlmICh0eXBlb2YgYWN0aW9uLmluc2VydCA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgICAgbGVuZ3RoID0gYWN0aW9uLmluc2VydC5sZW5ndGhcbiAgICAgICAgICAgICAgc2xvdC5pbnNlcnQoYWN0aW9uLmluc2VydCwgbWFrZUZvcm1hdHModGhpcy5yZWdpc3RyeSwgYWN0aW9uLmF0dHJpYnV0ZXMpKVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgY29uc3Qgc2hhcmVkQ29tcG9uZW50ID0gYWN0aW9uLmluc2VydCBhcyBZTWFwPGFueT5cbiAgICAgICAgICAgICAgY29uc3QgY29tcG9uZW50ID0gdGhpcy5jcmVhdGVDb21wb25lbnRCeVNoYXJlZENvbXBvbmVudChzaGFyZWRDb21wb25lbnQpXG4gICAgICAgICAgICAgIHRoaXMuc3luY1Nsb3RzKHNoYXJlZENvbXBvbmVudC5nZXQoJ3Nsb3RzJyksIGNvbXBvbmVudClcbiAgICAgICAgICAgICAgdGhpcy5zeW5jQ29tcG9uZW50KHNoYXJlZENvbXBvbmVudCwgY29tcG9uZW50KVxuICAgICAgICAgICAgICBzbG90Lmluc2VydChjb21wb25lbnQpXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAodGhpcy5zZWxlY3Rpb24uaXNTZWxlY3RlZCkge1xuICAgICAgICAgICAgICBpZiAoc2xvdCA9PT0gdGhpcy5zZWxlY3Rpb24uc3RhcnRTbG90ICYmIHRoaXMuc2VsZWN0aW9uLnN0YXJ0T2Zmc2V0ISA+PSBpbmRleCkge1xuICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0aW9uLnNldFN0YXJ0KHNsb3QsIHRoaXMuc2VsZWN0aW9uLnN0YXJ0T2Zmc2V0ISArIGxlbmd0aClcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBpZiAoc2xvdCA9PT0gdGhpcy5zZWxlY3Rpb24uZW5kU2xvdCAmJiB0aGlzLnNlbGVjdGlvbi5lbmRPZmZzZXQhID49IGluZGV4KSB7XG4gICAgICAgICAgICAgICAgdGhpcy5zZWxlY3Rpb24uc2V0RW5kKHNsb3QsIHRoaXMuc2VsZWN0aW9uLmVuZE9mZnNldCEgKyBsZW5ndGgpXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2UgaWYgKGFjdGlvbi5kZWxldGUpIHtcbiAgICAgICAgICAgIGNvbnN0IGluZGV4ID0gc2xvdC5pbmRleFxuICAgICAgICAgICAgc2xvdC5yZXRhaW4oc2xvdC5pbmRleClcbiAgICAgICAgICAgIHNsb3QuZGVsZXRlKGFjdGlvbi5kZWxldGUpXG4gICAgICAgICAgICBpZiAodGhpcy5zZWxlY3Rpb24uaXNTZWxlY3RlZCkge1xuICAgICAgICAgICAgICBpZiAoc2xvdCA9PT0gdGhpcy5zZWxlY3Rpb24uc3RhcnRTbG90ICYmIHRoaXMuc2VsZWN0aW9uLnN0YXJ0T2Zmc2V0ISA+PSBpbmRleCkge1xuICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0aW9uLnNldFN0YXJ0KHNsb3QsIHRoaXMuc2VsZWN0aW9uLnN0YXJ0T2Zmc2V0ISAtIGFjdGlvbi5kZWxldGUpXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgaWYgKHNsb3QgPT09IHRoaXMuc2VsZWN0aW9uLmVuZFNsb3QgJiYgdGhpcy5zZWxlY3Rpb24uZW5kT2Zmc2V0ISA+PSBpbmRleCkge1xuICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0aW9uLnNldEVuZChzbG90LCB0aGlzLnNlbGVjdGlvbi5lbmRPZmZzZXQhIC0gYWN0aW9uLmRlbGV0ZSlcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSBpZiAoYWN0aW9uLmF0dHJpYnV0ZXMpIHtcbiAgICAgICAgICAgIHNsb3QudXBkYXRlU3RhdGUoZHJhZnQgPT4ge1xuICAgICAgICAgICAgICBPYmplY3QuYXNzaWduKGRyYWZ0LCBhY3Rpb24uYXR0cmlidXRlcylcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgfVxuICAgICAgICB9KVxuICAgICAgfSlcbiAgICB9XG4gICAgY29udGVudC5vYnNlcnZlKHN5bmNSZW1vdGUpXG5cbiAgICBjb25zdCBzdWIgPSBzbG90Lm9uQ29udGVudENoYW5nZS5zdWJzY3JpYmUoYWN0aW9ucyA9PiB7XG4gICAgICB0aGlzLnJ1bkxvY2FsVXBkYXRlKCgpID0+IHtcbiAgICAgICAgbGV0IG9mZnNldCA9IDBcbiAgICAgICAgbGV0IGxlbmd0aCA9IDBcbiAgICAgICAgZm9yIChjb25zdCBhY3Rpb24gb2YgYWN0aW9ucykge1xuICAgICAgICAgIGlmIChhY3Rpb24udHlwZSA9PT0gJ3JldGFpbicpIHtcbiAgICAgICAgICAgIGNvbnN0IGZvcm1hdHMgPSBhY3Rpb24uZm9ybWF0c1xuICAgICAgICAgICAgaWYgKGZvcm1hdHMpIHtcbiAgICAgICAgICAgICAgY29uc3Qga2V5cyA9IE9iamVjdC5rZXlzKGZvcm1hdHMpXG4gICAgICAgICAgICAgIGxldCBsZW5ndGggPSBrZXlzLmxlbmd0aFxuICAgICAgICAgICAgICBrZXlzLmZvckVhY2goa2V5ID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoIXRoaXMucmVnaXN0cnkuZ2V0Rm9ybWF0dGVyKGtleSkpIHtcbiAgICAgICAgICAgICAgICAgIGxlbmd0aC0tXG4gICAgICAgICAgICAgICAgICBSZWZsZWN0LmRlbGV0ZVByb3BlcnR5KGZvcm1hdHMsIGtleSlcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgIGlmIChsZW5ndGgpIHtcbiAgICAgICAgICAgICAgICBjb250ZW50LmZvcm1hdChvZmZzZXQsIGFjdGlvbi5vZmZzZXQsIGZvcm1hdHMpXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIG9mZnNldCA9IGFjdGlvbi5vZmZzZXRcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2UgaWYgKGFjdGlvbi50eXBlID09PSAnaW5zZXJ0Jykge1xuICAgICAgICAgICAgY29uc3QgZGVsdGEgPSBjb250ZW50LnRvRGVsdGEoKVxuICAgICAgICAgICAgY29uc3QgaXNFbXB0eSA9IGRlbHRhLmxlbmd0aCA9PT0gMSAmJiBkZWx0YVswXS5pbnNlcnQgPT09IFNsb3QuZW1wdHlQbGFjZWhvbGRlclxuICAgICAgICAgICAgaWYgKHR5cGVvZiBhY3Rpb24uY29udGVudCA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgICAgbGVuZ3RoID0gYWN0aW9uLmNvbnRlbnQubGVuZ3RoXG4gICAgICAgICAgICAgIGNvbnRlbnQuaW5zZXJ0KG9mZnNldCwgYWN0aW9uLmNvbnRlbnQpXG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBsZW5ndGggPSAxXG4gICAgICAgICAgICAgIGNvbnN0IGNvbXBvbmVudCA9IHNsb3QuZ2V0Q29udGVudEF0SW5kZXgob2Zmc2V0KSBhcyBDb21wb25lbnRJbnN0YW5jZVxuICAgICAgICAgICAgICBjb25zdCBzaGFyZWRDb21wb25lbnQgPSB0aGlzLmNyZWF0ZVNoYXJlZENvbXBvbmVudEJ5Q29tcG9uZW50KGNvbXBvbmVudClcbiAgICAgICAgICAgICAgY29udGVudC5pbnNlcnRFbWJlZChvZmZzZXQsIHNoYXJlZENvbXBvbmVudClcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChhY3Rpb24uZm9ybWF0cykge1xuICAgICAgICAgICAgICBjb250ZW50LmZvcm1hdChvZmZzZXQsIGxlbmd0aCwgYWN0aW9uLmZvcm1hdHMpXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoaXNFbXB0eSAmJiBvZmZzZXQgPT09IDApIHtcbiAgICAgICAgICAgICAgY29udGVudC5kZWxldGUoY29udGVudC5sZW5ndGggLSAxLCAxKVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgb2Zmc2V0ICs9IGxlbmd0aFxuICAgICAgICAgIH0gZWxzZSBpZiAoYWN0aW9uLnR5cGUgPT09ICdkZWxldGUnKSB7XG4gICAgICAgICAgICBjb25zdCBkZWx0YSA9IGNvbnRlbnQudG9EZWx0YSgpXG4gICAgICAgICAgICBjb250ZW50LmRlbGV0ZShvZmZzZXQsIGFjdGlvbi5jb3VudClcbiAgICAgICAgICAgIGlmIChjb250ZW50Lmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgICBjb250ZW50Lmluc2VydCgwLCAnXFxuJywgZGVsdGFbMF0/LmF0dHJpYnV0ZXMpXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9KVxuICAgIH0pXG4gICAgdGhpcy5jb250ZW50U3luY0NhY2hlcy5zZXQoc2xvdCwgKCkgPT4ge1xuICAgICAgY29udGVudC51bm9ic2VydmUoc3luY1JlbW90ZSlcbiAgICAgIHN1Yi51bnN1YnNjcmliZSgpXG4gICAgfSlcbiAgfVxuXG4gIHByaXZhdGUgc3luY1Nsb3QocmVtb3RlU2xvdDogWU1hcDxhbnk+LCBzbG90OiBTbG90KSB7XG4gICAgY29uc3Qgc3luY1JlbW90ZSA9IChldiwgdHIpID0+IHtcbiAgICAgIHRoaXMucnVuUmVtb3RlVXBkYXRlKHRyLCAoKSA9PiB7XG4gICAgICAgIGV2LmtleXNDaGFuZ2VkLmZvckVhY2goa2V5ID0+IHtcbiAgICAgICAgICBpZiAoa2V5ID09PSAnc3RhdGUnKSB7XG4gICAgICAgICAgICBjb25zdCBzdGF0ZSA9IChldi50YXJnZXQgYXMgWU1hcDxhbnk+KS5nZXQoJ3N0YXRlJylcbiAgICAgICAgICAgIHNsb3QudXBkYXRlU3RhdGUoZHJhZnQgPT4ge1xuICAgICAgICAgICAgICBPYmplY3QuYXNzaWduKGRyYWZ0LCBzdGF0ZSlcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgfVxuICAgICAgICB9KVxuICAgICAgfSlcbiAgICB9XG4gICAgcmVtb3RlU2xvdC5vYnNlcnZlKHN5bmNSZW1vdGUpXG5cbiAgICBjb25zdCBzdWIgPSBzbG90Lm9uU3RhdGVDaGFuZ2Uuc3Vic2NyaWJlKGFjdGlvbnMgPT4ge1xuICAgICAgdGhpcy5ydW5Mb2NhbFVwZGF0ZSgoKSA9PiB7XG4gICAgICAgIGFjdGlvbnMuZm9yRWFjaChhY3Rpb24gPT4ge1xuICAgICAgICAgIHJlbW90ZVNsb3Quc2V0KCdzdGF0ZScsIGFjdGlvbi52YWx1ZSlcbiAgICAgICAgfSlcbiAgICAgIH0pXG4gICAgfSlcbiAgICB0aGlzLnNsb3RTdGF0ZVN5bmNDYWNoZXMuc2V0KHNsb3QsICgpID0+IHtcbiAgICAgIHJlbW90ZVNsb3QudW5vYnNlcnZlKHN5bmNSZW1vdGUpXG4gICAgICBzdWIudW5zdWJzY3JpYmUoKVxuICAgIH0pXG4gIH1cblxuICBwcml2YXRlIHN5bmNTbG90cyhyZW1vdGVTbG90czogWUFycmF5PGFueT4sIGNvbXBvbmVudDogQ29tcG9uZW50SW5zdGFuY2UpIHtcbiAgICBjb25zdCBzbG90cyA9IGNvbXBvbmVudC5zbG90c1xuICAgIGNvbnN0IHN5bmNSZW1vdGUgPSAoZXYsIHRyKSA9PiB7XG4gICAgICB0aGlzLnJ1blJlbW90ZVVwZGF0ZSh0ciwgKCkgPT4ge1xuICAgICAgICBldi5kZWx0YS5mb3JFYWNoKGFjdGlvbiA9PiB7XG4gICAgICAgICAgaWYgKFJlZmxlY3QuaGFzKGFjdGlvbiwgJ3JldGFpbicpKSB7XG4gICAgICAgICAgICBzbG90cy5yZXRhaW4oYWN0aW9uLnJldGFpbiEpXG4gICAgICAgICAgfSBlbHNlIGlmIChhY3Rpb24uaW5zZXJ0KSB7XG4gICAgICAgICAgICAoYWN0aW9uLmluc2VydCBhcyBBcnJheTxZTWFwPGFueT4+KS5mb3JFYWNoKGl0ZW0gPT4ge1xuICAgICAgICAgICAgICBjb25zdCBzbG90ID0gdGhpcy5jcmVhdGVTbG90QnlTaGFyZWRTbG90KGl0ZW0pXG4gICAgICAgICAgICAgIHNsb3RzLmluc2VydChzbG90KVxuICAgICAgICAgICAgICB0aGlzLnN5bmNDb250ZW50KGl0ZW0uZ2V0KCdjb250ZW50JyksIHNsb3QpXG4gICAgICAgICAgICAgIHRoaXMuc3luY1Nsb3QoaXRlbSwgc2xvdClcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgfSBlbHNlIGlmIChhY3Rpb24uZGVsZXRlKSB7XG4gICAgICAgICAgICBzbG90cy5yZXRhaW4oc2xvdHMuaW5kZXgpXG4gICAgICAgICAgICBzbG90cy5kZWxldGUoYWN0aW9uLmRlbGV0ZSlcbiAgICAgICAgICB9XG4gICAgICAgIH0pXG4gICAgICB9KVxuICAgIH1cbiAgICByZW1vdGVTbG90cy5vYnNlcnZlKHN5bmNSZW1vdGUpXG5cbiAgICBjb25zdCBzdWIgPSBzbG90cy5vbkNoYW5nZS5zdWJzY3JpYmUob3BlcmF0aW9ucyA9PiB7XG4gICAgICB0aGlzLnJ1bkxvY2FsVXBkYXRlKCgpID0+IHtcbiAgICAgICAgY29uc3QgYXBwbHlBY3Rpb25zID0gb3BlcmF0aW9ucy5hcHBseVxuICAgICAgICBsZXQgaW5kZXg6IG51bWJlclxuICAgICAgICBhcHBseUFjdGlvbnMuZm9yRWFjaChhY3Rpb24gPT4ge1xuICAgICAgICAgIGlmIChhY3Rpb24udHlwZSA9PT0gJ3JldGFpbicpIHtcbiAgICAgICAgICAgIGluZGV4ID0gYWN0aW9uLm9mZnNldFxuICAgICAgICAgIH0gZWxzZSBpZiAoYWN0aW9uLnR5cGUgPT09ICdpbnNlcnRTbG90Jykge1xuICAgICAgICAgICAgY29uc3Qgc2xvdCA9IHNsb3RzLmdldChpbmRleCkhXG4gICAgICAgICAgICBjb25zdCBzaGFyZWRTbG90ID0gdGhpcy5jcmVhdGVTaGFyZWRTbG90QnlTbG90KHNsb3QpXG4gICAgICAgICAgICByZW1vdGVTbG90cy5pbnNlcnQoaW5kZXgsIFtzaGFyZWRTbG90XSlcbiAgICAgICAgICAgIGluZGV4KytcbiAgICAgICAgICB9IGVsc2UgaWYgKGFjdGlvbi50eXBlID09PSAnZGVsZXRlJykge1xuICAgICAgICAgICAgc2xvdHMuc2xpY2UoaW5kZXgsIGluZGV4ICsgYWN0aW9uLmNvdW50KS5mb3JFYWNoKHNsb3QgPT4ge1xuICAgICAgICAgICAgICB0aGlzLmNsZWFuU3Vic2NyaXB0aW9uc0J5U2xvdChzbG90KVxuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIHJlbW90ZVNsb3RzLmRlbGV0ZShpbmRleCwgYWN0aW9uLmNvdW50KVxuICAgICAgICAgIH1cbiAgICAgICAgfSlcbiAgICAgIH0pXG4gICAgfSlcblxuICAgIHRoaXMuc2xvdHNTeW5jQ2FjaGVzLnNldChjb21wb25lbnQsICgpID0+IHtcbiAgICAgIHJlbW90ZVNsb3RzLnVub2JzZXJ2ZShzeW5jUmVtb3RlKVxuICAgICAgc3ViLnVuc3Vic2NyaWJlKClcbiAgICB9KVxuICB9XG5cbiAgcHJpdmF0ZSBzeW5jQ29tcG9uZW50KHJlbW90ZUNvbXBvbmVudDogWU1hcDxhbnk+LCBjb21wb25lbnQ6IENvbXBvbmVudEluc3RhbmNlKSB7XG4gICAgY29uc3Qgc3luY1JlbW90ZSA9IChldiwgdHIpID0+IHtcbiAgICAgIHRoaXMucnVuUmVtb3RlVXBkYXRlKHRyLCAoKSA9PiB7XG4gICAgICAgIGV2LmtleXNDaGFuZ2VkLmZvckVhY2goa2V5ID0+IHtcbiAgICAgICAgICBpZiAoa2V5ID09PSAnc3RhdGUnKSB7XG4gICAgICAgICAgICBjb25zdCBzdGF0ZSA9IChldi50YXJnZXQgYXMgWU1hcDxhbnk+KS5nZXQoJ3N0YXRlJylcbiAgICAgICAgICAgIGNvbXBvbmVudC51cGRhdGVTdGF0ZShkcmFmdCA9PiB7XG4gICAgICAgICAgICAgIE9iamVjdC5hc3NpZ24oZHJhZnQsIHN0YXRlKVxuICAgICAgICAgICAgfSlcbiAgICAgICAgICB9XG4gICAgICAgIH0pXG4gICAgICB9KVxuICAgIH1cbiAgICByZW1vdGVDb21wb25lbnQub2JzZXJ2ZShzeW5jUmVtb3RlKVxuXG4gICAgY29uc3Qgc3ViID0gY29tcG9uZW50Lm9uU3RhdGVDaGFuZ2Uuc3Vic2NyaWJlKG5ld1N0YXRlID0+IHtcbiAgICAgIHRoaXMucnVuTG9jYWxVcGRhdGUoKCkgPT4ge1xuICAgICAgICByZW1vdGVDb21wb25lbnQuc2V0KCdzdGF0ZScsIG5ld1N0YXRlKVxuICAgICAgfSlcbiAgICB9KVxuICAgIHRoaXMuY29tcG9uZW50U3RhdGVTeW5jQ2FjaGVzLnNldChjb21wb25lbnQsICgpID0+IHtcbiAgICAgIHJlbW90ZUNvbXBvbmVudC51bm9ic2VydmUoc3luY1JlbW90ZSlcbiAgICAgIHN1Yi51bnN1YnNjcmliZSgpXG4gICAgfSlcbiAgfVxuXG4gIHByaXZhdGUgcnVuTG9jYWxVcGRhdGUoZm46ICgpID0+IHZvaWQpIHtcbiAgICBpZiAodGhpcy51cGRhdGVGcm9tUmVtb3RlKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG4gICAgdGhpcy51cGRhdGVSZW1vdGVBY3Rpb25zLnB1c2goZm4pXG4gIH1cblxuICBwcml2YXRlIHJ1blJlbW90ZVVwZGF0ZSh0cjogVHJhbnNhY3Rpb24sIGZuOiAoKSA9PiB2b2lkKSB7XG4gICAgaWYgKHRyLm9yaWdpbiA9PT0gdGhpcy55RG9jKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG4gICAgdGhpcy51cGRhdGVGcm9tUmVtb3RlID0gdHJ1ZVxuICAgIGZuKClcbiAgICB0aGlzLnVwZGF0ZUZyb21SZW1vdGUgPSBmYWxzZVxuICB9XG5cbiAgcHJpdmF0ZSBjcmVhdGVTaGFyZWRDb21wb25lbnRCeUNvbXBvbmVudChjb21wb25lbnQ6IENvbXBvbmVudEluc3RhbmNlKTogWU1hcDxhbnk+IHtcbiAgICBjb25zdCBzaGFyZWRDb21wb25lbnQgPSBuZXcgWU1hcCgpXG4gICAgc2hhcmVkQ29tcG9uZW50LnNldCgnc3RhdGUnLCBjb21wb25lbnQuc3RhdGUpXG4gICAgc2hhcmVkQ29tcG9uZW50LnNldCgnbmFtZScsIGNvbXBvbmVudC5uYW1lKVxuICAgIGNvbnN0IHNoYXJlZFNsb3RzID0gbmV3IFlBcnJheSgpXG4gICAgc2hhcmVkQ29tcG9uZW50LnNldCgnc2xvdHMnLCBzaGFyZWRTbG90cylcbiAgICBjb21wb25lbnQuc2xvdHMudG9BcnJheSgpLmZvckVhY2goc2xvdCA9PiB7XG4gICAgICBjb25zdCBzaGFyZWRTbG90ID0gdGhpcy5jcmVhdGVTaGFyZWRTbG90QnlTbG90KHNsb3QpXG4gICAgICBzaGFyZWRTbG90cy5wdXNoKFtzaGFyZWRTbG90XSlcbiAgICB9KVxuICAgIHRoaXMuc3luY1Nsb3RzKHNoYXJlZFNsb3RzLCBjb21wb25lbnQpXG4gICAgdGhpcy5zeW5jQ29tcG9uZW50KHNoYXJlZENvbXBvbmVudCwgY29tcG9uZW50KVxuICAgIHJldHVybiBzaGFyZWRDb21wb25lbnRcbiAgfVxuXG4gIHByaXZhdGUgY3JlYXRlU2hhcmVkU2xvdEJ5U2xvdChzbG90OiBTbG90KTogWU1hcDxhbnk+IHtcbiAgICBjb25zdCBzaGFyZWRTbG90ID0gbmV3IFlNYXAoKVxuICAgIHNoYXJlZFNsb3Quc2V0KCdzY2hlbWEnLCBzbG90LnNjaGVtYSlcbiAgICBzaGFyZWRTbG90LnNldCgnc3RhdGUnLCBzbG90LnN0YXRlKVxuICAgIGNvbnN0IHNoYXJlZENvbnRlbnQgPSBuZXcgWVRleHQoKVxuICAgIHNoYXJlZFNsb3Quc2V0KCdjb250ZW50Jywgc2hhcmVkQ29udGVudClcbiAgICBsZXQgb2Zmc2V0ID0gMFxuICAgIHNsb3QudG9EZWx0YSgpLmZvckVhY2goaSA9PiB7XG4gICAgICBsZXQgZm9ybWF0czogYW55ID0ge31cbiAgICAgIGlmIChpLmZvcm1hdHMpIHtcbiAgICAgICAgaS5mb3JtYXRzLmZvckVhY2goaXRlbSA9PiB7XG4gICAgICAgICAgZm9ybWF0c1tpdGVtWzBdLm5hbWVdID0gaXRlbVsxXVxuICAgICAgICB9KVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZm9ybWF0cyA9IG51bGxcbiAgICAgIH1cbiAgICAgIGlmICh0eXBlb2YgaS5pbnNlcnQgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIHNoYXJlZENvbnRlbnQuaW5zZXJ0KG9mZnNldCwgaS5pbnNlcnQsIGZvcm1hdHMpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCBzaGFyZWRDb21wb25lbnQgPSB0aGlzLmNyZWF0ZVNoYXJlZENvbXBvbmVudEJ5Q29tcG9uZW50KGkuaW5zZXJ0KVxuICAgICAgICBzaGFyZWRDb250ZW50Lmluc2VydEVtYmVkKG9mZnNldCwgc2hhcmVkQ29tcG9uZW50LCBmb3JtYXRzKVxuICAgICAgfVxuICAgICAgb2Zmc2V0ICs9IGkuaW5zZXJ0Lmxlbmd0aFxuICAgIH0pXG4gICAgdGhpcy5zeW5jQ29udGVudChzaGFyZWRDb250ZW50LCBzbG90KVxuICAgIHRoaXMuc3luY1Nsb3Qoc2hhcmVkU2xvdCwgc2xvdClcbiAgICByZXR1cm4gc2hhcmVkU2xvdFxuICB9XG5cbiAgcHJpdmF0ZSBjcmVhdGVDb21wb25lbnRCeVNoYXJlZENvbXBvbmVudCh5TWFwOiBZTWFwPGFueT4pOiBDb21wb25lbnRJbnN0YW5jZSB7XG4gICAgY29uc3Qgc2hhcmVkU2xvdHMgPSB5TWFwLmdldCgnc2xvdHMnKSBhcyBZQXJyYXk8WU1hcDxhbnk+PlxuICAgIGNvbnN0IHNsb3RzOiBTbG90W10gPSBbXVxuICAgIHNoYXJlZFNsb3RzLmZvckVhY2goc2hhcmVkU2xvdCA9PiB7XG4gICAgICBjb25zdCBzbG90ID0gdGhpcy5jcmVhdGVTbG90QnlTaGFyZWRTbG90KHNoYXJlZFNsb3QpXG4gICAgICBzbG90cy5wdXNoKHNsb3QpXG4gICAgfSlcbiAgICBjb25zdCBuYW1lID0geU1hcC5nZXQoJ25hbWUnKVxuICAgIGNvbnN0IGluc3RhbmNlID0gdGhpcy50cmFuc2xhdG9yLmNyZWF0ZUNvbXBvbmVudEJ5RGF0YShuYW1lLCB7XG4gICAgICBzdGF0ZTogeU1hcC5nZXQoJ3N0YXRlJyksXG4gICAgICBzbG90c1xuICAgIH0pXG4gICAgaWYgKGluc3RhbmNlKSB7XG4gICAgICBpbnN0YW5jZS5zbG90cy50b0FycmF5KCkuZm9yRWFjaCgoc2xvdCwgaW5kZXgpID0+IHtcbiAgICAgICAgY29uc3Qgc2hhcmVkU2xvdCA9IHNoYXJlZFNsb3RzLmdldChpbmRleClcbiAgICAgICAgdGhpcy5zeW5jU2xvdChzaGFyZWRTbG90LCBzbG90KVxuICAgICAgICB0aGlzLnN5bmNDb250ZW50KHNoYXJlZFNsb3QuZ2V0KCdjb250ZW50JyksIHNsb3QpXG4gICAgICB9KVxuICAgICAgcmV0dXJuIGluc3RhbmNlXG4gICAgfVxuICAgIHRocm93IGNvbGxhYm9yYXRlRXJyb3JGbihgY2Fubm90IGZpbmQgY29tcG9uZW50IGZhY3RvcnkgXFxgJHtuYW1lfVxcYC5gKVxuICB9XG5cbiAgcHJpdmF0ZSBjcmVhdGVTbG90QnlTaGFyZWRTbG90KHNoYXJlZFNsb3Q6IFlNYXA8YW55Pik6IFNsb3Qge1xuICAgIGNvbnN0IGNvbnRlbnQgPSBzaGFyZWRTbG90LmdldCgnY29udGVudCcpIGFzIFlUZXh0XG4gICAgY29uc3QgZGVsdGEgPSBjb250ZW50LnRvRGVsdGEoKVxuXG4gICAgY29uc3Qgc2xvdCA9IHRoaXMudHJhbnNsYXRvci5jcmVhdGVTbG90KHtcbiAgICAgIHNjaGVtYTogc2hhcmVkU2xvdC5nZXQoJ3NjaGVtYScpLFxuICAgICAgc3RhdGU6IHNoYXJlZFNsb3QuZ2V0KCdzdGF0ZScpLFxuICAgICAgZm9ybWF0czoge30sXG4gICAgICBjb250ZW50OiBbXVxuICAgIH0pXG5cbiAgICBmb3IgKGNvbnN0IGFjdGlvbiBvZiBkZWx0YSkge1xuICAgICAgaWYgKGFjdGlvbi5pbnNlcnQpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBhY3Rpb24uaW5zZXJ0ID09PSAnc3RyaW5nJykge1xuICAgICAgICAgIHNsb3QuaW5zZXJ0KGFjdGlvbi5pbnNlcnQsIG1ha2VGb3JtYXRzKHRoaXMucmVnaXN0cnksIGFjdGlvbi5hdHRyaWJ1dGVzKSlcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjb25zdCBzaGFyZWRDb21wb25lbnQgPSBhY3Rpb24uaW5zZXJ0IGFzIFlNYXA8YW55PlxuICAgICAgICAgIGNvbnN0IGNvbXBvbmVudCA9IHRoaXMuY3JlYXRlQ29tcG9uZW50QnlTaGFyZWRDb21wb25lbnQoc2hhcmVkQ29tcG9uZW50KVxuICAgICAgICAgIHNsb3QuaW5zZXJ0KGNvbXBvbmVudClcbiAgICAgICAgICB0aGlzLnN5bmNTbG90cyhzaGFyZWRDb21wb25lbnQuZ2V0KCdzbG90cycpLCBjb21wb25lbnQpXG4gICAgICAgICAgdGhpcy5zeW5jQ29tcG9uZW50KHNoYXJlZENvbXBvbmVudCwgY29tcG9uZW50KVxuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aHJvdyBjb2xsYWJvcmF0ZUVycm9yRm4oJ3VuZXhwZWN0ZWQgZGVsdGEgYWN0aW9uLicpXG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBzbG90XG4gIH1cblxuICBwcml2YXRlIGNsZWFuU3Vic2NyaXB0aW9uc0J5U2xvdChzbG90OiBTbG90KSB7XG4gICAgW3RoaXMuY29udGVudFN5bmNDYWNoZXMuZ2V0KHNsb3QpLCB0aGlzLnNsb3RTdGF0ZVN5bmNDYWNoZXMuZ2V0KHNsb3QpXS5mb3JFYWNoKGZuID0+IHtcbiAgICAgIGlmIChmbikge1xuICAgICAgICBmbigpXG4gICAgICB9XG4gICAgfSlcbiAgICBzbG90LnNsaWNlQ29udGVudCgpLmZvckVhY2goaSA9PiB7XG4gICAgICBpZiAodHlwZW9mIGkgIT09ICdzdHJpbmcnKSB7XG4gICAgICAgIHRoaXMuY2xlYW5TdWJzY3JpcHRpb25zQnlDb21wb25lbnQoaSlcbiAgICAgIH1cbiAgICB9KVxuICB9XG5cbiAgcHJpdmF0ZSBjbGVhblN1YnNjcmlwdGlvbnNCeUNvbXBvbmVudChjb21wb25lbnQ6IENvbXBvbmVudEluc3RhbmNlKSB7XG4gICAgW3RoaXMuc2xvdHNTeW5jQ2FjaGVzLmdldChjb21wb25lbnQpLCB0aGlzLmNvbXBvbmVudFN0YXRlU3luY0NhY2hlcy5nZXQoY29tcG9uZW50KV0uZm9yRWFjaChmbiA9PiB7XG4gICAgICBpZiAoZm4pIHtcbiAgICAgICAgZm4oKVxuICAgICAgfVxuICAgIH0pXG4gICAgY29tcG9uZW50LnNsb3RzLnRvQXJyYXkoKS5mb3JFYWNoKHNsb3QgPT4ge1xuICAgICAgdGhpcy5jbGVhblN1YnNjcmlwdGlvbnNCeVNsb3Qoc2xvdClcbiAgICB9KVxuICB9XG59XG5cbmZ1bmN0aW9uIG1ha2VGb3JtYXRzKHJlZ2lzdHJ5OiBSZWdpc3RyeSwgYXR0cnM/OiBhbnkpIHtcbiAgY29uc3QgZm9ybWF0czogRm9ybWF0cyA9IFtdXG4gIGlmIChhdHRycykge1xuICAgIE9iamVjdC5rZXlzKGF0dHJzKS5tYXAoa2V5ID0+IHtcbiAgICAgIGNvbnN0IGZvcm1hdHRlciA9IHJlZ2lzdHJ5LmdldEZvcm1hdHRlcihrZXkpXG4gICAgICBpZiAoZm9ybWF0dGVyKSB7XG4gICAgICAgIGZvcm1hdHMucHVzaChbZm9ybWF0dGVyLCBhdHRyc1trZXldXSlcbiAgICAgIH1cbiAgICB9KVxuICB9XG4gIHJldHVybiBmb3JtYXRzXG59XG4iXX0=
630
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29sbGFib3JhdGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvY29sbGFib3JhdGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7O0FBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLFdBQVcsQ0FBQTtBQUN0QyxPQUFPLEVBQUUsU0FBUyxFQUFjLE9BQU8sRUFBZ0IsTUFBTSxlQUFlLENBQUE7QUFDNUUsT0FBTyxFQUVMLFdBQVcsRUFHWCxTQUFTLEVBQ1QsUUFBUSxFQUNSLFFBQVEsRUFDUixnQkFBZ0IsRUFDaEIsU0FBUyxFQUVULElBQUksRUFDSixPQUFPLEVBQ1AsVUFBVSxFQUNYLE1BQU0sZUFBZSxDQUFBO0FBQ3RCLE9BQU8sRUFBRSxLQUFLLElBQUksTUFBTSxFQUFFLEdBQUcsSUFBSSxJQUFJLEVBQUUsR0FBRyxJQUFJLElBQUksRUFBRSxJQUFJLElBQUksS0FBSyxFQUFlLFdBQVcsRUFBRSxNQUFNLEtBQUssQ0FBQTtBQUV4RyxPQUFPLEVBQUUsaUJBQWlCLEVBQW1CLE1BQU0sc0JBQXNCLENBQUE7QUFDekUsT0FBTyxFQUFFLHNCQUFzQixFQUFFLE1BQU0scUJBQXFCLENBQUE7QUFFNUQsTUFBTSxrQkFBa0IsR0FBRyxTQUFTLENBQUMsYUFBYSxDQUFDLENBQUE7QUFHbkQsSUFBYSxXQUFXLEdBQXhCLE1BQWEsV0FBVztJQW1DdEIsWUFBb0IsZ0JBQWtDLEVBQ2xDLGlCQUFvQyxFQUNwQyxVQUFzQixFQUN0QixRQUFrQixFQUNsQixRQUFrQixFQUNsQixTQUFvQixFQUNwQixPQUFnQjs7Ozs7bUJBTmhCOzs7Ozs7bUJBQ0E7Ozs7OzttQkFDQTs7Ozs7O21CQUNBOzs7Ozs7bUJBQ0E7Ozs7OzttQkFDQTs7Ozs7O21CQUNBOztRQXhDcEI7Ozs7O1dBQTZDO1FBQzdDOzs7O21CQUFPLElBQUksSUFBSSxFQUFFO1dBQUE7UUFDakI7Ozs7O1dBQXdCO1FBQ3hCOzs7OztXQUEyQjtRQUMzQjs7Ozs7V0FBeUI7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Q0FBQTtBQXRlWSxXQUFXO0lBRHZCLFVBQVUsRUFBRTtxQ0FvQzJCLGdCQUFnQjtRQUNmLGlCQUFpQjtRQUN4QixVQUFVO1FBQ1osUUFBUTtRQUNSLFFBQVE7UUFDUCxTQUFTO1FBQ1gsT0FBTztHQXpDekIsV0FBVyxDQXNldkI7U0F0ZVksV0FBVztBQXdleEIsU0FBUyxXQUFXLENBQUMsUUFBa0IsRUFBRSxLQUFXO0lBQ2xELE1BQU0sT0FBTyxHQUFZLEVBQUUsQ0FBQTtJQUMzQixJQUFJLEtBQUssRUFBRTtRQUNULE1BQU0sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxFQUFFO1lBQzNCLE1BQU0sU0FBUyxHQUFHLFFBQVEsQ0FBQyxZQUFZLENBQUMsR0FBRyxDQUFDLENBQUE7WUFDNUMsSUFBSSxTQUFTLEVBQUU7Z0JBQ2IsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDLFNBQVMsRUFBRSxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFBO2FBQ3RDO1FBQ0gsQ0FBQyxDQUFDLENBQUE7S0FDSDtJQUNELE9BQU8sT0FBTyxDQUFBO0FBQ2hCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RhYmxlIH0gZnJvbSAnQHRhbmJvL2RpJ1xuaW1wb3J0IHsgbWljcm9UYXNrLCBPYnNlcnZhYmxlLCBTdWJqZWN0LCBTdWJzY3JpcHRpb24gfSBmcm9tICdAdGFuYm8vc3RyZWFtJ1xuaW1wb3J0IHtcbiAgQ29tcG9uZW50SW5zdGFuY2UsXG4gIENvbnRlbnRUeXBlLFxuICBGb3JtYXRzLFxuICBIaXN0b3J5LFxuICBtYWtlRXJyb3IsXG4gIFJlZ2lzdHJ5LFxuICBSZW5kZXJlcixcbiAgUm9vdENvbXBvbmVudFJlZixcbiAgU2VsZWN0aW9uLFxuICBTZWxlY3Rpb25QYXRocyxcbiAgU2xvdCxcbiAgU3RhcnRlcixcbiAgVHJhbnNsYXRvclxufSBmcm9tICdAdGV4dGJ1cy9jb3JlJ1xuaW1wb3J0IHsgQXJyYXkgYXMgWUFycmF5LCBEb2MgYXMgWURvYywgTWFwIGFzIFlNYXAsIFRleHQgYXMgWVRleHQsIFRyYW5zYWN0aW9uLCBVbmRvTWFuYWdlciB9IGZyb20gJ3lqcydcblxuaW1wb3J0IHsgQ29sbGFib3JhdGVDdXJzb3IsIFJlbW90ZVNlbGVjdGlvbiB9IGZyb20gJy4vY29sbGFib3JhdGUtY3Vyc29yJ1xuaW1wb3J0IHsgY3JlYXRlVW5rbm93bkNvbXBvbmVudCB9IGZyb20gJy4vdW5rbm93bi5jb21wb25lbnQnXG5cbmNvbnN0IGNvbGxhYm9yYXRlRXJyb3JGbiA9IG1ha2VFcnJvcignQ29sbGFib3JhdGUnKVxuXG5ASW5qZWN0YWJsZSgpXG5leHBvcnQgY2xhc3MgQ29sbGFib3JhdGUgaW1wbGVtZW50cyBIaXN0b3J5IHtcbiAgb25TZWxlY3Rpb25DaGFuZ2U6IE9ic2VydmFibGU8U2VsZWN0aW9uUGF0aHM+XG4gIHlEb2MgPSBuZXcgWURvYygpXG4gIG9uQmFjazogT2JzZXJ2YWJsZTx2b2lkPlxuICBvbkZvcndhcmQ6IE9ic2VydmFibGU8dm9pZD5cbiAgb25DaGFuZ2U6IE9ic2VydmFibGU8YW55PlxuICBvblB1c2g6IE9ic2VydmFibGU8dm9pZD5cblxuICBnZXQgY2FuQmFjaygpIHtcbiAgICByZXR1cm4gdGhpcy5tYW5hZ2VyPy5jYW5VbmRvKClcbiAgfVxuXG4gIGdldCBjYW5Gb3J3YXJkKCkge1xuICAgIHJldHVybiB0aGlzLm1hbmFnZXI/LmNhblJlZG8oKVxuICB9XG5cbiAgcHJpdmF0ZSBiYWNrRXZlbnQgPSBuZXcgU3ViamVjdDx2b2lkPigpXG4gIHByaXZhdGUgZm9yd2FyZEV2ZW50ID0gbmV3IFN1YmplY3Q8dm9pZD4oKVxuICBwcml2YXRlIGNoYW5nZUV2ZW50ID0gbmV3IFN1YmplY3Q8dm9pZD4oKVxuICBwcml2YXRlIHB1c2hFdmVudCA9IG5ldyBTdWJqZWN0PHZvaWQ+KClcblxuICBwcml2YXRlIG1hbmFnZXIhOiBVbmRvTWFuYWdlclxuXG4gIHByaXZhdGUgc3Vic2NyaXB0aW9uczogU3Vic2NyaXB0aW9uW10gPSBbXVxuICBwcml2YXRlIHVwZGF0ZUZyb21SZW1vdGUgPSBmYWxzZVxuXG4gIHByaXZhdGUgY29udGVudFN5bmNDYWNoZXMgPSBuZXcgV2Vha01hcDxTbG90LCAoKSA9PiB2b2lkPigpXG4gIHByaXZhdGUgc2xvdFN0YXRlU3luY0NhY2hlcyA9IG5ldyBXZWFrTWFwPFNsb3QsICgpID0+IHZvaWQ+KClcbiAgcHJpdmF0ZSBzbG90c1N5bmNDYWNoZXMgPSBuZXcgV2Vha01hcDxDb21wb25lbnRJbnN0YW5jZSwgKCkgPT4gdm9pZD4oKVxuICBwcml2YXRlIGNvbXBvbmVudFN0YXRlU3luY0NhY2hlcyA9IG5ldyBXZWFrTWFwPENvbXBvbmVudEluc3RhbmNlLCAoKSA9PiB2b2lkPigpXG5cbiAgcHJpdmF0ZSBzZWxlY3Rpb25DaGFuZ2VFdmVudCA9IG5ldyBTdWJqZWN0PFNlbGVjdGlvblBhdGhzPigpXG5cbiAgcHJpdmF0ZSB1cGRhdGVSZW1vdGVBY3Rpb25zOiBBcnJheTwoKSA9PiB2b2lkPiA9IFtdXG5cbiAgY29uc3RydWN0b3IocHJpdmF0ZSByb290Q29tcG9uZW50UmVmOiBSb290Q29tcG9uZW50UmVmLFxuICAgICAgICAgICAgICBwcml2YXRlIGNvbGxhYm9yYXRlQ3Vyc29yOiBDb2xsYWJvcmF0ZUN1cnNvcixcbiAgICAgICAgICAgICAgcHJpdmF0ZSB0cmFuc2xhdG9yOiBUcmFuc2xhdG9yLFxuICAgICAgICAgICAgICBwcml2YXRlIHJlbmRlcmVyOiBSZW5kZXJlcixcbiAgICAgICAgICAgICAgcHJpdmF0ZSByZWdpc3RyeTogUmVnaXN0cnksXG4gICAgICAgICAgICAgIHByaXZhdGUgc2VsZWN0aW9uOiBTZWxlY3Rpb24sXG4gICAgICAgICAgICAgIHByaXZhdGUgc3RhcnRlcjogU3RhcnRlcikge1xuICAgIHRoaXMub25TZWxlY3Rpb25DaGFuZ2UgPSB0aGlzLnNlbGVjdGlvbkNoYW5nZUV2ZW50LmFzT2JzZXJ2YWJsZSgpXG4gICAgdGhpcy5vbkJhY2sgPSB0aGlzLmJhY2tFdmVudC5hc09ic2VydmFibGUoKVxuICAgIHRoaXMub25Gb3J3YXJkID0gdGhpcy5mb3J3YXJkRXZlbnQuYXNPYnNlcnZhYmxlKClcbiAgICB0aGlzLm9uQ2hhbmdlID0gdGhpcy5jaGFuZ2VFdmVudC5hc09ic2VydmFibGUoKVxuICAgIHRoaXMub25QdXNoID0gdGhpcy5wdXNoRXZlbnQuYXNPYnNlcnZhYmxlKClcbiAgfVxuXG4gIHNldHVwKCkge1xuICAgIHRoaXMuc3Vic2NyaXB0aW9ucy5wdXNoKFxuICAgICAgdGhpcy5zdGFydGVyLm9uUmVhZHkuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgdGhpcy5saXN0ZW4yKClcbiAgICAgIH0pLFxuICAgICAgdGhpcy5zZWxlY3Rpb24ub25DaGFuZ2Uuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgY29uc3QgcGF0aHMgPSB0aGlzLnNlbGVjdGlvbi5nZXRQYXRocygpXG4gICAgICAgIHRoaXMuc2VsZWN0aW9uQ2hhbmdlRXZlbnQubmV4dChwYXRocylcbiAgICAgIH0pXG4gICAgKVxuICB9XG5cbiAgdXBkYXRlUmVtb3RlU2VsZWN0aW9uKHBhdGhzOiBSZW1vdGVTZWxlY3Rpb25bXSkge1xuICAgIHRoaXMuY29sbGFib3JhdGVDdXJzb3IuZHJhdyhwYXRocylcbiAgfVxuXG4gIGxpc3RlbigpIHtcbiAgICAvL1xuICB9XG5cbiAgYmFjaygpIHtcbiAgICBpZiAodGhpcy5jYW5CYWNrKSB7XG4gICAgICB0aGlzLm1hbmFnZXIudW5kbygpXG4gICAgfVxuICB9XG5cbiAgZm9yd2FyZCgpIHtcbiAgICBpZiAodGhpcy5jYW5Gb3J3YXJkKSB7XG4gICAgICB0aGlzLm1hbmFnZXIucmVkbygpXG4gICAgfVxuICB9XG5cbiAgZGVzdHJveSgpIHtcbiAgICB0aGlzLnN1YnNjcmlwdGlvbnMuZm9yRWFjaChpID0+IGkudW5zdWJzY3JpYmUoKSlcbiAgfVxuXG4gIHByaXZhdGUgbGlzdGVuMigpIHtcbiAgICBjb25zdCByb290ID0gdGhpcy55RG9jLmdldFRleHQoJ2NvbnRlbnQnKVxuICAgIGNvbnN0IHJvb3RDb21wb25lbnQgPSB0aGlzLnJvb3RDb21wb25lbnRSZWYuY29tcG9uZW50IVxuICAgIHRoaXMubWFuYWdlciA9IG5ldyBVbmRvTWFuYWdlcihyb290LCB7XG4gICAgICB0cmFja2VkT3JpZ2luczogbmV3IFNldDxhbnk+KFt0aGlzLnlEb2NdKVxuICAgIH0pXG4gICAgdGhpcy5zeW5jQ29udGVudChyb290LCByb290Q29tcG9uZW50LnNsb3RzLmdldCgwKSEpXG5cbiAgICB0aGlzLnN1YnNjcmlwdGlvbnMucHVzaChcbiAgICAgIHJvb3RDb21wb25lbnQuY2hhbmdlTWFya2VyLm9uRm9yY2VDaGFuZ2UucGlwZShcbiAgICAgICAgbWljcm9UYXNrKClcbiAgICAgICkuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgdGhpcy5yZW5kZXJlci5yZW5kZXIoKVxuICAgICAgfSksXG4gICAgICByb290Q29tcG9uZW50LmNoYW5nZU1hcmtlci5vbkNoYW5nZS5waXBlKFxuICAgICAgICBtaWNyb1Rhc2soKVxuICAgICAgKS5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICB0aGlzLnlEb2MudHJhbnNhY3QoKCkgPT4ge1xuICAgICAgICAgIHRoaXMudXBkYXRlUmVtb3RlQWN0aW9ucy5mb3JFYWNoKGZuID0+IHtcbiAgICAgICAgICAgIGZuKClcbiAgICAgICAgICB9KVxuICAgICAgICAgIHRoaXMudXBkYXRlUmVtb3RlQWN0aW9ucyA9IFtdXG4gICAgICAgIH0sIHRoaXMueURvYylcbiAgICAgICAgdGhpcy5yZW5kZXJlci5yZW5kZXIoKVxuICAgICAgICB0aGlzLnNlbGVjdGlvbi5yZXN0b3JlKClcbiAgICAgIH0pXG4gICAgKVxuICB9XG5cbiAgcHJpdmF0ZSBzeW5jQ29udGVudChjb250ZW50OiBZVGV4dCwgc2xvdDogU2xvdCkge1xuICAgIGNvbnN0IHN5bmNSZW1vdGUgPSAoZXYsIHRyKSA9PiB7XG4gICAgICB0aGlzLnJ1blJlbW90ZVVwZGF0ZSh0ciwgKCkgPT4ge1xuICAgICAgICBzbG90LnJldGFpbigwKVxuICAgICAgICBldi5kZWx0YS5mb3JFYWNoKGFjdGlvbiA9PiB7XG4gICAgICAgICAgaWYgKFJlZmxlY3QuaGFzKGFjdGlvbiwgJ3JldGFpbicpKSB7XG4gICAgICAgICAgICBpZiAoYWN0aW9uLmF0dHJpYnV0ZXMpIHtcbiAgICAgICAgICAgICAgY29uc3QgZm9ybWF0cyA9IG1ha2VGb3JtYXRzKHRoaXMucmVnaXN0cnksIGFjdGlvbi5hdHRyaWJ1dGVzKVxuICAgICAgICAgICAgICBpZiAoZm9ybWF0cy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICBzbG90LnJldGFpbihhY3Rpb24ucmV0YWluISwgZm9ybWF0cylcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgc2xvdC5yZXRhaW4oYWN0aW9uLnJldGFpbilcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2UgaWYgKGFjdGlvbi5pbnNlcnQpIHtcbiAgICAgICAgICAgIGNvbnN0IGluZGV4ID0gc2xvdC5pbmRleFxuICAgICAgICAgICAgbGV0IGxlbmd0aCA9IDFcbiAgICAgICAgICAgIGlmICh0eXBlb2YgYWN0aW9uLmluc2VydCA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgICAgbGVuZ3RoID0gYWN0aW9uLmluc2VydC5sZW5ndGhcbiAgICAgICAgICAgICAgc2xvdC5pbnNlcnQoYWN0aW9uLmluc2VydCwgbWFrZUZvcm1hdHModGhpcy5yZWdpc3RyeSwgYWN0aW9uLmF0dHJpYnV0ZXMpKVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgY29uc3Qgc2hhcmVkQ29tcG9uZW50ID0gYWN0aW9uLmluc2VydCBhcyBZTWFwPGFueT5cbiAgICAgICAgICAgICAgY29uc3QgY2FuSW5zZXJ0SW5saW5lQ29tcG9uZW50ID0gc2xvdC5zY2hlbWEuaW5jbHVkZXMoQ29udGVudFR5cGUuSW5saW5lQ29tcG9uZW50KVxuICAgICAgICAgICAgICBjb25zdCBjb21wb25lbnQgPSB0aGlzLmNyZWF0ZUNvbXBvbmVudEJ5U2hhcmVkQ29tcG9uZW50KHNoYXJlZENvbXBvbmVudCwgY2FuSW5zZXJ0SW5saW5lQ29tcG9uZW50KVxuICAgICAgICAgICAgICB0aGlzLnN5bmNTbG90cyhzaGFyZWRDb21wb25lbnQuZ2V0KCdzbG90cycpLCBjb21wb25lbnQpXG4gICAgICAgICAgICAgIHRoaXMuc3luY0NvbXBvbmVudChzaGFyZWRDb21wb25lbnQsIGNvbXBvbmVudClcbiAgICAgICAgICAgICAgc2xvdC5pbnNlcnQoY29tcG9uZW50KVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHRoaXMuc2VsZWN0aW9uLmlzU2VsZWN0ZWQpIHtcbiAgICAgICAgICAgICAgaWYgKHNsb3QgPT09IHRoaXMuc2VsZWN0aW9uLnN0YXJ0U2xvdCAmJiB0aGlzLnNlbGVjdGlvbi5zdGFydE9mZnNldCEgPj0gaW5kZXgpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdGlvbi5zZXRTdGFydChzbG90LCB0aGlzLnNlbGVjdGlvbi5zdGFydE9mZnNldCEgKyBsZW5ndGgpXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgaWYgKHNsb3QgPT09IHRoaXMuc2VsZWN0aW9uLmVuZFNsb3QgJiYgdGhpcy5zZWxlY3Rpb24uZW5kT2Zmc2V0ISA+PSBpbmRleCkge1xuICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0aW9uLnNldEVuZChzbG90LCB0aGlzLnNlbGVjdGlvbi5lbmRPZmZzZXQhICsgbGVuZ3RoKVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIGlmIChhY3Rpb24uZGVsZXRlKSB7XG4gICAgICAgICAgICBjb25zdCBpbmRleCA9IHNsb3QuaW5kZXhcbiAgICAgICAgICAgIHNsb3QucmV0YWluKHNsb3QuaW5kZXgpXG4gICAgICAgICAgICBzbG90LmRlbGV0ZShhY3Rpb24uZGVsZXRlKVxuICAgICAgICAgICAgaWYgKHRoaXMuc2VsZWN0aW9uLmlzU2VsZWN0ZWQpIHtcbiAgICAgICAgICAgICAgaWYgKHNsb3QgPT09IHRoaXMuc2VsZWN0aW9uLnN0YXJ0U2xvdCAmJiB0aGlzLnNlbGVjdGlvbi5zdGFydE9mZnNldCEgPj0gaW5kZXgpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdGlvbi5zZXRTdGFydChzbG90LCB0aGlzLnNlbGVjdGlvbi5zdGFydE9mZnNldCEgLSBhY3Rpb24uZGVsZXRlKVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGlmIChzbG90ID09PSB0aGlzLnNlbGVjdGlvbi5lbmRTbG90ICYmIHRoaXMuc2VsZWN0aW9uLmVuZE9mZnNldCEgPj0gaW5kZXgpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdGlvbi5zZXRFbmQoc2xvdCwgdGhpcy5zZWxlY3Rpb24uZW5kT2Zmc2V0ISAtIGFjdGlvbi5kZWxldGUpXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2UgaWYgKGFjdGlvbi5hdHRyaWJ1dGVzKSB7XG4gICAgICAgICAgICBzbG90LnVwZGF0ZVN0YXRlKGRyYWZ0ID0+IHtcbiAgICAgICAgICAgICAgT2JqZWN0LmFzc2lnbihkcmFmdCwgYWN0aW9uLmF0dHJpYnV0ZXMpXG4gICAgICAgICAgICB9KVxuICAgICAgICAgIH1cbiAgICAgICAgfSlcbiAgICAgIH0pXG4gICAgfVxuICAgIGNvbnRlbnQub2JzZXJ2ZShzeW5jUmVtb3RlKVxuXG4gICAgY29uc3Qgc3ViID0gc2xvdC5vbkNvbnRlbnRDaGFuZ2Uuc3Vic2NyaWJlKGFjdGlvbnMgPT4ge1xuICAgICAgdGhpcy5ydW5Mb2NhbFVwZGF0ZSgoKSA9PiB7XG4gICAgICAgIGxldCBvZmZzZXQgPSAwXG4gICAgICAgIGxldCBsZW5ndGggPSAwXG4gICAgICAgIGZvciAoY29uc3QgYWN0aW9uIG9mIGFjdGlvbnMpIHtcbiAgICAgICAgICBpZiAoYWN0aW9uLnR5cGUgPT09ICdyZXRhaW4nKSB7XG4gICAgICAgICAgICBjb25zdCBmb3JtYXRzID0gYWN0aW9uLmZvcm1hdHNcbiAgICAgICAgICAgIGlmIChmb3JtYXRzKSB7XG4gICAgICAgICAgICAgIGNvbnN0IGtleXMgPSBPYmplY3Qua2V5cyhmb3JtYXRzKVxuICAgICAgICAgICAgICBsZXQgbGVuZ3RoID0ga2V5cy5sZW5ndGhcbiAgICAgICAgICAgICAga2V5cy5mb3JFYWNoKGtleSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKCF0aGlzLnJlZ2lzdHJ5LmdldEZvcm1hdHRlcihrZXkpKSB7XG4gICAgICAgICAgICAgICAgICBsZW5ndGgtLVxuICAgICAgICAgICAgICAgICAgUmVmbGVjdC5kZWxldGVQcm9wZXJ0eShmb3JtYXRzLCBrZXkpXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICBpZiAobGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgY29udGVudC5mb3JtYXQob2Zmc2V0LCBhY3Rpb24ub2Zmc2V0LCBmb3JtYXRzKVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBvZmZzZXQgPSBhY3Rpb24ub2Zmc2V0XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIGlmIChhY3Rpb24udHlwZSA9PT0gJ2luc2VydCcpIHtcbiAgICAgICAgICAgIGNvbnN0IGRlbHRhID0gY29udGVudC50b0RlbHRhKClcbiAgICAgICAgICAgIGNvbnN0IGlzRW1wdHkgPSBkZWx0YS5sZW5ndGggPT09IDEgJiYgZGVsdGFbMF0uaW5zZXJ0ID09PSBTbG90LmVtcHR5UGxhY2Vob2xkZXJcbiAgICAgICAgICAgIGlmICh0eXBlb2YgYWN0aW9uLmNvbnRlbnQgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICAgIGxlbmd0aCA9IGFjdGlvbi5jb250ZW50Lmxlbmd0aFxuICAgICAgICAgICAgICBjb250ZW50Lmluc2VydChvZmZzZXQsIGFjdGlvbi5jb250ZW50KVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgbGVuZ3RoID0gMVxuICAgICAgICAgICAgICBjb25zdCBjb21wb25lbnQgPSBzbG90LmdldENvbnRlbnRBdEluZGV4KG9mZnNldCkgYXMgQ29tcG9uZW50SW5zdGFuY2VcbiAgICAgICAgICAgICAgY29uc3Qgc2hhcmVkQ29tcG9uZW50ID0gdGhpcy5jcmVhdGVTaGFyZWRDb21wb25lbnRCeUNvbXBvbmVudChjb21wb25lbnQpXG4gICAgICAgICAgICAgIGNvbnRlbnQuaW5zZXJ0RW1iZWQob2Zmc2V0LCBzaGFyZWRDb21wb25lbnQpXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoYWN0aW9uLmZvcm1hdHMpIHtcbiAgICAgICAgICAgICAgY29udGVudC5mb3JtYXQob2Zmc2V0LCBsZW5ndGgsIGFjdGlvbi5mb3JtYXRzKVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGlzRW1wdHkgJiYgb2Zmc2V0ID09PSAwKSB7XG4gICAgICAgICAgICAgIGNvbnRlbnQuZGVsZXRlKGNvbnRlbnQubGVuZ3RoIC0gMSwgMSlcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIG9mZnNldCArPSBsZW5ndGhcbiAgICAgICAgICB9IGVsc2UgaWYgKGFjdGlvbi50eXBlID09PSAnZGVsZXRlJykge1xuICAgICAgICAgICAgY29uc3QgZGVsdGEgPSBjb250ZW50LnRvRGVsdGEoKVxuICAgICAgICAgICAgY29udGVudC5kZWxldGUob2Zmc2V0LCBhY3Rpb24uY291bnQpXG4gICAgICAgICAgICBpZiAoY29udGVudC5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgICAgY29udGVudC5pbnNlcnQoMCwgJ1xcbicsIGRlbHRhWzBdPy5hdHRyaWJ1dGVzKVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSlcbiAgICB9KVxuXG4gICAgc3ViLmFkZChzbG90Lm9uQ2hpbGRDb21wb25lbnRSZW1vdmUuc3Vic2NyaWJlKGNvbXBvbmVudHMgPT4ge1xuICAgICAgY29tcG9uZW50cy5mb3JFYWNoKGMgPT4ge1xuICAgICAgICB0aGlzLmNsZWFuU3Vic2NyaXB0aW9uc0J5Q29tcG9uZW50KGMpXG4gICAgICB9KVxuICAgIH0pKVxuICAgIHRoaXMuY29udGVudFN5bmNDYWNoZXMuc2V0KHNsb3QsICgpID0+IHtcbiAgICAgIGNvbnRlbnQudW5vYnNlcnZlKHN5bmNSZW1vdGUpXG4gICAgICBzdWIudW5zdWJzY3JpYmUoKVxuICAgIH0pXG4gIH1cblxuICBwcml2YXRlIHN5bmNTbG90KHJlbW90ZVNsb3Q6IFlNYXA8YW55Piwgc2xvdDogU2xvdCkge1xuICAgIGNvbnN0IHN5bmNSZW1vdGUgPSAoZXYsIHRyKSA9PiB7XG4gICAgICB0aGlzLnJ1blJlbW90ZVVwZGF0ZSh0ciwgKCkgPT4ge1xuICAgICAgICBldi5rZXlzQ2hhbmdlZC5mb3JFYWNoKGtleSA9PiB7XG4gICAgICAgICAgaWYgKGtleSA9PT0gJ3N0YXRlJykge1xuICAgICAgICAgICAgY29uc3Qgc3RhdGUgPSAoZXYudGFyZ2V0IGFzIFlNYXA8YW55PikuZ2V0KCdzdGF0ZScpXG4gICAgICAgICAgICBzbG90LnVwZGF0ZVN0YXRlKGRyYWZ0ID0+IHtcbiAgICAgICAgICAgICAgT2JqZWN0LmFzc2lnbihkcmFmdCwgc3RhdGUpXG4gICAgICAgICAgICB9KVxuICAgICAgICAgIH1cbiAgICAgICAgfSlcbiAgICAgIH0pXG4gICAgfVxuICAgIHJlbW90ZVNsb3Qub2JzZXJ2ZShzeW5jUmVtb3RlKVxuXG4gICAgY29uc3Qgc3ViID0gc2xvdC5vblN0YXRlQ2hhbmdlLnN1YnNjcmliZShhY3Rpb25zID0+IHtcbiAgICAgIHRoaXMucnVuTG9jYWxVcGRhdGUoKCkgPT4ge1xuICAgICAgICBhY3Rpb25zLmZvckVhY2goYWN0aW9uID0+IHtcbiAgICAgICAgICByZW1vdGVTbG90LnNldCgnc3RhdGUnLCBhY3Rpb24udmFsdWUpXG4gICAgICAgIH0pXG4gICAgICB9KVxuICAgIH0pXG4gICAgdGhpcy5zbG90U3RhdGVTeW5jQ2FjaGVzLnNldChzbG90LCAoKSA9PiB7XG4gICAgICByZW1vdGVTbG90LnVub2JzZXJ2ZShzeW5jUmVtb3RlKVxuICAgICAgc3ViLnVuc3Vic2NyaWJlKClcbiAgICB9KVxuICB9XG5cbiAgcHJpdmF0ZSBzeW5jU2xvdHMocmVtb3RlU2xvdHM6IFlBcnJheTxhbnk+LCBjb21wb25lbnQ6IENvbXBvbmVudEluc3RhbmNlKSB7XG4gICAgY29uc3Qgc2xvdHMgPSBjb21wb25lbnQuc2xvdHNcbiAgICBjb25zdCBzeW5jUmVtb3RlID0gKGV2LCB0cikgPT4ge1xuICAgICAgdGhpcy5ydW5SZW1vdGVVcGRhdGUodHIsICgpID0+IHtcbiAgICAgICAgbGV0IGluZGV4ID0gMFxuICAgICAgICBldi5kZWx0YS5mb3JFYWNoKGFjdGlvbiA9PiB7XG4gICAgICAgICAgaWYgKFJlZmxlY3QuaGFzKGFjdGlvbiwgJ3JldGFpbicpKSB7XG4gICAgICAgICAgICBzbG90cy5yZXRhaW4oYWN0aW9uLnJldGFpbiEpXG4gICAgICAgICAgICBpbmRleCArPSBhY3Rpb24ucmV0YWluXG4gICAgICAgICAgfSBlbHNlIGlmIChhY3Rpb24uaW5zZXJ0KSB7XG4gICAgICAgICAgICAoYWN0aW9uLmluc2VydCBhcyBBcnJheTxZTWFwPGFueT4+KS5mb3JFYWNoKGl0ZW0gPT4ge1xuICAgICAgICAgICAgICBjb25zdCBzbG90ID0gdGhpcy5jcmVhdGVTbG90QnlTaGFyZWRTbG90KGl0ZW0pXG4gICAgICAgICAgICAgIHNsb3RzLmluc2VydChzbG90KVxuICAgICAgICAgICAgICB0aGlzLnN5bmNDb250ZW50KGl0ZW0uZ2V0KCdjb250ZW50JyksIHNsb3QpXG4gICAgICAgICAgICAgIHRoaXMuc3luY1Nsb3QoaXRlbSwgc2xvdClcbiAgICAgICAgICAgICAgaW5kZXgrK1xuICAgICAgICAgICAgfSlcbiAgICAgICAgICB9IGVsc2UgaWYgKGFjdGlvbi5kZWxldGUpIHtcbiAgICAgICAgICAgIHNsb3RzLnJldGFpbihpbmRleClcbiAgICAgICAgICAgIHNsb3RzLmRlbGV0ZShhY3Rpb24uZGVsZXRlKVxuICAgICAgICAgIH1cbiAgICAgICAgfSlcbiAgICAgIH0pXG4gICAgfVxuICAgIHJlbW90ZVNsb3RzLm9ic2VydmUoc3luY1JlbW90ZSlcblxuICAgIGNvbnN0IHN1YiA9IHNsb3RzLm9uQ2hhbmdlLnN1YnNjcmliZShvcGVyYXRpb25zID0+IHtcbiAgICAgIHRoaXMucnVuTG9jYWxVcGRhdGUoKCkgPT4ge1xuICAgICAgICBjb25zdCBhcHBseUFjdGlvbnMgPSBvcGVyYXRpb25zLmFwcGx5XG4gICAgICAgIGxldCBpbmRleDogbnVtYmVyXG4gICAgICAgIGFwcGx5QWN0aW9ucy5mb3JFYWNoKGFjdGlvbiA9PiB7XG4gICAgICAgICAgaWYgKGFjdGlvbi50eXBlID09PSAncmV0YWluJykge1xuICAgICAgICAgICAgaW5kZXggPSBhY3Rpb24ub2Zmc2V0XG4gICAgICAgICAgfSBlbHNlIGlmIChhY3Rpb24udHlwZSA9PT0gJ2luc2VydFNsb3QnKSB7XG4gICAgICAgICAgICBjb25zdCBzbG90ID0gc2xvdHMuZ2V0KGluZGV4KSFcbiAgICAgICAgICAgIGNvbnN0IHNoYXJlZFNsb3QgPSB0aGlzLmNyZWF0ZVNoYXJlZFNsb3RCeVNsb3Qoc2xvdClcbiAgICAgICAgICAgIHJlbW90ZVNsb3RzLmluc2VydChpbmRleCwgW3NoYXJlZFNsb3RdKVxuICAgICAgICAgICAgaW5kZXgrK1xuICAgICAgICAgIH0gZWxzZSBpZiAoYWN0aW9uLnR5cGUgPT09ICdkZWxldGUnKSB7XG4gICAgICAgICAgICByZW1vdGVTbG90cy5kZWxldGUoaW5kZXgsIGFjdGlvbi5jb3VudClcbiAgICAgICAgICB9XG4gICAgICAgIH0pXG4gICAgICB9KVxuICAgIH0pXG5cbiAgICBzdWIuYWRkKHNsb3RzLm9uQ2hpbGRTbG90UmVtb3ZlLnN1YnNjcmliZShzbG90cyA9PiB7XG4gICAgICBzbG90cy5mb3JFYWNoKHNsb3QgPT4ge1xuICAgICAgICB0aGlzLmNsZWFuU3Vic2NyaXB0aW9uc0J5U2xvdChzbG90KVxuICAgICAgfSlcbiAgICB9KSlcblxuICAgIHRoaXMuc2xvdHNTeW5jQ2FjaGVzLnNldChjb21wb25lbnQsICgpID0+IHtcbiAgICAgIHJlbW90ZVNsb3RzLnVub2JzZXJ2ZShzeW5jUmVtb3RlKVxuICAgICAgc3ViLnVuc3Vic2NyaWJlKClcbiAgICB9KVxuICB9XG5cbiAgcHJpdmF0ZSBzeW5jQ29tcG9uZW50KHJlbW90ZUNvbXBvbmVudDogWU1hcDxhbnk+LCBjb21wb25lbnQ6IENvbXBvbmVudEluc3RhbmNlKSB7XG4gICAgY29uc3Qgc3luY1JlbW90ZSA9IChldiwgdHIpID0+IHtcbiAgICAgIHRoaXMucnVuUmVtb3RlVXBkYXRlKHRyLCAoKSA9PiB7XG4gICAgICAgIGV2LmtleXNDaGFuZ2VkLmZvckVhY2goa2V5ID0+IHtcbiAgICAgICAgICBpZiAoa2V5ID09PSAnc3RhdGUnKSB7XG4gICAgICAgICAgICBjb25zdCBzdGF0ZSA9IChldi50YXJnZXQgYXMgWU1hcDxhbnk+KS5nZXQoJ3N0YXRlJylcbiAgICAgICAgICAgIGNvbXBvbmVudC51cGRhdGVTdGF0ZShkcmFmdCA9PiB7XG4gICAgICAgICAgICAgIE9iamVjdC5hc3NpZ24oZHJhZnQsIHN0YXRlKVxuICAgICAgICAgICAgfSlcbiAgICAgICAgICB9XG4gICAgICAgIH0pXG4gICAgICB9KVxuICAgIH1cbiAgICByZW1vdGVDb21wb25lbnQub2JzZXJ2ZShzeW5jUmVtb3RlKVxuXG4gICAgY29uc3Qgc3ViID0gY29tcG9uZW50Lm9uU3RhdGVDaGFuZ2Uuc3Vic2NyaWJlKG5ld1N0YXRlID0+IHtcbiAgICAgIHRoaXMucnVuTG9jYWxVcGRhdGUoKCkgPT4ge1xuICAgICAgICByZW1vdGVDb21wb25lbnQuc2V0KCdzdGF0ZScsIG5ld1N0YXRlKVxuICAgICAgfSlcbiAgICB9KVxuICAgIHRoaXMuY29tcG9uZW50U3RhdGVTeW5jQ2FjaGVzLnNldChjb21wb25lbnQsICgpID0+IHtcbiAgICAgIHJlbW90ZUNvbXBvbmVudC51bm9ic2VydmUoc3luY1JlbW90ZSlcbiAgICAgIHN1Yi51bnN1YnNjcmliZSgpXG4gICAgfSlcbiAgfVxuXG4gIHByaXZhdGUgcnVuTG9jYWxVcGRhdGUoZm46ICgpID0+IHZvaWQpIHtcbiAgICBpZiAodGhpcy51cGRhdGVGcm9tUmVtb3RlKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG4gICAgdGhpcy51cGRhdGVSZW1vdGVBY3Rpb25zLnB1c2goZm4pXG4gIH1cblxuICBwcml2YXRlIHJ1blJlbW90ZVVwZGF0ZSh0cjogVHJhbnNhY3Rpb24sIGZuOiAoKSA9PiB2b2lkKSB7XG4gICAgaWYgKHRyLm9yaWdpbiA9PT0gdGhpcy55RG9jKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG4gICAgdGhpcy51cGRhdGVGcm9tUmVtb3RlID0gdHJ1ZVxuICAgIGZuKClcbiAgICB0aGlzLnVwZGF0ZUZyb21SZW1vdGUgPSBmYWxzZVxuICB9XG5cbiAgcHJpdmF0ZSBjcmVhdGVTaGFyZWRDb21wb25lbnRCeUNvbXBvbmVudChjb21wb25lbnQ6IENvbXBvbmVudEluc3RhbmNlKTogWU1hcDxhbnk+IHtcbiAgICBjb25zdCBzaGFyZWRDb21wb25lbnQgPSBuZXcgWU1hcCgpXG4gICAgc2hhcmVkQ29tcG9uZW50LnNldCgnc3RhdGUnLCBjb21wb25lbnQuc3RhdGUpXG4gICAgc2hhcmVkQ29tcG9uZW50LnNldCgnbmFtZScsIGNvbXBvbmVudC5uYW1lKVxuICAgIGNvbnN0IHNoYXJlZFNsb3RzID0gbmV3IFlBcnJheSgpXG4gICAgc2hhcmVkQ29tcG9uZW50LnNldCgnc2xvdHMnLCBzaGFyZWRTbG90cylcbiAgICBjb21wb25lbnQuc2xvdHMudG9BcnJheSgpLmZvckVhY2goc2xvdCA9PiB7XG4gICAgICBjb25zdCBzaGFyZWRTbG90ID0gdGhpcy5jcmVhdGVTaGFyZWRTbG90QnlTbG90KHNsb3QpXG4gICAgICBzaGFyZWRTbG90cy5wdXNoKFtzaGFyZWRTbG90XSlcbiAgICB9KVxuICAgIHRoaXMuc3luY1Nsb3RzKHNoYXJlZFNsb3RzLCBjb21wb25lbnQpXG4gICAgdGhpcy5zeW5jQ29tcG9uZW50KHNoYXJlZENvbXBvbmVudCwgY29tcG9uZW50KVxuICAgIHJldHVybiBzaGFyZWRDb21wb25lbnRcbiAgfVxuXG4gIHByaXZhdGUgY3JlYXRlU2hhcmVkU2xvdEJ5U2xvdChzbG90OiBTbG90KTogWU1hcDxhbnk+IHtcbiAgICBjb25zdCBzaGFyZWRTbG90ID0gbmV3IFlNYXAoKVxuICAgIHNoYXJlZFNsb3Quc2V0KCdzY2hlbWEnLCBzbG90LnNjaGVtYSlcbiAgICBzaGFyZWRTbG90LnNldCgnc3RhdGUnLCBzbG90LnN0YXRlKVxuICAgIGNvbnN0IHNoYXJlZENvbnRlbnQgPSBuZXcgWVRleHQoKVxuICAgIHNoYXJlZFNsb3Quc2V0KCdjb250ZW50Jywgc2hhcmVkQ29udGVudClcbiAgICBsZXQgb2Zmc2V0ID0gMFxuICAgIHNsb3QudG9EZWx0YSgpLmZvckVhY2goaSA9PiB7XG4gICAgICBsZXQgZm9ybWF0czogYW55ID0ge31cbiAgICAgIGlmIChpLmZvcm1hdHMpIHtcbiAgICAgICAgaS5mb3JtYXRzLmZvckVhY2goaXRlbSA9PiB7XG4gICAgICAgICAgZm9ybWF0c1tpdGVtWzBdLm5hbWVdID0gaXRlbVsxXVxuICAgICAgICB9KVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZm9ybWF0cyA9IG51bGxcbiAgICAgIH1cbiAgICAgIGlmICh0eXBlb2YgaS5pbnNlcnQgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIHNoYXJlZENvbnRlbnQuaW5zZXJ0KG9mZnNldCwgaS5pbnNlcnQsIGZvcm1hdHMpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCBzaGFyZWRDb21wb25lbnQgPSB0aGlzLmNyZWF0ZVNoYXJlZENvbXBvbmVudEJ5Q29tcG9uZW50KGkuaW5zZXJ0KVxuICAgICAgICBzaGFyZWRDb250ZW50Lmluc2VydEVtYmVkKG9mZnNldCwgc2hhcmVkQ29tcG9uZW50LCBmb3JtYXRzKVxuICAgICAgfVxuICAgICAgb2Zmc2V0ICs9IGkuaW5zZXJ0Lmxlbmd0aFxuICAgIH0pXG4gICAgdGhpcy5zeW5jQ29udGVudChzaGFyZWRDb250ZW50LCBzbG90KVxuICAgIHRoaXMuc3luY1Nsb3Qoc2hhcmVkU2xvdCwgc2xvdClcbiAgICByZXR1cm4gc2hhcmVkU2xvdFxuICB9XG5cbiAgcHJpdmF0ZSBjcmVhdGVDb21wb25lbnRCeVNoYXJlZENvbXBvbmVudCh5TWFwOiBZTWFwPGFueT4sIGNhbkluc2VydElubGluZUNvbXBvbmVudDogYm9vbGVhbik6IENvbXBvbmVudEluc3RhbmNlIHtcbiAgICBjb25zdCBzaGFyZWRTbG90cyA9IHlNYXAuZ2V0KCdzbG90cycpIGFzIFlBcnJheTxZTWFwPGFueT4+XG4gICAgY29uc3Qgc2xvdHM6IFNsb3RbXSA9IFtdXG4gICAgc2hhcmVkU2xvdHMuZm9yRWFjaChzaGFyZWRTbG90ID0+IHtcbiAgICAgIGNvbnN0IHNsb3QgPSB0aGlzLmNyZWF0ZVNsb3RCeVNoYXJlZFNsb3Qoc2hhcmVkU2xvdClcbiAgICAgIHNsb3RzLnB1c2goc2xvdClcbiAgICB9KVxuICAgIGNvbnN0IG5hbWUgPSB5TWFwLmdldCgnbmFtZScpXG4gICAgY29uc3QgaW5zdGFuY2UgPSB0aGlzLnRyYW5zbGF0b3IuY3JlYXRlQ29tcG9uZW50QnlEYXRhKG5hbWUsIHtcbiAgICAgIHN0YXRlOiB5TWFwLmdldCgnc3RhdGUnKSxcbiAgICAgIHNsb3RzXG4gICAgfSlcbiAgICBpZiAoaW5zdGFuY2UpIHtcbiAgICAgIGluc3RhbmNlLnNsb3RzLnRvQXJyYXkoKS5mb3JFYWNoKChzbG90LCBpbmRleCkgPT4ge1xuICAgICAgICBsZXQgc2hhcmVkU2xvdCA9IHNoYXJlZFNsb3RzLmdldChpbmRleClcbiAgICAgICAgaWYgKCFzaGFyZWRTbG90KSB7XG4gICAgICAgICAgc2hhcmVkU2xvdCA9IHRoaXMuY3JlYXRlU2hhcmVkU2xvdEJ5U2xvdChzbG90KVxuICAgICAgICAgIHNoYXJlZFNsb3RzLnB1c2goW3NoYXJlZFNsb3RdKVxuICAgICAgICB9XG4gICAgICAgIHRoaXMuc3luY1Nsb3Qoc2hhcmVkU2xvdCwgc2xvdClcbiAgICAgICAgdGhpcy5zeW5jQ29udGVudChzaGFyZWRTbG90LmdldCgnY29udGVudCcpLCBzbG90KVxuICAgICAgfSlcbiAgICAgIHJldHVybiBpbnN0YW5jZVxuICAgIH1cbiAgICByZXR1cm4gY3JlYXRlVW5rbm93bkNvbXBvbmVudChuYW1lLCBjYW5JbnNlcnRJbmxpbmVDb21wb25lbnQpLmNyZWF0ZUluc3RhbmNlKHRoaXMuc3RhcnRlcilcbiAgfVxuXG4gIHByaXZhdGUgY3JlYXRlU2xvdEJ5U2hhcmVkU2xvdChzaGFyZWRTbG90OiBZTWFwPGFueT4pOiBTbG90IHtcbiAgICBjb25zdCBjb250ZW50ID0gc2hhcmVkU2xvdC5nZXQoJ2NvbnRlbnQnKSBhcyBZVGV4dFxuICAgIGNvbnN0IGRlbHRhID0gY29udGVudC50b0RlbHRhKClcblxuICAgIGNvbnN0IHNsb3QgPSB0aGlzLnRyYW5zbGF0b3IuY3JlYXRlU2xvdCh7XG4gICAgICBzY2hlbWE6IHNoYXJlZFNsb3QuZ2V0KCdzY2hlbWEnKSxcbiAgICAgIHN0YXRlOiBzaGFyZWRTbG90LmdldCgnc3RhdGUnKSxcbiAgICAgIGZvcm1hdHM6IHt9LFxuICAgICAgY29udGVudDogW11cbiAgICB9KVxuXG4gICAgZm9yIChjb25zdCBhY3Rpb24gb2YgZGVsdGEpIHtcbiAgICAgIGlmIChhY3Rpb24uaW5zZXJ0KSB7XG4gICAgICAgIGlmICh0eXBlb2YgYWN0aW9uLmluc2VydCA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICBzbG90Lmluc2VydChhY3Rpb24uaW5zZXJ0LCBtYWtlRm9ybWF0cyh0aGlzLnJlZ2lzdHJ5LCBhY3Rpb24uYXR0cmlidXRlcykpXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY29uc3Qgc2hhcmVkQ29tcG9uZW50ID0gYWN0aW9uLmluc2VydCBhcyBZTWFwPGFueT5cbiAgICAgICAgICBjb25zdCBjYW5JbnNlcnRJbmxpbmVDb21wb25lbnQgPSBzbG90LnNjaGVtYS5pbmNsdWRlcyhDb250ZW50VHlwZS5JbmxpbmVDb21wb25lbnQpXG4gICAgICAgICAgY29uc3QgY29tcG9uZW50ID0gdGhpcy5jcmVhdGVDb21wb25lbnRCeVNoYXJlZENvbXBvbmVudChzaGFyZWRDb21wb25lbnQsIGNhbkluc2VydElubGluZUNvbXBvbmVudClcbiAgICAgICAgICBzbG90Lmluc2VydChjb21wb25lbnQpXG4gICAgICAgICAgdGhpcy5zeW5jU2xvdHMoc2hhcmVkQ29tcG9uZW50LmdldCgnc2xvdHMnKSwgY29tcG9uZW50KVxuICAgICAgICAgIHRoaXMuc3luY0NvbXBvbmVudChzaGFyZWRDb21wb25lbnQsIGNvbXBvbmVudClcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhyb3cgY29sbGFib3JhdGVFcnJvckZuKCd1bmV4cGVjdGVkIGRlbHRhIGFjdGlvbi4nKVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gc2xvdFxuICB9XG5cbiAgcHJpdmF0ZSBjbGVhblN1YnNjcmlwdGlvbnNCeVNsb3Qoc2xvdDogU2xvdCkge1xuICAgIFt0aGlzLmNvbnRlbnRTeW5jQ2FjaGVzLmdldChzbG90KSwgdGhpcy5zbG90U3RhdGVTeW5jQ2FjaGVzLmdldChzbG90KV0uZm9yRWFjaChmbiA9PiB7XG4gICAgICBpZiAoZm4pIHtcbiAgICAgICAgZm4oKVxuICAgICAgfVxuICAgIH0pXG4gICAgc2xvdC5zbGljZUNvbnRlbnQoKS5mb3JFYWNoKGkgPT4ge1xuICAgICAgaWYgKHR5cGVvZiBpICE9PSAnc3RyaW5nJykge1xuICAgICAgICB0aGlzLmNsZWFuU3Vic2NyaXB0aW9uc0J5Q29tcG9uZW50KGkpXG4gICAgICB9XG4gICAgfSlcbiAgfVxuXG4gIHByaXZhdGUgY2xlYW5TdWJzY3JpcHRpb25zQnlDb21wb25lbnQoY29tcG9uZW50OiBDb21wb25lbnRJbnN0YW5jZSkge1xuICAgIFt0aGlzLnNsb3RzU3luY0NhY2hlcy5nZXQoY29tcG9uZW50KSwgdGhpcy5jb21wb25lbnRTdGF0ZVN5bmNDYWNoZXMuZ2V0KGNvbXBvbmVudCldLmZvckVhY2goZm4gPT4ge1xuICAgICAgaWYgKGZuKSB7XG4gICAgICAgIGZuKClcbiAgICAgIH1cbiAgICB9KVxuICAgIGNvbXBvbmVudC5zbG90cy50b0FycmF5KCkuZm9yRWFjaChzbG90ID0+IHtcbiAgICAgIHRoaXMuY2xlYW5TdWJzY3JpcHRpb25zQnlTbG90KHNsb3QpXG4gICAgfSlcbiAgfVxufVxuXG5mdW5jdGlvbiBtYWtlRm9ybWF0cyhyZWdpc3RyeTogUmVnaXN0cnksIGF0dHJzPzogYW55KSB7XG4gIGNvbnN0IGZvcm1hdHM6IEZvcm1hdHMgPSBbXVxuICBpZiAoYXR0cnMpIHtcbiAgICBPYmplY3Qua2V5cyhhdHRycykubWFwKGtleSA9PiB7XG4gICAgICBjb25zdCBmb3JtYXR0ZXIgPSByZWdpc3RyeS5nZXRGb3JtYXR0ZXIoa2V5KVxuICAgICAgaWYgKGZvcm1hdHRlcikge1xuICAgICAgICBmb3JtYXRzLnB1c2goW2Zvcm1hdHRlciwgYXR0cnNba2V5XV0pXG4gICAgICB9XG4gICAgfSlcbiAgfVxuICByZXR1cm4gZm9ybWF0c1xufVxuIl19
@@ -0,0 +1 @@
1
+ export declare function createUnknownComponent(factoryName: string, canInsertInlineComponent: boolean): any;
@@ -0,0 +1,22 @@
1
+ import { ContentType, defineComponent, VElement } from '@textbus/core';
2
+ export function createUnknownComponent(factoryName, canInsertInlineComponent) {
3
+ const unknownComponent = defineComponent({
4
+ type: canInsertInlineComponent ? ContentType.InlineComponent : ContentType.BlockComponent,
5
+ name: 'UnknownComponent',
6
+ setup() {
7
+ console.error(`cannot find component factory \`${factoryName}\`.`);
8
+ return {
9
+ render() {
10
+ return VElement.createElement('textbus-unknown-component', {
11
+ style: {
12
+ display: canInsertInlineComponent ? 'inline' : 'block',
13
+ color: '#f00'
14
+ }
15
+ }, unknownComponent.name);
16
+ }
17
+ };
18
+ }
19
+ });
20
+ return unknownComponent;
21
+ }
22
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidW5rbm93bi5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvdW5rbm93bi5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFdBQVcsRUFBRSxlQUFlLEVBQUUsUUFBUSxFQUFFLE1BQU0sZUFBZSxDQUFBO0FBRXRFLE1BQU0sVUFBVSxzQkFBc0IsQ0FBQyxXQUFtQixFQUFFLHdCQUFpQztJQUMzRixNQUFNLGdCQUFnQixHQUFHLGVBQWUsQ0FBQztRQUN2QyxJQUFJLEVBQUUsd0JBQXdCLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxlQUFlLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxjQUFjO1FBQ3pGLElBQUksRUFBRSxrQkFBa0I7UUFDeEIsS0FBSztZQUNILE9BQU8sQ0FBQyxLQUFLLENBQUMsbUNBQW1DLFdBQVcsS0FBSyxDQUFDLENBQUE7WUFDbEUsT0FBTztnQkFDTCxNQUFNO29CQUNKLE9BQU8sUUFBUSxDQUFDLGFBQWEsQ0FBQywyQkFBMkIsRUFBRTt3QkFDekQsS0FBSyxFQUFFOzRCQUNMLE9BQU8sRUFBRSx3QkFBd0IsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxPQUFPOzRCQUN0RCxLQUFLLEVBQUUsTUFBTTt5QkFDZDtxQkFDRixFQUFFLGdCQUFnQixDQUFDLElBQUksQ0FBQyxDQUFBO2dCQUMzQixDQUFDO2FBQ0YsQ0FBQTtRQUNILENBQUM7S0FDRixDQUFDLENBQUE7SUFDRixPQUFPLGdCQUFnQixDQUFBO0FBQ3pCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb250ZW50VHlwZSwgZGVmaW5lQ29tcG9uZW50LCBWRWxlbWVudCB9IGZyb20gJ0B0ZXh0YnVzL2NvcmUnXG5cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVVbmtub3duQ29tcG9uZW50KGZhY3RvcnlOYW1lOiBzdHJpbmcsIGNhbkluc2VydElubGluZUNvbXBvbmVudDogYm9vbGVhbikge1xuICBjb25zdCB1bmtub3duQ29tcG9uZW50ID0gZGVmaW5lQ29tcG9uZW50KHtcbiAgICB0eXBlOiBjYW5JbnNlcnRJbmxpbmVDb21wb25lbnQgPyBDb250ZW50VHlwZS5JbmxpbmVDb21wb25lbnQgOiBDb250ZW50VHlwZS5CbG9ja0NvbXBvbmVudCxcbiAgICBuYW1lOiAnVW5rbm93bkNvbXBvbmVudCcsXG4gICAgc2V0dXAoKSB7XG4gICAgICBjb25zb2xlLmVycm9yKGBjYW5ub3QgZmluZCBjb21wb25lbnQgZmFjdG9yeSBcXGAke2ZhY3RvcnlOYW1lfVxcYC5gKVxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgcmVuZGVyKCkge1xuICAgICAgICAgIHJldHVybiBWRWxlbWVudC5jcmVhdGVFbGVtZW50KCd0ZXh0YnVzLXVua25vd24tY29tcG9uZW50Jywge1xuICAgICAgICAgICAgc3R5bGU6IHtcbiAgICAgICAgICAgICAgZGlzcGxheTogY2FuSW5zZXJ0SW5saW5lQ29tcG9uZW50ID8gJ2lubGluZScgOiAnYmxvY2snLFxuICAgICAgICAgICAgICBjb2xvcjogJyNmMDAnXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSwgdW5rbm93bkNvbXBvbmVudC5uYW1lKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9KVxuICByZXR1cm4gdW5rbm93bkNvbXBvbmVudFxufVxuIl19
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@textbus/collaborate",
3
- "version": "2.0.0-beta.5",
3
+ "version": "2.0.0-beta.8",
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.1.0",
29
29
  "@tanbo/stream": "^1.0.0",
30
- "@textbus/browser": "^2.0.0-beta.5",
31
- "@textbus/core": "^2.0.0-beta.4",
30
+ "@textbus/browser": "^2.0.0-beta.8",
31
+ "@textbus/core": "^2.0.0-beta.8",
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": "c2d4326a24e8e2acf969737b315cfef462b16b2f"
47
+ "gitHead": "86920afac46123a6939d789f0bb3334f8318be58"
48
48
  }
@@ -1,4 +1,4 @@
1
- import { Inject, Injectable } from '@tanbo/di'
1
+ import { Inject, Injectable, Optional } from '@tanbo/di'
2
2
  import {
3
3
  createElement,
4
4
  EDITABLE_DOCUMENT,
@@ -6,7 +6,7 @@ import {
6
6
  getLayoutRectByRange,
7
7
  SelectionBridge
8
8
  } from '@textbus/browser'
9
- import { Selection, SelectionPaths } from '@textbus/core'
9
+ import { Selection, SelectionPaths, Range as TBRange } from '@textbus/core'
10
10
  import { Subject } from '@tanbo/stream'
11
11
 
12
12
  export interface RemoteSelection {
@@ -15,21 +15,28 @@ export interface RemoteSelection {
15
15
  paths: SelectionPaths
16
16
  }
17
17
 
18
- export interface SelectionRect {
19
- color: string
20
- username: string
18
+ export interface Rect {
21
19
  x: number
22
20
  y: number
23
21
  width: number
24
22
  height: number
25
23
  }
26
24
 
25
+ export interface SelectionRect extends Rect {
26
+ color: string
27
+ username: string
28
+ }
29
+
27
30
  export interface RemoteSelectionCursor {
28
31
  cursor: HTMLElement
29
32
  anchor: HTMLElement
30
33
  userTip: HTMLElement
31
34
  }
32
35
 
36
+ export abstract class CollaborateCursorAwarenessDelegate {
37
+ abstract getRects(range: TBRange, nativeRange: Range): false | Rect[]
38
+ }
39
+
33
40
  @Injectable()
34
41
  export class CollaborateCursor {
35
42
  private canvas = createElement('canvas', {
@@ -61,6 +68,7 @@ export class CollaborateCursor {
61
68
 
62
69
  constructor(@Inject(EDITOR_CONTAINER) private container: HTMLElement,
63
70
  @Inject(EDITABLE_DOCUMENT) private document: Document,
71
+ @Optional() private awarenessDelegate: CollaborateCursorAwarenessDelegate,
64
72
  private nativeSelection: SelectionBridge,
65
73
  private selection: Selection) {
66
74
  container.prepend(this.canvas, this.tooltips)
@@ -91,49 +99,62 @@ export class CollaborateCursor {
91
99
  const startSlot = this.selection.findSlotByPaths(item.paths.start)
92
100
  const endOffset = item.paths.end.pop()!
93
101
  const endSlot = this.selection.findSlotByPaths(item.paths.end)
102
+ if (!startSlot || !endSlot) {
103
+ return
104
+ }
94
105
 
95
- if (startSlot && endSlot) {
96
- const position = this.nativeSelection.getPositionByRange({
106
+ const {start, end} = this.nativeSelection.getPositionByRange({
107
+ startOffset,
108
+ endOffset,
109
+ startSlot,
110
+ endSlot
111
+ })
112
+ if (!start || !end) {
113
+ return
114
+ }
115
+ const nativeRange = this.document.createRange()
116
+ nativeRange.setStart(start.node, start.offset)
117
+ nativeRange.setEnd(end.node, end.offset)
118
+
119
+ let rects: Rect[] | DOMRectList | false = false
120
+ if (this.awarenessDelegate) {
121
+ rects = this.awarenessDelegate.getRects({
97
122
  startOffset,
98
123
  endOffset,
99
124
  startSlot,
100
125
  endSlot
126
+ }, nativeRange)
127
+ }
128
+ if (!rects) {
129
+ rects = nativeRange.getClientRects()
130
+ }
131
+ const selectionRects: SelectionRect[] = []
132
+ for (let i = rects.length - 1; i >= 0; i--) {
133
+ const rect = rects[i]
134
+ selectionRects.push({
135
+ color: item.color,
136
+ username: item.username,
137
+ x: rect.x - containerRect.x,
138
+ y: rect.y - containerRect.y,
139
+ width: rect.width,
140
+ height: rect.height,
101
141
  })
102
- if (position.start && position.end) {
103
- const nativeRange = this.document.createRange()
104
- nativeRange.setStart(position.start.node, position.start.offset)
105
- nativeRange.setEnd(position.end.node, position.end.offset)
106
-
107
- const rects = nativeRange.getClientRects()
108
- const selectionRects: SelectionRect[] = []
109
- for (let i = rects.length - 1; i >= 0; i--) {
110
- const rect = rects[i]
111
- selectionRects.push({
112
- color: item.color,
113
- username: item.username,
114
- x: rect.x - containerRect.x,
115
- y: rect.y - containerRect.y,
116
- width: rect.width,
117
- height: rect.height,
118
- })
119
- }
120
- this.onRectsChange.next(selectionRects)
121
-
122
- const cursorRange = nativeRange.cloneRange()
123
- cursorRange.collapse(!item.paths.focusEnd)
124
-
125
- const cursorRect = getLayoutRectByRange(cursorRange)
126
-
127
- users.push({
128
- username: item.username,
129
- color: item.color,
130
- x: cursorRect.x - containerRect.x,
131
- y: cursorRect.y - containerRect.y,
132
- width: 2,
133
- height: cursorRect.height
134
- })
135
- }
136
142
  }
143
+ this.onRectsChange.next(selectionRects)
144
+
145
+ const cursorRange = nativeRange.cloneRange()
146
+ cursorRange.collapse(!item.paths.focusEnd)
147
+
148
+ const cursorRect = getLayoutRectByRange(cursorRange)
149
+
150
+ users.push({
151
+ username: item.username,
152
+ color: item.color,
153
+ x: cursorRect.x - containerRect.x,
154
+ y: cursorRect.y - containerRect.y,
155
+ width: 2,
156
+ height: cursorRect.height
157
+ })
137
158
  })
138
159
  this.drawUserCursor(users)
139
160
  }
@@ -1,24 +1,24 @@
1
1
  import { Injectable } from '@tanbo/di'
2
- import { merge, microTask, Observable, Subject, Subscription } from '@tanbo/stream'
2
+ import { microTask, Observable, Subject, Subscription } from '@tanbo/stream'
3
3
  import {
4
- RootComponentRef,
5
- Starter,
6
- Translator,
4
+ ComponentInstance,
5
+ ContentType,
6
+ Formats,
7
+ History,
8
+ makeError,
7
9
  Registry,
10
+ Renderer,
11
+ RootComponentRef,
8
12
  Selection,
9
13
  SelectionPaths,
10
- History, Renderer, Slot, ComponentInstance, makeError, Formats
14
+ Slot,
15
+ Starter,
16
+ Translator
11
17
  } from '@textbus/core'
12
- import {
13
- Doc as YDoc,
14
- Map as YMap,
15
- Text as YText,
16
- Array as YArray,
17
- UndoManager,
18
- Transaction
19
- } from 'yjs'
18
+ import { Array as YArray, Doc as YDoc, Map as YMap, Text as YText, Transaction, UndoManager } from 'yjs'
20
19
 
21
20
  import { CollaborateCursor, RemoteSelection } from './collaborate-cursor'
21
+ import { createUnknownComponent } from './unknown.component'
22
22
 
23
23
  const collaborateErrorFn = makeError('Collaborate')
24
24
 
@@ -117,10 +117,12 @@ export class Collaborate implements History {
117
117
  this.syncContent(root, rootComponent.slots.get(0)!)
118
118
 
119
119
  this.subscriptions.push(
120
- merge(
121
- rootComponent.changeMarker.onForceChange,
122
- rootComponent.changeMarker.onChange
123
- ).pipe(
120
+ rootComponent.changeMarker.onForceChange.pipe(
121
+ microTask()
122
+ ).subscribe(() => {
123
+ this.renderer.render()
124
+ }),
125
+ rootComponent.changeMarker.onChange.pipe(
124
126
  microTask()
125
127
  ).subscribe(() => {
126
128
  this.yDoc.transact(() => {
@@ -157,7 +159,8 @@ export class Collaborate implements History {
157
159
  slot.insert(action.insert, makeFormats(this.registry, action.attributes))
158
160
  } else {
159
161
  const sharedComponent = action.insert as YMap<any>
160
- const component = this.createComponentBySharedComponent(sharedComponent)
162
+ const canInsertInlineComponent = slot.schema.includes(ContentType.InlineComponent)
163
+ const component = this.createComponentBySharedComponent(sharedComponent, canInsertInlineComponent)
161
164
  this.syncSlots(sharedComponent.get('slots'), component)
162
165
  this.syncComponent(sharedComponent, component)
163
166
  slot.insert(component)
@@ -243,6 +246,12 @@ export class Collaborate implements History {
243
246
  }
244
247
  })
245
248
  })
249
+
250
+ sub.add(slot.onChildComponentRemove.subscribe(components => {
251
+ components.forEach(c => {
252
+ this.cleanSubscriptionsByComponent(c)
253
+ })
254
+ }))
246
255
  this.contentSyncCaches.set(slot, () => {
247
256
  content.unobserve(syncRemote)
248
257
  sub.unsubscribe()
@@ -281,18 +290,21 @@ export class Collaborate implements History {
281
290
  const slots = component.slots
282
291
  const syncRemote = (ev, tr) => {
283
292
  this.runRemoteUpdate(tr, () => {
293
+ let index = 0
284
294
  ev.delta.forEach(action => {
285
295
  if (Reflect.has(action, 'retain')) {
286
296
  slots.retain(action.retain!)
297
+ index += action.retain
287
298
  } else if (action.insert) {
288
299
  (action.insert as Array<YMap<any>>).forEach(item => {
289
300
  const slot = this.createSlotBySharedSlot(item)
290
301
  slots.insert(slot)
291
302
  this.syncContent(item.get('content'), slot)
292
303
  this.syncSlot(item, slot)
304
+ index++
293
305
  })
294
306
  } else if (action.delete) {
295
- slots.retain(slots.index)
307
+ slots.retain(index)
296
308
  slots.delete(action.delete)
297
309
  }
298
310
  })
@@ -313,15 +325,18 @@ export class Collaborate implements History {
313
325
  remoteSlots.insert(index, [sharedSlot])
314
326
  index++
315
327
  } else if (action.type === 'delete') {
316
- slots.slice(index, index + action.count).forEach(slot => {
317
- this.cleanSubscriptionsBySlot(slot)
318
- })
319
328
  remoteSlots.delete(index, action.count)
320
329
  }
321
330
  })
322
331
  })
323
332
  })
324
333
 
334
+ sub.add(slots.onChildSlotRemove.subscribe(slots => {
335
+ slots.forEach(slot => {
336
+ this.cleanSubscriptionsBySlot(slot)
337
+ })
338
+ }))
339
+
325
340
  this.slotsSyncCaches.set(component, () => {
326
341
  remoteSlots.unobserve(syncRemote)
327
342
  sub.unsubscribe()
@@ -414,7 +429,7 @@ export class Collaborate implements History {
414
429
  return sharedSlot
415
430
  }
416
431
 
417
- private createComponentBySharedComponent(yMap: YMap<any>): ComponentInstance {
432
+ private createComponentBySharedComponent(yMap: YMap<any>, canInsertInlineComponent: boolean): ComponentInstance {
418
433
  const sharedSlots = yMap.get('slots') as YArray<YMap<any>>
419
434
  const slots: Slot[] = []
420
435
  sharedSlots.forEach(sharedSlot => {
@@ -428,13 +443,17 @@ export class Collaborate implements History {
428
443
  })
429
444
  if (instance) {
430
445
  instance.slots.toArray().forEach((slot, index) => {
431
- const sharedSlot = sharedSlots.get(index)
446
+ let sharedSlot = sharedSlots.get(index)
447
+ if (!sharedSlot) {
448
+ sharedSlot = this.createSharedSlotBySlot(slot)
449
+ sharedSlots.push([sharedSlot])
450
+ }
432
451
  this.syncSlot(sharedSlot, slot)
433
452
  this.syncContent(sharedSlot.get('content'), slot)
434
453
  })
435
454
  return instance
436
455
  }
437
- throw collaborateErrorFn(`cannot find component factory \`${name}\`.`)
456
+ return createUnknownComponent(name, canInsertInlineComponent).createInstance(this.starter)
438
457
  }
439
458
 
440
459
  private createSlotBySharedSlot(sharedSlot: YMap<any>): Slot {
@@ -454,7 +473,8 @@ export class Collaborate implements History {
454
473
  slot.insert(action.insert, makeFormats(this.registry, action.attributes))
455
474
  } else {
456
475
  const sharedComponent = action.insert as YMap<any>
457
- const component = this.createComponentBySharedComponent(sharedComponent)
476
+ const canInsertInlineComponent = slot.schema.includes(ContentType.InlineComponent)
477
+ const component = this.createComponentBySharedComponent(sharedComponent, canInsertInlineComponent)
458
478
  slot.insert(component)
459
479
  this.syncSlots(sharedComponent.get('slots'), component)
460
480
  this.syncComponent(sharedComponent, component)
@@ -0,0 +1,22 @@
1
+ import { ContentType, defineComponent, VElement } from '@textbus/core'
2
+
3
+ export function createUnknownComponent(factoryName: string, canInsertInlineComponent: boolean) {
4
+ const unknownComponent = defineComponent({
5
+ type: canInsertInlineComponent ? ContentType.InlineComponent : ContentType.BlockComponent,
6
+ name: 'UnknownComponent',
7
+ setup() {
8
+ console.error(`cannot find component factory \`${factoryName}\`.`)
9
+ return {
10
+ render() {
11
+ return VElement.createElement('textbus-unknown-component', {
12
+ style: {
13
+ display: canInsertInlineComponent ? 'inline' : 'block',
14
+ color: '#f00'
15
+ }
16
+ }, unknownComponent.name)
17
+ }
18
+ }
19
+ }
20
+ })
21
+ return unknownComponent
22
+ }