footprintjs 9.44.0 → 9.44.2

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.
Files changed (38) hide show
  1. package/CLAUDE.md +6 -5
  2. package/dist/esm/lib/capture/freeze.d.ts +51 -7
  3. package/dist/esm/lib/capture/freeze.js +289 -24
  4. package/dist/esm/lib/capture/valueKinds.d.ts +57 -0
  5. package/dist/esm/lib/capture/valueKinds.js +142 -0
  6. package/dist/esm/lib/memory/EventLog.d.ts +24 -6
  7. package/dist/esm/lib/memory/EventLog.js +30 -10
  8. package/dist/esm/lib/memory/admission.js +4 -3
  9. package/dist/esm/lib/memory/borrowedMutation.js +2 -2
  10. package/dist/esm/lib/memory/equality.d.ts +55 -19
  11. package/dist/esm/lib/memory/equality.js +154 -51
  12. package/dist/esm/lib/memory/logModel.js +11 -4
  13. package/dist/esm/lib/memory/redaction.d.ts +21 -0
  14. package/dist/esm/lib/memory/redaction.js +64 -7
  15. package/dist/esm/lib/runner/ExecutionRuntime.d.ts +4 -1
  16. package/dist/esm/lib/runner/ExecutionRuntime.js +15 -10
  17. package/dist/esm/lib/runner/snapshot.js +17 -3
  18. package/dist/esm/lib/slice/elementProvenance.js +2 -2
  19. package/dist/esm/lib/time-travel/chain.js +28 -26
  20. package/dist/lib/capture/freeze.js +292 -25
  21. package/dist/lib/capture/valueKinds.js +146 -0
  22. package/dist/lib/memory/EventLog.js +29 -9
  23. package/dist/lib/memory/admission.js +4 -3
  24. package/dist/lib/memory/borrowedMutation.js +2 -2
  25. package/dist/lib/memory/equality.js +154 -51
  26. package/dist/lib/memory/logModel.js +11 -4
  27. package/dist/lib/memory/redaction.js +66 -8
  28. package/dist/lib/runner/ExecutionRuntime.js +14 -9
  29. package/dist/lib/runner/snapshot.js +16 -2
  30. package/dist/lib/slice/elementProvenance.js +2 -2
  31. package/dist/lib/time-travel/chain.js +27 -25
  32. package/dist/types/lib/capture/freeze.d.ts +51 -7
  33. package/dist/types/lib/capture/valueKinds.d.ts +57 -0
  34. package/dist/types/lib/memory/EventLog.d.ts +24 -6
  35. package/dist/types/lib/memory/equality.d.ts +55 -19
  36. package/dist/types/lib/memory/redaction.d.ts +21 -0
  37. package/dist/types/lib/runner/ExecutionRuntime.d.ts +4 -1
  38. package/package.json +2 -1
@@ -233,7 +233,7 @@ class LogModel {
233
233
  commit = touch.commitIdx;
234
234
  start = before;
235
235
  }
236
- verdict.set(commit, !(0, equality_js_1.deepEqual)(start, after));
236
+ verdict.set(commit, !(0, equality_js_1.deepEqual)(start, after, 'copies'));
237
237
  },
238
238
  });
239
239
  changes = [...verdict].filter(([, changed]) => changed).map(([c]) => c);
@@ -262,7 +262,7 @@ class LogModel {
262
262
  keyPaths_js_1.queryWork.units += candidates.length;
263
263
  return candidates.filter((c) => {
264
264
  const g = h.kept.get(c);
265
- return g !== undefined && !(0, equality_js_1.deepEqual)((0, pathOps_js_1.nativeGet)(g.before, rest), (0, pathOps_js_1.nativeGet)(g.after, rest));
265
+ return g !== undefined && !(0, equality_js_1.deepEqual)((0, pathOps_js_1.nativeGet)(g.before, rest), (0, pathOps_js_1.nativeGet)(g.after, rest), 'copies');
266
266
  });
267
267
  }
268
268
  // ── the writer rule ──────────────────────────────────────────────────────
@@ -346,13 +346,20 @@ class LogModel {
346
346
  const kept = (0, keyPaths_js_1.lastBefore)(h.keptAt, idx + 1);
347
347
  if (kept !== -1) {
348
348
  const after = rows.filter((row) => row.commitIdx > kept);
349
- return (0, verbs_js_1.foldKey)(after, segs, { anchored: true, start: h.kept.get(kept)?.after });
349
+ // Folded FROM the kept generation, the answer can BE it (no row after it) or share its parts, and
350
+ // the memo answers every later question: detach it, as the value rule promises (until 9.44.2 an
351
+ // edit of one answer changed the next).
352
+ return detached((0, verbs_js_1.foldKey)(after, segs, { anchored: true, start: h.kept.get(kept)?.after }));
350
353
  }
351
354
  }
352
355
  return (0, verbs_js_1.foldKey)(rows, segs, { anchored: true });
353
356
  }
354
357
  }
355
358
  exports.LogModel = LogModel;
359
+ /** A value the caller owns: a container is cloned, a primitive is itself. */
360
+ function detached(value) {
361
+ return value !== null && typeof value === 'object' ? structuredClone(value) : value;
362
+ }
356
363
  /** Is the last `set` / `delete` row ON `key` in this commit a `set`? */
357
364
  function lastTotalIsSet(bundle, key) {
358
365
  for (let i = bundle.trace.length - 1; i >= 0; i--) {
@@ -362,4 +369,4 @@ function lastTotalIsSet(bundle, key) {
362
369
  }
363
370
  return false;
364
371
  }
365
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibG9nTW9kZWwuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbGliL21lbW9yeS9sb2dNb2RlbC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBMEJHOzs7QUFHSCwrQ0FBMEM7QUFDMUMsK0NBYXVCO0FBQ3ZCLDZDQUF5QztBQUN6Qyx5Q0FBbUM7QUFFbkMseUNBQTJFO0FBbUIzRSxNQUFNLE1BQU0sR0FBRyxJQUFJLE9BQU8sRUFBcUMsQ0FBQztBQUVoRSxxR0FBcUc7QUFDckcsU0FBUyxXQUFXLENBQUMsR0FBNEI7SUFDL0MsSUFBSSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDO1FBQUUsT0FBTyxLQUFLLENBQUM7SUFDeEMsZ0dBQWdHO0lBQ2hHLG9GQUFvRjtJQUNwRixLQUFLLE1BQU0sTUFBTSxJQUFJLEdBQUcsRUFBRSxDQUFDO1FBQ3pCLElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDO1lBQUUsT0FBTyxLQUFLLENBQUM7UUFDN0UsSUFBSSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDO1lBQUUsT0FBTyxLQUFLLENBQUM7UUFDekYsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQUUsT0FBTyxLQUFLLENBQUM7SUFDdkUsQ0FBQztJQUNELE9BQU8sSUFBSSxDQUFDO0FBQ2QsQ0FBQztBQUVELGtGQUFrRjtBQUNsRixTQUFnQixRQUFRLENBQUMsR0FBNEI7SUFDbkQsTUFB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QUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDO1FBQ2xELE1BQU0sQ0FBQyxHQUFHLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDMUIsSUFBSSxDQUFDLENBQUMsSUFBSSxLQUFLLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLEtBQUssS0FBSyxJQUFJLENBQUMsQ0FBQyxJQUFJLEtBQUssUUFBUSxDQUFDO1lBQUUsT0FBTyxDQUFDLENBQUMsSUFBSSxLQUFLLEtBQUssQ0FBQztJQUMzRixDQUFDO0lBQ0QsT0FBTyxLQUFLLENBQUM7QUFDZixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBsb2dNb2RlbC50cyDigJQgdGhlIHJlYWQgbW9kZWwgb2YgT05FIGNvbW1pdCBsb2c6IHRoZSB3cml0ZXIgcnVsZSBhbmQgdGhlIHZhbHVlIHJ1bGUgb2YgYGtleVBhdGhzLnRzYCxcbiAqIGFuc3dlcmVkIGF0IGEgY29zdCBwcm9wb3J0aW9uYWwgdG8gdGhlIGFuc3dlciwgbm90IHRvIHRoZSBsb2cgKEYzLCA5LjMzLjApLlxuICpcbiAqIFdIWSBUSElTIEZJTEUgRVhJU1RTLiBUaGUgcnVsZXMgYXJlIHNpbXBsZSB0byBzdGF0ZSBhbmQgZXhwZW5zaXZlIHRvIGFwcGx5IG5haXZlbHk6IGEga2V5J3Mgd3JpdGVyc1xuICogaW5jbHVkZSB0aGUgY29tbWl0cyBBUk9VTkQgaXQgd2hvc2UgY2hhbmdlIHJlYWNoZWQgaXQsIGFuZCBkZWNpZGluZyB0aGF0IG5lZWRzIHRoZSB2YWx1ZSBhdCB0aGUga2V5XG4gKiBiZWZvcmUgYW5kIGFmdGVyIHN1Y2ggYSBjb21taXQg4oCUIGEgZm9sZCBvZiBpdHMgdG9wLWxldmVsIGtleS4gRm9sZGluZyBvbmNlIHBlciBLRVkgbWFkZSBhIGNhdXNhbCB3YWxrXG4gKiBvdmVyIG5lc3RlZCBrZXlzIGN1YmljIGluIHRoZSBsb2cgKGV2ZXJ5IGtleSByZS1zY2FubmVkIHRoZSBsb2cgYW5kIHJlLWZvbGRlZCBpdHMgcm9vdCkuIEhlcmU6XG4gKlxuICogICAtIHRoZSBsb2cgaXMgaW5kZXhlZCBPTkNFIChga2V5UGF0aHMgwrcgYnVpbGRXcml0ZXJJbmRleGAsIGEgcGF0aCB0cmllKTogYSBrZXkncyBjYW5kaWRhdGVzIGNvc3RcbiAqICAgICBPKGRlcHRoICsgbWF0Y2hlcykg4oCUIGl0cyBub2RlLCBpdHMgYW5jZXN0b3JzLCBpdHMgc3VidHJlZSDigJQgYW5kIHRoZSByb3dzIHVuZGVyIGEgdG9wLWxldmVsIGtleSBhcmVcbiAqICAgICByZWFjaGVkIHRocm91Z2ggdGhlIGluZGV4LCBuZXZlciBhIHNjYW47XG4gKiAgIC0gZWFjaCB0b3AtbGV2ZWwga2V5IGlzIGZvbGRlZCBPTkNFIChgdmVyYnMgwrcgZm9sZEtleWAsIGNvcHktb24td3JpdGUpLCBrZWVwaW5nIGl0cyB2YWx1ZSBiZWZvcmUgYW5kXG4gKiAgICAgYWZ0ZXIgZXZlcnkgY29tbWl0IGEgdmVyZGljdCBjYW4gYXNrIGFib3V0OiBhIGNvbW1pdCB3aXRoIGEgcm93IG9uIGEgcGF0aCB0aGF0IGhhcyB3cml0dGVuIHBhdGhzXG4gKiAgICAgYmVsb3cgaXQgKGl0IGNhbiBiZSBBUk9VTkQgYSB3cml0dGVuIGtleSksIGFuZCBhIGNvbW1pdCB0aGF0IHdyaXRlcyBUSFJPVUdIIGEgc3RyaW5nLXZhbHVlZFxuICogICAgIGNvbnRhaW5lciAoYG5hdGl2ZVNldGAgcmVwbGFjZXMgdGhlIHN0cmluZywgYW5kIHRoZSBjaGFyYWN0ZXJzIGEga2V5IHJlYWQgZnJvbSBpdCB2YW5pc2gg4oCUIHRoZSBvbmVcbiAqICAgICB3YXkgYSByb3cgQkVTSURFIGEga2V5IG1vdmVzIGl0KS4gQSBrZXkncyB2ZXJkaWN0IGlzIHRoZW4gdHdvIGBuYXRpdmVHZXRgcyBhbmQgYSBgZGVlcEVxdWFsYDtcbiAqICAgLSB0aGUgbGFzdCB3cml0ZXIgYmVmb3JlIGEgcG9pbnQgaXMgZm91bmQgTEFaSUxZOiB0aGUgbGFzdCB3cml0ZSBvbiBvciBpbnNpZGUgdGhlIGtleSwgdGhlbiBvbmx5IHRoZVxuICogICAgIGFyb3VuZC1jYW5kaWRhdGVzIGFmdGVyIGl0IOKAlCBtb3N0IHF1ZXN0aW9ucyBuZWVkIG5vIHZlcmRpY3QgYXQgYWxsLlxuICpcbiAqIE9uZSBzaGFwZSBrZWVwcyBhIHBlci1rZXkgZm9sZCAobWVtb2lzZWQgcGVyIGtleSk6IGEga2V5IHRoYXQgd2FzIG5ldmVyIHdyaXR0ZW4sIHVuZGVyIGEgY29udGFpbmVyIHRoYXRcbiAqIHdhcyBvbmx5IGV2ZXIgd3JpdHRlbiBXSE9MRSAoaXRzIG5vZGUgaGFzIG5vIHdyaXR0ZW4gY2hpbGRyZW4sIHNvIG5vIGdlbmVyYXRpb24gaXMga2VwdCB0aGVyZSkuXG4gKlxuICogQSBtb2RlbCBvZiBhIEZST1pFTiBsb2cgKGV2ZXJ5IGVuZ2luZSBsb2cgc2luY2UgRjM6IGBFdmVudExvZyDCtyByZWNvcmRgIGZyZWV6ZXMgZWFjaCBidW5kbGUgYW5kXG4gKiBgZ2V0U25hcHNob3RgIGZyZWV6ZXMgdGhlIGFycmF5KSBpcyBtZW1vaXNlZCBvbiB0aGUgbG9nIOKAlCB0aGUgcmVjb3JkIGNhbm5vdCBjaGFuZ2UgdW5kZXIgaXQuIEEgbG9nIHRoYXRcbiAqIGlzIG5vdCBmcm96ZW4gKGhhbmQtYnVpbHQsIHBhcnNlZCBmcm9tIEpTT04pIGdldHMgYSBmcmVzaCBtb2RlbCBwZXIgcXVlc3Rpb24uXG4gKi9cblxuaW1wb3J0IHR5cGUgeyBDb21taXRJZHggfSBmcm9tICcuLi9pZHMvcnVudGltZVN0YWdlSWQuanMnO1xuaW1wb3J0IHsgZGVlcEVxdWFsIH0gZnJvbSAnLi9lcXVhbGl0eS5qcyc7XG5pbXBvcnQge1xuICB0eXBlIFBhdGhOb2RlLFxuICB0eXBlIFdyaXRlckluZGV4LFxuICBhbmNlc3Rvck5vZGVzLFxuICBhc2NlbmRpbmdVbmlvbixcbiAgYmV0d2VlbixcbiAgYnVpbGRXcml0ZXJJbmRleCxcbiAgbGFzdEJlZm9yZSxcbiAgbm9kZUF0LFxuICBxdWVyeVdvcmssXG4gIHJlbGF0aW9uLFxuICByb290T2YsXG4gIHN1YnRyZWVQb3NpdGlvbnMsXG59IGZyb20gJy4va2V5UGF0aHMuanMnO1xuaW1wb3J0IHsgbmF0aXZlR2V0IH0gZnJvbSAnLi9wYXRoT3BzLmpzJztcbmltcG9ydCB7IERFTElNIH0gZnJvbSAnLi9wYXRocy5qcyc7XG5pbXBvcnQgdHlwZSB7IENvbW1pdEJ1bmRsZSB9IGZyb20gJy4vdHlwZXMuanMnO1xuaW1wb3J0IHsgdHlwZSBUb3VjaCwgZm9sZEtleSwgaXNWZXJiLCBVbmtub3duVmVyYkVycm9yIH0gZnJvbSAnLi92ZXJicy5qcyc7XG5cbi8qKiBUaGUgcm93cyB1bmRlciBvbmUgdG9wLWxldmVsIGtleSwgaW4gY29tbWl0IG9yZGVyIOKAlCB1cCB0byB0aGUgZmlyc3Qgcm93IHRoZSB2ZXJiIGxhdyByZWZ1c2VzLiAqL1xuaW50ZXJmYWNlIFJvb3RSb3dzIHtcbiAgcmVhZG9ubHkgcm93czogVG91Y2hbXTtcbiAgLyoqIFRoZSBmaXJzdCByb3cgdW5kZXIgdGhlIGtleSB3aG9zZSB2ZXJiIGlzIG5vbmUgb2YgdGhlIGZvdXIg4oCUIGV2ZXJ5IGFuc3dlciB0aGF0IHJlYWNoZXMgaXQgaXMgcmVmdXNlZC4gKi9cbiAgcmVhZG9ubHkgcmVmdXNlZD86IFVua25vd25WZXJiRXJyb3I7XG4gIHJlYWRvbmx5IHJlZnVzZWRBdDogbnVtYmVyO1xufVxuXG4vKiogT25lIHRvcC1sZXZlbCBrZXkgZm9sZGVkIG9uY2U6IGl0cyB2YWx1ZSBiZWZvcmUgYW5kIGFmdGVyIGV2ZXJ5IGNvbW1pdCBhIHZlcmRpY3QgY2FuIGFzayBhYm91dC4gKi9cbmludGVyZmFjZSBSb290SGlzdG9yeSB7XG4gIHJlYWRvbmx5IGtlcHQ6IE1hcDxudW1iZXIsIHsgcmVhZG9ubHkgYmVmb3JlOiB1bmtub3duOyByZWFkb25seSBhZnRlcjogdW5rbm93biB9PjtcbiAgLyoqIFRoZSBrZXB0IGNvbW1pdHMsIGFzY2VuZGluZy4gKi9cbiAgcmVhZG9ubHkga2VwdEF0OiByZWFkb25seSBudW1iZXJbXTtcbiAgLyoqIENvbW1pdHMgdGhhdCB3cm90ZSBUSFJPVUdIIGEgc3RyaW5nLXZhbHVlZCBjb250YWluZXIsIGJ5IHRoZSBub2RlIG9mIHRoYXQgY29udGFpbmVyLiAqL1xuICByZWFkb25seSByZXBsYWNlZDogTWFwPFBhdGhOb2RlLCBudW1iZXJbXT47XG59XG5cbmNvbnN0IE1PREVMUyA9IG5ldyBXZWFrTWFwPHJlYWRvbmx5IENvbW1pdEJ1bmRsZVtdLCBMb2dNb2RlbD4oKTtcblxuLyoqIElzIHRoZSBsb2cgaW1tdXRhYmxlIOKAlCB0aGUgYXJyYXkgYW5kIGV2ZXJ5IGJ1bmRsZSBhbmQgdHJhY2UgZnJvemVuIChhbiBlbmdpbmUgc25hcHNob3QncyBsb2cpPyAqL1xuZnVuY3Rpb24gaXNGcm96ZW5Mb2cobG9nOiByZWFkb25seSBDb21taXRCdW5kbGVbXSk6IGJvb2xlYW4ge1xuICBpZiAoIU9iamVjdC5pc0Zyb3plbihsb2cpKSByZXR1cm4gZmFsc2U7XG4gIC8vIFRoZSBzaGFwZSBgRXZlbnRMb2cgwrcgcmVjb3JkYCBsZWF2ZXM6IHRoZSBidW5kbGUsIGl0cyBwYXlsb2FkcyBhbmQgaXRzIHJvd3MuIEEgaGFuZC1idWlsdCBsb2dcbiAgLy8gZnJvemVuIGxlc3MgZGVlcGx5IHRoYW4gdGhhdCBjb3VsZCBjaGFuZ2UgYWZ0ZXIgYSBxdWVyeSwgc28gaXQgaXMgbmV2ZXIgbWVtb2lzZWQuXG4gIGZvciAoY29uc3QgYnVuZGxlIG9mIGxvZykge1xuICAgIGlmICghT2JqZWN0LmlzRnJvemVuKGJ1bmRsZSkgfHwgIU9iamVjdC5pc0Zyb3plbihidW5kbGUudHJhY2UpKSByZXR1cm4gZmFsc2U7XG4gICAgaWYgKCFPYmplY3QuaXNGcm96ZW4oYnVuZGxlLm92ZXJ3cml0ZSkgfHwgIU9iamVjdC5pc0Zyb3plbihidW5kbGUudXBkYXRlcykpIHJldHVybiBmYWxzZTtcbiAgICBpZiAoIWJ1bmRsZS50cmFjZS5ldmVyeSgocm93KSA9PiBPYmplY3QuaXNGcm96ZW4ocm93KSkpIHJldHVybiBmYWxzZTtcbiAgfVxuICByZXR1cm4gdHJ1ZTtcbn1cblxuLyoqIFRoZSByZWFkIG1vZGVsIG9mIGBsb2dgIOKAlCBtZW1vaXNlZCB3aGVuIHRoZSBsb2cgaXMgZnJvemVuLCBmcmVzaCBvdGhlcndpc2UuICovXG5leHBvcnQgZnVuY3Rpb24gbG9nTW9kZWwobG9nOiByZWFkb25seSBDb21taXRCdW5kbGVbXSk6IExvZ01vZGVsIHtcbiAgY29uc3QgbWVtbyA9IE1PREVMUy5nZXQobG9nKTtcbiAgaWYgKG1lbW8gIT09IHVuZGVmaW5lZCkgcmV0dXJuIG1lbW87XG4gIGNvbnN0IG1vZGVsID0gbmV3IExvZ01vZGVsKGxvZyk7XG4gIGlmIChpc0Zyb3plbkxvZyhsb2cpKSBNT0RFTFMuc2V0KGxvZywgbW9kZWwpO1xuICByZXR1cm4gbW9kZWw7XG59XG5cbi8qKiBUaGUgbWVtb2lzZWQgbW9kZWwgb2YgYSBmcm96ZW4gbG9nIChidWlsdCBvbiBmaXJzdCBhc2spLCBvciB1bmRlZmluZWQgZm9yIGEgbG9nIHRoYXQgaXMgbm90IGZyb3plbi4gKi9cbmV4cG9ydCBmdW5jdGlvbiBtZW1vaXNlZE1vZGVsKGxvZzogcmVhZG9ubHkgQ29tbWl0QnVuZGxlW10pOiBMb2dNb2RlbCB8IHVuZGVmaW5lZCB7XG4gIHJldHVybiBNT0RFTFMuZ2V0KGxvZykgPz8gKGlzRnJvemVuTG9nKGxvZykgPyBsb2dNb2RlbChsb2cpIDogdW5kZWZpbmVkKTtcbn1cblxuLyoqIERvZXMgdGhlIGNvbW1pdCBob2xkIGEgbm9uLWBkZWxldGVgIHJvdyBvbiBga2V5YCBvciBpbnNpZGUgaXQ/IChBIGBkZWxldGVgIGNhbm5vdCByZXBsYWNlIGEgc3RyaW5nIGNvbnRhaW5lci4pICovXG5leHBvcnQgZnVuY3Rpb24gd3JpdGVzQXRPckluc2lkZShidW5kbGU6IENvbW1pdEJ1bmRsZSwga2V5OiBzdHJpbmcpOiBib29sZWFuIHtcbiAgZm9yIChjb25zdCB0IG9mIGJ1bmRsZS50cmFjZSkge1xuICAgIGlmICh0LnZlcmIgPT09ICdkZWxldGUnKSBjb250aW51ZTtcbiAgICBjb25zdCByID0gcmVsYXRpb24odC5wYXRoLCBrZXkpO1xuICAgIGlmIChyID09PSAnZXhhY3QnIHx8IHIgPT09ICdpbnNpZGUnKSByZXR1cm4gdHJ1ZTtcbiAgfVxuICByZXR1cm4gZmFsc2U7XG59XG5cbi8qKlxuICogQ2FuIHRoaXMgY29tbWl0IGxlYXZlIGEgU1RSSU5HLXZhbHVlZCBjb250YWluZXIgYWJvdmUgYGtleWAg4oCUIGEgcm93IGFyb3VuZCB0aGUga2V5IHdob3NlIHJlY29yZGVkIHZhbHVlXG4gKiBob2xkcyBhIHN0cmluZyBhdCB0aGUgcm93J3MgcGF0aCBvciBhbnl3aGVyZSBiZXR3ZWVuIGl0IGFuZCB0aGUga2V5PyBPbmx5IHRoZW4gY2FuIGEgbGF0ZXIgd3JpdGUgYmVzaWRlIHRoZVxuICoga2V5IG1vdmUgaXQgKGBuYXRpdmVTZXRgIHJlcGxhY2VzIHRoZSBzdHJpbmcpLiBBIGNvbnNlcnZhdGl2ZSwgcGF5bG9hZC1vbmx5IGNoZWNrOiBubyBmb2xkLlxuICovXG5leHBvcnQgZnVuY3Rpb24gbGVhdmVzU3RyaW5nQWJvdmUoYnVuZGxlOiBDb21taXRCdW5kbGUsIGtleTogc3RyaW5nKTogYm9vbGVhbiB7XG4gIGNvbnN0IGtleVNlZ3MgPSBrZXkuc3BsaXQoREVMSU0pO1xuICBmb3IgKGNvbnN0IHQgb2YgYnVuZGxlLnRyYWNlKSB7XG4gICAgaWYgKHQudmVyYiA9PT0gJ2RlbGV0ZScgfHwgcmVsYXRpb24odC5wYXRoLCBrZXkpICE9PSAnYXJvdW5kJykgY29udGludWU7XG4gICAgY29uc3Qgc2VncyA9IHQucGF0aC5zcGxpdChERUxJTSk7XG4gICAgbGV0IHZhbHVlOiB1bmtub3duID0gbmF0aXZlR2V0KHQudmVyYiA9PT0gJ21lcmdlJyA/IGJ1bmRsZS51cGRhdGVzIDogYnVuZGxlLm92ZXJ3cml0ZSwgc2Vncyk7XG4gICAgZm9yIChsZXQgZGVwdGggPSBzZWdzLmxlbmd0aDsgZGVwdGggPCBrZXlTZWdzLmxlbmd0aDsgZGVwdGgrKykge1xuICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycpIHJldHVybiB0cnVlO1xuICAgICAgaWYgKHZhbHVlID09PSBudWxsIHx8IHR5cGVvZiB2YWx1ZSAhPT0gJ29iamVjdCcpIGJyZWFrO1xuICAgICAgdmFsdWUgPSBuYXRpdmVHZXQodmFsdWUsIFtrZXlTZWdzW2RlcHRoXV0pO1xuICAgIH1cbiAgfVxuICByZXR1cm4gZmFsc2U7XG59XG5cbmV4cG9ydCBjbGFzcyBMb2dNb2RlbCB7XG4gIHJlYWRvbmx5IGluZGV4OiBXcml0ZXJJbmRleDtcbiAgcHJpdmF0ZSByZWFkb25seSByb290cyA9IG5ldyBNYXA8c3RyaW5nLCBSb290Um93cz4oKTtcbiAgcHJpdmF0ZSByZWFkb25seSBoaXN0b3JpZXMgPSBuZXcgTWFwPHN0cmluZywgUm9vdEhpc3Rvcnk+KCk7XG4gIHByaXZhdGUgcmVhZG9ubHkgY2hhbmdlc0J5S2V5ID0gbmV3IE1hcDxzdHJpbmcsIG51bWJlcltdPigpO1xuICBwcml2YXRlIHJlYWRvbmx5IHdyaXRlcnNCeUtleSA9IG5ldyBNYXA8c3RyaW5nLCBudW1iZXJbXT4oKTtcblxuICBjb25zdHJ1Y3RvcihyZWFkb25seSBsb2c6IHJlYWRvbmx5IENvbW1pdEJ1bmRsZVtdKSB7XG4gICAgdGhpcy5pbmRleCA9IGJ1aWxkV3JpdGVySW5kZXgobG9nKTtcbiAgICBmb3IgKGNvbnN0IGJ1bmRsZSBvZiBsb2cpIHF1ZXJ5V29yay51bml0cyArPSBidW5kbGUudHJhY2UubGVuZ3RoO1xuICB9XG5cbiAgLy8g4pSA4pSAIHJvd3Mg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbiAgcHJpdmF0ZSByb290Um93cyhyb290OiBzdHJpbmcpOiBSb290Um93cyB7XG4gICAgbGV0IGVudHJ5ID0gdGhpcy5yb290cy5nZXQocm9vdCk7XG4gICAgaWYgKGVudHJ5ICE9PSB1bmRlZmluZWQpIHJldHVybiBlbnRyeTtcbiAgICBjb25zdCBub2RlID0gdGhpcy5pbmRleC5yb290cy5nZXQocm9vdCk7XG4gICAgY29uc3Qgcm93czogVG91Y2hbXSA9IFtdO1xuICAgIGxldCByZWZ1c2VkOiBVbmtub3duVmVyYkVycm9yIHwgdW5kZWZpbmVkO1xuICAgIGxldCByZWZ1c2VkQXQgPSBOdW1iZXIuUE9TSVRJVkVfSU5GSU5JVFk7XG4gICAgaWYgKG5vZGUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgZm9yIChjb25zdCBjIG9mIHN1YnRyZWVQb3NpdGlvbnMobm9kZSkpIHtcbiAgICAgICAgY29uc3QgdHJhY2UgPSB0aGlzLmxvZ1tjXS50cmFjZTtcbiAgICAgICAgcXVlcnlXb3JrLnVuaXRzICs9IHRyYWNlLmxlbmd0aDtcbiAgICAgICAgZm9yIChsZXQgcm93ID0gMDsgcm93IDwgdHJhY2UubGVuZ3RoICYmIHJlZnVzZWQgPT09IHVuZGVmaW5lZDsgcm93KyspIHtcbiAgICAgICAgICBjb25zdCB7IHBhdGgsIHZlcmIgfSA9IHRyYWNlW3Jvd107XG4gICAgICAgICAgaWYgKHBhdGggIT09IHJvb3QgJiYgcmVsYXRpb24ocGF0aCwgcm9vdCkgIT09ICdpbnNpZGUnKSBjb250aW51ZTtcbiAgICAgICAgICBpZiAoIWlzVmVyYih2ZXJiKSkge1xuICAgICAgICAgICAgcmVmdXNlZCA9IG5ldyBVbmtub3duVmVyYkVycm9yKHZlcmIsIHsgcGF0aCwgcm93LCBjb21taXQ6IGMgfSk7XG4gICAgICAgICAgICByZWZ1c2VkQXQgPSBjO1xuICAgICAgICAgICAgLy8gdGhlIHJlZnVzZWQgY29tbWl0IGFuZCBldmVyeXRoaW5nIGFmdGVyIGl0IGFyZSBsZWZ0IG91dDogYW4gYW5zd2VyIHRoYXQgcmVhY2hlcyB0aGVtIGlzIHJlZnVzZWRcbiAgICAgICAgICAgIHdoaWxlIChyb3dzLmxlbmd0aCA+IDAgJiYgcm93c1tyb3dzLmxlbmd0aCAtIDFdLmNvbW1pdElkeCA9PT0gYykgcm93cy5wb3AoKTtcbiAgICAgICAgICB9IGVsc2Ugcm93cy5wdXNoKHsgdmVyYiwgYnVuZGxlOiB0aGlzLmxvZ1tjXSwgY29tbWl0SWR4OiBjIGFzIENvbW1pdElkeCwgcGF0aCB9KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAocmVmdXNlZCAhPT0gdW5kZWZpbmVkKSBicmVhaztcbiAgICAgIH1cbiAgICB9XG4gICAgZW50cnkgPSB7IHJvd3MsIC4uLihyZWZ1c2VkICE9PSB1bmRlZmluZWQgJiYgeyByZWZ1c2VkIH0pLCByZWZ1c2VkQXQgfTtcbiAgICB0aGlzLnJvb3RzLnNldChyb290LCBlbnRyeSk7XG4gICAgcmV0dXJuIGVudHJ5O1xuICB9XG5cbiAgLyoqIFJlZnVzZSBhbiBhbnN3ZXIgdGhhdCByZWFjaGVzIGEgcm93IHdob3NlIHZlcmIgdGhlIGxhdyBkb2VzIG5vdCBrbm93IChvbmUgaW4gY29tbWl0cyBgYWZ0ZXJgIDwgYyDiiaQgYGVuZGApLiAqL1xuICBwcml2YXRlIHJlZnVzZVRocm91Z2gocm9vdDogc3RyaW5nLCBlbmQ6IG51bWJlciwgYWZ0ZXIgPSAtMSk6IFJvb3RSb3dzIHtcbiAgICBjb25zdCByciA9IHRoaXMucm9vdFJvd3Mocm9vdCk7XG4gICAgaWYgKHJyLnJlZnVzZWQgIT09IHVuZGVmaW5lZCAmJiByci5yZWZ1c2VkQXQgPD0gZW5kICYmIHJyLnJlZnVzZWRBdCA+IGFmdGVyKSB0aHJvdyByci5yZWZ1c2VkO1xuICAgIHJldHVybiBycjtcbiAgfVxuXG4gIC8qKiBFdmVyeSByb3cgdW5kZXIgYGtleWAncyB0b3AtbGV2ZWwga2V5IHVwIHRvIGBlbmRgLCB3aXRoIGl0cyByZWxhdGlvbiB0byBga2V5YCDigJQgdGhyb3VnaCB0aGUgaW5kZXguICovXG4gIHJvd3NVbmRlclJvb3Qoa2V5OiBzdHJpbmcsIGVuZDogbnVtYmVyKTogVG91Y2hbXSB7XG4gICAgY29uc3QgcnIgPSB0aGlzLnJlZnVzZVRocm91Z2gocm9vdE9mKGtleSksIGVuZCk7XG4gICAgY29uc3Qgb3V0OiBUb3VjaFtdID0gW107XG4gICAgZm9yIChjb25zdCB0IG9mIHJyLnJvd3MpIHtcbiAgICAgIGlmICh0LmNvbW1pdElkeCA+IGVuZCkgYnJlYWs7XG4gICAgICBjb25zdCByID0gcmVsYXRpb24odC5wYXRoLCBrZXkpO1xuICAgICAgb3V0LnB1c2gociA9PT0gdW5kZWZpbmVkID8gdCA6IHsgLi4udCwgcmVsYXRpb246IHIgfSk7XG4gICAgfVxuICAgIHJldHVybiBvdXQ7XG4gIH1cblxuICAvLyDilIDilIAgdGhlIHJvb3QgZm9sZCwgb25jZSBwZXIgdG9wLWxldmVsIGtleSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuICBwcml2YXRlIGhpc3Rvcnkocm9vdDogc3RyaW5nKTogUm9vdEhpc3Rvcnkge1xuICAgIGxldCBoID0gdGhpcy5oaXN0b3JpZXMuZ2V0KHJvb3QpO1xuICAgIGlmIChoICE9PSB1bmRlZmluZWQpIHJldHVybiBoO1xuICAgIGNvbnN0IGtlcHQgPSBuZXcgTWFwPG51bWJlciwgeyBiZWZvcmU6IHVua25vd247IGFmdGVyOiB1bmtub3duIH0+KCk7XG4gICAgY29uc3QgcmVwbGFjZWQgPSBuZXcgTWFwPFBhdGhOb2RlLCBudW1iZXJbXT4oKTtcbiAgICBjb25zdCByciA9IHRoaXMucm9vdFJvd3Mocm9vdCk7XG4gICAgcXVlcnlXb3JrLnVuaXRzICs9IHJyLnJvd3MubGVuZ3RoO1xuICAgIGZvbGRLZXkocnIucm93cywgW3Jvb3RdLCB7XG4gICAgICBnZW5lcmF0aW9uczoge1xuICAgICAgICBhdDogKGMsIHN0YXRlKSA9PiB7XG4gICAgICAgICAgbGV0IGtlZXAgPSBmYWxzZTtcbiAgICAgICAgICBxdWVyeVdvcmsudW5pdHMgKz0gdGhpcy5sb2dbY10udHJhY2UubGVuZ3RoO1xuICAgICAgICAgIGZvciAoY29uc3QgdCBvZiB0aGlzLmxvZ1tjXS50cmFjZSkge1xuICAgICAgICAgICAgaWYgKHQucGF0aCAhPT0gcm9vdCAmJiByZWxhdGlvbih0LnBhdGgsIHJvb3QpICE9PSAnaW5zaWRlJykgY29udGludWU7XG4gICAgICAgICAgICBpZiAoKG5vZGVBdCh0aGlzLmluZGV4LCB0LnBhdGgpPy5jaGlsZHJlbi5zaXplID8/IDApID4gMCkga2VlcCA9IHRydWU7XG4gICAgICAgICAgICBjb25zdCBzZWdzID0gdC5wYXRoLnNwbGl0KERFTElNKTtcbiAgICAgICAgICAgIGZvciAobGV0IGogPSAxOyBqIDwgc2Vncy5sZW5ndGg7IGorKykge1xuICAgICAgICAgICAgICBpZiAodHlwZW9mIG5hdGl2ZUdldChzdGF0ZSwgc2Vncy5zbGljZSgwLCBqKSkgIT09ICdzdHJpbmcnKSBjb250aW51ZTtcbiAgICAgICAgICAgICAgY29uc3QgY29udGFpbmVyID0gbm9kZUF0KHRoaXMuaW5kZXgsIHNlZ3Muc2xpY2UoMCwgaikuam9pbihERUxJTSkpO1xuICAgICAgICAgICAgICBpZiAoY29udGFpbmVyICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBsaXN0ID0gcmVwbGFjZWQuZ2V0KGNvbnRhaW5lcikgPz8gW107XG4gICAgICAgICAgICAgICAgaWYgKGxpc3RbbGlzdC5sZW5ndGggLSAxXSAhPT0gYykgbGlzdC5wdXNoKGMpO1xuICAgICAgICAgICAgICAgIHJlcGxhY2VkLnNldChjb250YWluZXIsIGxpc3QpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGtlZXAgPSB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4ga2VlcDtcbiAgICAgICAgfSxcbiAgICAgICAga2VlcDogKGMsIGJlZm9yZSwgYWZ0ZXIpID0+IHtcbiAgICAgICAgICBrZXB0LnNldChjLCB7IGJlZm9yZSwgYWZ0ZXIgfSk7XG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgIH0pO1xuICAgIGggPSB7IGtlcHQsIGtlcHRBdDogWy4uLmtlcHQua2V5cygpXS5zb3J0KChhLCBiKSA9PiBhIC0gYiksIHJlcGxhY2VkIH07XG4gICAgdGhpcy5oaXN0b3JpZXMuc2V0KHJvb3QsIGgpO1xuICAgIHJldHVybiBoO1xuICB9XG5cbiAgLyoqIEEga2V5IG5ldmVyIHdyaXR0ZW4sIHVuZGVyIGEgY29udGFpbmVyIG9ubHkgZXZlciB3cml0dGVuIHdob2xlOiBubyBnZW5lcmF0aW9uIGlzIGtlcHQgZm9yIGl0LiAqL1xuICBwcml2YXRlIG5lZWRzT3duRm9sZChrZXk6IHN0cmluZywgYW5jZXN0b3JzOiByZWFkb25seSBQYXRoTm9kZVtdKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIG5vZGVBdCh0aGlzLmluZGV4LCBrZXkpID09PSB1bmRlZmluZWQgJiYgYW5jZXN0b3JzW2FuY2VzdG9ycy5sZW5ndGggLSAxXS5jaGlsZHJlbi5zaXplID09PSAwO1xuICB9XG5cbiAgLyoqIEV2ZXJ5IGNvbW1pdCBhY3Jvc3Mgd2hpY2ggdGhlIHZhbHVlIGF0IGBrZXlgIGNoYW5nZWQg4oCUIG9uZSBmb2xkIGZvciB0aGlzIGtleSAodGhlIGZhbGxiYWNrIHNoYXBlKS4gKi9cbiAgcHJpdmF0ZSBvd25DaGFuZ2VzKGtleTogc3RyaW5nKTogbnVtYmVyW10ge1xuICAgIGxldCBjaGFuZ2VzID0gdGhpcy5jaGFuZ2VzQnlLZXkuZ2V0KGtleSk7XG4gICAgaWYgKGNoYW5nZXMgIT09IHVuZGVmaW5lZCkgcmV0dXJuIGNoYW5nZXM7XG4gICAgY29uc3Qgc2VncyA9IGtleS5zcGxpdChERUxJTSk7XG4gICAgY29uc3QgdmVyZGljdCA9IG5ldyBNYXA8bnVtYmVyLCBib29sZWFuPigpO1xuICAgIGxldCBjb21taXQgPSAtMTtcbiAgICBsZXQgc3RhcnQ6IHVua25vd247XG4gICAgcXVlcnlXb3JrLnVuaXRzICs9IHRoaXMucm9vdFJvd3Moc2Vnc1swXSkucm93cy5sZW5ndGg7XG4gICAgZm9sZEtleSh0aGlzLnJvb3RSb3dzKHNlZ3NbMF0pLnJvd3MsIHNlZ3MsIHtcbiAgICAgIGV2ZXJ5Um93OiB0cnVlLFxuICAgICAgb2JzZXJ2ZTogKHRvdWNoLCBiZWZvcmUsIGFmdGVyKSA9PiB7XG4gICAgICAgIGlmICh0b3VjaC5jb21taXRJZHggIT09IGNvbW1pdCkge1xuICAgICAgICAgIGNvbW1pdCA9IHRvdWNoLmNvbW1pdElkeDtcbiAgICAgICAgICBzdGFydCA9IGJlZm9yZTtcbiAgICAgICAgfVxuICAgICAgICB2ZXJkaWN0LnNldChjb21taXQsICFkZWVwRXF1YWwoc3RhcnQsIGFmdGVyKSk7XG4gICAgICB9LFxuICAgIH0pO1xuICAgIGNoYW5nZXMgPSBbLi4udmVyZGljdF0uZmlsdGVyKChbLCBjaGFuZ2VkXSkgPT4gY2hhbmdlZCkubWFwKChbY10pID0+IGMpO1xuICAgIHRoaXMuY2hhbmdlc0J5S2V5LnNldChrZXksIGNoYW5nZXMpO1xuICAgIHJldHVybiBjaGFuZ2VzO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBjb21taXRzIGluIHRoZSBPUEVOIHJhbmdlIChgYWZ0ZXJgLCBgYmVmb3JlYCkgd2l0aCBubyByb3cgb24gb3IgaW5zaWRlIGBrZXlgIGFjcm9zcyB3aGljaCB0aGUgdmFsdWVcbiAgICogYXQgYGtleWAgY2hhbmdlZCDigJQgdGhlIEFST1VORCBoYWxmIG9mIHRoZSB3cml0ZXIgcnVsZSAoYW5kIHRoZSBzdHJpbmctY29udGFpbmVyIGNhc2UgYmVzaWRlIGl0KS5cbiAgICovXG4gIHByaXZhdGUgY2hhbmdlZEFyb3VuZChrZXk6IHN0cmluZywgYWZ0ZXI6IG51bWJlciwgYmVmb3JlOiBudW1iZXIpOiByZWFkb25seSBudW1iZXJbXSB7XG4gICAgY29uc3QgYW5jZXN0b3JzID0gYW5jZXN0b3JOb2Rlcyh0aGlzLmluZGV4LCBrZXkpO1xuICAgIGlmIChhbmNlc3RvcnMubGVuZ3RoID09PSAwIHx8IGFuY2VzdG9ycy5ldmVyeSgoYSkgPT4gYS5wb3NpdGlvbnMubGVuZ3RoID09PSAwKSkgcmV0dXJuIFtdO1xuICAgIGNvbnN0IHJvb3QgPSBhbmNlc3RvcnNbMF0ucGF0aDtcbiAgICAvLyBUaGUgYW5zd2VyIHJlYWRzIHRoZSByb3dzIG9mIHRoZSB3aW5kb3c6IHJlZnVzZSBpdCB3aGVuIG9uZSBvZiB0aGVtIGlzIGEgdmVyYiB0aGUgbGF3IGRvZXMgbm90IGtub3cuXG4gICAgdGhpcy5yZWZ1c2VUaHJvdWdoKHJvb3QsIGJlZm9yZSAtIDEsIGFmdGVyKTtcbiAgICBpZiAodGhpcy5uZWVkc093bkZvbGQoa2V5LCBhbmNlc3RvcnMpKSByZXR1cm4gYmV0d2Vlbih0aGlzLm93bkNoYW5nZXMoa2V5KSwgYWZ0ZXIsIGJlZm9yZSk7XG4gICAgY29uc3QgaCA9IHRoaXMuaGlzdG9yeShyb290KTtcbiAgICBjb25zdCBjYW5kaWRhdGVzID0gYXNjZW5kaW5nVW5pb24oW1xuICAgICAgLi4uYW5jZXN0b3JzLm1hcCgoYSkgPT4gYmV0d2VlbihhLnBvc2l0aW9ucywgYWZ0ZXIsIGJlZm9yZSkpLFxuICAgICAgLi4uYW5jZXN0b3JzLm1hcCgoYSkgPT4gYmV0d2VlbihoLnJlcGxhY2VkLmdldChhKSA/PyBbXSwgYWZ0ZXIsIGJlZm9yZSkpLFxuICAgIF0pO1xuICAgIGNvbnN0IHJlc3QgPSBrZXkuc3BsaXQoREVMSU0pLnNsaWNlKDEpO1xuICAgIHF1ZXJ5V29yay51bml0cyArPSBjYW5kaWRhdGVzLmxlbmd0aDtcbiAgICByZXR1cm4gY2FuZGlkYXRlcy5maWx0ZXIoKGMpID0+IHtcbiAgICAgIGNvbnN0IGcgPSBoLmtlcHQuZ2V0KGMpO1xuICAgICAgcmV0dXJuIGcgIT09IHVuZGVmaW5lZCAmJiAhZGVlcEVxdWFsKG5hdGl2ZUdldChnLmJlZm9yZSwgcmVzdCksIG5hdGl2ZUdldChnLmFmdGVyLCByZXN0KSk7XG4gICAgfSk7XG4gIH1cblxuICAvLyDilIDilIAgdGhlIHdyaXRlciBydWxlIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG4gIC8qKiBFdmVyeSBjb21taXQgdGhhdCBXUk9URSBga2V5YCwgYXNjZW5kaW5nIChtZW1vaXNlZCBwZXIga2V5KS4gKi9cbiAgd3JpdGVyc09mKGtleTogc3RyaW5nKTogcmVhZG9ubHkgbnVtYmVyW10ge1xuICAgIGxldCB3cml0ZXJzID0gdGhpcy53cml0ZXJzQnlLZXkuZ2V0KGtleSk7XG4gICAgaWYgKHdyaXRlcnMgIT09IHVuZGVmaW5lZCkgcmV0dXJuIHdyaXRlcnM7XG4gICAgY29uc3Qgbm9kZSA9IG5vZGVBdCh0aGlzLmluZGV4LCBrZXkpO1xuICAgIGNvbnN0IGF0T3JJbnNpZGUgPSBub2RlID09PSB1bmRlZmluZWQgPyBbXSA6IHN1YnRyZWVQb3NpdGlvbnMobm9kZSk7XG4gICAgY29uc3QgYXJvdW5kID0gdGhpcy5jaGFuZ2VkQXJvdW5kKGtleSwgLTEsIE51bWJlci5QT1NJVElWRV9JTkZJTklUWSk7XG4gICAgd3JpdGVycyA9IGFyb3VuZC5sZW5ndGggPT09IDAgPyBhdE9ySW5zaWRlLnNsaWNlKCkgOiBhc2NlbmRpbmdVbmlvbihbYXRPckluc2lkZSwgYXJvdW5kXSk7XG4gICAgdGhpcy53cml0ZXJzQnlLZXkuc2V0KGtleSwgd3JpdGVycyk7XG4gICAgcmV0dXJuIHdyaXRlcnM7XG4gIH1cblxuICAvKiogVGhlIEFSUkFZIHBvc2l0aW9uIG9mIHRoZSBsYXN0IGNvbW1pdCBiZWZvcmUgYGJlZm9yZWAgdGhhdCB3cm90ZSBga2V5YCwgb3IgLTEuICovXG4gIGxhc3RXcml0ZXJCZWZvcmUoa2V5OiBzdHJpbmcsIGJlZm9yZTogbnVtYmVyKTogbnVtYmVyIHtcbiAgICBxdWVyeVdvcmsudW5pdHMgKz0gMTtcbiAgICBjb25zdCBub2RlID0gbm9kZUF0KHRoaXMuaW5kZXgsIGtleSk7XG4gICAgY29uc3QgbGFzdEFJID0gbm9kZSA9PT0gdW5kZWZpbmVkID8gLTEgOiBsYXN0QmVmb3JlKHN1YnRyZWVQb3NpdGlvbnMobm9kZSksIGJlZm9yZSk7XG4gICAgY29uc3QgYW5jZXN0b3JzID0gYW5jZXN0b3JOb2Rlcyh0aGlzLmluZGV4LCBrZXkpO1xuICAgIHF1ZXJ5V29yay51bml0cyArPSBhbmNlc3RvcnMubGVuZ3RoOyAvLyB0aGUgc2NhbnMgb3ZlciB0aGVtIGJlbG93XG4gICAgaWYgKGFuY2VzdG9ycy5sZW5ndGggPT09IDApIHJldHVybiBsYXN0QUk7XG4gICAgLy8gQSByb3cgYXJvdW5kIHRoZSBrZXkgaW4gdGhlIGxhc3Qgd3JpdGUncyBPV04gY29tbWl0IGNvdW50cyB3aGVuIGl0IGNhbiBsZWF2ZSBhIHN0cmluZyBjb250YWluZXIgYWJvdmVcbiAgICAvLyB0aGUga2V5IChhIGxhdGVyIHdyaXRlIGJlc2lkZSB0aGUga2V5IHRoZW4gcmVwbGFjZXMgaXQpLlxuICAgIGNvbnN0IGFyb3VuZEluV2luZG93ID1cbiAgICAgIGFuY2VzdG9ycy5zb21lKChhKSA9PiBiZXR3ZWVuKGEucG9zaXRpb25zLCBsYXN0QUksIGJlZm9yZSkubGVuZ3RoID4gMCkgfHxcbiAgICAgIChsYXN0QUkgIT09IC0xICYmIGxlYXZlc1N0cmluZ0Fib3ZlKHRoaXMubG9nW2xhc3RBSV0sIGtleSkpO1xuICAgIC8vIEEgYGRlbGV0ZWAgY2Fubm90IHJlcGxhY2UgYSBzdHJpbmcgY29udGFpbmVyLCBzbyBhIGNoYXJhY3RlciByZWFkIHRocm91Z2ggb25lIGNhbiBzdGlsbCBtb3ZlIGFmdGVyIGl0LlxuICAgIGNvbnN0IGRlbGV0ZU9ubHkgPSBsYXN0QUkgIT09IC0xICYmICF3cml0ZXNBdE9ySW5zaWRlKHRoaXMubG9nW2xhc3RBSV0sIGtleSk7XG4gICAgaWYgKCFhcm91bmRJbldpbmRvdyAmJiAhKGRlbGV0ZU9ubHkgJiYgYW5jZXN0b3JzLnNvbWUoKGEpID0+IGEucG9zaXRpb25zLmxlbmd0aCA+IDApKSkgcmV0dXJuIGxhc3RBSTtcbiAgICBjb25zdCBjaGFuZ2VkID0gdGhpcy5jaGFuZ2VkQXJvdW5kKGtleSwgbGFzdEFJLCBiZWZvcmUpO1xuICAgIHJldHVybiBjaGFuZ2VkLmxlbmd0aCA+IDAgPyBjaGFuZ2VkW2NoYW5nZWQubGVuZ3RoIC0gMV0gOiBsYXN0QUk7XG4gIH1cblxuICAvLyDilIDilIAgdGhlIHZhbHVlIHJ1bGUg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbiAgLyoqXG4gICAqIFRoZSB2YWx1ZSBvZiBga2V5YCBhZnRlciBjb21taXQgYGlkeGAgKGluY2x1c2l2ZSkuIFRoZSBmb2xkIG9mIHRoZSByb3dzIHVuZGVyIGl0cyB0b3AtbGV2ZWwga2V5IOKAlCBidXRcbiAgICogd2hlbiBpdHMgbGFzdCB0b3RhbCByb3cgdXAgdG8gYGlkeGAgaXMgYSBgc2V0YCBPTiB0aGUga2V5IGFuZCBub3RoaW5nIGFyb3VuZCBpdCB3YXMgd3JpdHRlbiBzaW5jZSwgb25seVxuICAgKiB0aGUgcm93cyBvbiBhbmQgaW5zaWRlIHRoZSBrZXkgZnJvbSB0aGF0IGBzZXRgIG9uIGNhbiBtb3ZlIGl0LCBhbmQgb25seSB0aGV5IGFyZSBmb2xkZWQuXG4gICAqL1xuICB2YWx1ZUF0KGtleTogc3RyaW5nLCBpZHg6IG51bWJlcik6IHVua25vd24ge1xuICAgIGNvbnN0IHNlZ3MgPSBrZXkuc3BsaXQoREVMSU0pO1xuICAgIHRoaXMucmVmdXNlVGhyb3VnaChzZWdzWzBdLCBpZHgpO1xuICAgIGNvbnN0IG5vZGUgPSBub2RlQXQodGhpcy5pbmRleCwga2V5KTtcbiAgICBjb25zdCBhbmNlc3RvcnMgPSBhbmNlc3Rvck5vZGVzKHRoaXMuaW5kZXgsIGtleSk7XG4gICAgaWYgKG5vZGUgPT09IHVuZGVmaW5lZCAmJiBhbmNlc3RvcnMubGVuZ3RoID09PSAwKSByZXR1cm4gdW5kZWZpbmVkO1xuICAgIGlmIChub2RlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGNvbnN0IGFuY2hvciA9IGxhc3RCZWZvcmUobm9kZS50b3RhbHMsIGlkeCArIDEpO1xuICAgICAgaWYgKFxuICAgICAgICBhbmNob3IgIT09IC0xICYmXG4gICAgICAgIGxhc3RUb3RhbElzU2V0KHRoaXMubG9nW2FuY2hvcl0sIGtleSkgJiZcbiAgICAgICAgYW5jZXN0b3JzLmV2ZXJ5KChhKSA9PiBiZXR3ZWVuKGEucG9zaXRpb25zLCBhbmNob3IgLSAxLCBpZHggKyAxKS5sZW5ndGggPT09IDApXG4gICAgICApIHtcbiAgICAgICAgY29uc3Qgcm93czogVG91Y2hbXSA9IFtdO1xuICAgICAgICBmb3IgKGNvbnN0IGMgb2YgYmV0d2VlbihzdWJ0cmVlUG9zaXRpb25zKG5vZGUpLCBhbmNob3IgLSAxLCBpZHggKyAxKSkge1xuICAgICAgICAgIGNvbnN0IHRyYWNlID0gdGhpcy5sb2dbY10udHJhY2U7XG4gICAgICAgICAgZm9yIChsZXQgcm93ID0gMDsgcm93IDwgdHJhY2UubGVuZ3RoOyByb3crKykge1xuICAgICAgICAgICAgY29uc3QgciA9IHJlbGF0aW9uKHRyYWNlW3Jvd10ucGF0aCwga2V5KTtcbiAgICAgICAgICAgIGlmIChyID09PSAnZXhhY3QnIHx8IHIgPT09ICdpbnNpZGUnKSB7XG4gICAgICAgICAgICAgIHJvd3MucHVzaCh7XG4gICAgICAgICAgICAgICAgdmVyYjogdHJhY2Vbcm93XS52ZXJiIGFzIFRvdWNoWyd2ZXJiJ10sXG4gICAgICAgICAgICAgICAgYnVuZGxlOiB0aGlzLmxvZ1tjXSxcbiAgICAgICAgICAgICAgICBjb21taXRJZHg6IGMgYXMgQ29tbWl0SWR4LFxuICAgICAgICAgICAgICAgIHBhdGg6IHRyYWNlW3Jvd10ucGF0aCxcbiAgICAgICAgICAgICAgICByZWxhdGlvbjogcixcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHF1ZXJ5V29yay51bml0cyArPSByb3dzLmxlbmd0aDtcbiAgICAgICAgcmV0dXJuIGZvbGRLZXkocm93cywgc2Vncyk7XG4gICAgICB9XG4gICAgfVxuICAgIGNvbnN0IHJvd3MgPSB0aGlzLnJvd3NVbmRlclJvb3Qoa2V5LCBpZHgpO1xuICAgIHF1ZXJ5V29yay51bml0cyArPSByb3dzLmxlbmd0aDtcbiAgICBpZiAoIXJvd3Muc29tZSgocm93KSA9PiByb3cucmVsYXRpb24gIT09IHVuZGVmaW5lZCkpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgLy8gQSBtZW1vaXNlZCBtb2RlbCBmb2xkcyBmcm9tIHRoZSBsYXN0IGdlbmVyYXRpb24gaXQga2VlcHMgYXQgb3IgYmVmb3JlIGBpZHhgIOKAlCB0aGUgcm93cyBhZnRlciBpdCBvbmx5LlxuICAgIGlmIChNT0RFTFMuZ2V0KHRoaXMubG9nKSA9PT0gdGhpcykge1xuICAgICAgY29uc3QgaCA9IHRoaXMuaGlzdG9yeShzZWdzWzBdKTtcbiAgICAgIGNvbnN0IGtlcHQgPSBsYXN0QmVmb3JlKGgua2VwdEF0LCBpZHggKyAxKTtcbiAgICAgIGlmIChrZXB0ICE9PSAtMSkge1xuICAgICAgICBjb25zdCBhZnRlciA9IHJvd3MuZmlsdGVyKChyb3cpID0+IHJvdy5jb21taXRJZHggPiBrZXB0KTtcbiAgICAgICAgcmV0dXJuIGZvbGRLZXkoYWZ0ZXIsIHNlZ3MsIHsgYW5jaG9yZWQ6IHRydWUsIHN0YXJ0OiBoLmtlcHQuZ2V0KGtlcHQpPy5hZnRlciB9KTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGZvbGRLZXkocm93cywgc2VncywgeyBhbmNob3JlZDogdHJ1ZSB9KTtcbiAgfVxufVxuXG4vKiogSXMgdGhlIGxhc3QgYHNldGAgLyBgZGVsZXRlYCByb3cgT04gYGtleWAgaW4gdGhpcyBjb21taXQgYSBgc2V0YD8gKi9cbmZ1bmN0aW9uIGxhc3RUb3RhbElzU2V0KGJ1bmRsZTogQ29tbWl0QnVuZGxlLCBrZXk6IHN0cmluZyk6IGJvb2xlYW4ge1xuICBmb3IgKGxldCBpID0gYnVuZGxlLnRyYWNlLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgY29uc3QgdCA9IGJ1bmRsZS50cmFjZVtpXTtcbiAgICBpZiAodC5wYXRoID09PSBrZXkgJiYgKHQudmVyYiA9PT0gJ3NldCcgfHwgdC52ZXJiID09PSAnZGVsZXRlJykpIHJldHVybiB0LnZlcmIgPT09ICdzZXQnO1xuICB9XG4gIHJldHVybiBmYWxzZTtcbn1cbiJdfQ==
372
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibG9nTW9kZWwuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbGliL21lbW9yeS9sb2dNb2RlbC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBMEJHOzs7QUFHSCwrQ0FBMEM7QUFDMUMsK0NBYXVCO0FBQ3ZCLDZDQUF5QztBQUN6Qyx5Q0FBbUM7QUFFbkMseUNBQTJFO0FBbUIzRSxNQUFNLE1BQU0sR0FBRyxJQUFJLE9BQU8sRUFBcUMsQ0FBQztBQUVoRSxxR0FBcUc7QUFDckcsU0FBUyxXQUFXLENBQUMsR0FBNEI7SUFDL0MsSUFBSSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDO1FBQUUsT0FBTyxLQUFLLENBQUM7SUFDeEMsZ0dBQWdHO0lBQ2hHLG9GQUFvRjtJQUNwRixLQUFLLE1BQU0sTUFBTSxJQUFJLEdBQUcsRUFBRSxDQUFDO1FBQ3pCLElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDO1lBQUUsT0FBTyxLQUFLLENBQUM7UUFDN0UsSUFBSSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDO1lBQUUsT0FBTyxLQUFLLENBQUM7UUFDekYsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQUUsT0FBTyxLQUFLLENBQUM7SUFDdkUsQ0FBQztJQUNELE9BQU8sSUFBSSxDQUFDO0FBQ2QsQ0FBQztBQUVELGtGQUFrRjtBQUNsRixTQUFnQixRQUFRLENBQUMsR0FBNEI7SUFDbkQsTUFB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QzdFLFNBQVMsUUFBUSxDQUFDLEtBQWM7SUFDOUIsT0FBTyxLQUFLLEtBQUssSUFBSSxJQUFJLE9BQU8sS0FBSyxLQUFLLFFBQVEsQ0FBQyxDQUFDLENBQUMsZUFBZSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUM7QUFDdEYsQ0FBQztBQUVELHdFQUF3RTtBQUN4RSxTQUFTLGNBQWMsQ0FBQyxNQUFvQixFQUFFLEdBQVc7SUFDdkQsS0FBSyxJQUFJLENBQUMsR0FBRyxNQUFNLENBQUMsS0FBSyxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDO1FBQ2xELE1BQU0sQ0FBQyxHQUFHLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDMUIsSUFBSSxDQUFDLENBQUMsSUFBSSxLQUFLLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLEtBQUssS0FBSyxJQUFJLENBQUMsQ0FBQyxJQUFJLEtBQUssUUFBUSxDQUFDO1lBQUUsT0FBTyxDQUFDLENBQUMsSUFBSSxLQUFLLEtBQUssQ0FBQztJQUMzRixDQUFDO0lBQ0QsT0FBTyxLQUFLLENBQUM7QUFDZixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBsb2dNb2RlbC50cyDigJQgdGhlIHJlYWQgbW9kZWwgb2YgT05FIGNvbW1pdCBsb2c6IHRoZSB3cml0ZXIgcnVsZSBhbmQgdGhlIHZhbHVlIHJ1bGUgb2YgYGtleVBhdGhzLnRzYCxcbiAqIGFuc3dlcmVkIGF0IGEgY29zdCBwcm9wb3J0aW9uYWwgdG8gdGhlIGFuc3dlciwgbm90IHRvIHRoZSBsb2cgKEYzLCA5LjMzLjApLlxuICpcbiAqIFdIWSBUSElTIEZJTEUgRVhJU1RTLiBUaGUgcnVsZXMgYXJlIHNpbXBsZSB0byBzdGF0ZSBhbmQgZXhwZW5zaXZlIHRvIGFwcGx5IG5haXZlbHk6IGEga2V5J3Mgd3JpdGVyc1xuICogaW5jbHVkZSB0aGUgY29tbWl0cyBBUk9VTkQgaXQgd2hvc2UgY2hhbmdlIHJlYWNoZWQgaXQsIGFuZCBkZWNpZGluZyB0aGF0IG5lZWRzIHRoZSB2YWx1ZSBhdCB0aGUga2V5XG4gKiBiZWZvcmUgYW5kIGFmdGVyIHN1Y2ggYSBjb21taXQg4oCUIGEgZm9sZCBvZiBpdHMgdG9wLWxldmVsIGtleS4gRm9sZGluZyBvbmNlIHBlciBLRVkgbWFkZSBhIGNhdXNhbCB3YWxrXG4gKiBvdmVyIG5lc3RlZCBrZXlzIGN1YmljIGluIHRoZSBsb2cgKGV2ZXJ5IGtleSByZS1zY2FubmVkIHRoZSBsb2cgYW5kIHJlLWZvbGRlZCBpdHMgcm9vdCkuIEhlcmU6XG4gKlxuICogICAtIHRoZSBsb2cgaXMgaW5kZXhlZCBPTkNFIChga2V5UGF0aHMgwrcgYnVpbGRXcml0ZXJJbmRleGAsIGEgcGF0aCB0cmllKTogYSBrZXkncyBjYW5kaWRhdGVzIGNvc3RcbiAqICAgICBPKGRlcHRoICsgbWF0Y2hlcykg4oCUIGl0cyBub2RlLCBpdHMgYW5jZXN0b3JzLCBpdHMgc3VidHJlZSDigJQgYW5kIHRoZSByb3dzIHVuZGVyIGEgdG9wLWxldmVsIGtleSBhcmVcbiAqICAgICByZWFjaGVkIHRocm91Z2ggdGhlIGluZGV4LCBuZXZlciBhIHNjYW47XG4gKiAgIC0gZWFjaCB0b3AtbGV2ZWwga2V5IGlzIGZvbGRlZCBPTkNFIChgdmVyYnMgwrcgZm9sZEtleWAsIGNvcHktb24td3JpdGUpLCBrZWVwaW5nIGl0cyB2YWx1ZSBiZWZvcmUgYW5kXG4gKiAgICAgYWZ0ZXIgZXZlcnkgY29tbWl0IGEgdmVyZGljdCBjYW4gYXNrIGFib3V0OiBhIGNvbW1pdCB3aXRoIGEgcm93IG9uIGEgcGF0aCB0aGF0IGhhcyB3cml0dGVuIHBhdGhzXG4gKiAgICAgYmVsb3cgaXQgKGl0IGNhbiBiZSBBUk9VTkQgYSB3cml0dGVuIGtleSksIGFuZCBhIGNvbW1pdCB0aGF0IHdyaXRlcyBUSFJPVUdIIGEgc3RyaW5nLXZhbHVlZFxuICogICAgIGNvbnRhaW5lciAoYG5hdGl2ZVNldGAgcmVwbGFjZXMgdGhlIHN0cmluZywgYW5kIHRoZSBjaGFyYWN0ZXJzIGEga2V5IHJlYWQgZnJvbSBpdCB2YW5pc2gg4oCUIHRoZSBvbmVcbiAqICAgICB3YXkgYSByb3cgQkVTSURFIGEga2V5IG1vdmVzIGl0KS4gQSBrZXkncyB2ZXJkaWN0IGlzIHRoZW4gdHdvIGBuYXRpdmVHZXRgcyBhbmQgYSBgZGVlcEVxdWFsYDtcbiAqICAgLSB0aGUgbGFzdCB3cml0ZXIgYmVmb3JlIGEgcG9pbnQgaXMgZm91bmQgTEFaSUxZOiB0aGUgbGFzdCB3cml0ZSBvbiBvciBpbnNpZGUgdGhlIGtleSwgdGhlbiBvbmx5IHRoZVxuICogICAgIGFyb3VuZC1jYW5kaWRhdGVzIGFmdGVyIGl0IOKAlCBtb3N0IHF1ZXN0aW9ucyBuZWVkIG5vIHZlcmRpY3QgYXQgYWxsLlxuICpcbiAqIE9uZSBzaGFwZSBrZWVwcyBhIHBlci1rZXkgZm9sZCAobWVtb2lzZWQgcGVyIGtleSk6IGEga2V5IHRoYXQgd2FzIG5ldmVyIHdyaXR0ZW4sIHVuZGVyIGEgY29udGFpbmVyIHRoYXRcbiAqIHdhcyBvbmx5IGV2ZXIgd3JpdHRlbiBXSE9MRSAoaXRzIG5vZGUgaGFzIG5vIHdyaXR0ZW4gY2hpbGRyZW4sIHNvIG5vIGdlbmVyYXRpb24gaXMga2VwdCB0aGVyZSkuXG4gKlxuICogQSBtb2RlbCBvZiBhIEZST1pFTiBsb2cgKGV2ZXJ5IGVuZ2luZSBsb2cgc2luY2UgRjM6IGBFdmVudExvZyDCtyByZWNvcmRgIGZyZWV6ZXMgZWFjaCBidW5kbGUgYW5kXG4gKiBgZ2V0U25hcHNob3RgIGZyZWV6ZXMgdGhlIGFycmF5KSBpcyBtZW1vaXNlZCBvbiB0aGUgbG9nIOKAlCB0aGUgcmVjb3JkIGNhbm5vdCBjaGFuZ2UgdW5kZXIgaXQuIEEgbG9nIHRoYXRcbiAqIGlzIG5vdCBmcm96ZW4gKGhhbmQtYnVpbHQsIHBhcnNlZCBmcm9tIEpTT04pIGdldHMgYSBmcmVzaCBtb2RlbCBwZXIgcXVlc3Rpb24uXG4gKi9cblxuaW1wb3J0IHR5cGUgeyBDb21taXRJZHggfSBmcm9tICcuLi9pZHMvcnVudGltZVN0YWdlSWQuanMnO1xuaW1wb3J0IHsgZGVlcEVxdWFsIH0gZnJvbSAnLi9lcXVhbGl0eS5qcyc7XG5pbXBvcnQge1xuICB0eXBlIFBhdGhOb2RlLFxuICB0eXBlIFdyaXRlckluZGV4LFxuICBhbmNlc3Rvck5vZGVzLFxuICBhc2NlbmRpbmdVbmlvbixcbiAgYmV0d2VlbixcbiAgYnVpbGRXcml0ZXJJbmRleCxcbiAgbGFzdEJlZm9yZSxcbiAgbm9kZUF0LFxuICBxdWVyeVdvcmssXG4gIHJlbGF0aW9uLFxuICByb290T2YsXG4gIHN1YnRyZWVQb3NpdGlvbnMsXG59IGZyb20gJy4va2V5UGF0aHMuanMnO1xuaW1wb3J0IHsgbmF0aXZlR2V0IH0gZnJvbSAnLi9wYXRoT3BzLmpzJztcbmltcG9ydCB7IERFTElNIH0gZnJvbSAnLi9wYXRocy5qcyc7XG5pbXBvcnQgdHlwZSB7IENvbW1pdEJ1bmRsZSB9IGZyb20gJy4vdHlwZXMuanMnO1xuaW1wb3J0IHsgdHlwZSBUb3VjaCwgZm9sZEtleSwgaXNWZXJiLCBVbmtub3duVmVyYkVycm9yIH0gZnJvbSAnLi92ZXJicy5qcyc7XG5cbi8qKiBUaGUgcm93cyB1bmRlciBvbmUgdG9wLWxldmVsIGtleSwgaW4gY29tbWl0IG9yZGVyIOKAlCB1cCB0byB0aGUgZmlyc3Qgcm93IHRoZSB2ZXJiIGxhdyByZWZ1c2VzLiAqL1xuaW50ZXJmYWNlIFJvb3RSb3dzIHtcbiAgcmVhZG9ubHkgcm93czogVG91Y2hbXTtcbiAgLyoqIFRoZSBmaXJzdCByb3cgdW5kZXIgdGhlIGtleSB3aG9zZSB2ZXJiIGlzIG5vbmUgb2YgdGhlIGZvdXIg4oCUIGV2ZXJ5IGFuc3dlciB0aGF0IHJlYWNoZXMgaXQgaXMgcmVmdXNlZC4gKi9cbiAgcmVhZG9ubHkgcmVmdXNlZD86IFVua25vd25WZXJiRXJyb3I7XG4gIHJlYWRvbmx5IHJlZnVzZWRBdDogbnVtYmVyO1xufVxuXG4vKiogT25lIHRvcC1sZXZlbCBrZXkgZm9sZGVkIG9uY2U6IGl0cyB2YWx1ZSBiZWZvcmUgYW5kIGFmdGVyIGV2ZXJ5IGNvbW1pdCBhIHZlcmRpY3QgY2FuIGFzayBhYm91dC4gKi9cbmludGVyZmFjZSBSb290SGlzdG9yeSB7XG4gIHJlYWRvbmx5IGtlcHQ6IE1hcDxudW1iZXIsIHsgcmVhZG9ubHkgYmVmb3JlOiB1bmtub3duOyByZWFkb25seSBhZnRlcjogdW5rbm93biB9PjtcbiAgLyoqIFRoZSBrZXB0IGNvbW1pdHMsIGFzY2VuZGluZy4gKi9cbiAgcmVhZG9ubHkga2VwdEF0OiByZWFkb25seSBudW1iZXJbXTtcbiAgLyoqIENvbW1pdHMgdGhhdCB3cm90ZSBUSFJPVUdIIGEgc3RyaW5nLXZhbHVlZCBjb250YWluZXIsIGJ5IHRoZSBub2RlIG9mIHRoYXQgY29udGFpbmVyLiAqL1xuICByZWFkb25seSByZXBsYWNlZDogTWFwPFBhdGhOb2RlLCBudW1iZXJbXT47XG59XG5cbmNvbnN0IE1PREVMUyA9IG5ldyBXZWFrTWFwPHJlYWRvbmx5IENvbW1pdEJ1bmRsZVtdLCBMb2dNb2RlbD4oKTtcblxuLyoqIElzIHRoZSBsb2cgaW1tdXRhYmxlIOKAlCB0aGUgYXJyYXkgYW5kIGV2ZXJ5IGJ1bmRsZSBhbmQgdHJhY2UgZnJvemVuIChhbiBlbmdpbmUgc25hcHNob3QncyBsb2cpPyAqL1xuZnVuY3Rpb24gaXNGcm96ZW5Mb2cobG9nOiByZWFkb25seSBDb21taXRCdW5kbGVbXSk6IGJvb2xlYW4ge1xuICBpZiAoIU9iamVjdC5pc0Zyb3plbihsb2cpKSByZXR1cm4gZmFsc2U7XG4gIC8vIFRoZSBzaGFwZSBgRXZlbnRMb2cgwrcgcmVjb3JkYCBsZWF2ZXM6IHRoZSBidW5kbGUsIGl0cyBwYXlsb2FkcyBhbmQgaXRzIHJvd3MuIEEgaGFuZC1idWlsdCBsb2dcbiAgLy8gZnJvemVuIGxlc3MgZGVlcGx5IHRoYW4gdGhhdCBjb3VsZCBjaGFuZ2UgYWZ0ZXIgYSBxdWVyeSwgc28gaXQgaXMgbmV2ZXIgbWVtb2lzZWQuXG4gIGZvciAoY29uc3QgYnVuZGxlIG9mIGxvZykge1xuICAgIGlmICghT2JqZWN0LmlzRnJvemVuKGJ1bmRsZSkgfHwgIU9iamVjdC5pc0Zyb3plbihidW5kbGUudHJhY2UpKSByZXR1cm4gZmFsc2U7XG4gICAgaWYgKCFPYmplY3QuaXNGcm96ZW4oYnVuZGxlLm92ZXJ3cml0ZSkgfHwgIU9iamVjdC5pc0Zyb3plbihidW5kbGUudXBkYXRlcykpIHJldHVybiBmYWxzZTtcbiAgICBpZiAoIWJ1bmRsZS50cmFjZS5ldmVyeSgocm93KSA9PiBPYmplY3QuaXNGcm96ZW4ocm93KSkpIHJldHVybiBmYWxzZTtcbiAgfVxuICByZXR1cm4gdHJ1ZTtcbn1cblxuLyoqIFRoZSByZWFkIG1vZGVsIG9mIGBsb2dgIOKAlCBtZW1vaXNlZCB3aGVuIHRoZSBsb2cgaXMgZnJvemVuLCBmcmVzaCBvdGhlcndpc2UuICovXG5leHBvcnQgZnVuY3Rpb24gbG9nTW9kZWwobG9nOiByZWFkb25seSBDb21taXRCdW5kbGVbXSk6IExvZ01vZGVsIHtcbiAgY29uc3QgbWVtbyA9IE1PREVMUy5nZXQobG9nKTtcbiAgaWYgKG1lbW8gIT09IHVuZGVmaW5lZCkgcmV0dXJuIG1lbW87XG4gIGNvbnN0IG1vZGVsID0gbmV3IExvZ01vZGVsKGxvZyk7XG4gIGlmIChpc0Zyb3plbkxvZyhsb2cpKSBNT0RFTFMuc2V0KGxvZywgbW9kZWwpO1xuICByZXR1cm4gbW9kZWw7XG59XG5cbi8qKiBUaGUgbWVtb2lzZWQgbW9kZWwgb2YgYSBmcm96ZW4gbG9nIChidWlsdCBvbiBmaXJzdCBhc2spLCBvciB1bmRlZmluZWQgZm9yIGEgbG9nIHRoYXQgaXMgbm90IGZyb3plbi4gKi9cbmV4cG9ydCBmdW5jdGlvbiBtZW1vaXNlZE1vZGVsKGxvZzogcmVhZG9ubHkgQ29tbWl0QnVuZGxlW10pOiBMb2dNb2RlbCB8IHVuZGVmaW5lZCB7XG4gIHJldHVybiBNT0RFTFMuZ2V0KGxvZykgPz8gKGlzRnJvemVuTG9nKGxvZykgPyBsb2dNb2RlbChsb2cpIDogdW5kZWZpbmVkKTtcbn1cblxuLyoqIERvZXMgdGhlIGNvbW1pdCBob2xkIGEgbm9uLWBkZWxldGVgIHJvdyBvbiBga2V5YCBvciBpbnNpZGUgaXQ/IChBIGBkZWxldGVgIGNhbm5vdCByZXBsYWNlIGEgc3RyaW5nIGNvbnRhaW5lci4pICovXG5leHBvcnQgZnVuY3Rpb24gd3JpdGVzQXRPckluc2lkZShidW5kbGU6IENvbW1pdEJ1bmRsZSwga2V5OiBzdHJpbmcpOiBib29sZWFuIHtcbiAgZm9yIChjb25zdCB0IG9mIGJ1bmRsZS50cmFjZSkge1xuICAgIGlmICh0LnZlcmIgPT09ICdkZWxldGUnKSBjb250aW51ZTtcbiAgICBjb25zdCByID0gcmVsYXRpb24odC5wYXRoLCBrZXkpO1xuICAgIGlmIChyID09PSAnZXhhY3QnIHx8IHIgPT09ICdpbnNpZGUnKSByZXR1cm4gdHJ1ZTtcbiAgfVxuICByZXR1cm4gZmFsc2U7XG59XG5cbi8qKlxuICogQ2FuIHRoaXMgY29tbWl0IGxlYXZlIGEgU1RSSU5HLXZhbHVlZCBjb250YWluZXIgYWJvdmUgYGtleWAg4oCUIGEgcm93IGFyb3VuZCB0aGUga2V5IHdob3NlIHJlY29yZGVkIHZhbHVlXG4gKiBob2xkcyBhIHN0cmluZyBhdCB0aGUgcm93J3MgcGF0aCBvciBhbnl3aGVyZSBiZXR3ZWVuIGl0IGFuZCB0aGUga2V5PyBPbmx5IHRoZW4gY2FuIGEgbGF0ZXIgd3JpdGUgYmVzaWRlIHRoZVxuICoga2V5IG1vdmUgaXQgKGBuYXRpdmVTZXRgIHJlcGxhY2VzIHRoZSBzdHJpbmcpLiBBIGNvbnNlcnZhdGl2ZSwgcGF5bG9hZC1vbmx5IGNoZWNrOiBubyBmb2xkLlxuICovXG5leHBvcnQgZnVuY3Rpb24gbGVhdmVzU3RyaW5nQWJvdmUoYnVuZGxlOiBDb21taXRCdW5kbGUsIGtleTogc3RyaW5nKTogYm9vbGVhbiB7XG4gIGNvbnN0IGtleVNlZ3MgPSBrZXkuc3BsaXQoREVMSU0pO1xuICBmb3IgKGNvbnN0IHQgb2YgYnVuZGxlLnRyYWNlKSB7XG4gICAgaWYgKHQudmVyYiA9PT0gJ2RlbGV0ZScgfHwgcmVsYXRpb24odC5wYXRoLCBrZXkpICE9PSAnYXJvdW5kJykgY29udGludWU7XG4gICAgY29uc3Qgc2VncyA9IHQucGF0aC5zcGxpdChERUxJTSk7XG4gICAgbGV0IHZhbHVlOiB1bmtub3duID0gbmF0aXZlR2V0KHQudmVyYiA9PT0gJ21lcmdlJyA/IGJ1bmRsZS51cGRhdGVzIDogYnVuZGxlLm92ZXJ3cml0ZSwgc2Vncyk7XG4gICAgZm9yIChsZXQgZGVwdGggPSBzZWdzLmxlbmd0aDsgZGVwdGggPCBrZXlTZWdzLmxlbmd0aDsgZGVwdGgrKykge1xuICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycpIHJldHVybiB0cnVlO1xuICAgICAgaWYgKHZhbHVlID09PSBudWxsIHx8IHR5cGVvZiB2YWx1ZSAhPT0gJ29iamVjdCcpIGJyZWFrO1xuICAgICAgdmFsdWUgPSBuYXRpdmVHZXQodmFsdWUsIFtrZXlTZWdzW2RlcHRoXV0pO1xuICAgIH1cbiAgfVxuICByZXR1cm4gZmFsc2U7XG59XG5cbmV4cG9ydCBjbGFzcyBMb2dNb2RlbCB7XG4gIHJlYWRvbmx5IGluZGV4OiBXcml0ZXJJbmRleDtcbiAgcHJpdmF0ZSByZWFkb25seSByb290cyA9IG5ldyBNYXA8c3RyaW5nLCBSb290Um93cz4oKTtcbiAgcHJpdmF0ZSByZWFkb25seSBoaXN0b3JpZXMgPSBuZXcgTWFwPHN0cmluZywgUm9vdEhpc3Rvcnk+KCk7XG4gIHByaXZhdGUgcmVhZG9ubHkgY2hhbmdlc0J5S2V5ID0gbmV3IE1hcDxzdHJpbmcsIG51bWJlcltdPigpO1xuICBwcml2YXRlIHJlYWRvbmx5IHdyaXRlcnNCeUtleSA9IG5ldyBNYXA8c3RyaW5nLCBudW1iZXJbXT4oKTtcblxuICBjb25zdHJ1Y3RvcihyZWFkb25seSBsb2c6IHJlYWRvbmx5IENvbW1pdEJ1bmRsZVtdKSB7XG4gICAgdGhpcy5pbmRleCA9IGJ1aWxkV3JpdGVySW5kZXgobG9nKTtcbiAgICBmb3IgKGNvbnN0IGJ1bmRsZSBvZiBsb2cpIHF1ZXJ5V29yay51bml0cyArPSBidW5kbGUudHJhY2UubGVuZ3RoO1xuICB9XG5cbiAgLy8g4pSA4pSAIHJvd3Mg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbiAgcHJpdmF0ZSByb290Um93cyhyb290OiBzdHJpbmcpOiBSb290Um93cyB7XG4gICAgbGV0IGVudHJ5ID0gdGhpcy5yb290cy5nZXQocm9vdCk7XG4gICAgaWYgKGVudHJ5ICE9PSB1bmRlZmluZWQpIHJldHVybiBlbnRyeTtcbiAgICBjb25zdCBub2RlID0gdGhpcy5pbmRleC5yb290cy5nZXQocm9vdCk7XG4gICAgY29uc3Qgcm93czogVG91Y2hbXSA9IFtdO1xuICAgIGxldCByZWZ1c2VkOiBVbmtub3duVmVyYkVycm9yIHwgdW5kZWZpbmVkO1xuICAgIGxldCByZWZ1c2VkQXQgPSBOdW1iZXIuUE9TSVRJVkVfSU5GSU5JVFk7XG4gICAgaWYgKG5vZGUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgZm9yIChjb25zdCBjIG9mIHN1YnRyZWVQb3NpdGlvbnMobm9kZSkpIHtcbiAgICAgICAgY29uc3QgdHJhY2UgPSB0aGlzLmxvZ1tjXS50cmFjZTtcbiAgICAgICAgcXVlcnlXb3JrLnVuaXRzICs9IHRyYWNlLmxlbmd0aDtcbiAgICAgICAgZm9yIChsZXQgcm93ID0gMDsgcm93IDwgdHJhY2UubGVuZ3RoICYmIHJlZnVzZWQgPT09IHVuZGVmaW5lZDsgcm93KyspIHtcbiAgICAgICAgICBjb25zdCB7IHBhdGgsIHZlcmIgfSA9IHRyYWNlW3Jvd107XG4gICAgICAgICAgaWYgKHBhdGggIT09IHJvb3QgJiYgcmVsYXRpb24ocGF0aCwgcm9vdCkgIT09ICdpbnNpZGUnKSBjb250aW51ZTtcbiAgICAgICAgICBpZiAoIWlzVmVyYih2ZXJiKSkge1xuICAgICAgICAgICAgcmVmdXNlZCA9IG5ldyBVbmtub3duVmVyYkVycm9yKHZlcmIsIHsgcGF0aCwgcm93LCBjb21taXQ6IGMgfSk7XG4gICAgICAgICAgICByZWZ1c2VkQXQgPSBjO1xuICAgICAgICAgICAgLy8gdGhlIHJlZnVzZWQgY29tbWl0IGFuZCBldmVyeXRoaW5nIGFmdGVyIGl0IGFyZSBsZWZ0IG91dDogYW4gYW5zd2VyIHRoYXQgcmVhY2hlcyB0aGVtIGlzIHJlZnVzZWRcbiAgICAgICAgICAgIHdoaWxlIChyb3dzLmxlbmd0aCA+IDAgJiYgcm93c1tyb3dzLmxlbmd0aCAtIDFdLmNvbW1pdElkeCA9PT0gYykgcm93cy5wb3AoKTtcbiAgICAgICAgICB9IGVsc2Ugcm93cy5wdXNoKHsgdmVyYiwgYnVuZGxlOiB0aGlzLmxvZ1tjXSwgY29tbWl0SWR4OiBjIGFzIENvbW1pdElkeCwgcGF0aCB9KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAocmVmdXNlZCAhPT0gdW5kZWZpbmVkKSBicmVhaztcbiAgICAgIH1cbiAgICB9XG4gICAgZW50cnkgPSB7IHJvd3MsIC4uLihyZWZ1c2VkICE9PSB1bmRlZmluZWQgJiYgeyByZWZ1c2VkIH0pLCByZWZ1c2VkQXQgfTtcbiAgICB0aGlzLnJvb3RzLnNldChyb290LCBlbnRyeSk7XG4gICAgcmV0dXJuIGVudHJ5O1xuICB9XG5cbiAgLyoqIFJlZnVzZSBhbiBhbnN3ZXIgdGhhdCByZWFjaGVzIGEgcm93IHdob3NlIHZlcmIgdGhlIGxhdyBkb2VzIG5vdCBrbm93IChvbmUgaW4gY29tbWl0cyBgYWZ0ZXJgIDwgYyDiiaQgYGVuZGApLiAqL1xuICBwcml2YXRlIHJlZnVzZVRocm91Z2gocm9vdDogc3RyaW5nLCBlbmQ6IG51bWJlciwgYWZ0ZXIgPSAtMSk6IFJvb3RSb3dzIHtcbiAgICBjb25zdCByciA9IHRoaXMucm9vdFJvd3Mocm9vdCk7XG4gICAgaWYgKHJyLnJlZnVzZWQgIT09IHVuZGVmaW5lZCAmJiByci5yZWZ1c2VkQXQgPD0gZW5kICYmIHJyLnJlZnVzZWRBdCA+IGFmdGVyKSB0aHJvdyByci5yZWZ1c2VkO1xuICAgIHJldHVybiBycjtcbiAgfVxuXG4gIC8qKiBFdmVyeSByb3cgdW5kZXIgYGtleWAncyB0b3AtbGV2ZWwga2V5IHVwIHRvIGBlbmRgLCB3aXRoIGl0cyByZWxhdGlvbiB0byBga2V5YCDigJQgdGhyb3VnaCB0aGUgaW5kZXguICovXG4gIHJvd3NVbmRlclJvb3Qoa2V5OiBzdHJpbmcsIGVuZDogbnVtYmVyKTogVG91Y2hbXSB7XG4gICAgY29uc3QgcnIgPSB0aGlzLnJlZnVzZVRocm91Z2gocm9vdE9mKGtleSksIGVuZCk7XG4gICAgY29uc3Qgb3V0OiBUb3VjaFtdID0gW107XG4gICAgZm9yIChjb25zdCB0IG9mIHJyLnJvd3MpIHtcbiAgICAgIGlmICh0LmNvbW1pdElkeCA+IGVuZCkgYnJlYWs7XG4gICAgICBjb25zdCByID0gcmVsYXRpb24odC5wYXRoLCBrZXkpO1xuICAgICAgb3V0LnB1c2gociA9PT0gdW5kZWZpbmVkID8gdCA6IHsgLi4udCwgcmVsYXRpb246IHIgfSk7XG4gICAgfVxuICAgIHJldHVybiBvdXQ7XG4gIH1cblxuICAvLyDilIDilIAgdGhlIHJvb3QgZm9sZCwgb25jZSBwZXIgdG9wLWxldmVsIGtleSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuICBwcml2YXRlIGhpc3Rvcnkocm9vdDogc3RyaW5nKTogUm9vdEhpc3Rvcnkge1xuICAgIGxldCBoID0gdGhpcy5oaXN0b3JpZXMuZ2V0KHJvb3QpO1xuICAgIGlmIChoICE9PSB1bmRlZmluZWQpIHJldHVybiBoO1xuICAgIGNvbnN0IGtlcHQgPSBuZXcgTWFwPG51bWJlciwgeyBiZWZvcmU6IHVua25vd247IGFmdGVyOiB1bmtub3duIH0+KCk7XG4gICAgY29uc3QgcmVwbGFjZWQgPSBuZXcgTWFwPFBhdGhOb2RlLCBudW1iZXJbXT4oKTtcbiAgICBjb25zdCByciA9IHRoaXMucm9vdFJvd3Mocm9vdCk7XG4gICAgcXVlcnlXb3JrLnVuaXRzICs9IHJyLnJvd3MubGVuZ3RoO1xuICAgIGZvbGRLZXkocnIucm93cywgW3Jvb3RdLCB7XG4gICAgICBnZW5lcmF0aW9uczoge1xuICAgICAgICBhdDogKGMsIHN0YXRlKSA9PiB7XG4gICAgICAgICAgbGV0IGtlZXAgPSBmYWxzZTtcbiAgICAgICAgICBxdWVyeVdvcmsudW5pdHMgKz0gdGhpcy5sb2dbY10udHJhY2UubGVuZ3RoO1xuICAgICAgICAgIGZvciAoY29uc3QgdCBvZiB0aGlzLmxvZ1tjXS50cmFjZSkge1xuICAgICAgICAgICAgaWYgKHQucGF0aCAhPT0gcm9vdCAmJiByZWxhdGlvbih0LnBhdGgsIHJvb3QpICE9PSAnaW5zaWRlJykgY29udGludWU7XG4gICAgICAgICAgICBpZiAoKG5vZGVBdCh0aGlzLmluZGV4LCB0LnBhdGgpPy5jaGlsZHJlbi5zaXplID8/IDApID4gMCkga2VlcCA9IHRydWU7XG4gICAgICAgICAgICBjb25zdCBzZWdzID0gdC5wYXRoLnNwbGl0KERFTElNKTtcbiAgICAgICAgICAgIGZvciAobGV0IGogPSAxOyBqIDwgc2Vncy5sZW5ndGg7IGorKykge1xuICAgICAgICAgICAgICBpZiAodHlwZW9mIG5hdGl2ZUdldChzdGF0ZSwgc2Vncy5zbGljZSgwLCBqKSkgIT09ICdzdHJpbmcnKSBjb250aW51ZTtcbiAgICAgICAgICAgICAgY29uc3QgY29udGFpbmVyID0gbm9kZUF0KHRoaXMuaW5kZXgsIHNlZ3Muc2xpY2UoMCwgaikuam9pbihERUxJTSkpO1xuICAgICAgICAgICAgICBpZiAoY29udGFpbmVyICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBsaXN0ID0gcmVwbGFjZWQuZ2V0KGNvbnRhaW5lcikgPz8gW107XG4gICAgICAgICAgICAgICAgaWYgKGxpc3RbbGlzdC5sZW5ndGggLSAxXSAhPT0gYykgbGlzdC5wdXNoKGMpO1xuICAgICAgICAgICAgICAgIHJlcGxhY2VkLnNldChjb250YWluZXIsIGxpc3QpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGtlZXAgPSB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4ga2VlcDtcbiAgICAgICAgfSxcbiAgICAgICAga2VlcDogKGMsIGJlZm9yZSwgYWZ0ZXIpID0+IHtcbiAgICAgICAgICBrZXB0LnNldChjLCB7IGJlZm9yZSwgYWZ0ZXIgfSk7XG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgIH0pO1xuICAgIGggPSB7IGtlcHQsIGtlcHRBdDogWy4uLmtlcHQua2V5cygpXS5zb3J0KChhLCBiKSA9PiBhIC0gYiksIHJlcGxhY2VkIH07XG4gICAgdGhpcy5oaXN0b3JpZXMuc2V0KHJvb3QsIGgpO1xuICAgIHJldHVybiBoO1xuICB9XG5cbiAgLyoqIEEga2V5IG5ldmVyIHdyaXR0ZW4sIHVuZGVyIGEgY29udGFpbmVyIG9ubHkgZXZlciB3cml0dGVuIHdob2xlOiBubyBnZW5lcmF0aW9uIGlzIGtlcHQgZm9yIGl0LiAqL1xuICBwcml2YXRlIG5lZWRzT3duRm9sZChrZXk6IHN0cmluZywgYW5jZXN0b3JzOiByZWFkb25seSBQYXRoTm9kZVtdKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIG5vZGVBdCh0aGlzLmluZGV4LCBrZXkpID09PSB1bmRlZmluZWQgJiYgYW5jZXN0b3JzW2FuY2VzdG9ycy5sZW5ndGggLSAxXS5jaGlsZHJlbi5zaXplID09PSAwO1xuICB9XG5cbiAgLyoqIEV2ZXJ5IGNvbW1pdCBhY3Jvc3Mgd2hpY2ggdGhlIHZhbHVlIGF0IGBrZXlgIGNoYW5nZWQg4oCUIG9uZSBmb2xkIGZvciB0aGlzIGtleSAodGhlIGZhbGxiYWNrIHNoYXBlKS4gKi9cbiAgcHJpdmF0ZSBvd25DaGFuZ2VzKGtleTogc3RyaW5nKTogbnVtYmVyW10ge1xuICAgIGxldCBjaGFuZ2VzID0gdGhpcy5jaGFuZ2VzQnlLZXkuZ2V0KGtleSk7XG4gICAgaWYgKGNoYW5nZXMgIT09IHVuZGVmaW5lZCkgcmV0dXJuIGNoYW5nZXM7XG4gICAgY29uc3Qgc2VncyA9IGtleS5zcGxpdChERUxJTSk7XG4gICAgY29uc3QgdmVyZGljdCA9IG5ldyBNYXA8bnVtYmVyLCBib29sZWFuPigpO1xuICAgIGxldCBjb21taXQgPSAtMTtcbiAgICBsZXQgc3RhcnQ6IHVua25vd247XG4gICAgcXVlcnlXb3JrLnVuaXRzICs9IHRoaXMucm9vdFJvd3Moc2Vnc1swXSkucm93cy5sZW5ndGg7XG4gICAgZm9sZEtleSh0aGlzLnJvb3RSb3dzKHNlZ3NbMF0pLnJvd3MsIHNlZ3MsIHtcbiAgICAgIGV2ZXJ5Um93OiB0cnVlLFxuICAgICAgb2JzZXJ2ZTogKHRvdWNoLCBiZWZvcmUsIGFmdGVyKSA9PiB7XG4gICAgICAgIGlmICh0b3VjaC5jb21taXRJZHggIT09IGNvbW1pdCkge1xuICAgICAgICAgIGNvbW1pdCA9IHRvdWNoLmNvbW1pdElkeDtcbiAgICAgICAgICBzdGFydCA9IGJlZm9yZTtcbiAgICAgICAgfVxuICAgICAgICB2ZXJkaWN0LnNldChjb21taXQsICFkZWVwRXF1YWwoc3RhcnQsIGFmdGVyLCAnY29waWVzJykpO1xuICAgICAgfSxcbiAgICB9KTtcbiAgICBjaGFuZ2VzID0gWy4uLnZlcmRpY3RdLmZpbHRlcigoWywgY2hhbmdlZF0pID0+IGNoYW5nZWQpLm1hcCgoW2NdKSA9PiBjKTtcbiAgICB0aGlzLmNoYW5nZXNCeUtleS5zZXQoa2V5LCBjaGFuZ2VzKTtcbiAgICByZXR1cm4gY2hhbmdlcztcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgY29tbWl0cyBpbiB0aGUgT1BFTiByYW5nZSAoYGFmdGVyYCwgYGJlZm9yZWApIHdpdGggbm8gcm93IG9uIG9yIGluc2lkZSBga2V5YCBhY3Jvc3Mgd2hpY2ggdGhlIHZhbHVlXG4gICAqIGF0IGBrZXlgIGNoYW5nZWQg4oCUIHRoZSBBUk9VTkQgaGFsZiBvZiB0aGUgd3JpdGVyIHJ1bGUgKGFuZCB0aGUgc3RyaW5nLWNvbnRhaW5lciBjYXNlIGJlc2lkZSBpdCkuXG4gICAqL1xuICBwcml2YXRlIGNoYW5nZWRBcm91bmQoa2V5OiBzdHJpbmcsIGFmdGVyOiBudW1iZXIsIGJlZm9yZTogbnVtYmVyKTogcmVhZG9ubHkgbnVtYmVyW10ge1xuICAgIGNvbnN0IGFuY2VzdG9ycyA9IGFuY2VzdG9yTm9kZXModGhpcy5pbmRleCwga2V5KTtcbiAgICBpZiAoYW5jZXN0b3JzLmxlbmd0aCA9PT0gMCB8fCBhbmNlc3RvcnMuZXZlcnkoKGEpID0+IGEucG9zaXRpb25zLmxlbmd0aCA9PT0gMCkpIHJldHVybiBbXTtcbiAgICBjb25zdCByb290ID0gYW5jZXN0b3JzWzBdLnBhdGg7XG4gICAgLy8gVGhlIGFuc3dlciByZWFkcyB0aGUgcm93cyBvZiB0aGUgd2luZG93OiByZWZ1c2UgaXQgd2hlbiBvbmUgb2YgdGhlbSBpcyBhIHZlcmIgdGhlIGxhdyBkb2VzIG5vdCBrbm93LlxuICAgIHRoaXMucmVmdXNlVGhyb3VnaChyb290LCBiZWZvcmUgLSAxLCBhZnRlcik7XG4gICAgaWYgKHRoaXMubmVlZHNPd25Gb2xkKGtleSwgYW5jZXN0b3JzKSkgcmV0dXJuIGJldHdlZW4odGhpcy5vd25DaGFuZ2VzKGtleSksIGFmdGVyLCBiZWZvcmUpO1xuICAgIGNvbnN0IGggPSB0aGlzLmhpc3Rvcnkocm9vdCk7XG4gICAgY29uc3QgY2FuZGlkYXRlcyA9IGFzY2VuZGluZ1VuaW9uKFtcbiAgICAgIC4uLmFuY2VzdG9ycy5tYXAoKGEpID0+IGJldHdlZW4oYS5wb3NpdGlvbnMsIGFmdGVyLCBiZWZvcmUpKSxcbiAgICAgIC4uLmFuY2VzdG9ycy5tYXAoKGEpID0+IGJldHdlZW4oaC5yZXBsYWNlZC5nZXQoYSkgPz8gW10sIGFmdGVyLCBiZWZvcmUpKSxcbiAgICBdKTtcbiAgICBjb25zdCByZXN0ID0ga2V5LnNwbGl0KERFTElNKS5zbGljZSgxKTtcbiAgICBxdWVyeVdvcmsudW5pdHMgKz0gY2FuZGlkYXRlcy5sZW5ndGg7XG4gICAgcmV0dXJuIGNhbmRpZGF0ZXMuZmlsdGVyKChjKSA9PiB7XG4gICAgICBjb25zdCBnID0gaC5rZXB0LmdldChjKTtcbiAgICAgIHJldHVybiBnICE9PSB1bmRlZmluZWQgJiYgIWRlZXBFcXVhbChuYXRpdmVHZXQoZy5iZWZvcmUsIHJlc3QpLCBuYXRpdmVHZXQoZy5hZnRlciwgcmVzdCksICdjb3BpZXMnKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8vIOKUgOKUgCB0aGUgd3JpdGVyIHJ1bGUg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbiAgLyoqIEV2ZXJ5IGNvbW1pdCB0aGF0IFdST1RFIGBrZXlgLCBhc2NlbmRpbmcgKG1lbW9pc2VkIHBlciBrZXkpLiAqL1xuICB3cml0ZXJzT2Yoa2V5OiBzdHJpbmcpOiByZWFkb25seSBudW1iZXJbXSB7XG4gICAgbGV0IHdyaXRlcnMgPSB0aGlzLndyaXRlcnNCeUtleS5nZXQoa2V5KTtcbiAgICBpZiAod3JpdGVycyAhPT0gdW5kZWZpbmVkKSByZXR1cm4gd3JpdGVycztcbiAgICBjb25zdCBub2RlID0gbm9kZUF0KHRoaXMuaW5kZXgsIGtleSk7XG4gICAgY29uc3QgYXRPckluc2lkZSA9IG5vZGUgPT09IHVuZGVmaW5lZCA/IFtdIDogc3VidHJlZVBvc2l0aW9ucyhub2RlKTtcbiAgICBjb25zdCBhcm91bmQgPSB0aGlzLmNoYW5nZWRBcm91bmQoa2V5LCAtMSwgTnVtYmVyLlBPU0lUSVZFX0lORklOSVRZKTtcbiAgICB3cml0ZXJzID0gYXJvdW5kLmxlbmd0aCA9PT0gMCA/IGF0T3JJbnNpZGUuc2xpY2UoKSA6IGFzY2VuZGluZ1VuaW9uKFthdE9ySW5zaWRlLCBhcm91bmRdKTtcbiAgICB0aGlzLndyaXRlcnNCeUtleS5zZXQoa2V5LCB3cml0ZXJzKTtcbiAgICByZXR1cm4gd3JpdGVycztcbiAgfVxuXG4gIC8qKiBUaGUgQVJSQVkgcG9zaXRpb24gb2YgdGhlIGxhc3QgY29tbWl0IGJlZm9yZSBgYmVmb3JlYCB0aGF0IHdyb3RlIGBrZXlgLCBvciAtMS4gKi9cbiAgbGFzdFdyaXRlckJlZm9yZShrZXk6IHN0cmluZywgYmVmb3JlOiBudW1iZXIpOiBudW1iZXIge1xuICAgIHF1ZXJ5V29yay51bml0cyArPSAxO1xuICAgIGNvbnN0IG5vZGUgPSBub2RlQXQodGhpcy5pbmRleCwga2V5KTtcbiAgICBjb25zdCBsYXN0QUkgPSBub2RlID09PSB1bmRlZmluZWQgPyAtMSA6IGxhc3RCZWZvcmUoc3VidHJlZVBvc2l0aW9ucyhub2RlKSwgYmVmb3JlKTtcbiAgICBjb25zdCBhbmNlc3RvcnMgPSBhbmNlc3Rvck5vZGVzKHRoaXMuaW5kZXgsIGtleSk7XG4gICAgcXVlcnlXb3JrLnVuaXRzICs9IGFuY2VzdG9ycy5sZW5ndGg7IC8vIHRoZSBzY2FucyBvdmVyIHRoZW0gYmVsb3dcbiAgICBpZiAoYW5jZXN0b3JzLmxlbmd0aCA9PT0gMCkgcmV0dXJuIGxhc3RBSTtcbiAgICAvLyBBIHJvdyBhcm91bmQgdGhlIGtleSBpbiB0aGUgbGFzdCB3cml0ZSdzIE9XTiBjb21taXQgY291bnRzIHdoZW4gaXQgY2FuIGxlYXZlIGEgc3RyaW5nIGNvbnRhaW5lciBhYm92ZVxuICAgIC8vIHRoZSBrZXkgKGEgbGF0ZXIgd3JpdGUgYmVzaWRlIHRoZSBrZXkgdGhlbiByZXBsYWNlcyBpdCkuXG4gICAgY29uc3QgYXJvdW5kSW5XaW5kb3cgPVxuICAgICAgYW5jZXN0b3JzLnNvbWUoKGEpID0+IGJldHdlZW4oYS5wb3NpdGlvbnMsIGxhc3RBSSwgYmVmb3JlKS5sZW5ndGggPiAwKSB8fFxuICAgICAgKGxhc3RBSSAhPT0gLTEgJiYgbGVhdmVzU3RyaW5nQWJvdmUodGhpcy5sb2dbbGFzdEFJXSwga2V5KSk7XG4gICAgLy8gQSBgZGVsZXRlYCBjYW5ub3QgcmVwbGFjZSBhIHN0cmluZyBjb250YWluZXIsIHNvIGEgY2hhcmFjdGVyIHJlYWQgdGhyb3VnaCBvbmUgY2FuIHN0aWxsIG1vdmUgYWZ0ZXIgaXQuXG4gICAgY29uc3QgZGVsZXRlT25seSA9IGxhc3RBSSAhPT0gLTEgJiYgIXdyaXRlc0F0T3JJbnNpZGUodGhpcy5sb2dbbGFzdEFJXSwga2V5KTtcbiAgICBpZiAoIWFyb3VuZEluV2luZG93ICYmICEoZGVsZXRlT25seSAmJiBhbmNlc3RvcnMuc29tZSgoYSkgPT4gYS5wb3NpdGlvbnMubGVuZ3RoID4gMCkpKSByZXR1cm4gbGFzdEFJO1xuICAgIGNvbnN0IGNoYW5nZWQgPSB0aGlzLmNoYW5nZWRBcm91bmQoa2V5LCBsYXN0QUksIGJlZm9yZSk7XG4gICAgcmV0dXJuIGNoYW5nZWQubGVuZ3RoID4gMCA/IGNoYW5nZWRbY2hhbmdlZC5sZW5ndGggLSAxXSA6IGxhc3RBSTtcbiAgfVxuXG4gIC8vIOKUgOKUgCB0aGUgdmFsdWUgcnVsZSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuICAvKipcbiAgICogVGhlIHZhbHVlIG9mIGBrZXlgIGFmdGVyIGNvbW1pdCBgaWR4YCAoaW5jbHVzaXZlKS4gVGhlIGZvbGQgb2YgdGhlIHJvd3MgdW5kZXIgaXRzIHRvcC1sZXZlbCBrZXkg4oCUIGJ1dFxuICAgKiB3aGVuIGl0cyBsYXN0IHRvdGFsIHJvdyB1cCB0byBgaWR4YCBpcyBhIGBzZXRgIE9OIHRoZSBrZXkgYW5kIG5vdGhpbmcgYXJvdW5kIGl0IHdhcyB3cml0dGVuIHNpbmNlLCBvbmx5XG4gICAqIHRoZSByb3dzIG9uIGFuZCBpbnNpZGUgdGhlIGtleSBmcm9tIHRoYXQgYHNldGAgb24gY2FuIG1vdmUgaXQsIGFuZCBvbmx5IHRoZXkgYXJlIGZvbGRlZC5cbiAgICovXG4gIHZhbHVlQXQoa2V5OiBzdHJpbmcsIGlkeDogbnVtYmVyKTogdW5rbm93biB7XG4gICAgY29uc3Qgc2VncyA9IGtleS5zcGxpdChERUxJTSk7XG4gICAgdGhpcy5yZWZ1c2VUaHJvdWdoKHNlZ3NbMF0sIGlkeCk7XG4gICAgY29uc3Qgbm9kZSA9IG5vZGVBdCh0aGlzLmluZGV4LCBrZXkpO1xuICAgIGNvbnN0IGFuY2VzdG9ycyA9IGFuY2VzdG9yTm9kZXModGhpcy5pbmRleCwga2V5KTtcbiAgICBpZiAobm9kZSA9PT0gdW5kZWZpbmVkICYmIGFuY2VzdG9ycy5sZW5ndGggPT09IDApIHJldHVybiB1bmRlZmluZWQ7XG4gICAgaWYgKG5vZGUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgY29uc3QgYW5jaG9yID0gbGFzdEJlZm9yZShub2RlLnRvdGFscywgaWR4ICsgMSk7XG4gICAgICBpZiAoXG4gICAgICAgIGFuY2hvciAhPT0gLTEgJiZcbiAgICAgICAgbGFzdFRvdGFsSXNTZXQodGhpcy5sb2dbYW5jaG9yXSwga2V5KSAmJlxuICAgICAgICBhbmNlc3RvcnMuZXZlcnkoKGEpID0+IGJldHdlZW4oYS5wb3NpdGlvbnMsIGFuY2hvciAtIDEsIGlkeCArIDEpLmxlbmd0aCA9PT0gMClcbiAgICAgICkge1xuICAgICAgICBjb25zdCByb3dzOiBUb3VjaFtdID0gW107XG4gICAgICAgIGZvciAoY29uc3QgYyBvZiBiZXR3ZWVuKHN1YnRyZWVQb3NpdGlvbnMobm9kZSksIGFuY2hvciAtIDEsIGlkeCArIDEpKSB7XG4gICAgICAgICAgY29uc3QgdHJhY2UgPSB0aGlzLmxvZ1tjXS50cmFjZTtcbiAgICAgICAgICBmb3IgKGxldCByb3cgPSAwOyByb3cgPCB0cmFjZS5sZW5ndGg7IHJvdysrKSB7XG4gICAgICAgICAgICBjb25zdCByID0gcmVsYXRpb24odHJhY2Vbcm93XS5wYXRoLCBrZXkpO1xuICAgICAgICAgICAgaWYgKHIgPT09ICdleGFjdCcgfHwgciA9PT0gJ2luc2lkZScpIHtcbiAgICAgICAgICAgICAgcm93cy5wdXNoKHtcbiAgICAgICAgICAgICAgICB2ZXJiOiB0cmFjZVtyb3ddLnZlcmIgYXMgVG91Y2hbJ3ZlcmInXSxcbiAgICAgICAgICAgICAgICBidW5kbGU6IHRoaXMubG9nW2NdLFxuICAgICAgICAgICAgICAgIGNvbW1pdElkeDogYyBhcyBDb21taXRJZHgsXG4gICAgICAgICAgICAgICAgcGF0aDogdHJhY2Vbcm93XS5wYXRoLFxuICAgICAgICAgICAgICAgIHJlbGF0aW9uOiByLFxuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcXVlcnlXb3JrLnVuaXRzICs9IHJvd3MubGVuZ3RoO1xuICAgICAgICByZXR1cm4gZm9sZEtleShyb3dzLCBzZWdzKTtcbiAgICAgIH1cbiAgICB9XG4gICAgY29uc3Qgcm93cyA9IHRoaXMucm93c1VuZGVyUm9vdChrZXksIGlkeCk7XG4gICAgcXVlcnlXb3JrLnVuaXRzICs9IHJvd3MubGVuZ3RoO1xuICAgIGlmICghcm93cy5zb21lKChyb3cpID0+IHJvdy5yZWxhdGlvbiAhPT0gdW5kZWZpbmVkKSkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAvLyBBIG1lbW9pc2VkIG1vZGVsIGZvbGRzIGZyb20gdGhlIGxhc3QgZ2VuZXJhdGlvbiBpdCBrZWVwcyBhdCBvciBiZWZvcmUgYGlkeGAg4oCUIHRoZSByb3dzIGFmdGVyIGl0IG9ubHkuXG4gICAgaWYgKE1PREVMUy5nZXQodGhpcy5sb2cpID09PSB0aGlzKSB7XG4gICAgICBjb25zdCBoID0gdGhpcy5oaXN0b3J5KHNlZ3NbMF0pO1xuICAgICAgY29uc3Qga2VwdCA9IGxhc3RCZWZvcmUoaC5rZXB0QXQsIGlkeCArIDEpO1xuICAgICAgaWYgKGtlcHQgIT09IC0xKSB7XG4gICAgICAgIGNvbnN0IGFmdGVyID0gcm93cy5maWx0ZXIoKHJvdykgPT4gcm93LmNvbW1pdElkeCA+IGtlcHQpO1xuICAgICAgICAvLyBGb2xkZWQgRlJPTSB0aGUga2VwdCBnZW5lcmF0aW9uLCB0aGUgYW5zd2VyIGNhbiBCRSBpdCAobm8gcm93IGFmdGVyIGl0KSBvciBzaGFyZSBpdHMgcGFydHMsIGFuZFxuICAgICAgICAvLyB0aGUgbWVtbyBhbnN3ZXJzIGV2ZXJ5IGxhdGVyIHF1ZXN0aW9uOiBkZXRhY2ggaXQsIGFzIHRoZSB2YWx1ZSBydWxlIHByb21pc2VzICh1bnRpbCA5LjQ0LjIgYW5cbiAgICAgICAgLy8gZWRpdCBvZiBvbmUgYW5zd2VyIGNoYW5nZWQgdGhlIG5leHQpLlxuICAgICAgICByZXR1cm4gZGV0YWNoZWQoZm9sZEtleShhZnRlciwgc2VncywgeyBhbmNob3JlZDogdHJ1ZSwgc3RhcnQ6IGgua2VwdC5nZXQoa2VwdCk/LmFmdGVyIH0pKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGZvbGRLZXkocm93cywgc2VncywgeyBhbmNob3JlZDogdHJ1ZSB9KTtcbiAgfVxufVxuXG4vKiogQSB2YWx1ZSB0aGUgY2FsbGVyIG93bnM6IGEgY29udGFpbmVyIGlzIGNsb25lZCwgYSBwcmltaXRpdmUgaXMgaXRzZWxmLiAqL1xuZnVuY3Rpb24gZGV0YWNoZWQodmFsdWU6IHVua25vd24pOiB1bmtub3duIHtcbiAgcmV0dXJuIHZhbHVlICE9PSBudWxsICYmIHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgPyBzdHJ1Y3R1cmVkQ2xvbmUodmFsdWUpIDogdmFsdWU7XG59XG5cbi8qKiBJcyB0aGUgbGFzdCBgc2V0YCAvIGBkZWxldGVgIHJvdyBPTiBga2V5YCBpbiB0aGlzIGNvbW1pdCBhIGBzZXRgPyAqL1xuZnVuY3Rpb24gbGFzdFRvdGFsSXNTZXQoYnVuZGxlOiBDb21taXRCdW5kbGUsIGtleTogc3RyaW5nKTogYm9vbGVhbiB7XG4gIGZvciAobGV0IGkgPSBidW5kbGUudHJhY2UubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICBjb25zdCB0ID0gYnVuZGxlLnRyYWNlW2ldO1xuICAgIGlmICh0LnBhdGggPT09IGtleSAmJiAodC52ZXJiID09PSAnc2V0JyB8fCB0LnZlcmIgPT09ICdkZWxldGUnKSkgcmV0dXJuIHQudmVyYiA9PT0gJ3NldCc7XG4gIH1cbiAgcmV0dXJuIGZhbHNlO1xufVxuIl19