mobx-keystone-yjs 1.4.0 → 1.5.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.
@@ -50,6 +50,9 @@ var __publicField = (obj, key, value) => {
50
50
  }
51
51
  const yjsBindingContext = mobxKeystone.createContext(void 0);
52
52
  const yjsCollectionAtoms = /* @__PURE__ */ new WeakMap();
53
+ const getYjsCollectionAtom = (yjsCollection) => {
54
+ return yjsCollectionAtoms.get(yjsCollection);
55
+ };
53
56
  const getOrCreateYjsCollectionAtom = (yjsCollection) => {
54
57
  let atom = yjsCollectionAtoms.get(yjsCollection);
55
58
  if (!atom) {
@@ -106,7 +109,7 @@ var __publicField = (obj, key, value) => {
106
109
  */
107
110
  get _yjsObjectPath() {
108
111
  const ctx = yjsBindingContext.get(this);
109
- if (!ctx || ctx.boundObject == null) {
112
+ if ((ctx == null ? void 0 : ctx.boundObject) == null) {
110
113
  throw failure("the YjsTextModel instance must be part of a bound object before it can be accessed");
111
114
  }
112
115
  const path = mobxKeystone.getParentToChildPath(ctx.boundObject, this);
@@ -151,21 +154,19 @@ var __publicField = (obj, key, value) => {
151
154
  const disposeReactionToDeltaListRefChange = mobx.reaction(() => this.$.deltaList, (deltaList) => {
152
155
  disposeObserveDeltaList == null ? void 0 : disposeObserveDeltaList();
153
156
  disposeObserveDeltaList = void 0;
154
- if (deltaList) {
155
- disposeObserveDeltaList = mobx.observe(this.$.deltaList, (change) => {
156
- if (reapplyDeltasToYjsText) {
157
- return;
158
- }
159
- if (!shouldReplicateToYjs(yjsBindingContext.get(this))) {
160
- return;
161
- }
162
- if (change.type === "splice" && change.removedCount === 0 && change.addedCount > 0 && change.index === this.deltaList.length) {
163
- newDeltas.push(...change.added);
164
- } else {
165
- reapplyDeltasToYjsText = true;
166
- }
167
- });
168
- }
157
+ disposeObserveDeltaList = mobx.observe(deltaList, (change) => {
158
+ if (reapplyDeltasToYjsText) {
159
+ return;
160
+ }
161
+ if (!shouldReplicateToYjs(yjsBindingContext.get(this))) {
162
+ return;
163
+ }
164
+ if (change.type === "splice" && change.removedCount === 0 && change.addedCount > 0 && change.index === this.deltaList.length) {
165
+ newDeltas.push(...change.added);
166
+ } else {
167
+ reapplyDeltasToYjsText = true;
168
+ }
169
+ });
169
170
  }, { fireImmediately: true });
170
171
  const disposeOnSnapshot = mobxKeystone.onSnapshot(this, () => {
171
172
  try {
@@ -254,26 +255,26 @@ var __publicField = (obj, key, value) => {
254
255
  disposeObserveYjsText = void 0;
255
256
  };
256
257
  }
257
- function isJsonPrimitive(v) {
258
+ function isJsonPrimitiveWithUndefined(v) {
258
259
  const t = typeof v;
259
- return t === "string" || t === "number" || t === "boolean" || v === null;
260
+ return t === "string" || t === "number" || t === "boolean" || v === null || v === void 0;
260
261
  }
261
- function isJsonArray(v) {
262
+ function isJsonArrayWithUndefined(v) {
262
263
  return Array.isArray(v);
263
264
  }
264
- function isJsonObject(v) {
265
- return !isJsonArray(v) && typeof v === "object";
265
+ function isJsonObjectWithUndefined(v) {
266
+ return !isJsonArrayWithUndefined(v) && typeof v === "object";
266
267
  }
267
268
  function convertJsonToYjsData(v) {
268
- if (v === void 0 || isJsonPrimitive(v)) {
269
+ if (v === void 0 || isJsonPrimitiveWithUndefined(v)) {
269
270
  return v;
270
271
  }
271
- if (isJsonArray(v)) {
272
+ if (isJsonArrayWithUndefined(v)) {
272
273
  const arr = new Y__namespace.Array();
273
274
  applyJsonArrayToYArray(arr, v);
274
275
  return arr;
275
276
  }
276
- if (isJsonObject(v)) {
277
+ if (isJsonObjectWithUndefined(v)) {
277
278
  if (v.$frozen === true) {
278
279
  return v;
279
280
  }
@@ -341,9 +342,10 @@ var __publicField = (obj, key, value) => {
341
342
  switch (patch.op) {
342
343
  case "replace": {
343
344
  if (key === "length") {
344
- if (yjs.length > patch.value) {
345
- const toDelete = yjs.length - patch.value;
346
- yjs.delete(patch.value, toDelete);
345
+ const newLength = patch.value;
346
+ if (yjs.length > newLength) {
347
+ const toDelete = yjs.length - newLength;
348
+ yjs.delete(newLength, toDelete);
347
349
  } else if (yjs.length < patch.value) {
348
350
  const toInsert = patch.value - yjs.length;
349
351
  yjs.insert(yjs.length, Array(toInsert).fill(void 0));
@@ -369,7 +371,7 @@ var __publicField = (obj, key, value) => {
369
371
  } else if (yjs instanceof Y__namespace.Text)
370
372
  ;
371
373
  else {
372
- throw failure(`invalid patch path, the Yjs object is of an unkown type, so key "${patch.path[0]}" cannot be found in it`);
374
+ throw failure(`invalid patch path, the Yjs object is of an unkown type, so key "${String(patch.path[0])}" cannot be found in it`);
373
375
  }
374
376
  } else {
375
377
  throw failure(`invalid patch path, it cannot be empty`);
@@ -507,11 +509,12 @@ var __publicField = (obj, key, value) => {
507
509
  const observeDeepCb = mobx.action((events) => {
508
510
  const patches = [];
509
511
  events.forEach((event) => {
512
+ var _a;
510
513
  if (event.transaction.origin !== yjsOrigin) {
511
514
  patches.push(...convertYjsEventToPatches(event));
512
515
  }
513
516
  if (event.target instanceof Y__namespace.Map || event.target instanceof Y__namespace.Array) {
514
- getOrCreateYjsCollectionAtom(event.target).reportChanged();
517
+ (_a = getYjsCollectionAtom(event.target)) == null ? void 0 : _a.reportChanged();
515
518
  }
516
519
  });
517
520
  if (patches.length > 0) {
@@ -584,4 +587,4 @@ var __publicField = (obj, key, value) => {
584
587
  exports2.yjsTextModelId = yjsTextModelId;
585
588
  Object.defineProperty(exports2, Symbol.toStringTag, { value: "Module" });
586
589
  });
587
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibW9ieC1rZXlzdG9uZS15anMudW1kLmpzIiwic291cmNlcyI6WyIuLi9zcmMvdXRpbHMvZXJyb3IudHMiLCIuLi9zcmMvYmluZGluZy95anNCaW5kaW5nQ29udGV4dC50cyIsIi4uL3NyYy91dGlscy9nZXRPckNyZWF0ZVlqc0NvbGxlY3Rpb25BdG9tLnRzIiwiLi4vc3JjL2JpbmRpbmcvcmVzb2x2ZVlqc1BhdGgudHMiLCIuLi9zcmMvYmluZGluZy9ZanNUZXh0TW9kZWwudHMiLCIuLi9zcmMvYmluZGluZy9jb252ZXJ0SnNvblRvWWpzRGF0YS50cyIsIi4uL3NyYy9iaW5kaW5nL2FwcGx5TW9ieEtleXN0b25lUGF0Y2hUb1lqc09iamVjdC50cyIsIi4uL3NyYy9iaW5kaW5nL2NvbnZlcnRZanNEYXRhVG9Kc29uLnRzIiwiLi4vc3JjL2JpbmRpbmcvY29udmVydFlqc0V2ZW50VG9QYXRjaGVzLnRzIiwiLi4vc3JjL2JpbmRpbmcvYmluZFlqc1RvTW9ieEtleXN0b25lLnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxyXG4gKiBBIG1vYngta2V5c3RvbmUteWpzIGVycm9yLlxyXG4gKi9cclxuZXhwb3J0IGNsYXNzIE1vYnhLZXlzdG9uZVlqc0Vycm9yIGV4dGVuZHMgRXJyb3Ige1xyXG4gIGNvbnN0cnVjdG9yKG1zZzogc3RyaW5nKSB7XHJcbiAgICBzdXBlcihtc2cpXHJcblxyXG4gICAgLy8gU2V0IHRoZSBwcm90b3R5cGUgZXhwbGljaXRseS5cclxuICAgIE9iamVjdC5zZXRQcm90b3R5cGVPZih0aGlzLCBNb2J4S2V5c3RvbmVZanNFcnJvci5wcm90b3R5cGUpXHJcbiAgfVxyXG59XHJcblxyXG4vKipcclxuICogQGludGVybmFsXHJcbiAqL1xyXG5leHBvcnQgZnVuY3Rpb24gZmFpbHVyZShtc2c6IHN0cmluZykge1xyXG4gIHJldHVybiBuZXcgTW9ieEtleXN0b25lWWpzRXJyb3IobXNnKVxyXG59XHJcbiIsImltcG9ydCB7IEFueVR5cGUsIGNyZWF0ZUNvbnRleHQgfSBmcm9tIFwibW9ieC1rZXlzdG9uZVwiXHJcbmltcG9ydCAqIGFzIFkgZnJvbSBcInlqc1wiXHJcblxyXG4vKipcclxuICogQ29udGV4dCB3aXRoIGluZm8gb24gaG93IGEgbW9ieC1rZXlzdG9uZSBtb2RlbCBpcyBib3VuZCB0byBhIFkuanMgZGF0YSBzdHJ1Y3R1cmUuXHJcbiAqL1xyXG5leHBvcnQgaW50ZXJmYWNlIFlqc0JpbmRpbmdDb250ZXh0IHtcclxuICAvKipcclxuICAgKiBUaGUgWS5qcyBkb2N1bWVudC5cclxuICAgKi9cclxuICB5anNEb2M6IFkuRG9jXHJcblxyXG4gIC8qKlxyXG4gICAqIFRoZSBib3VuZCBZLmpzIGRhdGEgc3RydWN0dXJlLlxyXG4gICAqL1xyXG4gIHlqc09iamVjdDogWS5NYXA8dW5rbm93bj4gfCBZLkFycmF5PHVua25vd24+IHwgWS5UZXh0XHJcblxyXG4gIC8qKlxyXG4gICAqIFRoZSBtb2J4LWtleXN0b25lIG1vZGVsIHR5cGUuXHJcbiAgICovXHJcbiAgbW9ieEtleXN0b25lVHlwZTogQW55VHlwZVxyXG5cclxuICAvKipcclxuICAgKiBUaGUgb3JpZ2luIHN5bWJvbCB1c2VkIGZvciB0cmFuc2FjdGlvbnMuXHJcbiAgICovXHJcbiAgeWpzT3JpZ2luOiBzeW1ib2xcclxuXHJcbiAgLyoqXHJcbiAgICogVGhlIGJvdW5kIG1vYngta2V5c3RvbmUgaW5zdGFuY2UuXHJcbiAgICovXHJcbiAgYm91bmRPYmplY3Q6IHVua25vd24gfCB1bmRlZmluZWRcclxuXHJcbiAgLyoqXHJcbiAgICogV2hldGhlciB3ZSBhcmUgY3VycmVudGx5IGFwcGx5aW5nIFkuanMgY2hhbmdlcyB0byB0aGUgbW9ieC1rZXlzdG9uZSBtb2RlbC5cclxuICAgKi9cclxuICBpc0FwcGx5aW5nWWpzQ2hhbmdlc1RvTW9ieEtleXN0b25lOiBib29sZWFuXHJcbn1cclxuXHJcbi8qKlxyXG4gKiBDb250ZXh0IHdpdGggaW5mbyBvbiBob3cgYSBtb2J4LWtleXN0b25lIG1vZGVsIGlzIGJvdW5kIHRvIGEgWS5qcyBkYXRhIHN0cnVjdHVyZS5cclxuICovXHJcbmV4cG9ydCBjb25zdCB5anNCaW5kaW5nQ29udGV4dCA9IGNyZWF0ZUNvbnRleHQ8WWpzQmluZGluZ0NvbnRleHQgfCB1bmRlZmluZWQ+KHVuZGVmaW5lZClcclxuIiwiaW1wb3J0IHsgSUF0b20sIGNyZWF0ZUF0b20gfSBmcm9tIFwibW9ieFwiXHJcbmltcG9ydCAqIGFzIFkgZnJvbSBcInlqc1wiXHJcblxyXG5jb25zdCB5anNDb2xsZWN0aW9uQXRvbXMgPSBuZXcgV2Vha01hcDxZLk1hcDx1bmtub3duPiB8IFkuQXJyYXk8dW5rbm93bj4sIElBdG9tPigpXHJcblxyXG4vKipcclxuICogQGludGVybmFsXHJcbiAqL1xyXG5leHBvcnQgY29uc3QgZ2V0T3JDcmVhdGVZanNDb2xsZWN0aW9uQXRvbSA9IChcclxuICB5anNDb2xsZWN0aW9uOiBZLk1hcDx1bmtub3duPiB8IFkuQXJyYXk8dW5rbm93bj5cclxuKTogSUF0b20gPT4ge1xyXG4gIGxldCBhdG9tID0geWpzQ29sbGVjdGlvbkF0b21zLmdldCh5anNDb2xsZWN0aW9uKVxyXG4gIGlmICghYXRvbSkge1xyXG4gICAgYXRvbSA9IGNyZWF0ZUF0b20oYHlqc0NvbGxlY3Rpb25BdG9tYClcclxuICAgIHlqc0NvbGxlY3Rpb25BdG9tcy5zZXQoeWpzQ29sbGVjdGlvbiwgYXRvbSlcclxuICB9XHJcbiAgcmV0dXJuIGF0b21cclxufVxyXG4iLCJpbXBvcnQgKiBhcyBZIGZyb20gXCJ5anNcIlxyXG5pbXBvcnQgeyBmYWlsdXJlIH0gZnJvbSBcIi4uL3V0aWxzL2Vycm9yXCJcclxuaW1wb3J0IHsgZ2V0T3JDcmVhdGVZanNDb2xsZWN0aW9uQXRvbSB9IGZyb20gXCIuLi91dGlscy9nZXRPckNyZWF0ZVlqc0NvbGxlY3Rpb25BdG9tXCJcclxuXHJcbmV4cG9ydCBmdW5jdGlvbiByZXNvbHZlWWpzUGF0aCh5anNPYmplY3Q6IHVua25vd24sIHBhdGg6IHJlYWRvbmx5IChzdHJpbmcgfCBudW1iZXIpW10pOiB1bmtub3duIHtcclxuICBsZXQgY3VycmVudFlqc09iamVjdDogdW5rbm93biA9IHlqc09iamVjdFxyXG5cclxuICBwYXRoLmZvckVhY2goKHBhdGhQYXJ0LCBpKSA9PiB7XHJcbiAgICBpZiAoY3VycmVudFlqc09iamVjdCBpbnN0YW5jZW9mIFkuTWFwKSB7XHJcbiAgICAgIGdldE9yQ3JlYXRlWWpzQ29sbGVjdGlvbkF0b20oY3VycmVudFlqc09iamVjdCkucmVwb3J0T2JzZXJ2ZWQoKVxyXG4gICAgICBjb25zdCBrZXkgPSBTdHJpbmcocGF0aFBhcnQpXHJcbiAgICAgIGN1cnJlbnRZanNPYmplY3QgPSBjdXJyZW50WWpzT2JqZWN0LmdldChrZXkpXHJcbiAgICB9IGVsc2UgaWYgKGN1cnJlbnRZanNPYmplY3QgaW5zdGFuY2VvZiBZLkFycmF5KSB7XHJcbiAgICAgIGdldE9yQ3JlYXRlWWpzQ29sbGVjdGlvbkF0b20oY3VycmVudFlqc09iamVjdCkucmVwb3J0T2JzZXJ2ZWQoKVxyXG4gICAgICBjb25zdCBrZXkgPSBOdW1iZXIocGF0aFBhcnQpXHJcbiAgICAgIGN1cnJlbnRZanNPYmplY3QgPSBjdXJyZW50WWpzT2JqZWN0LmdldChrZXkpXHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aHJvdyBmYWlsdXJlKFxyXG4gICAgICAgIGBZLk1hcCBvciBZLkFycmF5IHdhcyBleHBlY3RlZCBhdCBwYXRoICR7SlNPTi5zdHJpbmdpZnkoXHJcbiAgICAgICAgICBwYXRoLnNsaWNlKDAsIGkpXHJcbiAgICAgICAgKX0gaW4gb3JkZXIgdG8gcmVzb2x2ZSBwYXRoICR7SlNPTi5zdHJpbmdpZnkocGF0aCl9LCBidXQgZ290ICR7Y3VycmVudFlqc09iamVjdH0gaW5zdGVhZGBcclxuICAgICAgKVxyXG4gICAgfVxyXG4gIH0pXHJcblxyXG4gIHJldHVybiBjdXJyZW50WWpzT2JqZWN0XHJcbn1cclxuIiwiaW1wb3J0IHsgSUF0b20sIGNvbXB1dGVkLCBjcmVhdGVBdG9tLCBvYnNlcnZlLCByZWFjdGlvbiB9IGZyb20gXCJtb2J4XCJcclxuaW1wb3J0IHtcclxuICBGcm96ZW4sXHJcbiAgTW9kZWwsXHJcbiAgZnJvemVuLFxyXG4gIGdldFBhcmVudFRvQ2hpbGRQYXRoLFxyXG4gIG1vZGVsLFxyXG4gIG9uU25hcHNob3QsXHJcbiAgdFByb3AsXHJcbiAgdHlwZXMsXHJcbn0gZnJvbSBcIm1vYngta2V5c3RvbmVcIlxyXG5pbXBvcnQgKiBhcyBZIGZyb20gXCJ5anNcIlxyXG5pbXBvcnQgeyBmYWlsdXJlIH0gZnJvbSBcIi4uL3V0aWxzL2Vycm9yXCJcclxuaW1wb3J0IHsgWWpzQmluZGluZ0NvbnRleHQsIHlqc0JpbmRpbmdDb250ZXh0IH0gZnJvbSBcIi4veWpzQmluZGluZ0NvbnRleHRcIlxyXG5pbXBvcnQgeyByZXNvbHZlWWpzUGF0aCB9IGZyb20gXCIuL3Jlc29sdmVZanNQYXRoXCJcclxuXHJcbi8vIERlbHRhW11bXSwgc2luY2UgZWFjaCBzaW5nbGUgY2hhbmdlIGlzIGEgRGVsdGFbXVxyXG4vLyB3ZSB1c2UgZnJvemVuIHNvIHRoYXQgd2UgY2FuIHJldXNlIGVhY2ggZGVsdGEgY2hhbmdlXHJcbmNvbnN0IGRlbHRhTGlzdFR5cGUgPSB0eXBlcy5hcnJheSh0eXBlcy5mcm96ZW4odHlwZXMudW5jaGVja2VkPHVua25vd25bXT4oKSkpXHJcblxyXG5leHBvcnQgY29uc3QgeWpzVGV4dE1vZGVsSWQgPSBcIm1vYngta2V5c3RvbmUteWpzL1lqc1RleHRNb2RlbFwiXHJcblxyXG4vKipcclxuICogQSBtb2J4LWtleXN0b25lIG1vZGVsIHRoYXQgcmVwcmVzZW50cyBhIFlqcy5UZXh0IG9iamVjdC5cclxuICovXHJcbkBtb2RlbCh5anNUZXh0TW9kZWxJZClcclxuZXhwb3J0IGNsYXNzIFlqc1RleHRNb2RlbCBleHRlbmRzIE1vZGVsKHtcclxuICBkZWx0YUxpc3Q6IHRQcm9wKGRlbHRhTGlzdFR5cGUsICgpID0+IFtdKSxcclxufSkge1xyXG4gIC8qKlxyXG4gICAqIEhlbHBlciBmdW5jdGlvbiB0byBjcmVhdGUgYSBZanNUZXh0TW9kZWwgaW5zdGFuY2Ugd2l0aCBhIHNpbXBsZSB0ZXh0LlxyXG4gICAqL1xyXG4gIHN0YXRpYyB3aXRoVGV4dCh0ZXh0OiBzdHJpbmcpOiBZanNUZXh0TW9kZWwge1xyXG4gICAgcmV0dXJuIG5ldyBEZWNvcmF0ZWRZanNUZXh0TW9kZWwoe1xyXG4gICAgICBkZWx0YUxpc3Q6IFtcclxuICAgICAgICBmcm96ZW4oW1xyXG4gICAgICAgICAge1xyXG4gICAgICAgICAgICBpbnNlcnQ6IHRleHQsXHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgIF0pLFxyXG4gICAgICBdLFxyXG4gICAgfSlcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFRoZSBZLmpzIHBhdGggZnJvbSB0aGUgYm91bmQgb2JqZWN0IHRvIHRoZSBZanNUZXh0TW9kZWwgaW5zdGFuY2UuXHJcbiAgICovXHJcbiAgQGNvbXB1dGVkXHJcbiAgcHJpdmF0ZSBnZXQgX3lqc09iamVjdFBhdGgoKSB7XHJcbiAgICBjb25zdCBjdHggPSB5anNCaW5kaW5nQ29udGV4dC5nZXQodGhpcylcclxuICAgIGlmICghY3R4IHx8IGN0eC5ib3VuZE9iamVjdCA9PSBudWxsKSB7XHJcbiAgICAgIHRocm93IGZhaWx1cmUoXHJcbiAgICAgICAgXCJ0aGUgWWpzVGV4dE1vZGVsIGluc3RhbmNlIG11c3QgYmUgcGFydCBvZiBhIGJvdW5kIG9iamVjdCBiZWZvcmUgaXQgY2FuIGJlIGFjY2Vzc2VkXCJcclxuICAgICAgKVxyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IHBhdGggPSBnZXRQYXJlbnRUb0NoaWxkUGF0aChjdHguYm91bmRPYmplY3QsIHRoaXMpXHJcbiAgICBpZiAoIXBhdGgpIHtcclxuICAgICAgdGhyb3cgZmFpbHVyZShcImEgcGF0aCBmcm9tIHRoZSBib3VuZCBvYmplY3QgdG8gdGhlIFlqc1RleHRNb2RlbCBpbnN0YW5jZSBpcyBub3QgYXZhaWxhYmxlXCIpXHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIHBhdGhcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFRoZSBZanMuVGV4dCBvYmplY3QgcHJlc2VudCBhdCB0aGlzIG1vYngta2V5c3RvbmUgbm9kZSdzIHBhdGguXHJcbiAgICovXHJcbiAgQGNvbXB1dGVkXHJcbiAgcHJpdmF0ZSBnZXQgX3lqc09iamVjdEF0UGF0aCgpOiB1bmtub3duIHtcclxuICAgIGNvbnN0IHBhdGggPSB0aGlzLl95anNPYmplY3RQYXRoXHJcblxyXG4gICAgY29uc3QgY3R4ID0geWpzQmluZGluZ0NvbnRleHQuZ2V0KHRoaXMpIVxyXG5cclxuICAgIHJldHVybiByZXNvbHZlWWpzUGF0aChjdHgueWpzT2JqZWN0LCBwYXRoKVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogVGhlIFlqcy5UZXh0IG9iamVjdCByZXByZXNlbnRlZCBieSB0aGlzIG1vYngta2V5c3RvbmUgbm9kZS5cclxuICAgKi9cclxuICBAY29tcHV0ZWRcclxuICBnZXQgeWpzVGV4dCgpOiBZLlRleHQge1xyXG4gICAgY29uc3QgeWpzT2JqZWN0ID0gdGhpcy5feWpzT2JqZWN0QXRQYXRoXHJcblxyXG4gICAgaWYgKCEoeWpzT2JqZWN0IGluc3RhbmNlb2YgWS5UZXh0KSkge1xyXG4gICAgICB0aHJvdyBmYWlsdXJlKGBZLlRleHQgd2FzIGV4cGVjdGVkIGF0IHBhdGggJHtKU09OLnN0cmluZ2lmeSh0aGlzLl95anNPYmplY3RQYXRoKX1gKVxyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiB5anNPYmplY3RcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEF0b20gdGhhdCBnZXRzIGNoYW5nZWQgd2hlbiB0aGUgYXNzb2NpYXRlZCBZLmpzIHRleHQgY2hhbmdlcy5cclxuICAgKi9cclxuICB5anNUZXh0Q2hhbmdlZEF0b20gPSBjcmVhdGVBdG9tKFwieWpzVGV4dENoYW5nZWRBdG9tXCIpXHJcblxyXG4gIC8qKlxyXG4gICAqIFRoZSB0ZXh0IHZhbHVlIG9mIHRoZSBZanMuVGV4dCBvYmplY3QuXHJcbiAgICogU2hvcnRjdXQgZm9yIGB5anNUZXh0LnRvU3RyaW5nKClgLCBidXQgY29tcHV0ZWQuXHJcbiAgICovXHJcbiAgQGNvbXB1dGVkXHJcbiAgZ2V0IHRleHQoKTogc3RyaW5nIHtcclxuICAgIHRoaXMueWpzVGV4dENoYW5nZWRBdG9tLnJlcG9ydE9ic2VydmVkKClcclxuICAgIHJldHVybiB0aGlzLnlqc1RleHQudG9TdHJpbmcoKVxyXG4gIH1cclxuXHJcbiAgcHJvdGVjdGVkIG9uSW5pdCgpIHtcclxuICAgIGNvbnN0IHNob3VsZFJlcGxpY2F0ZVRvWWpzID0gKGN0eDogWWpzQmluZGluZ0NvbnRleHQgfCB1bmRlZmluZWQpOiBjdHggaXMgWWpzQmluZGluZ0NvbnRleHQgPT4ge1xyXG4gICAgICByZXR1cm4gISFjdHggJiYgISFjdHguYm91bmRPYmplY3QgJiYgIWN0eC5pc0FwcGx5aW5nWWpzQ2hhbmdlc1RvTW9ieEtleXN0b25lXHJcbiAgICB9XHJcblxyXG4gICAgbGV0IHJlYXBwbHlEZWx0YXNUb1lqc1RleHQgPSBmYWxzZVxyXG4gICAgY29uc3QgbmV3RGVsdGFzOiBGcm96ZW48dW5rbm93bltdPltdID0gW11cclxuXHJcbiAgICBsZXQgZGlzcG9zZU9ic2VydmVEZWx0YUxpc3Q6ICgoKSA9PiB2b2lkKSB8IHVuZGVmaW5lZFxyXG5cclxuICAgIGNvbnN0IGRpc3Bvc2VSZWFjdGlvblRvRGVsdGFMaXN0UmVmQ2hhbmdlID0gcmVhY3Rpb24oXHJcbiAgICAgICgpID0+IHRoaXMuJC5kZWx0YUxpc3QsXHJcbiAgICAgIChkZWx0YUxpc3QpID0+IHtcclxuICAgICAgICBkaXNwb3NlT2JzZXJ2ZURlbHRhTGlzdD8uKClcclxuICAgICAgICBkaXNwb3NlT2JzZXJ2ZURlbHRhTGlzdCA9IHVuZGVmaW5lZFxyXG5cclxuICAgICAgICBpZiAoZGVsdGFMaXN0KSB7XHJcbiAgICAgICAgICBkaXNwb3NlT2JzZXJ2ZURlbHRhTGlzdCA9IG9ic2VydmUodGhpcy4kLmRlbHRhTGlzdCwgKGNoYW5nZSkgPT4ge1xyXG4gICAgICAgICAgICBpZiAocmVhcHBseURlbHRhc1RvWWpzVGV4dCkge1xyXG4gICAgICAgICAgICAgIC8vIGFscmVhZHkgZ29ubmEgcmVwbGFjZSB0aGVtIGFsbFxyXG4gICAgICAgICAgICAgIHJldHVyblxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmICghc2hvdWxkUmVwbGljYXRlVG9ZanMoeWpzQmluZGluZ0NvbnRleHQuZ2V0KHRoaXMpKSkge1xyXG4gICAgICAgICAgICAgIC8vIHlqcyB0ZXh0IGlzIGFscmVhZHkgdXAgdG8gZGF0ZSB3aXRoIHRoZXNlIGNoYW5nZXNcclxuICAgICAgICAgICAgICByZXR1cm5cclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgaWYgKFxyXG4gICAgICAgICAgICAgIGNoYW5nZS50eXBlID09PSBcInNwbGljZVwiICYmXHJcbiAgICAgICAgICAgICAgY2hhbmdlLnJlbW92ZWRDb3VudCA9PT0gMCAmJlxyXG4gICAgICAgICAgICAgIGNoYW5nZS5hZGRlZENvdW50ID4gMCAmJlxyXG4gICAgICAgICAgICAgIGNoYW5nZS5pbmRleCA9PT0gdGhpcy5kZWx0YUxpc3QubGVuZ3RoXHJcbiAgICAgICAgICAgICkge1xyXG4gICAgICAgICAgICAgIC8vIG9wdGltaXphdGlvbiwganVzdCBhZGRpbmcgbmV3IG9uZXMgdG8gdGhlIGVuZFxyXG4gICAgICAgICAgICAgIG5ld0RlbHRhcy5wdXNoKC4uLmNoYW5nZS5hZGRlZClcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAvLyBhbnkgb3RoZXIgY2hhbmdlLCB3ZSBuZWVkIHRvIHJlYXBwbHkgYWxsIGRlbHRhc1xyXG4gICAgICAgICAgICAgIHJlYXBwbHlEZWx0YXNUb1lqc1RleHQgPSB0cnVlXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH0pXHJcbiAgICAgICAgfVxyXG4gICAgICB9LFxyXG4gICAgICB7IGZpcmVJbW1lZGlhdGVseTogdHJ1ZSB9XHJcbiAgICApXHJcblxyXG4gICAgY29uc3QgZGlzcG9zZU9uU25hcHNob3QgPSBvblNuYXBzaG90KHRoaXMsICgpID0+IHtcclxuICAgICAgdHJ5IHtcclxuICAgICAgICBpZiAocmVhcHBseURlbHRhc1RvWWpzVGV4dCkge1xyXG4gICAgICAgICAgY29uc3QgY3R4ID0geWpzQmluZGluZ0NvbnRleHQuZ2V0KHRoaXMpXHJcblxyXG4gICAgICAgICAgaWYgKHNob3VsZFJlcGxpY2F0ZVRvWWpzKGN0eCkpIHtcclxuICAgICAgICAgICAgY29uc3QgeyB5anNUZXh0IH0gPSB0aGlzXHJcblxyXG4gICAgICAgICAgICBjdHgueWpzRG9jLnRyYW5zYWN0KCgpID0+IHtcclxuICAgICAgICAgICAgICAvLyBkaWRuJ3QgZmluZCBhIGJldHRlciB3YXkgdGhhbiB0aGlzIHRvIHJlYXBwbHkgYWxsIGRlbHRhc1xyXG4gICAgICAgICAgICAgIC8vIHdpdGhvdXQgaGF2aW5nIHRvIHJlLWNyZWF0ZSB0aGUgWS5UZXh0IG9iamVjdFxyXG4gICAgICAgICAgICAgIGlmICh5anNUZXh0Lmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgICAgIHlqc1RleHQuZGVsZXRlKDAsIHlqc1RleHQubGVuZ3RoKVxyXG4gICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgdGhpcy5kZWx0YUxpc3QuZm9yRWFjaCgoZnJvemVuRGVsdGFzKSA9PiB7XHJcbiAgICAgICAgICAgICAgICB5anNUZXh0LmFwcGx5RGVsdGEoZnJvemVuRGVsdGFzLmRhdGEpXHJcbiAgICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgfSwgY3R4Lnlqc09yaWdpbilcclxuICAgICAgICAgIH1cclxuICAgICAgICB9IGVsc2UgaWYgKG5ld0RlbHRhcy5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICBjb25zdCBjdHggPSB5anNCaW5kaW5nQ29udGV4dC5nZXQodGhpcylcclxuXHJcbiAgICAgICAgICBpZiAoc2hvdWxkUmVwbGljYXRlVG9ZanMoY3R4KSkge1xyXG4gICAgICAgICAgICBjb25zdCB7IHlqc1RleHQgfSA9IHRoaXNcclxuXHJcbiAgICAgICAgICAgIGN0eC55anNEb2MudHJhbnNhY3QoKCkgPT4ge1xyXG4gICAgICAgICAgICAgIG5ld0RlbHRhcy5mb3JFYWNoKChmcm96ZW5EZWx0YXMpID0+IHtcclxuICAgICAgICAgICAgICAgIHlqc1RleHQuYXBwbHlEZWx0YShmcm96ZW5EZWx0YXMuZGF0YSlcclxuICAgICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICB9LCBjdHgueWpzT3JpZ2luKVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfSBmaW5hbGx5IHtcclxuICAgICAgICByZWFwcGx5RGVsdGFzVG9ZanNUZXh0ID0gZmFsc2VcclxuICAgICAgICBuZXdEZWx0YXMubGVuZ3RoID0gMFxyXG4gICAgICB9XHJcbiAgICB9KVxyXG5cclxuICAgIGNvbnN0IGRpcG9zZVlqc1RleHRDaGFuZ2VkQXRvbSA9IGhvb2tZanNUZXh0Q2hhbmdlZEF0b20oXHJcbiAgICAgICgpID0+IHRoaXMueWpzVGV4dCxcclxuICAgICAgdGhpcy55anNUZXh0Q2hhbmdlZEF0b21cclxuICAgIClcclxuXHJcbiAgICByZXR1cm4gKCkgPT4ge1xyXG4gICAgICBkaXNwb3NlT25TbmFwc2hvdCgpXHJcbiAgICAgIGRpc3Bvc2VSZWFjdGlvblRvRGVsdGFMaXN0UmVmQ2hhbmdlKClcclxuICAgICAgZGlzcG9zZU9ic2VydmVEZWx0YUxpc3Q/LigpXHJcbiAgICAgIGRpc3Bvc2VPYnNlcnZlRGVsdGFMaXN0ID0gdW5kZWZpbmVkXHJcblxyXG4gICAgICBkaXBvc2VZanNUZXh0Q2hhbmdlZEF0b20oKVxyXG4gICAgfVxyXG4gIH1cclxufVxyXG5cclxuLy8gd2UgdXNlIHRoaXMgdHJpY2sganVzdCB0byBhdm9pZCBhIGJhYmVsIGJ1ZyB0aGF0IGNhdXNlcyBjbGFzc2VzIHVzZWQgaW5zaWRlIGNsYXNzZXMgbm90IHRvIGJlIG92ZXJyaWRlblxyXG4vLyBieSB0aGUgZGVjb3JhdG9yXHJcbmNvbnN0IERlY29yYXRlZFlqc1RleHRNb2RlbCA9IFlqc1RleHRNb2RlbFxyXG5cclxuZnVuY3Rpb24gaG9va1lqc1RleHRDaGFuZ2VkQXRvbShnZXRZanNUZXh0OiAoKSA9PiBZLlRleHQsIHRleHRDaGFuZ2VkQXRvbTogSUF0b20pIHtcclxuICBsZXQgZGlzcG9zZU9ic2VydmVZanNUZXh0OiAoKCkgPT4gdm9pZCkgfCB1bmRlZmluZWRcclxuXHJcbiAgY29uc3Qgb2JzZXJ2ZUZuID0gKCkgPT4ge1xyXG4gICAgdGV4dENoYW5nZWRBdG9tLnJlcG9ydENoYW5nZWQoKVxyXG4gIH1cclxuXHJcbiAgY29uc3QgZGlzcG9zZVJlYWN0aW9uVG9ZVGV4dENoYW5nZSA9IHJlYWN0aW9uKFxyXG4gICAgKCkgPT4ge1xyXG4gICAgICB0cnkge1xyXG4gICAgICAgIHJldHVybiBnZXRZanNUZXh0KClcclxuICAgICAgfSBjYXRjaCB7XHJcbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZFxyXG4gICAgICB9XHJcbiAgICB9LFxyXG4gICAgKHlqc1RleHQpID0+IHtcclxuICAgICAgZGlzcG9zZU9ic2VydmVZanNUZXh0Py4oKVxyXG4gICAgICBkaXNwb3NlT2JzZXJ2ZVlqc1RleHQgPSB1bmRlZmluZWRcclxuXHJcbiAgICAgIGlmICh5anNUZXh0KSB7XHJcbiAgICAgICAgeWpzVGV4dC5vYnNlcnZlKG9ic2VydmVGbilcclxuXHJcbiAgICAgICAgZGlzcG9zZU9ic2VydmVZanNUZXh0ID0gKCkgPT4ge1xyXG4gICAgICAgICAgeWpzVGV4dC51bm9ic2VydmUob2JzZXJ2ZUZuKVxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG5cclxuICAgICAgdGV4dENoYW5nZWRBdG9tLnJlcG9ydENoYW5nZWQoKVxyXG4gICAgfSxcclxuICAgIHtcclxuICAgICAgZmlyZUltbWVkaWF0ZWx5OiB0cnVlLFxyXG4gICAgfVxyXG4gIClcclxuXHJcbiAgcmV0dXJuICgpID0+IHtcclxuICAgIGRpc3Bvc2VSZWFjdGlvblRvWVRleHRDaGFuZ2UoKVxyXG4gICAgZGlzcG9zZU9ic2VydmVZanNUZXh0Py4oKVxyXG4gICAgZGlzcG9zZU9ic2VydmVZanNUZXh0ID0gdW5kZWZpbmVkXHJcbiAgfVxyXG59XHJcbiIsImltcG9ydCAqIGFzIFkgZnJvbSBcInlqc1wiXHJcbmltcG9ydCB7IEpzb25WYWx1ZSwgSnNvbkFycmF5LCBKc29uT2JqZWN0LCBKc29uUHJpbWl0aXZlIH0gZnJvbSBcIi4uL2pzb25UeXBlc1wiXHJcbmltcG9ydCB7IFlqc1RleHRNb2RlbCwgeWpzVGV4dE1vZGVsSWQgfSBmcm9tIFwiLi9ZanNUZXh0TW9kZWxcIlxyXG5pbXBvcnQgeyBTbmFwc2hvdE91dE9mIH0gZnJvbSBcIm1vYngta2V5c3RvbmVcIlxyXG5cclxuZnVuY3Rpb24gaXNKc29uUHJpbWl0aXZlKHY6IEpzb25WYWx1ZSk6IHYgaXMgSnNvblByaW1pdGl2ZSB7XHJcbiAgY29uc3QgdCA9IHR5cGVvZiB2XHJcbiAgcmV0dXJuIHQgPT09IFwic3RyaW5nXCIgfHwgdCA9PT0gXCJudW1iZXJcIiB8fCB0ID09PSBcImJvb2xlYW5cIiB8fCB2ID09PSBudWxsXHJcbn1cclxuXHJcbmZ1bmN0aW9uIGlzSnNvbkFycmF5KHY6IEpzb25WYWx1ZSk6IHYgaXMgSnNvbkFycmF5IHtcclxuICByZXR1cm4gQXJyYXkuaXNBcnJheSh2KVxyXG59XHJcblxyXG5mdW5jdGlvbiBpc0pzb25PYmplY3QodjogSnNvblZhbHVlKTogdiBpcyBKc29uT2JqZWN0IHtcclxuICByZXR1cm4gIWlzSnNvbkFycmF5KHYpICYmIHR5cGVvZiB2ID09PSBcIm9iamVjdFwiXHJcbn1cclxuXHJcbi8qKlxyXG4gKiBDb252ZXJ0cyBhIEpTT04gdmFsdWUgdG8gYSBZLmpzIGRhdGEgc3RydWN0dXJlLlxyXG4gKiBPYmplY3RzIGFyZSBjb252ZXJ0ZWQgdG8gWS5NYXBzLCBhcnJheXMgdG8gWS5BcnJheXMsIHByaW1pdGl2ZXMgYXJlIHVudG91Y2hlZC5cclxuICogRnJvemVuIHZhbHVlcyBhcmUgYSBzcGVjaWFsIGNhc2UgYW5kIHRoZXkgYXJlIGtlcHQgYXMgaW1tdXRhYmxlIHBsYWluIHZhbHVlcy5cclxuICovXHJcbmV4cG9ydCBmdW5jdGlvbiBjb252ZXJ0SnNvblRvWWpzRGF0YSh2OiBKc29uVmFsdWUpIHtcclxuICBpZiAodiA9PT0gdW5kZWZpbmVkIHx8IGlzSnNvblByaW1pdGl2ZSh2KSkge1xyXG4gICAgcmV0dXJuIHZcclxuICB9XHJcblxyXG4gIGlmIChpc0pzb25BcnJheSh2KSkge1xyXG4gICAgY29uc3QgYXJyID0gbmV3IFkuQXJyYXkoKVxyXG4gICAgYXBwbHlKc29uQXJyYXlUb1lBcnJheShhcnIsIHYpXHJcbiAgICByZXR1cm4gYXJyXHJcbiAgfVxyXG5cclxuICBpZiAoaXNKc29uT2JqZWN0KHYpKSB7XHJcbiAgICBpZiAodi4kZnJvemVuID09PSB0cnVlKSB7XHJcbiAgICAgIC8vIGZyb3plbiB2YWx1ZSwgc2F2ZSBhcyBpbW11dGFibGUgb2JqZWN0XHJcbiAgICAgIHJldHVybiB2XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHYuJG1vZGVsVHlwZSA9PT0geWpzVGV4dE1vZGVsSWQpIHtcclxuICAgICAgY29uc3QgdGV4dCA9IG5ldyBZLlRleHQoKVxyXG4gICAgICBjb25zdCB5anNUZXh0TW9kZWwgPSB2IGFzIFNuYXBzaG90T3V0T2Y8WWpzVGV4dE1vZGVsPlxyXG4gICAgICB5anNUZXh0TW9kZWwuZGVsdGFMaXN0LmZvckVhY2goKGZyb3plbkRlbHRhcykgPT4ge1xyXG4gICAgICAgIHRleHQuYXBwbHlEZWx0YShmcm96ZW5EZWx0YXMuZGF0YSlcclxuICAgICAgfSlcclxuICAgICAgcmV0dXJuIHRleHRcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCBtYXAgPSBuZXcgWS5NYXAoKVxyXG4gICAgYXBwbHlKc29uT2JqZWN0VG9ZTWFwKG1hcCwgdilcclxuICAgIHJldHVybiBtYXBcclxuICB9XHJcblxyXG4gIHRocm93IG5ldyBFcnJvcihgdW5zdXBwb3J0ZWQgdmFsdWUgdHlwZTogJHt2fWApXHJcbn1cclxuXHJcbi8qKlxyXG4gKiBBcHBsaWVzIGEgSlNPTiBhcnJheSB0byBhIFkuQXJyYXksIHVzaW5nIHRoZSBjb252ZXJ0SnNvblRvWWpzRGF0YSB0byBjb252ZXJ0IHRoZSB2YWx1ZXMuXHJcbiAqL1xyXG5leHBvcnQgZnVuY3Rpb24gYXBwbHlKc29uQXJyYXlUb1lBcnJheShkZXN0OiBZLkFycmF5PHVua25vd24+LCBzb3VyY2U6IEpzb25BcnJheSkge1xyXG4gIGRlc3QucHVzaChzb3VyY2UubWFwKGNvbnZlcnRKc29uVG9ZanNEYXRhKSlcclxufVxyXG5cclxuLyoqXHJcbiAqIEFwcGxpZXMgYSBKU09OIG9iamVjdCB0byBhIFkuTWFwLCB1c2luZyB0aGUgY29udmVydEpzb25Ub1lqc0RhdGEgdG8gY29udmVydCB0aGUgdmFsdWVzLlxyXG4gKi9cclxuZXhwb3J0IGZ1bmN0aW9uIGFwcGx5SnNvbk9iamVjdFRvWU1hcChkZXN0OiBZLk1hcDx1bmtub3duPiwgc291cmNlOiBKc29uT2JqZWN0KSB7XHJcbiAgT2JqZWN0LmVudHJpZXMoc291cmNlKS5mb3JFYWNoKChbaywgdl0pID0+IHtcclxuICAgIGRlc3Quc2V0KGssIGNvbnZlcnRKc29uVG9ZanNEYXRhKHYpKVxyXG4gIH0pXHJcbn1cclxuIiwiaW1wb3J0IHsgUGF0Y2ggfSBmcm9tIFwibW9ieC1rZXlzdG9uZVwiXHJcbmltcG9ydCAqIGFzIFkgZnJvbSBcInlqc1wiXHJcbmltcG9ydCB7IGZhaWx1cmUgfSBmcm9tIFwiLi4vdXRpbHMvZXJyb3JcIlxyXG5pbXBvcnQgeyBjb252ZXJ0SnNvblRvWWpzRGF0YSB9IGZyb20gXCIuL2NvbnZlcnRKc29uVG9ZanNEYXRhXCJcclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBhcHBseU1vYnhLZXlzdG9uZVBhdGNoVG9ZanNPYmplY3QocGF0Y2g6IFBhdGNoLCB5anM6IHVua25vd24pOiB2b2lkIHtcclxuICBpZiAocGF0Y2gucGF0aC5sZW5ndGggPiAxKSB7XHJcbiAgICBjb25zdCBba2V5LCAuLi5yZXN0XSA9IHBhdGNoLnBhdGhcclxuXHJcbiAgICBpZiAoeWpzIGluc3RhbmNlb2YgWS5NYXApIHtcclxuICAgICAgY29uc3QgY2hpbGQgPSB5anMuZ2V0KFN0cmluZyhrZXkpKVxyXG4gICAgICBpZiAoY2hpbGQgPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgIHRocm93IGZhaWx1cmUoXHJcbiAgICAgICAgICBgaW52YWxpZCBwYXRjaCBwYXRoLCBrZXkgXCIke2tleX1cIiBub3QgZm91bmQgaW4gWWpzIG1hcCAtIHBhdGNoOiAke0pTT04uc3RyaW5naWZ5KHBhdGNoKX1gXHJcbiAgICAgICAgKVxyXG4gICAgICB9XHJcbiAgICAgIGFwcGx5TW9ieEtleXN0b25lUGF0Y2hUb1lqc09iamVjdCh7IC4uLnBhdGNoLCBwYXRoOiByZXN0IH0sIGNoaWxkKVxyXG4gICAgfSBlbHNlIGlmICh5anMgaW5zdGFuY2VvZiBZLkFycmF5KSB7XHJcbiAgICAgIGNvbnN0IGNoaWxkID0geWpzLmdldChOdW1iZXIoa2V5KSlcclxuICAgICAgaWYgKGNoaWxkID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICB0aHJvdyBmYWlsdXJlKFxyXG4gICAgICAgICAgYGludmFsaWQgcGF0Y2ggcGF0aCwga2V5IFwiJHtrZXl9XCIgbm90IGZvdW5kIGluIFlqcyBhcnJheSAtIHBhdGNoOiAke0pTT04uc3RyaW5naWZ5KFxyXG4gICAgICAgICAgICBwYXRjaFxyXG4gICAgICAgICAgKX1gXHJcbiAgICAgICAgKVxyXG4gICAgICB9XHJcbiAgICAgIGFwcGx5TW9ieEtleXN0b25lUGF0Y2hUb1lqc09iamVjdCh7IC4uLnBhdGNoLCBwYXRoOiByZXN0IH0sIGNoaWxkKVxyXG4gICAgfSBlbHNlIGlmICh5anMgaW5zdGFuY2VvZiBZLlRleHQpIHtcclxuICAgICAgLy8gY2hhbmdlcyB0byBkZWx0YUxpc3Qgd2lsbCBiZSBoYW5kbGVkIGJ5IHRoZSBhcnJheSBvYnNlcnZlIGluIHRoZSBZanNUZXh0TW9kZWwgY2xhc3NcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRocm93IGZhaWx1cmUoXHJcbiAgICAgICAgYGludmFsaWQgcGF0Y2ggcGF0aCwga2V5IFwiJHtrZXl9XCIgbm90IGZvdW5kIGluIHVua25vd24gWWpzIG9iamVjdCAtIHBhdGNoOiAke0pTT04uc3RyaW5naWZ5KFxyXG4gICAgICAgICAgcGF0Y2hcclxuICAgICAgICApfWBcclxuICAgICAgKVxyXG4gICAgfVxyXG4gIH0gZWxzZSBpZiAocGF0Y2gucGF0aC5sZW5ndGggPT09IDEpIHtcclxuICAgIGlmICh5anMgaW5zdGFuY2VvZiBZLk1hcCkge1xyXG4gICAgICBjb25zdCBrZXkgPSBTdHJpbmcocGF0Y2gucGF0aFswXSlcclxuXHJcbiAgICAgIHN3aXRjaCAocGF0Y2gub3ApIHtcclxuICAgICAgICBjYXNlIFwiYWRkXCI6XHJcbiAgICAgICAgY2FzZSBcInJlcGxhY2VcIjoge1xyXG4gICAgICAgICAgeWpzLnNldChrZXksIGNvbnZlcnRKc29uVG9ZanNEYXRhKHBhdGNoLnZhbHVlKSlcclxuICAgICAgICAgIGJyZWFrXHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNhc2UgXCJyZW1vdmVcIjoge1xyXG4gICAgICAgICAgeWpzLmRlbGV0ZShrZXkpXHJcbiAgICAgICAgICBicmVha1xyXG4gICAgICAgIH1cclxuICAgICAgICBkZWZhdWx0OiB7XHJcbiAgICAgICAgICB0aHJvdyBmYWlsdXJlKGBpbnZhbGlkIHBhdGNoIG9wZXJhdGlvbiBmb3IgbWFwYClcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH0gZWxzZSBpZiAoeWpzIGluc3RhbmNlb2YgWS5BcnJheSkge1xyXG4gICAgICBjb25zdCBrZXkgPSBwYXRjaC5wYXRoWzBdXHJcblxyXG4gICAgICBzd2l0Y2ggKHBhdGNoLm9wKSB7XHJcbiAgICAgICAgY2FzZSBcInJlcGxhY2VcIjoge1xyXG4gICAgICAgICAgaWYgKGtleSA9PT0gXCJsZW5ndGhcIikge1xyXG4gICAgICAgICAgICBpZiAoeWpzLmxlbmd0aCA+IHBhdGNoLnZhbHVlKSB7XHJcbiAgICAgICAgICAgICAgY29uc3QgdG9EZWxldGUgPSB5anMubGVuZ3RoIC0gcGF0Y2gudmFsdWVcclxuICAgICAgICAgICAgICB5anMuZGVsZXRlKHBhdGNoLnZhbHVlLCB0b0RlbGV0ZSlcclxuICAgICAgICAgICAgfSBlbHNlIGlmICh5anMubGVuZ3RoIDwgcGF0Y2gudmFsdWUpIHtcclxuICAgICAgICAgICAgICBjb25zdCB0b0luc2VydCA9IHBhdGNoLnZhbHVlIC0geWpzLmxlbmd0aFxyXG4gICAgICAgICAgICAgIHlqcy5pbnNlcnQoeWpzLmxlbmd0aCwgQXJyYXkodG9JbnNlcnQpLmZpbGwodW5kZWZpbmVkKSlcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgeWpzLmRlbGV0ZShOdW1iZXIoa2V5KSlcclxuICAgICAgICAgICAgeWpzLmluc2VydChOdW1iZXIoa2V5KSwgW2NvbnZlcnRKc29uVG9ZanNEYXRhKHBhdGNoLnZhbHVlKV0pXHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBicmVha1xyXG4gICAgICAgIH1cclxuICAgICAgICBjYXNlIFwiYWRkXCI6IHtcclxuICAgICAgICAgIHlqcy5pbnNlcnQoTnVtYmVyKGtleSksIFtjb252ZXJ0SnNvblRvWWpzRGF0YShwYXRjaC52YWx1ZSldKVxyXG4gICAgICAgICAgYnJlYWtcclxuICAgICAgICB9XHJcbiAgICAgICAgY2FzZSBcInJlbW92ZVwiOiB7XHJcbiAgICAgICAgICB5anMuZGVsZXRlKE51bWJlcihrZXkpKVxyXG4gICAgICAgICAgYnJlYWtcclxuICAgICAgICB9XHJcbiAgICAgICAgZGVmYXVsdDoge1xyXG4gICAgICAgICAgdGhyb3cgZmFpbHVyZShgaW52YWxpZCBwYXRjaCBvcGVyYXRpb24gZm9yIGFycmF5YClcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH0gZWxzZSBpZiAoeWpzIGluc3RhbmNlb2YgWS5UZXh0KSB7XHJcbiAgICAgIC8vIGluaXRpYWxpemF0aW9uIG9mIGEgWWpzVGV4dE1vZGVsLCBkbyBub3RoaW5nXHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aHJvdyBmYWlsdXJlKFxyXG4gICAgICAgIGBpbnZhbGlkIHBhdGNoIHBhdGgsIHRoZSBZanMgb2JqZWN0IGlzIG9mIGFuIHVua293biB0eXBlLCBzbyBrZXkgXCIke3BhdGNoLnBhdGhbMF19XCIgY2Fubm90IGJlIGZvdW5kIGluIGl0YFxyXG4gICAgICApXHJcbiAgICB9XHJcbiAgfSBlbHNlIHtcclxuICAgIHRocm93IGZhaWx1cmUoYGludmFsaWQgcGF0Y2ggcGF0aCwgaXQgY2Fubm90IGJlIGVtcHR5YClcclxuICB9XHJcbn1cclxuIiwiaW1wb3J0IHsgbW9kZWxTbmFwc2hvdE91dFdpdGhNZXRhZGF0YSB9IGZyb20gXCJtb2J4LWtleXN0b25lXCJcclxuaW1wb3J0ICogYXMgWSBmcm9tIFwieWpzXCJcclxuaW1wb3J0IHsgSnNvblZhbHVlIH0gZnJvbSBcIi4uL2pzb25UeXBlc1wiXHJcbmltcG9ydCB7IFlqc1RleHRNb2RlbCB9IGZyb20gXCIuL1lqc1RleHRNb2RlbFwiXHJcblxyXG5leHBvcnQgZnVuY3Rpb24gY29udmVydFlqc0RhdGFUb0pzb24oXHJcbiAgeWpzRGF0YTogWS5BcnJheTx1bmtub3duPiB8IFkuTWFwPHVua25vd24+IHwgWS5UZXh0IHwgdW5rbm93blxyXG4pOiBKc29uVmFsdWUge1xyXG4gIGlmICh5anNEYXRhIGluc3RhbmNlb2YgWS5BcnJheSkge1xyXG4gICAgcmV0dXJuIHlqc0RhdGEubWFwKCh2KSA9PiBjb252ZXJ0WWpzRGF0YVRvSnNvbih2KSlcclxuICB9XHJcblxyXG4gIGlmICh5anNEYXRhIGluc3RhbmNlb2YgWS5NYXApIHtcclxuICAgIGNvbnN0IG9iajogUmVjb3JkPHN0cmluZywgSnNvblZhbHVlPiA9IHt9XHJcbiAgICB5anNEYXRhLmZvckVhY2goKHYsIGspID0+IHtcclxuICAgICAgb2JqW2tdID0gY29udmVydFlqc0RhdGFUb0pzb24odilcclxuICAgIH0pXHJcbiAgICByZXR1cm4gb2JqXHJcbiAgfVxyXG5cclxuICBpZiAoeWpzRGF0YSBpbnN0YW5jZW9mIFkuVGV4dCkge1xyXG4gICAgY29uc3QgZGVsdGFzID0geWpzRGF0YS50b0RlbHRhKClcclxuXHJcbiAgICByZXR1cm4gbW9kZWxTbmFwc2hvdE91dFdpdGhNZXRhZGF0YShZanNUZXh0TW9kZWwsIHtcclxuICAgICAgZGVsdGFMaXN0OiBkZWx0YXMubGVuZ3RoID4gMCA/IFt7ICRmcm96ZW46IHRydWUsIGRhdGE6IGRlbHRhcyB9XSA6IFtdLFxyXG4gICAgfSkgYXMgSnNvblZhbHVlXHJcbiAgfVxyXG5cclxuICAvLyBhc3N1bWUgaXQncyBhIHByaW1pdGl2ZVxyXG4gIHJldHVybiB5anNEYXRhIGFzIEpzb25WYWx1ZVxyXG59XHJcbiIsImltcG9ydCB7IFBhdGNoIH0gZnJvbSBcIm1vYngta2V5c3RvbmVcIlxyXG5pbXBvcnQgKiBhcyBZIGZyb20gXCJ5anNcIlxyXG5pbXBvcnQgeyBKc29uQXJyYXksIEpzb25PYmplY3QsIEpzb25WYWx1ZSB9IGZyb20gXCIuLi9qc29uVHlwZXNcIlxyXG5pbXBvcnQgeyBmYWlsdXJlIH0gZnJvbSBcIi4uL3V0aWxzL2Vycm9yXCJcclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBjb252ZXJ0WWpzRXZlbnRUb1BhdGNoZXMoZXZlbnQ6IFkuWUV2ZW50PGFueT4pOiBQYXRjaFtdIHtcclxuICBjb25zdCBwYXRjaGVzOiBQYXRjaFtdID0gW11cclxuXHJcbiAgaWYgKGV2ZW50IGluc3RhbmNlb2YgWS5ZTWFwRXZlbnQpIHtcclxuICAgIGNvbnN0IHNvdXJjZSA9IGV2ZW50LnRhcmdldCBhcyBZLk1hcDxhbnk+XHJcblxyXG4gICAgZXZlbnQuY2hhbmdlcy5rZXlzLmZvckVhY2goKGNoYW5nZSwga2V5KSA9PiB7XHJcbiAgICAgIGNvbnN0IHBhdGggPSBbLi4uZXZlbnQucGF0aCwga2V5XVxyXG5cclxuICAgICAgc3dpdGNoIChjaGFuZ2UuYWN0aW9uKSB7XHJcbiAgICAgICAgY2FzZSBcImFkZFwiOlxyXG4gICAgICAgICAgcGF0Y2hlcy5wdXNoKHtcclxuICAgICAgICAgICAgb3A6IFwiYWRkXCIsXHJcbiAgICAgICAgICAgIHBhdGgsXHJcbiAgICAgICAgICAgIHZhbHVlOiB0b1BsYWluVmFsdWUoc291cmNlLmdldChrZXkpKSxcclxuICAgICAgICAgIH0pXHJcbiAgICAgICAgICBicmVha1xyXG5cclxuICAgICAgICBjYXNlIFwidXBkYXRlXCI6XHJcbiAgICAgICAgICBwYXRjaGVzLnB1c2goe1xyXG4gICAgICAgICAgICBvcDogXCJyZXBsYWNlXCIsXHJcbiAgICAgICAgICAgIHBhdGgsXHJcbiAgICAgICAgICAgIHZhbHVlOiB0b1BsYWluVmFsdWUoc291cmNlLmdldChrZXkpKSxcclxuICAgICAgICAgIH0pXHJcbiAgICAgICAgICBicmVha1xyXG5cclxuICAgICAgICBjYXNlIFwiZGVsZXRlXCI6XHJcbiAgICAgICAgICBwYXRjaGVzLnB1c2goe1xyXG4gICAgICAgICAgICBvcDogXCJyZW1vdmVcIixcclxuICAgICAgICAgICAgcGF0aCxcclxuICAgICAgICAgIH0pXHJcbiAgICAgICAgICBicmVha1xyXG5cclxuICAgICAgICBkZWZhdWx0OlxyXG4gICAgICAgICAgdGhyb3cgZmFpbHVyZShgdW5zdXBwb3J0ZWQgWWpzIG1hcCBldmVudCBhY3Rpb246ICR7Y2hhbmdlLmFjdGlvbn1gKVxyXG4gICAgICB9XHJcbiAgICB9KVxyXG4gIH0gZWxzZSBpZiAoZXZlbnQgaW5zdGFuY2VvZiBZLllBcnJheUV2ZW50KSB7XHJcbiAgICBsZXQgcmV0YWluID0gMFxyXG4gICAgZXZlbnQuY2hhbmdlcy5kZWx0YS5mb3JFYWNoKChjaGFuZ2UpID0+IHtcclxuICAgICAgaWYgKGNoYW5nZS5yZXRhaW4pIHtcclxuICAgICAgICByZXRhaW4gKz0gY2hhbmdlLnJldGFpblxyXG4gICAgICB9XHJcblxyXG4gICAgICBpZiAoY2hhbmdlLmRlbGV0ZSkge1xyXG4gICAgICAgIC8vIHJlbW92ZSBYIGl0ZW1zIGF0IHJldGFpbiBwb3NpdGlvblxyXG4gICAgICAgIGNvbnN0IHBhdGggPSBbLi4uZXZlbnQucGF0aCwgcmV0YWluXVxyXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY2hhbmdlLmRlbGV0ZTsgaSsrKSB7XHJcbiAgICAgICAgICBwYXRjaGVzLnB1c2goe1xyXG4gICAgICAgICAgICBvcDogXCJyZW1vdmVcIixcclxuICAgICAgICAgICAgcGF0aCxcclxuICAgICAgICAgIH0pXHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcblxyXG4gICAgICBpZiAoY2hhbmdlLmluc2VydCkge1xyXG4gICAgICAgIGNvbnN0IG5ld1ZhbHVlcyA9IEFycmF5LmlzQXJyYXkoY2hhbmdlLmluc2VydCkgPyBjaGFuZ2UuaW5zZXJ0IDogW2NoYW5nZS5pbnNlcnRdXHJcbiAgICAgICAgbmV3VmFsdWVzLmZvckVhY2goKHYpID0+IHtcclxuICAgICAgICAgIGNvbnN0IHBhdGggPSBbLi4uZXZlbnQucGF0aCwgcmV0YWluXVxyXG4gICAgICAgICAgcGF0Y2hlcy5wdXNoKHtcclxuICAgICAgICAgICAgb3A6IFwiYWRkXCIsXHJcbiAgICAgICAgICAgIHBhdGgsXHJcbiAgICAgICAgICAgIHZhbHVlOiB0b1BsYWluVmFsdWUodiksXHJcbiAgICAgICAgICB9KVxyXG4gICAgICAgICAgcmV0YWluKytcclxuICAgICAgICB9KVxyXG4gICAgICB9XHJcbiAgICB9KVxyXG4gIH0gZWxzZSBpZiAoZXZlbnQgaW5zdGFuY2VvZiBZLllUZXh0RXZlbnQpIHtcclxuICAgIGNvbnN0IHBhdGggPSBbLi4uZXZlbnQucGF0aCwgXCJkZWx0YUxpc3RcIiwgLTEgLyogbGFzdCBpdGVtICovXVxyXG4gICAgcGF0Y2hlcy5wdXNoKHtcclxuICAgICAgb3A6IFwiYWRkXCIsXHJcbiAgICAgIHBhdGgsXHJcbiAgICAgIHZhbHVlOiB7ICRmcm96ZW46IHRydWUsIGRhdGE6IGV2ZW50LmRlbHRhIH0sXHJcbiAgICB9KVxyXG4gIH1cclxuXHJcbiAgcmV0dXJuIHBhdGNoZXNcclxufVxyXG5cclxuZnVuY3Rpb24gdG9QbGFpblZhbHVlKHY6IFkuTWFwPGFueT4gfCBZLkFycmF5PGFueT4gfCBKc29uVmFsdWUpIHtcclxuICBpZiAodiBpbnN0YW5jZW9mIFkuTWFwIHx8IHYgaW5zdGFuY2VvZiBZLkFycmF5KSB7XHJcbiAgICByZXR1cm4gdi50b0pTT04oKSBhcyBKc29uT2JqZWN0IHwgSnNvbkFycmF5XHJcbiAgfSBlbHNlIHtcclxuICAgIHJldHVybiB2XHJcbiAgfVxyXG59XHJcbiIsImltcG9ydCB7IGFjdGlvbiB9IGZyb20gXCJtb2J4XCJcclxuaW1wb3J0IHtcclxuICBBbnlEYXRhTW9kZWwsXHJcbiAgQW55TW9kZWwsXHJcbiAgQW55U3RhbmRhcmRUeXBlLFxyXG4gIE1vZGVsQ2xhc3MsXHJcbiAgUGF0Y2gsXHJcbiAgVHlwZVRvRGF0YSxcclxuICBhcHBseVBhdGNoZXMsXHJcbiAgZnJvbVNuYXBzaG90LFxyXG4gIGdldFBhcmVudFRvQ2hpbGRQYXRoLFxyXG4gIG9uR2xvYmFsUGF0Y2hlcyxcclxuICBvblBhdGNoZXMsXHJcbiAgb25TbmFwc2hvdCxcclxufSBmcm9tIFwibW9ieC1rZXlzdG9uZVwiXHJcbmltcG9ydCAqIGFzIFkgZnJvbSBcInlqc1wiXHJcbmltcG9ydCB7IGdldE9yQ3JlYXRlWWpzQ29sbGVjdGlvbkF0b20gfSBmcm9tIFwiLi4vdXRpbHMvZ2V0T3JDcmVhdGVZanNDb2xsZWN0aW9uQXRvbVwiXHJcbmltcG9ydCB7IGFwcGx5TW9ieEtleXN0b25lUGF0Y2hUb1lqc09iamVjdCB9IGZyb20gXCIuL2FwcGx5TW9ieEtleXN0b25lUGF0Y2hUb1lqc09iamVjdFwiXHJcbmltcG9ydCB7IGNvbnZlcnRZanNEYXRhVG9Kc29uIH0gZnJvbSBcIi4vY29udmVydFlqc0RhdGFUb0pzb25cIlxyXG5pbXBvcnQgeyBjb252ZXJ0WWpzRXZlbnRUb1BhdGNoZXMgfSBmcm9tIFwiLi9jb252ZXJ0WWpzRXZlbnRUb1BhdGNoZXNcIlxyXG5pbXBvcnQgeyBZanNCaW5kaW5nQ29udGV4dCwgeWpzQmluZGluZ0NvbnRleHQgfSBmcm9tIFwiLi95anNCaW5kaW5nQ29udGV4dFwiXHJcblxyXG4vKipcclxuICogQ3JlYXRlcyBhIGJpZGlyZWN0aW9uYWwgYmluZGluZyBiZXR3ZWVuIGEgWS5qcyBkYXRhIHN0cnVjdHVyZSBhbmQgYSBtb2J4LWtleXN0b25lIG1vZGVsLlxyXG4gKi9cclxuZXhwb3J0IGZ1bmN0aW9uIGJpbmRZanNUb01vYnhLZXlzdG9uZTxcclxuICBUVHlwZSBleHRlbmRzIEFueVN0YW5kYXJkVHlwZSB8IE1vZGVsQ2xhc3M8QW55TW9kZWw+IHwgTW9kZWxDbGFzczxBbnlEYXRhTW9kZWw+LFxyXG4+KHtcclxuICB5anNEb2MsXHJcbiAgeWpzT2JqZWN0LFxyXG4gIG1vYnhLZXlzdG9uZVR5cGUsXHJcbn06IHtcclxuICAvKipcclxuICAgKiBUaGUgWS5qcyBkb2N1bWVudC5cclxuICAgKi9cclxuICB5anNEb2M6IFkuRG9jXHJcbiAgLyoqXHJcbiAgICogVGhlIGJvdW5kIFkuanMgZGF0YSBzdHJ1Y3R1cmUuXHJcbiAgICovXHJcbiAgeWpzT2JqZWN0OiBZLk1hcDx1bmtub3duPiB8IFkuQXJyYXk8dW5rbm93bj4gfCBZLlRleHRcclxuICAvKipcclxuICAgKiBUaGUgbW9ieC1rZXlzdG9uZSBtb2RlbCB0eXBlLlxyXG4gICAqL1xyXG4gIG1vYnhLZXlzdG9uZVR5cGU6IFRUeXBlXHJcbn0pOiB7XHJcbiAgLyoqXHJcbiAgICogVGhlIGJvdW5kIG1vYngta2V5c3RvbmUgaW5zdGFuY2UuXHJcbiAgICovXHJcbiAgYm91bmRPYmplY3Q6IFR5cGVUb0RhdGE8VFR5cGU+XHJcbiAgLyoqXHJcbiAgICogRGlzcG9zZXMgdGhlIGJpbmRpbmcuXHJcbiAgICovXHJcbiAgZGlzcG9zZSgpOiB2b2lkXHJcbiAgLyoqXHJcbiAgICogVGhlIFkuanMgb3JpZ2luIHN5bWJvbCB1c2VkIGZvciBiaW5kaW5nIHRyYW5zYWN0aW9ucy5cclxuICAgKi9cclxuICB5anNPcmlnaW46IHN5bWJvbFxyXG59IHtcclxuICBjb25zdCB5anNPcmlnaW4gPSBTeW1ib2woXCJiaW5kWWpzVG9Nb2J4S2V5c3RvbmVUcmFuc2FjdGlvbk9yaWdpblwiKVxyXG5cclxuICBsZXQgYXBwbHlpbmdZanNDaGFuZ2VzVG9Nb2J4S2V5c3RvbmUgPSAwXHJcblxyXG4gIGNvbnN0IGJpbmRpbmdDb250ZXh0OiBZanNCaW5kaW5nQ29udGV4dCA9IHtcclxuICAgIHlqc0RvYyxcclxuICAgIHlqc09iamVjdCxcclxuICAgIG1vYnhLZXlzdG9uZVR5cGUsXHJcbiAgICB5anNPcmlnaW4sXHJcbiAgICBib3VuZE9iamVjdDogdW5kZWZpbmVkLCAvLyBub3QgeWV0IGNyZWF0ZWRcclxuXHJcbiAgICBnZXQgaXNBcHBseWluZ1lqc0NoYW5nZXNUb01vYnhLZXlzdG9uZSgpIHtcclxuICAgICAgcmV0dXJuIGFwcGx5aW5nWWpzQ2hhbmdlc1RvTW9ieEtleXN0b25lID4gMFxyXG4gICAgfSxcclxuICB9XHJcblxyXG4gIGNvbnN0IHlqc0pzb24gPSBjb252ZXJ0WWpzRGF0YVRvSnNvbih5anNPYmplY3QpXHJcblxyXG4gIGNvbnN0IGluaXRpYWxpemF0aW9uR2xvYmFsUGF0Y2hlczogeyB0YXJnZXQ6IG9iamVjdDsgcGF0Y2hlczogUGF0Y2hbXSB9W10gPSBbXVxyXG5cclxuICBjb25zdCBjcmVhdGVCb3VuZE9iamVjdCA9ICgpID0+IHtcclxuICAgIGNvbnN0IGRpc3Bvc2VPbkdsb2JhbFBhdGNoZXMgPSBvbkdsb2JhbFBhdGNoZXMoKHRhcmdldCwgcGF0Y2hlcykgPT4ge1xyXG4gICAgICBpbml0aWFsaXphdGlvbkdsb2JhbFBhdGNoZXMucHVzaCh7IHRhcmdldCwgcGF0Y2hlcyB9KVxyXG4gICAgfSlcclxuXHJcbiAgICB0cnkge1xyXG4gICAgICBjb25zdCBib3VuZE9iamVjdCA9IHlqc0JpbmRpbmdDb250ZXh0LmFwcGx5KFxyXG4gICAgICAgICgpID0+IGZyb21TbmFwc2hvdChtb2J4S2V5c3RvbmVUeXBlLCB5anNKc29uIGFzIGFueSksXHJcbiAgICAgICAgYmluZGluZ0NvbnRleHRcclxuICAgICAgKVxyXG4gICAgICB5anNCaW5kaW5nQ29udGV4dC5zZXQoYm91bmRPYmplY3QsIHsgLi4uYmluZGluZ0NvbnRleHQsIGJvdW5kT2JqZWN0IH0pXHJcbiAgICAgIHJldHVybiBib3VuZE9iamVjdFxyXG4gICAgfSBmaW5hbGx5IHtcclxuICAgICAgZGlzcG9zZU9uR2xvYmFsUGF0Y2hlcygpXHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBjb25zdCBib3VuZE9iamVjdCA9IGNyZWF0ZUJvdW5kT2JqZWN0KClcclxuXHJcbiAgLy8gYmluZCBhbnkgY2hhbmdlcyBmcm9tIHlqcyB0byBtb2J4LWtleXN0b25lXHJcbiAgY29uc3Qgb2JzZXJ2ZURlZXBDYiA9IGFjdGlvbigoZXZlbnRzOiBZLllFdmVudDxhbnk+W10pID0+IHtcclxuICAgIGNvbnN0IHBhdGNoZXM6IFBhdGNoW10gPSBbXVxyXG4gICAgZXZlbnRzLmZvckVhY2goKGV2ZW50KSA9PiB7XHJcbiAgICAgIGlmIChldmVudC50cmFuc2FjdGlvbi5vcmlnaW4gIT09IHlqc09yaWdpbikge1xyXG4gICAgICAgIHBhdGNoZXMucHVzaCguLi5jb252ZXJ0WWpzRXZlbnRUb1BhdGNoZXMoZXZlbnQpKVxyXG4gICAgICB9XHJcblxyXG4gICAgICBpZiAoZXZlbnQudGFyZ2V0IGluc3RhbmNlb2YgWS5NYXAgfHwgZXZlbnQudGFyZ2V0IGluc3RhbmNlb2YgWS5BcnJheSkge1xyXG4gICAgICAgIGdldE9yQ3JlYXRlWWpzQ29sbGVjdGlvbkF0b20oZXZlbnQudGFyZ2V0KS5yZXBvcnRDaGFuZ2VkKClcclxuICAgICAgfVxyXG4gICAgfSlcclxuXHJcbiAgICBpZiAocGF0Y2hlcy5sZW5ndGggPiAwKSB7XHJcbiAgICAgIGFwcGx5aW5nWWpzQ2hhbmdlc1RvTW9ieEtleXN0b25lKytcclxuICAgICAgdHJ5IHtcclxuICAgICAgICBhcHBseVBhdGNoZXMoYm91bmRPYmplY3QsIHBhdGNoZXMpXHJcbiAgICAgIH0gZmluYWxseSB7XHJcbiAgICAgICAgYXBwbHlpbmdZanNDaGFuZ2VzVG9Nb2J4S2V5c3RvbmUtLVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfSlcclxuXHJcbiAgeWpzT2JqZWN0Lm9ic2VydmVEZWVwKG9ic2VydmVEZWVwQ2IpXHJcblxyXG4gIC8vIGJpbmQgYW55IGNoYW5nZXMgZnJvbSBtb2J4LWtleXN0b25lIHRvIHlqc1xyXG4gIGxldCBwZW5kaW5nQXJyYXlPZkFycmF5T2ZQYXRjaGVzOiBQYXRjaFtdW10gPSBbXVxyXG4gIGNvbnN0IGRpc3Bvc2VPblBhdGNoZXMgPSBvblBhdGNoZXMoYm91bmRPYmplY3QsIChwYXRjaGVzKSA9PiB7XHJcbiAgICBpZiAoYXBwbHlpbmdZanNDaGFuZ2VzVG9Nb2J4S2V5c3RvbmUgPiAwKSB7XHJcbiAgICAgIHJldHVyblxyXG4gICAgfVxyXG5cclxuICAgIHBlbmRpbmdBcnJheU9mQXJyYXlPZlBhdGNoZXMucHVzaChwYXRjaGVzKVxyXG4gIH0pXHJcblxyXG4gIC8vIHRoaXMgaXMgb25seSB1c2VkIHNvIHdlIGNhbiB0cmFuc2FjdCBhbGwgcGF0Y2hlcyB0byB0aGUgc25hcHNob3QgYm91bmRhcnlcclxuICBjb25zdCBkaXNwb3NlT25TbmFwc2hvdCA9IG9uU25hcHNob3QoYm91bmRPYmplY3QsICgpID0+IHtcclxuICAgIGlmIChwZW5kaW5nQXJyYXlPZkFycmF5T2ZQYXRjaGVzLmxlbmd0aCA9PT0gMCkge1xyXG4gICAgICByZXR1cm5cclxuICAgIH1cclxuXHJcbiAgICBjb25zdCBhcnJheU9mQXJyYXlPZlBhdGNoZXMgPSBwZW5kaW5nQXJyYXlPZkFycmF5T2ZQYXRjaGVzXHJcbiAgICBwZW5kaW5nQXJyYXlPZkFycmF5T2ZQYXRjaGVzID0gW11cclxuXHJcbiAgICB5anNEb2MudHJhbnNhY3QoKCkgPT4ge1xyXG4gICAgICBhcnJheU9mQXJyYXlPZlBhdGNoZXMuZm9yRWFjaCgoYXJyYXlPZlBhdGNoZXMpID0+IHtcclxuICAgICAgICBhcnJheU9mUGF0Y2hlcy5mb3JFYWNoKChwYXRjaCkgPT4ge1xyXG4gICAgICAgICAgYXBwbHlNb2J4S2V5c3RvbmVQYXRjaFRvWWpzT2JqZWN0KHBhdGNoLCB5anNPYmplY3QpXHJcbiAgICAgICAgfSlcclxuICAgICAgfSlcclxuICAgIH0sIHlqc09yaWdpbilcclxuICB9KVxyXG5cclxuICAvLyBzeW5jIGluaXRpYWwgcGF0Y2hlcywgdGhhdCBtaWdodCBpbmNsdWRlIHNldHRpbmcgZGVmYXVsdHMsIElEcywgZXRjXHJcbiAgeWpzRG9jLnRyYW5zYWN0KCgpID0+IHtcclxuICAgIC8vIHdlIG5lZWQgdG8gc2tpcCBpbml0aWFsaXphdGlvbnMgdW50aWwgd2UgaGl0IHRoZSBpbml0aWFsaXphdGlvbiBvZiB0aGUgYm91bmQgb2JqZWN0XHJcbiAgICAvLyB0aGlzIGlzIGJlY2F1c2UgZGVmYXVsdCBvYmplY3RzIG1pZ2h0IGJlIGNyZWF0ZWQgYW5kIGluaXRpYWxpemVkIGJlZm9yZSB0aGUgbWFpbiBvYmplY3RcclxuICAgIC8vIGJ1dCB3ZSBqdXN0IG5lZWQgdG8gY2F0Y2ggd2hlbiB0aG9zZSBhcmUgYWN0dWFsbHkgYXNzaWduZWQgdG8gdGhlIGJvdW5kIG9iamVjdFxyXG4gICAgbGV0IGJvdW5kT2JqZWN0Rm91bmQgPSBmYWxzZVxyXG5cclxuICAgIGluaXRpYWxpemF0aW9uR2xvYmFsUGF0Y2hlcy5mb3JFYWNoKCh7IHRhcmdldCwgcGF0Y2hlcyB9KSA9PiB7XHJcbiAgICAgIGlmICghYm91bmRPYmplY3RGb3VuZCkge1xyXG4gICAgICAgIGlmICh0YXJnZXQgIT09IGJvdW5kT2JqZWN0KSB7XHJcbiAgICAgICAgICByZXR1cm4gLy8gc2tpcFxyXG4gICAgICAgIH1cclxuICAgICAgICBib3VuZE9iamVjdEZvdW5kID0gdHJ1ZVxyXG4gICAgICB9XHJcblxyXG4gICAgICBjb25zdCBwYXJlbnRUb0NoaWxkUGF0aCA9IGdldFBhcmVudFRvQ2hpbGRQYXRoKGJvdW5kT2JqZWN0LCB0YXJnZXQpXHJcbiAgICAgIC8vIHRoaXMgaXMgdW5kZWZpbmVkIG9ubHkgaWYgdGFyZ2V0IGlzIG5vdCBhIGNoaWxkIG9mIGJvdW5kTW9kZWxcclxuICAgICAgaWYgKHBhcmVudFRvQ2hpbGRQYXRoICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgICBwYXRjaGVzLmZvckVhY2goKHBhdGNoKSA9PiB7XHJcbiAgICAgICAgICBhcHBseU1vYnhLZXlzdG9uZVBhdGNoVG9ZanNPYmplY3QoXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAuLi5wYXRjaCxcclxuICAgICAgICAgICAgICBwYXRoOiBbLi4ucGFyZW50VG9DaGlsZFBhdGgsIC4uLnBhdGNoLnBhdGhdLFxyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICB5anNPYmplY3RcclxuICAgICAgICAgIClcclxuICAgICAgICB9KVxyXG4gICAgICB9XHJcbiAgICB9KVxyXG4gIH0sIHlqc09yaWdpbilcclxuXHJcbiAgcmV0dXJuIHtcclxuICAgIGJvdW5kT2JqZWN0LFxyXG4gICAgZGlzcG9zZTogKCkgPT4ge1xyXG4gICAgICBkaXNwb3NlT25QYXRjaGVzKClcclxuICAgICAgZGlzcG9zZU9uU25hcHNob3QoKVxyXG4gICAgICB5anNPYmplY3QudW5vYnNlcnZlRGVlcChvYnNlcnZlRGVlcENiKVxyXG4gICAgfSxcclxuICAgIHlqc09yaWdpbixcclxuICB9XHJcbn1cclxuIl0sIm5hbWVzIjpbImNyZWF0ZUNvbnRleHQiLCJjcmVhdGVBdG9tIiwiWSIsInR5cGVzIiwiWWpzVGV4dE1vZGVsIiwiTW9kZWwiLCJ0UHJvcCIsImZyb3plbiIsImdldFBhcmVudFRvQ2hpbGRQYXRoIiwicmVhY3Rpb24iLCJvYnNlcnZlIiwib25TbmFwc2hvdCIsImNvbXB1dGVkIiwiZXhwb3J0cyIsIm1vZGVsIiwibW9kZWxTbmFwc2hvdE91dFdpdGhNZXRhZGF0YSIsIm9uR2xvYmFsUGF0Y2hlcyIsImJvdW5kT2JqZWN0IiwiZnJvbVNuYXBzaG90IiwiYWN0aW9uIiwiYXBwbHlQYXRjaGVzIiwib25QYXRjaGVzIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztFQUdNLE1BQU8sNkJBQTZCLE1BQUs7QUFBQSxJQUM3QyxZQUFZLEtBQVc7QUFDckIsWUFBTSxHQUFHO0FBR0YsYUFBQSxlQUFlLE1BQU0scUJBQXFCLFNBQVM7QUFBQSxJQUM1RDtBQUFBLEVBQ0Q7QUFLSyxXQUFVLFFBQVEsS0FBVztBQUMxQixXQUFBLElBQUkscUJBQXFCLEdBQUc7QUFBQSxFQUNyQztBQ3dCYSxRQUFBLG9CQUFvQkEsMkJBQTZDLE1BQVM7QUN0Q3ZGLFFBQU0seUNBQXlCO0FBS2xCLFFBQUEsK0JBQStCLENBQzFDLGtCQUNTO0FBQ0wsUUFBQSxPQUFPLG1CQUFtQixJQUFJLGFBQWE7QUFDL0MsUUFBSSxDQUFDLE1BQU07QUFDVCxhQUFPQyxnQkFBVyxtQkFBbUI7QUFDbEIseUJBQUEsSUFBSSxlQUFlLElBQUk7QUFBQSxJQUM1QztBQUNPLFdBQUE7QUFBQSxFQUNUO0FDYmdCLFdBQUEsZUFBZSxXQUFvQixNQUFrQztBQUNuRixRQUFJLG1CQUE0QjtBQUUzQixTQUFBLFFBQVEsQ0FBQyxVQUFVLE1BQUs7QUFDdkIsVUFBQSw0QkFBNEJDLGFBQUUsS0FBSztBQUNSLHFDQUFBLGdCQUFnQixFQUFFO0FBQ3pDLGNBQUEsTUFBTSxPQUFPLFFBQVE7QUFDUiwyQkFBQSxpQkFBaUIsSUFBSSxHQUFHO0FBQUEsTUFBQSxXQUNsQyw0QkFBNEJBLGFBQUUsT0FBTztBQUNqQixxQ0FBQSxnQkFBZ0IsRUFBRTtBQUN6QyxjQUFB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
590
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibW9ieC1rZXlzdG9uZS15anMudW1kLmpzIiwic291cmNlcyI6WyIuLi9zcmMvdXRpbHMvZXJyb3IudHMiLCIuLi9zcmMvYmluZGluZy95anNCaW5kaW5nQ29udGV4dC50cyIsIi4uL3NyYy91dGlscy9nZXRPckNyZWF0ZVlqc0NvbGxlY3Rpb25BdG9tLnRzIiwiLi4vc3JjL2JpbmRpbmcvcmVzb2x2ZVlqc1BhdGgudHMiLCIuLi9zcmMvYmluZGluZy9ZanNUZXh0TW9kZWwudHMiLCIuLi9zcmMvYmluZGluZy9jb252ZXJ0SnNvblRvWWpzRGF0YS50cyIsIi4uL3NyYy9iaW5kaW5nL2FwcGx5TW9ieEtleXN0b25lUGF0Y2hUb1lqc09iamVjdC50cyIsIi4uL3NyYy9iaW5kaW5nL2NvbnZlcnRZanNEYXRhVG9Kc29uLnRzIiwiLi4vc3JjL2JpbmRpbmcvY29udmVydFlqc0V2ZW50VG9QYXRjaGVzLnRzIiwiLi4vc3JjL2JpbmRpbmcvYmluZFlqc1RvTW9ieEtleXN0b25lLnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxyXG4gKiBBIG1vYngta2V5c3RvbmUteWpzIGVycm9yLlxyXG4gKi9cclxuZXhwb3J0IGNsYXNzIE1vYnhLZXlzdG9uZVlqc0Vycm9yIGV4dGVuZHMgRXJyb3Ige1xyXG4gIGNvbnN0cnVjdG9yKG1zZzogc3RyaW5nKSB7XHJcbiAgICBzdXBlcihtc2cpXHJcblxyXG4gICAgLy8gU2V0IHRoZSBwcm90b3R5cGUgZXhwbGljaXRseS5cclxuICAgIE9iamVjdC5zZXRQcm90b3R5cGVPZih0aGlzLCBNb2J4S2V5c3RvbmVZanNFcnJvci5wcm90b3R5cGUpXHJcbiAgfVxyXG59XHJcblxyXG4vKipcclxuICogQGludGVybmFsXHJcbiAqL1xyXG5leHBvcnQgZnVuY3Rpb24gZmFpbHVyZShtc2c6IHN0cmluZykge1xyXG4gIHJldHVybiBuZXcgTW9ieEtleXN0b25lWWpzRXJyb3IobXNnKVxyXG59XHJcbiIsImltcG9ydCB7IEFueVR5cGUsIGNyZWF0ZUNvbnRleHQgfSBmcm9tIFwibW9ieC1rZXlzdG9uZVwiXG5pbXBvcnQgKiBhcyBZIGZyb20gXCJ5anNcIlxuXG4vKipcbiAqIENvbnRleHQgd2l0aCBpbmZvIG9uIGhvdyBhIG1vYngta2V5c3RvbmUgbW9kZWwgaXMgYm91bmQgdG8gYSBZLmpzIGRhdGEgc3RydWN0dXJlLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFlqc0JpbmRpbmdDb250ZXh0IHtcbiAgLyoqXG4gICAqIFRoZSBZLmpzIGRvY3VtZW50LlxuICAgKi9cbiAgeWpzRG9jOiBZLkRvY1xuXG4gIC8qKlxuICAgKiBUaGUgYm91bmQgWS5qcyBkYXRhIHN0cnVjdHVyZS5cbiAgICovXG4gIHlqc09iamVjdDogWS5NYXA8dW5rbm93bj4gfCBZLkFycmF5PHVua25vd24+IHwgWS5UZXh0XG5cbiAgLyoqXG4gICAqIFRoZSBtb2J4LWtleXN0b25lIG1vZGVsIHR5cGUuXG4gICAqL1xuICBtb2J4S2V5c3RvbmVUeXBlOiBBbnlUeXBlXG5cbiAgLyoqXG4gICAqIFRoZSBvcmlnaW4gc3ltYm9sIHVzZWQgZm9yIHRyYW5zYWN0aW9ucy5cbiAgICovXG4gIHlqc09yaWdpbjogc3ltYm9sXG5cbiAgLyoqXG4gICAqIFRoZSBib3VuZCBtb2J4LWtleXN0b25lIGluc3RhbmNlLlxuICAgKi9cbiAgYm91bmRPYmplY3Q6IHVua25vd25cblxuICAvKipcbiAgICogV2hldGhlciB3ZSBhcmUgY3VycmVudGx5IGFwcGx5aW5nIFkuanMgY2hhbmdlcyB0byB0aGUgbW9ieC1rZXlzdG9uZSBtb2RlbC5cbiAgICovXG4gIGlzQXBwbHlpbmdZanNDaGFuZ2VzVG9Nb2J4S2V5c3RvbmU6IGJvb2xlYW5cbn1cblxuLyoqXG4gKiBDb250ZXh0IHdpdGggaW5mbyBvbiBob3cgYSBtb2J4LWtleXN0b25lIG1vZGVsIGlzIGJvdW5kIHRvIGEgWS5qcyBkYXRhIHN0cnVjdHVyZS5cbiAqL1xuZXhwb3J0IGNvbnN0IHlqc0JpbmRpbmdDb250ZXh0ID0gY3JlYXRlQ29udGV4dDxZanNCaW5kaW5nQ29udGV4dCB8IHVuZGVmaW5lZD4odW5kZWZpbmVkKVxuIiwiaW1wb3J0IHsgSUF0b20sIGNyZWF0ZUF0b20gfSBmcm9tIFwibW9ieFwiXG5pbXBvcnQgKiBhcyBZIGZyb20gXCJ5anNcIlxuXG5jb25zdCB5anNDb2xsZWN0aW9uQXRvbXMgPSBuZXcgV2Vha01hcDxZLk1hcDx1bmtub3duPiB8IFkuQXJyYXk8dW5rbm93bj4sIElBdG9tPigpXG5cbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBjb25zdCBnZXRZanNDb2xsZWN0aW9uQXRvbSA9IChcbiAgeWpzQ29sbGVjdGlvbjogWS5NYXA8dW5rbm93bj4gfCBZLkFycmF5PHVua25vd24+XG4pOiBJQXRvbSB8IHVuZGVmaW5lZCA9PiB7XG4gIHJldHVybiB5anNDb2xsZWN0aW9uQXRvbXMuZ2V0KHlqc0NvbGxlY3Rpb24pXG59XG5cbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBjb25zdCBnZXRPckNyZWF0ZVlqc0NvbGxlY3Rpb25BdG9tID0gKFxuICB5anNDb2xsZWN0aW9uOiBZLk1hcDx1bmtub3duPiB8IFkuQXJyYXk8dW5rbm93bj5cbik6IElBdG9tID0+IHtcbiAgbGV0IGF0b20gPSB5anNDb2xsZWN0aW9uQXRvbXMuZ2V0KHlqc0NvbGxlY3Rpb24pXG4gIGlmICghYXRvbSkge1xuICAgIGF0b20gPSBjcmVhdGVBdG9tKGB5anNDb2xsZWN0aW9uQXRvbWApXG4gICAgeWpzQ29sbGVjdGlvbkF0b21zLnNldCh5anNDb2xsZWN0aW9uLCBhdG9tKVxuICB9XG4gIHJldHVybiBhdG9tXG59XG4iLCJpbXBvcnQgKiBhcyBZIGZyb20gXCJ5anNcIlxuaW1wb3J0IHsgZmFpbHVyZSB9IGZyb20gXCIuLi91dGlscy9lcnJvclwiXG5pbXBvcnQgeyBnZXRPckNyZWF0ZVlqc0NvbGxlY3Rpb25BdG9tIH0gZnJvbSBcIi4uL3V0aWxzL2dldE9yQ3JlYXRlWWpzQ29sbGVjdGlvbkF0b21cIlxuXG5leHBvcnQgZnVuY3Rpb24gcmVzb2x2ZVlqc1BhdGgoeWpzT2JqZWN0OiB1bmtub3duLCBwYXRoOiByZWFkb25seSAoc3RyaW5nIHwgbnVtYmVyKVtdKTogdW5rbm93biB7XG4gIGxldCBjdXJyZW50WWpzT2JqZWN0OiB1bmtub3duID0geWpzT2JqZWN0XG5cbiAgcGF0aC5mb3JFYWNoKChwYXRoUGFydCwgaSkgPT4ge1xuICAgIGlmIChjdXJyZW50WWpzT2JqZWN0IGluc3RhbmNlb2YgWS5NYXApIHtcbiAgICAgIGdldE9yQ3JlYXRlWWpzQ29sbGVjdGlvbkF0b20oY3VycmVudFlqc09iamVjdCkucmVwb3J0T2JzZXJ2ZWQoKVxuICAgICAgY29uc3Qga2V5ID0gU3RyaW5nKHBhdGhQYXJ0KVxuICAgICAgY3VycmVudFlqc09iamVjdCA9IGN1cnJlbnRZanNPYmplY3QuZ2V0KGtleSlcbiAgICB9IGVsc2UgaWYgKGN1cnJlbnRZanNPYmplY3QgaW5zdGFuY2VvZiBZLkFycmF5KSB7XG4gICAgICBnZXRPckNyZWF0ZVlqc0NvbGxlY3Rpb25BdG9tKGN1cnJlbnRZanNPYmplY3QpLnJlcG9ydE9ic2VydmVkKClcbiAgICAgIGNvbnN0IGtleSA9IE51bWJlcihwYXRoUGFydClcbiAgICAgIGN1cnJlbnRZanNPYmplY3QgPSBjdXJyZW50WWpzT2JqZWN0LmdldChrZXkpXG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IGZhaWx1cmUoXG4gICAgICAgIGBZLk1hcCBvciBZLkFycmF5IHdhcyBleHBlY3RlZCBhdCBwYXRoICR7SlNPTi5zdHJpbmdpZnkoXG4gICAgICAgICAgcGF0aC5zbGljZSgwLCBpKVxuICAgICAgICApfSBpbiBvcmRlciB0byByZXNvbHZlIHBhdGggJHtKU09OLnN0cmluZ2lmeShwYXRoKX0sIGJ1dCBnb3QgJHtjdXJyZW50WWpzT2JqZWN0fSBpbnN0ZWFkYFxuICAgICAgKVxuICAgIH1cbiAgfSlcblxuICByZXR1cm4gY3VycmVudFlqc09iamVjdFxufVxuIiwiaW1wb3J0IHsgSUF0b20sIGNvbXB1dGVkLCBjcmVhdGVBdG9tLCBvYnNlcnZlLCByZWFjdGlvbiB9IGZyb20gXCJtb2J4XCJcbmltcG9ydCB7XG4gIEZyb3plbixcbiAgTW9kZWwsXG4gIGZyb3plbixcbiAgZ2V0UGFyZW50VG9DaGlsZFBhdGgsXG4gIG1vZGVsLFxuICBvblNuYXBzaG90LFxuICB0UHJvcCxcbiAgdHlwZXMsXG59IGZyb20gXCJtb2J4LWtleXN0b25lXCJcbmltcG9ydCAqIGFzIFkgZnJvbSBcInlqc1wiXG5pbXBvcnQgeyBmYWlsdXJlIH0gZnJvbSBcIi4uL3V0aWxzL2Vycm9yXCJcbmltcG9ydCB7IFlqc0JpbmRpbmdDb250ZXh0LCB5anNCaW5kaW5nQ29udGV4dCB9IGZyb20gXCIuL3lqc0JpbmRpbmdDb250ZXh0XCJcbmltcG9ydCB7IHJlc29sdmVZanNQYXRoIH0gZnJvbSBcIi4vcmVzb2x2ZVlqc1BhdGhcIlxuXG4vLyBEZWx0YVtdW10sIHNpbmNlIGVhY2ggc2luZ2xlIGNoYW5nZSBpcyBhIERlbHRhW11cbi8vIHdlIHVzZSBmcm96ZW4gc28gdGhhdCB3ZSBjYW4gcmV1c2UgZWFjaCBkZWx0YSBjaGFuZ2VcbmNvbnN0IGRlbHRhTGlzdFR5cGUgPSB0eXBlcy5hcnJheSh0eXBlcy5mcm96ZW4odHlwZXMudW5jaGVja2VkPHVua25vd25bXT4oKSkpXG5cbmV4cG9ydCBjb25zdCB5anNUZXh0TW9kZWxJZCA9IFwibW9ieC1rZXlzdG9uZS15anMvWWpzVGV4dE1vZGVsXCJcblxuLyoqXG4gKiBBIG1vYngta2V5c3RvbmUgbW9kZWwgdGhhdCByZXByZXNlbnRzIGEgWWpzLlRleHQgb2JqZWN0LlxuICovXG5AbW9kZWwoeWpzVGV4dE1vZGVsSWQpXG5leHBvcnQgY2xhc3MgWWpzVGV4dE1vZGVsIGV4dGVuZHMgTW9kZWwoe1xuICBkZWx0YUxpc3Q6IHRQcm9wKGRlbHRhTGlzdFR5cGUsICgpID0+IFtdKSxcbn0pIHtcbiAgLyoqXG4gICAqIEhlbHBlciBmdW5jdGlvbiB0byBjcmVhdGUgYSBZanNUZXh0TW9kZWwgaW5zdGFuY2Ugd2l0aCBhIHNpbXBsZSB0ZXh0LlxuICAgKi9cbiAgc3RhdGljIHdpdGhUZXh0KHRleHQ6IHN0cmluZyk6IFlqc1RleHRNb2RlbCB7XG4gICAgcmV0dXJuIG5ldyBEZWNvcmF0ZWRZanNUZXh0TW9kZWwoe1xuICAgICAgZGVsdGFMaXN0OiBbXG4gICAgICAgIGZyb3plbihbXG4gICAgICAgICAge1xuICAgICAgICAgICAgaW5zZXJ0OiB0ZXh0LFxuICAgICAgICAgIH0sXG4gICAgICAgIF0pLFxuICAgICAgXSxcbiAgICB9KVxuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBZLmpzIHBhdGggZnJvbSB0aGUgYm91bmQgb2JqZWN0IHRvIHRoZSBZanNUZXh0TW9kZWwgaW5zdGFuY2UuXG4gICAqL1xuICBAY29tcHV0ZWRcbiAgcHJpdmF0ZSBnZXQgX3lqc09iamVjdFBhdGgoKSB7XG4gICAgY29uc3QgY3R4ID0geWpzQmluZGluZ0NvbnRleHQuZ2V0KHRoaXMpXG4gICAgaWYgKGN0eD8uYm91bmRPYmplY3QgPT0gbnVsbCkge1xuICAgICAgdGhyb3cgZmFpbHVyZShcbiAgICAgICAgXCJ0aGUgWWpzVGV4dE1vZGVsIGluc3RhbmNlIG11c3QgYmUgcGFydCBvZiBhIGJvdW5kIG9iamVjdCBiZWZvcmUgaXQgY2FuIGJlIGFjY2Vzc2VkXCJcbiAgICAgIClcbiAgICB9XG5cbiAgICBjb25zdCBwYXRoID0gZ2V0UGFyZW50VG9DaGlsZFBhdGgoY3R4LmJvdW5kT2JqZWN0LCB0aGlzKVxuICAgIGlmICghcGF0aCkge1xuICAgICAgdGhyb3cgZmFpbHVyZShcImEgcGF0aCBmcm9tIHRoZSBib3VuZCBvYmplY3QgdG8gdGhlIFlqc1RleHRNb2RlbCBpbnN0YW5jZSBpcyBub3QgYXZhaWxhYmxlXCIpXG4gICAgfVxuXG4gICAgcmV0dXJuIHBhdGhcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgWWpzLlRleHQgb2JqZWN0IHByZXNlbnQgYXQgdGhpcyBtb2J4LWtleXN0b25lIG5vZGUncyBwYXRoLlxuICAgKi9cbiAgQGNvbXB1dGVkXG4gIHByaXZhdGUgZ2V0IF95anNPYmplY3RBdFBhdGgoKTogdW5rbm93biB7XG4gICAgY29uc3QgcGF0aCA9IHRoaXMuX3lqc09iamVjdFBhdGhcblxuICAgIGNvbnN0IGN0eCA9IHlqc0JpbmRpbmdDb250ZXh0LmdldCh0aGlzKSFcblxuICAgIHJldHVybiByZXNvbHZlWWpzUGF0aChjdHgueWpzT2JqZWN0LCBwYXRoKVxuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBZanMuVGV4dCBvYmplY3QgcmVwcmVzZW50ZWQgYnkgdGhpcyBtb2J4LWtleXN0b25lIG5vZGUuXG4gICAqL1xuICBAY29tcHV0ZWRcbiAgZ2V0IHlqc1RleHQoKTogWS5UZXh0IHtcbiAgICBjb25zdCB5anNPYmplY3QgPSB0aGlzLl95anNPYmplY3RBdFBhdGhcblxuICAgIGlmICghKHlqc09iamVjdCBpbnN0YW5jZW9mIFkuVGV4dCkpIHtcbiAgICAgIHRocm93IGZhaWx1cmUoYFkuVGV4dCB3YXMgZXhwZWN0ZWQgYXQgcGF0aCAke0pTT04uc3RyaW5naWZ5KHRoaXMuX3lqc09iamVjdFBhdGgpfWApXG4gICAgfVxuXG4gICAgcmV0dXJuIHlqc09iamVjdFxuICB9XG5cbiAgLyoqXG4gICAqIEF0b20gdGhhdCBnZXRzIGNoYW5nZWQgd2hlbiB0aGUgYXNzb2NpYXRlZCBZLmpzIHRleHQgY2hhbmdlcy5cbiAgICovXG4gIHlqc1RleHRDaGFuZ2VkQXRvbSA9IGNyZWF0ZUF0b20oXCJ5anNUZXh0Q2hhbmdlZEF0b21cIilcblxuICAvKipcbiAgICogVGhlIHRleHQgdmFsdWUgb2YgdGhlIFlqcy5UZXh0IG9iamVjdC5cbiAgICogU2hvcnRjdXQgZm9yIGB5anNUZXh0LnRvU3RyaW5nKClgLCBidXQgY29tcHV0ZWQuXG4gICAqL1xuICBAY29tcHV0ZWRcbiAgZ2V0IHRleHQoKTogc3RyaW5nIHtcbiAgICB0aGlzLnlqc1RleHRDaGFuZ2VkQXRvbS5yZXBvcnRPYnNlcnZlZCgpXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1iYXNlLXRvLXN0cmluZ1xuICAgIHJldHVybiB0aGlzLnlqc1RleHQudG9TdHJpbmcoKVxuICB9XG5cbiAgcHJvdGVjdGVkIG9uSW5pdCgpIHtcbiAgICBjb25zdCBzaG91bGRSZXBsaWNhdGVUb1lqcyA9IChjdHg6IFlqc0JpbmRpbmdDb250ZXh0IHwgdW5kZWZpbmVkKTogY3R4IGlzIFlqc0JpbmRpbmdDb250ZXh0ID0+IHtcbiAgICAgIHJldHVybiAhIWN0eCAmJiAhIWN0eC5ib3VuZE9iamVjdCAmJiAhY3R4LmlzQXBwbHlpbmdZanNDaGFuZ2VzVG9Nb2J4S2V5c3RvbmVcbiAgICB9XG5cbiAgICBsZXQgcmVhcHBseURlbHRhc1RvWWpzVGV4dCA9IGZhbHNlXG4gICAgY29uc3QgbmV3RGVsdGFzOiBGcm96ZW48dW5rbm93bltdPltdID0gW11cblxuICAgIGxldCBkaXNwb3NlT2JzZXJ2ZURlbHRhTGlzdDogKCgpID0+IHZvaWQpIHwgdW5kZWZpbmVkXG5cbiAgICBjb25zdCBkaXNwb3NlUmVhY3Rpb25Ub0RlbHRhTGlzdFJlZkNoYW5nZSA9IHJlYWN0aW9uKFxuICAgICAgKCkgPT4gdGhpcy4kLmRlbHRhTGlzdCxcbiAgICAgIChkZWx0YUxpc3QpID0+IHtcbiAgICAgICAgZGlzcG9zZU9ic2VydmVEZWx0YUxpc3Q/LigpXG4gICAgICAgIGRpc3Bvc2VPYnNlcnZlRGVsdGFMaXN0ID0gdW5kZWZpbmVkXG5cbiAgICAgICAgZGlzcG9zZU9ic2VydmVEZWx0YUxpc3QgPSBvYnNlcnZlKGRlbHRhTGlzdCwgKGNoYW5nZSkgPT4ge1xuICAgICAgICAgIGlmIChyZWFwcGx5RGVsdGFzVG9ZanNUZXh0KSB7XG4gICAgICAgICAgICAvLyBhbHJlYWR5IGdvbm5hIHJlcGxhY2UgdGhlbSBhbGxcbiAgICAgICAgICAgIHJldHVyblxuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoIXNob3VsZFJlcGxpY2F0ZVRvWWpzKHlqc0JpbmRpbmdDb250ZXh0LmdldCh0aGlzKSkpIHtcbiAgICAgICAgICAgIC8vIHlqcyB0ZXh0IGlzIGFscmVhZHkgdXAgdG8gZGF0ZSB3aXRoIHRoZXNlIGNoYW5nZXNcbiAgICAgICAgICAgIHJldHVyblxuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmIChcbiAgICAgICAgICAgIGNoYW5nZS50eXBlID09PSBcInNwbGljZVwiICYmXG4gICAgICAgICAgICBjaGFuZ2UucmVtb3ZlZENvdW50ID09PSAwICYmXG4gICAgICAgICAgICBjaGFuZ2UuYWRkZWRDb3VudCA+IDAgJiZcbiAgICAgICAgICAgIGNoYW5nZS5pbmRleCA9PT0gdGhpcy5kZWx0YUxpc3QubGVuZ3RoXG4gICAgICAgICAgKSB7XG4gICAgICAgICAgICAvLyBvcHRpbWl6YXRpb24sIGp1c3QgYWRkaW5nIG5ldyBvbmVzIHRvIHRoZSBlbmRcbiAgICAgICAgICAgIG5ld0RlbHRhcy5wdXNoKC4uLmNoYW5nZS5hZGRlZClcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gYW55IG90aGVyIGNoYW5nZSwgd2UgbmVlZCB0byByZWFwcGx5IGFsbCBkZWx0YXNcbiAgICAgICAgICAgIHJlYXBwbHlEZWx0YXNUb1lqc1RleHQgPSB0cnVlXG4gICAgICAgICAgfVxuICAgICAgICB9KVxuICAgICAgfSxcbiAgICAgIHsgZmlyZUltbWVkaWF0ZWx5OiB0cnVlIH1cbiAgICApXG5cbiAgICBjb25zdCBkaXNwb3NlT25TbmFwc2hvdCA9IG9uU25hcHNob3QodGhpcywgKCkgPT4ge1xuICAgICAgdHJ5IHtcbiAgICAgICAgaWYgKHJlYXBwbHlEZWx0YXNUb1lqc1RleHQpIHtcbiAgICAgICAgICBjb25zdCBjdHggPSB5anNCaW5kaW5nQ29udGV4dC5nZXQodGhpcylcblxuICAgICAgICAgIGlmIChzaG91bGRSZXBsaWNhdGVUb1lqcyhjdHgpKSB7XG4gICAgICAgICAgICBjb25zdCB7IHlqc1RleHQgfSA9IHRoaXNcblxuICAgICAgICAgICAgY3R4Lnlqc0RvYy50cmFuc2FjdCgoKSA9PiB7XG4gICAgICAgICAgICAgIC8vIGRpZG4ndCBmaW5kIGEgYmV0dGVyIHdheSB0aGFuIHRoaXMgdG8gcmVhcHBseSBhbGwgZGVsdGFzXG4gICAgICAgICAgICAgIC8vIHdpdGhvdXQgaGF2aW5nIHRvIHJlLWNyZWF0ZSB0aGUgWS5UZXh0IG9iamVjdFxuICAgICAgICAgICAgICBpZiAoeWpzVGV4dC5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgeWpzVGV4dC5kZWxldGUoMCwgeWpzVGV4dC5sZW5ndGgpXG4gICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICB0aGlzLmRlbHRhTGlzdC5mb3JFYWNoKChmcm96ZW5EZWx0YXMpID0+IHtcbiAgICAgICAgICAgICAgICB5anNUZXh0LmFwcGx5RGVsdGEoZnJvemVuRGVsdGFzLmRhdGEpXG4gICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICB9LCBjdHgueWpzT3JpZ2luKVxuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmIChuZXdEZWx0YXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgIGNvbnN0IGN0eCA9IHlqc0JpbmRpbmdDb250ZXh0LmdldCh0aGlzKVxuXG4gICAgICAgICAgaWYgKHNob3VsZFJlcGxpY2F0ZVRvWWpzKGN0eCkpIHtcbiAgICAgICAgICAgIGNvbnN0IHsgeWpzVGV4dCB9ID0gdGhpc1xuXG4gICAgICAgICAgICBjdHgueWpzRG9jLnRyYW5zYWN0KCgpID0+IHtcbiAgICAgICAgICAgICAgbmV3RGVsdGFzLmZvckVhY2goKGZyb3plbkRlbHRhcykgPT4ge1xuICAgICAgICAgICAgICAgIHlqc1RleHQuYXBwbHlEZWx0YShmcm96ZW5EZWx0YXMuZGF0YSlcbiAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIH0sIGN0eC55anNPcmlnaW4pXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICByZWFwcGx5RGVsdGFzVG9ZanNUZXh0ID0gZmFsc2VcbiAgICAgICAgbmV3RGVsdGFzLmxlbmd0aCA9IDBcbiAgICAgIH1cbiAgICB9KVxuXG4gICAgY29uc3QgZGlwb3NlWWpzVGV4dENoYW5nZWRBdG9tID0gaG9va1lqc1RleHRDaGFuZ2VkQXRvbShcbiAgICAgICgpID0+IHRoaXMueWpzVGV4dCxcbiAgICAgIHRoaXMueWpzVGV4dENoYW5nZWRBdG9tXG4gICAgKVxuXG4gICAgcmV0dXJuICgpID0+IHtcbiAgICAgIGRpc3Bvc2VPblNuYXBzaG90KClcbiAgICAgIGRpc3Bvc2VSZWFjdGlvblRvRGVsdGFMaXN0UmVmQ2hhbmdlKClcbiAgICAgIGRpc3Bvc2VPYnNlcnZlRGVsdGFMaXN0Py4oKVxuICAgICAgZGlzcG9zZU9ic2VydmVEZWx0YUxpc3QgPSB1bmRlZmluZWRcblxuICAgICAgZGlwb3NlWWpzVGV4dENoYW5nZWRBdG9tKClcbiAgICB9XG4gIH1cbn1cblxuLy8gd2UgdXNlIHRoaXMgdHJpY2sganVzdCB0byBhdm9pZCBhIGJhYmVsIGJ1ZyB0aGF0IGNhdXNlcyBjbGFzc2VzIHVzZWQgaW5zaWRlIGNsYXNzZXMgbm90IHRvIGJlIG92ZXJyaWRlblxuLy8gYnkgdGhlIGRlY29yYXRvclxuY29uc3QgRGVjb3JhdGVkWWpzVGV4dE1vZGVsID0gWWpzVGV4dE1vZGVsXG5cbmZ1bmN0aW9uIGhvb2tZanNUZXh0Q2hhbmdlZEF0b20oZ2V0WWpzVGV4dDogKCkgPT4gWS5UZXh0LCB0ZXh0Q2hhbmdlZEF0b206IElBdG9tKSB7XG4gIGxldCBkaXNwb3NlT2JzZXJ2ZVlqc1RleHQ6ICgoKSA9PiB2b2lkKSB8IHVuZGVmaW5lZFxuXG4gIGNvbnN0IG9ic2VydmVGbiA9ICgpID0+IHtcbiAgICB0ZXh0Q2hhbmdlZEF0b20ucmVwb3J0Q2hhbmdlZCgpXG4gIH1cblxuICBjb25zdCBkaXNwb3NlUmVhY3Rpb25Ub1lUZXh0Q2hhbmdlID0gcmVhY3Rpb24oXG4gICAgKCkgPT4ge1xuICAgICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIGdldFlqc1RleHQoKVxuICAgICAgfSBjYXRjaCB7XG4gICAgICAgIHJldHVybiB1bmRlZmluZWRcbiAgICAgIH1cbiAgICB9LFxuICAgICh5anNUZXh0KSA9PiB7XG4gICAgICBkaXNwb3NlT2JzZXJ2ZVlqc1RleHQ/LigpXG4gICAgICBkaXNwb3NlT2JzZXJ2ZVlqc1RleHQgPSB1bmRlZmluZWRcblxuICAgICAgaWYgKHlqc1RleHQpIHtcbiAgICAgICAgeWpzVGV4dC5vYnNlcnZlKG9ic2VydmVGbilcblxuICAgICAgICBkaXNwb3NlT2JzZXJ2ZVlqc1RleHQgPSAoKSA9PiB7XG4gICAgICAgICAgeWpzVGV4dC51bm9ic2VydmUob2JzZXJ2ZUZuKVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHRleHRDaGFuZ2VkQXRvbS5yZXBvcnRDaGFuZ2VkKClcbiAgICB9LFxuICAgIHtcbiAgICAgIGZpcmVJbW1lZGlhdGVseTogdHJ1ZSxcbiAgICB9XG4gIClcblxuICByZXR1cm4gKCkgPT4ge1xuICAgIGRpc3Bvc2VSZWFjdGlvblRvWVRleHRDaGFuZ2UoKVxuICAgIGRpc3Bvc2VPYnNlcnZlWWpzVGV4dD8uKClcbiAgICBkaXNwb3NlT2JzZXJ2ZVlqc1RleHQgPSB1bmRlZmluZWRcbiAgfVxufVxuIiwiaW1wb3J0ICogYXMgWSBmcm9tIFwieWpzXCJcbmltcG9ydCB7IFlqc1RleHRNb2RlbCwgeWpzVGV4dE1vZGVsSWQgfSBmcm9tIFwiLi9ZanNUZXh0TW9kZWxcIlxuaW1wb3J0IHsgU25hcHNob3RPdXRPZiB9IGZyb20gXCJtb2J4LWtleXN0b25lXCJcbmltcG9ydCB7IFlqc0RhdGEgfSBmcm9tIFwiLi9jb252ZXJ0WWpzRGF0YVRvSnNvblwiXG5pbXBvcnQge1xuICBKc29uQXJyYXlXaXRoVW5kZWZpbmVkLFxuICBKc29uT2JqZWN0V2l0aFVuZGVmaW5lZCxcbiAgSnNvblByaW1pdGl2ZVdpdGhVbmRlZmluZWQsXG4gIEpzb25WYWx1ZVdpdGhVbmRlZmluZWQsXG59IGZyb20gXCJqc29uVHlwZXNcIlxuXG5mdW5jdGlvbiBpc0pzb25QcmltaXRpdmVXaXRoVW5kZWZpbmVkKHY6IEpzb25WYWx1ZVdpdGhVbmRlZmluZWQpOiB2IGlzIEpzb25QcmltaXRpdmVXaXRoVW5kZWZpbmVkIHtcbiAgY29uc3QgdCA9IHR5cGVvZiB2XG4gIHJldHVybiB0ID09PSBcInN0cmluZ1wiIHx8IHQgPT09IFwibnVtYmVyXCIgfHwgdCA9PT0gXCJib29sZWFuXCIgfHwgdiA9PT0gbnVsbCB8fCB2ID09PSB1bmRlZmluZWRcbn1cblxuZnVuY3Rpb24gaXNKc29uQXJyYXlXaXRoVW5kZWZpbmVkKHY6IEpzb25WYWx1ZVdpdGhVbmRlZmluZWQpOiB2IGlzIEpzb25BcnJheVdpdGhVbmRlZmluZWQge1xuICByZXR1cm4gQXJyYXkuaXNBcnJheSh2KVxufVxuXG5mdW5jdGlvbiBpc0pzb25PYmplY3RXaXRoVW5kZWZpbmVkKHY6IEpzb25WYWx1ZVdpdGhVbmRlZmluZWQpOiB2IGlzIEpzb25PYmplY3RXaXRoVW5kZWZpbmVkIHtcbiAgcmV0dXJuICFpc0pzb25BcnJheVdpdGhVbmRlZmluZWQodikgJiYgdHlwZW9mIHYgPT09IFwib2JqZWN0XCJcbn1cblxuLyoqXG4gKiBDb252ZXJ0cyBhIEpTT04gdmFsdWUgdG8gYSBZLmpzIGRhdGEgc3RydWN0dXJlLlxuICogT2JqZWN0cyBhcmUgY29udmVydGVkIHRvIFkuTWFwcywgYXJyYXlzIHRvIFkuQXJyYXlzLCBwcmltaXRpdmVzIGFyZSB1bnRvdWNoZWQuXG4gKiBGcm96ZW4gdmFsdWVzIGFyZSBhIHNwZWNpYWwgY2FzZSBhbmQgdGhleSBhcmUga2VwdCBhcyBpbW11dGFibGUgcGxhaW4gdmFsdWVzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gY29udmVydEpzb25Ub1lqc0RhdGEodjogSnNvblZhbHVlV2l0aFVuZGVmaW5lZCB8IHVuZGVmaW5lZCk6IFlqc0RhdGEge1xuICBpZiAodiA9PT0gdW5kZWZpbmVkIHx8IGlzSnNvblByaW1pdGl2ZVdpdGhVbmRlZmluZWQodikpIHtcbiAgICByZXR1cm4gdlxuICB9XG5cbiAgaWYgKGlzSnNvbkFycmF5V2l0aFVuZGVmaW5lZCh2KSkge1xuICAgIGNvbnN0IGFyciA9IG5ldyBZLkFycmF5KClcbiAgICBhcHBseUpzb25BcnJheVRvWUFycmF5KGFyciwgdilcbiAgICByZXR1cm4gYXJyIGFzIFlqc0RhdGFcbiAgfVxuXG4gIGlmIChpc0pzb25PYmplY3RXaXRoVW5kZWZpbmVkKHYpKSB7XG4gICAgaWYgKHYuJGZyb3plbiA9PT0gdHJ1ZSkge1xuICAgICAgLy8gZnJvemVuIHZhbHVlLCBzYXZlIGFzIGltbXV0YWJsZSBvYmplY3RcbiAgICAgIHJldHVybiB2XG4gICAgfVxuXG4gICAgaWYgKHYuJG1vZGVsVHlwZSA9PT0geWpzVGV4dE1vZGVsSWQpIHtcbiAgICAgIGNvbnN0IHRleHQgPSBuZXcgWS5UZXh0KClcbiAgICAgIGNvbnN0IHlqc1RleHRNb2RlbCA9IHYgYXMgdW5rbm93biBhcyBTbmFwc2hvdE91dE9mPFlqc1RleHRNb2RlbD5cbiAgICAgIHlqc1RleHRNb2RlbC5kZWx0YUxpc3QuZm9yRWFjaCgoZnJvemVuRGVsdGFzKSA9PiB7XG4gICAgICAgIHRleHQuYXBwbHlEZWx0YShmcm96ZW5EZWx0YXMuZGF0YSlcbiAgICAgIH0pXG4gICAgICByZXR1cm4gdGV4dFxuICAgIH1cblxuICAgIGNvbnN0IG1hcCA9IG5ldyBZLk1hcCgpXG4gICAgYXBwbHlKc29uT2JqZWN0VG9ZTWFwKG1hcCwgdilcbiAgICByZXR1cm4gbWFwIGFzIFlqc0RhdGFcbiAgfVxuXG4gIHRocm93IG5ldyBFcnJvcihgdW5zdXBwb3J0ZWQgdmFsdWUgdHlwZTogJHt2fWApXG59XG5cbi8qKlxuICogQXBwbGllcyBhIEpTT04gYXJyYXkgdG8gYSBZLkFycmF5LCB1c2luZyB0aGUgY29udmVydEpzb25Ub1lqc0RhdGEgdG8gY29udmVydCB0aGUgdmFsdWVzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gYXBwbHlKc29uQXJyYXlUb1lBcnJheShkZXN0OiBZLkFycmF5PHVua25vd24+LCBzb3VyY2U6IEpzb25BcnJheVdpdGhVbmRlZmluZWQpIHtcbiAgZGVzdC5wdXNoKHNvdXJjZS5tYXAoY29udmVydEpzb25Ub1lqc0RhdGEpKVxufVxuXG4vKipcbiAqIEFwcGxpZXMgYSBKU09OIG9iamVjdCB0byBhIFkuTWFwLCB1c2luZyB0aGUgY29udmVydEpzb25Ub1lqc0RhdGEgdG8gY29udmVydCB0aGUgdmFsdWVzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gYXBwbHlKc29uT2JqZWN0VG9ZTWFwKGRlc3Q6IFkuTWFwPHVua25vd24+LCBzb3VyY2U6IEpzb25PYmplY3RXaXRoVW5kZWZpbmVkKSB7XG4gIE9iamVjdC5lbnRyaWVzKHNvdXJjZSkuZm9yRWFjaCgoW2ssIHZdKSA9PiB7XG4gICAgZGVzdC5zZXQoaywgY29udmVydEpzb25Ub1lqc0RhdGEodikpXG4gIH0pXG59XG4iLCJpbXBvcnQgeyBQYXRjaCB9IGZyb20gXCJtb2J4LWtleXN0b25lXCJcbmltcG9ydCAqIGFzIFkgZnJvbSBcInlqc1wiXG5pbXBvcnQgeyBmYWlsdXJlIH0gZnJvbSBcIi4uL3V0aWxzL2Vycm9yXCJcbmltcG9ydCB7IGNvbnZlcnRKc29uVG9ZanNEYXRhIH0gZnJvbSBcIi4vY29udmVydEpzb25Ub1lqc0RhdGFcIlxuaW1wb3J0IHsgSnNvblZhbHVlV2l0aFVuZGVmaW5lZCB9IGZyb20gXCJqc29uVHlwZXNcIlxuXG5leHBvcnQgZnVuY3Rpb24gYXBwbHlNb2J4S2V5c3RvbmVQYXRjaFRvWWpzT2JqZWN0KHBhdGNoOiBQYXRjaCwgeWpzOiB1bmtub3duKTogdm9pZCB7XG4gIGlmIChwYXRjaC5wYXRoLmxlbmd0aCA+IDEpIHtcbiAgICBjb25zdCBba2V5LCAuLi5yZXN0XSA9IHBhdGNoLnBhdGhcblxuICAgIGlmICh5anMgaW5zdGFuY2VvZiBZLk1hcCkge1xuICAgICAgY29uc3QgY2hpbGQgPSB5anMuZ2V0KFN0cmluZyhrZXkpKSBhcyB1bmtub3duXG4gICAgICBpZiAoY2hpbGQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICB0aHJvdyBmYWlsdXJlKFxuICAgICAgICAgIGBpbnZhbGlkIHBhdGNoIHBhdGgsIGtleSBcIiR7a2V5fVwiIG5vdCBmb3VuZCBpbiBZanMgbWFwIC0gcGF0Y2g6ICR7SlNPTi5zdHJpbmdpZnkocGF0Y2gpfWBcbiAgICAgICAgKVxuICAgICAgfVxuICAgICAgYXBwbHlNb2J4S2V5c3RvbmVQYXRjaFRvWWpzT2JqZWN0KHsgLi4ucGF0Y2gsIHBhdGg6IHJlc3QgfSwgY2hpbGQpXG4gICAgfSBlbHNlIGlmICh5anMgaW5zdGFuY2VvZiBZLkFycmF5KSB7XG4gICAgICBjb25zdCBjaGlsZCA9IHlqcy5nZXQoTnVtYmVyKGtleSkpIGFzIHVua25vd25cbiAgICAgIGlmIChjaGlsZCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHRocm93IGZhaWx1cmUoXG4gICAgICAgICAgYGludmFsaWQgcGF0Y2ggcGF0aCwga2V5IFwiJHtrZXl9XCIgbm90IGZvdW5kIGluIFlqcyBhcnJheSAtIHBhdGNoOiAke0pTT04uc3RyaW5naWZ5KFxuICAgICAgICAgICAgcGF0Y2hcbiAgICAgICAgICApfWBcbiAgICAgICAgKVxuICAgICAgfVxuICAgICAgYXBwbHlNb2J4S2V5c3RvbmVQYXRjaFRvWWpzT2JqZWN0KHsgLi4ucGF0Y2gsIHBhdGg6IHJlc3QgfSwgY2hpbGQpXG4gICAgfSBlbHNlIGlmICh5anMgaW5zdGFuY2VvZiBZLlRleHQpIHtcbiAgICAgIC8vIGNoYW5nZXMgdG8gZGVsdGFMaXN0IHdpbGwgYmUgaGFuZGxlZCBieSB0aGUgYXJyYXkgb2JzZXJ2ZSBpbiB0aGUgWWpzVGV4dE1vZGVsIGNsYXNzXG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IGZhaWx1cmUoXG4gICAgICAgIGBpbnZhbGlkIHBhdGNoIHBhdGgsIGtleSBcIiR7a2V5fVwiIG5vdCBmb3VuZCBpbiB1bmtub3duIFlqcyBvYmplY3QgLSBwYXRjaDogJHtKU09OLnN0cmluZ2lmeShcbiAgICAgICAgICBwYXRjaFxuICAgICAgICApfWBcbiAgICAgIClcbiAgICB9XG4gIH0gZWxzZSBpZiAocGF0Y2gucGF0aC5sZW5ndGggPT09IDEpIHtcbiAgICBpZiAoeWpzIGluc3RhbmNlb2YgWS5NYXApIHtcbiAgICAgIGNvbnN0IGtleSA9IFN0cmluZyhwYXRjaC5wYXRoWzBdKVxuXG4gICAgICBzd2l0Y2ggKHBhdGNoLm9wKSB7XG4gICAgICAgIGNhc2UgXCJhZGRcIjpcbiAgICAgICAgY2FzZSBcInJlcGxhY2VcIjoge1xuICAgICAgICAgIHlqcy5zZXQoa2V5LCBjb252ZXJ0SnNvblRvWWpzRGF0YShwYXRjaC52YWx1ZSBhcyBKc29uVmFsdWVXaXRoVW5kZWZpbmVkKSlcbiAgICAgICAgICBicmVha1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgXCJyZW1vdmVcIjoge1xuICAgICAgICAgIHlqcy5kZWxldGUoa2V5KVxuICAgICAgICAgIGJyZWFrXG4gICAgICAgIH1cbiAgICAgICAgZGVmYXVsdDoge1xuICAgICAgICAgIHRocm93IGZhaWx1cmUoYGludmFsaWQgcGF0Y2ggb3BlcmF0aW9uIGZvciBtYXBgKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBlbHNlIGlmICh5anMgaW5zdGFuY2VvZiBZLkFycmF5KSB7XG4gICAgICBjb25zdCBrZXkgPSBwYXRjaC5wYXRoWzBdXG5cbiAgICAgIHN3aXRjaCAocGF0Y2gub3ApIHtcbiAgICAgICAgY2FzZSBcInJlcGxhY2VcIjoge1xuICAgICAgICAgIGlmIChrZXkgPT09IFwibGVuZ3RoXCIpIHtcbiAgICAgICAgICAgIGNvbnN0IG5ld0xlbmd0aCA9IHBhdGNoLnZhbHVlIGFzIG51bWJlclxuICAgICAgICAgICAgaWYgKHlqcy5sZW5ndGggPiBuZXdMZW5ndGgpIHtcbiAgICAgICAgICAgICAgY29uc3QgdG9EZWxldGUgPSB5anMubGVuZ3RoIC0gbmV3TGVuZ3RoXG4gICAgICAgICAgICAgIHlqcy5kZWxldGUobmV3TGVuZ3RoLCB0b0RlbGV0ZSlcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoeWpzLmxlbmd0aCA8IHBhdGNoLnZhbHVlKSB7XG4gICAgICAgICAgICAgIGNvbnN0IHRvSW5zZXJ0ID0gcGF0Y2gudmFsdWUgLSB5anMubGVuZ3RoXG4gICAgICAgICAgICAgIHlqcy5pbnNlcnQoeWpzLmxlbmd0aCwgQXJyYXkodG9JbnNlcnQpLmZpbGwodW5kZWZpbmVkKSlcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgeWpzLmRlbGV0ZShOdW1iZXIoa2V5KSlcbiAgICAgICAgICAgIHlqcy5pbnNlcnQoTnVtYmVyKGtleSksIFtjb252ZXJ0SnNvblRvWWpzRGF0YShwYXRjaC52YWx1ZSBhcyBKc29uVmFsdWVXaXRoVW5kZWZpbmVkKV0pXG4gICAgICAgICAgfVxuICAgICAgICAgIGJyZWFrXG4gICAgICAgIH1cbiAgICAgICAgY2FzZSBcImFkZFwiOiB7XG4gICAgICAgICAgeWpzLmluc2VydChOdW1iZXIoa2V5KSwgW2NvbnZlcnRKc29uVG9ZanNEYXRhKHBhdGNoLnZhbHVlIGFzIEpzb25WYWx1ZVdpdGhVbmRlZmluZWQpXSlcbiAgICAgICAgICBicmVha1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgXCJyZW1vdmVcIjoge1xuICAgICAgICAgIHlqcy5kZWxldGUoTnVtYmVyKGtleSkpXG4gICAgICAgICAgYnJlYWtcbiAgICAgICAgfVxuICAgICAgICBkZWZhdWx0OiB7XG4gICAgICAgICAgdGhyb3cgZmFpbHVyZShgaW52YWxpZCBwYXRjaCBvcGVyYXRpb24gZm9yIGFycmF5YClcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoeWpzIGluc3RhbmNlb2YgWS5UZXh0KSB7XG4gICAgICAvLyBpbml0aWFsaXphdGlvbiBvZiBhIFlqc1RleHRNb2RlbCwgZG8gbm90aGluZ1xuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyBmYWlsdXJlKFxuICAgICAgICBgaW52YWxpZCBwYXRjaCBwYXRoLCB0aGUgWWpzIG9iamVjdCBpcyBvZiBhbiB1bmtvd24gdHlwZSwgc28ga2V5IFwiJHtTdHJpbmcocGF0Y2gucGF0aFswXSl9XCIgY2Fubm90IGJlIGZvdW5kIGluIGl0YFxuICAgICAgKVxuICAgIH1cbiAgfSBlbHNlIHtcbiAgICB0aHJvdyBmYWlsdXJlKGBpbnZhbGlkIHBhdGNoIHBhdGgsIGl0IGNhbm5vdCBiZSBlbXB0eWApXG4gIH1cbn1cbiIsImltcG9ydCB7IG1vZGVsU25hcHNob3RPdXRXaXRoTWV0YWRhdGEgfSBmcm9tIFwibW9ieC1rZXlzdG9uZVwiXG5pbXBvcnQgKiBhcyBZIGZyb20gXCJ5anNcIlxuaW1wb3J0IHsgSnNvbk9iamVjdFdpdGhVbmRlZmluZWQsIEpzb25WYWx1ZVdpdGhVbmRlZmluZWQgfSBmcm9tIFwiLi4vanNvblR5cGVzXCJcbmltcG9ydCB7IFlqc1RleHRNb2RlbCB9IGZyb20gXCIuL1lqc1RleHRNb2RlbFwiXG5cbmV4cG9ydCB0eXBlIFlqc0RhdGEgPSBZLkFycmF5PFlqc0RhdGE+IHwgWS5NYXA8WWpzRGF0YT4gfCBZLlRleHQgfCBKc29uVmFsdWVXaXRoVW5kZWZpbmVkXG5cbmV4cG9ydCBmdW5jdGlvbiBjb252ZXJ0WWpzRGF0YVRvSnNvbih5anNEYXRhOiBZanNEYXRhKTogSnNvblZhbHVlV2l0aFVuZGVmaW5lZCB7XG4gIGlmICh5anNEYXRhIGluc3RhbmNlb2YgWS5BcnJheSkge1xuICAgIHJldHVybiB5anNEYXRhLm1hcCgodikgPT4gY29udmVydFlqc0RhdGFUb0pzb24odikpXG4gIH1cblxuICBpZiAoeWpzRGF0YSBpbnN0YW5jZW9mIFkuTWFwKSB7XG4gICAgY29uc3Qgb2JqOiBKc29uT2JqZWN0V2l0aFVuZGVmaW5lZCA9IHt9XG4gICAgeWpzRGF0YS5mb3JFYWNoKCh2LCBrKSA9PiB7XG4gICAgICBvYmpba10gPSBjb252ZXJ0WWpzRGF0YVRvSnNvbih2KVxuICAgIH0pXG4gICAgcmV0dXJuIG9ialxuICB9XG5cbiAgaWYgKHlqc0RhdGEgaW5zdGFuY2VvZiBZLlRleHQpIHtcbiAgICBjb25zdCBkZWx0YXMgPSB5anNEYXRhLnRvRGVsdGEoKSBhcyB1bmtub3duW11cblxuICAgIHJldHVybiBtb2RlbFNuYXBzaG90T3V0V2l0aE1ldGFkYXRhKFlqc1RleHRNb2RlbCwge1xuICAgICAgZGVsdGFMaXN0OiBkZWx0YXMubGVuZ3RoID4gMCA/IFt7ICRmcm96ZW46IHRydWUsIGRhdGE6IGRlbHRhcyB9XSA6IFtdLFxuICAgIH0pIGFzIHVua25vd24gYXMgSnNvblZhbHVlV2l0aFVuZGVmaW5lZFxuICB9XG5cbiAgLy8gYXNzdW1lIGl0J3MgYSBwcmltaXRpdmVcbiAgcmV0dXJuIHlqc0RhdGFcbn1cbiIsImltcG9ydCB7IFBhdGNoIH0gZnJvbSBcIm1vYngta2V5c3RvbmVcIlxuaW1wb3J0ICogYXMgWSBmcm9tIFwieWpzXCJcbmltcG9ydCB7XG4gIEpzb25BcnJheVdpdGhVbmRlZmluZWQsXG4gIEpzb25PYmplY3RXaXRoVW5kZWZpbmVkLFxuICBKc29uVmFsdWVXaXRoVW5kZWZpbmVkLFxufSBmcm9tIFwiLi4vanNvblR5cGVzXCJcbmltcG9ydCB7IGZhaWx1cmUgfSBmcm9tIFwiLi4vdXRpbHMvZXJyb3JcIlxuXG5leHBvcnQgZnVuY3Rpb24gY29udmVydFlqc0V2ZW50VG9QYXRjaGVzKGV2ZW50OiBZLllFdmVudDxhbnk+KTogUGF0Y2hbXSB7XG4gIGNvbnN0IHBhdGNoZXM6IFBhdGNoW10gPSBbXVxuXG4gIGlmIChldmVudCBpbnN0YW5jZW9mIFkuWU1hcEV2ZW50KSB7XG4gICAgY29uc3Qgc291cmNlID0gZXZlbnQudGFyZ2V0XG5cbiAgICBldmVudC5jaGFuZ2VzLmtleXMuZm9yRWFjaCgoY2hhbmdlLCBrZXkpID0+IHtcbiAgICAgIGNvbnN0IHBhdGggPSBbLi4uZXZlbnQucGF0aCwga2V5XVxuXG4gICAgICBzd2l0Y2ggKGNoYW5nZS5hY3Rpb24pIHtcbiAgICAgICAgY2FzZSBcImFkZFwiOlxuICAgICAgICAgIHBhdGNoZXMucHVzaCh7XG4gICAgICAgICAgICBvcDogXCJhZGRcIixcbiAgICAgICAgICAgIHBhdGgsXG4gICAgICAgICAgICB2YWx1ZTogdG9QbGFpblZhbHVlKHNvdXJjZS5nZXQoa2V5KSksXG4gICAgICAgICAgfSlcbiAgICAgICAgICBicmVha1xuXG4gICAgICAgIGNhc2UgXCJ1cGRhdGVcIjpcbiAgICAgICAgICBwYXRjaGVzLnB1c2goe1xuICAgICAgICAgICAgb3A6IFwicmVwbGFjZVwiLFxuICAgICAgICAgICAgcGF0aCxcbiAgICAgICAgICAgIHZhbHVlOiB0b1BsYWluVmFsdWUoc291cmNlLmdldChrZXkpKSxcbiAgICAgICAgICB9KVxuICAgICAgICAgIGJyZWFrXG5cbiAgICAgICAgY2FzZSBcImRlbGV0ZVwiOlxuICAgICAgICAgIHBhdGNoZXMucHVzaCh7XG4gICAgICAgICAgICBvcDogXCJyZW1vdmVcIixcbiAgICAgICAgICAgIHBhdGgsXG4gICAgICAgICAgfSlcbiAgICAgICAgICBicmVha1xuXG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgdGhyb3cgZmFpbHVyZShgdW5zdXBwb3J0ZWQgWWpzIG1hcCBldmVudCBhY3Rpb246ICR7Y2hhbmdlLmFjdGlvbn1gKVxuICAgICAgfVxuICAgIH0pXG4gIH0gZWxzZSBpZiAoZXZlbnQgaW5zdGFuY2VvZiBZLllBcnJheUV2ZW50KSB7XG4gICAgbGV0IHJldGFpbiA9IDBcbiAgICBldmVudC5jaGFuZ2VzLmRlbHRhLmZvckVhY2goKGNoYW5nZSkgPT4ge1xuICAgICAgaWYgKGNoYW5nZS5yZXRhaW4pIHtcbiAgICAgICAgcmV0YWluICs9IGNoYW5nZS5yZXRhaW5cbiAgICAgIH1cblxuICAgICAgaWYgKGNoYW5nZS5kZWxldGUpIHtcbiAgICAgICAgLy8gcmVtb3ZlIFggaXRlbXMgYXQgcmV0YWluIHBvc2l0aW9uXG4gICAgICAgIGNvbnN0IHBhdGggPSBbLi4uZXZlbnQucGF0aCwgcmV0YWluXVxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNoYW5nZS5kZWxldGU7IGkrKykge1xuICAgICAgICAgIHBhdGNoZXMucHVzaCh7XG4gICAgICAgICAgICBvcDogXCJyZW1vdmVcIixcbiAgICAgICAgICAgIHBhdGgsXG4gICAgICAgICAgfSlcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAoY2hhbmdlLmluc2VydCkge1xuICAgICAgICBjb25zdCBuZXdWYWx1ZXMgPSBBcnJheS5pc0FycmF5KGNoYW5nZS5pbnNlcnQpID8gY2hhbmdlLmluc2VydCA6IFtjaGFuZ2UuaW5zZXJ0XVxuICAgICAgICBuZXdWYWx1ZXMuZm9yRWFjaCgodikgPT4ge1xuICAgICAgICAgIGNvbnN0IHBhdGggPSBbLi4uZXZlbnQucGF0aCwgcmV0YWluXVxuICAgICAgICAgIHBhdGNoZXMucHVzaCh7XG4gICAgICAgICAgICBvcDogXCJhZGRcIixcbiAgICAgICAgICAgIHBhdGgsXG4gICAgICAgICAgICB2YWx1ZTogdG9QbGFpblZhbHVlKHYpLFxuICAgICAgICAgIH0pXG4gICAgICAgICAgcmV0YWluKytcbiAgICAgICAgfSlcbiAgICAgIH1cbiAgICB9KVxuICB9IGVsc2UgaWYgKGV2ZW50IGluc3RhbmNlb2YgWS5ZVGV4dEV2ZW50KSB7XG4gICAgY29uc3QgcGF0aCA9IFsuLi5ldmVudC5wYXRoLCBcImRlbHRhTGlzdFwiLCAtMSAvKiBsYXN0IGl0ZW0gKi9dXG4gICAgcGF0Y2hlcy5wdXNoKHtcbiAgICAgIG9wOiBcImFkZFwiLFxuICAgICAgcGF0aCxcbiAgICAgIHZhbHVlOiB7ICRmcm96ZW46IHRydWUsIGRhdGE6IGV2ZW50LmRlbHRhIH0sXG4gICAgfSlcbiAgfVxuXG4gIHJldHVybiBwYXRjaGVzXG59XG5cbmZ1bmN0aW9uIHRvUGxhaW5WYWx1ZSh2OiBZLk1hcDxhbnk+IHwgWS5BcnJheTxhbnk+IHwgSnNvblZhbHVlV2l0aFVuZGVmaW5lZCkge1xuICBpZiAodiBpbnN0YW5jZW9mIFkuTWFwIHx8IHYgaW5zdGFuY2VvZiBZLkFycmF5KSB7XG4gICAgcmV0dXJuIHYudG9KU09OKCkgYXMgSnNvbk9iamVjdFdpdGhVbmRlZmluZWQgfCBKc29uQXJyYXlXaXRoVW5kZWZpbmVkXG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIHZcbiAgfVxufVxuIiwiaW1wb3J0IHsgYWN0aW9uIH0gZnJvbSBcIm1vYnhcIlxuaW1wb3J0IHtcbiAgQW55RGF0YU1vZGVsLFxuICBBbnlNb2RlbCxcbiAgQW55U3RhbmRhcmRUeXBlLFxuICBNb2RlbENsYXNzLFxuICBQYXRjaCxcbiAgU25hcHNob3RJbk9mLFxuICBUeXBlVG9EYXRhLFxuICBhcHBseVBhdGNoZXMsXG4gIGZyb21TbmFwc2hvdCxcbiAgZ2V0UGFyZW50VG9DaGlsZFBhdGgsXG4gIG9uR2xvYmFsUGF0Y2hlcyxcbiAgb25QYXRjaGVzLFxuICBvblNuYXBzaG90LFxufSBmcm9tIFwibW9ieC1rZXlzdG9uZVwiXG5pbXBvcnQgKiBhcyBZIGZyb20gXCJ5anNcIlxuaW1wb3J0IHsgZ2V0WWpzQ29sbGVjdGlvbkF0b20gfSBmcm9tIFwiLi4vdXRpbHMvZ2V0T3JDcmVhdGVZanNDb2xsZWN0aW9uQXRvbVwiXG5pbXBvcnQgeyBhcHBseU1vYnhLZXlzdG9uZVBhdGNoVG9ZanNPYmplY3QgfSBmcm9tIFwiLi9hcHBseU1vYnhLZXlzdG9uZVBhdGNoVG9ZanNPYmplY3RcIlxuaW1wb3J0IHsgWWpzRGF0YSwgY29udmVydFlqc0RhdGFUb0pzb24gfSBmcm9tIFwiLi9jb252ZXJ0WWpzRGF0YVRvSnNvblwiXG5pbXBvcnQgeyBjb252ZXJ0WWpzRXZlbnRUb1BhdGNoZXMgfSBmcm9tIFwiLi9jb252ZXJ0WWpzRXZlbnRUb1BhdGNoZXNcIlxuaW1wb3J0IHsgWWpzQmluZGluZ0NvbnRleHQsIHlqc0JpbmRpbmdDb250ZXh0IH0gZnJvbSBcIi4veWpzQmluZGluZ0NvbnRleHRcIlxuXG4vKipcbiAqIENyZWF0ZXMgYSBiaWRpcmVjdGlvbmFsIGJpbmRpbmcgYmV0d2VlbiBhIFkuanMgZGF0YSBzdHJ1Y3R1cmUgYW5kIGEgbW9ieC1rZXlzdG9uZSBtb2RlbC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGJpbmRZanNUb01vYnhLZXlzdG9uZTxcbiAgVFR5cGUgZXh0ZW5kcyBBbnlTdGFuZGFyZFR5cGUgfCBNb2RlbENsYXNzPEFueU1vZGVsPiB8IE1vZGVsQ2xhc3M8QW55RGF0YU1vZGVsPixcbj4oe1xuICB5anNEb2MsXG4gIHlqc09iamVjdCxcbiAgbW9ieEtleXN0b25lVHlwZSxcbn06IHtcbiAgLyoqXG4gICAqIFRoZSBZLmpzIGRvY3VtZW50LlxuICAgKi9cbiAgeWpzRG9jOiBZLkRvY1xuICAvKipcbiAgICogVGhlIGJvdW5kIFkuanMgZGF0YSBzdHJ1Y3R1cmUuXG4gICAqL1xuICB5anNPYmplY3Q6IFkuTWFwPHVua25vd24+IHwgWS5BcnJheTx1bmtub3duPiB8IFkuVGV4dFxuICAvKipcbiAgICogVGhlIG1vYngta2V5c3RvbmUgbW9kZWwgdHlwZS5cbiAgICovXG4gIG1vYnhLZXlzdG9uZVR5cGU6IFRUeXBlXG59KToge1xuICAvKipcbiAgICogVGhlIGJvdW5kIG1vYngta2V5c3RvbmUgaW5zdGFuY2UuXG4gICAqL1xuICBib3VuZE9iamVjdDogVHlwZVRvRGF0YTxUVHlwZT5cbiAgLyoqXG4gICAqIERpc3Bvc2VzIHRoZSBiaW5kaW5nLlxuICAgKi9cbiAgZGlzcG9zZTogKCkgPT4gdm9pZFxuICAvKipcbiAgICogVGhlIFkuanMgb3JpZ2luIHN5bWJvbCB1c2VkIGZvciBiaW5kaW5nIHRyYW5zYWN0aW9ucy5cbiAgICovXG4gIHlqc09yaWdpbjogc3ltYm9sXG59IHtcbiAgY29uc3QgeWpzT3JpZ2luID0gU3ltYm9sKFwiYmluZFlqc1RvTW9ieEtleXN0b25lVHJhbnNhY3Rpb25PcmlnaW5cIilcblxuICBsZXQgYXBwbHlpbmdZanNDaGFuZ2VzVG9Nb2J4S2V5c3RvbmUgPSAwXG5cbiAgY29uc3QgYmluZGluZ0NvbnRleHQ6IFlqc0JpbmRpbmdDb250ZXh0ID0ge1xuICAgIHlqc0RvYyxcbiAgICB5anNPYmplY3QsXG4gICAgbW9ieEtleXN0b25lVHlwZSxcbiAgICB5anNPcmlnaW4sXG4gICAgYm91bmRPYmplY3Q6IHVuZGVmaW5lZCwgLy8gbm90IHlldCBjcmVhdGVkXG5cbiAgICBnZXQgaXNBcHBseWluZ1lqc0NoYW5nZXNUb01vYnhLZXlzdG9uZSgpIHtcbiAgICAgIHJldHVybiBhcHBseWluZ1lqc0NoYW5nZXNUb01vYnhLZXlzdG9uZSA+IDBcbiAgICB9LFxuICB9XG5cbiAgY29uc3QgeWpzSnNvbiA9IGNvbnZlcnRZanNEYXRhVG9Kc29uKHlqc09iamVjdCBhcyBZanNEYXRhKVxuXG4gIGNvbnN0IGluaXRpYWxpemF0aW9uR2xvYmFsUGF0Y2hlczogeyB0YXJnZXQ6IG9iamVjdDsgcGF0Y2hlczogUGF0Y2hbXSB9W10gPSBbXVxuXG4gIGNvbnN0IGNyZWF0ZUJvdW5kT2JqZWN0ID0gKCkgPT4ge1xuICAgIGNvbnN0IGRpc3Bvc2VPbkdsb2JhbFBhdGNoZXMgPSBvbkdsb2JhbFBhdGNoZXMoKHRhcmdldCwgcGF0Y2hlcykgPT4ge1xuICAgICAgaW5pdGlhbGl6YXRpb25HbG9iYWxQYXRjaGVzLnB1c2goeyB0YXJnZXQsIHBhdGNoZXMgfSlcbiAgICB9KVxuXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGJvdW5kT2JqZWN0ID0geWpzQmluZGluZ0NvbnRleHQuYXBwbHkoXG4gICAgICAgICgpID0+IGZyb21TbmFwc2hvdChtb2J4S2V5c3RvbmVUeXBlLCB5anNKc29uIGFzIHVua25vd24gYXMgU25hcHNob3RJbk9mPFR5cGVUb0RhdGE8VFR5cGU+PiksXG4gICAgICAgIGJpbmRpbmdDb250ZXh0XG4gICAgICApXG4gICAgICB5anNCaW5kaW5nQ29udGV4dC5zZXQoYm91bmRPYmplY3QsIHsgLi4uYmluZGluZ0NvbnRleHQsIGJvdW5kT2JqZWN0IH0pXG4gICAgICByZXR1cm4gYm91bmRPYmplY3RcbiAgICB9IGZpbmFsbHkge1xuICAgICAgZGlzcG9zZU9uR2xvYmFsUGF0Y2hlcygpXG4gICAgfVxuICB9XG5cbiAgY29uc3QgYm91bmRPYmplY3QgPSBjcmVhdGVCb3VuZE9iamVjdCgpXG5cbiAgLy8gYmluZCBhbnkgY2hhbmdlcyBmcm9tIHlqcyB0byBtb2J4LWtleXN0b25lXG4gIGNvbnN0IG9ic2VydmVEZWVwQ2IgPSBhY3Rpb24oKGV2ZW50czogWS5ZRXZlbnQ8YW55PltdKSA9PiB7XG4gICAgY29uc3QgcGF0Y2hlczogUGF0Y2hbXSA9IFtdXG4gICAgZXZlbnRzLmZvckVhY2goKGV2ZW50KSA9PiB7XG4gICAgICBpZiAoZXZlbnQudHJhbnNhY3Rpb24ub3JpZ2luICE9PSB5anNPcmlnaW4pIHtcbiAgICAgICAgcGF0Y2hlcy5wdXNoKC4uLmNvbnZlcnRZanNFdmVudFRvUGF0Y2hlcyhldmVudCkpXG4gICAgICB9XG5cbiAgICAgIGlmIChldmVudC50YXJnZXQgaW5zdGFuY2VvZiBZLk1hcCB8fCBldmVudC50YXJnZXQgaW5zdGFuY2VvZiBZLkFycmF5KSB7XG4gICAgICAgIGdldFlqc0NvbGxlY3Rpb25BdG9tKGV2ZW50LnRhcmdldCk/LnJlcG9ydENoYW5nZWQoKVxuICAgICAgfVxuICAgIH0pXG5cbiAgICBpZiAocGF0Y2hlcy5sZW5ndGggPiAwKSB7XG4gICAgICBhcHBseWluZ1lqc0NoYW5nZXNUb01vYnhLZXlzdG9uZSsrXG4gICAgICB0cnkge1xuICAgICAgICBhcHBseVBhdGNoZXMoYm91bmRPYmplY3QsIHBhdGNoZXMpXG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICBhcHBseWluZ1lqc0NoYW5nZXNUb01vYnhLZXlzdG9uZS0tXG4gICAgICB9XG4gICAgfVxuICB9KVxuXG4gIHlqc09iamVjdC5vYnNlcnZlRGVlcChvYnNlcnZlRGVlcENiKVxuXG4gIC8vIGJpbmQgYW55IGNoYW5nZXMgZnJvbSBtb2J4LWtleXN0b25lIHRvIHlqc1xuICBsZXQgcGVuZGluZ0FycmF5T2ZBcnJheU9mUGF0Y2hlczogUGF0Y2hbXVtdID0gW11cbiAgY29uc3QgZGlzcG9zZU9uUGF0Y2hlcyA9IG9uUGF0Y2hlcyhib3VuZE9iamVjdCwgKHBhdGNoZXMpID0+IHtcbiAgICBpZiAoYXBwbHlpbmdZanNDaGFuZ2VzVG9Nb2J4S2V5c3RvbmUgPiAwKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBwZW5kaW5nQXJyYXlPZkFycmF5T2ZQYXRjaGVzLnB1c2gocGF0Y2hlcylcbiAgfSlcblxuICAvLyB0aGlzIGlzIG9ubHkgdXNlZCBzbyB3ZSBjYW4gdHJhbnNhY3QgYWxsIHBhdGNoZXMgdG8gdGhlIHNuYXBzaG90IGJvdW5kYXJ5XG4gIGNvbnN0IGRpc3Bvc2VPblNuYXBzaG90ID0gb25TbmFwc2hvdChib3VuZE9iamVjdCwgKCkgPT4ge1xuICAgIGlmIChwZW5kaW5nQXJyYXlPZkFycmF5T2ZQYXRjaGVzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgY29uc3QgYXJyYXlPZkFycmF5T2ZQYXRjaGVzID0gcGVuZGluZ0FycmF5T2ZBcnJheU9mUGF0Y2hlc1xuICAgIHBlbmRpbmdBcnJheU9mQXJyYXlPZlBhdGNoZXMgPSBbXVxuXG4gICAgeWpzRG9jLnRyYW5zYWN0KCgpID0+IHtcbiAgICAgIGFycmF5T2ZBcnJheU9mUGF0Y2hlcy5mb3JFYWNoKChhcnJheU9mUGF0Y2hlcykgPT4ge1xuICAgICAgICBhcnJheU9mUGF0Y2hlcy5mb3JFYWNoKChwYXRjaCkgPT4ge1xuICAgICAgICAgIGFwcGx5TW9ieEtleXN0b25lUGF0Y2hUb1lqc09iamVjdChwYXRjaCwgeWpzT2JqZWN0KVxuICAgICAgICB9KVxuICAgICAgfSlcbiAgICB9LCB5anNPcmlnaW4pXG4gIH0pXG5cbiAgLy8gc3luYyBpbml0aWFsIHBhdGNoZXMsIHRoYXQgbWlnaHQgaW5jbHVkZSBzZXR0aW5nIGRlZmF1bHRzLCBJRHMsIGV0Y1xuICB5anNEb2MudHJhbnNhY3QoKCkgPT4ge1xuICAgIC8vIHdlIG5lZWQgdG8gc2tpcCBpbml0aWFsaXphdGlvbnMgdW50aWwgd2UgaGl0IHRoZSBpbml0aWFsaXphdGlvbiBvZiB0aGUgYm91bmQgb2JqZWN0XG4gICAgLy8gdGhpcyBpcyBiZWNhdXNlIGRlZmF1bHQgb2JqZWN0cyBtaWdodCBiZSBjcmVhdGVkIGFuZCBpbml0aWFsaXplZCBiZWZvcmUgdGhlIG1haW4gb2JqZWN0XG4gICAgLy8gYnV0IHdlIGp1c3QgbmVlZCB0byBjYXRjaCB3aGVuIHRob3NlIGFyZSBhY3R1YWxseSBhc3NpZ25lZCB0byB0aGUgYm91bmQgb2JqZWN0XG4gICAgbGV0IGJvdW5kT2JqZWN0Rm91bmQgPSBmYWxzZVxuXG4gICAgaW5pdGlhbGl6YXRpb25HbG9iYWxQYXRjaGVzLmZvckVhY2goKHsgdGFyZ2V0LCBwYXRjaGVzIH0pID0+IHtcbiAgICAgIGlmICghYm91bmRPYmplY3RGb3VuZCkge1xuICAgICAgICBpZiAodGFyZ2V0ICE9PSBib3VuZE9iamVjdCkge1xuICAgICAgICAgIHJldHVybiAvLyBza2lwXG4gICAgICAgIH1cbiAgICAgICAgYm91bmRPYmplY3RGb3VuZCA9IHRydWVcbiAgICAgIH1cblxuICAgICAgY29uc3QgcGFyZW50VG9DaGlsZFBhdGggPSBnZXRQYXJlbnRUb0NoaWxkUGF0aChib3VuZE9iamVjdCwgdGFyZ2V0KVxuICAgICAgLy8gdGhpcyBpcyB1bmRlZmluZWQgb25seSBpZiB0YXJnZXQgaXMgbm90IGEgY2hpbGQgb2YgYm91bmRNb2RlbFxuICAgICAgaWYgKHBhcmVudFRvQ2hpbGRQYXRoICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgcGF0Y2hlcy5mb3JFYWNoKChwYXRjaCkgPT4ge1xuICAgICAgICAgIGFwcGx5TW9ieEtleXN0b25lUGF0Y2hUb1lqc09iamVjdChcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgLi4ucGF0Y2gsXG4gICAgICAgICAgICAgIHBhdGg6IFsuLi5wYXJlbnRUb0NoaWxkUGF0aCwgLi4ucGF0Y2gucGF0aF0sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgeWpzT2JqZWN0XG4gICAgICAgICAgKVxuICAgICAgICB9KVxuICAgICAgfVxuICAgIH0pXG4gIH0sIHlqc09yaWdpbilcblxuICByZXR1cm4ge1xuICAgIGJvdW5kT2JqZWN0LFxuICAgIGRpc3Bvc2U6ICgpID0+IHtcbiAgICAgIGRpc3Bvc2VPblBhdGNoZXMoKVxuICAgICAgZGlzcG9zZU9uU25hcHNob3QoKVxuICAgICAgeWpzT2JqZWN0LnVub2JzZXJ2ZURlZXAob2JzZXJ2ZURlZXBDYilcbiAgICB9LFxuICAgIHlqc09yaWdpbixcbiAgfVxufVxuIl0sIm5hbWVzIjpbImNyZWF0ZUNvbnRleHQiLCJjcmVhdGVBdG9tIiwiWSIsInR5cGVzIiwiWWpzVGV4dE1vZGVsIiwiTW9kZWwiLCJ0UHJvcCIsImZyb3plbiIsImdldFBhcmVudFRvQ2hpbGRQYXRoIiwicmVhY3Rpb24iLCJvYnNlcnZlIiwib25TbmFwc2hvdCIsImNvbXB1dGVkIiwiZXhwb3J0cyIsIm1vZGVsIiwibW9kZWxTbmFwc2hvdE91dFdpdGhNZXRhZGF0YSIsIm9uR2xvYmFsUGF0Y2hlcyIsImJvdW5kT2JqZWN0IiwiZnJvbVNuYXBzaG90IiwiYWN0aW9uIiwiYXBwbHlQYXRjaGVzIiwib25QYXRjaGVzIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztFQUdNLE1BQU8sNkJBQTZCLE1BQUs7QUFBQSxJQUM3QyxZQUFZLEtBQVc7QUFDckIsWUFBTSxHQUFHO0FBR0YsYUFBQSxlQUFlLE1BQU0scUJBQXFCLFNBQVM7QUFBQSxJQUM1RDtBQUFBLEVBQ0Q7QUFLSyxXQUFVLFFBQVEsS0FBVztBQUMxQixXQUFBLElBQUkscUJBQXFCLEdBQUc7QUFBQSxFQUNyQztBQ3dCYSxRQUFBLG9CQUFvQkEsMkJBQTZDLE1BQVM7QUN0Q3ZGLFFBQU0seUNBQXlCO0FBS2xCLFFBQUEsdUJBQXVCLENBQ2xDLGtCQUNxQjtBQUNkLFdBQUEsbUJBQW1CLElBQUksYUFBYTtBQUFBLEVBQzdDO0FBS2EsUUFBQSwrQkFBK0IsQ0FDMUMsa0JBQ1M7QUFDTCxRQUFBLE9BQU8sbUJBQW1CLElBQUksYUFBYTtBQUMv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
@@ -24,7 +24,7 @@ export declare function bindYjsToMobxKeystone<TType extends AnyStandardType | Mo
24
24
  /**
25
25
  * Disposes the binding.
26
26
  */
27
- dispose(): void;
27
+ dispose: () => void;
28
28
  /**
29
29
  * The Y.js origin symbol used for binding transactions.
30
30
  */
@@ -1,16 +1,17 @@
1
1
  import * as Y from "yjs";
2
- import { JsonValue, JsonArray, JsonObject, JsonPrimitive } from "../jsonTypes";
2
+ import { YjsData } from "./convertYjsDataToJson";
3
+ import { JsonArrayWithUndefined, JsonObjectWithUndefined, JsonValueWithUndefined } from "jsonTypes";
3
4
  /**
4
5
  * Converts a JSON value to a Y.js data structure.
5
6
  * Objects are converted to Y.Maps, arrays to Y.Arrays, primitives are untouched.
6
7
  * Frozen values are a special case and they are kept as immutable plain values.
7
8
  */
8
- export declare function convertJsonToYjsData(v: JsonValue): JsonPrimitive | JsonObject | Y.Array<unknown> | Y.Text | Y.Map<unknown>;
9
+ export declare function convertJsonToYjsData(v: JsonValueWithUndefined | undefined): YjsData;
9
10
  /**
10
11
  * Applies a JSON array to a Y.Array, using the convertJsonToYjsData to convert the values.
11
12
  */
12
- export declare function applyJsonArrayToYArray(dest: Y.Array<unknown>, source: JsonArray): void;
13
+ export declare function applyJsonArrayToYArray(dest: Y.Array<unknown>, source: JsonArrayWithUndefined): void;
13
14
  /**
14
15
  * Applies a JSON object to a Y.Map, using the convertJsonToYjsData to convert the values.
15
16
  */
16
- export declare function applyJsonObjectToYMap(dest: Y.Map<unknown>, source: JsonObject): void;
17
+ export declare function applyJsonObjectToYMap(dest: Y.Map<unknown>, source: JsonObjectWithUndefined): void;
@@ -1,3 +1,4 @@
1
1
  import * as Y from "yjs";
2
- import { JsonValue } from "../jsonTypes";
3
- export declare function convertYjsDataToJson(yjsData: Y.Array<unknown> | Y.Map<unknown> | Y.Text | unknown): JsonValue;
2
+ import { JsonValueWithUndefined } from "../jsonTypes";
3
+ export type YjsData = Y.Array<YjsData> | Y.Map<YjsData> | Y.Text | JsonValueWithUndefined;
4
+ export declare function convertYjsDataToJson(yjsData: YjsData): JsonValueWithUndefined;
@@ -23,7 +23,7 @@ export interface YjsBindingContext {
23
23
  /**
24
24
  * The bound mobx-keystone instance.
25
25
  */
26
- boundObject: unknown | undefined;
26
+ boundObject: unknown;
27
27
  /**
28
28
  * Whether we are currently applying Y.js changes to the mobx-keystone model.
29
29
  */
@@ -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 JsonPrimitiveWithUndefined = string | number | boolean | null | undefined;
2
+ export type JsonValueWithUndefined = JsonPrimitiveWithUndefined | JsonObjectWithUndefined | JsonArrayWithUndefined;
3
+ export type JsonObjectWithUndefined = {
4
+ [key: string]: JsonValueWithUndefined;
5
5
  };
6
- export interface JsonArray extends Array<JsonValue> {
6
+ export interface JsonArrayWithUndefined extends Array<JsonValueWithUndefined> {
7
7
  }
package/package.json CHANGED
@@ -1,91 +1,91 @@
1
- {
2
- "name": "mobx-keystone-yjs",
3
- "version": "1.4.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.9.0",
64
- "yjs": "^13.0.0"
65
- },
66
- "devDependencies": {
67
- "@babel/core": "^7.23.7",
68
- "@babel/plugin-proposal-class-properties": "^7.18.6",
69
- "@babel/plugin-proposal-decorators": "^7.23.7",
70
- "@babel/preset-env": "^7.23.7",
71
- "@babel/preset-typescript": "^7.23.3",
72
- "@types/jest": "^29.5.11",
73
- "@types/node": "^20.10.6",
74
- "babel-jest": "^29.7.0",
75
- "jest": "^29.7.0",
76
- "mobx-keystone": "workspace:packages/lib",
77
- "rollup-plugin-typescript2": "^0.36.0",
78
- "shx": "^0.3.4",
79
- "spec.ts": "^1.1.3",
80
- "ts-jest": "^29.1.1",
81
- "ts-node": "^10.9.2",
82
- "typescript": "^5.3.3",
83
- "vite": "^5.0.11"
84
- },
85
- "dependencies": {
86
- "tslib": "^2.6.2"
87
- },
88
- "directories": {
89
- "test": "test"
90
- }
91
- }
1
+ {
2
+ "name": "mobx-keystone-yjs",
3
+ "version": "1.5.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.9.0",
64
+ "yjs": "^13.0.0"
65
+ },
66
+ "devDependencies": {
67
+ "@babel/core": "^7.24.4",
68
+ "@babel/plugin-proposal-class-properties": "^7.18.6",
69
+ "@babel/plugin-proposal-decorators": "^7.24.1",
70
+ "@babel/preset-env": "^7.24.4",
71
+ "@babel/preset-typescript": "^7.24.1",
72
+ "@types/jest": "^29.5.12",
73
+ "@types/node": "^20.12.6",
74
+ "babel-jest": "^29.7.0",
75
+ "jest": "^29.7.0",
76
+ "mobx-keystone": "workspace:packages/lib",
77
+ "rollup-plugin-typescript2": "^0.36.0",
78
+ "shx": "^0.3.4",
79
+ "spec.ts": "^1.1.3",
80
+ "ts-jest": "^29.1.2",
81
+ "ts-node": "^10.9.2",
82
+ "typescript": "^5.4.4",
83
+ "vite": "^5.2.8"
84
+ },
85
+ "dependencies": {
86
+ "tslib": "^2.6.2"
87
+ },
88
+ "directories": {
89
+ "test": "test"
90
+ }
91
+ }