@blokjs/trigger-worker 1.0.0 → 1.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -80,15 +80,21 @@ export class PgBossAdapter {
80
80
  // pg-boss v10 requires explicit queue creation before send/work.
81
81
  // The call is idempotent — succeeds whether the queue exists or
82
82
  // not — so this is safe to repeat across re-entries.
83
- await this.ensureQueue(config.queue);
83
+ await this.ensureQueue(config.queue, config);
84
84
  // pg-boss v10's handler receives an ARRAY of jobs (batch); the
85
- // `batchSize` option controls the max. We keep `batchSize: 1` so
86
- // the iteration is a single-job loop (matches pre-v10 semantics
87
- // the adapter was written against). `pollingIntervalSeconds`
88
- // defaults to 2s which adds ~2s latency on the happy path —
89
- // tighten it for low-latency workloads via the worker config.
85
+ // `batchSize` option caps how many jobs one poll fetches. pg-boss
86
+ // has no per-job `concurrency`/`teamSize` knob its unit of
87
+ // parallelism is the batch the handler is handed — so we map
88
+ // `config.concurrency` (the requested parallelism) to `batchSize`.
89
+ // The handler loop below processes the batch; jobs within it run
90
+ // sequentially in this process, but a larger batch means more jobs
91
+ // drained per poll (= higher effective throughput). `concurrency`
92
+ // defaults to 1 in the worker schema → single-job fetch, matching
93
+ // the prior behaviour. `pollingIntervalSeconds` defaults to 2s
94
+ // which adds ~2s latency on the happy path — tighten via config.
95
+ const batchSize = config.concurrency && config.concurrency > 0 ? config.concurrency : 1;
90
96
  const id = await this.boss.work(config.queue, {
91
- batchSize: 1,
97
+ batchSize,
92
98
  includeMetadata: true,
93
99
  }, async (jobOrBatch) => {
94
100
  const jobs = Array.isArray(jobOrBatch) ? jobOrBatch : [jobOrBatch];
@@ -155,11 +161,32 @@ export class PgBossAdapter {
155
161
  stats.active = Math.max(0, stats.active - 1);
156
162
  }
157
163
  }
158
- async ensureQueue(queue) {
164
+ async ensureQueue(queue, config) {
165
+ if (!this.boss)
166
+ return;
167
+ // Per-queue routing/retry policy. pg-boss 10 applies these at the
168
+ // QUEUE level (the `createQueue` options), not on `work()` — a
169
+ // failed job is retried `retryLimit` times then routed to the
170
+ // `deadLetter` queue automatically. The DLQ is itself a queue, so
171
+ // it must exist before it can receive dead-lettered jobs.
172
+ const queueOpts = { name: queue };
173
+ const dlq = config?.deadLetterQueue;
174
+ if (typeof dlq === "string" && dlq.length > 0) {
175
+ queueOpts.deadLetter = dlq;
176
+ await this.createQueueIdempotent(dlq, { name: dlq });
177
+ }
178
+ if (typeof config?.retries === "number")
179
+ queueOpts.retryLimit = config.retries;
180
+ if (typeof config?.timeout === "number" && config.timeout > 0) {
181
+ queueOpts.expireInSeconds = Math.ceil(config.timeout / 1000);
182
+ }
183
+ await this.createQueueIdempotent(queue, queueOpts);
184
+ }
185
+ async createQueueIdempotent(queue, opts) {
159
186
  if (!this.boss)
160
187
  return;
161
188
  try {
162
- await this.boss.createQueue(queue);
189
+ await this.boss.createQueue(queue, opts);
163
190
  }
164
191
  catch (err) {
165
192
  // pg-boss v10's createQueue is idempotent but may throw on
@@ -248,4 +275,4 @@ export class PgBossAdapter {
248
275
  };
249
276
  }
250
277
  }
251
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUGdCb3NzQWRhcHRlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9hZGFwdGVycy9QZ0Jvc3NBZGFwdGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0F3Qkc7QUFHSCxPQUFPLEVBQUUsRUFBRSxJQUFJLElBQUksRUFBRSxNQUFNLE1BQU0sQ0FBQztBQWtDbEMsTUFBTSxPQUFPLGFBQWE7SUFDaEIsUUFBUSxHQUFHLFNBQWtCLENBQUM7SUFDdEIsTUFBTSxDQUFlO0lBQzlCLElBQUksR0FBMEIsSUFBSSxDQUFDO0lBQ25DLE9BQU8sR0FBd0IsSUFBSSxHQUFHLEVBQUUsQ0FBQztJQUN6QyxTQUFTLEdBQUcsS0FBSyxDQUFDO0lBQ2xCLEtBQUssR0FBb0MsSUFBSSxHQUFHLEVBQUUsQ0FBQztJQUUzRCxZQUFZLE1BQThCO1FBQ3pDLElBQUksQ0FBQyxNQUFNLEdBQUc7WUFDYixnQkFBZ0IsRUFBRSxNQUFNLEVBQUUsZ0JBQWdCLElBQUksT0FBTyxDQUFDLEdBQUcsQ0FBQyxZQUFZLElBQUksZ0NBQWdDO1lBQzFHLE1BQU0sRUFBRSxNQUFNLEVBQUUsTUFBTSxJQUFJLE9BQU8sQ0FBQyxHQUFHLENBQUMsY0FBYyxJQUFJLFFBQVE7U0FDaEUsQ0FBQztJQUNILENBQUM7SUFFRCxLQUFLLENBQUMsT0FBTztRQUNaLElBQUksSUFBSSxDQUFDLFNBQVM7WUFBRSxPQUFPO1FBQzNCLElBQUksQ0FBQztZQUNKLDZEQUE2RDtZQUM3RCw4Q0FBOEM7WUFDOUMsTUFBTSxVQUFVLEdBQUcsU0FBUyxDQUFDO1lBQzdCLDZFQUE2RTtZQUM3RSxNQUFNLEdBQUcsR0FBUSxNQUFNLE1BQU0sQ0FBQyxVQUFVLENBQUMsQ0FBQztZQUMxQyw2RUFBNkU7WUFDN0UsTUFBTSxNQUFNLEdBQVEsR0FBRyxDQUFDLE9BQU8sSUFBSSxHQUFHLENBQUM7WUFDdkMsSUFBSSxDQUFDLElBQUksR0FBRyxJQUFJLE1BQU0sQ0FBQztnQkFDdEIsZ0JBQWdCLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxnQkFBZ0I7Z0JBQzlDLE1BQU0sRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU07YUFDMUIsQ0FBbUIsQ0FBQztZQUNyQixNQUFNLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUM7WUFDeEIsSUFBSSxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUM7UUFDdkIsQ0FBQztRQUFDLE9BQU8sR0FBRyxFQUFFLENBQUM7WUFDZCxNQUFNLElBQUksS0FBSyxDQUNkLG1DQUFvQyxHQUFhLENBQUMsT0FBTyx5REFBeUQsQ0FDbEgsQ0FBQztRQUNILENBQUM7SUFDRixDQUFDO0lBRUQsS0FBSyxDQUFDLFVBQVU7UUFDZixJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVM7WUFBRSxPQUFPO1FBQzVCLElBQUksQ0FBQztZQUNKLE1BQU0sSUFBSSxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztRQUMzQyxDQUFDO1FBQUMsTUFBTSxDQUFDO1lBQ1IsWUFBWTtRQUNiLENBQUM7UUFDRCxJQUFJLENBQUMsT0FBTyxDQUFDLEtBQUssRUFBRSxDQUFDO1FBQ3JCLElBQUksQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDO1FBQ2pCLElBQUksQ0FBQyxTQUFTLEdBQUcsS0FBSyxDQUFDO0lBQ3hCLENBQUM7SUFFRCxLQUFLLENBQUMsT0FBTyxDQUFDLE1BQXlCLEVBQUUsT0FBMEM7UUFDbEYsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSTtZQUFFLE1BQU0sSUFBSSxLQUFLLENBQUMsc0RBQXNELENBQUMsQ0FBQztRQUMzRyxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsS0FBSyxFQUFFLEVBQUUsU0FBUyxFQUFFLENBQUMsRUFBRSxNQUFNLEVBQUUsQ0FBQyxFQUFFLE1BQU0sRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQ3JFLE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQXVCLENBQUM7UUFFakUsaUVBQWlFO1FBQ2pFLGdFQUFnRTtRQUNoRSxxREFBcUQ7UUFDckQsTUFBTSxJQUFJLENBQUMsV0FBVyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUVyQywrREFBK0Q7UUFDL0QsaUVBQWlFO1FBQ2pFLGdFQUFnRTtRQUNoRSw2REFBNkQ7UUFDN0QsNERBQTREO1FBQzVELDhEQUE4RDtRQUM5RCxNQUFNLEVBQUUsR0FBRyxNQUFNLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUM5QixNQUFNLENBQUMsS0FBSyxFQUNaO1lBQ0MsU0FBUyxFQUFFLENBQUM7WUFDWixlQUFlLEVBQUUsSUFBSTtTQUNyQixFQUNELEtBQUssRUFBRSxVQUFVLEVBQUUsRUFBRTtZQUNwQixNQUFNLElBQUksR0FBRyxLQUFLLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUM7WUFDbkUsS0FBSyxNQUFNLEdBQUcsSUFBSSxJQUFJLEVBQUUsQ0FBQztnQkFDeEIsTUFBTSxJQUFJLENBQUMsU0FBUyxDQUFDLE1BQU0sRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFLEdBQUcsQ0FBQyxDQUFDO1lBQ25ELENBQUM7UUFDRixDQUFDLENBQ0QsQ0FBQztRQUNGLElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLENBQUM7SUFDcEMsQ0FBQztJQUVPLEtBQUssQ0FBQyxTQUFTLENBQ3RCLE1BQXlCLEVBQ3pCLE9BQTBDLEVBQzFDLEtBQXlCLEVBQ3pCLEdBQWM7UUFFZCxLQUFLLENBQUMsTUFBTSxJQUFJLENBQUMsQ0FBQztRQUNsQix3REFBd0Q7UUFDeEQsMERBQTBEO1FBQzFELDJEQUEyRDtRQUMzRCwrQ0FBK0M7UUFDL0MsMkRBQTJEO1FBQzNELHdEQUF3RDtRQUN4RCwwREFBMEQ7UUFDMUQsSUFBSSxPQUFPLEdBQUcsS0FBSyxDQUFDO1FBQ3BCLE1BQU0sU0FBUyxHQUFjO1lBQzVCLEVBQUUsRUFBRSxHQUFHLENBQUMsRUFBRTtZQUNWLElBQUksRUFBRSxHQUFHLENBQUMsSUFBSTtZQUNkLE9BQU8sRUFBRSxFQUFFO1lBQ1gsS0FBSyxFQUFFLE1BQU0sQ0FBQyxLQUFLO1lBQ25CLFFBQVEsRUFBRSxNQUFNLENBQUMsUUFBUSxJQUFJLENBQUM7WUFDOUIsUUFBUSxFQUFFLENBQUM7WUFDWCxVQUFVLEVBQUUsTUFBTSxDQUFDLE9BQU8sSUFBSSxDQUFDO1lBQy9CLFNBQVMsRUFBRSxJQUFJLElBQUksRUFBRTtZQUNyQixPQUFPLEVBQUUsTUFBTSxDQUFDLE9BQU87WUFDdkIsR0FBRyxFQUFFLEdBQUc7WUFDUixRQUFRLEVBQUUsS0FBSyxJQUFJLEVBQUU7Z0JBQ3BCLElBQUksT0FBTztvQkFBRSxPQUFPO2dCQUNwQixLQUFLLENBQUMsU0FBUyxJQUFJLENBQUMsQ0FBQztnQkFDckIsT0FBTyxHQUFHLElBQUksQ0FBQztZQUNoQixDQUFDO1lBQ0QsSUFBSSxFQUFFLEtBQUssRUFBRSxHQUFVLEVBQUUsRUFBRTtnQkFDMUIsSUFBSSxPQUFPO29CQUFFLE9BQU87Z0JBQ3BCLEtBQUssQ0FBQyxNQUFNLElBQUksQ0FBQyxDQUFDO2dCQUNsQixPQUFPLEdBQUcsSUFBSSxDQUFDO2dCQUNmLHFEQUFxRDtnQkFDckQsbURBQW1EO2dCQUNuRCxxREFBcUQ7Z0JBQ3JELGtCQUFrQjtnQkFDbEIsTUFBTSxHQUFHLENBQUM7WUFDWCxDQUFDO1NBQ0QsQ0FBQztRQUNGLElBQUksQ0FBQztZQUNKLE1BQU0sT0FBTyxDQUFDLFNBQVMsQ0FBQyxDQUFDO1lBQ3pCLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQztnQkFDZCxLQUFLLENBQUMsU0FBUyxJQUFJLENBQUMsQ0FBQztnQkFDckIsT0FBTyxHQUFHLElBQUksQ0FBQztZQUNoQixDQUFDO1FBQ0YsQ0FBQztRQUFDLE9BQU8sR0FBRyxFQUFFLENBQUM7WUFDZCxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7Z0JBQ2QsS0FBSyxDQUFDLE1BQU0sSUFBSSxDQUFDLENBQUM7Z0JBQ2xCLE9BQU8sR0FBRyxJQUFJLENBQUM7WUFDaEIsQ0FBQztZQUNELE1BQU0sR0FBRyxDQUFDO1FBQ1gsQ0FBQztnQkFBUyxDQUFDO1lBQ1YsS0FBSyxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxLQUFLLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDO1FBQzlDLENBQUM7SUFDRixDQUFDO0lBRU8sS0FBSyxDQUFDLFdBQVcsQ0FBQyxLQUFhO1FBQ3RDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSTtZQUFFLE9BQU87UUFDdkIsSUFBSSxDQUFDO1lBQ0osTUFBTSxJQUFJLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUNwQyxDQUFDO1FBQUMsT0FBTyxHQUFHLEVBQUUsQ0FBQztZQUNkLDJEQUEyRDtZQUMzRCwrREFBK0Q7WUFDL0QsOERBQThEO1lBQzlELDZEQUE2RDtZQUM3RCwwQ0FBMEM7WUFDMUMsTUFBTSxPQUFPLEdBQUksR0FBYSxDQUFDLE9BQU8sSUFBSSxFQUFFLENBQUM7WUFDN0MsSUFBSSxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsZ0JBQWdCLENBQUMsRUFBRSxDQUFDO2dCQUN6QywwREFBMEQ7Z0JBQzFELG9EQUFvRDtnQkFDcEQscUJBQXFCO2dCQUNyQixPQUFPLENBQUMsSUFBSSxDQUFDLCtCQUErQixLQUFLLFlBQVksRUFBRSxPQUFPLENBQUMsQ0FBQztZQUN6RSxDQUFDO1FBQ0YsQ0FBQztJQUNGLENBQUM7SUFFRCxLQUFLLENBQUMsTUFBTSxDQUNYLEtBQWEsRUFDYixJQUFhLEVBQ2IsSUFBZ0c7UUFFaEcsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSTtZQUFFLE1BQU0sSUFBSSxLQUFLLENBQUMsc0RBQXNELENBQUMsQ0FBQztRQUMzRywyREFBMkQ7UUFDM0QsZ0RBQWdEO1FBQ2hELE1BQU0sSUFBSSxDQUFDLFdBQVcsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUM5QixnRUFBZ0U7UUFDaEUsdURBQXVEO1FBQ3ZELGtFQUFrRTtRQUNsRSwrREFBK0Q7UUFDL0Qsc0RBQXNEO1FBQ3RELDBEQUEwRDtRQUMxRCxNQUFNLFFBQVEsR0FBNEIsRUFBRSxDQUFDO1FBQzdDLElBQUksT0FBTyxJQUFJLEVBQUUsUUFBUSxLQUFLLFFBQVE7WUFBRSxRQUFRLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUM7UUFDMUUsSUFBSSxPQUFPLElBQUksRUFBRSxLQUFLLEtBQUssUUFBUSxJQUFJLElBQUksQ0FBQyxLQUFLLEdBQUcsQ0FBQyxFQUFFLENBQUM7WUFDdkQsUUFBUSxDQUFDLFVBQVUsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDLENBQUM7UUFDcEQsQ0FBQztRQUNELElBQUksT0FBTyxJQUFJLEVBQUUsT0FBTyxLQUFLLFFBQVE7WUFBRSxRQUFRLENBQUMsVUFBVSxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUM7UUFDMUUsSUFBSSxPQUFPLElBQUksRUFBRSxPQUFPLEtBQUssUUFBUTtZQUFFLFFBQVEsQ0FBQyxlQUFlLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQyxDQUFDO1FBQ2pHLElBQUksT0FBTyxJQUFJLEVBQUUsS0FBSyxLQUFLLFFBQVEsSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sR0FBRyxDQUFDO1lBQUUsUUFBUSxDQUFDLFlBQVksR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDO1FBRWpHLE1BQU0sS0FBSyxHQUFHLE1BQU0sSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLElBQUksRUFBRSxRQUFRLENBQUMsQ0FBQztRQUMxRCxPQUFPLEtBQUssSUFBSSxJQUFJLEVBQUUsS0FBSyxJQUFJLElBQUksRUFBRSxDQUFDO0lBQ3ZDLENBQUM7SUFFRCxLQUFLLENBQUMsY0FBYyxDQUFDLEtBQWE7UUFDakMsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSTtZQUFFLE9BQU87UUFDMUMsSUFBSSxDQUFDO1lBQ0osTUFBTSxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUNoQyxDQUFDO1FBQUMsTUFBTSxDQUFDO1lBQ1IsWUFBWTtRQUNiLENBQUM7UUFDRCxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUM1QixDQUFDO0lBRUQsV0FBVztRQUNWLE9BQU8sSUFBSSxDQUFDLFNBQVMsQ0FBQztJQUN2QixDQUFDO0lBRUQsS0FBSyxDQUFDLFdBQVc7UUFDaEIsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSTtZQUFFLE9BQU8sS0FBSyxDQUFDO1FBQ2hELElBQUksQ0FBQztZQUNKLE1BQU0sSUFBSSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsa0JBQWtCLENBQUMsQ0FBQztZQUNqRCxPQUFPLElBQUksQ0FBQztRQUNiLENBQUM7UUFBQyxNQUFNLENBQUM7WUFDUixnRUFBZ0U7WUFDaEUsZ0VBQWdFO1lBQ2hFLE9BQU8sSUFBSSxDQUFDLFNBQVMsQ0FBQztRQUN2QixDQUFDO0lBQ0YsQ0FBQztJQUVELEtBQUssQ0FBQyxhQUFhLENBQUMsS0FBYTtRQUNoQyxNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsSUFBSSxFQUFFLFNBQVMsRUFBRSxDQUFDLEVBQUUsTUFBTSxFQUFFLENBQUMsRUFBRSxNQUFNLEVBQUUsQ0FBQyxFQUFFLENBQUM7UUFDakYsSUFBSSxPQUFPLEdBQUcsQ0FBQyxDQUFDO1FBQ2hCLElBQUksQ0FBQztZQUNKLE9BQU8sR0FBRyxDQUFDLE1BQU0sSUFBSSxDQUFDLElBQUksRUFBRSxZQUFZLENBQUMsS0FBSyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDdkQsQ0FBQztRQUFDLE1BQU0sQ0FBQztZQUNSLFlBQVk7UUFDYixDQUFDO1FBQ0QsT0FBTztZQUNOLE9BQU87WUFDUCxNQUFNLEVBQUUsUUFBUSxDQUFDLE1BQU07WUFDdkIsU0FBUyxFQUFFLFFBQVEsQ0FBQyxTQUFTO1lBQzdCLE1BQU0sRUFBRSxRQUFRLENBQUMsTUFBTTtZQUN2QixPQUFPLEVBQUUsQ0FBQztTQUNWLENBQUM7SUFDSCxDQUFDO0NBQ0QiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIFBnQm9zc0FkYXB0ZXIg4oCUIHYwLjcgUFIgNSDigJQgV29ya2VyIGFkYXB0ZXIgYmFja2VkIGJ5IGBwZy1ib3NzYCxcbiAqIHdoaWNoIHN0b3JlcyBqb2JzIGluIFBvc3RncmVTUUwuIE9wZXJhdGlvbmFsbHkgYXR0cmFjdGl2ZSB3aGVuXG4gKiBQb3N0Z3JlcyBpcyBhbHJlYWR5IGluIHRoZSBzdGFjayDigJQgbm8gZXh0cmEgYnJva2VyIGluZnJhIG5lZWRlZC5cbiAqXG4gKiBTZW1hbnRpY3M6XG4gKiAgIC0gYHBnLWJvc3NgIGhhbmRsZXMgY29uY3VycmVuY3ksIHJldHJpZXMsIGRlYWQtbGV0dGVyLCBwcmlvcml0eSxcbiAqICAgICBkZWxheXMsIGFuZCBleGFjdGx5LW9uY2Ugc2NoZWR1bGluZyBuYXRpdmVseSDigJQgdGhlIGFkYXB0ZXJcbiAqICAgICBmb3J3YXJkcyBgY29uZmlnLmNvbmN1cnJlbmN5YCwgYGNvbmZpZy5yZXRyaWVzYCwgZXRjLiB0byB0aGVcbiAqICAgICBgYm9zcy53b3JrKHF1ZXVlLCBvcHRzLCBoYW5kbGVyKWAgYW5kIGBib3NzLnNlbmQocXVldWUsIGRhdGEsIG9wdHMpYFxuICogICAgIGNhbGxzIGRpcmVjdGx5LlxuICogICAtICoqU2luZ2xlIGNvbm5lY3Rpb24gcGVyIHByb2Nlc3MqKiDigJQgYHBnLWJvc3NgIG1hbmFnZXMgaXRzIG93blxuICogICAgIHBvb2w7IHdlIGluc3RhbnRpYXRlIG9uZSBgUGdCb3NzYCBpbnN0YW5jZSBwZXIgYFBnQm9zc0FkYXB0ZXJgLlxuICogICAtICoqU2NoZW1hKio6IGBwZy1ib3NzYCBjcmVhdGVzIGl0cyBvd24gc2NoZW1hIChgcGdib3NzYCBieVxuICogICAgIGRlZmF1bHQpIG9uIGZpcnN0IHN0YXJ0LiBUYWJsZXMgYXJlIG1pZ3JhdGVkIGF1dG9tYXRpY2FsbHkuXG4gKlxuICogUmVxdWlyZXMgYHBnLWJvc3NgIGFzIGEgcGVlciBkZXBlbmRlbmN5OlxuICpcbiAqICAgICBidW4gYWRkIHBnLWJvc3NcbiAqXG4gKiBFbnZpcm9ubWVudCB2YXJpYWJsZXM6XG4gKiAgIC0gYERBVEFCQVNFX1VSTGAg4oCUIFBvc3RncmVzIGNvbm5lY3Rpb24gc3RyaW5nIChkZWZhdWx0XG4gKiAgICAgYHBvc3RncmVzOi8vbG9jYWxob3N0OjU0MzIvYmxva2ApLlxuICogICAtIGBQR19CT1NTX1NDSEVNQWAg4oCUIHNjaGVtYSBuYW1lIChkZWZhdWx0IGBcInBnYm9zc1wiYCkuXG4gKi9cblxuaW1wb3J0IHR5cGUgeyBXb3JrZXJUcmlnZ2VyT3B0cyB9IGZyb20gXCJAYmxva2pzL2hlbHBlclwiO1xuaW1wb3J0IHsgdjQgYXMgdXVpZCB9IGZyb20gXCJ1dWlkXCI7XG5pbXBvcnQgdHlwZSB7IFdvcmtlckFkYXB0ZXIsIFdvcmtlckpvYiwgV29ya2VyUXVldWVTdGF0cyB9IGZyb20gXCIuLi9Xb3JrZXJUcmlnZ2VyXCI7XG5cbmV4cG9ydCBpbnRlcmZhY2UgUGdCb3NzQ29uZmlnIHtcblx0Y29ubmVjdGlvblN0cmluZzogc3RyaW5nO1xuXHRzY2hlbWE/OiBzdHJpbmc7XG59XG5cbmludGVyZmFjZSBQZ0Jvc3NJbnN0YW5jZSB7XG5cdHN0YXJ0KCk6IFByb21pc2U8dW5rbm93bj47XG5cdHN0b3Aob3B0cz86IHsgZ3JhY2VmdWw/OiBib29sZWFuIH0pOiBQcm9taXNlPHZvaWQ+O1xuXHRjcmVhdGVRdWV1ZShxdWV1ZTogc3RyaW5nLCBvcHRzPzogUmVjb3JkPHN0cmluZywgdW5rbm93bj4pOiBQcm9taXNlPHVua25vd24+O1xuXHRzZW5kKHF1ZXVlOiBzdHJpbmcsIGRhdGE6IHVua25vd24sIG9wdHM/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPik6IFByb21pc2U8c3RyaW5nIHwgbnVsbD47XG5cdHdvcmsoXG5cdFx0cXVldWU6IHN0cmluZyxcblx0XHRvcHRzOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPixcblx0XHRoYW5kbGVyOiAoam9iOiBQZ0Jvc3NKb2IgfCBQZ0Jvc3NKb2JbXSkgPT4gUHJvbWlzZTx1bmtub3duPixcblx0KTogUHJvbWlzZTxzdHJpbmc+O1xuXHRvZmZXb3JrKHF1ZXVlOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+O1xuXHRnZXRRdWV1ZVNpemUocXVldWU6IHN0cmluZyk6IFByb21pc2U8bnVtYmVyPjtcbn1cblxuaW50ZXJmYWNlIFBnQm9zc0pvYiB7XG5cdGlkOiBzdHJpbmc7XG5cdGRhdGE6IHVua25vd247XG5cdG5hbWU6IHN0cmluZztcbn1cblxuaW50ZXJmYWNlIFF1ZXVlU3RhdHNDb3VudGVycyB7XG5cdGNvbXBsZXRlZDogbnVtYmVyO1xuXHRmYWlsZWQ6IG51bWJlcjtcblx0YWN0aXZlOiBudW1iZXI7XG59XG5cbmV4cG9ydCBjbGFzcyBQZ0Jvc3NBZGFwdGVyIGltcGxlbWVudHMgV29ya2VyQWRhcHRlciB7XG5cdHJlYWRvbmx5IHByb3ZpZGVyID0gXCJwZy1ib3NzXCIgYXMgY29uc3Q7XG5cdHByaXZhdGUgcmVhZG9ubHkgY29uZmlnOiBQZ0Jvc3NDb25maWc7XG5cdHByaXZhdGUgYm9zczogUGdCb3NzSW5zdGFuY2UgfCBudWxsID0gbnVsbDtcblx0cHJpdmF0ZSB3b3JrSWRzOiBNYXA8c3RyaW5nLCBzdHJpbmc+ID0gbmV3IE1hcCgpO1xuXHRwcml2YXRlIGNvbm5lY3RlZCA9IGZhbHNlO1xuXHRwcml2YXRlIHN0YXRzOiBNYXA8c3RyaW5nLCBRdWV1ZVN0YXRzQ291bnRlcnM+ID0gbmV3IE1hcCgpO1xuXG5cdGNvbnN0cnVjdG9yKGNvbmZpZz86IFBhcnRpYWw8UGdCb3NzQ29uZmlnPikge1xuXHRcdHRoaXMuY29uZmlnID0ge1xuXHRcdFx0Y29ubmVjdGlvblN0cmluZzogY29uZmlnPy5jb25uZWN0aW9uU3RyaW5nID8/IHByb2Nlc3MuZW52LkRBVEFCQVNFX1VSTCA/PyBcInBvc3RncmVzOi8vbG9jYWxob3N0OjU0MzIvYmxva1wiLFxuXHRcdFx0c2NoZW1hOiBjb25maWc/LnNjaGVtYSA/PyBwcm9jZXNzLmVudi5QR19CT1NTX1NDSEVNQSA/PyBcInBnYm9zc1wiLFxuXHRcdH07XG5cdH1cblxuXHRhc3luYyBjb25uZWN0KCk6IFByb21pc2U8dm9pZD4ge1xuXHRcdGlmICh0aGlzLmNvbm5lY3RlZCkgcmV0dXJuO1xuXHRcdHRyeSB7XG5cdFx0XHQvLyBJbmRpcmVjdCBzcGVjaWZpZXIgc28gdHNjIGRvZXNuJ3QgdHJ5IHRvIHJlc29sdmUgdHlwZXMgZm9yXG5cdFx0XHQvLyB0aGUgb3B0aW9uYWwgcGVlciBkZXBlbmRlbmN5IGF0IGJ1aWxkIHRpbWUuXG5cdFx0XHRjb25zdCBtb2R1bGVOYW1lID0gXCJwZy1ib3NzXCI7XG5cdFx0XHQvLyBiaW9tZS1pZ25vcmUgbGludC9zdXNwaWNpb3VzL25vRXhwbGljaXRBbnk6IHBnLWJvc3MgaXMgYSBydW50aW1lIHBlZXIgZGVwLlxuXHRcdFx0Y29uc3QgbW9kOiBhbnkgPSBhd2FpdCBpbXBvcnQobW9kdWxlTmFtZSk7XG5cdFx0XHQvLyBiaW9tZS1pZ25vcmUgbGludC9zdXNwaWNpb3VzL25vRXhwbGljaXRBbnk6IHBnLWJvc3MgaXMgYSBydW50aW1lIHBlZXIgZGVwLlxuXHRcdFx0Y29uc3QgUGdCb3NzOiBhbnkgPSBtb2QuZGVmYXVsdCA/PyBtb2Q7XG5cdFx0XHR0aGlzLmJvc3MgPSBuZXcgUGdCb3NzKHtcblx0XHRcdFx0Y29ubmVjdGlvblN0cmluZzogdGhpcy5jb25maWcuY29ubmVjdGlvblN0cmluZyxcblx0XHRcdFx0c2NoZW1hOiB0aGlzLmNvbmZpZy5zY2hlbWEsXG5cdFx0XHR9KSBhcyBQZ0Jvc3NJbnN0YW5jZTtcblx0XHRcdGF3YWl0IHRoaXMuYm9zcy5zdGFydCgpO1xuXHRcdFx0dGhpcy5jb25uZWN0ZWQgPSB0cnVlO1xuXHRcdH0gY2F0Y2ggKGVycikge1xuXHRcdFx0dGhyb3cgbmV3IEVycm9yKFxuXHRcdFx0XHRgW2Jsb2tdW3BnLWJvc3NdIGNvbm5lY3QgZmFpbGVkOiAkeyhlcnIgYXMgRXJyb3IpLm1lc3NhZ2V9LiBJbnN0YWxsIHBnLWJvc3MgYXMgYSBwZWVyIGRlcGVuZGVuY3k6IGJ1biBhZGQgcGctYm9zc2AsXG5cdFx0XHQpO1xuXHRcdH1cblx0fVxuXG5cdGFzeW5jIGRpc2Nvbm5lY3QoKTogUHJvbWlzZTx2b2lkPiB7XG5cdFx0aWYgKCF0aGlzLmNvbm5lY3RlZCkgcmV0dXJuO1xuXHRcdHRyeSB7XG5cdFx0XHRhd2FpdCB0aGlzLmJvc3M/LnN0b3AoeyBncmFjZWZ1bDogdHJ1ZSB9KTtcblx0XHR9IGNhdGNoIHtcblx0XHRcdC8qIGlnbm9yZSAqL1xuXHRcdH1cblx0XHR0aGlzLndvcmtJZHMuY2xlYXIoKTtcblx0XHR0aGlzLmJvc3MgPSBudWxsO1xuXHRcdHRoaXMuY29ubmVjdGVkID0gZmFsc2U7XG5cdH1cblxuXHRhc3luYyBwcm9jZXNzKGNvbmZpZzogV29ya2VyVHJpZ2dlck9wdHMsIGhhbmRsZXI6IChqb2I6IFdvcmtlckpvYikgPT4gUHJvbWlzZTx2b2lkPik6IFByb21pc2U8dm9pZD4ge1xuXHRcdGlmICghdGhpcy5jb25uZWN0ZWQgfHwgIXRoaXMuYm9zcykgdGhyb3cgbmV3IEVycm9yKFwiW2Jsb2tdW3BnLWJvc3NdIG5vdCBjb25uZWN0ZWQuIENhbGwgY29ubmVjdCgpIGZpcnN0LlwiKTtcblx0XHR0aGlzLnN0YXRzLnNldChjb25maWcucXVldWUsIHsgY29tcGxldGVkOiAwLCBmYWlsZWQ6IDAsIGFjdGl2ZTogMCB9KTtcblx0XHRjb25zdCBzdGF0cyA9IHRoaXMuc3RhdHMuZ2V0KGNvbmZpZy5xdWV1ZSkgYXMgUXVldWVTdGF0c0NvdW50ZXJzO1xuXG5cdFx0Ly8gcGctYm9zcyB2MTAgcmVxdWlyZXMgZXhwbGljaXQgcXVldWUgY3JlYXRpb24gYmVmb3JlIHNlbmQvd29yay5cblx0XHQvLyBUaGUgY2FsbCBpcyBpZGVtcG90ZW50IOKAlCBzdWNjZWVkcyB3aGV0aGVyIHRoZSBxdWV1ZSBleGlzdHMgb3Jcblx0XHQvLyBub3Qg4oCUIHNvIHRoaXMgaXMgc2FmZSB0byByZXBlYXQgYWNyb3NzIHJlLWVudHJpZXMuXG5cdFx0YXdhaXQgdGhpcy5lbnN1cmVRdWV1ZShjb25maWcucXVldWUpO1xuXG5cdFx0Ly8gcGctYm9zcyB2MTAncyBoYW5kbGVyIHJlY2VpdmVzIGFuIEFSUkFZIG9mIGpvYnMgKGJhdGNoKTsgdGhlXG5cdFx0Ly8gYGJhdGNoU2l6ZWAgb3B0aW9uIGNvbnRyb2xzIHRoZSBtYXguIFdlIGtlZXAgYGJhdGNoU2l6ZTogMWAgc29cblx0XHQvLyB0aGUgaXRlcmF0aW9uIGlzIGEgc2luZ2xlLWpvYiBsb29wIChtYXRjaGVzIHByZS12MTAgc2VtYW50aWNzXG5cdFx0Ly8gdGhlIGFkYXB0ZXIgd2FzIHdyaXR0ZW4gYWdhaW5zdCkuIGBwb2xsaW5nSW50ZXJ2YWxTZWNvbmRzYFxuXHRcdC8vIGRlZmF1bHRzIHRvIDJzIHdoaWNoIGFkZHMgfjJzIGxhdGVuY3kgb24gdGhlIGhhcHB5IHBhdGgg4oCUXG5cdFx0Ly8gdGlnaHRlbiBpdCBmb3IgbG93LWxhdGVuY3kgd29ya2xvYWRzIHZpYSB0aGUgd29ya2VyIGNvbmZpZy5cblx0XHRjb25zdCBpZCA9IGF3YWl0IHRoaXMuYm9zcy53b3JrKFxuXHRcdFx0Y29uZmlnLnF1ZXVlLFxuXHRcdFx0e1xuXHRcdFx0XHRiYXRjaFNpemU6IDEsXG5cdFx0XHRcdGluY2x1ZGVNZXRhZGF0YTogdHJ1ZSxcblx0XHRcdH0sXG5cdFx0XHRhc3luYyAoam9iT3JCYXRjaCkgPT4ge1xuXHRcdFx0XHRjb25zdCBqb2JzID0gQXJyYXkuaXNBcnJheShqb2JPckJhdGNoKSA/IGpvYk9yQmF0Y2ggOiBbam9iT3JCYXRjaF07XG5cdFx0XHRcdGZvciAoY29uc3Qgam9iIG9mIGpvYnMpIHtcblx0XHRcdFx0XHRhd2FpdCB0aGlzLnJ1bk9uZUpvYihjb25maWcsIGhhbmRsZXIsIHN0YXRzLCBqb2IpO1xuXHRcdFx0XHR9XG5cdFx0XHR9LFxuXHRcdCk7XG5cdFx0dGhpcy53b3JrSWRzLnNldChjb25maWcucXVldWUsIGlkKTtcblx0fVxuXG5cdHByaXZhdGUgYXN5bmMgcnVuT25lSm9iKFxuXHRcdGNvbmZpZzogV29ya2VyVHJpZ2dlck9wdHMsXG5cdFx0aGFuZGxlcjogKGpvYjogV29ya2VySm9iKSA9PiBQcm9taXNlPHZvaWQ+LFxuXHRcdHN0YXRzOiBRdWV1ZVN0YXRzQ291bnRlcnMsXG5cdFx0am9iOiBQZ0Jvc3NKb2IsXG5cdCk6IFByb21pc2U8dm9pZD4ge1xuXHRcdHN0YXRzLmFjdGl2ZSArPSAxO1xuXHRcdC8vIFRyYWNrcyB3aGV0aGVyIHN0YXRzIGhhdmUgYWxyZWFkeSBiZWVuIGNvdW50ZWQgYnkgdGhlXG5cdFx0Ly8gV29ya2VySm9iIEFQSSAoYGNvbXBsZXRlYCAvIGBmYWlsYCkuIFdpdGhvdXQgdGhpcywgYm90aFxuXHRcdC8vIHRoZSBjYWxsYmFjayBhbmQgdGhlIHdyYXBwZXIncyB0cnkvY2F0Y2ggY3JlZGl0IHRoZSBzYW1lXG5cdFx0Ly8gb3V0Y29tZSwgZG91YmxlLWNvdW50aW5nIGBzdGF0cy5jb21wbGV0ZWRgIC9cblx0XHQvLyBgc3RhdHMuZmFpbGVkYC4gcGctYm9zcyBpdHNlbGYgaGFuZGxlcyBhY2svcmV0cnkvRExRIHZpYVxuXHRcdC8vIHRoZSBoYW5kbGVyJ3MgcmV0dXJuLXZzLXRocm93IOKAlCB0aGVzZSBjYWxsYmFja3MgZXhpc3Rcblx0XHQvLyBwdXJlbHkgZm9yIHN0YXRzIHBhcml0eSB3aXRoIHRoZSBvdGhlciB3b3JrZXIgYWRhcHRlcnMuXG5cdFx0bGV0IHNldHRsZWQgPSBmYWxzZTtcblx0XHRjb25zdCB3b3JrZXJKb2I6IFdvcmtlckpvYiA9IHtcblx0XHRcdGlkOiBqb2IuaWQsXG5cdFx0XHRkYXRhOiBqb2IuZGF0YSxcblx0XHRcdGhlYWRlcnM6IHt9LFxuXHRcdFx0cXVldWU6IGNvbmZpZy5xdWV1ZSxcblx0XHRcdHByaW9yaXR5OiBjb25maWcucHJpb3JpdHkgPz8gMCxcblx0XHRcdGF0dGVtcHRzOiAwLFxuXHRcdFx0bWF4UmV0cmllczogY29uZmlnLnJldHJpZXMgPz8gMCxcblx0XHRcdGNyZWF0ZWRBdDogbmV3IERhdGUoKSxcblx0XHRcdHRpbWVvdXQ6IGNvbmZpZy50aW1lb3V0LFxuXHRcdFx0cmF3OiBqb2IsXG5cdFx0XHRjb21wbGV0ZTogYXN5bmMgKCkgPT4ge1xuXHRcdFx0XHRpZiAoc2V0dGxlZCkgcmV0dXJuO1xuXHRcdFx0XHRzdGF0cy5jb21wbGV0ZWQgKz0gMTtcblx0XHRcdFx0c2V0dGxlZCA9IHRydWU7XG5cdFx0XHR9LFxuXHRcdFx0ZmFpbDogYXN5bmMgKGVycjogRXJyb3IpID0+IHtcblx0XHRcdFx0aWYgKHNldHRsZWQpIHJldHVybjtcblx0XHRcdFx0c3RhdHMuZmFpbGVkICs9IDE7XG5cdFx0XHRcdHNldHRsZWQgPSB0cnVlO1xuXHRcdFx0XHQvLyBSZS10aHJvdyBzbyBwZy1ib3NzJ3MgYGJvc3Mud29ya2Agc2VlcyB0aGUgaGFuZGxlclxuXHRcdFx0XHQvLyBmYWlsdXJlIGFuZCBzY2hlZHVsZXMgYSByZXRyeSAvIGRyb3BzIHRvIERMUSBwZXJcblx0XHRcdFx0Ly8gdGhlIHF1ZXVlIGNvbmZpZyDigJQgdGhlIGNvbnRyYWN0IGlzIFwiaGFuZGxlciB0aHJvd3Ncblx0XHRcdFx0Ly8gPT4gam9iIGZhaWxlZFwiLlxuXHRcdFx0XHR0aHJvdyBlcnI7XG5cdFx0XHR9LFxuXHRcdH07XG5cdFx0dHJ5IHtcblx0XHRcdGF3YWl0IGhhbmRsZXIod29ya2VySm9iKTtcblx0XHRcdGlmICghc2V0dGxlZCkge1xuXHRcdFx0XHRzdGF0cy5jb21wbGV0ZWQgKz0gMTtcblx0XHRcdFx0c2V0dGxlZCA9IHRydWU7XG5cdFx0XHR9XG5cdFx0fSBjYXRjaCAoZXJyKSB7XG5cdFx0XHRpZiAoIXNldHRsZWQpIHtcblx0XHRcdFx0c3RhdHMuZmFpbGVkICs9IDE7XG5cdFx0XHRcdHNldHRsZWQgPSB0cnVlO1xuXHRcdFx0fVxuXHRcdFx0dGhyb3cgZXJyO1xuXHRcdH0gZmluYWxseSB7XG5cdFx0XHRzdGF0cy5hY3RpdmUgPSBNYXRoLm1heCgwLCBzdGF0cy5hY3RpdmUgLSAxKTtcblx0XHR9XG5cdH1cblxuXHRwcml2YXRlIGFzeW5jIGVuc3VyZVF1ZXVlKHF1ZXVlOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcblx0XHRpZiAoIXRoaXMuYm9zcykgcmV0dXJuO1xuXHRcdHRyeSB7XG5cdFx0XHRhd2FpdCB0aGlzLmJvc3MuY3JlYXRlUXVldWUocXVldWUpO1xuXHRcdH0gY2F0Y2ggKGVycikge1xuXHRcdFx0Ly8gcGctYm9zcyB2MTAncyBjcmVhdGVRdWV1ZSBpcyBpZGVtcG90ZW50IGJ1dCBtYXkgdGhyb3cgb25cblx0XHRcdC8vIHJhY2UgY29uZGl0aW9ucyB3aGVuIG11bHRpcGxlIHByb2Nlc3NlcyBjYWxsIGl0IGNvbmN1cnJlbnRseVxuXHRcdFx0Ly8gYWdhaW5zdCBhIGZyZXNoIHNjaGVtYSDigJQgdGhvc2UgZXJyb3JzIGFyZSBoYXJtbGVzcyBvbmNlIHRoZVxuXHRcdFx0Ly8gcXVldWUgZXhpc3RzLiBTd2FsbG93ICsgbGV0IGRvd25zdHJlYW0gc2VuZC93b3JrIHN1cmZhY2UgYVxuXHRcdFx0Ly8gcmVhbCBwcm9ibGVtIGlmIHRoZSBxdWV1ZSBpc24ndCB1c2FibGUuXG5cdFx0XHRjb25zdCBtZXNzYWdlID0gKGVyciBhcyBFcnJvcikubWVzc2FnZSA/PyBcIlwiO1xuXHRcdFx0aWYgKCFtZXNzYWdlLmluY2x1ZGVzKFwiYWxyZWFkeSBleGlzdHNcIikpIHtcblx0XHRcdFx0Ly8gTG9nIHRoZSB1bmV4cGVjdGVkIGNhc2UgYnV0IGRvbid0IHByb3BhZ2F0ZSDigJQgb3BlcmF0b3JzXG5cdFx0XHRcdC8vIHNob3VsZG4ndCBzZWUgYSBxdWV1ZS1jcmVhdGlvbiByYWNlIGJsb3cgdXAgdGhlaXJcblx0XHRcdFx0Ly8gdHJpZ2dlciBib290IHBhdGguXG5cdFx0XHRcdGNvbnNvbGUud2FybihgW2Jsb2tdW3BnLWJvc3NdIGVuc3VyZVF1ZXVlKCR7cXVldWV9KSB3YXJuaW5nOmAsIG1lc3NhZ2UpO1xuXHRcdFx0fVxuXHRcdH1cblx0fVxuXG5cdGFzeW5jIGFkZEpvYihcblx0XHRxdWV1ZTogc3RyaW5nLFxuXHRcdGRhdGE6IHVua25vd24sXG5cdFx0b3B0cz86IHsgcHJpb3JpdHk/OiBudW1iZXI7IGRlbGF5PzogbnVtYmVyOyByZXRyaWVzPzogbnVtYmVyOyB0aW1lb3V0PzogbnVtYmVyOyBqb2JJZD86IHN0cmluZyB9LFxuXHQpOiBQcm9taXNlPHN0cmluZz4ge1xuXHRcdGlmICghdGhpcy5jb25uZWN0ZWQgfHwgIXRoaXMuYm9zcykgdGhyb3cgbmV3IEVycm9yKFwiW2Jsb2tdW3BnLWJvc3NdIG5vdCBjb25uZWN0ZWQuIENhbGwgY29ubmVjdCgpIGZpcnN0LlwiKTtcblx0XHQvLyBwZy1ib3NzIHYxMCByZXF1aXJlcyB0aGUgcXVldWUgdG8gZXhpc3QgYmVmb3JlIHNlbmQuIFRoZVxuXHRcdC8vIGNhbGwgaXMgaWRlbXBvdGVudCDigJQgY2hlYXAgdG8gcmVwZWF0IHBlciBhZGQuXG5cdFx0YXdhaXQgdGhpcy5lbnN1cmVRdWV1ZShxdWV1ZSk7XG5cdFx0Ly8gcGctYm9zcyB2MTAncyBgYXR0b3JuZXkuY2hlY2tTZW5kQXJnc2AgcmVqZWN0cyBhbnkgZXhwbGljaXRseVxuXHRcdC8vIHVuZGVmaW5lZCBgcHJpb3JpdHlgIC8gYHJldHJ5TGltaXRgIC8gYHN0YXJ0QWZ0ZXJgIC9cblx0XHQvLyBgZXhwaXJlSW5TZWNvbmRzYCAvIGBzaW5nbGV0b25LZXlgIHdpdGggXCJYIG11c3QgYmUgYW4gaW50ZWdlclwiLlxuXHRcdC8vIEJ1aWxkIHRoZSBvcHRpb25zIG9iamVjdCB3aXRoIG9ubHkgdGhlIGtleXMgd2UgYWN0dWFsbHkgd2FudFxuXHRcdC8vIHNldCDigJQgY2F1Z2h0IGJ5IHRoZSByZWFsLWJyb2tlciBpbnRlZ3JhdGlvbiB0ZXN0IGluXG5cdFx0Ly8gYF9fdGVzdHNfXy9pbnRlZ3JhdGlvbi9wZ2Jvc3MtYWRhcHRlci5yZWFsLXBnLnRlc3QudHNgLlxuXHRcdGNvbnN0IHNlbmRPcHRzOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9IHt9O1xuXHRcdGlmICh0eXBlb2Ygb3B0cz8ucHJpb3JpdHkgPT09IFwibnVtYmVyXCIpIHNlbmRPcHRzLnByaW9yaXR5ID0gb3B0cy5wcmlvcml0eTtcblx0XHRpZiAodHlwZW9mIG9wdHM/LmRlbGF5ID09PSBcIm51bWJlclwiICYmIG9wdHMuZGVsYXkgPiAwKSB7XG5cdFx0XHRzZW5kT3B0cy5zdGFydEFmdGVyID0gTWF0aC5jZWlsKG9wdHMuZGVsYXkgLyAxMDAwKTtcblx0XHR9XG5cdFx0aWYgKHR5cGVvZiBvcHRzPy5yZXRyaWVzID09PSBcIm51bWJlclwiKSBzZW5kT3B0cy5yZXRyeUxpbWl0ID0gb3B0cy5yZXRyaWVzO1xuXHRcdGlmICh0eXBlb2Ygb3B0cz8udGltZW91dCA9PT0gXCJudW1iZXJcIikgc2VuZE9wdHMuZXhwaXJlSW5TZWNvbmRzID0gTWF0aC5jZWlsKG9wdHMudGltZW91dCAvIDEwMDApO1xuXHRcdGlmICh0eXBlb2Ygb3B0cz8uam9iSWQgPT09IFwic3RyaW5nXCIgJiYgb3B0cy5qb2JJZC5sZW5ndGggPiAwKSBzZW5kT3B0cy5zaW5nbGV0b25LZXkgPSBvcHRzLmpvYklkO1xuXG5cdFx0Y29uc3Qgam9iSWQgPSBhd2FpdCB0aGlzLmJvc3Muc2VuZChxdWV1ZSwgZGF0YSwgc2VuZE9wdHMpO1xuXHRcdHJldHVybiBqb2JJZCA/PyBvcHRzPy5qb2JJZCA/PyB1dWlkKCk7XG5cdH1cblxuXHRhc3luYyBzdG9wUHJvY2Vzc2luZyhxdWV1ZTogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG5cdFx0aWYgKCF0aGlzLmNvbm5lY3RlZCB8fCAhdGhpcy5ib3NzKSByZXR1cm47XG5cdFx0dHJ5IHtcblx0XHRcdGF3YWl0IHRoaXMuYm9zcy5vZmZXb3JrKHF1ZXVlKTtcblx0XHR9IGNhdGNoIHtcblx0XHRcdC8qIGlnbm9yZSAqL1xuXHRcdH1cblx0XHR0aGlzLndvcmtJZHMuZGVsZXRlKHF1ZXVlKTtcblx0fVxuXG5cdGlzQ29ubmVjdGVkKCk6IGJvb2xlYW4ge1xuXHRcdHJldHVybiB0aGlzLmNvbm5lY3RlZDtcblx0fVxuXG5cdGFzeW5jIGhlYWx0aENoZWNrKCk6IFByb21pc2U8Ym9vbGVhbj4ge1xuXHRcdGlmICghdGhpcy5jb25uZWN0ZWQgfHwgIXRoaXMuYm9zcykgcmV0dXJuIGZhbHNlO1xuXHRcdHRyeSB7XG5cdFx0XHRhd2FpdCB0aGlzLmJvc3MuZ2V0UXVldWVTaXplKFwiX19oZWFsdGhfY2hlY2tfX1wiKTtcblx0XHRcdHJldHVybiB0cnVlO1xuXHRcdH0gY2F0Y2gge1xuXHRcdFx0Ly8gZ2V0UXVldWVTaXplIG9uIGEgbm9uLWV4aXN0ZW50IHF1ZXVlIG1heSB0aHJvdyDigJQgZmFsbCBiYWNrIHRvXG5cdFx0XHQvLyBcImNvbm5lY3Rpb24gaXMgbGl2ZVwiIGJ5IGNoZWNraW5nIHRoZSBib3NzIGluc3RhbmNlIGF0dHJpYnV0ZS5cblx0XHRcdHJldHVybiB0aGlzLmNvbm5lY3RlZDtcblx0XHR9XG5cdH1cblxuXHRhc3luYyBnZXRRdWV1ZVN0YXRzKHF1ZXVlOiBzdHJpbmcpOiBQcm9taXNlPFdvcmtlclF1ZXVlU3RhdHM+IHtcblx0XHRjb25zdCBjb3VudGVycyA9IHRoaXMuc3RhdHMuZ2V0KHF1ZXVlKSA/PyB7IGNvbXBsZXRlZDogMCwgZmFpbGVkOiAwLCBhY3RpdmU6IDAgfTtcblx0XHRsZXQgd2FpdGluZyA9IDA7XG5cdFx0dHJ5IHtcblx0XHRcdHdhaXRpbmcgPSAoYXdhaXQgdGhpcy5ib3NzPy5nZXRRdWV1ZVNpemUocXVldWUpKSA/PyAwO1xuXHRcdH0gY2F0Y2gge1xuXHRcdFx0LyogaWdub3JlICovXG5cdFx0fVxuXHRcdHJldHVybiB7XG5cdFx0XHR3YWl0aW5nLFxuXHRcdFx0YWN0aXZlOiBjb3VudGVycy5hY3RpdmUsXG5cdFx0XHRjb21wbGV0ZWQ6IGNvdW50ZXJzLmNvbXBsZXRlZCxcblx0XHRcdGZhaWxlZDogY291bnRlcnMuZmFpbGVkLFxuXHRcdFx0ZGVsYXllZDogMCxcblx0XHR9O1xuXHR9XG59XG4iXX0=
278
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUGdCb3NzQWRhcHRlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9hZGFwdGVycy9QZ0Jvc3NBZGFwdGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0F3Qkc7QUFHSCxPQUFPLEVBQUUsRUFBRSxJQUFJLElBQUksRUFBRSxNQUFNLE1BQU0sQ0FBQztBQWtDbEMsTUFBTSxPQUFPLGFBQWE7SUFDaEIsUUFBUSxHQUFHLFNBQWtCLENBQUM7SUFDdEIsTUFBTSxDQUFlO0lBQzlCLElBQUksR0FBMEIsSUFBSSxDQUFDO0lBQ25DLE9BQU8sR0FBd0IsSUFBSSxHQUFHLEVBQUUsQ0FBQztJQUN6QyxTQUFTLEdBQUcsS0FBSyxDQUFDO0lBQ2xCLEtBQUssR0FBb0MsSUFBSSxHQUFHLEVBQUUsQ0FBQztJQUUzRCxZQUFZLE1BQThCO1FBQ3pDLElBQUksQ0FBQyxNQUFNLEdBQUc7WUFDYixnQkFBZ0IsRUFBRSxNQUFNLEVBQUUsZ0JBQWdCLElBQUksT0FBTyxDQUFDLEdBQUcsQ0FBQyxZQUFZLElBQUksZ0NBQWdDO1lBQzFHLE1BQU0sRUFBRSxNQUFNLEVBQUUsTUFBTSxJQUFJLE9BQU8sQ0FBQyxHQUFHLENBQUMsY0FBYyxJQUFJLFFBQVE7U0FDaEUsQ0FBQztJQUNILENBQUM7SUFFRCxLQUFLLENBQUMsT0FBTztRQUNaLElBQUksSUFBSSxDQUFDLFNBQVM7WUFBRSxPQUFPO1FBQzNCLElBQUksQ0FBQztZQUNKLDZEQUE2RDtZQUM3RCw4Q0FBOEM7WUFDOUMsTUFBTSxVQUFVLEdBQUcsU0FBUyxDQUFDO1lBQzdCLDZFQUE2RTtZQUM3RSxNQUFNLEdBQUcsR0FBUSxNQUFNLE1BQU0sQ0FBQyxVQUFVLENBQUMsQ0FBQztZQUMxQyw2RUFBNkU7WUFDN0UsTUFBTSxNQUFNLEdBQVEsR0FBRyxDQUFDLE9BQU8sSUFBSSxHQUFHLENBQUM7WUFDdkMsSUFBSSxDQUFDLElBQUksR0FBRyxJQUFJ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RUFBRSxDQUFDLEVBQUUsQ0FBQztRQUNqRixJQUFJLE9BQU8sR0FBRyxDQUFDLENBQUM7UUFDaEIsSUFBSSxDQUFDO1lBQ0osT0FBTyxHQUFHLENBQUMsTUFBTSxJQUFJLENBQUMsSUFBSSxFQUFFLFlBQVksQ0FBQyxLQUFLLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUN2RCxDQUFDO1FBQUMsTUFBTSxDQUFDO1lBQ1IsWUFBWTtRQUNiLENBQUM7UUFDRCxPQUFPO1lBQ04sT0FBTztZQUNQLE1BQU0sRUFBRSxRQUFRLENBQUMsTUFBTTtZQUN2QixTQUFTLEVBQUUsUUFBUSxDQUFDLFNBQVM7WUFDN0IsTUFBTSxFQUFFLFFBQVEsQ0FBQyxNQUFNO1lBQ3ZCLE9BQU8sRUFBRSxDQUFDO1NBQ1YsQ0FBQztJQUNILENBQUM7Q0FDRCIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogUGdCb3NzQWRhcHRlciDigJQgdjAuNyBQUiA1IOKAlCBXb3JrZXIgYWRhcHRlciBiYWNrZWQgYnkgYHBnLWJvc3NgLFxuICogd2hpY2ggc3RvcmVzIGpvYnMgaW4gUG9zdGdyZVNRTC4gT3BlcmF0aW9uYWxseSBhdHRyYWN0aXZlIHdoZW5cbiAqIFBvc3RncmVzIGlzIGFscmVhZHkgaW4gdGhlIHN0YWNrIOKAlCBubyBleHRyYSBicm9rZXIgaW5mcmEgbmVlZGVkLlxuICpcbiAqIFNlbWFudGljczpcbiAqICAgLSBgcGctYm9zc2AgaGFuZGxlcyBjb25jdXJyZW5jeSwgcmV0cmllcywgZGVhZC1sZXR0ZXIsIHByaW9yaXR5LFxuICogICAgIGRlbGF5cywgYW5kIGV4YWN0bHktb25jZSBzY2hlZHVsaW5nIG5hdGl2ZWx5IOKAlCB0aGUgYWRhcHRlclxuICogICAgIGZvcndhcmRzIGBjb25maWcuY29uY3VycmVuY3lgLCBgY29uZmlnLnJldHJpZXNgLCBldGMuIHRvIHRoZVxuICogICAgIGBib3NzLndvcmsocXVldWUsIG9wdHMsIGhhbmRsZXIpYCBhbmQgYGJvc3Muc2VuZChxdWV1ZSwgZGF0YSwgb3B0cylgXG4gKiAgICAgY2FsbHMgZGlyZWN0bHkuXG4gKiAgIC0gKipTaW5nbGUgY29ubmVjdGlvbiBwZXIgcHJvY2VzcyoqIOKAlCBgcGctYm9zc2AgbWFuYWdlcyBpdHMgb3duXG4gKiAgICAgcG9vbDsgd2UgaW5zdGFudGlhdGUgb25lIGBQZ0Jvc3NgIGluc3RhbmNlIHBlciBgUGdCb3NzQWRhcHRlcmAuXG4gKiAgIC0gKipTY2hlbWEqKjogYHBnLWJvc3NgIGNyZWF0ZXMgaXRzIG93biBzY2hlbWEgKGBwZ2Jvc3NgIGJ5XG4gKiAgICAgZGVmYXVsdCkgb24gZmlyc3Qgc3RhcnQuIFRhYmxlcyBhcmUgbWlncmF0ZWQgYXV0b21hdGljYWxseS5cbiAqXG4gKiBSZXF1aXJlcyBgcGctYm9zc2AgYXMgYSBwZWVyIGRlcGVuZGVuY3k6XG4gKlxuICogICAgIGJ1biBhZGQgcGctYm9zc1xuICpcbiAqIEVudmlyb25tZW50IHZhcmlhYmxlczpcbiAqICAgLSBgREFUQUJBU0VfVVJMYCDigJQgUG9zdGdyZXMgY29ubmVjdGlvbiBzdHJpbmcgKGRlZmF1bHRcbiAqICAgICBgcG9zdGdyZXM6Ly9sb2NhbGhvc3Q6NTQzMi9ibG9rYCkuXG4gKiAgIC0gYFBHX0JPU1NfU0NIRU1BYCDigJQgc2NoZW1hIG5hbWUgKGRlZmF1bHQgYFwicGdib3NzXCJgKS5cbiAqL1xuXG5pbXBvcnQgdHlwZSB7IFdvcmtlclRyaWdnZXJPcHRzIH0gZnJvbSBcIkBibG9ranMvaGVscGVyXCI7XG5pbXBvcnQgeyB2NCBhcyB1dWlkIH0gZnJvbSBcInV1aWRcIjtcbmltcG9ydCB0eXBlIHsgV29ya2VyQWRhcHRlciwgV29ya2VySm9iLCBXb3JrZXJRdWV1ZVN0YXRzIH0gZnJvbSBcIi4uL1dvcmtlclRyaWdnZXJcIjtcblxuZXhwb3J0IGludGVyZmFjZSBQZ0Jvc3NDb25maWcge1xuXHRjb25uZWN0aW9uU3RyaW5nOiBzdHJpbmc7XG5cdHNjaGVtYT86IHN0cmluZztcbn1cblxuaW50ZXJmYWNlIFBnQm9zc0luc3RhbmNlIHtcblx0c3RhcnQoKTogUHJvbWlzZTx1bmtub3duPjtcblx0c3RvcChvcHRzPzogeyBncmFjZWZ1bD86IGJvb2xlYW4gfSk6IFByb21pc2U8dm9pZD47XG5cdGNyZWF0ZVF1ZXVlKHF1ZXVlOiBzdHJpbmcsIG9wdHM/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPik6IFByb21pc2U8dW5rbm93bj47XG5cdHNlbmQocXVldWU6IHN0cmluZywgZGF0YTogdW5rbm93biwgb3B0cz86IFJlY29yZDxzdHJpbmcsIHVua25vd24+KTogUHJvbWlzZTxzdHJpbmcgfCBudWxsPjtcblx0d29yayhcblx0XHRxdWV1ZTogc3RyaW5nLFxuXHRcdG9wdHM6IFJlY29yZDxzdHJpbmcsIHVua25vd24+LFxuXHRcdGhhbmRsZXI6IChqb2I6IFBnQm9zc0pvYiB8IFBnQm9zc0pvYltdKSA9PiBQcm9taXNlPHVua25vd24+LFxuXHQpOiBQcm9taXNlPHN0cmluZz47XG5cdG9mZldvcmsocXVldWU6IHN0cmluZyk6IFByb21pc2U8dm9pZD47XG5cdGdldFF1ZXVlU2l6ZShxdWV1ZTogc3RyaW5nKTogUHJvbWlzZTxudW1iZXI+O1xufVxuXG5pbnRlcmZhY2UgUGdCb3NzSm9iIHtcblx0aWQ6IHN0cmluZztcblx0ZGF0YTogdW5rbm93bjtcblx0bmFtZTogc3RyaW5nO1xufVxuXG5pbnRlcmZhY2UgUXVldWVTdGF0c0NvdW50ZXJzIHtcblx0Y29tcGxldGVkOiBudW1iZXI7XG5cdGZhaWxlZDogbnVtYmVyO1xuXHRhY3RpdmU6IG51bWJlcjtcbn1cblxuZXhwb3J0IGNsYXNzIFBnQm9zc0FkYXB0ZXIgaW1wbGVtZW50cyBXb3JrZXJBZGFwdGVyIHtcblx0cmVhZG9ubHkgcHJvdmlkZXIgPSBcInBnLWJvc3NcIiBhcyBjb25zdDtcblx0cHJpdmF0ZSByZWFkb25seSBjb25maWc6IFBnQm9zc0NvbmZpZztcblx0cHJpdmF0ZSBib3NzOiBQZ0Jvc3NJbnN0YW5jZSB8IG51bGwgPSBudWxsO1xuXHRwcml2YXRlIHdvcmtJZHM6IE1hcDxzdHJpbmcsIHN0cmluZz4gPSBuZXcgTWFwKCk7XG5cdHByaXZhdGUgY29ubmVjdGVkID0gZmFsc2U7XG5cdHByaXZhdGUgc3RhdHM6IE1hcDxzdHJpbmcsIFF1ZXVlU3RhdHNDb3VudGVycz4gPSBuZXcgTWFwKCk7XG5cblx0Y29uc3RydWN0b3IoY29uZmlnPzogUGFydGlhbDxQZ0Jvc3NDb25maWc+KSB7XG5cdFx0dGhpcy5jb25maWcgPSB7XG5cdFx0XHRjb25uZWN0aW9uU3RyaW5nOiBjb25maWc/LmNvbm5lY3Rpb25TdHJpbmcgPz8gcHJvY2Vzcy5lbnYuREFUQUJBU0VfVVJMID8/IFwicG9zdGdyZXM6Ly9sb2NhbGhvc3Q6NTQzMi9ibG9rXCIsXG5cdFx0XHRzY2hlbWE6IGNvbmZpZz8uc2NoZW1hID8/IHByb2Nlc3MuZW52LlBHX0JPU1NfU0NIRU1BID8/IFwicGdib3NzXCIsXG5cdFx0fTtcblx0fVxuXG5cdGFzeW5jIGNvbm5lY3QoKTogUHJvbWlzZTx2b2lkPiB7XG5cdFx0aWYgKHRoaXMuY29ubmVjdGVkKSByZXR1cm47XG5cdFx0dHJ5IHtcblx0XHRcdC8vIEluZGlyZWN0IHNwZWNpZmllciBzbyB0c2MgZG9lc24ndCB0cnkgdG8gcmVzb2x2ZSB0eXBlcyBmb3Jcblx0XHRcdC8vIHRoZSBvcHRpb25hbCBwZWVyIGRlcGVuZGVuY3kgYXQgYnVpbGQgdGltZS5cblx0XHRcdGNvbnN0IG1vZHVsZU5hbWUgPSBcInBnLWJvc3NcIjtcblx0XHRcdC8vIGJpb21lLWlnbm9yZSBsaW50L3N1c3BpY2lvdXMvbm9FeHBsaWNpdEFueTogcGctYm9zcyBpcyBhIHJ1bnRpbWUgcGVlciBkZXAuXG5cdFx0XHRjb25zdCBtb2Q6IGFueSA9IGF3YWl0IGltcG9ydChtb2R1bGVOYW1lKTtcblx0XHRcdC8vIGJpb21lLWlnbm9yZSBsaW50L3N1c3BpY2lvdXMvbm9FeHBsaWNpdEFueTogcGctYm9zcyBpcyBhIHJ1bnRpbWUgcGVlciBkZXAuXG5cdFx0XHRjb25zdCBQZ0Jvc3M6IGFueSA9IG1vZC5kZWZhdWx0ID8/IG1vZDtcblx0XHRcdHRoaXMuYm9zcyA9IG5ldyBQZ0Jvc3Moe1xuXHRcdFx0XHRjb25uZWN0aW9uU3RyaW5nOiB0aGlzLmNvbmZpZy5jb25uZWN0aW9uU3RyaW5nLFxuXHRcdFx0XHRzY2hlbWE6IHRoaXMuY29uZmlnLnNjaGVtYSxcblx0XHRcdH0pIGFzIFBnQm9zc0luc3RhbmNlO1xuXHRcdFx0YXdhaXQgdGhpcy5ib3NzLnN0YXJ0KCk7XG5cdFx0XHR0aGlzLmNvbm5lY3RlZCA9IHRydWU7XG5cdFx0fSBjYXRjaCAoZXJyKSB7XG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IoXG5cdFx0XHRcdGBbYmxva11bcGctYm9zc10gY29ubmVjdCBmYWlsZWQ6ICR7KGVyciBhcyBFcnJvcikubWVzc2FnZX0uIEluc3RhbGwgcGctYm9zcyBhcyBhIHBlZXIgZGVwZW5kZW5jeTogYnVuIGFkZCBwZy1ib3NzYCxcblx0XHRcdCk7XG5cdFx0fVxuXHR9XG5cblx0YXN5bmMgZGlzY29ubmVjdCgpOiBQcm9taXNlPHZvaWQ+IHtcblx0XHRpZiAoIXRoaXMuY29ubmVjdGVkKSByZXR1cm47XG5cdFx0dHJ5IHtcblx0XHRcdGF3YWl0IHRoaXMuYm9zcz8uc3RvcCh7IGdyYWNlZnVsOiB0cnVlIH0pO1xuXHRcdH0gY2F0Y2gge1xuXHRcdFx0LyogaWdub3JlICovXG5cdFx0fVxuXHRcdHRoaXMud29ya0lkcy5jbGVhcigpO1xuXHRcdHRoaXMuYm9zcyA9IG51bGw7XG5cdFx0dGhpcy5jb25uZWN0ZWQgPSBmYWxzZTtcblx0fVxuXG5cdGFzeW5jIHByb2Nlc3MoY29uZmlnOiBXb3JrZXJUcmlnZ2VyT3B0cywgaGFuZGxlcjogKGpvYjogV29ya2VySm9iKSA9PiBQcm9taXNlPHZvaWQ+KTogUHJvbWlzZTx2b2lkPiB7XG5cdFx0aWYgKCF0aGlzLmNvbm5lY3RlZCB8fCAhdGhpcy5ib3NzKSB0aHJvdyBuZXcgRXJyb3IoXCJbYmxva11bcGctYm9zc10gbm90IGNvbm5lY3RlZC4gQ2FsbCBjb25uZWN0KCkgZmlyc3QuXCIpO1xuXHRcdHRoaXMuc3RhdHMuc2V0KGNvbmZpZy5xdWV1ZSwgeyBjb21wbGV0ZWQ6IDAsIGZhaWxlZDogMCwgYWN0aXZlOiAwIH0pO1xuXHRcdGNvbnN0IHN0YXRzID0gdGhpcy5zdGF0cy5nZXQoY29uZmlnLnF1ZXVlKSBhcyBRdWV1ZVN0YXRzQ291bnRlcnM7XG5cblx0XHQvLyBwZy1ib3NzIHYxMCByZXF1aXJlcyBleHBsaWNpdCBxdWV1ZSBjcmVhdGlvbiBiZWZvcmUgc2VuZC93b3JrLlxuXHRcdC8vIFRoZSBjYWxsIGlzIGlkZW1wb3RlbnQg4oCUIHN1Y2NlZWRzIHdoZXRoZXIgdGhlIHF1ZXVlIGV4aXN0cyBvclxuXHRcdC8vIG5vdCDigJQgc28gdGhpcyBpcyBzYWZlIHRvIHJlcGVhdCBhY3Jvc3MgcmUtZW50cmllcy5cblx0XHRhd2FpdCB0aGlzLmVuc3VyZVF1ZXVlKGNvbmZpZy5xdWV1ZSwgY29uZmlnKTtcblxuXHRcdC8vIHBnLWJvc3MgdjEwJ3MgaGFuZGxlciByZWNlaXZlcyBhbiBBUlJBWSBvZiBqb2JzIChiYXRjaCk7IHRoZVxuXHRcdC8vIGBiYXRjaFNpemVgIG9wdGlvbiBjYXBzIGhvdyBtYW55IGpvYnMgb25lIHBvbGwgZmV0Y2hlcy4gcGctYm9zc1xuXHRcdC8vIGhhcyBubyBwZXItam9iIGBjb25jdXJyZW5jeWAvYHRlYW1TaXplYCBrbm9iIOKAlCBpdHMgdW5pdCBvZlxuXHRcdC8vIHBhcmFsbGVsaXNtIGlzIHRoZSBiYXRjaCB0aGUgaGFuZGxlciBpcyBoYW5kZWQg4oCUIHNvIHdlIG1hcFxuXHRcdC8vIGBjb25maWcuY29uY3VycmVuY3lgICh0aGUgcmVxdWVzdGVkIHBhcmFsbGVsaXNtKSB0byBgYmF0Y2hTaXplYC5cblx0XHQvLyBUaGUgaGFuZGxlciBsb29wIGJlbG93IHByb2Nlc3NlcyB0aGUgYmF0Y2g7IGpvYnMgd2l0aGluIGl0IHJ1blxuXHRcdC8vIHNlcXVlbnRpYWxseSBpbiB0aGlzIHByb2Nlc3MsIGJ1dCBhIGxhcmdlciBiYXRjaCBtZWFucyBtb3JlIGpvYnNcblx0XHQvLyBkcmFpbmVkIHBlciBwb2xsICg9IGhpZ2hlciBlZmZlY3RpdmUgdGhyb3VnaHB1dCkuIGBjb25jdXJyZW5jeWBcblx0XHQvLyBkZWZhdWx0cyB0byAxIGluIHRoZSB3b3JrZXIgc2NoZW1hIOKGkiBzaW5nbGUtam9iIGZldGNoLCBtYXRjaGluZ1xuXHRcdC8vIHRoZSBwcmlvciBiZWhhdmlvdXIuIGBwb2xsaW5nSW50ZXJ2YWxTZWNvbmRzYCBkZWZhdWx0cyB0byAyc1xuXHRcdC8vIHdoaWNoIGFkZHMgfjJzIGxhdGVuY3kgb24gdGhlIGhhcHB5IHBhdGgg4oCUIHRpZ2h0ZW4gdmlhIGNvbmZpZy5cblx0XHRjb25zdCBiYXRjaFNpemUgPSBjb25maWcuY29uY3VycmVuY3kgJiYgY29uZmlnLmNvbmN1cnJlbmN5ID4gMCA/IGNvbmZpZy5jb25jdXJyZW5jeSA6IDE7XG5cdFx0Y29uc3QgaWQgPSBhd2FpdCB0aGlzLmJvc3Mud29yayhcblx0XHRcdGNvbmZpZy5xdWV1ZSxcblx0XHRcdHtcblx0XHRcdFx0YmF0Y2hTaXplLFxuXHRcdFx0XHRpbmNsdWRlTWV0YWRhdGE6IHRydWUsXG5cdFx0XHR9LFxuXHRcdFx0YXN5bmMgKGpvYk9yQmF0Y2gpID0+IHtcblx0XHRcdFx0Y29uc3Qgam9icyA9IEFycmF5LmlzQXJyYXkoam9iT3JCYXRjaCkgPyBqb2JPckJhdGNoIDogW2pvYk9yQmF0Y2hdO1xuXHRcdFx0XHRmb3IgKGNvbnN0IGpvYiBvZiBqb2JzKSB7XG5cdFx0XHRcdFx0YXdhaXQgdGhpcy5ydW5PbmVKb2IoY29uZmlnLCBoYW5kbGVyLCBzdGF0cywgam9iKTtcblx0XHRcdFx0fVxuXHRcdFx0fSxcblx0XHQpO1xuXHRcdHRoaXMud29ya0lkcy5zZXQoY29uZmlnLnF1ZXVlLCBpZCk7XG5cdH1cblxuXHRwcml2YXRlIGFzeW5jIHJ1bk9uZUpvYihcblx0XHRjb25maWc6IFdvcmtlclRyaWdnZXJPcHRzLFxuXHRcdGhhbmRsZXI6IChqb2I6IFdvcmtlckpvYikgPT4gUHJvbWlzZTx2b2lkPixcblx0XHRzdGF0czogUXVldWVTdGF0c0NvdW50ZXJzLFxuXHRcdGpvYjogUGdCb3NzSm9iLFxuXHQpOiBQcm9taXNlPHZvaWQ+IHtcblx0XHRzdGF0cy5hY3RpdmUgKz0gMTtcblx0XHQvLyBUcmFja3Mgd2hldGhlciBzdGF0cyBoYXZlIGFscmVhZHkgYmVlbiBjb3VudGVkIGJ5IHRoZVxuXHRcdC8vIFdvcmtlckpvYiBBUEkgKGBjb21wbGV0ZWAgLyBgZmFpbGApLiBXaXRob3V0IHRoaXMsIGJvdGhcblx0XHQvLyB0aGUgY2FsbGJhY2sgYW5kIHRoZSB3cmFwcGVyJ3MgdHJ5L2NhdGNoIGNyZWRpdCB0aGUgc2FtZVxuXHRcdC8vIG91dGNvbWUsIGRvdWJsZS1jb3VudGluZyBgc3RhdHMuY29tcGxldGVkYCAvXG5cdFx0Ly8gYHN0YXRzLmZhaWxlZGAuIHBnLWJvc3MgaXRzZWxmIGhhbmRsZXMgYWNrL3JldHJ5L0RMUSB2aWFcblx0XHQvLyB0aGUgaGFuZGxlcidzIHJldHVybi12cy10aHJvdyDigJQgdGhlc2UgY2FsbGJhY2tzIGV4aXN0XG5cdFx0Ly8gcHVyZWx5IGZvciBzdGF0cyBwYXJpdHkgd2l0aCB0aGUgb3RoZXIgd29ya2VyIGFkYXB0ZXJzLlxuXHRcdGxldCBzZXR0bGVkID0gZmFsc2U7XG5cdFx0Y29uc3Qgd29ya2VySm9iOiBXb3JrZXJKb2IgPSB7XG5cdFx0XHRpZDogam9iLmlkLFxuXHRcdFx0ZGF0YTogam9iLmRhdGEsXG5cdFx0XHRoZWFkZXJzOiB7fSxcblx0XHRcdHF1ZXVlOiBjb25maWcucXVldWUsXG5cdFx0XHRwcmlvcml0eTogY29uZmlnLnByaW9yaXR5ID8/IDAsXG5cdFx0XHRhdHRlbXB0czogMCxcblx0XHRcdG1heFJldHJpZXM6IGNvbmZpZy5yZXRyaWVzID8/IDAsXG5cdFx0XHRjcmVhdGVkQXQ6IG5ldyBEYXRlKCksXG5cdFx0XHR0aW1lb3V0OiBjb25maWcudGltZW91dCxcblx0XHRcdHJhdzogam9iLFxuXHRcdFx0Y29tcGxldGU6IGFzeW5jICgpID0+IHtcblx0XHRcdFx0aWYgKHNldHRsZWQpIHJldHVybjtcblx0XHRcdFx0c3RhdHMuY29tcGxldGVkICs9IDE7XG5cdFx0XHRcdHNldHRsZWQgPSB0cnVlO1xuXHRcdFx0fSxcblx0XHRcdGZhaWw6IGFzeW5jIChlcnI6IEVycm9yKSA9PiB7XG5cdFx0XHRcdGlmIChzZXR0bGVkKSByZXR1cm47XG5cdFx0XHRcdHN0YXRzLmZhaWxlZCArPSAxO1xuXHRcdFx0XHRzZXR0bGVkID0gdHJ1ZTtcblx0XHRcdFx0Ly8gUmUtdGhyb3cgc28gcGctYm9zcydzIGBib3NzLndvcmtgIHNlZXMgdGhlIGhhbmRsZXJcblx0XHRcdFx0Ly8gZmFpbHVyZSBhbmQgc2NoZWR1bGVzIGEgcmV0cnkgLyBkcm9wcyB0byBETFEgcGVyXG5cdFx0XHRcdC8vIHRoZSBxdWV1ZSBjb25maWcg4oCUIHRoZSBjb250cmFjdCBpcyBcImhhbmRsZXIgdGhyb3dzXG5cdFx0XHRcdC8vID0+IGpvYiBmYWlsZWRcIi5cblx0XHRcdFx0dGhyb3cgZXJyO1xuXHRcdFx0fSxcblx0XHR9O1xuXHRcdHRyeSB7XG5cdFx0XHRhd2FpdCBoYW5kbGVyKHdvcmtlckpvYik7XG5cdFx0XHRpZiAoIXNldHRsZWQpIHtcblx0XHRcdFx0c3RhdHMuY29tcGxldGVkICs9IDE7XG5cdFx0XHRcdHNldHRsZWQgPSB0cnVlO1xuXHRcdFx0fVxuXHRcdH0gY2F0Y2ggKGVycikge1xuXHRcdFx0aWYgKCFzZXR0bGVkKSB7XG5cdFx0XHRcdHN0YXRzLmZhaWxlZCArPSAxO1xuXHRcdFx0XHRzZXR0bGVkID0gdHJ1ZTtcblx0XHRcdH1cblx0XHRcdHRocm93IGVycjtcblx0XHR9IGZpbmFsbHkge1xuXHRcdFx0c3RhdHMuYWN0aXZlID0gTWF0aC5tYXgoMCwgc3RhdHMuYWN0aXZlIC0gMSk7XG5cdFx0fVxuXHR9XG5cblx0cHJpdmF0ZSBhc3luYyBlbnN1cmVRdWV1ZShxdWV1ZTogc3RyaW5nLCBjb25maWc/OiBXb3JrZXJUcmlnZ2VyT3B0cyk6IFByb21pc2U8dm9pZD4ge1xuXHRcdGlmICghdGhpcy5ib3NzKSByZXR1cm47XG5cdFx0Ly8gUGVyLXF1ZXVlIHJvdXRpbmcvcmV0cnkgcG9saWN5LiBwZy1ib3NzIDEwIGFwcGxpZXMgdGhlc2UgYXQgdGhlXG5cdFx0Ly8gUVVFVUUgbGV2ZWwgKHRoZSBgY3JlYXRlUXVldWVgIG9wdGlvbnMpLCBub3Qgb24gYHdvcmsoKWAg4oCUIGFcblx0XHQvLyBmYWlsZWQgam9iIGlzIHJldHJpZWQgYHJldHJ5TGltaXRgIHRpbWVzIHRoZW4gcm91dGVkIHRvIHRoZVxuXHRcdC8vIGBkZWFkTGV0dGVyYCBxdWV1ZSBhdXRvbWF0aWNhbGx5LiBUaGUgRExRIGlzIGl0c2VsZiBhIHF1ZXVlLCBzb1xuXHRcdC8vIGl0IG11c3QgZXhpc3QgYmVmb3JlIGl0IGNhbiByZWNlaXZlIGRlYWQtbGV0dGVyZWQgam9icy5cblx0XHRjb25zdCBxdWV1ZU9wdHM6IFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0geyBuYW1lOiBxdWV1ZSB9O1xuXHRcdGNvbnN0IGRscSA9IGNvbmZpZz8uZGVhZExldHRlclF1ZXVlO1xuXHRcdGlmICh0eXBlb2YgZGxxID09PSBcInN0cmluZ1wiICYmIGRscS5sZW5ndGggPiAwKSB7XG5cdFx0XHRxdWV1ZU9wdHMuZGVhZExldHRlciA9IGRscTtcblx0XHRcdGF3YWl0IHRoaXMuY3JlYXRlUXVldWVJZGVtcG90ZW50KGRscSwgeyBuYW1lOiBkbHEgfSk7XG5cdFx0fVxuXHRcdGlmICh0eXBlb2YgY29uZmlnPy5yZXRyaWVzID09PSBcIm51bWJlclwiKSBxdWV1ZU9wdHMucmV0cnlMaW1pdCA9IGNvbmZpZy5yZXRyaWVzO1xuXHRcdGlmICh0eXBlb2YgY29uZmlnPy50aW1lb3V0ID09PSBcIm51bWJlclwiICYmIGNvbmZpZy50aW1lb3V0ID4gMCkge1xuXHRcdFx0cXVldWVPcHRzLmV4cGlyZUluU2Vjb25kcyA9IE1hdGguY2VpbChjb25maWcudGltZW91dCAvIDEwMDApO1xuXHRcdH1cblx0XHRhd2FpdCB0aGlzLmNyZWF0ZVF1ZXVlSWRlbXBvdGVudChxdWV1ZSwgcXVldWVPcHRzKTtcblx0fVxuXG5cdHByaXZhdGUgYXN5bmMgY3JlYXRlUXVldWVJZGVtcG90ZW50KHF1ZXVlOiBzdHJpbmcsIG9wdHM6IFJlY29yZDxzdHJpbmcsIHVua25vd24+KTogUHJvbWlzZTx2b2lkPiB7XG5cdFx0aWYgKCF0aGlzLmJvc3MpIHJldHVybjtcblx0XHR0cnkge1xuXHRcdFx0YXdhaXQgdGhpcy5ib3NzLmNyZWF0ZVF1ZXVlKHF1ZXVlLCBvcHRzKTtcblx0XHR9IGNhdGNoIChlcnIpIHtcblx0XHRcdC8vIHBnLWJvc3MgdjEwJ3MgY3JlYXRlUXVldWUgaXMgaWRlbXBvdGVudCBidXQgbWF5IHRocm93IG9uXG5cdFx0XHQvLyByYWNlIGNvbmRpdGlvbnMgd2hlbiBtdWx0aXBsZSBwcm9jZXNzZXMgY2FsbCBpdCBjb25jdXJyZW50bHlcblx0XHRcdC8vIGFnYWluc3QgYSBmcmVzaCBzY2hlbWEg4oCUIHRob3NlIGVycm9ycyBhcmUgaGFybWxlc3Mgb25jZSB0aGVcblx0XHRcdC8vIHF1ZXVlIGV4aXN0cy4gU3dhbGxvdyArIGxldCBkb3duc3RyZWFtIHNlbmQvd29yayBzdXJmYWNlIGFcblx0XHRcdC8vIHJlYWwgcHJvYmxlbSBpZiB0aGUgcXVldWUgaXNuJ3QgdXNhYmxlLlxuXHRcdFx0Y29uc3QgbWVzc2FnZSA9IChlcnIgYXMgRXJyb3IpLm1lc3NhZ2UgPz8gXCJcIjtcblx0XHRcdGlmICghbWVzc2FnZS5pbmNsdWRlcyhcImFscmVhZHkgZXhpc3RzXCIpKSB7XG5cdFx0XHRcdC8vIExvZyB0aGUgdW5leHBlY3RlZCBjYXNlIGJ1dCBkb24ndCBwcm9wYWdhdGUg4oCUIG9wZXJhdG9yc1xuXHRcdFx0XHQvLyBzaG91bGRuJ3Qgc2VlIGEgcXVldWUtY3JlYXRpb24gcmFjZSBibG93IHVwIHRoZWlyXG5cdFx0XHRcdC8vIHRyaWdnZXIgYm9vdCBwYXRoLlxuXHRcdFx0XHRjb25zb2xlLndhcm4oYFtibG9rXVtwZy1ib3NzXSBlbnN1cmVRdWV1ZSgke3F1ZXVlfSkgd2FybmluZzpgLCBtZXNzYWdlKTtcblx0XHRcdH1cblx0XHR9XG5cdH1cblxuXHRhc3luYyBhZGRKb2IoXG5cdFx0cXVldWU6IHN0cmluZyxcblx0XHRkYXRhOiB1bmtub3duLFxuXHRcdG9wdHM/OiB7IHByaW9yaXR5PzogbnVtYmVyOyBkZWxheT86IG51bWJlcjsgcmV0cmllcz86IG51bWJlcjsgdGltZW91dD86IG51bWJlcjsgam9iSWQ/OiBzdHJpbmcgfSxcblx0KTogUHJvbWlzZTxzdHJpbmc+IHtcblx0XHRpZiAoIXRoaXMuY29ubmVjdGVkIHx8ICF0aGlzLmJvc3MpIHRocm93IG5ldyBFcnJvcihcIltibG9rXVtwZy1ib3NzXSBub3QgY29ubmVjdGVkLiBDYWxsIGNvbm5lY3QoKSBmaXJzdC5cIik7XG5cdFx0Ly8gcGctYm9zcyB2MTAgcmVxdWlyZXMgdGhlIHF1ZXVlIHRvIGV4aXN0IGJlZm9yZSBzZW5kLiBUaGVcblx0XHQvLyBjYWxsIGlzIGlkZW1wb3RlbnQg4oCUIGNoZWFwIHRvIHJlcGVhdCBwZXIgYWRkLlxuXHRcdGF3YWl0IHRoaXMuZW5zdXJlUXVldWUocXVldWUpO1xuXHRcdC8vIHBnLWJvc3MgdjEwJ3MgYGF0dG9ybmV5LmNoZWNrU2VuZEFyZ3NgIHJlamVjdHMgYW55IGV4cGxpY2l0bHlcblx0XHQvLyB1bmRlZmluZWQgYHByaW9yaXR5YCAvIGByZXRyeUxpbWl0YCAvIGBzdGFydEFmdGVyYCAvXG5cdFx0Ly8gYGV4cGlyZUluU2Vjb25kc2AgLyBgc2luZ2xldG9uS2V5YCB3aXRoIFwiWCBtdXN0IGJlIGFuIGludGVnZXJcIi5cblx0XHQvLyBCdWlsZCB0aGUgb3B0aW9ucyBvYmplY3Qgd2l0aCBvbmx5IHRoZSBrZXlzIHdlIGFjdHVhbGx5IHdhbnRcblx0XHQvLyBzZXQg4oCUIGNhdWdodCBieSB0aGUgcmVhbC1icm9rZXIgaW50ZWdyYXRpb24gdGVzdCBpblxuXHRcdC8vIGBfX3Rlc3RzX18vaW50ZWdyYXRpb24vcGdib3NzLWFkYXB0ZXIucmVhbC1wZy50ZXN0LnRzYC5cblx0XHRjb25zdCBzZW5kT3B0czogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPSB7fTtcblx0XHRpZiAodHlwZW9mIG9wdHM/LnByaW9yaXR5ID09PSBcIm51bWJlclwiKSBzZW5kT3B0cy5wcmlvcml0eSA9IG9wdHMucHJpb3JpdHk7XG5cdFx0aWYgKHR5cGVvZiBvcHRzPy5kZWxheSA9PT0gXCJudW1iZXJcIiAmJiBvcHRzLmRlbGF5ID4gMCkge1xuXHRcdFx0c2VuZE9wdHMuc3RhcnRBZnRlciA9IE1hdGguY2VpbChvcHRzLmRlbGF5IC8gMTAwMCk7XG5cdFx0fVxuXHRcdGlmICh0eXBlb2Ygb3B0cz8ucmV0cmllcyA9PT0gXCJudW1iZXJcIikgc2VuZE9wdHMucmV0cnlMaW1pdCA9IG9wdHMucmV0cmllcztcblx0XHRpZiAodHlwZW9mIG9wdHM/LnRpbWVvdXQgPT09IFwibnVtYmVyXCIpIHNlbmRPcHRzLmV4cGlyZUluU2Vjb25kcyA9IE1hdGguY2VpbChvcHRzLnRpbWVvdXQgLyAxMDAwKTtcblx0XHRpZiAodHlwZW9mIG9wdHM/LmpvYklkID09PSBcInN0cmluZ1wiICYmIG9wdHMuam9iSWQubGVuZ3RoID4gMCkgc2VuZE9wdHMuc2luZ2xldG9uS2V5ID0gb3B0cy5qb2JJZDtcblxuXHRcdGNvbnN0IGpvYklkID0gYXdhaXQgdGhpcy5ib3NzLnNlbmQocXVldWUsIGRhdGEsIHNlbmRPcHRzKTtcblx0XHRyZXR1cm4gam9iSWQgPz8gb3B0cz8uam9iSWQgPz8gdXVpZCgpO1xuXHR9XG5cblx0YXN5bmMgc3RvcFByb2Nlc3NpbmcocXVldWU6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuXHRcdGlmICghdGhpcy5jb25uZWN0ZWQgfHwgIXRoaXMuYm9zcykgcmV0dXJuO1xuXHRcdHRyeSB7XG5cdFx0XHRhd2FpdCB0aGlzLmJvc3Mub2ZmV29yayhxdWV1ZSk7XG5cdFx0fSBjYXRjaCB7XG5cdFx0XHQvKiBpZ25vcmUgKi9cblx0XHR9XG5cdFx0dGhpcy53b3JrSWRzLmRlbGV0ZShxdWV1ZSk7XG5cdH1cblxuXHRpc0Nvbm5lY3RlZCgpOiBib29sZWFuIHtcblx0XHRyZXR1cm4gdGhpcy5jb25uZWN0ZWQ7XG5cdH1cblxuXHRhc3luYyBoZWFsdGhDaGVjaygpOiBQcm9taXNlPGJvb2xlYW4+IHtcblx0XHRpZiAoIXRoaXMuY29ubmVjdGVkIHx8ICF0aGlzLmJvc3MpIHJldHVybiBmYWxzZTtcblx0XHR0cnkge1xuXHRcdFx0YXdhaXQgdGhpcy5ib3NzLmdldFF1ZXVlU2l6ZShcIl9faGVhbHRoX2NoZWNrX19cIik7XG5cdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHR9IGNhdGNoIHtcblx0XHRcdC8vIGdldFF1ZXVlU2l6ZSBvbiBhIG5vbi1leGlzdGVudCBxdWV1ZSBtYXkgdGhyb3cg4oCUIGZhbGwgYmFjayB0b1xuXHRcdFx0Ly8gXCJjb25uZWN0aW9uIGlzIGxpdmVcIiBieSBjaGVja2luZyB0aGUgYm9zcyBpbnN0YW5jZSBhdHRyaWJ1dGUuXG5cdFx0XHRyZXR1cm4gdGhpcy5jb25uZWN0ZWQ7XG5cdFx0fVxuXHR9XG5cblx0YXN5bmMgZ2V0UXVldWVTdGF0cyhxdWV1ZTogc3RyaW5nKTogUHJvbWlzZTxXb3JrZXJRdWV1ZVN0YXRzPiB7XG5cdFx0Y29uc3QgY291bnRlcnMgPSB0aGlzLnN0YXRzLmdldChxdWV1ZSkgPz8geyBjb21wbGV0ZWQ6IDAsIGZhaWxlZDogMCwgYWN0aXZlOiAwIH07XG5cdFx0bGV0IHdhaXRpbmcgPSAwO1xuXHRcdHRyeSB7XG5cdFx0XHR3YWl0aW5nID0gKGF3YWl0IHRoaXMuYm9zcz8uZ2V0UXVldWVTaXplKHF1ZXVlKSkgPz8gMDtcblx0XHR9IGNhdGNoIHtcblx0XHRcdC8qIGlnbm9yZSAqL1xuXHRcdH1cblx0XHRyZXR1cm4ge1xuXHRcdFx0d2FpdGluZyxcblx0XHRcdGFjdGl2ZTogY291bnRlcnMuYWN0aXZlLFxuXHRcdFx0Y29tcGxldGVkOiBjb3VudGVycy5jb21wbGV0ZWQsXG5cdFx0XHRmYWlsZWQ6IGNvdW50ZXJzLmZhaWxlZCxcblx0XHRcdGRlbGF5ZWQ6IDAsXG5cdFx0fTtcblx0fVxufVxuIl19
@@ -9,8 +9,9 @@
9
9
  * - Retries via `nack` with requeue=true until `retries` is hit, then
10
10
  * drop or DLQ-route based on `deadLetterQueue` config.
11
11
  * - Priorities via the `x-max-priority` queue arg (AMQP standard).
12
- * - Delayed delivery via the `x-delayed-message` plugin when
13
- * available; falls back to immediate dispatch otherwise.
12
+ * - Delayed delivery requires the `rabbitmq_delayed_message_exchange`
13
+ * plugin; `opts.delay` throws a clear config error when used against a
14
+ * broker without it rather than silently delivering immediately.
14
15
  *
15
16
  * Requires `amqplib` as a peer dependency:
16
17
  *
@@ -9,8 +9,9 @@
9
9
  * - Retries via `nack` with requeue=true until `retries` is hit, then
10
10
  * drop or DLQ-route based on `deadLetterQueue` config.
11
11
  * - Priorities via the `x-max-priority` queue arg (AMQP standard).
12
- * - Delayed delivery via the `x-delayed-message` plugin when
13
- * available; falls back to immediate dispatch otherwise.
12
+ * - Delayed delivery requires the `rabbitmq_delayed_message_exchange`
13
+ * plugin; `opts.delay` throws a clear config error when used against a
14
+ * broker without it rather than silently delivering immediately.
14
15
  *
15
16
  * Requires `amqplib` as a peer dependency:
16
17
  *
@@ -21,6 +22,21 @@
21
22
  * - `AMQP_VHOST` — virtual host (default `/`).
22
23
  */
23
24
  import { v4 as uuid } from "uuid";
25
+ // AMQP priority queues cap at 255 (x-max-priority is a uint8). Pin the
26
+ // declared ceiling so any caller-supplied priority is honoured without the
27
+ // queue needing per-call re-declaration.
28
+ const MAX_PRIORITY = 255;
29
+ /**
30
+ * Inject a vhost into an AMQP connection string. amqplib reads the vhost from
31
+ * the URL path for string URLs, so the configured vhost has to live there.
32
+ * The default vhost "/" must be percent-encoded (`%2F`) — a literal slash in
33
+ * the path would be parsed as a sub-path, not the root vhost.
34
+ */
35
+ function withVhost(url, vhost) {
36
+ const u = new URL(url);
37
+ u.pathname = `/${encodeURIComponent(vhost)}`;
38
+ return u.toString();
39
+ }
24
40
  export class RabbitMQAdapter {
25
41
  provider = "rabbitmq";
26
42
  config;
@@ -40,7 +56,13 @@ export class RabbitMQAdapter {
40
56
  try {
41
57
  // biome-ignore lint/suspicious/noExplicitAny: amqplib's connect returns a loose ConnectionLike.
42
58
  const amqp = await import("amqplib");
43
- this.conn = (await amqp.connect(this.config.url, { vhost: this.config.vhost }));
59
+ // amqplib reads the vhost from the URL PATH for string URLs; the
60
+ // second arg is socket options only (vhost there is silently
61
+ // dropped). Encode the configured vhost into the path so it
62
+ // actually takes effect. The default vhost "/" must be encoded as
63
+ // %2F or it parses as an empty path.
64
+ const url = this.config.vhost ? withVhost(this.config.url, this.config.vhost) : this.config.url;
65
+ this.conn = (await amqp.connect(url));
44
66
  this.connected = true;
45
67
  }
46
68
  catch (err) {
@@ -81,7 +103,7 @@ export class RabbitMQAdapter {
81
103
  queueArgs["x-dead-letter-routing-key"] = config.deadLetterQueue;
82
104
  await channel.assertQueue(config.deadLetterQueue, { durable: true });
83
105
  }
84
- await channel.assertQueue(config.queue, { durable: true, arguments: queueArgs });
106
+ await channel.assertQueue(config.queue, { durable: true, maxPriority: MAX_PRIORITY, arguments: queueArgs });
85
107
  this.stats.set(config.queue, { completed: 0, failed: 0, active: 0 });
86
108
  const stats = this.stats.get(config.queue);
87
109
  const maxAttempts = (config.retries ?? 3) + 1;
@@ -164,15 +186,21 @@ export class RabbitMQAdapter {
164
186
  async addJob(queue, data, opts) {
165
187
  if (!this.connected || !this.conn)
166
188
  throw new Error("[blok][rabbitmq] not connected. Call connect() first.");
189
+ // Delayed delivery requires the rabbitmq_delayed_message_exchange
190
+ // plugin (x-delay header → x-delayed-message exchange). Stock
191
+ // rabbitmq images do not ship it, so silently dropping the delay
192
+ // would deliver the job immediately and lie to the caller. Reject
193
+ // loudly instead.
194
+ if (typeof opts?.delay === "number" && opts.delay > 0) {
195
+ throw new Error("[blok][rabbitmq] delayed delivery (opts.delay) requires the rabbitmq_delayed_message_exchange plugin, which is not enabled on this broker. Enable the plugin or remove the delay.");
196
+ }
167
197
  let channel = this.channels.get(queue)?.channel;
168
198
  if (!channel) {
169
199
  channel = await this.conn.createChannel();
170
- await channel.assertQueue(queue, { durable: true });
200
+ await channel.assertQueue(queue, { durable: true, maxPriority: MAX_PRIORITY });
171
201
  }
172
202
  const messageId = opts?.jobId ?? uuid();
173
203
  const headers = {};
174
- if (typeof opts?.delay === "number")
175
- headers["x-delay"] = opts.delay;
176
204
  const ok = channel.sendToQueue(queue, Buffer.from(typeof data === "string" ? data : JSON.stringify(data)), {
177
205
  persistent: true,
178
206
  messageId,
@@ -238,4 +266,4 @@ export class RabbitMQAdapter {
238
266
  };
239
267
  }
240
268
  }
241
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUmFiYml0TVFBZGFwdGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2FkYXB0ZXJzL1JhYmJpdE1RQWRhcHRlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBcUJHO0FBR0gsT0FBTyxFQUFFLEVBQUUsSUFBSSxJQUFJLEVBQUUsTUFBTSxNQUFNLENBQUM7QUE0Q2xDLE1BQU0sT0FBTyxlQUFlO0lBQ2xCLFFBQVEsR0FBRyxVQUFtQixDQUFDO0lBQ3ZCLE1BQU0sQ0FBaUI7SUFDaEMsSUFBSSxHQUE0QixJQUFJLENBQUM7SUFDckMsUUFBUSxHQUFrRSxJQUFJLEdBQUcsRUFBRSxDQUFDO0lBQ3BGLFNBQVMsR0FBRyxLQUFLLENBQUM7SUFDbEIsS0FBSyxHQUFvQyxJQUFJLEdBQUcsRUFBRSxDQUFDO0lBRTNELFlBQVksTUFBZ0M7UUFDM0MsSUFBSSxDQUFDLE1BQU0sR0FBRztZQUNiLEdBQUcsRUFBRSxNQUFNLEVBQUUsR0FBRyxJQUFJLE9BQU8sQ0FBQyxHQUFHLENBQUMsUUFBUSxJQUFJLGtCQUFrQjtZQUM5RCxLQUFLLEVBQUUsTUFBTSxFQUFFLEtBQUssSUFBSSxPQUFPLENBQUMsR0FBRyxDQUFDLFVBQVU7U0FDOUMsQ0FBQztJQUNILENBQUM7SUFFRCxLQUFLLENBQUMsT0FBTztRQUNaLElBQUksSUFBSSxDQUFDLFNBQVM7WUFBRSxPQUFPO1FBQzNCLElBQUksQ0FBQztZQUNKLGdHQUFnRztZQUNoRyxNQUFNLElBQUksR0FBUSxNQUFNLE1BQU0sQ0FBQyxTQUFTLENBQUMsQ0FBQztZQUMxQyxJQUFJLENBQUMsSUFBSSxHQUFHLENBQUMsTUFBTSxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxFQUFFLEVBQUUsS0FBSyxFQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBcUIsQ0FBQztZQUNwRyxJQUFJLENBQUMs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LENBQUMsS0FBSyxDQUFDLENBQUM7UUFDdkMsSUFBSSxLQUFLLEVBQUUsQ0FBQztZQUNYLElBQUksQ0FBQztnQkFDSixNQUFNLElBQUksR0FBRyxNQUFNLEtBQUssQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLEtBQUssQ0FBQyxDQUFDO2dCQUNuRCxPQUFPLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQztZQUM3QixDQUFDO1lBQUMsTUFBTSxDQUFDO2dCQUNSLFlBQVk7WUFDYixDQUFDO1FBQ0YsQ0FBQztRQUNELE9BQU87WUFDTixPQUFPO1lBQ1AsTUFBTSxFQUFFLFFBQVEsQ0FBQyxNQUFNO1lBQ3ZCLFNBQVMsRUFBRSxRQUFRLENBQUMsU0FBUztZQUM3QixNQUFNLEVBQUUsUUFBUSxDQUFDLE1BQU07WUFDdkIsT0FBTyxFQUFFLENBQUM7U0FDVixDQUFDO0lBQ0gsQ0FBQztDQUNEIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBSYWJiaXRNUUFkYXB0ZXIg4oCUIHYwLjcgUFIgNSDigJQgV29ya2VyIGFkYXB0ZXIgYmFja2VkIGJ5IFJhYmJpdE1RIHZpYVxuICogdGhlIGBhbXFwbGliYCBkcml2ZXIuIERpcmVjdC1leGNoYW5nZSAvIHF1ZXVlIG1vZGVsIOKAlCB0aGUgYHF1ZXVlYFxuICogZmllbGQgbWFwcyB0byBhbiBBTVFQIHF1ZXVlIG5hbWU7IG1lc3NhZ2VzIGFyZSBjb25zdW1lZCB3aXRoXG4gKiBtYW51YWwgQUNLLiBUaGUgZGVmYXVsdCBleGNoYW5nZSAoYFwiXCJgKSBpcyB1c2VkIGZvciBwdWJsaXNoaW5nLlxuICpcbiAqIEZlYXR1cmVzOlxuICogICAtIENvbmN1cnJlbmN5IHZpYSBgcHJlZmV0Y2goTilgIHBlciBjaGFubmVsLlxuICogICAtIFJldHJpZXMgdmlhIGBuYWNrYCB3aXRoIHJlcXVldWU9dHJ1ZSB1bnRpbCBgcmV0cmllc2AgaXMgaGl0LCB0aGVuXG4gKiAgICAgZHJvcCBvciBETFEtcm91dGUgYmFzZWQgb24gYGRlYWRMZXR0ZXJRdWV1ZWAgY29uZmlnLlxuICogICAtIFByaW9yaXRpZXMgdmlhIHRoZSBgeC1tYXgtcHJpb3JpdHlgIHF1ZXVlIGFyZyAoQU1RUCBzdGFuZGFyZCkuXG4gKiAgIC0gRGVsYXllZCBkZWxpdmVyeSB2aWEgdGhlIGB4LWRlbGF5ZWQtbWVzc2FnZWAgcGx1Z2luIHdoZW5cbiAqICAgICBhdmFpbGFibGU7IGZhbGxzIGJhY2sgdG8gaW1tZWRpYXRlIGRpc3BhdGNoIG90aGVyd2lzZS5cbiAqXG4gKiBSZXF1aXJlcyBgYW1xcGxpYmAgYXMgYSBwZWVyIGRlcGVuZGVuY3k6XG4gKlxuICogICAgIGJ1biBhZGQgYW1xcGxpYlxuICpcbiAqIEVudmlyb25tZW50IHZhcmlhYmxlczpcbiAqICAgLSBgQU1RUF9VUkxgIOKAlCBmdWxsIEFNUVAgY29ubmVjdGlvbiBzdHJpbmcgKGRlZmF1bHQgYGFtcXA6Ly9sb2NhbGhvc3RgKS5cbiAqICAgLSBgQU1RUF9WSE9TVGAg4oCUIHZpcnR1YWwgaG9zdCAoZGVmYXVsdCBgL2ApLlxuICovXG5cbmltcG9ydCB0eXBlIHsgV29ya2VyVHJpZ2dlck9wdHMgfSBmcm9tIFwiQGJsb2tqcy9oZWxwZXJcIjtcbmltcG9ydCB7IHY0IGFzIHV1aWQgfSBmcm9tIFwidXVpZFwiO1xuaW1wb3J0IHR5cGUgeyBXb3JrZXJBZGFwdGVyLCBXb3JrZXJKb2IsIFdvcmtlclF1ZXVlU3RhdHMgfSBmcm9tIFwiLi4vV29ya2VyVHJpZ2dlclwiO1xuXG5leHBvcnQgaW50ZXJmYWNlIFJhYmJpdE1RQ29uZmlnIHtcblx0dXJsOiBzdHJpbmc7XG5cdHZob3N0Pzogc3RyaW5nO1xufVxuXG5pbnRlcmZhY2UgUmFiYml0Q2hhbm5lbCB7XG5cdHByZWZldGNoKG46IG51bWJlcik6IFByb21pc2U8dm9pZD47XG5cdGFzc2VydFF1ZXVlKFxuXHRcdG5hbWU6IHN0cmluZyxcblx0XHRvcHRzPzogUmVjb3JkPHN0cmluZywgdW5rbm93bj4sXG5cdCk6IFByb21pc2U8eyBxdWV1ZTogc3RyaW5nOyBtZXNzYWdlQ291bnQ6IG51bWJlcjsgY29uc3VtZXJDb3VudDogbnVtYmVyIH0+O1xuXHRjaGVja1F1ZXVlKG5hbWU6IHN0cmluZyk6IFByb21pc2U8eyBxdWV1ZTogc3RyaW5nOyBtZXNzYWdlQ291bnQ6IG51bWJlcjsgY29uc3VtZXJDb3VudDogbnVtYmVyIH0+O1xuXHRjb25zdW1lKFxuXHRcdHF1ZXVlOiBzdHJpbmcsXG5cdFx0Y2I6IChcblx0XHRcdG1zZzoge1xuXHRcdFx0XHRjb250ZW50OiBCdWZmZXI7XG5cdFx0XHRcdGZpZWxkczogeyBkZWxpdmVyeVRhZzogbnVtYmVyOyByZWRlbGl2ZXJlZDogYm9vbGVhbiB9O1xuXHRcdFx0XHRwcm9wZXJ0aWVzOiB7IG1lc3NhZ2VJZD86IHN0cmluZzsgcHJpb3JpdHk/OiBudW1iZXI7IHRpbWVzdGFtcD86IG51bWJlcjsgaGVhZGVycz86IFJlY29yZDxzdHJpbmcsIHVua25vd24+IH07XG5cdFx0XHR9IHwgbnVsbCxcblx0XHQpID0+IHZvaWQsXG5cdFx0b3B0cz86IHsgbm9BY2s/OiBib29sZWFuOyBjb25zdW1lclRhZz86IHN0cmluZyB9LFxuXHQpOiBQcm9taXNlPHsgY29uc3VtZXJUYWc6IHN0cmluZyB9Pjtcblx0Y2FuY2VsKGNvbnN1bWVyVGFnOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+O1xuXHRhY2sobXNnOiB7IGZpZWxkczogeyBkZWxpdmVyeVRhZzogbnVtYmVyIH0gfSk6IHZvaWQ7XG5cdG5hY2sobXNnOiB7IGZpZWxkczogeyBkZWxpdmVyeVRhZzogbnVtYmVyIH0gfSwgYWxsVXBUbz86IGJvb2xlYW4sIHJlcXVldWU/OiBib29sZWFuKTogdm9pZDtcblx0c2VuZFRvUXVldWUocXVldWU6IHN0cmluZywgY29udGVudDogQnVmZmVyLCBvcHRzPzogUmVjb3JkPHN0cmluZywgdW5rbm93bj4pOiBib29sZWFuO1xuXHRjbG9zZSgpOiBQcm9taXNlPHZvaWQ+O1xufVxuXG5pbnRlcmZhY2UgUmFiYml0Q29ubmVjdGlvbiB7XG5cdGNyZWF0ZUNoYW5uZWwoKTogUHJvbWlzZTxSYWJiaXRDaGFubmVsPjtcblx0Y2xvc2UoKTogUHJvbWlzZTx2b2lkPjtcbn1cblxuaW50ZXJmYWNlIFF1ZXVlU3RhdHNDb3VudGVycyB7XG5cdGNvbXBsZXRlZDogbnVtYmVyO1xuXHRmYWlsZWQ6IG51bWJlcjtcblx0YWN0aXZlOiBudW1iZXI7XG59XG5cbmV4cG9ydCBjbGFzcyBSYWJiaXRNUUFkYXB0ZXIgaW1wbGVtZW50cyBXb3JrZXJBZGFwdGVyIHtcblx0cmVhZG9ubHkgcHJvdmlkZXIgPSBcInJhYmJpdG1xXCIgYXMgY29uc3Q7XG5cdHByaXZhdGUgcmVhZG9ubHkgY29uZmlnOiBSYWJiaXRNUUNvbmZpZztcblx0cHJpdmF0ZSBjb25uOiBSYWJiaXRDb25uZWN0aW9uIHwgbnVsbCA9IG51bGw7XG5cdHByaXZhdGUgY2hhbm5lbHM6IE1hcDxzdHJpbmcsIHsgY2hhbm5lbDogUmFiYml0Q2hhbm5lbDsgY29uc3VtZXJUYWc/OiBzdHJpbmcgfT4gPSBuZXcgTWFwKCk7XG5cdHByaXZhdGUgY29ubmVjdGVkID0gZmFsc2U7XG5cdHByaXZhdGUgc3RhdHM6IE1hcDxzdHJpbmcsIFF1ZXVlU3RhdHNDb3VudGVycz4gPSBuZXcgTWFwKCk7XG5cblx0Y29uc3RydWN0b3IoY29uZmlnPzogUGFydGlhbDxSYWJiaXRNUUNvbmZpZz4pIHtcblx0XHR0aGlzLmNvbmZpZyA9IHtcblx0XHRcdHVybDogY29uZmlnPy51cmwgPz8gcHJvY2Vzcy5lbnYuQU1RUF9VUkwgPz8gXCJhbXFwOi8vbG9jYWxob3N0XCIsXG5cdFx0XHR2aG9zdDogY29uZmlnPy52aG9zdCA/PyBwcm9jZXNzLmVudi5BTVFQX1ZIT1NULFxuXHRcdH07XG5cdH1cblxuXHRhc3luYyBjb25uZWN0KCk6IFByb21pc2U8dm9pZD4ge1xuXHRcdGlmICh0aGlzLmNvbm5lY3RlZCkgcmV0dXJuO1xuXHRcdHRyeSB7XG5cdFx0XHQvLyBiaW9tZS1pZ25vcmUgbGludC9zdXNwaWNpb3VzL25vRXhwbGljaXRBbnk6IGFtcXBsaWIncyBjb25uZWN0IHJldHVybnMgYSBsb29zZSBDb25uZWN0aW9uTGlrZS5cblx0XHRcdGNvbnN0IGFtcXA6IGFueSA9IGF3YWl0IGltcG9ydChcImFtcXBsaWJcIik7XG5cdFx0XHR0aGlzLmNvbm4gPSAoYXdhaXQgYW1xcC5jb25uZWN0KHRoaXMuY29uZmlnLnVybCwgeyB2aG9zdDogdGhpcy5jb25maWcudmhvc3QgfSkpIGFzIFJhYmJpdENvbm5lY3Rpb247XG5cdFx0XHR0aGlzLmNvbm5lY3RlZCA9IHRydWU7XG5cdFx0fSBjYXRjaCAoZXJyKSB7XG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IoXG5cdFx0XHRcdGBbYmxva11bcmFiYml0bXFdIGNvbm5lY3QgZmFpbGVkOiAkeyhlcnIgYXMgRXJyb3IpLm1lc3NhZ2V9LiBJbnN0YWxsIGFtcXBsaWIgYXMgYSBwZWVyIGRlcGVuZGVuY3k6IGJ1biBhZGQgYW1xcGxpYmAsXG5cdFx0XHQpO1xuXHRcdH1cblx0fVxuXG5cdGFzeW5jIGRpc2Nvbm5lY3QoKTogUHJvbWlzZTx2b2lkPiB7XG5cdFx0aWYgKCF0aGlzLmNvbm5lY3RlZCkgcmV0dXJuO1xuXHRcdGZvciAoY29uc3QgWywgZW50cnldIG9mIHRoaXMuY2hhbm5lbHMpIHtcblx0XHRcdHRyeSB7XG5cdFx0XHRcdGlmIChlbnRyeS5jb25zdW1lclRhZykgYXdhaXQgZW50cnkuY2hhbm5lbC5jYW5jZWwoZW50cnkuY29uc3VtZXJUYWcpO1xuXHRcdFx0XHRhd2FpdCBlbnRyeS5jaGFubmVsLmNsb3NlKCk7XG5cdFx0XHR9IGNhdGNoIHtcblx0XHRcdFx0LyogaWdub3JlICovXG5cdFx0XHR9XG5cdFx0fVxuXHRcdHRoaXMuY2hhbm5lbHMuY2xlYXIoKTtcblx0XHR0cnkge1xuXHRcdFx0YXdhaXQgdGhpcy5jb25uPy5jbG9zZSgpO1xuXHRcdH0gY2F0Y2gge1xuXHRcdFx0LyogaWdub3JlICovXG5cdFx0fVxuXHRcdHRoaXMuY29ubiA9IG51bGw7XG5cdFx0dGhpcy5jb25uZWN0ZWQgPSBmYWxzZTtcblx0fVxuXG5cdGFzeW5jIHByb2Nlc3MoY29uZmlnOiBXb3JrZXJUcmlnZ2VyT3B0cywgaGFuZGxlcjogKGpvYjogV29ya2VySm9iKSA9PiBQcm9taXNlPHZvaWQ+KTogUHJvbWlzZTx2b2lkPiB7XG5cdFx0aWYgKCF0aGlzLmNvbm5lY3RlZCB8fCAhdGhpcy5jb25uKSB0aHJvdyBuZXcgRXJyb3IoXCJbYmxva11bcmFiYml0bXFdIG5vdCBjb25uZWN0ZWQuIENhbGwgY29ubmVjdCgpIGZpcnN0LlwiKTtcblx0XHRjb25zdCBjaGFubmVsID0gYXdhaXQgdGhpcy5jb25uLmNyZWF0ZUNoYW5uZWwoKTtcblx0XHRhd2FpdCBjaGFubmVsLnByZWZldGNoKGNvbmZpZy5jb25jdXJyZW5jeSA/PyAxKTtcblxuXHRcdGNvbnN0IHF1ZXVlQXJnczogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPSB7fTtcblx0XHRpZiAoY29uZmlnLmRlYWRMZXR0ZXJRdWV1ZSkge1xuXHRcdFx0cXVldWVBcmdzW1wieC1kZWFkLWxldHRlci1leGNoYW5nZVwiXSA9IFwiXCI7XG5cdFx0XHRxdWV1ZUFyZ3NbXCJ4LWRlYWQtbGV0dGVyLXJvdXRpbmcta2V5XCJdID0gY29uZmlnLmRlYWRMZXR0ZXJRdWV1ZTtcblx0XHRcdGF3YWl0IGNoYW5uZWwuYXNzZXJ0UXVldWUoY29uZmlnLmRlYWRMZXR0ZXJRdWV1ZSwgeyBkdXJhYmxlOiB0cnVlIH0pO1xuXHRcdH1cblx0XHRhd2FpdCBjaGFubmVsLmFzc2VydFF1ZXVlKGNvbmZpZy5xdWV1ZSwgeyBkdXJhYmxlOiB0cnVlLCBhcmd1bWVudHM6IHF1ZXVlQXJncyB9KTtcblxuXHRcdHRoaXMuc3RhdHMuc2V0KGNvbmZpZy5xdWV1ZSwgeyBjb21wbGV0ZWQ6IDAsIGZhaWxlZDogMCwgYWN0aXZlOiAwIH0pO1xuXHRcdGNvbnN0IHN0YXRzID0gdGhpcy5zdGF0cy5nZXQoY29uZmlnLnF1ZXVlKSBhcyBRdWV1ZVN0YXRzQ291bnRlcnM7XG5cdFx0Y29uc3QgbWF4QXR0ZW1wdHMgPSAoY29uZmlnLnJldHJpZXMgPz8gMykgKyAxO1xuXG5cdFx0Y29uc3QgeyBjb25zdW1lclRhZyB9ID0gYXdhaXQgY2hhbm5lbC5jb25zdW1lKFxuXHRcdFx0Y29uZmlnLnF1ZXVlLFxuXHRcdFx0KG1zZykgPT4ge1xuXHRcdFx0XHRpZiAoIW1zZykgcmV0dXJuO1xuXHRcdFx0XHR2b2lkIChhc3luYyAoKSA9PiB7XG5cdFx0XHRcdFx0Y29uc3QgcGF5bG9hZFN0cmluZyA9IG1zZy5jb250ZW50LnRvU3RyaW5nKFwidXRmOFwiKTtcblx0XHRcdFx0XHRsZXQgZGF0YTogdW5rbm93bjtcblx0XHRcdFx0XHR0cnkge1xuXHRcdFx0XHRcdFx0ZGF0YSA9IHBheWxvYWRTdHJpbmcubGVuZ3RoID4gMCA/IEpTT04ucGFyc2UocGF5bG9hZFN0cmluZykgOiBudWxsO1xuXHRcdFx0XHRcdH0gY2F0Y2gge1xuXHRcdFx0XHRcdFx0ZGF0YSA9IHBheWxvYWRTdHJpbmc7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdGNvbnN0IGhlYWRlcnM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7fTtcblx0XHRcdFx0XHRmb3IgKGNvbnN0IFtrLCB2XSBvZiBPYmplY3QuZW50cmllcyhtc2cucHJvcGVydGllcy5oZWFkZXJzID8/IHt9KSkgaGVhZGVyc1trXSA9IFN0cmluZyh2KTtcblx0XHRcdFx0XHRjb25zdCBhdHRlbXB0cyA9IE51bWJlci5wYXJzZUludChTdHJpbmcobXNnLnByb3BlcnRpZXMuaGVhZGVycz8uW1wieC1ibG9rLWF0dGVtcHRcIl0gPz8gMCksIDEwKTtcblx0XHRcdFx0XHQvLyBUcmFja3Mgd2hldGhlciB0aGUgbWVzc2FnZSBoYXMgYWxyZWFkeSBiZWVuIGFjay9uYWNrJ2QgdmlhXG5cdFx0XHRcdFx0Ly8gdGhlIFdvcmtlckpvYiBBUEkgKGBjb21wbGV0ZWAgLyBgZmFpbGApLiBUaGUgd3JhcHBpbmdcblx0XHRcdFx0XHQvLyB0cnkvY2F0Y2ggYmVsb3cgYWxzbyB3YW50cyB0byBhY2sgb24gaGFuZGxlciBzdWNjZXNzIGFuZFxuXHRcdFx0XHRcdC8vIG5hY2sgb24gaGFuZGxlciB0aHJvdyDigJQgd2l0aG91dCB0aGlzIGZsYWcgd2UnZFxuXHRcdFx0XHRcdC8vIGRvdWJsZS1hY2sgdGhlIHNhbWUgZGVsaXZlcnkgdGFnIGFuZCBSYWJiaXQgY2xvc2VzIHRoZVxuXHRcdFx0XHRcdC8vIGNoYW5uZWwgd2l0aCBQUkVDT05ESVRJT05fRkFJTEVEIChjYXVnaHQgYnkgdGhlXG5cdFx0XHRcdFx0Ly8gcmVhbC1icm9rZXIgaW50ZWdyYXRpb24gdGVzdCBpblxuXHRcdFx0XHRcdC8vIGBfX3Rlc3RzX18vaW50ZWdyYXRpb24vcmFiYml0bXEtYWRhcHRlci5yZWFsLXJhYmJpdG1xLnRlc3QudHNgKS5cblx0XHRcdFx0XHRsZXQgc2V0dGxlZCA9IGZhbHNlO1xuXHRcdFx0XHRcdGNvbnN0IGpvYjogV29ya2VySm9iID0ge1xuXHRcdFx0XHRcdFx0aWQ6IG1zZy5wcm9wZXJ0aWVzLm1lc3NhZ2VJZCA/PyBgJHtjb25maWcucXVldWV9OiR7bXNnLmZpZWxkcy5kZWxpdmVyeVRhZ31gLFxuXHRcdFx0XHRcdFx0ZGF0YSxcblx0XHRcdFx0XHRcdGhlYWRlcnMsXG5cdFx0XHRcdFx0XHRxdWV1ZTogY29uZmlnLnF1ZXVlLFxuXHRcdFx0XHRcdFx0cHJpb3JpdHk6IG1zZy5wcm9wZXJ0aWVzLnByaW9yaXR5ID8/IGNvbmZpZy5wcmlvcml0eSA/PyAwLFxuXHRcdFx0XHRcdFx0YXR0ZW1wdHMsXG5cdFx0XHRcdFx0XHRtYXhSZXRyaWVzOiBjb25maWcucmV0cmllcyA/PyAzLFxuXHRcdFx0XHRcdFx0Y3JlYXRlZEF0OiBtc2cucHJvcGVydGllcy50aW1lc3RhbXAgPyBuZXcgRGF0ZShtc2cucHJvcGVydGllcy50aW1lc3RhbXApIDogbmV3IERhdGUoKSxcblx0XHRcdFx0XHRcdHRpbWVvdXQ6IGNvbmZpZy50aW1lb3V0LFxuXHRcdFx0XHRcdFx0cmF3OiBtc2csXG5cdFx0XHRcdFx0XHRjb21wbGV0ZTogYXN5bmMgKCkgPT4ge1xuXHRcdFx0XHRcdFx0XHRpZiAoc2V0dGxlZCkgcmV0dXJuO1xuXHRcdFx0XHRcdFx0XHRjaGFubmVsLmFjayhtc2cpO1xuXHRcdFx0XHRcdFx0XHRzdGF0cy5jb21wbGV0ZWQgKz0gMTtcblx0XHRcdFx0XHRcdFx0c2V0dGxlZCA9IHRydWU7XG5cdFx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdFx0ZmFpbDogYXN5bmMgKGVycjogRXJyb3IsIHJlcXVldWU/OiBib29sZWFuKSA9PiB7XG5cdFx0XHRcdFx0XHRcdGlmIChzZXR0bGVkKSByZXR1cm47XG5cdFx0XHRcdFx0XHRcdHN0YXRzLmZhaWxlZCArPSAxO1xuXHRcdFx0XHRcdFx0XHRjb25zdCBleGNlZWRlZCA9IGF0dGVtcHRzICsgMSA+PSBtYXhBdHRlbXB0cztcblx0XHRcdFx0XHRcdFx0Y2hhbm5lbC5uYWNrKG1zZywgZmFsc2UsICFleGNlZWRlZCAmJiByZXF1ZXVlICE9PSBmYWxzZSk7XG5cdFx0XHRcdFx0XHRcdHNldHRsZWQgPSB0cnVlO1xuXHRcdFx0XHRcdFx0fSxcblx0XHRcdFx0XHR9O1xuXHRcdFx0XHRcdHN0YXRzLmFjdGl2ZSArPSAxO1xuXHRcdFx0XHRcdHRyeSB7XG5cdFx0XHRcdFx0XHRhd2FpdCBoYW5kbGVyKGpvYik7XG5cdFx0XHRcdFx0XHRpZiAoIXNldHRsZWQgJiYgY29uZmlnLmFjayAhPT0gZmFsc2UpIHtcblx0XHRcdFx0XHRcdFx0Y2hhbm5lbC5hY2sobXNnKTtcblx0XHRcdFx0XHRcdFx0c3RhdHMuY29tcGxldGVkICs9IDE7XG5cdFx0XHRcdFx0XHRcdHNldHRsZWQgPSB0cnVlO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH0gY2F0Y2gge1xuXHRcdFx0XHRcdFx0aWYgKCFzZXR0bGVkKSB7XG5cdFx0XHRcdFx0XHRcdHN0YXRzLmZhaWxlZCArPSAxO1xuXHRcdFx0XHRcdFx0XHRjb25zdCBleGNlZWRlZCA9IGF0dGVtcHRzICsgMSA+PSBtYXhBdHRlbXB0cztcblx0XHRcdFx0XHRcdFx0Y2hhbm5lbC5uYWNrKG1zZywgZmFsc2UsICFleGNlZWRlZCk7XG5cdFx0XHRcdFx0XHRcdHNldHRsZWQgPSB0cnVlO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH0gZmluYWxseSB7XG5cdFx0XHRcdFx0XHRzdGF0cy5hY3RpdmUgPSBNYXRoLm1heCgwLCBzdGF0cy5hY3RpdmUgLSAxKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0pKCk7XG5cdFx0XHR9LFxuXHRcdFx0eyBub0FjazogY29uZmlnLmFjayA9PT0gZmFsc2UgfSxcblx0XHQpO1xuXHRcdHRoaXMuY2hhbm5lbHMuc2V0KGNvbmZpZy5xdWV1ZSwgeyBjaGFubmVsLCBjb25zdW1lclRhZyB9KTtcblx0fVxuXG5cdGFzeW5jIGFkZEpvYihcblx0XHRxdWV1ZTogc3RyaW5nLFxuXHRcdGRhdGE6IHVua25vd24sXG5cdFx0b3B0cz86IHsgcHJpb3JpdHk/OiBudW1iZXI7IGRlbGF5PzogbnVtYmVyOyByZXRyaWVzPzogbnVtYmVyOyB0aW1lb3V0PzogbnVtYmVyOyBqb2JJZD86IHN0cmluZyB9LFxuXHQpOiBQcm9taXNlPHN0cmluZz4ge1xuXHRcdGlmICghdGhpcy5jb25uZWN0ZWQgfHwgIXRoaXMuY29ubikgdGhyb3cgbmV3IEVycm9yKFwiW2Jsb2tdW3JhYmJpdG1xXSBub3QgY29ubmVjdGVkLiBDYWxsIGNvbm5lY3QoKSBmaXJzdC5cIik7XG5cdFx0bGV0IGNoYW5uZWwgPSB0aGlzLmNoYW5uZWxzLmdldChxdWV1ZSk/LmNoYW5uZWw7XG5cdFx0aWYgKCFjaGFubmVsKSB7XG5cdFx0XHRjaGFubmVsID0gYXdhaXQgdGhpcy5jb25uLmNyZWF0ZUNoYW5uZWwoKTtcblx0XHRcdGF3YWl0IGNoYW5uZWwuYXNzZXJ0UXVldWUocXVldWUsIHsgZHVyYWJsZTogdHJ1ZSB9KTtcblx0XHR9XG5cdFx0Y29uc3QgbWVzc2FnZUlkID0gb3B0cz8uam9iSWQgPz8gdXVpZCgpO1xuXHRcdGNvbnN0IGhlYWRlcnM6IFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0ge307XG5cdFx0aWYgKHR5cGVvZiBvcHRzPy5kZWxheSA9PT0gXCJudW1iZXJcIikgaGVhZGVyc1tcIngtZGVsYXlcIl0gPSBvcHRzLmRlbGF5O1xuXHRcdGNvbnN0IG9rID0gY2hhbm5lbC5zZW5kVG9RdWV1ZShxdWV1ZSwgQnVmZmVyLmZyb20odHlwZW9mIGRhdGEgPT09IFwic3RyaW5nXCIgPyBkYXRhIDogSlNPTi5zdHJpbmdpZnkoZGF0YSkpLCB7XG5cdFx0XHRwZXJzaXN0ZW50OiB0cnVlLFxuXHRcdFx0bWVzc2FnZUlkLFxuXHRcdFx0cHJpb3JpdHk6IG9wdHM/LnByaW9yaXR5LFxuXHRcdFx0dGltZXN0YW1wOiBEYXRlLm5vdygpLFxuXHRcdFx0aGVhZGVycyxcblx0XHR9KTtcblx0XHRpZiAoIW9rKSB7XG5cdFx0XHQvLyBDaGFubmVsIGlzIGluIGZsb3ctY29udHJvbGxlZCBzdGF0ZS4gVGhlIHNlbmQgaXMgc3RpbGxcblx0XHRcdC8vIGFjY2VwdGVkOyB0aGUgY2hhbm5lbCB3aWxsIGVtaXQgYSAnZHJhaW4nIGV2ZW50IHdoZW4gcmVhZHkuXG5cdFx0XHQvLyBXZSBkb24ndCBjdXJyZW50bHkgc3VyZmFjZSBiYWNrcHJlc3N1cmUgdG8gY2FsbGVycy5cblx0XHR9XG5cdFx0cmV0dXJuIG1lc3NhZ2VJZDtcblx0fVxuXG5cdGFzeW5jIHN0b3BQcm9jZXNzaW5nKHF1ZXVlOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcblx0XHRjb25zdCBlbnRyeSA9IHRoaXMuY2hhbm5lbHMuZ2V0KHF1ZXVlKTtcblx0XHRpZiAoIWVudHJ5KSByZXR1cm47XG5cdFx0dHJ5IHtcblx0XHRcdGlmIChlbnRyeS5jb25zdW1lclRhZykgYXdhaXQgZW50cnkuY2hhbm5lbC5jYW5jZWwoZW50cnkuY29uc3VtZXJUYWcpO1xuXHRcdFx0YXdhaXQgZW50cnkuY2hhbm5lbC5jbG9zZSgpO1xuXHRcdH0gY2F0Y2gge1xuXHRcdFx0LyogaWdub3JlICovXG5cdFx0fVxuXHRcdHRoaXMuY2hhbm5lbHMuZGVsZXRlKHF1ZXVlKTtcblx0fVxuXG5cdGlzQ29ubmVjdGVkKCk6IGJvb2xlYW4ge1xuXHRcdHJldHVybiB0aGlzLmNvbm5lY3RlZDtcblx0fVxuXG5cdGFzeW5jIGhlYWx0aENoZWNrKCk6IFByb21pc2U8Ym9vbGVhbj4ge1xuXHRcdGlmICghdGhpcy5jb25uZWN0ZWQgfHwgIXRoaXMuY29ubikgcmV0dXJuIGZhbHNlO1xuXHRcdHRyeSB7XG5cdFx0XHRjb25zdCBjaGFubmVsID0gYXdhaXQgdGhpcy5jb25uLmNyZWF0ZUNoYW5uZWwoKTtcblx0XHRcdGF3YWl0IGNoYW5uZWwuY2xvc2UoKTtcblx0XHRcdHJldHVybiB0cnVlO1xuXHRcdH0gY2F0Y2gge1xuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdH1cblx0fVxuXG5cdGFzeW5jIGdldFF1ZXVlU3RhdHMocXVldWU6IHN0cmluZyk6IFByb21pc2U8V29ya2VyUXVldWVTdGF0cz4ge1xuXHRcdGNvbnN0IGNvdW50ZXJzID0gdGhpcy5zdGF0cy5nZXQocXVldWUpID8/IHsgY29tcGxldGVkOiAwLCBmYWlsZWQ6IDAsIGFjdGl2ZTogMCB9O1xuXHRcdGxldCB3YWl0aW5nID0gMDtcblx0XHRjb25zdCBlbnRyeSA9IHRoaXMuY2hhbm5lbHMuZ2V0KHF1ZXVlKTtcblx0XHRpZiAoZW50cnkpIHtcblx0XHRcdHRyeSB7XG5cdFx0XHRcdGNvbnN0IGluZm8gPSBhd2FpdCBlbnRyeS5jaGFubmVsLmNoZWNrUXVldWUocXVldWUpO1xuXHRcdFx0XHR3YWl0aW5nID0gaW5mby5tZXNzYWdlQ291bnQ7XG5cdFx0XHR9IGNhdGNoIHtcblx0XHRcdFx0LyogaWdub3JlICovXG5cdFx0XHR9XG5cdFx0fVxuXHRcdHJldHVybiB7XG5cdFx0XHR3YWl0aW5nLFxuXHRcdFx0YWN0aXZlOiBjb3VudGVycy5hY3RpdmUsXG5cdFx0XHRjb21wbGV0ZWQ6IGNvdW50ZXJzLmNvbXBsZXRlZCxcblx0XHRcdGZhaWxlZDogY291bnRlcnMuZmFpbGVkLFxuXHRcdFx0ZGVsYXllZDogMCxcblx0XHR9O1xuXHR9XG59XG4iXX0=
269
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUmFiYml0TVFBZGFwdGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2FkYXB0ZXJzL1JhYmJpdE1RQWRhcHRlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQXNCRztBQUdILE9BQU8sRUFBRSxFQUFFLElBQUksSUFBSSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBUWxDLHVFQUF1RTtBQUN2RSwyRUFBMkU7QUFDM0UseUNBQXlDO0FBQ3pDLE1BQU0sWUFBWSxHQUFHLEdBQUcsQ0FBQztBQUV6Qjs7Ozs7R0FLRztBQUNILFNBQVMsU0FBUyxDQUFDLEdBQVcsRUFBRSxLQUFhO0lBQzVDLE1BQU0sQ0FBQyxHQUFHLElBQUksR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQ3ZCLENBQUMsQ0FBQyxRQUFRLEdBQUcsSUFBSSxrQkFBa0IsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDO0lBQzdDLE9BQU8sQ0FBQyxDQUFDLFFBQVEsRUFBRSxDQUFDO0FBQ3JCLENBQUM7QUFzQ0QsTUFBTSxPQUFPLGVBQWU7SUFDbEIsUUFBUSxHQUFHLFVBQW1CLENBQUM7SUFDdkIsTUFBTSxDQUFpQjtJQUNoQyxJQUFJLEdBQTRCLElBQUksQ0FBQztJQUNyQyxRQUFRLEdBQWtFLElBQUksR0FBRyxFQUFFLENBQUM7SUFDcEYsU0FBUyxHQUFHLEtBQUssQ0FBQztJQUNsQixLQUFLLEdBQW9DLElBQUksR0FBRyxFQUFFLENBQUM7SUFFM0QsWUFBWSxNQUFnQztRQUMzQyxJQUFJLENBQUMsTUFBTSxHQUFHO1lBQ2IsR0FBRyxFQUFFLE1BQU0sRUFBRSxHQUFHLElBQUksT0FBTyxDQUFDLEdBQUcsQ0FBQyxRQUFRLElBQUksa0JBQWtCO1lBQzlELEtBQUssRUFBRSxNQUFNLEVBQUUsS0FBSyxJQUFJLE9BQU8sQ0FBQyxHQUFHLENBQUMsVUFBVTtTQUM5QyxDQUFDO0lBQ0gsQ0FBQztJQUVELEtBQUssQ0FBQyxP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QUMsU0FBUztZQUM3QixNQUFNLEVBQUUsUUFBUSxDQUFDLE1BQU07WUFDdkIsT0FBTyxFQUFFLENBQUM7U0FDVixDQUFDO0lBQ0gsQ0FBQztDQUNEIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBSYWJiaXRNUUFkYXB0ZXIg4oCUIHYwLjcgUFIgNSDigJQgV29ya2VyIGFkYXB0ZXIgYmFja2VkIGJ5IFJhYmJpdE1RIHZpYVxuICogdGhlIGBhbXFwbGliYCBkcml2ZXIuIERpcmVjdC1leGNoYW5nZSAvIHF1ZXVlIG1vZGVsIOKAlCB0aGUgYHF1ZXVlYFxuICogZmllbGQgbWFwcyB0byBhbiBBTVFQIHF1ZXVlIG5hbWU7IG1lc3NhZ2VzIGFyZSBjb25zdW1lZCB3aXRoXG4gKiBtYW51YWwgQUNLLiBUaGUgZGVmYXVsdCBleGNoYW5nZSAoYFwiXCJgKSBpcyB1c2VkIGZvciBwdWJsaXNoaW5nLlxuICpcbiAqIEZlYXR1cmVzOlxuICogICAtIENvbmN1cnJlbmN5IHZpYSBgcHJlZmV0Y2goTilgIHBlciBjaGFubmVsLlxuICogICAtIFJldHJpZXMgdmlhIGBuYWNrYCB3aXRoIHJlcXVldWU9dHJ1ZSB1bnRpbCBgcmV0cmllc2AgaXMgaGl0LCB0aGVuXG4gKiAgICAgZHJvcCBvciBETFEtcm91dGUgYmFzZWQgb24gYGRlYWRMZXR0ZXJRdWV1ZWAgY29uZmlnLlxuICogICAtIFByaW9yaXRpZXMgdmlhIHRoZSBgeC1tYXgtcHJpb3JpdHlgIHF1ZXVlIGFyZyAoQU1RUCBzdGFuZGFyZCkuXG4gKiAgIC0gRGVsYXllZCBkZWxpdmVyeSByZXF1aXJlcyB0aGUgYHJhYmJpdG1xX2RlbGF5ZWRfbWVzc2FnZV9leGNoYW5nZWBcbiAqICAgICBwbHVnaW47IGBvcHRzLmRlbGF5YCB0aHJvd3MgYSBjbGVhciBjb25maWcgZXJyb3Igd2hlbiB1c2VkIGFnYWluc3QgYVxuICogICAgIGJyb2tlciB3aXRob3V0IGl0IHJhdGhlciB0aGFuIHNpbGVudGx5IGRlbGl2ZXJpbmcgaW1tZWRpYXRlbHkuXG4gKlxuICogUmVxdWlyZXMgYGFtcXBsaWJgIGFzIGEgcGVlciBkZXBlbmRlbmN5OlxuICpcbiAqICAgICBidW4gYWRkIGFtcXBsaWJcbiAqXG4gKiBFbnZpcm9ubWVudCB2YXJpYWJsZXM6XG4gKiAgIC0gYEFNUVBfVVJMYCDigJQgZnVsbCBBTVFQIGNvbm5lY3Rpb24gc3RyaW5nIChkZWZhdWx0IGBhbXFwOi8vbG9jYWxob3N0YCkuXG4gKiAgIC0gYEFNUVBfVkhPU1RgIOKAlCB2aXJ0dWFsIGhvc3QgKGRlZmF1bHQgYC9gKS5cbiAqL1xuXG5pbXBvcnQgdHlwZSB7IFdvcmtlclRyaWdnZXJPcHRzIH0gZnJvbSBcIkBibG9ranMvaGVscGVyXCI7XG5pbXBvcnQgeyB2NCBhcyB1dWlkIH0gZnJvbSBcInV1aWRcIjtcbmltcG9ydCB0eXBlIHsgV29ya2VyQWRhcHRlciwgV29ya2VySm9iLCBXb3JrZXJRdWV1ZVN0YXRzIH0gZnJvbSBcIi4uL1dvcmtlclRyaWdnZXJcIjtcblxuZXhwb3J0IGludGVyZmFjZSBSYWJiaXRNUUNvbmZpZyB7XG5cdHVybDogc3RyaW5nO1xuXHR2aG9zdD86IHN0cmluZztcbn1cblxuLy8gQU1RUCBwcmlvcml0eSBxdWV1ZXMgY2FwIGF0IDI1NSAoeC1tYXgtcHJpb3JpdHkgaXMgYSB1aW50OCkuIFBpbiB0aGVcbi8vIGRlY2xhcmVkIGNlaWxpbmcgc28gYW55IGNhbGxlci1zdXBwbGllZCBwcmlvcml0eSBpcyBob25vdXJlZCB3aXRob3V0IHRoZVxuLy8gcXVldWUgbmVlZGluZyBwZXItY2FsbCByZS1kZWNsYXJhdGlvbi5cbmNvbnN0IE1BWF9QUklPUklUWSA9IDI1NTtcblxuLyoqXG4gKiBJbmplY3QgYSB2aG9zdCBpbnRvIGFuIEFNUVAgY29ubmVjdGlvbiBzdHJpbmcuIGFtcXBsaWIgcmVhZHMgdGhlIHZob3N0IGZyb21cbiAqIHRoZSBVUkwgcGF0aCBmb3Igc3RyaW5nIFVSTHMsIHNvIHRoZSBjb25maWd1cmVkIHZob3N0IGhhcyB0byBsaXZlIHRoZXJlLlxuICogVGhlIGRlZmF1bHQgdmhvc3QgXCIvXCIgbXVzdCBiZSBwZXJjZW50LWVuY29kZWQgKGAlMkZgKSDigJQgYSBsaXRlcmFsIHNsYXNoIGluXG4gKiB0aGUgcGF0aCB3b3VsZCBiZSBwYXJzZWQgYXMgYSBzdWItcGF0aCwgbm90IHRoZSByb290IHZob3N0LlxuICovXG5mdW5jdGlvbiB3aXRoVmhvc3QodXJsOiBzdHJpbmcsIHZob3N0OiBzdHJpbmcpOiBzdHJpbmcge1xuXHRjb25zdCB1ID0gbmV3IFVSTCh1cmwpO1xuXHR1LnBhdGhuYW1lID0gYC8ke2VuY29kZVVSSUNvbXBvbmVudCh2aG9zdCl9YDtcblx0cmV0dXJuIHUudG9TdHJpbmcoKTtcbn1cblxuaW50ZXJmYWNlIFJhYmJpdENoYW5uZWwge1xuXHRwcmVmZXRjaChuOiBudW1iZXIpOiBQcm9taXNlPHZvaWQ+O1xuXHRhc3NlcnRRdWV1ZShcblx0XHRuYW1lOiBzdHJpbmcsXG5cdFx0b3B0cz86IFJlY29yZDxzdHJpbmcsIHVua25vd24+LFxuXHQpOiBQcm9taXNlPHsgcXVldWU6IHN0cmluZzsgbWVzc2FnZUNvdW50OiBudW1iZXI7IGNvbnN1bWVyQ291bnQ6IG51bWJlciB9Pjtcblx0Y2hlY2tRdWV1ZShuYW1lOiBzdHJpbmcpOiBQcm9taXNlPHsgcXVldWU6IHN0cmluZzsgbWVzc2FnZUNvdW50OiBudW1iZXI7IGNvbnN1bWVyQ291bnQ6IG51bWJlciB9Pjtcblx0Y29uc3VtZShcblx0XHRxdWV1ZTogc3RyaW5nLFxuXHRcdGNiOiAoXG5cdFx0XHRtc2c6IHtcblx0XHRcdFx0Y29udGVudDogQnVmZmVyO1xuXHRcdFx0XHRmaWVsZHM6IHsgZGVsaXZlcnlUYWc6IG51bWJlcjsgcmVkZWxpdmVyZWQ6IGJvb2xlYW4gfTtcblx0XHRcdFx0cHJvcGVydGllczogeyBtZXNzYWdlSWQ/OiBzdHJpbmc7IHByaW9yaXR5PzogbnVtYmVyOyB0aW1lc3RhbXA/OiBudW1iZXI7IGhlYWRlcnM/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB9O1xuXHRcdFx0fSB8IG51bGwsXG5cdFx0KSA9PiB2b2lkLFxuXHRcdG9wdHM/OiB7IG5vQWNrPzogYm9vbGVhbjsgY29uc3VtZXJUYWc/OiBzdHJpbmcgfSxcblx0KTogUHJvbWlzZTx7IGNvbnN1bWVyVGFnOiBzdHJpbmcgfT47XG5cdGNhbmNlbChjb25zdW1lclRhZzogc3RyaW5nKTogUHJvbWlzZTx2b2lkPjtcblx0YWNrKG1zZzogeyBmaWVsZHM6IHsgZGVsaXZlcnlUYWc6IG51bWJlciB9IH0pOiB2b2lkO1xuXHRuYWNrKG1zZzogeyBmaWVsZHM6IHsgZGVsaXZlcnlUYWc6IG51bWJlciB9IH0sIGFsbFVwVG8/OiBib29sZWFuLCByZXF1ZXVlPzogYm9vbGVhbik6IHZvaWQ7XG5cdHNlbmRUb1F1ZXVlKHF1ZXVlOiBzdHJpbmcsIGNvbnRlbnQ6IEJ1ZmZlciwgb3B0cz86IFJlY29yZDxzdHJpbmcsIHVua25vd24+KTogYm9vbGVhbjtcblx0Y2xvc2UoKTogUHJvbWlzZTx2b2lkPjtcbn1cblxuaW50ZXJmYWNlIFJhYmJpdENvbm5lY3Rpb24ge1xuXHRjcmVhdGVDaGFubmVsKCk6IFByb21pc2U8UmFiYml0Q2hhbm5lbD47XG5cdGNsb3NlKCk6IFByb21pc2U8dm9pZD47XG59XG5cbmludGVyZmFjZSBRdWV1ZVN0YXRzQ291bnRlcnMge1xuXHRjb21wbGV0ZWQ6IG51bWJlcjtcblx0ZmFpbGVkOiBudW1iZXI7XG5cdGFjdGl2ZTogbnVtYmVyO1xufVxuXG5leHBvcnQgY2xhc3MgUmFiYml0TVFBZGFwdGVyIGltcGxlbWVudHMgV29ya2VyQWRhcHRlciB7XG5cdHJlYWRvbmx5IHByb3ZpZGVyID0gXCJyYWJiaXRtcVwiIGFzIGNvbnN0O1xuXHRwcml2YXRlIHJlYWRvbmx5IGNvbmZpZzogUmFiYml0TVFDb25maWc7XG5cdHByaXZhdGUgY29ubjogUmFiYml0Q29ubmVjdGlvbiB8IG51bGwgPSBudWxsO1xuXHRwcml2YXRlIGNoYW5uZWxzOiBNYXA8c3RyaW5nLCB7IGNoYW5uZWw6IFJhYmJpdENoYW5uZWw7IGNvbnN1bWVyVGFnPzogc3RyaW5nIH0+ID0gbmV3IE1hcCgpO1xuXHRwcml2YXRlIGNvbm5lY3RlZCA9IGZhbHNlO1xuXHRwcml2YXRlIHN0YXRzOiBNYXA8c3RyaW5nLCBRdWV1ZVN0YXRzQ291bnRlcnM+ID0gbmV3IE1hcCgpO1xuXG5cdGNvbnN0cnVjdG9yKGNvbmZpZz86IFBhcnRpYWw8UmFiYml0TVFDb25maWc+KSB7XG5cdFx0dGhpcy5jb25maWcgPSB7XG5cdFx0XHR1cmw6IGNvbmZpZz8udXJsID8/IHByb2Nlc3MuZW52LkFNUVBfVVJMID8/IFwiYW1xcDovL2xvY2FsaG9zdFwiLFxuXHRcdFx0dmhvc3Q6IGNvbmZpZz8udmhvc3QgPz8gcHJvY2Vzcy5lbnYuQU1RUF9WSE9TVCxcblx0XHR9O1xuXHR9XG5cblx0YXN5bmMgY29ubmVjdCgpOiBQcm9taXNlPHZvaWQ+IHtcblx0XHRpZiAodGhpcy5jb25uZWN0ZWQpIHJldHVybjtcblx0XHR0cnkge1xuXHRcdFx0Ly8gYmlvbWUtaWdub3JlIGxpbnQvc3VzcGljaW91cy9ub0V4cGxpY2l0QW55OiBhbXFwbGliJ3MgY29ubmVjdCByZXR1cm5zIGEgbG9vc2UgQ29ubmVjdGlvbkxpa2UuXG5cdFx0XHRjb25zdCBhbXFwOiBhbnkgPSBhd2FpdCBpbXBvcnQoXCJhbXFwbGliXCIpO1xuXHRcdFx0Ly8gYW1xcGxpYiByZWFkcyB0aGUgdmhvc3QgZnJvbSB0aGUgVVJMIFBBVEggZm9yIHN0cmluZyBVUkxzOyB0aGVcblx0XHRcdC8vIHNlY29uZCBhcmcgaXMgc29ja2V0IG9wdGlvbnMgb25seSAodmhvc3QgdGhlcmUgaXMgc2lsZW50bHlcblx0XHRcdC8vIGRyb3BwZWQpLiBFbmNvZGUgdGhlIGNvbmZpZ3VyZWQgdmhvc3QgaW50byB0aGUgcGF0aCBzbyBpdFxuXHRcdFx0Ly8gYWN0dWFsbHkgdGFrZXMgZWZmZWN0LiBUaGUgZGVmYXVsdCB2aG9zdCBcIi9cIiBtdXN0IGJlIGVuY29kZWQgYXNcblx0XHRcdC8vICUyRiBvciBpdCBwYXJzZXMgYXMgYW4gZW1wdHkgcGF0aC5cblx0XHRcdGNvbnN0IHVybCA9IHRoaXMuY29uZmlnLnZob3N0ID8gd2l0aFZob3N0KHRoaXMuY29uZmlnLnVybCwgdGhpcy5jb25maWcudmhvc3QpIDogdGhpcy5jb25maWcudXJsO1xuXHRcdFx0dGhpcy5jb25uID0gKGF3YWl0IGFtcXAuY29ubmVjdCh1cmwpKSBhcyBSYWJiaXRDb25uZWN0aW9uO1xuXHRcdFx0dGhpcy5jb25uZWN0ZWQgPSB0cnVlO1xuXHRcdH0gY2F0Y2ggKGVycikge1xuXHRcdFx0dGhyb3cgbmV3IEVycm9yKFxuXHRcdFx0XHRgW2Jsb2tdW3JhYmJpdG1xXSBjb25uZWN0IGZhaWxlZDogJHsoZXJyIGFzIEVycm9yKS5tZXNzYWdlfS4gSW5zdGFsbCBhbXFwbGliIGFzIGEgcGVlciBkZXBlbmRlbmN5OiBidW4gYWRkIGFtcXBsaWJgLFxuXHRcdFx0KTtcblx0XHR9XG5cdH1cblxuXHRhc3luYyBkaXNjb25uZWN0KCk6IFByb21pc2U8dm9pZD4ge1xuXHRcdGlmICghdGhpcy5jb25uZWN0ZWQpIHJldHVybjtcblx0XHRmb3IgKGNvbnN0IFssIGVudHJ5XSBvZiB0aGlzLmNoYW5uZWxzKSB7XG5cdFx0XHR0cnkge1xuXHRcdFx0XHRpZiAoZW50cnkuY29uc3VtZXJUYWcpIGF3YWl0IGVudHJ5LmNoYW5uZWwuY2FuY2VsKGVudHJ5LmNvbnN1bWVyVGFnKTtcblx0XHRcdFx0YXdhaXQgZW50cnkuY2hhbm5lbC5jbG9zZSgpO1xuXHRcdFx0fSBjYXRjaCB7XG5cdFx0XHRcdC8qIGlnbm9yZSAqL1xuXHRcdFx0fVxuXHRcdH1cblx0XHR0aGlzLmNoYW5uZWxzLmNsZWFyKCk7XG5cdFx0dHJ5IHtcblx0XHRcdGF3YWl0IHRoaXMuY29ubj8uY2xvc2UoKTtcblx0XHR9IGNhdGNoIHtcblx0XHRcdC8qIGlnbm9yZSAqL1xuXHRcdH1cblx0XHR0aGlzLmNvbm4gPSBudWxsO1xuXHRcdHRoaXMuY29ubmVjdGVkID0gZmFsc2U7XG5cdH1cblxuXHRhc3luYyBwcm9jZXNzKGNvbmZpZzogV29ya2VyVHJpZ2dlck9wdHMsIGhhbmRsZXI6IChqb2I6IFdvcmtlckpvYikgPT4gUHJvbWlzZTx2b2lkPik6IFByb21pc2U8dm9pZD4ge1xuXHRcdGlmICghdGhpcy5jb25uZWN0ZWQgfHwgIXRoaXMuY29ubikgdGhyb3cgbmV3IEVycm9yKFwiW2Jsb2tdW3JhYmJpdG1xXSBub3QgY29ubmVjdGVkLiBDYWxsIGNvbm5lY3QoKSBmaXJzdC5cIik7XG5cdFx0Y29uc3QgY2hhbm5lbCA9IGF3YWl0IHRoaXMuY29ubi5jcmVhdGVDaGFubmVsKCk7XG5cdFx0YXdhaXQgY2hhbm5lbC5wcmVmZXRjaChjb25maWcuY29uY3VycmVuY3kgPz8gMSk7XG5cblx0XHRjb25zdCBxdWV1ZUFyZ3M6IFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0ge307XG5cdFx0aWYgKGNvbmZpZy5kZWFkTGV0dGVyUXVldWUpIHtcblx0XHRcdHF1ZXVlQXJnc1tcIngtZGVhZC1sZXR0ZXItZXhjaGFuZ2VcIl0gPSBcIlwiO1xuXHRcdFx0cXVldWVBcmdzW1wieC1kZWFkLWxldHRlci1yb3V0aW5nLWtleVwiXSA9IGNvbmZpZy5kZWFkTGV0dGVyUXVldWU7XG5cdFx0XHRhd2FpdCBjaGFubmVsLmFzc2VydFF1ZXVlKGNvbmZpZy5kZWFkTGV0dGVyUXVldWUsIHsgZHVyYWJsZTogdHJ1ZSB9KTtcblx0XHR9XG5cdFx0YXdhaXQgY2hhbm5lbC5hc3NlcnRRdWV1ZShjb25maWcucXVldWUsIHsgZHVyYWJsZTogdHJ1ZSwgbWF4UHJpb3JpdHk6IE1BWF9QUklPUklUWSwgYXJndW1lbnRzOiBxdWV1ZUFyZ3MgfSk7XG5cblx0XHR0aGlzLnN0YXRzLnNldChjb25maWcucXVldWUsIHsgY29tcGxldGVkOiAwLCBmYWlsZWQ6IDAsIGFjdGl2ZTogMCB9KTtcblx0XHRjb25zdCBzdGF0cyA9IHRoaXMuc3RhdHMuZ2V0KGNvbmZpZy5xdWV1ZSkgYXMgUXVldWVTdGF0c0NvdW50ZXJzO1xuXHRcdGNvbnN0IG1heEF0dGVtcHRzID0gKGNvbmZpZy5yZXRyaWVzID8/IDMpICsgMTtcblxuXHRcdGNvbnN0IHsgY29uc3VtZXJUYWcgfSA9IGF3YWl0IGNoYW5uZWwuY29uc3VtZShcblx0XHRcdGNvbmZpZy5xdWV1ZSxcblx0XHRcdChtc2cpID0+IHtcblx0XHRcdFx0aWYgKCFtc2cpIHJldHVybjtcblx0XHRcdFx0dm9pZCAoYXN5bmMgKCkgPT4ge1xuXHRcdFx0XHRcdGNvbnN0IHBheWxvYWRTdHJpbmcgPSBtc2cuY29udGVudC50b1N0cmluZyhcInV0ZjhcIik7XG5cdFx0XHRcdFx0bGV0IGRhdGE6IHVua25vd247XG5cdFx0XHRcdFx0dHJ5IHtcblx0XHRcdFx0XHRcdGRhdGEgPSBwYXlsb2FkU3RyaW5nLmxlbmd0aCA+IDAgPyBKU09OLnBhcnNlKHBheWxvYWRTdHJpbmcpIDogbnVsbDtcblx0XHRcdFx0XHR9IGNhdGNoIHtcblx0XHRcdFx0XHRcdGRhdGEgPSBwYXlsb2FkU3RyaW5nO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRjb25zdCBoZWFkZXJzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge307XG5cdFx0XHRcdFx0Zm9yIChjb25zdCBbaywgdl0gb2YgT2JqZWN0LmVudHJpZXMobXNnLnByb3BlcnRpZXMuaGVhZGVycyA/PyB7fSkpIGhlYWRlcnNba10gPSBTdHJpbmcodik7XG5cdFx0XHRcdFx0Y29uc3QgYXR0ZW1wdHMgPSBOdW1iZXIucGFyc2VJbnQoU3RyaW5nKG1zZy5wcm9wZXJ0aWVzLmhlYWRlcnM/LltcIngtYmxvay1hdHRlbXB0XCJdID8/IDApLCAxMCk7XG5cdFx0XHRcdFx0Ly8gVHJhY2tzIHdoZXRoZXIgdGhlIG1lc3NhZ2UgaGFzIGFscmVhZHkgYmVlbiBhY2svbmFjaydkIHZpYVxuXHRcdFx0XHRcdC8vIHRoZSBXb3JrZXJKb2IgQVBJIChgY29tcGxldGVgIC8gYGZhaWxgKS4gVGhlIHdyYXBwaW5nXG5cdFx0XHRcdFx0Ly8gdHJ5L2NhdGNoIGJlbG93IGFsc28gd2FudHMgdG8gYWNrIG9uIGhhbmRsZXIgc3VjY2VzcyBhbmRcblx0XHRcdFx0XHQvLyBuYWNrIG9uIGhhbmRsZXIgdGhyb3cg4oCUIHdpdGhvdXQgdGhpcyBmbGFnIHdlJ2Rcblx0XHRcdFx0XHQvLyBkb3VibGUtYWNrIHRoZSBzYW1lIGRlbGl2ZXJ5IHRhZyBhbmQgUmFiYml0IGNsb3NlcyB0aGVcblx0XHRcdFx0XHQvLyBjaGFubmVsIHdpdGggUFJFQ09ORElUSU9OX0ZBSUxFRCAoY2F1Z2h0IGJ5IHRoZVxuXHRcdFx0XHRcdC8vIHJlYWwtYnJva2VyIGludGVncmF0aW9uIHRlc3QgaW5cblx0XHRcdFx0XHQvLyBgX190ZXN0c19fL2ludGVncmF0aW9uL3JhYmJpdG1xLWFkYXB0ZXIucmVhbC1yYWJiaXRtcS50ZXN0LnRzYCkuXG5cdFx0XHRcdFx0bGV0IHNldHRsZWQgPSBmYWxzZTtcblx0XHRcdFx0XHRjb25zdCBqb2I6IFdvcmtlckpvYiA9IHtcblx0XHRcdFx0XHRcdGlkOiBtc2cucHJvcGVydGllcy5tZXNzYWdlSWQgPz8gYCR7Y29uZmlnLnF1ZXVlfToke21zZy5maWVsZHMuZGVsaXZlcnlUYWd9YCxcblx0XHRcdFx0XHRcdGRhdGEsXG5cdFx0XHRcdFx0XHRoZWFkZXJzLFxuXHRcdFx0XHRcdFx0cXVldWU6IGNvbmZpZy5xdWV1ZSxcblx0XHRcdFx0XHRcdHByaW9yaXR5OiBtc2cucHJvcGVydGllcy5wcmlvcml0eSA/PyBjb25maWcucHJpb3JpdHkgPz8gMCxcblx0XHRcdFx0XHRcdGF0dGVtcHRzLFxuXHRcdFx0XHRcdFx0bWF4UmV0cmllczogY29uZmlnLnJldHJpZXMgPz8gMyxcblx0XHRcdFx0XHRcdGNyZWF0ZWRBdDogbXNnLnByb3BlcnRpZXMudGltZXN0YW1wID8gbmV3IERhdGUobXNnLnByb3BlcnRpZXMudGltZXN0YW1wKSA6IG5ldyBEYXRlKCksXG5cdFx0XHRcdFx0XHR0aW1lb3V0OiBjb25maWcudGltZW91dCxcblx0XHRcdFx0XHRcdHJhdzogbXNnLFxuXHRcdFx0XHRcdFx0Y29tcGxldGU6IGFzeW5jICgpID0+IHtcblx0XHRcdFx0XHRcdFx0aWYgKHNldHRsZWQpIHJldHVybjtcblx0XHRcdFx0XHRcdFx0Y2hhbm5lbC5hY2sobXNnKTtcblx0XHRcdFx0XHRcdFx0c3RhdHMuY29tcGxldGVkICs9IDE7XG5cdFx0XHRcdFx0XHRcdHNldHRsZWQgPSB0cnVlO1xuXHRcdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRcdGZhaWw6IGFzeW5jIChlcnI6IEVycm9yLCByZXF1ZXVlPzogYm9vbGVhbikgPT4ge1xuXHRcdFx0XHRcdFx0XHRpZiAoc2V0dGxlZCkgcmV0dXJuO1xuXHRcdFx0XHRcdFx0XHRzdGF0cy5mYWlsZWQgKz0gMTtcblx0XHRcdFx0XHRcdFx0Y29uc3QgZXhjZWVkZWQgPSBhdHRlbXB0cyArIDEgPj0gbWF4QXR0ZW1wdHM7XG5cdFx0XHRcdFx0XHRcdGNoYW5uZWwubmFjayhtc2csIGZhbHNlLCAhZXhjZWVkZWQgJiYgcmVxdWV1ZSAhPT0gZmFsc2UpO1xuXHRcdFx0XHRcdFx0XHRzZXR0bGVkID0gdHJ1ZTtcblx0XHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0fTtcblx0XHRcdFx0XHRzdGF0cy5hY3RpdmUgKz0gMTtcblx0XHRcdFx0XHR0cnkge1xuXHRcdFx0XHRcdFx0YXdhaXQgaGFuZGxlcihqb2IpO1xuXHRcdFx0XHRcdFx0aWYgKCFzZXR0bGVkICYmIGNvbmZpZy5hY2sgIT09IGZhbHNlKSB7XG5cdFx0XHRcdFx0XHRcdGNoYW5uZWwuYWNrKG1zZyk7XG5cdFx0XHRcdFx0XHRcdHN0YXRzLmNvbXBsZXRlZCArPSAxO1xuXHRcdFx0XHRcdFx0XHRzZXR0bGVkID0gdHJ1ZTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9IGNhdGNoIHtcblx0XHRcdFx0XHRcdGlmICghc2V0dGxlZCkge1xuXHRcdFx0XHRcdFx0XHRzdGF0cy5mYWlsZWQgKz0gMTtcblx0XHRcdFx0XHRcdFx0Y29uc3QgZXhjZWVkZWQgPSBhdHRlbXB0cyArIDEgPj0gbWF4QXR0ZW1wdHM7XG5cdFx0XHRcdFx0XHRcdGNoYW5uZWwubmFjayhtc2csIGZhbHNlLCAhZXhjZWVkZWQpO1xuXHRcdFx0XHRcdFx0XHRzZXR0bGVkID0gdHJ1ZTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9IGZpbmFsbHkge1xuXHRcdFx0XHRcdFx0c3RhdHMuYWN0aXZlID0gTWF0aC5tYXgoMCwgc3RhdHMuYWN0aXZlIC0gMSk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9KSgpO1xuXHRcdFx0fSxcblx0XHRcdHsgbm9BY2s6IGNvbmZpZy5hY2sgPT09IGZhbHNlIH0sXG5cdFx0KTtcblx0XHR0aGlzLmNoYW5uZWxzLnNldChjb25maWcucXVldWUsIHsgY2hhbm5lbCwgY29uc3VtZXJUYWcgfSk7XG5cdH1cblxuXHRhc3luYyBhZGRKb2IoXG5cdFx0cXVldWU6IHN0cmluZyxcblx0XHRkYXRhOiB1bmtub3duLFxuXHRcdG9wdHM/OiB7IHByaW9yaXR5PzogbnVtYmVyOyBkZWxheT86IG51bWJlcjsgcmV0cmllcz86IG51bWJlcjsgdGltZW91dD86IG51bWJlcjsgam9iSWQ/OiBzdHJpbmcgfSxcblx0KTogUHJvbWlzZTxzdHJpbmc+IHtcblx0XHRpZiAoIXRoaXMuY29ubmVjdGVkIHx8ICF0aGlzLmNvbm4pIHRocm93IG5ldyBFcnJvcihcIltibG9rXVtyYWJiaXRtcV0gbm90IGNvbm5lY3RlZC4gQ2FsbCBjb25uZWN0KCkgZmlyc3QuXCIpO1xuXHRcdC8vIERlbGF5ZWQgZGVsaXZlcnkgcmVxdWlyZXMgdGhlIHJhYmJpdG1xX2RlbGF5ZWRfbWVzc2FnZV9leGNoYW5nZVxuXHRcdC8vIHBsdWdpbiAoeC1kZWxheSBoZWFkZXIg4oaSIHgtZGVsYXllZC1tZXNzYWdlIGV4Y2hhbmdlKS4gU3RvY2tcblx0XHQvLyByYWJiaXRtcSBpbWFnZXMgZG8gbm90IHNoaXAgaXQsIHNvIHNpbGVudGx5IGRyb3BwaW5nIHRoZSBkZWxheVxuXHRcdC8vIHdvdWxkIGRlbGl2ZXIgdGhlIGpvYiBpbW1lZGlhdGVseSBhbmQgbGllIHRvIHRoZSBjYWxsZXIuIFJlamVjdFxuXHRcdC8vIGxvdWRseSBpbnN0ZWFkLlxuXHRcdGlmICh0eXBlb2Ygb3B0cz8uZGVsYXkgPT09IFwibnVtYmVyXCIgJiYgb3B0cy5kZWxheSA+IDApIHtcblx0XHRcdHRocm93IG5ldyBFcnJvcihcblx0XHRcdFx0XCJbYmxva11bcmFiYml0bXFdIGRlbGF5ZWQgZGVsaXZlcnkgKG9wdHMuZGVsYXkpIHJlcXVpcmVzIHRoZSByYWJiaXRtcV9kZWxheWVkX21lc3NhZ2VfZXhjaGFuZ2UgcGx1Z2luLCB3aGljaCBpcyBub3QgZW5hYmxlZCBvbiB0aGlzIGJyb2tlci4gRW5hYmxlIHRoZSBwbHVnaW4gb3IgcmVtb3ZlIHRoZSBkZWxheS5cIixcblx0XHRcdCk7XG5cdFx0fVxuXHRcdGxldCBjaGFubmVsID0gdGhpcy5jaGFubmVscy5nZXQocXVldWUpPy5jaGFubmVsO1xuXHRcdGlmICghY2hhbm5lbCkge1xuXHRcdFx0Y2hhbm5lbCA9IGF3YWl0IHRoaXMuY29ubi5jcmVhdGVDaGFubmVsKCk7XG5cdFx0XHRhd2FpdCBjaGFubmVsLmFzc2VydFF1ZXVlKHF1ZXVlLCB7IGR1cmFibGU6IHRydWUsIG1heFByaW9yaXR5OiBNQVhfUFJJT1JJVFkgfSk7XG5cdFx0fVxuXHRcdGNvbnN0IG1lc3NhZ2VJZCA9IG9wdHM/LmpvYklkID8/IHV1aWQoKTtcblx0XHRjb25zdCBoZWFkZXJzOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9IHt9O1xuXHRcdGNvbnN0IG9rID0gY2hhbm5lbC5zZW5kVG9RdWV1ZShxdWV1ZSwgQnVmZmVyLmZyb20odHlwZW9mIGRhdGEgPT09IFwic3RyaW5nXCIgPyBkYXRhIDogSlNPTi5zdHJpbmdpZnkoZGF0YSkpLCB7XG5cdFx0XHRwZXJzaXN0ZW50OiB0cnVlLFxuXHRcdFx0bWVzc2FnZUlkLFxuXHRcdFx0cHJpb3JpdHk6IG9wdHM/LnByaW9yaXR5LFxuXHRcdFx0dGltZXN0YW1wOiBEYXRlLm5vdygpLFxuXHRcdFx0aGVhZGVycyxcblx0XHR9KTtcblx0XHRpZiAoIW9rKSB7XG5cdFx0XHQvLyBDaGFubmVsIGlzIGluIGZsb3ctY29udHJvbGxlZCBzdGF0ZS4gVGhlIHNlbmQgaXMgc3RpbGxcblx0XHRcdC8vIGFjY2VwdGVkOyB0aGUgY2hhbm5lbCB3aWxsIGVtaXQgYSAnZHJhaW4nIGV2ZW50IHdoZW4gcmVhZHkuXG5cdFx0XHQvLyBXZSBkb24ndCBjdXJyZW50bHkgc3VyZmFjZSBiYWNrcHJlc3N1cmUgdG8gY2FsbGVycy5cblx0XHR9XG5cdFx0cmV0dXJuIG1lc3NhZ2VJZDtcblx0fVxuXG5cdGFzeW5jIHN0b3BQcm9jZXNzaW5nKHF1ZXVlOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcblx0XHRjb25zdCBlbnRyeSA9IHRoaXMuY2hhbm5lbHMuZ2V0KHF1ZXVlKTtcblx0XHRpZiAoIWVudHJ5KSByZXR1cm47XG5cdFx0dHJ5IHtcblx0XHRcdGlmIChlbnRyeS5jb25zdW1lclRhZykgYXdhaXQgZW50cnkuY2hhbm5lbC5jYW5jZWwoZW50cnkuY29uc3VtZXJUYWcpO1xuXHRcdFx0YXdhaXQgZW50cnkuY2hhbm5lbC5jbG9zZSgpO1xuXHRcdH0gY2F0Y2gge1xuXHRcdFx0LyogaWdub3JlICovXG5cdFx0fVxuXHRcdHRoaXMuY2hhbm5lbHMuZGVsZXRlKHF1ZXVlKTtcblx0fVxuXG5cdGlzQ29ubmVjdGVkKCk6IGJvb2xlYW4ge1xuXHRcdHJldHVybiB0aGlzLmNvbm5lY3RlZDtcblx0fVxuXG5cdGFzeW5jIGhlYWx0aENoZWNrKCk6IFByb21pc2U8Ym9vbGVhbj4ge1xuXHRcdGlmICghdGhpcy5jb25uZWN0ZWQgfHwgIXRoaXMuY29ubikgcmV0dXJuIGZhbHNlO1xuXHRcdHRyeSB7XG5cdFx0XHRjb25zdCBjaGFubmVsID0gYXdhaXQgdGhpcy5jb25uLmNyZWF0ZUNoYW5uZWwoKTtcblx0XHRcdGF3YWl0IGNoYW5uZWwuY2xvc2UoKTtcblx0XHRcdHJldHVybiB0cnVlO1xuXHRcdH0gY2F0Y2gge1xuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdH1cblx0fVxuXG5cdGFzeW5jIGdldFF1ZXVlU3RhdHMocXVldWU6IHN0cmluZyk6IFByb21pc2U8V29ya2VyUXVldWVTdGF0cz4ge1xuXHRcdGNvbnN0IGNvdW50ZXJzID0gdGhpcy5zdGF0cy5nZXQocXVldWUpID8/IHsgY29tcGxldGVkOiAwLCBmYWlsZWQ6IDAsIGFjdGl2ZTogMCB9O1xuXHRcdGxldCB3YWl0aW5nID0gMDtcblx0XHRjb25zdCBlbnRyeSA9IHRoaXMuY2hhbm5lbHMuZ2V0KHF1ZXVlKTtcblx0XHRpZiAoZW50cnkpIHtcblx0XHRcdHRyeSB7XG5cdFx0XHRcdGNvbnN0IGluZm8gPSBhd2FpdCBlbnRyeS5jaGFubmVsLmNoZWNrUXVldWUocXVldWUpO1xuXHRcdFx0XHR3YWl0aW5nID0gaW5mby5tZXNzYWdlQ291bnQ7XG5cdFx0XHR9IGNhdGNoIHtcblx0XHRcdFx0LyogaWdub3JlICovXG5cdFx0XHR9XG5cdFx0fVxuXHRcdHJldHVybiB7XG5cdFx0XHR3YWl0aW5nLFxuXHRcdFx0YWN0aXZlOiBjb3VudGVycy5hY3RpdmUsXG5cdFx0XHRjb21wbGV0ZWQ6IGNvdW50ZXJzLmNvbXBsZXRlZCxcblx0XHRcdGZhaWxlZDogY291bnRlcnMuZmFpbGVkLFxuXHRcdFx0ZGVsYXllZDogMCxcblx0XHR9O1xuXHR9XG59XG4iXX0=
@@ -6,15 +6,36 @@
6
6
  * Semantics:
7
7
  * - **Consumer groups**: required. `consumerGroup` defaults to
8
8
  * `"${queue}-group"`. The group is auto-created (`MKSTREAM` on the
9
- * stream too) on first `process()` call.
9
+ * stream too) on first `process()` call, at the `startFrom` cursor
10
+ * (`"latest"` → `$` default, `"earliest"` → `0`, or `fromBeginning`).
10
11
  * - **Consumer name**: per-process uuid, so multiple instances of
11
12
  * the same worker process don't share pending entries.
12
- * - **Retries**: pending entries are XACK'd on success / left
13
- * unacked on failure (visible in `XPENDING`). A redrive loop
14
- * reads pending entries older than `timeout` and re-delivers
15
- * to the current consumer.
16
- * - **Auto-claim**: skipped in v1 operators should run XAUTOCLAIM
17
- * periodically out of band.
13
+ * - **ACK / retries**: ACK happens exactly once via `job.complete()`
14
+ * (success) the consumer loop does NOT double-ACK. A terminal
15
+ * `job.fail(err, false)` XADDs the payload to `deadLetterQueue`
16
+ * (when configured) then XACKs the source so it isn't redelivered.
17
+ * A requeue `job.fail(err, true)` leaves the entry pending (visible
18
+ * in `XPENDING`) for redrive.
19
+ * - **ack:false**: the consumer reads with NOACK, so Redis never
20
+ * adds entries to the group's PEL — at-most-once, no leaked pending.
21
+ * - **Redrive**: an in-process periodic XAUTOCLAIM loop reclaims stale
22
+ * pending entries (idle > `config.timeout`) — left by a crashed
23
+ * consumer or a requeue `fail(err, true)` — and re-runs them through
24
+ * the handler. Redis bumps each entry's delivery count on every
25
+ * claim; once it exceeds `retries + 1` the entry is dead-lettered
26
+ * (when `deadLetterQueue` is set) and XACKed. The redrive loop only
27
+ * runs when `config.timeout` is set (it IS the idle threshold — with
28
+ * no timeout a slow-but-alive handler is indistinguishable from a
29
+ * dead one) and NOT under `ack:false` (nothing lands in the PEL).
30
+ * - **No native delay / priority**: Redis Streams has neither. `addJob`
31
+ * THROWS on `opts.delay` / `opts.priority` rather than silently
32
+ * dropping them — use a scheduler trigger for delayed work.
33
+ * - **Concurrency**: each of the `concurrency` consumer loops owns a
34
+ * DEDICATED ioredis connection (`client.duplicate()`) so their
35
+ * blocking XREADGROUP calls run in parallel instead of serializing on
36
+ * one shared socket — ioredis requires a separate client per blocking
37
+ * command. The shared `this.client` handles non-blocking ops
38
+ * (XADD / XACK / XGROUP / XAUTOCLAIM).
18
39
  *
19
40
  * Requires `ioredis` as a peer dependency:
20
41
  *
@@ -49,6 +70,33 @@ export declare class RedisStreamsAdapter implements WorkerAdapter {
49
70
  disconnect(): Promise<void>;
50
71
  process(config: WorkerTriggerOpts, handler: (job: WorkerJob) => Promise<void>): Promise<void>;
51
72
  private runConsumerLoop;
73
+ /**
74
+ * Run one delivered/reclaimed entry through the handler, building the
75
+ * `WorkerJob` with the ACK-once guard. Shared by the main consumer loop
76
+ * and the redrive loop so both paths ACK / DLQ / count identically.
77
+ *
78
+ * `attempts` seeds `job.attempts` (0 on first delivery, the redrive
79
+ * delivery-count on reclaim) so `WorkerTrigger.handleJob` routes to the DLQ
80
+ * once retries are exhausted instead of requeueing forever.
81
+ */
82
+ private processMessage;
83
+ /**
84
+ * One redrive pass: XAUTOCLAIM entries idle longer than `minIdle` (a
85
+ * crashed consumer or a requeue `fail`) back to this consumer, then re-run
86
+ * each. Redis bumps each entry's delivery count on every claim; once it
87
+ * exceeds `retries + 1` the entry is dead-lettered and ACKed rather than
88
+ * reclaimed again forever.
89
+ */
90
+ private redriveOnce;
91
+ /**
92
+ * Map the trigger's start position to the id passed to XGROUP CREATE.
93
+ * - `"latest"` (default) → `$` : only entries added after creation.
94
+ * - `"earliest"` / `fromBeginning:true` → `0` : the whole retained stream.
95
+ * - `{ seq }` / `{ timestamp }` → that explicit cursor id.
96
+ * `startFrom` rides on the PubSub schema, not WorkerTriggerOpts, so it's
97
+ * read defensively off `config` for callers that thread it through.
98
+ */
99
+ private resolveStartId;
52
100
  private fieldsToObject;
53
101
  addJob(queue: string, data: unknown, opts?: {
54
102
  priority?: number;