footprintjs 9.42.0 → 9.43.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.
Files changed (53) hide show
  1. package/AGENTS.md +1 -1
  2. package/CLAUDE.md +3 -3
  3. package/dist/esm/index.d.ts +1 -1
  4. package/dist/esm/index.js +1 -1
  5. package/dist/esm/lib/engine/handlers/ParallelForEachHandler.js +10 -1
  6. package/dist/esm/lib/engine/handlers/StageRunner.js +4 -3
  7. package/dist/esm/lib/engine/handlers/SubflowExecutor.js +14 -12
  8. package/dist/esm/lib/engine/handlers/SubflowInputMapper.d.ts +4 -3
  9. package/dist/esm/lib/engine/handlers/SubflowInputMapper.js +19 -8
  10. package/dist/esm/lib/engine/handlers/servedPause.d.ts +15 -0
  11. package/dist/esm/lib/engine/handlers/servedPause.js +26 -0
  12. package/dist/esm/lib/engine/traversal/FlowchartTraverser.d.ts +2 -0
  13. package/dist/esm/lib/engine/traversal/FlowchartTraverser.js +19 -7
  14. package/dist/esm/lib/memory/DiagnosticCollector.d.ts +1 -0
  15. package/dist/esm/lib/memory/DiagnosticCollector.js +7 -5
  16. package/dist/esm/lib/memory/StageContext.d.ts +12 -0
  17. package/dist/esm/lib/memory/StageContext.js +44 -6
  18. package/dist/esm/lib/memory/redaction.d.ts +282 -40
  19. package/dist/esm/lib/memory/redaction.js +887 -105
  20. package/dist/esm/lib/pause/index.d.ts +1 -1
  21. package/dist/esm/lib/pause/index.js +1 -1
  22. package/dist/esm/lib/pause/record.js +19 -1
  23. package/dist/esm/lib/pause/types.d.ts +20 -0
  24. package/dist/esm/lib/pause/types.js +1 -1
  25. package/dist/esm/lib/runner/FlowChartExecutor.js +7 -1
  26. package/dist/esm/lib/runner/checkpoint.d.ts +3 -1
  27. package/dist/esm/lib/runner/checkpoint.js +4 -1
  28. package/dist/index.js +1 -1
  29. package/dist/lib/engine/handlers/ParallelForEachHandler.js +10 -1
  30. package/dist/lib/engine/handlers/StageRunner.js +4 -3
  31. package/dist/lib/engine/handlers/SubflowExecutor.js +14 -12
  32. package/dist/lib/engine/handlers/SubflowInputMapper.js +19 -8
  33. package/dist/lib/engine/handlers/servedPause.js +30 -0
  34. package/dist/lib/engine/traversal/FlowchartTraverser.js +19 -7
  35. package/dist/lib/memory/DiagnosticCollector.js +7 -5
  36. package/dist/lib/memory/StageContext.js +44 -6
  37. package/dist/lib/memory/redaction.js +891 -106
  38. package/dist/lib/pause/index.js +1 -1
  39. package/dist/lib/pause/record.js +19 -1
  40. package/dist/lib/pause/types.js +1 -1
  41. package/dist/lib/runner/FlowChartExecutor.js +7 -1
  42. package/dist/lib/runner/checkpoint.js +4 -1
  43. package/dist/types/index.d.ts +1 -1
  44. package/dist/types/lib/engine/handlers/SubflowInputMapper.d.ts +4 -3
  45. package/dist/types/lib/engine/handlers/servedPause.d.ts +15 -0
  46. package/dist/types/lib/engine/traversal/FlowchartTraverser.d.ts +2 -0
  47. package/dist/types/lib/memory/DiagnosticCollector.d.ts +1 -0
  48. package/dist/types/lib/memory/StageContext.d.ts +12 -0
  49. package/dist/types/lib/memory/redaction.d.ts +282 -40
  50. package/dist/types/lib/pause/index.d.ts +1 -1
  51. package/dist/types/lib/pause/types.d.ts +20 -0
  52. package/dist/types/lib/runner/checkpoint.d.ts +3 -1
  53. package/package.json +1 -1
package/AGENTS.md CHANGED
@@ -1037,7 +1037,7 @@ $log(value) → emits 'log.debug.messages'
1037
1037
 
1038
1038
  So `$metric` / `$debug` are observable by recorders in real time; the side bags still populate for consumers that inspect snapshots directly.
1039
1039
 
1040
- `RedactionPolicy.diagnostics` explicitly selects retained bag values (`logs`, `errors`, `metrics`, `evals` and flow-message text). The collector decides before storage; the facade emits the same retained incoming value, then applies any `emitPatterns` whole-wrapper mask. Do not re-scrub at recorders or snapshot export. Entries and flow metadata remain; independent error hooks/logger output and operational checkpoint state are not covered. State selectors/marks and the state-only redaction report stay separate. See `docs/guides/scope.md` → "Explicit diagnostic redaction".
1040
+ A redaction policy's state selectors also select a diagnostic entry by its NAME (`keys: ['token']` masks `$debug('token', …)`, `$error`, `$metric` and a `token` nested in a logged record). `RedactionPolicy.diagnostics` adds diagnostic-only selectors (`logs`, `errors`, `metrics`, `evals` and flow-message text, which has no name of its own). The collector decides before storage; the facade emits the same retained incoming value, then applies any `emitPatterns` whole-wrapper mask. Do not re-scrub at recorders or snapshot export. Entries and flow metadata remain; the checkpoint's operational state stays real. See `docs/guides/scope.md` → "The one law" and "Explicit diagnostic redaction".
1041
1041
 
1042
1042
  ### Customizing narrative rendering
1043
1043
  `NarrativeFormatter.renderEmit?(ctx)` hook (passed as `enableNarrative({ renderer })`) renders an emit event into a narrative line. Return `string` to use, `null` to exclude, `undefined` to fall back to the default `[emit] name: payloadSummary` (above: the first line is the custom one, the rest are defaults).
package/CLAUDE.md CHANGED
@@ -57,10 +57,10 @@ Entry points: `footprintjs` (public API) · `/recorders` (factories) · `/trace`
57
57
  - **StageContext.commit / dials** → ONE owner since 9.35.0 (F5): `memory/runPolicy.ts` — a frozen `RunPolicy` (the four dials + the `RedactionRule` + the mirror flag) built ONCE by `FlowChartExecutor · createTraverser` (run AND resume), handed to `ExecutionRuntime`, held BY REFERENCE by every `StageContext` (`inheritRun` in createNext/createChild) and passed by `SubflowExecutor · executeSubflow` to the nested runtime BEFORE the seed. A fifth dial = the policy type + its consumer. The old per-dial `use*`/`get*` and `enableRedactedMirror` were removed in 9.36.0 (no compat shims — owner ruling). `commit()`'s FIRST act (9.23.0) is `materialiseWrites` — the `writeTracking` retained form is taken there, once per key, from `_pendingWrites` (bare references + the write-time verdict); anything that reads `_stageWrites` goes through `retainedWrites()` (a non-consuming fold, so a mid-run snapshot is honest), and `discardStaged` drops the pending map with the rest.
58
58
  - **runtimeStageId format** (`#`/`/` delimiters) → ONE grammar owner since 9.37.0 (F7): `src/lib/ids/` (L0 leaf: `runtimeStageId.ts` — `parseRuntimeStageId`, `isExecutionKey`, `stageIdOf`, `subflowPathOf`, `refuseReservedId`; `branchSegment.ts` — the `~` grammar). Every parser (ScopeFacade subflow path, subflowResults dual-keying, checkpoint lean-filter, narrative buffering, store keys) calls it; none re-derives the grammar. R5: every id door (22 at build, plus the run-time dynamic-StageNode door) refuses `#` and `/`; stage ids may contain `~`. `TraversalContext` has ONE constructor (`engine/traversalContext.ts`); `depth` = subflow nesting read off the runtimeStageId on every stamp. Brands `RuntimeStageId`/`ExecutionIndex`/`CommitIdx` on `/trace` (types only).
59
59
  - **Subflow id prefixing** → ONE prefixer since 9.37.0: `engine/graph/prefixNodeTree.ts`, used by the builder AND the traverser (eager, lazy and `parallelForEach` mounts — lazy/branch roots were unprefixed before 9.37.0, so branch ids collided); change it + stageMap key composition + resume drilling; the builder's eager mounts all go through `FlowChartBuilder · _mountSubflow` (F10). test/lib/engine/branch-segment-prefixer-equivalence.test.ts stays as a guard.
60
- - **Checkpoint shape** → `runner/checkpoint.ts · buildPauseCheckpoint` (sanitize inside) ↔ `runner/resume.ts · planResume` (validation via `pause/record.ts · decodeCheckpoint`) ↔ `ResumeEntry.plan` (the path's mounts + captures + dispatcher continuations, the `pendingPauses` queue; refused up front when unwalkable, ambiguous, or a pending record is not a sibling) ↔ `SubflowExecutor · executeSubflow` resume hop (seed from the capture in place of the mapper's values — the mapper still runs, for the args — FIRST entry only) ↔ `ChildrenExecutor · raisePauses` (fills `pendingPauses`). 9.28.0 adds ONE optional field, `pendingPauses` (present only when parallel siblings wait); every stored checkpoint enters through `pause/record.ts · decodeCheckpoint` (`checkpointVersion: 1`, one upcaster from unversioned v0 which drops the legacy `continuationStageId`, one validator, one message set; 9.39.0). Pinned: a 9.27.0 checkpoint resumes, test/lib/pause/resume-real-chart-9.27.0-checkpoints.test.ts.
60
+ - **Checkpoint shape** → `runner/checkpoint.ts · buildPauseCheckpoint` (sanitize inside) ↔ `runner/resume.ts · planResume` (validation via `pause/record.ts · decodeCheckpoint`) ↔ `ResumeEntry.plan` (the path's mounts + captures + dispatcher continuations, the `pendingPauses` queue; refused up front when unwalkable, ambiguous, or a pending record is not a sibling) ↔ `SubflowExecutor · executeSubflow` resume hop (seed from the capture in place of the mapper's values — the mapper still runs, for the args — FIRST entry only) ↔ `ChildrenExecutor · raisePauses` (fills `pendingPauses`). 9.28.0 adds ONE optional field, `pendingPauses` (present only when parallel siblings wait); the redaction law adds `redactionMarks` (names only, present only when the run marked something); every stored checkpoint enters through `pause/record.ts · decodeCheckpoint` (`checkpointVersion: 1`, one upcaster from unversioned v0 which drops the legacy `continuationStageId`, one validator, one message set; 9.39.0). Pinned: a 9.27.0 checkpoint resumes, test/lib/pause/resume-real-chart-9.27.0-checkpoints.test.ts.
61
61
  - **Committed-state writers** (copy-on-write, 9.29.0) → anything that writes into `SharedMemory`'s state, a fold's working copy or the buffer's working copy must copy before it writes: `pathOps · ownSpine` for the containers on the path, `ownedRootOf` for the root, `own`/`adopt` for what it created. An in-place edit of a container it did not create edits every generation sharing it — the counted guard stays green while the generations property fails. A new READ path through `TransactionBuffer` goes through `get` (private after the first write) unless it only compares (`peek`); a read the working copy cannot answer is served from LIVE state (`StageContext · readState`, as on 9.28.0) after `TransactionBuffer · detachBase` gives the diff base a private copy at that path — a private copy of the value handed out instead would change live state wherever 9.28.0 let an in-place edit in (a fork child's read of a parent key). `TransactionBuffer · merge` privatises its base first: `deepSmartMerge` dedups arrays BY REFERENCE, so the identity of the base is part of the bytes.
62
- - **Redaction** (9.19.0) has ONE owner: `memory/redaction.ts` `RedactionRule` (verdict per user-level path: `clear | whole | fields`), carried on the run's `RunPolicy` with the four dials (F5). `StageContext.stageWrite` is the ONE write funnel (facade writes, subflow seed, outputMapper merge-back, resume re-seed) and `getValue` retention asks the same rule; the facade asks it for read/write recorder payloads; `SubflowExecutor` for the narrated seed. `FlowchartTraverser.execute` now calls `retainRecord` at root entry/exit BEFORE dispatch/deferred capture (exit inside the failure bracket), so every observer gets the same retained view. An inert rule never enumerates the payload. The contract is named state values and record-root boundary keys/explicit `fields` paths, NOT content scanning: scalar/array root payloads are unchanged; fork output child-ID envelopes require explicit paths. Live inputs/results/state and checkpoints stay real. Diagnostic text/bags, pause payloads and custom recorder data/metadata are outside key redaction; `getSnapshot({ redact: true })` is not a whole-snapshot safe export. `emitPatterns` scrubs matching emitted payloads, not diagnostic retention. Two placeholders, historical: log/mirror `'REDACTED'`, scope-tier `'[REDACTED]'`. See `docs/guides/scope.md` for the bounded contract. Capture the retained boundary at runtime; no second tree walk or recorder-local policy.
63
- - **Diagnostic retention** → opt-in `RedactionPolicy.diagnostics` uses the same path algorithm in a separate namespace. `DiagnosticCollector` asks the current run rule before merging/storing; its internal retained-write bridge supplies legacy facade emits. Existing writers stay void. Only flow-message description/rationale are payloads; keys/topology/timing stay present. Dynamic capture uses a per-visit engine flag, not a diagnostic bag. A redacted `logs.deciderRationale` also reaches decision explanations. Checkpoints keep retained diagnostic bags but preserve operational state; no retroactive scrub, report expansion or safe-export guarantee. See the scope guide's diagnostic contract.
62
+ - **Redaction** (9.19.0; the law restored to owner ruling (a)) has ONE owner: `memory/redaction.ts` `RedactionRule` (verdict per user-level path: `clear | whole | fields`), carried on the run's `RunPolicy` with the four dials (F5). THE LAW: a policy covers EVERYTHING the library retains or serves — log (both encodings), mirror, stageReads/stageWrites, every recorder event inline and deferred (and the rows built from them), narrative, snapshots, diagnostics, pause payloads, boundary records, logger lines — and NEVER the live heap or the resume checkpoint. The two true exceptions are the caller's own values: the `run()` rejection and the live fork result. It selects by NAME, never by content: state by path (`verdict`); a record handed out whole (root input/output — `FlowchartTraverser.execute`; subflow seed/exit — `SubflowExecutor`; pause payload — `engine/handlers/servedPause.ts`; thrown value — `retainStageError`) by its keys at every depth plus declared `fields` under a key of that name (`retainBoundary` — one decision per PATH via `servedByPath`: copy-on-write per path, the visited set only the current path's ancestor stack, a cycle edge landing on the served copy; a path rule is exact under shared references, a key-NAME rule masks a shared node everywhere); a diagnostic entry as the record `{ [name]: value }` (`retainDiagnostic`; `policy.diagnostics` ADDS diagnostic-only selectors, the only ones that reach flow-message text); a subflow mapper's copy by TAINT (`MapperTaint`, asked by `SubflowInputMapper` for both mappers; the `parallelForEach` items selector counts selected reads via `StageContext · selectedReads` and marks `item`/`into`): a value passed under its own name keeps that name's verdict, an object by reference (or the whole handed record, as fields) keeps its source's, anything computed after a selected read is marked whole (conservative); never value equality across names. A mark is a NAME, run-wide, until the key is deleted — and a pause carries the marks (names only) to the resumed run (`FlowchartCheckpoint.redactionMarks`, checked by `pause/record.ts`). A thrown value is walked with its `cause`/`errors`; an object a mapper passes on by reference is scanned for the selected values it read (planted → fields). Name-only patterns (`needsPath` false — no `.`, lookaround, or escape/class that can match `.`) are decided per object, so the walk shares decisions per (object, targets) — linear on a DAG or a linked history; only a path-dependent pattern walks paths, and past 1,000,000 visits it serves the unvisited remainder as the placeholder (one dev-mode warning), never fails the run. Inside a stage, an OBJECT read under a selected name and written under another keeps its rule (`StageContext · stageWrite`, by identity); a primitive or a new object copied across names is selected by its own name only. `StageContext.stageWrite` is the ONE write funnel (facade writes, subflow seed, outputMapper merge-back, resume re-seed) and `getValue` retention asks the same rule; the facade asks it for read/write recorder payloads. An inert rule never enumerates a payload. `emitPatterns` is the one separate scrub (`$emit` payloads, by event name). Two placeholders, historical: log/mirror `'REDACTED'`, scope-tier `'[REDACTED]'`. See `docs/guides/scope.md` → "The one law". Capture the retained form at runtime; no second tree walk or recorder-local policy.
63
+ - **Diagnostic retention** → `DiagnosticCollector` asks the current run rule before merging/storing: a named entry maps to the state key of its name (the run's keys/patterns/marks/fields, at every depth of the value), then the opt-in `RedactionPolicy.diagnostics` selectors (same path algorithm, rooted at the channel). Its internal retained-write bridge supplies legacy facade emits. Existing writers stay void. Only flow-message description/rationale are payloads (no name — diagnostic selectors only); keys/topology/timing stay present. Dynamic capture uses a per-visit engine flag, not a diagnostic bag. A redacted `logs.deciderRationale` also reaches decision explanations. Checkpoints keep retained diagnostic bags but preserve operational state; no retroactive scrub. See the scope guide's diagnostic contract.
64
64
  - **Traverser phases** → node-shape reads must use eff* overlay accessors (:646-703) or dynamic StageNode returns break; tail continuations must return ContinuationHops or stacks regrow; decider flat-dispatch must keep InvokerStamp or pause loses its invoker.
65
65
 
66
66
  ## End-to-end trace (seed → decider → loop branch → finish)
@@ -143,7 +143,7 @@ export { getSubtreeSnapshot, listSubflowPaths } from './lib/runner/index.js';
143
143
  export { CompositeRecorder } from './lib/recorder/index.js';
144
144
  /** @category Pause/Resume */
145
145
  /** @category Pause/Resume */
146
- export type { FlowchartCheckpoint, PausableHandler, PausedExecution, PendingPause } from './lib/pause/index.js';
146
+ export type { FlowchartCheckpoint, PausableHandler, PausedExecution, PendingPause, RedactionMarks, } from './lib/pause/index.js';
147
147
  /**
148
148
  * @category Pause/Resume
149
149
  *
package/dist/esm/index.js CHANGED
@@ -86,4 +86,4 @@ export { disableDevMode, enableDevMode, isDevMode } from './lib/devMode.js';
86
86
  // A run's record as JSON without the engine's recursion limit (9.26.0): the
87
87
  // same bytes JSON.stringify emits, for a deep `next` chain it cannot encode.
88
88
  export { stringifySnapshot } from './lib/runner/stringifySnapshot.js';
89
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7O0dBY0c7QUFTSCw0QkFBNEI7QUFDNUIsT0FBTyxFQUFFLFNBQVMsRUFBRSxnQkFBZ0IsRUFBRSxpQkFBaUIsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBNkJ4Riw0QkFBNEI7QUFDNUIsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBb0IzQyxtQ0FBbUM7QUFDbkMsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQWtCdkQsb0JBQW9CO0FBQ3BCLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBRTFELG9CQUFvQjtBQUNwQixPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFxQm5ELCtCQUErQjtBQUMvQixPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFFdEQsK0JBQStCO0FBQy9CLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUVyRCxvQ0FBb0M7QUFDcEMsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFtQzVELHFFQUFxRTtBQUNyRSxPQUFPLEVBQ0wsc0JBQXNCLEVBQ3RCLHNCQUFzQixFQUN0QixrQkFBa0IsRUFDbEIsV0FBVyxHQUNaLE1BQU0seUJBQXlCLENBQUM7QUFtRGpDLCtCQUErQjtBQUMvQixPQUFPLEVBQUUscUJBQXFCLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUs5RCwrQkFBK0I7QUFDL0IsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFFN0QsK0JBQStCO0FBQy9CLE9BQU8sRUFBRSw2QkFBNkIsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBRXRFLCtCQUErQjtBQUMvQixPQUFPLEVBQUUsOEJBQThCLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUV2RSwrQkFBK0I7QUFDL0IsT0FBTyxFQUFFLGdDQUFnQyxFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFFekUsK0JBQStCO0FBQy9CLE9BQU8sRUFBRSx3QkFBd0IsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBRWpFLCtCQUErQjtBQUMvQixPQUFPLEVBQUUsNkJBQTZCLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUV0RSwrQkFBK0I7QUFDL0IsT0FBTyxFQUFFLDJCQUEyQixFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFFcEUsK0JBQStCO0FBQy9CLE9BQU8sRUFBRSw2QkFBNkIsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBbUJ0RSx1Q0FBdUM7QUFDdkMsT0FBTyxFQUFFLGtCQUFrQixFQUFFLGdCQUFnQixFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFFN0UsK0VBQStFO0FBQy9FLDRFQUE0RTtBQUM1RSwrRUFBK0U7QUFFL0UsOEJBQThCO0FBQzlCLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBb0I1RCw2QkFBNkI7QUFDN0IsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBaUVqRCxzQ0FBc0M7QUFDdEMsT0FBTyxFQUFFLFlBQVksRUFBRSxhQUFhLEVBQUUsS0FBSyxFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFFM0Usc0NBQXNDO0FBQ3RDLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxxQkFBcUIsRUFBRSxlQUFlLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQVNyRyxnQ0FBZ0M7QUFDaEMsT0FBTyxFQUFFLGdCQUFnQixFQUFFLGVBQWUsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBRTFFLCtFQUErRTtBQUMvRSxpREFBaUQ7QUFDakQsK0VBQStFO0FBRS9FOzs7Ozs7Ozs7OztHQVdHO0FBQ0gsT0FBTyxFQUFFLGNBQWMsRUFBRSxhQUFhLEVBQUUsU0FBUyxFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFFNUUsaUZBQWlGO0FBQ2pGLDRFQUE0RTtBQUM1RSxzREFBc0Q7QUFDdEQsNEVBQTRFO0FBQzVFLDZFQUE2RTtBQUM3RSxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxtQ0FBbUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogRm9vdFByaW50IOKAlCBQdWJsaWMgQVBJICh2MylcbiAqXG4gKiBUaGUgZmxvd2NoYXJ0IHBhdHRlcm4gZm9yIGJhY2tlbmQgY29kZS5cbiAqIEJ1aWxkIOKGkiBSdW4g4oaSIE9ic2VydmUuXG4gKlxuICogKipUaHJlZSBpbXBvcnQgcGF0aHM6KipcbiAqIGBgYHRzXG4gKiBpbXBvcnQgeyBmbG93Q2hhcnQsIGRlY2lkZSwgbmFycmF0aXZlIH0gZnJvbSAnZm9vdHByaW50anMnOyAgICAgICAgICAgLy8gbWFpbiDigJQgc3RhcnQgaGVyZVxuICogaW1wb3J0IHsgbWV0cmljcywgZGVidWcsIG1hbmlmZXN0IH0gICAgIGZyb20gJ2Zvb3RwcmludGpzL3JlY29yZGVycyc7IC8vIHJlY29yZGVyIGZhY3Rvcmllc1xuICogaW1wb3J0IHsgU2hhcmVkTWVtb3J5LCBTdGFnZUNvbnRleHQgfSAgIGZyb20gJ2Zvb3RwcmludGpzL2FkdmFuY2VkJzsgIC8vIGludGVybmFsc1xuICogYGBgXG4gKlxuICogQG1vZHVsZVxuICovXG5cbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbi8vIFF1aWNrIFN0YXJ0IOKAlCBFdmVyeXRoaW5nIHlvdSBuZWVkIGZvciA5MCUgb2YgdXNlIGNhc2VzXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbi8qKiBAY2F0ZWdvcnkgUXVpY2sgU3RhcnQgKi9cbmV4cG9ydCB0eXBlIHsgRmxvd0NoYXJ0LCBTdGFnZUZ1bmN0aW9uIGFzIFN0YWdlSGFuZGxlciwgU3RyZWFtSGFuZGxlcnMgfSBmcm9tICcuL2xpYi9idWlsZGVyL2luZGV4LmpzJztcblxuLyoqIEBjYXRlZ29yeSBRdWljayBTdGFydCAqL1xuZXhwb3J0IHsgZmxvd0NoYXJ0LCBGbG93Q2hhcnRCdWlsZGVyLCBmbG93Q2hhcnRTZWxlY3RvciB9IGZyb20gJy4vbGliL2J1aWxkZXIvaW5kZXguanMnO1xuXG4vKipcbiAqIEBjYXRlZ29yeSBRdWljayBTdGFydFxuICpcbiAqIENvbmZpZyBmb3IgYC5hZGRQYXJhbGxlbEZvckVhY2goKWAg4oCUIG9uZSBicmFuY2ggcGVyIGl0ZW0sIGJyYW5jaCBjb3VudFxuICogZGVjaWRlZCBhdCBydW4gdGltZSBmcm9tIHRoZSBwYXlsb2FkLiBgbWF4QnJhbmNoZXNgIGFuZCBgaW50b2AgYXJlIHJlcXVpcmVkXG4gKiBvbiBwdXJwb3NlIChzZWUgZG9jcy9kZXNpZ24vZXhlY3V0aW9uLWNvbnRyb2wubWQpLlxuICovXG5leHBvcnQgdHlwZSB7IEJyYW5jaENoYXJ0LCBQYXJhbGxlbEZvckVhY2hDb25maWcsIFJldHJ5UG9saWN5IH0gZnJvbSAnLi9saWIvYnVpbGRlci9pbmRleC5qcyc7XG5cbi8qKiBAY2F0ZWdvcnkgUXVpY2sgU3RhcnQg4oCUIGJ1aWxkLXRpbWUgb2JzZXJ2ZXIgKHR3aW4gb2YgRmxvd1JlY29yZGVyKSAqL1xuZXhwb3J0IHR5cGUge1xuICBTdHJ1Y3R1cmVEZWNpZGVyQ29tcGxldGVFdmVudCxcbiAgU3RydWN0dXJlRWRnZUFkZGVkRXZlbnQsXG4gIFN0cnVjdHVyZUVkZ2VLaW5kLFxuICBTdHJ1Y3R1cmVMb29wRWRnZUFkZGVkRXZlbnQsXG4gIFN0cnVjdHVyZVJlY29yZGVyLFxuICBTdHJ1Y3R1cmVTdGFnZUFkZGVkRXZlbnQsXG4gIFN0cnVjdHVyZVN0YWdlVGFnZ2VkRXZlbnQsXG4gIFN0cnVjdHVyZVN1YmZsb3dNb3VudGVkRXZlbnQsXG59IGZyb20gJy4vbGliL2J1aWxkZXIvaW5kZXguanMnO1xuXG4vKiogQGNhdGVnb3J5IFF1aWNrIFN0YXJ0ICovXG5leHBvcnQgdHlwZSB7IFR5cGVkU3RhZ2VGdW5jdGlvbiB9IGZyb20gJy4vbGliL2J1aWxkZXIvdHlwZWRGbG93Q2hhcnQuanMnO1xuXG4vKiogQGNhdGVnb3J5IFF1aWNrIFN0YXJ0ICovXG5leHBvcnQgdHlwZSB7IFNjb3BlTWV0aG9kcywgVHlwZWRTY29wZSB9IGZyb20gJy4vbGliL3JlYWN0aXZlL2luZGV4LmpzJztcblxuLyoqIEBjYXRlZ29yeSBRdWljayBTdGFydCAqL1xuZXhwb3J0IHsgbmFycmF0aXZlIH0gZnJvbSAnLi9yZWNvcmRlcnMuanMnO1xuXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4vLyBEZWNpc2lvbiBCcmFuY2hpbmcg4oCUIGRlY2lkZSgpIC8gc2VsZWN0KCkgd2l0aCBldmlkZW5jZSBjYXB0dXJlXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbi8qKiBAY2F0ZWdvcnkgRGVjaXNpb24gQnJhbmNoaW5nICovXG5leHBvcnQgdHlwZSB7XG4gIERlY2lkZVJ1bGUsXG4gIERlY2lzaW9uRXZpZGVuY2UsXG4gIERlY2lzaW9uUmVzdWx0LFxuICBEZWZhdWx0QnJhbmNoLFxuICBGaWx0ZXJPcHMsXG4gIFJ1bGVFdmlkZW5jZSxcbiAgU2VsZWN0aW9uRXZpZGVuY2UsXG4gIFNlbGVjdGlvblJlc3VsdCxcbiAgV2hlbkNsYXVzZSxcbiAgV2hlcmVGaWx0ZXIsXG59IGZyb20gJy4vbGliL2RlY2lkZS9pbmRleC5qcyc7XG5cbi8qKiBAY2F0ZWdvcnkgRGVjaXNpb24gQnJhbmNoaW5nICovXG5leHBvcnQgeyBkZWNpZGUsIHNlbGVjdCB9IGZyb20gJy4vbGliL2RlY2lkZS9pbmRleC5qcyc7XG5cbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbi8vIFJ1biDigJQgRXhlY3V0ZSBjaGFydHMgYW5kIGNvbGxlY3QgcmVzdWx0c1xuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4vKiogQGNhdGVnb3J5IFJ1biAqL1xuZXhwb3J0IHR5cGUgeyBSdW5SZXN1bHQgfSBmcm9tICcuL2xpYi9ydW5uZXIvaW5kZXguanMnO1xuXG4vKiogQGNhdGVnb3J5IFJ1biAqL1xuZXhwb3J0IHR5cGUgeyBGbG93Q2hhcnRFeGVjdXRvck9wdGlvbnMgfSBmcm9tICcuL2xpYi9ydW5uZXIvaW5kZXguanMnO1xuXG4vKipcbiAqIFRoZSBmb3VyIG9ic2VydmFiaWxpdHkgZGlhbHMgYEZsb3dDaGFydEV4ZWN1dG9yT3B0aW9uc2AgaW5oZXJpdHMuXG4gKiBAY2F0ZWdvcnkgUnVuXG4gKi9cbmV4cG9ydCB0eXBlIHsgUnVuRGlhbHMgfSBmcm9tICcuL2xpYi9tZW1vcnkvaW5kZXguanMnO1xuXG4vKiogQGNhdGVnb3J5IFJ1biAqL1xuZXhwb3J0IHsgRmxvd0NoYXJ0RXhlY3V0b3IgfSBmcm9tICcuL2xpYi9ydW5uZXIvaW5kZXguanMnO1xuXG4vKiogQGNhdGVnb3J5IFJ1biAqL1xuZXhwb3J0IHsgUnVuQ29udGV4dCB9IGZyb20gJy4vbGliL3J1bm5lci9pbmRleC5qcyc7XG5cbi8qKiBAY2F0ZWdvcnkgUnVuICovXG5leHBvcnQgdHlwZSB7IENoYXJ0T3BlbkFQSU9wdGlvbnMsIE1DUFRvb2xEZXNjcmlwdGlvbiwgUnVubmFibGVGbG93Q2hhcnQgfSBmcm9tICcuL2xpYi9ydW5uZXIvUnVubmFibGVDaGFydC5qcyc7XG5cbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbi8vIE9ic2VydmUg4oCUIERhdGEgKHNjb3BlIHJlY29yZGVycywgZmlyZSBkdXJpbmcgc3RhZ2UgZXhlY3V0aW9uKVxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4vKiogQGNhdGVnb3J5IE9ic2VydmUg4oCUIERhdGEgKi9cbmV4cG9ydCB0eXBlIHtcbiAgQ29tbWl0RXZlbnQsXG4gIEVycm9yRXZlbnQsXG4gIFJlYWRFdmVudCxcbiAgUmVkYWN0aW9uUG9saWN5LFxuICBSZWRhY3Rpb25SZXBvcnQsXG4gIFNjb3BlUmVjb3JkZXIsXG4gIFN0YWdlRXZlbnQsXG4gIFdyaXRlRXZlbnQsXG59IGZyb20gJy4vbGliL3Njb3BlL2luZGV4LmpzJztcblxuLyoqIEBjYXRlZ29yeSBPYnNlcnZlIOKAlCBEYXRhICovXG5leHBvcnQgeyBNZXRyaWNSZWNvcmRlciB9IGZyb20gJy4vbGliL3Njb3BlL2luZGV4LmpzJztcblxuLyoqIEBjYXRlZ29yeSBPYnNlcnZlIOKAlCBEYXRhICovXG5leHBvcnQgeyBEZWJ1Z1JlY29yZGVyIH0gZnJvbSAnLi9saWIvc2NvcGUvaW5kZXguanMnO1xuXG4vKiogQGNhdGVnb3J5IE9ic2VydmUg4oCUIE9wZXJhdGlvbiAqL1xuZXhwb3J0IHsgUmVjb3JkZXJPcGVyYXRpb24gfSBmcm9tICcuL2xpYi9yZWNvcmRlci9pbmRleC5qcyc7XG5cbi8qKlxuICogQGNhdGVnb3J5IE9ic2VydmUg4oCUIERlbGl2ZXJ5IHRpZXIgKFJGQy0wMDEgZGVmZXJyZWQgb2JzZXJ2ZXJzKVxuICpcbiAqIEV2ZXJ5IGBhdHRhY2gqUmVjb3JkZXJgIGNhbGwgYWNjZXB0cyBhbiBvcHRpb25zIGJhZzpcbiAqIGBleGVjdXRvci5hdHRhY2hTY29wZVJlY29yZGVyKHJlYywgeyBkZWxpdmVyeTogJ2RlZmVycmVkJyB9KWAgdGFrZXMgdGhlXG4gKiByZWNvcmRlciBPVVQgb2YgdGhlIGVuZ2luZSdzIGhvdCBwYXRoIOKAlCBldmVudHMgYXJlIGNhcHR1cmVkIGludG8gb25lXG4gKiBib3VuZGVkLCB0b3RhbGx5LW9yZGVyZWQgcXVldWUgYW5kIGRlbGl2ZXJlZCBhdCB0aGUgbmV4dCBtaWNyb3Rhc2tcbiAqIGNoZWNrcG9pbnQgKFwib25lIGJlYXQgYmVoaW5kXCIpLiBPbWl0IGBkZWxpdmVyeWAgZm9yIHRoZSBoaXN0b3JpY2FsXG4gKiBzeW5jaHJvbm91cyBjYWxsIChieXRlLWlkZW50aWNhbCB0byBwcmV2aW91cyByZWxlYXNlcykuIEFjY291bnRpbmdcbiAqIHN1cmZhY2VzIG9uIGBzbmFwc2hvdC5vYnNlcnZlclN0YXRzYDsgYGV4ZWN1dG9yLmRyYWluT2JzZXJ2ZXJzKClgIHNldHRsZXNcbiAqIGFzeW5jIGxpc3RlbmVycyBiZWZvcmUgc2h1dGRvd24uIFNlZSBgZG9jcy9ndWlkZXMvb2JzZXJ2ZXJzLWRlZmVycmVkLm1kYC5cbiAqL1xuZXhwb3J0IHR5cGUge1xuICBBdHRhY2hSZWNvcmRlck9wdGlvbnMsXG4gIE9ic2VydmVyRGVsaXZlcnksXG4gIE9ic2VydmVyRHJhaW5SZXN1bHQsXG4gIE9ic2VydmVyU3RhdHMsXG59IGZyb20gJy4vbGliL3J1bm5lci9pbmRleC5qcyc7XG5cbi8qKlxuICogQGNhdGVnb3J5IE9ic2VydmUg4oCUIERlbGl2ZXJ5IHRpZXIgKFJGQy0wMDEgZGVmZXJyZWQgb2JzZXJ2ZXJzKVxuICpcbiAqIGBDYXB0dXJlUG9saWN5YCDigJQgaG93IGEgZGVmZXJyZWQgZXZlbnQncyBwYXlsb2FkIGlzIG1hdGVyaWFsaXplZCBhdFxuICogY2FwdHVyZSB0aW1lIChgJ2Nsb25lJ2AgYnkgZGVmYXVsdCBmb3IgYXR0YWNoIG9wdGlvbnMgLyBgJ3N1bW1hcnknYCAvIGAncmVmJ2ApLiBgT3ZlcmZsb3dQb2xpY3lgXG4gKiDigJQgd2hhdCBhIHNhdHVyYXRlZCBxdWV1ZSBkb2VzIChgJ2Ryb3Atb2xkZXN0J2AgZGVmYXVsdCAvIGAnc2FtcGxlJ2AgL1xuICogYCdibG9jaydgKS4gYERpc3BhdGNoZXJTdGF0c2AgLyBgTGlzdGVuZXJTdGF0c2Ag4oCUIHRoZSBhY2NvdW50aW5nIHNoYXBlc1xuICogZW1iZWRkZWQgaW4gYE9ic2VydmVyU3RhdHNgLiBUeXBlcyBvbmx5IOKAlCB0aGUgb2JzZXJ2ZXItcXVldWUgbW9kdWxlXG4gKiBpdHNlbGYgaXMgaW50ZXJuYWw7IGNvbnN1bWVycyB1c2UgdGhlIGF0dGFjaCBvcHRpb25zLlxuICovXG5leHBvcnQgdHlwZSB7IENhcHR1cmVQb2xpY3ksIERpc3BhdGNoZXJTdGF0cywgTGlzdGVuZXJTdGF0cywgT3ZlcmZsb3dQb2xpY3kgfSBmcm9tICcuL2xpYi9vYnNlcnZlci1xdWV1ZS9pbmRleC5qcyc7XG5cbi8qKiBAY2F0ZWdvcnkgT2JzZXJ2ZSDigJQgQ29tYmluZWQgKGJvdGggZGF0YS1mbG93IGFuZCBjb250cm9sLWZsb3cpICovXG5leHBvcnQgdHlwZSB7IENvbWJpbmVkUmVjb3JkZXIgfSBmcm9tICcuL2xpYi9yZWNvcmRlci9pbmRleC5qcyc7XG4vKiogQGNhdGVnb3J5IE9ic2VydmUg4oCUIENvbWJpbmVkIChib3RoIGRhdGEtZmxvdyBhbmQgY29udHJvbC1mbG93KSAqL1xuZXhwb3J0IHtcbiAgaGFzRW1pdFJlY29yZGVyTWV0aG9kcyxcbiAgaGFzRmxvd1JlY29yZGVyTWV0aG9kcyxcbiAgaGFzUmVjb3JkZXJNZXRob2RzLFxuICBpc0Zsb3dFdmVudCxcbn0gZnJvbSAnLi9saWIvcmVjb3JkZXIvaW5kZXguanMnO1xuXG4vKipcbiAqIEBjYXRlZ29yeSBPYnNlcnZlIOKAlCBFbWl0ICh1c2VyLWF1dGhvcmVkIHN0cnVjdHVyZWQgZXZlbnRzKVxuICpcbiAqIFRoaXJkIG9ic2VydmVyIGNoYW5uZWwgKGFsb25nc2lkZSBgU2NvcGVSZWNvcmRlcmAgYW5kIGBGbG93UmVjb3JkZXJgKS4gQ29uc3VtZXJcbiAqIGNvZGUgY2FsbHMgYHNjb3BlLiRlbWl0KG5hbWUsIHBheWxvYWQpYCBmcm9tIGluc2lkZSBhIHN0YWdlOyBldmVyeSBhdHRhY2hlZFxuICogYEVtaXRSZWNvcmRlci5vbkVtaXQoZXZlbnQpYCBmaXJlcyBzeW5jaHJvbm91c2x5IHdpdGggc3RhZ2UtY29udGV4dFxuICogZW5yaWNobWVudC4gUGFzcy10aHJvdWdoIOKAlCBubyBidWZmZXJpbmcsIHplcm8gYWxsb2NhdGlvbiB3aGVuIG5vIHJlY29yZGVyXG4gKiBpcyBhdHRhY2hlZC5cbiAqL1xuZXhwb3J0IHR5cGUgeyBFbWl0RXZlbnQsIEVtaXRSZWNvcmRlciB9IGZyb20gJy4vbGliL3JlY29yZGVyL2luZGV4LmpzJztcblxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuLy8gT2JzZXJ2ZSDigJQgRmxvdyAoRmxvd1JlY29yZGVyLCBmaXJlcyBhZnRlciBzdGFnZSBleGVjdXRpb24pXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbi8qKiBAY2F0ZWdvcnkgT2JzZXJ2ZSDigJQgRmxvdyAqL1xuZXhwb3J0IHR5cGUge1xuICBGbG93QnJlYWtFdmVudCxcbiAgRmxvd0RlY2lzaW9uRXZlbnQsXG4gIEZsb3dFcnJvckV2ZW50LFxuICBGbG93Rm9ya0V2ZW50LFxuICBGbG93TG9vcEV2ZW50LFxuICBGbG93TmV4dEV2ZW50LFxuICBGbG93UmVjb3JkZXIsXG4gIEZsb3dSdW5FdmVudCxcbiAgRmxvd1J1bkZhaWxlZEV2ZW50LFxuICBGbG93U2VsZWN0ZWRFdmVudCxcbiAgRmxvd1N0YWdlRXZlbnQsXG4gIEZsb3dTdGFnZVJldHJ5RXZlbnQsXG4gIEZsb3dTdWJmbG93RXZlbnQsXG4gIEZsb3dTdWJmbG93UmVnaXN0ZXJlZEV2ZW50LFxuICBGbG93VGhyb3R0bGVkRXZlbnQsXG4gIFJlc3VtZUxpbmssXG4gIFRyYXZlcnNhbENvbnRleHQsXG59IGZyb20gJy4vbGliL2VuZ2luZS9pbmRleC5qcyc7XG5cbi8qKiBAY2F0ZWdvcnkgT2JzZXJ2ZSDigJQgRmxvdyAqL1xuZXhwb3J0IHR5cGUgeyBDb21iaW5lZE5hcnJhdGl2ZUVudHJ5IH0gZnJvbSAnLi9saWIvZW5naW5lL2luZGV4LmpzJztcblxuLyoqXG4gKiBAY2F0ZWdvcnkgT2JzZXJ2ZSDigJQgRmxvd1xuICpcbiAqIGBOYXJyYXRpdmVGb3JtYXR0ZXJgIOKAlCBwbHVnZ2FibGUgZm9ybWF0dGVyIHRoYXQgY29udmVydHMgZXZlbnQgY29udGV4dFxuICogb2JqZWN0cyBpbnRvIHRoZSB0ZXh0IGxpbmVzIG9mIHRoZSBuYXJyYXRpdmUuIFByZWZlciB0aGlzIG5hbWUgaW4gbmV3XG4gKiBjb2RlOyBgTmFycmF0aXZlUmVuZGVyZXJgIGlzIGEgZGVwcmVjYXRlZCBhbGlhcyB0aGF0IHdpbGwgYmUgcmVtb3ZlZCBpblxuICogdGhlIG5leHQgbWFqb3IgcmVsZWFzZS5cbiAqL1xuZXhwb3J0IHR5cGUgeyBOYXJyYXRpdmVGb3JtYXR0ZXIsIE5hcnJhdGl2ZVJlbmRlcmVyIH0gZnJvbSAnLi9saWIvZW5naW5lL2luZGV4LmpzJztcblxuLyoqIEBjYXRlZ29yeSBPYnNlcnZlIOKAlCBGbG93ICovXG5leHBvcnQgeyBOYXJyYXRpdmVGbG93UmVjb3JkZXIgfSBmcm9tICcuL2xpYi9lbmdpbmUvaW5kZXguanMnO1xuXG4vKiogQGNhdGVnb3J5IE9ic2VydmUg4oCUIEZsb3cgKi9cbmV4cG9ydCB0eXBlIHsgTWFuaWZlc3RFbnRyeSB9IGZyb20gJy4vbGliL2VuZ2luZS9pbmRleC5qcyc7XG5cbi8qKiBAY2F0ZWdvcnkgT2JzZXJ2ZSDigJQgRmxvdyAqL1xuZXhwb3J0IHsgTWFuaWZlc3RGbG93UmVjb3JkZXIgfSBmcm9tICcuL2xpYi9lbmdpbmUvaW5kZXguanMnO1xuXG4vKiogQGNhdGVnb3J5IE9ic2VydmUg4oCUIEZsb3cgKi9cbmV4cG9ydCB7IEFkYXB0aXZlTmFycmF0aXZlRmxvd1JlY29yZGVyIH0gZnJvbSAnLi9saWIvZW5naW5lL2luZGV4LmpzJztcblxuLyoqIEBjYXRlZ29yeSBPYnNlcnZlIOKAlCBGbG93ICovXG5leHBvcnQgeyBNaWxlc3RvbmVOYXJyYXRpdmVGbG93UmVjb3JkZXIgfSBmcm9tICcuL2xpYi9lbmdpbmUvaW5kZXguanMnO1xuXG4vKiogQGNhdGVnb3J5IE9ic2VydmUg4oCUIEZsb3cgKi9cbmV4cG9ydCB7IFByb2dyZXNzaXZlTmFycmF0aXZlRmxvd1JlY29yZGVyIH0gZnJvbSAnLi9saWIvZW5naW5lL2luZGV4LmpzJztcblxuLyoqIEBjYXRlZ29yeSBPYnNlcnZlIOKAlCBGbG93ICovXG5leHBvcnQgeyBSTEVOYXJyYXRpdmVGbG93UmVjb3JkZXIgfSBmcm9tICcuL2xpYi9lbmdpbmUvaW5kZXguanMnO1xuXG4vKiogQGNhdGVnb3J5IE9ic2VydmUg4oCUIEZsb3cgKi9cbmV4cG9ydCB7IFNlcGFyYXRlTmFycmF0aXZlRmxvd1JlY29yZGVyIH0gZnJvbSAnLi9saWIvZW5naW5lL2luZGV4LmpzJztcblxuLyoqIEBjYXRlZ29yeSBPYnNlcnZlIOKAlCBGbG93ICovXG5leHBvcnQgeyBTaWxlbnROYXJyYXRpdmVGbG93UmVjb3JkZXIgfSBmcm9tICcuL2xpYi9lbmdpbmUvaW5kZXguanMnO1xuXG4vKiogQGNhdGVnb3J5IE9ic2VydmUg4oCUIEZsb3cgKi9cbmV4cG9ydCB7IFdpbmRvd2VkTmFycmF0aXZlRmxvd1JlY29yZGVyIH0gZnJvbSAnLi9saWIvZW5naW5lL2luZGV4LmpzJztcblxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuLy8gU2VsZi1EZXNjcmliaW5nIOKAlCAuY29udHJhY3QoKSwgdG9PcGVuQVBJKCksIHRvTUNQVG9vbCgpXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbi8qKiBAY2F0ZWdvcnkgU2VsZi1EZXNjcmliaW5nICovXG5leHBvcnQgdHlwZSB7IEpzb25TY2hlbWEgfSBmcm9tICcuL2xpYi9jb250cmFjdC9pbmRleC5qcyc7XG5cbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbi8vIFNuYXBzaG90ICYgQ29tcG9zaXRpb24g4oCUIFN1YmZsb3cgbmF2aWdhdGlvbiBhbmQgQ29tcG9zYWJsZVJ1bm5lclxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4vKiogQGNhdGVnb3J5IFNuYXBzaG90ICYgQ29tcG9zaXRpb24gKi9cbmV4cG9ydCB0eXBlIHsgQ29tcG9zYWJsZVJ1bm5lciB9IGZyb20gJy4vbGliL3J1bm5lci9pbmRleC5qcyc7XG5cbi8qKiBAY2F0ZWdvcnkgU25hcHNob3QgJiBDb21wb3NpdGlvbiAqL1xuZXhwb3J0IHR5cGUgeyBSZWNvcmRlclNuYXBzaG90LCBSdW50aW1lU25hcHNob3QsIFN1YnRyZWVTbmFwc2hvdCB9IGZyb20gJy4vbGliL3J1bm5lci9pbmRleC5qcyc7XG5cbi8qKiBAY2F0ZWdvcnkgU25hcHNob3QgJiBDb21wb3NpdGlvbiAqL1xuZXhwb3J0IHsgZ2V0U3VidHJlZVNuYXBzaG90LCBsaXN0U3ViZmxvd1BhdGhzIH0gZnJvbSAnLi9saWIvcnVubmVyL2luZGV4LmpzJztcblxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuLy8gU2NvcGVSZWNvcmRlciBDb21wb3NpdGlvbiDigJQgQnVuZGxlIG11bHRpcGxlIHJlY29yZGVycyBpbnRvIGRvbWFpbiBwcmVzZXRzXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbi8qKiBAY2F0ZWdvcnkgU2NvcGVSZWNvcmRlciAqL1xuZXhwb3J0IHsgQ29tcG9zaXRlUmVjb3JkZXIgfSBmcm9tICcuL2xpYi9yZWNvcmRlci9pbmRleC5qcyc7XG5cbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbi8vIFBhdXNlL1Jlc3VtZSDigJQgU2VyaWFsaXphYmxlIGNoZWNrcG9pbnRzIGZvciBsb25nLXJ1bm5pbmcgb3IgaHVtYW4taW4tdGhlLWxvb3AgZmxvd3Ncbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuLyoqIEBjYXRlZ29yeSBQYXVzZS9SZXN1bWUgKi9cbi8qKiBAY2F0ZWdvcnkgUGF1c2UvUmVzdW1lICovXG5leHBvcnQgdHlwZSB7IEZsb3djaGFydENoZWNrcG9pbnQsIFBhdXNhYmxlSGFuZGxlciwgUGF1c2VkRXhlY3V0aW9uLCBQZW5kaW5nUGF1c2UgfSBmcm9tICcuL2xpYi9wYXVzZS9pbmRleC5qcyc7XG5cbi8qKlxuICogQGNhdGVnb3J5IFBhdXNlL1Jlc3VtZVxuICpcbiAqIGBpbnRlcnJ1cHQoc2NvcGUsIHsgcmVhc29uLCBleHBlY3RzPyB9KWAg4oCUIHN0b3AgbWlkLXN0YWdlIHRvIGFzayBhIHF1ZXN0aW9uLFxuICogYW5kIGdldCB0aGUgYW5zd2VyIGJhY2sgYXQgdGhlIHNhbWUgY2FsbCBzaXRlIHdoZW4gdGhlIHJ1biByZXN1bWVzLiBSZXN1bWVcbiAqIHJlLWVudGVycyB0aGUgc3RhZ2UgZnJvbSBpdHMgVE9QIChzdGFnZXMgYXJlIGF0b21pYyksIHNvIGtlZXAgdGhlIGhhbGZcbiAqIGJlZm9yZSB0aGUgY2FsbCBpZGVtcG90ZW50LlxuICovXG5leHBvcnQgdHlwZSB7IEludGVycnVwdFBheWxvYWQgfSBmcm9tICcuL2xpYi9wYXVzZS9pbmRleC5qcyc7XG5cbi8qKiBAY2F0ZWdvcnkgUGF1c2UvUmVzdW1lICovXG5leHBvcnQgeyBpbnRlcnJ1cHQgfSBmcm9tICcuL2xpYi9wYXVzZS9pbmRleC5qcyc7XG5cbi8qKiBAY2F0ZWdvcnkgU2NvcGVSZWNvcmRlciAqL1xuZXhwb3J0IHR5cGUgeyBDb21wb3NpdGVTbmFwc2hvdCB9IGZyb20gJy4vbGliL3JlY29yZGVyL2luZGV4LmpzJztcblxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuLy8gQ29uZmlndXJhdGlvbiDigJQgVHlwZXMgcGFzc2VkIHRvIEZsb3dDaGFydEV4ZWN1dG9yIGFuZCBydW4oKVxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4vKiogQGNhdGVnb3J5IENvbmZpZ3VyYXRpb24gKi9cbmV4cG9ydCB0eXBlIHsgRXhlY3V0aW9uRW52LCBFeGVjdXRvclJlc3VsdCwgUGF1c2VkUmVzdWx0LCBSdW5PcHRpb25zIH0gZnJvbSAnLi9saWIvZW5naW5lL2luZGV4LmpzJztcblxuLyoqIEBjYXRlZ29yeSBDb25maWd1cmF0aW9uICovXG5leHBvcnQgdHlwZSB7IFNjb3BlRmFjdG9yeSB9IGZyb20gJy4vbGliL2VuZ2luZS9pbmRleC5qcyc7XG5cbi8qKlxuICogQGNhdGVnb3J5IENvbmZpZ3VyYXRpb25cbiAqXG4gKiBSZWFkLXRyYWNraW5nIHBvbGljeSBmb3IgYFN0YWdlU25hcHNob3Quc3RhZ2VSZWFkc2AgKCMxNCk6XG4gKiBgJ2Z1bGwnYCAoZGVmYXVsdCDigJQgcGVyLXJlYWQgdmFsdWUgY2xvbmUsIGhpc3RvcmljYWwgYmVoYXZpb3IpIC9cbiAqIGAnc3VtbWFyeSdgIChjaGVhcCBgUmVhZFN1bW1hcnlNYXJrZXJgIHBlciByZWFkKSAvIGAnb2ZmJ2AgKG5vIHRyYWNraW5nLFxuICogemVybyBwZXItcmVhZCBjbG9uZSkuIFBhc3MgYXMgYG5ldyBGbG93Q2hhcnRFeGVjdXRvcihjaGFydCwgeyByZWFkVHJhY2tpbmcgfSlgXG4gKiBvciBjYWxsIGBleGVjdXRvci5zZXRSZWFkVHJhY2tpbmcobW9kZSlgIGJlZm9yZSBgcnVuKClgLlxuICovXG5leHBvcnQgdHlwZSB7IFJlYWRTdW1tYXJ5TWFya2VyLCBSZWFkVHJhY2tpbmdNb2RlIH0gZnJvbSAnLi9saWIvbWVtb3J5L2luZGV4LmpzJztcblxuLyoqXG4gKiBAY2F0ZWdvcnkgQ29uZmlndXJhdGlvblxuICpcbiAqIFdyaXRlLXRyYWNraW5nIHBvbGljeSBmb3IgYFN0YWdlU25hcHNob3Quc3RhZ2VXcml0ZXNgICgjMTNjLUEpIOKAlCB0aGVcbiAqIHNpYmxpbmcgb2YgYFJlYWRUcmFja2luZ01vZGVgOyBib3RoIGFsaWFzIHRoZSBzaGFyZWQgYFJldGVudGlvblBvbGljeWBcbiAqIGZhbWlseSBmcm9tIGBsaWIvY2FwdHVyZWAuIGAnZnVsbCdgIChkZWZhdWx0IOKAlCBwZXItd3JpdGUgdmFsdWUgY2xvbmUsXG4gKiBoaXN0b3JpY2FsIGJlaGF2aW9yKSAvIGAnc3VtbWFyeSdgIChjaGVhcCBgV3JpdGVTdW1tYXJ5TWFya2VyYCBwZXIgd3JpdGUpXG4gKiAvIGAnb2ZmJ2AgKG5vIHRyYWNraW5nOyBgc3RhZ2VXcml0ZXNgIGFic2VudCBhbmQgdGhlIGBvbkNvbW1pdGAgbXV0YXRpb25zXG4gKiBwYXlsb2FkIGlzIGVtcHR5IOKAlCB3cml0ZXMgdGhlbXNlbHZlcyBzdGlsbCBjb21taXQsIGFuZCB0aGUgY29tbWl0IGxvZyBpc1xuICogdW5hZmZlY3RlZCkuIFBhc3MgYXMgYG5ldyBGbG93Q2hhcnRFeGVjdXRvcihjaGFydCwgeyB3cml0ZVRyYWNraW5nIH0pYCBvclxuICogY2FsbCBgZXhlY3V0b3Iuc2V0V3JpdGVUcmFja2luZyhtb2RlKWAgYmVmb3JlIGBydW4oKWAuXG4gKi9cbmV4cG9ydCB0eXBlIHsgUmV0ZW50aW9uUG9saWN5LCBXcml0ZVN1bW1hcnlNYXJrZXIsIFdyaXRlVHJhY2tpbmdNb2RlIH0gZnJvbSAnLi9saWIvbWVtb3J5L2luZGV4LmpzJztcblxuLyoqXG4gKiBAY2F0ZWdvcnkgQ29uZmlndXJhdGlvblxuICpcbiAqIENvbW1pdC12YWx1ZXMgZW5jb2RpbmcgZm9yIHRoZSBDT01NSVQgTE9HICgjMTNjLUIpIOKAlCB0aGUgdGhpcmQgZGlhbCBvZlxuICogdGhlIGZhbWlseSwgYW5kIHRoZSBvbmx5IExPU1NMRVNTIG9uZSAoaXQgY2hhbmdlcyB0aGUgbG9nJ3MgZW5jb2RpbmcsXG4gKiBuZXZlciBpdHMgaW5mb3JtYXRpb24pLiBgJ2Z1bGwnYCAoZGVmYXVsdCDigJQgZXZlcnkgc3Vydml2aW5nIGBzZXRgIHN0b3Jlc1xuICogdGhlIGZ1bGwgZmluYWwgdmFsdWUsIGJ5dGUtaWRlbnRpY2FsIHRvIGhpc3RvcnkpIC8gYCdkZWx0YSdgIChhcnJheVxuICogbmV0LWNoYW5nZXMgdGhhdCBhcmUgXCJiYXNlIHBsdXMgYSB0YWlsXCIgY29tbWl0IGFzIGFuIGBhcHBlbmRgIHZlcmJcbiAqIHN0b3Jpbmcgb25seSB0aGUgdGFpbDsgYGRlbGV0ZVZhbHVlKClgIGNvbW1pdHMgYXMgYSByZWFsIGBkZWxldGVgIHZlcmI7XG4gKiBvbmUgdHJhY2UgZW50cnkgcGVyIHN1cnZpdmluZyBwYXRoKS4gUmVwbGF5IHJlY29uc3RydWN0cyBldmVyeSBzdGVwJ3NcbiAqIGZ1bGwgc3RhdGUgZXhhY3RseS4gQ29uc3VtZXJzIHJlYWRpbmcgYGJ1bmRsZS5vdmVyd3JpdGVba2V5XWAgYXMgdGhlIGZ1bGxcbiAqIHZhbHVlIG11c3QgdXNlIGBjb21taXRWYWx1ZUF0YCBmcm9tIGBmb290cHJpbnRqcy90cmFjZWAuIFBhc3MgYXNcbiAqIGBuZXcgRmxvd0NoYXJ0RXhlY3V0b3IoY2hhcnQsIHsgY29tbWl0VmFsdWVzIH0pYCBvciBjYWxsXG4gKiBgZXhlY3V0b3Iuc2V0Q29tbWl0VmFsdWVzKG1vZGUpYCBiZWZvcmUgYHJ1bigpYDsgdGhlIGFjdGl2ZSBtb2RlIGlzIHRoZVxuICogc25hcHNob3QgZGlzY3JpbWluYW50IGBnZXRTbmFwc2hvdCgpLmNvbW1pdFZhbHVlc2AuXG4gKi9cbmV4cG9ydCB0eXBlIHsgQ29tbWl0VmFsdWVzTW9kZSB9IGZyb20gJy4vbGliL21lbW9yeS9pbmRleC5qcyc7XG5cbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbi8vIENvbnRyYWN0ICYgVmFsaWRhdGlvblxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4vKiogQGNhdGVnb3J5IENvbnRyYWN0ICYgVmFsaWRhdGlvbiAqL1xuZXhwb3J0IHR5cGUgeyBTY2hlbWFLaW5kLCBWYWxpZGF0aW9uSXNzdWUsIFZhbGlkYXRpb25SZXN1bHQgfSBmcm9tICcuL2xpYi9zY2hlbWEvaW5kZXguanMnO1xuXG4vKiogQGNhdGVnb3J5IENvbnRyYWN0ICYgVmFsaWRhdGlvbiAqL1xuZXhwb3J0IHsgZGV0ZWN0U2NoZW1hLCBpc1ZhbGlkYXRhYmxlLCBpc1pvZCB9IGZyb20gJy4vbGliL3NjaGVtYS9pbmRleC5qcyc7XG5cbi8qKiBAY2F0ZWdvcnkgQ29udHJhY3QgJiBWYWxpZGF0aW9uICovXG5leHBvcnQgeyBJbnB1dFZhbGlkYXRpb25FcnJvciwgdmFsaWRhdGVBZ2FpbnN0U2NoZW1hLCB2YWxpZGF0ZU9yVGhyb3cgfSBmcm9tICcuL2xpYi9zY2hlbWEvaW5kZXguanMnO1xuXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4vLyBFcnJvciBVdGlsaXRpZXNcbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuLyoqIEBjYXRlZ29yeSBFcnJvciBVdGlsaXRpZXMgKi9cbmV4cG9ydCB0eXBlIHsgU3RydWN0dXJlZEVycm9ySW5mbyB9IGZyb20gJy4vbGliL2VuZ2luZS9pbmRleC5qcyc7XG5cbi8qKiBAY2F0ZWdvcnkgRXJyb3IgVXRpbGl0aWVzICovXG5leHBvcnQgeyBleHRyYWN0RXJyb3JJbmZvLCBmb3JtYXRFcnJvckluZm8gfSBmcm9tICcuL2xpYi9lbmdpbmUvaW5kZXguanMnO1xuXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4vLyBEZXYgVG9vbHMg4oCUIE1vZGUgZmxhZ3MgYW5kIFpvZCBzY29wZSB1dGlsaXRpZXNcbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuLyoqXG4gKiBAY2F0ZWdvcnkgRGV2IFRvb2xzXG4gKlxuICogR2xvYmFsIGRldi1tb2RlIGZsYWcuIENhbGwgYGVuYWJsZURldk1vZGUoKWAgYXQgYXBwbGljYXRpb24gc3RhcnR1cCB0b1xuICogdHVybiBvbiBkZXZlbG9wZXItb25seSBkaWFnbm9zdGljcyBhY3Jvc3MgdGhlIGxpYnJhcnkg4oCUIGNpcmN1bGFyLXJlZmVyZW5jZVxuICogZGV0ZWN0aW9uIGluIHNjb3BlIHdyaXRlcywgd2FybmluZ3Mgd2hlbiBhIHJlY29yZGVyIGhhcyBubyBvYnNlcnZlclxuICogbWV0aG9kcywgc3VzcGljaW91cy1wcmVkaWNhdGUgd2FybmluZ3MgaW4gZGVjaWRlL3NlbGVjdCwgc3RydWN0dXJhbFxuICogY2hlY2tzIGluIGBnZXRTdWJ0cmVlU25hcHNob3RgLCBhbmQgYW55IGZ1dHVyZSBkZXYtb25seSBkaWFnbm9zdGljLlxuICpcbiAqIFByb2R1Y3Rpb24gbGVhdmVzIGl0IE9GRiBieSBkZWZhdWx0ICh6ZXJvIG92ZXJoZWFkKS4gU2VlIHRoZSBKU0RvYyBvblxuICogYGVuYWJsZURldk1vZGVgIGZvciB0aGUgZnVsbCBsaXN0IGFuZCB1c2FnZSBleGFtcGxlLlxuICovXG5leHBvcnQgeyBkaXNhYmxlRGV2TW9kZSwgZW5hYmxlRGV2TW9kZSwgaXNEZXZNb2RlIH0gZnJvbSAnLi9saWIvZGV2TW9kZS5qcyc7XG5cbi8vIGBkZWZpbmVTY29wZUZyb21ab2RgIGFuZCB0aGUgb3RoZXIgem9kLWJhc2VkIHNjb3BlIGhlbHBlcnMgbW92ZWQgdG8gdGhlIG9wdC1pblxuLy8gYGZvb3RwcmludGpzL3pvZGAgZW50cnkg4oCUIGtlZXBpbmcgem9kIG91dCBvZiB0aGUgY29yZSBsb2FkIHBhdGggKGl0IGlzIGFuXG4vLyBvcHRpb25hbCBwZWVyKS4gSW1wb3J0IHRoZW0gZnJvbSAnZm9vdHByaW50anMvem9kJy5cbi8vIEEgcnVuJ3MgcmVjb3JkIGFzIEpTT04gd2l0aG91dCB0aGUgZW5naW5lJ3MgcmVjdXJzaW9uIGxpbWl0ICg5LjI2LjApOiB0aGVcbi8vIHNhbWUgYnl0ZXMgSlNPTi5zdHJpbmdpZnkgZW1pdHMsIGZvciBhIGRlZXAgYG5leHRgIGNoYWluIGl0IGNhbm5vdCBlbmNvZGUuXG5leHBvcnQgeyBzdHJpbmdpZnlTbmFwc2hvdCB9IGZyb20gJy4vbGliL3J1bm5lci9zdHJpbmdpZnlTbmFwc2hvdC5qcyc7XG4iXX0=
89
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7O0dBY0c7QUFTSCw0QkFBNEI7QUFDNUIsT0FBTyxFQUFFLFNBQVMsRUFBRSxnQkFBZ0IsRUFBRSxpQkFBaUIsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBNkJ4Riw0QkFBNEI7QUFDNUIsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBb0IzQyxtQ0FBbUM7QUFDbkMsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQWtCdkQsb0JBQW9CO0FBQ3BCLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBRTFELG9CQUFvQjtBQUNwQixPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFxQm5ELCtCQUErQjtBQUMvQixPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFFdEQsK0JBQStCO0FBQy9CLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUVyRCxvQ0FBb0M7QUFDcEMsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFtQzVELHFFQUFxRTtBQUNyRSxPQUFPLEVBQ0wsc0JBQXNCLEVBQ3RCLHNCQUFzQixFQUN0QixrQkFBa0IsRUFDbEIsV0FBVyxHQUNaLE1BQU0seUJBQXlCLENBQUM7QUFtRGpDLCtCQUErQjtBQUMvQixPQUFPLEVBQUUscUJBQXFCLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUs5RCwrQkFBK0I7QUFDL0IsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFFN0QsK0JBQStCO0FBQy9CLE9BQU8sRUFBRSw2QkFBNkIsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBRXRFLCtCQUErQjtBQUMvQixPQUFPLEVBQUUsOEJBQThCLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUV2RSwrQkFBK0I7QUFDL0IsT0FBTyxFQUFFLGdDQUFnQyxFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFFekUsK0JBQStCO0FBQy9CLE9BQU8sRUFBRSx3QkFBd0IsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBRWpFLCtCQUErQjtBQUMvQixPQUFPLEVBQUUsNkJBQTZCLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUV0RSwrQkFBK0I7QUFDL0IsT0FBTyxFQUFFLDJCQUEyQixFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFFcEUsK0JBQStCO0FBQy9CLE9BQU8sRUFBRSw2QkFBNkIsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBbUJ0RSx1Q0FBdUM7QUFDdkMsT0FBTyxFQUFFLGtCQUFrQixFQUFFLGdCQUFnQixFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFFN0UsK0VBQStFO0FBQy9FLDRFQUE0RTtBQUM1RSwrRUFBK0U7QUFFL0UsOEJBQThCO0FBQzlCLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBMEI1RCw2QkFBNkI7QUFDN0IsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBaUVqRCxzQ0FBc0M7QUFDdEMsT0FBTyxFQUFFLFlBQVksRUFBRSxhQUFhLEVBQUUsS0FBSyxFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFFM0Usc0NBQXNDO0FBQ3RDLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxxQkFBcUIsRUFBRSxlQUFlLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQVNyRyxnQ0FBZ0M7QUFDaEMsT0FBTyxFQUFFLGdCQUFnQixFQUFFLGVBQWUsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBRTFFLCtFQUErRTtBQUMvRSxpREFBaUQ7QUFDakQsK0VBQStFO0FBRS9FOzs7Ozs7Ozs7OztHQVdHO0FBQ0gsT0FBTyxFQUFFLGNBQWMsRUFBRSxhQUFhLEVBQUUsU0FBUyxFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFFNUUsaUZBQWlGO0FBQ2pGLDRFQUE0RTtBQUM1RSxzREFBc0Q7QUFDdEQsNEVBQTRFO0FBQzVFLDZFQUE2RTtBQUM3RSxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxtQ0FBbUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogRm9vdFByaW50IOKAlCBQdWJsaWMgQVBJICh2MylcbiAqXG4gKiBUaGUgZmxvd2NoYXJ0IHBhdHRlcm4gZm9yIGJhY2tlbmQgY29kZS5cbiAqIEJ1aWxkIOKGkiBSdW4g4oaSIE9ic2VydmUuXG4gKlxuICogKipUaHJlZSBpbXBvcnQgcGF0aHM6KipcbiAqIGBgYHRzXG4gKiBpbXBvcnQgeyBmbG93Q2hhcnQsIGRlY2lkZSwgbmFycmF0aXZlIH0gZnJvbSAnZm9vdHByaW50anMnOyAgICAgICAgICAgLy8gbWFpbiDigJQgc3RhcnQgaGVyZVxuICogaW1wb3J0IHsgbWV0cmljcywgZGVidWcsIG1hbmlmZXN0IH0gICAgIGZyb20gJ2Zvb3RwcmludGpzL3JlY29yZGVycyc7IC8vIHJlY29yZGVyIGZhY3Rvcmllc1xuICogaW1wb3J0IHsgU2hhcmVkTWVtb3J5LCBTdGFnZUNvbnRleHQgfSAgIGZyb20gJ2Zvb3RwcmludGpzL2FkdmFuY2VkJzsgIC8vIGludGVybmFsc1xuICogYGBgXG4gKlxuICogQG1vZHVsZVxuICovXG5cbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbi8vIFF1aWNrIFN0YXJ0IOKAlCBFdmVyeXRoaW5nIHlvdSBuZWVkIGZvciA5MCUgb2YgdXNlIGNhc2VzXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbi8qKiBAY2F0ZWdvcnkgUXVpY2sgU3RhcnQgKi9cbmV4cG9ydCB0eXBlIHsgRmxvd0NoYXJ0LCBTdGFnZUZ1bmN0aW9uIGFzIFN0YWdlSGFuZGxlciwgU3RyZWFtSGFuZGxlcnMgfSBmcm9tICcuL2xpYi9idWlsZGVyL2luZGV4LmpzJztcblxuLyoqIEBjYXRlZ29yeSBRdWljayBTdGFydCAqL1xuZXhwb3J0IHsgZmxvd0NoYXJ0LCBGbG93Q2hhcnRCdWlsZGVyLCBmbG93Q2hhcnRTZWxlY3RvciB9IGZyb20gJy4vbGliL2J1aWxkZXIvaW5kZXguanMnO1xuXG4vKipcbiAqIEBjYXRlZ29yeSBRdWljayBTdGFydFxuICpcbiAqIENvbmZpZyBmb3IgYC5hZGRQYXJhbGxlbEZvckVhY2goKWAg4oCUIG9uZSBicmFuY2ggcGVyIGl0ZW0sIGJyYW5jaCBjb3VudFxuICogZGVjaWRlZCBhdCBydW4gdGltZSBmcm9tIHRoZSBwYXlsb2FkLiBgbWF4QnJhbmNoZXNgIGFuZCBgaW50b2AgYXJlIHJlcXVpcmVkXG4gKiBvbiBwdXJwb3NlIChzZWUgZG9jcy9kZXNpZ24vZXhlY3V0aW9uLWNvbnRyb2wubWQpLlxuICovXG5leHBvcnQgdHlwZSB7IEJyYW5jaENoYXJ0LCBQYXJhbGxlbEZvckVhY2hDb25maWcsIFJldHJ5UG9saWN5IH0gZnJvbSAnLi9saWIvYnVpbGRlci9pbmRleC5qcyc7XG5cbi8qKiBAY2F0ZWdvcnkgUXVpY2sgU3RhcnQg4oCUIGJ1aWxkLXRpbWUgb2JzZXJ2ZXIgKHR3aW4gb2YgRmxvd1JlY29yZGVyKSAqL1xuZXhwb3J0IHR5cGUge1xuICBTdHJ1Y3R1cmVEZWNpZGVyQ29tcGxldGVFdmVudCxcbiAgU3RydWN0dXJlRWRnZUFkZGVkRXZlbnQsXG4gIFN0cnVjdHVyZUVkZ2VLaW5kLFxuICBTdHJ1Y3R1cmVMb29wRWRnZUFkZGVkRXZlbnQsXG4gIFN0cnVjdHVyZVJlY29yZGVyLFxuICBTdHJ1Y3R1cmVTdGFnZUFkZGVkRXZlbnQsXG4gIFN0cnVjdHVyZVN0YWdlVGFnZ2VkRXZlbnQsXG4gIFN0cnVjdHVyZVN1YmZsb3dNb3VudGVkRXZlbnQsXG59IGZyb20gJy4vbGliL2J1aWxkZXIvaW5kZXguanMnO1xuXG4vKiogQGNhdGVnb3J5IFF1aWNrIFN0YXJ0ICovXG5leHBvcnQgdHlwZSB7IFR5cGVkU3RhZ2VGdW5jdGlvbiB9IGZyb20gJy4vbGliL2J1aWxkZXIvdHlwZWRGbG93Q2hhcnQuanMnO1xuXG4vKiogQGNhdGVnb3J5IFF1aWNrIFN0YXJ0ICovXG5leHBvcnQgdHlwZSB7IFNjb3BlTWV0aG9kcywgVHlwZWRTY29wZSB9IGZyb20gJy4vbGliL3JlYWN0aXZlL2luZGV4LmpzJztcblxuLyoqIEBjYXRlZ29yeSBRdWljayBTdGFydCAqL1xuZXhwb3J0IHsgbmFycmF0aXZlIH0gZnJvbSAnLi9yZWNvcmRlcnMuanMnO1xuXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4vLyBEZWNpc2lvbiBCcmFuY2hpbmcg4oCUIGRlY2lkZSgpIC8gc2VsZWN0KCkgd2l0aCBldmlkZW5jZSBjYXB0dXJlXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbi8qKiBAY2F0ZWdvcnkgRGVjaXNpb24gQnJhbmNoaW5nICovXG5leHBvcnQgdHlwZSB7XG4gIERlY2lkZVJ1bGUsXG4gIERlY2lzaW9uRXZpZGVuY2UsXG4gIERlY2lzaW9uUmVzdWx0LFxuICBEZWZhdWx0QnJhbmNoLFxuICBGaWx0ZXJPcHMsXG4gIFJ1bGVFdmlkZW5jZSxcbiAgU2VsZWN0aW9uRXZpZGVuY2UsXG4gIFNlbGVjdGlvblJlc3VsdCxcbiAgV2hlbkNsYXVzZSxcbiAgV2hlcmVGaWx0ZXIsXG59IGZyb20gJy4vbGliL2RlY2lkZS9pbmRleC5qcyc7XG5cbi8qKiBAY2F0ZWdvcnkgRGVjaXNpb24gQnJhbmNoaW5nICovXG5leHBvcnQgeyBkZWNpZGUsIHNlbGVjdCB9IGZyb20gJy4vbGliL2RlY2lkZS9pbmRleC5qcyc7XG5cbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbi8vIFJ1biDigJQgRXhlY3V0ZSBjaGFydHMgYW5kIGNvbGxlY3QgcmVzdWx0c1xuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4vKiogQGNhdGVnb3J5IFJ1biAqL1xuZXhwb3J0IHR5cGUgeyBSdW5SZXN1bHQgfSBmcm9tICcuL2xpYi9ydW5uZXIvaW5kZXguanMnO1xuXG4vKiogQGNhdGVnb3J5IFJ1biAqL1xuZXhwb3J0IHR5cGUgeyBGbG93Q2hhcnRFeGVjdXRvck9wdGlvbnMgfSBmcm9tICcuL2xpYi9ydW5uZXIvaW5kZXguanMnO1xuXG4vKipcbiAqIFRoZSBmb3VyIG9ic2VydmFiaWxpdHkgZGlhbHMgYEZsb3dDaGFydEV4ZWN1dG9yT3B0aW9uc2AgaW5oZXJpdHMuXG4gKiBAY2F0ZWdvcnkgUnVuXG4gKi9cbmV4cG9ydCB0eXBlIHsgUnVuRGlhbHMgfSBmcm9tICcuL2xpYi9tZW1vcnkvaW5kZXguanMnO1xuXG4vKiogQGNhdGVnb3J5IFJ1biAqL1xuZXhwb3J0IHsgRmxvd0NoYXJ0RXhlY3V0b3IgfSBmcm9tICcuL2xpYi9ydW5uZXIvaW5kZXguanMnO1xuXG4vKiogQGNhdGVnb3J5IFJ1biAqL1xuZXhwb3J0IHsgUnVuQ29udGV4dCB9IGZyb20gJy4vbGliL3J1bm5lci9pbmRleC5qcyc7XG5cbi8qKiBAY2F0ZWdvcnkgUnVuICovXG5leHBvcnQgdHlwZSB7IENoYXJ0T3BlbkFQSU9wdGlvbnMsIE1DUFRvb2xEZXNjcmlwdGlvbiwgUnVubmFibGVGbG93Q2hhcnQgfSBmcm9tICcuL2xpYi9ydW5uZXIvUnVubmFibGVDaGFydC5qcyc7XG5cbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbi8vIE9ic2VydmUg4oCUIERhdGEgKHNjb3BlIHJlY29yZGVycywgZmlyZSBkdXJpbmcgc3RhZ2UgZXhlY3V0aW9uKVxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4vKiogQGNhdGVnb3J5IE9ic2VydmUg4oCUIERhdGEgKi9cbmV4cG9ydCB0eXBlIHtcbiAgQ29tbWl0RXZlbnQsXG4gIEVycm9yRXZlbnQsXG4gIFJlYWRFdmVudCxcbiAgUmVkYWN0aW9uUG9saWN5LFxuICBSZWRhY3Rpb25SZXBvcnQsXG4gIFNjb3BlUmVjb3JkZXIsXG4gIFN0YWdlRXZlbnQsXG4gIFdyaXRlRXZlbnQsXG59IGZyb20gJy4vbGliL3Njb3BlL2luZGV4LmpzJztcblxuLyoqIEBjYXRlZ29yeSBPYnNlcnZlIOKAlCBEYXRhICovXG5leHBvcnQgeyBNZXRyaWNSZWNvcmRlciB9IGZyb20gJy4vbGliL3Njb3BlL2luZGV4LmpzJztcblxuLyoqIEBjYXRlZ29yeSBPYnNlcnZlIOKAlCBEYXRhICovXG5leHBvcnQgeyBEZWJ1Z1JlY29yZGVyIH0gZnJvbSAnLi9saWIvc2NvcGUvaW5kZXguanMnO1xuXG4vKiogQGNhdGVnb3J5IE9ic2VydmUg4oCUIE9wZXJhdGlvbiAqL1xuZXhwb3J0IHsgUmVjb3JkZXJPcGVyYXRpb24gfSBmcm9tICcuL2xpYi9yZWNvcmRlci9pbmRleC5qcyc7XG5cbi8qKlxuICogQGNhdGVnb3J5IE9ic2VydmUg4oCUIERlbGl2ZXJ5IHRpZXIgKFJGQy0wMDEgZGVmZXJyZWQgb2JzZXJ2ZXJzKVxuICpcbiAqIEV2ZXJ5IGBhdHRhY2gqUmVjb3JkZXJgIGNhbGwgYWNjZXB0cyBhbiBvcHRpb25zIGJhZzpcbiAqIGBleGVjdXRvci5hdHRhY2hTY29wZVJlY29yZGVyKHJlYywgeyBkZWxpdmVyeTogJ2RlZmVycmVkJyB9KWAgdGFrZXMgdGhlXG4gKiByZWNvcmRlciBPVVQgb2YgdGhlIGVuZ2luZSdzIGhvdCBwYXRoIOKAlCBldmVudHMgYXJlIGNhcHR1cmVkIGludG8gb25lXG4gKiBib3VuZGVkLCB0b3RhbGx5LW9yZGVyZWQgcXVldWUgYW5kIGRlbGl2ZXJlZCBhdCB0aGUgbmV4dCBtaWNyb3Rhc2tcbiAqIGNoZWNrcG9pbnQgKFwib25lIGJlYXQgYmVoaW5kXCIpLiBPbWl0IGBkZWxpdmVyeWAgZm9yIHRoZSBoaXN0b3JpY2FsXG4gKiBzeW5jaHJvbm91cyBjYWxsIChieXRlLWlkZW50aWNhbCB0byBwcmV2aW91cyByZWxlYXNlcykuIEFjY291bnRpbmdcbiAqIHN1cmZhY2VzIG9uIGBzbmFwc2hvdC5vYnNlcnZlclN0YXRzYDsgYGV4ZWN1dG9yLmRyYWluT2JzZXJ2ZXJzKClgIHNldHRsZXNcbiAqIGFzeW5jIGxpc3RlbmVycyBiZWZvcmUgc2h1dGRvd24uIFNlZSBgZG9jcy9ndWlkZXMvb2JzZXJ2ZXJzLWRlZmVycmVkLm1kYC5cbiAqL1xuZXhwb3J0IHR5cGUge1xuICBBdHRhY2hSZWNvcmRlck9wdGlvbnMsXG4gIE9ic2VydmVyRGVsaXZlcnksXG4gIE9ic2VydmVyRHJhaW5SZXN1bHQsXG4gIE9ic2VydmVyU3RhdHMsXG59IGZyb20gJy4vbGliL3J1bm5lci9pbmRleC5qcyc7XG5cbi8qKlxuICogQGNhdGVnb3J5IE9ic2VydmUg4oCUIERlbGl2ZXJ5IHRpZXIgKFJGQy0wMDEgZGVmZXJyZWQgb2JzZXJ2ZXJzKVxuICpcbiAqIGBDYXB0dXJlUG9saWN5YCDigJQgaG93IGEgZGVmZXJyZWQgZXZlbnQncyBwYXlsb2FkIGlzIG1hdGVyaWFsaXplZCBhdFxuICogY2FwdHVyZSB0aW1lIChgJ2Nsb25lJ2AgYnkgZGVmYXVsdCBmb3IgYXR0YWNoIG9wdGlvbnMgLyBgJ3N1bW1hcnknYCAvIGAncmVmJ2ApLiBgT3ZlcmZsb3dQb2xpY3lgXG4gKiDigJQgd2hhdCBhIHNhdHVyYXRlZCBxdWV1ZSBkb2VzIChgJ2Ryb3Atb2xkZXN0J2AgZGVmYXVsdCAvIGAnc2FtcGxlJ2AgL1xuICogYCdibG9jaydgKS4gYERpc3BhdGNoZXJTdGF0c2AgLyBgTGlzdGVuZXJTdGF0c2Ag4oCUIHRoZSBhY2NvdW50aW5nIHNoYXBlc1xuICogZW1iZWRkZWQgaW4gYE9ic2VydmVyU3RhdHNgLiBUeXBlcyBvbmx5IOKAlCB0aGUgb2JzZXJ2ZXItcXVldWUgbW9kdWxlXG4gKiBpdHNlbGYgaXMgaW50ZXJuYWw7IGNvbnN1bWVycyB1c2UgdGhlIGF0dGFjaCBvcHRpb25zLlxuICovXG5leHBvcnQgdHlwZSB7IENhcHR1cmVQb2xpY3ksIERpc3BhdGNoZXJTdGF0cywgTGlzdGVuZXJTdGF0cywgT3ZlcmZsb3dQb2xpY3kgfSBmcm9tICcuL2xpYi9vYnNlcnZlci1xdWV1ZS9pbmRleC5qcyc7XG5cbi8qKiBAY2F0ZWdvcnkgT2JzZXJ2ZSDigJQgQ29tYmluZWQgKGJvdGggZGF0YS1mbG93IGFuZCBjb250cm9sLWZsb3cpICovXG5leHBvcnQgdHlwZSB7IENvbWJpbmVkUmVjb3JkZXIgfSBmcm9tICcuL2xpYi9yZWNvcmRlci9pbmRleC5qcyc7XG4vKiogQGNhdGVnb3J5IE9ic2VydmUg4oCUIENvbWJpbmVkIChib3RoIGRhdGEtZmxvdyBhbmQgY29udHJvbC1mbG93KSAqL1xuZXhwb3J0IHtcbiAgaGFzRW1pdFJlY29yZGVyTWV0aG9kcyxcbiAgaGFzRmxvd1JlY29yZGVyTWV0aG9kcyxcbiAgaGFzUmVjb3JkZXJNZXRob2RzLFxuICBpc0Zsb3dFdmVudCxcbn0gZnJvbSAnLi9saWIvcmVjb3JkZXIvaW5kZXguanMnO1xuXG4vKipcbiAqIEBjYXRlZ29yeSBPYnNlcnZlIOKAlCBFbWl0ICh1c2VyLWF1dGhvcmVkIHN0cnVjdHVyZWQgZXZlbnRzKVxuICpcbiAqIFRoaXJkIG9ic2VydmVyIGNoYW5uZWwgKGFsb25nc2lkZSBgU2NvcGVSZWNvcmRlcmAgYW5kIGBGbG93UmVjb3JkZXJgKS4gQ29uc3VtZXJcbiAqIGNvZGUgY2FsbHMgYHNjb3BlLiRlbWl0KG5hbWUsIHBheWxvYWQpYCBmcm9tIGluc2lkZSBhIHN0YWdlOyBldmVyeSBhdHRhY2hlZFxuICogYEVtaXRSZWNvcmRlci5vbkVtaXQoZXZlbnQpYCBmaXJlcyBzeW5jaHJvbm91c2x5IHdpdGggc3RhZ2UtY29udGV4dFxuICogZW5yaWNobWVudC4gUGFzcy10aHJvdWdoIOKAlCBubyBidWZmZXJpbmcsIHplcm8gYWxsb2NhdGlvbiB3aGVuIG5vIHJlY29yZGVyXG4gKiBpcyBhdHRhY2hlZC5cbiAqL1xuZXhwb3J0IHR5cGUgeyBFbWl0RXZlbnQsIEVtaXRSZWNvcmRlciB9IGZyb20gJy4vbGliL3JlY29yZGVyL2luZGV4LmpzJztcblxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuLy8gT2JzZXJ2ZSDigJQgRmxvdyAoRmxvd1JlY29yZGVyLCBmaXJlcyBhZnRlciBzdGFnZSBleGVjdXRpb24pXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbi8qKiBAY2F0ZWdvcnkgT2JzZXJ2ZSDigJQgRmxvdyAqL1xuZXhwb3J0IHR5cGUge1xuICBGbG93QnJlYWtFdmVudCxcbiAgRmxvd0RlY2lzaW9uRXZlbnQsXG4gIEZsb3dFcnJvckV2ZW50LFxuICBGbG93Rm9ya0V2ZW50LFxuICBGbG93TG9vcEV2ZW50LFxuICBGbG93TmV4dEV2ZW50LFxuICBGbG93UmVjb3JkZXIsXG4gIEZsb3dSdW5FdmVudCxcbiAgRmxvd1J1bkZhaWxlZEV2ZW50LFxuICBGbG93U2VsZWN0ZWRFdmVudCxcbiAgRmxvd1N0YWdlRXZlbnQsXG4gIEZsb3dTdGFnZVJldHJ5RXZlbnQsXG4gIEZsb3dTdWJmbG93RXZlbnQsXG4gIEZsb3dTdWJmbG93UmVnaXN0ZXJlZEV2ZW50LFxuICBGbG93VGhyb3R0bGVkRXZlbnQsXG4gIFJlc3VtZUxpbmssXG4gIFRyYXZlcnNhbENvbnRleHQsXG59IGZyb20gJy4vbGliL2VuZ2luZS9pbmRleC5qcyc7XG5cbi8qKiBAY2F0ZWdvcnkgT2JzZXJ2ZSDigJQgRmxvdyAqL1xuZXhwb3J0IHR5cGUgeyBDb21iaW5lZE5hcnJhdGl2ZUVudHJ5IH0gZnJvbSAnLi9saWIvZW5naW5lL2luZGV4LmpzJztcblxuLyoqXG4gKiBAY2F0ZWdvcnkgT2JzZXJ2ZSDigJQgRmxvd1xuICpcbiAqIGBOYXJyYXRpdmVGb3JtYXR0ZXJgIOKAlCBwbHVnZ2FibGUgZm9ybWF0dGVyIHRoYXQgY29udmVydHMgZXZlbnQgY29udGV4dFxuICogb2JqZWN0cyBpbnRvIHRoZSB0ZXh0IGxpbmVzIG9mIHRoZSBuYXJyYXRpdmUuIFByZWZlciB0aGlzIG5hbWUgaW4gbmV3XG4gKiBjb2RlOyBgTmFycmF0aXZlUmVuZGVyZXJgIGlzIGEgZGVwcmVjYXRlZCBhbGlhcyB0aGF0IHdpbGwgYmUgcmVtb3ZlZCBpblxuICogdGhlIG5leHQgbWFqb3IgcmVsZWFzZS5cbiAqL1xuZXhwb3J0IHR5cGUgeyBOYXJyYXRpdmVGb3JtYXR0ZXIsIE5hcnJhdGl2ZVJlbmRlcmVyIH0gZnJvbSAnLi9saWIvZW5naW5lL2luZGV4LmpzJztcblxuLyoqIEBjYXRlZ29yeSBPYnNlcnZlIOKAlCBGbG93ICovXG5leHBvcnQgeyBOYXJyYXRpdmVGbG93UmVjb3JkZXIgfSBmcm9tICcuL2xpYi9lbmdpbmUvaW5kZXguanMnO1xuXG4vKiogQGNhdGVnb3J5IE9ic2VydmUg4oCUIEZsb3cgKi9cbmV4cG9ydCB0eXBlIHsgTWFuaWZlc3RFbnRyeSB9IGZyb20gJy4vbGliL2VuZ2luZS9pbmRleC5qcyc7XG5cbi8qKiBAY2F0ZWdvcnkgT2JzZXJ2ZSDigJQgRmxvdyAqL1xuZXhwb3J0IHsgTWFuaWZlc3RGbG93UmVjb3JkZXIgfSBmcm9tICcuL2xpYi9lbmdpbmUvaW5kZXguanMnO1xuXG4vKiogQGNhdGVnb3J5IE9ic2VydmUg4oCUIEZsb3cgKi9cbmV4cG9ydCB7IEFkYXB0aXZlTmFycmF0aXZlRmxvd1JlY29yZGVyIH0gZnJvbSAnLi9saWIvZW5naW5lL2luZGV4LmpzJztcblxuLyoqIEBjYXRlZ29yeSBPYnNlcnZlIOKAlCBGbG93ICovXG5leHBvcnQgeyBNaWxlc3RvbmVOYXJyYXRpdmVGbG93UmVjb3JkZXIgfSBmcm9tICcuL2xpYi9lbmdpbmUvaW5kZXguanMnO1xuXG4vKiogQGNhdGVnb3J5IE9ic2VydmUg4oCUIEZsb3cgKi9cbmV4cG9ydCB7IFByb2dyZXNzaXZlTmFycmF0aXZlRmxvd1JlY29yZGVyIH0gZnJvbSAnLi9saWIvZW5naW5lL2luZGV4LmpzJztcblxuLyoqIEBjYXRlZ29yeSBPYnNlcnZlIOKAlCBGbG93ICovXG5leHBvcnQgeyBSTEVOYXJyYXRpdmVGbG93UmVjb3JkZXIgfSBmcm9tICcuL2xpYi9lbmdpbmUvaW5kZXguanMnO1xuXG4vKiogQGNhdGVnb3J5IE9ic2VydmUg4oCUIEZsb3cgKi9cbmV4cG9ydCB7IFNlcGFyYXRlTmFycmF0aXZlRmxvd1JlY29yZGVyIH0gZnJvbSAnLi9saWIvZW5naW5lL2luZGV4LmpzJztcblxuLyoqIEBjYXRlZ29yeSBPYnNlcnZlIOKAlCBGbG93ICovXG5leHBvcnQgeyBTaWxlbnROYXJyYXRpdmVGbG93UmVjb3JkZXIgfSBmcm9tICcuL2xpYi9lbmdpbmUvaW5kZXguanMnO1xuXG4vKiogQGNhdGVnb3J5IE9ic2VydmUg4oCUIEZsb3cgKi9cbmV4cG9ydCB7IFdpbmRvd2VkTmFycmF0aXZlRmxvd1JlY29yZGVyIH0gZnJvbSAnLi9saWIvZW5naW5lL2luZGV4LmpzJztcblxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuLy8gU2VsZi1EZXNjcmliaW5nIOKAlCAuY29udHJhY3QoKSwgdG9PcGVuQVBJKCksIHRvTUNQVG9vbCgpXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbi8qKiBAY2F0ZWdvcnkgU2VsZi1EZXNjcmliaW5nICovXG5leHBvcnQgdHlwZSB7IEpzb25TY2hlbWEgfSBmcm9tICcuL2xpYi9jb250cmFjdC9pbmRleC5qcyc7XG5cbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbi8vIFNuYXBzaG90ICYgQ29tcG9zaXRpb24g4oCUIFN1YmZsb3cgbmF2aWdhdGlvbiBhbmQgQ29tcG9zYWJsZVJ1bm5lclxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4vKiogQGNhdGVnb3J5IFNuYXBzaG90ICYgQ29tcG9zaXRpb24gKi9cbmV4cG9ydCB0eXBlIHsgQ29tcG9zYWJsZVJ1bm5lciB9IGZyb20gJy4vbGliL3J1bm5lci9pbmRleC5qcyc7XG5cbi8qKiBAY2F0ZWdvcnkgU25hcHNob3QgJiBDb21wb3NpdGlvbiAqL1xuZXhwb3J0IHR5cGUgeyBSZWNvcmRlclNuYXBzaG90LCBSdW50aW1lU25hcHNob3QsIFN1YnRyZWVTbmFwc2hvdCB9IGZyb20gJy4vbGliL3J1bm5lci9pbmRleC5qcyc7XG5cbi8qKiBAY2F0ZWdvcnkgU25hcHNob3QgJiBDb21wb3NpdGlvbiAqL1xuZXhwb3J0IHsgZ2V0U3VidHJlZVNuYXBzaG90LCBsaXN0U3ViZmxvd1BhdGhzIH0gZnJvbSAnLi9saWIvcnVubmVyL2luZGV4LmpzJztcblxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuLy8gU2NvcGVSZWNvcmRlciBDb21wb3NpdGlvbiDigJQgQnVuZGxlIG11bHRpcGxlIHJlY29yZGVycyBpbnRvIGRvbWFpbiBwcmVzZXRzXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbi8qKiBAY2F0ZWdvcnkgU2NvcGVSZWNvcmRlciAqL1xuZXhwb3J0IHsgQ29tcG9zaXRlUmVjb3JkZXIgfSBmcm9tICcuL2xpYi9yZWNvcmRlci9pbmRleC5qcyc7XG5cbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbi8vIFBhdXNlL1Jlc3VtZSDigJQgU2VyaWFsaXphYmxlIGNoZWNrcG9pbnRzIGZvciBsb25nLXJ1bm5pbmcgb3IgaHVtYW4taW4tdGhlLWxvb3AgZmxvd3Ncbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuLyoqIEBjYXRlZ29yeSBQYXVzZS9SZXN1bWUgKi9cbi8qKiBAY2F0ZWdvcnkgUGF1c2UvUmVzdW1lICovXG5leHBvcnQgdHlwZSB7XG4gIEZsb3djaGFydENoZWNrcG9pbnQsXG4gIFBhdXNhYmxlSGFuZGxlcixcbiAgUGF1c2VkRXhlY3V0aW9uLFxuICBQZW5kaW5nUGF1c2UsXG4gIFJlZGFjdGlvbk1hcmtzLFxufSBmcm9tICcuL2xpYi9wYXVzZS9pbmRleC5qcyc7XG5cbi8qKlxuICogQGNhdGVnb3J5IFBhdXNlL1Jlc3VtZVxuICpcbiAqIGBpbnRlcnJ1cHQoc2NvcGUsIHsgcmVhc29uLCBleHBlY3RzPyB9KWAg4oCUIHN0b3AgbWlkLXN0YWdlIHRvIGFzayBhIHF1ZXN0aW9uLFxuICogYW5kIGdldCB0aGUgYW5zd2VyIGJhY2sgYXQgdGhlIHNhbWUgY2FsbCBzaXRlIHdoZW4gdGhlIHJ1biByZXN1bWVzLiBSZXN1bWVcbiAqIHJlLWVudGVycyB0aGUgc3RhZ2UgZnJvbSBpdHMgVE9QIChzdGFnZXMgYXJlIGF0b21pYyksIHNvIGtlZXAgdGhlIGhhbGZcbiAqIGJlZm9yZSB0aGUgY2FsbCBpZGVtcG90ZW50LlxuICovXG5leHBvcnQgdHlwZSB7IEludGVycnVwdFBheWxvYWQgfSBmcm9tICcuL2xpYi9wYXVzZS9pbmRleC5qcyc7XG5cbi8qKiBAY2F0ZWdvcnkgUGF1c2UvUmVzdW1lICovXG5leHBvcnQgeyBpbnRlcnJ1cHQgfSBmcm9tICcuL2xpYi9wYXVzZS9pbmRleC5qcyc7XG5cbi8qKiBAY2F0ZWdvcnkgU2NvcGVSZWNvcmRlciAqL1xuZXhwb3J0IHR5cGUgeyBDb21wb3NpdGVTbmFwc2hvdCB9IGZyb20gJy4vbGliL3JlY29yZGVyL2luZGV4LmpzJztcblxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuLy8gQ29uZmlndXJhdGlvbiDigJQgVHlwZXMgcGFzc2VkIHRvIEZsb3dDaGFydEV4ZWN1dG9yIGFuZCBydW4oKVxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4vKiogQGNhdGVnb3J5IENvbmZpZ3VyYXRpb24gKi9cbmV4cG9ydCB0eXBlIHsgRXhlY3V0aW9uRW52LCBFeGVjdXRvclJlc3VsdCwgUGF1c2VkUmVzdWx0LCBSdW5PcHRpb25zIH0gZnJvbSAnLi9saWIvZW5naW5lL2luZGV4LmpzJztcblxuLyoqIEBjYXRlZ29yeSBDb25maWd1cmF0aW9uICovXG5leHBvcnQgdHlwZSB7IFNjb3BlRmFjdG9yeSB9IGZyb20gJy4vbGliL2VuZ2luZS9pbmRleC5qcyc7XG5cbi8qKlxuICogQGNhdGVnb3J5IENvbmZpZ3VyYXRpb25cbiAqXG4gKiBSZWFkLXRyYWNraW5nIHBvbGljeSBmb3IgYFN0YWdlU25hcHNob3Quc3RhZ2VSZWFkc2AgKCMxNCk6XG4gKiBgJ2Z1bGwnYCAoZGVmYXVsdCDigJQgcGVyLXJlYWQgdmFsdWUgY2xvbmUsIGhpc3RvcmljYWwgYmVoYXZpb3IpIC9cbiAqIGAnc3VtbWFyeSdgIChjaGVhcCBgUmVhZFN1bW1hcnlNYXJrZXJgIHBlciByZWFkKSAvIGAnb2ZmJ2AgKG5vIHRyYWNraW5nLFxuICogemVybyBwZXItcmVhZCBjbG9uZSkuIFBhc3MgYXMgYG5ldyBGbG93Q2hhcnRFeGVjdXRvcihjaGFydCwgeyByZWFkVHJhY2tpbmcgfSlgXG4gKiBvciBjYWxsIGBleGVjdXRvci5zZXRSZWFkVHJhY2tpbmcobW9kZSlgIGJlZm9yZSBgcnVuKClgLlxuICovXG5leHBvcnQgdHlwZSB7IFJlYWRTdW1tYXJ5TWFya2VyLCBSZWFkVHJhY2tpbmdNb2RlIH0gZnJvbSAnLi9saWIvbWVtb3J5L2luZGV4LmpzJztcblxuLyoqXG4gKiBAY2F0ZWdvcnkgQ29uZmlndXJhdGlvblxuICpcbiAqIFdyaXRlLXRyYWNraW5nIHBvbGljeSBmb3IgYFN0YWdlU25hcHNob3Quc3RhZ2VXcml0ZXNgICgjMTNjLUEpIOKAlCB0aGVcbiAqIHNpYmxpbmcgb2YgYFJlYWRUcmFja2luZ01vZGVgOyBib3RoIGFsaWFzIHRoZSBzaGFyZWQgYFJldGVudGlvblBvbGljeWBcbiAqIGZhbWlseSBmcm9tIGBsaWIvY2FwdHVyZWAuIGAnZnVsbCdgIChkZWZhdWx0IOKAlCBwZXItd3JpdGUgdmFsdWUgY2xvbmUsXG4gKiBoaXN0b3JpY2FsIGJlaGF2aW9yKSAvIGAnc3VtbWFyeSdgIChjaGVhcCBgV3JpdGVTdW1tYXJ5TWFya2VyYCBwZXIgd3JpdGUpXG4gKiAvIGAnb2ZmJ2AgKG5vIHRyYWNraW5nOyBgc3RhZ2VXcml0ZXNgIGFic2VudCBhbmQgdGhlIGBvbkNvbW1pdGAgbXV0YXRpb25zXG4gKiBwYXlsb2FkIGlzIGVtcHR5IOKAlCB3cml0ZXMgdGhlbXNlbHZlcyBzdGlsbCBjb21taXQsIGFuZCB0aGUgY29tbWl0IGxvZyBpc1xuICogdW5hZmZlY3RlZCkuIFBhc3MgYXMgYG5ldyBGbG93Q2hhcnRFeGVjdXRvcihjaGFydCwgeyB3cml0ZVRyYWNraW5nIH0pYCBvclxuICogY2FsbCBgZXhlY3V0b3Iuc2V0V3JpdGVUcmFja2luZyhtb2RlKWAgYmVmb3JlIGBydW4oKWAuXG4gKi9cbmV4cG9ydCB0eXBlIHsgUmV0ZW50aW9uUG9saWN5LCBXcml0ZVN1bW1hcnlNYXJrZXIsIFdyaXRlVHJhY2tpbmdNb2RlIH0gZnJvbSAnLi9saWIvbWVtb3J5L2luZGV4LmpzJztcblxuLyoqXG4gKiBAY2F0ZWdvcnkgQ29uZmlndXJhdGlvblxuICpcbiAqIENvbW1pdC12YWx1ZXMgZW5jb2RpbmcgZm9yIHRoZSBDT01NSVQgTE9HICgjMTNjLUIpIOKAlCB0aGUgdGhpcmQgZGlhbCBvZlxuICogdGhlIGZhbWlseSwgYW5kIHRoZSBvbmx5IExPU1NMRVNTIG9uZSAoaXQgY2hhbmdlcyB0aGUgbG9nJ3MgZW5jb2RpbmcsXG4gKiBuZXZlciBpdHMgaW5mb3JtYXRpb24pLiBgJ2Z1bGwnYCAoZGVmYXVsdCDigJQgZXZlcnkgc3Vydml2aW5nIGBzZXRgIHN0b3Jlc1xuICogdGhlIGZ1bGwgZmluYWwgdmFsdWUsIGJ5dGUtaWRlbnRpY2FsIHRvIGhpc3RvcnkpIC8gYCdkZWx0YSdgIChhcnJheVxuICogbmV0LWNoYW5nZXMgdGhhdCBhcmUgXCJiYXNlIHBsdXMgYSB0YWlsXCIgY29tbWl0IGFzIGFuIGBhcHBlbmRgIHZlcmJcbiAqIHN0b3Jpbmcgb25seSB0aGUgdGFpbDsgYGRlbGV0ZVZhbHVlKClgIGNvbW1pdHMgYXMgYSByZWFsIGBkZWxldGVgIHZlcmI7XG4gKiBvbmUgdHJhY2UgZW50cnkgcGVyIHN1cnZpdmluZyBwYXRoKS4gUmVwbGF5IHJlY29uc3RydWN0cyBldmVyeSBzdGVwJ3NcbiAqIGZ1bGwgc3RhdGUgZXhhY3RseS4gQ29uc3VtZXJzIHJlYWRpbmcgYGJ1bmRsZS5vdmVyd3JpdGVba2V5XWAgYXMgdGhlIGZ1bGxcbiAqIHZhbHVlIG11c3QgdXNlIGBjb21taXRWYWx1ZUF0YCBmcm9tIGBmb290cHJpbnRqcy90cmFjZWAuIFBhc3MgYXNcbiAqIGBuZXcgRmxvd0NoYXJ0RXhlY3V0b3IoY2hhcnQsIHsgY29tbWl0VmFsdWVzIH0pYCBvciBjYWxsXG4gKiBgZXhlY3V0b3Iuc2V0Q29tbWl0VmFsdWVzKG1vZGUpYCBiZWZvcmUgYHJ1bigpYDsgdGhlIGFjdGl2ZSBtb2RlIGlzIHRoZVxuICogc25hcHNob3QgZGlzY3JpbWluYW50IGBnZXRTbmFwc2hvdCgpLmNvbW1pdFZhbHVlc2AuXG4gKi9cbmV4cG9ydCB0eXBlIHsgQ29tbWl0VmFsdWVzTW9kZSB9IGZyb20gJy4vbGliL21lbW9yeS9pbmRleC5qcyc7XG5cbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbi8vIENvbnRyYWN0ICYgVmFsaWRhdGlvblxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4vKiogQGNhdGVnb3J5IENvbnRyYWN0ICYgVmFsaWRhdGlvbiAqL1xuZXhwb3J0IHR5cGUgeyBTY2hlbWFLaW5kLCBWYWxpZGF0aW9uSXNzdWUsIFZhbGlkYXRpb25SZXN1bHQgfSBmcm9tICcuL2xpYi9zY2hlbWEvaW5kZXguanMnO1xuXG4vKiogQGNhdGVnb3J5IENvbnRyYWN0ICYgVmFsaWRhdGlvbiAqL1xuZXhwb3J0IHsgZGV0ZWN0U2NoZW1hLCBpc1ZhbGlkYXRhYmxlLCBpc1pvZCB9IGZyb20gJy4vbGliL3NjaGVtYS9pbmRleC5qcyc7XG5cbi8qKiBAY2F0ZWdvcnkgQ29udHJhY3QgJiBWYWxpZGF0aW9uICovXG5leHBvcnQgeyBJbnB1dFZhbGlkYXRpb25FcnJvciwgdmFsaWRhdGVBZ2FpbnN0U2NoZW1hLCB2YWxpZGF0ZU9yVGhyb3cgfSBmcm9tICcuL2xpYi9zY2hlbWEvaW5kZXguanMnO1xuXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4vLyBFcnJvciBVdGlsaXRpZXNcbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuLyoqIEBjYXRlZ29yeSBFcnJvciBVdGlsaXRpZXMgKi9cbmV4cG9ydCB0eXBlIHsgU3RydWN0dXJlZEVycm9ySW5mbyB9IGZyb20gJy4vbGliL2VuZ2luZS9pbmRleC5qcyc7XG5cbi8qKiBAY2F0ZWdvcnkgRXJyb3IgVXRpbGl0aWVzICovXG5leHBvcnQgeyBleHRyYWN0RXJyb3JJbmZvLCBmb3JtYXRFcnJvckluZm8gfSBmcm9tICcuL2xpYi9lbmdpbmUvaW5kZXguanMnO1xuXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4vLyBEZXYgVG9vbHMg4oCUIE1vZGUgZmxhZ3MgYW5kIFpvZCBzY29wZSB1dGlsaXRpZXNcbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuLyoqXG4gKiBAY2F0ZWdvcnkgRGV2IFRvb2xzXG4gKlxuICogR2xvYmFsIGRldi1tb2RlIGZsYWcuIENhbGwgYGVuYWJsZURldk1vZGUoKWAgYXQgYXBwbGljYXRpb24gc3RhcnR1cCB0b1xuICogdHVybiBvbiBkZXZlbG9wZXItb25seSBkaWFnbm9zdGljcyBhY3Jvc3MgdGhlIGxpYnJhcnkg4oCUIGNpcmN1bGFyLXJlZmVyZW5jZVxuICogZGV0ZWN0aW9uIGluIHNjb3BlIHdyaXRlcywgd2FybmluZ3Mgd2hlbiBhIHJlY29yZGVyIGhhcyBubyBvYnNlcnZlclxuICogbWV0aG9kcywgc3VzcGljaW91cy1wcmVkaWNhdGUgd2FybmluZ3MgaW4gZGVjaWRlL3NlbGVjdCwgc3RydWN0dXJhbFxuICogY2hlY2tzIGluIGBnZXRTdWJ0cmVlU25hcHNob3RgLCBhbmQgYW55IGZ1dHVyZSBkZXYtb25seSBkaWFnbm9zdGljLlxuICpcbiAqIFByb2R1Y3Rpb24gbGVhdmVzIGl0IE9GRiBieSBkZWZhdWx0ICh6ZXJvIG92ZXJoZWFkKS4gU2VlIHRoZSBKU0RvYyBvblxuICogYGVuYWJsZURldk1vZGVgIGZvciB0aGUgZnVsbCBsaXN0IGFuZCB1c2FnZSBleGFtcGxlLlxuICovXG5leHBvcnQgeyBkaXNhYmxlRGV2TW9kZSwgZW5hYmxlRGV2TW9kZSwgaXNEZXZNb2RlIH0gZnJvbSAnLi9saWIvZGV2TW9kZS5qcyc7XG5cbi8vIGBkZWZpbmVTY29wZUZyb21ab2RgIGFuZCB0aGUgb3RoZXIgem9kLWJhc2VkIHNjb3BlIGhlbHBlcnMgbW92ZWQgdG8gdGhlIG9wdC1pblxuLy8gYGZvb3RwcmludGpzL3pvZGAgZW50cnkg4oCUIGtlZXBpbmcgem9kIG91dCBvZiB0aGUgY29yZSBsb2FkIHBhdGggKGl0IGlzIGFuXG4vLyBvcHRpb25hbCBwZWVyKS4gSW1wb3J0IHRoZW0gZnJvbSAnZm9vdHByaW50anMvem9kJy5cbi8vIEEgcnVuJ3MgcmVjb3JkIGFzIEpTT04gd2l0aG91dCB0aGUgZW5naW5lJ3MgcmVjdXJzaW9uIGxpbWl0ICg5LjI2LjApOiB0aGVcbi8vIHNhbWUgYnl0ZXMgSlNPTi5zdHJpbmdpZnkgZW1pdHMsIGZvciBhIGRlZXAgYG5leHRgIGNoYWluIGl0IGNhbm5vdCBlbmNvZGUuXG5leHBvcnQgeyBzdHJpbmdpZnlTbmFwc2hvdCB9IGZyb20gJy4vbGliL3J1bm5lci9zdHJpbmdpZnlTbmFwc2hvdC5qcyc7XG4iXX0=
@@ -82,7 +82,16 @@ export class ParallelForEachHandler {
82
82
  stageName: node.name,
83
83
  });
84
84
  runtime.target.notifyStageStart?.();
85
+ const selectedBefore = context.selectedReads;
85
86
  const items = this.resolveItems(config, scope, node);
87
+ // The items selector is a mapper boundary: what it read becomes each branch's `item`, and the
88
+ // branches' results land under `into`. A selector that READ a selected value hands both the
89
+ // redaction, by name, for the rest of the run (the conservative half of `MapperTaint`).
90
+ if (context.selectedReads > selectedBefore) {
91
+ const rule = context.getRedactionRule();
92
+ rule?.mark('item');
93
+ rule?.mark(config.into);
94
+ }
86
95
  const total = items.length;
87
96
  const branchCount = Math.min(total, config.maxBranches);
88
97
  const truncated = total > branchCount;
@@ -215,4 +224,4 @@ export class ParallelForEachHandler {
215
224
  context.setGlobal(into, results);
216
225
  }
217
226
  }
218
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUGFyYWxsZWxGb3JFYWNoSGFuZGxlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy9saWIvZW5naW5lL2hhbmRsZXJzL1BhcmFsbGVsRm9yRWFjaEhhbmRsZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQW1ERztBQUVILE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBRWhFLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUMxRCxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSxnREFBZ0QsQ0FBQztBQUV0RixPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQXNCN0QsTUFBTSxPQUFPLHNCQUFzQjtJQUV2QjtJQUNBO0lBQ0E7SUFIVixZQUNVLElBQStCLEVBQy9CLGdCQUFnRCxFQUNoRCxLQUF5QztRQUZ6QyxTQUFJLEdBQUosSUFBSSxDQUEyQjtRQUMvQixxQkFBZ0IsR0FBaEIsZ0JBQWdCLENBQWdDO1FBQ2hELFVBQUssR0FBTCxLQUFLLENBQW9DO0lBQ2hELENBQUM7SUFFSjs7O09BR0c7SUFDSCxLQUFLLENBQUMsR0FBRyxDQUNQLElBQTZCLEVBQzdCLE9BQXFCLEVBQ3JCLFVBQThCLEVBQzlCLGdCQUFrQztRQUVsQyxNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsZUFBeUQsQ0FBQztRQUU5RSwwRUFBMEU7UUFDMUUsNEVBQTRFO1FBQzVFLHFFQUFxRTtRQUNyRSx3RUFBd0U7UUFDeEUsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsT0FBTyxFQUFFLElBQUksQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxlQUFlLEVBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FB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O2dCQUNyRSw4Q0FBOEM7Z0JBQzlDLE9BQU8sQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUM7Z0JBQ3hCLFNBQVM7WUFDWCxDQUFDO1lBQ0QsT0FBTyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxJQUFJLElBQUksQ0FBQyxLQUFLLENBQUMsaUJBQWlCLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQztRQUN4RSxDQUFDO1FBQ0QsT0FBTyxPQUFPLENBQUM7SUFDakIsQ0FBQztJQUVEOzs7OztPQUtHO0lBQ0ssWUFBWSxDQUFDLE1BQTBCLEVBQUUsT0FBcUIsRUFBRSxJQUFZLEVBQUUsT0FBa0I7UUFDdEcsSUFBSSxNQUFNLENBQUMsUUFBUSxFQUFFLENBQUM7WUFDcEIsTUFBTSxDQUFDLFFBQVEsQ0FBQyxJQUFJLEVBQUUsT0FBTyxDQUFDLENBQUM7WUFDL0IsT0FBTztRQUNULENBQUM7UUFDRCx1RUFBdUU7UUFDdkUsT0FBTyxDQUFDLFNBQVMsQ0FBQyxJQUFJLEVBQUUsT0FBTyxDQUFDLENBQUM7SUFDbkMsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBQYXJhbGxlbEZvckVhY2hIYW5kbGVyIOKAlCBkeW5hbWljIGZhbi1vdXQ6IG9uZSBicmFuY2ggcGVyIGl0ZW0sIGJyYW5jaCBDT1VOVFxuICogZGVjaWRlZCBhdCBydW50aW1lIGZyb20gdGhlIHBheWxvYWQuXG4gKlxuICogRGVzaWduOiBkb2NzL2Rlc2lnbi9leGVjdXRpb24tY29udHJvbC5tZCAoRDEgKyBEMikuIFJvdW5kIEIgYnVpbGRzIGV4YWN0bHlcbiAqIHRoYXQgZG9jdW1lbnQuXG4gKlxuICogIyMgV2hhdCB0aGlzIGhhbmRsZXIgZG9lcyBOT1QgaW52ZW50XG4gKlxuICogQWxtb3N0IGV2ZXJ5dGhpbmcgaGVyZSBpcyBleGlzdGluZyBtYWNoaW5lcnksIHdpcmVkIHRvZ2V0aGVyOlxuICpcbiAqIC0gKipFYWNoIGJyYW5jaCBpcyBhIGdlbmVyYXRlZCBTVUJGTE9XLioqIEl0cyBwYXRoIHNlZ21lbnQgaXNcbiAqICAgYDxwYXJlbnRTdGFnZUlkPn48aW5kZXg+YCAoc2VlIGBpZHMvYnJhbmNoU2VnbWVudC50c2ApIOKAlCBhIHN1YmZsb3dQYXRoXG4gKiAgIHNlZ21lbnQgaW4gdGhlIGdyYW1tYXIgdGhhdCBhbHJlYWR5IHNoaXBzLCBOT1QgYSBuZXcgZGVsaW1pdGVyIGNsYXNzLiBTbyBhXG4gKiAgIGJyYW5jaCBnZXRzLCBmb3IgZnJlZTogYSBmcmVzaCBpc29sYXRlZCBgRXhlY3V0aW9uUnVudGltZWAgKGJyYW5jaGVzIGNhbm5vdFxuICogICBjb3JydXB0IGVhY2ggb3RoZXIncyBpbi1mbGlnaHQgc3RhdGUpLCB0aGUgaW5wdXRNYXBwZXIgc2VhbSBmb3IgZmVlZGluZyB0aGVcbiAqICAgaXRlbSBpbiwgYW5kIOKAlCB0aGUgcG9pbnQgb2YgdGhlIHdob2xlIGRlc2lnbiDigJQgYHBhcnNlUnVudGltZVN0YWdlSWRgLFxuICogICBgY2F1c2FsQ2hhaW5gLCBgc2xpY2VGb3JLZXlgIGFuZCBgZm9yd2FyZFNsaWNlRm9yS2V5YCByZWFkaW5nIGJyYW5jaFxuICogICBjb21taXRzIHdpdGggWkVSTyBjaGFuZ2VzLCBiZWNhdXNlIHRoZSBpZCBzaGFwZSBJUyB0aGUgc2hpcHBlZCBzaGFwZS5cbiAqIC0gKipUaGUgZmFuLW91dCBpdHNlbGYgaXMgYENoaWxkcmVuRXhlY3V0b3JgLioqIFRoYXQgaXMgd2hhdCBtYWtlcyB0aGVcbiAqICAgZmFpbHVyZSBwb2xpY3kgXCJQYXJhbGxlbCdzIGV4aXN0aW5nIGZhaWx1cmUgcG9saWN5XCIgcmF0aGVyIHRoYW4gYSBzZWNvbmRcbiAqICAgb25lOiBgZmFpbEZhc3RgIOKGkiBgUHJvbWlzZS5hbGxgLCBvdGhlcndpc2UgYmVzdC1lZmZvcnQgYFByb21pc2UuYWxsU2V0dGxlZGAuXG4gKiAgIEl0IGFsc28gZmlyZXMgYG9uRm9ya2AgKyBgb25TdGFnZUV4ZWN1dGVkKCdmb3JrJylgIGFuZCBidWJibGVzIGFcbiAqICAgYFBhdXNlU2lnbmFsYCBvdXQgb2YgYSBicmFuY2gsIGFsbCB1bmNoYW5nZWQuXG4gKlxuICogIyMgVGhlIGxhd3MgdGhpcyBoYW5kbGVyIG93bnNcbiAqXG4gKiAqKk9yZGVyIGlzIGl0ZW1zIG9yZGVyLioqIFJlc3VsdHMgYXJlIGFzc2VtYmxlZCBieSBpbmRleCBmcm9tIHRoZSBmYW4tb3V0J3NcbiAqIGtleWVkIHJlc3VsdHMsIG5ldmVyIGJ5IGNvbXBsZXRpb24gb3JkZXIsIGFuZCBsYW5kIGFzIE9ORSBhcnJheSB3cml0ZSBvbiB0aGVcbiAqIHBhcmVudCDigJQgc28gYGludG9baV1gIGlzIGFsd2F5cyBicmFuY2ggYGlgJ3MgcmVzdWx0IG5vIG1hdHRlciB3aGljaCBicmFuY2hcbiAqIGZpbmlzaGVkIGZpcnN0LiBBIGZhaWxlZCBicmFuY2ggKGJlc3QtZWZmb3J0IG1vZGUpIGxlYXZlcyBgdW5kZWZpbmVkYCBpbiBpdHNcbiAqIHNsb3Q7IHdoaWNoIGJyYW5jaCBmYWlsZWQgaXMgbm90IHJlcG9ydGVkIGhlcmUsIGJlY2F1c2UgdGhhdCBnYXAgaXNcbiAqIHByZS1leGlzdGluZyBpbiB0aGUgcGFyYWxsZWwgZmFuLW91dCBhbmQgbm90IHRoaXMgZmVhdHVyZSdzIHRvIHdpZGVuLlxuICpcbiAqICoqbWF4QnJhbmNoZXMgdHJ1bmNhdGVzLCBhbmQgc2F5cyBzby4qKiBJdGVtcyBwYXN0IHRoZSBjZWlsaW5nIGRvIG5vdCBydW4uXG4gKiBUaGUgdHJ1bmNhdGlvbiBpcyByZWNvcmRlZCBpbiB0aGUgc3RhZ2UncyBvd24gY29tbWl0LXZpc2libGUgbG9nIGFuZCBhcyBhXG4gKiBmbG93IG1lc3NhZ2Ug4oCUIGJvdW5kZWQgZXhlY3V0aW9uLCBzdGF0ZWQsIG5ldmVyIHNpbGVudC5cbiAqXG4gKiAqKkJyYW5jaCBjaGFydHMgYXJlIHJlLXJlZ2lzdGVyZWQgb24gRVZFUlkgdmlzaXQuKiogVGhlIGdlbmVyYXRlZCBzZWdtZW50c1xuICogYXJlIHN0YWJsZSBhY3Jvc3MgbG9vcCBpdGVyYXRpb25zLCBhbmQgc3ViZmxvdyByZWdpc3RyYXRpb24gaXMgbm9ybWFsbHlcbiAqIGZpcnN0LXdyaXRlLXdpbnMg4oCUIHdoaWNoIHdvdWxkIG1lYW4gYSBsb29waW5nIGZhbi1vdXQgc2lsZW50bHkgcmUtZXhlY3V0aW5nXG4gKiBpdGVyYXRpb24gMSdzIGJyYW5jaCBjaGFydHMgZm9yZXZlciwgZXZlbiB3aGVuIHRoZSBmYWN0b3J5IHJldHVybnMgZGlmZmVyZW50XG4gKiBjaGFydHMuIFRoaXMgaGFuZGxlciBvdmVyd3JpdGVzIGluc3RlYWQuIFBlci1pdGVyYXRpb24gcmVzdWx0cyBzdGF5XG4gKiBhZGRyZXNzYWJsZSB0aHJvdWdoIHRoZSBtb3VudCdzIGBydW50aW1lU3RhZ2VJZGAga2V5LCBleGFjdGx5IGFzIHRoZXkgZG8gZm9yXG4gKiBhIGhhbmQtYXV0aG9yZWQgbG9vcGluZyBzdWJmbG93LlxuICpcbiAqICoqRXZlbnQgb3JkZXIuKiogYG9uU3RhZ2VTdGFydGAg4oaSIHRoZSBgaXRlbXNgIHJlYWQg4oaSIGBvbkZvcmtgIOKGkiBicmFuY2hlcyDihpJcbiAqIHRoZSBvcmRlcmVkLWFycmF5IHdyaXRlIOKGkiBgb25TdGFnZUVuZGAg4oaSIGBvbkNvbW1pdGAuIFRoZSBzdGFnZSdzIG93biBjb21taXRcbiAqIHRoZXJlZm9yZSBsYW5kcyBBRlRFUiBpdHMgYG9uRm9ya2AsIHdoaWNoIGlzIHRoZSBvbmUgcGxhY2UgYSBzdGFnZSdzIGNvbW1pdFxuICogZm9sbG93cyBpdHMgZmFuLW91dCBldmVudCDigJQgdW5hdm9pZGFibGUgYW5kIGhvbmVzdDogdGhlIHJlc3VsdCBpcyBub3RcbiAqIGtub3dhYmxlIHVudGlsIHRoZSBicmFuY2hlcyBzZXR0bGUuXG4gKi9cblxuaW1wb3J0IHsgYnVpbGRCcmFuY2hTZWdtZW50IH0gZnJvbSAnLi4vLi4vaWRzL2JyYW5jaFNlZ21lbnQuanMnO1xuaW1wb3J0IHR5cGUgeyBTdGFnZUNvbnRleHQgfSBmcm9tICcuLi8uLi9tZW1vcnkvU3RhZ2VDb250ZXh0LmpzJztcbmltcG9ydCB7IHVud3JhcEhhbmRsZXMgfSBmcm9tICcuLi8uLi9yZWFjdGl2ZS9oYW5kbGVzLmpzJztcbmltcG9ydCB7IGNyZWF0ZVByb3RlY3RlZFNjb3BlIH0gZnJvbSAnLi4vLi4vc2NvcGUvcHJvdGVjdGlvbi9jcmVhdGVQcm90ZWN0ZWRTY29wZS5qcyc7XG5pbXBvcnQgdHlwZSB7IFNjb3BlUnVudGltZVRhcmdldCB9IGZyb20gJy4uLy4uL3Njb3BlL3J1bnRpbWUuanMnO1xuaW1wb3J0IHsgcmVxdWlyZVNjb3BlUnVudGltZSB9IGZyb20gJy4uLy4uL3Njb3BlL3J1bnRpbWUuanMnO1xuaW1wb3J0IHR5cGUgeyBTdGFnZU5vZGUgfSBmcm9tICcuLi9ncmFwaC9TdGFnZU5vZGUuanMnO1xuaW1wb3J0IHR5cGUgeyBUcmF2ZXJzYWxDb250ZXh0IH0gZnJvbSAnLi4vbmFycmF0aXZlL3R5cGVzLmpzJztcbmltcG9ydCB0eXBlIHsgQnJhbmNoQ2hhcnQsIEhhbmRsZXJEZXBzLCBOb2RlUmVzdWx0VHlwZSwgUGFyYWxsZWxGb3JFYWNoQ29uZmlnIH0gZnJvbSAnLi4vdHlwZXMuanMnO1xuaW1wb3J0IHR5cGUgeyBDaGlsZHJlbkV4ZWN1dG9yIH0gZnJvbSAnLi9DaGlsZHJlbkV4ZWN1dG9yLmpzJztcblxuLyoqXG4gKiBUcmF2ZXJzZXItb3duZWQgb3BlcmF0aW9ucyB0aGUgaGFuZGxlciBuZWVkcy4gUGFzc2VkIGFzIGZ1bmN0aW9ucyAobm90IHRoZVxuICogdHJhdmVyc2VyKSBzbyB0aGUgaGFuZGxlciBrZWVwcyB0aGUgc2FtZSBuby1iYWNrLXJlZmVyZW5jZSBzaGFwZSBhcyBldmVyeVxuICogb3RoZXIgaGFuZGxlciBpbiB0aGlzIGRpcmVjdG9yeS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQYXJhbGxlbEZvckVhY2hIb29rczxUT3V0ID0gYW55LCBUU2NvcGUgPSBhbnk+IHtcbiAgLyoqIFRoZSB0cmF2ZXJzZXIncyBgcHJlZml4Tm9kZVRyZWVgIOKAlCBieXRlLXR3aW4gb2YgdGhlIGJ1aWxkZXIncyBgX3ByZWZpeE5vZGVUcmVlYC4gKi9cbiAgcHJlZml4Tm9kZVRyZWUobm9kZTogU3RhZ2VOb2RlPFRPdXQsIFRTY29wZT4sIHByZWZpeDogc3RyaW5nKTogU3RhZ2VOb2RlPFRPdXQsIFRTY29wZT47XG4gIC8qKiBSZWdpc3RlciAoT1ZFUldSSVRJTkcpIGEgZ2VuZXJhdGVkIGJyYW5jaCBzdWJmbG93ICsgaXRzIHN0YWdlIGZ1bmN0aW9ucy4gKi9cbiAgcmVnaXN0ZXJCcmFuY2hTdWJmbG93KHN1YmZsb3dJZDogc3RyaW5nLCByb290OiBTdGFnZU5vZGU8VE91dCwgVFNjb3BlPiwgY2hhcnQ6IEJyYW5jaENoYXJ0KTogdm9pZDtcbiAgLyoqIFJlYWQgYSBjb21wbGV0ZWQgYnJhbmNoJ3MgZmluYWwgc2hhcmVkIHN0YXRlLCBmb3IgdGhlIGBzdWJmbG93T3V0cHV0ID8/IHN0YXRlYCBmYWxsYmFjay4gKi9cbiAgYnJhbmNoU2hhcmVkU3RhdGUoc3ViZmxvd0lkOiBzdHJpbmcpOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB8IHVuZGVmaW5lZDtcbiAgLyoqIE1pcnJvciB0aGUgZ2VuZXJhdGVkIGJyYW5jaGVzIGludG8gdGhlIHJ1bnRpbWUgc3RydWN0dXJlLCBmb3IgdmlzdWFsaXphdGlvbi4gKi9cbiAgcmVjb3JkQnJhbmNoU3RydWN0dXJlKG5vZGVJZDogc3RyaW5nLCBicmFuY2hlczogU3RhZ2VOb2RlPFRPdXQsIFRTY29wZT5bXSk6IHZvaWQ7XG59XG5cbmV4cG9ydCBjbGFzcyBQYXJhbGxlbEZvckVhY2hIYW5kbGVyPFRPdXQgPSBhbnksIFRTY29wZSA9IGFueT4ge1xuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIGRlcHM6IEhhbmRsZXJEZXBzPFRPdXQsIFRTY29wZT4sXG4gICAgcHJpdmF0ZSBjaGlsZHJlbkV4ZWN1dG9yOiBDaGlsZHJlbkV4ZWN1dG9yPFRPdXQsIFRTY29wZT4sXG4gICAgcHJpdmF0ZSBob29rczogUGFyYWxsZWxGb3JFYWNoSG9va3M8VE91dCwgVFNjb3BlPixcbiAgKSB7fVxuXG4gIC8qKlxuICAgKiBSdW4gdGhlIGZhbi1vdXQgdG8gY29tcGxldGlvbiBhbmQgY29tbWl0IHRoZSBvcmRlcmVkIHJlc3VsdHMuXG4gICAqIFJldHVybnMgdGhlIHJlc3VsdHMgYXJyYXkgKHRoZSBzdGFnZSdzIG91dHB1dCkuXG4gICAqL1xuICBhc3luYyBydW4oXG4gICAgbm9kZTogU3RhZ2VOb2RlPFRPdXQsIFRTY29wZT4sXG4gICAgY29udGV4dDogU3RhZ2VDb250ZXh0LFxuICAgIGJyYW5jaFBhdGg6IHN0cmluZyB8IHVuZGVmaW5lZCxcbiAgICB0cmF2ZXJzYWxDb250ZXh0OiBUcmF2ZXJzYWxDb250ZXh0LFxuICApOiBQcm9taXNlPHVua25vd25bXT4ge1xuICAgIGNvbnN0IGNvbmZpZyA9IG5vZGUucGFyYWxsZWxGb3JFYWNoIGFzIFBhcmFsbGVsRm9yRWFjaENvbmZpZzx1bmtub3duLCBUU2NvcGU+O1xuXG4gICAgLy8gU2FtZSBzY29wZSBjb25zdHJ1Y3Rpb24gU3RhZ2VSdW5uZXIgcGVyZm9ybXMsIHByb3RlY3Rpb24gaW5jbHVkZWQ6IHRoaXNcbiAgICAvLyBzdGFnZSBoYXMgbm8gdXNlciBmdW5jdGlvbiwgYnV0IGBpdGVtcyhzY29wZSlgIElTIHVzZXIgY29kZSwgc28gaXRzIHJlYWRzXG4gICAgLy8gYXJlIHRyYWNrZWQgYW5kIGEgc3RyYXkgYXNzaWdubWVudCBpbnNpZGUgaXQgaXMgY2F1Z2h0IGJ5IHRoZSBzYW1lXG4gICAgLy8gcHJvdGVjdGlvbiBldmVyeSBvdGhlciBzdGFnZSBnZXRzLiAoVHlwZWRTY29wZSBicmluZ3MgaXRzIG93biBwcm94eS4pXG4gICAgY29uc3QgcmF3U2NvcGUgPSB0aGlzLmRlcHMuc2NvcGVGYWN0b3J5KGNvbnRleHQsIG5vZGUubmFtZSwgdGhpcy5kZXBzLnJlYWRPbmx5Q29udGV4dCwgdGhpcy5kZXBzLmV4ZWN1dGlvbkVudik7XG4gICAgY29uc3QgcnVudGltZSA9IHJlcXVpcmVTY29wZVJ1bnRpbWUocmF3U2NvcGUpO1xuICAgIGNvbnN0IHNjb3BlID0gcnVudGltZS5oYW5kbGVzQXNzaWdubWVudHNcbiAgICAgID8gcmF3U2NvcGVcbiAgICAgIDogKGNyZWF0ZVByb3RlY3RlZFNjb3BlKHJhd1Njb3BlIGFzIG9iamVjdCwge1xuICAgICAgICAgIG1vZGU6IHRoaXMuZGVwcy5zY29wZVByb3RlY3Rpb25Nb2RlLFxuICAgICAgICAgIHN0YWdlTmFtZTogbm9kZS5uYW1lLFxuICAgICAgICB9KSBhcyBUU2NvcGUpO1xuICAgIHJ1bnRpbWUudGFyZ2V0Lm5vdGlmeVN0YWdlU3RhcnQ/LigpO1xuXG4gICAgY29uc3QgaXRlbXMgPSB0aGlzLnJlc29sdmVJdGVtcyhjb25maWcsIHNjb3BlLCBub2RlKTtcbiAgICBjb25zdCB0b3RhbCA9IGl0ZW1zLmxlbmd0aDtcbiAgICBjb25zdCBicmFuY2hDb3VudCA9IE1hdGgubWluKHRvdGFsLCBjb25maWcubWF4QnJhbmNoZXMpO1xuICAgIGNvbnN0IHRydW5jYXRlZCA9IHRvdGFsID4gYnJhbmNoQ291bnQ7XG5cbiAgICBjb250ZXh0LmFkZExvZygncGFyYWxsZWxGb3JFYWNoJywge1xuICAgICAgaXRlbXM6IHRvdGFsLFxuICAgICAgYnJhbmNoZXM6IGJyYW5jaENvdW50LFxuICAgICAgbWF4QnJhbmNoZXM6IGNvbmZpZy5tYXhCcmFuY2hlcyxcbiAgICAgIHRydW5jYXRlZCxcbiAgICAgIGludG86IGNvbmZpZy5pbnRvLFxuICAgIH0pO1xuICAgIGlmICh0cnVuY2F0ZWQpIHtcbiAgICAgIC8vIFN0YXRlZCwgbm90IHNpbGVudCDigJQgaW4gdGhlIHN0YWdlJ3Mgb3duIGZsb3cgbWVzc2FnZXMgQU5EIGl0cyBsb2dzIGFib3ZlLlxuICAgICAgY29udGV4dC5hZGRGbG93RGVidWdNZXNzYWdlKFxuICAgICAgICAnY2hpbGRyZW4nLFxuICAgICAgICBgbWF4QnJhbmNoZXMgcmVhY2hlZDogcnVubmluZyAke2JyYW5jaENvdW50fSBvZiAke3RvdGFsfSBpdGVtcyAoJHt0b3RhbCAtIGJyYW5jaENvdW50fSBub3QgcnVuKWAsXG4gICAgICAgIHsgY291bnQ6IGJyYW5jaENvdW50IH0sXG4gICAgICApO1xuICAgIH1cblxuICAgIGxldCByZXN1bHRzOiB1bmtub3duW107XG4gICAgaWYgKGJyYW5jaENvdW50ID09PSAwKSB7XG4gICAgICAvLyBaZXJvIGl0ZW1zID0gemVybyBicmFuY2hlczogbm8gZmFuLW91dCBldmVudCwgYW4gZW1wdHkgb3JkZXJlZCBhcnJheS5cbiAgICAgIHJlc3VsdHMgPSBbXTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgYnJhbmNoZXMgPSB0aGlzLmJ1aWxkQnJhbmNoZXMobm9kZSwgaXRlbXMsIGJyYW5jaENvdW50KTtcbiAgICAgIHRoaXMuaG9va3MucmVjb3JkQnJhbmNoU3RydWN0dXJlKG5vZGUuaWQsIGJyYW5jaGVzKTtcblxuICAgICAgLy8gVGhlIGZhbi1vdXQgbm9kZSBoYW5kZWQgdG8gQ2hpbGRyZW5FeGVjdXRvciBpcyBhIHRlbXAgdmlldyBjYXJyeWluZyB0aGVcbiAgICAgIC8vIGdlbmVyYXRlZCBicmFuY2hlcyAoc2FtZSBzaGFwZSBgZXhlY3V0ZVNlbGVjdGVkQ2hpbGRyZW5gIHVzZXMgZm9yIGl0c1xuICAgICAgLy8gc2VsZWN0ZWQgc3Vic2V0KSDigJQgdGhlIHNoYXJlZCBncmFwaCBub2RlIGlzIG5ldmVyIG11dGF0ZWQsIHNvIGEgbG9vcFxuICAgICAgLy8gcmV2aXNpdCByZWdlbmVyYXRlcyBjbGVhbmx5LlxuICAgICAgY29uc3QgZm9ya1ZpZXc6IFN0YWdlTm9kZTxUT3V0LCBUU2NvcGU+ID0ge1xuICAgICAgICAuLi5ub2RlLFxuICAgICAgICBjaGlsZHJlbjogYnJhbmNoZXMsXG4gICAgICAgIC4uLihjb25maWcuZmFpbEZhc3QgIT09IHVuZGVmaW5lZCAmJiB7IGZhaWxGYXN0OiBjb25maWcuZmFpbEZhc3QgfSksXG4gICAgICB9O1xuXG4gICAgICBjb25zdCBjaGlsZFJlc3VsdHMgPSBhd2FpdCB0aGlzLmNoaWxkcmVuRXhlY3V0b3IuZXhlY3V0ZU5vZGVDaGlsZHJlbihcbiAgICAgICAgZm9ya1ZpZXcsXG4gICAgICAgIGNvbnRleHQsXG4gICAgICAgIHVuZGVmaW5lZCxcbiAgICAgICAgYnJhbmNoUGF0aCxcbiAgICAgICAgdHJhdmVyc2FsQ29udGV4dCxcbiAgICAgICk7XG5cbiAgICAgIHJlc3VsdHMgPSB0aGlzLmNvbGxlY3RPcmRlcmVkKG5vZGUsIGJyYW5jaENvdW50LCBjaGlsZFJlc3VsdHMpO1xuICAgIH1cblxuICAgIHRoaXMud3JpdGVSZXN1bHRzKHJ1bnRpbWUudGFyZ2V0LCBjb250ZXh0LCBjb25maWcuaW50bywgcmVzdWx0cyk7XG4gICAgcnVudGltZS50YXJnZXQubm90aWZ5U3RhZ2VFbmQ/LigpO1xuICAgIGNvbnRleHQuY29tbWl0KCk7XG5cbiAgICByZXR1cm4gcmVzdWx0cztcbiAgfVxuXG4gIC8qKlxuICAgKiBFdmFsdWF0ZSB0aGUgaXRlbXMgc2VsZWN0b3IgYWdhaW5zdCB0aGUgbGl2ZSBzY29wZS4gQSBub24tYXJyYXkgcmV0dXJuIGlzXG4gICAqIGEgY2hhcnQgYnVnLCBub3QgYSBydW50aW1lIGNvbmRpdGlvbiDigJQgaXQgZmFpbHMgbG91ZGx5LCBuYW1pbmcgdGhlIHN0YWdlLlxuICAgKlxuICAgKiBUaGUgc2VsZWN0b3IgcmVhZHMgdGhlIHR5cGVkIHNjb3BlLCBzbyB3aGF0IGl0IHJldHVybnMgaXMgdXN1YWxseSB0aGVcbiAgICogc2NvcGUncyBvd24gYXJyYXkgSEFORExFIChhIFByb3h5IGJvdW5kIHRvIHRoZSBwYXJlbnQgc3RhZ2UpIGFuZCBldmVyeVxuICAgKiBgaXRlbXNbaW5kZXhdYCBhbiBlbGVtZW50IGhhbmRsZS4gVGhlIGl0ZW1zIGFyZSBhYm91dCB0byBjcm9zcyBpbnRvXG4gICAqIGJyYW5jaCBydW50aW1lcyDigJQgY2xvc2VkIG92ZXIgYnkgYGJyYW5jaChpdGVtLCBpbmRleClgIGFuZCBzZWVkZWQgYXMgdGhlXG4gICAqIGJyYW5jaCdzIGBpdGVtYCDigJQgc28gdGhleSBhcmUgdGFrZW4gYXMgVkFMVUVTIGhlcmUgKGB1bndyYXBIYW5kbGVzYCxcbiAgICogcmVhY3RpdmUvaGFuZGxlcy50cykuIDkuMjIuMOKAkzkuMjMuMiBzZWVkZWQgdGhlIGhhbmRsZSBpdHNlbGYgYW5kIGV2ZXJ5XG4gICAqIGJyYW5jaCBvdmVyIGFuIG9iamVjdCBpdGVtIGZhaWxlZCBhdCBpdHMgc2VlZCBjb21taXQgKERhdGFDbG9uZUVycm9yKS5cbiAgICovXG4gIHByaXZhdGUgcmVzb2x2ZUl0ZW1zKFxuICAgIGNvbmZpZzogUGFyYWxsZWxGb3JFYWNoQ29uZmlnPHVua25vd24sIFRTY29wZT4sXG4gICAgc2NvcGU6IFRTY29wZSxcbiAgICBub2RlOiBTdGFnZU5vZGU8VE91dCwgVFNjb3BlPixcbiAgKTogcmVhZG9ubHkgdW5rbm93bltdIHtcbiAgICBjb25zdCBpdGVtcyA9IHVud3JhcEhhbmRsZXMoY29uZmlnLml0ZW1zKHNjb3BlKSk7XG4gICAgaWYgKGl0ZW1zID09PSB1bmRlZmluZWQgfHwgaXRlbXMgPT09IG51bGwpIHJldHVybiBbXTtcbiAgICBpZiAoIUFycmF5LmlzQXJyYXkoaXRlbXMpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBwYXJhbGxlbEZvckVhY2ggJyR7bm9kZS5pZH0nOiBpdGVtcygpIG11c3QgcmV0dXJuIGFuIGFycmF5IChnb3QgJHt0eXBlb2YgaXRlbXN9KS4gYCArXG4gICAgICAgICAgJ1JldHVybiBbXSB0byBydW4gemVybyBicmFuY2hlcy4nLFxuICAgICAgKTtcbiAgICB9XG4gICAgcmV0dXJuIGl0ZW1zO1xuICB9XG5cbiAgLyoqIEdlbmVyYXRlIG9uZSBzdWJmbG93LW1vdW50IG5vZGUgcGVyIGJyYW5jaCwgcmVnaXN0ZXJpbmcgZWFjaCBicmFuY2ggY2hhcnQuICovXG4gIHByaXZhdGUgYnVpbGRCcmFuY2hlcyhcbiAgICBub2RlOiBTdGFnZU5vZGU8VE91dCwgVFNjb3BlPixcbiAgICBpdGVtczogcmVhZG9ubHkgdW5rbm93bltdLFxuICAgIGJyYW5jaENvdW50OiBudW1iZXIsXG4gICk6IFN0YWdlTm9kZTxUT3V0LCBUU2NvcGU+W10ge1xuICAgIGNvbnN0IGNvbmZpZyA9IG5vZGUucGFyYWxsZWxGb3JFYWNoIGFzIFBhcmFsbGVsRm9yRWFjaENvbmZpZzx1bmtub3duLCBUU2NvcGU+O1xuICAgIGNvbnN0IGJyYW5jaGVzOiBTdGFnZU5vZGU8VE91dCwgVFNjb3BlPltdID0gW107XG5cbiAgICBmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwgYnJhbmNoQ291bnQ7IGluZGV4KyspIHtcbiAgICAgIGNvbnN0IGl0ZW0gPSBpdGVtc1tpbmRleF07XG4gICAgICBjb25zdCBzdWJmbG93SWQgPSBidWlsZEJyYW5jaFNlZ21lbnQobm9kZS5pZCwgaW5kZXgpO1xuICAgICAgY29uc3QgY2hhcnQgPSBjb25maWcuYnJhbmNoKGl0ZW0sIGluZGV4KTtcbiAgICAgIGlmICghY2hhcnQgfHwgIWNoYXJ0LnJvb3QpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgIGBwYXJhbGxlbEZvckVhY2ggJyR7bm9kZS5pZH0nOiBicmFuY2goaXRlbSwgJHtpbmRleH0pIG11c3QgcmV0dXJuIGEgYnVpbHQgY2hhcnQgYCArXG4gICAgICAgICAgICAnKHRoZSByZXN1bHQgb2YgZmxvd0NoYXJ0KC4uLikuYnVpbGQoKSkuJyxcbiAgICAgICAgKTtcbiAgICAgIH1cblxuICAgICAgLy8gU2FtZSBwcmVmaXhpbmcgYSBsYXp5IHN1YmZsb3cgZ2V0cyDigJQgdGhlIGJyYW5jaCdzIGlubmVyIGlkcyBiZWNvbWVcbiAgICAgIC8vIGA8c2VnbWVudD4vPGlkPmAsIHNvIGl0cyBzdGFnZXMgYWRkcmVzcyBhcyBgPHNlZ21lbnQ+LzxpZD4jPG4+YC5cbiAgICAgIGNvbnN0IHByZWZpeGVkUm9vdCA9IHRoaXMuaG9va3MucHJlZml4Tm9kZVRyZWUoY2hhcnQucm9vdCBhcyBTdGFnZU5vZGU8VE91dCwgVFNjb3BlPiwgc3ViZmxvd0lkKTtcbiAgICAgIHRoaXMuaG9va3MucmVnaXN0ZXJCcmFuY2hTdWJmbG93KHN1YmZsb3dJZCwgcHJlZml4ZWRSb290LCBjaGFydCk7XG5cbiAgICAgIGJyYW5jaGVzLnB1c2goe1xuICAgICAgICBuYW1lOiBgJHtub2RlLm5hbWV9IFske2luZGV4fV1gLFxuICAgICAgICBpZDogc3ViZmxvd0lkLFxuICAgICAgICBpc1N1YmZsb3dSb290OiB0cnVlLFxuICAgICAgICBzdWJmbG93SWQsXG4gICAgICAgIHN1YmZsb3dOYW1lOiBgJHtub2RlLm5hbWV9IFske2luZGV4fV1gLFxuICAgICAgICBzdWJmbG93TW91bnRPcHRpb25zOiB7XG4gICAgICAgICAgLy8gRDEncyBcImlucHV0TWFwcGVyIHNlYW0gZm9yIGZlZWRpbmcgdGhlIGl0ZW0gaW5cIjogdGhlIGl0ZW0gaXNcbiAgICAgICAgICAvLyB2aXNpYmxlIElOIHRoZSBicmFuY2gncyBzY29wZSAoYW5kIHNvIGluIGl0cyBjb21taXQgbG9nKSBhcyB3ZWxsIGFzXG4gICAgICAgICAgLy8gY2xvc2VkIG92ZXIgYnkgdGhlIGZhY3Rvcnkg4oCUIHByb3ZlbmFuY2UgYmVhdHMgYSBoaWRkZW4gY2xvc3VyZS5cbiAgICAgICAgICBpbnB1dE1hcHBlcjogKCkgPT4gKHsgaXRlbSwgaW5kZXggfSksXG4gICAgICAgIH0sXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICByZXR1cm4gYnJhbmNoZXM7XG4gIH1cblxuICAvKipcbiAgICogQXNzZW1ibGUgcmVzdWx0cyBpbiBJVEVNUyBvcmRlciDigJQgbmV2ZXIgY29tcGxldGlvbiBvcmRlci5cbiAgICpcbiAgICogVGhlIGJyYW5jaCdzIHZhbHVlIGlzIGl0cyBzdWJmbG93IG91dHB1dCwgZmFsbGluZyBiYWNrIHRvIHRoZSBicmFuY2gnc1xuICAgKiBmaW5hbCBzaGFyZWQgc3RhdGUgKHRoZSBUeXBlZFNjb3BlIGNhc2UsIHdoZXJlIHN0YWdlIGZ1bmN0aW9ucyByZXR1cm5cbiAgICogdm9pZCkg4oCUIHRoZSBzYW1lIGBzdWJmbG93T3V0cHV0ID8/IHNoYXJlZFN0YXRlYCBydWxlIGBTdWJmbG93RXhlY3V0b3JgXG4gICAqIGFwcGxpZXMgdG8gYW4gb3V0cHV0TWFwcGVyLlxuICAgKi9cbiAgcHJpdmF0ZSBjb2xsZWN0T3JkZXJlZChcbiAgICBub2RlOiBTdGFnZU5vZGU8VE91dCwgVFNjb3BlPixcbiAgICBicmFuY2hDb3VudDogbnVtYmVyLFxuICAgIGNoaWxkUmVzdWx0czogUmVjb3JkPHN0cmluZywgTm9kZVJlc3VsdFR5cGU+LFxuICApOiB1bmtub3duW10ge1xuICAgIGNvbnN0IG9yZGVyZWQ6IHVua25vd25bXSA9IFtdO1xuICAgIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCBicmFuY2hDb3VudDsgaW5kZXgrKykge1xuICAgICAgY29uc3Qgc3ViZmxvd0lkID0gYnVpbGRCcmFuY2hTZWdtZW50KG5vZGUuaWQsIGluZGV4KTtcbiAgICAgIGNvbnN0IGVudHJ5ID0gY2hpbGRSZXN1bHRzW3N1YmZsb3dJZF07XG4gICAgICBpZiAoZW50cnkgPT09IHVuZGVmaW5lZCB8fCBlbnRyeS5pc0Vycm9yKSB7XG4gICAgICAgIC8vIEJlc3QtZWZmb3J0IG1vZGU6IGEgZmFpbGVkIGJyYW5jaCBrZWVwcyBpdHMgU0xPVCAob3JkZXIgaXMgaXRlbXNcbiAgICAgICAgLy8gb3JkZXIpIHdpdGggYW4gdW5kZWZpbmVkIHZhbHVlLiBmYWlsRmFzdCBtb2RlIG5ldmVyIHJlYWNoZXMgaGVyZSDigJRcbiAgICAgICAgLy8gdGhlIGVycm9yIGFscmVhZHkgcmVqZWN0ZWQgdGhlIHdob2xlIHN0YWdlLlxuICAgICAgICBvcmRlcmVkLnB1c2godW5kZWZpbmVkKTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBvcmRlcmVkLnB1c2goZW50cnkucmVzdWx0ID8/IHRoaXMuaG9va3MuYnJhbmNoU2hhcmVkU3RhdGUoc3ViZmxvd0lkKSk7XG4gICAgfVxuICAgIHJldHVybiBvcmRlcmVkO1xuICB9XG5cbiAgLyoqXG4gICAqIFdyaXRlIHRoZSBvcmRlcmVkIGFycmF5IGFzIE9ORSB2YWx1ZSBvbiB0aGUgcGFyZW50IHNjb3BlLlxuICAgKlxuICAgKiBVc2UgdGhlIHByb3ZpZGVyJ3MgZXhwbGljaXQgc3RhdGUtd3JpdGUgcG9ydCwgbmV2ZXIgYSB1c2VyIHByb3h5IHByb2JlLlxuICAgKiBBIGRlY2xhcmVkIGRhdGEtb25seSBwb3J0IGhhcyBubyBzZXR0ZXI7IGl0cyByZXN1bHRzIGdvIHRvIHRoZSBmcmFtZS5cbiAgICovXG4gIHByaXZhdGUgd3JpdGVSZXN1bHRzKHRhcmdldDogU2NvcGVSdW50aW1lVGFyZ2V0LCBjb250ZXh0OiBTdGFnZUNvbnRleHQsIGludG86IHN0cmluZywgcmVzdWx0czogdW5rbm93bltdKTogdm9pZCB7XG4gICAgaWYgKHRhcmdldC5zZXRWYWx1ZSkge1xuICAgICAgdGFyZ2V0LnNldFZhbHVlKGludG8sIHJlc3VsdHMpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICAvLyBObyBmYWNhZGUgKGhhbmQtcm9sbGVkIHNjb3BlIGZhY3RvcnkpIOKAlCB3cml0ZSBzdHJhaWdodCB0byB0aGUgZnJhbWUuXG4gICAgY29udGV4dC5zZXRHbG9iYWwoaW50bywgcmVzdWx0cyk7XG4gIH1cbn1cbiJdfQ==
227
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUGFyYWxsZWxGb3JFYWNoSGFuZGxlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy9saWIvZW5naW5lL2hhbmRsZXJzL1BhcmFsbGVsRm9yRWFjaEhhbmRsZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQW1ERztBQUVILE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBRWhFLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUMxRCxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSxnREFBZ0QsQ0FBQztBQUV0RixPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQXNCN0QsTUFBTSxPQUFPLHNCQUFzQjtJQUV2QjtJQUNBO0lBQ0E7SUFIVixZQUNVLElBQStCLEVBQy9CLGdCQUFnRCxFQUNoRCxLQUF5QztRQUZ6QyxTQUFJLEdBQUosSUFBSSxDQUEyQjtRQUMvQixxQkFBZ0IsR0FBaEIsZ0JBQWdCLENBQWdDO1FBQ2hELFVBQUssR0FBTCxLQUFLLENBQW9DO0lBQ2hELENBQUM7SUFFSjs7O09BR0c7SUFDSCxLQUFLLENBQUMsR0FBRyxDQUNQLElBQTZCLEVBQzdCLE9BQXFCLEVBQ3JCLFVBQThCLEVBQzlCLGdCQUFrQztRQUVsQyxNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsZUFBeUQsQ0FBQztRQUU5RSwwRUFBMEU7UUFDMUUsNEVBQTRFO1FBQzVFLHFFQUFxRTtRQUNyRSx3RUFBd0U7UUFDeEUsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsT0FBTyxFQUFFLElBQUksQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxlQUFlLEVBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FB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QUM7UUFDOUIsS0FBSyxJQUFJLEtBQUssR0FBRyxDQUFDLEVBQUUsS0FBSyxHQUFHLFdBQVcsRUFBRSxLQUFLLEVBQUUsRUFBRSxDQUFDO1lBQ2pELE1BQU0sU0FBUyxHQUFHLGtCQUFrQixDQUFDLElBQUksQ0FBQyxFQUFFLEVBQUUsS0FBSyxDQUFDLENBQUM7WUFDckQsTUFBTSxLQUFLLEdBQUcsWUFBWSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1lBQ3RDLElBQUksS0FBSyxLQUFLLFNBQVMsSUFBSSxLQUFLLENBQUMsT0FBTyxFQUFFLENBQUM7Z0JBQ3pDLG1FQUFtRTtnQkFDbkUscUVBQXFFO2dCQUNyRSw4Q0FBOEM7Z0JBQzlDLE9BQU8sQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUM7Z0JBQ3hCLFNBQVM7WUFDWCxDQUFDO1lBQ0QsT0FBTyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxJQUFJLElBQUksQ0FBQyxLQUFLLENBQUMsaUJBQWlCLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQztRQUN4RSxDQUFDO1FBQ0QsT0FBTyxPQUFPLENBQUM7SUFDakIsQ0FBQztJQUVEOzs7OztPQUtHO0lBQ0ssWUFBWSxDQUFDLE1BQTBCLEVBQUUsT0FBcUIsRUFBRSxJQUFZLEVBQUUsT0FBa0I7UUFDdEcsSUFBSSxNQUFNLENBQUMsUUFBUSxFQUFFLENBQUM7WUFDcEIsTUFBTSxDQUFDLFFBQVEsQ0FBQyxJQUFJLEVBQUUsT0FBTyxDQUFDLENBQUM7WUFDL0IsT0FBTztRQUNULENBQUM7UUFDRCx1RUFBdUU7UUFDdkUsT0FBTyxDQUFDLFNBQVMsQ0FBQyxJQUFJLEVBQUUsT0FBTyxDQUFDLENBQUM7SUFDbkMsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBQYXJhbGxlbEZvckVhY2hIYW5kbGVyIOKAlCBkeW5hbWljIGZhbi1vdXQ6IG9uZSBicmFuY2ggcGVyIGl0ZW0sIGJyYW5jaCBDT1VOVFxuICogZGVjaWRlZCBhdCBydW50aW1lIGZyb20gdGhlIHBheWxvYWQuXG4gKlxuICogRGVzaWduOiBkb2NzL2Rlc2lnbi9leGVjdXRpb24tY29udHJvbC5tZCAoRDEgKyBEMikuIFJvdW5kIEIgYnVpbGRzIGV4YWN0bHlcbiAqIHRoYXQgZG9jdW1lbnQuXG4gKlxuICogIyMgV2hhdCB0aGlzIGhhbmRsZXIgZG9lcyBOT1QgaW52ZW50XG4gKlxuICogQWxtb3N0IGV2ZXJ5dGhpbmcgaGVyZSBpcyBleGlzdGluZyBtYWNoaW5lcnksIHdpcmVkIHRvZ2V0aGVyOlxuICpcbiAqIC0gKipFYWNoIGJyYW5jaCBpcyBhIGdlbmVyYXRlZCBTVUJGTE9XLioqIEl0cyBwYXRoIHNlZ21lbnQgaXNcbiAqICAgYDxwYXJlbnRTdGFnZUlkPn48aW5kZXg+YCAoc2VlIGBpZHMvYnJhbmNoU2VnbWVudC50c2ApIOKAlCBhIHN1YmZsb3dQYXRoXG4gKiAgIHNlZ21lbnQgaW4gdGhlIGdyYW1tYXIgdGhhdCBhbHJlYWR5IHNoaXBzLCBOT1QgYSBuZXcgZGVsaW1pdGVyIGNsYXNzLiBTbyBhXG4gKiAgIGJyYW5jaCBnZXRzLCBmb3IgZnJlZTogYSBmcmVzaCBpc29sYXRlZCBgRXhlY3V0aW9uUnVudGltZWAgKGJyYW5jaGVzIGNhbm5vdFxuICogICBjb3JydXB0IGVhY2ggb3RoZXIncyBpbi1mbGlnaHQgc3RhdGUpLCB0aGUgaW5wdXRNYXBwZXIgc2VhbSBmb3IgZmVlZGluZyB0aGVcbiAqICAgaXRlbSBpbiwgYW5kIOKAlCB0aGUgcG9pbnQgb2YgdGhlIHdob2xlIGRlc2lnbiDigJQgYHBhcnNlUnVudGltZVN0YWdlSWRgLFxuICogICBgY2F1c2FsQ2hhaW5gLCBgc2xpY2VGb3JLZXlgIGFuZCBgZm9yd2FyZFNsaWNlRm9yS2V5YCByZWFkaW5nIGJyYW5jaFxuICogICBjb21taXRzIHdpdGggWkVSTyBjaGFuZ2VzLCBiZWNhdXNlIHRoZSBpZCBzaGFwZSBJUyB0aGUgc2hpcHBlZCBzaGFwZS5cbiAqIC0gKipUaGUgZmFuLW91dCBpdHNlbGYgaXMgYENoaWxkcmVuRXhlY3V0b3JgLioqIFRoYXQgaXMgd2hhdCBtYWtlcyB0aGVcbiAqICAgZmFpbHVyZSBwb2xpY3kgXCJQYXJhbGxlbCdzIGV4aXN0aW5nIGZhaWx1cmUgcG9saWN5XCIgcmF0aGVyIHRoYW4gYSBzZWNvbmRcbiAqICAgb25lOiBgZmFpbEZhc3RgIOKGkiBgUHJvbWlzZS5hbGxgLCBvdGhlcndpc2UgYmVzdC1lZmZvcnQgYFByb21pc2UuYWxsU2V0dGxlZGAuXG4gKiAgIEl0IGFsc28gZmlyZXMgYG9uRm9ya2AgKyBgb25TdGFnZUV4ZWN1dGVkKCdmb3JrJylgIGFuZCBidWJibGVzIGFcbiAqICAgYFBhdXNlU2lnbmFsYCBvdXQgb2YgYSBicmFuY2gsIGFsbCB1bmNoYW5nZWQuXG4gKlxuICogIyMgVGhlIGxhd3MgdGhpcyBoYW5kbGVyIG93bnNcbiAqXG4gKiAqKk9yZGVyIGlzIGl0ZW1zIG9yZGVyLioqIFJlc3VsdHMgYXJlIGFzc2VtYmxlZCBieSBpbmRleCBmcm9tIHRoZSBmYW4tb3V0J3NcbiAqIGtleWVkIHJlc3VsdHMsIG5ldmVyIGJ5IGNvbXBsZXRpb24gb3JkZXIsIGFuZCBsYW5kIGFzIE9ORSBhcnJheSB3cml0ZSBvbiB0aGVcbiAqIHBhcmVudCDigJQgc28gYGludG9baV1gIGlzIGFsd2F5cyBicmFuY2ggYGlgJ3MgcmVzdWx0IG5vIG1hdHRlciB3aGljaCBicmFuY2hcbiAqIGZpbmlzaGVkIGZpcnN0LiBBIGZhaWxlZCBicmFuY2ggKGJlc3QtZWZmb3J0IG1vZGUpIGxlYXZlcyBgdW5kZWZpbmVkYCBpbiBpdHNcbiAqIHNsb3Q7IHdoaWNoIGJyYW5jaCBmYWlsZWQgaXMgbm90IHJlcG9ydGVkIGhlcmUsIGJlY2F1c2UgdGhhdCBnYXAgaXNcbiAqIHByZS1leGlzdGluZyBpbiB0aGUgcGFyYWxsZWwgZmFuLW91dCBhbmQgbm90IHRoaXMgZmVhdHVyZSdzIHRvIHdpZGVuLlxuICpcbiAqICoqbWF4QnJhbmNoZXMgdHJ1bmNhdGVzLCBhbmQgc2F5cyBzby4qKiBJdGVtcyBwYXN0IHRoZSBjZWlsaW5nIGRvIG5vdCBydW4uXG4gKiBUaGUgdHJ1bmNhdGlvbiBpcyByZWNvcmRlZCBpbiB0aGUgc3RhZ2UncyBvd24gY29tbWl0LXZpc2libGUgbG9nIGFuZCBhcyBhXG4gKiBmbG93IG1lc3NhZ2Ug4oCUIGJvdW5kZWQgZXhlY3V0aW9uLCBzdGF0ZWQsIG5ldmVyIHNpbGVudC5cbiAqXG4gKiAqKkJyYW5jaCBjaGFydHMgYXJlIHJlLXJlZ2lzdGVyZWQgb24gRVZFUlkgdmlzaXQuKiogVGhlIGdlbmVyYXRlZCBzZWdtZW50c1xuICogYXJlIHN0YWJsZSBhY3Jvc3MgbG9vcCBpdGVyYXRpb25zLCBhbmQgc3ViZmxvdyByZWdpc3RyYXRpb24gaXMgbm9ybWFsbHlcbiAqIGZpcnN0LXdyaXRlLXdpbnMg4oCUIHdoaWNoIHdvdWxkIG1lYW4gYSBsb29waW5nIGZhbi1vdXQgc2lsZW50bHkgcmUtZXhlY3V0aW5nXG4gKiBpdGVyYXRpb24gMSdzIGJyYW5jaCBjaGFydHMgZm9yZXZlciwgZXZlbiB3aGVuIHRoZSBmYWN0b3J5IHJldHVybnMgZGlmZmVyZW50XG4gKiBjaGFydHMuIFRoaXMgaGFuZGxlciBvdmVyd3JpdGVzIGluc3RlYWQuIFBlci1pdGVyYXRpb24gcmVzdWx0cyBzdGF5XG4gKiBhZGRyZXNzYWJsZSB0aHJvdWdoIHRoZSBtb3VudCdzIGBydW50aW1lU3RhZ2VJZGAga2V5LCBleGFjdGx5IGFzIHRoZXkgZG8gZm9yXG4gKiBhIGhhbmQtYXV0aG9yZWQgbG9vcGluZyBzdWJmbG93LlxuICpcbiAqICoqRXZlbnQgb3JkZXIuKiogYG9uU3RhZ2VTdGFydGAg4oaSIHRoZSBgaXRlbXNgIHJlYWQg4oaSIGBvbkZvcmtgIOKGkiBicmFuY2hlcyDihpJcbiAqIHRoZSBvcmRlcmVkLWFycmF5IHdyaXRlIOKGkiBgb25TdGFnZUVuZGAg4oaSIGBvbkNvbW1pdGAuIFRoZSBzdGFnZSdzIG93biBjb21taXRcbiAqIHRoZXJlZm9yZSBsYW5kcyBBRlRFUiBpdHMgYG9uRm9ya2AsIHdoaWNoIGlzIHRoZSBvbmUgcGxhY2UgYSBzdGFnZSdzIGNvbW1pdFxuICogZm9sbG93cyBpdHMgZmFuLW91dCBldmVudCDigJQgdW5hdm9pZGFibGUgYW5kIGhvbmVzdDogdGhlIHJlc3VsdCBpcyBub3RcbiAqIGtub3dhYmxlIHVudGlsIHRoZSBicmFuY2hlcyBzZXR0bGUuXG4gKi9cblxuaW1wb3J0IHsgYnVpbGRCcmFuY2hTZWdtZW50IH0gZnJvbSAnLi4vLi4vaWRzL2JyYW5jaFNlZ21lbnQuanMnO1xuaW1wb3J0IHR5cGUgeyBTdGFnZUNvbnRleHQgfSBmcm9tICcuLi8uLi9tZW1vcnkvU3RhZ2VDb250ZXh0LmpzJztcbmltcG9ydCB7IHVud3JhcEhhbmRsZXMgfSBmcm9tICcuLi8uLi9yZWFjdGl2ZS9oYW5kbGVzLmpzJztcbmltcG9ydCB7IGNyZWF0ZVByb3RlY3RlZFNjb3BlIH0gZnJvbSAnLi4vLi4vc2NvcGUvcHJvdGVjdGlvbi9jcmVhdGVQcm90ZWN0ZWRTY29wZS5qcyc7XG5pbXBvcnQgdHlwZSB7IFNjb3BlUnVudGltZVRhcmdldCB9IGZyb20gJy4uLy4uL3Njb3BlL3J1bnRpbWUuanMnO1xuaW1wb3J0IHsgcmVxdWlyZVNjb3BlUnVudGltZSB9IGZyb20gJy4uLy4uL3Njb3BlL3J1bnRpbWUuanMnO1xuaW1wb3J0IHR5cGUgeyBTdGFnZU5vZGUgfSBmcm9tICcuLi9ncmFwaC9TdGFnZU5vZGUuanMnO1xuaW1wb3J0IHR5cGUgeyBUcmF2ZXJzYWxDb250ZXh0IH0gZnJvbSAnLi4vbmFycmF0aXZlL3R5cGVzLmpzJztcbmltcG9ydCB0eXBlIHsgQnJhbmNoQ2hhcnQsIEhhbmRsZXJEZXBzLCBOb2RlUmVzdWx0VHlwZSwgUGFyYWxsZWxGb3JFYWNoQ29uZmlnIH0gZnJvbSAnLi4vdHlwZXMuanMnO1xuaW1wb3J0IHR5cGUgeyBDaGlsZHJlbkV4ZWN1dG9yIH0gZnJvbSAnLi9DaGlsZHJlbkV4ZWN1dG9yLmpzJztcblxuLyoqXG4gKiBUcmF2ZXJzZXItb3duZWQgb3BlcmF0aW9ucyB0aGUgaGFuZGxlciBuZWVkcy4gUGFzc2VkIGFzIGZ1bmN0aW9ucyAobm90IHRoZVxuICogdHJhdmVyc2VyKSBzbyB0aGUgaGFuZGxlciBrZWVwcyB0aGUgc2FtZSBuby1iYWNrLXJlZmVyZW5jZSBzaGFwZSBhcyBldmVyeVxuICogb3RoZXIgaGFuZGxlciBpbiB0aGlzIGRpcmVjdG9yeS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQYXJhbGxlbEZvckVhY2hIb29rczxUT3V0ID0gYW55LCBUU2NvcGUgPSBhbnk+IHtcbiAgLyoqIFRoZSB0cmF2ZXJzZXIncyBgcHJlZml4Tm9kZVRyZWVgIOKAlCBieXRlLXR3aW4gb2YgdGhlIGJ1aWxkZXIncyBgX3ByZWZpeE5vZGVUcmVlYC4gKi9cbiAgcHJlZml4Tm9kZVRyZWUobm9kZTogU3RhZ2VOb2RlPFRPdXQsIFRTY29wZT4sIHByZWZpeDogc3RyaW5nKTogU3RhZ2VOb2RlPFRPdXQsIFRTY29wZT47XG4gIC8qKiBSZWdpc3RlciAoT1ZFUldSSVRJTkcpIGEgZ2VuZXJhdGVkIGJyYW5jaCBzdWJmbG93ICsgaXRzIHN0YWdlIGZ1bmN0aW9ucy4gKi9cbiAgcmVnaXN0ZXJCcmFuY2hTdWJmbG93KHN1YmZsb3dJZDogc3RyaW5nLCByb290OiBTdGFnZU5vZGU8VE91dCwgVFNjb3BlPiwgY2hhcnQ6IEJyYW5jaENoYXJ0KTogdm9pZDtcbiAgLyoqIFJlYWQgYSBjb21wbGV0ZWQgYnJhbmNoJ3MgZmluYWwgc2hhcmVkIHN0YXRlLCBmb3IgdGhlIGBzdWJmbG93T3V0cHV0ID8/IHN0YXRlYCBmYWxsYmFjay4gKi9cbiAgYnJhbmNoU2hhcmVkU3RhdGUoc3ViZmxvd0lkOiBzdHJpbmcpOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB8IHVuZGVmaW5lZDtcbiAgLyoqIE1pcnJvciB0aGUgZ2VuZXJhdGVkIGJyYW5jaGVzIGludG8gdGhlIHJ1bnRpbWUgc3RydWN0dXJlLCBmb3IgdmlzdWFsaXphdGlvbi4gKi9cbiAgcmVjb3JkQnJhbmNoU3RydWN0dXJlKG5vZGVJZDogc3RyaW5nLCBicmFuY2hlczogU3RhZ2VOb2RlPFRPdXQsIFRTY29wZT5bXSk6IHZvaWQ7XG59XG5cbmV4cG9ydCBjbGFzcyBQYXJhbGxlbEZvckVhY2hIYW5kbGVyPFRPdXQgPSBhbnksIFRTY29wZSA9IGFueT4ge1xuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIGRlcHM6IEhhbmRsZXJEZXBzPFRPdXQsIFRTY29wZT4sXG4gICAgcHJpdmF0ZSBjaGlsZHJlbkV4ZWN1dG9yOiBDaGlsZHJlbkV4ZWN1dG9yPFRPdXQsIFRTY29wZT4sXG4gICAgcHJpdmF0ZSBob29rczogUGFyYWxsZWxGb3JFYWNoSG9va3M8VE91dCwgVFNjb3BlPixcbiAgKSB7fVxuXG4gIC8qKlxuICAgKiBSdW4gdGhlIGZhbi1vdXQgdG8gY29tcGxldGlvbiBhbmQgY29tbWl0IHRoZSBvcmRlcmVkIHJlc3VsdHMuXG4gICAqIFJldHVybnMgdGhlIHJlc3VsdHMgYXJyYXkgKHRoZSBzdGFnZSdzIG91dHB1dCkuXG4gICAqL1xuICBhc3luYyBydW4oXG4gICAgbm9kZTogU3RhZ2VOb2RlPFRPdXQsIFRTY29wZT4sXG4gICAgY29udGV4dDogU3RhZ2VDb250ZXh0LFxuICAgIGJyYW5jaFBhdGg6IHN0cmluZyB8IHVuZGVmaW5lZCxcbiAgICB0cmF2ZXJzYWxDb250ZXh0OiBUcmF2ZXJzYWxDb250ZXh0LFxuICApOiBQcm9taXNlPHVua25vd25bXT4ge1xuICAgIGNvbnN0IGNvbmZpZyA9IG5vZGUucGFyYWxsZWxGb3JFYWNoIGFzIFBhcmFsbGVsRm9yRWFjaENvbmZpZzx1bmtub3duLCBUU2NvcGU+O1xuXG4gICAgLy8gU2FtZSBzY29wZSBjb25zdHJ1Y3Rpb24gU3RhZ2VSdW5uZXIgcGVyZm9ybXMsIHByb3RlY3Rpb24gaW5jbHVkZWQ6IHRoaXNcbiAgICAvLyBzdGFnZSBoYXMgbm8gdXNlciBmdW5jdGlvbiwgYnV0IGBpdGVtcyhzY29wZSlgIElTIHVzZXIgY29kZSwgc28gaXRzIHJlYWRzXG4gICAgLy8gYXJlIHRyYWNrZWQgYW5kIGEgc3RyYXkgYXNzaWdubWVudCBpbnNpZGUgaXQgaXMgY2F1Z2h0IGJ5IHRoZSBzYW1lXG4gICAgLy8gcHJvdGVjdGlvbiBldmVyeSBvdGhlciBzdGFnZSBnZXRzLiAoVHlwZWRTY29wZSBicmluZ3MgaXRzIG93biBwcm94eS4pXG4gICAgY29uc3QgcmF3U2NvcGUgPSB0aGlzLmRlcHMuc2NvcGVGYWN0b3J5KGNvbnRleHQsIG5vZGUubmFtZSwgdGhpcy5kZXBzLnJlYWRPbmx5Q29udGV4dCwgdGhpcy5kZXBzLmV4ZWN1dGlvbkVudik7XG4gICAgY29uc3QgcnVudGltZSA9IHJlcXVpcmVTY29wZVJ1bnRpbWUocmF3U2NvcGUpO1xuICAgIGNvbnN0IHNjb3BlID0gcnVudGltZS5oYW5kbGVzQXNzaWdubWVudHNcbiAgICAgID8gcmF3U2NvcGVcbiAgICAgIDogKGNyZWF0ZVByb3RlY3RlZFNjb3BlKHJhd1Njb3BlIGFzIG9iamVjdCwge1xuICAgICAgICAgIG1vZGU6IHRoaXMuZGVwcy5zY29wZVByb3RlY3Rpb25Nb2RlLFxuICAgICAgICAgIHN0YWdlTmFtZTogbm9kZS5uYW1lLFxuICAgICAgICB9KSBhcyBUU2NvcGUpO1xuICAgIHJ1bnRpbWUudGFyZ2V0Lm5vdGlmeVN0YWdlU3RhcnQ/LigpO1xuXG4gICAgY29uc3Qgc2VsZWN0ZWRCZWZvcmUgPSBjb250ZXh0LnNlbGVjdGVkUmVhZHM7XG4gICAgY29uc3QgaXRlbXMgPSB0aGlzLnJlc29sdmVJdGVtcyhjb25maWcsIHNjb3BlLCBub2RlKTtcbiAgICAvLyBUaGUgaXRlbXMgc2VsZWN0b3IgaXMgYSBtYXBwZXIgYm91bmRhcnk6IHdoYXQgaXQgcmVhZCBiZWNvbWVzIGVhY2ggYnJhbmNoJ3MgYGl0ZW1gLCBhbmQgdGhlXG4gICAgLy8gYnJhbmNoZXMnIHJlc3VsdHMgbGFuZCB1bmRlciBgaW50b2AuIEEgc2VsZWN0b3IgdGhhdCBSRUFEIGEgc2VsZWN0ZWQgdmFsdWUgaGFuZHMgYm90aCB0aGVcbiAgICAvLyByZWRhY3Rpb24sIGJ5IG5hbWUsIGZvciB0aGUgcmVzdCBvZiB0aGUgcnVuICh0aGUgY29uc2VydmF0aXZlIGhhbGYgb2YgYE1hcHBlclRhaW50YCkuXG4gICAgaWYgKGNvbnRleHQuc2VsZWN0ZWRSZWFkcyA+IHNlbGVjdGVkQmVmb3JlKSB7XG4gICAgICBjb25zdCBydWxlID0gY29udGV4dC5nZXRSZWRhY3Rpb25SdWxlKCk7XG4gICAgICBydWxlPy5tYXJrKCdpdGVtJyk7XG4gICAgICBydWxlPy5tYXJrKGNvbmZpZy5pbnRvKTtcbiAgICB9XG4gICAgY29uc3QgdG90YWwgPSBpdGVtcy5sZW5ndGg7XG4gICAgY29uc3QgYnJhbmNoQ291bnQgPSBNYXRoLm1pbih0b3RhbCwgY29uZmlnLm1heEJyYW5jaGVzKTtcbiAgICBjb25zdCB0cnVuY2F0ZWQgPSB0b3RhbCA+IGJyYW5jaENvdW50O1xuXG4gICAgY29udGV4dC5hZGRMb2coJ3BhcmFsbGVsRm9yRWFjaCcsIHtcbiAgICAgIGl0ZW1zOiB0b3RhbCxcbiAgICAgIGJyYW5jaGVzOiBicmFuY2hDb3VudCxcbiAgICAgIG1heEJyYW5jaGVzOiBjb25maWcubWF4QnJhbmNoZXMsXG4gICAgICB0cnVuY2F0ZWQsXG4gICAgICBpbnRvOiBjb25maWcuaW50byxcbiAgICB9KTtcbiAgICBpZiAodHJ1bmNhdGVkKSB7XG4gICAgICAvLyBTdGF0ZWQsIG5vdCBzaWxlbnQg4oCUIGluIHRoZSBzdGFnZSdzIG93biBmbG93IG1lc3NhZ2VzIEFORCBpdHMgbG9ncyBhYm92ZS5cbiAgICAgIGNvbnRleHQuYWRkRmxvd0RlYnVnTWVzc2FnZShcbiAgICAgICAgJ2NoaWxkcmVuJyxcbiAgICAgICAgYG1heEJyYW5jaGVzIHJlYWNoZWQ6IHJ1bm5pbmcgJHticmFuY2hDb3VudH0gb2YgJHt0b3RhbH0gaXRlbXMgKCR7dG90YWwgLSBicmFuY2hDb3VudH0gbm90IHJ1bilgLFxuICAgICAgICB7IGNvdW50OiBicmFuY2hDb3VudCB9LFxuICAgICAgKTtcbiAgICB9XG5cbiAgICBsZXQgcmVzdWx0czogdW5rbm93bltdO1xuICAgIGlmIChicmFuY2hDb3VudCA9PT0gMCkge1xuICAgICAgLy8gWmVybyBpdGVtcyA9IHplcm8gYnJhbmNoZXM6IG5vIGZhbi1vdXQgZXZlbnQsIGFuIGVtcHR5IG9yZGVyZWQgYXJyYXkuXG4gICAgICByZXN1bHRzID0gW107XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IGJyYW5jaGVzID0gdGhpcy5idWlsZEJyYW5jaGVzKG5vZGUsIGl0ZW1zLCBicmFuY2hDb3VudCk7XG4gICAgICB0aGlzLmhvb2tzLnJlY29yZEJyYW5jaFN0cnVjdHVyZShub2RlLmlkLCBicmFuY2hlcyk7XG5cbiAgICAgIC8vIFRoZSBmYW4tb3V0IG5vZGUgaGFuZGVkIHRvIENoaWxkcmVuRXhlY3V0b3IgaXMgYSB0ZW1wIHZpZXcgY2FycnlpbmcgdGhlXG4gICAgICAvLyBnZW5lcmF0ZWQgYnJhbmNoZXMgKHNhbWUgc2hhcGUgYGV4ZWN1dGVTZWxlY3RlZENoaWxkcmVuYCB1c2VzIGZvciBpdHNcbiAgICAgIC8vIHNlbGVjdGVkIHN1YnNldCkg4oCUIHRoZSBzaGFyZWQgZ3JhcGggbm9kZSBpcyBuZXZlciBtdXRhdGVkLCBzbyBhIGxvb3BcbiAgICAgIC8vIHJldmlzaXQgcmVnZW5lcmF0ZXMgY2xlYW5seS5cbiAgICAgIGNvbnN0IGZvcmtWaWV3OiBTdGFnZU5vZGU8VE91dCwgVFNjb3BlPiA9IHtcbiAgICAgICAgLi4ubm9kZSxcbiAgICAgICAgY2hpbGRyZW46IGJyYW5jaGVzLFxuICAgICAgICAuLi4oY29uZmlnLmZhaWxGYXN0ICE9PSB1bmRlZmluZWQgJiYgeyBmYWlsRmFzdDogY29uZmlnLmZhaWxGYXN0IH0pLFxuICAgICAgfTtcblxuICAgICAgY29uc3QgY2hpbGRSZXN1bHRzID0gYXdhaXQgdGhpcy5jaGlsZHJlbkV4ZWN1dG9yLmV4ZWN1dGVOb2RlQ2hpbGRyZW4oXG4gICAgICAgIGZvcmtWaWV3LFxuICAgICAgICBjb250ZXh0LFxuICAgICAgICB1bmRlZmluZWQsXG4gICAgICAgIGJyYW5jaFBhdGgsXG4gICAgICAgIHRyYXZlcnNhbENvbnRleHQsXG4gICAgICApO1xuXG4gICAgICByZXN1bHRzID0gdGhpcy5jb2xsZWN0T3JkZXJlZChub2RlLCBicmFuY2hDb3VudCwgY2hpbGRSZXN1bHRzKTtcbiAgICB9XG5cbiAgICB0aGlzLndyaXRlUmVzdWx0cyhydW50aW1lLnRhcmdldCwgY29udGV4dCwgY29uZmlnLmludG8sIHJlc3VsdHMpO1xuICAgIHJ1bnRpbWUudGFyZ2V0Lm5vdGlmeVN0YWdlRW5kPy4oKTtcbiAgICBjb250ZXh0LmNvbW1pdCgpO1xuXG4gICAgcmV0dXJuIHJlc3VsdHM7XG4gIH1cblxuICAvKipcbiAgICogRXZhbHVhdGUgdGhlIGl0ZW1zIHNlbGVjdG9yIGFnYWluc3QgdGhlIGxpdmUgc2NvcGUuIEEgbm9uLWFycmF5IHJldHVybiBpc1xuICAgKiBhIGNoYXJ0IGJ1Zywgbm90IGEgcnVudGltZSBjb25kaXRpb24g4oCUIGl0IGZhaWxzIGxvdWRseSwgbmFtaW5nIHRoZSBzdGFnZS5cbiAgICpcbiAgICogVGhlIHNlbGVjdG9yIHJlYWRzIHRoZSB0eXBlZCBzY29wZSwgc28gd2hhdCBpdCByZXR1cm5zIGlzIHVzdWFsbHkgdGhlXG4gICAqIHNjb3BlJ3Mgb3duIGFycmF5IEhBTkRMRSAoYSBQcm94eSBib3VuZCB0byB0aGUgcGFyZW50IHN0YWdlKSBhbmQgZXZlcnlcbiAgICogYGl0ZW1zW2luZGV4XWAgYW4gZWxlbWVudCBoYW5kbGUuIFRoZSBpdGVtcyBhcmUgYWJvdXQgdG8gY3Jvc3MgaW50b1xuICAgKiBicmFuY2ggcnVudGltZXMg4oCUIGNsb3NlZCBvdmVyIGJ5IGBicmFuY2goaXRlbSwgaW5kZXgpYCBhbmQgc2VlZGVkIGFzIHRoZVxuICAgKiBicmFuY2gncyBgaXRlbWAg4oCUIHNvIHRoZXkgYXJlIHRha2VuIGFzIFZBTFVFUyBoZXJlIChgdW53cmFwSGFuZGxlc2AsXG4gICAqIHJlYWN0aXZlL2hhbmRsZXMudHMpLiA5LjIyLjDigJM5LjIzLjIgc2VlZGVkIHRoZSBoYW5kbGUgaXRzZWxmIGFuZCBldmVyeVxuICAgKiBicmFuY2ggb3ZlciBhbiBvYmplY3QgaXRlbSBmYWlsZWQgYXQgaXRzIHNlZWQgY29tbWl0IChEYXRhQ2xvbmVFcnJvcikuXG4gICAqL1xuICBwcml2YXRlIHJlc29sdmVJdGVtcyhcbiAgICBjb25maWc6IFBhcmFsbGVsRm9yRWFjaENvbmZpZzx1bmtub3duLCBUU2NvcGU+LFxuICAgIHNjb3BlOiBUU2NvcGUsXG4gICAgbm9kZTogU3RhZ2VOb2RlPFRPdXQsIFRTY29wZT4sXG4gICk6IHJlYWRvbmx5IHVua25vd25bXSB7XG4gICAgY29uc3QgaXRlbXMgPSB1bndyYXBIYW5kbGVzKGNvbmZpZy5pdGVtcyhzY29wZSkpO1xuICAgIGlmIChpdGVtcyA9PT0gdW5kZWZpbmVkIHx8IGl0ZW1zID09PSBudWxsKSByZXR1cm4gW107XG4gICAgaWYgKCFBcnJheS5pc0FycmF5KGl0ZW1zKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgcGFyYWxsZWxGb3JFYWNoICcke25vZGUuaWR9JzogaXRlbXMoKSBtdXN0IHJldHVybiBhbiBhcnJheSAoZ290ICR7dHlwZW9mIGl0ZW1zfSkuIGAgK1xuICAgICAgICAgICdSZXR1cm4gW10gdG8gcnVuIHplcm8gYnJhbmNoZXMuJyxcbiAgICAgICk7XG4gICAgfVxuICAgIHJldHVybiBpdGVtcztcbiAgfVxuXG4gIC8qKiBHZW5lcmF0ZSBvbmUgc3ViZmxvdy1tb3VudCBub2RlIHBlciBicmFuY2gsIHJlZ2lzdGVyaW5nIGVhY2ggYnJhbmNoIGNoYXJ0LiAqL1xuICBwcml2YXRlIGJ1aWxkQnJhbmNoZXMoXG4gICAgbm9kZTogU3RhZ2VOb2RlPFRPdXQsIFRTY29wZT4sXG4gICAgaXRlbXM6IHJlYWRvbmx5IHVua25vd25bXSxcbiAgICBicmFuY2hDb3VudDogbnVtYmVyLFxuICApOiBTdGFnZU5vZGU8VE91dCwgVFNjb3BlPltdIHtcbiAgICBjb25zdCBjb25maWcgPSBub2RlLnBhcmFsbGVsRm9yRWFjaCBhcyBQYXJhbGxlbEZvckVhY2hDb25maWc8dW5rbm93biwgVFNjb3BlPjtcbiAgICBjb25zdCBicmFuY2hlczogU3RhZ2VOb2RlPFRPdXQsIFRTY29wZT5bXSA9IFtdO1xuXG4gICAgZm9yIChsZXQgaW5kZXggPSAwOyBpbmRleCA8IGJyYW5jaENvdW50OyBpbmRleCsrKSB7XG4gICAgICBjb25zdCBpdGVtID0gaXRlbXNbaW5kZXhdO1xuICAgICAgY29uc3Qgc3ViZmxvd0lkID0gYnVpbGRCcmFuY2hTZWdtZW50KG5vZGUuaWQsIGluZGV4KTtcbiAgICAgIGNvbnN0IGNoYXJ0ID0gY29uZmlnLmJyYW5jaChpdGVtLCBpbmRleCk7XG4gICAgICBpZiAoIWNoYXJ0IHx8ICFjaGFydC5yb290KSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICBgcGFyYWxsZWxGb3JFYWNoICcke25vZGUuaWR9JzogYnJhbmNoKGl0ZW0sICR7aW5kZXh9KSBtdXN0IHJldHVybiBhIGJ1aWx0IGNoYXJ0IGAgK1xuICAgICAgICAgICAgJyh0aGUgcmVzdWx0IG9mIGZsb3dDaGFydCguLi4pLmJ1aWxkKCkpLicsXG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIC8vIFNhbWUgcHJlZml4aW5nIGEgbGF6eSBzdWJmbG93IGdldHMg4oCUIHRoZSBicmFuY2gncyBpbm5lciBpZHMgYmVjb21lXG4gICAgICAvLyBgPHNlZ21lbnQ+LzxpZD5gLCBzbyBpdHMgc3RhZ2VzIGFkZHJlc3MgYXMgYDxzZWdtZW50Pi88aWQ+IzxuPmAuXG4gICAgICBjb25zdCBwcmVmaXhlZFJvb3QgPSB0aGlzLmhvb2tzLnByZWZpeE5vZGVUcmVlKGNoYXJ0LnJvb3QgYXMgU3RhZ2VOb2RlPFRPdXQsIFRTY29wZT4sIHN1YmZsb3dJZCk7XG4gICAgICB0aGlzLmhvb2tzLnJlZ2lzdGVyQnJhbmNoU3ViZmxvdyhzdWJmbG93SWQsIHByZWZpeGVkUm9vdCwgY2hhcnQpO1xuXG4gICAgICBicmFuY2hlcy5wdXNoKHtcbiAgICAgICAgbmFtZTogYCR7bm9kZS5uYW1lfSBbJHtpbmRleH1dYCxcbiAgICAgICAgaWQ6IHN1YmZsb3dJZCxcbiAgICAgICAgaXNTdWJmbG93Um9vdDogdHJ1ZSxcbiAgICAgICAgc3ViZmxvd0lkLFxuICAgICAgICBzdWJmbG93TmFtZTogYCR7bm9kZS5uYW1lfSBbJHtpbmRleH1dYCxcbiAgICAgICAgc3ViZmxvd01vdW50T3B0aW9uczoge1xuICAgICAgICAgIC8vIEQxJ3MgXCJpbnB1dE1hcHBlciBzZWFtIGZvciBmZWVkaW5nIHRoZSBpdGVtIGluXCI6IHRoZSBpdGVtIGlzXG4gICAgICAgICAgLy8gdmlzaWJsZSBJTiB0aGUgYnJhbmNoJ3Mgc2NvcGUgKGFuZCBzbyBpbiBpdHMgY29tbWl0IGxvZykgYXMgd2VsbCBhc1xuICAgICAgICAgIC8vIGNsb3NlZCBvdmVyIGJ5IHRoZSBmYWN0b3J5IOKAlCBwcm92ZW5hbmNlIGJlYXRzIGEgaGlkZGVuIGNsb3N1cmUuXG4gICAgICAgICAgaW5wdXRNYXBwZXI6ICgpID0+ICh7IGl0ZW0sIGluZGV4IH0pLFxuICAgICAgICB9LFxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGJyYW5jaGVzO1xuICB9XG5cbiAgLyoqXG4gICAqIEFzc2VtYmxlIHJlc3VsdHMgaW4gSVRFTVMgb3JkZXIg4oCUIG5ldmVyIGNvbXBsZXRpb24gb3JkZXIuXG4gICAqXG4gICAqIFRoZSBicmFuY2gncyB2YWx1ZSBpcyBpdHMgc3ViZmxvdyBvdXRwdXQsIGZhbGxpbmcgYmFjayB0byB0aGUgYnJhbmNoJ3NcbiAgICogZmluYWwgc2hhcmVkIHN0YXRlICh0aGUgVHlwZWRTY29wZSBjYXNlLCB3aGVyZSBzdGFnZSBmdW5jdGlvbnMgcmV0dXJuXG4gICAqIHZvaWQpIOKAlCB0aGUgc2FtZSBgc3ViZmxvd091dHB1dCA/PyBzaGFyZWRTdGF0ZWAgcnVsZSBgU3ViZmxvd0V4ZWN1dG9yYFxuICAgKiBhcHBsaWVzIHRvIGFuIG91dHB1dE1hcHBlci5cbiAgICovXG4gIHByaXZhdGUgY29sbGVjdE9yZGVyZWQoXG4gICAgbm9kZTogU3RhZ2VOb2RlPFRPdXQsIFRTY29wZT4sXG4gICAgYnJhbmNoQ291bnQ6IG51bWJlcixcbiAgICBjaGlsZFJlc3VsdHM6IFJlY29yZDxzdHJpbmcsIE5vZGVSZXN1bHRUeXBlPixcbiAgKTogdW5rbm93bltdIHtcbiAgICBjb25zdCBvcmRlcmVkOiB1bmtub3duW10gPSBbXTtcbiAgICBmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwgYnJhbmNoQ291bnQ7IGluZGV4KyspIHtcbiAgICAgIGNvbnN0IHN1YmZsb3dJZCA9IGJ1aWxkQnJhbmNoU2VnbWVudChub2RlLmlkLCBpbmRleCk7XG4gICAgICBjb25zdCBlbnRyeSA9IGNoaWxkUmVzdWx0c1tzdWJmbG93SWRdO1xuICAgICAgaWYgKGVudHJ5ID09PSB1bmRlZmluZWQgfHwgZW50cnkuaXNFcnJvcikge1xuICAgICAgICAvLyBCZXN0LWVmZm9ydCBtb2RlOiBhIGZhaWxlZCBicmFuY2gga2VlcHMgaXRzIFNMT1QgKG9yZGVyIGlzIGl0ZW1zXG4gICAgICAgIC8vIG9yZGVyKSB3aXRoIGFuIHVuZGVmaW5lZCB2YWx1ZS4gZmFpbEZhc3QgbW9kZSBuZXZlciByZWFjaGVzIGhlcmUg4oCUXG4gICAgICAgIC8vIHRoZSBlcnJvciBhbHJlYWR5IHJlamVjdGVkIHRoZSB3aG9sZSBzdGFnZS5cbiAgICAgICAgb3JkZXJlZC5wdXNoKHVuZGVmaW5lZCk7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgb3JkZXJlZC5wdXNoKGVudHJ5LnJlc3VsdCA/PyB0aGlzLmhvb2tzLmJyYW5jaFNoYXJlZFN0YXRlKHN1YmZsb3dJZCkpO1xuICAgIH1cbiAgICByZXR1cm4gb3JkZXJlZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBXcml0ZSB0aGUgb3JkZXJlZCBhcnJheSBhcyBPTkUgdmFsdWUgb24gdGhlIHBhcmVudCBzY29wZS5cbiAgICpcbiAgICogVXNlIHRoZSBwcm92aWRlcidzIGV4cGxpY2l0IHN0YXRlLXdyaXRlIHBvcnQsIG5ldmVyIGEgdXNlciBwcm94eSBwcm9iZS5cbiAgICogQSBkZWNsYXJlZCBkYXRhLW9ubHkgcG9ydCBoYXMgbm8gc2V0dGVyOyBpdHMgcmVzdWx0cyBnbyB0byB0aGUgZnJhbWUuXG4gICAqL1xuICBwcml2YXRlIHdyaXRlUmVzdWx0cyh0YXJnZXQ6IFNjb3BlUnVudGltZVRhcmdldCwgY29udGV4dDogU3RhZ2VDb250ZXh0LCBpbnRvOiBzdHJpbmcsIHJlc3VsdHM6IHVua25vd25bXSk6IHZvaWQge1xuICAgIGlmICh0YXJnZXQuc2V0VmFsdWUpIHtcbiAgICAgIHRhcmdldC5zZXRWYWx1ZShpbnRvLCByZXN1bHRzKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgLy8gTm8gZmFjYWRlIChoYW5kLXJvbGxlZCBzY29wZSBmYWN0b3J5KSDigJQgd3JpdGUgc3RyYWlnaHQgdG8gdGhlIGZyYW1lLlxuICAgIGNvbnRleHQuc2V0R2xvYmFsKGludG8sIHJlc3VsdHMpO1xuICB9XG59XG4iXX0=
@@ -11,6 +11,7 @@ import { isInterruptSignal } from '../../pause/interrupt.js';
11
11
  import { isPauseResult, isPauseSignal, PauseSignal } from '../../pause/types.js';
12
12
  import { createProtectedScope } from '../../scope/protection/createProtectedScope.js';
13
13
  import { requireScopeRuntime } from '../../scope/runtime.js';
14
+ import { servedPause } from './servedPause.js';
14
15
  export class StageRunner {
15
16
  deps;
16
17
  constructor(deps) {
@@ -82,7 +83,7 @@ export class StageRunner {
82
83
  }
83
84
  catch (error) {
84
85
  if (isInterruptSignal(error)) {
85
- runtime.target.notifyPause?.(error.payload);
86
+ runtime.target.notifyPause?.(servedPause(context, error.payload));
86
87
  throw stampedPause(new PauseSignal(error.payload, node.id, 'interrupt'), context);
87
88
  }
88
89
  if (isPauseSignal(error) && error instanceof PauseSignal)
@@ -102,7 +103,7 @@ export class StageRunner {
102
103
  if (node.isPausable && result !== undefined) {
103
104
  const pauseData = isPauseResult(result) ? result.data : result;
104
105
  // Notify scope recorders before throwing
105
- runtime.target.notifyPause?.(pauseData);
106
+ runtime.target.notifyPause?.(servedPause(context, pauseData));
106
107
  throw stampedPause(new PauseSignal(pauseData, node.id), context);
107
108
  }
108
109
  return result;
@@ -137,4 +138,4 @@ function raceAbort(promise, signal) {
137
138
  });
138
139
  });
139
140
  }
140
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU3RhZ2VSdW5uZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9zcmMvbGliL2VuZ2luZS9oYW5kbGVycy9TdGFnZVJ1bm5lci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7R0FRRztBQUdILE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQzdELE9BQU8sRUFBRSxhQUFhLEVBQUUsYUFBYSxFQUFFLFdBQVcsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQ2pGLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLGdEQUFnRCxDQUFDO0FBQ3RGLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBSTdELE1BQU0sT0FBTyxXQUFXO0lBQ087SUFBN0IsWUFBNkIsSUFBK0I7UUFBL0IsU0FBSSxHQUFKLElBQUksQ0FBMkI7SUFBRyxDQUFDO0lBRWhFLEtBQUssQ0FBQyxHQUFHLENBQ1AsSUFBNkIsRUFDN0IsU0FBc0MsRUFDdEMsT0FBcUIsRUFDckIsT0FBbUI7UUFFbkIseUVBQXlFO1FBQ3pFLE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLE9BQU8sRUFBRSxJQUFJLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsZUFBZSxFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUM7UUFDL0csTUFBTSxPQUFPLEdBQUcsbUJBQW1CLENBQUMsUUFBUSxDQUFDLENBQUM7UUFFOUMsdUVBQXVFO1FBQ3ZFLDhFQUE4RTtRQUM5RSxNQUFNLEtBQUssR0FBRyxPQUFPLENBQUMsa0JBQWtCO1lBQ3RDLENBQUMsQ0FBQyxRQUFRO1lBQ1YsQ0FBQyxDQUFFLG9CQUFvQixDQUFDLFFBQWtCLEVBQUU7Z0JBQ3hDLElBQUksRUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDLG1CQUFtQjtnQkFDbkMsU0FBUyxFQUFFLElB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UUFDeEMsTUFBTSxPQUFPLEdBQUcsR0FBRyxFQUFFLENBQ25CLE1BQU0sQ0FBQyxNQUFNLENBQUMsTUFBTSxZQUFZLEtBQUssQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsSUFBSSxLQUFLLENBQUMsTUFBTSxDQUFDLE1BQU0sSUFBSSxTQUFTLENBQUMsQ0FBQyxDQUFDO1FBQ2pHLE1BQU0sQ0FBQyxnQkFBZ0IsQ0FBQyxPQUFPLEVBQUUsT0FBTyxFQUFFLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7UUFDMUQsT0FBTyxDQUFDLElBQUksQ0FDVixDQUFDLEdBQUcsRUFBRSxFQUFFO1lBQ04sTUFBTSxDQUFDLG1CQUFtQixDQUFDLE9BQU8sRUFBRSxPQUFPLENBQUMsQ0FBQztZQUM3QyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDZixDQUFDLEVBQ0QsQ0FBQyxHQUFHLEVBQUUsRUFBRTtZQUNOLE1BQU0sQ0FBQyxtQkFBbUIsQ0FBQyxPQUFPLEVBQUUsT0FBTyxDQUFDLENBQUM7WUFDN0MsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ2QsQ0FBQyxDQUNGLENBQUM7SUFDSixDQUFDLENBQUMsQ0FBQztBQUNMLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIFN0YWdlUnVubmVyIOKAlCBFeGVjdXRlcyBpbmRpdmlkdWFsIHN0YWdlIGZ1bmN0aW9ucy5cbiAqXG4gKiBSZXNwb25zaWJpbGl0aWVzOlxuICogLSBDcmVhdGUgc2NvcGUgdmlhIFNjb3BlRmFjdG9yeSBmb3IgZWFjaCBzdGFnZVxuICogLSBBcHBseSBzY29wZSBwcm90ZWN0aW9uIChjcmVhdGVQcm90ZWN0ZWRTY29wZSkgdG8gaW50ZXJjZXB0IGRpcmVjdCBhc3NpZ25tZW50c1xuICogLSBIYW5kbGUgc3RyZWFtaW5nIHN0YWdlcyAob25TdGFydCwgb25Ub2tlbiwgb25FbmQgbGlmZWN5Y2xlKVxuICogLSBTeW5jK2FzeW5jIHNhZmV0eTogb25seSBhd2FpdCByZWFsIFByb21pc2VzIChpbnN0YW5jZW9mIGNoZWNrKVxuICovXG5cbmltcG9ydCB0eXBlIHsgU3RhZ2VDb250ZXh0IH0gZnJvbSAnLi4vLi4vbWVtb3J5L1N0YWdlQ29udGV4dC5qcyc7XG5pbXBvcnQgeyBpc0ludGVycnVwdFNpZ25hbCB9IGZyb20gJy4uLy4uL3BhdXNlL2ludGVycnVwdC5qcyc7XG5pbXBvcnQgeyBpc1BhdXNlUmVzdWx0LCBpc1BhdXNlU2lnbmFsLCBQYXVzZVNpZ25hbCB9IGZyb20gJy4uLy4uL3BhdXNlL3R5cGVzLmpzJztcbmltcG9ydCB7IGNyZWF0ZVByb3RlY3RlZFNjb3BlIH0gZnJvbSAnLi4vLi4vc2NvcGUvcHJvdGVjdGlvbi9jcmVhdGVQcm90ZWN0ZWRTY29wZS5qcyc7XG5pbXBvcnQgeyByZXF1aXJlU2NvcGVSdW50aW1lIH0gZnJvbSAnLi4vLi4vc2NvcGUvcnVudGltZS5qcyc7XG5pbXBvcnQgdHlwZSB7IFN0YWdlTm9kZSB9IGZyb20gJy4uL2dyYXBoL1N0YWdlTm9kZS5qcyc7XG5pbXBvcnQgdHlwZSB7IEhhbmRsZXJEZXBzLCBTdGFnZUZ1bmN0aW9uLCBTdHJlYW1DYWxsYmFjayB9IGZyb20gJy4uL3R5cGVzLmpzJztcblxuZXhwb3J0IGNsYXNzIFN0YWdlUnVubmVyPFRPdXQgPSBhbnksIFRTY29wZSA9IGFueT4ge1xuICBjb25zdHJ1Y3Rvcihwcml2YXRlIHJlYWRvbmx5IGRlcHM6IEhhbmRsZXJEZXBzPFRPdXQsIFRTY29wZT4pIHt9XG5cbiAgYXN5bmMgcnVuKFxuICAgIG5vZGU6IFN0YWdlTm9kZTxUT3V0LCBUU2NvcGU+LFxuICAgIHN0YWdlRnVuYzogU3RhZ2VGdW5jdGlvbjxUT3V0LCBUU2NvcGU+LFxuICAgIGNvbnRleHQ6IFN0YWdlQ29udGV4dCxcbiAgICBicmVha0ZuOiAoKSA9PiB2b2lkLFxuICApOiBQcm9taXNlPFRPdXQ+IHtcbiAgICAvLyBDcmVhdGUgc2NvcGUgdmlhIFNjb3BlRmFjdG9yeSDigJQgZWFjaCBzdGFnZSBnZXRzIGl0cyBvd24gc2NvcGUgaW5zdGFuY2VcbiAgICBjb25zdCByYXdTY29wZSA9IHRoaXMuZGVwcy5zY29wZUZhY3RvcnkoY29udGV4dCwgbm9kZS5uYW1lLCB0aGlzLmRlcHMucmVhZE9ubHlDb250ZXh0LCB0aGlzLmRlcHMuZXhlY3V0aW9uRW52KTtcbiAgICBjb25zdCBydW50aW1lID0gcmVxdWlyZVNjb3BlUnVudGltZShyYXdTY29wZSk7XG5cbiAgICAvLyBXcmFwIHNjb3BlIHdpdGggcHJvdGVjdGlvbiB0byBpbnRlcmNlcHQgZGlyZWN0IHByb3BlcnR5IGFzc2lnbm1lbnRzLlxuICAgIC8vIFByb3ZpZGVycyBkZWNsYXJlIHdoZXRoZXIgdGhlaXIgb3duIGFzc2lnbm1lbnQgdHJhcHMgYWxyZWFkeSBtYW5hZ2Ugd3JpdGVzLlxuICAgIGNvbnN0IHNjb3BlID0gcnVudGltZS5oYW5kbGVzQXNzaWdubWVudHNcbiAgICAgID8gcmF3U2NvcGVcbiAgICAgIDogKGNyZWF0ZVByb3RlY3RlZFNjb3BlKHJhd1Njb3BlIGFzIG9iamVjdCwge1xuICAgICAgICAgIG1vZGU6IHRoaXMuZGVwcy5zY29wZVByb3RlY3Rpb25Nb2RlLFxuICAgICAgICAgIHN0YWdlTmFtZTogbm9kZS5uYW1lLFxuICAgICAgICB9KSBhcyBUU2NvcGUpO1xuXG4gICAgLy8gU2V0IHVwIHN0cmVhbWluZyBjYWxsYmFjayBpZiB0aGlzIGlzIGEgc3RyZWFtaW5nIHN0YWdlXG4gICAgbGV0IHN0cmVhbUNhbGxiYWNrOiBTdHJlYW1DYWxsYmFjayB8IHVuZGVmaW5lZDtcbiAgICBsZXQgYWNjdW11bGF0ZWRUZXh0ID0gJyc7XG5cbiAgICBpZiAobm9kZS5pc1N0cmVhbWluZykge1xuICAgICAgY29uc3Qgc3RyZWFtSWQgPSBub2RlLnN0cmVhbUlkID8/IG5vZGUubmFtZTtcbiAgICAgIHN0cmVhbUNhbGxiYWNrID0gKHRva2VuOiBzdHJpbmcpID0+IHtcbiAgICAgICAgYWNjdW11bGF0ZWRUZXh0ICs9IHRva2VuO1xuICAgICAgICB0aGlzLmRlcHMuc3RyZWFtSGFuZGxlcnM/Lm9uVG9rZW4/LihzdHJlYW1JZCwgdG9rZW4pO1xuICAgICAgfTtcbiAgICAgIHRoaXMuZGVwcy5zdHJlYW1IYW5kbGVycz8ub25TdGFydD8uKHN0cmVhbUlkKTtcbiAgICB9XG5cbiAgICBydW50aW1lLnNldEJyZWFrPy4oYnJlYWtGbik7XG5cbiAgICAvLyBOb3RpZnkgcmVjb3JkZXJzIG9mIHN0YWdlIHN0YXJ0IChpZiBzY29wZSBzdXBwb3J0cyBpdClcbiAgICBydW50aW1lLnRhcmdldC5ub3RpZnlTdGFnZVN0YXJ0Py4oKTtcblxuICAgIC8vIOKUgOKUgCBFeGVjdXRlIHRoZSBzdGFnZSBmdW5jdGlvbiDilIDilIBcbiAgICAvL1xuICAgIC8vIFRIRSBzdGFnZSBib3VuZGFyeSBmb3IgYGludGVycnVwdCgpYCAoZGVzaWduOiBkb2NzL2Rlc2lnbi9leGVjdXRpb24tY29udHJvbC5tZFxuICAgIC8vIEQzKS4gRXZlcnkgc3RhZ2UgZnVuY3Rpb24gaW4gdGhlIGVuZ2luZSBmdW5uZWxzIHRocm91Z2ggdGhpcyBvbmUgY2FsbCDigJRcbiAgICAvLyBsaW5lYXIgc3RhZ2VzLCBkZWNpZGVyIGFuZCBzZWxlY3RvciBzdGFnZXMgKHRoZWlyIGhhbmRsZXJzIGFyZSBoYW5kZWRcbiAgICAvLyBgZXhlY3V0ZVN0YWdlYCksIGZvcmsgY2hpbGRyZW4sIHN1YmZsb3cgYm9kaWVzIOKAlCBzbyBjb252ZXJ0aW5nIGhlcmUgaXNcbiAgICAvLyB3aGF0IG1ha2VzIGBpbnRlcnJ1cHQoKWAgd29yayBpbiBBTEwgb2YgdGhlbS4gQ2F0Y2hpbmcgaXQgaW4gYSB0cmF2ZXJzZXJcbiAgICAvLyBwaGFzZSBpbnN0ZWFkIHdvdWxkIGhhdmUgbGVmdCBkZWNpZGVyL3NlbGVjdG9yIHN0YWdlcyBzaWxlbnRseSB1bmFibGUgdG9cbiAgICAvLyBpbnRlcnJ1cHQuXG4gICAgLy9cbiAgICAvLyBUaGUgY29udmVyc2lvbiBpcyBkZWxpYmVyYXRlbHkgdG90YWw6IGFuIEludGVycnVwdFNpZ25hbCBiZWNvbWVzIHRoZVxuICAgIC8vIGxpYnJhcnkncyBleGlzdGluZyBQYXVzZVNpZ25hbCwgc3RhbXBlZCB3aXRoIHRoZSBub2RlIGlkIHRoZSBmcmVlXG4gICAgLy8gZnVuY3Rpb24gY291bGQgbm90IGtub3cgYW5kIHdpdGggYHBhdXNlZEJ5OiAnaW50ZXJydXB0J2Agc28gcmVzdW1lKClcbiAgICAvLyByZS1lbnRlcnMgdGhlIHN0YWdlIGZyb20gaXRzIHRvcC4gRXZlcnl0aGluZyBkb3duc3RyZWFtIOKAlCBjb21taXQtdGhlbi1cbiAgICAvLyByZXRocm93LCBvblBhdXNlLCBzdWJmbG93IHNjb3BlIGNhcHR1cmUsIGludm9rZXIgc3RhbXBpbmcsIHRoZSBvbmVcbiAgICAvLyBkZXRhY2hlZCBjaGVja3BvaW50IGNsb25lIOKAlCBpcyB0aGUgc2hpcHBlZCBwYXVzZSBtYWNoaW5lcnksIHVudG91Y2hlZC5cbiAgICAvL1xuICAgIC8vIGBub3RpZnlTdGFnZUVuZGAgZGVsaWJlcmF0ZWx5IGRvZXMgTk9UIGZpcmUgb24gdGhpcyBwYXRoOiB0aGUgc3RhZ2VcbiAgICAvLyBmdW5jdGlvbiBkaWQgbm90IHJldHVybiwgZXhhY3RseSBsaWtlIHRoZSBlcnJvciBwYXRoIGJlbG93IGl0LiAoVGhlXG4gICAgLy8gcGF1c2FibGUtaGFuZGxlciBwYXRoIGZ1cnRoZXIgZG93biBET0VTIGZpcmUgaXQg4oCUIHRoZXJlIHRoZSBmdW5jdGlvblxuICAgIC8vIHJldHVybmVkIG5vcm1hbGx5IGFuZCB0aGUgZW5naW5lIHR1cm5lZCBpdHMgdmFsdWUgaW50byBhIHBhdXNlLilcbiAgICBsZXQgcmVzdWx0OiBUT3V0O1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBvdXRwdXQgPSBzdGFnZUZ1bmMoc2NvcGUsIGJyZWFrRm4sIHN0cmVhbUNhbGxiYWNrKTtcblxuICAgICAgLy8gU3luYythc3luYyBzYWZldHk6IG9ubHkgYXdhaXQgcmVhbCBQcm9taXNlcyB0byBhdm9pZCB0aGVuYWJsZSBhc3NpbWlsYXRpb25cbiAgICAgIGlmIChvdXRwdXQgaW5zdGFuY2VvZiBQcm9taXNlKSB7XG4gICAgICAgIC8vIFJhY2UgYWdhaW5zdCBBYm9ydFNpZ25hbCBpZiBwcm92aWRlZFxuICAgICAgICBpZiAodGhpcy5kZXBzLnNpZ25hbCkge1xuICAgICAgICAgIHJlc3VsdCA9IChhd2FpdCByYWNlQWJvcnQob3V0cHV0LCB0aGlzLmRlcHMuc2lnbmFsKSkgYXMgVE91dDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXN1bHQgPSAoYXdhaXQgb3V0cHV0KSBhcyBUT3V0O1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXN1bHQgPSBvdXRwdXQgYXMgVE91dDtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnJvcjogdW5rbm93bikge1xuICAgICAgaWYgKGlzSW50ZXJydXB0U2lnbmFsKGVycm9yKSkge1xuICAgICAgICBydW50aW1lLnRhcmdldC5ub3RpZnlQYXVzZT8uKGVycm9yLnBheWxvYWQpO1xuICAgICAgICB0aHJvdyBzdGFtcGVkUGF1c2UobmV3IFBhdXNlU2lnbmFsKGVycm9yLnBheWxvYWQsIG5vZGUuaWQsICdpbnRlcnJ1cHQnKSwgY29udGV4dCk7XG4gICAgICB9XG4gICAgICBpZiAoaXNQYXVzZVNpZ25hbChlcnJvcikgJiYgZXJyb3IgaW5zdGFuY2VvZiBQYXVzZVNpZ25hbCkgc3RhbXBlZFBhdXNlKGVycm9yLCBjb250ZXh0KTtcbiAgICAgIHRocm93IGVycm9yO1xuICAgIH1cblxuICAgIC8vIE5vdGlmeSByZWNvcmRlcnMgb2Ygc3RhZ2UgZW5kIChpZiBzY29wZSBzdXBwb3J0cyBpdClcbiAgICBydW50aW1lLnRhcmdldC5ub3RpZnlTdGFnZUVuZD8uKCk7XG5cbiAgICAvLyBDYWxsIG9uRW5kIGxpZmVjeWNsZSBob29rIGZvciBzdHJlYW1pbmcgc3RhZ2VzXG4gICAgaWYgKG5vZGUuaXNTdHJlYW1pbmcpIHtcbiAgICAgIGNvbnN0IHN0cmVhbUlkID0gbm9kZS5zdHJlYW1JZCA/PyBub2RlLm5hbWU7XG4gICAgICB0aGlzLmRlcHMuc3RyZWFtSGFuZGxlcnM/Lm9uRW5kPy4oc3RyZWFtSWQsIGFjY3VtdWxhdGVkVGV4dCk7XG4gICAgfVxuXG4gICAgLy8g4pSA4pSAIFBhdXNlIGRldGVjdGlvbiDilIDilIBcbiAgICAvLyBQYXVzYWJsZSBzdGFnZXM6IGFueSBub24tdm9pZCByZXR1cm4gPSBwYXVzZSB3aXRoIHRoYXQgZGF0YS5cbiAgICAvLyBBbHNvIHN1cHBvcnRzIGV4cGxpY2l0IHBhdXNlKHsgLi4uIH0pIGZvciBiYWNrd2FyZCBjb21wYXQuXG4gICAgaWYgKG5vZGUuaXNQYXVzYWJsZSAmJiByZXN1bHQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgY29uc3QgcGF1c2VEYXRhID0gaXNQYXVzZVJlc3VsdChyZXN1bHQpID8gKHJlc3VsdCBhcyBhbnkpLmRhdGEgOiByZXN1bHQ7XG4gICAgICAvLyBOb3RpZnkgc2NvcGUgcmVjb3JkZXJzIGJlZm9yZSB0aHJvd2luZ1xuICAgICAgcnVudGltZS50YXJnZXQubm90aWZ5UGF1c2U/LihwYXVzZURhdGEpO1xuICAgICAgdGhyb3cgc3RhbXBlZFBhdXNlKG5ldyBQYXVzZVNpZ25hbChwYXVzZURhdGEsIG5vZGUuaWQpLCBjb250ZXh0KTtcbiAgICB9XG5cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG59XG5cbi8qKlxuICogUmVjb3JkIFdISUNIIGV4ZWN1dGlvbiBwYXVzZWQgb24gdGhlIHNpZ25hbCAoZmlyc3Qgc3RhbXAgd2lucykg4oCUIHRoZSBzdGFnZVxuICogYm91bmRhcnkgaXMgdGhlIG9uZSBwbGFjZSB0aGF0IGtub3dzIGl0cyBydW50aW1lU3RhZ2VJZCAodGhlIHJ1biBpcyBhZGRlZFxuICogd2hlbiB0aGUgY2hlY2twb2ludCBpcyBidWlsdCDigJQgYFBhdXNlU2lnbmFsIMK3IGNvbXBsZXRlRXhlY3V0aW9uYCk7IHRoZVxuICogY2hlY2twb2ludCBjYXJyaWVzIGl0IHNvIGEgcmVzdW1lIGNhbiBsaW5rIHRvIHRoZSBwYXVzZWQgZXhlY3V0aW9uXG4gKiAoYFRyYXZlcnNhbENvbnRleHQucmVzdW1lZEZyb21gKS4gU3luY2hyb25vdXMgb24gcHVycG9zZTogYW4gZXh0cmEgYXdhaXRcbiAqIGhlcmUgd291bGQgcmVvcmRlciBwYXJhbGxlbCBzaWJsaW5ncycgbWljcm90YXNrcy5cbiAqL1xuZnVuY3Rpb24gc3RhbXBlZFBhdXNlKHNpZ25hbDogUGF1c2VTaWduYWwsIGNvbnRleHQ6IFN0YWdlQ29udGV4dCk6IFBhdXNlU2lnbmFsIHtcbiAgc2lnbmFsLnN0YW1wRXhlY3V0aW9uKGNvbnRleHQucnVudGltZVN0YWdlSWQpO1xuICByZXR1cm4gc2lnbmFsO1xufVxuXG4vKiogUmFjZSBhIHByb21pc2UgYWdhaW5zdCBhbiBBYm9ydFNpZ25hbC4gUmVqZWN0cyB3aXRoIHRoZSBzaWduYWwncyByZWFzb24gb24gYWJvcnQuICovXG5mdW5jdGlvbiByYWNlQWJvcnQ8VD4ocHJvbWlzZTogUHJvbWlzZTxUPiwgc2lnbmFsOiBBYm9ydFNpZ25hbCk6IFByb21pc2U8VD4ge1xuICBpZiAoc2lnbmFsLmFib3J0ZWQpIHtcbiAgICByZXR1cm4gUHJvbWlzZS5yZWplY3Qoc2lnbmFsLnJlYXNvbiBpbnN0YW5jZW9mIEVycm9yID8gc2lnbmFsLnJlYXNvbiA6IG5ldyBFcnJvcihzaWduYWwucmVhc29uID8/ICdBYm9ydGVkJykpO1xuICB9XG4gIHJldHVybiBuZXcgUHJvbWlzZTxUPigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgY29uc3Qgb25BYm9ydCA9ICgpID0+XG4gICAgICByZWplY3Qoc2lnbmFsLnJlYXNvbiBpbnN0YW5jZW9mIEVycm9yID8gc2lnbmFsLnJlYXNvbiA6IG5ldyBFcnJvcihzaWduYWwucmVhc29uID8/ICdBYm9ydGVkJykpO1xuICAgIHNpZ25hbC5hZGRFdmVudExpc3RlbmVyKCdhYm9ydCcsIG9uQWJvcnQsIHsgb25jZTogdHJ1ZSB9KTtcbiAgICBwcm9taXNlLnRoZW4oXG4gICAgICAodmFsKSA9PiB7XG4gICAgICAgIHNpZ25hbC5yZW1vdmVFdmVudExpc3RlbmVyKCdhYm9ydCcsIG9uQWJvcnQpO1xuICAgICAgICByZXNvbHZlKHZhbCk7XG4gICAgICB9LFxuICAgICAgKGVycikgPT4ge1xuICAgICAgICBzaWduYWwucmVtb3ZlRXZlbnRMaXN0ZW5lcignYWJvcnQnLCBvbkFib3J0KTtcbiAgICAgICAgcmVqZWN0KGVycik7XG4gICAgICB9LFxuICAgICk7XG4gIH0pO1xufVxuIl19
141
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU3RhZ2VSdW5uZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9zcmMvbGliL2VuZ2luZS9oYW5kbGVycy9TdGFnZVJ1bm5lci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7R0FRRztBQUdILE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQzdELE9BQU8sRUFBRSxhQUFhLEVBQUUsYUFBYSxFQUFFLFdBQVcsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQ2pGLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLGdEQUFnRCxDQUFDO0FBQ3RGLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBRzdELE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUUvQyxNQUFNLE9BQU8sV0FBVztJQUNPO0lBQTdCLFlBQTZCLElBQStCO1FBQS9CLFNBQUksR0FBSixJQUFJLENBQTJCO0lBQUcsQ0FBQztJQUVoRSxLQUFLLENBQUMsR0FBRyxDQUNQLElBQTZCLEVBQzdCLFNBQXNDLEVBQ3RDLE9BQXFCLEVBQ3JCLE9BQW1CO1FBRW5CLHlFQUF5RTtRQUN6RSxNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDLGVBQWUsRUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDO1FBQy9HLE1BQU0sT0FBTyxHQUFHLG1CQUFtQixDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBRTlDLHVFQUF1RTtRQUN2RSw4RUFBOEU7UUFDOUUsTUFBTSxLQUFLLEdBQUcsT0FBTyxDQUFDLGtCQUFrQjtZQUN0QyxDQUFDLENBQUMsUUFBUTtZQUNWLENBQUMsQ0FBRSxvQkFBb0IsQ0FBQyxRQUFrQixFQUFFO2dCQUN4QyxJQUFJLEVBQUUsSUFB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TSxJQUFJLFNBQVMsQ0FBQyxDQUFDLENBQUM7SUFDaEgsQ0FBQztJQUNELE9BQU8sSUFBSSxPQUFPLENBQUksQ0FBQyxPQUFPLEVBQUUsTUFBTSxFQUFFLEVBQUU7UUFDeEMsTUFBTSxPQUFPLEdBQUcsR0FBRyxFQUFFLENBQ25CLE1BQU0sQ0FBQyxNQUFNLENBQUMsTUFBTSxZQUFZLEtBQUssQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsSUFBSSxLQUFLLENBQUMsTUFBTSxDQUFDLE1BQU0sSUFBSSxTQUFTLENBQUMsQ0FBQyxDQUFDO1FBQ2pHLE1BQU0sQ0FBQyxnQkFBZ0IsQ0FBQyxPQUFPLEVBQUUsT0FBTyxFQUFFLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7UUFDMUQsT0FBTyxDQUFDLElBQUksQ0FDVixDQUFDLEdBQUcsRUFBRSxFQUFFO1lBQ04sTUFBTSxDQUFDLG1CQUFtQixDQUFDLE9BQU8sRUFBRSxPQUFPLENBQUMsQ0FBQztZQUM3QyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDZixDQUFDLEVBQ0QsQ0FBQyxHQUFHLEVBQUUsRUFBRTtZQUNOLE1BQU0sQ0FBQyxtQkFBbUIsQ0FBQyxPQUFPLEVBQUUsT0FBTyxDQUFDLENBQUM7WUFDN0MsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ2QsQ0FBQyxDQUNGLENBQUM7SUFDSixDQUFDLENBQUMsQ0FBQztBQUNMLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIFN0YWdlUnVubmVyIOKAlCBFeGVjdXRlcyBpbmRpdmlkdWFsIHN0YWdlIGZ1bmN0aW9ucy5cbiAqXG4gKiBSZXNwb25zaWJpbGl0aWVzOlxuICogLSBDcmVhdGUgc2NvcGUgdmlhIFNjb3BlRmFjdG9yeSBmb3IgZWFjaCBzdGFnZVxuICogLSBBcHBseSBzY29wZSBwcm90ZWN0aW9uIChjcmVhdGVQcm90ZWN0ZWRTY29wZSkgdG8gaW50ZXJjZXB0IGRpcmVjdCBhc3NpZ25tZW50c1xuICogLSBIYW5kbGUgc3RyZWFtaW5nIHN0YWdlcyAob25TdGFydCwgb25Ub2tlbiwgb25FbmQgbGlmZWN5Y2xlKVxuICogLSBTeW5jK2FzeW5jIHNhZmV0eTogb25seSBhd2FpdCByZWFsIFByb21pc2VzIChpbnN0YW5jZW9mIGNoZWNrKVxuICovXG5cbmltcG9ydCB0eXBlIHsgU3RhZ2VDb250ZXh0IH0gZnJvbSAnLi4vLi4vbWVtb3J5L1N0YWdlQ29udGV4dC5qcyc7XG5pbXBvcnQgeyBpc0ludGVycnVwdFNpZ25hbCB9IGZyb20gJy4uLy4uL3BhdXNlL2ludGVycnVwdC5qcyc7XG5pbXBvcnQgeyBpc1BhdXNlUmVzdWx0LCBpc1BhdXNlU2lnbmFsLCBQYXVzZVNpZ25hbCB9IGZyb20gJy4uLy4uL3BhdXNlL3R5cGVzLmpzJztcbmltcG9ydCB7IGNyZWF0ZVByb3RlY3RlZFNjb3BlIH0gZnJvbSAnLi4vLi4vc2NvcGUvcHJvdGVjdGlvbi9jcmVhdGVQcm90ZWN0ZWRTY29wZS5qcyc7XG5pbXBvcnQgeyByZXF1aXJlU2NvcGVSdW50aW1lIH0gZnJvbSAnLi4vLi4vc2NvcGUvcnVudGltZS5qcyc7XG5pbXBvcnQgdHlwZSB7IFN0YWdlTm9kZSB9IGZyb20gJy4uL2dyYXBoL1N0YWdlTm9kZS5qcyc7XG5pbXBvcnQgdHlwZSB7IEhhbmRsZXJEZXBzLCBTdGFnZUZ1bmN0aW9uLCBTdHJlYW1DYWxsYmFjayB9IGZyb20gJy4uL3R5cGVzLmpzJztcbmltcG9ydCB7IHNlcnZlZFBhdXNlIH0gZnJvbSAnLi9zZXJ2ZWRQYXVzZS5qcyc7XG5cbmV4cG9ydCBjbGFzcyBTdGFnZVJ1bm5lcjxUT3V0ID0gYW55LCBUU2NvcGUgPSBhbnk+IHtcbiAgY29uc3RydWN0b3IocHJpdmF0ZSByZWFkb25seSBkZXBzOiBIYW5kbGVyRGVwczxUT3V0LCBUU2NvcGU+KSB7fVxuXG4gIGFzeW5jIHJ1bihcbiAgICBub2RlOiBTdGFnZU5vZGU8VE91dCwgVFNjb3BlPixcbiAgICBzdGFnZUZ1bmM6IFN0YWdlRnVuY3Rpb248VE91dCwgVFNjb3BlPixcbiAgICBjb250ZXh0OiBTdGFnZUNvbnRleHQsXG4gICAgYnJlYWtGbjogKCkgPT4gdm9pZCxcbiAgKTogUHJvbWlzZTxUT3V0PiB7XG4gICAgLy8gQ3JlYXRlIHNjb3BlIHZpYSBTY29wZUZhY3Rvcnkg4oCUIGVhY2ggc3RhZ2UgZ2V0cyBpdHMgb3duIHNjb3BlIGluc3RhbmNlXG4gICAgY29uc3QgcmF3U2NvcGUgPSB0aGlzLmRlcHMuc2NvcGVGYWN0b3J5KGNvbnRleHQsIG5vZGUubmFtZSwgdGhpcy5kZXBzLnJlYWRPbmx5Q29udGV4dCwgdGhpcy5kZXBzLmV4ZWN1dGlvbkVudik7XG4gICAgY29uc3QgcnVudGltZSA9IHJlcXVpcmVTY29wZVJ1bnRpbWUocmF3U2NvcGUpO1xuXG4gICAgLy8gV3JhcCBzY29wZSB3aXRoIHByb3RlY3Rpb24gdG8gaW50ZXJjZXB0IGRpcmVjdCBwcm9wZXJ0eSBhc3NpZ25tZW50cy5cbiAgICAvLyBQcm92aWRlcnMgZGVjbGFyZSB3aGV0aGVyIHRoZWlyIG93biBhc3NpZ25tZW50IHRyYXBzIGFscmVhZHkgbWFuYWdlIHdyaXRlcy5cbiAgICBjb25zdCBzY29wZSA9IHJ1bnRpbWUuaGFuZGxlc0Fzc2lnbm1lbnRzXG4gICAgICA/IHJhd1Njb3BlXG4gICAgICA6IChjcmVhdGVQcm90ZWN0ZWRTY29wZShyYXdTY29wZSBhcyBvYmplY3QsIHtcbiAgICAgICAgICBtb2RlOiB0aGlzLmRlcHMuc2NvcGVQcm90ZWN0aW9uTW9kZSxcbiAgICAgICAgICBzdGFnZU5hbWU6IG5vZGUubmFtZSxcbiAgICAgICAgfSkgYXMgVFNjb3BlKTtcblxuICAgIC8vIFNldCB1cCBzdHJlYW1pbmcgY2FsbGJhY2sgaWYgdGhpcyBpcyBhIHN0cmVhbWluZyBzdGFnZVxuICAgIGxldCBzdHJlYW1DYWxsYmFjazogU3RyZWFtQ2FsbGJhY2sgfCB1bmRlZmluZWQ7XG4gICAgbGV0IGFjY3VtdWxhdGVkVGV4dCA9ICcnO1xuXG4gICAgaWYgKG5vZGUuaXNTdHJlYW1pbmcpIHtcbiAgICAgIGNvbnN0IHN0cmVhbUlkID0gbm9kZS5zdHJlYW1JZCA/PyBub2RlLm5hbWU7XG4gICAgICBzdHJlYW1DYWxsYmFjayA9ICh0b2tlbjogc3RyaW5nKSA9PiB7XG4gICAgICAgIGFjY3VtdWxhdGVkVGV4dCArPSB0b2tlbjtcbiAgICAgICAgdGhpcy5kZXBzLnN0cmVhbUhhbmRsZXJzPy5vblRva2VuPy4oc3RyZWFtSWQsIHRva2VuKTtcbiAgICAgIH07XG4gICAgICB0aGlzLmRlcHMuc3RyZWFtSGFuZGxlcnM/Lm9uU3RhcnQ/LihzdHJlYW1JZCk7XG4gICAgfVxuXG4gICAgcnVudGltZS5zZXRCcmVhaz8uKGJyZWFrRm4pO1xuXG4gICAgLy8gTm90aWZ5IHJlY29yZGVycyBvZiBzdGFnZSBzdGFydCAoaWYgc2NvcGUgc3VwcG9ydHMgaXQpXG4gICAgcnVudGltZS50YXJnZXQubm90aWZ5U3RhZ2VTdGFydD8uKCk7XG5cbiAgICAvLyDilIDilIAgRXhlY3V0ZSB0aGUgc3RhZ2UgZnVuY3Rpb24g4pSA4pSAXG4gICAgLy9cbiAgICAvLyBUSEUgc3RhZ2UgYm91bmRhcnkgZm9yIGBpbnRlcnJ1cHQoKWAgKGRlc2lnbjogZG9jcy9kZXNpZ24vZXhlY3V0aW9uLWNvbnRyb2wubWRcbiAgICAvLyBEMykuIEV2ZXJ5IHN0YWdlIGZ1bmN0aW9uIGluIHRoZSBlbmdpbmUgZnVubmVscyB0aHJvdWdoIHRoaXMgb25lIGNhbGwg4oCUXG4gICAgLy8gbGluZWFyIHN0YWdlcywgZGVjaWRlciBhbmQgc2VsZWN0b3Igc3RhZ2VzICh0aGVpciBoYW5kbGVycyBhcmUgaGFuZGVkXG4gICAgLy8gYGV4ZWN1dGVTdGFnZWApLCBmb3JrIGNoaWxkcmVuLCBzdWJmbG93IGJvZGllcyDigJQgc28gY29udmVydGluZyBoZXJlIGlzXG4gICAgLy8gd2hhdCBtYWtlcyBgaW50ZXJydXB0KClgIHdvcmsgaW4gQUxMIG9mIHRoZW0uIENhdGNoaW5nIGl0IGluIGEgdHJhdmVyc2VyXG4gICAgLy8gcGhhc2UgaW5zdGVhZCB3b3VsZCBoYXZlIGxlZnQgZGVjaWRlci9zZWxlY3RvciBzdGFnZXMgc2lsZW50bHkgdW5hYmxlIHRvXG4gICAgLy8gaW50ZXJydXB0LlxuICAgIC8vXG4gICAgLy8gVGhlIGNvbnZlcnNpb24gaXMgZGVsaWJlcmF0ZWx5IHRvdGFsOiBhbiBJbnRlcnJ1cHRTaWduYWwgYmVjb21lcyB0aGVcbiAgICAvLyBsaWJyYXJ5J3MgZXhpc3RpbmcgUGF1c2VTaWduYWwsIHN0YW1wZWQgd2l0aCB0aGUgbm9kZSBpZCB0aGUgZnJlZVxuICAgIC8vIGZ1bmN0aW9uIGNvdWxkIG5vdCBrbm93IGFuZCB3aXRoIGBwYXVzZWRCeTogJ2ludGVycnVwdCdgIHNvIHJlc3VtZSgpXG4gICAgLy8gcmUtZW50ZXJzIHRoZSBzdGFnZSBmcm9tIGl0cyB0b3AuIEV2ZXJ5dGhpbmcgZG93bnN0cmVhbSDigJQgY29tbWl0LXRoZW4tXG4gICAgLy8gcmV0aHJvdywgb25QYXVzZSwgc3ViZmxvdyBzY29wZSBjYXB0dXJlLCBpbnZva2VyIHN0YW1waW5nLCB0aGUgb25lXG4gICAgLy8gZGV0YWNoZWQgY2hlY2twb2ludCBjbG9uZSDigJQgaXMgdGhlIHNoaXBwZWQgcGF1c2UgbWFjaGluZXJ5LCB1bnRvdWNoZWQuXG4gICAgLy9cbiAgICAvLyBgbm90aWZ5U3RhZ2VFbmRgIGRlbGliZXJhdGVseSBkb2VzIE5PVCBmaXJlIG9uIHRoaXMgcGF0aDogdGhlIHN0YWdlXG4gICAgLy8gZnVuY3Rpb24gZGlkIG5vdCByZXR1cm4sIGV4YWN0bHkgbGlrZSB0aGUgZXJyb3IgcGF0aCBiZWxvdyBpdC4gKFRoZVxuICAgIC8vIHBhdXNhYmxlLWhhbmRsZXIgcGF0aCBmdXJ0aGVyIGRvd24gRE9FUyBmaXJlIGl0IOKAlCB0aGVyZSB0aGUgZnVuY3Rpb25cbiAgICAvLyByZXR1cm5lZCBub3JtYWxseSBhbmQgdGhlIGVuZ2luZSB0dXJuZWQgaXRzIHZhbHVlIGludG8gYSBwYXVzZS4pXG4gICAgbGV0IHJlc3VsdDogVE91dDtcbiAgICB0cnkge1xuICAgICAgY29uc3Qgb3V0cHV0ID0gc3RhZ2VGdW5jKHNjb3BlLCBicmVha0ZuLCBzdHJlYW1DYWxsYmFjayk7XG5cbiAgICAgIC8vIFN5bmMrYXN5bmMgc2FmZXR5OiBvbmx5IGF3YWl0IHJlYWwgUHJvbWlzZXMgdG8gYXZvaWQgdGhlbmFibGUgYXNzaW1pbGF0aW9uXG4gICAgICBpZiAob3V0cHV0IGluc3RhbmNlb2YgUHJvbWlzZSkge1xuICAgICAgICAvLyBSYWNlIGFnYWluc3QgQWJvcnRTaWduYWwgaWYgcHJvdmlkZWRcbiAgICAgICAgaWYgKHRoaXMuZGVwcy5zaWduYWwpIHtcbiAgICAgICAgICByZXN1bHQgPSAoYXdhaXQgcmFjZUFib3J0KG91dHB1dCwgdGhpcy5kZXBzLnNpZ25hbCkpIGFzIFRPdXQ7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmVzdWx0ID0gKGF3YWl0IG91dHB1dCkgYXMgVE91dDtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmVzdWx0ID0gb3V0cHV0IGFzIFRPdXQ7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyb3I6IHVua25vd24pIHtcbiAgICAgIGlmIChpc0ludGVycnVwdFNpZ25hbChlcnJvcikpIHtcbiAgICAgICAgcnVudGltZS50YXJnZXQubm90aWZ5UGF1c2U/LihzZXJ2ZWRQYXVzZShjb250ZXh0LCBlcnJvci5wYXlsb2FkKSk7XG4gICAgICAgIHRocm93IHN0YW1wZWRQYXVzZShuZXcgUGF1c2VTaWduYWwoZXJyb3IucGF5bG9hZCwgbm9kZS5pZCwgJ2ludGVycnVwdCcpLCBjb250ZXh0KTtcbiAgICAgIH1cbiAgICAgIGlmIChpc1BhdXNlU2lnbmFsKGVycm9yKSAmJiBlcnJvciBpbnN0YW5jZW9mIFBhdXNlU2lnbmFsKSBzdGFtcGVkUGF1c2UoZXJyb3IsIGNvbnRleHQpO1xuICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfVxuXG4gICAgLy8gTm90aWZ5IHJlY29yZGVycyBvZiBzdGFnZSBlbmQgKGlmIHNjb3BlIHN1cHBvcnRzIGl0KVxuICAgIHJ1bnRpbWUudGFyZ2V0Lm5vdGlmeVN0YWdlRW5kPy4oKTtcblxuICAgIC8vIENhbGwgb25FbmQgbGlmZWN5Y2xlIGhvb2sgZm9yIHN0cmVhbWluZyBzdGFnZXNcbiAgICBpZiAobm9kZS5pc1N0cmVhbWluZykge1xuICAgICAgY29uc3Qgc3RyZWFtSWQgPSBub2RlLnN0cmVhbUlkID8/IG5vZGUubmFtZTtcbiAgICAgIHRoaXMuZGVwcy5zdHJlYW1IYW5kbGVycz8ub25FbmQ/LihzdHJlYW1JZCwgYWNjdW11bGF0ZWRUZXh0KTtcbiAgICB9XG5cbiAgICAvLyDilIDilIAgUGF1c2UgZGV0ZWN0aW9uIOKUgOKUgFxuICAgIC8vIFBhdXNhYmxlIHN0YWdlczogYW55IG5vbi12b2lkIHJldHVybiA9IHBhdXNlIHdpdGggdGhhdCBkYXRhLlxuICAgIC8vIEFsc28gc3VwcG9ydHMgZXhwbGljaXQgcGF1c2UoeyAuLi4gfSkgZm9yIGJhY2t3YXJkIGNvbXBhdC5cbiAgICBpZiAobm9kZS5pc1BhdXNhYmxlICYmIHJlc3VsdCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBjb25zdCBwYXVzZURhdGEgPSBpc1BhdXNlUmVzdWx0KHJlc3VsdCkgPyAocmVzdWx0IGFzIGFueSkuZGF0YSA6IHJlc3VsdDtcbiAgICAgIC8vIE5vdGlmeSBzY29wZSByZWNvcmRlcnMgYmVmb3JlIHRocm93aW5nXG4gICAgICBydW50aW1lLnRhcmdldC5ub3RpZnlQYXVzZT8uKHNlcnZlZFBhdXNlKGNvbnRleHQsIHBhdXNlRGF0YSkpO1xuICAgICAgdGhyb3cgc3RhbXBlZFBhdXNlKG5ldyBQYXVzZVNpZ25hbChwYXVzZURhdGEsIG5vZGUuaWQpLCBjb250ZXh0KTtcbiAgICB9XG5cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG59XG5cbi8qKlxuICogUmVjb3JkIFdISUNIIGV4ZWN1dGlvbiBwYXVzZWQgb24gdGhlIHNpZ25hbCAoZmlyc3Qgc3RhbXAgd2lucykg4oCUIHRoZSBzdGFnZVxuICogYm91bmRhcnkgaXMgdGhlIG9uZSBwbGFjZSB0aGF0IGtub3dzIGl0cyBydW50aW1lU3RhZ2VJZCAodGhlIHJ1biBpcyBhZGRlZFxuICogd2hlbiB0aGUgY2hlY2twb2ludCBpcyBidWlsdCDigJQgYFBhdXNlU2lnbmFsIMK3IGNvbXBsZXRlRXhlY3V0aW9uYCk7IHRoZVxuICogY2hlY2twb2ludCBjYXJyaWVzIGl0IHNvIGEgcmVzdW1lIGNhbiBsaW5rIHRvIHRoZSBwYXVzZWQgZXhlY3V0aW9uXG4gKiAoYFRyYXZlcnNhbENvbnRleHQucmVzdW1lZEZyb21gKS4gU3luY2hyb25vdXMgb24gcHVycG9zZTogYW4gZXh0cmEgYXdhaXRcbiAqIGhlcmUgd291bGQgcmVvcmRlciBwYXJhbGxlbCBzaWJsaW5ncycgbWljcm90YXNrcy5cbiAqL1xuZnVuY3Rpb24gc3RhbXBlZFBhdXNlKHNpZ25hbDogUGF1c2VTaWduYWwsIGNvbnRleHQ6IFN0YWdlQ29udGV4dCk6IFBhdXNlU2lnbmFsIHtcbiAgc2lnbmFsLnN0YW1wRXhlY3V0aW9uKGNvbnRleHQucnVudGltZVN0YWdlSWQpO1xuICByZXR1cm4gc2lnbmFsO1xufVxuXG4vKiogUmFjZSBhIHByb21pc2UgYWdhaW5zdCBhbiBBYm9ydFNpZ25hbC4gUmVqZWN0cyB3aXRoIHRoZSBzaWduYWwncyByZWFzb24gb24gYWJvcnQuICovXG5mdW5jdGlvbiByYWNlQWJvcnQ8VD4ocHJvbWlzZTogUHJvbWlzZTxUPiwgc2lnbmFsOiBBYm9ydFNpZ25hbCk6IFByb21pc2U8VD4ge1xuICBpZiAoc2lnbmFsLmFib3J0ZWQpIHtcbiAgICByZXR1cm4gUHJvbWlzZS5yZWplY3Qoc2lnbmFsLnJlYXNvbiBpbnN0YW5jZW9mIEVycm9yID8gc2lnbmFsLnJlYXNvbiA6IG5ldyBFcnJvcihzaWduYWwucmVhc29uID8/ICdBYm9ydGVkJykpO1xuICB9XG4gIHJldHVybiBuZXcgUHJvbWlzZTxUPigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgY29uc3Qgb25BYm9ydCA9ICgpID0+XG4gICAgICByZWplY3Qoc2lnbmFsLnJlYXNvbiBpbnN0YW5jZW9mIEVycm9yID8gc2lnbmFsLnJlYXNvbiA6IG5ldyBFcnJvcihzaWduYWwucmVhc29uID8/ICdBYm9ydGVkJykpO1xuICAgIHNpZ25hbC5hZGRFdmVudExpc3RlbmVyKCdhYm9ydCcsIG9uQWJvcnQsIHsgb25jZTogdHJ1ZSB9KTtcbiAgICBwcm9taXNlLnRoZW4oXG4gICAgICAodmFsKSA9PiB7XG4gICAgICAgIHNpZ25hbC5yZW1vdmVFdmVudExpc3RlbmVyKCdhYm9ydCcsIG9uQWJvcnQpO1xuICAgICAgICByZXNvbHZlKHZhbCk7XG4gICAgICB9LFxuICAgICAgKGVycikgPT4ge1xuICAgICAgICBzaWduYWwucmVtb3ZlRXZlbnRMaXN0ZW5lcignYWJvcnQnLCBvbkFib3J0KTtcbiAgICAgICAgcmVqZWN0KGVycik7XG4gICAgICB9LFxuICAgICk7XG4gIH0pO1xufVxuIl19