@flogeez/angular-tiptap-editor 3.5.4 → 3.6.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 (38) hide show
  1. package/CHANGELOG.md +27 -0
  2. package/README.md +2 -2
  3. package/esm2022/lib/components/bubble-menus/color/ate-color-bubble-menu.component.mjs +12 -2
  4. package/esm2022/lib/components/editor/angular-tiptap-editor.component.mjs +99 -24
  5. package/esm2022/lib/config/ate-editor.config.mjs +3 -1
  6. package/esm2022/lib/config/ate-slash-commands.config.mjs +2 -1
  7. package/esm2022/lib/extensions/ate-block-shortcuts.extension.mjs +100 -0
  8. package/esm2022/lib/extensions/ate-pasted-image.extension.mjs +7 -3
  9. package/esm2022/lib/i18n/ateTranslationsModel.mjs +1 -1
  10. package/esm2022/lib/i18n/es_ateTranslations.mjs +230 -0
  11. package/esm2022/lib/i18n/pt_ateTranslations.mjs +220 -0
  12. package/esm2022/lib/models/ate-editor-config.model.mjs +1 -1
  13. package/esm2022/lib/models/ate-editor-ref.mjs +3 -3
  14. package/esm2022/lib/models/ate-image.model.mjs +12 -2
  15. package/esm2022/lib/services/ate-editor-commands.service.mjs +6 -3
  16. package/esm2022/lib/services/ate-i18n.service.mjs +19 -9
  17. package/esm2022/lib/services/ate-image.service.mjs +18 -11
  18. package/esm2022/lib/utils/ate-equality.utils.mjs +14 -0
  19. package/esm2022/lib/utils/ate-extensions.utils.mjs +79 -0
  20. package/esm2022/public-api.mjs +2 -1
  21. package/fesm2022/flogeez-angular-tiptap-editor.mjs +808 -50
  22. package/fesm2022/flogeez-angular-tiptap-editor.mjs.map +1 -1
  23. package/lib/components/bubble-menus/color/ate-color-bubble-menu.component.d.ts +1 -0
  24. package/lib/components/editor/angular-tiptap-editor.component.d.ts +12 -2
  25. package/lib/config/ate-slash-commands.config.d.ts +2 -0
  26. package/lib/extensions/ate-block-shortcuts.extension.d.ts +32 -0
  27. package/lib/i18n/ateTranslationsModel.d.ts +1 -1
  28. package/lib/i18n/es_ateTranslations.d.ts +2 -0
  29. package/lib/i18n/pt_ateTranslations.d.ts +2 -0
  30. package/lib/models/ate-editor-config.model.d.ts +8 -0
  31. package/lib/models/ate-image.model.d.ts +30 -2
  32. package/lib/services/ate-editor-commands.service.d.ts +2 -1
  33. package/lib/services/ate-i18n.service.d.ts +3 -1
  34. package/lib/services/ate-image.service.d.ts +5 -3
  35. package/lib/utils/ate-equality.utils.d.ts +2 -0
  36. package/lib/utils/ate-extensions.utils.d.ts +13 -0
  37. package/package.json +1 -1
  38. package/public-api.d.ts +1 -0
package/CHANGELOG.md CHANGED
@@ -5,6 +5,33 @@ All notable changes to `@flogeez/angular-tiptap-editor` will be documented in th
5
5
  The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
6
6
  and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html), with the exception that the major version is specifically aligned with the major version of [Tiptap](https://tiptap.dev).
7
7
 
8
+ ## [3.6.0] - 2026-10-26
9
+
10
+ ### Added
11
+
12
+ - **`starterKitOptions` Input**: New input (also available as `starterKitOptions` in `AteEditorConfig`) typed `Partial<StarterKitOptions>`, forwarded to `StarterKit.configure()` and merged over the library defaults (the default `link` options are kept). It lets apps disable or tune bundled extensions, e.g. `{ undoRedo: false }` to use `@tiptap/extension-collaboration` (Yjs) without the local history conflicting with Yjs' undo manager. Changing it at runtime re-creates the editor. (#61)
13
+ - **`imageRejected` Output**: Emits an `AteImageRejection` (`{ reason: 'invalid-type' | 'too-large' | 'upload-failed', file, source: 'paste' | 'drop' | 'picker' | 'api' }`) when an image file is not inserted, so apps can tell the user why. Covers clipboard files, drag-and-drop, the toolbar, slash-menu and bubble-menu pickers, and `uploadImage`. (#64)
14
+ - **`AteImageValidationError`**: Typed error (`reason: 'invalid-type' | 'too-large'`, translated `message`) thrown by the upload pipeline when `allowedTypes` or `maxSize` validation fails. (#64)
15
+ - **Brazilian Portuguese and Spanish Translations**: Built-in `pt` (Brazilian wording) and `es` locales covering every `AteTranslations` key, including slash command titles, descriptions and search keywords (English keywords are kept, so typing English still finds the command). (#68)
16
+ - **Block Keyboard Shortcuts**: `Mod+D` duplicates the current block right after it, and `Mod+Shift+ArrowUp` / `Mod+Shift+ArrowDown` move it up or down by one sibling, keeping the selection inside the moved block. Inside a list the block is the list or task item and it moves within its list. At the edges and in read-only editors the key event is not consumed. Enabled by default and controlled by the new `enableBlockShortcuts` input / config option. (#66)
17
+
18
+ ### Changed
19
+
20
+ - **Browser Language Detection**: Detection now matches any built-in or registered locale from `navigator.language`, so `pt-BR`, `es-MX` and `de-DE` pick `pt`, `es` and `de` automatically (previously only `fr` was auto-detected and all other browsers fell back to `en`). A regional tag such as `pt-BR` passed to `locale` or `setLocale()` resolves to its language translations. (#68)
21
+ - **Custom Extensions in `tiptapExtensions` Override Built-ins**: An extension passed in `tiptapExtensions` whose `name` matches a built-in ATE extension (`highlight`, `textStyle`, `textAlign`, `placeholder`, `resizableImage`, ...) or a `StarterKit` extension (`link`, `codeBlock`, `heading`, ...) now replaces the built-in extension instead of being silently dropped or duplicating the `StarterKit` extension. If the same `StarterKit` extension is also configured in `starterKitOptions`, the custom extension in `tiptapExtensions` takes precedence. In Angular development mode (`isDevMode()`), a one-time `[ATE]` `console.warn` per editor instance lists the replaced extensions, the ATE UI features and state calculators that depend on them, and any ignored `starterKitOptions` keys. (#70)
22
+
23
+ ### Fixed
24
+
25
+ - **Silent Image Validation Failures**: A file rejected for its type or size used to disappear with only a `console.error`, and file paste and drop turned the failure into an unhandled promise rejection. Failures are now reported through `imageRejected`, and paste, drop and the fire-and-forget commands (`execute('insertImage' | 'uploadImage')`, `AteEditorRef.insertImage` / `uploadImage`) no longer leak unhandled rejections. Awaited `uploadImage()` calls still reject. (#64)
26
+ - **`pastedImageRejected` Reasons**: A base64 image in pasted HTML rejected by validation now reports `invalid-type` or `too-large` instead of `upload-failed`, which stays reserved for upload handler failures. (#64)
27
+
28
+ ## [3.5.5] - 2026-10-26
29
+
30
+ ### Fixed
31
+
32
+ - **Color Picker Anchor in Seamless Mode**: The text color and highlight pickers opened from the bubble menu are now anchored to the selected text even when `seamless` is enabled. The colored-element lookup is now bounded to the elements inside the editor content. (#72)
33
+ - **Editor Re-created on Unrelated `config` Changes**: Any change to the `[config]` input (for example switching `theme` between `dark` and `light`) destroyed and re-created the Tiptap editor, losing the caret, selection, undo history and node views. The effective extensions, Tiptap options and Angular nodes are now compared by value, so a new array or object with the same content no longer re-initializes the editor. Changing the actual extension list, Tiptap options, Angular nodes or `blockControls` still does. (#62)
34
+
8
35
  ## [3.5.4] - 2026-10-21
9
36
 
10
37
  ### Added
package/README.md CHANGED
@@ -32,7 +32,7 @@ Yet, I've worked to keep it fully customizable: you can easily configure the edi
32
32
  - ⌨️ **UX First**: Slash commands (`/`) and context-aware bubble menus (Notion-like).
33
33
  - 📊 **Table Power**: Advanced management with cell selection and merging.
34
34
  - 🖼️ **Pro Media**: Image resizing, auto-compression, and custom uploaders.
35
- - 🌍 **Built-in i18n**: Support for English, French, and German out of the box.
35
+ - 🌍 **Built-in i18n**: Support for English, French, German, Brazilian Portuguese, and Spanish out of the box.
36
36
  - 📎 **Office-Ready**: Clean pasting from Word and Excel.
37
37
  - 🎨 **Highly Customizable**: Easily configure toolbars, bubble menus, and slash command items.
38
38
  - 🛠️ **Extensible**: Easily add custom Tiptap extensions and reactive state calculators.
@@ -180,7 +180,7 @@ Looking for deeper integration patterns? Explore our **[Advanced Usage Guide](./
180
180
 
181
181
  ## 🌍 i18n & 🎨 Styling
182
182
 
183
- - **Languages**: English, French, and German built-in. Detects browser language automatically. Extend with `AteI18nService.addTranslations()`.
183
+ - **Languages**: English (`en`), French (`fr`), German (`de`), Portuguese (`pt`, Brazilian wording) and Spanish (`es`) built-in. Detects browser language automatically (regional tags like `pt-BR` or `es-MX` resolve to their language). Extend with `AteI18nService.addTranslations()`.
184
184
  - **Styling**: Customize via CSS variables (e.g., `--ate-primary`, `--ate-border-radius`, and much more).
185
185
  - **Dark Mode**: Works natively by adding `.dark` or `[data-theme="dark"]`.
186
186
 
@@ -58,6 +58,16 @@ export class AteColorBubbleMenuComponent extends AteBaseSubBubbleMenu {
58
58
  }
59
59
  return false;
60
60
  }
61
+ findColoredElementInContent(start, contentRoot) {
62
+ let current = start;
63
+ while (current && current !== contentRoot && contentRoot.contains(current)) {
64
+ if (current.matches('[style*="color"], [style*="background"], mark')) {
65
+ return current;
66
+ }
67
+ current = current.parentElement;
68
+ }
69
+ return null;
70
+ }
61
71
  getSelectionRect() {
62
72
  const trigger = this.colorPickerSvc.menuTrigger();
63
73
  const ed = this.editor();
@@ -77,7 +87,7 @@ export class AteColorBubbleMenuComponent extends AteBaseSubBubbleMenu {
77
87
  try {
78
88
  const { node } = ed.view.domAtPos(from);
79
89
  const element = node instanceof Element ? node : node.parentElement;
80
- const colorElement = element?.closest('[style*="color"], [style*="background"], mark');
90
+ const colorElement = this.findColoredElementInContent(element, ed.view.dom);
81
91
  if (colorElement) {
82
92
  return colorElement.getBoundingClientRect();
83
93
  }
@@ -362,4 +372,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
362
372
  </div>
363
373
  `, styles: [".color-picker-container{display:flex;flex-direction:column;gap:8px}.dropdown-row{display:flex;align-items:center;width:100%}.dropdown-row.presets{justify-content:center}.dropdown-row.controls{gap:8px;justify-content:space-between;padding-top:4px;border-top:1px solid var(--ate-border, #e2e8f0)}.color-grid{display:grid;grid-template-columns:repeat(12,1fr);gap:4px;width:100%}:host ::ng-deep .color-swatch-btn .ate-button{width:100%;aspect-ratio:1;height:auto;border-radius:4px;border:1px solid rgba(0,0,0,.1);padding:0}:host ::ng-deep .color-swatch-btn .ate-button.is-active{border-color:var(--ate-primary, #3b82f6);box-shadow:0 0 0 2px #3b82f64d}:host ::ng-deep .btn-native-picker-trigger .ate-button{color:#fff;text-shadow:0 1px 2px rgba(0,0,0,.2)}.divider-v{width:1px;height:24px;background:var(--ate-border, #e2e8f0)}.hex-input-wrapper{flex:1;display:flex;align-items:center;background:var(--ate-surface-secondary, #f8fafc);border:1px solid var(--ate-border, #e2e8f0);border-radius:8px;padding:0 10px;height:32px;transition:border-color .15s ease}.hex-input-wrapper:focus-within{border-color:var(--ate-primary, #3b82f6);background:var(--ate-menu-bg, #ffffff)}.hex-hash{color:var(--ate-text-muted, #94a3b8);font-family:monospace;font-size:.875rem}.hex-input{background:transparent;border:none;outline:none;color:var(--ate-text, #1e293b);font-family:monospace;font-size:.875rem;width:100%;padding-left:4px}.native-trigger-wrapper{position:relative;width:32px;height:32px}.hidden-native-input{position:absolute;inset:0;opacity:0;width:100%;height:100%;cursor:pointer}\n"] }]
364
374
  }] });
365
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXRlLWNvbG9yLWJ1YmJsZS1tZW51LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2FuZ3VsYXItdGlwdGFwLWVkaXRvci9zcmMvbGliL2NvbXBvbmVudHMvYnViYmxlLW1lbnVzL2NvbG9yL2F0ZS1jb2xvci1idWJibGUtbWVudS5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNMLFNBQVMsRUFDVCx1QkFBdUIsRUFFdkIsTUFBTSxFQUNOLE1BQU0sRUFDTixRQUFRLEVBQ1IsU0FBUyxHQUNWLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMvQyxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFFN0MsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0sNENBQTRDLENBQUM7QUFDbkYsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sK0JBQStCLENBQUM7QUFDbkUsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0sa0NBQWtDLENBQUM7QUFDekUsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sa0NBQWtDLENBQUM7O0FBRXhFLE1BQU0sYUFBYSxHQUFHO0lBQ3BCLFNBQVM7SUFDVCxTQUFTO0lBQ1QsU0FBUztJQUNULFNBQVM7SUFDVCxTQUFTO0lBQ1QsU0FBUztJQUNULFNBQVM7SUFDVCxTQUFTO0lBQ1QsU0FBUztJQUNULFNBQVM7SUFDVCxTQUFTO0lBQ1QsU0FBUztDQUNWLENBQUM7QUFrTUYsTUFBTSxPQUFPLDJCQUE0QixTQUFRLG9CQUFvQjtJQWhNckU7O1FBaU1tQixtQkFBYyxHQUFHLE1BQU0sQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDO1FBRXZELE1BQUMsR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLE9BQU8sQ0FBQztRQUM3QixXQUFNLEdBQUcsSUFB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QUMvQixLQUFLLENBQUMsY0FBYyxFQUFFLENBQUM7UUFDekIsQ0FBQztJQUNILENBQUM7SUFFRCxPQUFPO1FBQ0wsSUFBSSxDQUFDLGNBQWMsQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDM0MsQ0FBQztJQUVELE1BQU07UUFDSixVQUFVLENBQUMsR0FBRyxFQUFFO1lBQ2QsSUFBSSxDQUFDLGNBQWMsQ0FBQyxjQUFjLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDMUMsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDO1FBQ3BCLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQztJQUNWLENBQUM7K0dBak5VLDJCQUEyQjttR0FBM0IsMkJBQTJCLHFPQTNMNUI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQThFVCwybURBL0VTLFlBQVksOEJBQUUsV0FBVywrQkFBRSxrQkFBa0IsNkxBQUUscUJBQXFCOzs0RkE0TG5FLDJCQUEyQjtrQkFoTXZDLFNBQVM7K0JBQ0UsdUJBQXVCLGNBQ3JCLElBQUksbUJBQ0MsdUJBQXVCLENBQUMsTUFBTSxXQUN0QyxDQUFDLFlBQVksRUFBRSxXQUFXLEVBQUUsa0JBQWtCLEVBQUUscUJBQXFCLENBQUMsWUFDckU7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQThFVCIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIENvbXBvbmVudCxcbiAgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksXG4gIEVsZW1lbnRSZWYsXG4gIHNpZ25hbCxcbiAgaW5qZWN0LFxuICBjb21wdXRlZCxcbiAgdmlld0NoaWxkLFxufSBmcm9tIFwiQGFuZ3VsYXIvY29yZVwiO1xuaW1wb3J0IHsgQ29tbW9uTW9kdWxlIH0gZnJvbSBcIkBhbmd1bGFyL2NvbW1vblwiO1xuaW1wb3J0IHsgRm9ybXNNb2R1bGUgfSBmcm9tIFwiQGFuZ3VsYXIvZm9ybXNcIjtcbmltcG9ydCB7IEluc3RhbmNlIGFzIFRpcHB5SW5zdGFuY2UgfSBmcm9tIFwidGlwcHkuanNcIjtcbmltcG9ydCB7IEF0ZUNvbG9yUGlja2VyU2VydmljZSB9IGZyb20gXCIuLi8uLi8uLi9zZXJ2aWNlcy9hdGUtY29sb3ItcGlja2VyLnNlcnZpY2VcIjtcbmltcG9ydCB7IEF0ZUJ1dHRvbkNvbXBvbmVudCB9IGZyb20gXCIuLi8uLi91aS9hdGUtYnV0dG9uLmNvbXBvbmVudFwiO1xuaW1wb3J0IHsgQXRlU2VwYXJhdG9yQ29tcG9uZW50IH0gZnJvbSBcIi4uLy4uL3VpL2F0ZS1zZXBhcmF0b3IuY29tcG9uZW50XCI7XG5pbXBvcnQgeyBBdGVCYXNlU3ViQnViYmxlTWVudSB9IGZyb20gXCIuLi9iYXNlL2F0ZS1iYXNlLXN1Yi1idWJibGUtbWVudVwiO1xuXG5jb25zdCBQUkVTRVRfQ09MT1JTID0gW1xuICBcIiMwMDAwMDBcIixcbiAgXCIjNjY2NjY2XCIsXG4gIFwiI0NDQ0NDQ1wiLFxuICBcIiNGRkZGRkZcIixcbiAgXCIjRjQ0MzM2XCIsXG4gIFwiI0ZGOTgwMFwiLFxuICBcIiNGRkVCM0JcIixcbiAgXCIjNENBRjUwXCIsXG4gIFwiIzAwQkNENFwiLFxuICBcIiMyMTk2RjNcIixcbiAgXCIjOUMyN0IwXCIsXG4gIFwiI0U5MUU2M1wiLFxuXTtcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiBcImF0ZS1jb2xvci1idWJibGUtbWVudVwiLFxuICBzdGFuZGFsb25lOiB0cnVlLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbiAgaW1wb3J0czogW0NvbW1vbk1vZHVsZSwgRm9ybXNNb2R1bGUsIEF0ZUJ1dHRvbkNvbXBvbmVudCwgQXRlU2VwYXJhdG9yQ29tcG9uZW50XSxcbiAgdGVtcGxhdGU6IGBcbiAgICA8ZGl2XG4gICAgICAjbWVudVJlZlxuICAgICAgY2xhc3M9XCJidWJibGUtbWVudSBjb2xvci1idWJibGUtbWVudVwiXG4gICAgICAobW91c2Vkb3duKT1cIm9uTW91c2VEb3duKCRldmVudClcIlxuICAgICAgKGNsaWNrKT1cIiRldmVudC5zdG9wUHJvcGFnYXRpb24oKVwiXG4gICAgICAoa2V5ZG93bik9XCIkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKClcIlxuICAgICAgKGtleWRvd24uZXNjYXBlKT1cIm9uQXBwbHkoJGV2ZW50KVwiXG4gICAgICB0YWJpbmRleD1cIi0xXCJcbiAgICAgIHJvbGU9XCJkaWFsb2dcIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJjb2xvci1waWNrZXItY29udGFpbmVyXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJkcm9wZG93bi1yb3cgcHJlc2V0c1wiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2xvci1ncmlkXCI+XG4gICAgICAgICAgICBAZm9yIChjb2xvciBvZiBwcmVzZXRzOyB0cmFjayBjb2xvcikge1xuICAgICAgICAgICAgICA8YXRlLWJ1dHRvblxuICAgICAgICAgICAgICAgIGNsYXNzPVwiY29sb3Itc3dhdGNoLWJ0blwiXG4gICAgICAgICAgICAgICAgc2l6ZT1cInNtYWxsXCJcbiAgICAgICAgICAgICAgICBbdGl0bGVdPVwiY29sb3JcIlxuICAgICAgICAgICAgICAgIFthY3RpdmVdPVwiaXNDb2xvckFjdGl2ZShjb2xvcilcIlxuICAgICAgICAgICAgICAgIFtiYWNrZ3JvdW5kQ29sb3JdPVwiY29sb3JcIlxuICAgICAgICAgICAgICAgIChidXR0b25DbGljayk9XCJhcHBseUNvbG9yKGNvbG9yLCB0cnVlLCAkZXZlbnQpXCI+PC9hdGUtYnV0dG9uPlxuICAgICAgICAgICAgfVxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cblxuICAgICAgICA8ZGl2IGNsYXNzPVwiZHJvcGRvd24tcm93IGNvbnRyb2xzXCI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImhleC1pbnB1dC13cmFwcGVyXCI+XG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cImhleC1oYXNoXCI+Izwvc3Bhbj5cbiAgICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgICAjaGV4SW5wdXRcbiAgICAgICAgICAgICAgdHlwZT1cInRleHRcIlxuICAgICAgICAgICAgICBjbGFzcz1cImhleC1pbnB1dFwiXG4gICAgICAgICAgICAgIFt2YWx1ZV09XCJoZXhWYWx1ZSgpXCJcbiAgICAgICAgICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCJ0KCkuY3VzdG9tQ29sb3JcIlxuICAgICAgICAgICAgICAoaW5wdXQpPVwib25IZXhJbnB1dCgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgKGNoYW5nZSk9XCJvbkhleENoYW5nZSgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgKGtleWRvd24uZW50ZXIpPVwib25BcHBseSgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgKGZvY3VzKT1cIm9uRm9jdXMoKVwiXG4gICAgICAgICAgICAgIChibHVyKT1cIm9uQmx1cigpXCJcbiAgICAgICAgICAgICAgbWF4bGVuZ3RoPVwiNlwiXG4gICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiMDAwMDAwXCIgLz5cbiAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJuYXRpdmUtdHJpZ2dlci13cmFwcGVyXCI+XG4gICAgICAgICAgICA8YXRlLWJ1dHRvblxuICAgICAgICAgICAgICBjbGFzcz1cImJ0bi1uYXRpdmUtcGlja2VyLXRyaWdnZXJcIlxuICAgICAgICAgICAgICBpY29uPVwiY3VzdG9tQ29sb3JcIlxuICAgICAgICAgICAgICBbdGl0bGVdPVwidCgpLmN1c3RvbUNvbG9yXCJcbiAgICAgICAgICAgICAgW2JhY2tncm91bmRDb2xvcl09XCJjdXJyZW50Q29sb3IoKVwiXG4gICAgICAgICAgICAgIChidXR0b25DbGljayk9XCJ0cmlnZ2VyTmF0aXZlUGlja2VyKCRldmVudClcIj48L2F0ZS1idXR0b24+XG4gICAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgICAgI2NvbG9ySW5wdXRcbiAgICAgICAgICAgICAgdHlwZT1cImNvbG9yXCJcbiAgICAgICAgICAgICAgY2xhc3M9XCJoaWRkZW4tbmF0aXZlLWlucHV0XCJcbiAgICAgICAgICAgICAgW3ZhbHVlXT1cImN1cnJlbnRDb2xvcigpXCJcbiAgICAgICAgICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCJ0KCkuY3VzdG9tQ29sb3JcIlxuICAgICAgICAgICAgICAoaW5wdXQpPVwib25OYXRpdmVJbnB1dCgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgKGNoYW5nZSk9XCJvbk5hdGl2ZUNoYW5nZSgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgKGZvY3VzKT1cIm9uRm9jdXMoKVwiXG4gICAgICAgICAgICAgIChibHVyKT1cIm9uQmx1cigpXCIgLz5cbiAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgIDxhdGUtYnV0dG9uXG4gICAgICAgICAgICBpY29uPVwiYXBwbHlcIlxuICAgICAgICAgICAgW3RpdGxlXT1cImNvbW1vbigpLmFwcGx5XCJcbiAgICAgICAgICAgIGNvbG9yPVwidmFyKC0tYXRlLXByaW1hcnkpXCJcbiAgICAgICAgICAgIChidXR0b25DbGljayk9XCJvbkFwcGx5KCRldmVudClcIj48L2F0ZS1idXR0b24+XG5cbiAgICAgICAgICA8YXRlLXNlcGFyYXRvciAvPlxuXG4gICAgICAgICAgPGF0ZS1idXR0b25cbiAgICAgICAgICAgIGljb249XCJ1bnNldENvbG9yXCJcbiAgICAgICAgICAgIFt0aXRsZV09XCJ0KCkuY2xlYXJcIlxuICAgICAgICAgICAgdmFyaWFudD1cImRhbmdlclwiXG4gICAgICAgICAgICAoYnV0dG9uQ2xpY2spPVwib25DbGVhckNvbG9yKCRldmVudClcIj48L2F0ZS1idXR0b24+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gIGAsXG4gIHN0eWxlczogW1xuICAgIGBcbiAgICAgIC5jb2xvci1waWNrZXItY29udGFpbmVyIHtcbiAgICAgICAgZGlzcGxheTogZmxleDtcbiAgICAgICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcbiAgICAgICAgZ2FwOiA4cHg7XG4gICAgICB9XG5cbiAgICAgIC5kcm9wZG93bi1yb3cge1xuICAgICAgICBkaXNwbGF5OiBmbGV4O1xuICAgICAgICBhbGlnbi1pdGVtczogY2VudGVyO1xuICAgICAgICB3aWR0aDogMTAwJTtcbiAgICAgIH1cblxuICAgICAgLmRyb3Bkb3duLXJvdy5wcmVzZXRzIHtcbiAgICAgICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7XG4gICAgICB9XG5cbiAgICAgIC5kcm9wZG93bi1yb3cuY29udHJvbHMge1xuICAgICAgICBnYXA6IDhweDtcbiAgICAgICAganVzdGlmeS1jb250ZW50OiBzcGFjZS1iZXR3ZWVuO1xuICAgICAgICBwYWRkaW5nLXRvcDogNHB4O1xuICAgICAgICBib3JkZXItdG9wOiAxcHggc29saWQgdmFyKC0tYXRlLWJvcmRlciwgI2UyZThmMCk7XG4gICAgICB9XG5cbiAgICAgIC5jb2xvci1ncmlkIHtcbiAgICAgICAgZGlzcGxheTogZ3JpZDtcbiAgICAgICAgZ3JpZC10ZW1wbGF0ZS1jb2x1bW5zOiByZXBlYXQoMTIsIDFmcik7XG4gICAgICAgIGdhcDogNHB4O1xuICAgICAgICB3aWR0aDogMTAwJTtcbiAgICAgIH1cblxuICAgICAgOmhvc3QgOjpuZy1kZWVwIC5jb2xvci1zd2F0Y2gtYnRuIC5hdGUtYnV0dG9uIHtcbiAgICAgICAgd2lkdGg6IDEwMCU7XG4gICAgICAgIGFzcGVjdC1yYXRpbzogMTtcbiAgICAgICAgaGVpZ2h0OiBhdXRvO1xuICAgICAgICBib3JkZXItcmFkaXVzOiA0cHg7XG4gICAgICAgIGJvcmRlcjogMXB4IHNvbGlkIHJnYmEoMCwgMCwgMCwgMC4xKTtcbiAgICAgICAgcGFkZGluZzogMDtcbiAgICAgIH1cblxuICAgICAgOmhvc3QgOjpuZy1kZWVwIC5jb2xvci1zd2F0Y2gtYnRuIC5hdGUtYnV0dG9uLmlzLWFjdGl2ZSB7XG4gICAgICAgIGJvcmRlci1jb2xvcjogdmFyKC0tYXRlLXByaW1hcnksICMzYjgyZjYpO1xuICAgICAgICBib3gtc2hhZG93OiAwIDAgMCAycHggcmdiYSg1OSwgMTMwLCAyNDYsIDAuMyk7XG4gICAgICB9XG5cbiAgICAgIDpob3N0IDo6bmctZGVlcCAuYnRuLW5hdGl2ZS1waWNrZXItdHJpZ2dlciAuYXRlLWJ1dHRvbiB7XG4gICAgICAgIGNvbG9yOiAjZmZmZmZmO1xuICAgICAgICB0ZXh0LXNoYWRvdzogMCAxcHggMnB4IHJnYmEoMCwgMCwgMCwgMC4yKTtcbiAgICAgIH1cblxuICAgICAgLmRpdmlkZXItdiB7XG4gICAgICAgIHdpZHRoOiAxcHg7XG4gICAgICAgIGhlaWdodDogMjRweDtcbiAgICAgICAgYmFja2dyb3VuZDogdmFyKC0tYXRlLWJvcmRlciwgI2UyZThmMCk7XG4gICAgICB9XG5cbiAgICAgIC5oZXgtaW5wdXQtd3JhcHBlciB7XG4gICAgICAgIGZsZXg6IDE7XG4gICAgICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gICAgICAgIGJhY2tncm91bmQ6IHZhcigtLWF0ZS1zdXJmYWNlLXNlY29uZGFyeSwgI2Y4ZmFmYyk7XG4gICAgICAgIGJvcmRlcjogMXB4IHNvbGlkIHZhcigtLWF0ZS1ib3JkZXIsICNlMmU4ZjApO1xuICAgICAgICBib3JkZXItcmFkaXVzOiA4cHg7XG4gICAgICAgIHBhZGRpbmc6IDAgMTBweDtcbiAgICAgICAgaGVpZ2h0OiAzMnB4O1xuICAgICAgICB0cmFuc2l0aW9uOiBib3JkZXItY29sb3IgMTUwbXMgZWFzZTtcbiAgICAgIH1cblxuICAgICAgLmhleC1pbnB1dC13cmFwcGVyOmZvY3VzLXdpdGhpbiB7XG4gICAgICAgIGJvcmRlci1jb2xvcjogdmFyKC0tYXRlLXByaW1hcnksICMzYjgyZjYpO1xuICAgICAgICBiYWNrZ3JvdW5kOiB2YXIoLS1hdGUtbWVudS1iZywgI2ZmZmZmZik7XG4gICAgICB9XG5cbiAgICAgIC5oZXgtaGFzaCB7XG4gICAgICAgIGNvbG9yOiB2YXIoLS1hdGUtdGV4dC1tdXRlZCwgIzk0YTNiOCk7XG4gICAgICAgIGZvbnQtZmFtaWx5OiBtb25vc3BhY2U7XG4gICAgICAgIGZvbnQtc2l6ZTogMC44NzVyZW07XG4gICAgICB9XG5cbiAgICAgIC5oZXgtaW5wdXQge1xuICAgICAgICBiYWNrZ3JvdW5kOiB0cmFuc3BhcmVudDtcbiAgICAgICAgYm9yZGVyOiBub25lO1xuICAgICAgICBvdXRsaW5lOiBub25lO1xuICAgICAgICBjb2xvcjogdmFyKC0tYXRlLXRleHQsICMxZTI5M2IpO1xuICAgICAgICBmb250LWZhbWlseTogbW9ub3NwYWNlO1xuICAgICAgICBmb250LXNpemU6IDAuODc1cmVtO1xuICAgICAgICB3aWR0aDogMTAwJTtcbiAgICAgICAgcGFkZGluZy1sZWZ0OiA0cHg7XG4gICAgICB9XG5cbiAgICAgIC5uYXRpdmUtdHJpZ2dlci13cmFwcGVyIHtcbiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlO1xuICAgICAgICB3aWR0aDogMzJweDtcbiAgICAgICAgaGVpZ2h0OiAzMnB4O1xuICAgICAgfVxuXG4gICAgICAuaGlkZGVuLW5hdGl2ZS1pbnB1dCB7XG4gICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgICAgICAgaW5zZXQ6IDA7XG4gICAgICAgIG9wYWNpdHk6IDA7XG4gICAgICAgIHdpZHRoOiAxMDAlO1xuICAgICAgICBoZWlnaHQ6IDEwMCU7XG4gICAgICAgIGN1cnNvcjogcG9pbnRlcjtcbiAgICAgIH1cbiAgICBgLFxuICBdLFxufSlcbmV4cG9ydCBjbGFzcyBBdGVDb2xvckJ1YmJsZU1lbnVDb21wb25lbnQgZXh0ZW5kcyBBdGVCYXNlU3ViQnViYmxlTWVudSB7XG4gIHByaXZhdGUgcmVhZG9ubHkgY29sb3JQaWNrZXJTdmMgPSBpbmplY3QoQXRlQ29sb3JQaWNrZXJTZXJ2aWNlKTtcblxuICByZWFkb25seSB0ID0gdGhpcy5pMThuU2VydmljZS50b29sYmFyO1xuICByZWFkb25seSBjb21tb24gPSB0aGlzLmkxOG5TZXJ2aWNlLmNvbW1vbjtcbiAgcmVhZG9ubHkgcHJlc2V0cyA9IFBSRVNFVF9DT0xPUlM7XG5cbiAgcHJpdmF0ZSBjb2xvcklucHV0UmVmID0gdmlld0NoaWxkPEVsZW1lbnRSZWY8SFRNTElucHV0RWxlbWVudD4+KFwiY29sb3JJbnB1dFwiKTtcblxuICAvKipcbiAgICogTE9DQUwgTU9ERTogV2UgbG9jayB0aGUgbW9kZSB3aGVuIHRoZSBtZW51IGlzIHNob3duIHRvIGF2b2lkIHJhY2UgY29uZGl0aW9uc1xuICAgKiB3aGVyZSB0aGUgcGFyZW50IChidWJibGUgbWVudSkgY2xlYXJzIHRoZSBnbG9iYWwgc2lnbmFsIGJlZm9yZSB3ZSBhcHBseSB0aGUgY29sb3IuXG4gICAqL1xuICBhY3RpdmVNb2RlID0gc2lnbmFsPFwidGV4dFwiIHwgXCJoaWdobGlnaHRcIj4oXCJ0ZXh0XCIpO1xuXG4gIHByb3RlY3RlZCBvdmVycmlkZSBvblN0YXRlQ2hhbmdlKCkge1xuICAgIHRoaXMuY29sb3JQaWNrZXJTdmMuZWRpdE1vZGUoKTtcbiAgICB0aGlzLmNvbG9yUGlja2VyU3ZjLm1lbnVUcmlnZ2VyKCk7XG4gICAgdGhpcy5jb2xvclBpY2tlclN2Yy5pc0ludGVyYWN0aW5nKCk7XG4gIH1cblxuICBvdmVycmlkZSBzaG91bGRTaG93KCk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IHsgaXNFZGl0YWJsZSB9ID0gdGhpcy5zdGF0ZSgpO1xuICAgIGlmICghaXNFZGl0YWJsZSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGlmICh0aGlzLmNvbG9yUGlja2VyU3ZjLmVkaXRNb2RlKCkgIT09IG51bGwgfHwgdGhpcy5jb2xvclBpY2tlclN2Yy5pc0ludGVyYWN0aW5nKCkpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIG92ZXJyaWRlIGdldFNlbGVjdGlvblJlY3QoKTogRE9NUmVjdCB7XG4gICAgY29uc3QgdHJpZ2dlciA9IHRoaXMuY29sb3JQaWNrZXJTdmMubWVudVRyaWdnZXIoKTtcbiAgICBjb25zdCBlZCA9IHRoaXMuZWRpdG9yKCk7XG4gICAgaWYgKCFlZCkge1xuICAgICAgcmV0dXJuIG5ldyBET01SZWN0KDAsIDAsIDAsIDApO1xuICAgIH1cblxuICAgIC8vIDEuIElmIHdlIGhhdmUgYSBzdGFibGUgdHJpZ2dlciBmcm9tIHNlcnZpY2UgKHRvb2xiYXIgb3IgcGFyZW50IG1lbnUpLCBhbmNob3IgdG8gaXRcbiAgICBpZiAodHJpZ2dlcikge1xuICAgICAgY29uc3QgcmVjdCA9IHRyaWdnZXIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgICAvLyBPbmx5IHVzZSBpZiBpdCdzIHN0aWxsIHZpc2libGUvaW4gRE9NICh3aWR0aCA+IDApXG4gICAgICBpZiAocmVjdC53aWR0aCA+IDApIHtcbiAgICAgICAgcmV0dXJuIHJlY3Q7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gMi4gT3RoZXJ3aXNlIChidWJibGUgbWVudSAvIHJlbGF5KSwgYW5jaG9yIHRvIHRleHQgc2VsZWN0aW9uXG4gICAgY29uc3QgeyBmcm9tIH0gPSBlZC5zdGF0ZS5zZWxlY3Rpb247XG5cbiAgICB0cnkge1xuICAgICAgY29uc3QgeyBub2RlIH0gPSBlZC52aWV3LmRvbUF0UG9zKGZyb20pO1xuICAgICAgY29uc3QgZWxlbWVudCA9IG5vZGUgaW5zdGFuY2VvZiBFbGVtZW50ID8gbm9kZSA6IG5vZGUucGFyZW50RWxlbWVudDtcbiAgICAgIGNvbnN0IGNvbG9yRWxlbWVudCA9IChlbGVtZW50IGFzIEVsZW1lbnQpPy5jbG9zZXN0KFxuICAgICAgICAnW3N0eWxlKj1cImNvbG9yXCJdLCBbc3R5bGUqPVwiYmFja2dyb3VuZFwiXSwgbWFyaydcbiAgICAgICk7XG4gICAgICBpZiAoY29sb3JFbGVtZW50KSB7XG4gICAgICAgIHJldHVybiBjb2xvckVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoX2UpIHtcbiAgICAgIC8qIGlnbm9yZSAqL1xuICAgIH1cblxuICAgIC8vIFVzZSBuYXRpdmUgc2VsZWN0aW9uIGZvciBtdWx0aS1saW5lIGFjY3VyYWN5XG4gICAgY29uc3Qgc2VsZWN0aW9uID0gdHlwZW9mIHdpbmRvdyAhPT0gXCJ1bmRlZmluZWRcIiA/IHdpbmRvdy5nZXRTZWxlY3Rpb24oKSA6IG51bGw7XG4gICAgaWYgKHNlbGVjdGlvbiAmJiBzZWxlY3Rpb24ucmFuZ2VDb3VudCA+IDApIHtcbiAgICAgIGNvbnN0IHJhbmdlID0gc2VsZWN0aW9uLmdldFJhbmdlQXQoMCk7XG4gICAgICBjb25zdCByZWN0ID0gcmFuZ2UuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgICBpZiAocmVjdC53aWR0aCA+IDAgJiYgcmVjdC5oZWlnaHQgPiAwKSB7XG4gICAgICAgIHJldHVybiByZWN0O1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIEZpbmFsIGZhbGxiYWNrIHRvIGNvb3JkaW5hdGVzIGF0IGN1cnNvclxuICAgIGNvbnN0IHsgdG9wLCBib3R0b20sIGxlZnQsIHJpZ2h0IH0gPSBlZC52aWV3LmNvb3Jkc0F0UG9zKGZyb20pO1xuICAgIHJldHVybiBuZXcgRE9NUmVjdChsZWZ0LCB0b3AsIHJpZ2h0IC0gbGVmdCwgYm90dG9tIC0gdG9wKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBvdmVycmlkZSBvblRpcHB5U2hvdyhfaW5zdGFuY2U6IFRpcHB5SW5zdGFuY2UpIHtcbiAgICAvLyAxLiBMb2NrIHRoZSBtb2RlIGltbWVkaWF0ZWx5IHRvIGJlIGltbXVuZSB0byBleHRlcm5hbCBzaWduYWwgY2hhbmdlc1xuICAgIGNvbnN0IGN1cnJlbnRNb2RlID0gdGhpcy5jb2xvclBpY2tlclN2Yy5lZGl0TW9kZSgpIHx8IFwidGV4dFwiO1xuICAgIHRoaXMuYWN0aXZlTW9kZS5zZXQoY3VycmVudE1vZGUpO1xuXG4gICAgLy8gMi4gQ2FwdHVyZSBzZWxlY3Rpb24gZm9yIHRoZSBjb21tYW5kIGZhbGxiYWNrXG4gICAgdGhpcy5jb2xvclBpY2tlclN2Yy5jYXB0dXJlU2VsZWN0aW9uKHRoaXMuZWRpdG9yKCkpO1xuICB9XG5cbiAgcHJvdGVjdGVkIG92ZXJyaWRlIG9uVGlwcHlIaWRlKF9pbnN0YW5jZTogVGlwcHlJbnN0YW5jZSkge1xuICAgIC8vIENsZWFyIHRyaWdnZXIgb25seSBBRlRFUiB0aGUgbWVudSBpcyBoaWRkZW4gdG8gbWFpbnRhaW4gYW5jaG9yIHN0YWJpbGl0eSBkdXJpbmcgYW5pbWF0aW9uXG4gICAgdGhpcy5jb2xvclBpY2tlclN2Yy5kb25lKCk7XG4gICAgdGhpcy5jb2xvclBpY2tlclN2Yy5jbG9zZSgpO1xuICB9XG5cbiAgcmVhZG9ubHkgY3VycmVudENvbG9yID0gY29tcHV0ZWQoKCkgPT4ge1xuICAgIGNvbnN0IG1hcmtzID0gdGhpcy5zdGF0ZSgpLm1hcmtzO1xuICAgIGNvbnN0IGNvbG9yID0gdGhpcy5hY3RpdmVNb2RlKCkgPT09IFwidGV4dFwiID8gbWFya3MuY29tcHV0ZWRDb2xvciA6IG1hcmtzLmNvbXB1dGVkQmFja2dyb3VuZDtcbiAgICByZXR1cm4gY29sb3IgfHwgKHRoaXMuYWN0aXZlTW9kZSgpID09PSBcInRleHRcIiA/IFwiIzAwMDAwMFwiIDogXCIjZmZmZjAwXCIpO1xuICB9KTtcblxuICByZWFkb25seSBoZXhWYWx1ZSA9IGNvbXB1dGVkKCgpID0+IHtcbiAgICBjb25zdCBjb2xvciA9IHRoaXMuY3VycmVudENvbG9yKCk7XG4gICAgcmV0dXJuIGNvbG9yLnJlcGxhY2UoXCIjXCIsIFwiXCIpLnRvVXBwZXJDYXNlKCk7XG4gIH0pO1xuXG4gIGlzQ29sb3JBY3RpdmUoY29sb3I6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAoXG4gICAgICB0aGlzLmNvbG9yUGlja2VyU3ZjLm5vcm1hbGl6ZUNvbG9yKHRoaXMuY3VycmVudENvbG9yKCkpID09PVxuICAgICAgdGhpcy5jb2xvclBpY2tlclN2Yy5ub3JtYWxpemVDb2xvcihjb2xvcilcbiAgICApO1xuICB9XG5cbiAgYXBwbHlDb2xvcihjb2xvcjogc3RyaW5nLCBhZGRUb0hpc3RvcnkgPSB0cnVlLCBldmVudD86IEV2ZW50KSB7XG4gICAgaWYgKGV2ZW50KSB7XG4gICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgfVxuXG4gICAgY29uc3QgZWRpdG9yID0gdGhpcy5lZGl0b3IoKTtcbiAgICAvLyBVc2Ugb3VyIExPQ0tFRCBtb2RlIGluc3RlYWQgb2YgdGhlIGdsb2JhbCBzaWduYWxcbiAgICAvLyBEZXRlcm1pbmUgaWYgd2Ugc2hvdWxkIGZvY3VzIGJhY2sgdG8gdGhlIGVkaXRvci5cbiAgICBjb25zdCBzaG91bGRGb2N1cyA9ICF0aGlzLmNvbG9yUGlja2VyU3ZjLmlzSW50ZXJhY3RpbmcoKTtcblxuICAgIGlmICh0aGlzLmFjdGl2ZU1vZGUoKSA9PT0gXCJ0ZXh0XCIpIHtcbiAgICAgIHRoaXMuY29sb3JQaWNrZXJTdmMuYXBwbHlDb2xvcihlZGl0b3IsIGNvbG9yLCBhZGRUb0hpc3RvcnksIHNob3VsZEZvY3VzKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5jb2xvclBpY2tlclN2Yy5hcHBseUhpZ2hsaWdodChlZGl0b3IsIGNvbG9yLCBhZGRUb0hpc3RvcnksIHNob3VsZEZvY3VzKTtcbiAgICB9XG4gIH1cblxuICBvbkFwcGx5KGV2ZW50PzogRXZlbnQpIHtcbiAgICBpZiAoZXZlbnQpIHtcbiAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICB9XG4gICAgdGhpcy5jb2xvclBpY2tlclN2Yy5jbG9zZSgpO1xuICB9XG5cbiAgb25IZXhJbnB1dChldmVudDogRXZlbnQpIHtcbiAgICBjb25zdCBpbnB1dCA9IGV2ZW50LnRhcmdldCBhcyBIVE1MSW5wdXRFbGVtZW50O1xuICAgIGxldCB2YWx1ZSA9IGlucHV0LnZhbHVlLnRyaW0oKTtcbiAgICBpZiAoIXZhbHVlLnN0YXJ0c1dpdGgoXCIjXCIpKSB7XG4gICAgICB2YWx1ZSA9IFwiI1wiICsgdmFsdWU7XG4gICAgfVxuICAgIGlmICgvXiM/WzAtOUEtRmEtZl17Myw2fSQvLnRlc3QodmFsdWUpKSB7XG4gICAgICB0aGlzLmFwcGx5Q29sb3IodmFsdWUsIGZhbHNlKTtcbiAgICB9XG4gIH1cblxuICBvbkhleENoYW5nZShldmVudDogRXZlbnQpIHtcbiAgICBjb25zdCBpbnB1dCA9IGV2ZW50LnRhcmdldCBhcyBIVE1MSW5wdXRFbGVtZW50O1xuICAgIGxldCB2YWx1ZSA9IGlucHV0LnZhbHVlLnRyaW0oKTtcbiAgICBpZiAoIXZhbHVlLnN0YXJ0c1dpdGgoXCIjXCIpKSB7XG4gICAgICB2YWx1ZSA9IFwiI1wiICsgdmFsdWU7XG4gICAgfVxuICAgIGlmICgvXiM/WzAtOUEtRmEtZl17Myw2fSQvLnRlc3QodmFsdWUpKSB7XG4gICAgICB0aGlzLmFwcGx5Q29sb3IodmFsdWUsIHRydWUsIGV2ZW50KTtcbiAgICB9XG4gIH1cblxuICB0cmlnZ2VyTmF0aXZlUGlja2VyKGV2ZW50PzogRXZlbnQpIHtcbiAgICBpZiAoZXZlbnQpIHtcbiAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICB9XG4gICAgdGhpcy5jb2xvcklucHV0UmVmKCk/Lm5hdGl2ZUVsZW1lbnQuY2xpY2soKTtcbiAgfVxuXG4gIG9uTmF0aXZlSW5wdXQoZXZlbnQ6IEV2ZW50KSB7XG4gICAgdGhpcy5hcHBseUNvbG9yKChldmVudC50YXJnZXQgYXMgSFRNTElucHV0RWxlbWVudCkudmFsdWUsIGZhbHNlKTtcbiAgfVxuXG4gIG9uTmF0aXZlQ2hhbmdlKGV2ZW50OiBFdmVudCkge1xuICAgIHRoaXMuYXBwbHlDb2xvcigoZXZlbnQudGFyZ2V0IGFzIEhUTUxJbnB1dEVsZW1lbnQpLnZhbHVlLCB0cnVlLCBldmVudCk7XG4gIH1cblxuICBvbkNsZWFyQ29sb3IoZXZlbnQ/OiBFdmVudCkge1xuICAgIGlmIChldmVudCkge1xuICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgIH1cblxuICAgIGNvbnN0IGVkaXRvciA9IHRoaXMuZWRpdG9yKCk7XG4gICAgaWYgKHRoaXMuYWN0aXZlTW9kZSgpID09PSBcInRleHRcIikge1xuICAgICAgdGhpcy5jb2xvclBpY2tlclN2Yy51bnNldENvbG9yKGVkaXRvcik7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuY29sb3JQaWNrZXJTdmMudW5zZXRIaWdobGlnaHQoZWRpdG9yKTtcbiAgICB9XG4gIH1cblxuICBvbk1vdXNlRG93bihldmVudDogTW91c2VFdmVudCkge1xuICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgIGNvbnN0IHRhcmdldCA9IGV2ZW50LnRhcmdldCBhcyBIVE1MRWxlbWVudDtcbiAgICBpZiAodGFyZ2V0LnRhZ05hbWUgIT09IFwiSU5QVVRcIikge1xuICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICB9XG4gIH1cblxuICBvbkZvY3VzKCkge1xuICAgIHRoaXMuY29sb3JQaWNrZXJTdmMuc2V0SW50ZXJhY3RpbmcodHJ1ZSk7XG4gIH1cblxuICBvbkJsdXIoKSB7XG4gICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICB0aGlzLmNvbG9yUGlja2VyU3ZjLnNldEludGVyYWN0aW5nKGZhbHNlKTtcbiAgICAgIHRoaXMudXBkYXRlTWVudSgpO1xuICAgIH0sIDE1MCk7XG4gIH1cbn1cbiJdfQ==
375
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXRlLWNvbG9yLWJ1YmJsZS1tZW51LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2FuZ3VsYXItdGlwdGFwLWVkaXRvci9zcmMvbGliL2NvbXBvbmVudHMvYnViYmxlLW1lbnVzL2NvbG9yL2F0ZS1jb2xvci1idWJibGUtbWVudS5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNMLFNBQVMsRUFDVCx1QkFBdUIsRUFFdkIsTUFBTSxFQUNOLE1BQU0sRUFDTixRQUFRLEVBQ1IsU0FBUyxHQUNWLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMvQyxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFFN0MsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0sNENBQTRDLENBQUM7QUFDbkYsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sK0JBQStCLENBQUM7QUFDbkUsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0sa0NBQWtDLENBQUM7QUFDekUsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sa0NBQWtDLENBQUM7O0FBRXhFLE1BQU0sYUFBYSxHQUFHO0lBQ3BCLFNBQVM7SUFDVCxTQUFTO0lBQ1QsU0FBUztJQUNULFNBQVM7SUFDVCxTQUFTO0lBQ1QsU0FBUztJQUNULFNBQVM7SUFDVCxTQUFTO0lBQ1QsU0FBUztJQUNULFNBQVM7SUFDVCxTQUFTO0lBQ1QsU0FBUztDQUNWLENBQUM7QUFrTUYsTUFBTSxPQUFPLDJCQUE0QixTQUFRLG9CQUFvQjtJQWhNckU7O1FBaU1tQixtQkFBYyxHQUFHLE1BQU0sQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDO1FBRXZELE1BQUMsR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLE9BQU8sQ0FBQztRQUM3QixXQUFNLEdBQUcsSUFB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QUUscUJBQXFCLENBQUMsWUFDckU7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQThFVCIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIENvbXBvbmVudCxcbiAgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksXG4gIEVsZW1lbnRSZWYsXG4gIHNpZ25hbCxcbiAgaW5qZWN0LFxuICBjb21wdXRlZCxcbiAgdmlld0NoaWxkLFxufSBmcm9tIFwiQGFuZ3VsYXIvY29yZVwiO1xuaW1wb3J0IHsgQ29tbW9uTW9kdWxlIH0gZnJvbSBcIkBhbmd1bGFyL2NvbW1vblwiO1xuaW1wb3J0IHsgRm9ybXNNb2R1bGUgfSBmcm9tIFwiQGFuZ3VsYXIvZm9ybXNcIjtcbmltcG9ydCB7IEluc3RhbmNlIGFzIFRpcHB5SW5zdGFuY2UgfSBmcm9tIFwidGlwcHkuanNcIjtcbmltcG9ydCB7IEF0ZUNvbG9yUGlja2VyU2VydmljZSB9IGZyb20gXCIuLi8uLi8uLi9zZXJ2aWNlcy9hdGUtY29sb3ItcGlja2VyLnNlcnZpY2VcIjtcbmltcG9ydCB7IEF0ZUJ1dHRvbkNvbXBvbmVudCB9IGZyb20gXCIuLi8uLi91aS9hdGUtYnV0dG9uLmNvbXBvbmVudFwiO1xuaW1wb3J0IHsgQXRlU2VwYXJhdG9yQ29tcG9uZW50IH0gZnJvbSBcIi4uLy4uL3VpL2F0ZS1zZXBhcmF0b3IuY29tcG9uZW50XCI7XG5pbXBvcnQgeyBBdGVCYXNlU3ViQnViYmxlTWVudSB9IGZyb20gXCIuLi9iYXNlL2F0ZS1iYXNlLXN1Yi1idWJibGUtbWVudVwiO1xuXG5jb25zdCBQUkVTRVRfQ09MT1JTID0gW1xuICBcIiMwMDAwMDBcIixcbiAgXCIjNjY2NjY2XCIsXG4gIFwiI0NDQ0NDQ1wiLFxuICBcIiNGRkZGRkZcIixcbiAgXCIjRjQ0MzM2XCIsXG4gIFwiI0ZGOTgwMFwiLFxuICBcIiNGRkVCM0JcIixcbiAgXCIjNENBRjUwXCIsXG4gIFwiIzAwQkNENFwiLFxuICBcIiMyMTk2RjNcIixcbiAgXCIjOUMyN0IwXCIsXG4gIFwiI0U5MUU2M1wiLFxuXTtcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiBcImF0ZS1jb2xvci1idWJibGUtbWVudVwiLFxuICBzdGFuZGFsb25lOiB0cnVlLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbiAgaW1wb3J0czogW0NvbW1vbk1vZHVsZSwgRm9ybXNNb2R1bGUsIEF0ZUJ1dHRvbkNvbXBvbmVudCwgQXRlU2VwYXJhdG9yQ29tcG9uZW50XSxcbiAgdGVtcGxhdGU6IGBcbiAgICA8ZGl2XG4gICAgICAjbWVudVJlZlxuICAgICAgY2xhc3M9XCJidWJibGUtbWVudSBjb2xvci1idWJibGUtbWVudVwiXG4gICAgICAobW91c2Vkb3duKT1cIm9uTW91c2VEb3duKCRldmVudClcIlxuICAgICAgKGNsaWNrKT1cIiRldmVudC5zdG9wUHJvcGFnYXRpb24oKVwiXG4gICAgICAoa2V5ZG93bik9XCIkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKClcIlxuICAgICAgKGtleWRvd24uZXNjYXBlKT1cIm9uQXBwbHkoJGV2ZW50KVwiXG4gICAgICB0YWJpbmRleD1cIi0xXCJcbiAgICAgIHJvbGU9XCJkaWFsb2dcIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJjb2xvci1waWNrZXItY29udGFpbmVyXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJkcm9wZG93bi1yb3cgcHJlc2V0c1wiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2xvci1ncmlkXCI+XG4gICAgICAgICAgICBAZm9yIChjb2xvciBvZiBwcmVzZXRzOyB0cmFjayBjb2xvcikge1xuICAgICAgICAgICAgICA8YXRlLWJ1dHRvblxuICAgICAgICAgICAgICAgIGNsYXNzPVwiY29sb3Itc3dhdGNoLWJ0blwiXG4gICAgICAgICAgICAgICAgc2l6ZT1cInNtYWxsXCJcbiAgICAgICAgICAgICAgICBbdGl0bGVdPVwiY29sb3JcIlxuICAgICAgICAgICAgICAgIFthY3RpdmVdPVwiaXNDb2xvckFjdGl2ZShjb2xvcilcIlxuICAgICAgICAgICAgICAgIFtiYWNrZ3JvdW5kQ29sb3JdPVwiY29sb3JcIlxuICAgICAgICAgICAgICAgIChidXR0b25DbGljayk9XCJhcHBseUNvbG9yKGNvbG9yLCB0cnVlLCAkZXZlbnQpXCI+PC9hdGUtYnV0dG9uPlxuICAgICAgICAgICAgfVxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cblxuICAgICAgICA8ZGl2IGNsYXNzPVwiZHJvcGRvd24tcm93IGNvbnRyb2xzXCI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImhleC1pbnB1dC13cmFwcGVyXCI+XG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cImhleC1oYXNoXCI+Izwvc3Bhbj5cbiAgICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgICAjaGV4SW5wdXRcbiAgICAgICAgICAgICAgdHlwZT1cInRleHRcIlxuICAgICAgICAgICAgICBjbGFzcz1cImhleC1pbnB1dFwiXG4gICAgICAgICAgICAgIFt2YWx1ZV09XCJoZXhWYWx1ZSgpXCJcbiAgICAgICAgICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCJ0KCkuY3VzdG9tQ29sb3JcIlxuICAgICAgICAgICAgICAoaW5wdXQpPVwib25IZXhJbnB1dCgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgKGNoYW5nZSk9XCJvbkhleENoYW5nZSgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgKGtleWRvd24uZW50ZXIpPVwib25BcHBseSgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgKGZvY3VzKT1cIm9uRm9jdXMoKVwiXG4gICAgICAgICAgICAgIChibHVyKT1cIm9uQmx1cigpXCJcbiAgICAgICAgICAgICAgbWF4bGVuZ3RoPVwiNlwiXG4gICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiMDAwMDAwXCIgLz5cbiAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJuYXRpdmUtdHJpZ2dlci13cmFwcGVyXCI+XG4gICAgICAgICAgICA8YXRlLWJ1dHRvblxuICAgICAgICAgICAgICBjbGFzcz1cImJ0bi1uYXRpdmUtcGlja2VyLXRyaWdnZXJcIlxuICAgICAgICAgICAgICBpY29uPVwiY3VzdG9tQ29sb3JcIlxuICAgICAgICAgICAgICBbdGl0bGVdPVwidCgpLmN1c3RvbUNvbG9yXCJcbiAgICAgICAgICAgICAgW2JhY2tncm91bmRDb2xvcl09XCJjdXJyZW50Q29sb3IoKVwiXG4gICAgICAgICAgICAgIChidXR0b25DbGljayk9XCJ0cmlnZ2VyTmF0aXZlUGlja2VyKCRldmVudClcIj48L2F0ZS1idXR0b24+XG4gICAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgICAgI2NvbG9ySW5wdXRcbiAgICAgICAgICAgICAgdHlwZT1cImNvbG9yXCJcbiAgICAgICAgICAgICAgY2xhc3M9XCJoaWRkZW4tbmF0aXZlLWlucHV0XCJcbiAgICAgICAgICAgICAgW3ZhbHVlXT1cImN1cnJlbnRDb2xvcigpXCJcbiAgICAgICAgICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCJ0KCkuY3VzdG9tQ29sb3JcIlxuICAgICAgICAgICAgICAoaW5wdXQpPVwib25OYXRpdmVJbnB1dCgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgKGNoYW5nZSk9XCJvbk5hdGl2ZUNoYW5nZSgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgKGZvY3VzKT1cIm9uRm9jdXMoKVwiXG4gICAgICAgICAgICAgIChibHVyKT1cIm9uQmx1cigpXCIgLz5cbiAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgIDxhdGUtYnV0dG9uXG4gICAgICAgICAgICBpY29uPVwiYXBwbHlcIlxuICAgICAgICAgICAgW3RpdGxlXT1cImNvbW1vbigpLmFwcGx5XCJcbiAgICAgICAgICAgIGNvbG9yPVwidmFyKC0tYXRlLXByaW1hcnkpXCJcbiAgICAgICAgICAgIChidXR0b25DbGljayk9XCJvbkFwcGx5KCRldmVudClcIj48L2F0ZS1idXR0b24+XG5cbiAgICAgICAgICA8YXRlLXNlcGFyYXRvciAvPlxuXG4gICAgICAgICAgPGF0ZS1idXR0b25cbiAgICAgICAgICAgIGljb249XCJ1bnNldENvbG9yXCJcbiAgICAgICAgICAgIFt0aXRsZV09XCJ0KCkuY2xlYXJcIlxuICAgICAgICAgICAgdmFyaWFudD1cImRhbmdlclwiXG4gICAgICAgICAgICAoYnV0dG9uQ2xpY2spPVwib25DbGVhckNvbG9yKCRldmVudClcIj48L2F0ZS1idXR0b24+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gIGAsXG4gIHN0eWxlczogW1xuICAgIGBcbiAgICAgIC5jb2xvci1waWNrZXItY29udGFpbmVyIHtcbiAgICAgICAgZGlzcGxheTogZmxleDtcbiAgICAgICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcbiAgICAgICAgZ2FwOiA4cHg7XG4gICAgICB9XG5cbiAgICAgIC5kcm9wZG93bi1yb3cge1xuICAgICAgICBkaXNwbGF5OiBmbGV4O1xuICAgICAgICBhbGlnbi1pdGVtczogY2VudGVyO1xuICAgICAgICB3aWR0aDogMTAwJTtcbiAgICAgIH1cblxuICAgICAgLmRyb3Bkb3duLXJvdy5wcmVzZXRzIHtcbiAgICAgICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7XG4gICAgICB9XG5cbiAgICAgIC5kcm9wZG93bi1yb3cuY29udHJvbHMge1xuICAgICAgICBnYXA6IDhweDtcbiAgICAgICAganVzdGlmeS1jb250ZW50OiBzcGFjZS1iZXR3ZWVuO1xuICAgICAgICBwYWRkaW5nLXRvcDogNHB4O1xuICAgICAgICBib3JkZXItdG9wOiAxcHggc29saWQgdmFyKC0tYXRlLWJvcmRlciwgI2UyZThmMCk7XG4gICAgICB9XG5cbiAgICAgIC5jb2xvci1ncmlkIHtcbiAgICAgICAgZGlzcGxheTogZ3JpZDtcbiAgICAgICAgZ3JpZC10ZW1wbGF0ZS1jb2x1bW5zOiByZXBlYXQoMTIsIDFmcik7XG4gICAgICAgIGdhcDogNHB4O1xuICAgICAgICB3aWR0aDogMTAwJTtcbiAgICAgIH1cblxuICAgICAgOmhvc3QgOjpuZy1kZWVwIC5jb2xvci1zd2F0Y2gtYnRuIC5hdGUtYnV0dG9uIHtcbiAgICAgICAgd2lkdGg6IDEwMCU7XG4gICAgICAgIGFzcGVjdC1yYXRpbzogMTtcbiAgICAgICAgaGVpZ2h0OiBhdXRvO1xuICAgICAgICBib3JkZXItcmFkaXVzOiA0cHg7XG4gICAgICAgIGJvcmRlcjogMXB4IHNvbGlkIHJnYmEoMCwgMCwgMCwgMC4xKTtcbiAgICAgICAgcGFkZGluZzogMDtcbiAgICAgIH1cblxuICAgICAgOmhvc3QgOjpuZy1kZWVwIC5jb2xvci1zd2F0Y2gtYnRuIC5hdGUtYnV0dG9uLmlzLWFjdGl2ZSB7XG4gICAgICAgIGJvcmRlci1jb2xvcjogdmFyKC0tYXRlLXByaW1hcnksICMzYjgyZjYpO1xuICAgICAgICBib3gtc2hhZG93OiAwIDAgMCAycHggcmdiYSg1OSwgMTMwLCAyNDYsIDAuMyk7XG4gICAgICB9XG5cbiAgICAgIDpob3N0IDo6bmctZGVlcCAuYnRuLW5hdGl2ZS1waWNrZXItdHJpZ2dlciAuYXRlLWJ1dHRvbiB7XG4gICAgICAgIGNvbG9yOiAjZmZmZmZmO1xuICAgICAgICB0ZXh0LXNoYWRvdzogMCAxcHggMnB4IHJnYmEoMCwgMCwgMCwgMC4yKTtcbiAgICAgIH1cblxuICAgICAgLmRpdmlkZXItdiB7XG4gICAgICAgIHdpZHRoOiAxcHg7XG4gICAgICAgIGhlaWdodDogMjRweDtcbiAgICAgICAgYmFja2dyb3VuZDogdmFyKC0tYXRlLWJvcmRlciwgI2UyZThmMCk7XG4gICAgICB9XG5cbiAgICAgIC5oZXgtaW5wdXQtd3JhcHBlciB7XG4gICAgICAgIGZsZXg6IDE7XG4gICAgICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gICAgICAgIGJhY2tncm91bmQ6IHZhcigtLWF0ZS1zdXJmYWNlLXNlY29uZGFyeSwgI2Y4ZmFmYyk7XG4gICAgICAgIGJvcmRlcjogMXB4IHNvbGlkIHZhcigtLWF0ZS1ib3JkZXIsICNlMmU4ZjApO1xuICAgICAgICBib3JkZXItcmFkaXVzOiA4cHg7XG4gICAgICAgIHBhZGRpbmc6IDAgMTBweDtcbiAgICAgICAgaGVpZ2h0OiAzMnB4O1xuICAgICAgICB0cmFuc2l0aW9uOiBib3JkZXItY29sb3IgMTUwbXMgZWFzZTtcbiAgICAgIH1cblxuICAgICAgLmhleC1pbnB1dC13cmFwcGVyOmZvY3VzLXdpdGhpbiB7XG4gICAgICAgIGJvcmRlci1jb2xvcjogdmFyKC0tYXRlLXByaW1hcnksICMzYjgyZjYpO1xuICAgICAgICBiYWNrZ3JvdW5kOiB2YXIoLS1hdGUtbWVudS1iZywgI2ZmZmZmZik7XG4gICAgICB9XG5cbiAgICAgIC5oZXgtaGFzaCB7XG4gICAgICAgIGNvbG9yOiB2YXIoLS1hdGUtdGV4dC1tdXRlZCwgIzk0YTNiOCk7XG4gICAgICAgIGZvbnQtZmFtaWx5OiBtb25vc3BhY2U7XG4gICAgICAgIGZvbnQtc2l6ZTogMC44NzVyZW07XG4gICAgICB9XG5cbiAgICAgIC5oZXgtaW5wdXQge1xuICAgICAgICBiYWNrZ3JvdW5kOiB0cmFuc3BhcmVudDtcbiAgICAgICAgYm9yZGVyOiBub25lO1xuICAgICAgICBvdXRsaW5lOiBub25lO1xuICAgICAgICBjb2xvcjogdmFyKC0tYXRlLXRleHQsICMxZTI5M2IpO1xuICAgICAgICBmb250LWZhbWlseTogbW9ub3NwYWNlO1xuICAgICAgICBmb250LXNpemU6IDAuODc1cmVtO1xuICAgICAgICB3aWR0aDogMTAwJTtcbiAgICAgICAgcGFkZGluZy1sZWZ0OiA0cHg7XG4gICAgICB9XG5cbiAgICAgIC5uYXRpdmUtdHJpZ2dlci13cmFwcGVyIHtcbiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlO1xuICAgICAgICB3aWR0aDogMzJweDtcbiAgICAgICAgaGVpZ2h0OiAzMnB4O1xuICAgICAgfVxuXG4gICAgICAuaGlkZGVuLW5hdGl2ZS1pbnB1dCB7XG4gICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgICAgICAgaW5zZXQ6IDA7XG4gICAgICAgIG9wYWNpdHk6IDA7XG4gICAgICAgIHdpZHRoOiAxMDAlO1xuICAgICAgICBoZWlnaHQ6IDEwMCU7XG4gICAgICAgIGN1cnNvcjogcG9pbnRlcjtcbiAgICAgIH1cbiAgICBgLFxuICBdLFxufSlcbmV4cG9ydCBjbGFzcyBBdGVDb2xvckJ1YmJsZU1lbnVDb21wb25lbnQgZXh0ZW5kcyBBdGVCYXNlU3ViQnViYmxlTWVudSB7XG4gIHByaXZhdGUgcmVhZG9ubHkgY29sb3JQaWNrZXJTdmMgPSBpbmplY3QoQXRlQ29sb3JQaWNrZXJTZXJ2aWNlKTtcblxuICByZWFkb25seSB0ID0gdGhpcy5pMThuU2VydmljZS50b29sYmFyO1xuICByZWFkb25seSBjb21tb24gPSB0aGlzLmkxOG5TZXJ2aWNlLmNvbW1vbjtcbiAgcmVhZG9ubHkgcHJlc2V0cyA9IFBSRVNFVF9DT0xPUlM7XG5cbiAgcHJpdmF0ZSBjb2xvcklucHV0UmVmID0gdmlld0NoaWxkPEVsZW1lbnRSZWY8SFRNTElucHV0RWxlbWVudD4+KFwiY29sb3JJbnB1dFwiKTtcblxuICAvKipcbiAgICogTE9DQUwgTU9ERTogV2UgbG9jayB0aGUgbW9kZSB3aGVuIHRoZSBtZW51IGlzIHNob3duIHRvIGF2b2lkIHJhY2UgY29uZGl0aW9uc1xuICAgKiB3aGVyZSB0aGUgcGFyZW50IChidWJibGUgbWVudSkgY2xlYXJzIHRoZSBnbG9iYWwgc2lnbmFsIGJlZm9yZSB3ZSBhcHBseSB0aGUgY29sb3IuXG4gICAqL1xuICBhY3RpdmVNb2RlID0gc2lnbmFsPFwidGV4dFwiIHwgXCJoaWdobGlnaHRcIj4oXCJ0ZXh0XCIpO1xuXG4gIHByb3RlY3RlZCBvdmVycmlkZSBvblN0YXRlQ2hhbmdlKCkge1xuICAgIHRoaXMuY29sb3JQaWNrZXJTdmMuZWRpdE1vZGUoKTtcbiAgICB0aGlzLmNvbG9yUGlja2VyU3ZjLm1lbnVUcmlnZ2VyKCk7XG4gICAgdGhpcy5jb2xvclBpY2tlclN2Yy5pc0ludGVyYWN0aW5nKCk7XG4gIH1cblxuICBvdmVycmlkZSBzaG91bGRTaG93KCk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IHsgaXNFZGl0YWJsZSB9ID0gdGhpcy5zdGF0ZSgpO1xuICAgIGlmICghaXNFZGl0YWJsZSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGlmICh0aGlzLmNvbG9yUGlja2VyU3ZjLmVkaXRNb2RlKCkgIT09IG51bGwgfHwgdGhpcy5jb2xvclBpY2tlclN2Yy5pc0ludGVyYWN0aW5nKCkpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHByaXZhdGUgZmluZENvbG9yZWRFbGVtZW50SW5Db250ZW50KHN0YXJ0OiBFbGVtZW50IHwgbnVsbCwgY29udGVudFJvb3Q6IEVsZW1lbnQpOiBFbGVtZW50IHwgbnVsbCB7XG4gICAgbGV0IGN1cnJlbnQgPSBzdGFydDtcbiAgICB3aGlsZSAoY3VycmVudCAmJiBjdXJyZW50ICE9PSBjb250ZW50Um9vdCAmJiBjb250ZW50Um9vdC5jb250YWlucyhjdXJyZW50KSkge1xuICAgICAgaWYgKGN1cnJlbnQubWF0Y2hlcygnW3N0eWxlKj1cImNvbG9yXCJdLCBbc3R5bGUqPVwiYmFja2dyb3VuZFwiXSwgbWFyaycpKSB7XG4gICAgICAgIHJldHVybiBjdXJyZW50O1xuICAgICAgfVxuICAgICAgY3VycmVudCA9IGN1cnJlbnQucGFyZW50RWxlbWVudDtcbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBvdmVycmlkZSBnZXRTZWxlY3Rpb25SZWN0KCk6IERPTVJlY3Qge1xuICAgIGNvbnN0IHRyaWdnZXIgPSB0aGlzLmNvbG9yUGlja2VyU3ZjLm1lbnVUcmlnZ2VyKCk7XG4gICAgY29uc3QgZWQgPSB0aGlzLmVkaXRvcigpO1xuICAgIGlmICghZWQpIHtcbiAgICAgIHJldHVybiBuZXcgRE9NUmVjdCgwLCAwLCAwLCAwKTtcbiAgICB9XG5cbiAgICAvLyAxLiBJZiB3ZSBoYXZlIGEgc3RhYmxlIHRyaWdnZXIgZnJvbSBzZXJ2aWNlICh0b29sYmFyIG9yIHBhcmVudCBtZW51KSwgYW5jaG9yIHRvIGl0XG4gICAgaWYgKHRyaWdnZXIpIHtcbiAgICAgIGNvbnN0IHJlY3QgPSB0cmlnZ2VyLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgICAgLy8gT25seSB1c2UgaWYgaXQncyBzdGlsbCB2aXNpYmxlL2luIERPTSAod2lkdGggPiAwKVxuICAgICAgaWYgKHJlY3Qud2lkdGggPiAwKSB7XG4gICAgICAgIHJldHVybiByZWN0O1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIDIuIE90aGVyd2lzZSAoYnViYmxlIG1lbnUgLyByZWxheSksIGFuY2hvciB0byB0ZXh0IHNlbGVjdGlvblxuICAgIGNvbnN0IHsgZnJvbSB9ID0gZWQuc3RhdGUuc2VsZWN0aW9uO1xuXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHsgbm9kZSB9ID0gZWQudmlldy5kb21BdFBvcyhmcm9tKTtcbiAgICAgIGNvbnN0IGVsZW1lbnQgPSBub2RlIGluc3RhbmNlb2YgRWxlbWVudCA/IG5vZGUgOiBub2RlLnBhcmVudEVsZW1lbnQ7XG4gICAgICBjb25zdCBjb2xvckVsZW1lbnQgPSB0aGlzLmZpbmRDb2xvcmVkRWxlbWVudEluQ29udGVudChlbGVtZW50LCBlZC52aWV3LmRvbSk7XG4gICAgICBpZiAoY29sb3JFbGVtZW50KSB7XG4gICAgICAgIHJldHVybiBjb2xvckVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoX2UpIHtcbiAgICAgIC8qIGlnbm9yZSAqL1xuICAgIH1cblxuICAgIC8vIFVzZSBuYXRpdmUgc2VsZWN0aW9uIGZvciBtdWx0aS1saW5lIGFjY3VyYWN5XG4gICAgY29uc3Qgc2VsZWN0aW9uID0gdHlwZW9mIHdpbmRvdyAhPT0gXCJ1bmRlZmluZWRcIiA/IHdpbmRvdy5nZXRTZWxlY3Rpb24oKSA6IG51bGw7XG4gICAgaWYgKHNlbGVjdGlvbiAmJiBzZWxlY3Rpb24ucmFuZ2VDb3VudCA+IDApIHtcbiAgICAgIGNvbnN0IHJhbmdlID0gc2VsZWN0aW9uLmdldFJhbmdlQXQoMCk7XG4gICAgICBjb25zdCByZWN0ID0gcmFuZ2UuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgICBpZiAocmVjdC53aWR0aCA+IDAgJiYgcmVjdC5oZWlnaHQgPiAwKSB7XG4gICAgICAgIHJldHVybiByZWN0O1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIEZpbmFsIGZhbGxiYWNrIHRvIGNvb3JkaW5hdGVzIGF0IGN1cnNvclxuICAgIGNvbnN0IHsgdG9wLCBib3R0b20sIGxlZnQsIHJpZ2h0IH0gPSBlZC52aWV3LmNvb3Jkc0F0UG9zKGZyb20pO1xuICAgIHJldHVybiBuZXcgRE9NUmVjdChsZWZ0LCB0b3AsIHJpZ2h0IC0gbGVmdCwgYm90dG9tIC0gdG9wKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBvdmVycmlkZSBvblRpcHB5U2hvdyhfaW5zdGFuY2U6IFRpcHB5SW5zdGFuY2UpIHtcbiAgICAvLyAxLiBMb2NrIHRoZSBtb2RlIGltbWVkaWF0ZWx5IHRvIGJlIGltbXVuZSB0byBleHRlcm5hbCBzaWduYWwgY2hhbmdlc1xuICAgIGNvbnN0IGN1cnJlbnRNb2RlID0gdGhpcy5jb2xvclBpY2tlclN2Yy5lZGl0TW9kZSgpIHx8IFwidGV4dFwiO1xuICAgIHRoaXMuYWN0aXZlTW9kZS5zZXQoY3VycmVudE1vZGUpO1xuXG4gICAgLy8gMi4gQ2FwdHVyZSBzZWxlY3Rpb24gZm9yIHRoZSBjb21tYW5kIGZhbGxiYWNrXG4gICAgdGhpcy5jb2xvclBpY2tlclN2Yy5jYXB0dXJlU2VsZWN0aW9uKHRoaXMuZWRpdG9yKCkpO1xuICB9XG5cbiAgcHJvdGVjdGVkIG92ZXJyaWRlIG9uVGlwcHlIaWRlKF9pbnN0YW5jZTogVGlwcHlJbnN0YW5jZSkge1xuICAgIC8vIENsZWFyIHRyaWdnZXIgb25seSBBRlRFUiB0aGUgbWVudSBpcyBoaWRkZW4gdG8gbWFpbnRhaW4gYW5jaG9yIHN0YWJpbGl0eSBkdXJpbmcgYW5pbWF0aW9uXG4gICAgdGhpcy5jb2xvclBpY2tlclN2Yy5kb25lKCk7XG4gICAgdGhpcy5jb2xvclBpY2tlclN2Yy5jbG9zZSgpO1xuICB9XG5cbiAgcmVhZG9ubHkgY3VycmVudENvbG9yID0gY29tcHV0ZWQoKCkgPT4ge1xuICAgIGNvbnN0IG1hcmtzID0gdGhpcy5zdGF0ZSgpLm1hcmtzO1xuICAgIGNvbnN0IGNvbG9yID0gdGhpcy5hY3RpdmVNb2RlKCkgPT09IFwidGV4dFwiID8gbWFya3MuY29tcHV0ZWRDb2xvciA6IG1hcmtzLmNvbXB1dGVkQmFja2dyb3VuZDtcbiAgICByZXR1cm4gY29sb3IgfHwgKHRoaXMuYWN0aXZlTW9kZSgpID09PSBcInRleHRcIiA/IFwiIzAwMDAwMFwiIDogXCIjZmZmZjAwXCIpO1xuICB9KTtcblxuICByZWFkb25seSBoZXhWYWx1ZSA9IGNvbXB1dGVkKCgpID0+IHtcbiAgICBjb25zdCBjb2xvciA9IHRoaXMuY3VycmVudENvbG9yKCk7XG4gICAgcmV0dXJuIGNvbG9yLnJlcGxhY2UoXCIjXCIsIFwiXCIpLnRvVXBwZXJDYXNlKCk7XG4gIH0pO1xuXG4gIGlzQ29sb3JBY3RpdmUoY29sb3I6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAoXG4gICAgICB0aGlzLmNvbG9yUGlja2VyU3ZjLm5vcm1hbGl6ZUNvbG9yKHRoaXMuY3VycmVudENvbG9yKCkpID09PVxuICAgICAgdGhpcy5jb2xvclBpY2tlclN2Yy5ub3JtYWxpemVDb2xvcihjb2xvcilcbiAgICApO1xuICB9XG5cbiAgYXBwbHlDb2xvcihjb2xvcjogc3RyaW5nLCBhZGRUb0hpc3RvcnkgPSB0cnVlLCBldmVudD86IEV2ZW50KSB7XG4gICAgaWYgKGV2ZW50KSB7XG4gICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgfVxuXG4gICAgY29uc3QgZWRpdG9yID0gdGhpcy5lZGl0b3IoKTtcbiAgICAvLyBVc2Ugb3VyIExPQ0tFRCBtb2RlIGluc3RlYWQgb2YgdGhlIGdsb2JhbCBzaWduYWxcbiAgICAvLyBEZXRlcm1pbmUgaWYgd2Ugc2hvdWxkIGZvY3VzIGJhY2sgdG8gdGhlIGVkaXRvci5cbiAgICBjb25zdCBzaG91bGRGb2N1cyA9ICF0aGlzLmNvbG9yUGlja2VyU3ZjLmlzSW50ZXJhY3RpbmcoKTtcblxuICAgIGlmICh0aGlzLmFjdGl2ZU1vZGUoKSA9PT0gXCJ0ZXh0XCIpIHtcbiAgICAgIHRoaXMuY29sb3JQaWNrZXJTdmMuYXBwbHlDb2xvcihlZGl0b3IsIGNvbG9yLCBhZGRUb0hpc3RvcnksIHNob3VsZEZvY3VzKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5jb2xvclBpY2tlclN2Yy5hcHBseUhpZ2hsaWdodChlZGl0b3IsIGNvbG9yLCBhZGRUb0hpc3RvcnksIHNob3VsZEZvY3VzKTtcbiAgICB9XG4gIH1cblxuICBvbkFwcGx5KGV2ZW50PzogRXZlbnQpIHtcbiAgICBpZiAoZXZlbnQpIHtcbiAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICB9XG4gICAgdGhpcy5jb2xvclBpY2tlclN2Yy5jbG9zZSgpO1xuICB9XG5cbiAgb25IZXhJbnB1dChldmVudDogRXZlbnQpIHtcbiAgICBjb25zdCBpbnB1dCA9IGV2ZW50LnRhcmdldCBhcyBIVE1MSW5wdXRFbGVtZW50O1xuICAgIGxldCB2YWx1ZSA9IGlucHV0LnZhbHVlLnRyaW0oKTtcbiAgICBpZiAoIXZhbHVlLnN0YXJ0c1dpdGgoXCIjXCIpKSB7XG4gICAgICB2YWx1ZSA9IFwiI1wiICsgdmFsdWU7XG4gICAgfVxuICAgIGlmICgvXiM/WzAtOUEtRmEtZl17Myw2fSQvLnRlc3QodmFsdWUpKSB7XG4gICAgICB0aGlzLmFwcGx5Q29sb3IodmFsdWUsIGZhbHNlKTtcbiAgICB9XG4gIH1cblxuICBvbkhleENoYW5nZShldmVudDogRXZlbnQpIHtcbiAgICBjb25zdCBpbnB1dCA9IGV2ZW50LnRhcmdldCBhcyBIVE1MSW5wdXRFbGVtZW50O1xuICAgIGxldCB2YWx1ZSA9IGlucHV0LnZhbHVlLnRyaW0oKTtcbiAgICBpZiAoIXZhbHVlLnN0YXJ0c1dpdGgoXCIjXCIpKSB7XG4gICAgICB2YWx1ZSA9IFwiI1wiICsgdmFsdWU7XG4gICAgfVxuICAgIGlmICgvXiM/WzAtOUEtRmEtZl17Myw2fSQvLnRlc3QodmFsdWUpKSB7XG4gICAgICB0aGlzLmFwcGx5Q29sb3IodmFsdWUsIHRydWUsIGV2ZW50KTtcbiAgICB9XG4gIH1cblxuICB0cmlnZ2VyTmF0aXZlUGlja2VyKGV2ZW50PzogRXZlbnQpIHtcbiAgICBpZiAoZXZlbnQpIHtcbiAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICB9XG4gICAgdGhpcy5jb2xvcklucHV0UmVmKCk/Lm5hdGl2ZUVsZW1lbnQuY2xpY2soKTtcbiAgfVxuXG4gIG9uTmF0aXZlSW5wdXQoZXZlbnQ6IEV2ZW50KSB7XG4gICAgdGhpcy5hcHBseUNvbG9yKChldmVudC50YXJnZXQgYXMgSFRNTElucHV0RWxlbWVudCkudmFsdWUsIGZhbHNlKTtcbiAgfVxuXG4gIG9uTmF0aXZlQ2hhbmdlKGV2ZW50OiBFdmVudCkge1xuICAgIHRoaXMuYXBwbHlDb2xvcigoZXZlbnQudGFyZ2V0IGFzIEhUTUxJbnB1dEVsZW1lbnQpLnZhbHVlLCB0cnVlLCBldmVudCk7XG4gIH1cblxuICBvbkNsZWFyQ29sb3IoZXZlbnQ/OiBFdmVudCkge1xuICAgIGlmIChldmVudCkge1xuICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgIH1cblxuICAgIGNvbnN0IGVkaXRvciA9IHRoaXMuZWRpdG9yKCk7XG4gICAgaWYgKHRoaXMuYWN0aXZlTW9kZSgpID09PSBcInRleHRcIikge1xuICAgICAgdGhpcy5jb2xvclBpY2tlclN2Yy51bnNldENvbG9yKGVkaXRvcik7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuY29sb3JQaWNrZXJTdmMudW5zZXRIaWdobGlnaHQoZWRpdG9yKTtcbiAgICB9XG4gIH1cblxuICBvbk1vdXNlRG93bihldmVudDogTW91c2VFdmVudCkge1xuICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgIGNvbnN0IHRhcmdldCA9IGV2ZW50LnRhcmdldCBhcyBIVE1MRWxlbWVudDtcbiAgICBpZiAodGFyZ2V0LnRhZ05hbWUgIT09IFwiSU5QVVRcIikge1xuICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICB9XG4gIH1cblxuICBvbkZvY3VzKCkge1xuICAgIHRoaXMuY29sb3JQaWNrZXJTdmMuc2V0SW50ZXJhY3RpbmcodHJ1ZSk7XG4gIH1cblxuICBvbkJsdXIoKSB7XG4gICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICB0aGlzLmNvbG9yUGlja2VyU3ZjLnNldEludGVyYWN0aW5nKGZhbHNlKTtcbiAgICAgIHRoaXMudXBkYXRlTWVudSgpO1xuICAgIH0sIDE1MCk7XG4gIH1cbn1cbiJdfQ==