inspector-ng 0.0.11 → 0.0.13

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.
package/README.md CHANGED
@@ -52,7 +52,7 @@ Place `<inspector-overlay>` in your root template (e.g. `app.component.html`). I
52
52
  ></inspector-overlay>
53
53
  ```
54
54
 
55
- ### Step 3: Press `M` to toggle the inspector
55
+ ### Step 3: Open the command palette
56
56
 
57
57
  That's it. Press **`Ctrl/Cmd + Shift + P`** in your browser to open the Inspector command palette. No further configuration is required.
58
58
 
@@ -74,7 +74,7 @@ export const appConfig: ApplicationConfig = {
74
74
  };
75
75
  ```
76
76
 
77
- Use the compact Save action in the command palette to capture the current JSON-serializable NgRx root state immediately. `Ctrl/Cmd+Shift+P` opens the fuzzy checkpoint finder. `F2` renames the selected record and `Delete` opens inline confirmation.
77
+ Use the compact Save action in the command palette to capture the current JSON-serializable NgRx root state immediately. `Ctrl/Cmd+Shift+P` opens the fuzzy checkpoint finder. Rename and delete remain explicit buttons on each record.
78
78
 
79
79
  Records are stored per origin in IndexedDB database `inspector-ng`, object store `checkpoints`. This needs no browser permission prompt and does not map to a visible or fixed OS path. Nothing is evicted automatically. Existing `inspector-checkpoints-v1` localStorage records are deliberately ignored.
80
80
 
@@ -104,25 +104,15 @@ A checkpoint contains the root Store value and current route. Restore dispatches
104
104
 
105
105
  | Key | Action |
106
106
  |---|---|
107
- | `M` | Toggle inspector on/off |
108
- | `S` | Select mode — click elements to inspect their bounds, padding, margin, and styles |
109
- | `G` | Guides mode — place alignment guides on the page |
110
- | `H` / `V` | Toggle guide orientation (horizontal / vertical) |
111
- | `Alt` (hold) | Measure pixel distance between the selected element and the hovered element |
112
- | `Esc` | Clear selection, deselect guides, reset state |
113
- | `Ctrl/Cmd + Z` | Undo last guide change |
114
- | `Ctrl/Cmd + Shift + Z` | Redo guide change |
115
- | `Backspace` / `Delete` | Delete the selected guide |
116
- | `Ctrl/Cmd + Shift + P` | Search and restore checkpoints when configured |
107
+ | `Ctrl/Cmd + Shift + P` | Open the Inspector command palette when configured |
108
+ | `Esc` | Clear selections, guides, and transient overlays |
117
109
 
118
110
  ## Features
119
111
 
120
112
  - **Element Inspection** — Click any element to see its bounding box, padding, margin, font size, line height, color, and more.
121
113
  - **Typography Overlay** — Annotate all visible text blocks with their computed typography styles.
122
114
  - **Alignment Guides** — Place draggable vertical/horizontal guides with snap-to behavior.
123
- - **Distance Measurement** — Hold `Alt` to measure pixel distance between two elements.
124
115
  - **Gap Detection** — Detects and displays flex/grid gap values.
125
- - **Undo/Redo** — Full history for guide operations.
126
116
  - **State Persistence** — Optionally saves and restores state across page reloads.
127
117
  - **SSR-Safe** — Uses `isPlatformBrowser` to avoid running on the server.
128
118
 
@@ -158,7 +158,9 @@ export class InspectorCheckpointService {
158
158
  throw new Error('Checkpoint not found. It may have been deleted in another tab.');
159
159
  const state = cloneJson(checkpoint.state, `“${checkpoint.name}” could not be decoded. Delete it and save a new checkpoint.`);
160
160
  this.store.dispatch({ type: RESTORE_CHECKPOINT, state });
161
- if (this.router && !await this.router.navigateByUrl(checkpoint.route)) {
161
+ if (this.router &&
162
+ this.router.url !== checkpoint.route &&
163
+ !await this.router.navigateByUrl(checkpoint.route)) {
162
164
  throw new Error(`The state was restored, but navigation to “${checkpoint.route}” was cancelled.`);
163
165
  }
164
166
  const recentlyUsedCheckpoint = {
@@ -337,4 +339,4 @@ function isCheckpointRecord(value) {
337
339
  (checkpoint.lastUsedAt === undefined || typeof checkpoint.lastUsedAt === 'string') &&
338
340
  'state' in checkpoint;
339
341
  }
340
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2hlY2twb2ludHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wcm9qZWN0cy9pbnNwZWN0b3Itbmcvc3JjL2xpYi9jaGVja3BvaW50cy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBRUwsTUFBTSxFQUNOLFVBQVUsRUFDVixjQUFjLEVBQ2QsUUFBUSxFQUNSLFdBQVcsRUFDWCx3QkFBd0IsRUFDeEIsTUFBTSxHQUNQLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQ3BELE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUN6QyxPQUFPLEVBR0wsYUFBYSxFQUNiLEtBQUssR0FDTixNQUFNLGFBQWEsQ0FBQztBQUNyQixPQUFPLEVBQUUsY0FBYyxFQUFFLElBQUksRUFBRSxNQUFNLE1BQU0sQ0FBQzs7OztBQWlCNUMsTUFBTSxrQkFBa0IsR0FBRyxpQ0FBaUMsQ0FBQztBQUM3RCxNQUFNLGFBQWEsR0FBRyxjQUFjLENBQUM7QUFDckMsTUFBTSxnQkFBZ0IsR0FBRyxDQUFDLENBQUM7QUFDM0IsTUFBTSxVQUFVLEdBQUcsYUFBYSxDQUFDO0FBRWpDLE1BQU0sQ0FBQyxNQUFNLCtCQUErQixHQUMxQyxJQUFJLGNBQWMsQ0FBZ0MsaUNBQWlDLENBQUMsQ0FBQztBQUV2RixNQUFNLFVBQVUsOEJBQThCLENBQzVDLE9BQXlCO0lBRXpCLE9BQU8sQ0FBQyxLQUFLLEVBQUUsTUFBTSxFQUFFLEVBQUU7UUFDdkIsSUFBSSxNQUFNLENBQUMsSUFBSSxLQUFLLGtCQUFrQixFQUFFLENBQUM7WUFDdkMsT0FBUSxNQUFrQyxDQUFDLEtBQVUsQ0FBQztRQUN4RCxDQUFDO1FBQ0QsT0FBTyxPQUFPLENBQUMsS0FBSyxFQUFFLE1BQU0sQ0FBQyxDQUFDO0lBQ2hDLENBQUMsQ0FBQztBQUNKLENBQUM7QUFFRCxNQUFNLE9BQWdCLDZCQUE2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QUMsQ0FBQyxVQUFVLENBQUMsU0FBUyxDQUFDO0FBQzNCLENBQUM7QUFFRCxNQUFNLFVBQVUsbUJBQW1CLENBQ2pDLENBQTRCLEVBQzVCLENBQTRCO0lBRTVCLE9BQU8sb0JBQW9CLENBQUMsQ0FBQyxDQUFDLENBQUMsYUFBYSxDQUFDLG9CQUFvQixDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ25FLENBQUMsQ0FBQyxTQUFTLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUM7UUFDdEMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0FBQzdCLENBQUM7QUFFRCxTQUFTLGtCQUFrQixDQUFDLEtBQWM7SUFDeEMsSUFBSSxDQUFDLEtBQUssSUFBSSxPQUFPLEtBQUssS0FBSyxRQUFRO1FBQUUsT0FBTyxLQUFLLENBQUM7SUFDdEQsTUFBTSxVQUFVLEdBQUcsS0FBMkMsQ0FBQztJQUMvRCxPQUFPLFVBQVUsQ0FBQyxPQUFPLEtBQUssQ0FBQztRQUM3QixPQUFPLFVBQVUsQ0FBQyxFQUFFLEtBQUssUUFBUTtRQUNqQyxPQUFPLFVBQVUsQ0FBQyxJQUFJLEtBQUssUUFBUTtRQUNuQyxPQUFPLFVBQVUsQ0FBQyxLQUFLLEtBQUssUUFBUTtRQUNwQyxPQUFPLFVBQVUsQ0FBQyxTQUFTLEtBQUssUUFBUTtRQUN4QyxDQUFDLFVBQVUsQ0FBQyxVQUFVLEtBQUssU0FBUyxJQUFJLE9BQU8sVUFBVSxDQUFDLFVBQVUsS0FBSyxRQUFRLENBQUM7UUFDbEYsT0FBTyxJQUFJLFVBQVUsQ0FBQztBQUMxQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgRW52aXJvbm1lbnRQcm92aWRlcnMsXG4gIEluamVjdCxcbiAgSW5qZWN0YWJsZSxcbiAgSW5qZWN0aW9uVG9rZW4sXG4gIE9wdGlvbmFsLFxuICBQTEFURk9STV9JRCxcbiAgbWFrZUVudmlyb25tZW50UHJvdmlkZXJzLFxuICBzaWduYWwsXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgaXNQbGF0Zm9ybUJyb3dzZXIgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHsgUm91dGVyIH0gZnJvbSAnQGFuZ3VsYXIvcm91dGVyJztcbmltcG9ydCB7XG4gIEFjdGlvbixcbiAgQWN0aW9uUmVkdWNlcixcbiAgTUVUQV9SRURVQ0VSUyxcbiAgU3RvcmUsXG59IGZyb20gJ0BuZ3J4L3N0b3JlJztcbmltcG9ydCB7IGZpcnN0VmFsdWVGcm9tLCB0YWtlIH0gZnJvbSAncnhqcyc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgSW5zcGVjdG9yQ2hlY2twb2ludFJlY29yZCB7XG4gIHZlcnNpb246IDE7XG4gIGlkOiBzdHJpbmc7XG4gIG5hbWU6IHN0cmluZztcbiAgcm91dGU6IHN0cmluZztcbiAgY3JlYXRlZEF0OiBzdHJpbmc7XG4gIGxhc3RVc2VkQXQ/OiBzdHJpbmc7XG4gIHN0YXRlOiB1bmtub3duO1xufVxuXG5pbnRlcmZhY2UgUmVzdG9yZUNoZWNrcG9pbnRBY3Rpb24gZXh0ZW5kcyBBY3Rpb24ge1xuICB0eXBlOiB0eXBlb2YgUkVTVE9SRV9DSEVDS1BPSU5UO1xuICBzdGF0ZTogdW5rbm93bjtcbn1cblxuY29uc3QgUkVTVE9SRV9DSEVDS1BPSU5UID0gJ1tJbnNwZWN0b3IgQ2hlY2twb2ludHNdIFJlc3RvcmUnO1xuY29uc3QgREFUQUJBU0VfTkFNRSA9ICdpbnNwZWN0b3ItbmcnO1xuY29uc3QgREFUQUJBU0VfVkVSU0lPTiA9IDE7XG5jb25zdCBTVE9SRV9OQU1FID0gJ2NoZWNrcG9pbnRzJztcblxuZXhwb3J0IGNvbnN0IElOU1BFQ1RPUl9DSEVDS1BPSU5UX1JFUE9TSVRPUlkgPVxuICBuZXcgSW5qZWN0aW9uVG9rZW48SW5zcGVjdG9yQ2hlY2twb2ludFJlcG9zaXRvcnk+KCdJTlNQRUNUT1JfQ0hFQ0tQT0lOVF9SRVBPU0lUT1JZJyk7XG5cbmV4cG9ydCBmdW5jdGlvbiBpbnNwZWN0b3JDaGVja3BvaW50TWV0YVJlZHVjZXI8VD4oXG4gIHJlZHVjZXI6IEFjdGlvblJlZHVjZXI8VD4sXG4pOiBBY3Rpb25SZWR1Y2VyPFQ+IHtcbiAgcmV0dXJuIChzdGF0ZSwgYWN0aW9uKSA9PiB7XG4gICAgaWYgKGFjdGlvbi50eXBlID09PSBSRVNUT1JFX0NIRUNLUE9JTlQpIHtcbiAgICAgIHJldHVybiAoYWN0aW9uIGFzIFJlc3RvcmVDaGVja3BvaW50QWN0aW9uKS5zdGF0ZSBhcyBUO1xuICAgIH1cbiAgICByZXR1cm4gcmVkdWNlcihzdGF0ZSwgYWN0aW9uKTtcbiAgfTtcbn1cblxuZXhwb3J0IGFic3RyYWN0IGNsYXNzIEluc3BlY3RvckNoZWNrcG9pbnRSZXBvc2l0b3J5IHtcbiAgYWJzdHJhY3QgbGlzdCgpOiBQcm9taXNlPEluc3BlY3RvckNoZWNrcG9pbnRSZWNvcmRbXT47XG4gIGFic3RyYWN0IHB1dChjaGVja3BvaW50OiBJbnNwZWN0b3JDaGVja3BvaW50UmVjb3JkKTogUHJvbWlzZTx2b2lkPjtcbiAgYWJzdHJhY3QgZGVsZXRlKGlkOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+O1xufVxuXG5ASW5qZWN0YWJsZSgpXG5leHBvcnQgY2xhc3MgSW5kZXhlZERiQ2hlY2twb2ludFJlcG9zaXRvcnkgZXh0ZW5kcyBJbnNwZWN0b3JDaGVja3BvaW50UmVwb3NpdG9yeSB7XG4gIHByaXZhdGUgZGF0YWJhc2VQcm9taXNlOiBQcm9taXNlPElEQkRhdGFiYXNlPiB8IG51bGwgPSBudWxsO1xuXG4gIGNvbnN0cnVjdG9yKEBJbmplY3QoUExBVEZPUk1fSUQpIHByaXZhdGUgcmVhZG9ubHkgcGxhdGZvcm1JZDogb2JqZWN0KSB7XG4gICAgc3VwZXIoKTtcbiAgfVxuXG4gIGFzeW5jIGxpc3QoKTogUHJvbWlzZTxJbnNwZWN0b3JDaGVja3BvaW50UmVjb3JkW10+IHtcbiAgICBjb25zdCBkYXRhYmFzZSA9IGF3YWl0IHRoaXMuZGF0YWJhc2UoKTtcbiAgICBjb25zdCB2YWx1ZXMgPSBhd2FpdCB0aGlzLnJlcXVlc3Q8dW5rbm93bltdPihcbiAgICAgIGRhdGFiYXNlLnRyYW5zYWN0aW9uKFNUT1JFX05BTUUsICdyZWFkb25seScpLm9iamVjdFN0b3JlKFNUT1JFX05BTUUpLmdldEFsbCgpLFxuICAgICk7XG4gICAgcmV0dXJuIHZhbHVlc1xuICAgICAgLmZpbHRlcihpc0NoZWNrcG9pbnRSZWNvcmQpXG4gICAgICAuc29ydChyZWNlbnRBY3Rpdml0eUZpcnN0KTtcbiAgfVxuXG4gIGFzeW5jIHB1dChjaGVja3BvaW50OiBJbnNwZWN0b3JDaGVja3BvaW50UmVjb3JkKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgZGF0YWJhc2UgPSBhd2FpdCB0aGlzLmRhdGFiYXNlKCk7XG4gICAgYXdhaXQgdGhpcy50cmFuc2FjdGlvbkNvbXBsZXRlKGRhdGFiYXNlLCAncmVhZHdyaXRlJywgKHN0b3JlKSA9PiBzdG9yZS5wdXQoY2hlY2twb2ludCkpO1xuICB9XG5cbiAgYXN5bmMgZGVsZXRlKGlkOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBkYXRhYmFzZSA9IGF3YWl0IHRoaXMuZGF0YWJhc2UoKTtcbiAgICBhd2FpdCB0aGlzLnRyYW5zYWN0aW9uQ29tcGxldGUoZGF0YWJhc2UsICdyZWFkd3JpdGUnLCAoc3RvcmUpID0+IHN0b3JlLmRlbGV0ZShpZCkpO1xuICB9XG5cbiAgcHJpdmF0ZSBkYXRhYmFzZSgpOiBQcm9taXNlPElEQkRhdGFiYXNlPiB7XG4gICAgaWYgKCFpc1BsYXRmb3JtQnJvd3Nlcih0aGlzLnBsYXRmb3JtSWQpIHx8IHR5cGVvZiBpbmRleGVkREIgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QobmV3IEVycm9yKCdDaGVja3BvaW50cyBhcmUgb25seSBhdmFpbGFibGUgaW4gYSBicm93c2VyIHdpdGggSW5kZXhlZERCLicpKTtcbiAgICB9XG4gICAgaWYgKHRoaXMuZGF0YWJhc2VQcm9taXNlKSByZXR1cm4gdGhpcy5kYXRhYmFzZVByb21pc2U7XG5cbiAgICB0aGlzLmRhdGFiYXNlUHJvbWlzZSA9IG5ldyBQcm9taXNlPElEQkRhdGFiYXNlPigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICBjb25zdCByZXF1ZXN0ID0gaW5kZXhlZERCLm9wZW4oREFUQUJBU0VfTkFNRSwgREFUQUJBU0VfVkVSU0lPTik7XG4gICAgICByZXF1ZXN0Lm9udXBncmFkZW5lZWRlZCA9ICgpID0+IHtcbiAgICAgICAgY29uc3QgZGF0YWJhc2UgPSByZXF1ZXN0LnJlc3VsdDtcbiAgICAgICAgaWYgKGRhdGFiYXNlLm9iamVjdFN0b3JlTmFtZXMuY29udGFpbnMoU1RPUkVfTkFNRSkpIHJldHVybjtcbiAgICAgICAgY29uc3Qgc3RvcmUgPSBkYXRhYmFzZS5jcmVhdGVPYmplY3RTdG9yZShTVE9SRV9OQU1FLCB7IGtleVBhdGg6ICdpZCcgfSk7XG4gICAgICAgIHN0b3JlLmNyZWF0ZUluZGV4KCdjcmVhdGVkQXQnLCAnY3JlYXRlZEF0Jyk7XG4gICAgICB9O1xuICAgICAgcmVxdWVzdC5vbnN1Y2Nlc3MgPSAoKSA9PiByZXNvbHZlKHJlcXVlc3QucmVzdWx0KTtcbiAgICAgIHJlcXVlc3Qub25lcnJvciA9ICgpID0+IHJlamVjdChyZXF1ZXN0LmVycm9yID8/IG5ldyBFcnJvcignSW5kZXhlZERCIGNvdWxkIG5vdCBiZSBvcGVuZWQuJykpO1xuICAgICAgcmVxdWVzdC5vbmJsb2NrZWQgPSAoKSA9PiByZWplY3QobmV3IEVycm9yKCdJbmRleGVkREIgaXMgYmxvY2tlZCBieSBhbm90aGVyIG9wZW4gdGFiLicpKTtcbiAgICB9KTtcbiAgICByZXR1cm4gdGhpcy5kYXRhYmFzZVByb21pc2U7XG4gIH1cblxuICBwcml2YXRlIHJlcXVlc3Q8VD4ocmVxdWVzdDogSURCUmVxdWVzdDxUPik6IFByb21pc2U8VD4ge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZTxUPigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICByZXF1ZXN0Lm9uc3VjY2VzcyA9ICgpID0+IHJlc29sdmUocmVxdWVzdC5yZXN1bHQpO1xuICAgICAgcmVxdWVzdC5vbmVycm9yID0gKCkgPT4gcmVqZWN0KHJlcXVlc3QuZXJyb3IgPz8gbmV3IEVycm9yKCdJbmRleGVkREIgcmVxdWVzdCBmYWlsZWQuJykpO1xuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSB0cmFuc2FjdGlvbkNvbXBsZXRlKFxuICAgIGRhdGFiYXNlOiBJREJEYXRhYmFzZSxcbiAgICBtb2RlOiBJREJUcmFuc2FjdGlvbk1vZGUsXG4gICAgb3BlcmF0aW9uOiAoc3RvcmU6IElEQk9iamVjdFN0b3JlKSA9PiBJREJSZXF1ZXN0LFxuICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICByZXR1cm4gbmV3IFByb21pc2U8dm9pZD4oKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgY29uc3QgdHJhbnNhY3Rpb24gPSBkYXRhYmFzZS50cmFuc2FjdGlvbihTVE9SRV9OQU1FLCBtb2RlKTtcbiAgICAgIHRyYW5zYWN0aW9uLm9uY29tcGxldGUgPSAoKSA9PiByZXNvbHZlKCk7XG4gICAgICB0cmFuc2FjdGlvbi5vbmVycm9yID0gKCkgPT4gcmVqZWN0KHRyYW5zYWN0aW9uLmVycm9yID8/IG5ldyBFcnJvcignSW5kZXhlZERCIHRyYW5zYWN0aW9uIGZhaWxlZC4nKSk7XG4gICAgICB0cmFuc2FjdGlvbi5vbmFib3J0ID0gKCkgPT4gcmVqZWN0KHRyYW5zYWN0aW9uLmVycm9yID8/IG5ldyBFcnJvcignSW5kZXhlZERCIHRyYW5zYWN0aW9uIHdhcyBhYm9ydGVkLicpKTtcbiAgICAgIG9wZXJhdGlvbih0cmFuc2FjdGlvbi5vYmplY3RTdG9yZShTVE9SRV9OQU1FKSk7XG4gICAgfSk7XG4gIH1cbn1cblxuQEluamVjdGFibGUoKVxuZXhwb3J0IGNsYXNzIEluc3BlY3RvckNoZWNrcG9pbnRTZXJ2aWNlIHtcbiAgcmVhZG9ubHkgY2hlY2twb2ludHMgPSBzaWduYWw8SW5zcGVjdG9yQ2hlY2twb2ludFJlY29yZFtdPihbXSk7XG4gIHJlYWRvbmx5IGxvYWRpbmcgPSBzaWduYWwoZmFsc2UpO1xuICByZWFkb25seSBidXN5ID0gc2lnbmFsKGZhbHNlKTtcbiAgcmVhZG9ubHkgZXJyb3IgPSBzaWduYWw8c3RyaW5nIHwgbnVsbD4obnVsbCk7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgQEluamVjdChJTlNQRUNUT1JfQ0hFQ0tQT0lOVF9SRVBPU0lUT1JZKVxuICAgIHByaXZhdGUgcmVhZG9ubHkgcmVwb3NpdG9yeTogSW5zcGVjdG9yQ2hlY2twb2ludFJlcG9zaXRvcnksXG4gICAgQE9wdGlvbmFsKCkgQEluamVjdChTdG9yZSkgcHJpdmF0ZSByZWFkb25seSBzdG9yZTogU3RvcmUgfCBudWxsLFxuICAgIEBPcHRpb25hbCgpIEBJbmplY3QoUm91dGVyKSBwcml2YXRlIHJlYWRvbmx5IHJvdXRlcjogUm91dGVyIHwgbnVsbCxcbiAgICBASW5qZWN0KFBMQVRGT1JNX0lEKSBwcml2YXRlIHJlYWRvbmx5IHBsYXRmb3JtSWQ6IG9iamVjdCxcbiAgKSB7fVxuXG4gIGFzeW5jIGxvYWQoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgdGhpcy5lcnJvci5zZXQobnVsbCk7XG4gICAgdGhpcy5sb2FkaW5nLnNldCh0cnVlKTtcbiAgICB0cnkge1xuICAgICAgdGhpcy5jaGVja3BvaW50cy5zZXQoKGF3YWl0IHRoaXMucmVwb3NpdG9yeS5saXN0KCkpLnNvcnQocmVjZW50QWN0aXZpdHlGaXJzdCkpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICB0aGlzLmVycm9yLnNldCh0aGlzLm1lc3NhZ2VGb3IoZXJyb3IsICdTYXZlZCBjaGVja3BvaW50cyBjb3VsZCBub3QgYmUgbG9hZGVkLiBUcnkgcmVsb2FkaW5nIHRoZSBwYWdlLicpKTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgdGhpcy5sb2FkaW5nLnNldChmYWxzZSk7XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgc2F2ZSgpOiBQcm9taXNlPEluc3BlY3RvckNoZWNrcG9pbnRSZWNvcmQgfCBudWxsPiB7XG4gICAgdGhpcy5lcnJvci5zZXQobnVsbCk7XG4gICAgaWYgKCF0aGlzLnN0b3JlKSB7XG4gICAgICB0aGlzLmVycm9yLnNldCh0aGlzLm1pc3NpbmdTdG9yZU1lc3NhZ2UoKSk7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICB0aGlzLmJ1c3kuc2V0KHRydWUpO1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBjdXJyZW50U3RhdGUgPSBhd2FpdCBmaXJzdFZhbHVlRnJvbSh0aGlzLnN0b3JlLnBpcGUodGFrZSgxKSkpO1xuICAgICAgY29uc3Qgc3RhdGUgPSBjbG9uZUpzb24oY3VycmVudFN0YXRlKTtcbiAgICAgIGNvbnN0IHBlcnNpc3RlZCA9IGF3YWl0IHRoaXMucmVwb3NpdG9yeS5saXN0KCk7XG4gICAgICBjb25zdCByb3V0ZSA9IHRoaXMuY3VycmVudFJvdXRlKCk7XG4gICAgICBjb25zdCBwYXRobmFtZSA9IHRoaXMuY3VycmVudFBhdGhuYW1lKCk7XG4gICAgICBjb25zdCBjaGVja3BvaW50OiBJbnNwZWN0b3JDaGVja3BvaW50UmVjb3JkID0ge1xuICAgICAgICB2ZXJzaW9uOiAxLFxuICAgICAgICBpZDogY3JlYXRlQ2hlY2twb2ludElkKCksXG4gICAgICAgIG5hbWU6IG5leHRBdXRvbWF0aWNOYW1lKHBhdGhuYW1lLCBwZXJzaXN0ZWQubWFwKCh7IG5hbWUgfSkgPT4gbmFtZSkpLFxuICAgICAgICByb3V0ZSxcbiAgICAgICAgY3JlYXRlZEF0OiBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCksXG4gICAgICAgIHN0YXRlLFxuICAgICAgfTtcbiAgICAgIGF3YWl0IHRoaXMucmVwb3NpdG9yeS5wdXQoY2hlY2twb2ludCk7XG4gICAgICB0aGlzLmNoZWNrcG9pbnRzLnNldChbY2hlY2twb2ludCwgLi4ucGVyc2lzdGVkXS5zb3J0KHJlY2VudEFjdGl2aXR5Rmlyc3QpKTtcbiAgICAgIHJldHVybiBjaGVja3BvaW50O1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICB0aGlzLmVycm9yLnNldCh0aGlzLnN0b3JhZ2VNZXNzYWdlKGVycm9yLCAnVGhlIGNoZWNrcG9pbnQgY291bGQgbm90IGJlIHNhdmVkLicpKTtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH0gZmluYWxseSB7XG4gICAgICB0aGlzLmJ1c3kuc2V0KGZhbHNlKTtcbiAgICB9XG4gIH1cblxuICBhc3luYyByZXN0b3JlKGlkOiBzdHJpbmcpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICB0aGlzLmVycm9yLnNldChudWxsKTtcbiAgICBpZiAoIXRoaXMuc3RvcmUpIHtcbiAgICAgIHRoaXMuZXJyb3Iuc2V0KHRoaXMubWlzc2luZ1N0b3JlTWVzc2FnZSgpKTtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgdGhpcy5idXN5LnNldCh0cnVlKTtcbiAgICB0cnkge1xuICAgICAgY29uc3QgY2hlY2twb2ludHMgPSBhd2FpdCB0aGlzLnJlcG9zaXRvcnkubGlzdCgpO1xuICAgICAgY29uc3QgY2hlY2twb2ludCA9IGNoZWNrcG9pbnRzLmZpbmQoKGl0ZW0pID0+IGl0ZW0uaWQgPT09IGlkKTtcbiAgICAgIGlmICghY2hlY2twb2ludCkgdGhyb3cgbmV3IEVycm9yKCdDaGVja3BvaW50IG5vdCBmb3VuZC4gSXQgbWF5IGhhdmUgYmVlbiBkZWxldGVkIGluIGFub3RoZXIgdGFiLicpO1xuICAgICAgY29uc3Qgc3RhdGUgPSBjbG9uZUpzb24oXG4gICAgICAgIGNoZWNrcG9pbnQuc3RhdGUsXG4gICAgICAgIGDigJwke2NoZWNrcG9pbnQubmFtZX3igJ0gY291bGQgbm90IGJlIGRlY29kZWQuIERlbGV0ZSBpdCBhbmQgc2F2ZSBhIG5ldyBjaGVja3BvaW50LmAsXG4gICAgICApO1xuICAgICAgdGhpcy5zdG9yZS5kaXNwYXRjaCh7IHR5cGU6IFJFU1RPUkVfQ0hFQ0tQT0lOVCwgc3RhdGUgfSBhcyBSZXN0b3JlQ2hlY2twb2ludEFjdGlvbik7XG4gICAgICBpZiAodGhpcy5yb3V0ZXIgJiYgIWF3YWl0IHRoaXMucm91dGVyLm5hdmlnYXRlQnlVcmwoY2hlY2twb2ludC5yb3V0ZSkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBUaGUgc3RhdGUgd2FzIHJlc3RvcmVkLCBidXQgbmF2aWdhdGlvbiB0byDigJwke2NoZWNrcG9pbnQucm91dGV94oCdIHdhcyBjYW5jZWxsZWQuYCk7XG4gICAgICB9XG4gICAgICBjb25zdCByZWNlbnRseVVzZWRDaGVja3BvaW50ID0ge1xuICAgICAgICAuLi5jaGVja3BvaW50LFxuICAgICAgICBsYXN0VXNlZEF0OiBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCksXG4gICAgICB9O1xuICAgICAgYXdhaXQgdGhpcy5yZXBvc2l0b3J5LnB1dChyZWNlbnRseVVzZWRDaGVja3BvaW50KTtcbiAgICAgIHRoaXMuY2hlY2twb2ludHMuc2V0KFxuICAgICAgICBjaGVja3BvaW50c1xuICAgICAgICAgIC5tYXAoKGl0ZW0pID0+IGl0ZW0uaWQgPT09IGlkID8gcmVjZW50bHlVc2VkQ2hlY2twb2ludCA6IGl0ZW0pXG4gICAgICAgICAgLnNvcnQocmVjZW50QWN0aXZpdHlGaXJzdCksXG4gICAgICApO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIHRoaXMuZXJyb3Iuc2V0KHRoaXMubWVzc2FnZUZvcihlcnJvciwgJ1RoZSBjaGVja3BvaW50IGNvdWxkIG5vdCBiZSByZXN0b3JlZC4gRGVsZXRlIGl0IGFuZCBzYXZlIGEgbmV3IG9uZS4nKSk7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIHRoaXMuYnVzeS5zZXQoZmFsc2UpO1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIHJlbmFtZShpZDogc3RyaW5nLCBuYW1lOiBzdHJpbmcpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICB0aGlzLmVycm9yLnNldChudWxsKTtcbiAgICBjb25zdCBuZXh0TmFtZSA9IG5hbWUudHJpbSgpO1xuICAgIGlmICghbmV4dE5hbWUpIHtcbiAgICAgIHRoaXMuZXJyb3Iuc2V0KCdQbGVhc2UgZW50ZXIgYSBjaGVja3BvaW50IG5hbWUuJyk7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgdGhpcy5idXN5LnNldCh0cnVlKTtcbiAgICB0cnkge1xuICAgICAgY29uc3QgY2hlY2twb2ludHMgPSBhd2FpdCB0aGlzLnJlcG9zaXRvcnkubGlzdCgpO1xuICAgICAgaWYgKGNoZWNrcG9pbnRzLnNvbWUoKGl0ZW0pID0+IGl0ZW0uaWQgIT09IGlkICYmIGl0ZW0ubmFtZS50b0xvY2FsZUxvd2VyQ2FzZSgpID09PSBuZXh0TmFtZS50b0xvY2FsZUxvd2VyQ2FzZSgpKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEEgY2hlY2twb2ludCBuYW1lZCDigJwke25leHROYW1lfeKAnSBhbHJlYWR5IGV4aXN0cy4gQ2hvb3NlIGEgZGlmZmVyZW50IG5hbWUuYCk7XG4gICAgICB9XG4gICAgICBjb25zdCBjaGVja3BvaW50ID0gY2hlY2twb2ludHMuZmluZCgoaXRlbSkgPT4gaXRlbS5pZCA9PT0gaWQpO1xuICAgICAgaWYgKCFjaGVja3BvaW50KSB0aHJvdyBuZXcgRXJyb3IoJ0NoZWNrcG9pbnQgbm90IGZvdW5kLiBJdCBtYXkgaGF2ZSBiZWVuIGRlbGV0ZWQgaW4gYW5vdGhlciB0YWIuJyk7XG4gICAgICBhd2FpdCB0aGlzLnJlcG9zaXRvcnkucHV0KHsgLi4uY2hlY2twb2ludCwgbmFtZTogbmV4dE5hbWUgfSk7XG4gICAgICB0aGlzLmNoZWNrcG9pbnRzLnNldChcbiAgICAgICAgY2hlY2twb2ludHMubWFwKChpdGVtKSA9PiBpdGVtLmlkID09PSBpZCA/IHsgLi4uaXRlbSwgbmFtZTogbmV4dE5hbWUgfSA6IGl0ZW0pLnNvcnQocmVjZW50QWN0aXZpdHlGaXJzdCksXG4gICAgICApO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIHRoaXMuZXJyb3Iuc2V0KHRoaXMuc3RvcmFnZU1lc3NhZ2UoZXJyb3IsICdUaGUgY2hlY2twb2ludCBjb3VsZCBub3QgYmUgcmVuYW1lZC4nKSk7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIHRoaXMuYnVzeS5zZXQoZmFsc2UpO1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIGRlbGV0ZShpZDogc3RyaW5nKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgdGhpcy5lcnJvci5zZXQobnVsbCk7XG4gICAgdGhpcy5idXN5LnNldCh0cnVlKTtcbiAgICB0cnkge1xuICAgICAgYXdhaXQgdGhpcy5yZXBvc2l0b3J5LmRlbGV0ZShpZCk7XG4gICAgICB0aGlzLmNoZWNrcG9pbnRzLnNldCh0aGlzLmNoZWNrcG9pbnRzKCkuZmlsdGVyKChpdGVtKSA9PiBpdGVtLmlkICE9PSBpZCkpO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIHRoaXMuZXJyb3Iuc2V0KHRoaXMuc3RvcmFnZU1lc3NhZ2UoZXJyb3IsICdUaGUgY2hlY2twb2ludCBjb3VsZCBub3QgYmUgZGVsZXRlZC4nKSk7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIHRoaXMuYnVzeS5zZXQoZmFsc2UpO1xuICAgIH1cbiAgfVxuXG4gIGNsZWFyRXJyb3IoKTogdm9pZCB7XG4gICAgdGhpcy5lcnJvci5zZXQobnVsbCk7XG4gIH1cblxuICBwcml2YXRlIGN1cnJlbnRSb3V0ZSgpOiBzdHJpbmcge1xuICAgIGlmICghaXNQbGF0Zm9ybUJyb3dzZXIodGhpcy5wbGF0Zm9ybUlkKSkgcmV0dXJuICcvJztcbiAgICByZXR1cm4gYCR7dGhpcy5jdXJyZW50UGF0aG5hbWUoKX0ke3dpbmRvdy5sb2NhdGlvbi5zZWFyY2h9JHt3aW5kb3cubG9jYXRpb24uaGFzaH1gO1xuICB9XG5cbiAgcHJpdmF0ZSBjdXJyZW50UGF0aG5hbWUoKTogc3RyaW5nIHtcbiAgICBpZiAoIWlzUGxhdGZvcm1Ccm93c2VyKHRoaXMucGxhdGZvcm1JZCkpIHJldHVybiAnLyc7XG4gICAgcmV0dXJuIHdpbmRvdy5sb2NhdGlvbi5wYXRobmFtZSB8fCAnLyc7XG4gIH1cblxuICBwcml2YXRlIG1pc3NpbmdTdG9yZU1lc3NhZ2UoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gJ1RoZSBOZ1J4IHJvb3Qgc3RvcmUgaXMgdW5hdmFpbGFibGUuIENoZWNrIHRoYXQgcHJvdmlkZUluc3BlY3RvckNoZWNrcG9pbnRzKCkgaXMgcmVnaXN0ZXJlZCBhZnRlciBwcm92aWRlU3RvcmUoKS4nO1xuICB9XG5cbiAgcHJpdmF0ZSBzdG9yYWdlTWVzc2FnZShlcnJvcjogdW5rbm93biwgZmFsbGJhY2s6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgaWYgKGlzUXVvdGFFcnJvcihlcnJvcikpIHtcbiAgICAgIHJldHVybiAnQnJvd3NlciBzdG9yYWdlIGlzIGZ1bGwuIERlbGV0ZSBvbGQgY2hlY2twb2ludHMsIHRoZW4gdHJ5IHNhdmluZyBhZ2Fpbi4nO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5tZXNzYWdlRm9yKGVycm9yLCBmYWxsYmFjayk7XG4gIH1cblxuICBwcml2YXRlIG1lc3NhZ2VGb3IoZXJyb3I6IHVua25vd24sIGZhbGxiYWNrOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIHJldHVybiBlcnJvciBpbnN0YW5jZW9mIEVycm9yICYmIGVycm9yLm1lc3NhZ2UgPyBlcnJvci5tZXNzYWdlIDogZmFsbGJhY2s7XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHByb3ZpZGVJbnNwZWN0b3JDaGVja3BvaW50cygpOiBFbnZpcm9ubWVudFByb3ZpZGVycyB7XG4gIHJldHVybiBtYWtlRW52aXJvbm1lbnRQcm92aWRlcnMoW1xuICAgIEluZGV4ZWREYkNoZWNrcG9pbnRSZXBvc2l0b3J5LFxuICAgIHtcbiAgICAgIHByb3ZpZGU6IElOU1BFQ1RPUl9DSEVDS1BPSU5UX1JFUE9TSVRPUlksXG4gICAgICB1c2VFeGlzdGluZzogSW5kZXhlZERiQ2hlY2twb2ludFJlcG9zaXRvcnksXG4gICAgfSxcbiAgICBJbnNwZWN0b3JDaGVja3BvaW50U2VydmljZSxcbiAgICB7XG4gICAgICBwcm92aWRlOiBNRVRBX1JFRFVDRVJTLFxuICAgICAgbXVsdGk6IHRydWUsXG4gICAgICB1c2VWYWx1ZTogaW5zcGVjdG9yQ2hlY2twb2ludE1ldGFSZWR1Y2VyLFxuICAgIH0sXG4gIF0pO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gbmV4dEF1dG9tYXRpY05hbWUocm91dGU6IHN0cmluZywgbmFtZXM6IHN0cmluZ1tdKTogc3RyaW5nIHtcbiAgY29uc3QgdXNlZCA9IG5ldyBTZXQobmFtZXMubWFwKChuYW1lKSA9PiBuYW1lLnRvTG9jYWxlTG93ZXJDYXNlKCkpKTtcbiAgaWYgKCF1c2VkLmhhcyhyb3V0ZS50b0xvY2FsZUxvd2VyQ2FzZSgpKSkgcmV0dXJuIHJvdXRlO1xuICBmb3IgKGxldCBzdWZmaXggPSAyOyA7IHN1ZmZpeCArPSAxKSB7XG4gICAgY29uc3QgY2FuZGlkYXRlID0gYCR7cm91dGV9ICR7c3VmZml4fWA7XG4gICAgaWYgKCF1c2VkLmhhcyhjYW5kaWRhdGUudG9Mb2NhbGVMb3dlckNhc2UoKSkpIHJldHVybiBjYW5kaWRhdGU7XG4gIH1cbn1cblxuZnVuY3Rpb24gY2xvbmVKc29uKFxuICB2YWx1ZTogdW5rbm93bixcbiAgZmFpbHVyZU1lc3NhZ2UgPSAnVGhlIE5nUnggcm9vdCBzdGF0ZSBpcyBub3QgSlNPTi1zZXJpYWxpemFibGUuIFJlbW92ZSBjaXJjdWxhciBvciB1bnN1cHBvcnRlZCB2YWx1ZXMgYW5kIHRyeSBhZ2Fpbi4nLFxuKTogdW5rbm93biB7XG4gIHRyeSB7XG4gICAgY29uc3Qgc2VyaWFsaXplZCA9IEpTT04uc3RyaW5naWZ5KHZhbHVlKTtcbiAgICBpZiAoc2VyaWFsaXplZCA9PT0gdW5kZWZpbmVkKSB0aHJvdyBuZXcgRXJyb3IoKTtcbiAgICByZXR1cm4gSlNPTi5wYXJzZShzZXJpYWxpemVkKSBhcyB1bmtub3duO1xuICB9IGNhdGNoIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoZmFpbHVyZU1lc3NhZ2UpO1xuICB9XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZUNoZWNrcG9pbnRJZCgpOiBzdHJpbmcge1xuICBpZiAodHlwZW9mIGNyeXB0byAhPT0gJ3VuZGVmaW5lZCcgJiYgdHlwZW9mIGNyeXB0by5yYW5kb21VVUlEID09PSAnZnVuY3Rpb24nKSB7XG4gICAgcmV0dXJuIGNyeXB0by5yYW5kb21VVUlEKCk7XG4gIH1cbiAgcmV0dXJuIGBjaGVja3BvaW50LSR7RGF0ZS5ub3coKX0tJHtNYXRoLnJhbmRvbSgpLnRvU3RyaW5nKDM2KS5zbGljZSgyLCA5KX1gO1xufVxuXG5mdW5jdGlvbiBpc1F1b3RhRXJyb3IoZXJyb3I6IHVua25vd24pOiBib29sZWFuIHtcbiAgcmV0dXJuIGVycm9yIGluc3RhbmNlb2YgRE9NRXhjZXB0aW9uICYmIChcbiAgICBlcnJvci5uYW1lID09PSAnUXVvdGFFeGNlZWRlZEVycm9yJyB8fCBlcnJvci5uYW1lID09PSAnTlNfRVJST1JfRE9NX1FVT1RBX1JFQUNIRUQnXG4gICk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjaGVja3BvaW50QWN0aXZpdHlBdChjaGVja3BvaW50OiBJbnNwZWN0b3JDaGVja3BvaW50UmVjb3JkKTogc3RyaW5nIHtcbiAgcmV0dXJuIGNoZWNrcG9pbnQubGFzdFVzZWRBdCAmJiBjaGVja3BvaW50Lmxhc3RVc2VkQXQgPiBjaGVja3BvaW50LmNyZWF0ZWRBdFxuICAgID8gY2hlY2twb2ludC5sYXN0VXNlZEF0XG4gICAgOiBjaGVja3BvaW50LmNyZWF0ZWRBdDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHJlY2VudEFjdGl2aXR5Rmlyc3QoXG4gIGE6IEluc3BlY3RvckNoZWNrcG9pbnRSZWNvcmQsXG4gIGI6IEluc3BlY3RvckNoZWNrcG9pbnRSZWNvcmQsXG4pOiBudW1iZXIge1xuICByZXR1cm4gY2hlY2twb2ludEFjdGl2aXR5QXQoYikubG9jYWxlQ29tcGFyZShjaGVja3BvaW50QWN0aXZpdHlBdChhKSkgfHxcbiAgICBiLmNyZWF0ZWRBdC5sb2NhbGVDb21wYXJlKGEuY3JlYXRlZEF0KSB8fFxuICAgIGIuaWQubG9jYWxlQ29tcGFyZShhLmlkKTtcbn1cblxuZnVuY3Rpb24gaXNDaGVja3BvaW50UmVjb3JkKHZhbHVlOiB1bmtub3duKTogdmFsdWUgaXMgSW5zcGVjdG9yQ2hlY2twb2ludFJlY29yZCB7XG4gIGlmICghdmFsdWUgfHwgdHlwZW9mIHZhbHVlICE9PSAnb2JqZWN0JykgcmV0dXJuIGZhbHNlO1xuICBjb25zdCBjaGVja3BvaW50ID0gdmFsdWUgYXMgUGFydGlhbDxJbnNwZWN0b3JDaGVja3BvaW50UmVjb3JkPjtcbiAgcmV0dXJuIGNoZWNrcG9pbnQudmVyc2lvbiA9PT0gMSAmJlxuICAgIHR5cGVvZiBjaGVja3BvaW50LmlkID09PSAnc3RyaW5nJyAmJlxuICAgIHR5cGVvZiBjaGVja3BvaW50Lm5hbWUgPT09ICdzdHJpbmcnICYmXG4gICAgdHlwZW9mIGNoZWNrcG9pbnQucm91dGUgPT09ICdzdHJpbmcnICYmXG4gICAgdHlwZW9mIGNoZWNrcG9pbnQuY3JlYXRlZEF0ID09PSAnc3RyaW5nJyAmJlxuICAgIChjaGVja3BvaW50Lmxhc3RVc2VkQXQgPT09IHVuZGVmaW5lZCB8fCB0eXBlb2YgY2hlY2twb2ludC5sYXN0VXNlZEF0ID09PSAnc3RyaW5nJykgJiZcbiAgICAnc3RhdGUnIGluIGNoZWNrcG9pbnQ7XG59XG4iXX0=
342
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2hlY2twb2ludHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wcm9qZWN0cy9pbnNwZWN0b3Itbmcvc3JjL2xpYi9jaGVja3BvaW50cy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBRUwsTUFBTSxFQUNOLFVBQVUsRUFDVixjQUFjLEVBQ2QsUUFBUSxFQUNSLFdBQVcsRUFDWCx3QkFBd0IsRUFDeEIsTUFBTSxHQUNQLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQ3BELE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUN6QyxPQUFPLEVBR0wsYUFBYSxFQUNiLEtBQUssR0FDTixNQUFNLGFBQWEsQ0FBQztBQUNyQixPQUFPLEVBQUUsY0FBYyxFQUFFLElBQUksRUFBRSxNQUFNLE1BQU0sQ0FBQzs7OztBQWlCNUMsTUFBTSxrQkFBa0IsR0FBRyxpQ0FBaUMsQ0FBQztBQUM3RCxNQUFNLGFBQWEsR0FBRyxjQUFjLENBQUM7QUFDckMsTUFBTSxnQkFBZ0IsR0FBRyxDQUFDLENBQUM7QUFDM0IsTUFBTSxVQUFVLEdBQUcsYUFBYSxDQUFDO0FBRWpDLE1BQU0sQ0FBQyxNQUFNLCtCQUErQixHQUMxQyxJQUFJLGNBQWMsQ0FBZ0MsaUNBQWlDLENBQUMsQ0FBQztBQUV2RixNQUFNLFVBQVUsOEJBQThCLENBQzVDLE9BQXlCO0lBRXpCLE9BQU8sQ0FBQyxLQUFLLEVBQUUsTUFBTSxFQUFFLEVBQUU7UUFDdkIsSUFBSSxNQUFNLENBQUMsSUFBSSxLQUFLLGtCQUFrQixFQUFFLENBQUM7WUFDdkMsT0FBUSxNQUFrQyxDQUFDLEtBQVUsQ0FBQztRQUN4RCxDQUFDO1FBQ0QsT0FBTyxPQUFPLENBQUMsS0FBSyxFQUFFLE1BQU0sQ0FBQyxDQUFDO0lBQ2hDLENBQUMsQ0FBQztBQUNKLENBQUM7QUFFRCxNQUFNLE9BQWdCLDZCQUE2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QUFVLENBQUMsU0FBUztRQUMxRSxDQUFDLENBQUMsVUFBVSxDQUFDLFVBQVU7UUFDdkIsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxTQUFTLENBQUM7QUFDM0IsQ0FBQztBQUVELE1BQU0sVUFBVSxtQkFBbUIsQ0FDakMsQ0FBNEIsRUFDNUIsQ0FBNEI7SUFFNUIsT0FBTyxvQkFBb0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxhQUFhLENBQUMsb0JBQW9CLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDbkUsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQztRQUN0QyxDQUFDLENBQUMsRUFBRSxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7QUFDN0IsQ0FBQztBQUVELFNBQVMsa0JBQWtCLENBQUMsS0FBYztJQUN4QyxJQUFJLENBQUMsS0FBSyxJQUFJLE9BQU8sS0FBSyxLQUFLLFFBQVE7UUFBRSxPQUFPLEtBQUssQ0FBQztJQUN0RCxNQUFNLFVBQVUsR0FBRyxLQUEyQyxDQUFDO0lBQy9ELE9BQU8sVUFBVSxDQUFDLE9BQU8sS0FBSyxDQUFDO1FBQzdCLE9BQU8sVUFBVSxDQUFDLEVBQUUsS0FBSyxRQUFRO1FBQ2pDLE9BQU8sVUFBVSxDQUFDLElBQUksS0FBSyxRQUFRO1FBQ25DLE9BQU8sVUFBVSxDQUFDLEtBQUssS0FBSyxRQUFRO1FBQ3BDLE9BQU8sVUFBVSxDQUFDLFNBQVMsS0FBSyxRQUFRO1FBQ3hDLENBQUMsVUFBVSxDQUFDLFVBQVUsS0FBSyxTQUFTLElBQUksT0FBTyxVQUFVLENBQUMsVUFBVSxLQUFLLFFBQVEsQ0FBQztRQUNsRixPQUFPLElBQUksVUFBVSxDQUFDO0FBQzFCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBFbnZpcm9ubWVudFByb3ZpZGVycyxcbiAgSW5qZWN0LFxuICBJbmplY3RhYmxlLFxuICBJbmplY3Rpb25Ub2tlbixcbiAgT3B0aW9uYWwsXG4gIFBMQVRGT1JNX0lELFxuICBtYWtlRW52aXJvbm1lbnRQcm92aWRlcnMsXG4gIHNpZ25hbCxcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBpc1BsYXRmb3JtQnJvd3NlciB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQgeyBSb3V0ZXIgfSBmcm9tICdAYW5ndWxhci9yb3V0ZXInO1xuaW1wb3J0IHtcbiAgQWN0aW9uLFxuICBBY3Rpb25SZWR1Y2VyLFxuICBNRVRBX1JFRFVDRVJTLFxuICBTdG9yZSxcbn0gZnJvbSAnQG5ncngvc3RvcmUnO1xuaW1wb3J0IHsgZmlyc3RWYWx1ZUZyb20sIHRha2UgfSBmcm9tICdyeGpzJztcblxuZXhwb3J0IGludGVyZmFjZSBJbnNwZWN0b3JDaGVja3BvaW50UmVjb3JkIHtcbiAgdmVyc2lvbjogMTtcbiAgaWQ6IHN0cmluZztcbiAgbmFtZTogc3RyaW5nO1xuICByb3V0ZTogc3RyaW5nO1xuICBjcmVhdGVkQXQ6IHN0cmluZztcbiAgbGFzdFVzZWRBdD86IHN0cmluZztcbiAgc3RhdGU6IHVua25vd247XG59XG5cbmludGVyZmFjZSBSZXN0b3JlQ2hlY2twb2ludEFjdGlvbiBleHRlbmRzIEFjdGlvbiB7XG4gIHR5cGU6IHR5cGVvZiBSRVNUT1JFX0NIRUNLUE9JTlQ7XG4gIHN0YXRlOiB1bmtub3duO1xufVxuXG5jb25zdCBSRVNUT1JFX0NIRUNLUE9JTlQgPSAnW0luc3BlY3RvciBDaGVja3BvaW50c10gUmVzdG9yZSc7XG5jb25zdCBEQVRBQkFTRV9OQU1FID0gJ2luc3BlY3Rvci1uZyc7XG5jb25zdCBEQVRBQkFTRV9WRVJTSU9OID0gMTtcbmNvbnN0IFNUT1JFX05BTUUgPSAnY2hlY2twb2ludHMnO1xuXG5leHBvcnQgY29uc3QgSU5TUEVDVE9SX0NIRUNLUE9JTlRfUkVQT1NJVE9SWSA9XG4gIG5ldyBJbmplY3Rpb25Ub2tlbjxJbnNwZWN0b3JDaGVja3BvaW50UmVwb3NpdG9yeT4oJ0lOU1BFQ1RPUl9DSEVDS1BPSU5UX1JFUE9TSVRPUlknKTtcblxuZXhwb3J0IGZ1bmN0aW9uIGluc3BlY3RvckNoZWNrcG9pbnRNZXRhUmVkdWNlcjxUPihcbiAgcmVkdWNlcjogQWN0aW9uUmVkdWNlcjxUPixcbik6IEFjdGlvblJlZHVjZXI8VD4ge1xuICByZXR1cm4gKHN0YXRlLCBhY3Rpb24pID0+IHtcbiAgICBpZiAoYWN0aW9uLnR5cGUgPT09IFJFU1RPUkVfQ0hFQ0tQT0lOVCkge1xuICAgICAgcmV0dXJuIChhY3Rpb24gYXMgUmVzdG9yZUNoZWNrcG9pbnRBY3Rpb24pLnN0YXRlIGFzIFQ7XG4gICAgfVxuICAgIHJldHVybiByZWR1Y2VyKHN0YXRlLCBhY3Rpb24pO1xuICB9O1xufVxuXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgSW5zcGVjdG9yQ2hlY2twb2ludFJlcG9zaXRvcnkge1xuICBhYnN0cmFjdCBsaXN0KCk6IFByb21pc2U8SW5zcGVjdG9yQ2hlY2twb2ludFJlY29yZFtdPjtcbiAgYWJzdHJhY3QgcHV0KGNoZWNrcG9pbnQ6IEluc3BlY3RvckNoZWNrcG9pbnRSZWNvcmQpOiBQcm9taXNlPHZvaWQ+O1xuICBhYnN0cmFjdCBkZWxldGUoaWQ6IHN0cmluZyk6IFByb21pc2U8dm9pZD47XG59XG5cbkBJbmplY3RhYmxlKClcbmV4cG9ydCBjbGFzcyBJbmRleGVkRGJDaGVja3BvaW50UmVwb3NpdG9yeSBleHRlbmRzIEluc3BlY3RvckNoZWNrcG9pbnRSZXBvc2l0b3J5IHtcbiAgcHJpdmF0ZSBkYXRhYmFzZVByb21pc2U6IFByb21pc2U8SURCRGF0YWJhc2U+IHwgbnVsbCA9IG51bGw7XG5cbiAgY29uc3RydWN0b3IoQEluamVjdChQTEFURk9STV9JRCkgcHJpdmF0ZSByZWFkb25seSBwbGF0Zm9ybUlkOiBvYmplY3QpIHtcbiAgICBzdXBlcigpO1xuICB9XG5cbiAgYXN5bmMgbGlzdCgpOiBQcm9taXNlPEluc3BlY3RvckNoZWNrcG9pbnRSZWNvcmRbXT4ge1xuICAgIGNvbnN0IGRhdGFiYXNlID0gYXdhaXQgdGhpcy5kYXRhYmFzZSgpO1xuICAgIGNvbnN0IHZhbHVlcyA9IGF3YWl0IHRoaXMucmVxdWVzdDx1bmtub3duW10+KFxuICAgICAgZGF0YWJhc2UudHJhbnNhY3Rpb24oU1RPUkVfTkFNRSwgJ3JlYWRvbmx5Jykub2JqZWN0U3RvcmUoU1RPUkVfTkFNRSkuZ2V0QWxsKCksXG4gICAgKTtcbiAgICByZXR1cm4gdmFsdWVzXG4gICAgICAuZmlsdGVyKGlzQ2hlY2twb2ludFJlY29yZClcbiAgICAgIC5zb3J0KHJlY2VudEFjdGl2aXR5Rmlyc3QpO1xuICB9XG5cbiAgYXN5bmMgcHV0KGNoZWNrcG9pbnQ6IEluc3BlY3RvckNoZWNrcG9pbnRSZWNvcmQpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBkYXRhYmFzZSA9IGF3YWl0IHRoaXMuZGF0YWJhc2UoKTtcbiAgICBhd2FpdCB0aGlzLnRyYW5zYWN0aW9uQ29tcGxldGUoZGF0YWJhc2UsICdyZWFkd3JpdGUnLCAoc3RvcmUpID0+IHN0b3JlLnB1dChjaGVja3BvaW50KSk7XG4gIH1cblxuICBhc3luYyBkZWxldGUoaWQ6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IGRhdGFiYXNlID0gYXdhaXQgdGhpcy5kYXRhYmFzZSgpO1xuICAgIGF3YWl0IHRoaXMudHJhbnNhY3Rpb25Db21wbGV0ZShkYXRhYmFzZSwgJ3JlYWR3cml0ZScsIChzdG9yZSkgPT4gc3RvcmUuZGVsZXRlKGlkKSk7XG4gIH1cblxuICBwcml2YXRlIGRhdGFiYXNlKCk6IFByb21pc2U8SURCRGF0YWJhc2U+IHtcbiAgICBpZiAoIWlzUGxhdGZvcm1Ccm93c2VyKHRoaXMucGxhdGZvcm1JZCkgfHwgdHlwZW9mIGluZGV4ZWREQiA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChuZXcgRXJyb3IoJ0NoZWNrcG9pbnRzIGFyZSBvbmx5IGF2YWlsYWJsZSBpbiBhIGJyb3dzZXIgd2l0aCBJbmRleGVkREIuJykpO1xuICAgIH1cbiAgICBpZiAodGhpcy5kYXRhYmFzZVByb21pc2UpIHJldHVybiB0aGlzLmRhdGFiYXNlUHJvbWlzZTtcblxuICAgIHRoaXMuZGF0YWJhc2VQcm9taXNlID0gbmV3IFByb21pc2U8SURCRGF0YWJhc2U+KChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIGNvbnN0IHJlcXVlc3QgPSBpbmRleGVkREIub3BlbihEQVRBQkFTRV9OQU1FLCBEQVRBQkFTRV9WRVJTSU9OKTtcbiAgICAgIHJlcXVlc3Qub251cGdyYWRlbmVlZGVkID0gKCkgPT4ge1xuICAgICAgICBjb25zdCBkYXRhYmFzZSA9IHJlcXVlc3QucmVzdWx0O1xuICAgICAgICBpZiAoZGF0YWJhc2Uub2JqZWN0U3RvcmVOYW1lcy5jb250YWlucyhTVE9SRV9OQU1FKSkgcmV0dXJuO1xuICAgICAgICBjb25zdCBzdG9yZSA9IGRhdGFiYXNlLmNyZWF0ZU9iamVjdFN0b3JlKFNUT1JFX05BTUUsIHsga2V5UGF0aDogJ2lkJyB9KTtcbiAgICAgICAgc3RvcmUuY3JlYXRlSW5kZXgoJ2NyZWF0ZWRBdCcsICdjcmVhdGVkQXQnKTtcbiAgICAgIH07XG4gICAgICByZXF1ZXN0Lm9uc3VjY2VzcyA9ICgpID0+IHJlc29sdmUocmVxdWVzdC5yZXN1bHQpO1xuICAgICAgcmVxdWVzdC5vbmVycm9yID0gKCkgPT4gcmVqZWN0KHJlcXVlc3QuZXJyb3IgPz8gbmV3IEVycm9yKCdJbmRleGVkREIgY291bGQgbm90IGJlIG9wZW5lZC4nKSk7XG4gICAgICByZXF1ZXN0Lm9uYmxvY2tlZCA9ICgpID0+IHJlamVjdChuZXcgRXJyb3IoJ0luZGV4ZWREQiBpcyBibG9ja2VkIGJ5IGFub3RoZXIgb3BlbiB0YWIuJykpO1xuICAgIH0pO1xuICAgIHJldHVybiB0aGlzLmRhdGFiYXNlUHJvbWlzZTtcbiAgfVxuXG4gIHByaXZhdGUgcmVxdWVzdDxUPihyZXF1ZXN0OiBJREJSZXF1ZXN0PFQ+KTogUHJvbWlzZTxUPiB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlPFQ+KChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIHJlcXVlc3Qub25zdWNjZXNzID0gKCkgPT4gcmVzb2x2ZShyZXF1ZXN0LnJlc3VsdCk7XG4gICAgICByZXF1ZXN0Lm9uZXJyb3IgPSAoKSA9PiByZWplY3QocmVxdWVzdC5lcnJvciA/PyBuZXcgRXJyb3IoJ0luZGV4ZWREQiByZXF1ZXN0IGZhaWxlZC4nKSk7XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIHRyYW5zYWN0aW9uQ29tcGxldGUoXG4gICAgZGF0YWJhc2U6IElEQkRhdGFiYXNlLFxuICAgIG1vZGU6IElEQlRyYW5zYWN0aW9uTW9kZSxcbiAgICBvcGVyYXRpb246IChzdG9yZTogSURCT2JqZWN0U3RvcmUpID0+IElEQlJlcXVlc3QsXG4gICk6IFByb21pc2U8dm9pZD4ge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZTx2b2lkPigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICBjb25zdCB0cmFuc2FjdGlvbiA9IGRhdGFiYXNlLnRyYW5zYWN0aW9uKFNUT1JFX05BTUUsIG1vZGUpO1xuICAgICAgdHJhbnNhY3Rpb24ub25jb21wbGV0ZSA9ICgpID0+IHJlc29sdmUoKTtcbiAgICAgIHRyYW5zYWN0aW9uLm9uZXJyb3IgPSAoKSA9PiByZWplY3QodHJhbnNhY3Rpb24uZXJyb3IgPz8gbmV3IEVycm9yKCdJbmRleGVkREIgdHJhbnNhY3Rpb24gZmFpbGVkLicpKTtcbiAgICAgIHRyYW5zYWN0aW9uLm9uYWJvcnQgPSAoKSA9PiByZWplY3QodHJhbnNhY3Rpb24uZXJyb3IgPz8gbmV3IEVycm9yKCdJbmRleGVkREIgdHJhbnNhY3Rpb24gd2FzIGFib3J0ZWQuJykpO1xuICAgICAgb3BlcmF0aW9uKHRyYW5zYWN0aW9uLm9iamVjdFN0b3JlKFNUT1JFX05BTUUpKTtcbiAgICB9KTtcbiAgfVxufVxuXG5ASW5qZWN0YWJsZSgpXG5leHBvcnQgY2xhc3MgSW5zcGVjdG9yQ2hlY2twb2ludFNlcnZpY2Uge1xuICByZWFkb25seSBjaGVja3BvaW50cyA9IHNpZ25hbDxJbnNwZWN0b3JDaGVja3BvaW50UmVjb3JkW10+KFtdKTtcbiAgcmVhZG9ubHkgbG9hZGluZyA9IHNpZ25hbChmYWxzZSk7XG4gIHJlYWRvbmx5IGJ1c3kgPSBzaWduYWwoZmFsc2UpO1xuICByZWFkb25seSBlcnJvciA9IHNpZ25hbDxzdHJpbmcgfCBudWxsPihudWxsKTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBASW5qZWN0KElOU1BFQ1RPUl9DSEVDS1BPSU5UX1JFUE9TSVRPUlkpXG4gICAgcHJpdmF0ZSByZWFkb25seSByZXBvc2l0b3J5OiBJbnNwZWN0b3JDaGVja3BvaW50UmVwb3NpdG9yeSxcbiAgICBAT3B0aW9uYWwoKSBASW5qZWN0KFN0b3JlKSBwcml2YXRlIHJlYWRvbmx5IHN0b3JlOiBTdG9yZSB8IG51bGwsXG4gICAgQE9wdGlvbmFsKCkgQEluamVjdChSb3V0ZXIpIHByaXZhdGUgcmVhZG9ubHkgcm91dGVyOiBSb3V0ZXIgfCBudWxsLFxuICAgIEBJbmplY3QoUExBVEZPUk1fSUQpIHByaXZhdGUgcmVhZG9ubHkgcGxhdGZvcm1JZDogb2JqZWN0LFxuICApIHt9XG5cbiAgYXN5bmMgbG9hZCgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICB0aGlzLmVycm9yLnNldChudWxsKTtcbiAgICB0aGlzLmxvYWRpbmcuc2V0KHRydWUpO1xuICAgIHRyeSB7XG4gICAgICB0aGlzLmNoZWNrcG9pbnRzLnNldCgoYXdhaXQgdGhpcy5yZXBvc2l0b3J5Lmxpc3QoKSkuc29ydChyZWNlbnRBY3Rpdml0eUZpcnN0KSk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIHRoaXMuZXJyb3Iuc2V0KHRoaXMubWVzc2FnZUZvcihlcnJvciwgJ1NhdmVkIGNoZWNrcG9pbnRzIGNvdWxkIG5vdCBiZSBsb2FkZWQuIFRyeSByZWxvYWRpbmcgdGhlIHBhZ2UuJykpO1xuICAgIH0gZmluYWxseSB7XG4gICAgICB0aGlzLmxvYWRpbmcuc2V0KGZhbHNlKTtcbiAgICB9XG4gIH1cblxuICBhc3luYyBzYXZlKCk6IFByb21pc2U8SW5zcGVjdG9yQ2hlY2twb2ludFJlY29yZCB8IG51bGw+IHtcbiAgICB0aGlzLmVycm9yLnNldChudWxsKTtcbiAgICBpZiAoIXRoaXMuc3RvcmUpIHtcbiAgICAgIHRoaXMuZXJyb3Iuc2V0KHRoaXMubWlzc2luZ1N0b3JlTWVzc2FnZSgpKTtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIHRoaXMuYnVzeS5zZXQodHJ1ZSk7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGN1cnJlbnRTdGF0ZSA9IGF3YWl0IGZpcnN0VmFsdWVGcm9tKHRoaXMuc3RvcmUucGlwZSh0YWtlKDEpKSk7XG4gICAgICBjb25zdCBzdGF0ZSA9IGNsb25lSnNvbihjdXJyZW50U3RhdGUpO1xuICAgICAgY29uc3QgcGVyc2lzdGVkID0gYXdhaXQgdGhpcy5yZXBvc2l0b3J5Lmxpc3QoKTtcbiAgICAgIGNvbnN0IHJvdXRlID0gdGhpcy5jdXJyZW50Um91dGUoKTtcbiAgICAgIGNvbnN0IHBhdGhuYW1lID0gdGhpcy5jdXJyZW50UGF0aG5hbWUoKTtcbiAgICAgIGNvbnN0IGNoZWNrcG9pbnQ6IEluc3BlY3RvckNoZWNrcG9pbnRSZWNvcmQgPSB7XG4gICAgICAgIHZlcnNpb246IDEsXG4gICAgICAgIGlkOiBjcmVhdGVDaGVja3BvaW50SWQoKSxcbiAgICAgICAgbmFtZTogbmV4dEF1dG9tYXRpY05hbWUocGF0aG5hbWUsIHBlcnNpc3RlZC5tYXAoKHsgbmFtZSB9KSA9PiBuYW1lKSksXG4gICAgICAgIHJvdXRlLFxuICAgICAgICBjcmVhdGVkQXQ6IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKSxcbiAgICAgICAgc3RhdGUsXG4gICAgICB9O1xuICAgICAgYXdhaXQgdGhpcy5yZXBvc2l0b3J5LnB1dChjaGVja3BvaW50KTtcbiAgICAgIHRoaXMuY2hlY2twb2ludHMuc2V0KFtjaGVja3BvaW50LCAuLi5wZXJzaXN0ZWRdLnNvcnQocmVjZW50QWN0aXZpdHlGaXJzdCkpO1xuICAgICAgcmV0dXJuIGNoZWNrcG9pbnQ7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIHRoaXMuZXJyb3Iuc2V0KHRoaXMuc3RvcmFnZU1lc3NhZ2UoZXJyb3IsICdUaGUgY2hlY2twb2ludCBjb3VsZCBub3QgYmUgc2F2ZWQuJykpO1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIHRoaXMuYnVzeS5zZXQoZmFsc2UpO1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIHJlc3RvcmUoaWQ6IHN0cmluZyk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIHRoaXMuZXJyb3Iuc2V0KG51bGwpO1xuICAgIGlmICghdGhpcy5zdG9yZSkge1xuICAgICAgdGhpcy5lcnJvci5zZXQodGhpcy5taXNzaW5nU3RvcmVNZXNzYWdlKCkpO1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICB0aGlzLmJ1c3kuc2V0KHRydWUpO1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBjaGVja3BvaW50cyA9IGF3YWl0IHRoaXMucmVwb3NpdG9yeS5saXN0KCk7XG4gICAgICBjb25zdCBjaGVja3BvaW50ID0gY2hlY2twb2ludHMuZmluZCgoaXRlbSkgPT4gaXRlbS5pZCA9PT0gaWQpO1xuICAgICAgaWYgKCFjaGVja3BvaW50KSB0aHJvdyBuZXcgRXJyb3IoJ0NoZWNrcG9pbnQgbm90IGZvdW5kLiBJdCBtYXkgaGF2ZSBiZWVuIGRlbGV0ZWQgaW4gYW5vdGhlciB0YWIuJyk7XG4gICAgICBjb25zdCBzdGF0ZSA9IGNsb25lSnNvbihcbiAgICAgICAgY2hlY2twb2ludC5zdGF0ZSxcbiAgICAgICAgYOKAnCR7Y2hlY2twb2ludC5uYW1lfeKAnSBjb3VsZCBub3QgYmUgZGVjb2RlZC4gRGVsZXRlIGl0IGFuZCBzYXZlIGEgbmV3IGNoZWNrcG9pbnQuYCxcbiAgICAgICk7XG4gICAgICB0aGlzLnN0b3JlLmRpc3BhdGNoKHsgdHlwZTogUkVTVE9SRV9DSEVDS1BPSU5ULCBzdGF0ZSB9IGFzIFJlc3RvcmVDaGVja3BvaW50QWN0aW9uKTtcbiAgICAgIGlmIChcbiAgICAgICAgdGhpcy5yb3V0ZXIgJiZcbiAgICAgICAgdGhpcy5yb3V0ZXIudXJsICE9PSBjaGVja3BvaW50LnJvdXRlICYmXG4gICAgICAgICFhd2FpdCB0aGlzLnJvdXRlci5uYXZpZ2F0ZUJ5VXJsKGNoZWNrcG9pbnQucm91dGUpXG4gICAgICApIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBUaGUgc3RhdGUgd2FzIHJlc3RvcmVkLCBidXQgbmF2aWdhdGlvbiB0byDigJwke2NoZWNrcG9pbnQucm91dGV94oCdIHdhcyBjYW5jZWxsZWQuYCk7XG4gICAgICB9XG4gICAgICBjb25zdCByZWNlbnRseVVzZWRDaGVja3BvaW50ID0ge1xuICAgICAgICAuLi5jaGVja3BvaW50LFxuICAgICAgICBsYXN0VXNlZEF0OiBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCksXG4gICAgICB9O1xuICAgICAgYXdhaXQgdGhpcy5yZXBvc2l0b3J5LnB1dChyZWNlbnRseVVzZWRDaGVja3BvaW50KTtcbiAgICAgIHRoaXMuY2hlY2twb2ludHMuc2V0KFxuICAgICAgICBjaGVja3BvaW50c1xuICAgICAgICAgIC5tYXAoKGl0ZW0pID0+IGl0ZW0uaWQgPT09IGlkID8gcmVjZW50bHlVc2VkQ2hlY2twb2ludCA6IGl0ZW0pXG4gICAgICAgICAgLnNvcnQocmVjZW50QWN0aXZpdHlGaXJzdCksXG4gICAgICApO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIHRoaXMuZXJyb3Iuc2V0KHRoaXMubWVzc2FnZUZvcihlcnJvciwgJ1RoZSBjaGVja3BvaW50IGNvdWxkIG5vdCBiZSByZXN0b3JlZC4gRGVsZXRlIGl0IGFuZCBzYXZlIGEgbmV3IG9uZS4nKSk7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIHRoaXMuYnVzeS5zZXQoZmFsc2UpO1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIHJlbmFtZShpZDogc3RyaW5nLCBuYW1lOiBzdHJpbmcpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICB0aGlzLmVycm9yLnNldChudWxsKTtcbiAgICBjb25zdCBuZXh0TmFtZSA9IG5hbWUudHJpbSgpO1xuICAgIGlmICghbmV4dE5hbWUpIHtcbiAgICAgIHRoaXMuZXJyb3Iuc2V0KCdQbGVhc2UgZW50ZXIgYSBjaGVja3BvaW50IG5hbWUuJyk7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgdGhpcy5idXN5LnNldCh0cnVlKTtcbiAgICB0cnkge1xuICAgICAgY29uc3QgY2hlY2twb2ludHMgPSBhd2FpdCB0aGlzLnJlcG9zaXRvcnkubGlzdCgpO1xuICAgICAgaWYgKGNoZWNrcG9pbnRzLnNvbWUoKGl0ZW0pID0+IGl0ZW0uaWQgIT09IGlkICYmIGl0ZW0ubmFtZS50b0xvY2FsZUxvd2VyQ2FzZSgpID09PSBuZXh0TmFtZS50b0xvY2FsZUxvd2VyQ2FzZSgpKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEEgY2hlY2twb2ludCBuYW1lZCDigJwke25leHROYW1lfeKAnSBhbHJlYWR5IGV4aXN0cy4gQ2hvb3NlIGEgZGlmZmVyZW50IG5hbWUuYCk7XG4gICAgICB9XG4gICAgICBjb25zdCBjaGVja3BvaW50ID0gY2hlY2twb2ludHMuZmluZCgoaXRlbSkgPT4gaXRlbS5pZCA9PT0gaWQpO1xuICAgICAgaWYgKCFjaGVja3BvaW50KSB0aHJvdyBuZXcgRXJyb3IoJ0NoZWNrcG9pbnQgbm90IGZvdW5kLiBJdCBtYXkgaGF2ZSBiZWVuIGRlbGV0ZWQgaW4gYW5vdGhlciB0YWIuJyk7XG4gICAgICBhd2FpdCB0aGlzLnJlcG9zaXRvcnkucHV0KHsgLi4uY2hlY2twb2ludCwgbmFtZTogbmV4dE5hbWUgfSk7XG4gICAgICB0aGlzLmNoZWNrcG9pbnRzLnNldChcbiAgICAgICAgY2hlY2twb2ludHMubWFwKChpdGVtKSA9PiBpdGVtLmlkID09PSBpZCA/IHsgLi4uaXRlbSwgbmFtZTogbmV4dE5hbWUgfSA6IGl0ZW0pLnNvcnQocmVjZW50QWN0aXZpdHlGaXJzdCksXG4gICAgICApO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIHRoaXMuZXJyb3Iuc2V0KHRoaXMuc3RvcmFnZU1lc3NhZ2UoZXJyb3IsICdUaGUgY2hlY2twb2ludCBjb3VsZCBub3QgYmUgcmVuYW1lZC4nKSk7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIHRoaXMuYnVzeS5zZXQoZmFsc2UpO1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIGRlbGV0ZShpZDogc3RyaW5nKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgdGhpcy5lcnJvci5zZXQobnVsbCk7XG4gICAgdGhpcy5idXN5LnNldCh0cnVlKTtcbiAgICB0cnkge1xuICAgICAgYXdhaXQgdGhpcy5yZXBvc2l0b3J5LmRlbGV0ZShpZCk7XG4gICAgICB0aGlzLmNoZWNrcG9pbnRzLnNldCh0aGlzLmNoZWNrcG9pbnRzKCkuZmlsdGVyKChpdGVtKSA9PiBpdGVtLmlkICE9PSBpZCkpO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIHRoaXMuZXJyb3Iuc2V0KHRoaXMuc3RvcmFnZU1lc3NhZ2UoZXJyb3IsICdUaGUgY2hlY2twb2ludCBjb3VsZCBub3QgYmUgZGVsZXRlZC4nKSk7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIHRoaXMuYnVzeS5zZXQoZmFsc2UpO1xuICAgIH1cbiAgfVxuXG4gIGNsZWFyRXJyb3IoKTogdm9pZCB7XG4gICAgdGhpcy5lcnJvci5zZXQobnVsbCk7XG4gIH1cblxuICBwcml2YXRlIGN1cnJlbnRSb3V0ZSgpOiBzdHJpbmcge1xuICAgIGlmICghaXNQbGF0Zm9ybUJyb3dzZXIodGhpcy5wbGF0Zm9ybUlkKSkgcmV0dXJuICcvJztcbiAgICByZXR1cm4gYCR7dGhpcy5jdXJyZW50UGF0aG5hbWUoKX0ke3dpbmRvdy5sb2NhdGlvbi5zZWFyY2h9JHt3aW5kb3cubG9jYXRpb24uaGFzaH1gO1xuICB9XG5cbiAgcHJpdmF0ZSBjdXJyZW50UGF0aG5hbWUoKTogc3RyaW5nIHtcbiAgICBpZiAoIWlzUGxhdGZvcm1Ccm93c2VyKHRoaXMucGxhdGZvcm1JZCkpIHJldHVybiAnLyc7XG4gICAgcmV0dXJuIHdpbmRvdy5sb2NhdGlvbi5wYXRobmFtZSB8fCAnLyc7XG4gIH1cblxuICBwcml2YXRlIG1pc3NpbmdTdG9yZU1lc3NhZ2UoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gJ1RoZSBOZ1J4IHJvb3Qgc3RvcmUgaXMgdW5hdmFpbGFibGUuIENoZWNrIHRoYXQgcHJvdmlkZUluc3BlY3RvckNoZWNrcG9pbnRzKCkgaXMgcmVnaXN0ZXJlZCBhZnRlciBwcm92aWRlU3RvcmUoKS4nO1xuICB9XG5cbiAgcHJpdmF0ZSBzdG9yYWdlTWVzc2FnZShlcnJvcjogdW5rbm93biwgZmFsbGJhY2s6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgaWYgKGlzUXVvdGFFcnJvcihlcnJvcikpIHtcbiAgICAgIHJldHVybiAnQnJvd3NlciBzdG9yYWdlIGlzIGZ1bGwuIERlbGV0ZSBvbGQgY2hlY2twb2ludHMsIHRoZW4gdHJ5IHNhdmluZyBhZ2Fpbi4nO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5tZXNzYWdlRm9yKGVycm9yLCBmYWxsYmFjayk7XG4gIH1cblxuICBwcml2YXRlIG1lc3NhZ2VGb3IoZXJyb3I6IHVua25vd24sIGZhbGxiYWNrOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIHJldHVybiBlcnJvciBpbnN0YW5jZW9mIEVycm9yICYmIGVycm9yLm1lc3NhZ2UgPyBlcnJvci5tZXNzYWdlIDogZmFsbGJhY2s7XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHByb3ZpZGVJbnNwZWN0b3JDaGVja3BvaW50cygpOiBFbnZpcm9ubWVudFByb3ZpZGVycyB7XG4gIHJldHVybiBtYWtlRW52aXJvbm1lbnRQcm92aWRlcnMoW1xuICAgIEluZGV4ZWREYkNoZWNrcG9pbnRSZXBvc2l0b3J5LFxuICAgIHtcbiAgICAgIHByb3ZpZGU6IElOU1BFQ1RPUl9DSEVDS1BPSU5UX1JFUE9TSVRPUlksXG4gICAgICB1c2VFeGlzdGluZzogSW5kZXhlZERiQ2hlY2twb2ludFJlcG9zaXRvcnksXG4gICAgfSxcbiAgICBJbnNwZWN0b3JDaGVja3BvaW50U2VydmljZSxcbiAgICB7XG4gICAgICBwcm92aWRlOiBNRVRBX1JFRFVDRVJTLFxuICAgICAgbXVsdGk6IHRydWUsXG4gICAgICB1c2VWYWx1ZTogaW5zcGVjdG9yQ2hlY2twb2ludE1ldGFSZWR1Y2VyLFxuICAgIH0sXG4gIF0pO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gbmV4dEF1dG9tYXRpY05hbWUocm91dGU6IHN0cmluZywgbmFtZXM6IHN0cmluZ1tdKTogc3RyaW5nIHtcbiAgY29uc3QgdXNlZCA9IG5ldyBTZXQobmFtZXMubWFwKChuYW1lKSA9PiBuYW1lLnRvTG9jYWxlTG93ZXJDYXNlKCkpKTtcbiAgaWYgKCF1c2VkLmhhcyhyb3V0ZS50b0xvY2FsZUxvd2VyQ2FzZSgpKSkgcmV0dXJuIHJvdXRlO1xuICBmb3IgKGxldCBzdWZmaXggPSAyOyA7IHN1ZmZpeCArPSAxKSB7XG4gICAgY29uc3QgY2FuZGlkYXRlID0gYCR7cm91dGV9ICR7c3VmZml4fWA7XG4gICAgaWYgKCF1c2VkLmhhcyhjYW5kaWRhdGUudG9Mb2NhbGVMb3dlckNhc2UoKSkpIHJldHVybiBjYW5kaWRhdGU7XG4gIH1cbn1cblxuZnVuY3Rpb24gY2xvbmVKc29uKFxuICB2YWx1ZTogdW5rbm93bixcbiAgZmFpbHVyZU1lc3NhZ2UgPSAnVGhlIE5nUnggcm9vdCBzdGF0ZSBpcyBub3QgSlNPTi1zZXJpYWxpemFibGUuIFJlbW92ZSBjaXJjdWxhciBvciB1bnN1cHBvcnRlZCB2YWx1ZXMgYW5kIHRyeSBhZ2Fpbi4nLFxuKTogdW5rbm93biB7XG4gIHRyeSB7XG4gICAgY29uc3Qgc2VyaWFsaXplZCA9IEpTT04uc3RyaW5naWZ5KHZhbHVlKTtcbiAgICBpZiAoc2VyaWFsaXplZCA9PT0gdW5kZWZpbmVkKSB0aHJvdyBuZXcgRXJyb3IoKTtcbiAgICByZXR1cm4gSlNPTi5wYXJzZShzZXJpYWxpemVkKSBhcyB1bmtub3duO1xuICB9IGNhdGNoIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoZmFpbHVyZU1lc3NhZ2UpO1xuICB9XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZUNoZWNrcG9pbnRJZCgpOiBzdHJpbmcge1xuICBpZiAodHlwZW9mIGNyeXB0byAhPT0gJ3VuZGVmaW5lZCcgJiYgdHlwZW9mIGNyeXB0by5yYW5kb21VVUlEID09PSAnZnVuY3Rpb24nKSB7XG4gICAgcmV0dXJuIGNyeXB0by5yYW5kb21VVUlEKCk7XG4gIH1cbiAgcmV0dXJuIGBjaGVja3BvaW50LSR7RGF0ZS5ub3coKX0tJHtNYXRoLnJhbmRvbSgpLnRvU3RyaW5nKDM2KS5zbGljZSgyLCA5KX1gO1xufVxuXG5mdW5jdGlvbiBpc1F1b3RhRXJyb3IoZXJyb3I6IHVua25vd24pOiBib29sZWFuIHtcbiAgcmV0dXJuIGVycm9yIGluc3RhbmNlb2YgRE9NRXhjZXB0aW9uICYmIChcbiAgICBlcnJvci5uYW1lID09PSAnUXVvdGFFeGNlZWRlZEVycm9yJyB8fCBlcnJvci5uYW1lID09PSAnTlNfRVJST1JfRE9NX1FVT1RBX1JFQUNIRUQnXG4gICk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjaGVja3BvaW50QWN0aXZpdHlBdChjaGVja3BvaW50OiBJbnNwZWN0b3JDaGVja3BvaW50UmVjb3JkKTogc3RyaW5nIHtcbiAgcmV0dXJuIGNoZWNrcG9pbnQubGFzdFVzZWRBdCAmJiBjaGVja3BvaW50Lmxhc3RVc2VkQXQgPiBjaGVja3BvaW50LmNyZWF0ZWRBdFxuICAgID8gY2hlY2twb2ludC5sYXN0VXNlZEF0XG4gICAgOiBjaGVja3BvaW50LmNyZWF0ZWRBdDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHJlY2VudEFjdGl2aXR5Rmlyc3QoXG4gIGE6IEluc3BlY3RvckNoZWNrcG9pbnRSZWNvcmQsXG4gIGI6IEluc3BlY3RvckNoZWNrcG9pbnRSZWNvcmQsXG4pOiBudW1iZXIge1xuICByZXR1cm4gY2hlY2twb2ludEFjdGl2aXR5QXQoYikubG9jYWxlQ29tcGFyZShjaGVja3BvaW50QWN0aXZpdHlBdChhKSkgfHxcbiAgICBiLmNyZWF0ZWRBdC5sb2NhbGVDb21wYXJlKGEuY3JlYXRlZEF0KSB8fFxuICAgIGIuaWQubG9jYWxlQ29tcGFyZShhLmlkKTtcbn1cblxuZnVuY3Rpb24gaXNDaGVja3BvaW50UmVjb3JkKHZhbHVlOiB1bmtub3duKTogdmFsdWUgaXMgSW5zcGVjdG9yQ2hlY2twb2ludFJlY29yZCB7XG4gIGlmICghdmFsdWUgfHwgdHlwZW9mIHZhbHVlICE9PSAnb2JqZWN0JykgcmV0dXJuIGZhbHNlO1xuICBjb25zdCBjaGVja3BvaW50ID0gdmFsdWUgYXMgUGFydGlhbDxJbnNwZWN0b3JDaGVja3BvaW50UmVjb3JkPjtcbiAgcmV0dXJuIGNoZWNrcG9pbnQudmVyc2lvbiA9PT0gMSAmJlxuICAgIHR5cGVvZiBjaGVja3BvaW50LmlkID09PSAnc3RyaW5nJyAmJlxuICAgIHR5cGVvZiBjaGVja3BvaW50Lm5hbWUgPT09ICdzdHJpbmcnICYmXG4gICAgdHlwZW9mIGNoZWNrcG9pbnQucm91dGUgPT09ICdzdHJpbmcnICYmXG4gICAgdHlwZW9mIGNoZWNrcG9pbnQuY3JlYXRlZEF0ID09PSAnc3RyaW5nJyAmJlxuICAgIChjaGVja3BvaW50Lmxhc3RVc2VkQXQgPT09IHVuZGVmaW5lZCB8fCB0eXBlb2YgY2hlY2twb2ludC5sYXN0VXNlZEF0ID09PSAnc3RyaW5nJykgJiZcbiAgICAnc3RhdGUnIGluIGNoZWNrcG9pbnQ7XG59XG4iXX0=