mobx-keystone-yjs 1.0.0 → 1.1.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 CHANGED
@@ -1,5 +1,9 @@
1
- # Change Log
2
-
3
- ## 1.0.0
4
-
5
- - First public release.
1
+ # Change Log
2
+
3
+ ## 1.1.0
4
+
5
+ - Added the `convertJsonToYjsData`, `applyJsonArrayToYArray` and `applyJsonObjectToYMap` function to help with first migrations from snapshots to Y.js states.
6
+
7
+ ## 1.0.0
8
+
9
+ - First public release.
@@ -9,37 +9,38 @@ class MobxKeystoneYjsError extends Error {
9
9
  function failure(msg) {
10
10
  return new MobxKeystoneYjsError(msg);
11
11
  }
12
- function isJSONPrimitive(v) {
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 isJSONArray(v) {
16
+ function isJsonArray(v) {
17
17
  return Array.isArray(v);
18
18
  }
19
- function isJSONObject(v) {
20
- return !isJSONArray(v) && typeof v === "object";
19
+ function isJsonObject(v) {
20
+ return !isJsonArray(v) && typeof v === "object";
21
21
  }
22
- function toYDataType(v) {
23
- if (isJSONPrimitive(v)) {
22
+ function convertJsonToYjsData(v) {
23
+ if (v === void 0 || isJsonPrimitive(v)) {
24
24
  return v;
25
- } else if (isJSONArray(v)) {
25
+ }
26
+ if (isJsonArray(v)) {
26
27
  const arr = new Y.Array();
27
- applyJsonArray(arr, v);
28
+ applyJsonArrayYArray(arr, v);
28
29
  return arr;
29
- } else if (isJSONObject(v)) {
30
+ }
31
+ if (isJsonObject(v)) {
30
32
  const map = new Y.Map();
31
- applyJsonObject(map, v);
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 applyJsonArray(dest, source) {
38
- dest.push(source.map(toYDataType));
38
+ function applyJsonArrayYArray(dest, source) {
39
+ dest.push(source.map(convertJsonToYjsData));
39
40
  }
40
- function applyJsonObject(dest, source) {
41
+ function applyJsonObjectToYMap(dest, source) {
41
42
  Object.entries(source).forEach(([k, v]) => {
42
- dest.set(k, toYDataType(v));
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, toYDataType(patch.value));
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), [toYDataType(patch.value)]);
95
+ yjs.insert(Number(key), [convertJsonToYjsData(patch.value)]);
95
96
  }
96
97
  break;
97
98
  }
98
99
  case "add": {
99
- yjs.insert(Number(key), [toYDataType(patch.value)]);
100
+ yjs.insert(Number(key), [convertJsonToYjsData(patch.value)]);
100
101
  break;
101
102
  }
102
103
  case "remove": {
@@ -267,6 +268,9 @@ function bindYjsToMobxKeystone({ yjsDoc, yjsObject, mobxKeystoneType }) {
267
268
  }
268
269
  export {
269
270
  MobxKeystoneYjsError,
270
- bindYjsToMobxKeystone
271
+ applyJsonArrayYArray,
272
+ applyJsonObjectToYMap,
273
+ bindYjsToMobxKeystone,
274
+ convertJsonToYjsData
271
275
  };
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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
276
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibW9ieC1rZXlzdG9uZS15anMuZXNtLm1qcyIsInNvdXJjZXMiOlsiLi4vc3JjL3V0aWxzL2Vycm9yLnRzIiwiLi4vc3JjL2JpbmRpbmcvY29udmVydEpzb25Ub1lqc0RhdGEudHMiLCIuLi9zcmMvYmluZGluZy9hcHBseU1vYnhLZXlzdG9uZVBhdGNoVG9ZanNPYmplY3QudHMiLCIuLi9zcmMvYmluZGluZy9jb252ZXJ0WWpzRXZlbnRUb1BhdGNoZXMudHMiLCIuLi9zcmMvYmluZGluZy9iaW5kWWpzVG9Nb2J4S2V5c3RvbmUudHMiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqXHJcbiAqIEEgbW9ieC1rZXlzdG9uZS15anMgZXJyb3IuXHJcbiAqL1xyXG5leHBvcnQgY2xhc3MgTW9ieEtleXN0b25lWWpzRXJyb3IgZXh0ZW5kcyBFcnJvciB7XHJcbiAgY29uc3RydWN0b3IobXNnOiBzdHJpbmcpIHtcclxuICAgIHN1cGVyKG1zZylcclxuXHJcbiAgICAvLyBTZXQgdGhlIHByb3RvdHlwZSBleHBsaWNpdGx5LlxyXG4gICAgT2JqZWN0LnNldFByb3RvdHlwZU9mKHRoaXMsIE1vYnhLZXlzdG9uZVlqc0Vycm9yLnByb3RvdHlwZSlcclxuICB9XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBAaW50ZXJuYWxcclxuICovXHJcbmV4cG9ydCBmdW5jdGlvbiBmYWlsdXJlKG1zZzogc3RyaW5nKSB7XHJcbiAgcmV0dXJuIG5ldyBNb2J4S2V5c3RvbmVZanNFcnJvcihtc2cpXHJcbn1cclxuIiwiaW1wb3J0ICogYXMgWSBmcm9tIFwieWpzXCJcbmltcG9ydCB7IEpzb25WYWx1ZSwgSnNvbkFycmF5LCBKc29uT2JqZWN0LCBKc29uUHJpbWl0aXZlIH0gZnJvbSBcIi4uL2pzb25UeXBlc1wiXG5cbmZ1bmN0aW9uIGlzSnNvblByaW1pdGl2ZSh2OiBKc29uVmFsdWUpOiB2IGlzIEpzb25QcmltaXRpdmUge1xuICBjb25zdCB0ID0gdHlwZW9mIHZcbiAgcmV0dXJuIHQgPT09IFwic3RyaW5nXCIgfHwgdCA9PT0gXCJudW1iZXJcIiB8fCB0ID09PSBcImJvb2xlYW5cIiB8fCB2ID09PSBudWxsXG59XG5cbmZ1bmN0aW9uIGlzSnNvbkFycmF5KHY6IEpzb25WYWx1ZSk6IHYgaXMgSnNvbkFycmF5IHtcbiAgcmV0dXJuIEFycmF5LmlzQXJyYXkodilcbn1cblxuZnVuY3Rpb24gaXNKc29uT2JqZWN0KHY6IEpzb25WYWx1ZSk6IHYgaXMgSnNvbk9iamVjdCB7XG4gIHJldHVybiAhaXNKc29uQXJyYXkodikgJiYgdHlwZW9mIHYgPT09IFwib2JqZWN0XCJcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNvbnZlcnRKc29uVG9ZanNEYXRhKHY6IEpzb25WYWx1ZSkge1xuICBpZiAodiA9PT0gdW5kZWZpbmVkIHx8IGlzSnNvblByaW1pdGl2ZSh2KSkge1xuICAgIHJldHVybiB2XG4gIH1cblxuICBpZiAoaXNKc29uQXJyYXkodikpIHtcbiAgICBjb25zdCBhcnIgPSBuZXcgWS5BcnJheSgpXG4gICAgYXBwbHlKc29uQXJyYXlZQXJyYXkoYXJyLCB2KVxuICAgIHJldHVybiBhcnJcbiAgfVxuXG4gIGlmIChpc0pzb25PYmplY3QodikpIHtcbiAgICBjb25zdCBtYXAgPSBuZXcgWS5NYXAoKVxuICAgIGFwcGx5SnNvbk9iamVjdFRvWU1hcChtYXAsIHYpXG4gICAgcmV0dXJuIG1hcFxuICB9XG5cbiAgdGhyb3cgbmV3IEVycm9yKGB1bnN1cHBvcnRlZCB2YWx1ZSB0eXBlOiAke3Z9YClcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGFwcGx5SnNvbkFycmF5WUFycmF5KGRlc3Q6IFkuQXJyYXk8dW5rbm93bj4sIHNvdXJjZTogSnNvbkFycmF5KSB7XG4gIGRlc3QucHVzaChzb3VyY2UubWFwKGNvbnZlcnRKc29uVG9ZanNEYXRhKSlcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGFwcGx5SnNvbk9iamVjdFRvWU1hcChkZXN0OiBZLk1hcDx1bmtub3duPiwgc291cmNlOiBKc29uT2JqZWN0KSB7XG4gIE9iamVjdC5lbnRyaWVzKHNvdXJjZSkuZm9yRWFjaCgoW2ssIHZdKSA9PiB7XG4gICAgZGVzdC5zZXQoaywgY29udmVydEpzb25Ub1lqc0RhdGEodikpXG4gIH0pXG59XG4iLCJpbXBvcnQgeyBQYXRjaCB9IGZyb20gXCJtb2J4LWtleXN0b25lXCJcbmltcG9ydCAqIGFzIFkgZnJvbSBcInlqc1wiXG5pbXBvcnQgeyBmYWlsdXJlIH0gZnJvbSBcIi4uL3V0aWxzL2Vycm9yXCJcbmltcG9ydCB7IGNvbnZlcnRKc29uVG9ZanNEYXRhIH0gZnJvbSBcIi4vY29udmVydEpzb25Ub1lqc0RhdGFcIlxuXG5leHBvcnQgZnVuY3Rpb24gYXBwbHlNb2J4S2V5c3RvbmVQYXRjaFRvWWpzT2JqZWN0KHBhdGNoOiBQYXRjaCwgeWpzOiB1bmtub3duKTogdm9pZCB7XG4gIGlmIChwYXRjaC5wYXRoLmxlbmd0aCA+IDEpIHtcbiAgICBjb25zdCBba2V5LCAuLi5yZXN0XSA9IHBhdGNoLnBhdGhcblxuICAgIGlmICh5anMgaW5zdGFuY2VvZiBZLk1hcCkge1xuICAgICAgY29uc3QgY2hpbGQgPSB5anMuZ2V0KFN0cmluZyhrZXkpKVxuICAgICAgaWYgKGNoaWxkID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgdGhyb3cgZmFpbHVyZShcbiAgICAgICAgICBgaW52YWxpZCBwYXRjaCBwYXRoLCBrZXkgXCIke2tleX1cIiBub3QgZm91bmQgaW4gWWpzIG1hcCAtIHBhdGNoOiAke0pTT04uc3RyaW5naWZ5KHBhdGNoKX1gXG4gICAgICAgIClcbiAgICAgIH1cbiAgICAgIGFwcGx5TW9ieEtleXN0b25lUGF0Y2hUb1lqc09iamVjdCh7IC4uLnBhdGNoLCBwYXRoOiByZXN0IH0sIGNoaWxkKVxuICAgIH0gZWxzZSBpZiAoeWpzIGluc3RhbmNlb2YgWS5BcnJheSkge1xuICAgICAgY29uc3QgY2hpbGQgPSB5anMuZ2V0KE51bWJlcihrZXkpKVxuICAgICAgaWYgKGNoaWxkID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgdGhyb3cgZmFpbHVyZShcbiAgICAgICAgICBgaW52YWxpZCBwYXRjaCBwYXRoLCBrZXkgXCIke2tleX1cIiBub3QgZm91bmQgaW4gWWpzIGFycmF5IC0gcGF0Y2g6ICR7SlNPTi5zdHJpbmdpZnkoXG4gICAgICAgICAgICBwYXRjaFxuICAgICAgICAgICl9YFxuICAgICAgICApXG4gICAgICB9XG4gICAgICBhcHBseU1vYnhLZXlzdG9uZVBhdGNoVG9ZanNPYmplY3QoeyAuLi5wYXRjaCwgcGF0aDogcmVzdCB9LCBjaGlsZClcbiAgICB9IGVsc2Uge1xuICAgICAgdGhyb3cgZmFpbHVyZShcbiAgICAgICAgYGludmFsaWQgcGF0Y2ggcGF0aCwga2V5IFwiJHtrZXl9XCIgbm90IGZvdW5kIGluIHVua25vd24gWWpzIG9iamVjdCAtIHBhdGNoOiAke0pTT04uc3RyaW5naWZ5KFxuICAgICAgICAgIHBhdGNoXG4gICAgICAgICl9YFxuICAgICAgKVxuICAgIH1cbiAgfSBlbHNlIGlmIChwYXRjaC5wYXRoLmxlbmd0aCA9PT0gMSkge1xuICAgIGlmICh5anMgaW5zdGFuY2VvZiBZLk1hcCkge1xuICAgICAgY29uc3Qga2V5ID0gU3RyaW5nKHBhdGNoLnBhdGhbMF0pXG5cbiAgICAgIHN3aXRjaCAocGF0Y2gub3ApIHtcbiAgICAgICAgY2FzZSBcImFkZFwiOlxuICAgICAgICBjYXNlIFwicmVwbGFjZVwiOiB7XG4gICAgICAgICAgeWpzLnNldChrZXksIGNvbnZlcnRKc29uVG9ZanNEYXRhKHBhdGNoLnZhbHVlKSlcbiAgICAgICAgICBicmVha1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgXCJyZW1vdmVcIjoge1xuICAgICAgICAgIHlqcy5kZWxldGUoa2V5KVxuICAgICAgICAgIGJyZWFrXG4gICAgICAgIH1cbiAgICAgICAgZGVmYXVsdDoge1xuICAgICAgICAgIHRocm93IGZhaWx1cmUoYGludmFsaWQgcGF0Y2ggb3BlcmF0aW9uIGZvciBtYXBgKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBlbHNlIGlmICh5anMgaW5zdGFuY2VvZiBZLkFycmF5KSB7XG4gICAgICBjb25zdCBrZXkgPSBwYXRjaC5wYXRoWzBdXG5cbiAgICAgIHN3aXRjaCAocGF0Y2gub3ApIHtcbiAgICAgICAgY2FzZSBcInJlcGxhY2VcIjoge1xuICAgICAgICAgIGlmIChrZXkgPT09IFwibGVuZ3RoXCIpIHtcbiAgICAgICAgICAgIGlmICh5anMubGVuZ3RoID4gcGF0Y2gudmFsdWUpIHtcbiAgICAgICAgICAgICAgY29uc3QgdG9EZWxldGUgPSB5anMubGVuZ3RoIC0gcGF0Y2gudmFsdWVcbiAgICAgICAgICAgICAgeWpzLmRlbGV0ZShwYXRjaC52YWx1ZSwgdG9EZWxldGUpXG4gICAgICAgICAgICB9IGVsc2UgaWYgKHlqcy5sZW5ndGggPCBwYXRjaC52YWx1ZSkge1xuICAgICAgICAgICAgICBjb25zdCB0b0luc2VydCA9IHBhdGNoLnZhbHVlIC0geWpzLmxlbmd0aFxuICAgICAgICAgICAgICB5anMuaW5zZXJ0KHlqcy5sZW5ndGgsIEFycmF5KHRvSW5zZXJ0KS5maWxsKHVuZGVmaW5lZCkpXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHlqcy5kZWxldGUoTnVtYmVyKGtleSkpXG4gICAgICAgICAgICB5anMuaW5zZXJ0KE51bWJlcihrZXkpLCBbY29udmVydEpzb25Ub1lqc0RhdGEocGF0Y2gudmFsdWUpXSlcbiAgICAgICAgICB9XG4gICAgICAgICAgYnJlYWtcbiAgICAgICAgfVxuICAgICAgICBjYXNlIFwiYWRkXCI6IHtcbiAgICAgICAgICB5anMuaW5zZXJ0KE51bWJlcihrZXkpLCBbY29udmVydEpzb25Ub1lqc0RhdGEocGF0Y2gudmFsdWUpXSlcbiAgICAgICAgICBicmVha1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgXCJyZW1vdmVcIjoge1xuICAgICAgICAgIHlqcy5kZWxldGUoTnVtYmVyKGtleSkpXG4gICAgICAgICAgYnJlYWtcbiAgICAgICAgfVxuICAgICAgICBkZWZhdWx0OiB7XG4gICAgICAgICAgdGhyb3cgZmFpbHVyZShgaW52YWxpZCBwYXRjaCBvcGVyYXRpb24gZm9yIGFycmF5YClcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyBmYWlsdXJlKFxuICAgICAgICBgaW52YWxpZCBwYXRjaCBwYXRoLCB0aGUgWWpzIG9iamVjdCBpcyBvZiBhbiB1bmtvd24gdHlwZSwgc28ga2V5IFwiJHtwYXRjaC5wYXRoWzBdfVwiIGNhbm5vdCBiZSBmb3VuZCBpbiBpdGBcbiAgICAgIClcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgdGhyb3cgZmFpbHVyZShgaW52YWxpZCBwYXRjaCBwYXRoLCBpdCBjYW5ub3QgYmUgZW1wdHlgKVxuICB9XG59XG4iLCJpbXBvcnQgeyBQYXRjaCB9IGZyb20gXCJtb2J4LWtleXN0b25lXCJcbmltcG9ydCAqIGFzIFkgZnJvbSBcInlqc1wiXG5pbXBvcnQgeyBKc29uQXJyYXksIEpzb25PYmplY3QsIEpzb25WYWx1ZSB9IGZyb20gXCIuLi9qc29uVHlwZXNcIlxuaW1wb3J0IHsgZmFpbHVyZSB9IGZyb20gXCIuLi91dGlscy9lcnJvclwiXG5cbmV4cG9ydCBmdW5jdGlvbiBjb252ZXJ0WWpzRXZlbnRUb1BhdGNoZXMoZXZlbnQ6IFkuWUV2ZW50PGFueT4pOiBQYXRjaFtdIHtcbiAgY29uc3QgcGF0Y2hlczogUGF0Y2hbXSA9IFtdXG5cbiAgaWYgKGV2ZW50IGluc3RhbmNlb2YgWS5ZTWFwRXZlbnQpIHtcbiAgICBjb25zdCBzb3VyY2UgPSBldmVudC50YXJnZXQgYXMgWS5NYXA8YW55PlxuXG4gICAgZXZlbnQuY2hhbmdlcy5rZXlzLmZvckVhY2goKGNoYW5nZSwga2V5KSA9PiB7XG4gICAgICBjb25zdCBwYXRoID0gWy4uLmV2ZW50LnBhdGgsIGtleV1cblxuICAgICAgc3dpdGNoIChjaGFuZ2UuYWN0aW9uKSB7XG4gICAgICAgIGNhc2UgXCJhZGRcIjpcbiAgICAgICAgICBwYXRjaGVzLnB1c2goe1xuICAgICAgICAgICAgb3A6IFwiYWRkXCIsXG4gICAgICAgICAgICBwYXRoLFxuICAgICAgICAgICAgdmFsdWU6IHRvUGxhaW5WYWx1ZShzb3VyY2UuZ2V0KGtleSkpLFxuICAgICAgICAgIH0pXG4gICAgICAgICAgYnJlYWtcblxuICAgICAgICBjYXNlIFwidXBkYXRlXCI6XG4gICAgICAgICAgcGF0Y2hlcy5wdXNoKHtcbiAgICAgICAgICAgIG9wOiBcInJlcGxhY2VcIixcbiAgICAgICAgICAgIHBhdGgsXG4gICAgICAgICAgICB2YWx1ZTogdG9QbGFpblZhbHVlKHNvdXJjZS5nZXQoa2V5KSksXG4gICAgICAgICAgfSlcbiAgICAgICAgICBicmVha1xuXG4gICAgICAgIGNhc2UgXCJkZWxldGVcIjpcbiAgICAgICAgICBwYXRjaGVzLnB1c2goe1xuICAgICAgICAgICAgb3A6IFwicmVtb3ZlXCIsXG4gICAgICAgICAgICBwYXRoLFxuICAgICAgICAgIH0pXG4gICAgICAgICAgYnJlYWtcblxuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIHRocm93IGZhaWx1cmUoYHVuc3VwcG9ydGVkIFlqcyBtYXAgZXZlbnQgYWN0aW9uOiAke2NoYW5nZS5hY3Rpb259YClcbiAgICAgIH1cbiAgICB9KVxuICB9IGVsc2UgaWYgKGV2ZW50IGluc3RhbmNlb2YgWS5ZQXJyYXlFdmVudCkge1xuICAgIGxldCByZXRhaW4gPSAwXG4gICAgZXZlbnQuY2hhbmdlcy5kZWx0YS5mb3JFYWNoKChjaGFuZ2UpID0+IHtcbiAgICAgIGlmIChjaGFuZ2UucmV0YWluKSB7XG4gICAgICAgIHJldGFpbiArPSBjaGFuZ2UucmV0YWluXG4gICAgICB9XG5cbiAgICAgIGlmIChjaGFuZ2UuZGVsZXRlKSB7XG4gICAgICAgIC8vIHJlbW92ZSBYIGl0ZW1zIGF0IHJldGFpbiBwb3NpdGlvblxuICAgICAgICBjb25zdCBwYXRoID0gWy4uLmV2ZW50LnBhdGgsIHJldGFpbl1cbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjaGFuZ2UuZGVsZXRlOyBpKyspIHtcbiAgICAgICAgICBwYXRjaGVzLnB1c2goe1xuICAgICAgICAgICAgb3A6IFwicmVtb3ZlXCIsXG4gICAgICAgICAgICBwYXRoLFxuICAgICAgICAgIH0pXG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKGNoYW5nZS5pbnNlcnQpIHtcbiAgICAgICAgY29uc3QgbmV3VmFsdWVzID0gQXJyYXkuaXNBcnJheShjaGFuZ2UuaW5zZXJ0KSA/IGNoYW5nZS5pbnNlcnQgOiBbY2hhbmdlLmluc2VydF1cbiAgICAgICAgbmV3VmFsdWVzLmZvckVhY2goKHYpID0+IHtcbiAgICAgICAgICBjb25zdCBwYXRoID0gWy4uLmV2ZW50LnBhdGgsIHJldGFpbl1cbiAgICAgICAgICBwYXRjaGVzLnB1c2goe1xuICAgICAgICAgICAgb3A6IFwiYWRkXCIsXG4gICAgICAgICAgICBwYXRoLFxuICAgICAgICAgICAgdmFsdWU6IHRvUGxhaW5WYWx1ZSh2KSxcbiAgICAgICAgICB9KVxuICAgICAgICAgIHJldGFpbisrXG4gICAgICAgIH0pXG4gICAgICB9XG4gICAgfSlcbiAgfVxuXG4gIHJldHVybiBwYXRjaGVzXG59XG5cbmZ1bmN0aW9uIHRvUGxhaW5WYWx1ZSh2OiBZLk1hcDxhbnk+IHwgWS5BcnJheTxhbnk+IHwgSnNvblZhbHVlKSB7XG4gIGlmICh2IGluc3RhbmNlb2YgWS5NYXAgfHwgdiBpbnN0YW5jZW9mIFkuQXJyYXkpIHtcbiAgICByZXR1cm4gdi50b0pTT04oKSBhcyBKc29uT2JqZWN0IHwgSnNvbkFycmF5XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIHZcbiAgfVxufVxuIiwiaW1wb3J0IHtcclxuICBBbnlEYXRhTW9kZWwsXHJcbiAgQW55TW9kZWwsXHJcbiAgQW55U3RhbmRhcmRUeXBlLFxyXG4gIE1vZGVsQ2xhc3MsXHJcbiAgUGF0Y2gsXHJcbiAgVHlwZVRvRGF0YSxcclxuICBhcHBseVBhdGNoZXMsXHJcbiAgZnJvbVNuYXBzaG90LFxyXG4gIGdldFBhcmVudFRvQ2hpbGRQYXRoLFxyXG4gIG9uR2xvYmFsUGF0Y2hlcyxcclxuICBvblBhdGNoZXMsXHJcbiAgb25TbmFwc2hvdCxcclxufSBmcm9tIFwibW9ieC1rZXlzdG9uZVwiXHJcbmltcG9ydCAqIGFzIFkgZnJvbSBcInlqc1wiXHJcbmltcG9ydCB7IGFwcGx5TW9ieEtleXN0b25lUGF0Y2hUb1lqc09iamVjdCB9IGZyb20gXCIuL2FwcGx5TW9ieEtleXN0b25lUGF0Y2hUb1lqc09iamVjdFwiXHJcbmltcG9ydCB7IGNvbnZlcnRZanNFdmVudFRvUGF0Y2hlcyB9IGZyb20gXCIuL2NvbnZlcnRZanNFdmVudFRvUGF0Y2hlc1wiXHJcblxyXG5leHBvcnQgZnVuY3Rpb24gYmluZFlqc1RvTW9ieEtleXN0b25lPFxyXG4gIFRUeXBlIGV4dGVuZHMgQW55U3RhbmRhcmRUeXBlIHwgTW9kZWxDbGFzczxBbnlNb2RlbD4gfCBNb2RlbENsYXNzPEFueURhdGFNb2RlbD4sXHJcbj4oe1xyXG4gIHlqc0RvYyxcclxuICB5anNPYmplY3QsXHJcbiAgbW9ieEtleXN0b25lVHlwZSxcclxufToge1xyXG4gIHlqc0RvYzogWS5Eb2NcclxuICB5anNPYmplY3Q6IFkuTWFwPHVua25vd24+IHwgWS5BcnJheTx1bmtub3duPlxyXG4gIG1vYnhLZXlzdG9uZVR5cGU6IFRUeXBlXHJcbn0pOiB7XHJcbiAgYm91bmRPYmplY3Q6IFR5cGVUb0RhdGE8VFR5cGU+XHJcbiAgZGlzcG9zZSgpOiB2b2lkXHJcbiAgeWpzT3JpZ2luOiBzeW1ib2xcclxufSB7XHJcbiAgY29uc3QgeWpzSnNvbiA9IHlqc09iamVjdC50b0pTT04oKVxyXG5cclxuICBjb25zdCBpbml0aWFsaXphdGlvbkdsb2JhbFBhdGNoZXM6IHsgdGFyZ2V0OiBvYmplY3Q7IHBhdGNoZXM6IFBhdGNoW10gfVtdID0gW11cclxuXHJcbiAgY29uc3QgY3JlYXRlQm91bmRPYmplY3QgPSAoKSA9PiB7XHJcbiAgICBjb25zdCBkaXNwb3NlT25HbG9iYWxQYXRjaGVzID0gb25HbG9iYWxQYXRjaGVzKCh0YXJnZXQsIHBhdGNoZXMpID0+IHtcclxuICAgICAgaW5pdGlhbGl6YXRpb25HbG9iYWxQYXRjaGVzLnB1c2goeyB0YXJnZXQsIHBhdGNoZXMgfSlcclxuICAgIH0pXHJcblxyXG4gICAgdHJ5IHtcclxuICAgICAgcmV0dXJuIGZyb21TbmFwc2hvdChtb2J4S2V5c3RvbmVUeXBlLCB5anNKc29uIGFzIGFueSlcclxuICAgIH0gZmluYWxseSB7XHJcbiAgICAgIGRpc3Bvc2VPbkdsb2JhbFBhdGNoZXMoKVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgY29uc3QgYm91bmRPYmplY3QgPSBjcmVhdGVCb3VuZE9iamVjdCgpXHJcblxyXG4gIGxldCBhcHBseWluZ01vYnhLZXlzdG9uZUNoYW5nZXMgPSAwXHJcbiAgY29uc3QgeWpzT3JpZ2luID0gU3ltYm9sKFwiYmluZFlqc1RvTW9ieEtleXN0b25lVHJhbnNhY3Rpb25PcmlnaW5cIilcclxuXHJcbiAgLy8gYmluZCBhbnkgY2hhbmdlcyBmcm9tIHlqcyB0byBtb2J4LWtleXN0b25lXHJcbiAgY29uc3Qgb2JzZXJ2ZURlZXBDYiA9IChldmVudHM6IFkuWUV2ZW50PGFueT5bXSkgPT4ge1xyXG4gICAgY29uc3QgcGF0Y2hlczogUGF0Y2hbXSA9IFtdXHJcbiAgICBldmVudHMuZm9yRWFjaCgoZXZlbnQpID0+IHtcclxuICAgICAgaWYgKGV2ZW50LnRyYW5zYWN0aW9uLm9yaWdpbiAhPT0geWpzT3JpZ2luKSB7XHJcbiAgICAgICAgcGF0Y2hlcy5wdXNoKC4uLmNvbnZlcnRZanNFdmVudFRvUGF0Y2hlcyhldmVudCkpXHJcbiAgICAgIH1cclxuICAgIH0pXHJcblxyXG4gICAgaWYgKHBhdGNoZXMubGVuZ3RoID4gMCkge1xyXG4gICAgICBhcHBseWluZ01vYnhLZXlzdG9uZUNoYW5nZXMrK1xyXG4gICAgICB0cnkge1xyXG4gICAgICAgIGFwcGx5UGF0Y2hlcyhib3VuZE9iamVjdCwgcGF0Y2hlcylcclxuICAgICAgfSBmaW5hbGx5IHtcclxuICAgICAgICBhcHBseWluZ01vYnhLZXlzdG9uZUNoYW5nZXMtLVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICB5anNPYmplY3Qub2JzZXJ2ZURlZXAob2JzZXJ2ZURlZXBDYilcclxuXHJcbiAgLy8gYmluZCBhbnkgY2hhbmdlcyBmcm9tIG1vYngta2V5c3RvbmUgdG8geWpzXHJcbiAgbGV0IHBlbmRpbmdQYXRjaGVzOiBQYXRjaFtdID0gW11cclxuICBjb25zdCBkaXNwb3NlT25QYXRjaGVzID0gb25QYXRjaGVzKGJvdW5kT2JqZWN0LCAocGF0Y2hlcykgPT4ge1xyXG4gICAgaWYgKGFwcGx5aW5nTW9ieEtleXN0b25lQ2hhbmdlcyA+IDApIHtcclxuICAgICAgcmV0dXJuXHJcbiAgICB9XHJcblxyXG4gICAgcGVuZGluZ1BhdGNoZXMucHVzaCguLi5wYXRjaGVzKVxyXG4gIH0pXHJcblxyXG4gIC8vIHRoaXMgaXMgb25seSB1c2VkIHNvIHdlIGNhbiB0cmFuc2FjdCBhbGwgcGF0Y2hlcyB0byB0aGUgc25hcHNob3QgYm91bmRhcnlcclxuICBjb25zdCBkaXNwb3NlT25TbmFwc2hvdCA9IG9uU25hcHNob3QoYm91bmRPYmplY3QsICgpID0+IHtcclxuICAgIGlmIChwZW5kaW5nUGF0Y2hlcy5sZW5ndGggPT09IDApIHtcclxuICAgICAgcmV0dXJuXHJcbiAgICB9XHJcblxyXG4gICAgY29uc3QgcGF0Y2hlcyA9IHBlbmRpbmdQYXRjaGVzXHJcbiAgICBwZW5kaW5nUGF0Y2hlcyA9IFtdXHJcblxyXG4gICAgeWpzRG9jLnRyYW5zYWN0KCgpID0+IHtcclxuICAgICAgcGF0Y2hlcy5mb3JFYWNoKChwYXRjaCkgPT4ge1xyXG4gICAgICAgIGFwcGx5TW9ieEtleXN0b25lUGF0Y2hUb1lqc09iamVjdChwYXRjaCwgeWpzT2JqZWN0KVxyXG4gICAgICB9KVxyXG4gICAgfSwgeWpzT3JpZ2luKVxyXG4gIH0pXHJcblxyXG4gIC8vIHN5bmMgaW5pdGlhbCBwYXRjaGVzLCB0aGF0IG1pZ2h0IGluY2x1ZGUgc2V0dGluZyBkZWZhdWx0cywgSURzLCBldGNcclxuICB5anNEb2MudHJhbnNhY3QoKCkgPT4ge1xyXG4gICAgLy8gd2UgbmVlZCB0byBza2lwIGluaXRpYWxpemF0aW9ucyB1bnRpbCB3ZSBoaXQgdGhlIGluaXRpYWxpemF0aW9uIG9mIHRoZSBib3VuZCBvYmplY3RcclxuICAgIC8vIHRoaXMgaXMgYmVjYXVzZSBkZWZhdWx0IG9iamVjdHMgbWlnaHQgYmUgY3JlYXRlZCBhbmQgaW5pdGlhbGl6ZWQgYmVmb3JlIHRoZSBtYWluIG9iamVjdFxyXG4gICAgLy8gYnV0IHdlIGp1c3QgbmVlZCB0byBjYXRjaCB3aGVuIHRob3NlIGFyZSBhY3R1YWxseSBhc3NpZ25lZCB0byB0aGUgYm91bmQgb2JqZWN0XHJcbiAgICBsZXQgYm91bmRPYmplY3RGb3VuZCA9IGZhbHNlXHJcblxyXG4gICAgaW5pdGlhbGl6YXRpb25HbG9iYWxQYXRjaGVzLmZvckVhY2goKHsgdGFyZ2V0LCBwYXRjaGVzIH0pID0+IHtcclxuICAgICAgaWYgKCFib3VuZE9iamVjdEZvdW5kKSB7XHJcbiAgICAgICAgaWYgKHRhcmdldCAhPT0gYm91bmRPYmplY3QpIHtcclxuICAgICAgICAgIHJldHVybiAvLyBza2lwXHJcbiAgICAgICAgfVxyXG4gICAgICAgIGJvdW5kT2JqZWN0Rm91bmQgPSB0cnVlXHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGNvbnN0IHBhcmVudFRvQ2hpbGRQYXRoID0gZ2V0UGFyZW50VG9DaGlsZFBhdGgoYm91bmRPYmplY3QsIHRhcmdldClcclxuICAgICAgLy8gdGhpcyBpcyB1bmRlZmluZWQgb25seSBpZiB0YXJnZXQgaXMgbm90IGEgY2hpbGQgb2YgYm91bmRNb2RlbFxyXG4gICAgICBpZiAocGFyZW50VG9DaGlsZFBhdGggIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgIHBhdGNoZXMuZm9yRWFjaCgocGF0Y2gpID0+IHtcclxuICAgICAgICAgIGFwcGx5TW9ieEtleXN0b25lUGF0Y2hUb1lqc09iamVjdChcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgIC4uLnBhdGNoLFxyXG4gICAgICAgICAgICAgIHBhdGg6IFsuLi5wYXJlbnRUb0NoaWxkUGF0aCwgLi4ucGF0Y2gucGF0aF0sXHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIHlqc09iamVjdFxyXG4gICAgICAgICAgKVxyXG4gICAgICAgIH0pXHJcbiAgICAgIH1cclxuICAgIH0pXHJcbiAgfSwgeWpzT3JpZ2luKVxyXG5cclxuICByZXR1cm4ge1xyXG4gICAgYm91bmRPYmplY3QsXHJcbiAgICBkaXNwb3NlOiAoKSA9PiB7XHJcbiAgICAgIGRpc3Bvc2VPblBhdGNoZXMoKVxyXG4gICAgICBkaXNwb3NlT25TbmFwc2hvdCgpXHJcbiAgICAgIHlqc09iamVjdC51bm9ic2VydmVEZWVwKG9ic2VydmVEZWVwQ2IpXHJcbiAgICB9LFxyXG4gICAgeWpzT3JpZ2luLFxyXG4gIH1cclxufVxyXG4iXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFHTSxNQUFPLDZCQUE2QixNQUFLO0FBQUEsRUFDN0MsWUFBWSxLQUFXO0FBQ3JCLFVBQU0sR0FBRztBQUdGLFdBQUEsZUFBZSxNQUFNLHFCQUFxQixTQUFTO0FBQUEsRUFDNUQ7QUFDRDtBQUtLLFNBQVUsUUFBUSxLQUFXO0FBQzFCLFNBQUEsSUFBSSxxQkFBcUIsR0FBRztBQUNyQztBQ2RBLFNBQVMsZ0JBQWdCLEdBQVk7QUFDbkMsUUFBTSxJQUFJLE9BQU87QUFDakIsU0FBTyxNQUFNLFlBQVksTUFBTSxZQUFZLE1BQU0sYUFBYSxNQUFNO0FBQ3RFO0FBRUEsU0FBUyxZQUFZLEdBQVk7QUFDeEIsU0FBQSxNQUFNLFFBQVEsQ0FBQztBQUN4QjtBQUVBLFNBQVMsYUFBYSxHQUFZO0FBQ2hDLFNBQU8sQ0FBQyxZQUFZLENBQUMsS0FBSyxPQUFPLE1BQU07QUFDekM7QUFFTSxTQUFVLHFCQUFxQixHQUFZO0FBQy9DLE1BQUksTUFBTSxVQUFhLGdCQUFnQixDQUFDLEdBQUc7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
@@ -9,37 +9,38 @@ class MobxKeystoneYjsError extends Error {
9
9
  function failure(msg) {
10
10
  return new MobxKeystoneYjsError(msg);
11
11
  }
12
- function isJSONPrimitive(v) {
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 isJSONArray(v) {
16
+ function isJsonArray(v) {
17
17
  return Array.isArray(v);
18
18
  }
19
- function isJSONObject(v) {
20
- return !isJSONArray(v) && typeof v === "object";
19
+ function isJsonObject(v) {
20
+ return !isJsonArray(v) && typeof v === "object";
21
21
  }
22
- function toYDataType(v) {
23
- if (isJSONPrimitive(v)) {
22
+ function convertJsonToYjsData(v) {
23
+ if (v === void 0 || isJsonPrimitive(v)) {
24
24
  return v;
25
- } else if (isJSONArray(v)) {
25
+ }
26
+ if (isJsonArray(v)) {
26
27
  const arr = new Y.Array();
27
- applyJsonArray(arr, v);
28
+ applyJsonArrayYArray(arr, v);
28
29
  return arr;
29
- } else if (isJSONObject(v)) {
30
+ }
31
+ if (isJsonObject(v)) {
30
32
  const map = new Y.Map();
31
- applyJsonObject(map, v);
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 applyJsonArray(dest, source) {
38
- dest.push(source.map(toYDataType));
38
+ function applyJsonArrayYArray(dest, source) {
39
+ dest.push(source.map(convertJsonToYjsData));
39
40
  }
40
- function applyJsonObject(dest, source) {
41
+ function applyJsonObjectToYMap(dest, source) {
41
42
  Object.entries(source).forEach(([k, v]) => {
42
- dest.set(k, toYDataType(v));
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, toYDataType(patch.value));
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), [toYDataType(patch.value)]);
95
+ yjs.insert(Number(key), [convertJsonToYjsData(patch.value)]);
95
96
  }
96
97
  break;
97
98
  }
98
99
  case "add": {
99
- yjs.insert(Number(key), [toYDataType(patch.value)]);
100
+ yjs.insert(Number(key), [convertJsonToYjsData(patch.value)]);
100
101
  break;
101
102
  }
102
103
  case "remove": {
@@ -267,6 +268,9 @@ function bindYjsToMobxKeystone({ yjsDoc, yjsObject, mobxKeystoneType }) {
267
268
  }
268
269
  export {
269
270
  MobxKeystoneYjsError,
270
- bindYjsToMobxKeystone
271
+ applyJsonArrayYArray,
272
+ applyJsonObjectToYMap,
273
+ bindYjsToMobxKeystone,
274
+ convertJsonToYjsData
271
275
  };
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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
276
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibW9ieC1rZXlzdG9uZS15anMuZXNtLm1qcyIsInNvdXJjZXMiOlsiLi4vc3JjL3V0aWxzL2Vycm9yLnRzIiwiLi4vc3JjL2JpbmRpbmcvY29udmVydEpzb25Ub1lqc0RhdGEudHMiLCIuLi9zcmMvYmluZGluZy9hcHBseU1vYnhLZXlzdG9uZVBhdGNoVG9ZanNPYmplY3QudHMiLCIuLi9zcmMvYmluZGluZy9jb252ZXJ0WWpzRXZlbnRUb1BhdGNoZXMudHMiLCIuLi9zcmMvYmluZGluZy9iaW5kWWpzVG9Nb2J4S2V5c3RvbmUudHMiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqXHJcbiAqIEEgbW9ieC1rZXlzdG9uZS15anMgZXJyb3IuXHJcbiAqL1xyXG5leHBvcnQgY2xhc3MgTW9ieEtleXN0b25lWWpzRXJyb3IgZXh0ZW5kcyBFcnJvciB7XHJcbiAgY29uc3RydWN0b3IobXNnOiBzdHJpbmcpIHtcclxuICAgIHN1cGVyKG1zZylcclxuXHJcbiAgICAvLyBTZXQgdGhlIHByb3RvdHlwZSBleHBsaWNpdGx5LlxyXG4gICAgT2JqZWN0LnNldFByb3RvdHlwZU9mKHRoaXMsIE1vYnhLZXlzdG9uZVlqc0Vycm9yLnByb3RvdHlwZSlcclxuICB9XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBAaW50ZXJuYWxcclxuICovXHJcbmV4cG9ydCBmdW5jdGlvbiBmYWlsdXJlKG1zZzogc3RyaW5nKSB7XHJcbiAgcmV0dXJuIG5ldyBNb2J4S2V5c3RvbmVZanNFcnJvcihtc2cpXHJcbn1cclxuIiwiaW1wb3J0ICogYXMgWSBmcm9tIFwieWpzXCJcbmltcG9ydCB7IEpzb25WYWx1ZSwgSnNvbkFycmF5LCBKc29uT2JqZWN0LCBKc29uUHJpbWl0aXZlIH0gZnJvbSBcIi4uL2pzb25UeXBlc1wiXG5cbmZ1bmN0aW9uIGlzSnNvblByaW1pdGl2ZSh2OiBKc29uVmFsdWUpOiB2IGlzIEpzb25QcmltaXRpdmUge1xuICBjb25zdCB0ID0gdHlwZW9mIHZcbiAgcmV0dXJuIHQgPT09IFwic3RyaW5nXCIgfHwgdCA9PT0gXCJudW1iZXJcIiB8fCB0ID09PSBcImJvb2xlYW5cIiB8fCB2ID09PSBudWxsXG59XG5cbmZ1bmN0aW9uIGlzSnNvbkFycmF5KHY6IEpzb25WYWx1ZSk6IHYgaXMgSnNvbkFycmF5IHtcbiAgcmV0dXJuIEFycmF5LmlzQXJyYXkodilcbn1cblxuZnVuY3Rpb24gaXNKc29uT2JqZWN0KHY6IEpzb25WYWx1ZSk6IHYgaXMgSnNvbk9iamVjdCB7XG4gIHJldHVybiAhaXNKc29uQXJyYXkodikgJiYgdHlwZW9mIHYgPT09IFwib2JqZWN0XCJcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNvbnZlcnRKc29uVG9ZanNEYXRhKHY6IEpzb25WYWx1ZSkge1xuICBpZiAodiA9PT0gdW5kZWZpbmVkIHx8IGlzSnNvblByaW1pdGl2ZSh2KSkge1xuICAgIHJldHVybiB2XG4gIH1cblxuICBpZiAoaXNKc29uQXJyYXkodikpIHtcbiAgICBjb25zdCBhcnIgPSBuZXcgWS5BcnJheSgpXG4gICAgYXBwbHlKc29uQXJyYXlZQXJyYXkoYXJyLCB2KVxuICAgIHJldHVybiBhcnJcbiAgfVxuXG4gIGlmIChpc0pzb25PYmplY3QodikpIHtcbiAgICBjb25zdCBtYXAgPSBuZXcgWS5NYXAoKVxuICAgIGFwcGx5SnNvbk9iamVjdFRvWU1hcChtYXAsIHYpXG4gICAgcmV0dXJuIG1hcFxuICB9XG5cbiAgdGhyb3cgbmV3IEVycm9yKGB1bnN1cHBvcnRlZCB2YWx1ZSB0eXBlOiAke3Z9YClcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGFwcGx5SnNvbkFycmF5WUFycmF5KGRlc3Q6IFkuQXJyYXk8dW5rbm93bj4sIHNvdXJjZTogSnNvbkFycmF5KSB7XG4gIGRlc3QucHVzaChzb3VyY2UubWFwKGNvbnZlcnRKc29uVG9ZanNEYXRhKSlcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGFwcGx5SnNvbk9iamVjdFRvWU1hcChkZXN0OiBZLk1hcDx1bmtub3duPiwgc291cmNlOiBKc29uT2JqZWN0KSB7XG4gIE9iamVjdC5lbnRyaWVzKHNvdXJjZSkuZm9yRWFjaCgoW2ssIHZdKSA9PiB7XG4gICAgZGVzdC5zZXQoaywgY29udmVydEpzb25Ub1lqc0RhdGEodikpXG4gIH0pXG59XG4iLCJpbXBvcnQgeyBQYXRjaCB9IGZyb20gXCJtb2J4LWtleXN0b25lXCJcbmltcG9ydCAqIGFzIFkgZnJvbSBcInlqc1wiXG5pbXBvcnQgeyBmYWlsdXJlIH0gZnJvbSBcIi4uL3V0aWxzL2Vycm9yXCJcbmltcG9ydCB7IGNvbnZlcnRKc29uVG9ZanNEYXRhIH0gZnJvbSBcIi4vY29udmVydEpzb25Ub1lqc0RhdGFcIlxuXG5leHBvcnQgZnVuY3Rpb24gYXBwbHlNb2J4S2V5c3RvbmVQYXRjaFRvWWpzT2JqZWN0KHBhdGNoOiBQYXRjaCwgeWpzOiB1bmtub3duKTogdm9pZCB7XG4gIGlmIChwYXRjaC5wYXRoLmxlbmd0aCA+IDEpIHtcbiAgICBjb25zdCBba2V5LCAuLi5yZXN0XSA9IHBhdGNoLnBhdGhcblxuICAgIGlmICh5anMgaW5zdGFuY2VvZiBZLk1hcCkge1xuICAgICAgY29uc3QgY2hpbGQgPSB5anMuZ2V0KFN0cmluZyhrZXkpKVxuICAgICAgaWYgKGNoaWxkID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgdGhyb3cgZmFpbHVyZShcbiAgICAgICAgICBgaW52YWxpZCBwYXRjaCBwYXRoLCBrZXkgXCIke2tleX1cIiBub3QgZm91bmQgaW4gWWpzIG1hcCAtIHBhdGNoOiAke0pTT04uc3RyaW5naWZ5KHBhdGNoKX1gXG4gICAgICAgIClcbiAgICAgIH1cbiAgICAgIGFwcGx5TW9ieEtleXN0b25lUGF0Y2hUb1lqc09iamVjdCh7IC4uLnBhdGNoLCBwYXRoOiByZXN0IH0sIGNoaWxkKVxuICAgIH0gZWxzZSBpZiAoeWpzIGluc3RhbmNlb2YgWS5BcnJheSkge1xuICAgICAgY29uc3QgY2hpbGQgPSB5anMuZ2V0KE51bWJlcihrZXkpKVxuICAgICAgaWYgKGNoaWxkID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgdGhyb3cgZmFpbHVyZShcbiAgICAgICAgICBgaW52YWxpZCBwYXRjaCBwYXRoLCBrZXkgXCIke2tleX1cIiBub3QgZm91bmQgaW4gWWpzIGFycmF5IC0gcGF0Y2g6ICR7SlNPTi5zdHJpbmdpZnkoXG4gICAgICAgICAgICBwYXRjaFxuICAgICAgICAgICl9YFxuICAgICAgICApXG4gICAgICB9XG4gICAgICBhcHBseU1vYnhLZXlzdG9uZVBhdGNoVG9ZanNPYmplY3QoeyAuLi5wYXRjaCwgcGF0aDogcmVzdCB9LCBjaGlsZClcbiAgICB9IGVsc2Uge1xuICAgICAgdGhyb3cgZmFpbHVyZShcbiAgICAgICAgYGludmFsaWQgcGF0Y2ggcGF0aCwga2V5IFwiJHtrZXl9XCIgbm90IGZvdW5kIGluIHVua25vd24gWWpzIG9iamVjdCAtIHBhdGNoOiAke0pTT04uc3RyaW5naWZ5KFxuICAgICAgICAgIHBhdGNoXG4gICAgICAgICl9YFxuICAgICAgKVxuICAgIH1cbiAgfSBlbHNlIGlmIChwYXRjaC5wYXRoLmxlbmd0aCA9PT0gMSkge1xuICAgIGlmICh5anMgaW5zdGFuY2VvZiBZLk1hcCkge1xuICAgICAgY29uc3Qga2V5ID0gU3RyaW5nKHBhdGNoLnBhdGhbMF0pXG5cbiAgICAgIHN3aXRjaCAocGF0Y2gub3ApIHtcbiAgICAgICAgY2FzZSBcImFkZFwiOlxuICAgICAgICBjYXNlIFwicmVwbGFjZVwiOiB7XG4gICAgICAgICAgeWpzLnNldChrZXksIGNvbnZlcnRKc29uVG9ZanNEYXRhKHBhdGNoLnZhbHVlKSlcbiAgICAgICAgICBicmVha1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgXCJyZW1vdmVcIjoge1xuICAgICAgICAgIHlqcy5kZWxldGUoa2V5KVxuICAgICAgICAgIGJyZWFrXG4gICAgICAgIH1cbiAgICAgICAgZGVmYXVsdDoge1xuICAgICAgICAgIHRocm93IGZhaWx1cmUoYGludmFsaWQgcGF0Y2ggb3BlcmF0aW9uIGZvciBtYXBgKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBlbHNlIGlmICh5anMgaW5zdGFuY2VvZiBZLkFycmF5KSB7XG4gICAgICBjb25zdCBrZXkgPSBwYXRjaC5wYXRoWzBdXG5cbiAgICAgIHN3aXRjaCAocGF0Y2gub3ApIHtcbiAgICAgICAgY2FzZSBcInJlcGxhY2VcIjoge1xuICAgICAgICAgIGlmIChrZXkgPT09IFwibGVuZ3RoXCIpIHtcbiAgICAgICAgICAgIGlmICh5anMubGVuZ3RoID4gcGF0Y2gudmFsdWUpIHtcbiAgICAgICAgICAgICAgY29uc3QgdG9EZWxldGUgPSB5anMubGVuZ3RoIC0gcGF0Y2gudmFsdWVcbiAgICAgICAgICAgICAgeWpzLmRlbGV0ZShwYXRjaC52YWx1ZSwgdG9EZWxldGUpXG4gICAgICAgICAgICB9IGVsc2UgaWYgKHlqcy5sZW5ndGggPCBwYXRjaC52YWx1ZSkge1xuICAgICAgICAgICAgICBjb25zdCB0b0luc2VydCA9IHBhdGNoLnZhbHVlIC0geWpzLmxlbmd0aFxuICAgICAgICAgICAgICB5anMuaW5zZXJ0KHlqcy5sZW5ndGgsIEFycmF5KHRvSW5zZXJ0KS5maWxsKHVuZGVmaW5lZCkpXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHlqcy5kZWxldGUoTnVtYmVyKGtleSkpXG4gICAgICAgICAgICB5anMuaW5zZXJ0KE51bWJlcihrZXkpLCBbY29udmVydEpzb25Ub1lqc0RhdGEocGF0Y2gudmFsdWUpXSlcbiAgICAgICAgICB9XG4gICAgICAgICAgYnJlYWtcbiAgICAgICAgfVxuICAgICAgICBjYXNlIFwiYWRkXCI6IHtcbiAgICAgICAgICB5anMuaW5zZXJ0KE51bWJlcihrZXkpLCBbY29udmVydEpzb25Ub1lqc0RhdGEocGF0Y2gudmFsdWUpXSlcbiAgICAgICAgICBicmVha1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgXCJyZW1vdmVcIjoge1xuICAgICAgICAgIHlqcy5kZWxldGUoTnVtYmVyKGtleSkpXG4gICAgICAgICAgYnJlYWtcbiAgICAgICAgfVxuICAgICAgICBkZWZhdWx0OiB7XG4gICAgICAgICAgdGhyb3cgZmFpbHVyZShgaW52YWxpZCBwYXRjaCBvcGVyYXRpb24gZm9yIGFycmF5YClcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyBmYWlsdXJlKFxuICAgICAgICBgaW52YWxpZCBwYXRjaCBwYXRoLCB0aGUgWWpzIG9iamVjdCBpcyBvZiBhbiB1bmtvd24gdHlwZSwgc28ga2V5IFwiJHtwYXRjaC5wYXRoWzBdfVwiIGNhbm5vdCBiZSBmb3VuZCBpbiBpdGBcbiAgICAgIClcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgdGhyb3cgZmFpbHVyZShgaW52YWxpZCBwYXRjaCBwYXRoLCBpdCBjYW5ub3QgYmUgZW1wdHlgKVxuICB9XG59XG4iLCJpbXBvcnQgeyBQYXRjaCB9IGZyb20gXCJtb2J4LWtleXN0b25lXCJcbmltcG9ydCAqIGFzIFkgZnJvbSBcInlqc1wiXG5pbXBvcnQgeyBKc29uQXJyYXksIEpzb25PYmplY3QsIEpzb25WYWx1ZSB9IGZyb20gXCIuLi9qc29uVHlwZXNcIlxuaW1wb3J0IHsgZmFpbHVyZSB9IGZyb20gXCIuLi91dGlscy9lcnJvclwiXG5cbmV4cG9ydCBmdW5jdGlvbiBjb252ZXJ0WWpzRXZlbnRUb1BhdGNoZXMoZXZlbnQ6IFkuWUV2ZW50PGFueT4pOiBQYXRjaFtdIHtcbiAgY29uc3QgcGF0Y2hlczogUGF0Y2hbXSA9IFtdXG5cbiAgaWYgKGV2ZW50IGluc3RhbmNlb2YgWS5ZTWFwRXZlbnQpIHtcbiAgICBjb25zdCBzb3VyY2UgPSBldmVudC50YXJnZXQgYXMgWS5NYXA8YW55PlxuXG4gICAgZXZlbnQuY2hhbmdlcy5rZXlzLmZvckVhY2goKGNoYW5nZSwga2V5KSA9PiB7XG4gICAgICBjb25zdCBwYXRoID0gWy4uLmV2ZW50LnBhdGgsIGtleV1cblxuICAgICAgc3dpdGNoIChjaGFuZ2UuYWN0aW9uKSB7XG4gICAgICAgIGNhc2UgXCJhZGRcIjpcbiAgICAgICAgICBwYXRjaGVzLnB1c2goe1xuICAgICAgICAgICAgb3A6IFwiYWRkXCIsXG4gICAgICAgICAgICBwYXRoLFxuICAgICAgICAgICAgdmFsdWU6IHRvUGxhaW5WYWx1ZShzb3VyY2UuZ2V0KGtleSkpLFxuICAgICAgICAgIH0pXG4gICAgICAgICAgYnJlYWtcblxuICAgICAgICBjYXNlIFwidXBkYXRlXCI6XG4gICAgICAgICAgcGF0Y2hlcy5wdXNoKHtcbiAgICAgICAgICAgIG9wOiBcInJlcGxhY2VcIixcbiAgICAgICAgICAgIHBhdGgsXG4gICAgICAgICAgICB2YWx1ZTogdG9QbGFpblZhbHVlKHNvdXJjZS5nZXQoa2V5KSksXG4gICAgICAgICAgfSlcbiAgICAgICAgICBicmVha1xuXG4gICAgICAgIGNhc2UgXCJkZWxldGVcIjpcbiAgICAgICAgICBwYXRjaGVzLnB1c2goe1xuICAgICAgICAgICAgb3A6IFwicmVtb3ZlXCIsXG4gICAgICAgICAgICBwYXRoLFxuICAgICAgICAgIH0pXG4gICAgICAgICAgYnJlYWtcblxuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIHRocm93IGZhaWx1cmUoYHVuc3VwcG9ydGVkIFlqcyBtYXAgZXZlbnQgYWN0aW9uOiAke2NoYW5nZS5hY3Rpb259YClcbiAgICAgIH1cbiAgICB9KVxuICB9IGVsc2UgaWYgKGV2ZW50IGluc3RhbmNlb2YgWS5ZQXJyYXlFdmVudCkge1xuICAgIGxldCByZXRhaW4gPSAwXG4gICAgZXZlbnQuY2hhbmdlcy5kZWx0YS5mb3JFYWNoKChjaGFuZ2UpID0+IHtcbiAgICAgIGlmIChjaGFuZ2UucmV0YWluKSB7XG4gICAgICAgIHJldGFpbiArPSBjaGFuZ2UucmV0YWluXG4gICAgICB9XG5cbiAgICAgIGlmIChjaGFuZ2UuZGVsZXRlKSB7XG4gICAgICAgIC8vIHJlbW92ZSBYIGl0ZW1zIGF0IHJldGFpbiBwb3NpdGlvblxuICAgICAgICBjb25zdCBwYXRoID0gWy4uLmV2ZW50LnBhdGgsIHJldGFpbl1cbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjaGFuZ2UuZGVsZXRlOyBpKyspIHtcbiAgICAgICAgICBwYXRjaGVzLnB1c2goe1xuICAgICAgICAgICAgb3A6IFwicmVtb3ZlXCIsXG4gICAgICAgICAgICBwYXRoLFxuICAgICAgICAgIH0pXG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKGNoYW5nZS5pbnNlcnQpIHtcbiAgICAgICAgY29uc3QgbmV3VmFsdWVzID0gQXJyYXkuaXNBcnJheShjaGFuZ2UuaW5zZXJ0KSA/IGNoYW5nZS5pbnNlcnQgOiBbY2hhbmdlLmluc2VydF1cbiAgICAgICAgbmV3VmFsdWVzLmZvckVhY2goKHYpID0+IHtcbiAgICAgICAgICBjb25zdCBwYXRoID0gWy4uLmV2ZW50LnBhdGgsIHJldGFpbl1cbiAgICAgICAgICBwYXRjaGVzLnB1c2goe1xuICAgICAgICAgICAgb3A6IFwiYWRkXCIsXG4gICAgICAgICAgICBwYXRoLFxuICAgICAgICAgICAgdmFsdWU6IHRvUGxhaW5WYWx1ZSh2KSxcbiAgICAgICAgICB9KVxuICAgICAgICAgIHJldGFpbisrXG4gICAgICAgIH0pXG4gICAgICB9XG4gICAgfSlcbiAgfVxuXG4gIHJldHVybiBwYXRjaGVzXG59XG5cbmZ1bmN0aW9uIHRvUGxhaW5WYWx1ZSh2OiBZLk1hcDxhbnk+IHwgWS5BcnJheTxhbnk+IHwgSnNvblZhbHVlKSB7XG4gIGlmICh2IGluc3RhbmNlb2YgWS5NYXAgfHwgdiBpbnN0YW5jZW9mIFkuQXJyYXkpIHtcbiAgICByZXR1cm4gdi50b0pTT04oKSBhcyBKc29uT2JqZWN0IHwgSnNvbkFycmF5XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIHZcbiAgfVxufVxuIiwiaW1wb3J0IHtcclxuICBBbnlEYXRhTW9kZWwsXHJcbiAgQW55TW9kZWwsXHJcbiAgQW55U3RhbmRhcmRUeXBlLFxyXG4gIE1vZGVsQ2xhc3MsXHJcbiAgUGF0Y2gsXHJcbiAgVHlwZVRvRGF0YSxcclxuICBhcHBseVBhdGNoZXMsXHJcbiAgZnJvbVNuYXBzaG90LFxyXG4gIGdldFBhcmVudFRvQ2hpbGRQYXRoLFxyXG4gIG9uR2xvYmFsUGF0Y2hlcyxcclxuICBvblBhdGNoZXMsXHJcbiAgb25TbmFwc2hvdCxcclxufSBmcm9tIFwibW9ieC1rZXlzdG9uZVwiXHJcbmltcG9ydCAqIGFzIFkgZnJvbSBcInlqc1wiXHJcbmltcG9ydCB7IGFwcGx5TW9ieEtleXN0b25lUGF0Y2hUb1lqc09iamVjdCB9IGZyb20gXCIuL2FwcGx5TW9ieEtleXN0b25lUGF0Y2hUb1lqc09iamVjdFwiXHJcbmltcG9ydCB7IGNvbnZlcnRZanNFdmVudFRvUGF0Y2hlcyB9IGZyb20gXCIuL2NvbnZlcnRZanNFdmVudFRvUGF0Y2hlc1wiXHJcblxyXG5leHBvcnQgZnVuY3Rpb24gYmluZFlqc1RvTW9ieEtleXN0b25lPFxyXG4gIFRUeXBlIGV4dGVuZHMgQW55U3RhbmRhcmRUeXBlIHwgTW9kZWxDbGFzczxBbnlNb2RlbD4gfCBNb2RlbENsYXNzPEFueURhdGFNb2RlbD4sXHJcbj4oe1xyXG4gIHlqc0RvYyxcclxuICB5anNPYmplY3QsXHJcbiAgbW9ieEtleXN0b25lVHlwZSxcclxufToge1xyXG4gIHlqc0RvYzogWS5Eb2NcclxuICB5anNPYmplY3Q6IFkuTWFwPHVua25vd24+IHwgWS5BcnJheTx1bmtub3duPlxyXG4gIG1vYnhLZXlzdG9uZVR5cGU6IFRUeXBlXHJcbn0pOiB7XHJcbiAgYm91bmRPYmplY3Q6IFR5cGVUb0RhdGE8VFR5cGU+XHJcbiAgZGlzcG9zZSgpOiB2b2lkXHJcbiAgeWpzT3JpZ2luOiBzeW1ib2xcclxufSB7XHJcbiAgY29uc3QgeWpzSnNvbiA9IHlqc09iamVjdC50b0pTT04oKVxyXG5cclxuICBjb25zdCBpbml0aWFsaXphdGlvbkdsb2JhbFBhdGNoZXM6IHsgdGFyZ2V0OiBvYmplY3Q7IHBhdGNoZXM6IFBhdGNoW10gfVtdID0gW11cclxuXHJcbiAgY29uc3QgY3JlYXRlQm91bmRPYmplY3QgPSAoKSA9PiB7XHJcbiAgICBjb25zdCBkaXNwb3NlT25HbG9iYWxQYXRjaGVzID0gb25HbG9iYWxQYXRjaGVzKCh0YXJnZXQsIHBhdGNoZXMpID0+IHtcclxuICAgICAgaW5pdGlhbGl6YXRpb25HbG9iYWxQYXRjaGVzLnB1c2goeyB0YXJnZXQsIHBhdGNoZXMgfSlcclxuICAgIH0pXHJcblxyXG4gICAgdHJ5IHtcclxuICAgICAgcmV0dXJuIGZyb21TbmFwc2hvdChtb2J4S2V5c3RvbmVUeXBlLCB5anNKc29uIGFzIGFueSlcclxuICAgIH0gZmluYWxseSB7XHJcbiAgICAgIGRpc3Bvc2VPbkdsb2JhbFBhdGNoZXMoKVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgY29uc3QgYm91bmRPYmplY3QgPSBjcmVhdGVCb3VuZE9iamVjdCgpXHJcblxyXG4gIGxldCBhcHBseWluZ01vYnhLZXlzdG9uZUNoYW5nZXMgPSAwXHJcbiAgY29uc3QgeWpzT3JpZ2luID0gU3ltYm9sKFwiYmluZFlqc1RvTW9ieEtleXN0b25lVHJhbnNhY3Rpb25PcmlnaW5cIilcclxuXHJcbiAgLy8gYmluZCBhbnkgY2hhbmdlcyBmcm9tIHlqcyB0byBtb2J4LWtleXN0b25lXHJcbiAgY29uc3Qgb2JzZXJ2ZURlZXBDYiA9IChldmVudHM6IFkuWUV2ZW50PGFueT5bXSkgPT4ge1xyXG4gICAgY29uc3QgcGF0Y2hlczogUGF0Y2hbXSA9IFtdXHJcbiAgICBldmVudHMuZm9yRWFjaCgoZXZlbnQpID0+IHtcclxuICAgICAgaWYgKGV2ZW50LnRyYW5zYWN0aW9uLm9yaWdpbiAhPT0geWpzT3JpZ2luKSB7XHJcbiAgICAgICAgcGF0Y2hlcy5wdXNoKC4uLmNvbnZlcnRZanNFdmVudFRvUGF0Y2hlcyhldmVudCkpXHJcbiAgICAgIH1cclxuICAgIH0pXHJcblxyXG4gICAgaWYgKHBhdGNoZXMubGVuZ3RoID4gMCkge1xyXG4gICAgICBhcHBseWluZ01vYnhLZXlzdG9uZUNoYW5nZXMrK1xyXG4gICAgICB0cnkge1xyXG4gICAgICAgIGFwcGx5UGF0Y2hlcyhib3VuZE9iamVjdCwgcGF0Y2hlcylcclxuICAgICAgfSBmaW5hbGx5IHtcclxuICAgICAgICBhcHBseWluZ01vYnhLZXlzdG9uZUNoYW5nZXMtLVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICB5anNPYmplY3Qub2JzZXJ2ZURlZXAob2JzZXJ2ZURlZXBDYilcclxuXHJcbiAgLy8gYmluZCBhbnkgY2hhbmdlcyBmcm9tIG1vYngta2V5c3RvbmUgdG8geWpzXHJcbiAgbGV0IHBlbmRpbmdQYXRjaGVzOiBQYXRjaFtdID0gW11cclxuICBjb25zdCBkaXNwb3NlT25QYXRjaGVzID0gb25QYXRjaGVzKGJvdW5kT2JqZWN0LCAocGF0Y2hlcykgPT4ge1xyXG4gICAgaWYgKGFwcGx5aW5nTW9ieEtleXN0b25lQ2hhbmdlcyA+IDApIHtcclxuICAgICAgcmV0dXJuXHJcbiAgICB9XHJcblxyXG4gICAgcGVuZGluZ1BhdGNoZXMucHVzaCguLi5wYXRjaGVzKVxyXG4gIH0pXHJcblxyXG4gIC8vIHRoaXMgaXMgb25seSB1c2VkIHNvIHdlIGNhbiB0cmFuc2FjdCBhbGwgcGF0Y2hlcyB0byB0aGUgc25hcHNob3QgYm91bmRhcnlcclxuICBjb25zdCBkaXNwb3NlT25TbmFwc2hvdCA9IG9uU25hcHNob3QoYm91bmRPYmplY3QsICgpID0+IHtcclxuICAgIGlmIChwZW5kaW5nUGF0Y2hlcy5sZW5ndGggPT09IDApIHtcclxuICAgICAgcmV0dXJuXHJcbiAgICB9XHJcblxyXG4gICAgY29uc3QgcGF0Y2hlcyA9IHBlbmRpbmdQYXRjaGVzXHJcbiAgICBwZW5kaW5nUGF0Y2hlcyA9IFtdXHJcblxyXG4gICAgeWpzRG9jLnRyYW5zYWN0KCgpID0+IHtcclxuICAgICAgcGF0Y2hlcy5mb3JFYWNoKChwYXRjaCkgPT4ge1xyXG4gICAgICAgIGFwcGx5TW9ieEtleXN0b25lUGF0Y2hUb1lqc09iamVjdChwYXRjaCwgeWpzT2JqZWN0KVxyXG4gICAgICB9KVxyXG4gICAgfSwgeWpzT3JpZ2luKVxyXG4gIH0pXHJcblxyXG4gIC8vIHN5bmMgaW5pdGlhbCBwYXRjaGVzLCB0aGF0IG1pZ2h0IGluY2x1ZGUgc2V0dGluZyBkZWZhdWx0cywgSURzLCBldGNcclxuICB5anNEb2MudHJhbnNhY3QoKCkgPT4ge1xyXG4gICAgLy8gd2UgbmVlZCB0byBza2lwIGluaXRpYWxpemF0aW9ucyB1bnRpbCB3ZSBoaXQgdGhlIGluaXRpYWxpemF0aW9uIG9mIHRoZSBib3VuZCBvYmplY3RcclxuICAgIC8vIHRoaXMgaXMgYmVjYXVzZSBkZWZhdWx0IG9iamVjdHMgbWlnaHQgYmUgY3JlYXRlZCBhbmQgaW5pdGlhbGl6ZWQgYmVmb3JlIHRoZSBtYWluIG9iamVjdFxyXG4gICAgLy8gYnV0IHdlIGp1c3QgbmVlZCB0byBjYXRjaCB3aGVuIHRob3NlIGFyZSBhY3R1YWxseSBhc3NpZ25lZCB0byB0aGUgYm91bmQgb2JqZWN0XHJcbiAgICBsZXQgYm91bmRPYmplY3RGb3VuZCA9IGZhbHNlXHJcblxyXG4gICAgaW5pdGlhbGl6YXRpb25HbG9iYWxQYXRjaGVzLmZvckVhY2goKHsgdGFyZ2V0LCBwYXRjaGVzIH0pID0+IHtcclxuICAgICAgaWYgKCFib3VuZE9iamVjdEZvdW5kKSB7XHJcbiAgICAgICAgaWYgKHRhcmdldCAhPT0gYm91bmRPYmplY3QpIHtcclxuICAgICAgICAgIHJldHVybiAvLyBza2lwXHJcbiAgICAgICAgfVxyXG4gICAgICAgIGJvdW5kT2JqZWN0Rm91bmQgPSB0cnVlXHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGNvbnN0IHBhcmVudFRvQ2hpbGRQYXRoID0gZ2V0UGFyZW50VG9DaGlsZFBhdGgoYm91bmRPYmplY3QsIHRhcmdldClcclxuICAgICAgLy8gdGhpcyBpcyB1bmRlZmluZWQgb25seSBpZiB0YXJnZXQgaXMgbm90IGEgY2hpbGQgb2YgYm91bmRNb2RlbFxyXG4gICAgICBpZiAocGFyZW50VG9DaGlsZFBhdGggIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgIHBhdGNoZXMuZm9yRWFjaCgocGF0Y2gpID0+IHtcclxuICAgICAgICAgIGFwcGx5TW9ieEtleXN0b25lUGF0Y2hUb1lqc09iamVjdChcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgIC4uLnBhdGNoLFxyXG4gICAgICAgICAgICAgIHBhdGg6IFsuLi5wYXJlbnRUb0NoaWxkUGF0aCwgLi4ucGF0Y2gucGF0aF0sXHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIHlqc09iamVjdFxyXG4gICAgICAgICAgKVxyXG4gICAgICAgIH0pXHJcbiAgICAgIH1cclxuICAgIH0pXHJcbiAgfSwgeWpzT3JpZ2luKVxyXG5cclxuICByZXR1cm4ge1xyXG4gICAgYm91bmRPYmplY3QsXHJcbiAgICBkaXNwb3NlOiAoKSA9PiB7XHJcbiAgICAgIGRpc3Bvc2VPblBhdGNoZXMoKVxyXG4gICAgICBkaXNwb3NlT25TbmFwc2hvdCgpXHJcbiAgICAgIHlqc09iamVjdC51bm9ic2VydmVEZWVwKG9ic2VydmVEZWVwQ2IpXHJcbiAgICB9LFxyXG4gICAgeWpzT3JpZ2luLFxyXG4gIH1cclxufVxyXG4iXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFHTSxNQUFPLDZCQUE2QixNQUFLO0FBQUEsRUFDN0MsWUFBWSxLQUFXO0FBQ3JCLFVBQU0sR0FBRztBQUdGLFdBQUEsZUFBZSxNQUFNLHFCQUFxQixTQUFTO0FBQUEsRUFDNUQ7QUFDRDtBQUtLLFNBQVUsUUFBUSxLQUFXO0FBQzFCLFNBQUEsSUFBSSxxQkFBcUIsR0FBRztBQUNyQztBQ2RBLFNBQVMsZ0JBQWdCLEdBQVk7QUFDbkMsUUFBTSxJQUFJLE9BQU87QUFDakIsU0FBTyxNQUFNLFlBQVksTUFBTSxZQUFZLE1BQU0sYUFBYSxNQUFNO0FBQ3RFO0FBRUEsU0FBUyxZQUFZLEdBQVk7QUFDeEIsU0FBQSxNQUFNLFFBQVEsQ0FBQztBQUN4QjtBQUVBLFNBQVMsYUFBYSxHQUFZO0FBQ2hDLFNBQU8sQ0FBQyxZQUFZLENBQUMsS0FBSyxPQUFPLE1BQU07QUFDekM7QUFFTSxTQUFVLHFCQUFxQixHQUFZO0FBQy9DLE1BQUksTUFBTSxVQUFhLGdCQUFnQixDQUFDLEdBQUc7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
@@ -28,37 +28,38 @@
28
28
  function failure(msg) {
29
29
  return new MobxKeystoneYjsError(msg);
30
30
  }
31
- function isJSONPrimitive(v) {
31
+ function isJsonPrimitive(v) {
32
32
  const t = typeof v;
33
33
  return t === "string" || t === "number" || t === "boolean" || v === null;
34
34
  }
35
- function isJSONArray(v) {
35
+ function isJsonArray(v) {
36
36
  return Array.isArray(v);
37
37
  }
38
- function isJSONObject(v) {
39
- return !isJSONArray(v) && typeof v === "object";
38
+ function isJsonObject(v) {
39
+ return !isJsonArray(v) && typeof v === "object";
40
40
  }
41
- function toYDataType(v) {
42
- if (isJSONPrimitive(v)) {
41
+ function convertJsonToYjsData(v) {
42
+ if (v === void 0 || isJsonPrimitive(v)) {
43
43
  return v;
44
- } else if (isJSONArray(v)) {
44
+ }
45
+ if (isJsonArray(v)) {
45
46
  const arr = new Y__namespace.Array();
46
- applyJsonArray(arr, v);
47
+ applyJsonArrayYArray(arr, v);
47
48
  return arr;
48
- } else if (isJSONObject(v)) {
49
+ }
50
+ if (isJsonObject(v)) {
49
51
  const map = new Y__namespace.Map();
50
- applyJsonObject(map, v);
52
+ applyJsonObjectToYMap(map, v);
51
53
  return map;
52
- } else {
53
- return void 0;
54
54
  }
55
+ throw new Error(`unsupported value type: ${v}`);
55
56
  }
56
- function applyJsonArray(dest, source) {
57
- dest.push(source.map(toYDataType));
57
+ function applyJsonArrayYArray(dest, source) {
58
+ dest.push(source.map(convertJsonToYjsData));
58
59
  }
59
- function applyJsonObject(dest, source) {
60
+ function applyJsonObjectToYMap(dest, source) {
60
61
  Object.entries(source).forEach(([k, v]) => {
61
- dest.set(k, toYDataType(v));
62
+ dest.set(k, convertJsonToYjsData(v));
62
63
  });
63
64
  }
64
65
  function applyMobxKeystonePatchToYjsObject(patch, yjs) {
@@ -85,7 +86,7 @@
85
86
  switch (patch.op) {
86
87
  case "add":
87
88
  case "replace": {
88
- yjs.set(key, toYDataType(patch.value));
89
+ yjs.set(key, convertJsonToYjsData(patch.value));
89
90
  break;
90
91
  }
91
92
  case "remove": {
@@ -110,12 +111,12 @@
110
111
  }
111
112
  } else {
112
113
  yjs.delete(Number(key));
113
- yjs.insert(Number(key), [toYDataType(patch.value)]);
114
+ yjs.insert(Number(key), [convertJsonToYjsData(patch.value)]);
114
115
  }
115
116
  break;
116
117
  }
117
118
  case "add": {
118
- yjs.insert(Number(key), [toYDataType(patch.value)]);
119
+ yjs.insert(Number(key), [convertJsonToYjsData(patch.value)]);
119
120
  break;
120
121
  }
121
122
  case "remove": {
@@ -285,7 +286,10 @@
285
286
  };
286
287
  }
287
288
  exports2.MobxKeystoneYjsError = MobxKeystoneYjsError;
289
+ exports2.applyJsonArrayYArray = applyJsonArrayYArray;
290
+ exports2.applyJsonObjectToYMap = applyJsonObjectToYMap;
288
291
  exports2.bindYjsToMobxKeystone = bindYjsToMobxKeystone;
292
+ exports2.convertJsonToYjsData = convertJsonToYjsData;
289
293
  Object.defineProperty(exports2, Symbol.toStringTag, { value: "Module" });
290
294
  });
291
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibW9ieC1rZXlzdG9uZS15anMudW1kLmpzIiwic291cmNlcyI6WyIuLi9zcmMvdXRpbHMvZXJyb3IudHMiLCIuLi9zcmMvYmluZGluZy90b1lEYXRhVHlwZS50cyIsIi4uL3NyYy9iaW5kaW5nL2FwcGx5TW9ieEtleXN0b25lUGF0Y2hUb1lqc09iamVjdC50cyIsIi4uL3NyYy9iaW5kaW5nL2NvbnZlcnRZanNFdmVudFRvUGF0Y2hlcy50cyIsIi4uL3NyYy9iaW5kaW5nL2JpbmRZanNUb01vYnhLZXlzdG9uZS50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKipcclxuICogQSBtb2J4LWtleXN0b25lLXlqcyBlcnJvci5cclxuICovXHJcbmV4cG9ydCBjbGFzcyBNb2J4S2V5c3RvbmVZanNFcnJvciBleHRlbmRzIEVycm9yIHtcclxuICBjb25zdHJ1Y3Rvcihtc2c6IHN0cmluZykge1xyXG4gICAgc3VwZXIobXNnKVxyXG5cclxuICAgIC8vIFNldCB0aGUgcHJvdG90eXBlIGV4cGxpY2l0bHkuXHJcbiAgICBPYmplY3Quc2V0UHJvdG90eXBlT2YodGhpcywgTW9ieEtleXN0b25lWWpzRXJyb3IucHJvdG90eXBlKVxyXG4gIH1cclxufVxyXG5cclxuLyoqXHJcbiAqIEBpbnRlcm5hbFxyXG4gKi9cclxuZXhwb3J0IGZ1bmN0aW9uIGZhaWx1cmUobXNnOiBzdHJpbmcpIHtcclxuICByZXR1cm4gbmV3IE1vYnhLZXlzdG9uZVlqc0Vycm9yKG1zZylcclxufVxyXG4iLCJpbXBvcnQgKiBhcyBZIGZyb20gXCJ5anNcIlxyXG5pbXBvcnQgeyBKU09OVmFsdWUsIEpTT05BcnJheSwgSlNPTk9iamVjdCwgSlNPTlByaW1pdGl2ZSB9IGZyb20gXCIuLi9qc29uVHlwZXNcIlxyXG5cclxuZnVuY3Rpb24gaXNKU09OUHJpbWl0aXZlKHY6IEpTT05WYWx1ZSk6IHYgaXMgSlNPTlByaW1pdGl2ZSB7XHJcbiAgY29uc3QgdCA9IHR5cGVvZiB2XHJcbiAgcmV0dXJuIHQgPT09IFwic3RyaW5nXCIgfHwgdCA9PT0gXCJudW1iZXJcIiB8fCB0ID09PSBcImJvb2xlYW5cIiB8fCB2ID09PSBudWxsXHJcbn1cclxuXHJcbmZ1bmN0aW9uIGlzSlNPTkFycmF5KHY6IEpTT05WYWx1ZSk6IHYgaXMgSlNPTkFycmF5IHtcclxuICByZXR1cm4gQXJyYXkuaXNBcnJheSh2KVxyXG59XHJcblxyXG5mdW5jdGlvbiBpc0pTT05PYmplY3QodjogSlNPTlZhbHVlKTogdiBpcyBKU09OT2JqZWN0IHtcclxuICByZXR1cm4gIWlzSlNPTkFycmF5KHYpICYmIHR5cGVvZiB2ID09PSBcIm9iamVjdFwiXHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiB0b1lEYXRhVHlwZSh2OiBKU09OVmFsdWUpIHtcclxuICBpZiAoaXNKU09OUHJpbWl0aXZlKHYpKSB7XHJcbiAgICByZXR1cm4gdlxyXG4gIH0gZWxzZSBpZiAoaXNKU09OQXJyYXkodikpIHtcclxuICAgIGNvbnN0IGFyciA9IG5ldyBZLkFycmF5KClcclxuICAgIGFwcGx5SnNvbkFycmF5KGFyciwgdilcclxuICAgIHJldHVybiBhcnJcclxuICB9IGVsc2UgaWYgKGlzSlNPTk9iamVjdCh2KSkge1xyXG4gICAgY29uc3QgbWFwID0gbmV3IFkuTWFwKClcclxuICAgIGFwcGx5SnNvbk9iamVjdChtYXAsIHYpXHJcbiAgICByZXR1cm4gbWFwXHJcbiAgfSBlbHNlIHtcclxuICAgIHJldHVybiB1bmRlZmluZWRcclxuICB9XHJcbn1cclxuXHJcbmZ1bmN0aW9uIGFwcGx5SnNvbkFycmF5KGRlc3Q6IFkuQXJyYXk8dW5rbm93bj4sIHNvdXJjZTogSlNPTkFycmF5KSB7XHJcbiAgZGVzdC5wdXNoKHNvdXJjZS5tYXAodG9ZRGF0YVR5cGUpKVxyXG59XHJcblxyXG5mdW5jdGlvbiBhcHBseUpzb25PYmplY3QoZGVzdDogWS5NYXA8dW5rbm93bj4sIHNvdXJjZTogSlNPTk9iamVjdCkge1xyXG4gIE9iamVjdC5lbnRyaWVzKHNvdXJjZSkuZm9yRWFjaCgoW2ssIHZdKSA9PiB7XHJcbiAgICBkZXN0LnNldChrLCB0b1lEYXRhVHlwZSh2KSlcclxuICB9KVxyXG59XHJcbiIsImltcG9ydCB7IFBhdGNoIH0gZnJvbSBcIm1vYngta2V5c3RvbmVcIlxyXG5pbXBvcnQgeyBmYWlsdXJlIH0gZnJvbSBcIi4uL3V0aWxzL2Vycm9yXCJcclxuaW1wb3J0ICogYXMgWSBmcm9tIFwieWpzXCJcclxuaW1wb3J0IHsgdG9ZRGF0YVR5cGUgfSBmcm9tIFwiLi90b1lEYXRhVHlwZVwiXHJcblxyXG5leHBvcnQgZnVuY3Rpb24gYXBwbHlNb2J4S2V5c3RvbmVQYXRjaFRvWWpzT2JqZWN0KHBhdGNoOiBQYXRjaCwgeWpzOiB1bmtub3duKTogdm9pZCB7XHJcbiAgaWYgKHBhdGNoLnBhdGgubGVuZ3RoID4gMSkge1xyXG4gICAgY29uc3QgW2tleSwgLi4ucmVzdF0gPSBwYXRjaC5wYXRoXHJcblxyXG4gICAgaWYgKHlqcyBpbnN0YW5jZW9mIFkuTWFwKSB7XHJcbiAgICAgIGNvbnN0IGNoaWxkID0geWpzLmdldChTdHJpbmcoa2V5KSlcclxuICAgICAgaWYgKGNoaWxkID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICB0aHJvdyBmYWlsdXJlKFxyXG4gICAgICAgICAgYGludmFsaWQgcGF0Y2ggcGF0aCwga2V5IFwiJHtrZXl9XCIgbm90IGZvdW5kIGluIFlqcyBtYXAgLSBwYXRjaDogJHtKU09OLnN0cmluZ2lmeShwYXRjaCl9YFxyXG4gICAgICAgIClcclxuICAgICAgfVxyXG4gICAgICBhcHBseU1vYnhLZXlzdG9uZVBhdGNoVG9ZanNPYmplY3QoeyAuLi5wYXRjaCwgcGF0aDogcmVzdCB9LCBjaGlsZClcclxuICAgIH0gZWxzZSBpZiAoeWpzIGluc3RhbmNlb2YgWS5BcnJheSkge1xyXG4gICAgICBjb25zdCBjaGlsZCA9IHlqcy5nZXQoTnVtYmVyKGtleSkpXHJcbiAgICAgIGlmIChjaGlsZCA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgdGhyb3cgZmFpbHVyZShcclxuICAgICAgICAgIGBpbnZhbGlkIHBhdGNoIHBhdGgsIGtleSBcIiR7a2V5fVwiIG5vdCBmb3VuZCBpbiBZanMgYXJyYXkgLSBwYXRjaDogJHtKU09OLnN0cmluZ2lmeShcclxuICAgICAgICAgICAgcGF0Y2hcclxuICAgICAgICAgICl9YFxyXG4gICAgICAgIClcclxuICAgICAgfVxyXG4gICAgICBhcHBseU1vYnhLZXlzdG9uZVBhdGNoVG9ZanNPYmplY3QoeyAuLi5wYXRjaCwgcGF0aDogcmVzdCB9LCBjaGlsZClcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRocm93IGZhaWx1cmUoXHJcbiAgICAgICAgYGludmFsaWQgcGF0Y2ggcGF0aCwga2V5IFwiJHtrZXl9XCIgbm90IGZvdW5kIGluIHVua25vd24gWWpzIG9iamVjdCAtIHBhdGNoOiAke0pTT04uc3RyaW5naWZ5KFxyXG4gICAgICAgICAgcGF0Y2hcclxuICAgICAgICApfWBcclxuICAgICAgKVxyXG4gICAgfVxyXG4gIH0gZWxzZSBpZiAocGF0Y2gucGF0aC5sZW5ndGggPT09IDEpIHtcclxuICAgIGlmICh5anMgaW5zdGFuY2VvZiBZLk1hcCkge1xyXG4gICAgICBjb25zdCBrZXkgPSBTdHJpbmcocGF0Y2gucGF0aFswXSlcclxuXHJcbiAgICAgIHN3aXRjaCAocGF0Y2gub3ApIHtcclxuICAgICAgICBjYXNlIFwiYWRkXCI6XHJcbiAgICAgICAgY2FzZSBcInJlcGxhY2VcIjoge1xyXG4gICAgICAgICAgeWpzLnNldChrZXksIHRvWURhdGFUeXBlKHBhdGNoLnZhbHVlKSlcclxuICAgICAgICAgIGJyZWFrXHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNhc2UgXCJyZW1vdmVcIjoge1xyXG4gICAgICAgICAgeWpzLmRlbGV0ZShrZXkpXHJcbiAgICAgICAgICBicmVha1xyXG4gICAgICAgIH1cclxuICAgICAgICBkZWZhdWx0OiB7XHJcbiAgICAgICAgICB0aHJvdyBmYWlsdXJlKGBpbnZhbGlkIHBhdGNoIG9wZXJhdGlvbiBmb3IgbWFwYClcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH0gZWxzZSBpZiAoeWpzIGluc3RhbmNlb2YgWS5BcnJheSkge1xyXG4gICAgICBjb25zdCBrZXkgPSBwYXRjaC5wYXRoWzBdXHJcblxyXG4gICAgICBzd2l0Y2ggKHBhdGNoLm9wKSB7XHJcbiAgICAgICAgY2FzZSBcInJlcGxhY2VcIjoge1xyXG4gICAgICAgICAgaWYgKGtleSA9PT0gXCJsZW5ndGhcIikge1xyXG4gICAgICAgICAgICBpZiAoeWpzLmxlbmd0aCA+IHBhdGNoLnZhbHVlKSB7XHJcbiAgICAgICAgICAgICAgY29uc3QgdG9EZWxldGUgPSB5anMubGVuZ3RoIC0gcGF0Y2gudmFsdWVcclxuICAgICAgICAgICAgICB5anMuZGVsZXRlKHBhdGNoLnZhbHVlLCB0b0RlbGV0ZSlcclxuICAgICAgICAgICAgfSBlbHNlIGlmICh5anMubGVuZ3RoIDwgcGF0Y2gudmFsdWUpIHtcclxuICAgICAgICAgICAgICBjb25zdCB0b0luc2VydCA9IHBhdGNoLnZhbHVlIC0geWpzLmxlbmd0aFxyXG4gICAgICAgICAgICAgIHlqcy5pbnNlcnQoeWpzLmxlbmd0aCwgQXJyYXkodG9JbnNlcnQpLmZpbGwodW5kZWZpbmVkKSlcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgeWpzLmRlbGV0ZShOdW1iZXIoa2V5KSlcclxuICAgICAgICAgICAgeWpzLmluc2VydChOdW1iZXIoa2V5KSwgW3RvWURhdGFUeXBlKHBhdGNoLnZhbHVlKV0pXHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBicmVha1xyXG4gICAgICAgIH1cclxuICAgICAgICBjYXNlIFwiYWRkXCI6IHtcclxuICAgICAgICAgIHlqcy5pbnNlcnQoTnVtYmVyKGtleSksIFt0b1lEYXRhVHlwZShwYXRjaC52YWx1ZSldKVxyXG4gICAgICAgICAgYnJlYWtcclxuICAgICAgICB9XHJcbiAgICAgICAgY2FzZSBcInJlbW92ZVwiOiB7XHJcbiAgICAgICAgICB5anMuZGVsZXRlKE51bWJlcihrZXkpKVxyXG4gICAgICAgICAgYnJlYWtcclxuICAgICAgICB9XHJcbiAgICAgICAgZGVmYXVsdDoge1xyXG4gICAgICAgICAgdGhyb3cgZmFpbHVyZShgaW52YWxpZCBwYXRjaCBvcGVyYXRpb24gZm9yIGFycmF5YClcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRocm93IGZhaWx1cmUoXHJcbiAgICAgICAgYGludmFsaWQgcGF0Y2ggcGF0aCwgdGhlIFlqcyBvYmplY3QgaXMgb2YgYW4gdW5rb3duIHR5cGUsIHNvIGtleSBcIiR7cGF0Y2gucGF0aFswXX1cIiBjYW5ub3QgYmUgZm91bmQgaW4gaXRgXHJcbiAgICAgIClcclxuICAgIH1cclxuICB9IGVsc2Uge1xyXG4gICAgdGhyb3cgZmFpbHVyZShgaW52YWxpZCBwYXRjaCBwYXRoLCBpdCBjYW5ub3QgYmUgZW1wdHlgKVxyXG4gIH1cclxufVxyXG4iLCJpbXBvcnQgeyBQYXRjaCB9IGZyb20gXCJtb2J4LWtleXN0b25lXCJcclxuaW1wb3J0ICogYXMgWSBmcm9tIFwieWpzXCJcclxuaW1wb3J0IHsgSlNPTkFycmF5LCBKU09OT2JqZWN0LCBKU09OVmFsdWUgfSBmcm9tIFwiLi4vanNvblR5cGVzXCJcclxuaW1wb3J0IHsgZmFpbHVyZSB9IGZyb20gXCIuLi91dGlscy9lcnJvclwiXHJcblxyXG5leHBvcnQgZnVuY3Rpb24gY29udmVydFlqc0V2ZW50VG9QYXRjaGVzKGV2ZW50OiBZLllFdmVudDxhbnk+KTogUGF0Y2hbXSB7XHJcbiAgY29uc3QgcGF0Y2hlczogUGF0Y2hbXSA9IFtdXHJcblxyXG4gIGlmIChldmVudCBpbnN0YW5jZW9mIFkuWU1hcEV2ZW50KSB7XHJcbiAgICBjb25zdCBzb3VyY2UgPSBldmVudC50YXJnZXQgYXMgWS5NYXA8YW55PlxyXG5cclxuICAgIGV2ZW50LmNoYW5nZXMua2V5cy5mb3JFYWNoKChjaGFuZ2UsIGtleSkgPT4ge1xyXG4gICAgICBjb25zdCBwYXRoID0gWy4uLmV2ZW50LnBhdGgsIGtleV1cclxuXHJcbiAgICAgIHN3aXRjaCAoY2hhbmdlLmFjdGlvbikge1xyXG4gICAgICAgIGNhc2UgXCJhZGRcIjpcclxuICAgICAgICAgIHBhdGNoZXMucHVzaCh7XHJcbiAgICAgICAgICAgIG9wOiBcImFkZFwiLFxyXG4gICAgICAgICAgICBwYXRoLFxyXG4gICAgICAgICAgICB2YWx1ZTogdG9QbGFpblZhbHVlKHNvdXJjZS5nZXQoa2V5KSksXHJcbiAgICAgICAgICB9KVxyXG4gICAgICAgICAgYnJlYWtcclxuXHJcbiAgICAgICAgY2FzZSBcInVwZGF0ZVwiOlxyXG4gICAgICAgICAgcGF0Y2hlcy5wdXNoKHtcclxuICAgICAgICAgICAgb3A6IFwicmVwbGFjZVwiLFxyXG4gICAgICAgICAgICBwYXRoLFxyXG4gICAgICAgICAgICB2YWx1ZTogdG9QbGFpblZhbHVlKHNvdXJjZS5nZXQoa2V5KSksXHJcbiAgICAgICAgICB9KVxyXG4gICAgICAgICAgYnJlYWtcclxuXHJcbiAgICAgICAgY2FzZSBcImRlbGV0ZVwiOlxyXG4gICAgICAgICAgcGF0Y2hlcy5wdXNoKHtcclxuICAgICAgICAgICAgb3A6IFwicmVtb3ZlXCIsXHJcbiAgICAgICAgICAgIHBhdGgsXHJcbiAgICAgICAgICB9KVxyXG4gICAgICAgICAgYnJlYWtcclxuXHJcbiAgICAgICAgZGVmYXVsdDpcclxuICAgICAgICAgIHRocm93IGZhaWx1cmUoYHVuc3VwcG9ydGVkIFlqcyBtYXAgZXZlbnQgYWN0aW9uOiAke2NoYW5nZS5hY3Rpb259YClcclxuICAgICAgfVxyXG4gICAgfSlcclxuICB9IGVsc2UgaWYgKGV2ZW50IGluc3RhbmNlb2YgWS5ZQXJyYXlFdmVudCkge1xyXG4gICAgbGV0IHJldGFpbiA9IDBcclxuICAgIGV2ZW50LmNoYW5nZXMuZGVsdGEuZm9yRWFjaCgoY2hhbmdlKSA9PiB7XHJcbiAgICAgIGlmIChjaGFuZ2UucmV0YWluKSB7XHJcbiAgICAgICAgcmV0YWluICs9IGNoYW5nZS5yZXRhaW5cclxuICAgICAgfVxyXG5cclxuICAgICAgaWYgKGNoYW5nZS5kZWxldGUpIHtcclxuICAgICAgICAvLyByZW1vdmUgWCBpdGVtcyBhdCByZXRhaW4gcG9zaXRpb25cclxuICAgICAgICBjb25zdCBwYXRoID0gWy4uLmV2ZW50LnBhdGgsIHJldGFpbl1cclxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNoYW5nZS5kZWxldGU7IGkrKykge1xyXG4gICAgICAgICAgcGF0Y2hlcy5wdXNoKHtcclxuICAgICAgICAgICAgb3A6IFwicmVtb3ZlXCIsXHJcbiAgICAgICAgICAgIHBhdGgsXHJcbiAgICAgICAgICB9KVxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG5cclxuICAgICAgaWYgKGNoYW5nZS5pbnNlcnQpIHtcclxuICAgICAgICBjb25zdCBuZXdWYWx1ZXMgPSBBcnJheS5pc0FycmF5KGNoYW5nZS5pbnNlcnQpID8gY2hhbmdlLmluc2VydCA6IFtjaGFuZ2UuaW5zZXJ0XVxyXG4gICAgICAgIG5ld1ZhbHVlcy5mb3JFYWNoKCh2KSA9PiB7XHJcbiAgICAgICAgICBjb25zdCBwYXRoID0gWy4uLmV2ZW50LnBhdGgsIHJldGFpbl1cclxuICAgICAgICAgIHBhdGNoZXMucHVzaCh7XHJcbiAgICAgICAgICAgIG9wOiBcImFkZFwiLFxyXG4gICAgICAgICAgICBwYXRoLFxyXG4gICAgICAgICAgICB2YWx1ZTogdG9QbGFpblZhbHVlKHYpLFxyXG4gICAgICAgICAgfSlcclxuICAgICAgICAgIHJldGFpbisrXHJcbiAgICAgICAgfSlcclxuICAgICAgfVxyXG4gICAgfSlcclxuICB9XHJcblxyXG4gIHJldHVybiBwYXRjaGVzXHJcbn1cclxuXHJcbmZ1bmN0aW9uIHRvUGxhaW5WYWx1ZSh2OiBZLk1hcDxhbnk+IHwgWS5BcnJheTxhbnk+IHwgSlNPTlZhbHVlKSB7XHJcbiAgaWYgKHYgaW5zdGFuY2VvZiBZLk1hcCB8fCB2IGluc3RhbmNlb2YgWS5BcnJheSkge1xyXG4gICAgcmV0dXJuIHYudG9KU09OKCkgYXMgSlNPTk9iamVjdCB8IEpTT05BcnJheVxyXG4gIH0gZWxzZSB7XHJcbiAgICByZXR1cm4gdlxyXG4gIH1cclxufVxyXG4iLCJpbXBvcnQge1xyXG4gIEFueURhdGFNb2RlbCxcclxuICBBbnlNb2RlbCxcclxuICBBbnlTdGFuZGFyZFR5cGUsXHJcbiAgTW9kZWxDbGFzcyxcclxuICBQYXRjaCxcclxuICBUeXBlVG9EYXRhLFxyXG4gIGFwcGx5UGF0Y2hlcyxcclxuICBmcm9tU25hcHNob3QsXHJcbiAgZ2V0UGFyZW50VG9DaGlsZFBhdGgsXHJcbiAgb25HbG9iYWxQYXRjaGVzLFxyXG4gIG9uUGF0Y2hlcyxcclxuICBvblNuYXBzaG90LFxyXG59IGZyb20gXCJtb2J4LWtleXN0b25lXCJcclxuaW1wb3J0ICogYXMgWSBmcm9tIFwieWpzXCJcclxuaW1wb3J0IHsgYXBwbHlNb2J4S2V5c3RvbmVQYXRjaFRvWWpzT2JqZWN0IH0gZnJvbSBcIi4vYXBwbHlNb2J4S2V5c3RvbmVQYXRjaFRvWWpzT2JqZWN0XCJcclxuaW1wb3J0IHsgY29udmVydFlqc0V2ZW50VG9QYXRjaGVzIH0gZnJvbSBcIi4vY29udmVydFlqc0V2ZW50VG9QYXRjaGVzXCJcclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBiaW5kWWpzVG9Nb2J4S2V5c3RvbmU8XHJcbiAgVFR5cGUgZXh0ZW5kcyBBbnlTdGFuZGFyZFR5cGUgfCBNb2RlbENsYXNzPEFueU1vZGVsPiB8IE1vZGVsQ2xhc3M8QW55RGF0YU1vZGVsPixcclxuPih7XHJcbiAgeWpzRG9jLFxyXG4gIHlqc09iamVjdCxcclxuICBtb2J4S2V5c3RvbmVUeXBlLFxyXG59OiB7XHJcbiAgeWpzRG9jOiBZLkRvY1xyXG4gIHlqc09iamVjdDogWS5NYXA8dW5rbm93bj4gfCBZLkFycmF5PHVua25vd24+XHJcbiAgbW9ieEtleXN0b25lVHlwZTogVFR5cGVcclxufSk6IHtcclxuICBib3VuZE9iamVjdDogVHlwZVRvRGF0YTxUVHlwZT5cclxuICBkaXNwb3NlKCk6IHZvaWRcclxuICB5anNPcmlnaW46IHN5bWJvbFxyXG59IHtcclxuICBjb25zdCB5anNKc29uID0geWpzT2JqZWN0LnRvSlNPTigpXHJcblxyXG4gIGNvbnN0IGluaXRpYWxpemF0aW9uR2xvYmFsUGF0Y2hlczogeyB0YXJnZXQ6IG9iamVjdDsgcGF0Y2hlczogUGF0Y2hbXSB9W10gPSBbXVxyXG5cclxuICBjb25zdCBjcmVhdGVCb3VuZE9iamVjdCA9ICgpID0+IHtcclxuICAgIGNvbnN0IGRpc3Bvc2VPbkdsb2JhbFBhdGNoZXMgPSBvbkdsb2JhbFBhdGNoZXMoKHRhcmdldCwgcGF0Y2hlcykgPT4ge1xyXG4gICAgICBpbml0aWFsaXphdGlvbkdsb2JhbFBhdGNoZXMucHVzaCh7IHRhcmdldCwgcGF0Y2hlcyB9KVxyXG4gICAgfSlcclxuXHJcbiAgICB0cnkge1xyXG4gICAgICByZXR1cm4gZnJvbVNuYXBzaG90KG1vYnhLZXlzdG9uZVR5cGUsIHlqc0pzb24gYXMgYW55KVxyXG4gICAgfSBmaW5hbGx5IHtcclxuICAgICAgZGlzcG9zZU9uR2xvYmFsUGF0Y2hlcygpXHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBjb25zdCBib3VuZE9iamVjdCA9IGNyZWF0ZUJvdW5kT2JqZWN0KClcclxuXHJcbiAgbGV0IGFwcGx5aW5nTW9ieEtleXN0b25lQ2hhbmdlcyA9IDBcclxuICBjb25zdCB5anNPcmlnaW4gPSBTeW1ib2woXCJiaW5kWWpzVG9Nb2J4S2V5c3RvbmVUcmFuc2FjdGlvbk9yaWdpblwiKVxyXG5cclxuICAvLyBiaW5kIGFueSBjaGFuZ2VzIGZyb20geWpzIHRvIG1vYngta2V5c3RvbmVcclxuICBjb25zdCBvYnNlcnZlRGVlcENiID0gKGV2ZW50czogWS5ZRXZlbnQ8YW55PltdKSA9PiB7XHJcbiAgICBjb25zdCBwYXRjaGVzOiBQYXRjaFtdID0gW11cclxuICAgIGV2ZW50cy5mb3JFYWNoKChldmVudCkgPT4ge1xyXG4gICAgICBpZiAoZXZlbnQudHJhbnNhY3Rpb24ub3JpZ2luICE9PSB5anNPcmlnaW4pIHtcclxuICAgICAgICBwYXRjaGVzLnB1c2goLi4uY29udmVydFlqc0V2ZW50VG9QYXRjaGVzKGV2ZW50KSlcclxuICAgICAgfVxyXG4gICAgfSlcclxuXHJcbiAgICBpZiAocGF0Y2hlcy5sZW5ndGggPiAwKSB7XHJcbiAgICAgIGFwcGx5aW5nTW9ieEtleXN0b25lQ2hhbmdlcysrXHJcbiAgICAgIHRyeSB7XHJcbiAgICAgICAgYXBwbHlQYXRjaGVzKGJvdW5kT2JqZWN0LCBwYXRjaGVzKVxyXG4gICAgICB9IGZpbmFsbHkge1xyXG4gICAgICAgIGFwcGx5aW5nTW9ieEtleXN0b25lQ2hhbmdlcy0tXHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIHlqc09iamVjdC5vYnNlcnZlRGVlcChvYnNlcnZlRGVlcENiKVxyXG5cclxuICAvLyBiaW5kIGFueSBjaGFuZ2VzIGZyb20gbW9ieC1rZXlzdG9uZSB0byB5anNcclxuICBsZXQgcGVuZGluZ1BhdGNoZXM6IFBhdGNoW10gPSBbXVxyXG4gIGNvbnN0IGRpc3Bvc2VPblBhdGNoZXMgPSBvblBhdGNoZXMoYm91bmRPYmplY3QsIChwYXRjaGVzKSA9PiB7XHJcbiAgICBpZiAoYXBwbHlpbmdNb2J4S2V5c3RvbmVDaGFuZ2VzID4gMCkge1xyXG4gICAgICByZXR1cm5cclxuICAgIH1cclxuXHJcbiAgICBwZW5kaW5nUGF0Y2hlcy5wdXNoKC4uLnBhdGNoZXMpXHJcbiAgfSlcclxuXHJcbiAgLy8gdGhpcyBpcyBvbmx5IHVzZWQgc28gd2UgY2FuIHRyYW5zYWN0IGFsbCBwYXRjaGVzIHRvIHRoZSBzbmFwc2hvdCBib3VuZGFyeVxyXG4gIGNvbnN0IGRpc3Bvc2VPblNuYXBzaG90ID0gb25TbmFwc2hvdChib3VuZE9iamVjdCwgKCkgPT4ge1xyXG4gICAgaWYgKHBlbmRpbmdQYXRjaGVzLmxlbmd0aCA9PT0gMCkge1xyXG4gICAgICByZXR1cm5cclxuICAgIH1cclxuXHJcbiAgICBjb25zdCBwYXRjaGVzID0gcGVuZGluZ1BhdGNoZXNcclxuICAgIHBlbmRpbmdQYXRjaGVzID0gW11cclxuXHJcbiAgICB5anNEb2MudHJhbnNhY3QoKCkgPT4ge1xyXG4gICAgICBwYXRjaGVzLmZvckVhY2goKHBhdGNoKSA9PiB7XHJcbiAgICAgICAgYXBwbHlNb2J4S2V5c3RvbmVQYXRjaFRvWWpzT2JqZWN0KHBhdGNoLCB5anNPYmplY3QpXHJcbiAgICAgIH0pXHJcbiAgICB9LCB5anNPcmlnaW4pXHJcbiAgfSlcclxuXHJcbiAgLy8gc3luYyBpbml0aWFsIHBhdGNoZXMsIHRoYXQgbWlnaHQgaW5jbHVkZSBzZXR0aW5nIGRlZmF1bHRzLCBJRHMsIGV0Y1xyXG4gIHlqc0RvYy50cmFuc2FjdCgoKSA9PiB7XHJcbiAgICAvLyB3ZSBuZWVkIHRvIHNraXAgaW5pdGlhbGl6YXRpb25zIHVudGlsIHdlIGhpdCB0aGUgaW5pdGlhbGl6YXRpb24gb2YgdGhlIGJvdW5kIG9iamVjdFxyXG4gICAgLy8gdGhpcyBpcyBiZWNhdXNlIGRlZmF1bHQgb2JqZWN0cyBtaWdodCBiZSBjcmVhdGVkIGFuZCBpbml0aWFsaXplZCBiZWZvcmUgdGhlIG1haW4gb2JqZWN0XHJcbiAgICAvLyBidXQgd2UganVzdCBuZWVkIHRvIGNhdGNoIHdoZW4gdGhvc2UgYXJlIGFjdHVhbGx5IGFzc2lnbmVkIHRvIHRoZSBib3VuZCBvYmplY3RcclxuICAgIGxldCBib3VuZE9iamVjdEZvdW5kID0gZmFsc2VcclxuXHJcbiAgICBpbml0aWFsaXphdGlvbkdsb2JhbFBhdGNoZXMuZm9yRWFjaCgoeyB0YXJnZXQsIHBhdGNoZXMgfSkgPT4ge1xyXG4gICAgICBpZiAoIWJvdW5kT2JqZWN0Rm91bmQpIHtcclxuICAgICAgICBpZiAodGFyZ2V0ICE9PSBib3VuZE9iamVjdCkge1xyXG4gICAgICAgICAgcmV0dXJuIC8vIHNraXBcclxuICAgICAgICB9XHJcbiAgICAgICAgYm91bmRPYmplY3RGb3VuZCA9IHRydWVcclxuICAgICAgfVxyXG5cclxuICAgICAgY29uc3QgcGFyZW50VG9DaGlsZFBhdGggPSBnZXRQYXJlbnRUb0NoaWxkUGF0aChib3VuZE9iamVjdCwgdGFyZ2V0KVxyXG4gICAgICAvLyB0aGlzIGlzIHVuZGVmaW5lZCBvbmx5IGlmIHRhcmdldCBpcyBub3QgYSBjaGlsZCBvZiBib3VuZE1vZGVsXHJcbiAgICAgIGlmIChwYXJlbnRUb0NoaWxkUGF0aCAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgcGF0Y2hlcy5mb3JFYWNoKChwYXRjaCkgPT4ge1xyXG4gICAgICAgICAgYXBwbHlNb2J4S2V5c3RvbmVQYXRjaFRvWWpzT2JqZWN0KFxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgLi4ucGF0Y2gsXHJcbiAgICAgICAgICAgICAgcGF0aDogWy4uLnBhcmVudFRvQ2hpbGRQYXRoLCAuLi5wYXRjaC5wYXRoXSxcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgeWpzT2JqZWN0XHJcbiAgICAgICAgICApXHJcbiAgICAgICAgfSlcclxuICAgICAgfVxyXG4gICAgfSlcclxuICB9LCB5anNPcmlnaW4pXHJcblxyXG4gIHJldHVybiB7XHJcbiAgICBib3VuZE9iamVjdCxcclxuICAgIGRpc3Bvc2U6ICgpID0+IHtcclxuICAgICAgZGlzcG9zZU9uUGF0Y2hlcygpXHJcbiAgICAgIGRpc3Bvc2VPblNuYXBzaG90KClcclxuICAgICAgeWpzT2JqZWN0LnVub2JzZXJ2ZURlZXAob2JzZXJ2ZURlZXBDYilcclxuICAgIH0sXHJcbiAgICB5anNPcmlnaW4sXHJcbiAgfVxyXG59XHJcbiJdLCJuYW1lcyI6WyJZIiwib25HbG9iYWxQYXRjaGVzIiwiZnJvbVNuYXBzaG90IiwiYXBwbHlQYXRjaGVzIiwib25QYXRjaGVzIiwib25TbmFwc2hvdCIsImdldFBhcmVudFRvQ2hpbGRQYXRoIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7RUFHTSxNQUFPLDZCQUE2QixNQUFLO0FBQUEsSUFDN0MsWUFBWSxL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
295
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibW9ieC1rZXlzdG9uZS15anMudW1kLmpzIiwic291cmNlcyI6WyIuLi9zcmMvdXRpbHMvZXJyb3IudHMiLCIuLi9zcmMvYmluZGluZy9jb252ZXJ0SnNvblRvWWpzRGF0YS50cyIsIi4uL3NyYy9iaW5kaW5nL2FwcGx5TW9ieEtleXN0b25lUGF0Y2hUb1lqc09iamVjdC50cyIsIi4uL3NyYy9iaW5kaW5nL2NvbnZlcnRZanNFdmVudFRvUGF0Y2hlcy50cyIsIi4uL3NyYy9iaW5kaW5nL2JpbmRZanNUb01vYnhLZXlzdG9uZS50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKipcclxuICogQSBtb2J4LWtleXN0b25lLXlqcyBlcnJvci5cclxuICovXHJcbmV4cG9ydCBjbGFzcyBNb2J4S2V5c3RvbmVZanNFcnJvciBleHRlbmRzIEVycm9yIHtcclxuICBjb25zdHJ1Y3Rvcihtc2c6IHN0cmluZykge1xyXG4gICAgc3VwZXIobXNnKVxyXG5cclxuICAgIC8vIFNldCB0aGUgcHJvdG90eXBlIGV4cGxpY2l0bHkuXHJcbiAgICBPYmplY3Quc2V0UHJvdG90eXBlT2YodGhpcywgTW9ieEtleXN0b25lWWpzRXJyb3IucHJvdG90eXBlKVxyXG4gIH1cclxufVxyXG5cclxuLyoqXHJcbiAqIEBpbnRlcm5hbFxyXG4gKi9cclxuZXhwb3J0IGZ1bmN0aW9uIGZhaWx1cmUobXNnOiBzdHJpbmcpIHtcclxuICByZXR1cm4gbmV3IE1vYnhLZXlzdG9uZVlqc0Vycm9yKG1zZylcclxufVxyXG4iLCJpbXBvcnQgKiBhcyBZIGZyb20gXCJ5anNcIlxuaW1wb3J0IHsgSnNvblZhbHVlLCBKc29uQXJyYXksIEpzb25PYmplY3QsIEpzb25QcmltaXRpdmUgfSBmcm9tIFwiLi4vanNvblR5cGVzXCJcblxuZnVuY3Rpb24gaXNKc29uUHJpbWl0aXZlKHY6IEpzb25WYWx1ZSk6IHYgaXMgSnNvblByaW1pdGl2ZSB7XG4gIGNvbnN0IHQgPSB0eXBlb2YgdlxuICByZXR1cm4gdCA9PT0gXCJzdHJpbmdcIiB8fCB0ID09PSBcIm51bWJlclwiIHx8IHQgPT09IFwiYm9vbGVhblwiIHx8IHYgPT09IG51bGxcbn1cblxuZnVuY3Rpb24gaXNKc29uQXJyYXkodjogSnNvblZhbHVlKTogdiBpcyBKc29uQXJyYXkge1xuICByZXR1cm4gQXJyYXkuaXNBcnJheSh2KVxufVxuXG5mdW5jdGlvbiBpc0pzb25PYmplY3QodjogSnNvblZhbHVlKTogdiBpcyBKc29uT2JqZWN0IHtcbiAgcmV0dXJuICFpc0pzb25BcnJheSh2KSAmJiB0eXBlb2YgdiA9PT0gXCJvYmplY3RcIlxufVxuXG5leHBvcnQgZnVuY3Rpb24gY29udmVydEpzb25Ub1lqc0RhdGEodjogSnNvblZhbHVlKSB7XG4gIGlmICh2ID09PSB1bmRlZmluZWQgfHwgaXNKc29uUHJpbWl0aXZlKHYpKSB7XG4gICAgcmV0dXJuIHZcbiAgfVxuXG4gIGlmIChpc0pzb25BcnJheSh2KSkge1xuICAgIGNvbnN0IGFyciA9IG5ldyBZLkFycmF5KClcbiAgICBhcHBseUpzb25BcnJheVlBcnJheShhcnIsIHYpXG4gICAgcmV0dXJuIGFyclxuICB9XG5cbiAgaWYgKGlzSnNvbk9iamVjdCh2KSkge1xuICAgIGNvbnN0IG1hcCA9IG5ldyBZLk1hcCgpXG4gICAgYXBwbHlKc29uT2JqZWN0VG9ZTWFwKG1hcCwgdilcbiAgICByZXR1cm4gbWFwXG4gIH1cblxuICB0aHJvdyBuZXcgRXJyb3IoYHVuc3VwcG9ydGVkIHZhbHVlIHR5cGU6ICR7dn1gKVxufVxuXG5leHBvcnQgZnVuY3Rpb24gYXBwbHlKc29uQXJyYXlZQXJyYXkoZGVzdDogWS5BcnJheTx1bmtub3duPiwgc291cmNlOiBKc29uQXJyYXkpIHtcbiAgZGVzdC5wdXNoKHNvdXJjZS5tYXAoY29udmVydEpzb25Ub1lqc0RhdGEpKVxufVxuXG5leHBvcnQgZnVuY3Rpb24gYXBwbHlKc29uT2JqZWN0VG9ZTWFwKGRlc3Q6IFkuTWFwPHVua25vd24+LCBzb3VyY2U6IEpzb25PYmplY3QpIHtcbiAgT2JqZWN0LmVudHJpZXMoc291cmNlKS5mb3JFYWNoKChbaywgdl0pID0+IHtcbiAgICBkZXN0LnNldChrLCBjb252ZXJ0SnNvblRvWWpzRGF0YSh2KSlcbiAgfSlcbn1cbiIsImltcG9ydCB7IFBhdGNoIH0gZnJvbSBcIm1vYngta2V5c3RvbmVcIlxuaW1wb3J0ICogYXMgWSBmcm9tIFwieWpzXCJcbmltcG9ydCB7IGZhaWx1cmUgfSBmcm9tIFwiLi4vdXRpbHMvZXJyb3JcIlxuaW1wb3J0IHsgY29udmVydEpzb25Ub1lqc0RhdGEgfSBmcm9tIFwiLi9jb252ZXJ0SnNvblRvWWpzRGF0YVwiXG5cbmV4cG9ydCBmdW5jdGlvbiBhcHBseU1vYnhLZXlzdG9uZVBhdGNoVG9ZanNPYmplY3QocGF0Y2g6IFBhdGNoLCB5anM6IHVua25vd24pOiB2b2lkIHtcbiAgaWYgKHBhdGNoLnBhdGgubGVuZ3RoID4gMSkge1xuICAgIGNvbnN0IFtrZXksIC4uLnJlc3RdID0gcGF0Y2gucGF0aFxuXG4gICAgaWYgKHlqcyBpbnN0YW5jZW9mIFkuTWFwKSB7XG4gICAgICBjb25zdCBjaGlsZCA9IHlqcy5nZXQoU3RyaW5nKGtleSkpXG4gICAgICBpZiAoY2hpbGQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICB0aHJvdyBmYWlsdXJlKFxuICAgICAgICAgIGBpbnZhbGlkIHBhdGNoIHBhdGgsIGtleSBcIiR7a2V5fVwiIG5vdCBmb3VuZCBpbiBZanMgbWFwIC0gcGF0Y2g6ICR7SlNPTi5zdHJpbmdpZnkocGF0Y2gpfWBcbiAgICAgICAgKVxuICAgICAgfVxuICAgICAgYXBwbHlNb2J4S2V5c3RvbmVQYXRjaFRvWWpzT2JqZWN0KHsgLi4ucGF0Y2gsIHBhdGg6IHJlc3QgfSwgY2hpbGQpXG4gICAgfSBlbHNlIGlmICh5anMgaW5zdGFuY2VvZiBZLkFycmF5KSB7XG4gICAgICBjb25zdCBjaGlsZCA9IHlqcy5nZXQoTnVtYmVyKGtleSkpXG4gICAgICBpZiAoY2hpbGQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICB0aHJvdyBmYWlsdXJlKFxuICAgICAgICAgIGBpbnZhbGlkIHBhdGNoIHBhdGgsIGtleSBcIiR7a2V5fVwiIG5vdCBmb3VuZCBpbiBZanMgYXJyYXkgLSBwYXRjaDogJHtKU09OLnN0cmluZ2lmeShcbiAgICAgICAgICAgIHBhdGNoXG4gICAgICAgICAgKX1gXG4gICAgICAgIClcbiAgICAgIH1cbiAgICAgIGFwcGx5TW9ieEtleXN0b25lUGF0Y2hUb1lqc09iamVjdCh7IC4uLnBhdGNoLCBwYXRoOiByZXN0IH0sIGNoaWxkKVxuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyBmYWlsdXJlKFxuICAgICAgICBgaW52YWxpZCBwYXRjaCBwYXRoLCBrZXkgXCIke2tleX1cIiBub3QgZm91bmQgaW4gdW5rbm93biBZanMgb2JqZWN0IC0gcGF0Y2g6ICR7SlNPTi5zdHJpbmdpZnkoXG4gICAgICAgICAgcGF0Y2hcbiAgICAgICAgKX1gXG4gICAgICApXG4gICAgfVxuICB9IGVsc2UgaWYgKHBhdGNoLnBhdGgubGVuZ3RoID09PSAxKSB7XG4gICAgaWYgKHlqcyBpbnN0YW5jZW9mIFkuTWFwKSB7XG4gICAgICBjb25zdCBrZXkgPSBTdHJpbmcocGF0Y2gucGF0aFswXSlcblxuICAgICAgc3dpdGNoIChwYXRjaC5vcCkge1xuICAgICAgICBjYXNlIFwiYWRkXCI6XG4gICAgICAgIGNhc2UgXCJyZXBsYWNlXCI6IHtcbiAgICAgICAgICB5anMuc2V0KGtleSwgY29udmVydEpzb25Ub1lqc0RhdGEocGF0Y2gudmFsdWUpKVxuICAgICAgICAgIGJyZWFrXG4gICAgICAgIH1cbiAgICAgICAgY2FzZSBcInJlbW92ZVwiOiB7XG4gICAgICAgICAgeWpzLmRlbGV0ZShrZXkpXG4gICAgICAgICAgYnJlYWtcbiAgICAgICAgfVxuICAgICAgICBkZWZhdWx0OiB7XG4gICAgICAgICAgdGhyb3cgZmFpbHVyZShgaW52YWxpZCBwYXRjaCBvcGVyYXRpb24gZm9yIG1hcGApXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHlqcyBpbnN0YW5jZW9mIFkuQXJyYXkpIHtcbiAgICAgIGNvbnN0IGtleSA9IHBhdGNoLnBhdGhbMF1cblxuICAgICAgc3dpdGNoIChwYXRjaC5vcCkge1xuICAgICAgICBjYXNlIFwicmVwbGFjZVwiOiB7XG4gICAgICAgICAgaWYgKGtleSA9PT0gXCJsZW5ndGhcIikge1xuICAgICAgICAgICAgaWYgKHlqcy5sZW5ndGggPiBwYXRjaC52YWx1ZSkge1xuICAgICAgICAgICAgICBjb25zdCB0b0RlbGV0ZSA9IHlqcy5sZW5ndGggLSBwYXRjaC52YWx1ZVxuICAgICAgICAgICAgICB5anMuZGVsZXRlKHBhdGNoLnZhbHVlLCB0b0RlbGV0ZSlcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoeWpzLmxlbmd0aCA8IHBhdGNoLnZhbHVlKSB7XG4gICAgICAgICAgICAgIGNvbnN0IHRvSW5zZXJ0ID0gcGF0Y2gudmFsdWUgLSB5anMubGVuZ3RoXG4gICAgICAgICAgICAgIHlqcy5pbnNlcnQoeWpzLmxlbmd0aCwgQXJyYXkodG9JbnNlcnQpLmZpbGwodW5kZWZpbmVkKSlcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgeWpzLmRlbGV0ZShOdW1iZXIoa2V5KSlcbiAgICAgICAgICAgIHlqcy5pbnNlcnQoTnVtYmVyKGtleSksIFtjb252ZXJ0SnNvblRvWWpzRGF0YShwYXRjaC52YWx1ZSldKVxuICAgICAgICAgIH1cbiAgICAgICAgICBicmVha1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgXCJhZGRcIjoge1xuICAgICAgICAgIHlqcy5pbnNlcnQoTnVtYmVyKGtleSksIFtjb252ZXJ0SnNvblRvWWpzRGF0YShwYXRjaC52YWx1ZSldKVxuICAgICAgICAgIGJyZWFrXG4gICAgICAgIH1cbiAgICAgICAgY2FzZSBcInJlbW92ZVwiOiB7XG4gICAgICAgICAgeWpzLmRlbGV0ZShOdW1iZXIoa2V5KSlcbiAgICAgICAgICBicmVha1xuICAgICAgICB9XG4gICAgICAgIGRlZmF1bHQ6IHtcbiAgICAgICAgICB0aHJvdyBmYWlsdXJlKGBpbnZhbGlkIHBhdGNoIG9wZXJhdGlvbiBmb3IgYXJyYXlgKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IGZhaWx1cmUoXG4gICAgICAgIGBpbnZhbGlkIHBhdGNoIHBhdGgsIHRoZSBZanMgb2JqZWN0IGlzIG9mIGFuIHVua293biB0eXBlLCBzbyBrZXkgXCIke3BhdGNoLnBhdGhbMF19XCIgY2Fubm90IGJlIGZvdW5kIGluIGl0YFxuICAgICAgKVxuICAgIH1cbiAgfSBlbHNlIHtcbiAgICB0aHJvdyBmYWlsdXJlKGBpbnZhbGlkIHBhdGNoIHBhdGgsIGl0IGNhbm5vdCBiZSBlbXB0eWApXG4gIH1cbn1cbiIsImltcG9ydCB7IFBhdGNoIH0gZnJvbSBcIm1vYngta2V5c3RvbmVcIlxuaW1wb3J0ICogYXMgWSBmcm9tIFwieWpzXCJcbmltcG9ydCB7IEpzb25BcnJheSwgSnNvbk9iamVjdCwgSnNvblZhbHVlIH0gZnJvbSBcIi4uL2pzb25UeXBlc1wiXG5pbXBvcnQgeyBmYWlsdXJlIH0gZnJvbSBcIi4uL3V0aWxzL2Vycm9yXCJcblxuZXhwb3J0IGZ1bmN0aW9uIGNvbnZlcnRZanNFdmVudFRvUGF0Y2hlcyhldmVudDogWS5ZRXZlbnQ8YW55Pik6IFBhdGNoW10ge1xuICBjb25zdCBwYXRjaGVzOiBQYXRjaFtdID0gW11cblxuICBpZiAoZXZlbnQgaW5zdGFuY2VvZiBZLllNYXBFdmVudCkge1xuICAgIGNvbnN0IHNvdXJjZSA9IGV2ZW50LnRhcmdldCBhcyBZLk1hcDxhbnk+XG5cbiAgICBldmVudC5jaGFuZ2VzLmtleXMuZm9yRWFjaCgoY2hhbmdlLCBrZXkpID0+IHtcbiAgICAgIGNvbnN0IHBhdGggPSBbLi4uZXZlbnQucGF0aCwga2V5XVxuXG4gICAgICBzd2l0Y2ggKGNoYW5nZS5hY3Rpb24pIHtcbiAgICAgICAgY2FzZSBcImFkZFwiOlxuICAgICAgICAgIHBhdGNoZXMucHVzaCh7XG4gICAgICAgICAgICBvcDogXCJhZGRcIixcbiAgICAgICAgICAgIHBhdGgsXG4gICAgICAgICAgICB2YWx1ZTogdG9QbGFpblZhbHVlKHNvdXJjZS5nZXQoa2V5KSksXG4gICAgICAgICAgfSlcbiAgICAgICAgICBicmVha1xuXG4gICAgICAgIGNhc2UgXCJ1cGRhdGVcIjpcbiAgICAgICAgICBwYXRjaGVzLnB1c2goe1xuICAgICAgICAgICAgb3A6IFwicmVwbGFjZVwiLFxuICAgICAgICAgICAgcGF0aCxcbiAgICAgICAgICAgIHZhbHVlOiB0b1BsYWluVmFsdWUoc291cmNlLmdldChrZXkpKSxcbiAgICAgICAgICB9KVxuICAgICAgICAgIGJyZWFrXG5cbiAgICAgICAgY2FzZSBcImRlbGV0ZVwiOlxuICAgICAgICAgIHBhdGNoZXMucHVzaCh7XG4gICAgICAgICAgICBvcDogXCJyZW1vdmVcIixcbiAgICAgICAgICAgIHBhdGgsXG4gICAgICAgICAgfSlcbiAgICAgICAgICBicmVha1xuXG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgdGhyb3cgZmFpbHVyZShgdW5zdXBwb3J0ZWQgWWpzIG1hcCBldmVudCBhY3Rpb246ICR7Y2hhbmdlLmFjdGlvbn1gKVxuICAgICAgfVxuICAgIH0pXG4gIH0gZWxzZSBpZiAoZXZlbnQgaW5zdGFuY2VvZiBZLllBcnJheUV2ZW50KSB7XG4gICAgbGV0IHJldGFpbiA9IDBcbiAgICBldmVudC5jaGFuZ2VzLmRlbHRhLmZvckVhY2goKGNoYW5nZSkgPT4ge1xuICAgICAgaWYgKGNoYW5nZS5yZXRhaW4pIHtcbiAgICAgICAgcmV0YWluICs9IGNoYW5nZS5yZXRhaW5cbiAgICAgIH1cblxuICAgICAgaWYgKGNoYW5nZS5kZWxldGUpIHtcbiAgICAgICAgLy8gcmVtb3ZlIFggaXRlbXMgYXQgcmV0YWluIHBvc2l0aW9uXG4gICAgICAgIGNvbnN0IHBhdGggPSBbLi4uZXZlbnQucGF0aCwgcmV0YWluXVxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNoYW5nZS5kZWxldGU7IGkrKykge1xuICAgICAgICAgIHBhdGNoZXMucHVzaCh7XG4gICAgICAgICAgICBvcDogXCJyZW1vdmVcIixcbiAgICAgICAgICAgIHBhdGgsXG4gICAgICAgICAgfSlcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAoY2hhbmdlLmluc2VydCkge1xuICAgICAgICBjb25zdCBuZXdWYWx1ZXMgPSBBcnJheS5pc0FycmF5KGNoYW5nZS5pbnNlcnQpID8gY2hhbmdlLmluc2VydCA6IFtjaGFuZ2UuaW5zZXJ0XVxuICAgICAgICBuZXdWYWx1ZXMuZm9yRWFjaCgodikgPT4ge1xuICAgICAgICAgIGNvbnN0IHBhdGggPSBbLi4uZXZlbnQucGF0aCwgcmV0YWluXVxuICAgICAgICAgIHBhdGNoZXMucHVzaCh7XG4gICAgICAgICAgICBvcDogXCJhZGRcIixcbiAgICAgICAgICAgIHBhdGgsXG4gICAgICAgICAgICB2YWx1ZTogdG9QbGFpblZhbHVlKHYpLFxuICAgICAgICAgIH0pXG4gICAgICAgICAgcmV0YWluKytcbiAgICAgICAgfSlcbiAgICAgIH1cbiAgICB9KVxuICB9XG5cbiAgcmV0dXJuIHBhdGNoZXNcbn1cblxuZnVuY3Rpb24gdG9QbGFpblZhbHVlKHY6IFkuTWFwPGFueT4gfCBZLkFycmF5PGFueT4gfCBKc29uVmFsdWUpIHtcbiAgaWYgKHYgaW5zdGFuY2VvZiBZLk1hcCB8fCB2IGluc3RhbmNlb2YgWS5BcnJheSkge1xuICAgIHJldHVybiB2LnRvSlNPTigpIGFzIEpzb25PYmplY3QgfCBKc29uQXJyYXlcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gdlxuICB9XG59XG4iLCJpbXBvcnQge1xyXG4gIEFueURhdGFNb2RlbCxcclxuICBBbnlNb2RlbCxcclxuICBBbnlTdGFuZGFyZFR5cGUsXHJcbiAgTW9kZWxDbGFzcyxcclxuICBQYXRjaCxcclxuICBUeXBlVG9EYXRhLFxyXG4gIGFwcGx5UGF0Y2hlcyxcclxuICBmcm9tU25hcHNob3QsXHJcbiAgZ2V0UGFyZW50VG9DaGlsZFBhdGgsXHJcbiAgb25HbG9iYWxQYXRjaGVzLFxyXG4gIG9uUGF0Y2hlcyxcclxuICBvblNuYXBzaG90LFxyXG59IGZyb20gXCJtb2J4LWtleXN0b25lXCJcclxuaW1wb3J0ICogYXMgWSBmcm9tIFwieWpzXCJcclxuaW1wb3J0IHsgYXBwbHlNb2J4S2V5c3RvbmVQYXRjaFRvWWpzT2JqZWN0IH0gZnJvbSBcIi4vYXBwbHlNb2J4S2V5c3RvbmVQYXRjaFRvWWpzT2JqZWN0XCJcclxuaW1wb3J0IHsgY29udmVydFlqc0V2ZW50VG9QYXRjaGVzIH0gZnJvbSBcIi4vY29udmVydFlqc0V2ZW50VG9QYXRjaGVzXCJcclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBiaW5kWWpzVG9Nb2J4S2V5c3RvbmU8XHJcbiAgVFR5cGUgZXh0ZW5kcyBBbnlTdGFuZGFyZFR5cGUgfCBNb2RlbENsYXNzPEFueU1vZGVsPiB8IE1vZGVsQ2xhc3M8QW55RGF0YU1vZGVsPixcclxuPih7XHJcbiAgeWpzRG9jLFxyXG4gIHlqc09iamVjdCxcclxuICBtb2J4S2V5c3RvbmVUeXBlLFxyXG59OiB7XHJcbiAgeWpzRG9jOiBZLkRvY1xyXG4gIHlqc09iamVjdDogWS5NYXA8dW5rbm93bj4gfCBZLkFycmF5PHVua25vd24+XHJcbiAgbW9ieEtleXN0b25lVHlwZTogVFR5cGVcclxufSk6IHtcclxuICBib3VuZE9iamVjdDogVHlwZVRvRGF0YTxUVHlwZT5cclxuICBkaXNwb3NlKCk6IHZvaWRcclxuICB5anNPcmlnaW46IHN5bWJvbFxyXG59IHtcclxuICBjb25zdCB5anNKc29uID0geWpzT2JqZWN0LnRvSlNPTigpXHJcblxyXG4gIGNvbnN0IGluaXRpYWxpemF0aW9uR2xvYmFsUGF0Y2hlczogeyB0YXJnZXQ6IG9iamVjdDsgcGF0Y2hlczogUGF0Y2hbXSB9W10gPSBbXVxyXG5cclxuICBjb25zdCBjcmVhdGVCb3VuZE9iamVjdCA9ICgpID0+IHtcclxuICAgIGNvbnN0IGRpc3Bvc2VPbkdsb2JhbFBhdGNoZXMgPSBvbkdsb2JhbFBhdGNoZXMoKHRhcmdldCwgcGF0Y2hlcykgPT4ge1xyXG4gICAgICBpbml0aWFsaXphdGlvbkdsb2JhbFBhdGNoZXMucHVzaCh7IHRhcmdldCwgcGF0Y2hlcyB9KVxyXG4gICAgfSlcclxuXHJcbiAgICB0cnkge1xyXG4gICAgICByZXR1cm4gZnJvbVNuYXBzaG90KG1vYnhLZXlzdG9uZVR5cGUsIHlqc0pzb24gYXMgYW55KVxyXG4gICAgfSBmaW5hbGx5IHtcclxuICAgICAgZGlzcG9zZU9uR2xvYmFsUGF0Y2hlcygpXHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBjb25zdCBib3VuZE9iamVjdCA9IGNyZWF0ZUJvdW5kT2JqZWN0KClcclxuXHJcbiAgbGV0IGFwcGx5aW5nTW9ieEtleXN0b25lQ2hhbmdlcyA9IDBcclxuICBjb25zdCB5anNPcmlnaW4gPSBTeW1ib2woXCJiaW5kWWpzVG9Nb2J4S2V5c3RvbmVUcmFuc2FjdGlvbk9yaWdpblwiKVxyXG5cclxuICAvLyBiaW5kIGFueSBjaGFuZ2VzIGZyb20geWpzIHRvIG1vYngta2V5c3RvbmVcclxuICBjb25zdCBvYnNlcnZlRGVlcENiID0gKGV2ZW50czogWS5ZRXZlbnQ8YW55PltdKSA9PiB7XHJcbiAgICBjb25zdCBwYXRjaGVzOiBQYXRjaFtdID0gW11cclxuICAgIGV2ZW50cy5mb3JFYWNoKChldmVudCkgPT4ge1xyXG4gICAgICBpZiAoZXZlbnQudHJhbnNhY3Rpb24ub3JpZ2luICE9PSB5anNPcmlnaW4pIHtcclxuICAgICAgICBwYXRjaGVzLnB1c2goLi4uY29udmVydFlqc0V2ZW50VG9QYXRjaGVzKGV2ZW50KSlcclxuICAgICAgfVxyXG4gICAgfSlcclxuXHJcbiAgICBpZiAocGF0Y2hlcy5sZW5ndGggPiAwKSB7XHJcbiAgICAgIGFwcGx5aW5nTW9ieEtleXN0b25lQ2hhbmdlcysrXHJcbiAgICAgIHRyeSB7XHJcbiAgICAgICAgYXBwbHlQYXRjaGVzKGJvdW5kT2JqZWN0LCBwYXRjaGVzKVxyXG4gICAgICB9IGZpbmFsbHkge1xyXG4gICAgICAgIGFwcGx5aW5nTW9ieEtleXN0b25lQ2hhbmdlcy0tXHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIHlqc09iamVjdC5vYnNlcnZlRGVlcChvYnNlcnZlRGVlcENiKVxyXG5cclxuICAvLyBiaW5kIGFueSBjaGFuZ2VzIGZyb20gbW9ieC1rZXlzdG9uZSB0byB5anNcclxuICBsZXQgcGVuZGluZ1BhdGNoZXM6IFBhdGNoW10gPSBbXVxyXG4gIGNvbnN0IGRpc3Bvc2VPblBhdGNoZXMgPSBvblBhdGNoZXMoYm91bmRPYmplY3QsIChwYXRjaGVzKSA9PiB7XHJcbiAgICBpZiAoYXBwbHlpbmdNb2J4S2V5c3RvbmVDaGFuZ2VzID4gMCkge1xyXG4gICAgICByZXR1cm5cclxuICAgIH1cclxuXHJcbiAgICBwZW5kaW5nUGF0Y2hlcy5wdXNoKC4uLnBhdGNoZXMpXHJcbiAgfSlcclxuXHJcbiAgLy8gdGhpcyBpcyBvbmx5IHVzZWQgc28gd2UgY2FuIHRyYW5zYWN0IGFsbCBwYXRjaGVzIHRvIHRoZSBzbmFwc2hvdCBib3VuZGFyeVxyXG4gIGNvbnN0IGRpc3Bvc2VPblNuYXBzaG90ID0gb25TbmFwc2hvdChib3VuZE9iamVjdCwgKCkgPT4ge1xyXG4gICAgaWYgKHBlbmRpbmdQYXRjaGVzLmxlbmd0aCA9PT0gMCkge1xyXG4gICAgICByZXR1cm5cclxuICAgIH1cclxuXHJcbiAgICBjb25zdCBwYXRjaGVzID0gcGVuZGluZ1BhdGNoZXNcclxuICAgIHBlbmRpbmdQYXRjaGVzID0gW11cclxuXHJcbiAgICB5anNEb2MudHJhbnNhY3QoKCkgPT4ge1xyXG4gICAgICBwYXRjaGVzLmZvckVhY2goKHBhdGNoKSA9PiB7XHJcbiAgICAgICAgYXBwbHlNb2J4S2V5c3RvbmVQYXRjaFRvWWpzT2JqZWN0KHBhdGNoLCB5anNPYmplY3QpXHJcbiAgICAgIH0pXHJcbiAgICB9LCB5anNPcmlnaW4pXHJcbiAgfSlcclxuXHJcbiAgLy8gc3luYyBpbml0aWFsIHBhdGNoZXMsIHRoYXQgbWlnaHQgaW5jbHVkZSBzZXR0aW5nIGRlZmF1bHRzLCBJRHMsIGV0Y1xyXG4gIHlqc0RvYy50cmFuc2FjdCgoKSA9PiB7XHJcbiAgICAvLyB3ZSBuZWVkIHRvIHNraXAgaW5pdGlhbGl6YXRpb25zIHVudGlsIHdlIGhpdCB0aGUgaW5pdGlhbGl6YXRpb24gb2YgdGhlIGJvdW5kIG9iamVjdFxyXG4gICAgLy8gdGhpcyBpcyBiZWNhdXNlIGRlZmF1bHQgb2JqZWN0cyBtaWdodCBiZSBjcmVhdGVkIGFuZCBpbml0aWFsaXplZCBiZWZvcmUgdGhlIG1haW4gb2JqZWN0XHJcbiAgICAvLyBidXQgd2UganVzdCBuZWVkIHRvIGNhdGNoIHdoZW4gdGhvc2UgYXJlIGFjdHVhbGx5IGFzc2lnbmVkIHRvIHRoZSBib3VuZCBvYmplY3RcclxuICAgIGxldCBib3VuZE9iamVjdEZvdW5kID0gZmFsc2VcclxuXHJcbiAgICBpbml0aWFsaXphdGlvbkdsb2JhbFBhdGNoZXMuZm9yRWFjaCgoeyB0YXJnZXQsIHBhdGNoZXMgfSkgPT4ge1xyXG4gICAgICBpZiAoIWJvdW5kT2JqZWN0Rm91bmQpIHtcclxuICAgICAgICBpZiAodGFyZ2V0ICE9PSBib3VuZE9iamVjdCkge1xyXG4gICAgICAgICAgcmV0dXJuIC8vIHNraXBcclxuICAgICAgICB9XHJcbiAgICAgICAgYm91bmRPYmplY3RGb3VuZCA9IHRydWVcclxuICAgICAgfVxyXG5cclxuICAgICAgY29uc3QgcGFyZW50VG9DaGlsZFBhdGggPSBnZXRQYXJlbnRUb0NoaWxkUGF0aChib3VuZE9iamVjdCwgdGFyZ2V0KVxyXG4gICAgICAvLyB0aGlzIGlzIHVuZGVmaW5lZCBvbmx5IGlmIHRhcmdldCBpcyBub3QgYSBjaGlsZCBvZiBib3VuZE1vZGVsXHJcbiAgICAgIGlmIChwYXJlbnRUb0NoaWxkUGF0aCAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgcGF0Y2hlcy5mb3JFYWNoKChwYXRjaCkgPT4ge1xyXG4gICAgICAgICAgYXBwbHlNb2J4S2V5c3RvbmVQYXRjaFRvWWpzT2JqZWN0KFxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgLi4ucGF0Y2gsXHJcbiAgICAgICAgICAgICAgcGF0aDogWy4uLnBhcmVudFRvQ2hpbGRQYXRoLCAuLi5wYXRjaC5wYXRoXSxcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgeWpzT2JqZWN0XHJcbiAgICAgICAgICApXHJcbiAgICAgICAgfSlcclxuICAgICAgfVxyXG4gICAgfSlcclxuICB9LCB5anNPcmlnaW4pXHJcblxyXG4gIHJldHVybiB7XHJcbiAgICBib3VuZE9iamVjdCxcclxuICAgIGRpc3Bvc2U6ICgpID0+IHtcclxuICAgICAgZGlzcG9zZU9uUGF0Y2hlcygpXHJcbiAgICAgIGRpc3Bvc2VPblNuYXBzaG90KClcclxuICAgICAgeWpzT2JqZWN0LnVub2JzZXJ2ZURlZXAob2JzZXJ2ZURlZXBDYilcclxuICAgIH0sXHJcbiAgICB5anNPcmlnaW4sXHJcbiAgfVxyXG59XHJcbiJdLCJuYW1lcyI6WyJZIiwib25HbG9iYWxQYXRjaGVzIiwiZnJvbVNuYXBzaG90IiwiYXBwbHlQYXRjaGVzIiwib25QYXRjaGVzIiwib25TbmFwc2hvdCIsImdldFBhcmVudFRvQ2hpbGRQYXRoIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7RUFHTSxNQUFPLDZCQUE2QixNQUFLO0FBQUEsSUFDN0MsWUFBWSxLQUFXO0FBQ3JCLFlBQU0sR0FBRztBQUdGLGFBQUEsZUFBZSxNQUFNLHFCQUFxQixTQUFTO0FBQUEsSUFDNUQ7QUFBQSxFQUNEO0FBS0ssV0FBVSxRQUFRLEtBQVc7QUFDMUIsV0FBQSxJQUFJLHFCQUFxQixHQUFHO0FBQUEsRUFDckM7QUNkQSxXQUFTLGdCQUFnQixHQUFZO0FBQ25DLFVBQU0sSUFBSSxPQUFPO0FBQ2pCLFdBQU8sTUFBTSxZQUFZLE1BQU0sWUFBWSxNQUFNLGFBQWEsTUFBTTtBQUFBLEVBQ3RFO0FBRUEsV0FBUyxZQUFZLEdBQVk7QUFDeEIsV0FBQSxNQUFNLFFBQVEsQ0FBQztB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
@@ -0,0 +1,5 @@
1
+ import * as Y from "yjs";
2
+ import { JsonValue, JsonArray, JsonObject, JsonPrimitive } from "../jsonTypes";
3
+ export declare function convertJsonToYjsData(v: JsonValue): JsonPrimitive | Y.Array<unknown> | Y.Map<unknown>;
4
+ export declare function applyJsonArrayYArray(dest: Y.Array<unknown>, source: JsonArray): void;
5
+ export declare function applyJsonObjectToYMap(dest: Y.Map<unknown>, source: JsonObject): void;
@@ -1,2 +1,3 @@
1
1
  export { MobxKeystoneYjsError } from "./utils/error";
2
2
  export { bindYjsToMobxKeystone } from "./binding/bindYjsToMobxKeystone";
3
+ export { convertJsonToYjsData, applyJsonArrayYArray, applyJsonObjectToYMap, } from "./binding/convertJsonToYjsData";
@@ -1,7 +1,7 @@
1
- export type JSONPrimitive = string | number | boolean | null;
2
- export type JSONValue = JSONPrimitive | JSONObject | JSONArray;
3
- export type JSONObject = {
4
- [key: string]: JSONValue;
1
+ export type JsonPrimitive = string | number | boolean | null;
2
+ export type JsonValue = JsonPrimitive | JsonObject | JsonArray;
3
+ export type JsonObject = {
4
+ [key: string]: JsonValue;
5
5
  };
6
- export interface JSONArray extends Array<JSONValue> {
6
+ export interface JsonArray extends Array<JsonValue> {
7
7
  }
package/package.json CHANGED
@@ -1,87 +1,87 @@
1
- {
2
- "name": "mobx-keystone-yjs",
3
- "version": "1.0.0",
4
- "description": "Yjs bindings for mobx-keystone",
5
- "keywords": [
6
- "mobx",
7
- "mobx-keystone",
8
- "yjs",
9
- "crdt",
10
- "state management"
11
- ],
12
- "repository": {
13
- "type": "git",
14
- "url": "https://github.com/xaviergonz/mobx-keystone.git"
15
- },
16
- "bugs": {
17
- "url": "https://github.com/xaviergonz/mobx-keystone/issues"
18
- },
19
- "homepage": "https://mobx-keystone.js.org",
20
- "license": "MIT",
21
- "author": "Javier González Garcés",
22
- "source": "./src/index.ts",
23
- "exports": {
24
- "./package.json": "./package.json",
25
- ".": {
26
- "import": "./dist/mobx-keystone-yjs.esm.mjs",
27
- "require": "./dist/mobx-keystone-yjs.umd.js",
28
- "script": "./dist/mobx-keystone-yjs.umd.js",
29
- "default": "./dist/mobx-keystone-yjs.esm.mjs",
30
- "types": "./dist/types/index.d.ts"
31
- }
32
- },
33
- "esmodule": "./dist/mobx-keystone-yjs.esm.js",
34
- "module": "./dist/mobx-keystone-yjs.esm.js",
35
- "jsnext:main": "./dist/mobx-keystone-yjs.esm.js",
36
- "react-native": "./dist/mobx-keystone-yjs.umd.js",
37
- "umd:main": "./dist/mobx-keystone-yjs.umd.js",
38
- "unpkg": "./dist/mobx-keystone-yjs.umd.js",
39
- "jsdelivr": "./dist/mobx-keystone-yjs.umd.js",
40
- "main": "./dist/mobx-keystone-yjs.umd.js",
41
- "types": "./dist/types/index.d.ts",
42
- "typings": "./dist/types/index.d.ts",
43
- "sideEffects": false,
44
- "files": [
45
- "src",
46
- "dist",
47
- "LICENSE",
48
- "CHANGELOG.md",
49
- "README.md"
50
- ],
51
- "scripts": {
52
- "quick-build": "tsc",
53
- "quick-build-tests": "tsc -p test",
54
- "copy-root-files": "shx cp ../../LICENSE .",
55
- "build": "yarn quick-build && yarn copy-root-files && shx rm -rf dist && vite build && shx cp dist/mobx-keystone-yjs.esm.mjs dist/mobx-keystone-yjs.esm.js",
56
- "test": "jest",
57
- "test:ci": "yarn test -i",
58
- "test:perf": "yarn build && yarn test:perf:run",
59
- "lint": "cd ../.. && yarn eslint \"packages/mobx-keystone-yjs/src/**/*.ts\" \"packages/mobx-keystone-yjs/test/**/*.ts\""
60
- },
61
- "peerDependencies": {
62
- "mobx": "^6.0.0 || ^5.0.0 || ^4.0.0",
63
- "mobx-keystone": "^1.8.1",
64
- "yjs": "^13.0.0"
65
- },
66
- "devDependencies": {
67
- "@types/jest": "^29.5.11",
68
- "@types/node": "^20.10.5",
69
- "babel-jest": "^29.7.0",
70
- "jest": "^29.7.0",
71
- "mobx": "^6.12.0",
72
- "mobx-keystone": "workspace:packages/lib",
73
- "rollup-plugin-typescript2": "^0.36.0",
74
- "shx": "^0.3.4",
75
- "spec.ts": "^1.1.3",
76
- "ts-jest": "^29.1.1",
77
- "ts-node": "^10.9.2",
78
- "typescript": "^5.3.3",
79
- "vite": "^5.0.10"
80
- },
81
- "dependencies": {
82
- "tslib": "^2.6.2"
83
- },
84
- "directories": {
85
- "test": "test"
86
- }
87
- }
1
+ {
2
+ "name": "mobx-keystone-yjs",
3
+ "version": "1.1.0",
4
+ "description": "Yjs bindings for mobx-keystone",
5
+ "keywords": [
6
+ "mobx",
7
+ "mobx-keystone",
8
+ "yjs",
9
+ "crdt",
10
+ "state management"
11
+ ],
12
+ "repository": {
13
+ "type": "git",
14
+ "url": "https://github.com/xaviergonz/mobx-keystone.git"
15
+ },
16
+ "bugs": {
17
+ "url": "https://github.com/xaviergonz/mobx-keystone/issues"
18
+ },
19
+ "homepage": "https://mobx-keystone.js.org",
20
+ "license": "MIT",
21
+ "author": "Javier González Garcés",
22
+ "source": "./src/index.ts",
23
+ "exports": {
24
+ "./package.json": "./package.json",
25
+ ".": {
26
+ "import": "./dist/mobx-keystone-yjs.esm.mjs",
27
+ "require": "./dist/mobx-keystone-yjs.umd.js",
28
+ "script": "./dist/mobx-keystone-yjs.umd.js",
29
+ "default": "./dist/mobx-keystone-yjs.esm.mjs",
30
+ "types": "./dist/types/index.d.ts"
31
+ }
32
+ },
33
+ "esmodule": "./dist/mobx-keystone-yjs.esm.js",
34
+ "module": "./dist/mobx-keystone-yjs.esm.js",
35
+ "jsnext:main": "./dist/mobx-keystone-yjs.esm.js",
36
+ "react-native": "./dist/mobx-keystone-yjs.umd.js",
37
+ "umd:main": "./dist/mobx-keystone-yjs.umd.js",
38
+ "unpkg": "./dist/mobx-keystone-yjs.umd.js",
39
+ "jsdelivr": "./dist/mobx-keystone-yjs.umd.js",
40
+ "main": "./dist/mobx-keystone-yjs.umd.js",
41
+ "types": "./dist/types/index.d.ts",
42
+ "typings": "./dist/types/index.d.ts",
43
+ "sideEffects": false,
44
+ "files": [
45
+ "src",
46
+ "dist",
47
+ "LICENSE",
48
+ "CHANGELOG.md",
49
+ "README.md"
50
+ ],
51
+ "scripts": {
52
+ "quick-build": "tsc",
53
+ "quick-build-tests": "tsc -p test",
54
+ "copy-root-files": "shx cp ../../LICENSE .",
55
+ "build": "yarn quick-build && yarn copy-root-files && shx rm -rf dist && vite build && shx cp dist/mobx-keystone-yjs.esm.mjs dist/mobx-keystone-yjs.esm.js",
56
+ "test": "jest",
57
+ "test:ci": "yarn test -i",
58
+ "test:perf": "yarn build && yarn test:perf:run",
59
+ "lint": "cd ../.. && yarn eslint \"packages/mobx-keystone-yjs/src/**/*.ts\" \"packages/mobx-keystone-yjs/test/**/*.ts\""
60
+ },
61
+ "peerDependencies": {
62
+ "mobx": "^6.0.0 || ^5.0.0 || ^4.0.0",
63
+ "mobx-keystone": "^1.8.1",
64
+ "yjs": "^13.0.0"
65
+ },
66
+ "devDependencies": {
67
+ "@types/jest": "^29.5.11",
68
+ "@types/node": "^20.10.5",
69
+ "babel-jest": "^29.7.0",
70
+ "jest": "^29.7.0",
71
+ "mobx": "^6.12.0",
72
+ "mobx-keystone": "workspace:packages/lib",
73
+ "rollup-plugin-typescript2": "^0.36.0",
74
+ "shx": "^0.3.4",
75
+ "spec.ts": "^1.1.3",
76
+ "ts-jest": "^29.1.1",
77
+ "ts-node": "^10.9.2",
78
+ "typescript": "^5.3.3",
79
+ "vite": "^5.0.10"
80
+ },
81
+ "dependencies": {
82
+ "tslib": "^2.6.2"
83
+ },
84
+ "directories": {
85
+ "test": "test"
86
+ }
87
+ }
@@ -1,92 +1,92 @@
1
- import { Patch } from "mobx-keystone"
2
- import { failure } from "../utils/error"
3
- import * as Y from "yjs"
4
- import { toYDataType } from "./toYDataType"
5
-
6
- export function applyMobxKeystonePatchToYjsObject(patch: Patch, yjs: unknown): void {
7
- if (patch.path.length > 1) {
8
- const [key, ...rest] = patch.path
9
-
10
- if (yjs instanceof Y.Map) {
11
- const child = yjs.get(String(key))
12
- if (child === undefined) {
13
- throw failure(
14
- `invalid patch path, key "${key}" not found in Yjs map - patch: ${JSON.stringify(patch)}`
15
- )
16
- }
17
- applyMobxKeystonePatchToYjsObject({ ...patch, path: rest }, child)
18
- } else if (yjs instanceof Y.Array) {
19
- const child = yjs.get(Number(key))
20
- if (child === undefined) {
21
- throw failure(
22
- `invalid patch path, key "${key}" not found in Yjs array - patch: ${JSON.stringify(
23
- patch
24
- )}`
25
- )
26
- }
27
- applyMobxKeystonePatchToYjsObject({ ...patch, path: rest }, child)
28
- } else {
29
- throw failure(
30
- `invalid patch path, key "${key}" not found in unknown Yjs object - patch: ${JSON.stringify(
31
- patch
32
- )}`
33
- )
34
- }
35
- } else if (patch.path.length === 1) {
36
- if (yjs instanceof Y.Map) {
37
- const key = String(patch.path[0])
38
-
39
- switch (patch.op) {
40
- case "add":
41
- case "replace": {
42
- yjs.set(key, toYDataType(patch.value))
43
- break
44
- }
45
- case "remove": {
46
- yjs.delete(key)
47
- break
48
- }
49
- default: {
50
- throw failure(`invalid patch operation for map`)
51
- }
52
- }
53
- } else if (yjs instanceof Y.Array) {
54
- const key = patch.path[0]
55
-
56
- switch (patch.op) {
57
- case "replace": {
58
- if (key === "length") {
59
- if (yjs.length > patch.value) {
60
- const toDelete = yjs.length - patch.value
61
- yjs.delete(patch.value, toDelete)
62
- } else if (yjs.length < patch.value) {
63
- const toInsert = patch.value - yjs.length
64
- yjs.insert(yjs.length, Array(toInsert).fill(undefined))
65
- }
66
- } else {
67
- yjs.delete(Number(key))
68
- yjs.insert(Number(key), [toYDataType(patch.value)])
69
- }
70
- break
71
- }
72
- case "add": {
73
- yjs.insert(Number(key), [toYDataType(patch.value)])
74
- break
75
- }
76
- case "remove": {
77
- yjs.delete(Number(key))
78
- break
79
- }
80
- default: {
81
- throw failure(`invalid patch operation for array`)
82
- }
83
- }
84
- } else {
85
- throw failure(
86
- `invalid patch path, the Yjs object is of an unkown type, so key "${patch.path[0]}" cannot be found in it`
87
- )
88
- }
89
- } else {
90
- throw failure(`invalid patch path, it cannot be empty`)
91
- }
92
- }
1
+ import { Patch } from "mobx-keystone"
2
+ import * as Y from "yjs"
3
+ import { failure } from "../utils/error"
4
+ import { convertJsonToYjsData } from "./convertJsonToYjsData"
5
+
6
+ export function applyMobxKeystonePatchToYjsObject(patch: Patch, yjs: unknown): void {
7
+ if (patch.path.length > 1) {
8
+ const [key, ...rest] = patch.path
9
+
10
+ if (yjs instanceof Y.Map) {
11
+ const child = yjs.get(String(key))
12
+ if (child === undefined) {
13
+ throw failure(
14
+ `invalid patch path, key "${key}" not found in Yjs map - patch: ${JSON.stringify(patch)}`
15
+ )
16
+ }
17
+ applyMobxKeystonePatchToYjsObject({ ...patch, path: rest }, child)
18
+ } else if (yjs instanceof Y.Array) {
19
+ const child = yjs.get(Number(key))
20
+ if (child === undefined) {
21
+ throw failure(
22
+ `invalid patch path, key "${key}" not found in Yjs array - patch: ${JSON.stringify(
23
+ patch
24
+ )}`
25
+ )
26
+ }
27
+ applyMobxKeystonePatchToYjsObject({ ...patch, path: rest }, child)
28
+ } else {
29
+ throw failure(
30
+ `invalid patch path, key "${key}" not found in unknown Yjs object - patch: ${JSON.stringify(
31
+ patch
32
+ )}`
33
+ )
34
+ }
35
+ } else if (patch.path.length === 1) {
36
+ if (yjs instanceof Y.Map) {
37
+ const key = String(patch.path[0])
38
+
39
+ switch (patch.op) {
40
+ case "add":
41
+ case "replace": {
42
+ yjs.set(key, convertJsonToYjsData(patch.value))
43
+ break
44
+ }
45
+ case "remove": {
46
+ yjs.delete(key)
47
+ break
48
+ }
49
+ default: {
50
+ throw failure(`invalid patch operation for map`)
51
+ }
52
+ }
53
+ } else if (yjs instanceof Y.Array) {
54
+ const key = patch.path[0]
55
+
56
+ switch (patch.op) {
57
+ case "replace": {
58
+ if (key === "length") {
59
+ if (yjs.length > patch.value) {
60
+ const toDelete = yjs.length - patch.value
61
+ yjs.delete(patch.value, toDelete)
62
+ } else if (yjs.length < patch.value) {
63
+ const toInsert = patch.value - yjs.length
64
+ yjs.insert(yjs.length, Array(toInsert).fill(undefined))
65
+ }
66
+ } else {
67
+ yjs.delete(Number(key))
68
+ yjs.insert(Number(key), [convertJsonToYjsData(patch.value)])
69
+ }
70
+ break
71
+ }
72
+ case "add": {
73
+ yjs.insert(Number(key), [convertJsonToYjsData(patch.value)])
74
+ break
75
+ }
76
+ case "remove": {
77
+ yjs.delete(Number(key))
78
+ break
79
+ }
80
+ default: {
81
+ throw failure(`invalid patch operation for array`)
82
+ }
83
+ }
84
+ } else {
85
+ throw failure(
86
+ `invalid patch path, the Yjs object is of an unkown type, so key "${patch.path[0]}" cannot be found in it`
87
+ )
88
+ }
89
+ } else {
90
+ throw failure(`invalid patch path, it cannot be empty`)
91
+ }
92
+ }
@@ -0,0 +1,45 @@
1
+ import * as Y from "yjs"
2
+ import { JsonValue, JsonArray, JsonObject, JsonPrimitive } from "../jsonTypes"
3
+
4
+ function isJsonPrimitive(v: JsonValue): v is JsonPrimitive {
5
+ const t = typeof v
6
+ return t === "string" || t === "number" || t === "boolean" || v === null
7
+ }
8
+
9
+ function isJsonArray(v: JsonValue): v is JsonArray {
10
+ return Array.isArray(v)
11
+ }
12
+
13
+ function isJsonObject(v: JsonValue): v is JsonObject {
14
+ return !isJsonArray(v) && typeof v === "object"
15
+ }
16
+
17
+ export function convertJsonToYjsData(v: JsonValue) {
18
+ if (v === undefined || isJsonPrimitive(v)) {
19
+ return v
20
+ }
21
+
22
+ if (isJsonArray(v)) {
23
+ const arr = new Y.Array()
24
+ applyJsonArrayYArray(arr, v)
25
+ return arr
26
+ }
27
+
28
+ if (isJsonObject(v)) {
29
+ const map = new Y.Map()
30
+ applyJsonObjectToYMap(map, v)
31
+ return map
32
+ }
33
+
34
+ throw new Error(`unsupported value type: ${v}`)
35
+ }
36
+
37
+ export function applyJsonArrayYArray(dest: Y.Array<unknown>, source: JsonArray) {
38
+ dest.push(source.map(convertJsonToYjsData))
39
+ }
40
+
41
+ export function applyJsonObjectToYMap(dest: Y.Map<unknown>, source: JsonObject) {
42
+ Object.entries(source).forEach(([k, v]) => {
43
+ dest.set(k, convertJsonToYjsData(v))
44
+ })
45
+ }
@@ -1,85 +1,85 @@
1
- import { Patch } from "mobx-keystone"
2
- import * as Y from "yjs"
3
- import { JSONArray, JSONObject, JSONValue } from "../jsonTypes"
4
- import { failure } from "../utils/error"
5
-
6
- export function convertYjsEventToPatches(event: Y.YEvent<any>): Patch[] {
7
- const patches: Patch[] = []
8
-
9
- if (event instanceof Y.YMapEvent) {
10
- const source = event.target as Y.Map<any>
11
-
12
- event.changes.keys.forEach((change, key) => {
13
- const path = [...event.path, key]
14
-
15
- switch (change.action) {
16
- case "add":
17
- patches.push({
18
- op: "add",
19
- path,
20
- value: toPlainValue(source.get(key)),
21
- })
22
- break
23
-
24
- case "update":
25
- patches.push({
26
- op: "replace",
27
- path,
28
- value: toPlainValue(source.get(key)),
29
- })
30
- break
31
-
32
- case "delete":
33
- patches.push({
34
- op: "remove",
35
- path,
36
- })
37
- break
38
-
39
- default:
40
- throw failure(`unsupported Yjs map event action: ${change.action}`)
41
- }
42
- })
43
- } else if (event instanceof Y.YArrayEvent) {
44
- let retain = 0
45
- event.changes.delta.forEach((change) => {
46
- if (change.retain) {
47
- retain += change.retain
48
- }
49
-
50
- if (change.delete) {
51
- // remove X items at retain position
52
- const path = [...event.path, retain]
53
- for (let i = 0; i < change.delete; i++) {
54
- patches.push({
55
- op: "remove",
56
- path,
57
- })
58
- }
59
- }
60
-
61
- if (change.insert) {
62
- const newValues = Array.isArray(change.insert) ? change.insert : [change.insert]
63
- newValues.forEach((v) => {
64
- const path = [...event.path, retain]
65
- patches.push({
66
- op: "add",
67
- path,
68
- value: toPlainValue(v),
69
- })
70
- retain++
71
- })
72
- }
73
- })
74
- }
75
-
76
- return patches
77
- }
78
-
79
- function toPlainValue(v: Y.Map<any> | Y.Array<any> | JSONValue) {
80
- if (v instanceof Y.Map || v instanceof Y.Array) {
81
- return v.toJSON() as JSONObject | JSONArray
82
- } else {
83
- return v
84
- }
85
- }
1
+ import { Patch } from "mobx-keystone"
2
+ import * as Y from "yjs"
3
+ import { JsonArray, JsonObject, JsonValue } from "../jsonTypes"
4
+ import { failure } from "../utils/error"
5
+
6
+ export function convertYjsEventToPatches(event: Y.YEvent<any>): Patch[] {
7
+ const patches: Patch[] = []
8
+
9
+ if (event instanceof Y.YMapEvent) {
10
+ const source = event.target as Y.Map<any>
11
+
12
+ event.changes.keys.forEach((change, key) => {
13
+ const path = [...event.path, key]
14
+
15
+ switch (change.action) {
16
+ case "add":
17
+ patches.push({
18
+ op: "add",
19
+ path,
20
+ value: toPlainValue(source.get(key)),
21
+ })
22
+ break
23
+
24
+ case "update":
25
+ patches.push({
26
+ op: "replace",
27
+ path,
28
+ value: toPlainValue(source.get(key)),
29
+ })
30
+ break
31
+
32
+ case "delete":
33
+ patches.push({
34
+ op: "remove",
35
+ path,
36
+ })
37
+ break
38
+
39
+ default:
40
+ throw failure(`unsupported Yjs map event action: ${change.action}`)
41
+ }
42
+ })
43
+ } else if (event instanceof Y.YArrayEvent) {
44
+ let retain = 0
45
+ event.changes.delta.forEach((change) => {
46
+ if (change.retain) {
47
+ retain += change.retain
48
+ }
49
+
50
+ if (change.delete) {
51
+ // remove X items at retain position
52
+ const path = [...event.path, retain]
53
+ for (let i = 0; i < change.delete; i++) {
54
+ patches.push({
55
+ op: "remove",
56
+ path,
57
+ })
58
+ }
59
+ }
60
+
61
+ if (change.insert) {
62
+ const newValues = Array.isArray(change.insert) ? change.insert : [change.insert]
63
+ newValues.forEach((v) => {
64
+ const path = [...event.path, retain]
65
+ patches.push({
66
+ op: "add",
67
+ path,
68
+ value: toPlainValue(v),
69
+ })
70
+ retain++
71
+ })
72
+ }
73
+ })
74
+ }
75
+
76
+ return patches
77
+ }
78
+
79
+ function toPlainValue(v: Y.Map<any> | Y.Array<any> | JsonValue) {
80
+ if (v instanceof Y.Map || v instanceof Y.Array) {
81
+ return v.toJSON() as JsonObject | JsonArray
82
+ } else {
83
+ return v
84
+ }
85
+ }
package/src/index.ts CHANGED
@@ -1,2 +1,7 @@
1
- export { MobxKeystoneYjsError } from "./utils/error"
2
- export { bindYjsToMobxKeystone } from "./binding/bindYjsToMobxKeystone"
1
+ export { MobxKeystoneYjsError } from "./utils/error"
2
+ export { bindYjsToMobxKeystone } from "./binding/bindYjsToMobxKeystone"
3
+ export {
4
+ convertJsonToYjsData,
5
+ applyJsonArrayYArray,
6
+ applyJsonObjectToYMap,
7
+ } from "./binding/convertJsonToYjsData"
package/src/jsonTypes.ts CHANGED
@@ -1,4 +1,4 @@
1
- export type JSONPrimitive = string | number | boolean | null
2
- export type JSONValue = JSONPrimitive | JSONObject | JSONArray
3
- export type JSONObject = { [key: string]: JSONValue }
4
- export interface JSONArray extends Array<JSONValue> {}
1
+ export type JsonPrimitive = string | number | boolean | null
2
+ export type JsonValue = JsonPrimitive | JsonObject | JsonArray
3
+ export type JsonObject = { [key: string]: JsonValue }
4
+ export interface JsonArray extends Array<JsonValue> {}
@@ -1,3 +0,0 @@
1
- import * as Y from "yjs";
2
- import { JSONValue, JSONPrimitive } from "../jsonTypes";
3
- export declare function toYDataType(v: JSONValue): JSONPrimitive | Y.Array<unknown> | Y.Map<unknown> | undefined;
@@ -1,41 +0,0 @@
1
- import * as Y from "yjs"
2
- import { JSONValue, JSONArray, JSONObject, JSONPrimitive } from "../jsonTypes"
3
-
4
- function isJSONPrimitive(v: JSONValue): v is JSONPrimitive {
5
- const t = typeof v
6
- return t === "string" || t === "number" || t === "boolean" || v === null
7
- }
8
-
9
- function isJSONArray(v: JSONValue): v is JSONArray {
10
- return Array.isArray(v)
11
- }
12
-
13
- function isJSONObject(v: JSONValue): v is JSONObject {
14
- return !isJSONArray(v) && typeof v === "object"
15
- }
16
-
17
- export function toYDataType(v: JSONValue) {
18
- if (isJSONPrimitive(v)) {
19
- return v
20
- } else if (isJSONArray(v)) {
21
- const arr = new Y.Array()
22
- applyJsonArray(arr, v)
23
- return arr
24
- } else if (isJSONObject(v)) {
25
- const map = new Y.Map()
26
- applyJsonObject(map, v)
27
- return map
28
- } else {
29
- return undefined
30
- }
31
- }
32
-
33
- function applyJsonArray(dest: Y.Array<unknown>, source: JSONArray) {
34
- dest.push(source.map(toYDataType))
35
- }
36
-
37
- function applyJsonObject(dest: Y.Map<unknown>, source: JSONObject) {
38
- Object.entries(source).forEach(([k, v]) => {
39
- dest.set(k, toYDataType(v))
40
- })
41
- }