mobx-keystone-yjs 1.0.0 → 1.2.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 +13 -5
- package/dist/mobx-keystone-yjs.esm.js +38 -24
- package/dist/mobx-keystone-yjs.esm.mjs +38 -24
- package/dist/mobx-keystone-yjs.umd.js +36 -22
- package/dist/types/binding/convertJsonToYjsData.d.ts +5 -0
- package/dist/types/binding/yjsBindingContext.d.ts +9 -0
- package/dist/types/index.d.ts +4 -1
- package/dist/types/jsonTypes.d.ts +5 -5
- package/package.json +87 -87
- package/src/binding/applyMobxKeystonePatchToYjsObject.ts +92 -92
- package/src/binding/bindYjsToMobxKeystone.ts +156 -142
- package/src/binding/convertJsonToYjsData.ts +45 -0
- package/src/binding/convertYjsEventToPatches.ts +85 -85
- package/src/binding/yjsBindingContext.ts +11 -0
- package/src/index.ts +9 -2
- package/src/jsonTypes.ts +4 -4
- package/dist/types/binding/toYDataType.d.ts +0 -3
- package/src/binding/toYDataType.ts +0 -41
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,13 @@
|
|
|
1
|
-
# Change Log
|
|
2
|
-
|
|
3
|
-
## 1.
|
|
4
|
-
|
|
5
|
-
-
|
|
1
|
+
# Change Log
|
|
2
|
+
|
|
3
|
+
## 1.2.0
|
|
4
|
+
|
|
5
|
+
- Added `yjsBindingContext` so bound objects offer a context with the Y.js doc, bound object, etc.
|
|
6
|
+
|
|
7
|
+
## 1.1.0
|
|
8
|
+
|
|
9
|
+
- Added the `convertJsonToYjsData`, `applyJsonArrayToYArray` and `applyJsonObjectToYMap` function to help with first migrations from snapshots to Y.js states.
|
|
10
|
+
|
|
11
|
+
## 1.0.0
|
|
12
|
+
|
|
13
|
+
- First public release.
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { onPatches, onSnapshot, getParentToChildPath, onGlobalPatches, fromSnapshot, applyPatches } from "mobx-keystone";
|
|
1
|
+
import { createContext, onPatches, onSnapshot, getParentToChildPath, onGlobalPatches, fromSnapshot, applyPatches } from "mobx-keystone";
|
|
2
2
|
import * as Y from "yjs";
|
|
3
3
|
class MobxKeystoneYjsError extends Error {
|
|
4
4
|
constructor(msg) {
|
|
@@ -9,37 +9,38 @@ class MobxKeystoneYjsError extends Error {
|
|
|
9
9
|
function failure(msg) {
|
|
10
10
|
return new MobxKeystoneYjsError(msg);
|
|
11
11
|
}
|
|
12
|
-
function
|
|
12
|
+
function isJsonPrimitive(v) {
|
|
13
13
|
const t = typeof v;
|
|
14
14
|
return t === "string" || t === "number" || t === "boolean" || v === null;
|
|
15
15
|
}
|
|
16
|
-
function
|
|
16
|
+
function isJsonArray(v) {
|
|
17
17
|
return Array.isArray(v);
|
|
18
18
|
}
|
|
19
|
-
function
|
|
20
|
-
return !
|
|
19
|
+
function isJsonObject(v) {
|
|
20
|
+
return !isJsonArray(v) && typeof v === "object";
|
|
21
21
|
}
|
|
22
|
-
function
|
|
23
|
-
if (
|
|
22
|
+
function convertJsonToYjsData(v) {
|
|
23
|
+
if (v === void 0 || isJsonPrimitive(v)) {
|
|
24
24
|
return v;
|
|
25
|
-
}
|
|
25
|
+
}
|
|
26
|
+
if (isJsonArray(v)) {
|
|
26
27
|
const arr = new Y.Array();
|
|
27
|
-
|
|
28
|
+
applyJsonArrayYArray(arr, v);
|
|
28
29
|
return arr;
|
|
29
|
-
}
|
|
30
|
+
}
|
|
31
|
+
if (isJsonObject(v)) {
|
|
30
32
|
const map = new Y.Map();
|
|
31
|
-
|
|
33
|
+
applyJsonObjectToYMap(map, v);
|
|
32
34
|
return map;
|
|
33
|
-
} else {
|
|
34
|
-
return void 0;
|
|
35
35
|
}
|
|
36
|
+
throw new Error(`unsupported value type: ${v}`);
|
|
36
37
|
}
|
|
37
|
-
function
|
|
38
|
-
dest.push(source.map(
|
|
38
|
+
function applyJsonArrayYArray(dest, source) {
|
|
39
|
+
dest.push(source.map(convertJsonToYjsData));
|
|
39
40
|
}
|
|
40
|
-
function
|
|
41
|
+
function applyJsonObjectToYMap(dest, source) {
|
|
41
42
|
Object.entries(source).forEach(([k, v]) => {
|
|
42
|
-
dest.set(k,
|
|
43
|
+
dest.set(k, convertJsonToYjsData(v));
|
|
43
44
|
});
|
|
44
45
|
}
|
|
45
46
|
function applyMobxKeystonePatchToYjsObject(patch, yjs) {
|
|
@@ -66,7 +67,7 @@ function applyMobxKeystonePatchToYjsObject(patch, yjs) {
|
|
|
66
67
|
switch (patch.op) {
|
|
67
68
|
case "add":
|
|
68
69
|
case "replace": {
|
|
69
|
-
yjs.set(key,
|
|
70
|
+
yjs.set(key, convertJsonToYjsData(patch.value));
|
|
70
71
|
break;
|
|
71
72
|
}
|
|
72
73
|
case "remove": {
|
|
@@ -91,12 +92,12 @@ function applyMobxKeystonePatchToYjsObject(patch, yjs) {
|
|
|
91
92
|
}
|
|
92
93
|
} else {
|
|
93
94
|
yjs.delete(Number(key));
|
|
94
|
-
yjs.insert(Number(key), [
|
|
95
|
+
yjs.insert(Number(key), [convertJsonToYjsData(patch.value)]);
|
|
95
96
|
}
|
|
96
97
|
break;
|
|
97
98
|
}
|
|
98
99
|
case "add": {
|
|
99
|
-
yjs.insert(Number(key), [
|
|
100
|
+
yjs.insert(Number(key), [convertJsonToYjsData(patch.value)]);
|
|
100
101
|
break;
|
|
101
102
|
}
|
|
102
103
|
case "remove": {
|
|
@@ -183,7 +184,15 @@ function toPlainValue(v) {
|
|
|
183
184
|
return v;
|
|
184
185
|
}
|
|
185
186
|
}
|
|
187
|
+
const yjsBindingContext = createContext(void 0);
|
|
186
188
|
function bindYjsToMobxKeystone({ yjsDoc, yjsObject, mobxKeystoneType }) {
|
|
189
|
+
const yjsOrigin = Symbol("bindYjsToMobxKeystoneTransactionOrigin");
|
|
190
|
+
const bindingContext = {
|
|
191
|
+
yjsDoc,
|
|
192
|
+
yjsObject,
|
|
193
|
+
mobxKeystoneType,
|
|
194
|
+
yjsOrigin
|
|
195
|
+
};
|
|
187
196
|
const yjsJson = yjsObject.toJSON();
|
|
188
197
|
const initializationGlobalPatches = [];
|
|
189
198
|
const createBoundObject = () => {
|
|
@@ -191,14 +200,15 @@ function bindYjsToMobxKeystone({ yjsDoc, yjsObject, mobxKeystoneType }) {
|
|
|
191
200
|
initializationGlobalPatches.push({ target, patches });
|
|
192
201
|
});
|
|
193
202
|
try {
|
|
194
|
-
|
|
203
|
+
const boundObject2 = yjsBindingContext.apply(() => fromSnapshot(mobxKeystoneType, yjsJson), bindingContext);
|
|
204
|
+
yjsBindingContext.set(boundObject2, bindingContext);
|
|
205
|
+
return boundObject2;
|
|
195
206
|
} finally {
|
|
196
207
|
disposeOnGlobalPatches();
|
|
197
208
|
}
|
|
198
209
|
};
|
|
199
210
|
const boundObject = createBoundObject();
|
|
200
211
|
let applyingMobxKeystoneChanges = 0;
|
|
201
|
-
const yjsOrigin = Symbol("bindYjsToMobxKeystoneTransactionOrigin");
|
|
202
212
|
const observeDeepCb = (events) => {
|
|
203
213
|
const patches = [];
|
|
204
214
|
events.forEach((event) => {
|
|
@@ -267,6 +277,10 @@ function bindYjsToMobxKeystone({ yjsDoc, yjsObject, mobxKeystoneType }) {
|
|
|
267
277
|
}
|
|
268
278
|
export {
|
|
269
279
|
MobxKeystoneYjsError,
|
|
270
|
-
|
|
280
|
+
applyJsonArrayYArray,
|
|
281
|
+
applyJsonObjectToYMap,
|
|
282
|
+
bindYjsToMobxKeystone,
|
|
283
|
+
convertJsonToYjsData,
|
|
284
|
+
yjsBindingContext
|
|
271
285
|
};
|
|
272
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibW9ieC1rZXlzdG9uZS15anMuZXNtLm1qcyIsInNvdXJjZXMiOlsiLi4vc3JjL3V0aWxzL2Vycm9yLnRzIiwiLi4vc3JjL2JpbmRpbmcvdG9ZRGF0YVR5cGUudHMiLCIuLi9zcmMvYmluZGluZy9hcHBseU1vYnhLZXlzdG9uZVBhdGNoVG9ZanNPYmplY3QudHMiLCIuLi9zcmMvYmluZGluZy9jb252ZXJ0WWpzRXZlbnRUb1BhdGNoZXMudHMiLCIuLi9zcmMvYmluZGluZy9iaW5kWWpzVG9Nb2J4S2V5c3RvbmUudHMiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqXHJcbiAqIEEgbW9ieC1rZXlzdG9uZS15anMgZXJyb3IuXHJcbiAqL1xyXG5leHBvcnQgY2xhc3MgTW9ieEtleXN0b25lWWpzRXJyb3IgZXh0ZW5kcyBFcnJvciB7XHJcbiAgY29uc3RydWN0b3IobXNnOiBzdHJpbmcpIHtcclxuICAgIHN1cGVyKG1zZylcclxuXHJcbiAgICAvLyBTZXQgdGhlIHByb3RvdHlwZSBleHBsaWNpdGx5LlxyXG4gICAgT2JqZWN0LnNldFByb3RvdHlwZU9mKHRoaXMsIE1vYnhLZXlzdG9uZVlqc0Vycm9yLnByb3RvdHlwZSlcclxuICB9XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBAaW50ZXJuYWxcclxuICovXHJcbmV4cG9ydCBmdW5jdGlvbiBmYWlsdXJlKG1zZzogc3RyaW5nKSB7XHJcbiAgcmV0dXJuIG5ldyBNb2J4S2V5c3RvbmVZanNFcnJvcihtc2cpXHJcbn1cclxuIiwiaW1wb3J0ICogYXMgWSBmcm9tIFwieWpzXCJcclxuaW1wb3J0IHsgSlNPTlZhbHVlLCBKU09OQXJyYXksIEpTT05PYmplY3QsIEpTT05QcmltaXRpdmUgfSBmcm9tIFwiLi4vanNvblR5cGVzXCJcclxuXHJcbmZ1bmN0aW9uIGlzSlNPTlByaW1pdGl2ZSh2OiBKU09OVmFsdWUpOiB2IGlzIEpTT05QcmltaXRpdmUge1xyXG4gIGNvbnN0IHQgPSB0eXBlb2YgdlxyXG4gIHJldHVybiB0ID09PSBcInN0cmluZ1wiIHx8IHQgPT09IFwibnVtYmVyXCIgfHwgdCA9PT0gXCJib29sZWFuXCIgfHwgdiA9PT0gbnVsbFxyXG59XHJcblxyXG5mdW5jdGlvbiBpc0pTT05BcnJheSh2OiBKU09OVmFsdWUpOiB2IGlzIEpTT05BcnJheSB7XHJcbiAgcmV0dXJuIEFycmF5LmlzQXJyYXkodilcclxufVxyXG5cclxuZnVuY3Rpb24gaXNKU09OT2JqZWN0KHY6IEpTT05WYWx1ZSk6IHYgaXMgSlNPTk9iamVjdCB7XHJcbiAgcmV0dXJuICFpc0pTT05BcnJheSh2KSAmJiB0eXBlb2YgdiA9PT0gXCJvYmplY3RcIlxyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gdG9ZRGF0YVR5cGUodjogSlNPTlZhbHVlKSB7XHJcbiAgaWYgKGlzSlNPTlByaW1pdGl2ZSh2KSkge1xyXG4gICAgcmV0dXJuIHZcclxuICB9IGVsc2UgaWYgKGlzSlNPTkFycmF5KHYpKSB7XHJcbiAgICBjb25zdCBhcnIgPSBuZXcgWS5BcnJheSgpXHJcbiAgICBhcHBseUpzb25BcnJheShhcnIsIHYpXHJcbiAgICByZXR1cm4gYXJyXHJcbiAgfSBlbHNlIGlmIChpc0pTT05PYmplY3QodikpIHtcclxuICAgIGNvbnN0IG1hcCA9IG5ldyBZLk1hcCgpXHJcbiAgICBhcHBseUpzb25PYmplY3QobWFwLCB2KVxyXG4gICAgcmV0dXJuIG1hcFxyXG4gIH0gZWxzZSB7XHJcbiAgICByZXR1cm4gdW5kZWZpbmVkXHJcbiAgfVxyXG59XHJcblxyXG5mdW5jdGlvbiBhcHBseUpzb25BcnJheShkZXN0OiBZLkFycmF5PHVua25vd24+LCBzb3VyY2U6IEpTT05BcnJheSkge1xyXG4gIGRlc3QucHVzaChzb3VyY2UubWFwKHRvWURhdGFUeXBlKSlcclxufVxyXG5cclxuZnVuY3Rpb24gYXBwbHlKc29uT2JqZWN0KGRlc3Q6IFkuTWFwPHVua25vd24+LCBzb3VyY2U6IEpTT05PYmplY3QpIHtcclxuICBPYmplY3QuZW50cmllcyhzb3VyY2UpLmZvckVhY2goKFtrLCB2XSkgPT4ge1xyXG4gICAgZGVzdC5zZXQoaywgdG9ZRGF0YVR5cGUodikpXHJcbiAgfSlcclxufVxyXG4iLCJpbXBvcnQgeyBQYXRjaCB9IGZyb20gXCJtb2J4LWtleXN0b25lXCJcclxuaW1wb3J0IHsgZmFpbHVyZSB9IGZyb20gXCIuLi91dGlscy9lcnJvclwiXHJcbmltcG9ydCAqIGFzIFkgZnJvbSBcInlqc1wiXHJcbmltcG9ydCB7IHRvWURhdGFUeXBlIH0gZnJvbSBcIi4vdG9ZRGF0YVR5cGVcIlxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGFwcGx5TW9ieEtleXN0b25lUGF0Y2hUb1lqc09iamVjdChwYXRjaDogUGF0Y2gsIHlqczogdW5rbm93bik6IHZvaWQge1xyXG4gIGlmIChwYXRjaC5wYXRoLmxlbmd0aCA+IDEpIHtcclxuICAgIGNvbnN0IFtrZXksIC4uLnJlc3RdID0gcGF0Y2gucGF0aFxyXG5cclxuICAgIGlmICh5anMgaW5zdGFuY2VvZiBZLk1hcCkge1xyXG4gICAgICBjb25zdCBjaGlsZCA9IHlqcy5nZXQoU3RyaW5nKGtleSkpXHJcbiAgICAgIGlmIChjaGlsZCA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgdGhyb3cgZmFpbHVyZShcclxuICAgICAgICAgIGBpbnZhbGlkIHBhdGNoIHBhdGgsIGtleSBcIiR7a2V5fVwiIG5vdCBmb3VuZCBpbiBZanMgbWFwIC0gcGF0Y2g6ICR7SlNPTi5zdHJpbmdpZnkocGF0Y2gpfWBcclxuICAgICAgICApXHJcbiAgICAgIH1cclxuICAgICAgYXBwbHlNb2J4S2V5c3RvbmVQYXRjaFRvWWpzT2JqZWN0KHsgLi4ucGF0Y2gsIHBhdGg6IHJlc3QgfSwgY2hpbGQpXHJcbiAgICB9IGVsc2UgaWYgKHlqcyBpbnN0YW5jZW9mIFkuQXJyYXkpIHtcclxuICAgICAgY29uc3QgY2hpbGQgPSB5anMuZ2V0KE51bWJlcihrZXkpKVxyXG4gICAgICBpZiAoY2hpbGQgPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgIHRocm93IGZhaWx1cmUoXHJcbiAgICAgICAgICBgaW52YWxpZCBwYXRjaCBwYXRoLCBrZXkgXCIke2tleX1cIiBub3QgZm91bmQgaW4gWWpzIGFycmF5IC0gcGF0Y2g6ICR7SlNPTi5zdHJpbmdpZnkoXHJcbiAgICAgICAgICAgIHBhdGNoXHJcbiAgICAgICAgICApfWBcclxuICAgICAgICApXHJcbiAgICAgIH1cclxuICAgICAgYXBwbHlNb2J4S2V5c3RvbmVQYXRjaFRvWWpzT2JqZWN0KHsgLi4ucGF0Y2gsIHBhdGg6IHJlc3QgfSwgY2hpbGQpXHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aHJvdyBmYWlsdXJlKFxyXG4gICAgICAgIGBpbnZhbGlkIHBhdGNoIHBhdGgsIGtleSBcIiR7a2V5fVwiIG5vdCBmb3VuZCBpbiB1bmtub3duIFlqcyBvYmplY3QgLSBwYXRjaDogJHtKU09OLnN0cmluZ2lmeShcclxuICAgICAgICAgIHBhdGNoXHJcbiAgICAgICAgKX1gXHJcbiAgICAgIClcclxuICAgIH1cclxuICB9IGVsc2UgaWYgKHBhdGNoLnBhdGgubGVuZ3RoID09PSAxKSB7XHJcbiAgICBpZiAoeWpzIGluc3RhbmNlb2YgWS5NYXApIHtcclxuICAgICAgY29uc3Qga2V5ID0gU3RyaW5nKHBhdGNoLnBhdGhbMF0pXHJcblxyXG4gICAgICBzd2l0Y2ggKHBhdGNoLm9wKSB7XHJcbiAgICAgICAgY2FzZSBcImFkZFwiOlxyXG4gICAgICAgIGNhc2UgXCJyZXBsYWNlXCI6IHtcclxuICAgICAgICAgIHlqcy5zZXQoa2V5LCB0b1lEYXRhVHlwZShwYXRjaC52YWx1ZSkpXHJcbiAgICAgICAgICBicmVha1xyXG4gICAgICAgIH1cclxuICAgICAgICBjYXNlIFwicmVtb3ZlXCI6IHtcclxuICAgICAgICAgIHlqcy5kZWxldGUoa2V5KVxyXG4gICAgICAgICAgYnJlYWtcclxuICAgICAgICB9XHJcbiAgICAgICAgZGVmYXVsdDoge1xyXG4gICAgICAgICAgdGhyb3cgZmFpbHVyZShgaW52YWxpZCBwYXRjaCBvcGVyYXRpb24gZm9yIG1hcGApXHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9IGVsc2UgaWYgKHlqcyBpbnN0YW5jZW9mIFkuQXJyYXkpIHtcclxuICAgICAgY29uc3Qga2V5ID0gcGF0Y2gucGF0aFswXVxyXG5cclxuICAgICAgc3dpdGNoIChwYXRjaC5vcCkge1xyXG4gICAgICAgIGNhc2UgXCJyZXBsYWNlXCI6IHtcclxuICAgICAgICAgIGlmIChrZXkgPT09IFwibGVuZ3RoXCIpIHtcclxuICAgICAgICAgICAgaWYgKHlqcy5sZW5ndGggPiBwYXRjaC52YWx1ZSkge1xyXG4gICAgICAgICAgICAgIGNvbnN0IHRvRGVsZXRlID0geWpzLmxlbmd0aCAtIHBhdGNoLnZhbHVlXHJcbiAgICAgICAgICAgICAgeWpzLmRlbGV0ZShwYXRjaC52YWx1ZSwgdG9EZWxldGUpXHJcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoeWpzLmxlbmd0aCA8IHBhdGNoLnZhbHVlKSB7XHJcbiAgICAgICAgICAgICAgY29uc3QgdG9JbnNlcnQgPSBwYXRjaC52YWx1ZSAtIHlqcy5sZW5ndGhcclxuICAgICAgICAgICAgICB5anMuaW5zZXJ0KHlqcy5sZW5ndGgsIEFycmF5KHRvSW5zZXJ0KS5maWxsKHVuZGVmaW5lZCkpXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHlqcy5kZWxldGUoTnVtYmVyKGtleSkpXHJcbiAgICAgICAgICAgIHlqcy5pbnNlcnQoTnVtYmVyKGtleSksIFt0b1lEYXRhVHlwZShwYXRjaC52YWx1ZSldKVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgYnJlYWtcclxuICAgICAgICB9XHJcbiAgICAgICAgY2FzZSBcImFkZFwiOiB7XHJcbiAgICAgICAgICB5anMuaW5zZXJ0KE51bWJlcihrZXkpLCBbdG9ZRGF0YVR5cGUocGF0Y2gudmFsdWUpXSlcclxuICAgICAgICAgIGJyZWFrXHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNhc2UgXCJyZW1vdmVcIjoge1xyXG4gICAgICAgICAgeWpzLmRlbGV0ZShOdW1iZXIoa2V5KSlcclxuICAgICAgICAgIGJyZWFrXHJcbiAgICAgICAgfVxyXG4gICAgICAgIGRlZmF1bHQ6IHtcclxuICAgICAgICAgIHRocm93IGZhaWx1cmUoYGludmFsaWQgcGF0Y2ggb3BlcmF0aW9uIGZvciBhcnJheWApXHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aHJvdyBmYWlsdXJlKFxyXG4gICAgICAgIGBpbnZhbGlkIHBhdGNoIHBhdGgsIHRoZSBZanMgb2JqZWN0IGlzIG9mIGFuIHVua293biB0eXBlLCBzbyBrZXkgXCIke3BhdGNoLnBhdGhbMF19XCIgY2Fubm90IGJlIGZvdW5kIGluIGl0YFxyXG4gICAgICApXHJcbiAgICB9XHJcbiAgfSBlbHNlIHtcclxuICAgIHRocm93IGZhaWx1cmUoYGludmFsaWQgcGF0Y2ggcGF0aCwgaXQgY2Fubm90IGJlIGVtcHR5YClcclxuICB9XHJcbn1cclxuIiwiaW1wb3J0IHsgUGF0Y2ggfSBmcm9tIFwibW9ieC1rZXlzdG9uZVwiXHJcbmltcG9ydCAqIGFzIFkgZnJvbSBcInlqc1wiXHJcbmltcG9ydCB7IEpTT05BcnJheSwgSlNPTk9iamVjdCwgSlNPTlZhbHVlIH0gZnJvbSBcIi4uL2pzb25UeXBlc1wiXHJcbmltcG9ydCB7IGZhaWx1cmUgfSBmcm9tIFwiLi4vdXRpbHMvZXJyb3JcIlxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGNvbnZlcnRZanNFdmVudFRvUGF0Y2hlcyhldmVudDogWS5ZRXZlbnQ8YW55Pik6IFBhdGNoW10ge1xyXG4gIGNvbnN0IHBhdGNoZXM6IFBhdGNoW10gPSBbXVxyXG5cclxuICBpZiAoZXZlbnQgaW5zdGFuY2VvZiBZLllNYXBFdmVudCkge1xyXG4gICAgY29uc3Qgc291cmNlID0gZXZlbnQudGFyZ2V0IGFzIFkuTWFwPGFueT5cclxuXHJcbiAgICBldmVudC5jaGFuZ2VzLmtleXMuZm9yRWFjaCgoY2hhbmdlLCBrZXkpID0+IHtcclxuICAgICAgY29uc3QgcGF0aCA9IFsuLi5ldmVudC5wYXRoLCBrZXldXHJcblxyXG4gICAgICBzd2l0Y2ggKGNoYW5nZS5hY3Rpb24pIHtcclxuICAgICAgICBjYXNlIFwiYWRkXCI6XHJcbiAgICAgICAgICBwYXRjaGVzLnB1c2goe1xyXG4gICAgICAgICAgICBvcDogXCJhZGRcIixcclxuICAgICAgICAgICAgcGF0aCxcclxuICAgICAgICAgICAgdmFsdWU6IHRvUGxhaW5WYWx1ZShzb3VyY2UuZ2V0KGtleSkpLFxyXG4gICAgICAgICAgfSlcclxuICAgICAgICAgIGJyZWFrXHJcblxyXG4gICAgICAgIGNhc2UgXCJ1cGRhdGVcIjpcclxuICAgICAgICAgIHBhdGNoZXMucHVzaCh7XHJcbiAgICAgICAgICAgIG9wOiBcInJlcGxhY2VcIixcclxuICAgICAgICAgICAgcGF0aCxcclxuICAgICAgICAgICAgdmFsdWU6IHRvUGxhaW5WYWx1ZShzb3VyY2UuZ2V0KGtleSkpLFxyXG4gICAgICAgICAgfSlcclxuICAgICAgICAgIGJyZWFrXHJcblxyXG4gICAgICAgIGNhc2UgXCJkZWxldGVcIjpcclxuICAgICAgICAgIHBhdGNoZXMucHVzaCh7XHJcbiAgICAgICAgICAgIG9wOiBcInJlbW92ZVwiLFxyXG4gICAgICAgICAgICBwYXRoLFxyXG4gICAgICAgICAgfSlcclxuICAgICAgICAgIGJyZWFrXHJcblxyXG4gICAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgICB0aHJvdyBmYWlsdXJlKGB1bnN1cHBvcnRlZCBZanMgbWFwIGV2ZW50IGFjdGlvbjogJHtjaGFuZ2UuYWN0aW9ufWApXHJcbiAgICAgIH1cclxuICAgIH0pXHJcbiAgfSBlbHNlIGlmIChldmVudCBpbnN0YW5jZW9mIFkuWUFycmF5RXZlbnQpIHtcclxuICAgIGxldCByZXRhaW4gPSAwXHJcbiAgICBldmVudC5jaGFuZ2VzLmRlbHRhLmZvckVhY2goKGNoYW5nZSkgPT4ge1xyXG4gICAgICBpZiAoY2hhbmdlLnJldGFpbikge1xyXG4gICAgICAgIHJldGFpbiArPSBjaGFuZ2UucmV0YWluXHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGlmIChjaGFuZ2UuZGVsZXRlKSB7XHJcbiAgICAgICAgLy8gcmVtb3ZlIFggaXRlbXMgYXQgcmV0YWluIHBvc2l0aW9uXHJcbiAgICAgICAgY29uc3QgcGF0aCA9IFsuLi5ldmVudC5wYXRoLCByZXRhaW5dXHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjaGFuZ2UuZGVsZXRlOyBpKyspIHtcclxuICAgICAgICAgIHBhdGNoZXMucHVzaCh7XHJcbiAgICAgICAgICAgIG9wOiBcInJlbW92ZVwiLFxyXG4gICAgICAgICAgICBwYXRoLFxyXG4gICAgICAgICAgfSlcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGlmIChjaGFuZ2UuaW5zZXJ0KSB7XHJcbiAgICAgICAgY29uc3QgbmV3VmFsdWVzID0gQXJyYXkuaXNBcnJheShjaGFuZ2UuaW5zZXJ0KSA/IGNoYW5nZS5pbnNlcnQgOiBbY2hhbmdlLmluc2VydF1cclxuICAgICAgICBuZXdWYWx1ZXMuZm9yRWFjaCgodikgPT4ge1xyXG4gICAgICAgICAgY29uc3QgcGF0aCA9IFsuLi5ldmVudC5wYXRoLCByZXRhaW5dXHJcbiAgICAgICAgICBwYXRjaGVzLnB1c2goe1xyXG4gICAgICAgICAgICBvcDogXCJhZGRcIixcclxuICAgICAgICAgICAgcGF0aCxcclxuICAgICAgICAgICAgdmFsdWU6IHRvUGxhaW5WYWx1ZSh2KSxcclxuICAgICAgICAgIH0pXHJcbiAgICAgICAgICByZXRhaW4rK1xyXG4gICAgICAgIH0pXHJcbiAgICAgIH1cclxuICAgIH0pXHJcbiAgfVxyXG5cclxuICByZXR1cm4gcGF0Y2hlc1xyXG59XHJcblxyXG5mdW5jdGlvbiB0b1BsYWluVmFsdWUodjogWS5NYXA8YW55PiB8IFkuQXJyYXk8YW55PiB8IEpTT05WYWx1ZSkge1xyXG4gIGlmICh2IGluc3RhbmNlb2YgWS5NYXAgfHwgdiBpbnN0YW5jZW9mIFkuQXJyYXkpIHtcclxuICAgIHJldHVybiB2LnRvSlNPTigpIGFzIEpTT05PYmplY3QgfCBKU09OQXJyYXlcclxuICB9IGVsc2Uge1xyXG4gICAgcmV0dXJuIHZcclxuICB9XHJcbn1cclxuIiwiaW1wb3J0IHtcclxuICBBbnlEYXRhTW9kZWwsXHJcbiAgQW55TW9kZWwsXHJcbiAgQW55U3RhbmRhcmRUeXBlLFxyXG4gIE1vZGVsQ2xhc3MsXHJcbiAgUGF0Y2gsXHJcbiAgVHlwZVRvRGF0YSxcclxuICBhcHBseVBhdGNoZXMsXHJcbiAgZnJvbVNuYXBzaG90LFxyXG4gIGdldFBhcmVudFRvQ2hpbGRQYXRoLFxyXG4gIG9uR2xvYmFsUGF0Y2hlcyxcclxuICBvblBhdGNoZXMsXHJcbiAgb25TbmFwc2hvdCxcclxufSBmcm9tIFwibW9ieC1rZXlzdG9uZVwiXHJcbmltcG9ydCAqIGFzIFkgZnJvbSBcInlqc1wiXHJcbmltcG9ydCB7IGFwcGx5TW9ieEtleXN0b25lUGF0Y2hUb1lqc09iamVjdCB9IGZyb20gXCIuL2FwcGx5TW9ieEtleXN0b25lUGF0Y2hUb1lqc09iamVjdFwiXHJcbmltcG9ydCB7IGNvbnZlcnRZanNFdmVudFRvUGF0Y2hlcyB9IGZyb20gXCIuL2NvbnZlcnRZanNFdmVudFRvUGF0Y2hlc1wiXHJcblxyXG5leHBvcnQgZnVuY3Rpb24gYmluZFlqc1RvTW9ieEtleXN0b25lPFxyXG4gIFRUeXBlIGV4dGVuZHMgQW55U3RhbmRhcmRUeXBlIHwgTW9kZWxDbGFzczxBbnlNb2RlbD4gfCBNb2RlbENsYXNzPEFueURhdGFNb2RlbD4sXHJcbj4oe1xyXG4gIHlqc0RvYyxcclxuICB5anNPYmplY3QsXHJcbiAgbW9ieEtleXN0b25lVHlwZSxcclxufToge1xyXG4gIHlqc0RvYzogWS5Eb2NcclxuICB5anNPYmplY3Q6IFkuTWFwPHVua25vd24+IHwgWS5BcnJheTx1bmtub3duPlxyXG4gIG1vYnhLZXlzdG9uZVR5cGU6IFRUeXBlXHJcbn0pOiB7XHJcbiAgYm91bmRPYmplY3Q6IFR5cGVUb0RhdGE8VFR5cGU+XHJcbiAgZGlzcG9zZSgpOiB2b2lkXHJcbiAgeWpzT3JpZ2luOiBzeW1ib2xcclxufSB7XHJcbiAgY29uc3QgeWpzSnNvbiA9IHlqc09iamVjdC50b0pTT04oKVxyXG5cclxuICBjb25zdCBpbml0aWFsaXphdGlvbkdsb2JhbFBhdGNoZXM6IHsgdGFyZ2V0OiBvYmplY3Q7IHBhdGNoZXM6IFBhdGNoW10gfVtdID0gW11cclxuXHJcbiAgY29uc3QgY3JlYXRlQm91bmRPYmplY3QgPSAoKSA9PiB7XHJcbiAgICBjb25zdCBkaXNwb3NlT25HbG9iYWxQYXRjaGVzID0gb25HbG9iYWxQYXRjaGVzKCh0YXJnZXQsIHBhdGNoZXMpID0+IHtcclxuICAgICAgaW5pdGlhbGl6YXRpb25HbG9iYWxQYXRjaGVzLnB1c2goeyB0YXJnZXQsIHBhdGNoZXMgfSlcclxuICAgIH0pXHJcblxyXG4gICAgdHJ5IHtcclxuICAgICAgcmV0dXJuIGZyb21TbmFwc2hvdChtb2J4S2V5c3RvbmVUeXBlLCB5anNKc29uIGFzIGFueSlcclxuICAgIH0gZmluYWxseSB7XHJcbiAgICAgIGRpc3Bvc2VPbkdsb2JhbFBhdGNoZXMoKVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgY29uc3QgYm91bmRPYmplY3QgPSBjcmVhdGVCb3VuZE9iamVjdCgpXHJcblxyXG4gIGxldCBhcHBseWluZ01vYnhLZXlzdG9uZUNoYW5nZXMgPSAwXHJcbiAgY29uc3QgeWpzT3JpZ2luID0gU3ltYm9sKFwiYmluZFlqc1RvTW9ieEtleXN0b25lVHJhbnNhY3Rpb25PcmlnaW5cIilcclxuXHJcbiAgLy8gYmluZCBhbnkgY2hhbmdlcyBmcm9tIHlqcyB0byBtb2J4LWtleXN0b25lXHJcbiAgY29uc3Qgb2JzZXJ2ZURlZXBDYiA9IChldmVudHM6IFkuWUV2ZW50PGFueT5bXSkgPT4ge1xyXG4gICAgY29uc3QgcGF0Y2hlczogUGF0Y2hbXSA9IFtdXHJcbiAgICBldmVudHMuZm9yRWFjaCgoZXZlbnQpID0+IHtcclxuICAgICAgaWYgKGV2ZW50LnRyYW5zYWN0aW9uLm9yaWdpbiAhPT0geWpzT3JpZ2luKSB7XHJcbiAgICAgICAgcGF0Y2hlcy5wdXNoKC4uLmNvbnZlcnRZanNFdmVudFRvUGF0Y2hlcyhldmVudCkpXHJcbiAgICAgIH1cclxuICAgIH0pXHJcblxyXG4gICAgaWYgKHBhdGNoZXMubGVuZ3RoID4gMCkge1xyXG4gICAgICBhcHBseWluZ01vYnhLZXlzdG9uZUNoYW5nZXMrK1xyXG4gICAgICB0cnkge1xyXG4gICAgICAgIGFwcGx5UGF0Y2hlcyhib3VuZE9iamVjdCwgcGF0Y2hlcylcclxuICAgICAgfSBmaW5hbGx5IHtcclxuICAgICAgICBhcHBseWluZ01vYnhLZXlzdG9uZUNoYW5nZXMtLVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICB5anNPYmplY3Qub2JzZXJ2ZURlZXAob2JzZXJ2ZURlZXBDYilcclxuXHJcbiAgLy8gYmluZCBhbnkgY2hhbmdlcyBmcm9tIG1vYngta2V5c3RvbmUgdG8geWpzXHJcbiAgbGV0IHBlbmRpbmdQYXRjaGVzOiBQYXRjaFtdID0gW11cclxuICBjb25zdCBkaXNwb3NlT25QYXRjaGVzID0gb25QYXRjaGVzKGJvdW5kT2JqZWN0LCAocGF0Y2hlcykgPT4ge1xyXG4gICAgaWYgKGFwcGx5aW5nTW9ieEtleXN0b25lQ2hhbmdlcyA+IDApIHtcclxuICAgICAgcmV0dXJuXHJcbiAgICB9XHJcblxyXG4gICAgcGVuZGluZ1BhdGNoZXMucHVzaCguLi5wYXRjaGVzKVxyXG4gIH0pXHJcblxyXG4gIC8vIHRoaXMgaXMgb25seSB1c2VkIHNvIHdlIGNhbiB0cmFuc2FjdCBhbGwgcGF0Y2hlcyB0byB0aGUgc25hcHNob3QgYm91bmRhcnlcclxuICBjb25zdCBkaXNwb3NlT25TbmFwc2hvdCA9IG9uU25hcHNob3QoYm91bmRPYmplY3QsICgpID0+IHtcclxuICAgIGlmIChwZW5kaW5nUGF0Y2hlcy5sZW5ndGggPT09IDApIHtcclxuICAgICAgcmV0dXJuXHJcbiAgICB9XHJcblxyXG4gICAgY29uc3QgcGF0Y2hlcyA9IHBlbmRpbmdQYXRjaGVzXHJcbiAgICBwZW5kaW5nUGF0Y2hlcyA9IFtdXHJcblxyXG4gICAgeWpzRG9jLnRyYW5zYWN0KCgpID0+IHtcclxuICAgICAgcGF0Y2hlcy5mb3JFYWNoKChwYXRjaCkgPT4ge1xyXG4gICAgICAgIGFwcGx5TW9ieEtleXN0b25lUGF0Y2hUb1lqc09iamVjdChwYXRjaCwgeWpzT2JqZWN0KVxyXG4gICAgICB9KVxyXG4gICAgfSwgeWpzT3JpZ2luKVxyXG4gIH0pXHJcblxyXG4gIC8vIHN5bmMgaW5pdGlhbCBwYXRjaGVzLCB0aGF0IG1pZ2h0IGluY2x1ZGUgc2V0dGluZyBkZWZhdWx0cywgSURzLCBldGNcclxuICB5anNEb2MudHJhbnNhY3QoKCkgPT4ge1xyXG4gICAgLy8gd2UgbmVlZCB0byBza2lwIGluaXRpYWxpemF0aW9ucyB1bnRpbCB3ZSBoaXQgdGhlIGluaXRpYWxpemF0aW9uIG9mIHRoZSBib3VuZCBvYmplY3RcclxuICAgIC8vIHRoaXMgaXMgYmVjYXVzZSBkZWZhdWx0IG9iamVjdHMgbWlnaHQgYmUgY3JlYXRlZCBhbmQgaW5pdGlhbGl6ZWQgYmVmb3JlIHRoZSBtYWluIG9iamVjdFxyXG4gICAgLy8gYnV0IHdlIGp1c3QgbmVlZCB0byBjYXRjaCB3aGVuIHRob3NlIGFyZSBhY3R1YWxseSBhc3NpZ25lZCB0byB0aGUgYm91bmQgb2JqZWN0XHJcbiAgICBsZXQgYm91bmRPYmplY3RGb3VuZCA9IGZhbHNlXHJcblxyXG4gICAgaW5pdGlhbGl6YXRpb25HbG9iYWxQYXRjaGVzLmZvckVhY2goKHsgdGFyZ2V0LCBwYXRjaGVzIH0pID0+IHtcclxuICAgICAgaWYgKCFib3VuZE9iamVjdEZvdW5kKSB7XHJcbiAgICAgICAgaWYgKHRhcmdldCAhPT0gYm91bmRPYmplY3QpIHtcclxuICAgICAgICAgIHJldHVybiAvLyBza2lwXHJcbiAgICAgICAgfVxyXG4gICAgICAgIGJvdW5kT2JqZWN0Rm91bmQgPSB0cnVlXHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGNvbnN0IHBhcmVudFRvQ2hpbGRQYXRoID0gZ2V0UGFyZW50VG9DaGlsZFBhdGgoYm91bmRPYmplY3QsIHRhcmdldClcclxuICAgICAgLy8gdGhpcyBpcyB1bmRlZmluZWQgb25seSBpZiB0YXJnZXQgaXMgbm90IGEgY2hpbGQgb2YgYm91bmRNb2RlbFxyXG4gICAgICBpZiAocGFyZW50VG9DaGlsZFBhdGggIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgIHBhdGNoZXMuZm9yRWFjaCgocGF0Y2gpID0+IHtcclxuICAgICAgICAgIGFwcGx5TW9ieEtleXN0b25lUGF0Y2hUb1lqc09iamVjdChcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgIC4uLnBhdGNoLFxyXG4gICAgICAgICAgICAgIHBhdGg6IFsuLi5wYXJlbnRUb0NoaWxkUGF0aCwgLi4ucGF0Y2gucGF0aF0sXHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIHlqc09iamVjdFxyXG4gICAgICAgICAgKVxyXG4gICAgICAgIH0pXHJcbiAgICAgIH1cclxuICAgIH0pXHJcbiAgfSwgeWpzT3JpZ2luKVxyXG5cclxuICByZXR1cm4ge1xyXG4gICAgYm91bmRPYmplY3QsXHJcbiAgICBkaXNwb3NlOiAoKSA9PiB7XHJcbiAgICAgIGRpc3Bvc2VPblBhdGNoZXMoKVxyXG4gICAgICBkaXNwb3NlT25TbmFwc2hvdCgpXHJcbiAgICAgIHlqc09iamVjdC51bm9ic2VydmVEZWVwKG9ic2VydmVEZWVwQ2IpXHJcbiAgICB9LFxyXG4gICAgeWpzT3JpZ2luLFxyXG4gIH1cclxufVxyXG4iXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFHTSxNQUFPLDZCQUE2QixNQUFLO0FBQUEsRUFDN0MsWUFBWSxLQUFXO0FBQ3JCLFVBQU0sR0FBRztBQUdGLFdBQUEsZUFBZSxNQUFNLHFCQUFxQixTQUFTO0FBQUEsRUFDNUQ7QUFDRDtBQUtLLFNBQVUsUUFBUSxLQUFXO0FBQzFCLFNBQUEsSUFBSSxxQkFBcUIsR0FBRztB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
|
|
286
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibW9ieC1rZXlzdG9uZS15anMuZXNtLm1qcyIsInNvdXJjZXMiOlsiLi4vc3JjL3V0aWxzL2Vycm9yLnRzIiwiLi4vc3JjL2JpbmRpbmcvY29udmVydEpzb25Ub1lqc0RhdGEudHMiLCIuLi9zcmMvYmluZGluZy9hcHBseU1vYnhLZXlzdG9uZVBhdGNoVG9ZanNPYmplY3QudHMiLCIuLi9zcmMvYmluZGluZy9jb252ZXJ0WWpzRXZlbnRUb1BhdGNoZXMudHMiLCIuLi9zcmMvYmluZGluZy95anNCaW5kaW5nQ29udGV4dC50cyIsIi4uL3NyYy9iaW5kaW5nL2JpbmRZanNUb01vYnhLZXlzdG9uZS50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKipcclxuICogQSBtb2J4LWtleXN0b25lLXlqcyBlcnJvci5cclxuICovXHJcbmV4cG9ydCBjbGFzcyBNb2J4S2V5c3RvbmVZanNFcnJvciBleHRlbmRzIEVycm9yIHtcclxuICBjb25zdHJ1Y3Rvcihtc2c6IHN0cmluZykge1xyXG4gICAgc3VwZXIobXNnKVxyXG5cclxuICAgIC8vIFNldCB0aGUgcHJvdG90eXBlIGV4cGxpY2l0bHkuXHJcbiAgICBPYmplY3Quc2V0UHJvdG90eXBlT2YodGhpcywgTW9ieEtleXN0b25lWWpzRXJyb3IucHJvdG90eXBlKVxyXG4gIH1cclxufVxyXG5cclxuLyoqXHJcbiAqIEBpbnRlcm5hbFxyXG4gKi9cclxuZXhwb3J0IGZ1bmN0aW9uIGZhaWx1cmUobXNnOiBzdHJpbmcpIHtcclxuICByZXR1cm4gbmV3IE1vYnhLZXlzdG9uZVlqc0Vycm9yKG1zZylcclxufVxyXG4iLCJpbXBvcnQgKiBhcyBZIGZyb20gXCJ5anNcIlxuaW1wb3J0IHsgSnNvblZhbHVlLCBKc29uQXJyYXksIEpzb25PYmplY3QsIEpzb25QcmltaXRpdmUgfSBmcm9tIFwiLi4vanNvblR5cGVzXCJcblxuZnVuY3Rpb24gaXNKc29uUHJpbWl0aXZlKHY6IEpzb25WYWx1ZSk6IHYgaXMgSnNvblByaW1pdGl2ZSB7XG4gIGNvbnN0IHQgPSB0eXBlb2YgdlxuICByZXR1cm4gdCA9PT0gXCJzdHJpbmdcIiB8fCB0ID09PSBcIm51bWJlclwiIHx8IHQgPT09IFwiYm9vbGVhblwiIHx8IHYgPT09IG51bGxcbn1cblxuZnVuY3Rpb24gaXNKc29uQXJyYXkodjogSnNvblZhbHVlKTogdiBpcyBKc29uQXJyYXkge1xuICByZXR1cm4gQXJyYXkuaXNBcnJheSh2KVxufVxuXG5mdW5jdGlvbiBpc0pzb25PYmplY3QodjogSnNvblZhbHVlKTogdiBpcyBKc29uT2JqZWN0IHtcbiAgcmV0dXJuICFpc0pzb25BcnJheSh2KSAmJiB0eXBlb2YgdiA9PT0gXCJvYmplY3RcIlxufVxuXG5leHBvcnQgZnVuY3Rpb24gY29udmVydEpzb25Ub1lqc0RhdGEodjogSnNvblZhbHVlKSB7XG4gIGlmICh2ID09PSB1bmRlZmluZWQgfHwgaXNKc29uUHJpbWl0aXZlKHYpKSB7XG4gICAgcmV0dXJuIHZcbiAgfVxuXG4gIGlmIChpc0pzb25BcnJheSh2KSkge1xuICAgIGNvbnN0IGFyciA9IG5ldyBZLkFycmF5KClcbiAgICBhcHBseUpzb25BcnJheVlBcnJheShhcnIsIHYpXG4gICAgcmV0dXJuIGFyclxuICB9XG5cbiAgaWYgKGlzSnNvbk9iamVjdCh2KSkge1xuICAgIGNvbnN0IG1hcCA9IG5ldyBZLk1hcCgpXG4gICAgYXBwbHlKc29uT2JqZWN0VG9ZTWFwKG1hcCwgdilcbiAgICByZXR1cm4gbWFwXG4gIH1cblxuICB0aHJvdyBuZXcgRXJyb3IoYHVuc3VwcG9ydGVkIHZhbHVlIHR5cGU6ICR7dn1gKVxufVxuXG5leHBvcnQgZnVuY3Rpb24gYXBwbHlKc29uQXJyYXlZQXJyYXkoZGVzdDogWS5BcnJheTx1bmtub3duPiwgc291cmNlOiBKc29uQXJyYXkpIHtcbiAgZGVzdC5wdXNoKHNvdXJjZS5tYXAoY29udmVydEpzb25Ub1lqc0RhdGEpKVxufVxuXG5leHBvcnQgZnVuY3Rpb24gYXBwbHlKc29uT2JqZWN0VG9ZTWFwKGRlc3Q6IFkuTWFwPHVua25vd24+LCBzb3VyY2U6IEpzb25PYmplY3QpIHtcbiAgT2JqZWN0LmVudHJpZXMoc291cmNlKS5mb3JFYWNoKChbaywgdl0pID0+IHtcbiAgICBkZXN0LnNldChrLCBjb252ZXJ0SnNvblRvWWpzRGF0YSh2KSlcbiAgfSlcbn1cbiIsImltcG9ydCB7IFBhdGNoIH0gZnJvbSBcIm1vYngta2V5c3RvbmVcIlxuaW1wb3J0ICogYXMgWSBmcm9tIFwieWpzXCJcbmltcG9ydCB7IGZhaWx1cmUgfSBmcm9tIFwiLi4vdXRpbHMvZXJyb3JcIlxuaW1wb3J0IHsgY29udmVydEpzb25Ub1lqc0RhdGEgfSBmcm9tIFwiLi9jb252ZXJ0SnNvblRvWWpzRGF0YVwiXG5cbmV4cG9ydCBmdW5jdGlvbiBhcHBseU1vYnhLZXlzdG9uZVBhdGNoVG9ZanNPYmplY3QocGF0Y2g6IFBhdGNoLCB5anM6IHVua25vd24pOiB2b2lkIHtcbiAgaWYgKHBhdGNoLnBhdGgubGVuZ3RoID4gMSkge1xuICAgIGNvbnN0IFtrZXksIC4uLnJlc3RdID0gcGF0Y2gucGF0aFxuXG4gICAgaWYgKHlqcyBpbnN0YW5jZW9mIFkuTWFwKSB7XG4gICAgICBjb25zdCBjaGlsZCA9IHlqcy5nZXQoU3RyaW5nKGtleSkpXG4gICAgICBpZiAoY2hpbGQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICB0aHJvdyBmYWlsdXJlKFxuICAgICAgICAgIGBpbnZhbGlkIHBhdGNoIHBhdGgsIGtleSBcIiR7a2V5fVwiIG5vdCBmb3VuZCBpbiBZanMgbWFwIC0gcGF0Y2g6ICR7SlNPTi5zdHJpbmdpZnkocGF0Y2gpfWBcbiAgICAgICAgKVxuICAgICAgfVxuICAgICAgYXBwbHlNb2J4S2V5c3RvbmVQYXRjaFRvWWpzT2JqZWN0KHsgLi4ucGF0Y2gsIHBhdGg6IHJlc3QgfSwgY2hpbGQpXG4gICAgfSBlbHNlIGlmICh5anMgaW5zdGFuY2VvZiBZLkFycmF5KSB7XG4gICAgICBjb25zdCBjaGlsZCA9IHlqcy5nZXQoTnVtYmVyKGtleSkpXG4gICAgICBpZiAoY2hpbGQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICB0aHJvdyBmYWlsdXJlKFxuICAgICAgICAgIGBpbnZhbGlkIHBhdGNoIHBhdGgsIGtleSBcIiR7a2V5fVwiIG5vdCBmb3VuZCBpbiBZanMgYXJyYXkgLSBwYXRjaDogJHtKU09OLnN0cmluZ2lmeShcbiAgICAgICAgICAgIHBhdGNoXG4gICAgICAgICAgKX1gXG4gICAgICAgIClcbiAgICAgIH1cbiAgICAgIGFwcGx5TW9ieEtleXN0b25lUGF0Y2hUb1lqc09iamVjdCh7IC4uLnBhdGNoLCBwYXRoOiByZXN0IH0sIGNoaWxkKVxuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyBmYWlsdXJlKFxuICAgICAgICBgaW52YWxpZCBwYXRjaCBwYXRoLCBrZXkgXCIke2tleX1cIiBub3QgZm91bmQgaW4gdW5rbm93biBZanMgb2JqZWN0IC0gcGF0Y2g6ICR7SlNPTi5zdHJpbmdpZnkoXG4gICAgICAgICAgcGF0Y2hcbiAgICAgICAgKX1gXG4gICAgICApXG4gICAgfVxuICB9IGVsc2UgaWYgKHBhdGNoLnBhdGgubGVuZ3RoID09PSAxKSB7XG4gICAgaWYgKHlqcyBpbnN0YW5jZW9mIFkuTWFwKSB7XG4gICAgICBjb25zdCBrZXkgPSBTdHJpbmcocGF0Y2gucGF0aFswXSlcblxuICAgICAgc3dpdGNoIChwYXRjaC5vcCkge1xuICAgICAgICBjYXNlIFwiYWRkXCI6XG4gICAgICAgIGNhc2UgXCJyZXBsYWNlXCI6IHtcbiAgICAgICAgICB5anMuc2V0KGtleSwgY29udmVydEpzb25Ub1lqc0RhdGEocGF0Y2gudmFsdWUpKVxuICAgICAgICAgIGJyZWFrXG4gICAgICAgIH1cbiAgICAgICAgY2FzZSBcInJlbW92ZVwiOiB7XG4gICAgICAgICAgeWpzLmRlbGV0ZShrZXkpXG4gICAgICAgICAgYnJlYWtcbiAgICAgICAgfVxuICAgICAgICBkZWZhdWx0OiB7XG4gICAgICAgICAgdGhyb3cgZmFpbHVyZShgaW52YWxpZCBwYXRjaCBvcGVyYXRpb24gZm9yIG1hcGApXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHlqcyBpbnN0YW5jZW9mIFkuQXJyYXkpIHtcbiAgICAgIGNvbnN0IGtleSA9IHBhdGNoLnBhdGhbMF1cblxuICAgICAgc3dpdGNoIChwYXRjaC5vcCkge1xuICAgICAgICBjYXNlIFwicmVwbGFjZVwiOiB7XG4gICAgICAgICAgaWYgKGtleSA9PT0gXCJsZW5ndGhcIikge1xuICAgICAgICAgICAgaWYgKHlqcy5sZW5ndGggPiBwYXRjaC52YWx1ZSkge1xuICAgICAgICAgICAgICBjb25zdCB0b0RlbGV0ZSA9IHlqcy5sZW5ndGggLSBwYXRjaC52YWx1ZVxuICAgICAgICAgICAgICB5anMuZGVsZXRlKHBhdGNoLnZhbHVlLCB0b0RlbGV0ZSlcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoeWpzLmxlbmd0aCA8IHBhdGNoLnZhbHVlKSB7XG4gICAgICAgICAgICAgIGNvbnN0IHRvSW5zZXJ0ID0gcGF0Y2gudmFsdWUgLSB5anMubGVuZ3RoXG4gICAgICAgICAgICAgIHlqcy5pbnNlcnQoeWpzLmxlbmd0aCwgQXJyYXkodG9JbnNlcnQpLmZpbGwodW5kZWZpbmVkKSlcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgeWpzLmRlbGV0ZShOdW1iZXIoa2V5KSlcbiAgICAgICAgICAgIHlqcy5pbnNlcnQoTnVtYmVyKGtleSksIFtjb252ZXJ0SnNvblRvWWpzRGF0YShwYXRjaC52YWx1ZSldKVxuICAgICAgICAgIH1cbiAgICAgICAgICBicmVha1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgXCJhZGRcIjoge1xuICAgICAgICAgIHlqcy5pbnNlcnQoTnVtYmVyKGtleSksIFtjb252ZXJ0SnNvblRvWWpzRGF0YShwYXRjaC52YWx1ZSldKVxuICAgICAgICAgIGJyZWFrXG4gICAgICAgIH1cbiAgICAgICAgY2FzZSBcInJlbW92ZVwiOiB7XG4gICAgICAgICAgeWpzLmRlbGV0ZShOdW1iZXIoa2V5KSlcbiAgICAgICAgICBicmVha1xuICAgICAgICB9XG4gICAgICAgIGRlZmF1bHQ6IHtcbiAgICAgICAgICB0aHJvdyBmYWlsdXJlKGBpbnZhbGlkIHBhdGNoIG9wZXJhdGlvbiBmb3IgYXJyYXlgKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IGZhaWx1cmUoXG4gICAgICAgIGBpbnZhbGlkIHBhdGNoIHBhdGgsIHRoZSBZanMgb2JqZWN0IGlzIG9mIGFuIHVua293biB0eXBlLCBzbyBrZXkgXCIke3BhdGNoLnBhdGhbMF19XCIgY2Fubm90IGJlIGZvdW5kIGluIGl0YFxuICAgICAgKVxuICAgIH1cbiAgfSBlbHNlIHtcbiAgICB0aHJvdyBmYWlsdXJlKGBpbnZhbGlkIHBhdGNoIHBhdGgsIGl0IGNhbm5vdCBiZSBlbXB0eWApXG4gIH1cbn1cbiIsImltcG9ydCB7IFBhdGNoIH0gZnJvbSBcIm1vYngta2V5c3RvbmVcIlxuaW1wb3J0ICogYXMgWSBmcm9tIFwieWpzXCJcbmltcG9ydCB7IEpzb25BcnJheSwgSnNvbk9iamVjdCwgSnNvblZhbHVlIH0gZnJvbSBcIi4uL2pzb25UeXBlc1wiXG5pbXBvcnQgeyBmYWlsdXJlIH0gZnJvbSBcIi4uL3V0aWxzL2Vycm9yXCJcblxuZXhwb3J0IGZ1bmN0aW9uIGNvbnZlcnRZanNFdmVudFRvUGF0Y2hlcyhldmVudDogWS5ZRXZlbnQ8YW55Pik6IFBhdGNoW10ge1xuICBjb25zdCBwYXRjaGVzOiBQYXRjaFtdID0gW11cblxuICBpZiAoZXZlbnQgaW5zdGFuY2VvZiBZLllNYXBFdmVudCkge1xuICAgIGNvbnN0IHNvdXJjZSA9IGV2ZW50LnRhcmdldCBhcyBZLk1hcDxhbnk+XG5cbiAgICBldmVudC5jaGFuZ2VzLmtleXMuZm9yRWFjaCgoY2hhbmdlLCBrZXkpID0+IHtcbiAgICAgIGNvbnN0IHBhdGggPSBbLi4uZXZlbnQucGF0aCwga2V5XVxuXG4gICAgICBzd2l0Y2ggKGNoYW5nZS5hY3Rpb24pIHtcbiAgICAgICAgY2FzZSBcImFkZFwiOlxuICAgICAgICAgIHBhdGNoZXMucHVzaCh7XG4gICAgICAgICAgICBvcDogXCJhZGRcIixcbiAgICAgICAgICAgIHBhdGgsXG4gICAgICAgICAgICB2YWx1ZTogdG9QbGFpblZhbHVlKHNvdXJjZS5nZXQoa2V5KSksXG4gICAgICAgICAgfSlcbiAgICAgICAgICBicmVha1xuXG4gICAgICAgIGNhc2UgXCJ1cGRhdGVcIjpcbiAgICAgICAgICBwYXRjaGVzLnB1c2goe1xuICAgICAgICAgICAgb3A6IFwicmVwbGFjZVwiLFxuICAgICAgICAgICAgcGF0aCxcbiAgICAgICAgICAgIHZhbHVlOiB0b1BsYWluVmFsdWUoc291cmNlLmdldChrZXkpKSxcbiAgICAgICAgICB9KVxuICAgICAgICAgIGJyZWFrXG5cbiAgICAgICAgY2FzZSBcImRlbGV0ZVwiOlxuICAgICAgICAgIHBhdGNoZXMucHVzaCh7XG4gICAgICAgICAgICBvcDogXCJyZW1vdmVcIixcbiAgICAgICAgICAgIHBhdGgsXG4gICAgICAgICAgfSlcbiAgICAgICAgICBicmVha1xuXG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgdGhyb3cgZmFpbHVyZShgdW5zdXBwb3J0ZWQgWWpzIG1hcCBldmVudCBhY3Rpb246ICR7Y2hhbmdlLmFjdGlvbn1gKVxuICAgICAgfVxuICAgIH0pXG4gIH0gZWxzZSBpZiAoZXZlbnQgaW5zdGFuY2VvZiBZLllBcnJheUV2ZW50KSB7XG4gICAgbGV0IHJldGFpbiA9IDBcbiAgICBldmVudC5jaGFuZ2VzLmRlbHRhLmZvckVhY2goKGNoYW5nZSkgPT4ge1xuICAgICAgaWYgKGNoYW5nZS5yZXRhaW4pIHtcbiAgICAgICAgcmV0YWluICs9IGNoYW5nZS5yZXRhaW5cbiAgICAgIH1cblxuICAgICAgaWYgKGNoYW5nZS5kZWxldGUpIHtcbiAgICAgICAgLy8gcmVtb3ZlIFggaXRlbXMgYXQgcmV0YWluIHBvc2l0aW9uXG4gICAgICAgIGNvbnN0IHBhdGggPSBbLi4uZXZlbnQucGF0aCwgcmV0YWluXVxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNoYW5nZS5kZWxldGU7IGkrKykge1xuICAgICAgICAgIHBhdGNoZXMucHVzaCh7XG4gICAgICAgICAgICBvcDogXCJyZW1vdmVcIixcbiAgICAgICAgICAgIHBhdGgsXG4gICAgICAgICAgfSlcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAoY2hhbmdlLmluc2VydCkge1xuICAgICAgICBjb25zdCBuZXdWYWx1ZXMgPSBBcnJheS5pc0FycmF5KGNoYW5nZS5pbnNlcnQpID8gY2hhbmdlLmluc2VydCA6IFtjaGFuZ2UuaW5zZXJ0XVxuICAgICAgICBuZXdWYWx1ZXMuZm9yRWFjaCgodikgPT4ge1xuICAgICAgICAgIGNvbnN0IHBhdGggPSBbLi4uZXZlbnQucGF0aCwgcmV0YWluXVxuICAgICAgICAgIHBhdGNoZXMucHVzaCh7XG4gICAgICAgICAgICBvcDogXCJhZGRcIixcbiAgICAgICAgICAgIHBhdGgsXG4gICAgICAgICAgICB2YWx1ZTogdG9QbGFpblZhbHVlKHYpLFxuICAgICAgICAgIH0pXG4gICAgICAgICAgcmV0YWluKytcbiAgICAgICAgfSlcbiAgICAgIH1cbiAgICB9KVxuICB9XG5cbiAgcmV0dXJuIHBhdGNoZXNcbn1cblxuZnVuY3Rpb24gdG9QbGFpblZhbHVlKHY6IFkuTWFwPGFueT4gfCBZLkFycmF5PGFueT4gfCBKc29uVmFsdWUpIHtcbiAgaWYgKHYgaW5zdGFuY2VvZiBZLk1hcCB8fCB2IGluc3RhbmNlb2YgWS5BcnJheSkge1xuICAgIHJldHVybiB2LnRvSlNPTigpIGFzIEpzb25PYmplY3QgfCBKc29uQXJyYXlcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gdlxuICB9XG59XG4iLCJpbXBvcnQgeyBBbnlUeXBlLCBjcmVhdGVDb250ZXh0IH0gZnJvbSBcIm1vYngta2V5c3RvbmVcIlxuaW1wb3J0ICogYXMgWSBmcm9tIFwieWpzXCJcblxuZXhwb3J0IGludGVyZmFjZSBZanNCaW5kaW5nQ29udGV4dCB7XG4gIHlqc0RvYzogWS5Eb2NcbiAgeWpzT2JqZWN0OiBZLk1hcDx1bmtub3duPiB8IFkuQXJyYXk8dW5rbm93bj5cbiAgbW9ieEtleXN0b25lVHlwZTogQW55VHlwZVxuICB5anNPcmlnaW46IHN5bWJvbFxufVxuXG5leHBvcnQgY29uc3QgeWpzQmluZGluZ0NvbnRleHQgPSBjcmVhdGVDb250ZXh0PFlqc0JpbmRpbmdDb250ZXh0IHwgdW5kZWZpbmVkPih1bmRlZmluZWQpXG4iLCJpbXBvcnQge1xuICBBbnlEYXRhTW9kZWwsXG4gIEFueU1vZGVsLFxuICBBbnlTdGFuZGFyZFR5cGUsXG4gIE1vZGVsQ2xhc3MsXG4gIFBhdGNoLFxuICBUeXBlVG9EYXRhLFxuICBhcHBseVBhdGNoZXMsXG4gIGZyb21TbmFwc2hvdCxcbiAgZ2V0UGFyZW50VG9DaGlsZFBhdGgsXG4gIG9uR2xvYmFsUGF0Y2hlcyxcbiAgb25QYXRjaGVzLFxuICBvblNuYXBzaG90LFxufSBmcm9tIFwibW9ieC1rZXlzdG9uZVwiXG5pbXBvcnQgKiBhcyBZIGZyb20gXCJ5anNcIlxuaW1wb3J0IHsgYXBwbHlNb2J4S2V5c3RvbmVQYXRjaFRvWWpzT2JqZWN0IH0gZnJvbSBcIi4vYXBwbHlNb2J4S2V5c3RvbmVQYXRjaFRvWWpzT2JqZWN0XCJcbmltcG9ydCB7IGNvbnZlcnRZanNFdmVudFRvUGF0Y2hlcyB9IGZyb20gXCIuL2NvbnZlcnRZanNFdmVudFRvUGF0Y2hlc1wiXG5pbXBvcnQgeyBZanNCaW5kaW5nQ29udGV4dCwgeWpzQmluZGluZ0NvbnRleHQgfSBmcm9tIFwiLi95anNCaW5kaW5nQ29udGV4dFwiXG5cbmV4cG9ydCBmdW5jdGlvbiBiaW5kWWpzVG9Nb2J4S2V5c3RvbmU8XG4gIFRUeXBlIGV4dGVuZHMgQW55U3RhbmRhcmRUeXBlIHwgTW9kZWxDbGFzczxBbnlNb2RlbD4gfCBNb2RlbENsYXNzPEFueURhdGFNb2RlbD4sXG4+KHtcbiAgeWpzRG9jLFxuICB5anNPYmplY3QsXG4gIG1vYnhLZXlzdG9uZVR5cGUsXG59OiB7XG4gIHlqc0RvYzogWS5Eb2NcbiAgeWpzT2JqZWN0OiBZLk1hcDx1bmtub3duPiB8IFkuQXJyYXk8dW5rbm93bj5cbiAgbW9ieEtleXN0b25lVHlwZTogVFR5cGVcbn0pOiB7XG4gIGJvdW5kT2JqZWN0OiBUeXBlVG9EYXRhPFRUeXBlPlxuICBkaXNwb3NlKCk6IHZvaWRcbiAgeWpzT3JpZ2luOiBzeW1ib2xcbn0ge1xuICBjb25zdCB5anNPcmlnaW4gPSBTeW1ib2woXCJiaW5kWWpzVG9Nb2J4S2V5c3RvbmVUcmFuc2FjdGlvbk9yaWdpblwiKVxuXG4gIGNvbnN0IGJpbmRpbmdDb250ZXh0OiBZanNCaW5kaW5nQ29udGV4dCA9IHtcbiAgICB5anNEb2MsXG4gICAgeWpzT2JqZWN0LFxuICAgIG1vYnhLZXlzdG9uZVR5cGUsXG4gICAgeWpzT3JpZ2luLFxuICB9XG5cbiAgY29uc3QgeWpzSnNvbiA9IHlqc09iamVjdC50b0pTT04oKVxuXG4gIGNvbnN0IGluaXRpYWxpemF0aW9uR2xvYmFsUGF0Y2hlczogeyB0YXJnZXQ6IG9iamVjdDsgcGF0Y2hlczogUGF0Y2hbXSB9W10gPSBbXVxuXG4gIGNvbnN0IGNyZWF0ZUJvdW5kT2JqZWN0ID0gKCkgPT4ge1xuICAgIGNvbnN0IGRpc3Bvc2VPbkdsb2JhbFBhdGNoZXMgPSBvbkdsb2JhbFBhdGNoZXMoKHRhcmdldCwgcGF0Y2hlcykgPT4ge1xuICAgICAgaW5pdGlhbGl6YXRpb25HbG9iYWxQYXRjaGVzLnB1c2goeyB0YXJnZXQsIHBhdGNoZXMgfSlcbiAgICB9KVxuXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGJvdW5kT2JqZWN0ID0geWpzQmluZGluZ0NvbnRleHQuYXBwbHkoXG4gICAgICAgICgpID0+IGZyb21TbmFwc2hvdChtb2J4S2V5c3RvbmVUeXBlLCB5anNKc29uIGFzIGFueSksXG4gICAgICAgIGJpbmRpbmdDb250ZXh0XG4gICAgICApXG4gICAgICB5anNCaW5kaW5nQ29udGV4dC5zZXQoYm91bmRPYmplY3QsIGJpbmRpbmdDb250ZXh0KVxuICAgICAgcmV0dXJuIGJvdW5kT2JqZWN0XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIGRpc3Bvc2VPbkdsb2JhbFBhdGNoZXMoKVxuICAgIH1cbiAgfVxuXG4gIGNvbnN0IGJvdW5kT2JqZWN0ID0gY3JlYXRlQm91bmRPYmplY3QoKVxuXG4gIGxldCBhcHBseWluZ01vYnhLZXlzdG9uZUNoYW5nZXMgPSAwXG5cbiAgLy8gYmluZCBhbnkgY2hhbmdlcyBmcm9tIHlqcyB0byBtb2J4LWtleXN0b25lXG4gIGNvbnN0IG9ic2VydmVEZWVwQ2IgPSAoZXZlbnRzOiBZLllFdmVudDxhbnk+W10pID0+IHtcbiAgICBjb25zdCBwYXRjaGVzOiBQYXRjaFtdID0gW11cbiAgICBldmVudHMuZm9yRWFjaCgoZXZlbnQpID0+IHtcbiAgICAgIGlmIChldmVudC50cmFuc2FjdGlvbi5vcmlnaW4gIT09IHlqc09yaWdpbikge1xuICAgICAgICBwYXRjaGVzLnB1c2goLi4uY29udmVydFlqc0V2ZW50VG9QYXRjaGVzKGV2ZW50KSlcbiAgICAgIH1cbiAgICB9KVxuXG4gICAgaWYgKHBhdGNoZXMubGVuZ3RoID4gMCkge1xuICAgICAgYXBwbHlpbmdNb2J4S2V5c3RvbmVDaGFuZ2VzKytcbiAgICAgIHRyeSB7XG4gICAgICAgIGFwcGx5UGF0Y2hlcyhib3VuZE9iamVjdCwgcGF0Y2hlcylcbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIGFwcGx5aW5nTW9ieEtleXN0b25lQ2hhbmdlcy0tXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgeWpzT2JqZWN0Lm9ic2VydmVEZWVwKG9ic2VydmVEZWVwQ2IpXG5cbiAgLy8gYmluZCBhbnkgY2hhbmdlcyBmcm9tIG1vYngta2V5c3RvbmUgdG8geWpzXG4gIGxldCBwZW5kaW5nUGF0Y2hlczogUGF0Y2hbXSA9IFtdXG4gIGNvbnN0IGRpc3Bvc2VPblBhdGNoZXMgPSBvblBhdGNoZXMoYm91bmRPYmplY3QsIChwYXRjaGVzKSA9PiB7XG4gICAgaWYgKGFwcGx5aW5nTW9ieEtleXN0b25lQ2hhbmdlcyA+IDApIHtcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIHBlbmRpbmdQYXRjaGVzLnB1c2goLi4ucGF0Y2hlcylcbiAgfSlcblxuICAvLyB0aGlzIGlzIG9ubHkgdXNlZCBzbyB3ZSBjYW4gdHJhbnNhY3QgYWxsIHBhdGNoZXMgdG8gdGhlIHNuYXBzaG90IGJvdW5kYXJ5XG4gIGNvbnN0IGRpc3Bvc2VPblNuYXBzaG90ID0gb25TbmFwc2hvdChib3VuZE9iamVjdCwgKCkgPT4ge1xuICAgIGlmIChwZW5kaW5nUGF0Y2hlcy5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGNvbnN0IHBhdGNoZXMgPSBwZW5kaW5nUGF0Y2hlc1xuICAgIHBlbmRpbmdQYXRjaGVzID0gW11cblxuICAgIHlqc0RvYy50cmFuc2FjdCgoKSA9PiB7XG4gICAgICBwYXRjaGVzLmZvckVhY2goKHBhdGNoKSA9PiB7XG4gICAgICAgIGFwcGx5TW9ieEtleXN0b25lUGF0Y2hUb1lqc09iamVjdChwYXRjaCwgeWpzT2JqZWN0KVxuICAgICAgfSlcbiAgICB9LCB5anNPcmlnaW4pXG4gIH0pXG5cbiAgLy8gc3luYyBpbml0aWFsIHBhdGNoZXMsIHRoYXQgbWlnaHQgaW5jbHVkZSBzZXR0aW5nIGRlZmF1bHRzLCBJRHMsIGV0Y1xuICB5anNEb2MudHJhbnNhY3QoKCkgPT4ge1xuICAgIC8vIHdlIG5lZWQgdG8gc2tpcCBpbml0aWFsaXphdGlvbnMgdW50aWwgd2UgaGl0IHRoZSBpbml0aWFsaXphdGlvbiBvZiB0aGUgYm91bmQgb2JqZWN0XG4gICAgLy8gdGhpcyBpcyBiZWNhdXNlIGRlZmF1bHQgb2JqZWN0cyBtaWdodCBiZSBjcmVhdGVkIGFuZCBpbml0aWFsaXplZCBiZWZvcmUgdGhlIG1haW4gb2JqZWN0XG4gICAgLy8gYnV0IHdlIGp1c3QgbmVlZCB0byBjYXRjaCB3aGVuIHRob3NlIGFyZSBhY3R1YWxseSBhc3NpZ25lZCB0byB0aGUgYm91bmQgb2JqZWN0XG4gICAgbGV0IGJvdW5kT2JqZWN0Rm91bmQgPSBmYWxzZVxuXG4gICAgaW5pdGlhbGl6YXRpb25HbG9iYWxQYXRjaGVzLmZvckVhY2goKHsgdGFyZ2V0LCBwYXRjaGVzIH0pID0+IHtcbiAgICAgIGlmICghYm91bmRPYmplY3RGb3VuZCkge1xuICAgICAgICBpZiAodGFyZ2V0ICE9PSBib3VuZE9iamVjdCkge1xuICAgICAgICAgIHJldHVybiAvLyBza2lwXG4gICAgICAgIH1cbiAgICAgICAgYm91bmRPYmplY3RGb3VuZCA9IHRydWVcbiAgICAgIH1cblxuICAgICAgY29uc3QgcGFyZW50VG9DaGlsZFBhdGggPSBnZXRQYXJlbnRUb0NoaWxkUGF0aChib3VuZE9iamVjdCwgdGFyZ2V0KVxuICAgICAgLy8gdGhpcyBpcyB1bmRlZmluZWQgb25seSBpZiB0YXJnZXQgaXMgbm90IGEgY2hpbGQgb2YgYm91bmRNb2RlbFxuICAgICAgaWYgKHBhcmVudFRvQ2hpbGRQYXRoICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgcGF0Y2hlcy5mb3JFYWNoKChwYXRjaCkgPT4ge1xuICAgICAgICAgIGFwcGx5TW9ieEtleXN0b25lUGF0Y2hUb1lqc09iamVjdChcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgLi4ucGF0Y2gsXG4gICAgICAgICAgICAgIHBhdGg6IFsuLi5wYXJlbnRUb0NoaWxkUGF0aCwgLi4ucGF0Y2gucGF0aF0sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgeWpzT2JqZWN0XG4gICAgICAgICAgKVxuICAgICAgICB9KVxuICAgICAgfVxuICAgIH0pXG4gIH0sIHlqc09yaWdpbilcblxuICByZXR1cm4ge1xuICAgIGJvdW5kT2JqZWN0LFxuICAgIGRpc3Bvc2U6ICgpID0+IHtcbiAgICAgIGRpc3Bvc2VPblBhdGNoZXMoKVxuICAgICAgZGlzcG9zZU9uU25hcHNob3QoKVxuICAgICAgeWpzT2JqZWN0LnVub2JzZXJ2ZURlZXAob2JzZXJ2ZURlZXBDYilcbiAgICB9LFxuICAgIHlqc09yaWdpbixcbiAgfVxu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
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { onPatches, onSnapshot, getParentToChildPath, onGlobalPatches, fromSnapshot, applyPatches } from "mobx-keystone";
|
|
1
|
+
import { createContext, onPatches, onSnapshot, getParentToChildPath, onGlobalPatches, fromSnapshot, applyPatches } from "mobx-keystone";
|
|
2
2
|
import * as Y from "yjs";
|
|
3
3
|
class MobxKeystoneYjsError extends Error {
|
|
4
4
|
constructor(msg) {
|
|
@@ -9,37 +9,38 @@ class MobxKeystoneYjsError extends Error {
|
|
|
9
9
|
function failure(msg) {
|
|
10
10
|
return new MobxKeystoneYjsError(msg);
|
|
11
11
|
}
|
|
12
|
-
function
|
|
12
|
+
function isJsonPrimitive(v) {
|
|
13
13
|
const t = typeof v;
|
|
14
14
|
return t === "string" || t === "number" || t === "boolean" || v === null;
|
|
15
15
|
}
|
|
16
|
-
function
|
|
16
|
+
function isJsonArray(v) {
|
|
17
17
|
return Array.isArray(v);
|
|
18
18
|
}
|
|
19
|
-
function
|
|
20
|
-
return !
|
|
19
|
+
function isJsonObject(v) {
|
|
20
|
+
return !isJsonArray(v) && typeof v === "object";
|
|
21
21
|
}
|
|
22
|
-
function
|
|
23
|
-
if (
|
|
22
|
+
function convertJsonToYjsData(v) {
|
|
23
|
+
if (v === void 0 || isJsonPrimitive(v)) {
|
|
24
24
|
return v;
|
|
25
|
-
}
|
|
25
|
+
}
|
|
26
|
+
if (isJsonArray(v)) {
|
|
26
27
|
const arr = new Y.Array();
|
|
27
|
-
|
|
28
|
+
applyJsonArrayYArray(arr, v);
|
|
28
29
|
return arr;
|
|
29
|
-
}
|
|
30
|
+
}
|
|
31
|
+
if (isJsonObject(v)) {
|
|
30
32
|
const map = new Y.Map();
|
|
31
|
-
|
|
33
|
+
applyJsonObjectToYMap(map, v);
|
|
32
34
|
return map;
|
|
33
|
-
} else {
|
|
34
|
-
return void 0;
|
|
35
35
|
}
|
|
36
|
+
throw new Error(`unsupported value type: ${v}`);
|
|
36
37
|
}
|
|
37
|
-
function
|
|
38
|
-
dest.push(source.map(
|
|
38
|
+
function applyJsonArrayYArray(dest, source) {
|
|
39
|
+
dest.push(source.map(convertJsonToYjsData));
|
|
39
40
|
}
|
|
40
|
-
function
|
|
41
|
+
function applyJsonObjectToYMap(dest, source) {
|
|
41
42
|
Object.entries(source).forEach(([k, v]) => {
|
|
42
|
-
dest.set(k,
|
|
43
|
+
dest.set(k, convertJsonToYjsData(v));
|
|
43
44
|
});
|
|
44
45
|
}
|
|
45
46
|
function applyMobxKeystonePatchToYjsObject(patch, yjs) {
|
|
@@ -66,7 +67,7 @@ function applyMobxKeystonePatchToYjsObject(patch, yjs) {
|
|
|
66
67
|
switch (patch.op) {
|
|
67
68
|
case "add":
|
|
68
69
|
case "replace": {
|
|
69
|
-
yjs.set(key,
|
|
70
|
+
yjs.set(key, convertJsonToYjsData(patch.value));
|
|
70
71
|
break;
|
|
71
72
|
}
|
|
72
73
|
case "remove": {
|
|
@@ -91,12 +92,12 @@ function applyMobxKeystonePatchToYjsObject(patch, yjs) {
|
|
|
91
92
|
}
|
|
92
93
|
} else {
|
|
93
94
|
yjs.delete(Number(key));
|
|
94
|
-
yjs.insert(Number(key), [
|
|
95
|
+
yjs.insert(Number(key), [convertJsonToYjsData(patch.value)]);
|
|
95
96
|
}
|
|
96
97
|
break;
|
|
97
98
|
}
|
|
98
99
|
case "add": {
|
|
99
|
-
yjs.insert(Number(key), [
|
|
100
|
+
yjs.insert(Number(key), [convertJsonToYjsData(patch.value)]);
|
|
100
101
|
break;
|
|
101
102
|
}
|
|
102
103
|
case "remove": {
|
|
@@ -183,7 +184,15 @@ function toPlainValue(v) {
|
|
|
183
184
|
return v;
|
|
184
185
|
}
|
|
185
186
|
}
|
|
187
|
+
const yjsBindingContext = createContext(void 0);
|
|
186
188
|
function bindYjsToMobxKeystone({ yjsDoc, yjsObject, mobxKeystoneType }) {
|
|
189
|
+
const yjsOrigin = Symbol("bindYjsToMobxKeystoneTransactionOrigin");
|
|
190
|
+
const bindingContext = {
|
|
191
|
+
yjsDoc,
|
|
192
|
+
yjsObject,
|
|
193
|
+
mobxKeystoneType,
|
|
194
|
+
yjsOrigin
|
|
195
|
+
};
|
|
187
196
|
const yjsJson = yjsObject.toJSON();
|
|
188
197
|
const initializationGlobalPatches = [];
|
|
189
198
|
const createBoundObject = () => {
|
|
@@ -191,14 +200,15 @@ function bindYjsToMobxKeystone({ yjsDoc, yjsObject, mobxKeystoneType }) {
|
|
|
191
200
|
initializationGlobalPatches.push({ target, patches });
|
|
192
201
|
});
|
|
193
202
|
try {
|
|
194
|
-
|
|
203
|
+
const boundObject2 = yjsBindingContext.apply(() => fromSnapshot(mobxKeystoneType, yjsJson), bindingContext);
|
|
204
|
+
yjsBindingContext.set(boundObject2, bindingContext);
|
|
205
|
+
return boundObject2;
|
|
195
206
|
} finally {
|
|
196
207
|
disposeOnGlobalPatches();
|
|
197
208
|
}
|
|
198
209
|
};
|
|
199
210
|
const boundObject = createBoundObject();
|
|
200
211
|
let applyingMobxKeystoneChanges = 0;
|
|
201
|
-
const yjsOrigin = Symbol("bindYjsToMobxKeystoneTransactionOrigin");
|
|
202
212
|
const observeDeepCb = (events) => {
|
|
203
213
|
const patches = [];
|
|
204
214
|
events.forEach((event) => {
|
|
@@ -267,6 +277,10 @@ function bindYjsToMobxKeystone({ yjsDoc, yjsObject, mobxKeystoneType }) {
|
|
|
267
277
|
}
|
|
268
278
|
export {
|
|
269
279
|
MobxKeystoneYjsError,
|
|
270
|
-
|
|
280
|
+
applyJsonArrayYArray,
|
|
281
|
+
applyJsonObjectToYMap,
|
|
282
|
+
bindYjsToMobxKeystone,
|
|
283
|
+
convertJsonToYjsData,
|
|
284
|
+
yjsBindingContext
|
|
271
285
|
};
|
|
272
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibW9ieC1rZXlzdG9uZS15anMuZXNtLm1qcyIsInNvdXJjZXMiOlsiLi4vc3JjL3V0aWxzL2Vycm9yLnRzIiwiLi4vc3JjL2JpbmRpbmcvdG9ZRGF0YVR5cGUudHMiLCIuLi9zcmMvYmluZGluZy9hcHBseU1vYnhLZXlzdG9uZVBhdGNoVG9ZanNPYmplY3QudHMiLCIuLi9zcmMvYmluZGluZy9jb252ZXJ0WWpzRXZlbnRUb1BhdGNoZXMudHMiLCIuLi9zcmMvYmluZGluZy9iaW5kWWpzVG9Nb2J4S2V5c3RvbmUudHMiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqXHJcbiAqIEEgbW9ieC1rZXlzdG9uZS15anMgZXJyb3IuXHJcbiAqL1xyXG5leHBvcnQgY2xhc3MgTW9ieEtleXN0b25lWWpzRXJyb3IgZXh0ZW5kcyBFcnJvciB7XHJcbiAgY29uc3RydWN0b3IobXNnOiBzdHJpbmcpIHtcclxuICAgIHN1cGVyKG1zZylcclxuXHJcbiAgICAvLyBTZXQgdGhlIHByb3RvdHlwZSBleHBsaWNpdGx5LlxyXG4gICAgT2JqZWN0LnNldFByb3RvdHlwZU9mKHRoaXMsIE1vYnhLZXlzdG9uZVlqc0Vycm9yLnByb3RvdHlwZSlcclxuICB9XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBAaW50ZXJuYWxcclxuICovXHJcbmV4cG9ydCBmdW5jdGlvbiBmYWlsdXJlKG1zZzogc3RyaW5nKSB7XHJcbiAgcmV0dXJuIG5ldyBNb2J4S2V5c3RvbmVZanNFcnJvcihtc2cpXHJcbn1cclxuIiwiaW1wb3J0ICogYXMgWSBmcm9tIFwieWpzXCJcclxuaW1wb3J0IHsgSlNPTlZhbHVlLCBKU09OQXJyYXksIEpTT05PYmplY3QsIEpTT05QcmltaXRpdmUgfSBmcm9tIFwiLi4vanNvblR5cGVzXCJcclxuXHJcbmZ1bmN0aW9uIGlzSlNPTlByaW1pdGl2ZSh2OiBKU09OVmFsdWUpOiB2IGlzIEpTT05QcmltaXRpdmUge1xyXG4gIGNvbnN0IHQgPSB0eXBlb2YgdlxyXG4gIHJldHVybiB0ID09PSBcInN0cmluZ1wiIHx8IHQgPT09IFwibnVtYmVyXCIgfHwgdCA9PT0gXCJib29sZWFuXCIgfHwgdiA9PT0gbnVsbFxyXG59XHJcblxyXG5mdW5jdGlvbiBpc0pTT05BcnJheSh2OiBKU09OVmFsdWUpOiB2IGlzIEpTT05BcnJheSB7XHJcbiAgcmV0dXJuIEFycmF5LmlzQXJyYXkodilcclxufVxyXG5cclxuZnVuY3Rpb24gaXNKU09OT2JqZWN0KHY6IEpTT05WYWx1ZSk6IHYgaXMgSlNPTk9iamVjdCB7XHJcbiAgcmV0dXJuICFpc0pTT05BcnJheSh2KSAmJiB0eXBlb2YgdiA9PT0gXCJvYmplY3RcIlxyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gdG9ZRGF0YVR5cGUodjogSlNPTlZhbHVlKSB7XHJcbiAgaWYgKGlzSlNPTlByaW1pdGl2ZSh2KSkge1xyXG4gICAgcmV0dXJuIHZcclxuICB9IGVsc2UgaWYgKGlzSlNPTkFycmF5KHYpKSB7XHJcbiAgICBjb25zdCBhcnIgPSBuZXcgWS5BcnJheSgpXHJcbiAgICBhcHBseUpzb25BcnJheShhcnIsIHYpXHJcbiAgICByZXR1cm4gYXJyXHJcbiAgfSBlbHNlIGlmIChpc0pTT05PYmplY3QodikpIHtcclxuICAgIGNvbnN0IG1hcCA9IG5ldyBZLk1hcCgpXHJcbiAgICBhcHBseUpzb25PYmplY3QobWFwLCB2KVxyXG4gICAgcmV0dXJuIG1hcFxyXG4gIH0gZWxzZSB7XHJcbiAgICByZXR1cm4gdW5kZWZpbmVkXHJcbiAgfVxyXG59XHJcblxyXG5mdW5jdGlvbiBhcHBseUpzb25BcnJheShkZXN0OiBZLkFycmF5PHVua25vd24+LCBzb3VyY2U6IEpTT05BcnJheSkge1xyXG4gIGRlc3QucHVzaChzb3VyY2UubWFwKHRvWURhdGFUeXBlKSlcclxufVxyXG5cclxuZnVuY3Rpb24gYXBwbHlKc29uT2JqZWN0KGRlc3Q6IFkuTWFwPHVua25vd24+LCBzb3VyY2U6IEpTT05PYmplY3QpIHtcclxuICBPYmplY3QuZW50cmllcyhzb3VyY2UpLmZvckVhY2goKFtrLCB2XSkgPT4ge1xyXG4gICAgZGVzdC5zZXQoaywgdG9ZRGF0YVR5cGUodikpXHJcbiAgfSlcclxufVxyXG4iLCJpbXBvcnQgeyBQYXRjaCB9IGZyb20gXCJtb2J4LWtleXN0b25lXCJcclxuaW1wb3J0IHsgZmFpbHVyZSB9IGZyb20gXCIuLi91dGlscy9lcnJvclwiXHJcbmltcG9ydCAqIGFzIFkgZnJvbSBcInlqc1wiXHJcbmltcG9ydCB7IHRvWURhdGFUeXBlIH0gZnJvbSBcIi4vdG9ZRGF0YVR5cGVcIlxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGFwcGx5TW9ieEtleXN0b25lUGF0Y2hUb1lqc09iamVjdChwYXRjaDogUGF0Y2gsIHlqczogdW5rbm93bik6IHZvaWQge1xyXG4gIGlmIChwYXRjaC5wYXRoLmxlbmd0aCA+IDEpIHtcclxuICAgIGNvbnN0IFtrZXksIC4uLnJlc3RdID0gcGF0Y2gucGF0aFxyXG5cclxuICAgIGlmICh5anMgaW5zdGFuY2VvZiBZLk1hcCkge1xyXG4gICAgICBjb25zdCBjaGlsZCA9IHlqcy5nZXQoU3RyaW5nKGtleSkpXHJcbiAgICAgIGlmIChjaGlsZCA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgdGhyb3cgZmFpbHVyZShcclxuICAgICAgICAgIGBpbnZhbGlkIHBhdGNoIHBhdGgsIGtleSBcIiR7a2V5fVwiIG5vdCBmb3VuZCBpbiBZanMgbWFwIC0gcGF0Y2g6ICR7SlNPTi5zdHJpbmdpZnkocGF0Y2gpfWBcclxuICAgICAgICApXHJcbiAgICAgIH1cclxuICAgICAgYXBwbHlNb2J4S2V5c3RvbmVQYXRjaFRvWWpzT2JqZWN0KHsgLi4ucGF0Y2gsIHBhdGg6IHJlc3QgfSwgY2hpbGQpXHJcbiAgICB9IGVsc2UgaWYgKHlqcyBpbnN0YW5jZW9mIFkuQXJyYXkpIHtcclxuICAgICAgY29uc3QgY2hpbGQgPSB5anMuZ2V0KE51bWJlcihrZXkpKVxyXG4gICAgICBpZiAoY2hpbGQgPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgIHRocm93IGZhaWx1cmUoXHJcbiAgICAgICAgICBgaW52YWxpZCBwYXRjaCBwYXRoLCBrZXkgXCIke2tleX1cIiBub3QgZm91bmQgaW4gWWpzIGFycmF5IC0gcGF0Y2g6ICR7SlNPTi5zdHJpbmdpZnkoXHJcbiAgICAgICAgICAgIHBhdGNoXHJcbiAgICAgICAgICApfWBcclxuICAgICAgICApXHJcbiAgICAgIH1cclxuICAgICAgYXBwbHlNb2J4S2V5c3RvbmVQYXRjaFRvWWpzT2JqZWN0KHsgLi4ucGF0Y2gsIHBhdGg6IHJlc3QgfSwgY2hpbGQpXHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aHJvdyBmYWlsdXJlKFxyXG4gICAgICAgIGBpbnZhbGlkIHBhdGNoIHBhdGgsIGtleSBcIiR7a2V5fVwiIG5vdCBmb3VuZCBpbiB1bmtub3duIFlqcyBvYmplY3QgLSBwYXRjaDogJHtKU09OLnN0cmluZ2lmeShcclxuICAgICAgICAgIHBhdGNoXHJcbiAgICAgICAgKX1gXHJcbiAgICAgIClcclxuICAgIH1cclxuICB9IGVsc2UgaWYgKHBhdGNoLnBhdGgubGVuZ3RoID09PSAxKSB7XHJcbiAgICBpZiAoeWpzIGluc3RhbmNlb2YgWS5NYXApIHtcclxuICAgICAgY29uc3Qga2V5ID0gU3RyaW5nKHBhdGNoLnBhdGhbMF0pXHJcblxyXG4gICAgICBzd2l0Y2ggKHBhdGNoLm9wKSB7XHJcbiAgICAgICAgY2FzZSBcImFkZFwiOlxyXG4gICAgICAgIGNhc2UgXCJyZXBsYWNlXCI6IHtcclxuICAgICAgICAgIHlqcy5zZXQoa2V5LCB0b1lEYXRhVHlwZShwYXRjaC52YWx1ZSkpXHJcbiAgICAgICAgICBicmVha1xyXG4gICAgICAgIH1cclxuICAgICAgICBjYXNlIFwicmVtb3ZlXCI6IHtcclxuICAgICAgICAgIHlqcy5kZWxldGUoa2V5KVxyXG4gICAgICAgICAgYnJlYWtcclxuICAgICAgICB9XHJcbiAgICAgICAgZGVmYXVsdDoge1xyXG4gICAgICAgICAgdGhyb3cgZmFpbHVyZShgaW52YWxpZCBwYXRjaCBvcGVyYXRpb24gZm9yIG1hcGApXHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9IGVsc2UgaWYgKHlqcyBpbnN0YW5jZW9mIFkuQXJyYXkpIHtcclxuICAgICAgY29uc3Qga2V5ID0gcGF0Y2gucGF0aFswXVxyXG5cclxuICAgICAgc3dpdGNoIChwYXRjaC5vcCkge1xyXG4gICAgICAgIGNhc2UgXCJyZXBsYWNlXCI6IHtcclxuICAgICAgICAgIGlmIChrZXkgPT09IFwibGVuZ3RoXCIpIHtcclxuICAgICAgICAgICAgaWYgKHlqcy5sZW5ndGggPiBwYXRjaC52YWx1ZSkge1xyXG4gICAgICAgICAgICAgIGNvbnN0IHRvRGVsZXRlID0geWpzLmxlbmd0aCAtIHBhdGNoLnZhbHVlXHJcbiAgICAgICAgICAgICAgeWpzLmRlbGV0ZShwYXRjaC52YWx1ZSwgdG9EZWxldGUpXHJcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoeWpzLmxlbmd0aCA8IHBhdGNoLnZhbHVlKSB7XHJcbiAgICAgICAgICAgICAgY29uc3QgdG9JbnNlcnQgPSBwYXRjaC52YWx1ZSAtIHlqcy5sZW5ndGhcclxuICAgICAgICAgICAgICB5anMuaW5zZXJ0KHlqcy5sZW5ndGgsIEFycmF5KHRvSW5zZXJ0KS5maWxsKHVuZGVmaW5lZCkpXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHlqcy5kZWxldGUoTnVtYmVyKGtleSkpXHJcbiAgICAgICAgICAgIHlqcy5pbnNlcnQoTnVtYmVyKGtleSksIFt0b1lEYXRhVHlwZShwYXRjaC52YWx1ZSldKVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgYnJlYWtcclxuICAgICAgICB9XHJcbiAgICAgICAgY2FzZSBcImFkZFwiOiB7XHJcbiAgICAgICAgICB5anMuaW5zZXJ0KE51bWJlcihrZXkpLCBbdG9ZRGF0YVR5cGUocGF0Y2gudmFsdWUpXSlcclxuICAgICAgICAgIGJyZWFrXHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNhc2UgXCJyZW1vdmVcIjoge1xyXG4gICAgICAgICAgeWpzLmRlbGV0ZShOdW1iZXIoa2V5KSlcclxuICAgICAgICAgIGJyZWFrXHJcbiAgICAgICAgfVxyXG4gICAgICAgIGRlZmF1bHQ6IHtcclxuICAgICAgICAgIHRocm93IGZhaWx1cmUoYGludmFsaWQgcGF0Y2ggb3BlcmF0aW9uIGZvciBhcnJheWApXHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aHJvdyBmYWlsdXJlKFxyXG4gICAgICAgIGBpbnZhbGlkIHBhdGNoIHBhdGgsIHRoZSBZanMgb2JqZWN0IGlzIG9mIGFuIHVua293biB0eXBlLCBzbyBrZXkgXCIke3BhdGNoLnBhdGhbMF19XCIgY2Fubm90IGJlIGZvdW5kIGluIGl0YFxyXG4gICAgICApXHJcbiAgICB9XHJcbiAgfSBlbHNlIHtcclxuICAgIHRocm93IGZhaWx1cmUoYGludmFsaWQgcGF0Y2ggcGF0aCwgaXQgY2Fubm90IGJlIGVtcHR5YClcclxuICB9XHJcbn1cclxuIiwiaW1wb3J0IHsgUGF0Y2ggfSBmcm9tIFwibW9ieC1rZXlzdG9uZVwiXHJcbmltcG9ydCAqIGFzIFkgZnJvbSBcInlqc1wiXHJcbmltcG9ydCB7IEpTT05BcnJheSwgSlNPTk9iamVjdCwgSlNPTlZhbHVlIH0gZnJvbSBcIi4uL2pzb25UeXBlc1wiXHJcbmltcG9ydCB7IGZhaWx1cmUgfSBmcm9tIFwiLi4vdXRpbHMvZXJyb3JcIlxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGNvbnZlcnRZanNFdmVudFRvUGF0Y2hlcyhldmVudDogWS5ZRXZlbnQ8YW55Pik6IFBhdGNoW10ge1xyXG4gIGNvbnN0IHBhdGNoZXM6IFBhdGNoW10gPSBbXVxyXG5cclxuICBpZiAoZXZlbnQgaW5zdGFuY2VvZiBZLllNYXBFdmVudCkge1xyXG4gICAgY29uc3Qgc291cmNlID0gZXZlbnQudGFyZ2V0IGFzIFkuTWFwPGFueT5cclxuXHJcbiAgICBldmVudC5jaGFuZ2VzLmtleXMuZm9yRWFjaCgoY2hhbmdlLCBrZXkpID0+IHtcclxuICAgICAgY29uc3QgcGF0aCA9IFsuLi5ldmVudC5wYXRoLCBrZXldXHJcblxyXG4gICAgICBzd2l0Y2ggKGNoYW5nZS5hY3Rpb24pIHtcclxuICAgICAgICBjYXNlIFwiYWRkXCI6XHJcbiAgICAgICAgICBwYXRjaGVzLnB1c2goe1xyXG4gICAgICAgICAgICBvcDogXCJhZGRcIixcclxuICAgICAgICAgICAgcGF0aCxcclxuICAgICAgICAgICAgdmFsdWU6IHRvUGxhaW5WYWx1ZShzb3VyY2UuZ2V0KGtleSkpLFxyXG4gICAgICAgICAgfSlcclxuICAgICAgICAgIGJyZWFrXHJcblxyXG4gICAgICAgIGNhc2UgXCJ1cGRhdGVcIjpcclxuICAgICAgICAgIHBhdGNoZXMucHVzaCh7XHJcbiAgICAgICAgICAgIG9wOiBcInJlcGxhY2VcIixcclxuICAgICAgICAgICAgcGF0aCxcclxuICAgICAgICAgICAgdmFsdWU6IHRvUGxhaW5WYWx1ZShzb3VyY2UuZ2V0KGtleSkpLFxyXG4gICAgICAgICAgfSlcclxuICAgICAgICAgIGJyZWFrXHJcblxyXG4gICAgICAgIGNhc2UgXCJkZWxldGVcIjpcclxuICAgICAgICAgIHBhdGNoZXMucHVzaCh7XHJcbiAgICAgICAgICAgIG9wOiBcInJlbW92ZVwiLFxyXG4gICAgICAgICAgICBwYXRoLFxyXG4gICAgICAgICAgfSlcclxuICAgICAgICAgIGJyZWFrXHJcblxyXG4gICAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgICB0aHJvdyBmYWlsdXJlKGB1bnN1cHBvcnRlZCBZanMgbWFwIGV2ZW50IGFjdGlvbjogJHtjaGFuZ2UuYWN0aW9ufWApXHJcbiAgICAgIH1cclxuICAgIH0pXHJcbiAgfSBlbHNlIGlmIChldmVudCBpbnN0YW5jZW9mIFkuWUFycmF5RXZlbnQpIHtcclxuICAgIGxldCByZXRhaW4gPSAwXHJcbiAgICBldmVudC5jaGFuZ2VzLmRlbHRhLmZvckVhY2goKGNoYW5nZSkgPT4ge1xyXG4gICAgICBpZiAoY2hhbmdlLnJldGFpbikge1xyXG4gICAgICAgIHJldGFpbiArPSBjaGFuZ2UucmV0YWluXHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGlmIChjaGFuZ2UuZGVsZXRlKSB7XHJcbiAgICAgICAgLy8gcmVtb3ZlIFggaXRlbXMgYXQgcmV0YWluIHBvc2l0aW9uXHJcbiAgICAgICAgY29uc3QgcGF0aCA9IFsuLi5ldmVudC5wYXRoLCByZXRhaW5dXHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjaGFuZ2UuZGVsZXRlOyBpKyspIHtcclxuICAgICAgICAgIHBhdGNoZXMucHVzaCh7XHJcbiAgICAgICAgICAgIG9wOiBcInJlbW92ZVwiLFxyXG4gICAgICAgICAgICBwYXRoLFxyXG4gICAgICAgICAgfSlcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGlmIChjaGFuZ2UuaW5zZXJ0KSB7XHJcbiAgICAgICAgY29uc3QgbmV3VmFsdWVzID0gQXJyYXkuaXNBcnJheShjaGFuZ2UuaW5zZXJ0KSA/IGNoYW5nZS5pbnNlcnQgOiBbY2hhbmdlLmluc2VydF1cclxuICAgICAgICBuZXdWYWx1ZXMuZm9yRWFjaCgodikgPT4ge1xyXG4gICAgICAgICAgY29uc3QgcGF0aCA9IFsuLi5ldmVudC5wYXRoLCByZXRhaW5dXHJcbiAgICAgICAgICBwYXRjaGVzLnB1c2goe1xyXG4gICAgICAgICAgICBvcDogXCJhZGRcIixcclxuICAgICAgICAgICAgcGF0aCxcclxuICAgICAgICAgICAgdmFsdWU6IHRvUGxhaW5WYWx1ZSh2KSxcclxuICAgICAgICAgIH0pXHJcbiAgICAgICAgICByZXRhaW4rK1xyXG4gICAgICAgIH0pXHJcbiAgICAgIH1cclxuICAgIH0pXHJcbiAgfVxyXG5cclxuICByZXR1cm4gcGF0Y2hlc1xyXG59XHJcblxyXG5mdW5jdGlvbiB0b1BsYWluVmFsdWUodjogWS5NYXA8YW55PiB8IFkuQXJyYXk8YW55PiB8IEpTT05WYWx1ZSkge1xyXG4gIGlmICh2IGluc3RhbmNlb2YgWS5NYXAgfHwgdiBpbnN0YW5jZW9mIFkuQXJyYXkpIHtcclxuICAgIHJldHVybiB2LnRvSlNPTigpIGFzIEpTT05PYmplY3QgfCBKU09OQXJyYXlcclxuICB9IGVsc2Uge1xyXG4gICAgcmV0dXJuIHZcclxuICB9XHJcbn1cclxuIiwiaW1wb3J0IHtcclxuICBBbnlEYXRhTW9kZWwsXHJcbiAgQW55TW9kZWwsXHJcbiAgQW55U3RhbmRhcmRUeXBlLFxyXG4gIE1vZGVsQ2xhc3MsXHJcbiAgUGF0Y2gsXHJcbiAgVHlwZVRvRGF0YSxcclxuICBhcHBseVBhdGNoZXMsXHJcbiAgZnJvbVNuYXBzaG90LFxyXG4gIGdldFBhcmVudFRvQ2hpbGRQYXRoLFxyXG4gIG9uR2xvYmFsUGF0Y2hlcyxcclxuICBvblBhdGNoZXMsXHJcbiAgb25TbmFwc2hvdCxcclxufSBmcm9tIFwibW9ieC1rZXlzdG9uZVwiXHJcbmltcG9ydCAqIGFzIFkgZnJvbSBcInlqc1wiXHJcbmltcG9ydCB7IGFwcGx5TW9ieEtleXN0b25lUGF0Y2hUb1lqc09iamVjdCB9IGZyb20gXCIuL2FwcGx5TW9ieEtleXN0b25lUGF0Y2hUb1lqc09iamVjdFwiXHJcbmltcG9ydCB7IGNvbnZlcnRZanNFdmVudFRvUGF0Y2hlcyB9IGZyb20gXCIuL2NvbnZlcnRZanNFdmVudFRvUGF0Y2hlc1wiXHJcblxyXG5leHBvcnQgZnVuY3Rpb24gYmluZFlqc1RvTW9ieEtleXN0b25lPFxyXG4gIFRUeXBlIGV4dGVuZHMgQW55U3RhbmRhcmRUeXBlIHwgTW9kZWxDbGFzczxBbnlNb2RlbD4gfCBNb2RlbENsYXNzPEFueURhdGFNb2RlbD4sXHJcbj4oe1xyXG4gIHlqc0RvYyxcclxuICB5anNPYmplY3QsXHJcbiAgbW9ieEtleXN0b25lVHlwZSxcclxufToge1xyXG4gIHlqc0RvYzogWS5Eb2NcclxuICB5anNPYmplY3Q6IFkuTWFwPHVua25vd24+IHwgWS5BcnJheTx1bmtub3duPlxyXG4gIG1vYnhLZXlzdG9uZVR5cGU6IFRUeXBlXHJcbn0pOiB7XHJcbiAgYm91bmRPYmplY3Q6IFR5cGVUb0RhdGE8VFR5cGU+XHJcbiAgZGlzcG9zZSgpOiB2b2lkXHJcbiAgeWpzT3JpZ2luOiBzeW1ib2xcclxufSB7XHJcbiAgY29uc3QgeWpzSnNvbiA9IHlqc09iamVjdC50b0pTT04oKVxyXG5cclxuICBjb25zdCBpbml0aWFsaXphdGlvbkdsb2JhbFBhdGNoZXM6IHsgdGFyZ2V0OiBvYmplY3Q7IHBhdGNoZXM6IFBhdGNoW10gfVtdID0gW11cclxuXHJcbiAgY29uc3QgY3JlYXRlQm91bmRPYmplY3QgPSAoKSA9PiB7XHJcbiAgICBjb25zdCBkaXNwb3NlT25HbG9iYWxQYXRjaGVzID0gb25HbG9iYWxQYXRjaGVzKCh0YXJnZXQsIHBhdGNoZXMpID0+IHtcclxuICAgICAgaW5pdGlhbGl6YXRpb25HbG9iYWxQYXRjaGVzLnB1c2goeyB0YXJnZXQsIHBhdGNoZXMgfSlcclxuICAgIH0pXHJcblxyXG4gICAgdHJ5IHtcclxuICAgICAgcmV0dXJuIGZyb21TbmFwc2hvdChtb2J4S2V5c3RvbmVUeXBlLCB5anNKc29uIGFzIGFueSlcclxuICAgIH0gZmluYWxseSB7XHJcbiAgICAgIGRpc3Bvc2VPbkdsb2JhbFBhdGNoZXMoKVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgY29uc3QgYm91bmRPYmplY3QgPSBjcmVhdGVCb3VuZE9iamVjdCgpXHJcblxyXG4gIGxldCBhcHBseWluZ01vYnhLZXlzdG9uZUNoYW5nZXMgPSAwXHJcbiAgY29uc3QgeWpzT3JpZ2luID0gU3ltYm9sKFwiYmluZFlqc1RvTW9ieEtleXN0b25lVHJhbnNhY3Rpb25PcmlnaW5cIilcclxuXHJcbiAgLy8gYmluZCBhbnkgY2hhbmdlcyBmcm9tIHlqcyB0byBtb2J4LWtleXN0b25lXHJcbiAgY29uc3Qgb2JzZXJ2ZURlZXBDYiA9IChldmVudHM6IFkuWUV2ZW50PGFueT5bXSkgPT4ge1xyXG4gICAgY29uc3QgcGF0Y2hlczogUGF0Y2hbXSA9IFtdXHJcbiAgICBldmVudHMuZm9yRWFjaCgoZXZlbnQpID0+IHtcclxuICAgICAgaWYgKGV2ZW50LnRyYW5zYWN0aW9uLm9yaWdpbiAhPT0geWpzT3JpZ2luKSB7XHJcbiAgICAgICAgcGF0Y2hlcy5wdXNoKC4uLmNvbnZlcnRZanNFdmVudFRvUGF0Y2hlcyhldmVudCkpXHJcbiAgICAgIH1cclxuICAgIH0pXHJcblxyXG4gICAgaWYgKHBhdGNoZXMubGVuZ3RoID4gMCkge1xyXG4gICAgICBhcHBseWluZ01vYnhLZXlzdG9uZUNoYW5nZXMrK1xyXG4gICAgICB0cnkge1xyXG4gICAgICAgIGFwcGx5UGF0Y2hlcyhib3VuZE9iamVjdCwgcGF0Y2hlcylcclxuICAgICAgfSBmaW5hbGx5IHtcclxuICAgICAgICBhcHBseWluZ01vYnhLZXlzdG9uZUNoYW5nZXMtLVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICB5anNPYmplY3Qub2JzZXJ2ZURlZXAob2JzZXJ2ZURlZXBDYilcclxuXHJcbiAgLy8gYmluZCBhbnkgY2hhbmdlcyBmcm9tIG1vYngta2V5c3RvbmUgdG8geWpzXHJcbiAgbGV0IHBlbmRpbmdQYXRjaGVzOiBQYXRjaFtdID0gW11cclxuICBjb25zdCBkaXNwb3NlT25QYXRjaGVzID0gb25QYXRjaGVzKGJvdW5kT2JqZWN0LCAocGF0Y2hlcykgPT4ge1xyXG4gICAgaWYgKGFwcGx5aW5nTW9ieEtleXN0b25lQ2hhbmdlcyA+IDApIHtcclxuICAgICAgcmV0dXJuXHJcbiAgICB9XHJcblxyXG4gICAgcGVuZGluZ1BhdGNoZXMucHVzaCguLi5wYXRjaGVzKVxyXG4gIH0pXHJcblxyXG4gIC8vIHRoaXMgaXMgb25seSB1c2VkIHNvIHdlIGNhbiB0cmFuc2FjdCBhbGwgcGF0Y2hlcyB0byB0aGUgc25hcHNob3QgYm91bmRhcnlcclxuICBjb25zdCBkaXNwb3NlT25TbmFwc2hvdCA9IG9uU25hcHNob3QoYm91bmRPYmplY3QsICgpID0+IHtcclxuICAgIGlmIChwZW5kaW5nUGF0Y2hlcy5sZW5ndGggPT09IDApIHtcclxuICAgICAgcmV0dXJuXHJcbiAgICB9XHJcblxyXG4gICAgY29uc3QgcGF0Y2hlcyA9IHBlbmRpbmdQYXRjaGVzXHJcbiAgICBwZW5kaW5nUGF0Y2hlcyA9IFtdXHJcblxyXG4gICAgeWpzRG9jLnRyYW5zYWN0KCgpID0+IHtcclxuICAgICAgcGF0Y2hlcy5mb3JFYWNoKChwYXRjaCkgPT4ge1xyXG4gICAgICAgIGFwcGx5TW9ieEtleXN0b25lUGF0Y2hUb1lqc09iamVjdChwYXRjaCwgeWpzT2JqZWN0KVxyXG4gICAgICB9KVxyXG4gICAgfSwgeWpzT3JpZ2luKVxyXG4gIH0pXHJcblxyXG4gIC8vIHN5bmMgaW5pdGlhbCBwYXRjaGVzLCB0aGF0IG1pZ2h0IGluY2x1ZGUgc2V0dGluZyBkZWZhdWx0cywgSURzLCBldGNcclxuICB5anNEb2MudHJhbnNhY3QoKCkgPT4ge1xyXG4gICAgLy8gd2UgbmVlZCB0byBza2lwIGluaXRpYWxpemF0aW9ucyB1bnRpbCB3ZSBoaXQgdGhlIGluaXRpYWxpemF0aW9uIG9mIHRoZSBib3VuZCBvYmplY3RcclxuICAgIC8vIHRoaXMgaXMgYmVjYXVzZSBkZWZhdWx0IG9iamVjdHMgbWlnaHQgYmUgY3JlYXRlZCBhbmQgaW5pdGlhbGl6ZWQgYmVmb3JlIHRoZSBtYWluIG9iamVjdFxyXG4gICAgLy8gYnV0IHdlIGp1c3QgbmVlZCB0byBjYXRjaCB3aGVuIHRob3NlIGFyZSBhY3R1YWxseSBhc3NpZ25lZCB0byB0aGUgYm91bmQgb2JqZWN0XHJcbiAgICBsZXQgYm91bmRPYmplY3RGb3VuZCA9IGZhbHNlXHJcblxyXG4gICAgaW5pdGlhbGl6YXRpb25HbG9iYWxQYXRjaGVzLmZvckVhY2goKHsgdGFyZ2V0LCBwYXRjaGVzIH0pID0+IHtcclxuICAgICAgaWYgKCFib3VuZE9iamVjdEZvdW5kKSB7XHJcbiAgICAgICAgaWYgKHRhcmdldCAhPT0gYm91bmRPYmplY3QpIHtcclxuICAgICAgICAgIHJldHVybiAvLyBza2lwXHJcbiAgICAgICAgfVxyXG4gICAgICAgIGJvdW5kT2JqZWN0Rm91bmQgPSB0cnVlXHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGNvbnN0IHBhcmVudFRvQ2hpbGRQYXRoID0gZ2V0UGFyZW50VG9DaGlsZFBhdGgoYm91bmRPYmplY3QsIHRhcmdldClcclxuICAgICAgLy8gdGhpcyBpcyB1bmRlZmluZWQgb25seSBpZiB0YXJnZXQgaXMgbm90IGEgY2hpbGQgb2YgYm91bmRNb2RlbFxyXG4gICAgICBpZiAocGFyZW50VG9DaGlsZFBhdGggIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgIHBhdGNoZXMuZm9yRWFjaCgocGF0Y2gpID0+IHtcclxuICAgICAgICAgIGFwcGx5TW9ieEtleXN0b25lUGF0Y2hUb1lqc09iamVjdChcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgIC4uLnBhdGNoLFxyXG4gICAgICAgICAgICAgIHBhdGg6IFsuLi5wYXJlbnRUb0NoaWxkUGF0aCwgLi4ucGF0Y2gucGF0aF0sXHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIHlqc09iamVjdFxyXG4gICAgICAgICAgKVxyXG4gICAgICAgIH0pXHJcbiAgICAgIH1cclxuICAgIH0pXHJcbiAgfSwgeWpzT3JpZ2luKVxyXG5cclxuICByZXR1cm4ge1xyXG4gICAgYm91bmRPYmplY3QsXHJcbiAgICBkaXNwb3NlOiAoKSA9PiB7XHJcbiAgICAgIGRpc3Bvc2VPblBhdGNoZXMoKVxyXG4gICAgICBkaXNwb3NlT25TbmFwc2hvdCgpXHJcbiAgICAgIHlqc09iamVjdC51bm9ic2VydmVEZWVwKG9ic2VydmVEZWVwQ2IpXHJcbiAgICB9LFxyXG4gICAgeWpzT3JpZ2luLFxyXG4gIH1cclxufVxyXG4iXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFHTSxNQUFPLDZCQUE2QixNQUFLO0FBQUEsRUFDN0MsWUFBWSxLQUFXO0FBQ3JCLFVBQU0sR0FBRztBQUdGLFdBQUEsZUFBZSxNQUFNLHFCQUFxQixTQUFTO0FBQUEsRUFDNUQ7QUFDRDtBQUtLLFNBQVUsUUFBUSxLQUFXO0FBQzFCLFNBQUEsSUFBSSxxQkFBcUIsR0FBRztB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
|
|
286
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibW9ieC1rZXlzdG9uZS15anMuZXNtLm1qcyIsInNvdXJjZXMiOlsiLi4vc3JjL3V0aWxzL2Vycm9yLnRzIiwiLi4vc3JjL2JpbmRpbmcvY29udmVydEpzb25Ub1lqc0RhdGEudHMiLCIuLi9zcmMvYmluZGluZy9hcHBseU1vYnhLZXlzdG9uZVBhdGNoVG9ZanNPYmplY3QudHMiLCIuLi9zcmMvYmluZGluZy9jb252ZXJ0WWpzRXZlbnRUb1BhdGNoZXMudHMiLCIuLi9zcmMvYmluZGluZy95anNCaW5kaW5nQ29udGV4dC50cyIsIi4uL3NyYy9iaW5kaW5nL2JpbmRZanNUb01vYnhLZXlzdG9uZS50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKipcclxuICogQSBtb2J4LWtleXN0b25lLXlqcyBlcnJvci5cclxuICovXHJcbmV4cG9ydCBjbGFzcyBNb2J4S2V5c3RvbmVZanNFcnJvciBleHRlbmRzIEVycm9yIHtcclxuICBjb25zdHJ1Y3Rvcihtc2c6IHN0cmluZykge1xyXG4gICAgc3VwZXIobXNnKVxyXG5cclxuICAgIC8vIFNldCB0aGUgcHJvdG90eXBlIGV4cGxpY2l0bHkuXHJcbiAgICBPYmplY3Quc2V0UHJvdG90eXBlT2YodGhpcywgTW9ieEtleXN0b25lWWpzRXJyb3IucHJvdG90eXBlKVxyXG4gIH1cclxufVxyXG5cclxuLyoqXHJcbiAqIEBpbnRlcm5hbFxyXG4gKi9cclxuZXhwb3J0IGZ1bmN0aW9uIGZhaWx1cmUobXNnOiBzdHJpbmcpIHtcclxuICByZXR1cm4gbmV3IE1vYnhLZXlzdG9uZVlqc0Vycm9yKG1zZylcclxufVxyXG4iLCJpbXBvcnQgKiBhcyBZIGZyb20gXCJ5anNcIlxuaW1wb3J0IHsgSnNvblZhbHVlLCBKc29uQXJyYXksIEpzb25PYmplY3QsIEpzb25QcmltaXRpdmUgfSBmcm9tIFwiLi4vanNvblR5cGVzXCJcblxuZnVuY3Rpb24gaXNKc29uUHJpbWl0aXZlKHY6IEpzb25WYWx1ZSk6IHYgaXMgSnNvblByaW1pdGl2ZSB7XG4gIGNvbnN0IHQgPSB0eXBlb2YgdlxuICByZXR1cm4gdCA9PT0gXCJzdHJpbmdcIiB8fCB0ID09PSBcIm51bWJlclwiIHx8IHQgPT09IFwiYm9vbGVhblwiIHx8IHYgPT09IG51bGxcbn1cblxuZnVuY3Rpb24gaXNKc29uQXJyYXkodjogSnNvblZhbHVlKTogdiBpcyBKc29uQXJyYXkge1xuICByZXR1cm4gQXJyYXkuaXNBcnJheSh2KVxufVxuXG5mdW5jdGlvbiBpc0pzb25PYmplY3QodjogSnNvblZhbHVlKTogdiBpcyBKc29uT2JqZWN0IHtcbiAgcmV0dXJuICFpc0pzb25BcnJheSh2KSAmJiB0eXBlb2YgdiA9PT0gXCJvYmplY3RcIlxufVxuXG5leHBvcnQgZnVuY3Rpb24gY29udmVydEpzb25Ub1lqc0RhdGEodjogSnNvblZhbHVlKSB7XG4gIGlmICh2ID09PSB1bmRlZmluZWQgfHwgaXNKc29uUHJpbWl0aXZlKHYpKSB7XG4gICAgcmV0dXJuIHZcbiAgfVxuXG4gIGlmIChpc0pzb25BcnJheSh2KSkge1xuICAgIGNvbnN0IGFyciA9IG5ldyBZLkFycmF5KClcbiAgICBhcHBseUpzb25BcnJheVlBcnJheShhcnIsIHYpXG4gICAgcmV0dXJuIGFyclxuICB9XG5cbiAgaWYgKGlzSnNvbk9iamVjdCh2KSkge1xuICAgIGNvbnN0IG1hcCA9IG5ldyBZLk1hcCgpXG4gICAgYXBwbHlKc29uT2JqZWN0VG9ZTWFwKG1hcCwgdilcbiAgICByZXR1cm4gbWFwXG4gIH1cblxuICB0aHJvdyBuZXcgRXJyb3IoYHVuc3VwcG9ydGVkIHZhbHVlIHR5cGU6ICR7dn1gKVxufVxuXG5leHBvcnQgZnVuY3Rpb24gYXBwbHlKc29uQXJyYXlZQXJyYXkoZGVzdDogWS5BcnJheTx1bmtub3duPiwgc291cmNlOiBKc29uQXJyYXkpIHtcbiAgZGVzdC5wdXNoKHNvdXJjZS5tYXAoY29udmVydEpzb25Ub1lqc0RhdGEpKVxufVxuXG5leHBvcnQgZnVuY3Rpb24gYXBwbHlKc29uT2JqZWN0VG9ZTWFwKGRlc3Q6IFkuTWFwPHVua25vd24+LCBzb3VyY2U6IEpzb25PYmplY3QpIHtcbiAgT2JqZWN0LmVudHJpZXMoc291cmNlKS5mb3JFYWNoKChbaywgdl0pID0+IHtcbiAgICBkZXN0LnNldChrLCBjb252ZXJ0SnNvblRvWWpzRGF0YSh2KSlcbiAgfSlcbn1cbiIsImltcG9ydCB7IFBhdGNoIH0gZnJvbSBcIm1vYngta2V5c3RvbmVcIlxuaW1wb3J0ICogYXMgWSBmcm9tIFwieWpzXCJcbmltcG9ydCB7IGZhaWx1cmUgfSBmcm9tIFwiLi4vdXRpbHMvZXJyb3JcIlxuaW1wb3J0IHsgY29udmVydEpzb25Ub1lqc0RhdGEgfSBmcm9tIFwiLi9jb252ZXJ0SnNvblRvWWpzRGF0YVwiXG5cbmV4cG9ydCBmdW5jdGlvbiBhcHBseU1vYnhLZXlzdG9uZVBhdGNoVG9ZanNPYmplY3QocGF0Y2g6IFBhdGNoLCB5anM6IHVua25vd24pOiB2b2lkIHtcbiAgaWYgKHBhdGNoLnBhdGgubGVuZ3RoID4gMSkge1xuICAgIGNvbnN0IFtrZXksIC4uLnJlc3RdID0gcGF0Y2gucGF0aFxuXG4gICAgaWYgKHlqcyBpbnN0YW5jZW9mIFkuTWFwKSB7XG4gICAgICBjb25zdCBjaGlsZCA9IHlqcy5nZXQoU3RyaW5nKGtleSkpXG4gICAgICBpZiAoY2hpbGQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICB0aHJvdyBmYWlsdXJlKFxuICAgICAgICAgIGBpbnZhbGlkIHBhdGNoIHBhdGgsIGtleSBcIiR7a2V5fVwiIG5vdCBmb3VuZCBpbiBZanMgbWFwIC0gcGF0Y2g6ICR7SlNPTi5zdHJpbmdpZnkocGF0Y2gpfWBcbiAgICAgICAgKVxuICAgICAgfVxuICAgICAgYXBwbHlNb2J4S2V5c3RvbmVQYXRjaFRvWWpzT2JqZWN0KHsgLi4ucGF0Y2gsIHBhdGg6IHJlc3QgfSwgY2hpbGQpXG4gICAgfSBlbHNlIGlmICh5anMgaW5zdGFuY2VvZiBZLkFycmF5KSB7XG4gICAgICBjb25zdCBjaGlsZCA9IHlqcy5nZXQoTnVtYmVyKGtleSkpXG4gICAgICBpZiAoY2hpbGQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICB0aHJvdyBmYWlsdXJlKFxuICAgICAgICAgIGBpbnZhbGlkIHBhdGNoIHBhdGgsIGtleSBcIiR7a2V5fVwiIG5vdCBmb3VuZCBpbiBZanMgYXJyYXkgLSBwYXRjaDogJHtKU09OLnN0cmluZ2lmeShcbiAgICAgICAgICAgIHBhdGNoXG4gICAgICAgICAgKX1gXG4gICAgICAgIClcbiAgICAgIH1cbiAgICAgIGFwcGx5TW9ieEtleXN0b25lUGF0Y2hUb1lqc09iamVjdCh7IC4uLnBhdGNoLCBwYXRoOiByZXN0IH0sIGNoaWxkKVxuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyBmYWlsdXJlKFxuICAgICAgICBgaW52YWxpZCBwYXRjaCBwYXRoLCBrZXkgXCIke2tleX1cIiBub3QgZm91bmQgaW4gdW5rbm93biBZanMgb2JqZWN0IC0gcGF0Y2g6ICR7SlNPTi5zdHJpbmdpZnkoXG4gICAgICAgICAgcGF0Y2hcbiAgICAgICAgKX1gXG4gICAgICApXG4gICAgfVxuICB9IGVsc2UgaWYgKHBhdGNoLnBhdGgubGVuZ3RoID09PSAxKSB7XG4gICAgaWYgKHlqcyBpbnN0YW5jZW9mIFkuTWFwKSB7XG4gICAgICBjb25zdCBrZXkgPSBTdHJpbmcocGF0Y2gucGF0aFswXSlcblxuICAgICAgc3dpdGNoIChwYXRjaC5vcCkge1xuICAgICAgICBjYXNlIFwiYWRkXCI6XG4gICAgICAgIGNhc2UgXCJyZXBsYWNlXCI6IHtcbiAgICAgICAgICB5anMuc2V0KGtleSwgY29udmVydEpzb25Ub1lqc0RhdGEocGF0Y2gudmFsdWUpKVxuICAgICAgICAgIGJyZWFrXG4gICAgICAgIH1cbiAgICAgICAgY2FzZSBcInJlbW92ZVwiOiB7XG4gICAgICAgICAgeWpzLmRlbGV0ZShrZXkpXG4gICAgICAgICAgYnJlYWtcbiAgICAgICAgfVxuICAgICAgICBkZWZhdWx0OiB7XG4gICAgICAgICAgdGhyb3cgZmFpbHVyZShgaW52YWxpZCBwYXRjaCBvcGVyYXRpb24gZm9yIG1hcGApXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHlqcyBpbnN0YW5jZW9mIFkuQXJyYXkpIHtcbiAgICAgIGNvbnN0IGtleSA9IHBhdGNoLnBhdGhbMF1cblxuICAgICAgc3dpdGNoIChwYXRjaC5vcCkge1xuICAgICAgICBjYXNlIFwicmVwbGFjZVwiOiB7XG4gICAgICAgICAgaWYgKGtleSA9PT0gXCJsZW5ndGhcIikge1xuICAgICAgICAgICAgaWYgKHlqcy5sZW5ndGggPiBwYXRjaC52YWx1ZSkge1xuICAgICAgICAgICAgICBjb25zdCB0b0RlbGV0ZSA9IHlqcy5sZW5ndGggLSBwYXRjaC52YWx1ZVxuICAgICAgICAgICAgICB5anMuZGVsZXRlKHBhdGNoLnZhbHVlLCB0b0RlbGV0ZSlcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoeWpzLmxlbmd0aCA8IHBhdGNoLnZhbHVlKSB7XG4gICAgICAgICAgICAgIGNvbnN0IHRvSW5zZXJ0ID0gcGF0Y2gudmFsdWUgLSB5anMubGVuZ3RoXG4gICAgICAgICAgICAgIHlqcy5pbnNlcnQoeWpzLmxlbmd0aCwgQXJyYXkodG9JbnNlcnQpLmZpbGwodW5kZWZpbmVkKSlcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgeWpzLmRlbGV0ZShOdW1iZXIoa2V5KSlcbiAgICAgICAgICAgIHlqcy5pbnNlcnQoTnVtYmVyKGtleSksIFtjb252ZXJ0SnNvblRvWWpzRGF0YShwYXRjaC52YWx1ZSldKVxuICAgICAgICAgIH1cbiAgICAgICAgICBicmVha1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgXCJhZGRcIjoge1xuICAgICAgICAgIHlqcy5pbnNlcnQoTnVtYmVyKGtleSksIFtjb252ZXJ0SnNvblRvWWpzRGF0YShwYXRjaC52YWx1ZSldKVxuICAgICAgICAgIGJyZWFrXG4gICAgICAgIH1cbiAgICAgICAgY2FzZSBcInJlbW92ZVwiOiB7XG4gICAgICAgICAgeWpzLmRlbGV0ZShOdW1iZXIoa2V5KSlcbiAgICAgICAgICBicmVha1xuICAgICAgICB9XG4gICAgICAgIGRlZmF1bHQ6IHtcbiAgICAgICAgICB0aHJvdyBmYWlsdXJlKGBpbnZhbGlkIHBhdGNoIG9wZXJhdGlvbiBmb3IgYXJyYXlgKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IGZhaWx1cmUoXG4gICAgICAgIGBpbnZhbGlkIHBhdGNoIHBhdGgsIHRoZSBZanMgb2JqZWN0IGlzIG9mIGFuIHVua293biB0eXBlLCBzbyBrZXkgXCIke3BhdGNoLnBhdGhbMF19XCIgY2Fubm90IGJlIGZvdW5kIGluIGl0YFxuICAgICAgKVxuICAgIH1cbiAgfSBlbHNlIHtcbiAgICB0aHJvdyBmYWlsdXJlKGBpbnZhbGlkIHBhdGNoIHBhdGgsIGl0IGNhbm5vdCBiZSBlbXB0eWApXG4gIH1cbn1cbiIsImltcG9ydCB7IFBhdGNoIH0gZnJvbSBcIm1vYngta2V5c3RvbmVcIlxuaW1wb3J0ICogYXMgWSBmcm9tIFwieWpzXCJcbmltcG9ydCB7IEpzb25BcnJheSwgSnNvbk9iamVjdCwgSnNvblZhbHVlIH0gZnJvbSBcIi4uL2pzb25UeXBlc1wiXG5pbXBvcnQgeyBmYWlsdXJlIH0gZnJvbSBcIi4uL3V0aWxzL2Vycm9yXCJcblxuZXhwb3J0IGZ1bmN0aW9uIGNvbnZlcnRZanNFdmVudFRvUGF0Y2hlcyhldmVudDogWS5ZRXZlbnQ8YW55Pik6IFBhdGNoW10ge1xuICBjb25zdCBwYXRjaGVzOiBQYXRjaFtdID0gW11cblxuICBpZiAoZXZlbnQgaW5zdGFuY2VvZiBZLllNYXBFdmVudCkge1xuICAgIGNvbnN0IHNvdXJjZSA9IGV2ZW50LnRhcmdldCBhcyBZLk1hcDxhbnk+XG5cbiAgICBldmVudC5jaGFuZ2VzLmtleXMuZm9yRWFjaCgoY2hhbmdlLCBrZXkpID0+IHtcbiAgICAgIGNvbnN0IHBhdGggPSBbLi4uZXZlbnQucGF0aCwga2V5XVxuXG4gICAgICBzd2l0Y2ggKGNoYW5nZS5hY3Rpb24pIHtcbiAgICAgICAgY2FzZSBcImFkZFwiOlxuICAgICAgICAgIHBhdGNoZXMucHVzaCh7XG4gICAgICAgICAgICBvcDogXCJhZGRcIixcbiAgICAgICAgICAgIHBhdGgsXG4gICAgICAgICAgICB2YWx1ZTogdG9QbGFpblZhbHVlKHNvdXJjZS5nZXQoa2V5KSksXG4gICAgICAgICAgfSlcbiAgICAgICAgICBicmVha1xuXG4gICAgICAgIGNhc2UgXCJ1cGRhdGVcIjpcbiAgICAgICAgICBwYXRjaGVzLnB1c2goe1xuICAgICAgICAgICAgb3A6IFwicmVwbGFjZVwiLFxuICAgICAgICAgICAgcGF0aCxcbiAgICAgICAgICAgIHZhbHVlOiB0b1BsYWluVmFsdWUoc291cmNlLmdldChrZXkpKSxcbiAgICAgICAgICB9KVxuICAgICAgICAgIGJyZWFrXG5cbiAgICAgICAgY2FzZSBcImRlbGV0ZVwiOlxuICAgICAgICAgIHBhdGNoZXMucHVzaCh7XG4gICAgICAgICAgICBvcDogXCJyZW1vdmVcIixcbiAgICAgICAgICAgIHBhdGgsXG4gICAgICAgICAgfSlcbiAgICAgICAgICBicmVha1xuXG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgdGhyb3cgZmFpbHVyZShgdW5zdXBwb3J0ZWQgWWpzIG1hcCBldmVudCBhY3Rpb246ICR7Y2hhbmdlLmFjdGlvbn1gKVxuICAgICAgfVxuICAgIH0pXG4gIH0gZWxzZSBpZiAoZXZlbnQgaW5zdGFuY2VvZiBZLllBcnJheUV2ZW50KSB7XG4gICAgbGV0IHJldGFpbiA9IDBcbiAgICBldmVudC5jaGFuZ2VzLmRlbHRhLmZvckVhY2goKGNoYW5nZSkgPT4ge1xuICAgICAgaWYgKGNoYW5nZS5yZXRhaW4pIHtcbiAgICAgICAgcmV0YWluICs9IGNoYW5nZS5yZXRhaW5cbiAgICAgIH1cblxuICAgICAgaWYgKGNoYW5nZS5kZWxldGUpIHtcbiAgICAgICAgLy8gcmVtb3ZlIFggaXRlbXMgYXQgcmV0YWluIHBvc2l0aW9uXG4gICAgICAgIGNvbnN0IHBhdGggPSBbLi4uZXZlbnQucGF0aCwgcmV0YWluXVxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNoYW5nZS5kZWxldGU7IGkrKykge1xuICAgICAgICAgIHBhdGNoZXMucHVzaCh7XG4gICAgICAgICAgICBvcDogXCJyZW1vdmVcIixcbiAgICAgICAgICAgIHBhdGgsXG4gICAgICAgICAgfSlcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAoY2hhbmdlLmluc2VydCkge1xuICAgICAgICBjb25zdCBuZXdWYWx1ZXMgPSBBcnJheS5pc0FycmF5KGNoYW5nZS5pbnNlcnQpID8gY2hhbmdlLmluc2VydCA6IFtjaGFuZ2UuaW5zZXJ0XVxuICAgICAgICBuZXdWYWx1ZXMuZm9yRWFjaCgodikgPT4ge1xuICAgICAgICAgIGNvbnN0IHBhdGggPSBbLi4uZXZlbnQucGF0aCwgcmV0YWluXVxuICAgICAgICAgIHBhdGNoZXMucHVzaCh7XG4gICAgICAgICAgICBvcDogXCJhZGRcIixcbiAgICAgICAgICAgIHBhdGgsXG4gICAgICAgICAgICB2YWx1ZTogdG9QbGFpblZhbHVlKHYpLFxuICAgICAgICAgIH0pXG4gICAgICAgICAgcmV0YWluKytcbiAgICAgICAgfSlcbiAgICAgIH1cbiAgICB9KVxuICB9XG5cbiAgcmV0dXJuIHBhdGNoZXNcbn1cblxuZnVuY3Rpb24gdG9QbGFpblZhbHVlKHY6IFkuTWFwPGFueT4gfCBZLkFycmF5PGFueT4gfCBKc29uVmFsdWUpIHtcbiAgaWYgKHYgaW5zdGFuY2VvZiBZLk1hcCB8fCB2IGluc3RhbmNlb2YgWS5BcnJheSkge1xuICAgIHJldHVybiB2LnRvSlNPTigpIGFzIEpzb25PYmplY3QgfCBKc29uQXJyYXlcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gdlxuICB9XG59XG4iLCJpbXBvcnQgeyBBbnlUeXBlLCBjcmVhdGVDb250ZXh0IH0gZnJvbSBcIm1vYngta2V5c3RvbmVcIlxuaW1wb3J0ICogYXMgWSBmcm9tIFwieWpzXCJcblxuZXhwb3J0IGludGVyZmFjZSBZanNCaW5kaW5nQ29udGV4dCB7XG4gIHlqc0RvYzogWS5Eb2NcbiAgeWpzT2JqZWN0OiBZLk1hcDx1bmtub3duPiB8IFkuQXJyYXk8dW5rbm93bj5cbiAgbW9ieEtleXN0b25lVHlwZTogQW55VHlwZVxuICB5anNPcmlnaW46IHN5bWJvbFxufVxuXG5leHBvcnQgY29uc3QgeWpzQmluZGluZ0NvbnRleHQgPSBjcmVhdGVDb250ZXh0PFlqc0JpbmRpbmdDb250ZXh0IHwgdW5kZWZpbmVkPih1bmRlZmluZWQpXG4iLCJpbXBvcnQge1xuICBBbnlEYXRhTW9kZWwsXG4gIEFueU1vZGVsLFxuICBBbnlTdGFuZGFyZFR5cGUsXG4gIE1vZGVsQ2xhc3MsXG4gIFBhdGNoLFxuICBUeXBlVG9EYXRhLFxuICBhcHBseVBhdGNoZXMsXG4gIGZyb21TbmFwc2hvdCxcbiAgZ2V0UGFyZW50VG9DaGlsZFBhdGgsXG4gIG9uR2xvYmFsUGF0Y2hlcyxcbiAgb25QYXRjaGVzLFxuICBvblNuYXBzaG90LFxufSBmcm9tIFwibW9ieC1rZXlzdG9uZVwiXG5pbXBvcnQgKiBhcyBZIGZyb20gXCJ5anNcIlxuaW1wb3J0IHsgYXBwbHlNb2J4S2V5c3RvbmVQYXRjaFRvWWpzT2JqZWN0IH0gZnJvbSBcIi4vYXBwbHlNb2J4S2V5c3RvbmVQYXRjaFRvWWpzT2JqZWN0XCJcbmltcG9ydCB7IGNvbnZlcnRZanNFdmVudFRvUGF0Y2hlcyB9IGZyb20gXCIuL2NvbnZlcnRZanNFdmVudFRvUGF0Y2hlc1wiXG5pbXBvcnQgeyBZanNCaW5kaW5nQ29udGV4dCwgeWpzQmluZGluZ0NvbnRleHQgfSBmcm9tIFwiLi95anNCaW5kaW5nQ29udGV4dFwiXG5cbmV4cG9ydCBmdW5jdGlvbiBiaW5kWWpzVG9Nb2J4S2V5c3RvbmU8XG4gIFRUeXBlIGV4dGVuZHMgQW55U3RhbmRhcmRUeXBlIHwgTW9kZWxDbGFzczxBbnlNb2RlbD4gfCBNb2RlbENsYXNzPEFueURhdGFNb2RlbD4sXG4+KHtcbiAgeWpzRG9jLFxuICB5anNPYmplY3QsXG4gIG1vYnhLZXlzdG9uZVR5cGUsXG59OiB7XG4gIHlqc0RvYzogWS5Eb2NcbiAgeWpzT2JqZWN0OiBZLk1hcDx1bmtub3duPiB8IFkuQXJyYXk8dW5rbm93bj5cbiAgbW9ieEtleXN0b25lVHlwZTogVFR5cGVcbn0pOiB7XG4gIGJvdW5kT2JqZWN0OiBUeXBlVG9EYXRhPFRUeXBlPlxuICBkaXNwb3NlKCk6IHZvaWRcbiAgeWpzT3JpZ2luOiBzeW1ib2xcbn0ge1xuICBjb25zdCB5anNPcmlnaW4gPSBTeW1ib2woXCJiaW5kWWpzVG9Nb2J4S2V5c3RvbmVUcmFuc2FjdGlvbk9yaWdpblwiKVxuXG4gIGNvbnN0IGJpbmRpbmdDb250ZXh0OiBZanNCaW5kaW5nQ29udGV4dCA9IHtcbiAgICB5anNEb2MsXG4gICAgeWpzT2JqZWN0LFxuICAgIG1vYnhLZXlzdG9uZVR5cGUsXG4gICAgeWpzT3JpZ2luLFxuICB9XG5cbiAgY29uc3QgeWpzSnNvbiA9IHlqc09iamVjdC50b0pTT04oKVxuXG4gIGNvbnN0IGluaXRpYWxpemF0aW9uR2xvYmFsUGF0Y2hlczogeyB0YXJnZXQ6IG9iamVjdDsgcGF0Y2hlczogUGF0Y2hbXSB9W10gPSBbXVxuXG4gIGNvbnN0IGNyZWF0ZUJvdW5kT2JqZWN0ID0gKCkgPT4ge1xuICAgIGNvbnN0IGRpc3Bvc2VPbkdsb2JhbFBhdGNoZXMgPSBvbkdsb2JhbFBhdGNoZXMoKHRhcmdldCwgcGF0Y2hlcykgPT4ge1xuICAgICAgaW5pdGlhbGl6YXRpb25HbG9iYWxQYXRjaGVzLnB1c2goeyB0YXJnZXQsIHBhdGNoZXMgfSlcbiAgICB9KVxuXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGJvdW5kT2JqZWN0ID0geWpzQmluZGluZ0NvbnRleHQuYXBwbHkoXG4gICAgICAgICgpID0+IGZyb21TbmFwc2hvdChtb2J4S2V5c3RvbmVUeXBlLCB5anNKc29uIGFzIGFueSksXG4gICAgICAgIGJpbmRpbmdDb250ZXh0XG4gICAgICApXG4gICAgICB5anNCaW5kaW5nQ29udGV4dC5zZXQoYm91bmRPYmplY3QsIGJpbmRpbmdDb250ZXh0KVxuICAgICAgcmV0dXJuIGJvdW5kT2JqZWN0XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIGRpc3Bvc2VPbkdsb2JhbFBhdGNoZXMoKVxuICAgIH1cbiAgfVxuXG4gIGNvbnN0IGJvdW5kT2JqZWN0ID0gY3JlYXRlQm91bmRPYmplY3QoKVxuXG4gIGxldCBhcHBseWluZ01vYnhLZXlzdG9uZUNoYW5nZXMgPSAwXG5cbiAgLy8gYmluZCBhbnkgY2hhbmdlcyBmcm9tIHlqcyB0byBtb2J4LWtleXN0b25lXG4gIGNvbnN0IG9ic2VydmVEZWVwQ2IgPSAoZXZlbnRzOiBZLllFdmVudDxhbnk+W10pID0+IHtcbiAgICBjb25zdCBwYXRjaGVzOiBQYXRjaFtdID0gW11cbiAgICBldmVudHMuZm9yRWFjaCgoZXZlbnQpID0+IHtcbiAgICAgIGlmIChldmVudC50cmFuc2FjdGlvbi5vcmlnaW4gIT09IHlqc09yaWdpbikge1xuICAgICAgICBwYXRjaGVzLnB1c2goLi4uY29udmVydFlqc0V2ZW50VG9QYXRjaGVzKGV2ZW50KSlcbiAgICAgIH1cbiAgICB9KVxuXG4gICAgaWYgKHBhdGNoZXMubGVuZ3RoID4gMCkge1xuICAgICAgYXBwbHlpbmdNb2J4S2V5c3RvbmVDaGFuZ2VzKytcbiAgICAgIHRyeSB7XG4gICAgICAgIGFwcGx5UGF0Y2hlcyhib3VuZE9iamVjdCwgcGF0Y2hlcylcbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIGFwcGx5aW5nTW9ieEtleXN0b25lQ2hhbmdlcy0tXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgeWpzT2JqZWN0Lm9ic2VydmVEZWVwKG9ic2VydmVEZWVwQ2IpXG5cbiAgLy8gYmluZCBhbnkgY2hhbmdlcyBmcm9tIG1vYngta2V5c3RvbmUgdG8geWpzXG4gIGxldCBwZW5kaW5nUGF0Y2hlczogUGF0Y2hbXSA9IFtdXG4gIGNvbnN0IGRpc3Bvc2VPblBhdGNoZXMgPSBvblBhdGNoZXMoYm91bmRPYmplY3QsIChwYXRjaGVzKSA9PiB7XG4gICAgaWYgKGFwcGx5aW5nTW9ieEtleXN0b25lQ2hhbmdlcyA+IDApIHtcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIHBlbmRpbmdQYXRjaGVzLnB1c2goLi4ucGF0Y2hlcylcbiAgfSlcblxuICAvLyB0aGlzIGlzIG9ubHkgdXNlZCBzbyB3ZSBjYW4gdHJhbnNhY3QgYWxsIHBhdGNoZXMgdG8gdGhlIHNuYXBzaG90IGJvdW5kYXJ5XG4gIGNvbnN0IGRpc3Bvc2VPblNuYXBzaG90ID0gb25TbmFwc2hvdChib3VuZE9iamVjdCwgKCkgPT4ge1xuICAgIGlmIChwZW5kaW5nUGF0Y2hlcy5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGNvbnN0IHBhdGNoZXMgPSBwZW5kaW5nUGF0Y2hlc1xuICAgIHBlbmRpbmdQYXRjaGVzID0gW11cblxuICAgIHlqc0RvYy50cmFuc2FjdCgoKSA9PiB7XG4gICAgICBwYXRjaGVzLmZvckVhY2goKHBhdGNoKSA9PiB7XG4gICAgICAgIGFwcGx5TW9ieEtleXN0b25lUGF0Y2hUb1lqc09iamVjdChwYXRjaCwgeWpzT2JqZWN0KVxuICAgICAgfSlcbiAgICB9LCB5anNPcmlnaW4pXG4gIH0pXG5cbiAgLy8gc3luYyBpbml0aWFsIHBhdGNoZXMsIHRoYXQgbWlnaHQgaW5jbHVkZSBzZXR0aW5nIGRlZmF1bHRzLCBJRHMsIGV0Y1xuICB5anNEb2MudHJhbnNhY3QoKCkgPT4ge1xuICAgIC8vIHdlIG5lZWQgdG8gc2tpcCBpbml0aWFsaXphdGlvbnMgdW50aWwgd2UgaGl0IHRoZSBpbml0aWFsaXphdGlvbiBvZiB0aGUgYm91bmQgb2JqZWN0XG4gICAgLy8gdGhpcyBpcyBiZWNhdXNlIGRlZmF1bHQgb2JqZWN0cyBtaWdodCBiZSBjcmVhdGVkIGFuZCBpbml0aWFsaXplZCBiZWZvcmUgdGhlIG1haW4gb2JqZWN0XG4gICAgLy8gYnV0IHdlIGp1c3QgbmVlZCB0byBjYXRjaCB3aGVuIHRob3NlIGFyZSBhY3R1YWxseSBhc3NpZ25lZCB0byB0aGUgYm91bmQgb2JqZWN0XG4gICAgbGV0IGJvdW5kT2JqZWN0Rm91bmQgPSBmYWxzZVxuXG4gICAgaW5pdGlhbGl6YXRpb25HbG9iYWxQYXRjaGVzLmZvckVhY2goKHsgdGFyZ2V0LCBwYXRjaGVzIH0pID0+IHtcbiAgICAgIGlmICghYm91bmRPYmplY3RGb3VuZCkge1xuICAgICAgICBpZiAodGFyZ2V0ICE9PSBib3VuZE9iamVjdCkge1xuICAgICAgICAgIHJldHVybiAvLyBza2lwXG4gICAgICAgIH1cbiAgICAgICAgYm91bmRPYmplY3RGb3VuZCA9IHRydWVcbiAgICAgIH1cblxuICAgICAgY29uc3QgcGFyZW50VG9DaGlsZFBhdGggPSBnZXRQYXJlbnRUb0NoaWxkUGF0aChib3VuZE9iamVjdCwgdGFyZ2V0KVxuICAgICAgLy8gdGhpcyBpcyB1bmRlZmluZWQgb25seSBpZiB0YXJnZXQgaXMgbm90IGEgY2hpbGQgb2YgYm91bmRNb2RlbFxuICAgICAgaWYgKHBhcmVudFRvQ2hpbGRQYXRoICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgcGF0Y2hlcy5mb3JFYWNoKChwYXRjaCkgPT4ge1xuICAgICAgICAgIGFwcGx5TW9ieEtleXN0b25lUGF0Y2hUb1lqc09iamVjdChcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgLi4ucGF0Y2gsXG4gICAgICAgICAgICAgIHBhdGg6IFsuLi5wYXJlbnRUb0NoaWxkUGF0aCwgLi4ucGF0Y2gucGF0aF0sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgeWpzT2JqZWN0XG4gICAgICAgICAgKVxuICAgICAgICB9KVxuICAgICAgfVxuICAgIH0pXG4gIH0sIHlqc09yaWdpbilcblxuICByZXR1cm4ge1xuICAgIGJvdW5kT2JqZWN0LFxuICAgIGRpc3Bvc2U6ICgpID0+IHtcbiAgICAgIGRpc3Bvc2VPblBhdGNoZXMoKVxuICAgICAgZGlzcG9zZU9uU25hcHNob3QoKVxuICAgICAgeWpzT2JqZWN0LnVub2JzZXJ2ZURlZXAob2JzZXJ2ZURlZXBDYilcbiAgICB9LFxuICAgIHlqc09yaWdpbixcbiAgfVxu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
|