mobx-keystone-yjs 1.3.0 → 1.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +25 -17
- package/dist/mobx-keystone-yjs.esm.js +306 -25
- package/dist/mobx-keystone-yjs.esm.mjs +306 -25
- package/dist/mobx-keystone-yjs.umd.js +305 -26
- package/dist/types/binding/YjsTextModel.d.ts +39 -0
- package/dist/types/binding/bindYjsToMobxKeystone.d.ts +22 -1
- package/dist/types/binding/convertJsonToYjsData.d.ts +13 -2
- package/dist/types/binding/convertYjsDataToJson.d.ts +3 -0
- package/dist/types/binding/resolveYjsPath.d.ts +1 -0
- package/dist/types/binding/yjsBindingContext.d.ts +27 -1
- package/dist/types/index.d.ts +2 -1
- package/dist/types/utils/getOrCreateYjsCollectionAtom.d.ts +1 -0
- package/package.json +91 -87
- package/src/binding/YjsTextModel.ts +249 -0
- package/src/binding/applyMobxKeystonePatchToYjsObject.ts +96 -92
- package/src/binding/bindYjsToMobxKeystone.ts +191 -156
- package/src/binding/convertJsonToYjsData.ts +72 -50
- package/src/binding/convertYjsDataToJson.ts +31 -0
- package/src/binding/convertYjsEventToPatches.ts +92 -85
- package/src/binding/resolveYjsPath.ts +27 -0
- package/src/binding/yjsBindingContext.ts +42 -11
- package/src/index.ts +10 -9
- package/src/utils/getOrCreateYjsCollectionAtom.ts +18 -0
|
@@ -1,5 +1,26 @@
|
|
|
1
|
-
|
|
1
|
+
var __defProp = Object.defineProperty;
|
|
2
|
+
var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
|
|
3
|
+
var __publicField = (obj, key, value) => {
|
|
4
|
+
__defNormalProp(obj, typeof key !== "symbol" ? key + "" : key, value);
|
|
5
|
+
return value;
|
|
6
|
+
};
|
|
7
|
+
import { createAtom, reaction, observe, computed, action } from "mobx";
|
|
8
|
+
import { createContext, types, Model, tProp, frozen, getParentToChildPath, onSnapshot, model, modelSnapshotOutWithMetadata, applyPatches, onPatches, onGlobalPatches, fromSnapshot } from "mobx-keystone";
|
|
2
9
|
import * as Y from "yjs";
|
|
10
|
+
function __decorate(decorators, target, key, desc) {
|
|
11
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
12
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function")
|
|
13
|
+
r = Reflect.decorate(decorators, target, key, desc);
|
|
14
|
+
else
|
|
15
|
+
for (var i = decorators.length - 1; i >= 0; i--)
|
|
16
|
+
if (d = decorators[i])
|
|
17
|
+
r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
18
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
19
|
+
}
|
|
20
|
+
typeof SuppressedError === "function" ? SuppressedError : function(error, suppressed, message) {
|
|
21
|
+
var e = new Error(message);
|
|
22
|
+
return e.name = "SuppressedError", e.error = error, e.suppressed = suppressed, e;
|
|
23
|
+
};
|
|
3
24
|
class MobxKeystoneYjsError extends Error {
|
|
4
25
|
constructor(msg) {
|
|
5
26
|
super(msg);
|
|
@@ -9,6 +30,212 @@ class MobxKeystoneYjsError extends Error {
|
|
|
9
30
|
function failure(msg) {
|
|
10
31
|
return new MobxKeystoneYjsError(msg);
|
|
11
32
|
}
|
|
33
|
+
const yjsBindingContext = createContext(void 0);
|
|
34
|
+
const yjsCollectionAtoms = /* @__PURE__ */ new WeakMap();
|
|
35
|
+
const getOrCreateYjsCollectionAtom = (yjsCollection) => {
|
|
36
|
+
let atom = yjsCollectionAtoms.get(yjsCollection);
|
|
37
|
+
if (!atom) {
|
|
38
|
+
atom = createAtom(`yjsCollectionAtom`);
|
|
39
|
+
yjsCollectionAtoms.set(yjsCollection, atom);
|
|
40
|
+
}
|
|
41
|
+
return atom;
|
|
42
|
+
};
|
|
43
|
+
function resolveYjsPath(yjsObject, path) {
|
|
44
|
+
let currentYjsObject = yjsObject;
|
|
45
|
+
path.forEach((pathPart, i) => {
|
|
46
|
+
if (currentYjsObject instanceof Y.Map) {
|
|
47
|
+
getOrCreateYjsCollectionAtom(currentYjsObject).reportObserved();
|
|
48
|
+
const key = String(pathPart);
|
|
49
|
+
currentYjsObject = currentYjsObject.get(key);
|
|
50
|
+
} else if (currentYjsObject instanceof Y.Array) {
|
|
51
|
+
getOrCreateYjsCollectionAtom(currentYjsObject).reportObserved();
|
|
52
|
+
const key = Number(pathPart);
|
|
53
|
+
currentYjsObject = currentYjsObject.get(key);
|
|
54
|
+
} else {
|
|
55
|
+
throw failure(`Y.Map or Y.Array was expected at path ${JSON.stringify(path.slice(0, i))} in order to resolve path ${JSON.stringify(path)}, but got ${currentYjsObject} instead`);
|
|
56
|
+
}
|
|
57
|
+
});
|
|
58
|
+
return currentYjsObject;
|
|
59
|
+
}
|
|
60
|
+
const deltaListType = types.array(types.frozen(types.unchecked()));
|
|
61
|
+
const yjsTextModelId = "mobx-keystone-yjs/YjsTextModel";
|
|
62
|
+
let YjsTextModel = class YjsTextModel2 extends Model({
|
|
63
|
+
deltaList: tProp(deltaListType, () => [])
|
|
64
|
+
}) {
|
|
65
|
+
constructor() {
|
|
66
|
+
super(...arguments);
|
|
67
|
+
/**
|
|
68
|
+
* Atom that gets changed when the associated Y.js text changes.
|
|
69
|
+
*/
|
|
70
|
+
__publicField(this, "yjsTextChangedAtom", createAtom("yjsTextChangedAtom"));
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* Helper function to create a YjsTextModel instance with a simple text.
|
|
74
|
+
*/
|
|
75
|
+
static withText(text) {
|
|
76
|
+
return new DecoratedYjsTextModel({
|
|
77
|
+
deltaList: [
|
|
78
|
+
frozen([
|
|
79
|
+
{
|
|
80
|
+
insert: text
|
|
81
|
+
}
|
|
82
|
+
])
|
|
83
|
+
]
|
|
84
|
+
});
|
|
85
|
+
}
|
|
86
|
+
/**
|
|
87
|
+
* The Y.js path from the bound object to the YjsTextModel instance.
|
|
88
|
+
*/
|
|
89
|
+
get _yjsObjectPath() {
|
|
90
|
+
const ctx = yjsBindingContext.get(this);
|
|
91
|
+
if (!ctx || ctx.boundObject == null) {
|
|
92
|
+
throw failure("the YjsTextModel instance must be part of a bound object before it can be accessed");
|
|
93
|
+
}
|
|
94
|
+
const path = getParentToChildPath(ctx.boundObject, this);
|
|
95
|
+
if (!path) {
|
|
96
|
+
throw failure("a path from the bound object to the YjsTextModel instance is not available");
|
|
97
|
+
}
|
|
98
|
+
return path;
|
|
99
|
+
}
|
|
100
|
+
/**
|
|
101
|
+
* The Yjs.Text object present at this mobx-keystone node's path.
|
|
102
|
+
*/
|
|
103
|
+
get _yjsObjectAtPath() {
|
|
104
|
+
const path = this._yjsObjectPath;
|
|
105
|
+
const ctx = yjsBindingContext.get(this);
|
|
106
|
+
return resolveYjsPath(ctx.yjsObject, path);
|
|
107
|
+
}
|
|
108
|
+
/**
|
|
109
|
+
* The Yjs.Text object represented by this mobx-keystone node.
|
|
110
|
+
*/
|
|
111
|
+
get yjsText() {
|
|
112
|
+
const yjsObject = this._yjsObjectAtPath;
|
|
113
|
+
if (!(yjsObject instanceof Y.Text)) {
|
|
114
|
+
throw failure(`Y.Text was expected at path ${JSON.stringify(this._yjsObjectPath)}`);
|
|
115
|
+
}
|
|
116
|
+
return yjsObject;
|
|
117
|
+
}
|
|
118
|
+
/**
|
|
119
|
+
* The text value of the Yjs.Text object.
|
|
120
|
+
* Shortcut for `yjsText.toString()`, but computed.
|
|
121
|
+
*/
|
|
122
|
+
get text() {
|
|
123
|
+
this.yjsTextChangedAtom.reportObserved();
|
|
124
|
+
return this.yjsText.toString();
|
|
125
|
+
}
|
|
126
|
+
onInit() {
|
|
127
|
+
const shouldReplicateToYjs = (ctx) => {
|
|
128
|
+
return !!ctx && !!ctx.boundObject && !ctx.isApplyingYjsChangesToMobxKeystone;
|
|
129
|
+
};
|
|
130
|
+
let reapplyDeltasToYjsText = false;
|
|
131
|
+
const newDeltas = [];
|
|
132
|
+
let disposeObserveDeltaList;
|
|
133
|
+
const disposeReactionToDeltaListRefChange = reaction(() => this.$.deltaList, (deltaList) => {
|
|
134
|
+
disposeObserveDeltaList == null ? void 0 : disposeObserveDeltaList();
|
|
135
|
+
disposeObserveDeltaList = void 0;
|
|
136
|
+
if (deltaList) {
|
|
137
|
+
disposeObserveDeltaList = observe(this.$.deltaList, (change) => {
|
|
138
|
+
if (reapplyDeltasToYjsText) {
|
|
139
|
+
return;
|
|
140
|
+
}
|
|
141
|
+
if (!shouldReplicateToYjs(yjsBindingContext.get(this))) {
|
|
142
|
+
return;
|
|
143
|
+
}
|
|
144
|
+
if (change.type === "splice" && change.removedCount === 0 && change.addedCount > 0 && change.index === this.deltaList.length) {
|
|
145
|
+
newDeltas.push(...change.added);
|
|
146
|
+
} else {
|
|
147
|
+
reapplyDeltasToYjsText = true;
|
|
148
|
+
}
|
|
149
|
+
});
|
|
150
|
+
}
|
|
151
|
+
}, { fireImmediately: true });
|
|
152
|
+
const disposeOnSnapshot = onSnapshot(this, () => {
|
|
153
|
+
try {
|
|
154
|
+
if (reapplyDeltasToYjsText) {
|
|
155
|
+
const ctx = yjsBindingContext.get(this);
|
|
156
|
+
if (shouldReplicateToYjs(ctx)) {
|
|
157
|
+
const { yjsText } = this;
|
|
158
|
+
ctx.yjsDoc.transact(() => {
|
|
159
|
+
if (yjsText.length > 0) {
|
|
160
|
+
yjsText.delete(0, yjsText.length);
|
|
161
|
+
}
|
|
162
|
+
this.deltaList.forEach((frozenDeltas) => {
|
|
163
|
+
yjsText.applyDelta(frozenDeltas.data);
|
|
164
|
+
});
|
|
165
|
+
}, ctx.yjsOrigin);
|
|
166
|
+
}
|
|
167
|
+
} else if (newDeltas.length > 0) {
|
|
168
|
+
const ctx = yjsBindingContext.get(this);
|
|
169
|
+
if (shouldReplicateToYjs(ctx)) {
|
|
170
|
+
const { yjsText } = this;
|
|
171
|
+
ctx.yjsDoc.transact(() => {
|
|
172
|
+
newDeltas.forEach((frozenDeltas) => {
|
|
173
|
+
yjsText.applyDelta(frozenDeltas.data);
|
|
174
|
+
});
|
|
175
|
+
}, ctx.yjsOrigin);
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
} finally {
|
|
179
|
+
reapplyDeltasToYjsText = false;
|
|
180
|
+
newDeltas.length = 0;
|
|
181
|
+
}
|
|
182
|
+
});
|
|
183
|
+
const diposeYjsTextChangedAtom = hookYjsTextChangedAtom(() => this.yjsText, this.yjsTextChangedAtom);
|
|
184
|
+
return () => {
|
|
185
|
+
disposeOnSnapshot();
|
|
186
|
+
disposeReactionToDeltaListRefChange();
|
|
187
|
+
disposeObserveDeltaList == null ? void 0 : disposeObserveDeltaList();
|
|
188
|
+
disposeObserveDeltaList = void 0;
|
|
189
|
+
diposeYjsTextChangedAtom();
|
|
190
|
+
};
|
|
191
|
+
}
|
|
192
|
+
};
|
|
193
|
+
__decorate([
|
|
194
|
+
computed
|
|
195
|
+
], YjsTextModel.prototype, "_yjsObjectPath", null);
|
|
196
|
+
__decorate([
|
|
197
|
+
computed
|
|
198
|
+
], YjsTextModel.prototype, "_yjsObjectAtPath", null);
|
|
199
|
+
__decorate([
|
|
200
|
+
computed
|
|
201
|
+
], YjsTextModel.prototype, "yjsText", null);
|
|
202
|
+
__decorate([
|
|
203
|
+
computed
|
|
204
|
+
], YjsTextModel.prototype, "text", null);
|
|
205
|
+
YjsTextModel = __decorate([
|
|
206
|
+
model(yjsTextModelId)
|
|
207
|
+
], YjsTextModel);
|
|
208
|
+
const DecoratedYjsTextModel = YjsTextModel;
|
|
209
|
+
function hookYjsTextChangedAtom(getYjsText, textChangedAtom) {
|
|
210
|
+
let disposeObserveYjsText;
|
|
211
|
+
const observeFn = () => {
|
|
212
|
+
textChangedAtom.reportChanged();
|
|
213
|
+
};
|
|
214
|
+
const disposeReactionToYTextChange = reaction(() => {
|
|
215
|
+
try {
|
|
216
|
+
return getYjsText();
|
|
217
|
+
} catch {
|
|
218
|
+
return void 0;
|
|
219
|
+
}
|
|
220
|
+
}, (yjsText) => {
|
|
221
|
+
disposeObserveYjsText == null ? void 0 : disposeObserveYjsText();
|
|
222
|
+
disposeObserveYjsText = void 0;
|
|
223
|
+
if (yjsText) {
|
|
224
|
+
yjsText.observe(observeFn);
|
|
225
|
+
disposeObserveYjsText = () => {
|
|
226
|
+
yjsText.unobserve(observeFn);
|
|
227
|
+
};
|
|
228
|
+
}
|
|
229
|
+
textChangedAtom.reportChanged();
|
|
230
|
+
}, {
|
|
231
|
+
fireImmediately: true
|
|
232
|
+
});
|
|
233
|
+
return () => {
|
|
234
|
+
disposeReactionToYTextChange();
|
|
235
|
+
disposeObserveYjsText == null ? void 0 : disposeObserveYjsText();
|
|
236
|
+
disposeObserveYjsText = void 0;
|
|
237
|
+
};
|
|
238
|
+
}
|
|
12
239
|
function isJsonPrimitive(v) {
|
|
13
240
|
const t = typeof v;
|
|
14
241
|
return t === "string" || t === "number" || t === "boolean" || v === null;
|
|
@@ -25,20 +252,28 @@ function convertJsonToYjsData(v) {
|
|
|
25
252
|
}
|
|
26
253
|
if (isJsonArray(v)) {
|
|
27
254
|
const arr = new Y.Array();
|
|
28
|
-
|
|
255
|
+
applyJsonArrayToYArray(arr, v);
|
|
29
256
|
return arr;
|
|
30
257
|
}
|
|
31
258
|
if (isJsonObject(v)) {
|
|
32
259
|
if (v.$frozen === true) {
|
|
33
260
|
return v;
|
|
34
261
|
}
|
|
262
|
+
if (v.$modelType === yjsTextModelId) {
|
|
263
|
+
const text = new Y.Text();
|
|
264
|
+
const yjsTextModel = v;
|
|
265
|
+
yjsTextModel.deltaList.forEach((frozenDeltas) => {
|
|
266
|
+
text.applyDelta(frozenDeltas.data);
|
|
267
|
+
});
|
|
268
|
+
return text;
|
|
269
|
+
}
|
|
35
270
|
const map = new Y.Map();
|
|
36
271
|
applyJsonObjectToYMap(map, v);
|
|
37
272
|
return map;
|
|
38
273
|
}
|
|
39
274
|
throw new Error(`unsupported value type: ${v}`);
|
|
40
275
|
}
|
|
41
|
-
function
|
|
276
|
+
function applyJsonArrayToYArray(dest, source) {
|
|
42
277
|
dest.push(source.map(convertJsonToYjsData));
|
|
43
278
|
}
|
|
44
279
|
function applyJsonObjectToYMap(dest, source) {
|
|
@@ -61,7 +296,9 @@ function applyMobxKeystonePatchToYjsObject(patch, yjs) {
|
|
|
61
296
|
throw failure(`invalid patch path, key "${key}" not found in Yjs array - patch: ${JSON.stringify(patch)}`);
|
|
62
297
|
}
|
|
63
298
|
applyMobxKeystonePatchToYjsObject({ ...patch, path: rest }, child);
|
|
64
|
-
} else
|
|
299
|
+
} else if (yjs instanceof Y.Text)
|
|
300
|
+
;
|
|
301
|
+
else {
|
|
65
302
|
throw failure(`invalid patch path, key "${key}" not found in unknown Yjs object - patch: ${JSON.stringify(patch)}`);
|
|
66
303
|
}
|
|
67
304
|
} else if (patch.path.length === 1) {
|
|
@@ -111,13 +348,34 @@ function applyMobxKeystonePatchToYjsObject(patch, yjs) {
|
|
|
111
348
|
throw failure(`invalid patch operation for array`);
|
|
112
349
|
}
|
|
113
350
|
}
|
|
114
|
-
} else
|
|
351
|
+
} else if (yjs instanceof Y.Text)
|
|
352
|
+
;
|
|
353
|
+
else {
|
|
115
354
|
throw failure(`invalid patch path, the Yjs object is of an unkown type, so key "${patch.path[0]}" cannot be found in it`);
|
|
116
355
|
}
|
|
117
356
|
} else {
|
|
118
357
|
throw failure(`invalid patch path, it cannot be empty`);
|
|
119
358
|
}
|
|
120
359
|
}
|
|
360
|
+
function convertYjsDataToJson(yjsData) {
|
|
361
|
+
if (yjsData instanceof Y.Array) {
|
|
362
|
+
return yjsData.map((v) => convertYjsDataToJson(v));
|
|
363
|
+
}
|
|
364
|
+
if (yjsData instanceof Y.Map) {
|
|
365
|
+
const obj = {};
|
|
366
|
+
yjsData.forEach((v, k) => {
|
|
367
|
+
obj[k] = convertYjsDataToJson(v);
|
|
368
|
+
});
|
|
369
|
+
return obj;
|
|
370
|
+
}
|
|
371
|
+
if (yjsData instanceof Y.Text) {
|
|
372
|
+
const deltas = yjsData.toDelta();
|
|
373
|
+
return modelSnapshotOutWithMetadata(YjsTextModel, {
|
|
374
|
+
deltaList: deltas.length > 0 ? [{ $frozen: true, data: deltas }] : []
|
|
375
|
+
});
|
|
376
|
+
}
|
|
377
|
+
return yjsData;
|
|
378
|
+
}
|
|
121
379
|
function convertYjsEventToPatches(event) {
|
|
122
380
|
const patches = [];
|
|
123
381
|
if (event instanceof Y.YMapEvent) {
|
|
@@ -177,6 +435,18 @@ function convertYjsEventToPatches(event) {
|
|
|
177
435
|
});
|
|
178
436
|
}
|
|
179
437
|
});
|
|
438
|
+
} else if (event instanceof Y.YTextEvent) {
|
|
439
|
+
const path = [
|
|
440
|
+
...event.path,
|
|
441
|
+
"deltaList",
|
|
442
|
+
-1
|
|
443
|
+
/* last item */
|
|
444
|
+
];
|
|
445
|
+
patches.push({
|
|
446
|
+
op: "add",
|
|
447
|
+
path,
|
|
448
|
+
value: { $frozen: true, data: event.delta }
|
|
449
|
+
});
|
|
180
450
|
}
|
|
181
451
|
return patches;
|
|
182
452
|
}
|
|
@@ -187,16 +457,21 @@ function toPlainValue(v) {
|
|
|
187
457
|
return v;
|
|
188
458
|
}
|
|
189
459
|
}
|
|
190
|
-
const yjsBindingContext = createContext(void 0);
|
|
191
460
|
function bindYjsToMobxKeystone({ yjsDoc, yjsObject, mobxKeystoneType }) {
|
|
192
461
|
const yjsOrigin = Symbol("bindYjsToMobxKeystoneTransactionOrigin");
|
|
462
|
+
let applyingYjsChangesToMobxKeystone = 0;
|
|
193
463
|
const bindingContext = {
|
|
194
464
|
yjsDoc,
|
|
195
465
|
yjsObject,
|
|
196
466
|
mobxKeystoneType,
|
|
197
|
-
yjsOrigin
|
|
467
|
+
yjsOrigin,
|
|
468
|
+
boundObject: void 0,
|
|
469
|
+
// not yet created
|
|
470
|
+
get isApplyingYjsChangesToMobxKeystone() {
|
|
471
|
+
return applyingYjsChangesToMobxKeystone > 0;
|
|
472
|
+
}
|
|
198
473
|
};
|
|
199
|
-
const yjsJson = yjsObject
|
|
474
|
+
const yjsJson = convertYjsDataToJson(yjsObject);
|
|
200
475
|
const initializationGlobalPatches = [];
|
|
201
476
|
const createBoundObject = () => {
|
|
202
477
|
const disposeOnGlobalPatches = onGlobalPatches((target, patches) => {
|
|
@@ -204,47 +479,51 @@ function bindYjsToMobxKeystone({ yjsDoc, yjsObject, mobxKeystoneType }) {
|
|
|
204
479
|
});
|
|
205
480
|
try {
|
|
206
481
|
const boundObject2 = yjsBindingContext.apply(() => fromSnapshot(mobxKeystoneType, yjsJson), bindingContext);
|
|
207
|
-
yjsBindingContext.set(boundObject2, bindingContext);
|
|
482
|
+
yjsBindingContext.set(boundObject2, { ...bindingContext, boundObject: boundObject2 });
|
|
208
483
|
return boundObject2;
|
|
209
484
|
} finally {
|
|
210
485
|
disposeOnGlobalPatches();
|
|
211
486
|
}
|
|
212
487
|
};
|
|
213
488
|
const boundObject = createBoundObject();
|
|
214
|
-
|
|
215
|
-
const observeDeepCb = (events) => {
|
|
489
|
+
const observeDeepCb = action((events) => {
|
|
216
490
|
const patches = [];
|
|
217
491
|
events.forEach((event) => {
|
|
218
492
|
if (event.transaction.origin !== yjsOrigin) {
|
|
219
493
|
patches.push(...convertYjsEventToPatches(event));
|
|
220
494
|
}
|
|
495
|
+
if (event.target instanceof Y.Map || event.target instanceof Y.Array) {
|
|
496
|
+
getOrCreateYjsCollectionAtom(event.target).reportChanged();
|
|
497
|
+
}
|
|
221
498
|
});
|
|
222
499
|
if (patches.length > 0) {
|
|
223
|
-
|
|
500
|
+
applyingYjsChangesToMobxKeystone++;
|
|
224
501
|
try {
|
|
225
502
|
applyPatches(boundObject, patches);
|
|
226
503
|
} finally {
|
|
227
|
-
|
|
504
|
+
applyingYjsChangesToMobxKeystone--;
|
|
228
505
|
}
|
|
229
506
|
}
|
|
230
|
-
};
|
|
507
|
+
});
|
|
231
508
|
yjsObject.observeDeep(observeDeepCb);
|
|
232
|
-
let
|
|
509
|
+
let pendingArrayOfArrayOfPatches = [];
|
|
233
510
|
const disposeOnPatches = onPatches(boundObject, (patches) => {
|
|
234
|
-
if (
|
|
511
|
+
if (applyingYjsChangesToMobxKeystone > 0) {
|
|
235
512
|
return;
|
|
236
513
|
}
|
|
237
|
-
|
|
514
|
+
pendingArrayOfArrayOfPatches.push(patches);
|
|
238
515
|
});
|
|
239
516
|
const disposeOnSnapshot = onSnapshot(boundObject, () => {
|
|
240
|
-
if (
|
|
517
|
+
if (pendingArrayOfArrayOfPatches.length === 0) {
|
|
241
518
|
return;
|
|
242
519
|
}
|
|
243
|
-
const
|
|
244
|
-
|
|
520
|
+
const arrayOfArrayOfPatches = pendingArrayOfArrayOfPatches;
|
|
521
|
+
pendingArrayOfArrayOfPatches = [];
|
|
245
522
|
yjsDoc.transact(() => {
|
|
246
|
-
|
|
247
|
-
|
|
523
|
+
arrayOfArrayOfPatches.forEach((arrayOfPatches) => {
|
|
524
|
+
arrayOfPatches.forEach((patch) => {
|
|
525
|
+
applyMobxKeystonePatchToYjsObject(patch, yjsObject);
|
|
526
|
+
});
|
|
248
527
|
});
|
|
249
528
|
}, yjsOrigin);
|
|
250
529
|
});
|
|
@@ -280,10 +559,12 @@ function bindYjsToMobxKeystone({ yjsDoc, yjsObject, mobxKeystoneType }) {
|
|
|
280
559
|
}
|
|
281
560
|
export {
|
|
282
561
|
MobxKeystoneYjsError,
|
|
283
|
-
|
|
562
|
+
YjsTextModel,
|
|
563
|
+
applyJsonArrayToYArray,
|
|
284
564
|
applyJsonObjectToYMap,
|
|
285
565
|
bindYjsToMobxKeystone,
|
|
286
566
|
convertJsonToYjsData,
|
|
287
|
-
yjsBindingContext
|
|
567
|
+
yjsBindingContext,
|
|
568
|
+
yjsTextModelId
|
|
288
569
|
};
|
|
289
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibW9ieC1rZXlzdG9uZS15anMuZXNtLm1qcyIsInNvdXJjZXMiOlsiLi4vc3JjL3V0aWxzL2Vycm9yLnRzIiwiLi4vc3JjL2JpbmRpbmcvY29udmVydEpzb25Ub1lqc0RhdGEudHMiLCIuLi9zcmMvYmluZGluZy9hcHBseU1vYnhLZXlzdG9uZVBhdGNoVG9ZanNPYmplY3QudHMiLCIuLi9zcmMvYmluZGluZy9jb252ZXJ0WWpzRXZlbnRUb1BhdGNoZXMudHMiLCIuLi9zcmMvYmluZGluZy95anNCaW5kaW5nQ29udGV4dC50cyIsIi4uL3NyYy9iaW5kaW5nL2JpbmRZanNUb01vYnhLZXlzdG9uZS50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKipcclxuICogQSBtb2J4LWtleXN0b25lLXlqcyBlcnJvci5cclxuICovXHJcbmV4cG9ydCBjbGFzcyBNb2J4S2V5c3RvbmVZanNFcnJvciBleHRlbmRzIEVycm9yIHtcclxuICBjb25zdHJ1Y3Rvcihtc2c6IHN0cmluZykge1xyXG4gICAgc3VwZXIobXNnKVxyXG5cclxuICAgIC8vIFNldCB0aGUgcHJvdG90eXBlIGV4cGxpY2l0bHkuXHJcbiAgICBPYmplY3Quc2V0UHJvdG90eXBlT2YodGhpcywgTW9ieEtleXN0b25lWWpzRXJyb3IucHJvdG90eXBlKVxyXG4gIH1cclxufVxyXG5cclxuLyoqXHJcbiAqIEBpbnRlcm5hbFxyXG4gKi9cclxuZXhwb3J0IGZ1bmN0aW9uIGZhaWx1cmUobXNnOiBzdHJpbmcpIHtcclxuICByZXR1cm4gbmV3IE1vYnhLZXlzdG9uZVlqc0Vycm9yKG1zZylcclxufVxyXG4iLCJpbXBvcnQgKiBhcyBZIGZyb20gXCJ5anNcIlxuaW1wb3J0IHsgSnNvblZhbHVlLCBKc29uQXJyYXksIEpzb25PYmplY3QsIEpzb25QcmltaXRpdmUgfSBmcm9tIFwiLi4vanNvblR5cGVzXCJcblxuZnVuY3Rpb24gaXNKc29uUHJpbWl0aXZlKHY6IEpzb25WYWx1ZSk6IHYgaXMgSnNvblByaW1pdGl2ZSB7XG4gIGNvbnN0IHQgPSB0eXBlb2YgdlxuICByZXR1cm4gdCA9PT0gXCJzdHJpbmdcIiB8fCB0ID09PSBcIm51bWJlclwiIHx8IHQgPT09IFwiYm9vbGVhblwiIHx8IHYgPT09IG51bGxcbn1cblxuZnVuY3Rpb24gaXNKc29uQXJyYXkodjogSnNvblZhbHVlKTogdiBpcyBKc29uQXJyYXkge1xuICByZXR1cm4gQXJyYXkuaXNBcnJheSh2KVxufVxuXG5mdW5jdGlvbiBpc0pzb25PYmplY3QodjogSnNvblZhbHVlKTogdiBpcyBKc29uT2JqZWN0IHtcbiAgcmV0dXJuICFpc0pzb25BcnJheSh2KSAmJiB0eXBlb2YgdiA9PT0gXCJvYmplY3RcIlxufVxuXG5leHBvcnQgZnVuY3Rpb24gY29udmVydEpzb25Ub1lqc0RhdGEodjogSnNvblZhbHVlKSB7XG4gIGlmICh2ID09PSB1bmRlZmluZWQgfHwgaXNKc29uUHJpbWl0aXZlKHYpKSB7XG4gICAgcmV0dXJuIHZcbiAgfVxuXG4gIGlmIChpc0pzb25BcnJheSh2KSkge1xuICAgIGNvbnN0IGFyciA9IG5ldyBZLkFycmF5KClcbiAgICBhcHBseUpzb25BcnJheVlBcnJheShhcnIsIHYpXG4gICAgcmV0dXJuIGFyclxuICB9XG5cbiAgaWYgKGlzSnNvbk9iamVjdCh2KSkge1xuICAgIGlmICh2LiRmcm96ZW4gPT09IHRydWUpIHtcbiAgICAgIC8vIGZyb3plbiB2YWx1ZSwgc2F2ZSBhcyBpbW11dGFibGUgb2JqZWN0XG4gICAgICByZXR1cm4gdlxuICAgIH1cblxuICAgIGNvbnN0IG1hcCA9IG5ldyBZLk1hcCgpXG4gICAgYXBwbHlKc29uT2JqZWN0VG9ZTWFwKG1hcCwgdilcbiAgICByZXR1cm4gbWFwXG4gIH1cblxuICB0aHJvdyBuZXcgRXJyb3IoYHVuc3VwcG9ydGVkIHZhbHVlIHR5cGU6ICR7dn1gKVxufVxuXG5leHBvcnQgZnVuY3Rpb24gYXBwbHlKc29uQXJyYXlZQXJyYXkoZGVzdDogWS5BcnJheTx1bmtub3duPiwgc291cmNlOiBKc29uQXJyYXkpIHtcbiAgZGVzdC5wdXNoKHNvdXJjZS5tYXAoY29udmVydEpzb25Ub1lqc0RhdGEpKVxufVxuXG5leHBvcnQgZnVuY3Rpb24gYXBwbHlKc29uT2JqZWN0VG9ZTWFwKGRlc3Q6IFkuTWFwPHVua25vd24+LCBzb3VyY2U6IEpzb25PYmplY3QpIHtcbiAgT2JqZWN0LmVudHJpZXMoc291cmNlKS5mb3JFYWNoKChbaywgdl0pID0+IHtcbiAgICBkZXN0LnNldChrLCBjb252ZXJ0SnNvblRvWWpzRGF0YSh2KSlcbiAgfSlcbn1cbiIsImltcG9ydCB7IFBhdGNoIH0gZnJvbSBcIm1vYngta2V5c3RvbmVcIlxuaW1wb3J0ICogYXMgWSBmcm9tIFwieWpzXCJcbmltcG9ydCB7IGZhaWx1cmUgfSBmcm9tIFwiLi4vdXRpbHMvZXJyb3JcIlxuaW1wb3J0IHsgY29udmVydEpzb25Ub1lqc0RhdGEgfSBmcm9tIFwiLi9jb252ZXJ0SnNvblRvWWpzRGF0YVwiXG5cbmV4cG9ydCBmdW5jdGlvbiBhcHBseU1vYnhLZXlzdG9uZVBhdGNoVG9ZanNPYmplY3QocGF0Y2g6IFBhdGNoLCB5anM6IHVua25vd24pOiB2b2lkIHtcbiAgaWYgKHBhdGNoLnBhdGgubGVuZ3RoID4gMSkge1xuICAgIGNvbnN0IFtrZXksIC4uLnJlc3RdID0gcGF0Y2gucGF0aFxuXG4gICAgaWYgKHlqcyBpbnN0YW5jZW9mIFkuTWFwKSB7XG4gICAgICBjb25zdCBjaGlsZCA9IHlqcy5nZXQoU3RyaW5nKGtleSkpXG4gICAgICBpZiAoY2hpbGQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICB0aHJvdyBmYWlsdXJlKFxuICAgICAgICAgIGBpbnZhbGlkIHBhdGNoIHBhdGgsIGtleSBcIiR7a2V5fVwiIG5vdCBmb3VuZCBpbiBZanMgbWFwIC0gcGF0Y2g6ICR7SlNPTi5zdHJpbmdpZnkocGF0Y2gpfWBcbiAgICAgICAgKVxuICAgICAgfVxuICAgICAgYXBwbHlNb2J4S2V5c3RvbmVQYXRjaFRvWWpzT2JqZWN0KHsgLi4ucGF0Y2gsIHBhdGg6IHJlc3QgfSwgY2hpbGQpXG4gICAgfSBlbHNlIGlmICh5anMgaW5zdGFuY2VvZiBZLkFycmF5KSB7XG4gICAgICBjb25zdCBjaGlsZCA9IHlqcy5nZXQoTnVtYmVyKGtleSkpXG4gICAgICBpZiAoY2hpbGQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICB0aHJvdyBmYWlsdXJlKFxuICAgICAgICAgIGBpbnZhbGlkIHBhdGNoIHBhdGgsIGtleSBcIiR7a2V5fVwiIG5vdCBmb3VuZCBpbiBZanMgYXJyYXkgLSBwYXRjaDogJHtKU09OLnN0cmluZ2lmeShcbiAgICAgICAgICAgIHBhdGNoXG4gICAgICAgICAgKX1gXG4gICAgICAgIClcbiAgICAgIH1cbiAgICAgIGFwcGx5TW9ieEtleXN0b25lUGF0Y2hUb1lqc09iamVjdCh7IC4uLnBhdGNoLCBwYXRoOiByZXN0IH0sIGNoaWxkKVxuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyBmYWlsdXJlKFxuICAgICAgICBgaW52YWxpZCBwYXRjaCBwYXRoLCBrZXkgXCIke2tleX1cIiBub3QgZm91bmQgaW4gdW5rbm93biBZanMgb2JqZWN0IC0gcGF0Y2g6ICR7SlNPTi5zdHJpbmdpZnkoXG4gICAgICAgICAgcGF0Y2hcbiAgICAgICAgKX1gXG4gICAgICApXG4gICAgfVxuICB9IGVsc2UgaWYgKHBhdGNoLnBhdGgubGVuZ3RoID09PSAxKSB7XG4gICAgaWYgKHlqcyBpbnN0YW5jZW9mIFkuTWFwKSB7XG4gICAgICBjb25zdCBrZXkgPSBTdHJpbmcocGF0Y2gucGF0aFswXSlcblxuICAgICAgc3dpdGNoIChwYXRjaC5vcCkge1xuICAgICAgICBjYXNlIFwiYWRkXCI6XG4gICAgICAgIGNhc2UgXCJyZXBsYWNlXCI6IHtcbiAgICAgICAgICB5anMuc2V0KGtleSwgY29udmVydEpzb25Ub1lqc0RhdGEocGF0Y2gudmFsdWUpKVxuICAgICAgICAgIGJyZWFrXG4gICAgICAgIH1cbiAgICAgICAgY2FzZSBcInJlbW92ZVwiOiB7XG4gICAgICAgICAgeWpzLmRlbGV0ZShrZXkpXG4gICAgICAgICAgYnJlYWtcbiAgICAgICAgfVxuICAgICAgICBkZWZhdWx0OiB7XG4gICAgICAgICAgdGhyb3cgZmFpbHVyZShgaW52YWxpZCBwYXRjaCBvcGVyYXRpb24gZm9yIG1hcGApXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHlqcyBpbnN0YW5jZW9mIFkuQXJyYXkpIHtcbiAgICAgIGNvbnN0IGtleSA9IHBhdGNoLnBhdGhbMF1cblxuICAgICAgc3dpdGNoIChwYXRjaC5vcCkge1xuICAgICAgICBjYXNlIFwicmVwbGFjZVwiOiB7XG4gICAgICAgICAgaWYgKGtleSA9PT0gXCJsZW5ndGhcIikge1xuICAgICAgICAgICAgaWYgKHlqcy5sZW5ndGggPiBwYXRjaC52YWx1ZSkge1xuICAgICAgICAgICAgICBjb25zdCB0b0RlbGV0ZSA9IHlqcy5sZW5ndGggLSBwYXRjaC52YWx1ZVxuICAgICAgICAgICAgICB5anMuZGVsZXRlKHBhdGNoLnZhbHVlLCB0b0RlbGV0ZSlcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoeWpzLmxlbmd0aCA8IHBhdGNoLnZhbHVlKSB7XG4gICAgICAgICAgICAgIGNvbnN0IHRvSW5zZXJ0ID0gcGF0Y2gudmFsdWUgLSB5anMubGVuZ3RoXG4gICAgICAgICAgICAgIHlqcy5pbnNlcnQoeWpzLmxlbmd0aCwgQXJyYXkodG9JbnNlcnQpLmZpbGwodW5kZWZpbmVkKSlcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgeWpzLmRlbGV0ZShOdW1iZXIoa2V5KSlcbiAgICAgICAgICAgIHlqcy5pbnNlcnQoTnVtYmVyKGtleSksIFtjb252ZXJ0SnNvblRvWWpzRGF0YShwYXRjaC52YWx1ZSldKVxuICAgICAgICAgIH1cbiAgICAgICAgICBicmVha1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgXCJhZGRcIjoge1xuICAgICAgICAgIHlqcy5pbnNlcnQoTnVtYmVyKGtleSksIFtjb252ZXJ0SnNvblRvWWpzRGF0YShwYXRjaC52YWx1ZSldKVxuICAgICAgICAgIGJyZWFrXG4gICAgICAgIH1cbiAgICAgICAgY2FzZSBcInJlbW92ZVwiOiB7XG4gICAgICAgICAgeWpzLmRlbGV0ZShOdW1iZXIoa2V5KSlcbiAgICAgICAgICBicmVha1xuICAgICAgICB9XG4gICAgICAgIGRlZmF1bHQ6IHtcbiAgICAgICAgICB0aHJvdyBmYWlsdXJlKGBpbnZhbGlkIHBhdGNoIG9wZXJhdGlvbiBmb3IgYXJyYXlgKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IGZhaWx1cmUoXG4gICAgICAgIGBpbnZhbGlkIHBhdGNoIHBhdGgsIHRoZSBZanMgb2JqZWN0IGlzIG9mIGFuIHVua293biB0eXBlLCBzbyBrZXkgXCIke3BhdGNoLnBhdGhbMF19XCIgY2Fubm90IGJlIGZvdW5kIGluIGl0YFxuICAgICAgKVxuICAgIH1cbiAgfSBlbHNlIHtcbiAgICB0aHJvdyBmYWlsdXJlKGBpbnZhbGlkIHBhdGNoIHBhdGgsIGl0IGNhbm5vdCBiZSBlbXB0eWApXG4gIH1cbn1cbiIsImltcG9ydCB7IFBhdGNoIH0gZnJvbSBcIm1vYngta2V5c3RvbmVcIlxuaW1wb3J0ICogYXMgWSBmcm9tIFwieWpzXCJcbmltcG9ydCB7IEpzb25BcnJheSwgSnNvbk9iamVjdCwgSnNvblZhbHVlIH0gZnJvbSBcIi4uL2pzb25UeXBlc1wiXG5pbXBvcnQgeyBmYWlsdXJlIH0gZnJvbSBcIi4uL3V0aWxzL2Vycm9yXCJcblxuZXhwb3J0IGZ1bmN0aW9uIGNvbnZlcnRZanNFdmVudFRvUGF0Y2hlcyhldmVudDogWS5ZRXZlbnQ8YW55Pik6IFBhdGNoW10ge1xuICBjb25zdCBwYXRjaGVzOiBQYXRjaFtdID0gW11cblxuICBpZiAoZXZlbnQgaW5zdGFuY2VvZiBZLllNYXBFdmVudCkge1xuICAgIGNvbnN0IHNvdXJjZSA9IGV2ZW50LnRhcmdldCBhcyBZLk1hcDxhbnk+XG5cbiAgICBldmVudC5jaGFuZ2VzLmtleXMuZm9yRWFjaCgoY2hhbmdlLCBrZXkpID0+IHtcbiAgICAgIGNvbnN0IHBhdGggPSBbLi4uZXZlbnQucGF0aCwga2V5XVxuXG4gICAgICBzd2l0Y2ggKGNoYW5nZS5hY3Rpb24pIHtcbiAgICAgICAgY2FzZSBcImFkZFwiOlxuICAgICAgICAgIHBhdGNoZXMucHVzaCh7XG4gICAgICAgICAgICBvcDogXCJhZGRcIixcbiAgICAgICAgICAgIHBhdGgsXG4gICAgICAgICAgICB2YWx1ZTogdG9QbGFpblZhbHVlKHNvdXJjZS5nZXQoa2V5KSksXG4gICAgICAgICAgfSlcbiAgICAgICAgICBicmVha1xuXG4gICAgICAgIGNhc2UgXCJ1cGRhdGVcIjpcbiAgICAgICAgICBwYXRjaGVzLnB1c2goe1xuICAgICAgICAgICAgb3A6IFwicmVwbGFjZVwiLFxuICAgICAgICAgICAgcGF0aCxcbiAgICAgICAgICAgIHZhbHVlOiB0b1BsYWluVmFsdWUoc291cmNlLmdldChrZXkpKSxcbiAgICAgICAgICB9KVxuICAgICAgICAgIGJyZWFrXG5cbiAgICAgICAgY2FzZSBcImRlbGV0ZVwiOlxuICAgICAgICAgIHBhdGNoZXMucHVzaCh7XG4gICAgICAgICAgICBvcDogXCJyZW1vdmVcIixcbiAgICAgICAgICAgIHBhdGgsXG4gICAgICAgICAgfSlcbiAgICAgICAgICBicmVha1xuXG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgdGhyb3cgZmFpbHVyZShgdW5zdXBwb3J0ZWQgWWpzIG1hcCBldmVudCBhY3Rpb246ICR7Y2hhbmdlLmFjdGlvbn1gKVxuICAgICAgfVxuICAgIH0pXG4gIH0gZWxzZSBpZiAoZXZlbnQgaW5zdGFuY2VvZiBZLllBcnJheUV2ZW50KSB7XG4gICAgbGV0IHJldGFpbiA9IDBcbiAgICBldmVudC5jaGFuZ2VzLmRlbHRhLmZvckVhY2goKGNoYW5nZSkgPT4ge1xuICAgICAgaWYgKGNoYW5nZS5yZXRhaW4pIHtcbiAgICAgICAgcmV0YWluICs9IGNoYW5nZS5yZXRhaW5cbiAgICAgIH1cblxuICAgICAgaWYgKGNoYW5nZS5kZWxldGUpIHtcbiAgICAgICAgLy8gcmVtb3ZlIFggaXRlbXMgYXQgcmV0YWluIHBvc2l0aW9uXG4gICAgICAgIGNvbnN0IHBhdGggPSBbLi4uZXZlbnQucGF0aCwgcmV0YWluXVxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNoYW5nZS5kZWxldGU7IGkrKykge1xuICAgICAgICAgIHBhdGNoZXMucHVzaCh7XG4gICAgICAgICAgICBvcDogXCJyZW1vdmVcIixcbiAgICAgICAgICAgIHBhdGgsXG4gICAgICAgICAgfSlcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAoY2hhbmdlLmluc2VydCkge1xuICAgICAgICBjb25zdCBuZXdWYWx1ZXMgPSBBcnJheS5pc0FycmF5KGNoYW5nZS5pbnNlcnQpID8gY2hhbmdlLmluc2VydCA6IFtjaGFuZ2UuaW5zZXJ0XVxuICAgICAgICBuZXdWYWx1ZXMuZm9yRWFjaCgodikgPT4ge1xuICAgICAgICAgIGNvbnN0IHBhdGggPSBbLi4uZXZlbnQucGF0aCwgcmV0YWluXVxuICAgICAgICAgIHBhdGNoZXMucHVzaCh7XG4gICAgICAgICAgICBvcDogXCJhZGRcIixcbiAgICAgICAgICAgIHBhdGgsXG4gICAgICAgICAgICB2YWx1ZTogdG9QbGFpblZhbHVlKHYpLFxuICAgICAgICAgIH0pXG4gICAgICAgICAgcmV0YWluKytcbiAgICAgICAgfSlcbiAgICAgIH1cbiAgICB9KVxuICB9XG5cbiAgcmV0dXJuIHBhdGNoZXNcbn1cblxuZnVuY3Rpb24gdG9QbGFpblZhbHVlKHY6IFkuTWFwPGFueT4gfCBZLkFycmF5PGFueT4gfCBKc29uVmFsdWUpIHtcbiAgaWYgKHYgaW5zdGFuY2VvZiBZLk1hcCB8fCB2IGluc3RhbmNlb2YgWS5BcnJheSkge1xuICAgIHJldHVybiB2LnRvSlNPTigpIGFzIEpzb25PYmplY3QgfCBKc29uQXJyYXlcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gdlxuICB9XG59XG4iLCJpbXBvcnQgeyBBbnlUeXBlLCBjcmVhdGVDb250ZXh0IH0gZnJvbSBcIm1vYngta2V5c3RvbmVcIlxuaW1wb3J0ICogYXMgWSBmcm9tIFwieWpzXCJcblxuZXhwb3J0IGludGVyZmFjZSBZanNCaW5kaW5nQ29udGV4dCB7XG4gIHlqc0RvYzogWS5Eb2NcbiAgeWpzT2JqZWN0OiBZLk1hcDx1bmtub3duPiB8IFkuQXJyYXk8dW5rbm93bj5cbiAgbW9ieEtleXN0b25lVHlwZTogQW55VHlwZVxuICB5anNPcmlnaW46IHN5bWJvbFxufVxuXG5leHBvcnQgY29uc3QgeWpzQmluZGluZ0NvbnRleHQgPSBjcmVhdGVDb250ZXh0PFlqc0JpbmRpbmdDb250ZXh0IHwgdW5kZWZpbmVkPih1bmRlZmluZWQpXG4iLCJpbXBvcnQge1xuICBBbnlEYXRhTW9kZWwsXG4gIEFueU1vZGVsLFxuICBBbnlTdGFuZGFyZFR5cGUsXG4gIE1vZGVsQ2xhc3MsXG4gIFBhdGNoLFxuICBUeXBlVG9EYXRhLFxuICBhcHBseVBhdGNoZXMsXG4gIGZyb21TbmFwc2hvdCxcbiAgZ2V0UGFyZW50VG9DaGlsZFBhdGgsXG4gIG9uR2xvYmFsUGF0Y2hlcyxcbiAgb25QYXRjaGVzLFxuICBvblNuYXBzaG90LFxufSBmcm9tIFwibW9ieC1rZXlzdG9uZVwiXG5pbXBvcnQgKiBhcyBZIGZyb20gXCJ5anNcIlxuaW1wb3J0IHsgYXBwbHlNb2J4S2V5c3RvbmVQYXRjaFRvWWpzT2JqZWN0IH0gZnJvbSBcIi4vYXBwbHlNb2J4S2V5c3RvbmVQYXRjaFRvWWpzT2JqZWN0XCJcbmltcG9ydCB7IGNvbnZlcnRZanNFdmVudFRvUGF0Y2hlcyB9IGZyb20gXCIuL2NvbnZlcnRZanNFdmVudFRvUGF0Y2hlc1wiXG5pbXBvcnQgeyBZanNCaW5kaW5nQ29udGV4dCwgeWpzQmluZGluZ0NvbnRleHQgfSBmcm9tIFwiLi95anNCaW5kaW5nQ29udGV4dFwiXG5cbmV4cG9ydCBmdW5jdGlvbiBiaW5kWWpzVG9Nb2J4S2V5c3RvbmU8XG4gIFRUeXBlIGV4dGVuZHMgQW55U3RhbmRhcmRUeXBlIHwgTW9kZWxDbGFzczxBbnlNb2RlbD4gfCBNb2RlbENsYXNzPEFueURhdGFNb2RlbD4sXG4+KHtcbiAgeWpzRG9jLFxuICB5anNPYmplY3QsXG4gIG1vYnhLZXlzdG9uZVR5cGUsXG59OiB7XG4gIHlqc0RvYzogWS5Eb2NcbiAgeWpzT2JqZWN0OiBZLk1hcDx1bmtub3duPiB8IFkuQXJyYXk8dW5rbm93bj5cbiAgbW9ieEtleXN0b25lVHlwZTogVFR5cGVcbn0pOiB7XG4gIGJvdW5kT2JqZWN0OiBUeXBlVG9EYXRhPFRUeXBlPlxuICBkaXNwb3NlKCk6IHZvaWRcbiAgeWpzT3JpZ2luOiBzeW1ib2xcbn0ge1xuICBjb25zdCB5anNPcmlnaW4gPSBTeW1ib2woXCJiaW5kWWpzVG9Nb2J4S2V5c3RvbmVUcmFuc2FjdGlvbk9yaWdpblwiKVxuXG4gIGNvbnN0IGJpbmRpbmdDb250ZXh0OiBZanNCaW5kaW5nQ29udGV4dCA9IHtcbiAgICB5anNEb2MsXG4gICAgeWpzT2JqZWN0LFxuICAgIG1vYnhLZXlzdG9uZVR5cGUsXG4gICAgeWpzT3JpZ2luLFxuICB9XG5cbiAgY29uc3QgeWpzSnNvbiA9IHlqc09iamVjdC50b0pTT04oKVxuXG4gIGNvbnN0IGluaXRpYWxpemF0aW9uR2xvYmFsUGF0Y2hlczogeyB0YXJnZXQ6IG9iamVjdDsgcGF0Y2hlczogUGF0Y2hbXSB9W10gPSBbXVxuXG4gIGNvbnN0IGNyZWF0ZUJvdW5kT2JqZWN0ID0gKCkgPT4ge1xuICAgIGNvbnN0IGRpc3Bvc2VPbkdsb2JhbFBhdGNoZXMgPSBvbkdsb2JhbFBhdGNoZXMoKHRhcmdldCwgcGF0Y2hlcykgPT4ge1xuICAgICAgaW5pdGlhbGl6YXRpb25HbG9iYWxQYXRjaGVzLnB1c2goeyB0YXJnZXQsIHBhdGNoZXMgfSlcbiAgICB9KVxuXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGJvdW5kT2JqZWN0ID0geWpzQmluZGluZ0NvbnRleHQuYXBwbHkoXG4gICAgICAgICgpID0+IGZyb21TbmFwc2hvdChtb2J4S2V5c3RvbmVUeXBlLCB5anNKc29uIGFzIGFueSksXG4gICAgICAgIGJpbmRpbmdDb250ZXh0XG4gICAgICApXG4gICAgICB5anNCaW5kaW5nQ29udGV4dC5zZXQoYm91bmRPYmplY3QsIGJpbmRpbmdDb250ZXh0KVxuICAgICAgcmV0dXJuIGJvdW5kT2JqZWN0XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIGRpc3Bvc2VPbkdsb2JhbFBhdGNoZXMoKVxuICAgIH1cbiAgfVxuXG4gIGNvbnN0IGJvdW5kT2JqZWN0ID0gY3JlYXRlQm91bmRPYmplY3QoKVxuXG4gIGxldCBhcHBseWluZ01vYnhLZXlzdG9uZUNoYW5nZXMgPSAwXG5cbiAgLy8gYmluZCBhbnkgY2hhbmdlcyBmcm9tIHlqcyB0byBtb2J4LWtleXN0b25lXG4gIGNvbnN0IG9ic2VydmVEZWVwQ2IgPSAoZXZlbnRzOiBZLllFdmVudDxhbnk+W10pID0+IHtcbiAgICBjb25zdCBwYXRjaGVzOiBQYXRjaFtdID0gW11cbiAgICBldmVudHMuZm9yRWFjaCgoZXZlbnQpID0+IHtcbiAgICAgIGlmIChldmVudC50cmFuc2FjdGlvbi5vcmlnaW4gIT09IHlqc09yaWdpbikge1xuICAgICAgICBwYXRjaGVzLnB1c2goLi4uY29udmVydFlqc0V2ZW50VG9QYXRjaGVzKGV2ZW50KSlcbiAgICAgIH1cbiAgICB9KVxuXG4gICAgaWYgKHBhdGNoZXMubGVuZ3RoID4gMCkge1xuICAgICAgYXBwbHlpbmdNb2J4S2V5c3RvbmVDaGFuZ2VzKytcbiAgICAgIHRyeSB7XG4gICAgICAgIGFwcGx5UGF0Y2hlcyhib3VuZE9iamVjdCwgcGF0Y2hlcylcbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIGFwcGx5aW5nTW9ieEtleXN0b25lQ2hhbmdlcy0tXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgeWpzT2JqZWN0Lm9ic2VydmVEZWVwKG9ic2VydmVEZWVwQ2IpXG5cbiAgLy8gYmluZCBhbnkgY2hhbmdlcyBmcm9tIG1vYngta2V5c3RvbmUgdG8geWpzXG4gIGxldCBwZW5kaW5nUGF0Y2hlczogUGF0Y2hbXSA9IFtdXG4gIGNvbnN0IGRpc3Bvc2VPblBhdGNoZXMgPSBvblBhdGNoZXMoYm91bmRPYmplY3QsIChwYXRjaGVzKSA9PiB7XG4gICAgaWYgKGFwcGx5aW5nTW9ieEtleXN0b25lQ2hhbmdlcyA+IDApIHtcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIHBlbmRpbmdQYXRjaGVzLnB1c2goLi4ucGF0Y2hlcylcbiAgfSlcblxuICAvLyB0aGlzIGlzIG9ubHkgdXNlZCBzbyB3ZSBjYW4gdHJhbnNhY3QgYWxsIHBhdGNoZXMgdG8gdGhlIHNuYXBzaG90IGJvdW5kYXJ5XG4gIGNvbnN0IGRpc3Bvc2VPblNuYXBzaG90ID0gb25TbmFwc2hvdChib3VuZE9iamVjdCwgKCkgPT4ge1xuICAgIGlmIChwZW5kaW5nUGF0Y2hlcy5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGNvbnN0IHBhdGNoZXMgPSBwZW5kaW5nUGF0Y2hlc1xuICAgIHBlbmRpbmdQYXRjaGVzID0gW11cblxuICAgIHlqc0RvYy50cmFuc2FjdCgoKSA9PiB7XG4gICAgICBwYXRjaGVzLmZvckVhY2goKHBhdGNoKSA9PiB7XG4gICAgICAgIGFwcGx5TW9ieEtleXN0b25lUGF0Y2hUb1lqc09iamVjdChwYXRjaCwgeWpzT2JqZWN0KVxuICAgICAgfSlcbiAgICB9LCB5anNPcmlnaW4pXG4gIH0pXG5cbiAgLy8gc3luYyBpbml0aWFsIHBhdGNoZXMsIHRoYXQgbWlnaHQgaW5jbHVkZSBzZXR0aW5nIGRlZmF1bHRzLCBJRHMsIGV0Y1xuICB5anNEb2MudHJhbnNhY3QoKCkgPT4ge1xuICAgIC8vIHdlIG5lZWQgdG8gc2tpcCBpbml0aWFsaXphdGlvbnMgdW50aWwgd2UgaGl0IHRoZSBpbml0aWFsaXphdGlvbiBvZiB0aGUgYm91bmQgb2JqZWN0XG4gICAgLy8gdGhpcyBpcyBiZWNhdXNlIGRlZmF1bHQgb2JqZWN0cyBtaWdodCBiZSBjcmVhdGVkIGFuZCBpbml0aWFsaXplZCBiZWZvcmUgdGhlIG1haW4gb2JqZWN0XG4gICAgLy8gYnV0IHdlIGp1c3QgbmVlZCB0byBjYXRjaCB3aGVuIHRob3NlIGFyZSBhY3R1YWxseSBhc3NpZ25lZCB0byB0aGUgYm91bmQgb2JqZWN0XG4gICAgbGV0IGJvdW5kT2JqZWN0Rm91bmQgPSBmYWxzZVxuXG4gICAgaW5pdGlhbGl6YXRpb25HbG9iYWxQYXRjaGVzLmZvckVhY2goKHsgdGFyZ2V0LCBwYXRjaGVzIH0pID0+IHtcbiAgICAgIGlmICghYm91bmRPYmplY3RGb3VuZCkge1xuICAgICAgICBpZiAodGFyZ2V0ICE9PSBib3VuZE9iamVjdCkge1xuICAgICAgICAgIHJldHVybiAvLyBza2lwXG4gICAgICAgIH1cbiAgICAgICAgYm91bmRPYmplY3RGb3VuZCA9IHRydWVcbiAgICAgIH1cblxuICAgICAgY29uc3QgcGFyZW50VG9DaGlsZFBhdGggPSBnZXRQYXJlbnRUb0NoaWxkUGF0aChib3VuZE9iamVjdCwgdGFyZ2V0KVxuICAgICAgLy8gdGhpcyBpcyB1bmRlZmluZWQgb25seSBpZiB0YXJnZXQgaXMgbm90IGEgY2hpbGQgb2YgYm91bmRNb2RlbFxuICAgICAgaWYgKHBhcmVudFRvQ2hpbGRQYXRoICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgcGF0Y2hlcy5mb3JFYWNoKChwYXRjaCkgPT4ge1xuICAgICAgICAgIGFwcGx5TW9ieEtleXN0b25lUGF0Y2hUb1lqc09iamVjdChcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgLi4ucGF0Y2gsXG4gICAgICAgICAgICAgIHBhdGg6IFsuLi5wYXJlbnRUb0NoaWxkUGF0aCwgLi4ucGF0Y2gucGF0aF0sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgeWpzT2JqZWN0XG4gICAgICAgICAgKVxuICAgICAgICB9KVxuICAgICAgfVxuICAgIH0pXG4gIH0sIHlqc09yaWdpbilcblxuICByZXR1cm4ge1xuICAgIGJvdW5kT2JqZWN0LFxuICAgIGRpc3Bvc2U6ICgpID0+IHtcbiAgICAgIGRpc3Bvc2VPblBhdGNoZXMoKVxuICAgICAgZGlzcG9zZU9uU25hcHNob3QoKVxuICAgICAgeWpzT2JqZWN0LnVub2JzZXJ2ZURlZXAob2JzZXJ2ZURlZXBDYilcbiAgICB9LFxuICAgIHlqc09yaWdpbixcbiAgfVxufVxuIl0sIm5hbWVzIjpbImJvdW5kT2JqZWN0Il0sIm1hcHBpbmdzIjoiOztBQUdNLE1BQU8sNkJBQTZCLE1BQUs7QUFBQSxFQUM3QyxZQUFZLEtBQVc7QUFDckIsVUFBTSxHQUFHO0FBR0YsV0FBQSxlQUFlLE1BQU0scUJBQXFCLFNBQVM7QUFBQSxFQUM1RDtBQUNEO0FBS0ssU0FBVSxRQUFRLEtBQVc7QUFDMUIsU0FBQSxJQUFJLHFCQUFxQixHQUFHO0FBQ3JDO0FDZEEsU0FBUyxnQkFBZ0IsR0FBWTtBQUNuQyxRQUFNLElBQUksT0FBTztBQUNqQixTQUFPLE1BQU0sWUFBWSxNQUFNLFlBQVksTUFBTSxhQUFhLE1BQU07QUFDdEU7QUFFQSxTQUFTLFlBQVksR0FBWTtBQUN4QixTQUFBLE1BQU0sUUFBUSxDQUFDO0FBQ3hCO0FBRUEsU0FBUyxhQUFhLEdBQVk7QUFDaEMsU0FBTyxDQUFDLFlBQVksQ0FBQyxLQUFLLE9BQU8sTUFBTTtBQUN6QztBQUVNLFNBQVUscUJBQXFCLEdBQVk7QUFDL0MsTUFBSSxNQUFNLFVBQWEsZ0JBQWdCLENBQUMsR0FBRztBQUNsQyxXQUFBO0FBQUEsRUFDVDtBQUVJLE1BQUEsWUFBWSxDQUFDLEdBQUc7QUFDWixVQUFBLE1BQU0sSUFBSSxFQUFFO0FBQ2xCLHlCQUFxQixLQUFLLENBQUM7QUFDcEIsV0FBQTtBQUFBLEVBQ1Q7QUFFSSxNQUFBLGFBQWEsQ0FBQyxHQUFHO0FBQ2YsUUFBQSxFQUFFLFlBQVksTUFBTTtBQUVmLGFBQUE7QUFBQSxJQUNUO0FBRU0sVUFBQSxNQUFNLElBQUksRUFBRTtBQUNsQiwwQkFBc0IsS0FBSyxDQUFDO0FBQ3JCLFdBQUE7QUFBQSxFQUNUO0FBRUEsUUFBTSxJQUFJLE1BQU0sMkJBQTJCLENBQUMsRUFBRTtBQUNoRDtBQUVnQixTQUFBLHFCQUFxQixN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
|
|
570
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibW9ieC1rZXlzdG9uZS15anMuZXNtLm1qcyIsInNvdXJjZXMiOlsiLi4vc3JjL3V0aWxzL2Vycm9yLnRzIiwiLi4vc3JjL2JpbmRpbmcveWpzQmluZGluZ0NvbnRleHQudHMiLCIuLi9zcmMvdXRpbHMvZ2V0T3JDcmVhdGVZanNDb2xsZWN0aW9uQXRvbS50cyIsIi4uL3NyYy9iaW5kaW5nL3Jlc29sdmVZanNQYXRoLnRzIiwiLi4vc3JjL2JpbmRpbmcvWWpzVGV4dE1vZGVsLnRzIiwiLi4vc3JjL2JpbmRpbmcvY29udmVydEpzb25Ub1lqc0RhdGEudHMiLCIuLi9zcmMvYmluZGluZy9hcHBseU1vYnhLZXlzdG9uZVBhdGNoVG9ZanNPYmplY3QudHMiLCIuLi9zcmMvYmluZGluZy9jb252ZXJ0WWpzRGF0YVRvSnNvbi50cyIsIi4uL3NyYy9iaW5kaW5nL2NvbnZlcnRZanNFdmVudFRvUGF0Y2hlcy50cyIsIi4uL3NyYy9iaW5kaW5nL2JpbmRZanNUb01vYnhLZXlzdG9uZS50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKipcclxuICogQSBtb2J4LWtleXN0b25lLXlqcyBlcnJvci5cclxuICovXHJcbmV4cG9ydCBjbGFzcyBNb2J4S2V5c3RvbmVZanNFcnJvciBleHRlbmRzIEVycm9yIHtcclxuICBjb25zdHJ1Y3Rvcihtc2c6IHN0cmluZykge1xyXG4gICAgc3VwZXIobXNnKVxyXG5cclxuICAgIC8vIFNldCB0aGUgcHJvdG90eXBlIGV4cGxpY2l0bHkuXHJcbiAgICBPYmplY3Quc2V0UHJvdG90eXBlT2YodGhpcywgTW9ieEtleXN0b25lWWpzRXJyb3IucHJvdG90eXBlKVxyXG4gIH1cclxufVxyXG5cclxuLyoqXHJcbiAqIEBpbnRlcm5hbFxyXG4gKi9cclxuZXhwb3J0IGZ1bmN0aW9uIGZhaWx1cmUobXNnOiBzdHJpbmcpIHtcclxuICByZXR1cm4gbmV3IE1vYnhLZXlzdG9uZVlqc0Vycm9yKG1zZylcclxufVxyXG4iLCJpbXBvcnQgeyBBbnlUeXBlLCBjcmVhdGVDb250ZXh0IH0gZnJvbSBcIm1vYngta2V5c3RvbmVcIlxyXG5pbXBvcnQgKiBhcyBZIGZyb20gXCJ5anNcIlxyXG5cclxuLyoqXHJcbiAqIENvbnRleHQgd2l0aCBpbmZvIG9uIGhvdyBhIG1vYngta2V5c3RvbmUgbW9kZWwgaXMgYm91bmQgdG8gYSBZLmpzIGRhdGEgc3RydWN0dXJlLlxyXG4gKi9cclxuZXhwb3J0IGludGVyZmFjZSBZanNCaW5kaW5nQ29udGV4dCB7XHJcbiAgLyoqXHJcbiAgICogVGhlIFkuanMgZG9jdW1lbnQuXHJcbiAgICovXHJcbiAgeWpzRG9jOiBZLkRvY1xyXG5cclxuICAvKipcclxuICAgKiBUaGUgYm91bmQgWS5qcyBkYXRhIHN0cnVjdHVyZS5cclxuICAgKi9cclxuICB5anNPYmplY3Q6IFkuTWFwPHVua25vd24+IHwgWS5BcnJheTx1bmtub3duPiB8IFkuVGV4dFxyXG5cclxuICAvKipcclxuICAgKiBUaGUgbW9ieC1rZXlzdG9uZSBtb2RlbCB0eXBlLlxyXG4gICAqL1xyXG4gIG1vYnhLZXlzdG9uZVR5cGU6IEFueVR5cGVcclxuXHJcbiAgLyoqXHJcbiAgICogVGhlIG9yaWdpbiBzeW1ib2wgdXNlZCBmb3IgdHJhbnNhY3Rpb25zLlxyXG4gICAqL1xyXG4gIHlqc09yaWdpbjogc3ltYm9sXHJcblxyXG4gIC8qKlxyXG4gICAqIFRoZSBib3VuZCBtb2J4LWtleXN0b25lIGluc3RhbmNlLlxyXG4gICAqL1xyXG4gIGJvdW5kT2JqZWN0OiB1bmtub3duIHwgdW5kZWZpbmVkXHJcblxyXG4gIC8qKlxyXG4gICAqIFdoZXRoZXIgd2UgYXJlIGN1cnJlbnRseSBhcHBseWluZyBZLmpzIGNoYW5nZXMgdG8gdGhlIG1vYngta2V5c3RvbmUgbW9kZWwuXHJcbiAgICovXHJcbiAgaXNBcHBseWluZ1lqc0NoYW5nZXNUb01vYnhLZXlzdG9uZTogYm9vbGVhblxyXG59XHJcblxyXG4vKipcclxuICogQ29udGV4dCB3aXRoIGluZm8gb24gaG93IGEgbW9ieC1rZXlzdG9uZSBtb2RlbCBpcyBib3VuZCB0byBhIFkuanMgZGF0YSBzdHJ1Y3R1cmUuXHJcbiAqL1xyXG5leHBvcnQgY29uc3QgeWpzQmluZGluZ0NvbnRleHQgPSBjcmVhdGVDb250ZXh0PFlqc0JpbmRpbmdDb250ZXh0IHwgdW5kZWZpbmVkPih1bmRlZmluZWQpXHJcbiIsImltcG9ydCB7IElBdG9tLCBjcmVhdGVBdG9tIH0gZnJvbSBcIm1vYnhcIlxyXG5pbXBvcnQgKiBhcyBZIGZyb20gXCJ5anNcIlxyXG5cclxuY29uc3QgeWpzQ29sbGVjdGlvbkF0b21zID0gbmV3IFdlYWtNYXA8WS5NYXA8dW5rbm93bj4gfCBZLkFycmF5PHVua25vd24+LCBJQXRvbT4oKVxyXG5cclxuLyoqXHJcbiAqIEBpbnRlcm5hbFxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IGdldE9yQ3JlYXRlWWpzQ29sbGVjdGlvbkF0b20gPSAoXHJcbiAgeWpzQ29sbGVjdGlvbjogWS5NYXA8dW5rbm93bj4gfCBZLkFycmF5PHVua25vd24+XHJcbik6IElBdG9tID0+IHtcclxuICBsZXQgYXRvbSA9IHlqc0NvbGxlY3Rpb25BdG9tcy5nZXQoeWpzQ29sbGVjdGlvbilcclxuICBpZiAoIWF0b20pIHtcclxuICAgIGF0b20gPSBjcmVhdGVBdG9tKGB5anNDb2xsZWN0aW9uQXRvbWApXHJcbiAgICB5anNDb2xsZWN0aW9uQXRvbXMuc2V0KHlqc0NvbGxlY3Rpb24sIGF0b20pXHJcbiAgfVxyXG4gIHJldHVybiBhdG9tXHJcbn1cclxuIiwiaW1wb3J0ICogYXMgWSBmcm9tIFwieWpzXCJcclxuaW1wb3J0IHsgZmFpbHVyZSB9IGZyb20gXCIuLi91dGlscy9lcnJvclwiXHJcbmltcG9ydCB7IGdldE9yQ3JlYXRlWWpzQ29sbGVjdGlvbkF0b20gfSBmcm9tIFwiLi4vdXRpbHMvZ2V0T3JDcmVhdGVZanNDb2xsZWN0aW9uQXRvbVwiXHJcblxyXG5leHBvcnQgZnVuY3Rpb24gcmVzb2x2ZVlqc1BhdGgoeWpzT2JqZWN0OiB1bmtub3duLCBwYXRoOiByZWFkb25seSAoc3RyaW5nIHwgbnVtYmVyKVtdKTogdW5rbm93biB7XHJcbiAgbGV0IGN1cnJlbnRZanNPYmplY3Q6IHVua25vd24gPSB5anNPYmplY3RcclxuXHJcbiAgcGF0aC5mb3JFYWNoKChwYXRoUGFydCwgaSkgPT4ge1xyXG4gICAgaWYgKGN1cnJlbnRZanNPYmplY3QgaW5zdGFuY2VvZiBZLk1hcCkge1xyXG4gICAgICBnZXRPckNyZWF0ZVlqc0NvbGxlY3Rpb25BdG9tKGN1cnJlbnRZanNPYmplY3QpLnJlcG9ydE9ic2VydmVkKClcclxuICAgICAgY29uc3Qga2V5ID0gU3RyaW5nKHBhdGhQYXJ0KVxyXG4gICAgICBjdXJyZW50WWpzT2JqZWN0ID0gY3VycmVudFlqc09iamVjdC5nZXQoa2V5KVxyXG4gICAgfSBlbHNlIGlmIChjdXJyZW50WWpzT2JqZWN0IGluc3RhbmNlb2YgWS5BcnJheSkge1xyXG4gICAgICBnZXRPckNyZWF0ZVlqc0NvbGxlY3Rpb25BdG9tKGN1cnJlbnRZanNPYmplY3QpLnJlcG9ydE9ic2VydmVkKClcclxuICAgICAgY29uc3Qga2V5ID0gTnVtYmVyKHBhdGhQYXJ0KVxyXG4gICAgICBjdXJyZW50WWpzT2JqZWN0ID0gY3VycmVudFlqc09iamVjdC5nZXQoa2V5KVxyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhyb3cgZmFpbHVyZShcclxuICAgICAgICBgWS5NYXAgb3IgWS5BcnJheSB3YXMgZXhwZWN0ZWQgYXQgcGF0aCAke0pTT04uc3RyaW5naWZ5KFxyXG4gICAgICAgICAgcGF0aC5zbGljZSgwLCBpKVxyXG4gICAgICAgICl9IGluIG9yZGVyIHRvIHJlc29sdmUgcGF0aCAke0pTT04uc3RyaW5naWZ5KHBhdGgpfSwgYnV0IGdvdCAke2N1cnJlbnRZanNPYmplY3R9IGluc3RlYWRgXHJcbiAgICAgIClcclxuICAgIH1cclxuICB9KVxyXG5cclxuICByZXR1cm4gY3VycmVudFlqc09iamVjdFxyXG59XHJcbiIsImltcG9ydCB7IElBdG9tLCBjb21wdXRlZCwgY3JlYXRlQXRvbSwgb2JzZXJ2ZSwgcmVhY3Rpb24gfSBmcm9tIFwibW9ieFwiXHJcbmltcG9ydCB7XHJcbiAgRnJvemVuLFxyXG4gIE1vZGVsLFxyXG4gIGZyb3plbixcclxuICBnZXRQYXJlbnRUb0NoaWxkUGF0aCxcclxuICBtb2RlbCxcclxuICBvblNuYXBzaG90LFxyXG4gIHRQcm9wLFxyXG4gIHR5cGVzLFxyXG59IGZyb20gXCJtb2J4LWtleXN0b25lXCJcclxuaW1wb3J0ICogYXMgWSBmcm9tIFwieWpzXCJcclxuaW1wb3J0IHsgZmFpbHVyZSB9IGZyb20gXCIuLi91dGlscy9lcnJvclwiXHJcbmltcG9ydCB7IFlqc0JpbmRpbmdDb250ZXh0LCB5anNCaW5kaW5nQ29udGV4dCB9IGZyb20gXCIuL3lqc0JpbmRpbmdDb250ZXh0XCJcclxuaW1wb3J0IHsgcmVzb2x2ZVlqc1BhdGggfSBmcm9tIFwiLi9yZXNvbHZlWWpzUGF0aFwiXHJcblxyXG4vLyBEZWx0YVtdW10sIHNpbmNlIGVhY2ggc2luZ2xlIGNoYW5nZSBpcyBhIERlbHRhW11cclxuLy8gd2UgdXNlIGZyb3plbiBzbyB0aGF0IHdlIGNhbiByZXVzZSBlYWNoIGRlbHRhIGNoYW5nZVxyXG5jb25zdCBkZWx0YUxpc3RUeXBlID0gdHlwZXMuYXJyYXkodHlwZXMuZnJvemVuKHR5cGVzLnVuY2hlY2tlZDx1bmtub3duW10+KCkpKVxyXG5cclxuZXhwb3J0IGNvbnN0IHlqc1RleHRNb2RlbElkID0gXCJtb2J4LWtleXN0b25lLXlqcy9ZanNUZXh0TW9kZWxcIlxyXG5cclxuLyoqXHJcbiAqIEEgbW9ieC1rZXlzdG9uZSBtb2RlbCB0aGF0IHJlcHJlc2VudHMgYSBZanMuVGV4dCBvYmplY3QuXHJcbiAqL1xyXG5AbW9kZWwoeWpzVGV4dE1vZGVsSWQpXHJcbmV4cG9ydCBjbGFzcyBZanNUZXh0TW9kZWwgZXh0ZW5kcyBNb2RlbCh7XHJcbiAgZGVsdGFMaXN0OiB0UHJvcChkZWx0YUxpc3RUeXBlLCAoKSA9PiBbXSksXHJcbn0pIHtcclxuICAvKipcclxuICAgKiBIZWxwZXIgZnVuY3Rpb24gdG8gY3JlYXRlIGEgWWpzVGV4dE1vZGVsIGluc3RhbmNlIHdpdGggYSBzaW1wbGUgdGV4dC5cclxuICAgKi9cclxuICBzdGF0aWMgd2l0aFRleHQodGV4dDogc3RyaW5nKTogWWpzVGV4dE1vZGVsIHtcclxuICAgIHJldHVybiBuZXcgRGVjb3JhdGVkWWpzVGV4dE1vZGVsKHtcclxuICAgICAgZGVsdGFMaXN0OiBbXHJcbiAgICAgICAgZnJvemVuKFtcclxuICAgICAgICAgIHtcclxuICAgICAgICAgICAgaW5zZXJ0OiB0ZXh0LFxyXG4gICAgICAgICAgfSxcclxuICAgICAgICBdKSxcclxuICAgICAgXSxcclxuICAgIH0pXHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBUaGUgWS5qcyBwYXRoIGZyb20gdGhlIGJvdW5kIG9iamVjdCB0byB0aGUgWWpzVGV4dE1vZGVsIGluc3RhbmNlLlxyXG4gICAqL1xyXG4gIEBjb21wdXRlZFxyXG4gIHByaXZhdGUgZ2V0IF95anNPYmplY3RQYXRoKCkge1xyXG4gICAgY29uc3QgY3R4ID0geWpzQmluZGluZ0NvbnRleHQuZ2V0KHRoaXMpXHJcbiAgICBpZiAoIWN0eCB8fCBjdHguYm91bmRPYmplY3QgPT0gbnVsbCkge1xyXG4gICAgICB0aHJvdyBmYWlsdXJlKFxyXG4gICAgICAgIFwidGhlIFlqc1RleHRNb2RlbCBpbnN0YW5jZSBtdXN0IGJlIHBhcnQgb2YgYSBib3VuZCBvYmplY3QgYmVmb3JlIGl0IGNhbiBiZSBhY2Nlc3NlZFwiXHJcbiAgICAgIClcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCBwYXRoID0gZ2V0UGFyZW50VG9DaGlsZFBhdGgoY3R4LmJvdW5kT2JqZWN0LCB0aGlzKVxyXG4gICAgaWYgKCFwYXRoKSB7XHJcbiAgICAgIHRocm93IGZhaWx1cmUoXCJhIHBhdGggZnJvbSB0aGUgYm91bmQgb2JqZWN0IHRvIHRoZSBZanNUZXh0TW9kZWwgaW5zdGFuY2UgaXMgbm90IGF2YWlsYWJsZVwiKVxyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBwYXRoXHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBUaGUgWWpzLlRleHQgb2JqZWN0IHByZXNlbnQgYXQgdGhpcyBtb2J4LWtleXN0b25lIG5vZGUncyBwYXRoLlxyXG4gICAqL1xyXG4gIEBjb21wdXRlZFxyXG4gIHByaXZhdGUgZ2V0IF95anNPYmplY3RBdFBhdGgoKTogdW5rbm93biB7XHJcbiAgICBjb25zdCBwYXRoID0gdGhpcy5feWpzT2JqZWN0UGF0aFxyXG5cclxuICAgIGNvbnN0IGN0eCA9IHlqc0JpbmRpbmdDb250ZXh0LmdldCh0aGlzKSFcclxuXHJcbiAgICByZXR1cm4gcmVzb2x2ZVlqc1BhdGgoY3R4Lnlqc09iamVjdCwgcGF0aClcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFRoZSBZanMuVGV4dCBvYmplY3QgcmVwcmVzZW50ZWQgYnkgdGhpcyBtb2J4LWtleXN0b25lIG5vZGUuXHJcbiAgICovXHJcbiAgQGNvbXB1dGVkXHJcbiAgZ2V0IHlqc1RleHQoKTogWS5UZXh0IHtcclxuICAgIGNvbnN0IHlqc09iamVjdCA9IHRoaXMuX3lqc09iamVjdEF0UGF0aFxyXG5cclxuICAgIGlmICghKHlqc09iamVjdCBpbnN0YW5jZW9mIFkuVGV4dCkpIHtcclxuICAgICAgdGhyb3cgZmFpbHVyZShgWS5UZXh0IHdhcyBleHBlY3RlZCBhdCBwYXRoICR7SlNPTi5zdHJpbmdpZnkodGhpcy5feWpzT2JqZWN0UGF0aCl9YClcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4geWpzT2JqZWN0XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBBdG9tIHRoYXQgZ2V0cyBjaGFuZ2VkIHdoZW4gdGhlIGFzc29jaWF0ZWQgWS5qcyB0ZXh0IGNoYW5nZXMuXHJcbiAgICovXHJcbiAgeWpzVGV4dENoYW5nZWRBdG9tID0gY3JlYXRlQXRvbShcInlqc1RleHRDaGFuZ2VkQXRvbVwiKVxyXG5cclxuICAvKipcclxuICAgKiBUaGUgdGV4dCB2YWx1ZSBvZiB0aGUgWWpzLlRleHQgb2JqZWN0LlxyXG4gICAqIFNob3J0Y3V0IGZvciBgeWpzVGV4dC50b1N0cmluZygpYCwgYnV0IGNvbXB1dGVkLlxyXG4gICAqL1xyXG4gIEBjb21wdXRlZFxyXG4gIGdldCB0ZXh0KCk6IHN0cmluZyB7XHJcbiAgICB0aGlzLnlqc1RleHRDaGFuZ2VkQXRvbS5yZXBvcnRPYnNlcnZlZCgpXHJcbiAgICByZXR1cm4gdGhpcy55anNUZXh0LnRvU3RyaW5nKClcclxuICB9XHJcblxyXG4gIHByb3RlY3RlZCBvbkluaXQoKSB7XHJcbiAgICBjb25zdCBzaG91bGRSZXBsaWNhdGVUb1lqcyA9IChjdHg6IFlqc0JpbmRpbmdDb250ZXh0IHwgdW5kZWZpbmVkKTogY3R4IGlzIFlqc0JpbmRpbmdDb250ZXh0ID0+IHtcclxuICAgICAgcmV0dXJuICEhY3R4ICYmICEhY3R4LmJvdW5kT2JqZWN0ICYmICFjdHguaXNBcHBseWluZ1lqc0NoYW5nZXNUb01vYnhLZXlzdG9uZVxyXG4gICAgfVxyXG5cclxuICAgIGxldCByZWFwcGx5RGVsdGFzVG9ZanNUZXh0ID0gZmFsc2VcclxuICAgIGNvbnN0IG5ld0RlbHRhczogRnJvemVuPHVua25vd25bXT5bXSA9IFtdXHJcblxyXG4gICAgbGV0IGRpc3Bvc2VPYnNlcnZlRGVsdGFMaXN0OiAoKCkgPT4gdm9pZCkgfCB1bmRlZmluZWRcclxuXHJcbiAgICBjb25zdCBkaXNwb3NlUmVhY3Rpb25Ub0RlbHRhTGlzdFJlZkNoYW5nZSA9IHJlYWN0aW9uKFxyXG4gICAgICAoKSA9PiB0aGlzLiQuZGVsdGFMaXN0LFxyXG4gICAgICAoZGVsdGFMaXN0KSA9PiB7XHJcbiAgICAgICAgZGlzcG9zZU9ic2VydmVEZWx0YUxpc3Q/LigpXHJcbiAgICAgICAgZGlzcG9zZU9ic2VydmVEZWx0YUxpc3QgPSB1bmRlZmluZWRcclxuXHJcbiAgICAgICAgaWYgKGRlbHRhTGlzdCkge1xyXG4gICAgICAgICAgZGlzcG9zZU9ic2VydmVEZWx0YUxpc3QgPSBvYnNlcnZlKHRoaXMuJC5kZWx0YUxpc3QsIChjaGFuZ2UpID0+IHtcclxuICAgICAgICAgICAgaWYgKHJlYXBwbHlEZWx0YXNUb1lqc1RleHQpIHtcclxuICAgICAgICAgICAgICAvLyBhbHJlYWR5IGdvbm5hIHJlcGxhY2UgdGhlbSBhbGxcclxuICAgICAgICAgICAgICByZXR1cm5cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZiAoIXNob3VsZFJlcGxpY2F0ZVRvWWpzKHlqc0JpbmRpbmdDb250ZXh0LmdldCh0aGlzKSkpIHtcclxuICAgICAgICAgICAgICAvLyB5anMgdGV4dCBpcyBhbHJlYWR5IHVwIHRvIGRhdGUgd2l0aCB0aGVzZSBjaGFuZ2VzXHJcbiAgICAgICAgICAgICAgcmV0dXJuXHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGlmIChcclxuICAgICAgICAgICAgICBjaGFuZ2UudHlwZSA9PT0gXCJzcGxpY2VcIiAmJlxyXG4gICAgICAgICAgICAgIGNoYW5nZS5yZW1vdmVkQ291bnQgPT09IDAgJiZcclxuICAgICAgICAgICAgICBjaGFuZ2UuYWRkZWRDb3VudCA+IDAgJiZcclxuICAgICAgICAgICAgICBjaGFuZ2UuaW5kZXggPT09IHRoaXMuZGVsdGFMaXN0Lmxlbmd0aFxyXG4gICAgICAgICAgICApIHtcclxuICAgICAgICAgICAgICAvLyBvcHRpbWl6YXRpb24sIGp1c3QgYWRkaW5nIG5ldyBvbmVzIHRvIHRoZSBlbmRcclxuICAgICAgICAgICAgICBuZXdEZWx0YXMucHVzaCguLi5jaGFuZ2UuYWRkZWQpXHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgLy8gYW55IG90aGVyIGNoYW5nZSwgd2UgbmVlZCB0byByZWFwcGx5IGFsbCBkZWx0YXNcclxuICAgICAgICAgICAgICByZWFwcGx5RGVsdGFzVG9ZanNUZXh0ID0gdHJ1ZVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9KVxyXG4gICAgICAgIH1cclxuICAgICAgfSxcclxuICAgICAgeyBmaXJlSW1tZWRpYXRlbHk6IHRydWUgfVxyXG4gICAgKVxyXG5cclxuICAgIGNvbnN0IGRpc3Bvc2VPblNuYXBzaG90ID0gb25TbmFwc2hvdCh0aGlzLCAoKSA9PiB7XHJcbiAgICAgIHRyeSB7XHJcbiAgICAgICAgaWYgKHJlYXBwbHlEZWx0YXNUb1lqc1RleHQpIHtcclxuICAgICAgICAgIGNvbnN0IGN0eCA9IHlqc0JpbmRpbmdDb250ZXh0LmdldCh0aGlzKVxyXG5cclxuICAgICAgICAgIGlmIChzaG91bGRSZXBsaWNhdGVUb1lqcyhjdHgpKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHsgeWpzVGV4dCB9ID0gdGhpc1xyXG5cclxuICAgICAgICAgICAgY3R4Lnlqc0RvYy50cmFuc2FjdCgoKSA9PiB7XHJcbiAgICAgICAgICAgICAgLy8gZGlkbid0IGZpbmQgYSBiZXR0ZXIgd2F5IHRoYW4gdGhpcyB0byByZWFwcGx5IGFsbCBkZWx0YXNcclxuICAgICAgICAgICAgICAvLyB3aXRob3V0IGhhdmluZyB0byByZS1jcmVhdGUgdGhlIFkuVGV4dCBvYmplY3RcclxuICAgICAgICAgICAgICBpZiAoeWpzVGV4dC5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgICAgICB5anNUZXh0LmRlbGV0ZSgwLCB5anNUZXh0Lmxlbmd0aClcclxuICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgIHRoaXMuZGVsdGFMaXN0LmZvckVhY2goKGZyb3plbkRlbHRhcykgPT4ge1xyXG4gICAgICAgICAgICAgICAgeWpzVGV4dC5hcHBseURlbHRhKGZyb3plbkRlbHRhcy5kYXRhKVxyXG4gICAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgIH0sIGN0eC55anNPcmlnaW4pXHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSBlbHNlIGlmIChuZXdEZWx0YXMubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgY29uc3QgY3R4ID0geWpzQmluZGluZ0NvbnRleHQuZ2V0KHRoaXMpXHJcblxyXG4gICAgICAgICAgaWYgKHNob3VsZFJlcGxpY2F0ZVRvWWpzKGN0eCkpIHtcclxuICAgICAgICAgICAgY29uc3QgeyB5anNUZXh0IH0gPSB0aGlzXHJcblxyXG4gICAgICAgICAgICBjdHgueWpzRG9jLnRyYW5zYWN0KCgpID0+IHtcclxuICAgICAgICAgICAgICBuZXdEZWx0YXMuZm9yRWFjaCgoZnJvemVuRGVsdGFzKSA9PiB7XHJcbiAgICAgICAgICAgICAgICB5anNUZXh0LmFwcGx5RGVsdGEoZnJvemVuRGVsdGFzLmRhdGEpXHJcbiAgICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgfSwgY3R4Lnlqc09yaWdpbilcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgIH0gZmluYWxseSB7XHJcbiAgICAgICAgcmVhcHBseURlbHRhc1RvWWpzVGV4dCA9IGZhbHNlXHJcbiAgICAgICAgbmV3RGVsdGFzLmxlbmd0aCA9IDBcclxuICAgICAgfVxyXG4gICAgfSlcclxuXHJcbiAgICBjb25zdCBkaXBvc2VZanNUZXh0Q2hhbmdlZEF0b20gPSBob29rWWpzVGV4dENoYW5nZWRBdG9tKFxyXG4gICAgICAoKSA9PiB0aGlzLnlqc1RleHQsXHJcbiAgICAgIHRoaXMueWpzVGV4dENoYW5nZWRBdG9tXHJcbiAgICApXHJcblxyXG4gICAgcmV0dXJuICgpID0+IHtcclxuICAgICAgZGlzcG9zZU9uU25hcHNob3QoKVxyXG4gICAgICBkaXNwb3NlUmVhY3Rpb25Ub0RlbHRhTGlzdFJlZkNoYW5nZSgpXHJcbiAgICAgIGRpc3Bvc2VPYnNlcnZlRGVsdGFMaXN0Py4oKVxyXG4gICAgICBkaXNwb3NlT2JzZXJ2ZURlbHRhTGlzdCA9IHVuZGVmaW5lZFxyXG5cclxuICAgICAgZGlwb3NlWWpzVGV4dENoYW5nZWRBdG9tKClcclxuICAgIH1cclxuICB9XHJcbn1cclxuXHJcbi8vIHdlIHVzZSB0aGlzIHRyaWNrIGp1c3QgdG8gYXZvaWQgYSBiYWJlbCBidWcgdGhhdCBjYXVzZXMgY2xhc3NlcyB1c2VkIGluc2lkZSBjbGFzc2VzIG5vdCB0byBiZSBvdmVycmlkZW5cclxuLy8gYnkgdGhlIGRlY29yYXRvclxyXG5jb25zdCBEZWNvcmF0ZWRZanNUZXh0TW9kZWwgPSBZanNUZXh0TW9kZWxcclxuXHJcbmZ1bmN0aW9uIGhvb2tZanNUZXh0Q2hhbmdlZEF0b20oZ2V0WWpzVGV4dDogKCkgPT4gWS5UZXh0LCB0ZXh0Q2hhbmdlZEF0b206IElBdG9tKSB7XHJcbiAgbGV0IGRpc3Bvc2VPYnNlcnZlWWpzVGV4dDogKCgpID0+IHZvaWQpIHwgdW5kZWZpbmVkXHJcblxyXG4gIGNvbnN0IG9ic2VydmVGbiA9ICgpID0+IHtcclxuICAgIHRleHRDaGFuZ2VkQXRvbS5yZXBvcnRDaGFuZ2VkKClcclxuICB9XHJcblxyXG4gIGNvbnN0IGRpc3Bvc2VSZWFjdGlvblRvWVRleHRDaGFuZ2UgPSByZWFjdGlvbihcclxuICAgICgpID0+IHtcclxuICAgICAgdHJ5IHtcclxuICAgICAgICByZXR1cm4gZ2V0WWpzVGV4dCgpXHJcbiAgICAgIH0gY2F0Y2gge1xyXG4gICAgICAgIHJldHVybiB1bmRlZmluZWRcclxuICAgICAgfVxyXG4gICAgfSxcclxuICAgICh5anNUZXh0KSA9PiB7XHJcbiAgICAgIGRpc3Bvc2VPYnNlcnZlWWpzVGV4dD8uKClcclxuICAgICAgZGlzcG9zZU9ic2VydmVZanNUZXh0ID0gdW5kZWZpbmVkXHJcblxyXG4gICAgICBpZiAoeWpzVGV4dCkge1xyXG4gICAgICAgIHlqc1RleHQub2JzZXJ2ZShvYnNlcnZlRm4pXHJcblxyXG4gICAgICAgIGRpc3Bvc2VPYnNlcnZlWWpzVGV4dCA9ICgpID0+IHtcclxuICAgICAgICAgIHlqc1RleHQudW5vYnNlcnZlKG9ic2VydmVGbilcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIHRleHRDaGFuZ2VkQXRvbS5yZXBvcnRDaGFuZ2VkKClcclxuICAgIH0sXHJcbiAgICB7XHJcbiAgICAgIGZpcmVJbW1lZGlhdGVseTogdHJ1ZSxcclxuICAgIH1cclxuICApXHJcblxyXG4gIHJldHVybiAoKSA9PiB7XHJcbiAgICBkaXNwb3NlUmVhY3Rpb25Ub1lUZXh0Q2hhbmdlKClcclxuICAgIGRpc3Bvc2VPYnNlcnZlWWpzVGV4dD8uKClcclxuICAgIGRpc3Bvc2VPYnNlcnZlWWpzVGV4dCA9IHVuZGVmaW5lZFxyXG4gIH1cclxufVxyXG4iLCJpbXBvcnQgKiBhcyBZIGZyb20gXCJ5anNcIlxyXG5pbXBvcnQgeyBKc29uVmFsdWUsIEpzb25BcnJheSwgSnNvbk9iamVjdCwgSnNvblByaW1pdGl2ZSB9IGZyb20gXCIuLi9qc29uVHlwZXNcIlxyXG5pbXBvcnQgeyBZanNUZXh0TW9kZWwsIHlqc1RleHRNb2RlbElkIH0gZnJvbSBcIi4vWWpzVGV4dE1vZGVsXCJcclxuaW1wb3J0IHsgU25hcHNob3RPdXRPZiB9IGZyb20gXCJtb2J4LWtleXN0b25lXCJcclxuXHJcbmZ1bmN0aW9uIGlzSnNvblByaW1pdGl2ZSh2OiBKc29uVmFsdWUpOiB2IGlzIEpzb25QcmltaXRpdmUge1xyXG4gIGNvbnN0IHQgPSB0eXBlb2YgdlxyXG4gIHJldHVybiB0ID09PSBcInN0cmluZ1wiIHx8IHQgPT09IFwibnVtYmVyXCIgfHwgdCA9PT0gXCJib29sZWFuXCIgfHwgdiA9PT0gbnVsbFxyXG59XHJcblxyXG5mdW5jdGlvbiBpc0pzb25BcnJheSh2OiBKc29uVmFsdWUpOiB2IGlzIEpzb25BcnJheSB7XHJcbiAgcmV0dXJuIEFycmF5LmlzQXJyYXkodilcclxufVxyXG5cclxuZnVuY3Rpb24gaXNKc29uT2JqZWN0KHY6IEpzb25WYWx1ZSk6IHYgaXMgSnNvbk9iamVjdCB7XHJcbiAgcmV0dXJuICFpc0pzb25BcnJheSh2KSAmJiB0eXBlb2YgdiA9PT0gXCJvYmplY3RcIlxyXG59XHJcblxyXG4vKipcclxuICogQ29udmVydHMgYSBKU09OIHZhbHVlIHRvIGEgWS5qcyBkYXRhIHN0cnVjdHVyZS5cclxuICogT2JqZWN0cyBhcmUgY29udmVydGVkIHRvIFkuTWFwcywgYXJyYXlzIHRvIFkuQXJyYXlzLCBwcmltaXRpdmVzIGFyZSB1bnRvdWNoZWQuXHJcbiAqIEZyb3plbiB2YWx1ZXMgYXJlIGEgc3BlY2lhbCBjYXNlIGFuZCB0aGV5IGFyZSBrZXB0IGFzIGltbXV0YWJsZSBwbGFpbiB2YWx1ZXMuXHJcbiAqL1xyXG5leHBvcnQgZnVuY3Rpb24gY29udmVydEpzb25Ub1lqc0RhdGEodjogSnNvblZhbHVlKSB7XHJcbiAgaWYgKHYgPT09IHVuZGVmaW5lZCB8fCBpc0pzb25QcmltaXRpdmUodikpIHtcclxuICAgIHJldHVybiB2XHJcbiAgfVxyXG5cclxuICBpZiAoaXNKc29uQXJyYXkodikpIHtcclxuICAgIGNvbnN0IGFyciA9IG5ldyBZLkFycmF5KClcclxuICAgIGFwcGx5SnNvbkFycmF5VG9ZQXJyYXkoYXJyLCB2KVxyXG4gICAgcmV0dXJuIGFyclxyXG4gIH1cclxuXHJcbiAgaWYgKGlzSnNvbk9iamVjdCh2KSkge1xyXG4gICAgaWYgKHYuJGZyb3plbiA9PT0gdHJ1ZSkge1xyXG4gICAgICAvLyBmcm96ZW4gdmFsdWUsIHNhdmUgYXMgaW1tdXRhYmxlIG9iamVjdFxyXG4gICAgICByZXR1cm4gdlxyXG4gICAgfVxyXG5cclxuICAgIGlmICh2LiRtb2RlbFR5cGUgPT09IHlqc1RleHRNb2RlbElkKSB7XHJcbiAgICAgIGNvbnN0IHRleHQgPSBuZXcgWS5UZXh0KClcclxuICAgICAgY29uc3QgeWpzVGV4dE1vZGVsID0gdiBhcyBTbmFwc2hvdE91dE9mPFlqc1RleHRNb2RlbD5cclxuICAgICAgeWpzVGV4dE1vZGVsLmRlbHRhTGlzdC5mb3JFYWNoKChmcm96ZW5EZWx0YXMpID0+IHtcclxuICAgICAgICB0ZXh0LmFwcGx5RGVsdGEoZnJvemVuRGVsdGFzLmRhdGEpXHJcbiAgICAgIH0pXHJcbiAgICAgIHJldHVybiB0ZXh0XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3QgbWFwID0gbmV3IFkuTWFwKClcclxuICAgIGFwcGx5SnNvbk9iamVjdFRvWU1hcChtYXAsIHYpXHJcbiAgICByZXR1cm4gbWFwXHJcbiAgfVxyXG5cclxuICB0aHJvdyBuZXcgRXJyb3IoYHVuc3VwcG9ydGVkIHZhbHVlIHR5cGU6ICR7dn1gKVxyXG59XHJcblxyXG4vKipcclxuICogQXBwbGllcyBhIEpTT04gYXJyYXkgdG8gYSBZLkFycmF5LCB1c2luZyB0aGUgY29udmVydEpzb25Ub1lqc0RhdGEgdG8gY29udmVydCB0aGUgdmFsdWVzLlxyXG4gKi9cclxuZXhwb3J0IGZ1bmN0aW9uIGFwcGx5SnNvbkFycmF5VG9ZQXJyYXkoZGVzdDogWS5BcnJheTx1bmtub3duPiwgc291cmNlOiBKc29uQXJyYXkpIHtcclxuICBkZXN0LnB1c2goc291cmNlLm1hcChjb252ZXJ0SnNvblRvWWpzRGF0YSkpXHJcbn1cclxuXHJcbi8qKlxyXG4gKiBBcHBsaWVzIGEgSlNPTiBvYmplY3QgdG8gYSBZLk1hcCwgdXNpbmcgdGhlIGNvbnZlcnRKc29uVG9ZanNEYXRhIHRvIGNvbnZlcnQgdGhlIHZhbHVlcy5cclxuICovXHJcbmV4cG9ydCBmdW5jdGlvbiBhcHBseUpzb25PYmplY3RUb1lNYXAoZGVzdDogWS5NYXA8dW5rbm93bj4sIHNvdXJjZTogSnNvbk9iamVjdCkge1xyXG4gIE9iamVjdC5lbnRyaWVzKHNvdXJjZSkuZm9yRWFjaCgoW2ssIHZdKSA9PiB7XHJcbiAgICBkZXN0LnNldChrLCBjb252ZXJ0SnNvblRvWWpzRGF0YSh2KSlcclxuICB9KVxyXG59XHJcbiIsImltcG9ydCB7IFBhdGNoIH0gZnJvbSBcIm1vYngta2V5c3RvbmVcIlxyXG5pbXBvcnQgKiBhcyBZIGZyb20gXCJ5anNcIlxyXG5pbXBvcnQgeyBmYWlsdXJlIH0gZnJvbSBcIi4uL3V0aWxzL2Vycm9yXCJcclxuaW1wb3J0IHsgY29udmVydEpzb25Ub1lqc0RhdGEgfSBmcm9tIFwiLi9jb252ZXJ0SnNvblRvWWpzRGF0YVwiXHJcblxyXG5leHBvcnQgZnVuY3Rpb24gYXBwbHlNb2J4S2V5c3RvbmVQYXRjaFRvWWpzT2JqZWN0KHBhdGNoOiBQYXRjaCwgeWpzOiB1bmtub3duKTogdm9pZCB7XHJcbiAgaWYgKHBhdGNoLnBhdGgubGVuZ3RoID4gMSkge1xyXG4gICAgY29uc3QgW2tleSwgLi4ucmVzdF0gPSBwYXRjaC5wYXRoXHJcblxyXG4gICAgaWYgKHlqcyBpbnN0YW5jZW9mIFkuTWFwKSB7XHJcbiAgICAgIGNvbnN0IGNoaWxkID0geWpzLmdldChTdHJpbmcoa2V5KSlcclxuICAgICAgaWYgKGNoaWxkID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICB0aHJvdyBmYWlsdXJlKFxyXG4gICAgICAgICAgYGludmFsaWQgcGF0Y2ggcGF0aCwga2V5IFwiJHtrZXl9XCIgbm90IGZvdW5kIGluIFlqcyBtYXAgLSBwYXRjaDogJHtKU09OLnN0cmluZ2lmeShwYXRjaCl9YFxyXG4gICAgICAgIClcclxuICAgICAgfVxyXG4gICAgICBhcHBseU1vYnhLZXlzdG9uZVBhdGNoVG9ZanNPYmplY3QoeyAuLi5wYXRjaCwgcGF0aDogcmVzdCB9LCBjaGlsZClcclxuICAgIH0gZWxzZSBpZiAoeWpzIGluc3RhbmNlb2YgWS5BcnJheSkge1xyXG4gICAgICBjb25zdCBjaGlsZCA9IHlqcy5nZXQoTnVtYmVyKGtleSkpXHJcbiAgICAgIGlmIChjaGlsZCA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgdGhyb3cgZmFpbHVyZShcclxuICAgICAgICAgIGBpbnZhbGlkIHBhdGNoIHBhdGgsIGtleSBcIiR7a2V5fVwiIG5vdCBmb3VuZCBpbiBZanMgYXJyYXkgLSBwYXRjaDogJHtKU09OLnN0cmluZ2lmeShcclxuICAgICAgICAgICAgcGF0Y2hcclxuICAgICAgICAgICl9YFxyXG4gICAgICAgIClcclxuICAgICAgfVxyXG4gICAgICBhcHBseU1vYnhLZXlzdG9uZVBhdGNoVG9ZanNPYmplY3QoeyAuLi5wYXRjaCwgcGF0aDogcmVzdCB9LCBjaGlsZClcclxuICAgIH0gZWxzZSBpZiAoeWpzIGluc3RhbmNlb2YgWS5UZXh0KSB7XHJcbiAgICAgIC8vIGNoYW5nZXMgdG8gZGVsdGFMaXN0IHdpbGwgYmUgaGFuZGxlZCBieSB0aGUgYXJyYXkgb2JzZXJ2ZSBpbiB0aGUgWWpzVGV4dE1vZGVsIGNsYXNzXHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aHJvdyBmYWlsdXJlKFxyXG4gICAgICAgIGBpbnZhbGlkIHBhdGNoIHBhdGgsIGtleSBcIiR7a2V5fVwiIG5vdCBmb3VuZCBpbiB1bmtub3duIFlqcyBvYmplY3QgLSBwYXRjaDogJHtKU09OLnN0cmluZ2lmeShcclxuICAgICAgICAgIHBhdGNoXHJcbiAgICAgICAgKX1gXHJcbiAgICAgIClcclxuICAgIH1cclxuICB9IGVsc2UgaWYgKHBhdGNoLnBhdGgubGVuZ3RoID09PSAxKSB7XHJcbiAgICBpZiAoeWpzIGluc3RhbmNlb2YgWS5NYXApIHtcclxuICAgICAgY29uc3Qga2V5ID0gU3RyaW5nKHBhdGNoLnBhdGhbMF0pXHJcblxyXG4gICAgICBzd2l0Y2ggKHBhdGNoLm9wKSB7XHJcbiAgICAgICAgY2FzZSBcImFkZFwiOlxyXG4gICAgICAgIGNhc2UgXCJyZXBsYWNlXCI6IHtcclxuICAgICAgICAgIHlqcy5zZXQoa2V5LCBjb252ZXJ0SnNvblRvWWpzRGF0YShwYXRjaC52YWx1ZSkpXHJcbiAgICAgICAgICBicmVha1xyXG4gICAgICAgIH1cclxuICAgICAgICBjYXNlIFwicmVtb3ZlXCI6IHtcclxuICAgICAgICAgIHlqcy5kZWxldGUoa2V5KVxyXG4gICAgICAgICAgYnJlYWtcclxuICAgICAgICB9XHJcbiAgICAgICAgZGVmYXVsdDoge1xyXG4gICAgICAgICAgdGhyb3cgZmFpbHVyZShgaW52YWxpZCBwYXRjaCBvcGVyYXRpb24gZm9yIG1hcGApXHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9IGVsc2UgaWYgKHlqcyBpbnN0YW5jZW9mIFkuQXJyYXkpIHtcclxuICAgICAgY29uc3Qga2V5ID0gcGF0Y2gucGF0aFswXVxyXG5cclxuICAgICAgc3dpdGNoIChwYXRjaC5vcCkge1xyXG4gICAgICAgIGNhc2UgXCJyZXBsYWNlXCI6IHtcclxuICAgICAgICAgIGlmIChrZXkgPT09IFwibGVuZ3RoXCIpIHtcclxuICAgICAgICAgICAgaWYgKHlqcy5sZW5ndGggPiBwYXRjaC52YWx1ZSkge1xyXG4gICAgICAgICAgICAgIGNvbnN0IHRvRGVsZXRlID0geWpzLmxlbmd0aCAtIHBhdGNoLnZhbHVlXHJcbiAgICAgICAgICAgICAgeWpzLmRlbGV0ZShwYXRjaC52YWx1ZSwgdG9EZWxldGUpXHJcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoeWpzLmxlbmd0aCA8IHBhdGNoLnZhbHVlKSB7XHJcbiAgICAgICAgICAgICAgY29uc3QgdG9JbnNlcnQgPSBwYXRjaC52YWx1ZSAtIHlqcy5sZW5ndGhcclxuICAgICAgICAgICAgICB5anMuaW5zZXJ0KHlqcy5sZW5ndGgsIEFycmF5KHRvSW5zZXJ0KS5maWxsKHVuZGVmaW5lZCkpXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHlqcy5kZWxldGUoTnVtYmVyKGtleSkpXHJcbiAgICAgICAgICAgIHlqcy5pbnNlcnQoTnVtYmVyKGtleSksIFtjb252ZXJ0SnNvblRvWWpzRGF0YShwYXRjaC52YWx1ZSldKVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgYnJlYWtcclxuICAgICAgICB9XHJcbiAgICAgICAgY2FzZSBcImFkZFwiOiB7XHJcbiAgICAgICAgICB5anMuaW5zZXJ0KE51bWJlcihrZXkpLCBbY29udmVydEpzb25Ub1lqc0RhdGEocGF0Y2gudmFsdWUpXSlcclxuICAgICAgICAgIGJyZWFrXHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNhc2UgXCJyZW1vdmVcIjoge1xyXG4gICAgICAgICAgeWpzLmRlbGV0ZShOdW1iZXIoa2V5KSlcclxuICAgICAgICAgIGJyZWFrXHJcbiAgICAgICAgfVxyXG4gICAgICAgIGRlZmF1bHQ6IHtcclxuICAgICAgICAgIHRocm93IGZhaWx1cmUoYGludmFsaWQgcGF0Y2ggb3BlcmF0aW9uIGZvciBhcnJheWApXHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9IGVsc2UgaWYgKHlqcyBpbnN0YW5jZW9mIFkuVGV4dCkge1xyXG4gICAgICAvLyBpbml0aWFsaXphdGlvbiBvZiBhIFlqc1RleHRNb2RlbCwgZG8gbm90aGluZ1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhyb3cgZmFpbHVyZShcclxuICAgICAgICBgaW52YWxpZCBwYXRjaCBwYXRoLCB0aGUgWWpzIG9iamVjdCBpcyBvZiBhbiB1bmtvd24gdHlwZSwgc28ga2V5IFwiJHtwYXRjaC5wYXRoWzBdfVwiIGNhbm5vdCBiZSBmb3VuZCBpbiBpdGBcclxuICAgICAgKVxyXG4gICAgfVxyXG4gIH0gZWxzZSB7XHJcbiAgICB0aHJvdyBmYWlsdXJlKGBpbnZhbGlkIHBhdGNoIHBhdGgsIGl0IGNhbm5vdCBiZSBlbXB0eWApXHJcbiAgfVxyXG59XHJcbiIsImltcG9ydCB7IG1vZGVsU25hcHNob3RPdXRXaXRoTWV0YWRhdGEgfSBmcm9tIFwibW9ieC1rZXlzdG9uZVwiXHJcbmltcG9ydCAqIGFzIFkgZnJvbSBcInlqc1wiXHJcbmltcG9ydCB7IEpzb25WYWx1ZSB9IGZyb20gXCIuLi9qc29uVHlwZXNcIlxyXG5pbXBvcnQgeyBZanNUZXh0TW9kZWwgfSBmcm9tIFwiLi9ZanNUZXh0TW9kZWxcIlxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGNvbnZlcnRZanNEYXRhVG9Kc29uKFxyXG4gIHlqc0RhdGE6IFkuQXJyYXk8dW5rbm93bj4gfCBZLk1hcDx1bmtub3duPiB8IFkuVGV4dCB8IHVua25vd25cclxuKTogSnNvblZhbHVlIHtcclxuICBpZiAoeWpzRGF0YSBpbnN0YW5jZW9mIFkuQXJyYXkpIHtcclxuICAgIHJldHVybiB5anNEYXRhLm1hcCgodikgPT4gY29udmVydFlqc0RhdGFUb0pzb24odikpXHJcbiAgfVxyXG5cclxuICBpZiAoeWpzRGF0YSBpbnN0YW5jZW9mIFkuTWFwKSB7XHJcbiAgICBjb25zdCBvYmo6IFJlY29yZDxzdHJpbmcsIEpzb25WYWx1ZT4gPSB7fVxyXG4gICAgeWpzRGF0YS5mb3JFYWNoKCh2LCBrKSA9PiB7XHJcbiAgICAgIG9ialtrXSA9IGNvbnZlcnRZanNEYXRhVG9Kc29uKHYpXHJcbiAgICB9KVxyXG4gICAgcmV0dXJuIG9ialxyXG4gIH1cclxuXHJcbiAgaWYgKHlqc0RhdGEgaW5zdGFuY2VvZiBZLlRleHQpIHtcclxuICAgIGNvbnN0IGRlbHRhcyA9IHlqc0RhdGEudG9EZWx0YSgpXHJcblxyXG4gICAgcmV0dXJuIG1vZGVsU25hcHNob3RPdXRXaXRoTWV0YWRhdGEoWWpzVGV4dE1vZGVsLCB7XHJcbiAgICAgIGRlbHRhTGlzdDogZGVsdGFzLmxlbmd0aCA+IDAgPyBbeyAkZnJvemVuOiB0cnVlLCBkYXRhOiBkZWx0YXMgfV0gOiBbXSxcclxuICAgIH0pIGFzIEpzb25WYWx1ZVxyXG4gIH1cclxuXHJcbiAgLy8gYXNzdW1lIGl0J3MgYSBwcmltaXRpdmVcclxuICByZXR1cm4geWpzRGF0YSBhcyBKc29uVmFsdWVcclxufVxyXG4iLCJpbXBvcnQgeyBQYXRjaCB9IGZyb20gXCJtb2J4LWtleXN0b25lXCJcclxuaW1wb3J0ICogYXMgWSBmcm9tIFwieWpzXCJcclxuaW1wb3J0IHsgSnNvbkFycmF5LCBKc29uT2JqZWN0LCBKc29uVmFsdWUgfSBmcm9tIFwiLi4vanNvblR5cGVzXCJcclxuaW1wb3J0IHsgZmFpbHVyZSB9IGZyb20gXCIuLi91dGlscy9lcnJvclwiXHJcblxyXG5leHBvcnQgZnVuY3Rpb24gY29udmVydFlqc0V2ZW50VG9QYXRjaGVzKGV2ZW50OiBZLllFdmVudDxhbnk+KTogUGF0Y2hbXSB7XHJcbiAgY29uc3QgcGF0Y2hlczogUGF0Y2hbXSA9IFtdXHJcblxyXG4gIGlmIChldmVudCBpbnN0YW5jZW9mIFkuWU1hcEV2ZW50KSB7XHJcbiAgICBjb25zdCBzb3VyY2UgPSBldmVudC50YXJnZXQgYXMgWS5NYXA8YW55PlxyXG5cclxuICAgIGV2ZW50LmNoYW5nZXMua2V5cy5mb3JFYWNoKChjaGFuZ2UsIGtleSkgPT4ge1xyXG4gICAgICBjb25zdCBwYXRoID0gWy4uLmV2ZW50LnBhdGgsIGtleV1cclxuXHJcbiAgICAgIHN3aXRjaCAoY2hhbmdlLmFjdGlvbikge1xyXG4gICAgICAgIGNhc2UgXCJhZGRcIjpcclxuICAgICAgICAgIHBhdGNoZXMucHVzaCh7XHJcbiAgICAgICAgICAgIG9wOiBcImFkZFwiLFxyXG4gICAgICAgICAgICBwYXRoLFxyXG4gICAgICAgICAgICB2YWx1ZTogdG9QbGFpblZhbHVlKHNvdXJjZS5nZXQoa2V5KSksXHJcbiAgICAgICAgICB9KVxyXG4gICAgICAgICAgYnJlYWtcclxuXHJcbiAgICAgICAgY2FzZSBcInVwZGF0ZVwiOlxyXG4gICAgICAgICAgcGF0Y2hlcy5wdXNoKHtcclxuICAgICAgICAgICAgb3A6IFwicmVwbGFjZVwiLFxyXG4gICAgICAgICAgICBwYXRoLFxyXG4gICAgICAgICAgICB2YWx1ZTogdG9QbGFpblZhbHVlKHNvdXJjZS5nZXQoa2V5KSksXHJcbiAgICAgICAgICB9KVxyXG4gICAgICAgICAgYnJlYWtcclxuXHJcbiAgICAgICAgY2FzZSBcImRlbGV0ZVwiOlxyXG4gICAgICAgICAgcGF0Y2hlcy5wdXNoKHtcclxuICAgICAgICAgICAgb3A6IFwicmVtb3ZlXCIsXHJcbiAgICAgICAgICAgIHBhdGgsXHJcbiAgICAgICAgICB9KVxyXG4gICAgICAgICAgYnJlYWtcclxuXHJcbiAgICAgICAgZGVmYXVsdDpcclxuICAgICAgICAgIHRocm93IGZhaWx1cmUoYHVuc3VwcG9ydGVkIFlqcyBtYXAgZXZlbnQgYWN0aW9uOiAke2NoYW5nZS5hY3Rpb259YClcclxuICAgICAgfVxyXG4gICAgfSlcclxuICB9IGVsc2UgaWYgKGV2ZW50IGluc3RhbmNlb2YgWS5ZQXJyYXlFdmVudCkge1xyXG4gICAgbGV0IHJldGFpbiA9IDBcclxuICAgIGV2ZW50LmNoYW5nZXMuZGVsdGEuZm9yRWFjaCgoY2hhbmdlKSA9PiB7XHJcbiAgICAgIGlmIChjaGFuZ2UucmV0YWluKSB7XHJcbiAgICAgICAgcmV0YWluICs9IGNoYW5nZS5yZXRhaW5cclxuICAgICAgfVxyXG5cclxuICAgICAgaWYgKGNoYW5nZS5kZWxldGUpIHtcclxuICAgICAgICAvLyByZW1vdmUgWCBpdGVtcyBhdCByZXRhaW4gcG9zaXRpb25cclxuICAgICAgICBjb25zdCBwYXRoID0gWy4uLmV2ZW50LnBhdGgsIHJldGFpbl1cclxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNoYW5nZS5kZWxldGU7IGkrKykge1xyXG4gICAgICAgICAgcGF0Y2hlcy5wdXNoKHtcclxuICAgICAgICAgICAgb3A6IFwicmVtb3ZlXCIsXHJcbiAgICAgICAgICAgIHBhdGgsXHJcbiAgICAgICAgICB9KVxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG5cclxuICAgICAgaWYgKGNoYW5nZS5pbnNlcnQpIHtcclxuICAgICAgICBjb25zdCBuZXdWYWx1ZXMgPSBBcnJheS5pc0FycmF5KGNoYW5nZS5pbnNlcnQpID8gY2hhbmdlLmluc2VydCA6IFtjaGFuZ2UuaW5zZXJ0XVxyXG4gICAgICAgIG5ld1ZhbHVlcy5mb3JFYWNoKCh2KSA9PiB7XHJcbiAgICAgICAgICBjb25zdCBwYXRoID0gWy4uLmV2ZW50LnBhdGgsIHJldGFpbl1cclxuICAgICAgICAgIHBhdGNoZXMucHVzaCh7XHJcbiAgICAgICAgICAgIG9wOiBcImFkZFwiLFxyXG4gICAgICAgICAgICBwYXRoLFxyXG4gICAgICAgICAgICB2YWx1ZTogdG9QbGFpblZhbHVlKHYpLFxyXG4gICAgICAgICAgfSlcclxuICAgICAgICAgIHJldGFpbisrXHJcbiAgICAgICAgfSlcclxuICAgICAgfVxyXG4gICAgfSlcclxuICB9IGVsc2UgaWYgKGV2ZW50IGluc3RhbmNlb2YgWS5ZVGV4dEV2ZW50KSB7XHJcbiAgICBjb25zdCBwYXRoID0gWy4uLmV2ZW50LnBhdGgsIFwiZGVsdGFMaXN0XCIsIC0xIC8qIGxhc3QgaXRlbSAqL11cclxuICAgIHBhdGNoZXMucHVzaCh7XHJcbiAgICAgIG9wOiBcImFkZFwiLFxyXG4gICAgICBwYXRoLFxyXG4gICAgICB2YWx1ZTogeyAkZnJvemVuOiB0cnVlLCBkYXRhOiBldmVudC5kZWx0YSB9LFxyXG4gICAgfSlcclxuICB9XHJcblxyXG4gIHJldHVybiBwYXRjaGVzXHJcbn1cclxuXHJcbmZ1bmN0aW9uIHRvUGxhaW5WYWx1ZSh2OiBZLk1hcDxhbnk+IHwgWS5BcnJheTxhbnk+IHwgSnNvblZhbHVlKSB7XHJcbiAgaWYgKHYgaW5zdGFuY2VvZiBZLk1hcCB8fCB2IGluc3RhbmNlb2YgWS5BcnJheSkge1xyXG4gICAgcmV0dXJuIHYudG9KU09OKCkgYXMgSnNvbk9iamVjdCB8IEpzb25BcnJheVxyXG4gIH0gZWxzZSB7XHJcbiAgICByZXR1cm4gdlxyXG4gIH1cclxufVxyXG4iLCJpbXBvcnQgeyBhY3Rpb24gfSBmcm9tIFwibW9ieFwiXHJcbmltcG9ydCB7XHJcbiAgQW55RGF0YU1vZGVsLFxyXG4gIEFueU1vZGVsLFxyXG4gIEFueVN0YW5kYXJkVHlwZSxcclxuICBNb2RlbENsYXNzLFxyXG4gIFBhdGNoLFxyXG4gIFR5cGVUb0RhdGEsXHJcbiAgYXBwbHlQYXRjaGVzLFxyXG4gIGZyb21TbmFwc2hvdCxcclxuICBnZXRQYXJlbnRUb0NoaWxkUGF0aCxcclxuICBvbkdsb2JhbFBhdGNoZXMsXHJcbiAgb25QYXRjaGVzLFxyXG4gIG9uU25hcHNob3QsXHJcbn0gZnJvbSBcIm1vYngta2V5c3RvbmVcIlxyXG5pbXBvcnQgKiBhcyBZIGZyb20gXCJ5anNcIlxyXG5pbXBvcnQgeyBnZXRPckNyZWF0ZVlqc0NvbGxlY3Rpb25BdG9tIH0gZnJvbSBcIi4uL3V0aWxzL2dldE9yQ3JlYXRlWWpzQ29sbGVjdGlvbkF0b21cIlxyXG5pbXBvcnQgeyBhcHBseU1vYnhLZXlzdG9uZVBhdGNoVG9ZanNPYmplY3QgfSBmcm9tIFwiLi9hcHBseU1vYnhLZXlzdG9uZVBhdGNoVG9ZanNPYmplY3RcIlxyXG5pbXBvcnQgeyBjb252ZXJ0WWpzRGF0YVRvSnNvbiB9IGZyb20gXCIuL2NvbnZlcnRZanNEYXRhVG9Kc29uXCJcclxuaW1wb3J0IHsgY29udmVydFlqc0V2ZW50VG9QYXRjaGVzIH0gZnJvbSBcIi4vY29udmVydFlqc0V2ZW50VG9QYXRjaGVzXCJcclxuaW1wb3J0IHsgWWpzQmluZGluZ0NvbnRleHQsIHlqc0JpbmRpbmdDb250ZXh0IH0gZnJvbSBcIi4veWpzQmluZGluZ0NvbnRleHRcIlxyXG5cclxuLyoqXHJcbiAqIENyZWF0ZXMgYSBiaWRpcmVjdGlvbmFsIGJpbmRpbmcgYmV0d2VlbiBhIFkuanMgZGF0YSBzdHJ1Y3R1cmUgYW5kIGEgbW9ieC1rZXlzdG9uZSBtb2RlbC5cclxuICovXHJcbmV4cG9ydCBmdW5jdGlvbiBiaW5kWWpzVG9Nb2J4S2V5c3RvbmU8XHJcbiAgVFR5cGUgZXh0ZW5kcyBBbnlTdGFuZGFyZFR5cGUgfCBNb2RlbENsYXNzPEFueU1vZGVsPiB8IE1vZGVsQ2xhc3M8QW55RGF0YU1vZGVsPixcclxuPih7XHJcbiAgeWpzRG9jLFxyXG4gIHlqc09iamVjdCxcclxuICBtb2J4S2V5c3RvbmVUeXBlLFxyXG59OiB7XHJcbiAgLyoqXHJcbiAgICogVGhlIFkuanMgZG9jdW1lbnQuXHJcbiAgICovXHJcbiAgeWpzRG9jOiBZLkRvY1xyXG4gIC8qKlxyXG4gICAqIFRoZSBib3VuZCBZLmpzIGRhdGEgc3RydWN0dXJlLlxyXG4gICAqL1xyXG4gIHlqc09iamVjdDogWS5NYXA8dW5rbm93bj4gfCBZLkFycmF5PHVua25vd24+IHwgWS5UZXh0XHJcbiAgLyoqXHJcbiAgICogVGhlIG1vYngta2V5c3RvbmUgbW9kZWwgdHlwZS5cclxuICAgKi9cclxuICBtb2J4S2V5c3RvbmVUeXBlOiBUVHlwZVxyXG59KToge1xyXG4gIC8qKlxyXG4gICAqIFRoZSBib3VuZCBtb2J4LWtleXN0b25lIGluc3RhbmNlLlxyXG4gICAqL1xyXG4gIGJvdW5kT2JqZWN0OiBUeXBlVG9EYXRhPFRUeXBlPlxyXG4gIC8qKlxyXG4gICAqIERpc3Bvc2VzIHRoZSBiaW5kaW5nLlxyXG4gICAqL1xyXG4gIGRpc3Bvc2UoKTogdm9pZFxyXG4gIC8qKlxyXG4gICAqIFRoZSBZLmpzIG9yaWdpbiBzeW1ib2wgdXNlZCBmb3IgYmluZGluZyB0cmFuc2FjdGlvbnMuXHJcbiAgICovXHJcbiAgeWpzT3JpZ2luOiBzeW1ib2xcclxufSB7XHJcbiAgY29uc3QgeWpzT3JpZ2luID0gU3ltYm9sKFwiYmluZFlqc1RvTW9ieEtleXN0b25lVHJhbnNhY3Rpb25PcmlnaW5cIilcclxuXHJcbiAgbGV0IGFwcGx5aW5nWWpzQ2hhbmdlc1RvTW9ieEtleXN0b25lID0gMFxyXG5cclxuICBjb25zdCBiaW5kaW5nQ29udGV4dDogWWpzQmluZGluZ0NvbnRleHQgPSB7XHJcbiAgICB5anNEb2MsXHJcbiAgICB5anNPYmplY3QsXHJcbiAgICBtb2J4S2V5c3RvbmVUeXBlLFxyXG4gICAgeWpzT3JpZ2luLFxyXG4gICAgYm91bmRPYmplY3Q6IHVuZGVmaW5lZCwgLy8gbm90IHlldCBjcmVhdGVkXHJcblxyXG4gICAgZ2V0IGlzQXBwbHlpbmdZanNDaGFuZ2VzVG9Nb2J4S2V5c3RvbmUoKSB7XHJcbiAgICAgIHJldHVybiBhcHBseWluZ1lqc0NoYW5nZXNUb01vYnhLZXlzdG9uZSA+IDBcclxuICAgIH0sXHJcbiAgfVxyXG5cclxuICBjb25zdCB5anNKc29uID0gY29udmVydFlqc0RhdGFUb0pzb24oeWpzT2JqZWN0KVxyXG5cclxuICBjb25zdCBpbml0aWFsaXphdGlvbkdsb2JhbFBhdGNoZXM6IHsgdGFyZ2V0OiBvYmplY3Q7IHBhdGNoZXM6IFBhdGNoW10gfVtdID0gW11cclxuXHJcbiAgY29uc3QgY3JlYXRlQm91bmRPYmplY3QgPSAoKSA9PiB7XHJcbiAgICBjb25zdCBkaXNwb3NlT25HbG9iYWxQYXRjaGVzID0gb25HbG9iYWxQYXRjaGVzKCh0YXJnZXQsIHBhdGNoZXMpID0+IHtcclxuICAgICAgaW5pdGlhbGl6YXRpb25HbG9iYWxQYXRjaGVzLnB1c2goeyB0YXJnZXQsIHBhdGNoZXMgfSlcclxuICAgIH0pXHJcblxyXG4gICAgdHJ5IHtcclxuICAgICAgY29uc3QgYm91bmRPYmplY3QgPSB5anNCaW5kaW5nQ29udGV4dC5hcHBseShcclxuICAgICAgICAoKSA9PiBmcm9tU25hcHNob3QobW9ieEtleXN0b25lVHlwZSwgeWpzSnNvbiBhcyBhbnkpLFxyXG4gICAgICAgIGJpbmRpbmdDb250ZXh0XHJcbiAgICAgIClcclxuICAgICAgeWpzQmluZGluZ0NvbnRleHQuc2V0KGJvdW5kT2JqZWN0LCB7IC4uLmJpbmRpbmdDb250ZXh0LCBib3VuZE9iamVjdCB9KVxyXG4gICAgICByZXR1cm4gYm91bmRPYmplY3RcclxuICAgIH0gZmluYWxseSB7XHJcbiAgICAgIGRpc3Bvc2VPbkdsb2JhbFBhdGNoZXMoKVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgY29uc3QgYm91bmRPYmplY3QgPSBjcmVhdGVCb3VuZE9iamVjdCgpXHJcblxyXG4gIC8vIGJpbmQgYW55IGNoYW5nZXMgZnJvbSB5anMgdG8gbW9ieC1rZXlzdG9uZVxyXG4gIGNvbnN0IG9ic2VydmVEZWVwQ2IgPSBhY3Rpb24oKGV2ZW50czogWS5ZRXZlbnQ8YW55PltdKSA9PiB7XHJcbiAgICBjb25zdCBwYXRjaGVzOiBQYXRjaFtdID0gW11cclxuICAgIGV2ZW50cy5mb3JFYWNoKChldmVudCkgPT4ge1xyXG4gICAgICBpZiAoZXZlbnQudHJhbnNhY3Rpb24ub3JpZ2luICE9PSB5anNPcmlnaW4pIHtcclxuICAgICAgICBwYXRjaGVzLnB1c2goLi4uY29udmVydFlqc0V2ZW50VG9QYXRjaGVzKGV2ZW50KSlcclxuICAgICAgfVxyXG5cclxuICAgICAgaWYgKGV2ZW50LnRhcmdldCBpbnN0YW5jZW9mIFkuTWFwIHx8IGV2ZW50LnRhcmdldCBpbnN0YW5jZW9mIFkuQXJyYXkpIHtcclxuICAgICAgICBnZXRPckNyZWF0ZVlqc0NvbGxlY3Rpb25BdG9tKGV2ZW50LnRhcmdldCkucmVwb3J0Q2hhbmdlZCgpXHJcbiAgICAgIH1cclxuICAgIH0pXHJcblxyXG4gICAgaWYgKHBhdGNoZXMubGVuZ3RoID4gMCkge1xyXG4gICAgICBhcHBseWluZ1lqc0NoYW5nZXNUb01vYnhLZXlzdG9uZSsrXHJcbiAgICAgIHRyeSB7XHJcbiAgICAgICAgYXBwbHlQYXRjaGVzKGJvdW5kT2JqZWN0LCBwYXRjaGVzKVxyXG4gICAgICB9IGZpbmFsbHkge1xyXG4gICAgICAgIGFwcGx5aW5nWWpzQ2hhbmdlc1RvTW9ieEtleXN0b25lLS1cclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH0pXHJcblxyXG4gIHlqc09iamVjdC5vYnNlcnZlRGVlcChvYnNlcnZlRGVlcENiKVxyXG5cclxuICAvLyBiaW5kIGFueSBjaGFuZ2VzIGZyb20gbW9ieC1rZXlzdG9uZSB0byB5anNcclxuICBsZXQgcGVuZGluZ0FycmF5T2ZBcnJheU9mUGF0Y2hlczogUGF0Y2hbXVtdID0gW11cclxuICBjb25zdCBkaXNwb3NlT25QYXRjaGVzID0gb25QYXRjaGVzKGJvdW5kT2JqZWN0LCAocGF0Y2hlcykgPT4ge1xyXG4gICAgaWYgKGFwcGx5aW5nWWpzQ2hhbmdlc1RvTW9ieEtleXN0b25lID4gMCkge1xyXG4gICAgICByZXR1cm5cclxuICAgIH1cclxuXHJcbiAgICBwZW5kaW5nQXJyYXlPZkFycmF5T2ZQYXRjaGVzLnB1c2gocGF0Y2hlcylcclxuICB9KVxyXG5cclxuICAvLyB0aGlzIGlzIG9ubHkgdXNlZCBzbyB3ZSBjYW4gdHJhbnNhY3QgYWxsIHBhdGNoZXMgdG8gdGhlIHNuYXBzaG90IGJvdW5kYXJ5XHJcbiAgY29uc3QgZGlzcG9zZU9uU25hcHNob3QgPSBvblNuYXBzaG90KGJvdW5kT2JqZWN0LCAoKSA9PiB7XHJcbiAgICBpZiAocGVuZGluZ0FycmF5T2ZBcnJheU9mUGF0Y2hlcy5sZW5ndGggPT09IDApIHtcclxuICAgICAgcmV0dXJuXHJcbiAgICB9XHJcblxyXG4gICAgY29uc3QgYXJyYXlPZkFycmF5T2ZQYXRjaGVzID0gcGVuZGluZ0FycmF5T2ZBcnJheU9mUGF0Y2hlc1xyXG4gICAgcGVuZGluZ0FycmF5T2ZBcnJheU9mUGF0Y2hlcyA9IFtdXHJcblxyXG4gICAgeWpzRG9jLnRyYW5zYWN0KCgpID0+IHtcclxuICAgICAgYXJyYXlPZkFycmF5T2ZQYXRjaGVzLmZvckVhY2goKGFycmF5T2ZQYXRjaGVzKSA9PiB7XHJcbiAgICAgICAgYXJyYXlPZlBhdGNoZXMuZm9yRWFjaCgocGF0Y2gpID0+IHtcclxuICAgICAgICAgIGFwcGx5TW9ieEtleXN0b25lUGF0Y2hUb1lqc09iamVjdChwYXRjaCwgeWpzT2JqZWN0KVxyXG4gICAgICAgIH0pXHJcbiAgICAgIH0pXHJcbiAgICB9LCB5anNPcmlnaW4pXHJcbiAgfSlcclxuXHJcbiAgLy8gc3luYyBpbml0aWFsIHBhdGNoZXMsIHRoYXQgbWlnaHQgaW5jbHVkZSBzZXR0aW5nIGRlZmF1bHRzLCBJRHMsIGV0Y1xyXG4gIHlqc0RvYy50cmFuc2FjdCgoKSA9PiB7XHJcbiAgICAvLyB3ZSBuZWVkIHRvIHNraXAgaW5pdGlhbGl6YXRpb25zIHVudGlsIHdlIGhpdCB0aGUgaW5pdGlhbGl6YXRpb24gb2YgdGhlIGJvdW5kIG9iamVjdFxyXG4gICAgLy8gdGhpcyBpcyBiZWNhdXNlIGRlZmF1bHQgb2JqZWN0cyBtaWdodCBiZSBjcmVhdGVkIGFuZCBpbml0aWFsaXplZCBiZWZvcmUgdGhlIG1haW4gb2JqZWN0XHJcbiAgICAvLyBidXQgd2UganVzdCBuZWVkIHRvIGNhdGNoIHdoZW4gdGhvc2UgYXJlIGFjdHVhbGx5IGFzc2lnbmVkIHRvIHRoZSBib3VuZCBvYmplY3RcclxuICAgIGxldCBib3VuZE9iamVjdEZvdW5kID0gZmFsc2VcclxuXHJcbiAgICBpbml0aWFsaXphdGlvbkdsb2JhbFBhdGNoZXMuZm9yRWFjaCgoeyB0YXJnZXQsIHBhdGNoZXMgfSkgPT4ge1xyXG4gICAgICBpZiAoIWJvdW5kT2JqZWN0Rm91bmQpIHtcclxuICAgICAgICBpZiAodGFyZ2V0ICE9PSBib3VuZE9iamVjdCkge1xyXG4gICAgICAgICAgcmV0dXJuIC8vIHNraXBcclxuICAgICAgICB9XHJcbiAgICAgICAgYm91bmRPYmplY3RGb3VuZCA9IHRydWVcclxuICAgICAgfVxyXG5cclxuICAgICAgY29uc3QgcGFyZW50VG9DaGlsZFBhdGggPSBnZXRQYXJlbnRUb0NoaWxkUGF0aChib3VuZE9iamVjdCwgdGFyZ2V0KVxyXG4gICAgICAvLyB0aGlzIGlzIHVuZGVmaW5lZCBvbmx5IGlmIHRhcmdldCBpcyBub3QgYSBjaGlsZCBvZiBib3VuZE1vZGVsXHJcbiAgICAgIGlmIChwYXJlbnRUb0NoaWxkUGF0aCAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgcGF0Y2hlcy5mb3JFYWNoKChwYXRjaCkgPT4ge1xyXG4gICAgICAgICAgYXBwbHlNb2J4S2V5c3RvbmVQYXRjaFRvWWpzT2JqZWN0KFxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgLi4ucGF0Y2gsXHJcbiAgICAgICAgICAgICAgcGF0aDogWy4uLnBhcmVudFRvQ2hpbGRQYXRoLCAuLi5wYXRjaC5wYXRoXSxcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgeWpzT2JqZWN0XHJcbiAgICAgICAgICApXHJcbiAgICAgICAgfSlcclxuICAgICAgfVxyXG4gICAgfSlcclxuICB9LCB5anNPcmlnaW4pXHJcblxyXG4gIHJldHVybiB7XHJcbiAgICBib3VuZE9iamVjdCxcclxuICAgIGRpc3Bvc2U6ICgpID0+IHtcclxuICAgICAgZGlzcG9zZU9uUGF0Y2hlcygpXHJcbiAgICAgIGRpc3Bvc2VPblNuYXBzaG90KClcclxuICAgICAgeWpzT2JqZWN0LnVub2JzZXJ2ZURlZXAob2JzZXJ2ZURlZXBDYilcclxuICAgIH0sXHJcbiAgICB5anNPcmlnaW4sXHJcbiAgfVxyXG59XHJcbiJdLCJuYW1lcyI6WyJZanNUZXh0TW9kZWwiLCJib3VuZE9iamVjdCJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFHTSxN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
|