footprintjs 9.22.0 → 9.23.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.
@@ -73,8 +73,20 @@ export class StageContext {
73
73
  next;
74
74
  children;
75
75
  debug = new DiagnosticCollector();
76
- /** Tracks user-level writes (pre-namespace) for the memory view and onCommit. */
76
+ /** Tracks user-level writes (pre-namespace) for the memory view and onCommit
77
+ * — in their RETAINED form (cloned / summarised / redacted). Filled from
78
+ * {@link _pendingWrites} by {@link materialiseWrites} at commit. */
77
79
  _stageWrites = {};
80
+ /**
81
+ * The writes of the CURRENT execution, held by reference with the verdict
82
+ * they were staged under (9.23.0). A key written k times holds its LAST
83
+ * value; the retained form (the `writeTracking` clone or summary, the
84
+ * redaction placeholder or field scrub) is taken ONCE per key at commit —
85
+ * see {@link materialiseWrites}. Same law as the transaction buffer's
86
+ * patch trees: the copy the record needs is paid at the boundary, not at
87
+ * every write. Lazily allocated; a stage that never writes pays nothing.
88
+ */
89
+ _pendingWrites;
78
90
  /** Tracks user-level reads (pre-namespace) for the memory view. */
79
91
  _stageReads = {};
80
92
  /**
@@ -110,8 +122,10 @@ export class StageContext {
110
122
  * How tracked writes are recorded into `_stageWrites` (#13c-A) — the
111
123
  * sibling of {@link readTracking}, with the same propagation pattern
112
124
  * (inherited via {@link createNext}/{@link createChild}, pushed into
113
- * subflow root contexts by `SubflowExecutor`). Governs the per-write
114
- * `structuredClone` in {@link setObject}/{@link updateObject}. Affects the
125
+ * subflow root contexts by `SubflowExecutor`). Governs the retained form
126
+ * {@link materialiseWrites} takes at commit for the writes of
127
+ * {@link setObject}/{@link updateObject} (a clone under `'full'`, taken
128
+ * once per key — 9.23.0). Affects the
115
129
  * snapshot's `stageWrites` payload AND the commit observer's mutations
116
130
  * payload (which is a spread of `_stageWrites`) — but NOT the write
117
131
  * itself: the transaction buffer, the commit log, and shared state are
@@ -265,26 +279,65 @@ export class StageContext {
265
279
  return this.writeProvenance;
266
280
  }
267
281
  /**
268
- * Record a tracked user-level write into `_stageWrites`, policy-gated
269
- * (#13c-A) — the single bookkeeping path for {@link setObject} and
270
- * {@link updateObject}.
282
+ * Record a tracked user-level write, policy-gated (#13c-A) — the single
283
+ * bookkeeping path for {@link setObject} and {@link updateObject}. Holds
284
+ * the REFERENCE and the verdict (9.23.0); the retained form is taken at
285
+ * commit by {@link materialiseWrites}, once per key.
271
286
  *
272
287
  * Redaction takes precedence over the dial in EVERY mode: a redacted
273
288
  * write stores the `'[REDACTED]'` placeholder under `'full'` AND
274
289
  * `'summary'` (a summary marker would leak the value's preview/size),
275
290
  * and stores nothing under `'off'` (entry skipped entirely — nothing to
276
291
  * leak). A field-level verdict scrubs a clone BEFORE the dial sees it, so
277
- * a summary preview can never show the secret either. The staged write
278
- * itself is unaffected — redaction of the committed payload is handled by
279
- * the transaction buffer's `redactedPaths`.
292
+ * a summary preview can never show the secret either. The verdict is the
293
+ * one `stageWrite` asked the rule for BEFORE staging, carried to commit
294
+ * with the value. The staged write itself is unaffected — redaction of
295
+ * the committed payload is handled by the transaction buffer's
296
+ * `redactedPaths`.
280
297
  */
281
298
  trackWrite(userKey, value, verdict, operation) {
282
299
  if (this.writeTracking === 'off')
283
300
  return;
284
- this._stageWrites[userKey] = {
285
- value: this.retainedForm(verdict, value, this.writeTracking, summarizeWriteValue),
286
- operation,
287
- };
301
+ (this._pendingWrites ??= new Map()).set(userKey, { value, verdict, operation });
302
+ }
303
+ /**
304
+ * `_stageWrites` with every pending write folded in as its retained form
305
+ * — the record a reader sees. Consumes nothing: a mid-run snapshot reads
306
+ * the writes so far, and commit still materialises the final values.
307
+ * Returns `_stageWrites` itself when nothing is pending.
308
+ */
309
+ retainedWrites() {
310
+ if (!this._pendingWrites)
311
+ return this._stageWrites;
312
+ const out = { ...this._stageWrites };
313
+ for (const [key, w] of this._pendingWrites) {
314
+ out[key] = {
315
+ value: this.retainedForm(w.verdict, w.value, this.writeTracking, summarizeWriteValue),
316
+ operation: w.operation,
317
+ };
318
+ }
319
+ return out;
320
+ }
321
+ /**
322
+ * Take the retained form of every pending write — ONCE per key, from the
323
+ * value as it stands at commit (9.23.0) — and release the references. The
324
+ * first thing `commit()` does, so the borrowed-mutation guard and the
325
+ * commit observer see the finished record.
326
+ */
327
+ materialiseWrites() {
328
+ if (!this._pendingWrites)
329
+ return;
330
+ try {
331
+ this._stageWrites = this.retainedWrites();
332
+ }
333
+ finally {
334
+ // Released even when a retained form cannot be taken — an uncloneable
335
+ // value (a function, a Proxy) is a contract violation ("state values
336
+ // must survive structuredClone") that now surfaces HERE, at commit,
337
+ // and fails the run loudly; a later snapshot of the failed run must
338
+ // not throw the same error again.
339
+ this._pendingWrites = undefined;
340
+ }
288
341
  }
289
342
  /**
290
343
  * The form of a value the engine RETAINS (reads and writes retention):
@@ -689,6 +742,7 @@ export class StageContext {
689
742
  * reads them post-run for the execution-tree snapshot.
690
743
  */
691
744
  commit() {
745
+ this.materialiseWrites();
692
746
  this.warnOnBorrowedMutation();
693
747
  if (!this.buffer) {
694
748
  // Truly-lazy fast path (#13): no write ever constructed the buffer, so
@@ -775,10 +829,11 @@ export class StageContext {
775
829
  * - `stateView` — the first-touch anchor; the next attempt re-anchors on
776
830
  * committed state as it stands NOW (a sibling fork branch
777
831
  * may legitimately have committed in between);
778
- * - `_stageWrites` / `_stageReads` — the snapshot payload; without the
779
- * reset the execution tree would report writes that were
780
- * discarded, which is the exact lie this feature exists
781
- * to prevent;
832
+ * - `_stageWrites` / `_pendingWrites` / `_stageReads` — the snapshot
833
+ * payload; without the reset the execution tree would
834
+ * report writes that were discarded, which is the exact
835
+ * lie this feature exists to prevent (the pending map
836
+ * holds bare references — dropping it un-clones nothing);
782
837
  * - `_provenanceReads` — the per-write read prefix (#P1); a discarded
783
838
  * attempt's reads must never appear in the next attempt's
784
839
  * `TraceEntry.readKeys`, or a backward slice would follow
@@ -797,6 +852,7 @@ export class StageContext {
797
852
  this.stateView = undefined;
798
853
  this._untrackedSources = undefined;
799
854
  this._provenanceReads = undefined;
855
+ this._pendingWrites = undefined;
800
856
  this._stageWrites = {};
801
857
  this._stageReads = {};
802
858
  this._nestedReads = undefined;
@@ -932,10 +988,11 @@ export class StageContext {
932
988
  metrics: this.debug.metricContext,
933
989
  evals: this.debug.evalContext,
934
990
  };
935
- if (Object.keys(this._stageWrites).length > 0) {
991
+ const stageWrites = this.retainedWrites();
992
+ if (Object.keys(stageWrites).length > 0) {
936
993
  // Extract values only for the snapshot (strip operation metadata)
937
994
  const writes = {};
938
- for (const [k, entry] of Object.entries(this._stageWrites)) {
995
+ for (const [k, entry] of Object.entries(stageWrites)) {
939
996
  writes[k] = entry.value;
940
997
  }
941
998
  snapshot.stageWrites = writes;
@@ -955,4 +1012,4 @@ export class StageContext {
955
1012
  return snapshot;
956
1013
  }
957
1014
  }
958
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU3RhZ2VDb250ZXh0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2xpYi9tZW1vcnkvU3RhZ2VDb250ZXh0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7OztHQVFHO0FBRUgsT0FBTyxFQUFFLGtCQUFrQixFQUFFLG1CQUFtQixFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDbEYsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQ3ZELE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxrQkFBa0IsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBQ3BGLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBRS9ELE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFFekMsT0FBTyxFQUFFLEtBQUssRUFBRSxRQUFRLEVBQUUsYUFBYSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFFaEUsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFXM0QsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLFlBQVksQ0FBQztBQUV6Qzs7MkJBRTJCO0FBQzNCLFNBQVMsU0FBUyxDQUFDLElBQWMsRUFBRSxHQUFXO0lBQzVDLE9BQU8sSUFBSSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLEVBQUUsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUM7QUFDMUQsQ0FBQztBQUVELE1BQU0sT0FBTyxZQUFZO0lBQ2YsWUFBWSxDQUFlO0lBQ25DOzs7Ozs7Ozs7OztPQVdHO0lBQ0ssb0JBQW9CLENBQWdCO0lBQzVDLCtEQUErRDtJQUN2RCxhQUFhLENBQWlCO0lBQzlCLE1BQU0sQ0FBcUI7SUFDbkM7Ozs7O09BS0c7SUFDSyxTQUFTLENBQTJCO0lBQ3BDLFFBQVEsQ0FB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LENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxFQUFFLENBQUM7Z0JBQzNELE1BQU0sQ0FBQyxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUMsS0FBSyxDQUFDO1lBQzFCLENBQUM7WUFDRCxRQUFRLENBQUMsV0FBVyxHQUFHLE1BQU0sQ0FBQztRQUNoQyxDQUFDO1FBQ0QsSUFBSSxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUM7WUFDN0MsUUFBUSxDQUFDLFVBQVUsR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDO1FBQ3pDLENBQUM7UUFDRCxJQUFJLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztZQUNyQixRQUFRLENBQUMsV0FBVyxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUM7UUFDMUMsQ0FBQztRQUNELElBQUksSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDO1lBQ25CLFFBQVEsQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQztRQUN0QyxDQUFDO1FBQ0QsSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDLFlBQVksQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUM7WUFDdkMsUUFBUSxDQUFDLFlBQVksR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLFlBQVksQ0FBQztRQUNsRCxDQUFDO1FBQ0QsT0FBTyxRQUFRLENBQUM7SUFDbEIsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBTdGFnZUNvbnRleHQg4oCUIEV4ZWN1dGlvbiBjb250ZXh0IGZvciBhIHNpbmdsZSBzdGFnZSBpbiBhIGZsb3djaGFydCBydW5cbiAqXG4gKiBMaWtlIGEgc3RhY2sgZnJhbWUgaW4gYSBjb21waWxlci9ydW50aW1lOlxuICogLSBSZWZlcmVuY2UgdG8gU2hhcmVkTWVtb3J5IChhY2Nlc3NpbmcgaGVhcCBtZW1vcnkpXG4gKiAtIFRyYW5zYWN0aW9uQnVmZmVyIGZvciBzdGFnaW5nIG11dGF0aW9ucyAodHJhbnNhY3Rpb24gYnVmZmVyKVxuICogLSBMaW5rcyB0byBwYXJlbnQvY2hpbGQvbmV4dCBjb250ZXh0cyAoY2FsbCBzdGFjayBmcmFtZXMpXG4gKiAtIERpYWdub3N0aWNDb2xsZWN0b3IgZm9yIGxvZ3MsIGVycm9ycywgbWV0cmljc1xuICovXG5cbmltcG9ydCB7IHN1bW1hcml6ZVJlYWRWYWx1ZSwgc3VtbWFyaXplV3JpdGVWYWx1ZSB9IGZyb20gJy4uL2NhcHR1cmUvc3VtbWFyaXplLmpzJztcbmltcG9ydCB7IGlzRGV2TW9kZSB9IGZyb20gJy4uL3Njb3BlL2RldGVjdENpcmN1bGFyLmpzJztcbmltcG9ydCB7IGJvcnJvd2VkTXV0YXRpb25NZXNzYWdlLCBmaXJzdERpZmZlcmluZ1BhdGggfSBmcm9tICcuL2JvcnJvd2VkTXV0YXRpb24uanMnO1xuaW1wb3J0IHsgRGlhZ25vc3RpY0NvbGxlY3RvciB9IGZyb20gJy4vRGlhZ25vc3RpY0NvbGxlY3Rvci5qcyc7XG5pbXBvcnQgeyBFdmVudExvZyB9IGZyb20gJy4vRXZlbnRMb2cuanMnO1xuaW1wb3J0IHsgbmF0aXZlR2V0IH0gZnJvbSAnLi9wYXRoT3BzLmpzJztcbmltcG9ydCB0eXBlIHsgUmVkYWN0aW9uVmVyZGljdCB9IGZyb20gJy4vcmVkYWN0aW9uLmpzJztcbmltcG9ydCB7IENMRUFSLCBSRURBQ1RFRCwgUmVkYWN0aW9uUnVsZSB9IGZyb20gJy4vcmVkYWN0aW9uLmpzJztcbmltcG9ydCB7IFNoYXJlZE1lbW9yeSB9IGZyb20gJy4vU2hhcmVkTWVtb3J5LmpzJztcbmltcG9ydCB7IFRyYW5zYWN0aW9uQnVmZmVyIH0gZnJvbSAnLi9UcmFuc2FjdGlvbkJ1ZmZlci5qcyc7XG5pbXBvcnQgdHlwZSB7XG4gIENvbW1pdFZhbHVlc01vZGUsXG4gIEZsb3dDb250cm9sVHlwZSxcbiAgRmxvd01lc3NhZ2UsXG4gIFJlYWRUcmFja2luZ01vZGUsXG4gIFN0YWdlU25hcHNob3QsXG4gIFVudHJhY2tlZFNvdXJjZSxcbiAgV3JpdGVQcm92ZW5hbmNlTW9kZSxcbiAgV3JpdGVUcmFja2luZ01vZGUsXG59IGZyb20gJy4vdHlwZXMuanMnO1xuaW1wb3J0IHsgcmVkYWN0UGF0Y2ggfSBmcm9tICcuL3V0aWxzLmpzJztcblxuLyoqIFRoZSB1c2VyLWxldmVsIGtleSBvZiBhIHdyaXRlIG9yIHJlYWQg4oCUIGRvdHRlZCBvbmx5IGZvciBhIG5lc3RlZCBwYXRoIChhXG4gKiAgc3ViZmxvdyBzZWVkJ3MgYFsncHJvZmlsZSddICsgJ2F1dGgnYCk7IG5vIGFsbG9jYXRpb24gZm9yIHRoZSBjb21tb25cbiAqICBzaW5nbGUtc2VnbWVudCBjYXNlLiAqL1xuZnVuY3Rpb24gdXNlcktleU9mKHBhdGg6IHN0cmluZ1tdLCBrZXk6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiBwYXRoLmxlbmd0aCA+IDAgPyBbLi4ucGF0aCwga2V5XS5qb2luKCcuJykgOiBrZXk7XG59XG5cbmV4cG9ydCBjbGFzcyBTdGFnZUNvbnRleHQge1xuICBwcml2YXRlIHNoYXJlZE1lbW9yeTogU2hhcmVkTWVtb3J5O1xuICAvKipcbiAgICogUGFyYWxsZWwgcmVkYWN0ZWQgbWlycm9yIG9mIGBzaGFyZWRNZW1vcnlgLiBQb3B1bGF0ZWQgaW4gYGNvbW1pdCgpYCB3aXRoXG4gICAqIHRoZSBhbHJlYWR5LWNvbXB1dGVkIHJlZGFjdGVkIHBhdGNoZXMgKHRoZSBzYW1lIG9uZXMgZmVkIHRvIGBldmVudExvZ2ApLlxuICAgKiBQcmVzZW50ICoqb25seSoqIHdoZW4gdGhlIGV4ZWN1dG9yIGhhcyBiZWVuIHRvbGQgdG8gbWFpbnRhaW4gYSByZWRhY3RlZFxuICAgKiB2aWV3IOKAlCBpLmUuIHdoZW4gYSBgUmVkYWN0aW9uUG9saWN5YCBpcyBjb25maWd1cmVkLiBPdGhlcndpc2UgdW5kZWZpbmVkLFxuICAgKiB6ZXJvIGV4dHJhIHdvcmsgcGVyIGNvbW1pdC5cbiAgICpcbiAgICogVGhlIG1pcnJvciBpcyByZWFkIHZpYSBgRmxvd0NoYXJ0RXhlY3V0b3IuZ2V0U25hcHNob3QoeyByZWRhY3Q6IHRydWUgfSlgXG4gICAqIGFuZCBpcyB0aGUgZm91bmRhdGlvbiBmb3IgdGhlIFwiZXhwb3J0IHRyYWNlXCIgLyBwYXN0ZS1pbnRvLXZpZXdlciBmZWF0dXJlXG4gICAqIOKAlCBjb25zdW1lcnMgc2hhcmUgdGhlIHJlZGFjdGVkIHZpZXcgZXh0ZXJuYWxseSB3aXRob3V0IGxlYWtpbmcgcmF3IFBJSVxuICAgKiB0aHJvdWdoIGBzaGFyZWRTdGF0ZWAuXG4gICAqL1xuICBwcml2YXRlIHJlZGFjdGVkU2hhcmVkTWVtb3J5PzogU2hhcmVkTWVtb3J5O1xuICAvKiogVGhlIHJ1bidzIHJlZGFjdGlvbiBydWxlIOKAlCBzZWUge0BsaW5rIHVzZVJlZGFjdGlvblJ1bGV9LiAqL1xuICBwcml2YXRlIHJlZGFjdGlvblJ1bGU/OiBSZWRhY3Rpb25SdWxlO1xuICBwcml2YXRlIGJ1ZmZlcj86IFRyYW5zYWN0aW9uQnVmZmVyO1xuICAvKipcbiAgICogQ29tbWl0dGVkLXN0YXRlIHZpZXcgY2FwdHVyZWQgYXQgdGhpcyBzdGFnZSdzIEZJUlNUIHRvdWNoIChmaXJzdCByZWFkIE9SXG4gICAqIGZpcnN0IHdyaXRlKSDigJQgaGVsZCBieSBSRUZFUkVOQ0UsIG5ldmVyIGNsb25lZC4gU2VlXG4gICAqIHtAbGluayBmaXJzdFRvdWNoU3RhdGV9IGZvciB0aGUgYWxnb3JpdGhtIGFuZCB0aGUgaW1tdXRhYmlsaXR5IGludmFyaWFudFxuICAgKiB0aGF0IG1ha2VzIGEgYmFyZSByZWZlcmVuY2Ugc2FmZS5cbiAgICovXG4gIHByaXZhdGUgc3RhdGVWaWV3PzogUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gIHByaXZhdGUgZXZlbnRMb2c/OiBFdmVudExvZztcblxuICBwdWJsaWMgc3RhZ2VOYW1lID0gJyc7XG4gIC8qKiBVbmlxdWUgc3RhZ2UgaWRlbnRpZmllciBmcm9tIHRoZSBidWlsZGVyIChtYXRjaGVzIHNwZWMgbm9kZSBpZCkuICovXG4gIHB1YmxpYyBzdGFnZUlkOiBzdHJpbmc7XG4gIC8qKiBVbmlxdWUgcGVyLWV4ZWN1dGlvbi1zdGVwIGlkZW50aWZpZXIuIFNldCBieSB0cmF2ZXJzZXIgYmVmb3JlIHN0YWdlIGV4ZWN1dGlvbi4gKi9cbiAgcHVibGljIHJ1bnRpbWVTdGFnZUlkID0gJyc7XG4gIC8qKlxuICAgKiBEZWNsYXJlZCB0YWdzICg5LjIxLjApIGZvciB0aGUgc3RhZ2UgdGhpcyBjb250ZXh0IGlzIGV4ZWN1dGluZy4gU2V0IGJ5XG4gICAqIHRoZSB0cmF2ZXJzZXIgYmVzaWRlIGBydW50aW1lU3RhZ2VJZGAgKHBlci1ub2RlIGlkZW50aXR5IOKAlCBOT1QgaW5oZXJpdGVkXG4gICAqIGJ5IGBjcmVhdGVOZXh0YCAvIGBjcmVhdGVDaGlsZGApLCByZWNvcmRlZCBvbiB0aGUgZmlyc3QgYnVuZGxlXG4gICAqIGBjb21taXQoKWAgd3JpdGVzLCB0aGVuIHJlbGVhc2VkIHNvIGEgcm91dGluZSBzZWNvbmQgY29tbWl0IG9uIHRoZSBzYW1lXG4gICAqIGNvbnRleHQgKGEgZm9yayBjaGlsZCdzIGZhbi1vdXQgcmVwZWF0LCBhIG1vdW50J3MgZXhpdCBidW5kbGUpIGNhcnJpZXNcbiAgICogbm9uZSDigJQgdGhlIHNhbWUgb25jZS1wZXItZXhlY3V0aW9uIGxhdyBgX3VudHJhY2tlZFNvdXJjZXNgIGtlZXBzLlxuICAgKi9cbiAgcHVibGljIHRhZ3M/OiByZWFkb25seSBzdHJpbmdbXTtcbiAgcHVibGljIHJ1bklkOiBzdHJpbmc7XG4gIHB1YmxpYyBicmFuY2hJZD86IHN0cmluZztcbiAgcHVibGljIGlzRGVjaWRlcjogYm9vbGVhbjtcbiAgcHVibGljIGlzRm9yazogYm9vbGVhbjtcbiAgLyoqIEh1bWFuLXJlYWRhYmxlIGRlc2NyaXB0aW9uIGZyb20gYnVpbGRlciAoc2V0IGJ5IHRyYXZlcnNlciBiZWZvcmUgZXhlY3V0aW9uKS4gKi9cbiAgcHVibGljIGRlc2NyaXB0aW9uPzogc3RyaW5nO1xuICAvKiogU3ViZmxvdyBpZGVudGlmaWVyIChzZXQgYnkgdHJhdmVyc2VyIHdoZW4gdGhpcyBpcyBhIHN1YmZsb3cgZW50cnkgcG9pbnQpLiAqL1xuICBwdWJsaWMgc3ViZmxvd0lkPzogc3RyaW5nO1xuXG4gIHB1YmxpYyBwYXJlbnQ/OiBTdGFnZUNvbnRleHQ7XG4gIHB1YmxpYyBuZXh0PzogU3RhZ2VDb250ZXh0O1xuICBwdWJsaWMgY2hpbGRyZW4/OiBTdGFnZUNvbnRleHRbXTtcblxuICBwdWJsaWMgZGVidWc6IERpYWdub3N0aWNDb2xsZWN0b3IgPSBuZXcgRGlhZ25vc3RpY0NvbGxlY3RvcigpO1xuXG4gIC8qKiBUcmFja3MgdXNlci1sZXZlbCB3cml0ZXMgKHByZS1uYW1lc3BhY2UpIGZvciB0aGUgbWVtb3J5IHZpZXcgYW5kIG9uQ29tbWl0LiAqL1xuICBwcml2YXRlIF9zdGFnZVdyaXRlczogUmVjb3JkPHN0cmluZywgeyB2YWx1ZTogdW5rbm93bjsgb3BlcmF0aW9uOiAnc2V0JyB8ICd1cGRhdGUnIHwgJ2RlbGV0ZScgfT4gPSB7fTtcblxuICAvKiogVHJhY2tzIHVzZXItbGV2ZWwgcmVhZHMgKHByZS1uYW1lc3BhY2UpIGZvciB0aGUgbWVtb3J5IHZpZXcuICovXG4gIHByaXZhdGUgX3N0YWdlUmVhZHM6IFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0ge307XG5cbiAgLyoqXG4gICAqIFRoZSBgX3N0YWdlUmVhZHNgIGtleXMgdGhhdCB3ZXJlIHJlYWQgYXQgYSBORVNURUQgcGF0aCAoYGdldFZhbHVlKHBhdGgsXG4gICAqIGtleSlgIHdpdGggYSBub24tZW1wdHkgYHBhdGhgKS4gT25seSB0aGUgZW5naW5lIHJlYWRzIHRoYXQgd2F5IOKAlCB0aGVcbiAgICogZmFjYWRlIHJlYWRzIHJvb3RzIOKAlCBzbyB0aGVzZSBhcmUgbm90IHVzZXIgcmVhZHMgYW5kIHRoZSBib3Jyb3dlZC1yZWFkXG4gICAqIGd1YXJkIHNraXBzIHRoZW0gYnkgdGhpcyBtYXJrZXIsIG5ldmVyIGJ5IGd1ZXNzaW5nIGZyb20gYSBkb3QgaW4gdGhlIGtleVxuICAgKiAoYSB1c2VyJ3MgdG9wLWxldmVsIGtleSBtYXkgaXRzZWxmIGNvbnRhaW4gb25lKS4gTGF6aWx5IGNyZWF0ZWQ7IHRoZVxuICAgKiBmYWNhZGUgcGF0aCBuZXZlciBhbGxvY2F0ZXMgaXQuXG4gICAqL1xuICBwcml2YXRlIF9uZXN0ZWRSZWFkcz86IFNldDxzdHJpbmc+O1xuXG4gIC8qKlxuICAgKiBIYXMgdGhpcyBmcmFtZSBjb21taXR0ZWQgYXQgbGVhc3Qgb25jZT8gVGhlIGJvcnJvd2VkLXJlYWQgZ3VhcmQgcnVucyBvblxuICAgKiB0aGUgRklSU1QgY29tbWl0IG9ubHkg4oCUIHNlZSB7QGxpbmsgd2Fybk9uQm9ycm93ZWRNdXRhdGlvbn0uIFRoZSBmcmFtZVxuICAgKiBpdHNlbGYgc3RheXMgcmUtdXNhYmxlIGFmdGVyIGNvbW1pdCAoIzEzYik6IHRoZSBlbmdpbmUncyBkb3VibGUtY29tbWl0XG4gICAqIHBhdGhzIGFuZCB0aGUgc3ViZmxvdyBtZXJnZS1iYWNrIGludG8gYSBicmFuY2ggcGFyZW50IHJlbHkgb24gaXQuIFRoZVxuICAgKiB1c2VyLWxldmVsIHJlZnVzYWwgb2YgYSBoYW5kbGUgaGVsZCBwYXN0IGl0cyBzdGFnZSBsaXZlcyBhdCB0aGUgc2NvcGVcbiAgICogdGllciAoYFNjb3BlRmFjYWRlYCwgb25lIHBlciBzdGFnZSBleGVjdXRpb24pLCBub3QgaGVyZS5cbiAgICovXG4gIHByaXZhdGUgX2NvbW1pdHRlZCA9IGZhbHNlO1xuXG4gIC8qKlxuICAgKiBIb3cgdHJhY2tlZCByZWFkcyBhcmUgcmVjb3JkZWQgaW50byBgX3N0YWdlUmVhZHNgICgjMTQpLiBEZWZhdWx0IGAnZnVsbCdgXG4gICAqIHByZXNlcnZlcyB0aGUgaGlzdG9yaWNhbCBwZXItcmVhZCBgc3RydWN0dXJlZENsb25lYC4gSW5oZXJpdGVkIGJ5IGV2ZXJ5XG4gICAqIGNvbnRleHQgY3JlYXRlZCB2aWEge0BsaW5rIGNyZWF0ZU5leHR9IC8ge0BsaW5rIGNyZWF0ZUNoaWxkfSAoc2FtZVxuICAgKiBwcm9wYWdhdGlvbiBwYXR0ZXJuIGFzIHRoZSByZWRhY3RlZCBtaXJyb3IpLCBhbmQgcHVzaGVkIGludG8gc3ViZmxvd1xuICAgKiByb290IGNvbnRleHRzIGJ5IGBTdWJmbG93RXhlY3V0b3JgLiBBZmZlY3RzIE9OTFkgdGhlIHNuYXBzaG90J3NcbiAgICogYHN0YWdlUmVhZHNgIHBheWxvYWQg4oCUIGBTY29wZVJlY29yZGVyLm9uUmVhZGAgKGFuZCB0aGVyZWZvcmUgbmFycmF0aXZlKVxuICAgKiBpcyBkaXNwYXRjaGVkIGF0IHRoZSBzY29wZSB0aWVyIGFuZCBuZXZlciBjbG9uZWQsIHNvIGl0IGlzIGlkZW50aWNhbCBpblxuICAgKiBldmVyeSBtb2RlLlxuICAgKi9cbiAgcHJpdmF0ZSByZWFkVHJhY2tpbmc6IFJlYWRUcmFja2luZ01vZGUgPSAnZnVsbCc7XG5cbiAgLyoqXG4gICAqIEhvdyB0cmFja2VkIHdyaXRlcyBhcmUgcmVjb3JkZWQgaW50byBgX3N0YWdlV3JpdGVzYCAoIzEzYy1BKSDigJQgdGhlXG4gICAqIHNpYmxpbmcgb2Yge0BsaW5rIHJlYWRUcmFja2luZ30sIHdpdGggdGhlIHNhbWUgcHJvcGFnYXRpb24gcGF0dGVyblxuICAgKiAoaW5oZXJpdGVkIHZpYSB7QGxpbmsgY3JlYXRlTmV4dH0ve0BsaW5rIGNyZWF0ZUNoaWxkfSwgcHVzaGVkIGludG9cbiAgICogc3ViZmxvdyByb290IGNvbnRleHRzIGJ5IGBTdWJmbG93RXhlY3V0b3JgKS4gR292ZXJucyB0aGUgcGVyLXdyaXRlXG4gICAqIGBzdHJ1Y3R1cmVkQ2xvbmVgIGluIHtAbGluayBzZXRPYmplY3R9L3tAbGluayB1cGRhdGVPYmplY3R9LiBBZmZlY3RzIHRoZVxuICAgKiBzbmFwc2hvdCdzIGBzdGFnZVdyaXRlc2AgcGF5bG9hZCBBTkQgdGhlIGNvbW1pdCBvYnNlcnZlcidzIG11dGF0aW9uc1xuICAgKiBwYXlsb2FkICh3aGljaCBpcyBhIHNwcmVhZCBvZiBgX3N0YWdlV3JpdGVzYCkg4oCUIGJ1dCBOT1QgdGhlIHdyaXRlXG4gICAqIGl0c2VsZjogdGhlIHRyYW5zYWN0aW9uIGJ1ZmZlciwgdGhlIGNvbW1pdCBsb2csIGFuZCBzaGFyZWQgc3RhdGUgYXJlXG4gICAqIGlkZW50aWNhbCBpbiBldmVyeSBtb2RlLCBhbmQgYFNjb3BlUmVjb3JkZXIub25Xcml0ZWAgYWx3YXlzIGZpcmVzIHdpdGhcbiAgICogdGhlIGxpdmUgdmFsdWUuXG4gICAqL1xuICBwcml2YXRlIHdyaXRlVHJhY2tpbmc6IFdyaXRlVHJhY2tpbmdNb2RlID0gJ2Z1bGwnO1xuXG4gIC8qKlxuICAgKiBIb3cgY29tbWl0LWJ1bmRsZSB2YWx1ZXMgYXJlIGVuY29kZWQgaW50byB0aGUgY29tbWl0IGxvZyAoIzEzYy1CKSDigJQgdGhlXG4gICAqIHRoaXJkIGRpYWwgb2YgdGhlIGZhbWlseSwgd2l0aCB0aGUgc2FtZSBwcm9wYWdhdGlvbiBwYXR0ZXJuIGFzXG4gICAqIHtAbGluayByZWFkVHJhY2tpbmd9L3tAbGluayB3cml0ZVRyYWNraW5nfSAoaW5oZXJpdGVkIHZpYVxuICAgKiB7QGxpbmsgY3JlYXRlTmV4dH0ve0BsaW5rIGNyZWF0ZUNoaWxkfSwgcHVzaGVkIGludG8gc3ViZmxvdyByb290XG4gICAqIGNvbnRleHRzIGJ5IGBTdWJmbG93RXhlY3V0b3JgLCByZS1hcHBsaWVkIG9uIHRoZSByZXN1bWUgcGF0aCkuIFBhc3NlZFxuICAgKiBpbnRvIGVhY2gge0BsaW5rIFRyYW5zYWN0aW9uQnVmZmVyfSBhdCBjb25zdHJ1Y3Rpb247IGAnZnVsbCdgIChkZWZhdWx0KVxuICAgKiBpcyBieXRlLWlkZW50aWNhbCB0byBoaXN0b3J5LCBgJ2RlbHRhJ2AgZW5hYmxlcyBhcHBlbmQvZGVsZXRlIHZlcmJzICtcbiAgICogb25lLXRyYWNlLWVudHJ5LXBlci1wYXRoIGRlZHVwLiBMb3NzbGVzcyBpbiBib3RoIG1vZGVzLlxuICAgKi9cbiAgcHJpdmF0ZSBjb21taXRWYWx1ZXM6IENvbW1pdFZhbHVlc01vZGUgPSAnZnVsbCc7XG5cbiAgLyoqXG4gICAqIFBlci13cml0ZSByZWFkLXByb3ZlbmFuY2UgcG9saWN5ICgjUDEpIOKAlCB0aGUgZm91cnRoIGRpYWwgb2YgdGhlIGZhbWlseSxcbiAgICogc2FtZSBwcm9wYWdhdGlvbiBwYXR0ZXJuIGFzIHtAbGluayByZWFkVHJhY2tpbmd9L3tAbGluayB3cml0ZVRyYWNraW5nfS9cbiAgICoge0BsaW5rIGNvbW1pdFZhbHVlc30uIFVuZGVyIGAncmVhZHMtcHJlZml4J2AgdGhpcyBjb250ZXh0IGtlZXBzIGFcbiAgICogbGlnaHR3ZWlnaHQgb3JkZXJlZCBzZXQgb2YgdGhlIGtleXMgdHJhY2tlZC1yZWFkIHNvIGZhciwgYW5kIHRoZVxuICAgKiB0cmFuc2FjdGlvbiBidWZmZXIgc3RhbXBzIHRoYXQgcHJlZml4IG9udG8gZXZlcnkgc3RhZ2VkIHdyaXRlXG4gICAqICh7QGxpbmsgVHJhY2VFbnRyeS5yZWFkS2V5c30pLiBJTkRFUEVOREVOVCBvZiByZWFkVHJhY2tpbmc6IHByb3ZlbmFuY2VcbiAgICogbmVlZHMgb25seSB0aGUga2V5IFNUUklOR1MsIHNvIGl0IHdvcmtzIGV2ZW4gdW5kZXIgcmVhZFRyYWNraW5nICdvZmYnXG4gICAqIChhbmQgY29zdHMgbm90aGluZyB3aGVuIGl0IGlzIGl0c2VsZiAnb2ZmJyDigJQgdGhlIGRlZmF1bHQpLlxuICAgKi9cbiAgcHJpdmF0ZSB3cml0ZVByb3ZlbmFuY2U6IFdyaXRlUHJvdmVuYW5jZU1vZGUgPSAnb2ZmJztcblxuICAvKiogTGF6aWx5LWFsbG9jYXRlZCBvcmRlcmVkIHJlZ2lzdHJ5IG9mIGtleXMgdHJhY2tlZC1yZWFkIGluIFRISVMgc3RhZ2Ug4oCUXG4gICAqICB0aGUgc291cmNlIG9mIHRoZSBwZXItd3JpdGUgcHJlZml4LiBPbmx5IGFsbG9jYXRlZCB1bmRlciB0aGVcbiAgICogIGAncmVhZHMtcHJlZml4J2AgZGlhbDsgaW5zZXJ0aW9uLW9yZGVyZWQgKGEgU2V0KSBhbmQgbW9ub3RvbmljLCB3aGljaFxuICAgKiAgaXMgd2hhdCBtYWtlcyBcImxhc3Qgd3JpdGUncyBwcmVmaXggPT0gdW5pb25cIiBob2xkIGluIGRlbHRhIG1vZGUuICovXG4gIHByaXZhdGUgX3Byb3ZlbmFuY2VSZWFkcz86IFNldDxzdHJpbmc+O1xuXG4gIC8qKlxuICAgKiBSRkMtMDAzIEQyIGhvbmVzdHkgbWFya2VycyDigJQgdW50cmFja2VkIHJlYWQgcGF0aHMgdXNlZCBkdXJpbmcgVEhJU1xuICAgKiBzdGFnZSdzIGV4ZWN1dGlvbiAoYCdhcmdzJ2AgLyBgJ2VudidgIC8gYCdzaWxlbnQnYCkuIE1hcmtlZCBieVxuICAgKiBgU2NvcGVGYWNhZGVgLCBzdXJmYWNlZCBvbiB0aGUgc3RhZ2UncyBDb21taXRCdW5kbGUgYXNcbiAgICogYHVudHJhY2tlZFNvdXJjZXNgLCB0aGVuIFJFTEVBU0VEIHdpdGggdGhlIHN0YWdpbmcgc3RhdGUgYXQgY29tbWl0IGVuZFxuICAgKiAoc28gdGhlIHJvdXRpbmUgZG91YmxlLWNvbW1pdCBwYXRocyDigJQgZm9yayBjaGlsZHJlbiwgc3ViZmxvdyBtb3VudHMg4oCUXG4gICAqIHJlY29yZCB0aGUgZmllbGQgZXhhY3RseSBvbmNlLCBvbiB0aGUgZmlyc3QgY29tbWl0KS4gTGF6aWx5IGFsbG9jYXRlZDpcbiAgICogc3RhZ2VzIHRoYXQgbmV2ZXIgdG91Y2ggYW4gdW50cmFja2VkIHBhdGggcGF5IG5vdGhpbmcuXG4gICAqL1xuICBwcml2YXRlIF91bnRyYWNrZWRTb3VyY2VzPzogU2V0PFVudHJhY2tlZFNvdXJjZT47XG5cbiAgLyoqIE9ic2VydmVyIGNhbGxlZCBhZnRlciBjb21taXQoKSDigJQgdXNlZCBieSBTY29wZUZhY2FkZSB0byBmaXJlIFNjb3BlUmVjb3JkZXIub25Db21taXQuICovXG4gIHByaXZhdGUgX2NvbW1pdE9ic2VydmVyPzogKFxuICAgIG11dGF0aW9uczogUmVjb3JkPHN0cmluZywgeyB2YWx1ZTogdW5rbm93bjsgb3BlcmF0aW9uOiAnc2V0JyB8ICd1cGRhdGUnIHwgJ2RlbGV0ZScgfT4sXG4gICkgPT4gdm9pZDtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBydW5JZDogc3RyaW5nLFxuICAgIG5hbWU6IHN0cmluZyxcbiAgICBzdGFnZUlkOiBzdHJpbmcsXG4gICAgc2hhcmVkTWVtb3J5OiBTaGFyZWRNZW1vcnksXG4gICAgYnJhbmNoSWQ/OiBzdHJpbmcsXG4gICAgZXZlbnRMb2c/OiBFdmVudExvZyxcbiAgICBpc0RlY2lkZXI/OiBib29sZWFuLFxuICApIHtcbiAgICB0aGlzLnJ1bklkID0gcnVuSWQ7XG4gICAgdGhpcy5zdGFnZU5hbWUgPSBuYW1lO1xuICAgIHRoaXMuc3RhZ2VJZCA9IHN0YWdlSWQ7XG4gICAgdGhpcy5zaGFyZWRNZW1vcnkgPSBzaGFyZWRNZW1vcnk7XG4gICAgdGhpcy5icmFuY2hJZCA9IGJyYW5jaElkO1xuICAgIHRoaXMuZXZlbnRMb2cgPSBldmVudExvZztcbiAgICB0aGlzLmlzRGVjaWRlciA9ICEhaXNEZWNpZGVyO1xuICAgIHRoaXMuaXNGb3JrID0gZmFsc2U7XG4gIH1cblxuICAvKiogUmV0dXJucyB0aGUgU2hhcmVkTWVtb3J5IGluc3RhbmNlIChuZWVkZWQgYnkgc2NvcGUgbGF5ZXIpLiAqL1xuICBnZXRTaGFyZWRNZW1vcnkoKTogU2hhcmVkTWVtb3J5IHtcbiAgICByZXR1cm4gdGhpcy5zaGFyZWRNZW1vcnk7XG4gIH1cblxuICAvKipcbiAgICogSW5zdGFsbCBhIHBhcmFsbGVsIHJlZGFjdGVkIG1pcnJvci4gU3Vic2VxdWVudCBgY29tbWl0KClgIGNhbGxzIHdpbGxcbiAgICogYXBwbHkgdGhlIGFscmVhZHktY29tcHV0ZWQgcmVkYWN0ZWQgcGF0Y2hlcyB0byB0aGlzIG1pcnJvciBpbiBhZGRpdGlvblxuICAgKiB0byB0aGUgcmF3IGBzaGFyZWRNZW1vcnlgICsgYGV2ZW50TG9nYC4gQ2hpbGQgLyBuZXh0IGNvbnRleHRzIGluaGVyaXRcbiAgICogdGhlIG1pcnJvciB2aWEgYGNyZWF0ZU5leHRgIC8gYGNyZWF0ZUNoaWxkYC5cbiAgICpcbiAgICogQ2FsbGVkIG9uY2UgYXQgdGhlIHJvb3QgY29udGV4dCBieSBgRXhlY3V0aW9uUnVudGltZS5lbmFibGVSZWRhY3RlZE1pcnJvcigpYC5cbiAgICovXG4gIHVzZVJlZGFjdGVkTWlycm9yKG1pcnJvcjogU2hhcmVkTWVtb3J5KTogdm9pZCB7XG4gICAgdGhpcy5yZWRhY3RlZFNoYXJlZE1lbW9yeSA9IG1pcnJvcjtcbiAgfVxuXG4gIC8qKiBSZXR1cm5zIHRoZSByZWRhY3RlZCBtaXJyb3IgaWYgaW5zdGFsbGVkLCBlbHNlIHVuZGVmaW5lZC4gKi9cbiAgZ2V0UmVkYWN0ZWRTaGFyZWRNZW1vcnkoKTogU2hhcmVkTWVtb3J5IHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5yZWRhY3RlZFNoYXJlZE1lbW9yeTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJbnN0YWxsIHRoZSBydW4ncyByZWRhY3Rpb24gcnVsZSDigJQgdGhlIE9ORSBvd25lciBvZiBcIndoYXQgZG9lcyB0aGUgcG9saWN5XG4gICAqIHNheSBhYm91dCB0aGlzIHBhdGhcIiAoYG1lbW9yeS9yZWRhY3Rpb24udHNgKS4gU2FtZSBwbHVtYmluZyBhcyB0aGUgbWlycm9yXG4gICAqIGFuZCB0aGUgZm91ciBkaWFsczogc2V0IG9uY2UgYXQgdGhlIHJvb3QgYnkgYEV4ZWN1dGlvblJ1bnRpbWUudXNlUmVkYWN0aW9uYFxuICAgKiAoZnJvbSBgRmxvd0NoYXJ0RXhlY3V0b3JgLCBldmVyeSBydW4gYW5kIHJlc3VtZSksIGluaGVyaXRlZCB2aWFcbiAgICoge0BsaW5rIGNyZWF0ZU5leHR9L3tAbGluayBjcmVhdGVDaGlsZH0sIHB1c2hlZCBpbnRvIHN1YmZsb3cgcm9vdCBjb250ZXh0c1xuICAgKiBieSBgU3ViZmxvd0V4ZWN1dG9yYC4gRXZlcnkgc3RhZ2VkIHdyaXRlIGFuZCBldmVyeSB0cmFja2VkIHJlYWQgYXNrcyBpdCxcbiAgICogc28gYSB3cml0ZSB0aGF0IG5ldmVyIHBhc3NlcyBhIGBTY29wZUZhY2FkZWAg4oCUIGEgc3ViZmxvdyBzZWVkLCBhblxuICAgKiBgb3V0cHV0TWFwcGVyYCBtZXJnZS1iYWNrLCBhIHJlc3VtZSByZS1zZWVkIOKAlCBpcyByZXRhaW5lZCB1bmRlciB0aGUgc2FtZVxuICAgKiB2ZXJkaWN0IGFzIGEgZmFjYWRlIHdyaXRlLiBBYnNlbnQgKGJhcmUgY29udGV4dHMgaW4gdW5pdCB0ZXN0cyk6IGV2ZXJ5XG4gICAqIHZlcmRpY3QgaXMgYCdjbGVhcidgIHVubGVzcyB0aGUgY2FsbGVyIHBhc3NlZCBhbiBleHBsaWNpdCBmbGFnLlxuICAgKi9cbiAgdXNlUmVkYWN0aW9uUnVsZShydWxlOiBSZWRhY3Rpb25SdWxlKTogdm9pZCB7XG4gICAgdGhpcy5yZWRhY3Rpb25SdWxlID0gcnVsZTtcbiAgfVxuXG4gIC8qKiBUaGUgaW5zdGFsbGVkIHJlZGFjdGlvbiBydWxlLCBpZiBhbnkgKGZhY2FkZSBsb29rdXAsIHN1YmZsb3cgcHJvcGFnYXRpb24pLiAqL1xuICBnZXRSZWRhY3Rpb25SdWxlKCk6IFJlZGFjdGlvblJ1bGUgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLnJlZGFjdGlvblJ1bGU7XG4gIH1cblxuICAvKipcbiAgICogU2V0IHRoZSByZWFkLXRyYWNraW5nIHBvbGljeSBmb3IgdGhpcyBjb250ZXh0ICgjMTQpLiBDYWxsZWQgYXQgdGhlIHJvb3RcbiAgICogYnkgYEV4ZWN1dGlvblJ1bnRpbWUudXNlUmVhZFRyYWNraW5nKClgIChwbHVtYmVkIGZyb21cbiAgICogYEZsb3dDaGFydEV4ZWN1dG9yYCk7IGRlc2NlbmRhbnRzIGluaGVyaXQgdmlhIGBjcmVhdGVOZXh0YC9gY3JlYXRlQ2hpbGRgLFxuICAgKiBhbmQgYFN1YmZsb3dFeGVjdXRvcmAgcHVzaGVzIHRoZSBwYXJlbnQgY29udGV4dCdzIG1vZGUgaW50byBlYWNoIHN1YmZsb3dcbiAgICogcm9vdCBzbyBuZXN0ZWQgY2hhcnRzIGluaGVyaXQgdG9vLlxuICAgKi9cbiAgdXNlUmVhZFRyYWNraW5nKG1vZGU6IFJlYWRUcmFja2luZ01vZGUpOiB2b2lkIHtcbiAgICB0aGlzLnJlYWRUcmFja2luZyA9IG1vZGU7XG4gIH1cblxuICAvKiogUmV0dXJucyB0aGUgYWN0aXZlIHJlYWQtdHJhY2tpbmcgcG9saWN5ICh1c2VkIGZvciBzdWJmbG93IHByb3BhZ2F0aW9uKS4gKi9cbiAgZ2V0UmVhZFRyYWNraW5nKCk6IFJlYWRUcmFja2luZ01vZGUge1xuICAgIHJldHVybiB0aGlzLnJlYWRUcmFja2luZztcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXQgdGhlIHdyaXRlLXRyYWNraW5nIHBvbGljeSBmb3IgdGhpcyBjb250ZXh0ICgjMTNjLUEpLiBTYW1lIHBsdW1iaW5nXG4gICAqIGFzIHtAbGluayB1c2VSZWFkVHJhY2tpbmd9OiBjYWxsZWQgYXQgdGhlIHJvb3QgYnlcbiAgICogYEV4ZWN1dGlvblJ1bnRpbWUudXNlV3JpdGVUcmFja2luZygpYCAocGx1bWJlZCBmcm9tIGBGbG93Q2hhcnRFeGVjdXRvcmApO1xuICAgKiBkZXNjZW5kYW50cyBpbmhlcml0IHZpYSBgY3JlYXRlTmV4dGAvYGNyZWF0ZUNoaWxkYCwgYW5kIGBTdWJmbG93RXhlY3V0b3JgXG4gICAqIHB1c2hlcyB0aGUgcGFyZW50IGNvbnRleHQncyBtb2RlIGludG8gZWFjaCBzdWJmbG93IHJvb3QuXG4gICAqL1xuICB1c2VXcml0ZVRyYWNraW5nKG1vZGU6IFdyaXRlVHJhY2tpbmdNb2RlKTogdm9pZCB7XG4gICAgdGhpcy53cml0ZVRyYWNraW5nID0gbW9kZTtcbiAgfVxuXG4gIC8qKiBSZXR1cm5zIHRoZSBhY3RpdmUgd3JpdGUtdHJhY2tpbmcgcG9saWN5ICh1c2VkIGZvciBzdWJmbG93IHByb3BhZ2F0aW9uKS4gKi9cbiAgZ2V0V3JpdGVUcmFja2luZygpOiBXcml0ZVRyYWNraW5nTW9kZSB7XG4gICAgcmV0dXJuIHRoaXMud3JpdGVUcmFja2luZztcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXQgdGhlIGNvbW1pdC12YWx1ZXMgZW5jb2RpbmcgcG9saWN5IGZvciB0aGlzIGNvbnRleHQgKCMxM2MtQikuIFNhbWVcbiAgICogcGx1bWJpbmcgYXMge0BsaW5rIHVzZVJlYWRUcmFja2luZ30ve0BsaW5rIHVzZVdyaXRlVHJhY2tpbmd9OiBjYWxsZWQgYXRcbiAgICogdGhlIHJvb3QgYnkgYEV4ZWN1dGlvblJ1bnRpbWUudXNlQ29tbWl0VmFsdWVzKClgIChwbHVtYmVkIGZyb21cbiAgICogYEZsb3dDaGFydEV4ZWN1dG9yYCk7IGRlc2NlbmRhbnRzIGluaGVyaXQgdmlhIGBjcmVhdGVOZXh0YC9gY3JlYXRlQ2hpbGRgLFxuICAgKiBhbmQgYFN1YmZsb3dFeGVjdXRvcmAgcHVzaGVzIHRoZSBwYXJlbnQgY29udGV4dCdzIG1vZGUgaW50byBlYWNoIHN1YmZsb3dcbiAgICogcm9vdC5cbiAgICovXG4gIHVzZUNvbW1pdFZhbHVlcyhtb2RlOiBDb21taXRWYWx1ZXNNb2RlKTogdm9pZCB7XG4gICAgdGhpcy5jb21taXRWYWx1ZXMgPSBtb2RlO1xuICB9XG5cbiAgLyoqIFJldHVybnMgdGhlIGFjdGl2ZSBjb21taXQtdmFsdWVzIHBvbGljeSAodXNlZCBmb3Igc3ViZmxvdyBwcm9wYWdhdGlvbikuICovXG4gIGdldENvbW1pdFZhbHVlcygpOiBDb21taXRWYWx1ZXNNb2RlIHtcbiAgICByZXR1cm4gdGhpcy5jb21taXRWYWx1ZXM7XG4gIH1cblxuICAvKipcbiAgICogU2V0IHRoZSBwZXItd3JpdGUgcmVhZC1wcm92ZW5hbmNlIHBvbGljeSAoI1AxKS4gU2FtZSBwbHVtYmluZyBhcyB0aGVcbiAgICogb3RoZXIgdGhyZWUgZGlhbHM6IGNhbGxlZCBhdCB0aGUgcm9vdCBieVxuICAgKiBgRXhlY3V0aW9uUnVudGltZS51c2VXcml0ZVByb3ZlbmFuY2UoKWAgKHBsdW1iZWQgZnJvbVxuICAgKiBgRmxvd0NoYXJ0RXhlY3V0b3JgKTsgZGVzY2VuZGFudHMgaW5oZXJpdCB2aWEgYGNyZWF0ZU5leHRgL2BjcmVhdGVDaGlsZGAsXG4gICAqIGFuZCBgU3ViZmxvd0V4ZWN1dG9yYCBwdXNoZXMgdGhlIHBhcmVudCBjb250ZXh0J3MgbW9kZSBpbnRvIGVhY2ggc3ViZmxvd1xuICAgKiByb290IHNvIG5lc3RlZCBjaGFydHMgaW5oZXJpdCB0b28uXG4gICAqL1xuICB1c2VXcml0ZVByb3ZlbmFuY2UobW9kZTogV3JpdGVQcm92ZW5hbmNlTW9kZSk6IHZvaWQge1xuICAgIHRoaXMud3JpdGVQcm92ZW5hbmNlID0gbW9kZTtcbiAgfVxuXG4gIC8qKiBSZXR1cm5zIHRoZSBhY3RpdmUgd3JpdGUtcHJvdmVuYW5jZSBwb2xpY3kgKHVzZWQgZm9yIHN1YmZsb3cgcHJvcGFnYXRpb24pLiAqL1xuICBnZXRXcml0ZVByb3ZlbmFuY2UoKTogV3JpdGVQcm92ZW5hbmNlTW9kZSB7XG4gICAgcmV0dXJuIHRoaXMud3JpdGVQcm92ZW5hbmNlO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlY29yZCBhIHRyYWNrZWQgdXNlci1sZXZlbCB3cml0ZSBpbnRvIGBfc3RhZ2VXcml0ZXNgLCBwb2xpY3ktZ2F0ZWRcbiAgICogKCMxM2MtQSkg4oCUIHRoZSBzaW5nbGUgYm9va2tlZXBpbmcgcGF0aCBmb3Ige0BsaW5rIHNldE9iamVjdH0gYW5kXG4gICAqIHtAbGluayB1cGRhdGVPYmplY3R9LlxuICAgKlxuICAgKiBSZWRhY3Rpb24gdGFrZXMgcHJlY2VkZW5jZSBvdmVyIHRoZSBkaWFsIGluIEVWRVJZIG1vZGU6IGEgcmVkYWN0ZWRcbiAgICogd3JpdGUgc3RvcmVzIHRoZSBgJ1tSRURBQ1RFRF0nYCBwbGFjZWhvbGRlciB1bmRlciBgJ2Z1bGwnYCBBTkRcbiAgICogYCdzdW1tYXJ5J2AgKGEgc3VtbWFyeSBtYXJrZXIgd291bGQgbGVhayB0aGUgdmFsdWUncyBwcmV2aWV3L3NpemUpLFxuICAgKiBhbmQgc3RvcmVzIG5vdGhpbmcgdW5kZXIgYCdvZmYnYCAoZW50cnkgc2tpcHBlZCBlbnRpcmVseSDigJQgbm90aGluZyB0b1xuICAgKiBsZWFrKS4gQSBmaWVsZC1sZXZlbCB2ZXJkaWN0IHNjcnVicyBhIGNsb25lIEJFRk9SRSB0aGUgZGlhbCBzZWVzIGl0LCBzb1xuICAgKiBhIHN1bW1hcnkgcHJldmlldyBjYW4gbmV2ZXIgc2hvdyB0aGUgc2VjcmV0IGVpdGhlci4gVGhlIHN0YWdlZCB3cml0ZVxuICAgKiBpdHNlbGYgaXMgdW5hZmZlY3RlZCDigJQgcmVkYWN0aW9uIG9mIHRoZSBjb21taXR0ZWQgcGF5bG9hZCBpcyBoYW5kbGVkIGJ5XG4gICAqIHRoZSB0cmFuc2FjdGlvbiBidWZmZXIncyBgcmVkYWN0ZWRQYXRoc2AuXG4gICAqL1xuICBwcml2YXRlIHRyYWNrV3JpdGUoXG4gICAgdXNlcktleTogc3RyaW5nLFxuICAgIHZhbHVlOiB1bmtub3duLFxuICAgIHZlcmRpY3Q6IFJlZGFjdGlvblZlcmRpY3QsXG4gICAgb3BlcmF0aW9uOiAnc2V0JyB8ICd1cGRhdGUnIHwgJ2RlbGV0ZScsXG4gICkge1xuICAgIGlmICh0aGlzLndyaXRlVHJhY2tpbmcgPT09ICdvZmYnKSByZXR1cm47XG4gICAgdGhpcy5fc3RhZ2VXcml0ZXNbdXNlcktleV0gPSB7XG4gICAgICB2YWx1ZTogdGhpcy5yZXRhaW5lZEZvcm0odmVyZGljdCwgdmFsdWUsIHRoaXMud3JpdGVUcmFja2luZywgc3VtbWFyaXplV3JpdGVWYWx1ZSksXG4gICAgICBvcGVyYXRpb24sXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgZm9ybSBvZiBhIHZhbHVlIHRoZSBlbmdpbmUgUkVUQUlOUyAocmVhZHMgYW5kIHdyaXRlcyByZXRlbnRpb24pOlxuICAgKiB0aGUgcGxhY2Vob2xkZXIgYmVhdHMgZXZlcnkgZGlhbDsgYSBmaWVsZC1sZXZlbCBzY3J1YiBoYXBwZW5zIGJlZm9yZSB0aGVcbiAgICogZGlhbCBzZWVzIHRoZSB2YWx1ZTsgYSBjbGVhciB2YWx1ZSBpcyBzdW1tYXJpemVkIG9yIGNsb25lZCBhcyB0aGUgZGlhbFxuICAgKiBzYXlzLiBDYWxsZXJzIGhhbmRsZSBgdW5kZWZpbmVkYCBiZWZvcmUgYXNraW5nLlxuICAgKi9cbiAgcHJpdmF0ZSByZXRhaW5lZEZvcm0oXG4gICAgdmVyZGljdDogUmVkYWN0aW9uVmVyZGljdCxcbiAgICB2YWx1ZTogdW5rbm93bixcbiAgICBtb2RlOiBSZWFkVHJhY2tpbmdNb2RlIHwgV3JpdGVUcmFja2luZ01vZGUsXG4gICAgc3VtbWFyaXplOiAodmFsdWU6IHVua25vd24pID0+IHVua25vd24sXG4gICk6IHVua25vd24ge1xuICAgIGlmICh2ZXJkaWN0LmtpbmQgPT09ICd3aG9sZScpIHJldHVybiBSRURBQ1RFRDtcbiAgICBjb25zdCBzY3J1YmJlZCA9IHZlcmRpY3Qua2luZCA9PT0gJ2ZpZWxkcycgPyBSZWRhY3Rpb25SdWxlLnNjcnViRmllbGRzKHZhbHVlLCB2ZXJkaWN0LnBhdGhzKSA6IHVuZGVmaW5lZDtcbiAgICBpZiAobW9kZSA9PT0gJ3N1bW1hcnknKSByZXR1cm4gc3VtbWFyaXplKHNjcnViYmVkID8/IHZhbHVlKTtcbiAgICByZXR1cm4gc2NydWJiZWQgPz8gc3RydWN0dXJlZENsb25lKHZhbHVlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgcnVsZSB3aXRoIHNvbWV0aGluZyB0byBzYXkg4oCUIGB1bmRlZmluZWRgIG9uIHRoZSBuby1wb2xpY3kgcGF0aCAobm9cbiAgICogcnVsZSBpbnN0YWxsZWQsIG9yIGEgcnVsZSB3aXRoIG5vIHBvbGljeSBlbnRyaWVzIGFuZCBubyBtYXJrZWQga2V5cyksIHNvXG4gICAqIGEgdHJhY2tlZCByZWFkIG9yIGEgc3RhZ2VkIHdyaXRlIHRoZXJlIHBheXMgbm8gdmVyZGljdCBjYWxsIGFuZCBubyBwYXRoXG4gICAqIGFsbG9jYXRpb24uIFRoZSBkZWZhdWx0IHJ1biBpcyBieXRlLWlkZW50aWNhbCBBTkQgY29zdC1pZGVudGljYWwuXG4gICAqL1xuICBwcml2YXRlIGFjdGl2ZVJ1bGUoKTogUmVkYWN0aW9uUnVsZSB8IHVuZGVmaW5lZCB7XG4gICAgY29uc3QgcnVsZSA9IHRoaXMucmVkYWN0aW9uUnVsZTtcbiAgICByZXR1cm4gcnVsZSAhPT0gdW5kZWZpbmVkICYmICFydWxlLmlzSW5lcnQoKSA/IHJ1bGUgOiB1bmRlZmluZWQ7XG4gIH1cblxuICAvKipcbiAgICogVEhFIE9ORSBGVU5ORUwgZXZlcnkgc3RhZ2VkIHdyaXRlIHBhc3NlcyB0aHJvdWdoIOKAlCBmYWNhZGUgd3JpdGVzIEFORFxuICAgKiB0aGUgcGF0aHMgdGhhdCBieXBhc3MgdGhlIGZhY2FkZSAoc3ViZmxvdyBzZWVkLCBgb3V0cHV0TWFwcGVyYFxuICAgKiBtZXJnZS1iYWNrLCByZXN1bWUgcmUtc2VlZCkuIFRoZSBPTkUgZGVjaXNpb24gaXMgbWFkZSBoZXJlOiBhbiBleHBsaWNpdFxuICAgKiBwZXItY2FsbCBmbGFnIG1ha2VzIHRoZSB2YWx1ZSBzZWNyZXQgb3V0cmlnaHQgKGFuZCBtYXJrcyB0aGUga2V5IGZvciB0aGVcbiAgICogcmVzdCBvZiB0aGUgcnVuLCB0aGUgZGVjbGFyZS1vbmNlIGNvbnRyYWN0KTsgb3RoZXJ3aXNlIHRoZSBpbnN0YWxsZWRcbiAgICogcnVsZSBkZWNpZGVzIGZyb20gdGhlIHVzZXItbGV2ZWwgcGF0aC4gSXQgc3RhZ2VzIHRoZSB3cml0ZSwgcmVnaXN0ZXJzXG4gICAqIHRoZSByZWRhY3RlZCBwYXRocyB0aGUgY29tbWl0IGxvZyBhbmQgbWlycm9yIHdpbGwgc2NydWIgKHdob2xlIGtleSwgb3JcbiAgICogdGhlIGZpZWxkcyBpbnNpZGUgdGhlIHZhbHVlKSwgYW5kIGtlZXBzIHRoZSBydW4ncyBtYXJrZWQta2V5cyBzZXQgaW5cbiAgICogc3RlcCAoYSB3aG9sZSB2ZXJkaWN0IG1hcmtzIGl0cyBrZXk7IGEgZGVsZXRlIGNsZWFycyB0aGUgbWFyaykuIFJldHVybnNcbiAgICogdGhlIHZlcmRpY3Qgc28gdGhlIGNhbGxlciByZXRhaW5zIGFuZCByZXBvcnRzIHVuZGVyIHRoZSBzYW1lIGRlY2lzaW9uLlxuICAgKi9cbiAgcHJpdmF0ZSBzdGFnZVdyaXRlKFxuICAgIG5zUGF0aDogc3RyaW5nW10sXG4gICAgcGF0aDogc3RyaW5nW10sXG4gICAga2V5OiBzdHJpbmcsXG4gICAgdmFsdWU6IHVua25vd24sXG4gICAgZXhwbGljaXQ6IGJvb2xlYW4gfCB1bmRlZmluZWQsXG4gICAgdmVyYjogJ3NldCcgfCAnbWVyZ2UnIHwgJ2RlbGV0ZScsXG4gICk6IFJlZGFjdGlvblZlcmRpY3Qge1xuICAgIGNvbnN0IHJ1bGUgPSB0aGlzLmFjdGl2ZVJ1bGUoKTtcbiAgICBjb25zdCB2ZXJkaWN0OiBSZWRhY3Rpb25WZXJkaWN0ID0gZXhwbGljaXRcbiAgICAgID8geyBraW5kOiAnd2hvbGUnLCBrZXk6IHVzZXJLZXlPZihwYXRoLCBrZXkpIH1cbiAgICAgIDogcnVsZSAhPT0gdW5kZWZpbmVkXG4gICAgICA/IHJ1bGUudmVyZGljdEF0KHBhdGgsIGtleSlcbiAgICAgIDogQ0xFQVI7XG4gICAgY29uc3Qgd2hvbGUgPSB2ZXJkaWN0LmtpbmQgPT09ICd3aG9sZSc7XG4gICAgY29uc3QgYnVmZmVyID0gdGhpcy5nZXRUcmFuc2FjdGlvbkJ1ZmZlcigpO1xuICAgIGlmICh2ZXJiID09PSAnbWVyZ2UnKSBidWZmZXIubWVyZ2UobnNQYXRoLCB2YWx1ZSwgd2hvbGUpO1xuICAgIGVsc2UgaWYgKHZlcmIgPT09ICdkZWxldGUnKSBidWZmZXIuZGVsZXRlKG5zUGF0aCwgd2hvbGUpO1xuICAgIGVsc2UgYnVmZmVyLnNldChuc1BhdGgsIHZhbHVlLCB3aG9sZSk7XG4gICAgaWYgKHZlcmRpY3Qua2luZCA9PT0gJ2ZpZWxkcycpIGJ1ZmZlci5tYXJrUmVkYWN0ZWRGaWVsZHMobnNQYXRoLCB2ZXJkaWN0LnBhdGhzKTtcbiAgICBpZiAodmVyYiA9PT0gJ2RlbGV0ZScpIHtcbiAgICAgIHJ1bGU/LnVubWFyayh1c2VyS2V5T2YocGF0aCwga2V5KSk7XG4gICAgfSBlbHNlIGlmICh3aG9sZSkge1xuICAgICAgLy8gVGhlIFJFQUwgcnVsZSwgbm90IHRoZSBhY3RpdmUgb25lOiBhbiBleHBsaWNpdCBtYXJrIG9uIGFuIGluZXJ0IHJ1bGVcbiAgICAgIC8vIGlzIGV4YWN0bHkgd2hhdCBtYWtlcyBpdCBhY3RpdmUgZm9yIHRoZSByZXN0IG9mIHRoZSBydW4uXG4gICAgICB0aGlzLnJlZGFjdGlvblJ1bGU/Lm1hcmsodmVyZGljdC5rZXkpO1xuICAgIH1cbiAgICByZXR1cm4gdmVyZGljdDtcbiAgfVxuXG4gIC8qKlxuICAgKiDilIDilIAgVGhlIGZpcnN0LXRvdWNoIHN0YXRlIHZpZXcgKCMxMykg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG4gICAqXG4gICAqIFdIQVQ6IHJldHVybnMgdGhlIGNvbW1pdHRlZCBzaGFyZWQgc3RhdGUgYXMgaXQgd2FzIGF0IHRoaXMgc3RhZ2UncyBGSVJTVFxuICAgKiB0b3VjaCAoZmlyc3QgcmVhZCBvciBmaXJzdCB3cml0ZSksIGNhcHR1cmluZyB0aGUgcmVmZXJlbmNlIG9uIGZpcnN0IGNhbGwuXG4gICAqIFNlcnZlcyB0d28gY29uc3VtZXJzOiByZWFkcyBiZWZvcmUgdGhlIGZpcnN0IHdyaXRlICh7QGxpbmsgcmVhZFN0YXRlfSlcbiAgICogYW5kIHRoZSB0cmFuc2FjdGlvbiBidWZmZXIncyBkaWZmIGJhc2UgKHtAbGluayBnZXRUcmFuc2FjdGlvbkJ1ZmZlcn0pLlxuICAgKlxuICAgKiBXSFkgQSBCQVJFIFJFRkVSRU5DRSBJUyBTQUZFIOKAlCB0aGUgaW52YXJpYW50IHRoaXMgcmVzdHMgb246IGNvbW1pdHRlZFxuICAgKiBzdGF0ZSBpcyBpbW11dGFibGUtYWZ0ZXItc3dhcC4gYFNoYXJlZE1lbW9yeS5hcHBseVBhdGNoYCByb3V0ZXMgdGhyb3VnaFxuICAgKiBgYXBwbHlTbWFydE1lcmdlYCwgd2hpY2ggYHN0cnVjdHVyZWRDbG9uZWBzIHRoZSBjdXJyZW50IHN0YXRlLCBtdXRhdGVzXG4gICAqIG9ubHkgdGhlIGNsb25lLCBhbmQgc3dhcHMgYFNoYXJlZE1lbW9yeS5jb250ZXh0YCB0byBpdCDigJQgdGhlIG9iamVjdCBhXG4gICAqIHN0YWdlIGNhcHR1cmVkIGhlcmUgaXMgbmV2ZXIgZWRpdGVkIGFmdGVyd2FyZHMuIChgU2hhcmVkTWVtb3J5LnNldFZhbHVlYC9cbiAgICogYHVwZGF0ZVZhbHVlYCBETyBtdXRhdGUgaW4gcGxhY2UsIGJ1dCBoYXZlIG5vIGNhbGxlcnMgZHVyaW5nIHRyYXZlcnNhbDtcbiAgICogZXZlcnkgcnVudGltZSB3cml0ZSByZWFjaGVzIHN0YXRlIHRocm91Z2ggYSBzdGFnZSBjb21taXQncyBgYXBwbHlQYXRjaGAuKVxuICAgKiBIb2xkaW5nIHRoZSByZWZlcmVuY2UgdGhlcmVmb3JlIGdpdmVzIHRoaXMgc3RhZ2UgYSBzdGFibGUgc25hcHNob3QgYXRcbiAgICogemVybyBjb3N0IOKAlCBubyBjbG9uZSwgd2hpY2ggaXMgdGhlIGVudGlyZSBwb2ludCBvZiAjMTMuXG4gICAqXG4gICAqIFdIWSBGSVJTVCBUT1VDSCwgbm90IGZpcnN0IHdyaXRlOiB0aGUgcHJlLSMxMyBlYWdlciBlbmdpbmUgY2xvbmVkIHRoZVxuICAgKiBzdGF0ZSBpbnRvIHRoZSBidWZmZXIgYXQgdGhlIHN0YWdlJ3MgZmlyc3QgQUNDRVNTLCBhbmNob3JpbmcgYm90aCBpdHNcbiAgICogc25hcHNob3QgcmVhZHMgYW5kIGl0cyBjb21taXQgYmFzZWxpbmUgKHRoZSBuZXQtY2hhbmdlIGRpZmYgYmFzZSkgdGhlcmUuXG4gICAqICMxMydzIGZpcnN0IGN1dCBhbmNob3JlZCB0aGUgbGF6eSBidWZmZXIgYXQgZmlyc3QgV1JJVEUg4oCUIG9ic2VydmFibHlcbiAgICogZGlmZmVyZW50IHdoZW4gc29tZXRoaW5nIGVsc2UgY29tbWl0cyBpbiB0aGUgZ2FwIGJldHdlZW4gdGhpcyBzdGFnZSdzXG4gICAqIGZpcnN0IHJlYWQgYW5kIGl0cyBmaXJzdCB3cml0ZS4gVGhhdCBnYXAgaXMgUkVBQ0hBQkxFOiBmb3JrIHNpYmxpbmdzIGFyZVxuICAgKiBuYW1lc3BhY2UtaXNvbGF0ZWQgZm9yIHJ1bi1zY29wZWQga2V5cyAoZWFjaCBjaGlsZCB3cml0ZXMgdW5kZXJcbiAgICogYHJ1bnMvPGNoaWxkSWQ+L2ApLCBidXQgUk9PVC1sZXZlbCBrZXlzIGFyZSBzaGFyZWQg4oCUIHdyaXR0ZW4gdmlhXG4gICAqIGBzZXRHbG9iYWxgIGZyb20gY29uc3VtZXIgc2NvcGUgY29kZSBhbmQsIGNyaXRpY2FsbHksIGJ5XG4gICAqIGBTdWJmbG93SW5wdXRNYXBwZXJgJ3Mgb3V0cHV0IG1hcHBpbmcgKGBwYXJlbnRDb250ZXh0LnNldEdsb2JhbGApLCB3aGljaFxuICAgKiBpcyBleGFjdGx5IHdoYXQgcnVucyB3aGVuIGEgc3ViZmxvdyBpcyBhIGZvcmsgYnJhbmNoLiBBIHNpYmxpbmcnc1xuICAgKiByb290LWtleSBjb21taXQgbGFuZGluZyBpbiB0aGUgZ2FwIHdvdWxkIHNoaWZ0IHRoaXMgc3RhZ2UncyBkaWZmIGJhc2UsXG4gICAqIG1ha2luZyBpdHMgQ29tbWl0QnVuZGxlIHJlY29yZCBhIHBoYW50b20gY2hhbmdlIChvciBzd2FsbG93IGEgcmVhbCBvbmUpXG4gICAqIHJlbGF0aXZlIHRvIHRoZSBlYWdlciBlbmdpbmUuIEFuY2hvcmluZyB0aGUgdmlldyBhdCBmaXJzdCB0b3VjaCByZXN0b3Jlc1xuICAgKiB0aGUgRVhBQ1QgZWFnZXIgc2VtYW50aWNzIOKAlCBzZXF1ZW50aWFsIEFORCBwYXJhbGxlbCDigJQgYXQgemVybyBjbG9uZSBjb3N0LlxuICAgKlxuICAgKiBSZWFkIHZpc2liaWxpdHkgaXMgdHdvLXRpZXIsIG1hdGNoaW5nIGVhZ2VyIGJ5dGUtZm9yLWJ5dGU6IGtleXMgcHJlc2VudFxuICAgKiBpbiB0aGUgdmlldyBhdCBmaXJzdCB0b3VjaCByZWFkIHJlcGVhdGFibHkgZnJvbSBpdDsga2V5cyBBQlNFTlQgZnJvbSBpdFxuICAgKiBmYWxsIGJhY2sgdG8gTElWRSBzdGF0ZSAodGhlIGVhZ2VyIGVuZ2luZSdzIGV4YWN0IGZhbGxiYWNrIOKAlCBhXG4gICAqIG1pZC1mbGlnaHQgc2libGluZyByb290LWtleSB3cml0ZSB3YXMgYWx3YXlzIHZpc2libGUgdG8gcmVhZHMsIGFuZFxuICAgKiBzdGF5cyB2aXNpYmxlOyBvbmx5IHRoZSBESUZGIEJBU0UgaXMgcGlubmVkKS5cbiAgICovXG4gIHByaXZhdGUgZmlyc3RUb3VjaFN0YXRlKCk6IFJlY29yZDxzdHJpbmcsIHVua25vd24+IHtcbiAgICBpZiAoIXRoaXMuc3RhdGVWaWV3KSB7XG4gICAgICB0aGlzLnN0YXRlVmlldyA9IHRoaXMuc2hhcmVkTWVtb3J5LmdldFN0YXRlKCk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLnN0YXRlVmlldztcbiAgfVxuXG4gIC8qKiBMYXppbHkgY3JlYXRlcyB0aGUgdHJhbnNhY3Rpb24gYnVmZmVyIG9uIHRoZSBzdGFnZSdzIEZJUlNUIFdSSVRFICgjMTMpLlxuICAgKlxuICAgKiAgUmVhZHMgTkVWRVIgY29uc3RydWN0IGl0OiByZWFkLXlvdXItd3JpdGVzIG9ubHkgbWF0dGVycyBvbmNlIGEgc3RhZ2VkXG4gICAqICB3cml0ZSBleGlzdHMsIHNvIGJlZm9yZSB0aGF0IHtAbGluayBnZXRWYWx1ZX0ve0BsaW5rIGdldFZhbHVlRGlyZWN0fVxuICAgKiAgc2VydmUgZnJvbSB0aGUgZmlyc3QtdG91Y2ggc3RhdGUgdmlldyBhbmQge0BsaW5rIGNvbW1pdH0gcmVjb3JkcyBhblxuICAgKiAgZW1wdHkgYnVuZGxlIOKAlCBhbGwgd2l0aCBaRVJPIGBzdHJ1Y3R1cmVkQ2xvbmVgcyBvZiB0aGUgc2hhcmVkIHN0YXRlLlxuICAgKlxuICAgKiAgVGhlIGJ1ZmZlcidzIGJhc2UgaXMgdGhlIEZJUlNULVRPVUNIIHZpZXcsIE5PVCB0aGUgbGl2ZSBzdGF0ZSBhdCB3cml0ZVxuICAgKiAgdGltZTogdW5kZXIgcGFyYWxsZWwgZm9ya3MgYSBzaWJsaW5nIG1heSBoYXZlIGNvbW1pdHRlZCBiZXR3ZWVuIHRoaXNcbiAgICogIHN0YWdlJ3MgZmlyc3QgcmVhZCBhbmQgdGhpcyB3cml0ZSwgYW5kIHRoZSBuZXQtY2hhbmdlIGRpZmYgYmFzZSBtdXN0XG4gICAqICBzdGF5IGFuY2hvcmVkIGF0IGZpcnN0IHRvdWNoIHRvIG1hdGNoIHRoZSBlYWdlciBlbmdpbmUg4oCUIHNlZVxuICAgKiAge0BsaW5rIGZpcnN0VG91Y2hTdGF0ZX0uICovXG4gIGdldFRyYW5zYWN0aW9uQnVmZmVyKCk6IFRyYW5zYWN0aW9uQnVmZmVyIHtcbiAgICBpZiAoIXRoaXMuYnVmZmVyKSB7XG4gICAgICAvLyBQZXItd3JpdGUgcHJvdmVuYW5jZSAoI1AxKTogaGFuZCB0aGUgYnVmZmVyIGEgbGl2ZSB2aWV3IG9mIHRoaXNcbiAgICAgIC8vIHN0YWdlJ3MgcmVhZCBwcmVmaXgg4oCUIGV2YWx1YXRlZCBBVCBFQUNIIFdSSVRFLCBzbyBlYWNoIHN0YWdlZCBvcFxuICAgICAgLy8gY2FwdHVyZXMgZXhhY3RseSB0aGUgcmVhZHMgdGhhdCBwcmVjZWRlZCBpdCAodGVtcG9yYWwgcHJlZml4KS5cbiAgICAgIGNvbnN0IHJlYWRLZXlzUHJvdmlkZXIgPVxuICAgICAgICB0aGlzLndyaXRlUHJvdmVuYW5jZSA9PT0gJ3JlYWRzLXByZWZpeCcgPyAoKSA9PiBbLi4uKHRoaXMuX3Byb3ZlbmFuY2VSZWFkcyA/PyBbXSldIDogdW5kZWZpbmVkO1xuICAgICAgdGhpcy5idWZmZXIgPSBuZXcgVHJhbnNhY3Rpb25CdWZmZXIodGhpcy5maXJzdFRvdWNoU3RhdGUoKSwgdGhpcy5jb21taXRWYWx1ZXMsIHJlYWRLZXlzUHJvdmlkZXIpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5idWZmZXI7XG4gIH1cblxuICAvKiogQnVpbGRzIGFuIGFic29sdXRlIHBhdGggaW5zaWRlIHRoZSBzaGFyZWQgbWVtb3J5IChydW4gbmFtZXNwYWNlKS4gKi9cbiAgcHJpdmF0ZSB3aXRoTmFtZXNwYWNlKHBhdGg6IHN0cmluZ1tdLCBrZXk6IHN0cmluZyk6IHN0cmluZ1tdIHtcbiAgICBpZiAoIXRoaXMucnVuSWQgfHwgdGhpcy5ydW5JZCA9PT0gJycpIHtcbiAgICAgIHJldHVybiBbLi4ucGF0aCwga2V5XTtcbiAgICB9XG4gICAgcmV0dXJuIFsncnVucycsIHRoaXMucnVuSWQsIC4uLnBhdGgsIGtleV07XG4gIH1cblxuICAvLyDilIDilIAgV3JpdGUgb3BlcmF0aW9ucyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuICBwYXRjaChwYXRoOiBzdHJpbmdbXSwga2V5OiBzdHJpbmcsIHZhbHVlOiB1bmtub3duLCBzaG91bGRSZWRhY3QgPSBmYWxzZSk6IFJlZGFjdGlvblZlcmRpY3Qge1xuICAgIHJldHVybiB0aGlzLnN0YWdlV3JpdGUodGhpcy53aXRoTmFtZXNwYWNlKHBhdGgsIGtleSksIHBhdGgsIGtleSwgdmFsdWUsIHNob3VsZFJlZGFjdCwgJ3NldCcpO1xuICB9XG5cbiAgc2V0KHBhdGg6IHN0cmluZ1tdLCBrZXk6IHN0cmluZywgdmFsdWU6IHVua25vd24pIHtcbiAgICB0aGlzLnBhdGNoKHBhdGgsIGtleSwgdmFsdWUpO1xuICB9XG5cbiAgbWVyZ2UocGF0aDogc3RyaW5nW10sIGtleTogc3RyaW5nLCB2YWx1ZTogdW5rbm93biwgc2hvdWxkUmVkYWN0PzogYm9vbGVhbik6IFJlZGFjdGlvblZlcmRpY3Qge1xuICAgIHJldHVybiB0aGlzLnN0YWdlV3JpdGUodGhpcy53aXRoTmFtZXNwYWNlKHBhdGgsIGtleSksIHBhdGgsIGtleSwgdmFsdWUsIHNob3VsZFJlZGFjdCwgJ21lcmdlJyk7XG4gIH1cblxuICBzZXRPYmplY3QoXG4gICAgcGF0aDogc3RyaW5nW10sXG4gICAga2V5OiBzdHJpbmcsXG4gICAgdmFsdWU6IHVua25vd24sXG4gICAgc2hvdWxkUmVkYWN0PzogYm9vbGVhbixcbiAgICBkZXNjcmlwdGlvbj86IHN0cmluZyxcbiAgICBvcGVyYXRpb25PdmVycmlkZT86ICdzZXQnIHwgJ2RlbGV0ZScsXG4gICk6IFJlZGFjdGlvblZlcmRpY3Qge1xuICAgIC8vIEV4cGxpY2l0IGRlbGV0aW9uIChTY29wZUZhY2FkZS5kZWxldGVWYWx1ZSkgc3RhZ2VzIGEgZGlzdGluY3Qgb3Agc29cbiAgICAvLyBkZWx0YS1tb2RlIGNvbW1pdHMgKCMxM2MtQikgY2FuIGVtaXQgYSByZWFsIGBkZWxldGVgIHRyYWNlIGVudHJ5LlxuICAgIC8vIFVuZGVyIHRoZSBkZWZhdWx0ICdmdWxsJyBtb2RlIHRoZSBidWZmZXIgY29tbWl0cyBpdCBhcyBhXG4gICAgLy8gc2V0LW9mLXVuZGVmaW5lZCDigJQgYnl0ZS1pZGVudGljYWwgdG8gdGhlIGhpc3RvcmljYWwgZmxhdHRlbmluZy5cbiAgICBjb25zdCB2ZXJkaWN0ID1cbiAgICAgIG9wZXJhdGlvbk92ZXJyaWRlID09PSAnZGVsZXRlJ1xuICAgICAgICA/IHRoaXMuc3RhZ2VXcml0ZSh0aGlzLndpdGhOYW1lc3BhY2UocGF0aCwga2V5KSwgcGF0aCwga2V5LCB1bmRlZmluZWQsIHNob3VsZFJlZGFjdCwgJ2RlbGV0ZScpXG4gICAgICAgIDogdGhpcy5zdGFnZVdyaXRlKHRoaXMud2l0aE5hbWVzcGFjZShwYXRoLCBrZXkpLCBwYXRoLCBrZXksIHZhbHVlLCBzaG91bGRSZWRhY3QsICdzZXQnKTtcbiAgICAvLyBUcmFjayB1c2VyLWxldmVsIHdyaXRlIChwcmUtbmFtZXNwYWNlKSBmb3IgbWVtb3J5IHZpZXcgKyBvbkNvbW1pdCDigJRcbiAgICAvLyBwb2xpY3ktZ2F0ZWQgKCMxM2MtQSksIHNlZSB0cmFja1dyaXRlLlxuICAgIHRoaXMudHJhY2tXcml0ZSh1c2VyS2V5T2YocGF0aCwga2V5KSwgdmFsdWUsIHZlcmRpY3QsIG9wZXJhdGlvbk92ZXJyaWRlID8/ICdzZXQnKTtcbiAgICBpZiAoZGVzY3JpcHRpb24pIHtcbiAgICAgIGNvbnN0IHRhZ2dlZCA9IGRlc2NyaXB0aW9uLnN0YXJ0c1dpdGgoJ1snKSA/IGRlc2NyaXB0aW9uIDogYFtXUklURV0gJHtkZXNjcmlwdGlvbn1gO1xuICAgICAgdGhpcy5kZWJ1Zy5hZGRMb2coJ21lc3NhZ2UnLCB0YWdnZWQpO1xuICAgIH1cbiAgICByZXR1cm4gdmVyZGljdDtcbiAgfVxuXG4gIHVwZGF0ZU9iamVjdChcbiAgICBwYXRoOiBzdHJpbmdbXSxcbiAgICBrZXk6IHN0cmluZyxcbiAgICB2YWx1ZTogdW5rbm93bixcbiAgICBkZXNjcmlwdGlvbj86IHN0cmluZyxcbiAgICBzaG91bGRSZWRhY3Q/OiBib29sZWFuLFxuICApOiBSZWRhY3Rpb25WZXJkaWN0IHtcbiAgICBjb25zdCB2ZXJkaWN0ID0gdGhpcy5tZXJnZShwYXRoLCBrZXksIHZhbHVlLCBzaG91bGRSZWRhY3QpO1xuICAgIC8vIFRyYWNrIHVzZXItbGV2ZWwgd3JpdGUgKHByZS1uYW1lc3BhY2UpIGZvciBtZW1vcnkgdmlldyArIG9uQ29tbWl0IOKAlFxuICAgIC8vIHBvbGljeS1nYXRlZCAoIzEzYy1BKSwgc2VlIHRyYWNrV3JpdGUuXG4gICAgdGhpcy50cmFja1dyaXRlKHVzZXJLZXlPZihwYXRoLCBrZXkpLCB2YWx1ZSwgdmVyZGljdCwgJ3VwZGF0ZScpO1xuICAgIGlmIChkZXNjcmlwdGlvbikge1xuICAgICAgdGhpcy5kZWJ1Zy5hZGRMb2coJ21lc3NhZ2UnLCBkZXNjcmlwdGlvbik7XG4gICAgfVxuICAgIHJldHVybiB2ZXJkaWN0O1xuICB9XG5cbiAgc2V0Um9vdChrZXk6IHN0cmluZywgdmFsdWU6IHVua25vd24pIHtcbiAgICB0aGlzLnBhdGNoKFtdLCBrZXksIHZhbHVlKTtcbiAgfVxuXG4gIC8qKiBSb290LWxldmVsICh1bi1uYW1lc3BhY2VkKSB3cml0ZSDigJQgdGhlIHN1YmZsb3cgc2VlZCBhbmQgbWVyZ2UtYmFjayBwYXRoLiAqL1xuICBzZXRHbG9iYWwoa2V5OiBzdHJpbmcsIHZhbHVlOiB1bmtub3duLCBkZXNjcmlwdGlvbj86IHN0cmluZykge1xuICAgIHRoaXMuc3RhZ2VXcml0ZShba2V5XSwgW10sIGtleSwgdmFsdWUsIHVuZGVmaW5lZCwgJ3NldCcpO1xuICAgIGlmIChkZXNjcmlwdGlvbikge1xuICAgICAgdGhpcy5kZWJ1Zy5hZGRMb2coJ21lc3NhZ2UnLCBkZXNjcmlwdGlvbik7XG4gICAgfVxuICB9XG5cbiAgdXBkYXRlR2xvYmFsQ29udGV4dChrZXk6IHN0cmluZywgdmFsdWU6IHVua25vd24pIHtcbiAgICB0aGlzLnN0YWdlV3JpdGUoW2tleV0sIFtdLCBrZXksIHZhbHVlLCB1bmRlZmluZWQsICdzZXQnKTtcbiAgfVxuXG4gIGFwcGVuZFRvQXJyYXkocGF0aDogc3RyaW5nW10sIGtleTogc3RyaW5nLCBpdGVtczogdW5rbm93bltdLCBkZXNjcmlwdGlvbj86IHN0cmluZykge1xuICAgIGNvbnN0IGV4aXN0aW5nID0gdGhpcy5nZXRWYWx1ZShwYXRoLCBrZXkpO1xuICAgIGNvbnN0IG1lcmdlZCA9IEFycmF5LmlzQXJyYXkoZXhpc3RpbmcpID8gWy4uLmV4aXN0aW5nLCAuLi5pdGVtc10gOiBbLi4uaXRlbXNdO1xuICAgIHRoaXMuc2V0T2JqZWN0KHBhdGgsIGtleSwgbWVyZ2VkLCBmYWxzZSwgZGVzY3JpcHRpb24pO1xuICB9XG5cbiAgbWVyZ2VPYmplY3QocGF0aDogc3RyaW5nW10sIGtleTogc3RyaW5nLCBvYmo6IFJlY29yZDxzdHJpbmcsIHVua25vd24+LCBkZXNjcmlwdGlvbj86IHN0cmluZykge1xuICAgIGNvbnN0IGV4aXN0aW5nID0gdGhpcy5nZXRWYWx1ZShwYXRoLCBrZXkpO1xuICAgIGNvbnN0IG1lcmdlZCA9XG4gICAgICBleGlzdGluZyAmJiB0eXBlb2YgZXhpc3RpbmcgPT09ICdvYmplY3QnICYmICFBcnJheS5pc0FycmF5KGV4aXN0aW5nKVxuICAgICAgICA/IHsgLi4uKGV4aXN0aW5nIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KSwgLi4ub2JqIH1cbiAgICAgICAgOiB7IC4uLm9iaiB9O1xuICAgIHRoaXMuc2V0T2JqZWN0KHBhdGgsIGtleSwgbWVyZ2VkLCBmYWxzZSwgZGVzY3JpcHRpb24pO1xuICB9XG5cbiAgLy8g4pSA4pSAIFJlYWQgb3BlcmF0aW9ucyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuICAvKiogQnVmZmVyLWF3YXJlIHJlYWQsIG1pcnJvcmluZyB0aGUgZWFnZXIgZW5naW5lJ3MgcmVhZCBvcmRlciBieXRlLWZvci1ieXRlOlxuICAgKlxuICAgKiAgICAxLiBzdGFnZWQgd3JpdGVzICsgZmlyc3QtdG91Y2ggc25hcHNob3Qg4oCUIGBidWZmZXIuZ2V0YCBvdmVyIGl0c1xuICAgKiAgICAgICB3b3JraW5nQ29weSB3aGVuIHRoZSBidWZmZXIgZXhpc3RzLCBlbHNlIGBuYXRpdmVHZXRgIG92ZXIgdGhlXG4gICAqICAgICAgIHplcm8tY2xvbmUgc3RhdGUgdmlldyAodGhlIGJ1ZmZlcidzIGJhc2UgSVMgdGhhdCB2aWV3LCBzbyB0aGUgdHdvXG4gICAqICAgICAgIHRpZXJzIGFncmVlIG9uIGNvbnRlbnQpO1xuICAgKiAgICAyLiBMSVZFIHN0YXRlIHZpYSBgc2hhcmVkTWVtb3J5LmdldFZhbHVlYCBmb3Iga2V5cyBhYnNlbnQgZnJvbSB0aGVcbiAgICogICAgICAgc25hcHNob3Qg4oCUIGluY2x1ZGluZyBpdHMgcnVu4oaSZ2xvYmFsIG5hbWVzcGFjZSBmYWxsYmFjay4gVGhlIGVhZ2VyXG4gICAqICAgICAgIGVuZ2luZSBoYWQgdGhpcyBleGFjdCBsaXZlIGZhbGxiYWNrIGZvciBzbmFwc2hvdC1taXNzaW5nIGtleXM7XG4gICAqICAgICAgIGJ5dGUtaWRlbnRpdHkgb3ZlciBwdXJpdHkuXG4gICAqXG4gICAqICBSZWFkcyBuZXZlciBjb25zdHJ1Y3QgdGhlIGJ1ZmZlciAoIzEzKTogYSBzdGFnZSB0aGF0IG5ldmVyIHdyaXRlc1xuICAgKiAgcGVyZm9ybXMgemVybyBjbG9uZXMgb2YgdGhlIHNoYXJlZCBzdGF0ZS4gKi9cbiAgcHJpdmF0ZSByZWFkU3RhdGUocGF0aDogc3RyaW5nW10sIGtleT86IHN0cmluZyk6IHVua25vd24ge1xuICAgIGNvbnN0IG5hbWVzcGFjZWQgPSB0aGlzLndpdGhOYW1lc3BhY2UocGF0aCwga2V5IGFzIHN0cmluZyk7XG4gICAgY29uc3QgZnJvbVNuYXBzaG90ID0gdGhpcy5idWZmZXIgPyB0aGlzLmJ1ZmZlci5nZXQobmFtZXNwYWNlZCkgOiBuYXRpdmVHZXQodGhpcy5maXJzdFRvdWNoU3RhdGUoKSwgbmFtZXNwYWNlZCk7XG4gICAgaWYgKHR5cGVvZiBmcm9tU25hcHNob3QgIT09ICd1bmRlZmluZWQnKSByZXR1cm4gZnJvbVNuYXBzaG90O1xuICAgIHJldHVybiB0aGlzLnNoYXJlZE1lbW9yeS5nZXRWYWx1ZSh0aGlzLnJ1bklkLCBwYXRoLCBrZXkpO1xuICB9XG5cbiAgLyoqXG4gICAqIFRyYWNrZWQgcmVhZC4gVGhlIHJldHVybmVkIHZhbHVlIGlzIEJPUlJPV0VEIOKAlCBzZWUgdGhlIGNvbnRyYWN0IG9uXG4gICAqIGBTY29wZUZhY2FkZS5nZXRWYWx1ZWAuIFJlYWQtdHJhY2tpbmcgY29zdCBpcyBwb2xpY3ktZ2F0ZWQgKCMxNCk6XG4gICAqIGAnZnVsbCdgIGNsb25lcyB0aGUgdmFsdWUgaW50byBgX3N0YWdlUmVhZHNgIChoaXN0b3JpY2FsIGRlZmF1bHQpLFxuICAgKiBgJ3N1bW1hcnknYCByZWNvcmRzIGEgY2hlYXAgbWFya2VyLCBgJ29mZidgIHJlY29yZHMgbm90aGluZy5cbiAgICovXG4gIGdldFZhbHVlKHBhdGg6IHN0cmluZ1tdLCBrZXk/OiBzdHJpbmcsIGRlc2NyaXB0aW9uPzogc3RyaW5nKSB7XG4gICAgY29uc3QgdmFsdWUgPSB0aGlzLnJlYWRTdGF0ZShwYXRoLCBrZXkpO1xuICAgIC8vIFBlci13cml0ZSBwcm92ZW5hbmNlIHJlZ2lzdHJ5ICgjUDEpIOKAlCBrZXkgc3RyaW5ncyBvbmx5LCBpbmRlcGVuZGVudCBvZlxuICAgIC8vIHRoZSByZWFkVHJhY2tpbmcgcmV0ZW50aW9uIGRpYWwgKHdoaWNoIGdvdmVybnMgVkFMVUUgcmV0ZW50aW9uIGJlbG93KS5cbiAgICBpZiAoa2V5ICE9PSB1bmRlZmluZWQgJiYgdGhpcy53cml0ZVByb3ZlbmFuY2UgPT09ICdyZWFkcy1wcmVmaXgnKSB7XG4gICAgICAodGhpcy5fcHJvdmVuYW5jZVJlYWRzID8/PSBuZXcgU2V0KCkpLmFkZChwYXRoLmxlbmd0aCA+IDAgPyBbLi4ucGF0aCwga2V5XS5qb2luKCcuJykgOiBrZXkpO1xuICAgIH1cbiAgICAvLyBUcmFjayB1c2VyLWxldmVsIHJlYWQgKHByZS1uYW1lc3BhY2UpIGZvciBtZW1vcnkgdmlldyDigJQgcmV0YWluZWQgdW5kZXJcbiAgICAvLyB0aGUgcnVsZSdzIHZlcmRpY3QgKDkuMTkuMCk6IGEgcmVkYWN0ZWQga2V5IGlzIHJldGFpbmVkIGFzIHRoZVxuICAgIC8vIHBsYWNlaG9sZGVyLCBhIGZpZWxkLWxldmVsIGtleSBhcyBhIHNjcnViYmVkIGNsb25lLCBuZXZlciB0aGUgc2VjcmV0LlxuICAgIC8vIE5vIHBvbGljeSBhbmQgbm8gbWFya3Mg4oaSIG5vIHZlcmRpY3QgY2FsbCwgbm8gYWxsb2NhdGlvbiAoYWN0aXZlUnVsZSkuXG4gICAgaWYgKGtleSAhPT0gdW5kZWZpbmVkICYmIHRoaXMucmVhZFRyYWNraW5nICE9PSAnb2ZmJykge1xuICAgICAgY29uc3QgcnVsZSA9IHRoaXMuYWN0aXZlUnVsZSgpO1xuICAgICAgaWYgKHBhdGgubGVuZ3RoID4gMCkgKHRoaXMuX25lc3RlZFJlYWRzID8/PSBuZXcgU2V0KCkpLmFkZCh1c2VyS2V5T2YocGF0aCwga2V5KSk7XG4gICAgICB0aGlzLl9zdGFnZVJlYWRzW3VzZXJLZXlPZihwYXRoLCBrZXkpXSA9XG4gICAgICAgIHZhbHVlID09PSB1bmRlZmluZWRcbiAgICAgICAgICA/IHVuZGVmaW5lZFxuICAgICAgICAgIDogdGhpcy5yZXRhaW5lZEZvcm0oXG4gICAgICAgICAgICAgIHJ1bGUgIT09IHVuZGVmaW5lZCA/IHJ1bGUudmVyZGljdEF0KHBhdGgsIGtleSkgOiBDTEVBUixcbiAgICAgICAgICAgICAgdmFsdWUsXG4gICAgICAgICAgICAgIHRoaXMucmVhZFRyYWNraW5nLFxuICAgICAgICAgICAgICBzdW1tYXJpemVSZWFkVmFsdWUsXG4gICAgICAgICAgICApO1xuICAgIH1cbiAgICBpZiAoZGVzY3JpcHRpb24pIHtcbiAgICAgIHRoaXMuZGVidWcuYWRkTG9nKCdtZXNzYWdlJywgYFtSRUFEXSAke2Rlc2NyaXB0aW9ufWApO1xuICAgIH1cbiAgICByZXR1cm4gdmFsdWU7XG4gIH1cblxuICAvKiogUmVhZCBzdGF0ZSB3aXRob3V0IHRyYWNraW5nIGluIF9zdGFnZVJlYWRzIG9yIHBheWluZyBzdHJ1Y3R1cmVkQ2xvbmUgY29zdC5cbiAgICogIFVzZWQgYnkgU2NvcGVGYWNhZGUuZ2V0VmFsdWVTaWxlbnQoKSBmb3IgYXJyYXkgcHJveHkgaW50ZXJuYWwgb3BlcmF0aW9ucy4gKi9cbiAgZ2V0VmFsdWVEaXJlY3QocGF0aDogc3RyaW5nW10sIGtleT86IHN0cmluZyk6IHVua25vd24ge1xuICAgIHJldHVybiB0aGlzLnJlYWRTdGF0ZShwYXRoLCBrZXkpO1xuICB9XG5cbiAgZ2V0Um9vdChrZXk6IHN0cmluZykge1xuICAgIHJldHVybiB0aGlzLnNoYXJlZE1lbW9yeS5nZXRWYWx1ZSh0aGlzLnJ1bklkLCBbXSwga2V5KTtcbiAgfVxuXG4gIGdldEdsb2JhbChrZXk6IHN0cmluZykge1xuICAgIHJldHVybiB0aGlzLnNoYXJlZE1lbW9yeS5nZXRWYWx1ZSgnJywgW10sIGtleSk7XG4gIH1cblxuICBnZXRTY29wZSgpOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB7XG4gICAgcmV0dXJuIHRoaXMuc2hhcmVkTWVtb3J5LmdldFN0YXRlKCk7XG4gIH1cblxuICBnZXRSdW5JZCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLnJ1bklkO1xuICB9XG5cbiAgLy8g4pSA4pSAIENvbW1pdCDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuICAvKipcbiAgICogUkZDLTAwMyBEMjogcmVjb3JkIHRoYXQgdGhpcyBzdGFnZSBjb25zdW1lZCBhbiB1bnRyYWNrZWQgcmVhZCBwYXRoLlxuICAgKiBDYWxsZWQgYnkgYFNjb3BlRmFjYWRlYCAoYGdldEFyZ3NgL2BnZXRFbnZgL3Vuc2hhZG93ZWQgYGdldFZhbHVlU2lsZW50YCk7XG4gICAqIHN1cmZhY2VkIGFzIGBDb21taXRCdW5kbGUudW50cmFja2VkU291cmNlc2Agb24gdGhpcyBzdGFnZSdzIGNvbW1pdC5cbiAgICovXG4gIG1hcmtVbnRyYWNrZWRTb3VyY2Uoc291cmNlOiBVbnRyYWNrZWRTb3VyY2UpOiB2b2lkIHtcbiAgICAodGhpcy5fdW50cmFja2VkU291cmNlcyA/Pz0gbmV3IFNldCgpKS5hZGQoc291cmNlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSRkMtMDAzIEQyOiB0aGUgYHVudHJhY2tlZFNvdXJjZXNgIGJ1bmRsZSBmcmFnbWVudCBmb3IgY29tbWl0KCkg4oCUIGB7fWBcbiAgICogd2hlbiBub3RoaW5nIHdhcyBtYXJrZWQsIHNvIHRoZSBzcHJlYWQga2VlcHMgdGhlIGZpZWxkIEFCU0VOVCAobm90XG4gICAqIGVtcHR5LWFycmF5LXZhbHVlZCkgYW5kIHVudG91Y2hlZCBjaGFydHMgc3RheSBieXRlLWlkZW50aWNhbC5cbiAgICovXG4gIHByaXZhdGUgdW50cmFja2VkU291cmNlc0ZyYWdtZW50KCk6IHsgdW50cmFja2VkU291cmNlcz86IFVudHJhY2tlZFNvdXJjZVtdIH0ge1xuICAgIGlmICghdGhpcy5fdW50cmFja2VkU291cmNlcyB8fCB0aGlzLl91bnRyYWNrZWRTb3VyY2VzLnNpemUgPT09IDApIHJldHVybiB7fTtcbiAgICByZXR1cm4geyB1bnRyYWNrZWRTb3VyY2VzOiBbLi4udGhpcy5fdW50cmFja2VkU291cmNlc10gfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgYHRhZ3NgIGJ1bmRsZSBmcmFnbWVudCBmb3IgY29tbWl0KCkg4oCUIGB7fWAgd2hlbiB0aGUgc3RhZ2UgZGVjbGFyZXNcbiAgICogbm9uZSwgc28gYW4gdW50YWdnZWQgY2hhcnQncyBsb2cgaXMgYnl0ZS1pZGVudGljYWwgdG8gOS4yMC4wLiBBZGRlZCBhZnRlclxuICAgKiB0aGUgcGF5bG9hZCBlbmNvZGluZywgc28gaXQgaXMgaW5kZXBlbmRlbnQgb2YgYGNvbW1pdFZhbHVlc2A7IG5hbWVzLCBzb1xuICAgKiByZWRhY3Rpb24gbmV2ZXIgc2VlcyBpdC5cbiAgICovXG4gIHByaXZhdGUgdGFnc0ZyYWdtZW50KCk6IHsgdGFncz86IHJlYWRvbmx5IHN0cmluZ1tdIH0ge1xuICAgIGlmICghdGhpcy50YWdzIHx8IHRoaXMudGFncy5sZW5ndGggPT09IDApIHJldHVybiB7fTtcbiAgICByZXR1cm4geyB0YWdzOiB0aGlzLnRhZ3MgfTtcbiAgfVxuXG4gIC8qKiBSZWdpc3RlciBhbiBvYnNlcnZlciB0aGF0IGZpcmVzIGFmdGVyIGNvbW1pdCgpIGFwcGxpZXMgcGF0Y2hlcy5cbiAgICogIFVzZWQgYnkgU2NvcGVGYWNhZGUgdG8gZGlzcGF0Y2ggU2NvcGVSZWNvcmRlci5vbkNvbW1pdCBldmVudHMuICovXG4gIHNldENvbW1pdE9ic2VydmVyKFxuICAgIG9ic2VydmVyOiAobXV0YXRpb25zOiBSZWNvcmQ8c3RyaW5nLCB7IHZhbHVlOiB1bmtub3duOyBvcGVyYXRpb246ICdzZXQnIHwgJ3VwZGF0ZScgfCAnZGVsZXRlJyB9PikgPT4gdm9pZCxcbiAgKTogdm9pZCB7XG4gICAgdGhpcy5fY29tbWl0T2JzZXJ2ZXIgPSBvYnNlcnZlcjtcbiAgfVxuXG4gIC8qKlxuICAgKiBEZXYtbW9kZSBvbmx5OiBkaWQgdGhpcyBzdGFnZSBjaGFuZ2UsIElOIFBMQUNFLCBhIHZhbHVlIGl0IG1lcmVseSBSRUFEP1xuICAgKlxuICAgKiBUaGUgdHlwZWQgc2NvcGUgaW50ZXJjZXB0cyBldmVyeSB3cml0ZSBpdCBjYW4gcmVhY2gg4oCUIGEgcHJvcGVydHkgYXQgYW55XG4gICAqIGRlcHRoLCBhbiBpbmRleGVkIGVsZW1lbnQsIGFuIGFycmF5IG1ldGhvZC4gV2hhdCBpdCBjYW5ub3QgcmVhY2ggaXMgYW5cbiAgICogZWxlbWVudCBoYW5kZWQgb3V0IGJ5IGEgcmVhZCBtZXRob2QgKGBmaW5kYCwgYGZpbHRlcmAsIGBmb3LigKZvZmAsXG4gICAqIGBmb3JFYWNoYCwgZGVzdHJ1Y3R1cmluZyk6IHdyYXBwaW5nIHRob3NlIHdvdWxkIG1lYW4gcmV0dXJuaW5nIHByb3hpZXMgb3V0XG4gICAqIG9mIGV2ZXJ5IHJlYWQsIHdoaWNoIGlzIGEgY29zdCB0aGUgbGlicmFyeSBzaG91bGQgbm90IHBheS4gU28gdGhhdCBmYW1pbHlcbiAgICogaXMgV0FSTkVEIEFCT1VUIHJhdGhlciB0aGFuIGludGVyY2VwdGVkIOKAlCBsb3VkbHksIGhlcmUsIGluc3RlYWQgb2YgZW5kaW5nXG4gICAqIHRoZSBydW4gd2l0aCBhIGNvbW1pdCBsb2cgdGhhdCBzaWxlbnRseSBkaXNhZ3JlZXMgd2l0aCBmaW5hbCBzdGF0ZS5cbiAgICpcbiAgICogVGhpcyBpcyBhIFJFUE9SVCBhZnRlciB0aGUgZmFjdCwgbm90IGEgcmVmdXNhbCBhdCB0aGUgd3JpdGU6IHRoZSB3cml0ZSBoYXNcbiAgICogYWxyZWFkeSBoYXBwZW5lZCBpbiBwbGFjZSBhbmQgdGhlcmUgaXMgbm90aGluZyB0byBpbnRlcmNlcHQuIEl0IHJ1bnMgdW5kZXJcbiAgICogVFdPIHByZWNvbmRpdGlvbnMsIGJvdGggbmFtZWQgaW4gdGhlIFJFQURNRSDigJQgYGVuYWJsZURldk1vZGUoKWAsIGFuZFxuICAgKiBgcmVhZFRyYWNraW5nOiAnZnVsbCdgICh0aGUgZGVmYXVsdCksIGJlY2F1c2UgdGhlIGNvbXBhcmlzb24gbmVlZHMgdGhlXG4gICAqIGNsb25lIG9mIHRoZSB2YWx1ZSB0aGF0IG1vZGUgcmV0YWlucyBhdCByZWFkIHRpbWUuIEEga2V5IHRoZSBzdGFnZSBuZXZlclxuICAgKiBzdGFnZWQgbXVzdCBzdGlsbCBob2xkIHRoYXQgY2xvbmUg4oCUIGNvbW1pdHRlZCBzdGF0ZSBpcyBpbW11dGFibGUtYWZ0ZXItc3dhcFxuICAgKiBhbmQgdGhlIGJ1ZmZlcidzIHdvcmtpbmcgY29weSBpcyBwcml2YXRlIHRvIHRoaXMgc3RhZ2UuIEtleXMgdGhlIHN0YWdlIERJRFxuICAgKiBzdGFnZSBhcmUgc2tpcHBlZCAodGhleSBhcmUgZXhwZWN0ZWQgdG8gZGlmZmVyLCBhbmQgdGhleSBhcmUgaW4gdGhlIHJlY29yZCksXG4gICAqIHNvIGFyZSBrZXlzIHVuZGVyIGEgcmVkYWN0aW9uIHZlcmRpY3QsIHdob3NlIHJldGFpbmVkIGZvcm0gaXMgZGVsaWJlcmF0ZWx5XG4gICAqIG5vdCB0aGUgdmFsdWUsIGFuZCBzbyBhcmUga2V5cyByZWFkIGF0IGEgbmVzdGVkIHBhdGggKGBfbmVzdGVkUmVhZHNgKSDigJRcbiAgICogdGhvc2UgYXJlIGVuZ2luZSByZWFkcyAodGhlIHN1YmZsb3cgbWVyZ2UtYmFjayksIG5vdCB1c2VyIHJlYWRzLlxuICAgKlxuICAgKiBJdCBhbHNvIG9ubHkgbG9va3MgYXQga2V5cyBzZXJ2ZWQgZnJvbSB0aGUgUElOTkVEIHNvdXJjZSDigJQgdGhlIGZpcnN0LXRvdWNoXG4gICAqIHZpZXcgb3IgdGhpcyBzdGFnZSdzIG93biBidWZmZXIuIEEga2V5IGFic2VudCBmcm9tIGJvdGggd2FzIHNlcnZlZCBieVxuICAgKiBgcmVhZFN0YXRlYCdzIGxpdmUgZmFsbGJhY2ssIHdoaWNoIGEgcGFyYWxsZWwgc2libGluZydzIHJvb3Qta2V5IGNvbW1pdCBjYW5cbiAgICogbGVnaXRpbWF0ZWx5IG1vdmU7IGFjY3VzaW5nIHRoZSBzdGFnZSB0aGVyZSB3b3VsZCBiZSBhIGZhbHNlIGFsYXJtLiBGb3JcbiAgICogdGhlIHNhbWUgcmVhc29uIGl0IHJ1bnMgb24gdGhlIGZyYW1lJ3MgRklSU1QgY29tbWl0IG9ubHk6IHRoZSByZWFkcyBiZWxvbmdcbiAgICogdG8gdGhhdCByb3VuZCwgYW5kIGJ5IHRoZSBlbmdpbmUncyBzZWNvbmQgcm91bmQgKGEgZm9yayBkb3VibGUtY29tbWl0LCBhXG4gICAqIHN1YmZsb3cgbWVyZ2UtYmFjayBpbnRvIGEgY29tbWl0dGVkIGJyYW5jaCBwYXJlbnQpIG90aGVyIHN0YWdlcyBoYXZlXG4gICAqIGxlZ2l0aW1hdGVseSBtb3ZlZCB0aGUgc3RhdGUgdGhleSB3ZXJlIGNvbXBhcmVkIGFnYWluc3QuXG4gICAqXG4gICAqIENvc3RzIG5vdGhpbmcgb3V0c2lkZSBgZW5hYmxlRGV2TW9kZSgpYC5cbiAgICovXG4gIHByaXZhdGUgd2Fybk9uQm9ycm93ZWRNdXRhdGlvbigpOiB2b2lkIHtcbiAgICBpZiAoIWlzRGV2TW9kZSgpIHx8IHRoaXMucmVhZFRyYWNraW5nICE9PSAnZnVsbCcgfHwgdGhpcy5fY29tbWl0dGVkKSByZXR1cm47XG4gICAgY29uc3QgcnVsZSA9IHRoaXMuYWN0aXZlUnVsZSgpO1xuICAgIGZvciAoY29uc3Qga2V5IG9mIE9iamVjdC5rZXlzKHRoaXMuX3N0YWdlUmVhZHMpKSB7XG4gICAgICBjb25zdCByZXRhaW5lZCA9IHRoaXMuX3N0YWdlUmVhZHNba2V5XTtcbiAgICAgIC8vIE9ubHkgYSBjb250YWluZXIgY2FuIGJlIG11dGF0ZWQgaW4gcGxhY2U7IGEgcHJpbWl0aXZlIHJlYWQgY2Fubm90LlxuICAgICAgaWYgKHJldGFpbmVkID09PSBudWxsIHx8IHR5cGVvZiByZXRhaW5lZCAhPT0gJ29iamVjdCcpIGNvbnRpbnVlO1xuICAgICAgaWYgKHRoaXMuX25lc3RlZFJlYWRzPy5oYXMoa2V5KSkgY29udGludWU7XG4gICAgICBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHRoaXMuX3N0YWdlV3JpdGVzLCBrZXkpKSBjb250aW51ZTtcbiAgICAgIGNvbnN0IG5hbWVzcGFjZWQgPSB0aGlzLndpdGhOYW1lc3BhY2UoW10sIGtleSk7XG4gICAgICBpZiAodGhpcy5idWZmZXI/Lndhc1N0YWdlZChuYW1lc3BhY2VkKSkgY29udGludWU7XG4gICAgICBpZiAocnVsZSAhPT0gdW5kZWZpbmVkICYmIHJ1bGUudmVyZGljdEF0KFtdLCBrZXkpLmtpbmQgIT09ICdjbGVhcicpIGNvbnRpbnVlO1xuXG4gICAgICAvLyBUaGUgcGlubmVkIHNvdXJjZSBvbmx5IOKAlCBzZWUgdGhlIG5vdGUgb24gdGhlIGxpdmUgZmFsbGJhY2sgYWJvdmUuXG4gICAgICBjb25zdCBjdXJyZW50ID0gdGhpcy5idWZmZXIgPyB0aGlzLmJ1ZmZlci5nZXQobmFtZXNwYWNlZCkgOiBuYXRpdmVHZXQodGhpcy5maXJzdFRvdWNoU3RhdGUoKSwgbmFtZXNwYWNlZCk7XG4gICAgICBpZiAoY3VycmVudCA9PT0gdW5kZWZpbmVkKSBjb250aW51ZTtcblxuICAgICAgY29uc3QgcGF0aCA9IGZpcnN0RGlmZmVyaW5nUGF0aChyZXRhaW5lZCwgY3VycmVudCk7XG4gICAgICBpZiAocGF0aCA9PT0gdW5kZWZpbmVkKSBjb250aW51ZTtcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1jb25zb2xlXG4gICAgICBjb25zb2xlLndhcm4oYm9ycm93ZWRNdXRhdGlvbk1lc3NhZ2UodGhpcy5zdGFnZU5hbWUsIGtleSwgcGF0aCkpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBGbHVzaCBzdGFnZWQgd3JpdGVzIHRvIHNoYXJlZCBtZW1vcnkgYW5kIFJFTEVBU0UgdGhlIHBlci1zdGFnZSBzdGFnaW5nXG4gICAqIHN0YXRlICgjMTNiKS5cbiAgICpcbiAgICogQ29tbWl0IGlzIHRoZSBzdGFnZSdzIGxpZmVjeWNsZSBlbmQ6IGBidWZmZXJgICgyIGZ1bGwtc3RhdGUgY2xvbmVzKSBhbmRcbiAgICogYHN0YXRlVmlld2AgKGEgcmVmZXJlbmNlIHRoYXQgcGlucyBvbmUgZnVsbCBjb21taXR0ZWQtc3RhdGUgR0VORVJBVElPTiDigJRcbiAgICogYGFwcGx5U21hcnRNZXJnZWAgY2xvbmVzICsgc3dhcHMgdGhlIHdob2xlIHN0YXRlIHBlciBjb21taXQsIHNvIGV2ZXJ5XG4gICAqIHN0YWdlJ3MgdmlldyBpcyBhIGRpc3RpbmN0IG9iamVjdCkgYXJlIG9ubHkgbmVlZGVkIERVUklORyBleGVjdXRpb24sIGFzXG4gICAqIHRoZSByZWFkIHNuYXBzaG90ICsgbmV0LWNoYW5nZSBkaWZmIGJhc2UuIFRoZSBleGVjdXRpb24gdHJlZSByZXRhaW5zXG4gICAqIGV2ZXJ5IFN0YWdlQ29udGV4dCBmb3IgdGhlIGxpZmV0aW1lIG9mIHRoZSBydW4sIHNvIFdJVEhPVVQgdGhlIHJlbGVhc2VcbiAgICogYSBsb25nIGxvb3AgcmV0YWlucyBvbmUgc3RhdGUgZ2VuZXJhdGlvbiArIHR3byBjbG9uZXMgcGVyIGV4ZWN1dGVkXG4gICAqIHN0YWdlIOKAlCBtZWFzdXJlZCBPKE7Csik6IDU2My44TUIgYXQgTj0yMDAgb24gYW4gYWdlbnQtc3R5bGUgY2hhcnQ7IGFcbiAgICogNTAwLWl0ZXJhdGlvbiBhZ2VudCBPT01lZCBhIGRlZmF1bHQgTm9kZSBoZWFwIChiYWNrbG9nICMxOCkuXG4gICAqXG4gICAqIFJFLVVTRSBBRlRFUiBDT01NSVQgc3RheXMgY29ycmVjdCBiZWNhdXNlIGJvdGggZmllbGRzIHJlLWNyZWF0ZSBsYXppbHk6XG4gICAqIC0gYSBsYXRlciBSRUFEIHJlLWFuY2hvcnMgdmlhIHtAbGluayBmaXJzdFRvdWNoU3RhdGV9IG9uIHRoZSBDVVJSRU5UXG4gICAqICAgY29tbWl0dGVkIHN0YXRlICh3aGljaCBpbmNsdWRlcyB0aGlzIHN0YWdlJ3Mgb3duIGZsdXNoZWQgd3JpdGVzKTtcbiAgICogLSBhIGxhdGVyIFdSSVRFIGNvbnN0cnVjdHMgYSBmcmVzaCBidWZmZXIgb24gdGhhdCByZS1hbmNob3JlZCB2aWV3LCBzbyBhXG4gICAqICAgc2Vjb25kIGNvbW1pdCBkaWZmcyBhZ2FpbnN0IHBvc3QtZmlyc3QtY29tbWl0IHN0YXRlLiBUaGUgcHJlLXJlbGVhc2VcbiAgICogICBidWZmZXIgYmVoYXZlZCB0aGUgc2FtZSBmb3IgVkFMVUVTIChpdHMgYHdvcmtpbmdDb3B5YCB3YXMgcmVzZXQgb25cbiAgICogICBjb21taXQsIGZhbGxpbmcgcmVhZHMgdGhyb3VnaCB0byBsaXZlIHN0YXRlKSBidXQga2VwdCB0aGUgT1JJR0lOQUxcbiAgICogICBgYmFzZVNuYXBzaG90YCBhcyBkaWZmIGJhc2Ug4oCUIHVucmVhY2hhYmxlIGluIHByYWN0aWNlOiB0aGUgZW5naW5lJ3NcbiAgICogICBvbmx5IHdyaXRlcyBhZnRlciBhIGNvbW1pdCBhcmUgdGhlIHN1YmZsb3cgbWVyZ2UtYmFjayBpbnRvIGEgY29tbWl0dGVkXG4gICAqICAgYnJhbmNoIHBhcmVudCAoYSBkZWNpZGVyIG9yIGZvcmsgZnJhbWUgY29tbWl0cyBiZWZvcmUgaXRzIGJyYW5jaCBydW5zKVxuICAgKiAgIGFuZCB0aGUgZm9yayBjaGlsZCdzIHRocm90dGxlIG1hcmtlcjsgdGhlIG90aGVyIFwid3JpdGUgYWZ0ZXIgY29tbWl0XCJcbiAgICogICBzaXRlcyAoU3ViZmxvd0V4ZWN1dG9yIHNlZWQg4oaSIHJlcGxhY2VzIHRoZSBjb250ZXh0OyByZXN1bWUg4oaSIGZyZXNoXG4gICAqICAgY29udGV4dCB2aWEgYGxlYWYuY3JlYXRlTmV4dGApIG5ldmVyIHJlLXVzZSBhIGNvbW1pdHRlZCBjb250ZXh0LlxuICAgKiAtIEEgVVNFUiBoYW5kbGUgaGVsZCBwYXN0IGl0cyBzdGFnZSBpcyBhIGRpZmZlcmVudCBtYXR0ZXI6IGl0cyB3cml0ZXNcbiAgICogICB3b3VsZCBsYW5kIGluIGEgYnVmZmVyIG5vdGhpbmcgZXZlciBjb21taXRzLiBUaGF0IHJlZnVzYWwgbGl2ZXMgb24gdGhlXG4gICAqICAgc2NvcGUgdGllciAoYFNjb3BlRmFjYWRlYCwgc2VhbGVkIGJ5IHRoZSBjb21taXQgb2JzZXJ2ZXIg4oCUIDkuMjIuMCksXG4gICAqICAgYmVjYXVzZSB0aGUgZnJhbWUncyByZS11c2FiaWxpdHkgaXMgZXhhY3RseSB3aGF0IHRoZSBlbmdpbmUgcGF0aHNcbiAgICogICBhYm92ZSBuZWVkLlxuICAgKiAtIGBfc3RhZ2VXcml0ZXNgIC8gYF9zdGFnZVJlYWRzYCBhcmUgTk9UIHJlbGVhc2VkIOKAlCBgc25hcHNob3RTZWxmKClgXG4gICAqICAgcmVhZHMgdGhlbSBwb3N0LXJ1biBmb3IgdGhlIGV4ZWN1dGlvbi10cmVlIHNuYXBzaG90LlxuICAgKi9cbiAgY29tbWl0KCk6IHZvaWQge1xuICAgIHRoaXMud2Fybk9uQm9ycm93ZWRNdXRhdGlvbigpO1xuICAgIGlmICghdGhpcy5idWZmZXIpIHtcbiAgICAgIC8vIFRydWx5LWxhenkgZmFzdCBwYXRoICgjMTMpOiBubyB3cml0ZSBldmVyIGNvbnN0cnVjdGVkIHRoZSBidWZmZXIsIHNvXG4gICAgICAvLyB0aGUgc3RhZ2UncyBuZXQgY2hhbmdlIGlzIGVtcHR5IEJZIENPTlNUUlVDVElPTi4gU2FtZSBvYnNlcnZhYmxlXG4gICAgICAvLyBvdXRjb21lIGFzIGFuIGVtcHR5IGNvbW1pdCDigJQgdGhlIChlbXB0eSkgYnVuZGxlIGlzIHN0aWxsIHJlY29yZGVkIHNvXG4gICAgICAvLyBldmVyeSBleGVjdXRlZCBzdGFnZSByZW1haW5zIGEgdGltZS10cmF2ZWwgY3Vyc29yIHN0b3Ag4oCUIGJ1dCB3aXRoXG4gICAgICAvLyBaRVJPIGNsb25lczogbm8gYnVmZmVyIGNvbnN0cnVjdGlvbiwgbm8gYXBwbHlQYXRjaCByZXBsYXkuXG4gICAgICB0aGlzLmV2ZW50TG9nPy5yZWNvcmQoe1xuICAgICAgICBvdmVyd3JpdGU6IHt9LFxuICAgICAgICB1cGRhdGVzOiB7fSxcbiAgICAgICAgcmVkYWN0ZWRQYXRoczogW10sXG4gICAgICAgIHRyYWNlOiBbXSxcbiAgICAgICAgc3RhZ2U6IHRoaXMuc3RhZ2VOYW1lLFxuICAgICAgICBzdGFnZUlkOiB0aGlzLnN0YWdlSWQsXG4gICAgICAgIHJ1bnRpbWVTdGFnZUlkOiB0aGlzLnJ1bnRpbWVTdGFnZUlkLFxuICAgICAgICAuLi50aGlzLnVudHJhY2tlZFNvdXJjZXNGcmFnbWVudCgpLFxuICAgICAgICAuLi50aGlzLnRhZ3NGcmFnbWVudCgpLFxuICAgICAgfSk7XG4gICAgICBpZiAodGhpcy5fY29tbWl0T2JzZXJ2ZXIpIHtcbiAgICAgICAgdGhpcy5fY29tbWl0T2JzZXJ2ZXIoeyAuLi50aGlzLl9zdGFnZVdyaXRlcyB9KTtcbiAgICAgIH1cbiAgICAgIC8vICMxM2I6IGRyb3AgdGhlIGZpcnN0LXRvdWNoIHZpZXcg4oCUIGEgcmVhZC1vbmx5IHN0YWdlIHN0aWxsIHBpbm5lZCBvbmVcbiAgICAgIC8vIGZ1bGwgc3RhdGUgZ2VuZXJhdGlvbiB0aHJvdWdoIGl0LiBEMiBtYXJrZXJzIHJlbGVhc2Ugd2l0aCBpdCwgYW5kIHNvXG4gICAgICAvLyBkbyB0aGUgZGVjbGFyZWQgdGFncyAoYW4gZW1wdHkgY29tbWl0IGlzIGEgZGVsaWJlcmF0ZSwgdGFnZ2VkIHN0b3Ag4oCUXG4gICAgICAvLyBvbmNlKS5cbiAgICAgIHRoaXMuc3RhdGVWaWV3ID0gdW5kZWZpbmVkO1xuICAgICAgdGhpcy5fdW50cmFja2VkU291cmNlcyA9IHVuZGVmaW5lZDtcbiAgICAgIHRoaXMudGFncyA9IHVuZGVmaW5lZDtcbiAgICAgIHRoaXMuX2NvbW1pdHRlZCA9IHRydWU7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgYnVuZGxlID0gdGhpcy5idWZmZXIuY29tbWl0KCk7XG4gICAgY29uc3QgY29tbWl0QnVuZGxlID0ge1xuICAgICAgLi4uYnVuZGxlLFxuICAgICAgc3RhZ2U6IHRoaXMuc3RhZ2VOYW1lLFxuICAgICAgc3RhZ2VJZDogdGhpcy5zdGFnZUlkLFxuICAgICAgcnVudGltZVN0YWdlSWQ6IHRoaXMucnVudGltZVN0YWdlSWQsXG4gICAgICAuLi50aGlzLnVudHJhY2tlZFNvdXJjZXNGcmFnbWVudCgpLFxuICAgICAgLi4udGhpcy50YWdzRnJhZ21lbnQoKSxcbiAgICB9O1xuXG4gICAgdGhpcy5zaGFyZWRNZW1vcnkuYXBwbHlQYXRjaChjb21taXRCdW5kbGUub3ZlcndyaXRlLCBjb21taXRCdW5kbGUudXBkYXRlcywgY29tbWl0QnVuZGxlLnRyYWNlKTtcblxuICAgIC8vIEFscmVhZHktY29tcHV0ZWQgcmVkYWN0ZWQgcGF0Y2hlcyBmZWVkIHRocmVlIGNvbnN1bWVyczpcbiAgICAvLyAgIDEuIHRoZSBwYXJhbGxlbCByZWRhY3RlZCBtaXJyb3IgKGlmIGVuYWJsZWQpXG4gICAgLy8gICAyLiB0aGUgZXZlbnQgbG9nIChwZXJzaXN0ZWQgdHJhY2UpXG4gICAgLy8gICAzLiAoZnV0dXJlKSBhbnl0aGluZyBlbHNlIHRoYXQgd2FudHMgYSBzY3J1YmJlZCB2aWV3IGF0IGNvbW1pdCB0aW1lXG4gICAgLy8gQ29tcHV0aW5nIG9uY2Uga2VlcHMgY29zdCBsaW5lYXIgaW4gdGhlIGNvbW1pdCBzaXplOyBubyBwb3N0LXBhc3Mgd2Fsay5cbiAgICBjb25zdCByZWRhY3RlZE92ZXJ3cml0ZSA9IHJlZGFjdFBhdGNoKGNvbW1pdEJ1bmRsZS5vdmVyd3JpdGUsIGNvbW1pdEJ1bmRsZS5yZWRhY3RlZFBhdGhzKTtcbiAgICBjb25zdCByZWRhY3RlZFVwZGF0ZXMgPSByZWRhY3RQYXRjaChjb21taXRCdW5kbGUudXBkYXRlcywgY29tbWl0QnVuZGxlLnJlZGFjdGVkUGF0aHMpO1xuXG4gICAgdGhpcy5yZWRhY3RlZFNoYXJlZE1lbW9yeT8uYXBwbHlQYXRjaChyZWRhY3RlZE92ZXJ3cml0ZSwgcmVkYWN0ZWRVcGRhdGVzLCBjb21taXRCdW5kbGUudHJhY2UpO1xuXG4gICAgdGhpcy5ldmVudExvZz8ucmVjb3JkKHtcbiAgICAgIC4uLmNvbW1pdEJ1bmRsZSxcbiAgICAgIHJlZGFjdGVkUGF0aHM6IEFycmF5LmZyb20oY29tbWl0QnVuZGxlLnJlZGFjdGVkUGF0aHMudmFsdWVzKCkpLFxuICAgICAgb3ZlcndyaXRlOiByZWRhY3RlZE92ZXJ3cml0ZSxcbiAgICAgIHVwZGF0ZXM6IHJlZGFjdGVkVXBkYXRlcyxcbiAgICB9KTtcblxuICAgIC8vIE5vdGlmeSBvYnNlcnZlciAoU2NvcGVGYWNhZGUpIHdpdGggdHJhY2tlZCBtdXRhdGlvbnNcbiAgICBpZiAodGhpcy5fY29tbWl0T2JzZXJ2ZXIpIHtcbiAgICAgIHRoaXMuX2NvbW1pdE9ic2VydmVyKHsgLi4udGhpcy5fc3RhZ2VXcml0ZXMgfSk7XG4gICAgfVxuXG4gICAgLy8gIzEzYjogcmVsZWFzZSB0aGUgc3RhZ2luZyBzdGF0ZSDigJQgc2VlIHRoZSBtZXRob2QgSlNEb2MuIERvbmUgTEFTVCBzb1xuICAgIC8vIHRoZSBjb21taXQgb2JzZXJ2ZXIgc2VlcyB0aGUgZXhhY3Qgc2FtZSB3b3JsZCBhcyBiZWZvcmUgdGhlIHJlbGVhc2UuXG4gICAgLy8gRDIncyB1bnRyYWNrZWQtc291cmNlIG1hcmtlcnMgcmVsZWFzZSB3aXRoIGl0OiB0aGUgcm91dGluZVxuICAgIC8vIGRvdWJsZS1jb21taXQgcGF0aHMgdGhlbiByZWNvcmQgdGhlIGZpZWxkIGV4YWN0bHkgb25jZS4gRGVjbGFyZWQgdGFnc1xuICAgIC8vIHJlbGVhc2Ugb24gdGhlIHNhbWUgbGF3OiBvbmUgc3RhbXAgcGVyIGV4ZWN1dGlvbiBvZiB0aGUgc3RhZ2UuXG4gICAgdGhpcy5idWZmZXIgPSB1bmRlZmluZWQ7XG4gICAgdGhpcy5zdGF0ZVZpZXcgPSB1bmRlZmluZWQ7XG4gICAgdGhpcy5fdW50cmFja2VkU291cmNlcyA9IHVuZGVmaW5lZDtcbiAgICB0aGlzLnRhZ3MgPSB1bmRlZmluZWQ7XG4gICAgdGhpcy5fY29tbWl0dGVkID0gdHJ1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaHJvdyBhd2F5IGV2ZXJ5dGhpbmcgdGhpcyBzdGFnZSBoYXMgU1RBR0VELCB3aXRob3V0IGNvbW1pdHRpbmcgYW55IG9mIGl0LlxuICAgKlxuICAgKiBUaGUgaXNvbGF0aW9uIHByaW1pdGl2ZSBiZWhpbmQgZGVjbGFyYXRpdmUgcmV0cnk6IHdoZW4gYSBub24tZmluYWwgYXR0ZW1wdFxuICAgKiBmYWlscywgdGhlIHdyaXRlcyBpdCBzdGFnZWQgbXVzdCBub3QgYmUgdmlzaWJsZSB0byB0aGUgbmV4dCBhdHRlbXB0LCBtdXN0XG4gICAqIG5vdCByZWFjaCBzaGFyZWQgc3RhdGUsIGFuZCBtdXN0IG5vdCBhcHBlYXIgaW4gdGhlIGNvbW1pdCBsb2cgb3IgaW4gdGhpc1xuICAgKiBzdGFnZSdzIHNuYXBzaG90LiBEcm9wcGluZyB0aGUgc3RhZ2luZyBzdGF0ZSBhY2hpZXZlcyBhbGwgZm91ciBhdCBvbmNlIOKAlFxuICAgKiB0aGVyZSBpcyBubyByb2xsYmFjayBtYWNoaW5lcnkgdG8gaW52b2tlIGJlY2F1c2Ugbm90aGluZyB3YXMgZXZlciBhcHBsaWVkXG4gICAqIChNMTogdGhlIHRyYW5zYWN0aW9uIGJ1ZmZlciBob2xkcyB3cml0ZXMgdW50aWwgYGNvbW1pdCgpYCBmbHVzaGVzIHRoZW0pLlxuICAgKlxuICAgKiBXaGF0IGlzIHJlbGVhc2VkLCBhbmQgd2h5IGVhY2ggb25lIG1hdHRlcnMgZm9yIHRoZSBuZXh0IGF0dGVtcHQ6XG4gICAqICAtIGBidWZmZXJgICAgICAg4oCUIHRoZSBzdGFnZWQgd3JpdGVzIHRoZW1zZWx2ZXM7IHRoZSBuZXh0IGF0dGVtcHQgc3RhcnRzXG4gICAqICAgICAgICAgICAgICAgICAgICB3aXRoIG5vdGhpbmcgc3RhZ2VkO1xuICAgKiAgLSBgc3RhdGVWaWV3YCAgIOKAlCB0aGUgZmlyc3QtdG91Y2ggYW5jaG9yOyB0aGUgbmV4dCBhdHRlbXB0IHJlLWFuY2hvcnMgb25cbiAgICogICAgICAgICAgICAgICAgICAgIGNvbW1pdHRlZCBzdGF0ZSBhcyBpdCBzdGFuZHMgTk9XIChhIHNpYmxpbmcgZm9yayBicmFuY2hcbiAgICogICAgICAgICAgICAgICAgICAgIG1heSBsZWdpdGltYXRlbHkgaGF2ZSBjb21taXR0ZWQgaW4gYmV0d2Vlbik7XG4gICAqICAtIGBfc3RhZ2VXcml0ZXNgIC8gYF9zdGFnZVJlYWRzYCDigJQgdGhlIHNuYXBzaG90IHBheWxvYWQ7IHdpdGhvdXQgdGhlXG4gICAqICAgICAgICAgICAgICAgICAgICByZXNldCB0aGUgZXhlY3V0aW9uIHRyZWUgd291bGQgcmVwb3J0IHdyaXRlcyB0aGF0IHdlcmVcbiAgICogICAgICAgICAgICAgICAgICAgIGRpc2NhcmRlZCwgd2hpY2ggaXMgdGhlIGV4YWN0IGxpZSB0aGlzIGZlYXR1cmUgZXhpc3RzXG4gICAqICAgICAgICAgICAgICAgICAgICB0byBwcmV2ZW50O1xuICAgKiAgLSBgX3Byb3ZlbmFuY2VSZWFkc2Ag4oCUIHRoZSBwZXItd3JpdGUgcmVhZCBwcmVmaXggKCNQMSk7IGEgZGlzY2FyZGVkXG4gICAqICAgICAgICAgICAgICAgICAgICBhdHRlbXB0J3MgcmVhZHMgbXVzdCBuZXZlciBhcHBlYXIgaW4gdGhlIG5leHQgYXR0ZW1wdCdzXG4gICAqICAgICAgICAgICAgICAgICAgICBgVHJhY2VFbnRyeS5yZWFkS2V5c2AsIG9yIGEgYmFja3dhcmQgc2xpY2Ugd291bGQgZm9sbG93XG4gICAqICAgICAgICAgICAgICAgICAgICBhbiBlZGdlIHRoYXQgbm8gY29tbWl0dGVkIHdyaXRlIGV2ZXIgaGFkO1xuICAgKiAgLSBgX3VudHJhY2tlZFNvdXJjZXNgIOKAlCB0aGUgRDIgaG9uZXN0eSBtYXJrZXJzLCByZWxlYXNlZCB3aXRoIHRoZSByZXN0LlxuICAgKlxuICAgKiBXaGF0IGlzIGRlbGliZXJhdGVseSBLRVBUOiBgZGVidWdgIChsb2dzLCBtZXRyaWNzLCBlcnJvcnMsIGZsb3cgbWVzc2FnZXMpLlxuICAgKiBEaWFnbm9zdGljcyBhcmUgdGhlIGFwcGVuZC1vbmx5IHJlY29yZCBvZiB3aGF0IGV2ZXJ5IGF0dGVtcHQgZGlkLCBhbmQgdGhlXG4gICAqIHJldHJ5IGZlYXR1cmUncyB3aG9sZSBwb2ludCBpcyB0aGF0IHRoZSBlYXJsaWVyIGF0dGVtcHRzIHN0YXkgdmlzaWJsZS5cbiAgICpcbiAgICogTm8gY29tbWl0IGlzIHJlY29yZGVkIGFuZCBubyBvYnNlcnZlciBmaXJlcyDigJQgYSBkaXNjYXJkZWQgYXR0ZW1wdCBpcyBub3QgYVxuICAgKiBjdXJzb3Igc3RvcCwgYmVjYXVzZSBmcm9tIHNoYXJlZCBzdGF0ZSdzIHBvaW50IG9mIHZpZXcgaXQgbmV2ZXIgaGFwcGVuZWQuXG4gICAqL1xuICBkaXNjYXJkU3RhZ2VkKCk6IHZvaWQge1xuICAgIHRoaXMuYnVmZmVyID0gdW5kZWZpbmVkO1xuICAgIHRoaXMuc3RhdGVWaWV3ID0gdW5kZWZpbmVkO1xuICAgIHRoaXMuX3VudHJhY2tlZFNvdXJjZXMgPSB1bmRlZmluZWQ7XG4gICAgdGhpcy5fcHJvdmVuYW5jZVJlYWRzID0gdW5kZWZpbmVkO1xuICAgIHRoaXMuX3N0YWdlV3JpdGVzID0ge307XG4gICAgdGhpcy5fc3RhZ2VSZWFkcyA9IHt9O1xuICAgIHRoaXMuX25lc3RlZFJlYWRzID0gdW5kZWZpbmVkO1xuICB9XG5cbiAgLy8g4pSA4pSAIFRyZWUgbmF2aWdhdGlvbiDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuICAvKipcbiAgICogQ3JlYXRlIChvciByZXR1cm4pIHRoaXMgY29udGV4dCdzIGxpbmtlZCBzdWNjZXNzb3IuXG4gICAqXG4gICAqIE1FTU9JWkVEOiB0aGUgZmlyc3QgY2FsbCBjcmVhdGVzIGB0aGlzLm5leHRgOyBldmVyeSBsYXRlciBjYWxsIHJldHVybnNcbiAgICogdGhhdCBTQU1FIGNvbnRleHQgYW5kIElHTk9SRVMgaXRzIGFyZ3VtZW50cy4gSW4gbm9ybWFsIHRyYXZlcnNhbCBlYWNoXG4gICAqIGNvbnRleHQgYWR2YW5jZXMgZXhhY3RseSBvbmNlLCBzbyB0aGUgbWVtbyBuZXZlciBiaXRlcyDigJQgYnV0IGEgY2FsbGVyXG4gICAqIGV4cGVjdGluZyBhIGZyZXNoIGNvbnRleHQgZm9yIGRpZmZlcmVudCBgc3RhZ2VOYW1lYC9gc3RhZ2VJZGAgYXJncyBnZXRzXG4gICAqIHRoZSBvbGQgb25lIHNpbGVudGx5LiBEZXYgbW9kZSAoYGVuYWJsZURldk1vZGUoKWApIHdhcm5zIG9uIHRoYXRcbiAgICogbWlzbWF0Y2ggKGJhY2tsb2cgQjQpLlxuICAgKi9cbiAgY3JlYXRlTmV4dChwYXRoOiBzdHJpbmcsIHN0YWdlTmFtZTogc3RyaW5nLCBzdGFnZUlkOiBzdHJpbmcsIGlzRGVjaWRlciA9IGZhbHNlKTogU3RhZ2VDb250ZXh0IHtcbiAgICBpZiAoIXRoaXMubmV4dCkge1xuICAgICAgdGhpcy5uZXh0ID0gbmV3IFN0YWdlQ29udGV4dChwYXRoLCBzdGFnZU5hbWUsIHN0YWdlSWQsIHRoaXMuc2hhcmVkTWVtb3J5LCAnJywgdGhpcy5ldmVudExvZywgaXNEZWNpZGVyKTtcbiAgICAgIHRoaXMubmV4dC5wYXJlbnQgPSB0aGlzO1xuICAgICAgLy8gUHJvcGFnYXRlIHRoZSByZWRhY3RlZCBtaXJyb3IgZG93biB0aGUgY29udGV4dCB0cmVlIHNvIGV2ZXJ5IGNvbW1pdFxuICAgICAgLy8gaW4gdGhlIHJ1biB3cml0ZXMgdG8gYm90aCB2aWV3cy5cbiAgICAgIGlmICh0aGlzLnJlZGFjdGVkU2hhcmVkTWVtb3J5KSB0aGlzLm5leHQucmVkYWN0ZWRTaGFyZWRNZW1vcnkgPSB0aGlzLnJlZGFjdGVkU2hhcmVkTWVtb3J5O1xuICAgICAgdGhpcy5uZXh0LnJlZGFjdGlvblJ1bGUgPSB0aGlzLnJlZGFjdGlvblJ1bGU7XG4gICAgICB0aGlzLm5leHQucmVhZFRyYWNraW5nID0gdGhpcy5yZWFkVHJhY2tpbmc7XG4gICAgICB0aGlzLm5leHQud3JpdGVUcmFja2luZyA9IHRoaXMud3JpdGVUcmFja2luZztcbiAgICAgIHRoaXMubmV4dC5jb21taXRWYWx1ZXMgPSB0aGlzLmNvbW1pdFZhbHVlcztcbiAgICAgIHRoaXMubmV4dC53cml0ZVByb3ZlbmFuY2UgPSB0aGlzLndyaXRlUHJvdmVuYW5jZTtcbiAgICB9IGVsc2UgaWYgKGlzRGV2TW9kZSgpICYmICh0aGlzLm5leHQuc3RhZ2VJZCAhPT0gc3RhZ2VJZCB8fCB0aGlzLm5leHQuc3RhZ2VOYW1lICE9PSBzdGFnZU5hbWUpKSB7XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tY29uc29sZVxuICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICBgW2Zvb3RwcmludF0gU3RhZ2VDb250ZXh0LmNyZWF0ZU5leHQ6IG5leHQgY29udGV4dCBhbHJlYWR5IGV4aXN0cyBhcyBcIiR7dGhpcy5uZXh0LnN0YWdlTmFtZX1cIiBgICtcbiAgICAgICAgICBgKGlkOiBcIiR7dGhpcy5uZXh0LnN0YWdlSWR9XCIpIOKAlCBhcmd1bWVudHMgXCIke3N0YWdlTmFtZX1cIiAoaWQ6IFwiJHtzdGFnZUlkfVwiKSBhcmUgaWdub3JlZCBgICtcbiAgICAgICAgICAnYW5kIHRoZSBleGlzdGluZyBjb250ZXh0IGlzIHJldHVybmVkLicsXG4gICAgICApO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5uZXh0O1xuICB9XG5cbiAgY3JlYXRlQ2hpbGQocnVuSWQ6IHN0cmluZywgYnJhbmNoSWQ6IHN0cmluZywgc3RhZ2VOYW1lOiBzdHJpbmcsIHN0YWdlSWQ6IHN0cmluZywgaXNEZWNpZGVyID0gZmFsc2UpOiBTdGFnZUNvbnRleHQge1xuICAgIGlmICghdGhpcy5jaGlsZHJlbikge1xuICAgICAgdGhpcy5jaGlsZHJlbiA9IFtdO1xuICAgIH1cbiAgICBjb25zdCBjaGlsZCA9IG5ldyBTdGFnZUNvbnRleHQocnVuSWQsIHN0YWdlTmFtZSwgc3RhZ2VJZCwgdGhpcy5zaGFyZWRNZW1vcnksIGJyYW5jaElkLCB0aGlzLmV2ZW50TG9nLCBpc0RlY2lkZXIpO1xuICAgIGNoaWxkLnBhcmVudCA9IHRoaXM7XG4gICAgaWYgKHRoaXMucmVkYWN0ZWRTaGFyZWRNZW1vcnkpIGNoaWxkLnJlZGFjdGVkU2hhcmVkTWVtb3J5ID0gdGhpcy5yZWRhY3RlZFNoYXJlZE1lbW9yeTtcbiAgICBjaGlsZC5yZWRhY3Rpb25SdWxlID0gdGhpcy5yZWRhY3Rpb25SdWxlO1xuICAgIGNoaWxkLnJlYWRUcmFja2luZyA9IHRoaXMucmVhZFRyYWNraW5nO1xuICAgIGNoaWxkLndyaXRlVHJhY2tpbmcgPSB0aGlzLndyaXRlVHJhY2tpbmc7XG4gICAgY2hpbGQuY29tbWl0VmFsdWVzID0gdGhpcy5jb21taXRWYWx1ZXM7XG4gICAgY2hpbGQud3JpdGVQcm92ZW5hbmNlID0gdGhpcy53cml0ZVByb3ZlbmFuY2U7XG4gICAgdGhpcy5jaGlsZHJlbi5wdXNoKGNoaWxkKTtcbiAgICByZXR1cm4gY2hpbGQ7XG4gIH1cblxuICBjcmVhdGVEZWNpZGVyKHBhdGg6IHN0cmluZywgc3RhZ2VOYW1lOiBzdHJpbmcsIHN0YWdlSWQ6IHN0cmluZyk6IFN0YWdlQ29udGV4dCB7XG4gICAgcmV0dXJuIHRoaXMuY3JlYXRlTmV4dChwYXRoLCBzdGFnZU5hbWUsIHN0YWdlSWQsIHRydWUpO1xuICB9XG5cbiAgc2V0QXNEZWNpZGVyKCk6IFN0YWdlQ29udGV4dCB7XG4gICAgdGhpcy5pc0RlY2lkZXIgPSB0cnVlO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgc2V0QXNGb3JrKCk6IFN0YWdlQ29udGV4dCB7XG4gICAgdGhpcy5pc0ZvcmsgPSB0cnVlO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLy8g4pSA4pSAIERpYWdub3N0aWNzIGRlbGVnYXRpb24g4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbiAgYWRkTG9nKGtleTogc3RyaW5nLCB2YWx1ZTogdW5rbm93biwgcGF0aD86IHN0cmluZ1tdKSB7XG4gICAgdGhpcy5kZWJ1Zy5hZGRMb2coa2V5LCB2YWx1ZSwgcGF0aCk7XG4gIH1cblxuICBzZXRMb2coa2V5OiBzdHJpbmcsIHZhbHVlOiB1bmtub3duLCBwYXRoPzogc3RyaW5nW10pIHtcbiAgICB0aGlzLmRlYnVnLnNldExvZyhrZXksIHZhbHVlLCBwYXRoKTtcbiAgfVxuXG4gIGFkZE1ldHJpYyhrZXk6IHN0cmluZywgdmFsdWU6IHVua25vd24sIHBhdGg/OiBzdHJpbmdbXSkge1xuICAgIHRoaXMuZGVidWcuYWRkTWV0cmljKGtleSwgdmFsdWUsIHBhdGgpO1xuICB9XG5cbiAgc2V0TWV0cmljKGtleTogc3RyaW5nLCB2YWx1ZTogdW5rbm93biwgcGF0aD86IHN0cmluZ1tdKSB7XG4gICAgdGhpcy5kZWJ1Zy5zZXRNZXRyaWMoa2V5LCB2YWx1ZSwgcGF0aCk7XG4gIH1cblxuICBhZGRFdmFsKGtleTogc3RyaW5nLCB2YWx1ZTogdW5rbm93biwgcGF0aD86IHN0cmluZ1tdKSB7XG4gICAgdGhpcy5kZWJ1Zy5hZGRFdmFsKGtleSwgdmFsdWUsIHBhdGgpO1xuICB9XG5cbiAgc2V0RXZhbChrZXk6IHN0cmluZywgdmFsdWU6IHVua25vd24sIHBhdGg/OiBzdHJpbmdbXSkge1xuICAgIHRoaXMuZGVidWcuc2V0RXZhbChrZXksIHZhbHVlLCBwYXRoKTtcbiAgfVxuXG4gIGFkZEVycm9yKGtleTogc3RyaW5nLCB2YWx1ZTogdW5rbm93biwgcGF0aD86IHN0cmluZ1tdKSB7XG4gICAgdGhpcy5kZWJ1Zy5hZGRFcnJvcihrZXksIHZhbHVlLCBwYXRoKTtcbiAgfVxuXG4gIGFkZEZsb3dEZWJ1Z01lc3NhZ2UoXG4gICAgdHlwZTogRmxvd0NvbnRyb2xUeXBlLFxuICAgIGRlc2NyaXB0aW9uOiBzdHJpbmcsXG4gICAgb3B0aW9ucz86IHsgdGFyZ2V0U3RhZ2U/OiBzdHJpbmcgfCBzdHJpbmdbXTsgcmF0aW9uYWxlPzogc3RyaW5nOyBjb3VudD86IG51bWJlcjsgaXRlcmF0aW9uPzogbnVtYmVyIH0sXG4gICkge1xuICAgIGNvbnN0IGZsb3dNZXNzYWdlOiBGbG93TWVzc2FnZSA9IHsgdHlwZSwgZGVzY3JpcHRpb24sIHRpbWVzdGFtcDogRGF0ZS5ub3coKSwgLi4ub3B0aW9ucyB9O1xuICAgIHRoaXMuZGVidWcuYWRkRmxvd01lc3NhZ2UoZmxvd01lc3NhZ2UpO1xuICB9XG5cbiAgLy8g4pSA4pSAIFNuYXBzaG90IOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG4gIGdldFN0YWdlSWQoKTogc3RyaW5nIHtcbiAgICBpZiAoIXRoaXMucnVuSWQgfHwgdGhpcy5ydW5JZCA9PT0gJycpIHJldHVybiB0aGlzLnN0YWdlTmFtZTtcbiAgICByZXR1cm4gYCR7dGhpcy5ydW5JZH0uJHt0aGlzLnN0YWdlTmFtZX1gO1xuICB9XG5cbiAgZ2V0U25hcHNob3QoKTogU3RhZ2VTbmFwc2hvdCB7XG4gICAgLy8gSXRlcmF0aXZlIHdhbGsgKGV4cGxpY2l0IHdvcmsgc3RhY2spLCBOT1QgcmVjdXJzaW9uOiB0aGUgZXhlY3V0aW9uXG4gICAgLy8gdHJlZSBkZWVwZW5zIGJ5IG9uZSBsZXZlbCBwZXIgZXhlY3V0ZWQgc3RhZ2UgYWxvbmcgYG5leHRgIGNoYWlucywgYW5kXG4gICAgLy8gdGhlIHRyYW1wb2xpbmVkIHRyYXZlcnNlciBhbGxvd3MgY2hhaW5zL2xvb3BzIG9mIHRlbnMgb2YgdGhvdXNhbmRzIG9mXG4gICAgLy8gc3RhZ2VzIOKAlCBmYXIgZGVlcGVyIHRoYW4gYSByZWN1cnNpdmUgc2VyaWFsaXplciBjYW4gd2FsayBiZWZvcmVcbiAgICAvLyBcIk1heGltdW0gY2FsbCBzdGFjayBzaXplIGV4Y2VlZGVkXCIuXG4gICAgY29uc3Qgcm9vdCA9IHRoaXMuc25hcHNob3RTZWxmKCk7XG4gICAgY29uc3Qgd29yazogQXJyYXk8eyBjdHg6IFN0YWdlQ29udGV4dDsgc25hcDogU3RhZ2VTbmFwc2hvdCB9PiA9IFt7IGN0eDogdGhpcywgc25hcDogcm9vdCB9XTtcbiAgICB3aGlsZSAod29yay5sZW5ndGggPiAwKSB7XG4gICAgICBjb25zdCB7IGN0eCwgc25hcCB9ID0gd29yay5wb3AoKSE7XG4gICAgICBpZiAoY3R4Lm5leHQpIHtcbiAgICAgICAgY29uc3QgbmV4dFNuYXAgPSBjdHgubmV4dC5zbmFwc2hvdFNlbGYoKTtcbiAgICAgICAgc25hcC5uZXh0ID0gbmV4dFNuYXA7XG4gICAgICAgIHdvcmsucHVzaCh7IGN0eDogY3R4Lm5leHQsIHNuYXA6IG5leHRTbmFwIH0pO1xuICAgICAgfVxuICAgICAgaWYgKGN0eC5jaGlsZHJlbikge1xuICAgICAgICBzbmFwLmNoaWxkcmVuID0gY3R4LmNoaWxkcmVuLm1hcCgoY2hpbGQpID0+IHtcbiAgICAgICAgICBjb25zdCBjaGlsZFNuYXAgPSBjaGlsZC5zbmFwc2hvdFNlbGYoKTtcbiAgICAgICAgICB3b3JrLnB1c2goeyBjdHg6IGNoaWxkLCBzbmFwOiBjaGlsZFNuYXAgfSk7XG4gICAgICAgICAgcmV0dXJuIGNoaWxkU25hcDtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiByb290O1xuICB9XG5cbiAgLyoqIFNuYXBzaG90IG9mIFRISVMgY29udGV4dCdzIG93biBmaWVsZHMg4oCUIGBuZXh0YC9gY2hpbGRyZW5gIGFyZSBmaWxsZWRcbiAgICogIGluIGJ5IHRoZSBpdGVyYXRpdmUgd2FsayBpbiBgZ2V0U25hcHNob3RgLiAqL1xuICBwcml2YXRlIHNuYXBzaG90U2VsZigpOiBTdGFnZVNuYXBzaG90IHtcbiAgICBjb25zdCBzbmFwc2hvdDogU3RhZ2VTbmFwc2hvdCA9IHtcbiAgICAgIGlkOiB0aGlzLnN0YWdlSWQsXG4gICAgICBydW50aW1lU3RhZ2VJZDogdGhpcy5ydW50aW1lU3RhZ2VJZCB8fCB1bmRlZmluZWQsXG4gICAgICBuYW1lOiB0aGlzLnN0YWdlTmFtZSxcbiAgICAgIGlzRGVjaWRlcjogdGhpcy5pc0RlY2lkZXIsXG4gICAgICBpc0Zvcms6IHRoaXMuaXNGb3JrLFxuICAgICAgbG9nczogdGhpcy5kZWJ1Zy5sb2dDb250ZXh0LFxuICAgICAgZXJyb3JzOiB0aGlzLmRlYnVnLmVycm9yQ29udGV4dCxcbiAgICAgIG1ldHJpY3M6IHRoaXMuZGVidWcubWV0cmljQ29udGV4dCxcbiAgICAgIGV2YWxzOiB0aGlzLmRlYnVnLmV2YWxDb250ZXh0LFxuICAgIH07XG4gICAgaWYgKE9iamVjdC5rZXlzKHRoaXMuX3N0YWdlV3JpdGVzKS5sZW5ndGggPiAwKSB7XG4gICAgICAvLyBFeHRyYWN0IHZhbHVlcyBvbmx5IGZvciB0aGUgc25hcHNob3QgKHN0cmlwIG9wZXJhdGlvbiBtZXRhZGF0YSlcbiAgICAgIGNvbnN0IHdyaXRlczogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPSB7fTtcbiAgICAgIGZvciAoY29uc3QgW2ssIGVudHJ5XSBvZiBPYmplY3QuZW50cmllcyh0aGlzLl9zdGFnZVdyaXRlcykpIHtcbiAgICAgICAgd3JpdGVzW2tdID0gZW50cnkudmFsdWU7XG4gICAgICB9XG4gICAgICBzbmFwc2hvdC5zdGFnZVdyaXRlcyA9IHdyaXRlcztcbiAgICB9XG4gICAgaWYgKE9iamVjdC5rZXlzKHRoaXMuX3N0YWdlUmVhZHMpLmxlbmd0aCA+IDApIHtcbiAgICAgIHNuYXBzaG90LnN0YWdlUmVhZHMgPSB0aGlzLl9zdGFnZVJlYWRzO1xuICAgIH1cbiAgICBpZiAodGhpcy5kZXNjcmlwdGlvbikge1xuICAgICAgc25hcHNob3QuZGVzY3JpcHRpb24gPSB0aGlzLmRlc2NyaXB0aW9uO1xuICAgIH1cbiAgICBpZiAodGhpcy5zdWJmbG93SWQpIHtcbiAgICAgIHNuYXBzaG90LnN1YmZsb3dJZCA9IHRoaXMuc3ViZmxvd0lkO1xuICAgIH1cbiAgICBpZiAodGhpcy5kZWJ1Zy5mbG93TWVzc2FnZXMubGVuZ3RoID4gMCkge1xuICAgICAgc25hcHNob3QuZmxvd01lc3NhZ2VzID0gdGhpcy5kZWJ1Zy5mbG93TWVzc2FnZXM7XG4gICAgfVxuICAgIHJldHVybiBzbmFwc2hvdDtcbiAgfVxufVxuIl19
1015
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU3RhZ2VDb250ZXh0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2xpYi9tZW1vcnkvU3RhZ2VDb250ZXh0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7OztHQVFHO0FBRUgsT0FBTyxFQUFFLGtCQUFrQixFQUFFLG1CQUFtQixFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDbEYsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQ3ZELE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxrQkFBa0IsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBQ3BGLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBRS9ELE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFFekMsT0FBTyxFQUFFLEtBQUssRUFBRSxRQUFRLEVBQUUsYUFBYSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFFaEUsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFXM0QsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLFlBQVksQ0FBQztBQUV6Qzs7MkJBRTJCO0FBQzNCLFNBQVMsU0FBUyxDQUFDLElBQWMsRUFBRSxHQUFXO0lBQzVDLE9BQU8sSUFBSSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLEVBQUUsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUM7QUFDMUQsQ0FBQztBQUVELE1BQU0sT0FBTyxZQUFZO0lBQ2YsWUFBWSxDQUFlO0lBQ25DOzs7Ozs7Ozs7OztPQVdHO0lBQ0ssb0JBQW9CLENBQWdCO0lBQzVDLCtEQUErRDtJQUN2RCxhQUFhLENBQWlCO0lBQzlCLE1BQU0sQ0FBcUI7SUFDbkM7Ozs7O09BS0c7SUFDSyxTQUFTLENBQTJCO0lBQ3BDLFFBQVEsQ0FB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LENBQUM7WUFDMUIsQ0FBQztZQUNELFFBQVEsQ0FBQyxXQUFXLEdBQUcsTUFBTSxDQUFDO1FBQ2hDLENBQUM7UUFDRCxJQUFJLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQztZQUM3QyxRQUFRLENBQUMsVUFBVSxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUM7UUFDekMsQ0FBQztRQUNELElBQUksSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO1lBQ3JCLFFBQVEsQ0FBQyxXQUFXLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQztRQUMxQyxDQUFDO1FBQ0QsSUFBSSxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUM7WUFDbkIsUUFBUSxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDO1FBQ3RDLENBQUM7UUFDRCxJQUFJLElBQUksQ0FBQyxLQUFLLENBQUMsWUFBWSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQztZQUN2QyxRQUFRLENBQUMsWUFBWSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsWUFBWSxDQUFDO1FBQ2xELENBQUM7UUFDRCxPQUFPLFFBQVEsQ0FBQztJQUNsQixDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIFN0YWdlQ29udGV4dCDigJQgRXhlY3V0aW9uIGNvbnRleHQgZm9yIGEgc2luZ2xlIHN0YWdlIGluIGEgZmxvd2NoYXJ0IHJ1blxuICpcbiAqIExpa2UgYSBzdGFjayBmcmFtZSBpbiBhIGNvbXBpbGVyL3J1bnRpbWU6XG4gKiAtIFJlZmVyZW5jZSB0byBTaGFyZWRNZW1vcnkgKGFjY2Vzc2luZyBoZWFwIG1lbW9yeSlcbiAqIC0gVHJhbnNhY3Rpb25CdWZmZXIgZm9yIHN0YWdpbmcgbXV0YXRpb25zICh0cmFuc2FjdGlvbiBidWZmZXIpXG4gKiAtIExpbmtzIHRvIHBhcmVudC9jaGlsZC9uZXh0IGNvbnRleHRzIChjYWxsIHN0YWNrIGZyYW1lcylcbiAqIC0gRGlhZ25vc3RpY0NvbGxlY3RvciBmb3IgbG9ncywgZXJyb3JzLCBtZXRyaWNzXG4gKi9cblxuaW1wb3J0IHsgc3VtbWFyaXplUmVhZFZhbHVlLCBzdW1tYXJpemVXcml0ZVZhbHVlIH0gZnJvbSAnLi4vY2FwdHVyZS9zdW1tYXJpemUuanMnO1xuaW1wb3J0IHsgaXNEZXZNb2RlIH0gZnJvbSAnLi4vc2NvcGUvZGV0ZWN0Q2lyY3VsYXIuanMnO1xuaW1wb3J0IHsgYm9ycm93ZWRNdXRhdGlvbk1lc3NhZ2UsIGZpcnN0RGlmZmVyaW5nUGF0aCB9IGZyb20gJy4vYm9ycm93ZWRNdXRhdGlvbi5qcyc7XG5pbXBvcnQgeyBEaWFnbm9zdGljQ29sbGVjdG9yIH0gZnJvbSAnLi9EaWFnbm9zdGljQ29sbGVjdG9yLmpzJztcbmltcG9ydCB7IEV2ZW50TG9nIH0gZnJvbSAnLi9FdmVudExvZy5qcyc7XG5pbXBvcnQgeyBuYXRpdmVHZXQgfSBmcm9tICcuL3BhdGhPcHMuanMnO1xuaW1wb3J0IHR5cGUgeyBSZWRhY3Rpb25WZXJkaWN0IH0gZnJvbSAnLi9yZWRhY3Rpb24uanMnO1xuaW1wb3J0IHsgQ0xFQVIsIFJFREFDVEVELCBSZWRhY3Rpb25SdWxlIH0gZnJvbSAnLi9yZWRhY3Rpb24uanMnO1xuaW1wb3J0IHsgU2hhcmVkTWVtb3J5IH0gZnJvbSAnLi9TaGFyZWRNZW1vcnkuanMnO1xuaW1wb3J0IHsgVHJhbnNhY3Rpb25CdWZmZXIgfSBmcm9tICcuL1RyYW5zYWN0aW9uQnVmZmVyLmpzJztcbmltcG9ydCB0eXBlIHtcbiAgQ29tbWl0VmFsdWVzTW9kZSxcbiAgRmxvd0NvbnRyb2xUeXBlLFxuICBGbG93TWVzc2FnZSxcbiAgUmVhZFRyYWNraW5nTW9kZSxcbiAgU3RhZ2VTbmFwc2hvdCxcbiAgVW50cmFja2VkU291cmNlLFxuICBXcml0ZVByb3ZlbmFuY2VNb2RlLFxuICBXcml0ZVRyYWNraW5nTW9kZSxcbn0gZnJvbSAnLi90eXBlcy5qcyc7XG5pbXBvcnQgeyByZWRhY3RQYXRjaCB9IGZyb20gJy4vdXRpbHMuanMnO1xuXG4vKiogVGhlIHVzZXItbGV2ZWwga2V5IG9mIGEgd3JpdGUgb3IgcmVhZCDigJQgZG90dGVkIG9ubHkgZm9yIGEgbmVzdGVkIHBhdGggKGFcbiAqICBzdWJmbG93IHNlZWQncyBgWydwcm9maWxlJ10gKyAnYXV0aCdgKTsgbm8gYWxsb2NhdGlvbiBmb3IgdGhlIGNvbW1vblxuICogIHNpbmdsZS1zZWdtZW50IGNhc2UuICovXG5mdW5jdGlvbiB1c2VyS2V5T2YocGF0aDogc3RyaW5nW10sIGtleTogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIHBhdGgubGVuZ3RoID4gMCA/IFsuLi5wYXRoLCBrZXldLmpvaW4oJy4nKSA6IGtleTtcbn1cblxuZXhwb3J0IGNsYXNzIFN0YWdlQ29udGV4dCB7XG4gIHByaXZhdGUgc2hhcmVkTWVtb3J5OiBTaGFyZWRNZW1vcnk7XG4gIC8qKlxuICAgKiBQYXJhbGxlbCByZWRhY3RlZCBtaXJyb3Igb2YgYHNoYXJlZE1lbW9yeWAuIFBvcHVsYXRlZCBpbiBgY29tbWl0KClgIHdpdGhcbiAgICogdGhlIGFscmVhZHktY29tcHV0ZWQgcmVkYWN0ZWQgcGF0Y2hlcyAodGhlIHNhbWUgb25lcyBmZWQgdG8gYGV2ZW50TG9nYCkuXG4gICAqIFByZXNlbnQgKipvbmx5Kiogd2hlbiB0aGUgZXhlY3V0b3IgaGFzIGJlZW4gdG9sZCB0byBtYWludGFpbiBhIHJlZGFjdGVkXG4gICAqIHZpZXcg4oCUIGkuZS4gd2hlbiBhIGBSZWRhY3Rpb25Qb2xpY3lgIGlzIGNvbmZpZ3VyZWQuIE90aGVyd2lzZSB1bmRlZmluZWQsXG4gICAqIHplcm8gZXh0cmEgd29yayBwZXIgY29tbWl0LlxuICAgKlxuICAgKiBUaGUgbWlycm9yIGlzIHJlYWQgdmlhIGBGbG93Q2hhcnRFeGVjdXRvci5nZXRTbmFwc2hvdCh7IHJlZGFjdDogdHJ1ZSB9KWBcbiAgICogYW5kIGlzIHRoZSBmb3VuZGF0aW9uIGZvciB0aGUgXCJleHBvcnQgdHJhY2VcIiAvIHBhc3RlLWludG8tdmlld2VyIGZlYXR1cmVcbiAgICog4oCUIGNvbnN1bWVycyBzaGFyZSB0aGUgcmVkYWN0ZWQgdmlldyBleHRlcm5hbGx5IHdpdGhvdXQgbGVha2luZyByYXcgUElJXG4gICAqIHRocm91Z2ggYHNoYXJlZFN0YXRlYC5cbiAgICovXG4gIHByaXZhdGUgcmVkYWN0ZWRTaGFyZWRNZW1vcnk/OiBTaGFyZWRNZW1vcnk7XG4gIC8qKiBUaGUgcnVuJ3MgcmVkYWN0aW9uIHJ1bGUg4oCUIHNlZSB7QGxpbmsgdXNlUmVkYWN0aW9uUnVsZX0uICovXG4gIHByaXZhdGUgcmVkYWN0aW9uUnVsZT86IFJlZGFjdGlvblJ1bGU7XG4gIHByaXZhdGUgYnVmZmVyPzogVHJhbnNhY3Rpb25CdWZmZXI7XG4gIC8qKlxuICAgKiBDb21taXR0ZWQtc3RhdGUgdmlldyBjYXB0dXJlZCBhdCB0aGlzIHN0YWdlJ3MgRklSU1QgdG91Y2ggKGZpcnN0IHJlYWQgT1JcbiAgICogZmlyc3Qgd3JpdGUpIOKAlCBoZWxkIGJ5IFJFRkVSRU5DRSwgbmV2ZXIgY2xvbmVkLiBTZWVcbiAgICoge0BsaW5rIGZpcnN0VG91Y2hTdGF0ZX0gZm9yIHRoZSBhbGdvcml0aG0gYW5kIHRoZSBpbW11dGFiaWxpdHkgaW52YXJpYW50XG4gICAqIHRoYXQgbWFrZXMgYSBiYXJlIHJlZmVyZW5jZSBzYWZlLlxuICAgKi9cbiAgcHJpdmF0ZSBzdGF0ZVZpZXc/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgcHJpdmF0ZSBldmVudExvZz86IEV2ZW50TG9nO1xuXG4gIHB1YmxpYyBzdGFnZU5hbWUgPSAnJztcbiAgLyoqIFVuaXF1ZSBzdGFnZSBpZGVudGlmaWVyIGZyb20gdGhlIGJ1aWxkZXIgKG1hdGNoZXMgc3BlYyBub2RlIGlkKS4gKi9cbiAgcHVibGljIHN0YWdlSWQ6IHN0cmluZztcbiAgLyoqIFVuaXF1ZSBwZXItZXhlY3V0aW9uLXN0ZXAgaWRlbnRpZmllci4gU2V0IGJ5IHRyYXZlcnNlciBiZWZvcmUgc3RhZ2UgZXhlY3V0aW9uLiAqL1xuICBwdWJsaWMgcnVudGltZVN0YWdlSWQgPSAnJztcbiAgLyoqXG4gICAqIERlY2xhcmVkIHRhZ3MgKDkuMjEuMCkgZm9yIHRoZSBzdGFnZSB0aGlzIGNvbnRleHQgaXMgZXhlY3V0aW5nLiBTZXQgYnlcbiAgICogdGhlIHRyYXZlcnNlciBiZXNpZGUgYHJ1bnRpbWVTdGFnZUlkYCAocGVyLW5vZGUgaWRlbnRpdHkg4oCUIE5PVCBpbmhlcml0ZWRcbiAgICogYnkgYGNyZWF0ZU5leHRgIC8gYGNyZWF0ZUNoaWxkYCksIHJlY29yZGVkIG9uIHRoZSBmaXJzdCBidW5kbGVcbiAgICogYGNvbW1pdCgpYCB3cml0ZXMsIHRoZW4gcmVsZWFzZWQgc28gYSByb3V0aW5lIHNlY29uZCBjb21taXQgb24gdGhlIHNhbWVcbiAgICogY29udGV4dCAoYSBmb3JrIGNoaWxkJ3MgZmFuLW91dCByZXBlYXQsIGEgbW91bnQncyBleGl0IGJ1bmRsZSkgY2Fycmllc1xuICAgKiBub25lIOKAlCB0aGUgc2FtZSBvbmNlLXBlci1leGVjdXRpb24gbGF3IGBfdW50cmFja2VkU291cmNlc2Aga2VlcHMuXG4gICAqL1xuICBwdWJsaWMgdGFncz86IHJlYWRvbmx5IHN0cmluZ1tdO1xuICBwdWJsaWMgcnVuSWQ6IHN0cmluZztcbiAgcHVibGljIGJyYW5jaElkPzogc3RyaW5nO1xuICBwdWJsaWMgaXNEZWNpZGVyOiBib29sZWFuO1xuICBwdWJsaWMgaXNGb3JrOiBib29sZWFuO1xuICAvKiogSHVtYW4tcmVhZGFibGUgZGVzY3JpcHRpb24gZnJvbSBidWlsZGVyIChzZXQgYnkgdHJhdmVyc2VyIGJlZm9yZSBleGVjdXRpb24pLiAqL1xuICBwdWJsaWMgZGVzY3JpcHRpb24/OiBzdHJpbmc7XG4gIC8qKiBTdWJmbG93IGlkZW50aWZpZXIgKHNldCBieSB0cmF2ZXJzZXIgd2hlbiB0aGlzIGlzIGEgc3ViZmxvdyBlbnRyeSBwb2ludCkuICovXG4gIHB1YmxpYyBzdWJmbG93SWQ/OiBzdHJpbmc7XG5cbiAgcHVibGljIHBhcmVudD86IFN0YWdlQ29udGV4dDtcbiAgcHVibGljIG5leHQ/OiBTdGFnZUNvbnRleHQ7XG4gIHB1YmxpYyBjaGlsZHJlbj86IFN0YWdlQ29udGV4dFtdO1xuXG4gIHB1YmxpYyBkZWJ1ZzogRGlhZ25vc3RpY0NvbGxlY3RvciA9IG5ldyBEaWFnbm9zdGljQ29sbGVjdG9yKCk7XG5cbiAgLyoqIFRyYWNrcyB1c2VyLWxldmVsIHdyaXRlcyAocHJlLW5hbWVzcGFjZSkgZm9yIHRoZSBtZW1vcnkgdmlldyBhbmQgb25Db21taXRcbiAgICogIOKAlCBpbiB0aGVpciBSRVRBSU5FRCBmb3JtIChjbG9uZWQgLyBzdW1tYXJpc2VkIC8gcmVkYWN0ZWQpLiBGaWxsZWQgZnJvbVxuICAgKiAge0BsaW5rIF9wZW5kaW5nV3JpdGVzfSBieSB7QGxpbmsgbWF0ZXJpYWxpc2VXcml0ZXN9IGF0IGNvbW1pdC4gKi9cbiAgcHJpdmF0ZSBfc3RhZ2VXcml0ZXM6IFJlY29yZDxzdHJpbmcsIHsgdmFsdWU6IHVua25vd247IG9wZXJhdGlvbjogJ3NldCcgfCAndXBkYXRlJyB8ICdkZWxldGUnIH0+ID0ge307XG5cbiAgLyoqXG4gICAqIFRoZSB3cml0ZXMgb2YgdGhlIENVUlJFTlQgZXhlY3V0aW9uLCBoZWxkIGJ5IHJlZmVyZW5jZSB3aXRoIHRoZSB2ZXJkaWN0XG4gICAqIHRoZXkgd2VyZSBzdGFnZWQgdW5kZXIgKDkuMjMuMCkuIEEga2V5IHdyaXR0ZW4gayB0aW1lcyBob2xkcyBpdHMgTEFTVFxuICAgKiB2YWx1ZTsgdGhlIHJldGFpbmVkIGZvcm0gKHRoZSBgd3JpdGVUcmFja2luZ2AgY2xvbmUgb3Igc3VtbWFyeSwgdGhlXG4gICAqIHJlZGFjdGlvbiBwbGFjZWhvbGRlciBvciBmaWVsZCBzY3J1YikgaXMgdGFrZW4gT05DRSBwZXIga2V5IGF0IGNvbW1pdCDigJRcbiAgICogc2VlIHtAbGluayBtYXRlcmlhbGlzZVdyaXRlc30uIFNhbWUgbGF3IGFzIHRoZSB0cmFuc2FjdGlvbiBidWZmZXInc1xuICAgKiBwYXRjaCB0cmVlczogdGhlIGNvcHkgdGhlIHJlY29yZCBuZWVkcyBpcyBwYWlkIGF0IHRoZSBib3VuZGFyeSwgbm90IGF0XG4gICAqIGV2ZXJ5IHdyaXRlLiBMYXppbHkgYWxsb2NhdGVkOyBhIHN0YWdlIHRoYXQgbmV2ZXIgd3JpdGVzIHBheXMgbm90aGluZy5cbiAgICovXG4gIHByaXZhdGUgX3BlbmRpbmdXcml0ZXM/OiBNYXA8XG4gICAgc3RyaW5nLFxuICAgIHsgdmFsdWU6IHVua25vd247IHZlcmRpY3Q6IFJlZGFjdGlvblZlcmRpY3Q7IG9wZXJhdGlvbjogJ3NldCcgfCAndXBkYXRlJyB8ICdkZWxldGUnIH1cbiAgPjtcblxuICAvKiogVHJhY2tzIHVzZXItbGV2ZWwgcmVhZHMgKHByZS1uYW1lc3BhY2UpIGZvciB0aGUgbWVtb3J5IHZpZXcuICovXG4gIHByaXZhdGUgX3N0YWdlUmVhZHM6IFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0ge307XG5cbiAgLyoqXG4gICAqIFRoZSBgX3N0YWdlUmVhZHNgIGtleXMgdGhhdCB3ZXJlIHJlYWQgYXQgYSBORVNURUQgcGF0aCAoYGdldFZhbHVlKHBhdGgsXG4gICAqIGtleSlgIHdpdGggYSBub24tZW1wdHkgYHBhdGhgKS4gT25seSB0aGUgZW5naW5lIHJlYWRzIHRoYXQgd2F5IOKAlCB0aGVcbiAgICogZmFjYWRlIHJlYWRzIHJvb3RzIOKAlCBzbyB0aGVzZSBhcmUgbm90IHVzZXIgcmVhZHMgYW5kIHRoZSBib3Jyb3dlZC1yZWFkXG4gICAqIGd1YXJkIHNraXBzIHRoZW0gYnkgdGhpcyBtYXJrZXIsIG5ldmVyIGJ5IGd1ZXNzaW5nIGZyb20gYSBkb3QgaW4gdGhlIGtleVxuICAgKiAoYSB1c2VyJ3MgdG9wLWxldmVsIGtleSBtYXkgaXRzZWxmIGNvbnRhaW4gb25lKS4gTGF6aWx5IGNyZWF0ZWQ7IHRoZVxuICAgKiBmYWNhZGUgcGF0aCBuZXZlciBhbGxvY2F0ZXMgaXQuXG4gICAqL1xuICBwcml2YXRlIF9uZXN0ZWRSZWFkcz86IFNldDxzdHJpbmc+O1xuXG4gIC8qKlxuICAgKiBIYXMgdGhpcyBmcmFtZSBjb21taXR0ZWQgYXQgbGVhc3Qgb25jZT8gVGhlIGJvcnJvd2VkLXJlYWQgZ3VhcmQgcnVucyBvblxuICAgKiB0aGUgRklSU1QgY29tbWl0IG9ubHkg4oCUIHNlZSB7QGxpbmsgd2Fybk9uQm9ycm93ZWRNdXRhdGlvbn0uIFRoZSBmcmFtZVxuICAgKiBpdHNlbGYgc3RheXMgcmUtdXNhYmxlIGFmdGVyIGNvbW1pdCAoIzEzYik6IHRoZSBlbmdpbmUncyBkb3VibGUtY29tbWl0XG4gICAqIHBhdGhzIGFuZCB0aGUgc3ViZmxvdyBtZXJnZS1iYWNrIGludG8gYSBicmFuY2ggcGFyZW50IHJlbHkgb24gaXQuIFRoZVxuICAgKiB1c2VyLWxldmVsIHJlZnVzYWwgb2YgYSBoYW5kbGUgaGVsZCBwYXN0IGl0cyBzdGFnZSBsaXZlcyBhdCB0aGUgc2NvcGVcbiAgICogdGllciAoYFNjb3BlRmFjYWRlYCwgb25lIHBlciBzdGFnZSBleGVjdXRpb24pLCBub3QgaGVyZS5cbiAgICovXG4gIHByaXZhdGUgX2NvbW1pdHRlZCA9IGZhbHNlO1xuXG4gIC8qKlxuICAgKiBIb3cgdHJhY2tlZCByZWFkcyBhcmUgcmVjb3JkZWQgaW50byBgX3N0YWdlUmVhZHNgICgjMTQpLiBEZWZhdWx0IGAnZnVsbCdgXG4gICAqIHByZXNlcnZlcyB0aGUgaGlzdG9yaWNhbCBwZXItcmVhZCBgc3RydWN0dXJlZENsb25lYC4gSW5oZXJpdGVkIGJ5IGV2ZXJ5XG4gICAqIGNvbnRleHQgY3JlYXRlZCB2aWEge0BsaW5rIGNyZWF0ZU5leHR9IC8ge0BsaW5rIGNyZWF0ZUNoaWxkfSAoc2FtZVxuICAgKiBwcm9wYWdhdGlvbiBwYXR0ZXJuIGFzIHRoZSByZWRhY3RlZCBtaXJyb3IpLCBhbmQgcHVzaGVkIGludG8gc3ViZmxvd1xuICAgKiByb290IGNvbnRleHRzIGJ5IGBTdWJmbG93RXhlY3V0b3JgLiBBZmZlY3RzIE9OTFkgdGhlIHNuYXBzaG90J3NcbiAgICogYHN0YWdlUmVhZHNgIHBheWxvYWQg4oCUIGBTY29wZVJlY29yZGVyLm9uUmVhZGAgKGFuZCB0aGVyZWZvcmUgbmFycmF0aXZlKVxuICAgKiBpcyBkaXNwYXRjaGVkIGF0IHRoZSBzY29wZSB0aWVyIGFuZCBuZXZlciBjbG9uZWQsIHNvIGl0IGlzIGlkZW50aWNhbCBpblxuICAgKiBldmVyeSBtb2RlLlxuICAgKi9cbiAgcHJpdmF0ZSByZWFkVHJhY2tpbmc6IFJlYWRUcmFja2luZ01vZGUgPSAnZnVsbCc7XG5cbiAgLyoqXG4gICAqIEhvdyB0cmFja2VkIHdyaXRlcyBhcmUgcmVjb3JkZWQgaW50byBgX3N0YWdlV3JpdGVzYCAoIzEzYy1BKSDigJQgdGhlXG4gICAqIHNpYmxpbmcgb2Yge0BsaW5rIHJlYWRUcmFja2luZ30sIHdpdGggdGhlIHNhbWUgcHJvcGFnYXRpb24gcGF0dGVyblxuICAgKiAoaW5oZXJpdGVkIHZpYSB7QGxpbmsgY3JlYXRlTmV4dH0ve0BsaW5rIGNyZWF0ZUNoaWxkfSwgcHVzaGVkIGludG9cbiAgICogc3ViZmxvdyByb290IGNvbnRleHRzIGJ5IGBTdWJmbG93RXhlY3V0b3JgKS4gR292ZXJucyB0aGUgcmV0YWluZWQgZm9ybVxuICAgKiB7QGxpbmsgbWF0ZXJpYWxpc2VXcml0ZXN9IHRha2VzIGF0IGNvbW1pdCBmb3IgdGhlIHdyaXRlcyBvZlxuICAgKiB7QGxpbmsgc2V0T2JqZWN0fS97QGxpbmsgdXBkYXRlT2JqZWN0fSAoYSBjbG9uZSB1bmRlciBgJ2Z1bGwnYCwgdGFrZW5cbiAgICogb25jZSBwZXIga2V5IOKAlCA5LjIzLjApLiBBZmZlY3RzIHRoZVxuICAgKiBzbmFwc2hvdCdzIGBzdGFnZVdyaXRlc2AgcGF5bG9hZCBBTkQgdGhlIGNvbW1pdCBvYnNlcnZlcidzIG11dGF0aW9uc1xuICAgKiBwYXlsb2FkICh3aGljaCBpcyBhIHNwcmVhZCBvZiBgX3N0YWdlV3JpdGVzYCkg4oCUIGJ1dCBOT1QgdGhlIHdyaXRlXG4gICAqIGl0c2VsZjogdGhlIHRyYW5zYWN0aW9uIGJ1ZmZlciwgdGhlIGNvbW1pdCBsb2csIGFuZCBzaGFyZWQgc3RhdGUgYXJlXG4gICAqIGlkZW50aWNhbCBpbiBldmVyeSBtb2RlLCBhbmQgYFNjb3BlUmVjb3JkZXIub25Xcml0ZWAgYWx3YXlzIGZpcmVzIHdpdGhcbiAgICogdGhlIGxpdmUgdmFsdWUuXG4gICAqL1xuICBwcml2YXRlIHdyaXRlVHJhY2tpbmc6IFdyaXRlVHJhY2tpbmdNb2RlID0gJ2Z1bGwnO1xuXG4gIC8qKlxuICAgKiBIb3cgY29tbWl0LWJ1bmRsZSB2YWx1ZXMgYXJlIGVuY29kZWQgaW50byB0aGUgY29tbWl0IGxvZyAoIzEzYy1CKSDigJQgdGhlXG4gICAqIHRoaXJkIGRpYWwgb2YgdGhlIGZhbWlseSwgd2l0aCB0aGUgc2FtZSBwcm9wYWdhdGlvbiBwYXR0ZXJuIGFzXG4gICAqIHtAbGluayByZWFkVHJhY2tpbmd9L3tAbGluayB3cml0ZVRyYWNraW5nfSAoaW5oZXJpdGVkIHZpYVxuICAgKiB7QGxpbmsgY3JlYXRlTmV4dH0ve0BsaW5rIGNyZWF0ZUNoaWxkfSwgcHVzaGVkIGludG8gc3ViZmxvdyByb290XG4gICAqIGNvbnRleHRzIGJ5IGBTdWJmbG93RXhlY3V0b3JgLCByZS1hcHBsaWVkIG9uIHRoZSByZXN1bWUgcGF0aCkuIFBhc3NlZFxuICAgKiBpbnRvIGVhY2gge0BsaW5rIFRyYW5zYWN0aW9uQnVmZmVyfSBhdCBjb25zdHJ1Y3Rpb247IGAnZnVsbCdgIChkZWZhdWx0KVxuICAgKiBpcyBieXRlLWlkZW50aWNhbCB0byBoaXN0b3J5LCBgJ2RlbHRhJ2AgZW5hYmxlcyBhcHBlbmQvZGVsZXRlIHZlcmJzICtcbiAgICogb25lLXRyYWNlLWVudHJ5LXBlci1wYXRoIGRlZHVwLiBMb3NzbGVzcyBpbiBib3RoIG1vZGVzLlxuICAgKi9cbiAgcHJpdmF0ZSBjb21taXRWYWx1ZXM6IENvbW1pdFZhbHVlc01vZGUgPSAnZnVsbCc7XG5cbiAgLyoqXG4gICAqIFBlci13cml0ZSByZWFkLXByb3ZlbmFuY2UgcG9saWN5ICgjUDEpIOKAlCB0aGUgZm91cnRoIGRpYWwgb2YgdGhlIGZhbWlseSxcbiAgICogc2FtZSBwcm9wYWdhdGlvbiBwYXR0ZXJuIGFzIHtAbGluayByZWFkVHJhY2tpbmd9L3tAbGluayB3cml0ZVRyYWNraW5nfS9cbiAgICoge0BsaW5rIGNvbW1pdFZhbHVlc30uIFVuZGVyIGAncmVhZHMtcHJlZml4J2AgdGhpcyBjb250ZXh0IGtlZXBzIGFcbiAgICogbGlnaHR3ZWlnaHQgb3JkZXJlZCBzZXQgb2YgdGhlIGtleXMgdHJhY2tlZC1yZWFkIHNvIGZhciwgYW5kIHRoZVxuICAgKiB0cmFuc2FjdGlvbiBidWZmZXIgc3RhbXBzIHRoYXQgcHJlZml4IG9udG8gZXZlcnkgc3RhZ2VkIHdyaXRlXG4gICAqICh7QGxpbmsgVHJhY2VFbnRyeS5yZWFkS2V5c30pLiBJTkRFUEVOREVOVCBvZiByZWFkVHJhY2tpbmc6IHByb3ZlbmFuY2VcbiAgICogbmVlZHMgb25seSB0aGUga2V5IFNUUklOR1MsIHNvIGl0IHdvcmtzIGV2ZW4gdW5kZXIgcmVhZFRyYWNraW5nICdvZmYnXG4gICAqIChhbmQgY29zdHMgbm90aGluZyB3aGVuIGl0IGlzIGl0c2VsZiAnb2ZmJyDigJQgdGhlIGRlZmF1bHQpLlxuICAgKi9cbiAgcHJpdmF0ZSB3cml0ZVByb3ZlbmFuY2U6IFdyaXRlUHJvdmVuYW5jZU1vZGUgPSAnb2ZmJztcblxuICAvKiogTGF6aWx5LWFsbG9jYXRlZCBvcmRlcmVkIHJlZ2lzdHJ5IG9mIGtleXMgdHJhY2tlZC1yZWFkIGluIFRISVMgc3RhZ2Ug4oCUXG4gICAqICB0aGUgc291cmNlIG9mIHRoZSBwZXItd3JpdGUgcHJlZml4LiBPbmx5IGFsbG9jYXRlZCB1bmRlciB0aGVcbiAgICogIGAncmVhZHMtcHJlZml4J2AgZGlhbDsgaW5zZXJ0aW9uLW9yZGVyZWQgKGEgU2V0KSBhbmQgbW9ub3RvbmljLCB3aGljaFxuICAgKiAgaXMgd2hhdCBtYWtlcyBcImxhc3Qgd3JpdGUncyBwcmVmaXggPT0gdW5pb25cIiBob2xkIGluIGRlbHRhIG1vZGUuICovXG4gIHByaXZhdGUgX3Byb3ZlbmFuY2VSZWFkcz86IFNldDxzdHJpbmc+O1xuXG4gIC8qKlxuICAgKiBSRkMtMDAzIEQyIGhvbmVzdHkgbWFya2VycyDigJQgdW50cmFja2VkIHJlYWQgcGF0aHMgdXNlZCBkdXJpbmcgVEhJU1xuICAgKiBzdGFnZSdzIGV4ZWN1dGlvbiAoYCdhcmdzJ2AgLyBgJ2VudidgIC8gYCdzaWxlbnQnYCkuIE1hcmtlZCBieVxuICAgKiBgU2NvcGVGYWNhZGVgLCBzdXJmYWNlZCBvbiB0aGUgc3RhZ2UncyBDb21taXRCdW5kbGUgYXNcbiAgICogYHVudHJhY2tlZFNvdXJjZXNgLCB0aGVuIFJFTEVBU0VEIHdpdGggdGhlIHN0YWdpbmcgc3RhdGUgYXQgY29tbWl0IGVuZFxuICAgKiAoc28gdGhlIHJvdXRpbmUgZG91YmxlLWNvbW1pdCBwYXRocyDigJQgZm9yayBjaGlsZHJlbiwgc3ViZmxvdyBtb3VudHMg4oCUXG4gICAqIHJlY29yZCB0aGUgZmllbGQgZXhhY3RseSBvbmNlLCBvbiB0aGUgZmlyc3QgY29tbWl0KS4gTGF6aWx5IGFsbG9jYXRlZDpcbiAgICogc3RhZ2VzIHRoYXQgbmV2ZXIgdG91Y2ggYW4gdW50cmFja2VkIHBhdGggcGF5IG5vdGhpbmcuXG4gICAqL1xuICBwcml2YXRlIF91bnRyYWNrZWRTb3VyY2VzPzogU2V0PFVudHJhY2tlZFNvdXJjZT47XG5cbiAgLyoqIE9ic2VydmVyIGNhbGxlZCBhZnRlciBjb21taXQoKSDigJQgdXNlZCBieSBTY29wZUZhY2FkZSB0byBmaXJlIFNjb3BlUmVjb3JkZXIub25Db21taXQuICovXG4gIHByaXZhdGUgX2NvbW1pdE9ic2VydmVyPzogKFxuICAgIG11dGF0aW9uczogUmVjb3JkPHN0cmluZywgeyB2YWx1ZTogdW5rbm93bjsgb3BlcmF0aW9uOiAnc2V0JyB8ICd1cGRhdGUnIHwgJ2RlbGV0ZScgfT4sXG4gICkgPT4gdm9pZDtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBydW5JZDogc3RyaW5nLFxuICAgIG5hbWU6IHN0cmluZyxcbiAgICBzdGFnZUlkOiBzdHJpbmcsXG4gICAgc2hhcmVkTWVtb3J5OiBTaGFyZWRNZW1vcnksXG4gICAgYnJhbmNoSWQ/OiBzdHJpbmcsXG4gICAgZXZlbnRMb2c/OiBFdmVudExvZyxcbiAgICBpc0RlY2lkZXI/OiBib29sZWFuLFxuICApIHtcbiAgICB0aGlzLnJ1bklkID0gcnVuSWQ7XG4gICAgdGhpcy5zdGFnZU5hbWUgPSBuYW1lO1xuICAgIHRoaXMuc3RhZ2VJZCA9IHN0YWdlSWQ7XG4gICAgdGhpcy5zaGFyZWRNZW1vcnkgPSBzaGFyZWRNZW1vcnk7XG4gICAgdGhpcy5icmFuY2hJZCA9IGJyYW5jaElkO1xuICAgIHRoaXMuZXZlbnRMb2cgPSBldmVudExvZztcbiAgICB0aGlzLmlzRGVjaWRlciA9ICEhaXNEZWNpZGVyO1xuICAgIHRoaXMuaXNGb3JrID0gZmFsc2U7XG4gIH1cblxuICAvKiogUmV0dXJucyB0aGUgU2hhcmVkTWVtb3J5IGluc3RhbmNlIChuZWVkZWQgYnkgc2NvcGUgbGF5ZXIpLiAqL1xuICBnZXRTaGFyZWRNZW1vcnkoKTogU2hhcmVkTWVtb3J5IHtcbiAgICByZXR1cm4gdGhpcy5zaGFyZWRNZW1vcnk7XG4gIH1cblxuICAvKipcbiAgICogSW5zdGFsbCBhIHBhcmFsbGVsIHJlZGFjdGVkIG1pcnJvci4gU3Vic2VxdWVudCBgY29tbWl0KClgIGNhbGxzIHdpbGxcbiAgICogYXBwbHkgdGhlIGFscmVhZHktY29tcHV0ZWQgcmVkYWN0ZWQgcGF0Y2hlcyB0byB0aGlzIG1pcnJvciBpbiBhZGRpdGlvblxuICAgKiB0byB0aGUgcmF3IGBzaGFyZWRNZW1vcnlgICsgYGV2ZW50TG9nYC4gQ2hpbGQgLyBuZXh0IGNvbnRleHRzIGluaGVyaXRcbiAgICogdGhlIG1pcnJvciB2aWEgYGNyZWF0ZU5leHRgIC8gYGNyZWF0ZUNoaWxkYC5cbiAgICpcbiAgICogQ2FsbGVkIG9uY2UgYXQgdGhlIHJvb3QgY29udGV4dCBieSBgRXhlY3V0aW9uUnVudGltZS5lbmFibGVSZWRhY3RlZE1pcnJvcigpYC5cbiAgICovXG4gIHVzZVJlZGFjdGVkTWlycm9yKG1pcnJvcjogU2hhcmVkTWVtb3J5KTogdm9pZCB7XG4gICAgdGhpcy5yZWRhY3RlZFNoYXJlZE1lbW9yeSA9IG1pcnJvcjtcbiAgfVxuXG4gIC8qKiBSZXR1cm5zIHRoZSByZWRhY3RlZCBtaXJyb3IgaWYgaW5zdGFsbGVkLCBlbHNlIHVuZGVmaW5lZC4gKi9cbiAgZ2V0UmVkYWN0ZWRTaGFyZWRNZW1vcnkoKTogU2hhcmVkTWVtb3J5IHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5yZWRhY3RlZFNoYXJlZE1lbW9yeTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJbnN0YWxsIHRoZSBydW4ncyByZWRhY3Rpb24gcnVsZSDigJQgdGhlIE9ORSBvd25lciBvZiBcIndoYXQgZG9lcyB0aGUgcG9saWN5XG4gICAqIHNheSBhYm91dCB0aGlzIHBhdGhcIiAoYG1lbW9yeS9yZWRhY3Rpb24udHNgKS4gU2FtZSBwbHVtYmluZyBhcyB0aGUgbWlycm9yXG4gICAqIGFuZCB0aGUgZm91ciBkaWFsczogc2V0IG9uY2UgYXQgdGhlIHJvb3QgYnkgYEV4ZWN1dGlvblJ1bnRpbWUudXNlUmVkYWN0aW9uYFxuICAgKiAoZnJvbSBgRmxvd0NoYXJ0RXhlY3V0b3JgLCBldmVyeSBydW4gYW5kIHJlc3VtZSksIGluaGVyaXRlZCB2aWFcbiAgICoge0BsaW5rIGNyZWF0ZU5leHR9L3tAbGluayBjcmVhdGVDaGlsZH0sIHB1c2hlZCBpbnRvIHN1YmZsb3cgcm9vdCBjb250ZXh0c1xuICAgKiBieSBgU3ViZmxvd0V4ZWN1dG9yYC4gRXZlcnkgc3RhZ2VkIHdyaXRlIGFuZCBldmVyeSB0cmFja2VkIHJlYWQgYXNrcyBpdCxcbiAgICogc28gYSB3cml0ZSB0aGF0IG5ldmVyIHBhc3NlcyBhIGBTY29wZUZhY2FkZWAg4oCUIGEgc3ViZmxvdyBzZWVkLCBhblxuICAgKiBgb3V0cHV0TWFwcGVyYCBtZXJnZS1iYWNrLCBhIHJlc3VtZSByZS1zZWVkIOKAlCBpcyByZXRhaW5lZCB1bmRlciB0aGUgc2FtZVxuICAgKiB2ZXJkaWN0IGFzIGEgZmFjYWRlIHdyaXRlLiBBYnNlbnQgKGJhcmUgY29udGV4dHMgaW4gdW5pdCB0ZXN0cyk6IGV2ZXJ5XG4gICAqIHZlcmRpY3QgaXMgYCdjbGVhcidgIHVubGVzcyB0aGUgY2FsbGVyIHBhc3NlZCBhbiBleHBsaWNpdCBmbGFnLlxuICAgKi9cbiAgdXNlUmVkYWN0aW9uUnVsZShydWxlOiBSZWRhY3Rpb25SdWxlKTogdm9pZCB7XG4gICAgdGhpcy5yZWRhY3Rpb25SdWxlID0gcnVsZTtcbiAgfVxuXG4gIC8qKiBUaGUgaW5zdGFsbGVkIHJlZGFjdGlvbiBydWxlLCBpZiBhbnkgKGZhY2FkZSBsb29rdXAsIHN1YmZsb3cgcHJvcGFnYXRpb24pLiAqL1xuICBnZXRSZWRhY3Rpb25SdWxlKCk6IFJlZGFjdGlvblJ1bGUgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLnJlZGFjdGlvblJ1bGU7XG4gIH1cblxuICAvKipcbiAgICogU2V0IHRoZSByZWFkLXRyYWNraW5nIHBvbGljeSBmb3IgdGhpcyBjb250ZXh0ICgjMTQpLiBDYWxsZWQgYXQgdGhlIHJvb3RcbiAgICogYnkgYEV4ZWN1dGlvblJ1bnRpbWUudXNlUmVhZFRyYWNraW5nKClgIChwbHVtYmVkIGZyb21cbiAgICogYEZsb3dDaGFydEV4ZWN1dG9yYCk7IGRlc2NlbmRhbnRzIGluaGVyaXQgdmlhIGBjcmVhdGVOZXh0YC9gY3JlYXRlQ2hpbGRgLFxuICAgKiBhbmQgYFN1YmZsb3dFeGVjdXRvcmAgcHVzaGVzIHRoZSBwYXJlbnQgY29udGV4dCdzIG1vZGUgaW50byBlYWNoIHN1YmZsb3dcbiAgICogcm9vdCBzbyBuZXN0ZWQgY2hhcnRzIGluaGVyaXQgdG9vLlxuICAgKi9cbiAgdXNlUmVhZFRyYWNraW5nKG1vZGU6IFJlYWRUcmFja2luZ01vZGUpOiB2b2lkIHtcbiAgICB0aGlzLnJlYWRUcmFja2luZyA9IG1vZGU7XG4gIH1cblxuICAvKiogUmV0dXJucyB0aGUgYWN0aXZlIHJlYWQtdHJhY2tpbmcgcG9saWN5ICh1c2VkIGZvciBzdWJmbG93IHByb3BhZ2F0aW9uKS4gKi9cbiAgZ2V0UmVhZFRyYWNraW5nKCk6IFJlYWRUcmFja2luZ01vZGUge1xuICAgIHJldHVybiB0aGlzLnJlYWRUcmFja2luZztcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXQgdGhlIHdyaXRlLXRyYWNraW5nIHBvbGljeSBmb3IgdGhpcyBjb250ZXh0ICgjMTNjLUEpLiBTYW1lIHBsdW1iaW5nXG4gICAqIGFzIHtAbGluayB1c2VSZWFkVHJhY2tpbmd9OiBjYWxsZWQgYXQgdGhlIHJvb3QgYnlcbiAgICogYEV4ZWN1dGlvblJ1bnRpbWUudXNlV3JpdGVUcmFja2luZygpYCAocGx1bWJlZCBmcm9tIGBGbG93Q2hhcnRFeGVjdXRvcmApO1xuICAgKiBkZXNjZW5kYW50cyBpbmhlcml0IHZpYSBgY3JlYXRlTmV4dGAvYGNyZWF0ZUNoaWxkYCwgYW5kIGBTdWJmbG93RXhlY3V0b3JgXG4gICAqIHB1c2hlcyB0aGUgcGFyZW50IGNvbnRleHQncyBtb2RlIGludG8gZWFjaCBzdWJmbG93IHJvb3QuXG4gICAqL1xuICB1c2VXcml0ZVRyYWNraW5nKG1vZGU6IFdyaXRlVHJhY2tpbmdNb2RlKTogdm9pZCB7XG4gICAgdGhpcy53cml0ZVRyYWNraW5nID0gbW9kZTtcbiAgfVxuXG4gIC8qKiBSZXR1cm5zIHRoZSBhY3RpdmUgd3JpdGUtdHJhY2tpbmcgcG9saWN5ICh1c2VkIGZvciBzdWJmbG93IHByb3BhZ2F0aW9uKS4gKi9cbiAgZ2V0V3JpdGVUcmFja2luZygpOiBXcml0ZVRyYWNraW5nTW9kZSB7XG4gICAgcmV0dXJuIHRoaXMud3JpdGVUcmFja2luZztcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXQgdGhlIGNvbW1pdC12YWx1ZXMgZW5jb2RpbmcgcG9saWN5IGZvciB0aGlzIGNvbnRleHQgKCMxM2MtQikuIFNhbWVcbiAgICogcGx1bWJpbmcgYXMge0BsaW5rIHVzZVJlYWRUcmFja2luZ30ve0BsaW5rIHVzZVdyaXRlVHJhY2tpbmd9OiBjYWxsZWQgYXRcbiAgICogdGhlIHJvb3QgYnkgYEV4ZWN1dGlvblJ1bnRpbWUudXNlQ29tbWl0VmFsdWVzKClgIChwbHVtYmVkIGZyb21cbiAgICogYEZsb3dDaGFydEV4ZWN1dG9yYCk7IGRlc2NlbmRhbnRzIGluaGVyaXQgdmlhIGBjcmVhdGVOZXh0YC9gY3JlYXRlQ2hpbGRgLFxuICAgKiBhbmQgYFN1YmZsb3dFeGVjdXRvcmAgcHVzaGVzIHRoZSBwYXJlbnQgY29udGV4dCdzIG1vZGUgaW50byBlYWNoIHN1YmZsb3dcbiAgICogcm9vdC5cbiAgICovXG4gIHVzZUNvbW1pdFZhbHVlcyhtb2RlOiBDb21taXRWYWx1ZXNNb2RlKTogdm9pZCB7XG4gICAgdGhpcy5jb21taXRWYWx1ZXMgPSBtb2RlO1xuICB9XG5cbiAgLyoqIFJldHVybnMgdGhlIGFjdGl2ZSBjb21taXQtdmFsdWVzIHBvbGljeSAodXNlZCBmb3Igc3ViZmxvdyBwcm9wYWdhdGlvbikuICovXG4gIGdldENvbW1pdFZhbHVlcygpOiBDb21taXRWYWx1ZXNNb2RlIHtcbiAgICByZXR1cm4gdGhpcy5jb21taXRWYWx1ZXM7XG4gIH1cblxuICAvKipcbiAgICogU2V0IHRoZSBwZXItd3JpdGUgcmVhZC1wcm92ZW5hbmNlIHBvbGljeSAoI1AxKS4gU2FtZSBwbHVtYmluZyBhcyB0aGVcbiAgICogb3RoZXIgdGhyZWUgZGlhbHM6IGNhbGxlZCBhdCB0aGUgcm9vdCBieVxuICAgKiBgRXhlY3V0aW9uUnVudGltZS51c2VXcml0ZVByb3ZlbmFuY2UoKWAgKHBsdW1iZWQgZnJvbVxuICAgKiBgRmxvd0NoYXJ0RXhlY3V0b3JgKTsgZGVzY2VuZGFudHMgaW5oZXJpdCB2aWEgYGNyZWF0ZU5leHRgL2BjcmVhdGVDaGlsZGAsXG4gICAqIGFuZCBgU3ViZmxvd0V4ZWN1dG9yYCBwdXNoZXMgdGhlIHBhcmVudCBjb250ZXh0J3MgbW9kZSBpbnRvIGVhY2ggc3ViZmxvd1xuICAgKiByb290IHNvIG5lc3RlZCBjaGFydHMgaW5oZXJpdCB0b28uXG4gICAqL1xuICB1c2VXcml0ZVByb3ZlbmFuY2UobW9kZTogV3JpdGVQcm92ZW5hbmNlTW9kZSk6IHZvaWQge1xuICAgIHRoaXMud3JpdGVQcm92ZW5hbmNlID0gbW9kZTtcbiAgfVxuXG4gIC8qKiBSZXR1cm5zIHRoZSBhY3RpdmUgd3JpdGUtcHJvdmVuYW5jZSBwb2xpY3kgKHVzZWQgZm9yIHN1YmZsb3cgcHJvcGFnYXRpb24pLiAqL1xuICBnZXRXcml0ZVByb3ZlbmFuY2UoKTogV3JpdGVQcm92ZW5hbmNlTW9kZSB7XG4gICAgcmV0dXJuIHRoaXMud3JpdGVQcm92ZW5hbmNlO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlY29yZCBhIHRyYWNrZWQgdXNlci1sZXZlbCB3cml0ZSwgcG9saWN5LWdhdGVkICgjMTNjLUEpIOKAlCB0aGUgc2luZ2xlXG4gICAqIGJvb2trZWVwaW5nIHBhdGggZm9yIHtAbGluayBzZXRPYmplY3R9IGFuZCB7QGxpbmsgdXBkYXRlT2JqZWN0fS4gSG9sZHNcbiAgICogdGhlIFJFRkVSRU5DRSBhbmQgdGhlIHZlcmRpY3QgKDkuMjMuMCk7IHRoZSByZXRhaW5lZCBmb3JtIGlzIHRha2VuIGF0XG4gICAqIGNvbW1pdCBieSB7QGxpbmsgbWF0ZXJpYWxpc2VXcml0ZXN9LCBvbmNlIHBlciBrZXkuXG4gICAqXG4gICAqIFJlZGFjdGlvbiB0YWtlcyBwcmVjZWRlbmNlIG92ZXIgdGhlIGRpYWwgaW4gRVZFUlkgbW9kZTogYSByZWRhY3RlZFxuICAgKiB3cml0ZSBzdG9yZXMgdGhlIGAnW1JFREFDVEVEXSdgIHBsYWNlaG9sZGVyIHVuZGVyIGAnZnVsbCdgIEFORFxuICAgKiBgJ3N1bW1hcnknYCAoYSBzdW1tYXJ5IG1hcmtlciB3b3VsZCBsZWFrIHRoZSB2YWx1ZSdzIHByZXZpZXcvc2l6ZSksXG4gICAqIGFuZCBzdG9yZXMgbm90aGluZyB1bmRlciBgJ29mZidgIChlbnRyeSBza2lwcGVkIGVudGlyZWx5IOKAlCBub3RoaW5nIHRvXG4gICAqIGxlYWspLiBBIGZpZWxkLWxldmVsIHZlcmRpY3Qgc2NydWJzIGEgY2xvbmUgQkVGT1JFIHRoZSBkaWFsIHNlZXMgaXQsIHNvXG4gICAqIGEgc3VtbWFyeSBwcmV2aWV3IGNhbiBuZXZlciBzaG93IHRoZSBzZWNyZXQgZWl0aGVyLiBUaGUgdmVyZGljdCBpcyB0aGVcbiAgICogb25lIGBzdGFnZVdyaXRlYCBhc2tlZCB0aGUgcnVsZSBmb3IgQkVGT1JFIHN0YWdpbmcsIGNhcnJpZWQgdG8gY29tbWl0XG4gICAqIHdpdGggdGhlIHZhbHVlLiBUaGUgc3RhZ2VkIHdyaXRlIGl0c2VsZiBpcyB1bmFmZmVjdGVkIOKAlCByZWRhY3Rpb24gb2ZcbiAgICogdGhlIGNvbW1pdHRlZCBwYXlsb2FkIGlzIGhhbmRsZWQgYnkgdGhlIHRyYW5zYWN0aW9uIGJ1ZmZlcidzXG4gICAqIGByZWRhY3RlZFBhdGhzYC5cbiAgICovXG4gIHByaXZhdGUgdHJhY2tXcml0ZShcbiAgICB1c2VyS2V5OiBzdHJpbmcsXG4gICAgdmFsdWU6IHVua25vd24sXG4gICAgdmVyZGljdDogUmVkYWN0aW9uVmVyZGljdCxcbiAgICBvcGVyYXRpb246ICdzZXQnIHwgJ3VwZGF0ZScgfCAnZGVsZXRlJyxcbiAgKSB7XG4gICAgaWYgKHRoaXMud3JpdGVUcmFja2luZyA9PT0gJ29mZicpIHJldHVybjtcbiAgICAodGhpcy5fcGVuZGluZ1dyaXRlcyA/Pz0gbmV3IE1hcCgpKS5zZXQodXNlcktleSwgeyB2YWx1ZSwgdmVyZGljdCwgb3BlcmF0aW9uIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIGBfc3RhZ2VXcml0ZXNgIHdpdGggZXZlcnkgcGVuZGluZyB3cml0ZSBmb2xkZWQgaW4gYXMgaXRzIHJldGFpbmVkIGZvcm1cbiAgICog4oCUIHRoZSByZWNvcmQgYSByZWFkZXIgc2Vlcy4gQ29uc3VtZXMgbm90aGluZzogYSBtaWQtcnVuIHNuYXBzaG90IHJlYWRzXG4gICAqIHRoZSB3cml0ZXMgc28gZmFyLCBhbmQgY29tbWl0IHN0aWxsIG1hdGVyaWFsaXNlcyB0aGUgZmluYWwgdmFsdWVzLlxuICAgKiBSZXR1cm5zIGBfc3RhZ2VXcml0ZXNgIGl0c2VsZiB3aGVuIG5vdGhpbmcgaXMgcGVuZGluZy5cbiAgICovXG4gIHByaXZhdGUgcmV0YWluZWRXcml0ZXMoKTogUmVjb3JkPHN0cmluZywgeyB2YWx1ZTogdW5rbm93bjsgb3BlcmF0aW9uOiAnc2V0JyB8ICd1cGRhdGUnIHwgJ2RlbGV0ZScgfT4ge1xuICAgIGlmICghdGhpcy5fcGVuZGluZ1dyaXRlcykgcmV0dXJuIHRoaXMuX3N0YWdlV3JpdGVzO1xuICAgIGNvbnN0IG91dCA9IHsgLi4udGhpcy5fc3RhZ2VXcml0ZXMgfTtcbiAgICBmb3IgKGNvbnN0IFtrZXksIHddIG9mIHRoaXMuX3BlbmRpbmdXcml0ZXMpIHtcbiAgICAgIG91dFtrZXldID0ge1xuICAgICAgICB2YWx1ZTogdGhpcy5yZXRhaW5lZEZvcm0ody52ZXJkaWN0LCB3LnZhbHVlLCB0aGlzLndyaXRlVHJhY2tpbmcsIHN1bW1hcml6ZVdyaXRlVmFsdWUpLFxuICAgICAgICBvcGVyYXRpb246IHcub3BlcmF0aW9uLFxuICAgICAgfTtcbiAgICB9XG4gICAgcmV0dXJuIG91dDtcbiAgfVxuXG4gIC8qKlxuICAgKiBUYWtlIHRoZSByZXRhaW5lZCBmb3JtIG9mIGV2ZXJ5IHBlbmRpbmcgd3JpdGUg4oCUIE9OQ0UgcGVyIGtleSwgZnJvbSB0aGVcbiAgICogdmFsdWUgYXMgaXQgc3RhbmRzIGF0IGNvbW1pdCAoOS4yMy4wKSDigJQgYW5kIHJlbGVhc2UgdGhlIHJlZmVyZW5jZXMuIFRoZVxuICAgKiBmaXJzdCB0aGluZyBgY29tbWl0KClgIGRvZXMsIHNvIHRoZSBib3Jyb3dlZC1tdXRhdGlvbiBndWFyZCBhbmQgdGhlXG4gICAqIGNvbW1pdCBvYnNlcnZlciBzZWUgdGhlIGZpbmlzaGVkIHJlY29yZC5cbiAgICovXG4gIHByaXZhdGUgbWF0ZXJpYWxpc2VXcml0ZXMoKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLl9wZW5kaW5nV3JpdGVzKSByZXR1cm47XG4gICAgdHJ5IHtcbiAgICAgIHRoaXMuX3N0YWdlV3JpdGVzID0gdGhpcy5yZXRhaW5lZFdyaXRlcygpO1xuICAgIH0gZmluYWxseSB7XG4gICAgICAvLyBSZWxlYXNlZCBldmVuIHdoZW4gYSByZXRhaW5lZCBmb3JtIGNhbm5vdCBiZSB0YWtlbiDigJQgYW4gdW5jbG9uZWFibGVcbiAgICAgIC8vIHZhbHVlIChhIGZ1bmN0aW9uLCBhIFByb3h5KSBpcyBhIGNvbnRyYWN0IHZpb2xhdGlvbiAoXCJzdGF0ZSB2YWx1ZXNcbiAgICAgIC8vIG11c3Qgc3Vydml2ZSBzdHJ1Y3R1cmVkQ2xvbmVcIikgdGhhdCBub3cgc3VyZmFjZXMgSEVSRSwgYXQgY29tbWl0LFxuICAgICAgLy8gYW5kIGZhaWxzIHRoZSBydW4gbG91ZGx5OyBhIGxhdGVyIHNuYXBzaG90IG9mIHRoZSBmYWlsZWQgcnVuIG11c3RcbiAgICAgIC8vIG5vdCB0aHJvdyB0aGUgc2FtZSBlcnJvciBhZ2Fpbi5cbiAgICAgIHRoaXMuX3BlbmRpbmdXcml0ZXMgPSB1bmRlZmluZWQ7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBmb3JtIG9mIGEgdmFsdWUgdGhlIGVuZ2luZSBSRVRBSU5TIChyZWFkcyBhbmQgd3JpdGVzIHJldGVudGlvbik6XG4gICAqIHRoZSBwbGFjZWhvbGRlciBiZWF0cyBldmVyeSBkaWFsOyBhIGZpZWxkLWxldmVsIHNjcnViIGhhcHBlbnMgYmVmb3JlIHRoZVxuICAgKiBkaWFsIHNlZXMgdGhlIHZhbHVlOyBhIGNsZWFyIHZhbHVlIGlzIHN1bW1hcml6ZWQgb3IgY2xvbmVkIGFzIHRoZSBkaWFsXG4gICAqIHNheXMuIENhbGxlcnMgaGFuZGxlIGB1bmRlZmluZWRgIGJlZm9yZSBhc2tpbmcuXG4gICAqL1xuICBwcml2YXRlIHJldGFpbmVkRm9ybShcbiAgICB2ZXJkaWN0OiBSZWRhY3Rpb25WZXJkaWN0LFxuICAgIHZhbHVlOiB1bmtub3duLFxuICAgIG1vZGU6IFJlYWRUcmFja2luZ01vZGUgfCBXcml0ZVRyYWNraW5nTW9kZSxcbiAgICBzdW1tYXJpemU6ICh2YWx1ZTogdW5rbm93bikgPT4gdW5rbm93bixcbiAgKTogdW5rbm93biB7XG4gICAgaWYgKHZlcmRpY3Qua2luZCA9PT0gJ3dob2xlJykgcmV0dXJuIFJFREFDVEVEO1xuICAgIGNvbnN0IHNjcnViYmVkID0gdmVyZGljdC5raW5kID09PSAnZmllbGRzJyA/IFJlZGFjdGlvblJ1bGUuc2NydWJGaWVsZHModmFsdWUsIHZlcmRpY3QucGF0aHMpIDogdW5kZWZpbmVkO1xuICAgIGlmIChtb2RlID09PSAnc3VtbWFyeScpIHJldHVybiBzdW1tYXJpemUoc2NydWJiZWQgPz8gdmFsdWUpO1xuICAgIHJldHVybiBzY3J1YmJlZCA/PyBzdHJ1Y3R1cmVkQ2xvbmUodmFsdWUpO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBydWxlIHdpdGggc29tZXRoaW5nIHRvIHNheSDigJQgYHVuZGVmaW5lZGAgb24gdGhlIG5vLXBvbGljeSBwYXRoIChub1xuICAgKiBydWxlIGluc3RhbGxlZCwgb3IgYSBydWxlIHdpdGggbm8gcG9saWN5IGVudHJpZXMgYW5kIG5vIG1hcmtlZCBrZXlzKSwgc29cbiAgICogYSB0cmFja2VkIHJlYWQgb3IgYSBzdGFnZWQgd3JpdGUgdGhlcmUgcGF5cyBubyB2ZXJkaWN0IGNhbGwgYW5kIG5vIHBhdGhcbiAgICogYWxsb2NhdGlvbi4gVGhlIGRlZmF1bHQgcnVuIGlzIGJ5dGUtaWRlbnRpY2FsIEFORCBjb3N0LWlkZW50aWNhbC5cbiAgICovXG4gIHByaXZhdGUgYWN0aXZlUnVsZSgpOiBSZWRhY3Rpb25SdWxlIHwgdW5kZWZpbmVkIHtcbiAgICBjb25zdCBydWxlID0gdGhpcy5yZWRhY3Rpb25SdWxlO1xuICAgIHJldHVybiBydWxlICE9PSB1bmRlZmluZWQgJiYgIXJ1bGUuaXNJbmVydCgpID8gcnVsZSA6IHVuZGVmaW5lZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBUSEUgT05FIEZVTk5FTCBldmVyeSBzdGFnZWQgd3JpdGUgcGFzc2VzIHRocm91Z2gg4oCUIGZhY2FkZSB3cml0ZXMgQU5EXG4gICAqIHRoZSBwYXRocyB0aGF0IGJ5cGFzcyB0aGUgZmFjYWRlIChzdWJmbG93IHNlZWQsIGBvdXRwdXRNYXBwZXJgXG4gICAqIG1lcmdlLWJhY2ssIHJlc3VtZSByZS1zZWVkKS4gVGhlIE9ORSBkZWNpc2lvbiBpcyBtYWRlIGhlcmU6IGFuIGV4cGxpY2l0XG4gICAqIHBlci1jYWxsIGZsYWcgbWFrZXMgdGhlIHZhbHVlIHNlY3JldCBvdXRyaWdodCAoYW5kIG1hcmtzIHRoZSBrZXkgZm9yIHRoZVxuICAgKiByZXN0IG9mIHRoZSBydW4sIHRoZSBkZWNsYXJlLW9uY2UgY29udHJhY3QpOyBvdGhlcndpc2UgdGhlIGluc3RhbGxlZFxuICAgKiBydWxlIGRlY2lkZXMgZnJvbSB0aGUgdXNlci1sZXZlbCBwYXRoLiBJdCBzdGFnZXMgdGhlIHdyaXRlLCByZWdpc3RlcnNcbiAgICogdGhlIHJlZGFjdGVkIHBhdGhzIHRoZSBjb21taXQgbG9nIGFuZCBtaXJyb3Igd2lsbCBzY3J1YiAod2hvbGUga2V5LCBvclxuICAgKiB0aGUgZmllbGRzIGluc2lkZSB0aGUgdmFsdWUpLCBhbmQga2VlcHMgdGhlIHJ1bidzIG1hcmtlZC1rZXlzIHNldCBpblxuICAgKiBzdGVwIChhIHdob2xlIHZlcmRpY3QgbWFya3MgaXRzIGtleTsgYSBkZWxldGUgY2xlYXJzIHRoZSBtYXJrKS4gUmV0dXJuc1xuICAgKiB0aGUgdmVyZGljdCBzbyB0aGUgY2FsbGVyIHJldGFpbnMgYW5kIHJlcG9ydHMgdW5kZXIgdGhlIHNhbWUgZGVjaXNpb24uXG4gICAqL1xuICBwcml2YXRlIHN0YWdlV3JpdGUoXG4gICAgbnNQYXRoOiBzdHJpbmdbXSxcbiAgICBwYXRoOiBzdHJpbmdbXSxcbiAgICBrZXk6IHN0cmluZyxcbiAgICB2YWx1ZTogdW5rbm93bixcbiAgICBleHBsaWNpdDogYm9vbGVhbiB8IHVuZGVmaW5lZCxcbiAgICB2ZXJiOiAnc2V0JyB8ICdtZXJnZScgfCAnZGVsZXRlJyxcbiAgKTogUmVkYWN0aW9uVmVyZGljdCB7XG4gICAgY29uc3QgcnVsZSA9IHRoaXMuYWN0aXZlUnVsZSgpO1xuICAgIGNvbnN0IHZlcmRpY3Q6IFJlZGFjdGlvblZlcmRpY3QgPSBleHBsaWNpdFxuICAgICAgPyB7IGtpbmQ6ICd3aG9sZScsIGtleTogdXNlcktleU9mKHBhdGgsIGtleSkgfVxuICAgICAgOiBydWxlICE9PSB1bmRlZmluZWRcbiAgICAgID8gcnVsZS52ZXJkaWN0QXQocGF0aCwga2V5KVxuICAgICAgOiBDTEVBUjtcbiAgICBjb25zdCB3aG9sZSA9IHZlcmRpY3Qua2luZCA9PT0gJ3dob2xlJztcbiAgICBjb25zdCBidWZmZXIgPSB0aGlzLmdldFRyYW5zYWN0aW9uQnVmZmVyKCk7XG4gICAgaWYgKHZlcmIgPT09ICdtZXJnZScpIGJ1ZmZlci5tZXJnZShuc1BhdGgsIHZhbHVlLCB3aG9sZSk7XG4gICAgZWxzZSBpZiAodmVyYiA9PT0gJ2RlbGV0ZScpIGJ1ZmZlci5kZWxldGUobnNQYXRoLCB3aG9sZSk7XG4gICAgZWxzZSBidWZmZXIuc2V0KG5zUGF0aCwgdmFsdWUsIHdob2xlKTtcbiAgICBpZiAodmVyZGljdC5raW5kID09PSAnZmllbGRzJykgYnVmZmVyLm1hcmtSZWRhY3RlZEZpZWxkcyhuc1BhdGgsIHZlcmRpY3QucGF0aHMpO1xuICAgIGlmICh2ZXJiID09PSAnZGVsZXRlJykge1xuICAgICAgcnVsZT8udW5tYXJrKHVzZXJLZXlPZihwYXRoLCBrZXkpKTtcbiAgICB9IGVsc2UgaWYgKHdob2xlKSB7XG4gICAgICAvLyBUaGUgUkVBTCBydWxlLCBub3QgdGhlIGFjdGl2ZSBvbmU6IGFuIGV4cGxpY2l0IG1hcmsgb24gYW4gaW5lcnQgcnVsZVxuICAgICAgLy8gaXMgZXhhY3RseSB3aGF0IG1ha2VzIGl0IGFjdGl2ZSBmb3IgdGhlIHJlc3Qgb2YgdGhlIHJ1bi5cbiAgICAgIHRoaXMucmVkYWN0aW9uUnVsZT8ubWFyayh2ZXJkaWN0LmtleSk7XG4gICAgfVxuICAgIHJldHVybiB2ZXJkaWN0O1xuICB9XG5cbiAgLyoqXG4gICAqIOKUgOKUgCBUaGUgZmlyc3QtdG91Y2ggc3RhdGUgdmlldyAoIzEzKSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcbiAgICpcbiAgICogV0hBVDogcmV0dXJucyB0aGUgY29tbWl0dGVkIHNoYXJlZCBzdGF0ZSBhcyBpdCB3YXMgYXQgdGhpcyBzdGFnZSdzIEZJUlNUXG4gICAqIHRvdWNoIChmaXJzdCByZWFkIG9yIGZpcnN0IHdyaXRlKSwgY2FwdHVyaW5nIHRoZSByZWZlcmVuY2Ugb24gZmlyc3QgY2FsbC5cbiAgICogU2VydmVzIHR3byBjb25zdW1lcnM6IHJlYWRzIGJlZm9yZSB0aGUgZmlyc3Qgd3JpdGUgKHtAbGluayByZWFkU3RhdGV9KVxuICAgKiBhbmQgdGhlIHRyYW5zYWN0aW9uIGJ1ZmZlcidzIGRpZmYgYmFzZSAoe0BsaW5rIGdldFRyYW5zYWN0aW9uQnVmZmVyfSkuXG4gICAqXG4gICAqIFdIWSBBIEJBUkUgUkVGRVJFTkNFIElTIFNBRkUg4oCUIHRoZSBpbnZhcmlhbnQgdGhpcyByZXN0cyBvbjogY29tbWl0dGVkXG4gICAqIHN0YXRlIGlzIGltbXV0YWJsZS1hZnRlci1zd2FwLiBgU2hhcmVkTWVtb3J5LmFwcGx5UGF0Y2hgIHJvdXRlcyB0aHJvdWdoXG4gICAqIGBhcHBseVNtYXJ0TWVyZ2VgLCB3aGljaCBgc3RydWN0dXJlZENsb25lYHMgdGhlIGN1cnJlbnQgc3RhdGUsIG11dGF0ZXNcbiAgICogb25seSB0aGUgY2xvbmUsIGFuZCBzd2FwcyBgU2hhcmVkTWVtb3J5LmNvbnRleHRgIHRvIGl0IOKAlCB0aGUgb2JqZWN0IGFcbiAgICogc3RhZ2UgY2FwdHVyZWQgaGVyZSBpcyBuZXZlciBlZGl0ZWQgYWZ0ZXJ3YXJkcy4gKGBTaGFyZWRNZW1vcnkuc2V0VmFsdWVgL1xuICAgKiBgdXBkYXRlVmFsdWVgIERPIG11dGF0ZSBpbiBwbGFjZSwgYnV0IGhhdmUgbm8gY2FsbGVycyBkdXJpbmcgdHJhdmVyc2FsO1xuICAgKiBldmVyeSBydW50aW1lIHdyaXRlIHJlYWNoZXMgc3RhdGUgdGhyb3VnaCBhIHN0YWdlIGNvbW1pdCdzIGBhcHBseVBhdGNoYC4pXG4gICAqIEhvbGRpbmcgdGhlIHJlZmVyZW5jZSB0aGVyZWZvcmUgZ2l2ZXMgdGhpcyBzdGFnZSBhIHN0YWJsZSBzbmFwc2hvdCBhdFxuICAgKiB6ZXJvIGNvc3Qg4oCUIG5vIGNsb25lLCB3aGljaCBpcyB0aGUgZW50aXJlIHBvaW50IG9mICMxMy5cbiAgICpcbiAgICogV0hZIEZJUlNUIFRPVUNILCBub3QgZmlyc3Qgd3JpdGU6IHRoZSBwcmUtIzEzIGVhZ2VyIGVuZ2luZSBjbG9uZWQgdGhlXG4gICAqIHN0YXRlIGludG8gdGhlIGJ1ZmZlciBhdCB0aGUgc3RhZ2UncyBmaXJzdCBBQ0NFU1MsIGFuY2hvcmluZyBib3RoIGl0c1xuICAgKiBzbmFwc2hvdCByZWFkcyBhbmQgaXRzIGNvbW1pdCBiYXNlbGluZSAodGhlIG5ldC1jaGFuZ2UgZGlmZiBiYXNlKSB0aGVyZS5cbiAgICogIzEzJ3MgZmlyc3QgY3V0IGFuY2hvcmVkIHRoZSBsYXp5IGJ1ZmZlciBhdCBmaXJzdCBXUklURSDigJQgb2JzZXJ2YWJseVxuICAgKiBkaWZmZXJlbnQgd2hlbiBzb21ldGhpbmcgZWxzZSBjb21taXRzIGluIHRoZSBnYXAgYmV0d2VlbiB0aGlzIHN0YWdlJ3NcbiAgICogZmlyc3QgcmVhZCBhbmQgaXRzIGZpcnN0IHdyaXRlLiBUaGF0IGdhcCBpcyBSRUFDSEFCTEU6IGZvcmsgc2libGluZ3MgYXJlXG4gICAqIG5hbWVzcGFjZS1pc29sYXRlZCBmb3IgcnVuLXNjb3BlZCBrZXlzIChlYWNoIGNoaWxkIHdyaXRlcyB1bmRlclxuICAgKiBgcnVucy88Y2hpbGRJZD4vYCksIGJ1dCBST09ULWxldmVsIGtleXMgYXJlIHNoYXJlZCDigJQgd3JpdHRlbiB2aWFcbiAgICogYHNldEdsb2JhbGAgZnJvbSBjb25zdW1lciBzY29wZSBjb2RlIGFuZCwgY3JpdGljYWxseSwgYnlcbiAgICogYFN1YmZsb3dJbnB1dE1hcHBlcmAncyBvdXRwdXQgbWFwcGluZyAoYHBhcmVudENvbnRleHQuc2V0R2xvYmFsYCksIHdoaWNoXG4gICAqIGlzIGV4YWN0bHkgd2hhdCBydW5zIHdoZW4gYSBzdWJmbG93IGlzIGEgZm9yayBicmFuY2guIEEgc2libGluZydzXG4gICAqIHJvb3Qta2V5IGNvbW1pdCBsYW5kaW5nIGluIHRoZSBnYXAgd291bGQgc2hpZnQgdGhpcyBzdGFnZSdzIGRpZmYgYmFzZSxcbiAgICogbWFraW5nIGl0cyBDb21taXRCdW5kbGUgcmVjb3JkIGEgcGhhbnRvbSBjaGFuZ2UgKG9yIHN3YWxsb3cgYSByZWFsIG9uZSlcbiAgICogcmVsYXRpdmUgdG8gdGhlIGVhZ2VyIGVuZ2luZS4gQW5jaG9yaW5nIHRoZSB2aWV3IGF0IGZpcnN0IHRvdWNoIHJlc3RvcmVzXG4gICAqIHRoZSBFWEFDVCBlYWdlciBzZW1hbnRpY3Mg4oCUIHNlcXVlbnRpYWwgQU5EIHBhcmFsbGVsIOKAlCBhdCB6ZXJvIGNsb25lIGNvc3QuXG4gICAqXG4gICAqIFJlYWQgdmlzaWJpbGl0eSBpcyB0d28tdGllciwgbWF0Y2hpbmcgZWFnZXIgYnl0ZS1mb3ItYnl0ZToga2V5cyBwcmVzZW50XG4gICAqIGluIHRoZSB2aWV3IGF0IGZpcnN0IHRvdWNoIHJlYWQgcmVwZWF0YWJseSBmcm9tIGl0OyBrZXlzIEFCU0VOVCBmcm9tIGl0XG4gICAqIGZhbGwgYmFjayB0byBMSVZFIHN0YXRlICh0aGUgZWFnZXIgZW5naW5lJ3MgZXhhY3QgZmFsbGJhY2sg4oCUIGFcbiAgICogbWlkLWZsaWdodCBzaWJsaW5nIHJvb3Qta2V5IHdyaXRlIHdhcyBhbHdheXMgdmlzaWJsZSB0byByZWFkcywgYW5kXG4gICAqIHN0YXlzIHZpc2libGU7IG9ubHkgdGhlIERJRkYgQkFTRSBpcyBwaW5uZWQpLlxuICAgKi9cbiAgcHJpdmF0ZSBmaXJzdFRvdWNoU3RhdGUoKTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4ge1xuICAgIGlmICghdGhpcy5zdGF0ZVZpZXcpIHtcbiAgICAgIHRoaXMuc3RhdGVWaWV3ID0gdGhpcy5zaGFyZWRNZW1vcnkuZ2V0U3RhdGUoKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuc3RhdGVWaWV3O1xuICB9XG5cbiAgLyoqIExhemlseSBjcmVhdGVzIHRoZSB0cmFuc2FjdGlvbiBidWZmZXIgb24gdGhlIHN0YWdlJ3MgRklSU1QgV1JJVEUgKCMxMykuXG4gICAqXG4gICAqICBSZWFkcyBORVZFUiBjb25zdHJ1Y3QgaXQ6IHJlYWQteW91ci13cml0ZXMgb25seSBtYXR0ZXJzIG9uY2UgYSBzdGFnZWRcbiAgICogIHdyaXRlIGV4aXN0cywgc28gYmVmb3JlIHRoYXQge0BsaW5rIGdldFZhbHVlfS97QGxpbmsgZ2V0VmFsdWVEaXJlY3R9XG4gICAqICBzZXJ2ZSBmcm9tIHRoZSBmaXJzdC10b3VjaCBzdGF0ZSB2aWV3IGFuZCB7QGxpbmsgY29tbWl0fSByZWNvcmRzIGFuXG4gICAqICBlbXB0eSBidW5kbGUg4oCUIGFsbCB3aXRoIFpFUk8gYHN0cnVjdHVyZWRDbG9uZWBzIG9mIHRoZSBzaGFyZWQgc3RhdGUuXG4gICAqXG4gICAqICBUaGUgYnVmZmVyJ3MgYmFzZSBpcyB0aGUgRklSU1QtVE9VQ0ggdmlldywgTk9UIHRoZSBsaXZlIHN0YXRlIGF0IHdyaXRlXG4gICAqICB0aW1lOiB1bmRlciBwYXJhbGxlbCBmb3JrcyBhIHNpYmxpbmcgbWF5IGhhdmUgY29tbWl0dGVkIGJldHdlZW4gdGhpc1xuICAgKiAgc3RhZ2UncyBmaXJzdCByZWFkIGFuZCB0aGlzIHdyaXRlLCBhbmQgdGhlIG5ldC1jaGFuZ2UgZGlmZiBiYXNlIG11c3RcbiAgICogIHN0YXkgYW5jaG9yZWQgYXQgZmlyc3QgdG91Y2ggdG8gbWF0Y2ggdGhlIGVhZ2VyIGVuZ2luZSDigJQgc2VlXG4gICAqICB7QGxpbmsgZmlyc3RUb3VjaFN0YXRlfS4gKi9cbiAgZ2V0VHJhbnNhY3Rpb25CdWZmZXIoKTogVHJhbnNhY3Rpb25CdWZmZXIge1xuICAgIGlmICghdGhpcy5idWZmZXIpIHtcbiAgICAgIC8vIFBlci13cml0ZSBwcm92ZW5hbmNlICgjUDEpOiBoYW5kIHRoZSBidWZmZXIgYSBsaXZlIHZpZXcgb2YgdGhpc1xuICAgICAgLy8gc3RhZ2UncyByZWFkIHByZWZpeCDigJQgZXZhbHVhdGVkIEFUIEVBQ0ggV1JJVEUsIHNvIGVhY2ggc3RhZ2VkIG9wXG4gICAgICAvLyBjYXB0dXJlcyBleGFjdGx5IHRoZSByZWFkcyB0aGF0IHByZWNlZGVkIGl0ICh0ZW1wb3JhbCBwcmVmaXgpLlxuICAgICAgY29uc3QgcmVhZEtleXNQcm92aWRlciA9XG4gICAgICAgIHRoaXMud3JpdGVQcm92ZW5hbmNlID09PSAncmVhZHMtcHJlZml4JyA/ICgpID0+IFsuLi4odGhpcy5fcHJvdmVuYW5jZVJlYWRzID8/IFtdKV0gOiB1bmRlZmluZWQ7XG4gICAgICB0aGlzLmJ1ZmZlciA9IG5ldyBUcmFuc2FjdGlvbkJ1ZmZlcih0aGlzLmZpcnN0VG91Y2hTdGF0ZSgpLCB0aGlzLmNvbW1pdFZhbHVlcywgcmVhZEtleXNQcm92aWRlcik7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLmJ1ZmZlcjtcbiAgfVxuXG4gIC8qKiBCdWlsZHMgYW4gYWJzb2x1dGUgcGF0aCBpbnNpZGUgdGhlIHNoYXJlZCBtZW1vcnkgKHJ1biBuYW1lc3BhY2UpLiAqL1xuICBwcml2YXRlIHdpdGhOYW1lc3BhY2UocGF0aDogc3RyaW5nW10sIGtleTogc3RyaW5nKTogc3RyaW5nW10ge1xuICAgIGlmICghdGhpcy5ydW5JZCB8fCB0aGlzLnJ1bklkID09PSAnJykge1xuICAgICAgcmV0dXJuIFsuLi5wYXRoLCBrZXldO1xuICAgIH1cbiAgICByZXR1cm4gWydydW5zJywgdGhpcy5ydW5JZCwgLi4ucGF0aCwga2V5XTtcbiAgfVxuXG4gIC8vIOKUgOKUgCBXcml0ZSBvcGVyYXRpb25zIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG4gIHBhdGNoKHBhdGg6IHN0cmluZ1tdLCBrZXk6IHN0cmluZywgdmFsdWU6IHVua25vd24sIHNob3VsZFJlZGFjdCA9IGZhbHNlKTogUmVkYWN0aW9uVmVyZGljdCB7XG4gICAgcmV0dXJuIHRoaXMuc3RhZ2VXcml0ZSh0aGlzLndpdGhOYW1lc3BhY2UocGF0aCwga2V5KSwgcGF0aCwga2V5LCB2YWx1ZSwgc2hvdWxkUmVkYWN0LCAnc2V0Jyk7XG4gIH1cblxuICBzZXQocGF0aDogc3RyaW5nW10sIGtleTogc3RyaW5nLCB2YWx1ZTogdW5rbm93bikge1xuICAgIHRoaXMucGF0Y2gocGF0aCwga2V5LCB2YWx1ZSk7XG4gIH1cblxuICBtZXJnZShwYXRoOiBzdHJpbmdbXSwga2V5OiBzdHJpbmcsIHZhbHVlOiB1bmtub3duLCBzaG91bGRSZWRhY3Q/OiBib29sZWFuKTogUmVkYWN0aW9uVmVyZGljdCB7XG4gICAgcmV0dXJuIHRoaXMuc3RhZ2VXcml0ZSh0aGlzLndpdGhOYW1lc3BhY2UocGF0aCwga2V5KSwgcGF0aCwga2V5LCB2YWx1ZSwgc2hvdWxkUmVkYWN0LCAnbWVyZ2UnKTtcbiAgfVxuXG4gIHNldE9iamVjdChcbiAgICBwYXRoOiBzdHJpbmdbXSxcbiAgICBrZXk6IHN0cmluZyxcbiAgICB2YWx1ZTogdW5rbm93bixcbiAgICBzaG91bGRSZWRhY3Q/OiBib29sZWFuLFxuICAgIGRlc2NyaXB0aW9uPzogc3RyaW5nLFxuICAgIG9wZXJhdGlvbk92ZXJyaWRlPzogJ3NldCcgfCAnZGVsZXRlJyxcbiAgKTogUmVkYWN0aW9uVmVyZGljdCB7XG4gICAgLy8gRXhwbGljaXQgZGVsZXRpb24gKFNjb3BlRmFjYWRlLmRlbGV0ZVZhbHVlKSBzdGFnZXMgYSBkaXN0aW5jdCBvcCBzb1xuICAgIC8vIGRlbHRhLW1vZGUgY29tbWl0cyAoIzEzYy1CKSBjYW4gZW1pdCBhIHJlYWwgYGRlbGV0ZWAgdHJhY2UgZW50cnkuXG4gICAgLy8gVW5kZXIgdGhlIGRlZmF1bHQgJ2Z1bGwnIG1vZGUgdGhlIGJ1ZmZlciBjb21taXRzIGl0IGFzIGFcbiAgICAvLyBzZXQtb2YtdW5kZWZpbmVkIOKAlCBieXRlLWlkZW50aWNhbCB0byB0aGUgaGlzdG9yaWNhbCBmbGF0dGVuaW5nLlxuICAgIGNvbnN0IHZlcmRpY3QgPVxuICAgICAgb3BlcmF0aW9uT3ZlcnJpZGUgPT09ICdkZWxldGUnXG4gICAgICAgID8gdGhpcy5zdGFnZVdyaXRlKHRoaXMud2l0aE5hbWVzcGFjZShwYXRoLCBrZXkpLCBwYXRoLCBrZXksIHVuZGVmaW5lZCwgc2hvdWxkUmVkYWN0LCAnZGVsZXRlJylcbiAgICAgICAgOiB0aGlzLnN0YWdlV3JpdGUodGhpcy53aXRoTmFtZXNwYWNlKHBhdGgsIGtleSksIHBhdGgsIGtleSwgdmFsdWUsIHNob3VsZFJlZGFjdCwgJ3NldCcpO1xuICAgIC8vIFRyYWNrIHVzZXItbGV2ZWwgd3JpdGUgKHByZS1uYW1lc3BhY2UpIGZvciBtZW1vcnkgdmlldyArIG9uQ29tbWl0IOKAlFxuICAgIC8vIHBvbGljeS1nYXRlZCAoIzEzYy1BKSwgc2VlIHRyYWNrV3JpdGUuXG4gICAgdGhpcy50cmFja1dyaXRlKHVzZXJLZXlPZihwYXRoLCBrZXkpLCB2YWx1ZSwgdmVyZGljdCwgb3BlcmF0aW9uT3ZlcnJpZGUgPz8gJ3NldCcpO1xuICAgIGlmIChkZXNjcmlwdGlvbikge1xuICAgICAgY29uc3QgdGFnZ2VkID0gZGVzY3JpcHRpb24uc3RhcnRzV2l0aCgnWycpID8gZGVzY3JpcHRpb24gOiBgW1dSSVRFXSAke2Rlc2NyaXB0aW9ufWA7XG4gICAgICB0aGlzLmRlYnVnLmFkZExvZygnbWVzc2FnZScsIHRhZ2dlZCk7XG4gICAgfVxuICAgIHJldHVybiB2ZXJkaWN0O1xuICB9XG5cbiAgdXBkYXRlT2JqZWN0KFxuICAgIHBhdGg6IHN0cmluZ1tdLFxuICAgIGtleTogc3RyaW5nLFxuICAgIHZhbHVlOiB1bmtub3duLFxuICAgIGRlc2NyaXB0aW9uPzogc3RyaW5nLFxuICAgIHNob3VsZFJlZGFjdD86IGJvb2xlYW4sXG4gICk6IFJlZGFjdGlvblZlcmRpY3Qge1xuICAgIGNvbnN0IHZlcmRpY3QgPSB0aGlzLm1lcmdlKHBhdGgsIGtleSwgdmFsdWUsIHNob3VsZFJlZGFjdCk7XG4gICAgLy8gVHJhY2sgdXNlci1sZXZlbCB3cml0ZSAocHJlLW5hbWVzcGFjZSkgZm9yIG1lbW9yeSB2aWV3ICsgb25Db21taXQg4oCUXG4gICAgLy8gcG9saWN5LWdhdGVkICgjMTNjLUEpLCBzZWUgdHJhY2tXcml0ZS5cbiAgICB0aGlzLnRyYWNrV3JpdGUodXNlcktleU9mKHBhdGgsIGtleSksIHZhbHVlLCB2ZXJkaWN0LCAndXBkYXRlJyk7XG4gICAgaWYgKGRlc2NyaXB0aW9uKSB7XG4gICAgICB0aGlzLmRlYnVnLmFkZExvZygnbWVzc2FnZScsIGRlc2NyaXB0aW9uKTtcbiAgICB9XG4gICAgcmV0dXJuIHZlcmRpY3Q7XG4gIH1cblxuICBzZXRSb290KGtleTogc3RyaW5nLCB2YWx1ZTogdW5rbm93bikge1xuICAgIHRoaXMucGF0Y2goW10sIGtleSwgdmFsdWUpO1xuICB9XG5cbiAgLyoqIFJvb3QtbGV2ZWwgKHVuLW5hbWVzcGFjZWQpIHdyaXRlIOKAlCB0aGUgc3ViZmxvdyBzZWVkIGFuZCBtZXJnZS1iYWNrIHBhdGguICovXG4gIHNldEdsb2JhbChrZXk6IHN0cmluZywgdmFsdWU6IHVua25vd24sIGRlc2NyaXB0aW9uPzogc3RyaW5nKSB7XG4gICAgdGhpcy5zdGFnZVdyaXRlKFtrZXldLCBbXSwga2V5LCB2YWx1ZSwgdW5kZWZpbmVkLCAnc2V0Jyk7XG4gICAgaWYgKGRlc2NyaXB0aW9uKSB7XG4gICAgICB0aGlzLmRlYnVnLmFkZExvZygnbWVzc2FnZScsIGRlc2NyaXB0aW9uKTtcbiAgICB9XG4gIH1cblxuICB1cGRhdGVHbG9iYWxDb250ZXh0KGtleTogc3RyaW5nLCB2YWx1ZTogdW5rbm93bikge1xuICAgIHRoaXMuc3RhZ2VXcml0ZShba2V5XSwgW10sIGtleSwgdmFsdWUsIHVuZGVmaW5lZCwgJ3NldCcpO1xuICB9XG5cbiAgYXBwZW5kVG9BcnJheShwYXRoOiBzdHJpbmdbXSwga2V5OiBzdHJpbmcsIGl0ZW1zOiB1bmtub3duW10sIGRlc2NyaXB0aW9uPzogc3RyaW5nKSB7XG4gICAgY29uc3QgZXhpc3RpbmcgPSB0aGlzLmdldFZhbHVlKHBhdGgsIGtleSk7XG4gICAgY29uc3QgbWVyZ2VkID0gQXJyYXkuaXNBcnJheShleGlzdGluZykgPyBbLi4uZXhpc3RpbmcsIC4uLml0ZW1zXSA6IFsuLi5pdGVtc107XG4gICAgdGhpcy5zZXRPYmplY3QocGF0aCwga2V5LCBtZXJnZWQsIGZhbHNlLCBkZXNjcmlwdGlvbik7XG4gIH1cblxuICBtZXJnZU9iamVjdChwYXRoOiBzdHJpbmdbXSwga2V5OiBzdHJpbmcsIG9iajogUmVjb3JkPHN0cmluZywgdW5rbm93bj4sIGRlc2NyaXB0aW9uPzogc3RyaW5nKSB7XG4gICAgY29uc3QgZXhpc3RpbmcgPSB0aGlzLmdldFZhbHVlKHBhdGgsIGtleSk7XG4gICAgY29uc3QgbWVyZ2VkID1cbiAgICAgIGV4aXN0aW5nICYmIHR5cGVvZiBleGlzdGluZyA9PT0gJ29iamVjdCcgJiYgIUFycmF5LmlzQXJyYXkoZXhpc3RpbmcpXG4gICAgICAgID8geyAuLi4oZXhpc3RpbmcgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pLCAuLi5vYmogfVxuICAgICAgICA6IHsgLi4ub2JqIH07XG4gICAgdGhpcy5zZXRPYmplY3QocGF0aCwga2V5LCBtZXJnZWQsIGZhbHNlLCBkZXNjcmlwdGlvbik7XG4gIH1cblxuICAvLyDilIDilIAgUmVhZCBvcGVyYXRpb25zIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG4gIC8qKiBCdWZmZXItYXdhcmUgcmVhZCwgbWlycm9yaW5nIHRoZSBlYWdlciBlbmdpbmUncyByZWFkIG9yZGVyIGJ5dGUtZm9yLWJ5dGU6XG4gICAqXG4gICAqICAgIDEuIHN0YWdlZCB3cml0ZXMgKyBmaXJzdC10b3VjaCBzbmFwc2hvdCDigJQgYGJ1ZmZlci5nZXRgIG92ZXIgaXRzXG4gICAqICAgICAgIHdvcmtpbmdDb3B5IHdoZW4gdGhlIGJ1ZmZlciBleGlzdHMsIGVsc2UgYG5hdGl2ZUdldGAgb3ZlciB0aGVcbiAgICogICAgICAgemVyby1jbG9uZSBzdGF0ZSB2aWV3ICh0aGUgYnVmZmVyJ3MgYmFzZSBJUyB0aGF0IHZpZXcsIHNvIHRoZSB0d29cbiAgICogICAgICAgdGllcnMgYWdyZWUgb24gY29udGVudCk7XG4gICAqICAgIDIuIExJVkUgc3RhdGUgdmlhIGBzaGFyZWRNZW1vcnkuZ2V0VmFsdWVgIGZvciBrZXlzIGFic2VudCBmcm9tIHRoZVxuICAgKiAgICAgICBzbmFwc2hvdCDigJQgaW5jbHVkaW5nIGl0cyBydW7ihpJnbG9iYWwgbmFtZXNwYWNlIGZhbGxiYWNrLiBUaGUgZWFnZXJcbiAgICogICAgICAgZW5naW5lIGhhZCB0aGlzIGV4YWN0IGxpdmUgZmFsbGJhY2sgZm9yIHNuYXBzaG90LW1pc3Npbmcga2V5cztcbiAgICogICAgICAgYnl0ZS1pZGVudGl0eSBvdmVyIHB1cml0eS5cbiAgICpcbiAgICogIFJlYWRzIG5ldmVyIGNvbnN0cnVjdCB0aGUgYnVmZmVyICgjMTMpOiBhIHN0YWdlIHRoYXQgbmV2ZXIgd3JpdGVzXG4gICAqICBwZXJmb3JtcyB6ZXJvIGNsb25lcyBvZiB0aGUgc2hhcmVkIHN0YXRlLiAqL1xuICBwcml2YXRlIHJlYWRTdGF0ZShwYXRoOiBzdHJpbmdbXSwga2V5Pzogc3RyaW5nKTogdW5rbm93biB7XG4gICAgY29uc3QgbmFtZXNwYWNlZCA9IHRoaXMud2l0aE5hbWVzcGFjZShwYXRoLCBrZXkgYXMgc3RyaW5nKTtcbiAgICBjb25zdCBmcm9tU25hcHNob3QgPSB0aGlzLmJ1ZmZlciA/IHRoaXMuYnVmZmVyLmdldChuYW1lc3BhY2VkKSA6IG5hdGl2ZUdldCh0aGlzLmZpcnN0VG91Y2hTdGF0ZSgpLCBuYW1lc3BhY2VkKTtcbiAgICBpZiAodHlwZW9mIGZyb21TbmFwc2hvdCAhPT0gJ3VuZGVmaW5lZCcpIHJldHVybiBmcm9tU25hcHNob3Q7XG4gICAgcmV0dXJuIHRoaXMuc2hhcmVkTWVtb3J5LmdldFZhbHVlKHRoaXMucnVuSWQsIHBhdGgsIGtleSk7XG4gIH1cblxuICAvKipcbiAgICogVHJhY2tlZCByZWFkLiBUaGUgcmV0dXJuZWQgdmFsdWUgaXMgQk9SUk9XRUQg4oCUIHNlZSB0aGUgY29udHJhY3Qgb25cbiAgICogYFNjb3BlRmFjYWRlLmdldFZhbHVlYC4gUmVhZC10cmFja2luZyBjb3N0IGlzIHBvbGljeS1nYXRlZCAoIzE0KTpcbiAgICogYCdmdWxsJ2AgY2xvbmVzIHRoZSB2YWx1ZSBpbnRvIGBfc3RhZ2VSZWFkc2AgKGhpc3RvcmljYWwgZGVmYXVsdCksXG4gICAqIGAnc3VtbWFyeSdgIHJlY29yZHMgYSBjaGVhcCBtYXJrZXIsIGAnb2ZmJ2AgcmVjb3JkcyBub3RoaW5nLlxuICAgKi9cbiAgZ2V0VmFsdWUocGF0aDogc3RyaW5nW10sIGtleT86IHN0cmluZywgZGVzY3JpcHRpb24/OiBzdHJpbmcpIHtcbiAgICBjb25zdCB2YWx1ZSA9IHRoaXMucmVhZFN0YXRlKHBhdGgsIGtleSk7XG4gICAgLy8gUGVyLXdyaXRlIHByb3ZlbmFuY2UgcmVnaXN0cnkgKCNQMSkg4oCUIGtleSBzdHJpbmdzIG9ubHksIGluZGVwZW5kZW50IG9mXG4gICAgLy8gdGhlIHJlYWRUcmFja2luZyByZXRlbnRpb24gZGlhbCAod2hpY2ggZ292ZXJucyBWQUxVRSByZXRlbnRpb24gYmVsb3cpLlxuICAgIGlmIChrZXkgIT09IHVuZGVmaW5lZCAmJiB0aGlzLndyaXRlUHJvdmVuYW5jZSA9PT0gJ3JlYWRzLXByZWZpeCcpIHtcbiAgICAgICh0aGlzLl9wcm92ZW5hbmNlUmVhZHMgPz89IG5ldyBTZXQoKSkuYWRkKHBhdGgubGVuZ3RoID4gMCA/IFsuLi5wYXRoLCBrZXldLmpvaW4oJy4nKSA6IGtleSk7XG4gICAgfVxuICAgIC8vIFRyYWNrIHVzZXItbGV2ZWwgcmVhZCAocHJlLW5hbWVzcGFjZSkgZm9yIG1lbW9yeSB2aWV3IOKAlCByZXRhaW5lZCB1bmRlclxuICAgIC8vIHRoZSBydWxlJ3MgdmVyZGljdCAoOS4xOS4wKTogYSByZWRhY3RlZCBrZXkgaXMgcmV0YWluZWQgYXMgdGhlXG4gICAgLy8gcGxhY2Vob2xkZXIsIGEgZmllbGQtbGV2ZWwga2V5IGFzIGEgc2NydWJiZWQgY2xvbmUsIG5ldmVyIHRoZSBzZWNyZXQuXG4gICAgLy8gTm8gcG9saWN5IGFuZCBubyBtYXJrcyDihpIgbm8gdmVyZGljdCBjYWxsLCBubyBhbGxvY2F0aW9uIChhY3RpdmVSdWxlKS5cbiAgICBpZiAoa2V5ICE9PSB1bmRlZmluZWQgJiYgdGhpcy5yZWFkVHJhY2tpbmcgIT09ICdvZmYnKSB7XG4gICAgICBjb25zdCBydWxlID0gdGhpcy5hY3RpdmVSdWxlKCk7XG4gICAgICBpZiAocGF0aC5sZW5ndGggPiAwKSAodGhpcy5fbmVzdGVkUmVhZHMgPz89IG5ldyBTZXQoKSkuYWRkKHVzZXJLZXlPZihwYXRoLCBrZXkpKTtcbiAgICAgIHRoaXMuX3N0YWdlUmVhZHNbdXNlcktleU9mKHBhdGgsIGtleSldID1cbiAgICAgICAgdmFsdWUgPT09IHVuZGVmaW5lZFxuICAgICAgICAgID8gdW5kZWZpbmVkXG4gICAgICAgICAgOiB0aGlzLnJldGFpbmVkRm9ybShcbiAgICAgICAgICAgICAgcnVsZSAhPT0gdW5kZWZpbmVkID8gcnVsZS52ZXJkaWN0QXQocGF0aCwga2V5KSA6IENMRUFSLFxuICAgICAgICAgICAgICB2YWx1ZSxcbiAgICAgICAgICAgICAgdGhpcy5yZWFkVHJhY2tpbmcsXG4gICAgICAgICAgICAgIHN1bW1hcml6ZVJlYWRWYWx1ZSxcbiAgICAgICAgICAgICk7XG4gICAgfVxuICAgIGlmIChkZXNjcmlwdGlvbikge1xuICAgICAgdGhpcy5kZWJ1Zy5hZGRMb2coJ21lc3NhZ2UnLCBgW1JFQURdICR7ZGVzY3JpcHRpb259YCk7XG4gICAgfVxuICAgIHJldHVybiB2YWx1ZTtcbiAgfVxuXG4gIC8qKiBSZWFkIHN0YXRlIHdpdGhvdXQgdHJhY2tpbmcgaW4gX3N0YWdlUmVhZHMgb3IgcGF5aW5nIHN0cnVjdHVyZWRDbG9uZSBjb3N0LlxuICAgKiAgVXNlZCBieSBTY29wZUZhY2FkZS5nZXRWYWx1ZVNpbGVudCgpIGZvciBhcnJheSBwcm94eSBpbnRlcm5hbCBvcGVyYXRpb25zLiAqL1xuICBnZXRWYWx1ZURpcmVjdChwYXRoOiBzdHJpbmdbXSwga2V5Pzogc3RyaW5nKTogdW5rbm93biB7XG4gICAgcmV0dXJuIHRoaXMucmVhZFN0YXRlKHBhdGgsIGtleSk7XG4gIH1cblxuICBnZXRSb290KGtleTogc3RyaW5nKSB7XG4gICAgcmV0dXJuIHRoaXMuc2hhcmVkTWVtb3J5LmdldFZhbHVlKHRoaXMucnVuSWQsIFtdLCBrZXkpO1xuICB9XG5cbiAgZ2V0R2xvYmFsKGtleTogc3RyaW5nKSB7XG4gICAgcmV0dXJuIHRoaXMuc2hhcmVkTWVtb3J5LmdldFZhbHVlKCcnLCBbXSwga2V5KTtcbiAgfVxuXG4gIGdldFNjb3BlKCk6IFJlY29yZDxzdHJpbmcsIHVua25vd24+IHtcbiAgICByZXR1cm4gdGhpcy5zaGFyZWRNZW1vcnkuZ2V0U3RhdGUoKTtcbiAgfVxuXG4gIGdldFJ1bklkKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMucnVuSWQ7XG4gIH1cblxuICAvLyDilIDilIAgQ29tbWl0IOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG4gIC8qKlxuICAgKiBSRkMtMDAzIEQyOiByZWNvcmQgdGhhdCB0aGlzIHN0YWdlIGNvbnN1bWVkIGFuIHVudHJhY2tlZCByZWFkIHBhdGguXG4gICAqIENhbGxlZCBieSBgU2NvcGVGYWNhZGVgIChgZ2V0QXJnc2AvYGdldEVudmAvdW5zaGFkb3dlZCBgZ2V0VmFsdWVTaWxlbnRgKTtcbiAgICogc3VyZmFjZWQgYXMgYENvbW1pdEJ1bmRsZS51bnRyYWNrZWRTb3VyY2VzYCBvbiB0aGlzIHN0YWdlJ3MgY29tbWl0LlxuICAgKi9cbiAgbWFya1VudHJhY2tlZFNvdXJjZShzb3VyY2U6IFVudHJhY2tlZFNvdXJjZSk6IHZvaWQge1xuICAgICh0aGlzLl91bnRyYWNrZWRTb3VyY2VzID8/PSBuZXcgU2V0KCkpLmFkZChzb3VyY2UpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJGQy0wMDMgRDI6IHRoZSBgdW50cmFja2VkU291cmNlc2AgYnVuZGxlIGZyYWdtZW50IGZvciBjb21taXQoKSDigJQgYHt9YFxuICAgKiB3aGVuIG5vdGhpbmcgd2FzIG1hcmtlZCwgc28gdGhlIHNwcmVhZCBrZWVwcyB0aGUgZmllbGQgQUJTRU5UIChub3RcbiAgICogZW1wdHktYXJyYXktdmFsdWVkKSBhbmQgdW50b3VjaGVkIGNoYXJ0cyBzdGF5IGJ5dGUtaWRlbnRpY2FsLlxuICAgKi9cbiAgcHJpdmF0ZSB1bnRyYWNrZWRTb3VyY2VzRnJhZ21lbnQoKTogeyB1bnRyYWNrZWRTb3VyY2VzPzogVW50cmFja2VkU291cmNlW10gfSB7XG4gICAgaWYgKCF0aGlzLl91bnRyYWNrZWRTb3VyY2VzIHx8IHRoaXMuX3VudHJhY2tlZFNvdXJjZXMuc2l6ZSA9PT0gMCkgcmV0dXJuIHt9O1xuICAgIHJldHVybiB7IHVudHJhY2tlZFNvdXJjZXM6IFsuLi50aGlzLl91bnRyYWNrZWRTb3VyY2VzXSB9O1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBgdGFnc2AgYnVuZGxlIGZyYWdtZW50IGZvciBjb21taXQoKSDigJQgYHt9YCB3aGVuIHRoZSBzdGFnZSBkZWNsYXJlc1xuICAgKiBub25lLCBzbyBhbiB1bnRhZ2dlZCBjaGFydCdzIGxvZyBpcyBieXRlLWlkZW50aWNhbCB0byA5LjIwLjAuIEFkZGVkIGFmdGVyXG4gICAqIHRoZSBwYXlsb2FkIGVuY29kaW5nLCBzbyBpdCBpcyBpbmRlcGVuZGVudCBvZiBgY29tbWl0VmFsdWVzYDsgbmFtZXMsIHNvXG4gICAqIHJlZGFjdGlvbiBuZXZlciBzZWVzIGl0LlxuICAgKi9cbiAgcHJpdmF0ZSB0YWdzRnJhZ21lbnQoKTogeyB0YWdzPzogcmVhZG9ubHkgc3RyaW5nW10gfSB7XG4gICAgaWYgKCF0aGlzLnRhZ3MgfHwgdGhpcy50YWdzLmxlbmd0aCA9PT0gMCkgcmV0dXJuIHt9O1xuICAgIHJldHVybiB7IHRhZ3M6IHRoaXMudGFncyB9O1xuICB9XG5cbiAgLyoqIFJlZ2lzdGVyIGFuIG9ic2VydmVyIHRoYXQgZmlyZXMgYWZ0ZXIgY29tbWl0KCkgYXBwbGllcyBwYXRjaGVzLlxuICAgKiAgVXNlZCBieSBTY29wZUZhY2FkZSB0byBkaXNwYXRjaCBTY29wZVJlY29yZGVyLm9uQ29tbWl0IGV2ZW50cy4gKi9cbiAgc2V0Q29tbWl0T2JzZXJ2ZXIoXG4gICAgb2JzZXJ2ZXI6IChtdXRhdGlvbnM6IFJlY29yZDxzdHJpbmcsIHsgdmFsdWU6IHVua25vd247IG9wZXJhdGlvbjogJ3NldCcgfCAndXBkYXRlJyB8ICdkZWxldGUnIH0+KSA9PiB2b2lkLFxuICApOiB2b2lkIHtcbiAgICB0aGlzLl9jb21taXRPYnNlcnZlciA9IG9ic2VydmVyO1xuICB9XG5cbiAgLyoqXG4gICAqIERldi1tb2RlIG9ubHk6IGRpZCB0aGlzIHN0YWdlIGNoYW5nZSwgSU4gUExBQ0UsIGEgdmFsdWUgaXQgbWVyZWx5IFJFQUQ/XG4gICAqXG4gICAqIFRoZSB0eXBlZCBzY29wZSBpbnRlcmNlcHRzIGV2ZXJ5IHdyaXRlIGl0IGNhbiByZWFjaCDigJQgYSBwcm9wZXJ0eSBhdCBhbnlcbiAgICogZGVwdGgsIGFuIGluZGV4ZWQgZWxlbWVudCwgYW4gYXJyYXkgbWV0aG9kLiBXaGF0IGl0IGNhbm5vdCByZWFjaCBpcyBhblxuICAgKiBlbGVtZW50IGhhbmRlZCBvdXQgYnkgYSByZWFkIG1ldGhvZCAoYGZpbmRgLCBgZmlsdGVyYCwgYGZvcuKApm9mYCxcbiAgICogYGZvckVhY2hgLCBkZXN0cnVjdHVyaW5nKTogd3JhcHBpbmcgdGhvc2Ugd291bGQgbWVhbiByZXR1cm5pbmcgcHJveGllcyBvdXRcbiAgICogb2YgZXZlcnkgcmVhZCwgd2hpY2ggaXMgYSBjb3N0IHRoZSBsaWJyYXJ5IHNob3VsZCBub3QgcGF5LiBTbyB0aGF0IGZhbWlseVxuICAgKiBpcyBXQVJORUQgQUJPVVQgcmF0aGVyIHRoYW4gaW50ZXJjZXB0ZWQg4oCUIGxvdWRseSwgaGVyZSwgaW5zdGVhZCBvZiBlbmRpbmdcbiAgICogdGhlIHJ1biB3aXRoIGEgY29tbWl0IGxvZyB0aGF0IHNpbGVudGx5IGRpc2FncmVlcyB3aXRoIGZpbmFsIHN0YXRlLlxuICAgKlxuICAgKiBUaGlzIGlzIGEgUkVQT1JUIGFmdGVyIHRoZSBmYWN0LCBub3QgYSByZWZ1c2FsIGF0IHRoZSB3cml0ZTogdGhlIHdyaXRlIGhhc1xuICAgKiBhbHJlYWR5IGhhcHBlbmVkIGluIHBsYWNlIGFuZCB0aGVyZSBpcyBub3RoaW5nIHRvIGludGVyY2VwdC4gSXQgcnVucyB1bmRlclxuICAgKiBUV08gcHJlY29uZGl0aW9ucywgYm90aCBuYW1lZCBpbiB0aGUgUkVBRE1FIOKAlCBgZW5hYmxlRGV2TW9kZSgpYCwgYW5kXG4gICAqIGByZWFkVHJhY2tpbmc6ICdmdWxsJ2AgKHRoZSBkZWZhdWx0KSwgYmVjYXVzZSB0aGUgY29tcGFyaXNvbiBuZWVkcyB0aGVcbiAgICogY2xvbmUgb2YgdGhlIHZhbHVlIHRoYXQgbW9kZSByZXRhaW5zIGF0IHJlYWQgdGltZS4gQSBrZXkgdGhlIHN0YWdlIG5ldmVyXG4gICAqIHN0YWdlZCBtdXN0IHN0aWxsIGhvbGQgdGhhdCBjbG9uZSDigJQgY29tbWl0dGVkIHN0YXRlIGlzIGltbXV0YWJsZS1hZnRlci1zd2FwXG4gICAqIGFuZCB0aGUgYnVmZmVyJ3Mgd29ya2luZyBjb3B5IGlzIHByaXZhdGUgdG8gdGhpcyBzdGFnZS4gS2V5cyB0aGUgc3RhZ2UgRElEXG4gICAqIHN0YWdlIGFyZSBza2lwcGVkICh0aGV5IGFyZSBleHBlY3RlZCB0byBkaWZmZXIsIGFuZCB0aGV5IGFyZSBpbiB0aGUgcmVjb3JkKSxcbiAgICogc28gYXJlIGtleXMgdW5kZXIgYSByZWRhY3Rpb24gdmVyZGljdCwgd2hvc2UgcmV0YWluZWQgZm9ybSBpcyBkZWxpYmVyYXRlbHlcbiAgICogbm90IHRoZSB2YWx1ZSwgYW5kIHNvIGFyZSBrZXlzIHJlYWQgYXQgYSBuZXN0ZWQgcGF0aCAoYF9uZXN0ZWRSZWFkc2ApIOKAlFxuICAgKiB0aG9zZSBhcmUgZW5naW5lIHJlYWRzICh0aGUgc3ViZmxvdyBtZXJnZS1iYWNrKSwgbm90IHVzZXIgcmVhZHMuXG4gICAqXG4gICAqIEl0IGFsc28gb25seSBsb29rcyBhdCBrZXlzIHNlcnZlZCBmcm9tIHRoZSBQSU5ORUQgc291cmNlIOKAlCB0aGUgZmlyc3QtdG91Y2hcbiAgICogdmlldyBvciB0aGlzIHN0YWdlJ3Mgb3duIGJ1ZmZlci4gQSBrZXkgYWJzZW50IGZyb20gYm90aCB3YXMgc2VydmVkIGJ5XG4gICAqIGByZWFkU3RhdGVgJ3MgbGl2ZSBmYWxsYmFjaywgd2hpY2ggYSBwYXJhbGxlbCBzaWJsaW5nJ3Mgcm9vdC1rZXkgY29tbWl0IGNhblxuICAgKiBsZWdpdGltYXRlbHkgbW92ZTsgYWNjdXNpbmcgdGhlIHN0YWdlIHRoZXJlIHdvdWxkIGJlIGEgZmFsc2UgYWxhcm0uIEZvclxuICAgKiB0aGUgc2FtZSByZWFzb24gaXQgcnVucyBvbiB0aGUgZnJhbWUncyBGSVJTVCBjb21taXQgb25seTogdGhlIHJlYWRzIGJlbG9uZ1xuICAgKiB0byB0aGF0IHJvdW5kLCBhbmQgYnkgdGhlIGVuZ2luZSdzIHNlY29uZCByb3VuZCAoYSBmb3JrIGRvdWJsZS1jb21taXQsIGFcbiAgICogc3ViZmxvdyBtZXJnZS1iYWNrIGludG8gYSBjb21taXR0ZWQgYnJhbmNoIHBhcmVudCkgb3RoZXIgc3RhZ2VzIGhhdmVcbiAgICogbGVnaXRpbWF0ZWx5IG1vdmVkIHRoZSBzdGF0ZSB0aGV5IHdlcmUgY29tcGFyZWQgYWdhaW5zdC5cbiAgICpcbiAgICogQ29zdHMgbm90aGluZyBvdXRzaWRlIGBlbmFibGVEZXZNb2RlKClgLlxuICAgKi9cbiAgcHJpdmF0ZSB3YXJuT25Cb3Jyb3dlZE11dGF0aW9uKCk6IHZvaWQge1xuICAgIGlmICghaXNEZXZNb2RlKCkgfHwgdGhpcy5yZWFkVHJhY2tpbmcgIT09ICdmdWxsJyB8fCB0aGlzLl9jb21taXR0ZWQpIHJldHVybjtcbiAgICBjb25zdCBydWxlID0gdGhpcy5hY3RpdmVSdWxlKCk7XG4gICAgZm9yIChjb25zdCBrZXkgb2YgT2JqZWN0LmtleXModGhpcy5fc3RhZ2VSZWFkcykpIHtcbiAgICAgIGNvbnN0IHJldGFpbmVkID0gdGhpcy5fc3RhZ2VSZWFkc1trZXldO1xuICAgICAgLy8gT25seSBhIGNvbnRhaW5lciBjYW4gYmUgbXV0YXRlZCBpbiBwbGFjZTsgYSBwcmltaXRpdmUgcmVhZCBjYW5ub3QuXG4gICAgICBpZiAocmV0YWluZWQgPT09IG51bGwgfHwgdHlwZW9mIHJldGFpbmVkICE9PSAnb2JqZWN0JykgY29udGludWU7XG4gICAgICBpZiAodGhpcy5fbmVzdGVkUmVhZHM/LmhhcyhrZXkpKSBjb250aW51ZTtcbiAgICAgIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwodGhpcy5fc3RhZ2VXcml0ZXMsIGtleSkpIGNvbnRpbnVlO1xuICAgICAgY29uc3QgbmFtZXNwYWNlZCA9IHRoaXMud2l0aE5hbWVzcGFjZShbXSwga2V5KTtcbiAgICAgIGlmICh0aGlzLmJ1ZmZlcj8ud2FzU3RhZ2VkKG5hbWVzcGFjZWQpKSBjb250aW51ZTtcbiAgICAgIGlmIChydWxlICE9PSB1bmRlZmluZWQgJiYgcnVsZS52ZXJkaWN0QXQoW10sIGtleSkua2luZCAhPT0gJ2NsZWFyJykgY29udGludWU7XG5cbiAgICAgIC8vIFRoZSBwaW5uZWQgc291cmNlIG9ubHkg4oCUIHNlZSB0aGUgbm90ZSBvbiB0aGUgbGl2ZSBmYWxsYmFjayBhYm92ZS5cbiAgICAgIGNvbnN0IGN1cnJlbnQgPSB0aGlzLmJ1ZmZlciA/IHRoaXMuYnVmZmVyLmdldChuYW1lc3BhY2VkKSA6IG5hdGl2ZUdldCh0aGlzLmZpcnN0VG91Y2hTdGF0ZSgpLCBuYW1lc3BhY2VkKTtcbiAgICAgIGlmIChjdXJyZW50ID09PSB1bmRlZmluZWQpIGNvbnRpbnVlO1xuXG4gICAgICBjb25zdCBwYXRoID0gZmlyc3REaWZmZXJpbmdQYXRoKHJldGFpbmVkLCBjdXJyZW50KTtcbiAgICAgIGlmIChwYXRoID09PSB1bmRlZmluZWQpIGNvbnRpbnVlO1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWNvbnNvbGVcbiAgICAgIGNvbnNvbGUud2Fybihib3Jyb3dlZE11dGF0aW9uTWVzc2FnZSh0aGlzLnN0YWdlTmFtZSwga2V5LCBwYXRoKSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEZsdXNoIHN0YWdlZCB3cml0ZXMgdG8gc2hhcmVkIG1lbW9yeSBhbmQgUkVMRUFTRSB0aGUgcGVyLXN0YWdlIHN0YWdpbmdcbiAgICogc3RhdGUgKCMxM2IpLlxuICAgKlxuICAgKiBDb21taXQgaXMgdGhlIHN0YWdlJ3MgbGlmZWN5Y2xlIGVuZDogYGJ1ZmZlcmAgKDIgZnVsbC1zdGF0ZSBjbG9uZXMpIGFuZFxuICAgKiBgc3RhdGVWaWV3YCAoYSByZWZlcmVuY2UgdGhhdCBwaW5zIG9uZSBmdWxsIGNvbW1pdHRlZC1zdGF0ZSBHRU5FUkFUSU9OIOKAlFxuICAgKiBgYXBwbHlTbWFydE1lcmdlYCBjbG9uZXMgKyBzd2FwcyB0aGUgd2hvbGUgc3RhdGUgcGVyIGNvbW1pdCwgc28gZXZlcnlcbiAgICogc3RhZ2UncyB2aWV3IGlzIGEgZGlzdGluY3Qgb2JqZWN0KSBhcmUgb25seSBuZWVkZWQgRFVSSU5HIGV4ZWN1dGlvbiwgYXNcbiAgICogdGhlIHJlYWQgc25hcHNob3QgKyBuZXQtY2hhbmdlIGRpZmYgYmFzZS4gVGhlIGV4ZWN1dGlvbiB0cmVlIHJldGFpbnNcbiAgICogZXZlcnkgU3RhZ2VDb250ZXh0IGZvciB0aGUgbGlmZXRpbWUgb2YgdGhlIHJ1biwgc28gV0lUSE9VVCB0aGUgcmVsZWFzZVxuICAgKiBhIGxvbmcgbG9vcCByZXRhaW5zIG9uZSBzdGF0ZSBnZW5lcmF0aW9uICsgdHdvIGNsb25lcyBwZXIgZXhlY3V0ZWRcbiAgICogc3RhZ2Ug4oCUIG1lYXN1cmVkIE8oTsKyKTogNTYzLjhNQiBhdCBOPTIwMCBvbiBhbiBhZ2VudC1zdHlsZSBjaGFydDsgYVxuICAgKiA1MDAtaXRlcmF0aW9uIGFnZW50IE9PTWVkIGEgZGVmYXVsdCBOb2RlIGhlYXAgKGJhY2tsb2cgIzE4KS5cbiAgICpcbiAgICogUkUtVVNFIEFGVEVSIENPTU1JVCBzdGF5cyBjb3JyZWN0IGJlY2F1c2UgYm90aCBmaWVsZHMgcmUtY3JlYXRlIGxhemlseTpcbiAgICogLSBhIGxhdGVyIFJFQUQgcmUtYW5jaG9ycyB2aWEge0BsaW5rIGZpcnN0VG91Y2hTdGF0ZX0gb24gdGhlIENVUlJFTlRcbiAgICogICBjb21taXR0ZWQgc3RhdGUgKHdoaWNoIGluY2x1ZGVzIHRoaXMgc3RhZ2UncyBvd24gZmx1c2hlZCB3cml0ZXMpO1xuICAgKiAtIGEgbGF0ZXIgV1JJVEUgY29uc3RydWN0cyBhIGZyZXNoIGJ1ZmZlciBvbiB0aGF0IHJlLWFuY2hvcmVkIHZpZXcsIHNvIGFcbiAgICogICBzZWNvbmQgY29tbWl0IGRpZmZzIGFnYWluc3QgcG9zdC1maXJzdC1jb21taXQgc3RhdGUuIFRoZSBwcmUtcmVsZWFzZVxuICAgKiAgIGJ1ZmZlciBiZWhhdmVkIHRoZSBzYW1lIGZvciBWQUxVRVMgKGl0cyBgd29ya2luZ0NvcHlgIHdhcyByZXNldCBvblxuICAgKiAgIGNvbW1pdCwgZmFsbGluZyByZWFkcyB0aHJvdWdoIHRvIGxpdmUgc3RhdGUpIGJ1dCBrZXB0IHRoZSBPUklHSU5BTFxuICAgKiAgIGBiYXNlU25hcHNob3RgIGFzIGRpZmYgYmFzZSDigJQgdW5yZWFjaGFibGUgaW4gcHJhY3RpY2U6IHRoZSBlbmdpbmUnc1xuICAgKiAgIG9ubHkgd3JpdGVzIGFmdGVyIGEgY29tbWl0IGFyZSB0aGUgc3ViZmxvdyBtZXJnZS1iYWNrIGludG8gYSBjb21taXR0ZWRcbiAgICogICBicmFuY2ggcGFyZW50IChhIGRlY2lkZXIgb3IgZm9yayBmcmFtZSBjb21taXRzIGJlZm9yZSBpdHMgYnJhbmNoIHJ1bnMpXG4gICAqICAgYW5kIHRoZSBmb3JrIGNoaWxkJ3MgdGhyb3R0bGUgbWFya2VyOyB0aGUgb3RoZXIgXCJ3cml0ZSBhZnRlciBjb21taXRcIlxuICAgKiAgIHNpdGVzIChTdWJmbG93RXhlY3V0b3Igc2VlZCDihpIgcmVwbGFjZXMgdGhlIGNvbnRleHQ7IHJlc3VtZSDihpIgZnJlc2hcbiAgICogICBjb250ZXh0IHZpYSBgbGVhZi5jcmVhdGVOZXh0YCkgbmV2ZXIgcmUtdXNlIGEgY29tbWl0dGVkIGNvbnRleHQuXG4gICAqIC0gQSBVU0VSIGhhbmRsZSBoZWxkIHBhc3QgaXRzIHN0YWdlIGlzIGEgZGlmZmVyZW50IG1hdHRlcjogaXRzIHdyaXRlc1xuICAgKiAgIHdvdWxkIGxhbmQgaW4gYSBidWZmZXIgbm90aGluZyBldmVyIGNvbW1pdHMuIFRoYXQgcmVmdXNhbCBsaXZlcyBvbiB0aGVcbiAgICogICBzY29wZSB0aWVyIChgU2NvcGVGYWNhZGVgLCBzZWFsZWQgYnkgdGhlIGNvbW1pdCBvYnNlcnZlciDigJQgOS4yMi4wKSxcbiAgICogICBiZWNhdXNlIHRoZSBmcmFtZSdzIHJlLXVzYWJpbGl0eSBpcyBleGFjdGx5IHdoYXQgdGhlIGVuZ2luZSBwYXRoc1xuICAgKiAgIGFib3ZlIG5lZWQuXG4gICAqIC0gYF9zdGFnZVdyaXRlc2AgLyBgX3N0YWdlUmVhZHNgIGFyZSBOT1QgcmVsZWFzZWQg4oCUIGBzbmFwc2hvdFNlbGYoKWBcbiAgICogICByZWFkcyB0aGVtIHBvc3QtcnVuIGZvciB0aGUgZXhlY3V0aW9uLXRyZWUgc25hcHNob3QuXG4gICAqL1xuICBjb21taXQoKTogdm9pZCB7XG4gICAgdGhpcy5tYXRlcmlhbGlzZVdyaXRlcygpO1xuICAgIHRoaXMud2Fybk9uQm9ycm93ZWRNdXRhdGlvbigpO1xuICAgIGlmICghdGhpcy5idWZmZXIpIHtcbiAgICAgIC8vIFRydWx5LWxhenkgZmFzdCBwYXRoICgjMTMpOiBubyB3cml0ZSBldmVyIGNvbnN0cnVjdGVkIHRoZSBidWZmZXIsIHNvXG4gICAgICAvLyB0aGUgc3RhZ2UncyBuZXQgY2hhbmdlIGlzIGVtcHR5IEJZIENPTlNUUlVDVElPTi4gU2FtZSBvYnNlcnZhYmxlXG4gICAgICAvLyBvdXRjb21lIGFzIGFuIGVtcHR5IGNvbW1pdCDigJQgdGhlIChlbXB0eSkgYnVuZGxlIGlzIHN0aWxsIHJlY29yZGVkIHNvXG4gICAgICAvLyBldmVyeSBleGVjdXRlZCBzdGFnZSByZW1haW5zIGEgdGltZS10cmF2ZWwgY3Vyc29yIHN0b3Ag4oCUIGJ1dCB3aXRoXG4gICAgICAvLyBaRVJPIGNsb25lczogbm8gYnVmZmVyIGNvbnN0cnVjdGlvbiwgbm8gYXBwbHlQYXRjaCByZXBsYXkuXG4gICAgICB0aGlzLmV2ZW50TG9nPy5yZWNvcmQoe1xuICAgICAgICBvdmVyd3JpdGU6IHt9LFxuICAgICAgICB1cGRhdGVzOiB7fSxcbiAgICAgICAgcmVkYWN0ZWRQYXRoczogW10sXG4gICAgICAgIHRyYWNlOiBbXSxcbiAgICAgICAgc3RhZ2U6IHRoaXMuc3RhZ2VOYW1lLFxuICAgICAgICBzdGFnZUlkOiB0aGlzLnN0YWdlSWQsXG4gICAgICAgIHJ1bnRpbWVTdGFnZUlkOiB0aGlzLnJ1bnRpbWVTdGFnZUlkLFxuICAgICAgICAuLi50aGlzLnVudHJhY2tlZFNvdXJjZXNGcmFnbWVudCgpLFxuICAgICAgICAuLi50aGlzLnRhZ3NGcmFnbWVudCgpLFxuICAgICAgfSk7XG4gICAgICBpZiAodGhpcy5fY29tbWl0T2JzZXJ2ZXIpIHtcbiAgICAgICAgdGhpcy5fY29tbWl0T2JzZXJ2ZXIoeyAuLi50aGlzLl9zdGFnZVdyaXRlcyB9KTtcbiAgICAgIH1cbiAgICAgIC8vICMxM2I6IGRyb3AgdGhlIGZpcnN0LXRvdWNoIHZpZXcg4oCUIGEgcmVhZC1vbmx5IHN0YWdlIHN0aWxsIHBpbm5lZCBvbmVcbiAgICAgIC8vIGZ1bGwgc3RhdGUgZ2VuZXJhdGlvbiB0aHJvdWdoIGl0LiBEMiBtYXJrZXJzIHJlbGVhc2Ugd2l0aCBpdCwgYW5kIHNvXG4gICAgICAvLyBkbyB0aGUgZGVjbGFyZWQgdGFncyAoYW4gZW1wdHkgY29tbWl0IGlzIGEgZGVsaWJlcmF0ZSwgdGFnZ2VkIHN0b3Ag4oCUXG4gICAgICAvLyBvbmNlKS5cbiAgICAgIHRoaXMuc3RhdGVWaWV3ID0gdW5kZWZpbmVkO1xuICAgICAgdGhpcy5fdW50cmFja2VkU291cmNlcyA9IHVuZGVmaW5lZDtcbiAgICAgIHRoaXMudGFncyA9IHVuZGVmaW5lZDtcbiAgICAgIHRoaXMuX2NvbW1pdHRlZCA9IHRydWU7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgYnVuZGxlID0gdGhpcy5idWZmZXIuY29tbWl0KCk7XG4gICAgY29uc3QgY29tbWl0QnVuZGxlID0ge1xuICAgICAgLi4uYnVuZGxlLFxuICAgICAgc3RhZ2U6IHRoaXMuc3RhZ2VOYW1lLFxuICAgICAgc3RhZ2VJZDogdGhpcy5zdGFnZUlkLFxuICAgICAgcnVudGltZVN0YWdlSWQ6IHRoaXMucnVudGltZVN0YWdlSWQsXG4gICAgICAuLi50aGlzLnVudHJhY2tlZFNvdXJjZXNGcmFnbWVudCgpLFxuICAgICAgLi4udGhpcy50YWdzRnJhZ21lbnQoKSxcbiAgICB9O1xuXG4gICAgdGhpcy5zaGFyZWRNZW1vcnkuYXBwbHlQYXRjaChjb21taXRCdW5kbGUub3ZlcndyaXRlLCBjb21taXRCdW5kbGUudXBkYXRlcywgY29tbWl0QnVuZGxlLnRyYWNlKTtcblxuICAgIC8vIEFscmVhZHktY29tcHV0ZWQgcmVkYWN0ZWQgcGF0Y2hlcyBmZWVkIHRocmVlIGNvbnN1bWVyczpcbiAgICAvLyAgIDEuIHRoZSBwYXJhbGxlbCByZWRhY3RlZCBtaXJyb3IgKGlmIGVuYWJsZWQpXG4gICAgLy8gICAyLiB0aGUgZXZlbnQgbG9nIChwZXJzaXN0ZWQgdHJhY2UpXG4gICAgLy8gICAzLiAoZnV0dXJlKSBhbnl0aGluZyBlbHNlIHRoYXQgd2FudHMgYSBzY3J1YmJlZCB2aWV3IGF0IGNvbW1pdCB0aW1lXG4gICAgLy8gQ29tcHV0aW5nIG9uY2Uga2VlcHMgY29zdCBsaW5lYXIgaW4gdGhlIGNvbW1pdCBzaXplOyBubyBwb3N0LXBhc3Mgd2Fsay5cbiAgICBjb25zdCByZWRhY3RlZE92ZXJ3cml0ZSA9IHJlZGFjdFBhdGNoKGNvbW1pdEJ1bmRsZS5vdmVyd3JpdGUsIGNvbW1pdEJ1bmRsZS5yZWRhY3RlZFBhdGhzKTtcbiAgICBjb25zdCByZWRhY3RlZFVwZGF0ZXMgPSByZWRhY3RQYXRjaChjb21taXRCdW5kbGUudXBkYXRlcywgY29tbWl0QnVuZGxlLnJlZGFjdGVkUGF0aHMpO1xuXG4gICAgdGhpcy5yZWRhY3RlZFNoYXJlZE1lbW9yeT8uYXBwbHlQYXRjaChyZWRhY3RlZE92ZXJ3cml0ZSwgcmVkYWN0ZWRVcGRhdGVzLCBjb21taXRCdW5kbGUudHJhY2UpO1xuXG4gICAgdGhpcy5ldmVudExvZz8ucmVjb3JkKHtcbiAgICAgIC4uLmNvbW1pdEJ1bmRsZSxcbiAgICAgIHJlZGFjdGVkUGF0aHM6IEFycmF5LmZyb20oY29tbWl0QnVuZGxlLnJlZGFjdGVkUGF0aHMudmFsdWVzKCkpLFxuICAgICAgb3ZlcndyaXRlOiByZWRhY3RlZE92ZXJ3cml0ZSxcbiAgICAgIHVwZGF0ZXM6IHJlZGFjdGVkVXBkYXRlcyxcbiAgICB9KTtcblxuICAgIC8vIE5vdGlmeSBvYnNlcnZlciAoU2NvcGVGYWNhZGUpIHdpdGggdHJhY2tlZCBtdXRhdGlvbnNcbiAgICBpZiAodGhpcy5fY29tbWl0T2JzZXJ2ZXIpIHtcbiAgICAgIHRoaXMuX2NvbW1pdE9ic2VydmVyKHsgLi4udGhpcy5fc3RhZ2VXcml0ZXMgfSk7XG4gICAgfVxuXG4gICAgLy8gIzEzYjogcmVsZWFzZSB0aGUgc3RhZ2luZyBzdGF0ZSDigJQgc2VlIHRoZSBtZXRob2QgSlNEb2MuIERvbmUgTEFTVCBzb1xuICAgIC8vIHRoZSBjb21taXQgb2JzZXJ2ZXIgc2VlcyB0aGUgZXhhY3Qgc2FtZSB3b3JsZCBhcyBiZWZvcmUgdGhlIHJlbGVhc2UuXG4gICAgLy8gRDIncyB1bnRyYWNrZWQtc291cmNlIG1hcmtlcnMgcmVsZWFzZSB3aXRoIGl0OiB0aGUgcm91dGluZVxuICAgIC8vIGRvdWJsZS1jb21taXQgcGF0aHMgdGhlbiByZWNvcmQgdGhlIGZpZWxkIGV4YWN0bHkgb25jZS4gRGVjbGFyZWQgdGFnc1xuICAgIC8vIHJlbGVhc2Ugb24gdGhlIHNhbWUgbGF3OiBvbmUgc3RhbXAgcGVyIGV4ZWN1dGlvbiBvZiB0aGUgc3RhZ2UuXG4gICAgdGhpcy5idWZmZXIgPSB1bmRlZmluZWQ7XG4gICAgdGhpcy5zdGF0ZVZpZXcgPSB1bmRlZmluZWQ7XG4gICAgdGhpcy5fdW50cmFja2VkU291cmNlcyA9IHVuZGVmaW5lZDtcbiAgICB0aGlzLnRhZ3MgPSB1bmRlZmluZWQ7XG4gICAgdGhpcy5fY29tbWl0dGVkID0gdHJ1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaHJvdyBhd2F5IGV2ZXJ5dGhpbmcgdGhpcyBzdGFnZSBoYXMgU1RBR0VELCB3aXRob3V0IGNvbW1pdHRpbmcgYW55IG9mIGl0LlxuICAgKlxuICAgKiBUaGUgaXNvbGF0aW9uIHByaW1pdGl2ZSBiZWhpbmQgZGVjbGFyYXRpdmUgcmV0cnk6IHdoZW4gYSBub24tZmluYWwgYXR0ZW1wdFxuICAgKiBmYWlscywgdGhlIHdyaXRlcyBpdCBzdGFnZWQgbXVzdCBub3QgYmUgdmlzaWJsZSB0byB0aGUgbmV4dCBhdHRlbXB0LCBtdXN0XG4gICAqIG5vdCByZWFjaCBzaGFyZWQgc3RhdGUsIGFuZCBtdXN0IG5vdCBhcHBlYXIgaW4gdGhlIGNvbW1pdCBsb2cgb3IgaW4gdGhpc1xuICAgKiBzdGFnZSdzIHNuYXBzaG90LiBEcm9wcGluZyB0aGUgc3RhZ2luZyBzdGF0ZSBhY2hpZXZlcyBhbGwgZm91ciBhdCBvbmNlIOKAlFxuICAgKiB0aGVyZSBpcyBubyByb2xsYmFjayBtYWNoaW5lcnkgdG8gaW52b2tlIGJlY2F1c2Ugbm90aGluZyB3YXMgZXZlciBhcHBsaWVkXG4gICAqIChNMTogdGhlIHRyYW5zYWN0aW9uIGJ1ZmZlciBob2xkcyB3cml0ZXMgdW50aWwgYGNvbW1pdCgpYCBmbHVzaGVzIHRoZW0pLlxuICAgKlxuICAgKiBXaGF0IGlzIHJlbGVhc2VkLCBhbmQgd2h5IGVhY2ggb25lIG1hdHRlcnMgZm9yIHRoZSBuZXh0IGF0dGVtcHQ6XG4gICAqICAtIGBidWZmZXJgICAgICAg4oCUIHRoZSBzdGFnZWQgd3JpdGVzIHRoZW1zZWx2ZXM7IHRoZSBuZXh0IGF0dGVtcHQgc3RhcnRzXG4gICAqICAgICAgICAgICAgICAgICAgICB3aXRoIG5vdGhpbmcgc3RhZ2VkO1xuICAgKiAgLSBgc3RhdGVWaWV3YCAgIOKAlCB0aGUgZmlyc3QtdG91Y2ggYW5jaG9yOyB0aGUgbmV4dCBhdHRlbXB0IHJlLWFuY2hvcnMgb25cbiAgICogICAgICAgICAgICAgICAgICAgIGNvbW1pdHRlZCBzdGF0ZSBhcyBpdCBzdGFuZHMgTk9XIChhIHNpYmxpbmcgZm9yayBicmFuY2hcbiAgICogICAgICAgICAgICAgICAgICAgIG1heSBsZWdpdGltYXRlbHkgaGF2ZSBjb21taXR0ZWQgaW4gYmV0d2Vlbik7XG4gICAqICAtIGBfc3RhZ2VXcml0ZXNgIC8gYF9wZW5kaW5nV3JpdGVzYCAvIGBfc3RhZ2VSZWFkc2Ag4oCUIHRoZSBzbmFwc2hvdFxuICAgKiAgICAgICAgICAgICAgICAgICAgcGF5bG9hZDsgd2l0aG91dCB0aGUgcmVzZXQgdGhlIGV4ZWN1dGlvbiB0cmVlIHdvdWxkXG4gICAqICAgICAgICAgICAgICAgICAgICByZXBvcnQgd3JpdGVzIHRoYXQgd2VyZSBkaXNjYXJkZWQsIHdoaWNoIGlzIHRoZSBleGFjdFxuICAgKiAgICAgICAgICAgICAgICAgICAgbGllIHRoaXMgZmVhdHVyZSBleGlzdHMgdG8gcHJldmVudCAodGhlIHBlbmRpbmcgbWFwXG4gICAqICAgICAgICAgICAgICAgICAgICBob2xkcyBiYXJlIHJlZmVyZW5jZXMg4oCUIGRyb3BwaW5nIGl0IHVuLWNsb25lcyBub3RoaW5nKTtcbiAgICogIC0gYF9wcm92ZW5hbmNlUmVhZHNgIOKAlCB0aGUgcGVyLXdyaXRlIHJlYWQgcHJlZml4ICgjUDEpOyBhIGRpc2NhcmRlZFxuICAgKiAgICAgICAgICAgICAgICAgICAgYXR0ZW1wdCdzIHJlYWRzIG11c3QgbmV2ZXIgYXBwZWFyIGluIHRoZSBuZXh0IGF0dGVtcHQnc1xuICAgKiAgICAgICAgICAgICAgICAgICAgYFRyYWNlRW50cnkucmVhZEtleXNgLCBvciBhIGJhY2t3YXJkIHNsaWNlIHdvdWxkIGZvbGxvd1xuICAgKiAgICAgICAgICAgICAgICAgICAgYW4gZWRnZSB0aGF0IG5vIGNvbW1pdHRlZCB3cml0ZSBldmVyIGhhZDtcbiAgICogIC0gYF91bnRyYWNrZWRTb3VyY2VzYCDigJQgdGhlIEQyIGhvbmVzdHkgbWFya2VycywgcmVsZWFzZWQgd2l0aCB0aGUgcmVzdC5cbiAgICpcbiAgICogV2hhdCBpcyBkZWxpYmVyYXRlbHkgS0VQVDogYGRlYnVnYCAobG9ncywgbWV0cmljcywgZXJyb3JzLCBmbG93IG1lc3NhZ2VzKS5cbiAgICogRGlhZ25vc3RpY3MgYXJlIHRoZSBhcHBlbmQtb25seSByZWNvcmQgb2Ygd2hhdCBldmVyeSBhdHRlbXB0IGRpZCwgYW5kIHRoZVxuICAgKiByZXRyeSBmZWF0dXJlJ3Mgd2hvbGUgcG9pbnQgaXMgdGhhdCB0aGUgZWFybGllciBhdHRlbXB0cyBzdGF5IHZpc2libGUuXG4gICAqXG4gICAqIE5vIGNvbW1pdCBpcyByZWNvcmRlZCBhbmQgbm8gb2JzZXJ2ZXIgZmlyZXMg4oCUIGEgZGlzY2FyZGVkIGF0dGVtcHQgaXMgbm90IGFcbiAgICogY3Vyc29yIHN0b3AsIGJlY2F1c2UgZnJvbSBzaGFyZWQgc3RhdGUncyBwb2ludCBvZiB2aWV3IGl0IG5ldmVyIGhhcHBlbmVkLlxuICAgKi9cbiAgZGlzY2FyZFN0YWdlZCgpOiB2b2lkIHtcbiAgICB0aGlzLmJ1ZmZlciA9IHVuZGVmaW5lZDtcbiAgICB0aGlzLnN0YXRlVmlldyA9IHVuZGVmaW5lZDtcbiAgICB0aGlzLl91bnRyYWNrZWRTb3VyY2VzID0gdW5kZWZpbmVkO1xuICAgIHRoaXMuX3Byb3ZlbmFuY2VSZWFkcyA9IHVuZGVmaW5lZDtcbiAgICB0aGlzLl9wZW5kaW5nV3JpdGVzID0gdW5kZWZpbmVkO1xuICAgIHRoaXMuX3N0YWdlV3JpdGVzID0ge307XG4gICAgdGhpcy5fc3RhZ2VSZWFkcyA9IHt9O1xuICAgIHRoaXMuX25lc3RlZFJlYWRzID0gdW5kZWZpbmVkO1xuICB9XG5cbiAgLy8g4pSA4pSAIFRyZWUgbmF2aWdhdGlvbiDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuICAvKipcbiAgICogQ3JlYXRlIChvciByZXR1cm4pIHRoaXMgY29udGV4dCdzIGxpbmtlZCBzdWNjZXNzb3IuXG4gICAqXG4gICAqIE1FTU9JWkVEOiB0aGUgZmlyc3QgY2FsbCBjcmVhdGVzIGB0aGlzLm5leHRgOyBldmVyeSBsYXRlciBjYWxsIHJldHVybnNcbiAgICogdGhhdCBTQU1FIGNvbnRleHQgYW5kIElHTk9SRVMgaXRzIGFyZ3VtZW50cy4gSW4gbm9ybWFsIHRyYXZlcnNhbCBlYWNoXG4gICAqIGNvbnRleHQgYWR2YW5jZXMgZXhhY3RseSBvbmNlLCBzbyB0aGUgbWVtbyBuZXZlciBiaXRlcyDigJQgYnV0IGEgY2FsbGVyXG4gICAqIGV4cGVjdGluZyBhIGZyZXNoIGNvbnRleHQgZm9yIGRpZmZlcmVudCBgc3RhZ2VOYW1lYC9gc3RhZ2VJZGAgYXJncyBnZXRzXG4gICAqIHRoZSBvbGQgb25lIHNpbGVudGx5LiBEZXYgbW9kZSAoYGVuYWJsZURldk1vZGUoKWApIHdhcm5zIG9uIHRoYXRcbiAgICogbWlzbWF0Y2ggKGJhY2tsb2cgQjQpLlxuICAgKi9cbiAgY3JlYXRlTmV4dChwYXRoOiBzdHJpbmcsIHN0YWdlTmFtZTogc3RyaW5nLCBzdGFnZUlkOiBzdHJpbmcsIGlzRGVjaWRlciA9IGZhbHNlKTogU3RhZ2VDb250ZXh0IHtcbiAgICBpZiAoIXRoaXMubmV4dCkge1xuICAgICAgdGhpcy5uZXh0ID0gbmV3IFN0YWdlQ29udGV4dChwYXRoLCBzdGFnZU5hbWUsIHN0YWdlSWQsIHRoaXMuc2hhcmVkTWVtb3J5LCAnJywgdGhpcy5ldmVudExvZywgaXNEZWNpZGVyKTtcbiAgICAgIHRoaXMubmV4dC5wYXJlbnQgPSB0aGlzO1xuICAgICAgLy8gUHJvcGFnYXRlIHRoZSByZWRhY3RlZCBtaXJyb3IgZG93biB0aGUgY29udGV4dCB0cmVlIHNvIGV2ZXJ5IGNvbW1pdFxuICAgICAgLy8gaW4gdGhlIHJ1biB3cml0ZXMgdG8gYm90aCB2aWV3cy5cbiAgICAgIGlmICh0aGlzLnJlZGFjdGVkU2hhcmVkTWVtb3J5KSB0aGlzLm5leHQucmVkYWN0ZWRTaGFyZWRNZW1vcnkgPSB0aGlzLnJlZGFjdGVkU2hhcmVkTWVtb3J5O1xuICAgICAgdGhpcy5uZXh0LnJlZGFjdGlvblJ1bGUgPSB0aGlzLnJlZGFjdGlvblJ1bGU7XG4gICAgICB0aGlzLm5leHQucmVhZFRyYWNraW5nID0gdGhpcy5yZWFkVHJhY2tpbmc7XG4gICAgICB0aGlzLm5leHQud3JpdGVUcmFja2luZyA9IHRoaXMud3JpdGVUcmFja2luZztcbiAgICAgIHRoaXMubmV4dC5jb21taXRWYWx1ZXMgPSB0aGlzLmNvbW1pdFZhbHVlcztcbiAgICAgIHRoaXMubmV4dC53cml0ZVByb3ZlbmFuY2UgPSB0aGlzLndyaXRlUHJvdmVuYW5jZTtcbiAgICB9IGVsc2UgaWYgKGlzRGV2TW9kZSgpICYmICh0aGlzLm5leHQuc3RhZ2VJZCAhPT0gc3RhZ2VJZCB8fCB0aGlzLm5leHQuc3RhZ2VOYW1lICE9PSBzdGFnZU5hbWUpKSB7XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tY29uc29sZVxuICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICBgW2Zvb3RwcmludF0gU3RhZ2VDb250ZXh0LmNyZWF0ZU5leHQ6IG5leHQgY29udGV4dCBhbHJlYWR5IGV4aXN0cyBhcyBcIiR7dGhpcy5uZXh0LnN0YWdlTmFtZX1cIiBgICtcbiAgICAgICAgICBgKGlkOiBcIiR7dGhpcy5uZXh0LnN0YWdlSWR9XCIpIOKAlCBhcmd1bWVudHMgXCIke3N0YWdlTmFtZX1cIiAoaWQ6IFwiJHtzdGFnZUlkfVwiKSBhcmUgaWdub3JlZCBgICtcbiAgICAgICAgICAnYW5kIHRoZSBleGlzdGluZyBjb250ZXh0IGlzIHJldHVybmVkLicsXG4gICAgICApO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5uZXh0O1xuICB9XG5cbiAgY3JlYXRlQ2hpbGQocnVuSWQ6IHN0cmluZywgYnJhbmNoSWQ6IHN0cmluZywgc3RhZ2VOYW1lOiBzdHJpbmcsIHN0YWdlSWQ6IHN0cmluZywgaXNEZWNpZGVyID0gZmFsc2UpOiBTdGFnZUNvbnRleHQge1xuICAgIGlmICghdGhpcy5jaGlsZHJlbikge1xuICAgICAgdGhpcy5jaGlsZHJlbiA9IFtdO1xuICAgIH1cbiAgICBjb25zdCBjaGlsZCA9IG5ldyBTdGFnZUNvbnRleHQocnVuSWQsIHN0YWdlTmFtZSwgc3RhZ2VJZCwgdGhpcy5zaGFyZWRNZW1vcnksIGJyYW5jaElkLCB0aGlzLmV2ZW50TG9nLCBpc0RlY2lkZXIpO1xuICAgIGNoaWxkLnBhcmVudCA9IHRoaXM7XG4gICAgaWYgKHRoaXMucmVkYWN0ZWRTaGFyZWRNZW1vcnkpIGNoaWxkLnJlZGFjdGVkU2hhcmVkTWVtb3J5ID0gdGhpcy5yZWRhY3RlZFNoYXJlZE1lbW9yeTtcbiAgICBjaGlsZC5yZWRhY3Rpb25SdWxlID0gdGhpcy5yZWRhY3Rpb25SdWxlO1xuICAgIGNoaWxkLnJlYWRUcmFja2luZyA9IHRoaXMucmVhZFRyYWNraW5nO1xuICAgIGNoaWxkLndyaXRlVHJhY2tpbmcgPSB0aGlzLndyaXRlVHJhY2tpbmc7XG4gICAgY2hpbGQuY29tbWl0VmFsdWVzID0gdGhpcy5jb21taXRWYWx1ZXM7XG4gICAgY2hpbGQud3JpdGVQcm92ZW5hbmNlID0gdGhpcy53cml0ZVByb3ZlbmFuY2U7XG4gICAgdGhpcy5jaGlsZHJlbi5wdXNoKGNoaWxkKTtcbiAgICByZXR1cm4gY2hpbGQ7XG4gIH1cblxuICBjcmVhdGVEZWNpZGVyKHBhdGg6IHN0cmluZywgc3RhZ2VOYW1lOiBzdHJpbmcsIHN0YWdlSWQ6IHN0cmluZyk6IFN0YWdlQ29udGV4dCB7XG4gICAgcmV0dXJuIHRoaXMuY3JlYXRlTmV4dChwYXRoLCBzdGFnZU5hbWUsIHN0YWdlSWQsIHRydWUpO1xuICB9XG5cbiAgc2V0QXNEZWNpZGVyKCk6IFN0YWdlQ29udGV4dCB7XG4gICAgdGhpcy5pc0RlY2lkZXIgPSB0cnVlO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgc2V0QXNGb3JrKCk6IFN0YWdlQ29udGV4dCB7XG4gICAgdGhpcy5pc0ZvcmsgPSB0cnVlO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLy8g4pSA4pSAIERpYWdub3N0aWNzIGRlbGVnYXRpb24g4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbiAgYWRkTG9nKGtleTogc3RyaW5nLCB2YWx1ZTogdW5rbm93biwgcGF0aD86IHN0cmluZ1tdKSB7XG4gICAgdGhpcy5kZWJ1Zy5hZGRMb2coa2V5LCB2YWx1ZSwgcGF0aCk7XG4gIH1cblxuICBzZXRMb2coa2V5OiBzdHJpbmcsIHZhbHVlOiB1bmtub3duLCBwYXRoPzogc3RyaW5nW10pIHtcbiAgICB0aGlzLmRlYnVnLnNldExvZyhrZXksIHZhbHVlLCBwYXRoKTtcbiAgfVxuXG4gIGFkZE1ldHJpYyhrZXk6IHN0cmluZywgdmFsdWU6IHVua25vd24sIHBhdGg/OiBzdHJpbmdbXSkge1xuICAgIHRoaXMuZGVidWcuYWRkTWV0cmljKGtleSwgdmFsdWUsIHBhdGgpO1xuICB9XG5cbiAgc2V0TWV0cmljKGtleTogc3RyaW5nLCB2YWx1ZTogdW5rbm93biwgcGF0aD86IHN0cmluZ1tdKSB7XG4gICAgdGhpcy5kZWJ1Zy5zZXRNZXRyaWMoa2V5LCB2YWx1ZSwgcGF0aCk7XG4gIH1cblxuICBhZGRFdmFsKGtleTogc3RyaW5nLCB2YWx1ZTogdW5rbm93biwgcGF0aD86IHN0cmluZ1tdKSB7XG4gICAgdGhpcy5kZWJ1Zy5hZGRFdmFsKGtleSwgdmFsdWUsIHBhdGgpO1xuICB9XG5cbiAgc2V0RXZhbChrZXk6IHN0cmluZywgdmFsdWU6IHVua25vd24sIHBhdGg/OiBzdHJpbmdbXSkge1xuICAgIHRoaXMuZGVidWcuc2V0RXZhbChrZXksIHZhbHVlLCBwYXRoKTtcbiAgfVxuXG4gIGFkZEVycm9yKGtleTogc3RyaW5nLCB2YWx1ZTogdW5rbm93biwgcGF0aD86IHN0cmluZ1tdKSB7XG4gICAgdGhpcy5kZWJ1Zy5hZGRFcnJvcihrZXksIHZhbHVlLCBwYXRoKTtcbiAgfVxuXG4gIGFkZEZsb3dEZWJ1Z01lc3NhZ2UoXG4gICAgdHlwZTogRmxvd0NvbnRyb2xUeXBlLFxuICAgIGRlc2NyaXB0aW9uOiBzdHJpbmcsXG4gICAgb3B0aW9ucz86IHsgdGFyZ2V0U3RhZ2U/OiBzdHJpbmcgfCBzdHJpbmdbXTsgcmF0aW9uYWxlPzogc3RyaW5nOyBjb3VudD86IG51bWJlcjsgaXRlcmF0aW9uPzogbnVtYmVyIH0sXG4gICkge1xuICAgIGNvbnN0IGZsb3dNZXNzYWdlOiBGbG93TWVzc2FnZSA9IHsgdHlwZSwgZGVzY3JpcHRpb24sIHRpbWVzdGFtcDogRGF0ZS5ub3coKSwgLi4ub3B0aW9ucyB9O1xuICAgIHRoaXMuZGVidWcuYWRkRmxvd01lc3NhZ2UoZmxvd01lc3NhZ2UpO1xuICB9XG5cbiAgLy8g4pSA4pSAIFNuYXBzaG90IOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG4gIGdldFN0YWdlSWQoKTogc3RyaW5nIHtcbiAgICBpZiAoIXRoaXMucnVuSWQgfHwgdGhpcy5ydW5JZCA9PT0gJycpIHJldHVybiB0aGlzLnN0YWdlTmFtZTtcbiAgICByZXR1cm4gYCR7dGhpcy5ydW5JZH0uJHt0aGlzLnN0YWdlTmFtZX1gO1xuICB9XG5cbiAgZ2V0U25hcHNob3QoKTogU3RhZ2VTbmFwc2hvdCB7XG4gICAgLy8gSXRlcmF0aXZlIHdhbGsgKGV4cGxpY2l0IHdvcmsgc3RhY2spLCBOT1QgcmVjdXJzaW9uOiB0aGUgZXhlY3V0aW9uXG4gICAgLy8gdHJlZSBkZWVwZW5zIGJ5IG9uZSBsZXZlbCBwZXIgZXhlY3V0ZWQgc3RhZ2UgYWxvbmcgYG5leHRgIGNoYWlucywgYW5kXG4gICAgLy8gdGhlIHRyYW1wb2xpbmVkIHRyYXZlcnNlciBhbGxvd3MgY2hhaW5zL2xvb3BzIG9mIHRlbnMgb2YgdGhvdXNhbmRzIG9mXG4gICAgLy8gc3RhZ2VzIOKAlCBmYXIgZGVlcGVyIHRoYW4gYSByZWN1cnNpdmUgc2VyaWFsaXplciBjYW4gd2FsayBiZWZvcmVcbiAgICAvLyBcIk1heGltdW0gY2FsbCBzdGFjayBzaXplIGV4Y2VlZGVkXCIuXG4gICAgY29uc3Qgcm9vdCA9IHRoaXMuc25hcHNob3RTZWxmKCk7XG4gICAgY29uc3Qgd29yazogQXJyYXk8eyBjdHg6IFN0YWdlQ29udGV4dDsgc25hcDogU3RhZ2VTbmFwc2hvdCB9PiA9IFt7IGN0eDogdGhpcywgc25hcDogcm9vdCB9XTtcbiAgICB3aGlsZSAod29yay5sZW5ndGggPiAwKSB7XG4gICAgICBjb25zdCB7IGN0eCwgc25hcCB9ID0gd29yay5wb3AoKSE7XG4gICAgICBpZiAoY3R4Lm5leHQpIHtcbiAgICAgICAgY29uc3QgbmV4dFNuYXAgPSBjdHgubmV4dC5zbmFwc2hvdFNlbGYoKTtcbiAgICAgICAgc25hcC5uZXh0ID0gbmV4dFNuYXA7XG4gICAgICAgIHdvcmsucHVzaCh7IGN0eDogY3R4Lm5leHQsIHNuYXA6IG5leHRTbmFwIH0pO1xuICAgICAgfVxuICAgICAgaWYgKGN0eC5jaGlsZHJlbikge1xuICAgICAgICBzbmFwLmNoaWxkcmVuID0gY3R4LmNoaWxkcmVuLm1hcCgoY2hpbGQpID0+IHtcbiAgICAgICAgICBjb25zdCBjaGlsZFNuYXAgPSBjaGlsZC5zbmFwc2hvdFNlbGYoKTtcbiAgICAgICAgICB3b3JrLnB1c2goeyBjdHg6IGNoaWxkLCBzbmFwOiBjaGlsZFNuYXAgfSk7XG4gICAgICAgICAgcmV0dXJuIGNoaWxkU25hcDtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiByb290O1xuICB9XG5cbiAgLyoqIFNuYXBzaG90IG9mIFRISVMgY29udGV4dCdzIG93biBmaWVsZHMg4oCUIGBuZXh0YC9gY2hpbGRyZW5gIGFyZSBmaWxsZWRcbiAgICogIGluIGJ5IHRoZSBpdGVyYXRpdmUgd2FsayBpbiBgZ2V0U25hcHNob3RgLiAqL1xuICBwcml2YXRlIHNuYXBzaG90U2VsZigpOiBTdGFnZVNuYXBzaG90IHtcbiAgICBjb25zdCBzbmFwc2hvdDogU3RhZ2VTbmFwc2hvdCA9IHtcbiAgICAgIGlkOiB0aGlzLnN0YWdlSWQsXG4gICAgICBydW50aW1lU3RhZ2VJZDogdGhpcy5ydW50aW1lU3RhZ2VJZCB8fCB1bmRlZmluZWQsXG4gICAgICBuYW1lOiB0aGlzLnN0YWdlTmFtZSxcbiAgICAgIGlzRGVjaWRlcjogdGhpcy5pc0RlY2lkZXIsXG4gICAgICBpc0Zvcms6IHRoaXMuaXNGb3JrLFxuICAgICAgbG9nczogdGhpcy5kZWJ1Zy5sb2dDb250ZXh0LFxuICAgICAgZXJyb3JzOiB0aGlzLmRlYnVnLmVycm9yQ29udGV4dCxcbiAgICAgIG1ldHJpY3M6IHRoaXMuZGVidWcubWV0cmljQ29udGV4dCxcbiAgICAgIGV2YWxzOiB0aGlzLmRlYnVnLmV2YWxDb250ZXh0LFxuICAgIH07XG4gICAgY29uc3Qgc3RhZ2VXcml0ZXMgPSB0aGlzLnJldGFpbmVkV3JpdGVzKCk7XG4gICAgaWYgKE9iamVjdC5rZXlzKHN0YWdlV3JpdGVzKS5sZW5ndGggPiAwKSB7XG4gICAgICAvLyBFeHRyYWN0IHZhbHVlcyBvbmx5IGZvciB0aGUgc25hcHNob3QgKHN0cmlwIG9wZXJhdGlvbiBtZXRhZGF0YSlcbiAgICAgIGNvbnN0IHdyaXRlczogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPSB7fTtcbiAgICAgIGZvciAoY29uc3QgW2ssIGVudHJ5XSBvZiBPYmplY3QuZW50cmllcyhzdGFnZVdyaXRlcykpIHtcbiAgICAgICAgd3JpdGVzW2tdID0gZW50cnkudmFsdWU7XG4gICAgICB9XG4gICAgICBzbmFwc2hvdC5zdGFnZVdyaXRlcyA9IHdyaXRlcztcbiAgICB9XG4gICAgaWYgKE9iamVjdC5rZXlzKHRoaXMuX3N0YWdlUmVhZHMpLmxlbmd0aCA+IDApIHtcbiAgICAgIHNuYXBzaG90LnN0YWdlUmVhZHMgPSB0aGlzLl9zdGFnZVJlYWRzO1xuICAgIH1cbiAgICBpZiAodGhpcy5kZXNjcmlwdGlvbikge1xuICAgICAgc25hcHNob3QuZGVzY3JpcHRpb24gPSB0aGlzLmRlc2NyaXB0aW9uO1xuICAgIH1cbiAgICBpZiAodGhpcy5zdWJmbG93SWQpIHtcbiAgICAgIHNuYXBzaG90LnN1YmZsb3dJZCA9IHRoaXMuc3ViZmxvd0lkO1xuICAgIH1cbiAgICBpZiAodGhpcy5kZWJ1Zy5mbG93TWVzc2FnZXMubGVuZ3RoID4gMCkge1xuICAgICAgc25hcHNob3QuZmxvd01lc3NhZ2VzID0gdGhpcy5kZWJ1Zy5mbG93TWVzc2FnZXM7XG4gICAgfVxuICAgIHJldHVybiBzbmFwc2hvdDtcbiAgfVxufVxuIl19