@magicx-eng/ai-autocomplete-angular 0.3.3 → 0.4.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.
- package/README.md +59 -12
- package/esm2020/lib/ai-autocomplete/ai-autocomplete.component.mjs +2 -2
- package/esm2020/lib/ai-autocomplete-dropdown/ai-autocomplete-dropdown.component.mjs +61 -4
- package/esm2020/lib/controller/ai-autocomplete.controller.mjs +13 -4
- package/esm2020/lib/internal/pill-list/pill-list.component.mjs +3 -3
- package/esm2020/lib/shared/types.mjs +1 -1
- package/fesm2015/magicx-eng-ai-autocomplete-angular.mjs +75 -8
- package/fesm2015/magicx-eng-ai-autocomplete-angular.mjs.map +1 -1
- package/fesm2020/magicx-eng-ai-autocomplete-angular.mjs +73 -7
- package/fesm2020/magicx-eng-ai-autocomplete-angular.mjs.map +1 -1
- package/lib/ai-autocomplete-dropdown/ai-autocomplete-dropdown.component.d.ts +27 -4
- package/lib/ai-autocomplete-dropdown/ai-autocomplete-dropdown.component.d.ts.map +1 -1
- package/lib/controller/ai-autocomplete.controller.d.ts +1 -0
- package/lib/controller/ai-autocomplete.controller.d.ts.map +1 -1
- package/lib/shared/types.d.ts +6 -0
- package/lib/shared/types.d.ts.map +1 -1
- package/package.json +2 -2
package/README.md
CHANGED
|
@@ -6,7 +6,7 @@ An Angular SDK that provides a guided AI-powered autocomplete experience with pi
|
|
|
6
6
|
|
|
7
7
|
## Features
|
|
8
8
|
|
|
9
|
-
- **
|
|
9
|
+
- **Three tiers of integration** — the full `<ai-autocomplete>` component, `AIAutocompleteController` + `[aiaInput]` + `<ai-autocomplete-dropdown>` (our dropdown, your input), or the controller alone (render the dropdown yourself)
|
|
10
10
|
- **Rich inline input (Tier 1)** — a single `contentEditable` surface: typed text, bold completed params, and inline pills share one editing context
|
|
11
11
|
- **Pill-based input** — non-editable inline pills for unfilled parameters, bold inline text for completed ones
|
|
12
12
|
- **Instant exact-match bolding** — typing the full text of an option immediately promotes it to a completed param (no debounced fetch wait). Works in the normal typing flow *and* while re-editing an existing completed param.
|
|
@@ -41,12 +41,13 @@ pnpm add @angular/common @angular/core @angular/forms rxjs
|
|
|
41
41
|
|
|
42
42
|
The package works on Angular 15 and up. RxJS 7 or later is required.
|
|
43
43
|
|
|
44
|
-
##
|
|
44
|
+
## Three Tiers
|
|
45
45
|
|
|
46
46
|
| Tier | What you get | What you own | Use when |
|
|
47
47
|
|---|---|---|---|
|
|
48
48
|
| **Tier 1: Full** | `<ai-autocomplete>` — input, dropdown, pills, state | Nothing — drop in and go | You want a complete widget with zero setup |
|
|
49
|
-
| **Tier 2:
|
|
49
|
+
| **Tier 2: Controller + dropdown** | `AIAutocompleteController` + `[aiaInput]` + `<ai-autocomplete-dropdown>` | The input element and its layout | You need a custom input but want our dropdown UI |
|
|
50
|
+
| **Tier 3: Headless** | `AIAutocompleteController` alone — observables + actions | Everything, including the dropdown | You need full control over every piece of the UI |
|
|
50
51
|
|
|
51
52
|
---
|
|
52
53
|
|
|
@@ -169,9 +170,9 @@ After a completed param is added (by any means — option click, exact-match typ
|
|
|
169
170
|
|
|
170
171
|
---
|
|
171
172
|
|
|
172
|
-
## Tier 2:
|
|
173
|
+
## Tier 2: Controller + Dropdown
|
|
173
174
|
|
|
174
|
-
|
|
175
|
+
Drive state with the controller and render our dropdown; you own the input element and layout:
|
|
175
176
|
|
|
176
177
|
```ts
|
|
177
178
|
import { Component, OnDestroy, OnInit } from "@angular/core";
|
|
@@ -188,7 +189,8 @@ import {
|
|
|
188
189
|
imports: [AIAutocompleteDropdownComponent, AIAutocompleteInputDirective],
|
|
189
190
|
template: `
|
|
190
191
|
<textarea [aiaInput]="ac" placeholder="Ask anything..."></textarea>
|
|
191
|
-
|
|
192
|
+
<!-- mode styles + themes the dropdown on its own — no .magicx-aia wrapper -->
|
|
193
|
+
<ai-autocomplete-dropdown [controller]="ac" mode="auto"></ai-autocomplete-dropdown>
|
|
192
194
|
`,
|
|
193
195
|
})
|
|
194
196
|
export class SearchComponent implements OnInit, OnDestroy {
|
|
@@ -196,7 +198,7 @@ export class SearchComponent implements OnInit, OnDestroy {
|
|
|
196
198
|
|
|
197
199
|
ngOnInit(): void {
|
|
198
200
|
this.ac = new AIAutocompleteController({
|
|
199
|
-
apiConfig: {
|
|
201
|
+
apiConfig: { apiKey: "..." },
|
|
200
202
|
onSubmit: (result) => {
|
|
201
203
|
this.handleSubmit(result);
|
|
202
204
|
this.ac.reset(); // start a new session
|
|
@@ -220,7 +222,50 @@ The `[aiaInput]` directive implements `ControlValueAccessor`, so it works with R
|
|
|
220
222
|
|
|
221
223
|
```html
|
|
222
224
|
<textarea [aiaInput]="ac" [formControl]="myControl"></textarea>
|
|
223
|
-
<ai-autocomplete-dropdown [controller]="ac"></ai-autocomplete-dropdown>
|
|
225
|
+
<ai-autocomplete-dropdown [controller]="ac" mode="auto"></ai-autocomplete-dropdown>
|
|
226
|
+
```
|
|
227
|
+
|
|
228
|
+
### Color mode & position
|
|
229
|
+
|
|
230
|
+
Pass **`[mode]`** (`"light" | "dark" | "auto"`) to a standalone `<ai-autocomplete-dropdown>` and it self-scopes the SDK's design tokens to its own root — no `.magicx-aia` wrapper needed (`"auto"` follows `prefers-color-scheme`). To open the dropdown above the input, set `optionsPosition: "above"` in the controller options — the dropdown reads it from the controller automatically (via `dropdown$`), and arrow-key direction matches. Leave `mode` unset inside Tier 1, which themes for you.
|
|
231
|
+
|
|
232
|
+
### Custom / rich-text inputs
|
|
233
|
+
|
|
234
|
+
`[aiaInput]` is for a `<textarea>`/`<input>`. For a contentEditable or rich-text editor, skip the directive and call the controller directly: `handleTextChange(text)` on every edit, `setFocused(bool)` on focus/blur, `handleKeyDown(event)` for Arrow/Enter/Tab/Escape while the dropdown is open, and `handleCaretMove(offset)` so arrow keys can move into the dropdown.
|
|
235
|
+
|
|
236
|
+
---
|
|
237
|
+
|
|
238
|
+
## Tier 3: Headless
|
|
239
|
+
|
|
240
|
+
Skip `<ai-autocomplete-dropdown>` and render the suggestions UI yourself. Subscribe to the controller's `dropdown$` (or the individual observables) for the data and call `selectOption()` / `setActiveDropdownIndex()` for the actions:
|
|
241
|
+
|
|
242
|
+
```ts
|
|
243
|
+
@Component({
|
|
244
|
+
standalone: true,
|
|
245
|
+
selector: "app-search",
|
|
246
|
+
imports: [CommonModule, AIAutocompleteInputDirective],
|
|
247
|
+
template: `
|
|
248
|
+
<textarea [aiaInput]="ac" placeholder="Ask anything..."></textarea>
|
|
249
|
+
<ng-container *ngIf="ac.dropdown$ | async as dd">
|
|
250
|
+
<ul class="my-dropdown" role="listbox" *ngIf="dd.isOpen">
|
|
251
|
+
<li
|
|
252
|
+
*ngFor="let option of dd.suggestions[0]?.options ?? []; let i = index"
|
|
253
|
+
role="option"
|
|
254
|
+
[attr.aria-selected]="i === dd.activeIndex"
|
|
255
|
+
(mouseenter)="ac.setActiveDropdownIndex(i)"
|
|
256
|
+
(mousedown)="$event.preventDefault(); ac.selectOption(option)"
|
|
257
|
+
>
|
|
258
|
+
{{ option.text }}
|
|
259
|
+
</li>
|
|
260
|
+
</ul>
|
|
261
|
+
</ng-container>
|
|
262
|
+
`,
|
|
263
|
+
})
|
|
264
|
+
export class SearchComponent implements OnInit, OnDestroy {
|
|
265
|
+
ac!: AIAutocompleteController;
|
|
266
|
+
ngOnInit() { this.ac = new AIAutocompleteController({ apiConfig: { apiKey: "..." } }); }
|
|
267
|
+
ngOnDestroy() { this.ac.destroy(); }
|
|
268
|
+
}
|
|
224
269
|
```
|
|
225
270
|
|
|
226
271
|
---
|
|
@@ -385,7 +430,7 @@ Accepts the same shape as `<ai-autocomplete>`'s inputs (`apiConfig`, `optionOver
|
|
|
385
430
|
| `editingAnchor$` | `Observable<number \| null>` | Plain-text offset where the edit region starts. |
|
|
386
431
|
| `caretOffset$` | `Observable<number \| null>` | Live caret offset within the editor. |
|
|
387
432
|
| `state$` | `Observable<AIAutocompleteControllerState>` | Composite snapshot of every public field. |
|
|
388
|
-
| `dropdown$` | `Observable<AIAutocompleteDropdownState>` | Composite snapshot for the dropdown
|
|
433
|
+
| `dropdown$` | `Observable<AIAutocompleteDropdownState>` | Composite snapshot for the dropdown (suggestions, `activeIndex`, `isOpen`, pills, `optionsPosition`, …). Bound to `<ai-autocomplete-dropdown>`, or subscribe directly to render your own dropdown in Tier 3. |
|
|
389
434
|
|
|
390
435
|
Every observable is gated by `distinctUntilChanged` + `shareReplay({ bufferSize: 1, refCount: true })`, so multiple `async`-pipe subscriptions share one upstream subscription and dedupe identical emissions.
|
|
391
436
|
|
|
@@ -402,7 +447,8 @@ Every observable is gated by `distinctUntilChanged` + `shareReplay({ bufferSize:
|
|
|
402
447
|
| `setCompletedParams(params)` | Controlled-mode setter for completed params. |
|
|
403
448
|
| `handleTextChange(value)` | Forward plain-text input from your `<textarea>` (the `[aiaInput]` directive does this for you). |
|
|
404
449
|
| `handleKeyDown(event)` | Forward keyboard events (also handled by `[aiaInput]`). |
|
|
405
|
-
| `setFocused(focused)` | Notify the controller of focus state. |
|
|
450
|
+
| `setFocused(focused)` | Notify the controller of focus state (custom inputs only — `[aiaInput]` does this). |
|
|
451
|
+
| `handleCaretMove(offset)` | Report the caret position (plain-text offset) so arrow keys can move into the dropdown (custom inputs only). |
|
|
406
452
|
| `setActiveDropdownIndex(index)` | Set the highlighted option index (typically driven by hover). |
|
|
407
453
|
| `update(opts)` | Apply runtime changes to a subset of options (everything except event callbacks). |
|
|
408
454
|
| `destroy()` | Release all resources. **Must be called in `ngOnDestroy`.** |
|
|
@@ -436,16 +482,17 @@ The directive automatically:
|
|
|
436
482
|
The dropdown component for Tier 2:
|
|
437
483
|
|
|
438
484
|
```html
|
|
439
|
-
<ai-autocomplete-dropdown [controller]="ac"></ai-autocomplete-dropdown>
|
|
485
|
+
<ai-autocomplete-dropdown [controller]="ac" mode="auto"></ai-autocomplete-dropdown>
|
|
440
486
|
```
|
|
441
487
|
|
|
442
488
|
| Input | Type | Default | Description |
|
|
443
489
|
|---|---|---|---|
|
|
444
490
|
| `controller` | `AIAutocompleteController` | — | The shared controller. |
|
|
445
491
|
| `showPills` | `boolean` | `true` | Whether to render pills above the options grid. |
|
|
492
|
+
| `mode` | `"light" \| "dark" \| "auto"` | — | Color mode for a **standalone** dropdown — self-scopes the SDK tokens so no `.magicx-aia` wrapper is needed. `"auto"` follows `prefers-color-scheme`. Leave unset when nested inside a `.magicx-aia` ancestor (e.g. Tier 1). |
|
|
446
493
|
| `className` | `string` | — | Extra CSS class applied to the dropdown root. |
|
|
447
494
|
|
|
448
|
-
All actions (option selection, hover, pill clicks) are forwarded to the controller — no outputs to wire.
|
|
495
|
+
Placement (`optionsPosition`) is read from the controller's options via `dropdown$` — set it once on the controller, not on the dropdown. All actions (option selection, hover, pill clicks) are forwarded to the controller — no outputs to wire.
|
|
449
496
|
|
|
450
497
|
### `AutocompleteResult`
|
|
451
498
|
|
|
@@ -323,7 +323,7 @@ AIAutocompleteComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0"
|
|
|
323
323
|
useExisting: forwardRef(() => AIAutocompleteComponent),
|
|
324
324
|
multi: true,
|
|
325
325
|
},
|
|
326
|
-
], viewQueries: [{ propertyName: "containerRef", first: true, predicate: ["container"], descendants: true, static: true }, { propertyName: "editorRef", first: true, predicate: ["editor"], descendants: true }, { propertyName: "pillContainerRef", first: true, predicate: ["pillContainer"], descendants: true }], usesOnChanges: true, ngImport: i0, template: "<div\n #container\n class=\"magicx-aia magicx-aia-container\"\n [attr.data-pill-placement]=\"pillPlacement\"\n [attr.data-options-position]=\"optionsPosition\"\n [attr.data-animations]=\"animations ? 'on' : 'off'\"\n [attr.data-mode]=\"resolvedMode\"\n>\n <ai-autocomplete-dropdown\n *ngIf=\"controller\"\n [controller]=\"controller\"\n [showPills]=\"showDropdownPills\"\n ></ai-autocomplete-dropdown>\n\n <div\n class=\"magicx-aia-input-wrapper\"\n (click)=\"onWrapperClick($event)\"\n (keyup)=\"$event.stopPropagation()\"\n >\n <div class=\"magicx-aia-editor-area\" data-aia-editor=\"\">\n <div\n #editor\n *ngIf=\"controller\"\n [aiaEditorHost]=\"controller\"\n [autoFocus]=\"autoFocus\"\n class=\"magicx-aia-input\"\n data-aia-input=\"\"\n ></div>\n\n <ng-container *ngIf=\"controller && showInlinePills\">\n <span\n #pillContainer\n class=\"magicx-aia-pill-list-container\"\n data-aia-pill-list-container=\"\"\n *ngIf=\"\n (controller.isLoading$ | async) ||\n ((controller.suggestionPills$ | async)?.length ?? 0) > 0\n \"\n >\n <aia-pill-list\n [pills]=\"(controller.suggestionPills$ | async) ?? []\"\n [activePillIndex]=\"0\"\n [activeSelected]=\"(controller.isActivePillSelected$ | async) ?? false\"\n [loading]=\"(controller.isLoading$ | async) ?? false\"\n (selectPill)=\"onSelectPill($event)\"\n ></aia-pill-list>\n </span>\n </ng-container>\n </div>\n\n <ng-container [ngSwitch]=\"submitButtonState\">\n <aia-submit-button\n *ngSwitchCase=\"'default'\"\n [disabled]=\"\n !(\n controller &&\n canSubmit({\n segments: (controller.segments$ | async) ?? [],\n completedParams: (controller.completedParams$ | async) ?? []\n })\n )\n \"\n (submit)=\"onSubmitButtonClick($event)\"\n ></aia-submit-button>\n\n <span\n *ngSwitchCase=\"'custom'\"\n data-aia-submit=\"\"\n class=\"magicx-aia-submit-slot\"\n (click)=\"onSubmitSlotClick($event)\"\n >\n <ng-container *ngTemplateOutlet=\"customSubmitTemplate\"></ng-container>\n </span>\n </ng-container>\n </div>\n</div>\n", styles: [":where(.magicx-aia,.magicx-aia *,.magicx-aia *::before,.magicx-aia *::after){box-sizing:border-box}:where(.magicx-aia),:where(.magicx-aia[data-mode=\"light\"]){--aia-surface: #ffffff;--aia-border: #b0b0b0;--aia-dropdown-border: #e5e7eb;--aia-dropdown-shadow: 0 8px 12px rgba(0, 0, 0, .1);--aia-pill-bg: #bdbdbd;--aia-pill-color: #333539;--aia-pill-font-size: 14px;--aia-option-bg: #eef2ff;--aia-option-color: #505050;--aia-option-color-selected: #000000;--aia-option-font-size: 14px;--aia-written-text-color: #000000;--aia-written-text-font-size: 14px;--aia-caret-color: var(--aia-written-text-color, #000000);--aia-submit-bg: #000000;--aia-submit-color: #ffffff;--aia-color-text-muted: #6b7280;--aia-skeleton-bg: rgba(189, 189, 189, .51);--aia-streak-rgb: 99, 102, 241;--aia-streak-glass-bg: rgba(99, 102, 241, .1);--aia-footer-divider: rgba(176, 176, 176, .4);--aia-footer-hint-color: #505050;--aia-footer-brand-color: #b0b0b0;--aia-footer-badge-border: rgba(189, 189, 189, .51)}:where(.magicx-aia[data-mode=\"dark\"]){--aia-surface: #000000;--aia-border: #505050;--aia-dropdown-border: #484848;--aia-dropdown-shadow: 0 8px 12px rgba(0, 0, 0, .1);--aia-pill-bg: #bdbdbd;--aia-pill-color: #b0b0b0;--aia-pill-font-size: 14px;--aia-option-bg: #323232;--aia-option-color: #b0b0b0;--aia-option-color-selected: #ffffff;--aia-option-font-size: 14px;--aia-written-text-color: #ffffff;--aia-written-text-font-size: 14px;--aia-caret-color: var(--aia-written-text-color, #ffffff);--aia-submit-bg: #ffffff;--aia-submit-color: #000000;--aia-color-text-muted: #c1c4cb;--aia-skeleton-bg: #333539;--aia-streak-rgb: 255, 255, 255;--aia-streak-glass-bg: rgba(255, 255, 255, .1);--aia-footer-divider: rgba(255, 255, 255, .15);--aia-footer-hint-color: #b0b0b0;--aia-footer-brand-color: #505050;--aia-footer-badge-border: #505050}:where(.magicx-aia[data-options-position=\"above\"]) [data-aia-dropdown]{top:auto;bottom:100%;margin-top:0;margin-bottom:6px}:where(.magicx-aia[data-options-position=\"above\"]) [data-aia-dropdown] .aia-stack{flex-direction:column-reverse}:where(.magicx-aia[data-options-position=\"above\"]) [data-aia-dropdown] .magicx-aia-footer{flex-direction:column-reverse}:where(.magicx-aia[data-animations=\"off\"]) *,:where(.magicx-aia[data-animations=\"off\"]) *:before,:where(.magicx-aia[data-animations=\"off\"]) *:after{animation-duration:0s!important;transition-duration:0s!important}.magicx-aia-container{position:relative;font-family:var(--aia-font-family, inherit);container-type:inline-size}.magicx-aia-input-wrapper{padding:12px 10px;border:1px solid var(--aia-border, #b0b0b0);border-radius:20px;background:var(--aia-surface, #ffffff);overflow:hidden;display:flex;align-items:center;gap:12px}.magicx-aia-editor-area{position:relative;flex:1;min-width:0;min-height:19px;line-height:19px;font-family:inherit;font-size:var(--aia-written-text-font-size, 14px);white-space:pre-wrap;word-break:break-word;overflow-wrap:anywhere}.magicx-aia-input{display:inline;outline:none;background:transparent;color:var(--aia-written-text-color, var(--aia-color-text-default, #fff));caret-color:var( --aia-caret-color, var(--aia-written-text-color, var(--aia-color-text-default, #fff)) );font-weight:300;vertical-align:middle}:where(.magicx-aia-input) strong{font-weight:600;letter-spacing:-.01em}:where(.magicx-aia-input) strong[class~=magicx-aia-segment--editing]{background-color:color-mix(in srgb,var(--aia-edit-outline, currentColor) 20%,transparent);border-radius:6px;padding:2px 3px;margin:0 -1.5px;caret-color:transparent}.magicx-aia-input:has(strong[class~=\"magicx-aia-segment--editing\"]){caret-color:transparent}:where(.magicx-aia-input) strong[class~=magicx-aia-segment--editing]::selection{background:transparent;color:inherit}:where(.magicx-aia-input) strong[class~=magicx-aia-segment--editing]::-moz-selection{background:transparent;color:inherit}.magicx-aia-input[data-aia-empty=true][data-placeholder]:before{content:attr(data-placeholder);color:var(--aia-color-text-muted, #c1c4cb);opacity:.7;pointer-events:none}.magicx-aia-input[data-aia-empty=true]{display:inline-block;min-width:1px}.magicx-aia-pill-list-container{display:inline;margin-left:8px}.magicx-aia-pill-list-container:empty,.magicx-aia-pill-list-container[data-aia-pill-wrapped]{margin-left:0}.magicx-aia-submit-slot{display:contents}:where(.magicx-aia-input) strong[class~=magicx-aia-shimmer-revealed]{color:transparent;background:linear-gradient(120deg,var(--aia-written-text-color, var(--aia-color-text-default, #fff)) 0%,var(--aia-written-text-color, var(--aia-color-text-default, #fff)) 44%,#b0b0b0 48%,#b0b0b0 52%,var(--aia-written-text-color, var(--aia-color-text-default, #fff)) 56%,var(--aia-written-text-color, var(--aia-color-text-default, #fff)) 100%);background-size:200% 100%;-webkit-background-clip:text;background-clip:text}:where(.magicx-aia-input) strong[class~=magicx-aia-shimmer-sweep]{animation:aiaTextShimmer .65s ease-out forwards}@keyframes aiaTextShimmer{0%{background-position:100% 0}to{background-position:-50% 0}}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i1.NgSwitch, selector: "[ngSwitch]", inputs: ["ngSwitch"] }, { kind: "directive", type: i1.NgSwitchCase, selector: "[ngSwitchCase]", inputs: ["ngSwitchCase"] }, { kind: "pipe", type: i1.AsyncPipe, name: "async" }, { kind: "component", type: AIAutocompleteDropdownComponent, selector: "ai-autocomplete-dropdown", inputs: ["controller", "showPills", "className"] }, { kind: "directive", type: AIAutocompleteEditorHostDirective, selector: "[aiaEditorHost]", inputs: ["aiaEditorHost", "autoFocus"] }, { kind: "component", type: PillListComponent, selector: "aia-pill-list", inputs: ["pills", "activePillIndex", "rounded", "loading", "activeSelected"], outputs: ["selectPill"] }, { kind: "component", type: SubmitButtonComponent, selector: "aia-submit-button", inputs: ["disabled"], outputs: ["submit"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
|
|
326
|
+
], viewQueries: [{ propertyName: "containerRef", first: true, predicate: ["container"], descendants: true, static: true }, { propertyName: "editorRef", first: true, predicate: ["editor"], descendants: true }, { propertyName: "pillContainerRef", first: true, predicate: ["pillContainer"], descendants: true }], usesOnChanges: true, ngImport: i0, template: "<div\n #container\n class=\"magicx-aia magicx-aia-container\"\n [attr.data-pill-placement]=\"pillPlacement\"\n [attr.data-options-position]=\"optionsPosition\"\n [attr.data-animations]=\"animations ? 'on' : 'off'\"\n [attr.data-mode]=\"resolvedMode\"\n>\n <ai-autocomplete-dropdown\n *ngIf=\"controller\"\n [controller]=\"controller\"\n [showPills]=\"showDropdownPills\"\n ></ai-autocomplete-dropdown>\n\n <div\n class=\"magicx-aia-input-wrapper\"\n (click)=\"onWrapperClick($event)\"\n (keyup)=\"$event.stopPropagation()\"\n >\n <div class=\"magicx-aia-editor-area\" data-aia-editor=\"\">\n <div\n #editor\n *ngIf=\"controller\"\n [aiaEditorHost]=\"controller\"\n [autoFocus]=\"autoFocus\"\n class=\"magicx-aia-input\"\n data-aia-input=\"\"\n ></div>\n\n <ng-container *ngIf=\"controller && showInlinePills\">\n <span\n #pillContainer\n class=\"magicx-aia-pill-list-container\"\n data-aia-pill-list-container=\"\"\n *ngIf=\"\n (controller.isLoading$ | async) ||\n ((controller.suggestionPills$ | async)?.length ?? 0) > 0\n \"\n >\n <aia-pill-list\n [pills]=\"(controller.suggestionPills$ | async) ?? []\"\n [activePillIndex]=\"0\"\n [activeSelected]=\"(controller.isActivePillSelected$ | async) ?? false\"\n [loading]=\"(controller.isLoading$ | async) ?? false\"\n (selectPill)=\"onSelectPill($event)\"\n ></aia-pill-list>\n </span>\n </ng-container>\n </div>\n\n <ng-container [ngSwitch]=\"submitButtonState\">\n <aia-submit-button\n *ngSwitchCase=\"'default'\"\n [disabled]=\"\n !(\n controller &&\n canSubmit({\n segments: (controller.segments$ | async) ?? [],\n completedParams: (controller.completedParams$ | async) ?? []\n })\n )\n \"\n (submit)=\"onSubmitButtonClick($event)\"\n ></aia-submit-button>\n\n <span\n *ngSwitchCase=\"'custom'\"\n data-aia-submit=\"\"\n class=\"magicx-aia-submit-slot\"\n (click)=\"onSubmitSlotClick($event)\"\n >\n <ng-container *ngTemplateOutlet=\"customSubmitTemplate\"></ng-container>\n </span>\n </ng-container>\n </div>\n</div>\n", styles: [":where(.magicx-aia,.magicx-aia *,.magicx-aia *::before,.magicx-aia *::after){box-sizing:border-box}:where(.magicx-aia),:where(.magicx-aia[data-mode=\"light\"]){--aia-surface: #ffffff;--aia-border: #b0b0b0;--aia-dropdown-border: #e5e7eb;--aia-dropdown-shadow: 0 8px 12px rgba(0, 0, 0, .1);--aia-pill-bg: #bdbdbd;--aia-pill-color: #333539;--aia-pill-font-size: 14px;--aia-option-bg: #eef2ff;--aia-option-color: #505050;--aia-option-color-selected: #000000;--aia-option-font-size: 14px;--aia-written-text-color: #000000;--aia-written-text-font-size: 14px;--aia-caret-color: var(--aia-written-text-color, #000000);--aia-submit-bg: #000000;--aia-submit-color: #ffffff;--aia-color-text-muted: #6b7280;--aia-skeleton-bg: rgba(189, 189, 189, .51);--aia-streak-rgb: 99, 102, 241;--aia-streak-glass-bg: rgba(99, 102, 241, .1);--aia-footer-divider: rgba(176, 176, 176, .4);--aia-footer-hint-color: #505050;--aia-footer-brand-color: #b0b0b0;--aia-footer-badge-border: rgba(189, 189, 189, .51)}:where(.magicx-aia[data-mode=\"dark\"]){--aia-surface: #000000;--aia-border: #505050;--aia-dropdown-border: #484848;--aia-dropdown-shadow: 0 8px 12px rgba(0, 0, 0, .1);--aia-pill-bg: #bdbdbd;--aia-pill-color: #b0b0b0;--aia-pill-font-size: 14px;--aia-option-bg: #323232;--aia-option-color: #b0b0b0;--aia-option-color-selected: #ffffff;--aia-option-font-size: 14px;--aia-written-text-color: #ffffff;--aia-written-text-font-size: 14px;--aia-caret-color: var(--aia-written-text-color, #ffffff);--aia-submit-bg: #ffffff;--aia-submit-color: #000000;--aia-color-text-muted: #c1c4cb;--aia-skeleton-bg: #333539;--aia-streak-rgb: 255, 255, 255;--aia-streak-glass-bg: rgba(255, 255, 255, .1);--aia-footer-divider: rgba(255, 255, 255, .15);--aia-footer-hint-color: #b0b0b0;--aia-footer-brand-color: #505050;--aia-footer-badge-border: #505050}:where(.magicx-aia[data-options-position=\"above\"]) [data-aia-dropdown]{top:auto;bottom:100%;margin-top:0;margin-bottom:6px}:where(.magicx-aia[data-options-position=\"above\"]) [data-aia-dropdown] .aia-stack{flex-direction:column-reverse}:where(.magicx-aia[data-options-position=\"above\"]) [data-aia-dropdown] .magicx-aia-footer{flex-direction:column-reverse}:where(.magicx-aia[data-animations=\"off\"]) *,:where(.magicx-aia[data-animations=\"off\"]) *:before,:where(.magicx-aia[data-animations=\"off\"]) *:after{animation-duration:0s!important;transition-duration:0s!important}.magicx-aia-container{position:relative;font-family:var(--aia-font-family, inherit);container-type:inline-size}.magicx-aia-input-wrapper{padding:12px 10px;border:1px solid var(--aia-border, #b0b0b0);border-radius:20px;background:var(--aia-surface, #ffffff);overflow:hidden;display:flex;align-items:center;gap:12px}.magicx-aia-editor-area{position:relative;flex:1;min-width:0;min-height:19px;line-height:19px;font-family:inherit;font-size:var(--aia-written-text-font-size, 14px);white-space:pre-wrap;word-break:break-word;overflow-wrap:anywhere}.magicx-aia-input{display:inline;outline:none;background:transparent;color:var(--aia-written-text-color, var(--aia-color-text-default, #fff));caret-color:var( --aia-caret-color, var(--aia-written-text-color, var(--aia-color-text-default, #fff)) );font-weight:300;vertical-align:middle}:where(.magicx-aia-input) strong{font-weight:600;letter-spacing:-.01em}:where(.magicx-aia-input) strong[class~=magicx-aia-segment--editing]{background-color:color-mix(in srgb,var(--aia-edit-outline, currentColor) 20%,transparent);border-radius:6px;padding:2px 3px;margin:0 -1.5px;caret-color:transparent}.magicx-aia-input:has(strong[class~=\"magicx-aia-segment--editing\"]){caret-color:transparent}:where(.magicx-aia-input) strong[class~=magicx-aia-segment--editing]::selection{background:transparent;color:inherit}:where(.magicx-aia-input) strong[class~=magicx-aia-segment--editing]::-moz-selection{background:transparent;color:inherit}.magicx-aia-input[data-aia-empty=true][data-placeholder]:before{content:attr(data-placeholder);color:var(--aia-color-text-muted, #c1c4cb);opacity:.7;pointer-events:none}.magicx-aia-input[data-aia-empty=true]{display:inline-block;min-width:1px}.magicx-aia-pill-list-container{display:inline;margin-left:8px}.magicx-aia-pill-list-container:empty,.magicx-aia-pill-list-container[data-aia-pill-wrapped]{margin-left:0}.magicx-aia-submit-slot{display:contents}:where(.magicx-aia-input) strong[class~=magicx-aia-shimmer-revealed]{color:transparent;background:linear-gradient(120deg,var(--aia-written-text-color, var(--aia-color-text-default, #fff)) 0%,var(--aia-written-text-color, var(--aia-color-text-default, #fff)) 44%,#b0b0b0 48%,#b0b0b0 52%,var(--aia-written-text-color, var(--aia-color-text-default, #fff)) 56%,var(--aia-written-text-color, var(--aia-color-text-default, #fff)) 100%);background-size:200% 100%;-webkit-background-clip:text;background-clip:text}:where(.magicx-aia-input) strong[class~=magicx-aia-shimmer-sweep]{animation:aiaTextShimmer .65s ease-out forwards}@keyframes aiaTextShimmer{0%{background-position:100% 0}to{background-position:-50% 0}}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i1.NgSwitch, selector: "[ngSwitch]", inputs: ["ngSwitch"] }, { kind: "directive", type: i1.NgSwitchCase, selector: "[ngSwitchCase]", inputs: ["ngSwitchCase"] }, { kind: "pipe", type: i1.AsyncPipe, name: "async" }, { kind: "component", type: AIAutocompleteDropdownComponent, selector: "ai-autocomplete-dropdown", inputs: ["controller", "showPills", "className", "mode"] }, { kind: "directive", type: AIAutocompleteEditorHostDirective, selector: "[aiaEditorHost]", inputs: ["aiaEditorHost", "autoFocus"] }, { kind: "component", type: PillListComponent, selector: "aia-pill-list", inputs: ["pills", "activePillIndex", "rounded", "loading", "activeSelected"], outputs: ["selectPill"] }, { kind: "component", type: SubmitButtonComponent, selector: "aia-submit-button", inputs: ["disabled"], outputs: ["submit"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
|
|
327
327
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: AIAutocompleteComponent, decorators: [{
|
|
328
328
|
type: Component,
|
|
329
329
|
args: [{ selector: "ai-autocomplete", standalone: true, imports: [
|
|
@@ -408,4 +408,4 @@ function resolveInitialMode(mode) {
|
|
|
408
408
|
return "dark";
|
|
409
409
|
return window.matchMedia("(prefers-color-scheme: dark)").matches ? "dark" : "light";
|
|
410
410
|
}
|
|
411
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWktYXV0b2NvbXBsZXRlLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9saWIvYWktYXV0b2NvbXBsZXRlL2FpLWF1dG9jb21wbGV0ZS5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi9zcmMvbGliL2FpLWF1dG9jb21wbGV0ZS9haS1hdXRvY29tcGxldGUuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFlBQVksRUFBRSxpQkFBaUIsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQ2xFLE9BQU8sRUFFTCx1QkFBdUIsRUFDdkIsaUJBQWlCLEVBQ2pCLFNBQVMsRUFFVCxZQUFZLEVBQ1osVUFBVSxFQUNWLEtBQUssRUFDTCxNQUFNLEVBQ04sTUFBTSxFQUlOLE1BQU0sRUFDTixXQUFXLEVBR1gsU0FBUyxFQUNULGlCQUFpQixHQUNsQixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQTZCLGlCQUFpQixFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDOUUsT0FBTyxFQUlMLFVBQVUsRUFFVixnQkFBZ0IsRUFDaEIsY0FBYyxFQUVkLGVBQWUsR0FDaEIsTUFBTSxxQ0FBcUMsQ0FBQztBQUM3QyxPQUFPLEVBQUUsK0JBQStCLEVBQUUsTUFBTSxnRUFBZ0UsQ0FBQztBQUNqSCxPQUFPLEVBQUUsd0JBQXdCLEVBQUUsTUFBTSwwQ0FBMEMsQ0FBQztBQUNwRixPQUFPLEVBQUUsaUNBQWlDLEVBQUUsTUFBTSwrQ0FBK0MsQ0FBQztBQUNsRyxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSwyQ0FBMkMsQ0FBQztBQUM5RSxPQUFPLEVBQUUscUJBQXFCLEVBQUUsTUFBTSxtREFBbUQsQ0FBQzs7O0FBRTFGOzs7Ozs7O0dBT0c7QUF3QkgsTUFBTSxPQUFPLHVCQUF1QjtJQXZCcEM7UUE4Qlcsc0JBQWlCLEdBQUcsS0FBSyxDQUFDO1FBRW5DLHNEQUFzRDtRQUM3QyxrQkFB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QU8sQ0FBQztBQUN0RixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tbW9uTW9kdWxlLCBpc1BsYXRmb3JtQnJvd3NlciB9IGZyb20gXCJAYW5ndWxhci9jb21tb25cIjtcbmltcG9ydCB7XG4gIHR5cGUgQWZ0ZXJWaWV3SW5pdCxcbiAgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksXG4gIENoYW5nZURldGVjdG9yUmVmLFxuICBDb21wb25lbnQsXG4gIHR5cGUgRWxlbWVudFJlZixcbiAgRXZlbnRFbWl0dGVyLFxuICBmb3J3YXJkUmVmLFxuICBJbnB1dCxcbiAgaW5qZWN0LFxuICBOZ1pvbmUsXG4gIHR5cGUgT25DaGFuZ2VzLFxuICB0eXBlIE9uRGVzdHJveSxcbiAgdHlwZSBPbkluaXQsXG4gIE91dHB1dCxcbiAgUExBVEZPUk1fSUQsXG4gIHR5cGUgU2ltcGxlQ2hhbmdlcyxcbiAgdHlwZSBUZW1wbGF0ZVJlZixcbiAgVmlld0NoaWxkLFxuICBWaWV3RW5jYXBzdWxhdGlvbixcbn0gZnJvbSBcIkBhbmd1bGFyL2NvcmVcIjtcbmltcG9ydCB7IHR5cGUgQ29udHJvbFZhbHVlQWNjZXNzb3IsIE5HX1ZBTFVFX0FDQ0VTU09SIH0gZnJvbSBcIkBhbmd1bGFyL2Zvcm1zXCI7XG5pbXBvcnQge1xuICB0eXBlIEFQSUNvbmZpZyxcbiAgdHlwZSBBcHBlYXJhbmNlTW9kZSxcbiAgdHlwZSBBdXRvY29tcGxldGVSZXN1bHQsXG4gIGJ1aWxkUXVlcnksXG4gIHR5cGUgQ29tcGxldGVkUGFyYW1TdGF0ZSxcbiAgZXh0cmFjdFBsYWluVGV4dCxcbiAgTW9kZUNvbnRyb2xsZXIsXG4gIHR5cGUgT3B0aW9uT3ZlcnJpZGVzLFxuICBzZXRDdXJzb3JPZmZzZXQsXG59IGZyb20gXCJAbWFnaWN4LWVuZy9haS1hdXRvY29tcGxldGUtdmFuaWxsYVwiO1xuaW1wb3J0IHsgQUlBdXRvY29tcGxldGVEcm9wZG93bkNvbXBvbmVudCB9IGZyb20gXCIuLi9haS1hdXRvY29tcGxldGUtZHJvcGRvd24vYWktYXV0b2NvbXBsZXRlLWRyb3Bkb3duLmNvbXBvbmVudFwiO1xuaW1wb3J0IHsgQUlBdXRvY29tcGxldGVDb250cm9sbGVyIH0gZnJvbSBcIi4uL2NvbnRyb2xsZXIvYWktYXV0b2NvbXBsZXRlLmNvbnRyb2xsZXJcIjtcbmltcG9ydCB7IEFJQXV0b2NvbXBsZXRlRWRpdG9ySG9zdERpcmVjdGl2ZSB9IGZyb20gXCIuLi9pbnRlcm5hbC9lZGl0b3ItaG9zdC9lZGl0b3ItaG9zdC5kaXJlY3RpdmVcIjtcbmltcG9ydCB7IFBpbGxMaXN0Q29tcG9uZW50IH0gZnJvbSBcIi4uL2ludGVybmFsL3BpbGwtbGlzdC9waWxsLWxpc3QuY29tcG9uZW50XCI7XG5pbXBvcnQgeyBTdWJtaXRCdXR0b25Db21wb25lbnQgfSBmcm9tIFwiLi4vaW50ZXJuYWwvc3VibWl0LWJ1dHRvbi9zdWJtaXQtYnV0dG9uLmNvbXBvbmVudFwiO1xuXG4vKipcbiAqIFRpZXIgMSBjb21wb25lbnQg4oCUIGA8YWktYXV0b2NvbXBsZXRlPmAuIFRoZSBBbmd1bGFyIGVxdWl2YWxlbnQgb2YgUmVhY3Qnc1xuICogYDxBSUF1dG9jb21wbGV0ZSAvPmAuIE93bnMgdGhlIGNvbnRlbnRFZGl0YWJsZSBlZGl0b3IsIGlubGluZSBwaWxscywgbW9kZVxuICogY29udHJvbGxlciwgc3VibWl0IGJ1dHRvbiBzbG90LCBhbmQgYW4gZW1iZWRkZWRcbiAqIHtAbGluayBBSUF1dG9jb21wbGV0ZUNvbnRyb2xsZXJ9IHRoYXQgZHJpdmVzIHRoZSBkcm9wZG93bi5cbiAqXG4gKiBAcHVibGljXG4gKi9cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogXCJhaS1hdXRvY29tcGxldGVcIixcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgaW1wb3J0czogW1xuICAgIENvbW1vbk1vZHVsZSxcbiAgICBBSUF1dG9jb21wbGV0ZURyb3Bkb3duQ29tcG9uZW50LFxuICAgIEFJQXV0b2NvbXBsZXRlRWRpdG9ySG9zdERpcmVjdGl2ZSxcbiAgICBQaWxsTGlzdENvbXBvbmVudCxcbiAgICBTdWJtaXRCdXR0b25Db21wb25lbnQsXG4gIF0sXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxuICBlbmNhcHN1bGF0aW9uOiBWaWV3RW5jYXBzdWxhdGlvbi5Ob25lLFxuICB0ZW1wbGF0ZVVybDogXCIuL2FpLWF1dG9jb21wbGV0ZS5jb21wb25lbnQuaHRtbFwiLFxuICBzdHlsZVVybHM6IFtcIi4vYWktYXV0b2NvbXBsZXRlLmNvbXBvbmVudC5jc3NcIl0sXG4gIHByb3ZpZGVyczogW1xuICAgIHtcbiAgICAgIHByb3ZpZGU6IE5HX1ZBTFVFX0FDQ0VTU09SLFxuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11c2UtYmVmb3JlLWRlZmluZVxuICAgICAgdXNlRXhpc3Rpbmc6IGZvcndhcmRSZWYoKCkgPT4gQUlBdXRvY29tcGxldGVDb21wb25lbnQpLFxuICAgICAgbXVsdGk6IHRydWUsXG4gICAgfSxcbiAgXSxcbn0pXG5leHBvcnQgY2xhc3MgQUlBdXRvY29tcGxldGVDb21wb25lbnRcbiAgaW1wbGVtZW50cyBPbkluaXQsIEFmdGVyVmlld0luaXQsIE9uQ2hhbmdlcywgT25EZXN0cm95LCBDb250cm9sVmFsdWVBY2Nlc3Nvclxue1xuICAvLyA9PT0gSW5wdXRzIChtaXJyb3JzIFJlYWN0J3MgQUlBdXRvY29tcGxldGVQcm9wcykgPT09XG5cbiAgQElucHV0KCkgYXBpQ29uZmlnPzogQVBJQ29uZmlnO1xuICBASW5wdXQoKSBvcHRpb25PdmVycmlkZXM/OiBPcHRpb25PdmVycmlkZXM7XG4gIEBJbnB1dCgpIG1hc2tDb21wbGV0ZWRUZXh0ID0gZmFsc2U7XG4gIEBJbnB1dCgpIGNvbHVtbnM/OiBudW1iZXI7XG4gIC8qKiBXaGVyZSB1bmZpbGxlZCBwaWxscyByZW5kZXIuIERlZmF1bHQ6IFwiaW5saW5lXCIuICovXG4gIEBJbnB1dCgpIHBpbGxQbGFjZW1lbnQ6IFwiaW5saW5lXCIgfCBcImRyb3Bkb3duXCIgfCBcImhpZGRlblwiID0gXCJpbmxpbmVcIjtcbiAgLyoqIENvbG9yIG1vZGUuIFwiYXV0b1wiIGZvbGxvd3MgcHJlZmVycy1jb2xvci1zY2hlbWUuIERlZmF1bHQ6IFwiYXV0b1wiLiAqL1xuICBASW5wdXQoKSBtb2RlOiBBcHBlYXJhbmNlTW9kZSA9IFwiYXV0b1wiO1xuICBASW5wdXQoKSBvcHRpb25zUG9zaXRpb246IFwiYWJvdmVcIiB8IFwiYmVsb3dcIiA9IFwiYmVsb3dcIjtcbiAgQElucHV0KCkgYW5pbWF0aW9ucyA9IHRydWU7XG4gIEBJbnB1dCgpIGRyb3Bkb3duVHJpZ2dlcj86IFwiYXV0b1wiIHwgXCJtYW51YWxcIiB8IFwiaGlkZGVuXCI7XG4gIEBJbnB1dCgpIGNsb3NlRHJvcGRvd25PbkJsdXI/OiBib29sZWFuO1xuICBASW5wdXQoKSBzaG93Tm9uVGFwcGFibGVPcHRpb25zPzogYm9vbGVhbjtcbiAgLyoqIEZvY3VzIHRoZSBlZGl0b3Igb24gbW91bnQuIERlZmF1bHQ6IHRydWUuICovXG4gIEBJbnB1dCgpIGF1dG9Gb2N1cyA9IHRydWU7XG4gIC8qKiBDb250cm9sbGVkLW1vZGUgdGV4dCB2YWx1ZS4gKi9cbiAgQElucHV0KCkgdmFsdWU/OiBzdHJpbmc7XG4gIC8qKiBDb250cm9sbGVkLW1vZGUgY29tcGxldGVkIHBhcmFtcy4gKi9cbiAgQElucHV0KCkgY29tcGxldGVkUGFyYW1zPzogQ29tcGxldGVkUGFyYW1TdGF0ZVtdO1xuICAvKipcbiAgICogQ3VzdG9tIHN1Ym1pdCBidXR0b24uIFBhc3MgYSBgPG5nLXRlbXBsYXRlPmAgdG8gcmVwbGFjZSB0aGUgZGVmYXVsdCBhcnJvd1xuICAgKiBidXR0b24uIFBhc3MgYG51bGxgIHRvIHJlbmRlciBubyBidXR0b24uIERlZmF1bHQgKGB1bmRlZmluZWRgKSByZW5kZXJzXG4gICAqIHRoZSBidWlsdC1pbiBhcnJvdy5cbiAgICovXG4gIEBJbnB1dCgpIHN1Ym1pdEJ1dHRvbj86IFRlbXBsYXRlUmVmPHVua25vd24+IHwgbnVsbDtcblxuICAvLyA9PT0gT3V0cHV0cyA9PT1cblxuICAvKiogQ2FsbGVkIG9uIEVudGVyIG9yIHN1Ym1pdC1idXR0b24gY2xpY2suICovXG4gIEBPdXRwdXQoKSByZWFkb25seSBzdWJtaXR0ZWQgPSBuZXcgRXZlbnRFbWl0dGVyPEF1dG9jb21wbGV0ZVJlc3VsdD4oKTtcbiAgQE91dHB1dCgpIHJlYWRvbmx5IGVycm9yZWQgPSBuZXcgRXZlbnRFbWl0dGVyPEVycm9yPigpO1xuICBAT3V0cHV0KCkgcmVhZG9ubHkgdmFsdWVDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPHN0cmluZz4oKTtcbiAgQE91dHB1dCgpIHJlYWRvbmx5IGNvbXBsZXRlZFBhcmFtc0NoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8Q29tcGxldGVkUGFyYW1TdGF0ZVtdPigpO1xuICBAT3V0cHV0KCkgcmVhZG9ubHkgZm9jdXNlZCA9IG5ldyBFdmVudEVtaXR0ZXI8dm9pZD4oKTtcbiAgQE91dHB1dCgpIHJlYWRvbmx5IGJsdXJyZWQgPSBuZXcgRXZlbnRFbWl0dGVyPHZvaWQ+KCk7XG5cbiAgLy8gPT09IFZpZXcgcmVmcyA9PT1cblxuICBAVmlld0NoaWxkKFwiY29udGFpbmVyXCIsIHsgc3RhdGljOiB0cnVlIH0pIGNvbnRhaW5lclJlZiE6IEVsZW1lbnRSZWY8SFRNTERpdkVsZW1lbnQ+O1xuICBAVmlld0NoaWxkKFwiZWRpdG9yXCIsIHsgc3RhdGljOiBmYWxzZSB9KSBlZGl0b3JSZWY/OiBFbGVtZW50UmVmPEhUTUxEaXZFbGVtZW50PjtcbiAgQFZpZXdDaGlsZChcInBpbGxDb250YWluZXJcIikgcGlsbENvbnRhaW5lclJlZj86IEVsZW1lbnRSZWY8SFRNTFNwYW5FbGVtZW50PjtcblxuICAvLyA9PT0gUHVibGljIHN0YXRlIGZvciB0aGUgdGVtcGxhdGUgPT09XG5cbiAgY29udHJvbGxlciE6IEFJQXV0b2NvbXBsZXRlQ29udHJvbGxlcjtcbiAgLyoqXG4gICAqIENvbmNyZXRlIGxpZ2h0L2RhcmsgdmFsdWUgYm91bmQgdG8gYFthdHRyLmRhdGEtbW9kZV1gLiBTZWVkZWQgaW4gbmdPbkluaXRcbiAgICogc28gdGhlIGF0dHJpYnV0ZSBpcyBwcmVzZW50IGR1cmluZyBTU1IgKHdoZXJlIE1vZGVDb250cm9sbGVyLCBnYXRlZCBiZWhpbmRcbiAgICogaXNQbGF0Zm9ybUJyb3dzZXIgaW4gbmdBZnRlclZpZXdJbml0LCBuZXZlciBydW5zKS4gT24gdGhlIGJyb3dzZXIgdGhlXG4gICAqIE1vZGVDb250cm9sbGVyJ3MgcmVzb2x2ZSBjYWxsYmFjayBrZWVwcyB0aGlzIGluIHN5bmMg4oCUIHNvIGl0cyBydW50aW1lXG4gICAqIHByZWZlcnMtY29sb3Itc2NoZW1lIHVwZGF0ZXMgYW5kIHRoaXMgYmluZGluZyBhbHdheXMgYWdyZWUgKG5vIGNsb2JiZXIpLlxuICAgKi9cbiAgcmVzb2x2ZWRNb2RlOiBcImxpZ2h0XCIgfCBcImRhcmtcIiA9IFwiZGFya1wiO1xuXG4gIC8vID09PSBJbnRlcm5hbCA9PT1cblxuICBwcml2YXRlIG1vZGVDb250cm9sbGVyPzogTW9kZUNvbnRyb2xsZXI7XG4gIHByaXZhdGUgcmVzaXplT2JzZXJ2ZXI/OiBSZXNpemVPYnNlcnZlcjtcbiAgcHJpdmF0ZSBvbkNoYW5nZUZuOiAodmFsdWU6IHN0cmluZykgPT4gdm9pZCA9IG5vb3A7XG4gIHByaXZhdGUgb25Ub3VjaGVkRm46ICgpID0+IHZvaWQgPSBub29wO1xuICAvLyBIb2xkcyBhIHZhbHVlIHdyaXR0ZW4gYnkgUmVhY3RpdmUgRm9ybXMgYmVmb3JlIG5nT25Jbml0IHJhbi4gUmVhY3RpdmVcbiAgLy8gRm9ybXMgY2FuIGNhbGwgd3JpdGVWYWx1ZSgpIGR1cmluZyBkeW5hbWljIGZvcm0gY29uc3RydWN0aW9uIChlLmcuIHdoZW5cbiAgLy8gYSBGb3JtQ29udHJvbCBhbHJlYWR5IGhvbGRzIGEgdmFsdWUgYXQgdGhlIG1vbWVudCB0aGUgZGlyZWN0aXZlIGlzXG4gIC8vIGNyZWF0ZWQpLiBXZSBzdGFzaCB0aGUgdmFsdWUgaGVyZSBhbmQgZmx1c2ggaXQgaW4gbmdPbkluaXQgKmFmdGVyKlxuICAvLyB0aGUgY29udHJvbGxlciBleGlzdHMg4oCUIG90aGVyd2lzZSB0aGUgZWRpdG9yIHJlbmRlcnMgZW1wdHkgZXZlbiB0aG91Z2hcbiAgLy8gdGhlIGZvcm0gaGFkIGEgdmFsdWUuIGB1bmRlZmluZWRgIG1lYW5zIFwibm8gcGVuZGluZyB3cml0ZVwiLlxuICBwcml2YXRlIHBlbmRpbmdXcml0ZVZhbHVlOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG5cbiAgLy8gwqcxNi45OiBwcmVmZXIgYGluamVjdCgpYCBvdmVyIGNvbnN0cnVjdG9yLXBhcmFtZXRlciBESSBmb3IgY29tcG9uZW50cy5cbiAgcHJpdmF0ZSByZWFkb25seSBwbGF0Zm9ybUlkID0gaW5qZWN0KFBMQVRGT1JNX0lEKTtcbiAgcHJpdmF0ZSByZWFkb25seSB6b25lID0gaW5qZWN0KE5nWm9uZSk7XG4gIHByaXZhdGUgcmVhZG9ubHkgY2RyID0gaW5qZWN0KENoYW5nZURldGVjdG9yUmVmKTtcblxuICBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICAvLyBTZWVkIGJlZm9yZSB0aGUgYnJvd3NlciBndWFyZCBzbyBTU1IgcmVuZGVycyBhIGNvbmNyZXRlIGRhdGEtbW9kZS5cbiAgICB0aGlzLnJlc29sdmVkTW9kZSA9IHJlc29sdmVJbml0aWFsTW9kZSh0aGlzLm1vZGUpO1xuICAgIGlmICghaXNQbGF0Zm9ybUJyb3dzZXIodGhpcy5wbGF0Zm9ybUlkKSkgcmV0dXJuO1xuXG4gICAgdGhpcy5jb250cm9sbGVyID0gbmV3IEFJQXV0b2NvbXBsZXRlQ29udHJvbGxlcih7XG4gICAgICBhcGlDb25maWc6IHRoaXMuYXBpQ29uZmlnLFxuICAgICAgb3B0aW9uT3ZlcnJpZGVzOiB0aGlzLm9wdGlvbk92ZXJyaWRlcyxcbiAgICAgIG1hc2tDb21wbGV0ZWRUZXh0OiB0aGlzLm1hc2tDb21wbGV0ZWRUZXh0LFxuICAgICAgY29sdW1uczogdGhpcy5jb2x1bW5zLFxuICAgICAgZHJvcGRvd25UcmlnZ2VyOiB0aGlzLmRyb3Bkb3duVHJpZ2dlcixcbiAgICAgIG9wdGlvbnNQb3NpdGlvbjogdGhpcy5vcHRpb25zUG9zaXRpb24sXG4gICAgICBjbG9zZURyb3Bkb3duT25CbHVyOiB0aGlzLmNsb3NlRHJvcGRvd25PbkJsdXIsXG4gICAgICBzaG93Tm9uVGFwcGFibGVPcHRpb25zOiB0aGlzLnNob3dOb25UYXBwYWJsZU9wdGlvbnMsXG4gICAgICBzb3VyY2U6IFwiZnVsbC1zZGtcIixcbiAgICAgIHZhbHVlOiB0aGlzLnZhbHVlLFxuICAgICAgY29tcGxldGVkUGFyYW1zOiB0aGlzLmNvbXBsZXRlZFBhcmFtcyxcbiAgICAgIG9uU3VibWl0OiAocmVzdWx0KSA9PiB0aGlzLmhhbmRsZVN1Ym1pdChyZXN1bHQpLFxuICAgICAgb25FcnJvcjogKGVycm9yKSA9PiB0aGlzLmVycm9yZWQuZW1pdChlcnJvciksXG4gICAgICBvbkNoYW5nZTogKHRleHQpID0+IHtcbiAgICAgICAgdGhpcy52YWx1ZUNoYW5nZS5lbWl0KHRleHQpO1xuICAgICAgICB0aGlzLm9uQ2hhbmdlRm4odGV4dCk7XG4gICAgICB9LFxuICAgICAgb25QYXJhbXNDaGFuZ2U6IChwYXJhbXMpID0+IHRoaXMuY29tcGxldGVkUGFyYW1zQ2hhbmdlLmVtaXQocGFyYW1zKSxcbiAgICAgIG9uRm9jdXM6ICgpID0+IHRoaXMuZm9jdXNlZC5lbWl0KCksXG4gICAgICBvbkJsdXI6ICgpID0+IHtcbiAgICAgICAgdGhpcy5ibHVycmVkLmVtaXQoKTtcbiAgICAgICAgdGhpcy5vblRvdWNoZWRGbigpO1xuICAgICAgfSxcbiAgICAgIHNldEN1cnNvcjogKG9mZnNldCkgPT4ge1xuICAgICAgICBjb25zdCBlZGl0b3IgPSB0aGlzLmVkaXRvclJlZj8ubmF0aXZlRWxlbWVudDtcbiAgICAgICAgaWYgKCFlZGl0b3IpIHJldHVybjtcbiAgICAgICAgZWRpdG9yLmZvY3VzKCk7XG4gICAgICAgIHNldEN1cnNvck9mZnNldChlZGl0b3IsIG9mZnNldCk7XG4gICAgICB9LFxuICAgIH0pO1xuXG4gICAgaWYgKHRoaXMucGVuZGluZ1dyaXRlVmFsdWUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5jb250cm9sbGVyLnNldFZhbHVlKHRoaXMucGVuZGluZ1dyaXRlVmFsdWUpO1xuICAgICAgdGhpcy5wZW5kaW5nV3JpdGVWYWx1ZSA9IHVuZGVmaW5lZDtcbiAgICB9XG4gIH1cblxuICBuZ0FmdGVyVmlld0luaXQoKTogdm9pZCB7XG4gICAgaWYgKCFpc1BsYXRmb3JtQnJvd3Nlcih0aGlzLnBsYXRmb3JtSWQpKSByZXR1cm47XG4gICAgLy8gTW9kZUNvbnRyb2xsZXIgd3JpdGVzIGBkYXRhLW1vZGVgIHRvIHRoZSBlbGVtZW50IGl0J3MgZ2l2ZW4uIFRoZSBDU1NcbiAgICAvLyBzZWxlY3RvcnMgYXJlIHNjb3BlZCB0byBgLm1hZ2ljeC1haWFbZGF0YS1tb2RlPVwiLi4uXCJdYCDigJQgd2hpY2ggbGl2ZXMgb25cbiAgICAvLyB0aGUgaW5uZXIgYDxkaXYgY2xhc3M9XCJtYWdpY3gtYWlhIG1hZ2ljeC1haWEtY29udGFpbmVyXCIgI2NvbnRhaW5lcj5gLFxuICAgIC8vIE5PVCB0aGUgaG9zdCBgPGFpLWF1dG9jb21wbGV0ZT5gIGVsZW1lbnQuIFRoZSByZXNvbHZlIGNhbGxiYWNrIG1pcnJvcnNcbiAgICAvLyB0aGUgdmFsdWUgaW50byBgcmVzb2x2ZWRNb2RlYCBzbyB0aGUgYFthdHRyLmRhdGEtbW9kZV1gIGJpbmRpbmcgc3RheXMgaW5cbiAgICAvLyBsb2Nrc3RlcCB3aXRoIE1vZGVDb250cm9sbGVyIOKAlCB0aGUgYmluZGluZyBoYW5kbGVzIFNTUiwgTW9kZUNvbnRyb2xsZXJcbiAgICAvLyBoYW5kbGVzIHJ1bnRpbWUgcHJlZmVycy1jb2xvci1zY2hlbWUgc3dpdGNoZXMsIGFuZCBiZWNhdXNlIHRoZXkgYWx3YXlzXG4gICAgLy8gYWdyZWUgbmVpdGhlciBjbG9iYmVycyB0aGUgb3RoZXIuXG4gICAgdGhpcy5tb2RlQ29udHJvbGxlciA9IG5ldyBNb2RlQ29udHJvbGxlcihcbiAgICAgIHRoaXMuY29udGFpbmVyUmVmLm5hdGl2ZUVsZW1lbnQsXG4gICAgICB0aGlzLm1vZGUsXG4gICAgICAocmVzb2x2ZWQpID0+IHtcbiAgICAgICAgdGhpcy5yZXNvbHZlZE1vZGUgPSByZXNvbHZlZDtcbiAgICAgICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gICAgICB9LFxuICAgICk7XG5cbiAgICAvLyBQaWxsLXdyYXAgZGV0ZWN0aW9uIOKAlCB3aGVuIHRoZSBwaWxsIGxpc3Qgd3JhcHMgYmVsb3cgdGhlIGVkaXRvcidzIGxhc3RcbiAgICAvLyBsaW5lLCBkcm9wIGl0cyA4cHggbGVmdCBtYXJnaW4gdmlhIGEgZGF0YSBhdHRyaWJ1dGUgdGhlIENTUyBrZXlzIG9mZi5cbiAgICAvLyBNaXJyb3JzIHRoZSBSZWFjdCBjb21wb25lbnQncyB1c2VMYXlvdXRFZmZlY3QuXG4gICAgaWYgKHR5cGVvZiBSZXNpemVPYnNlcnZlciAhPT0gXCJ1bmRlZmluZWRcIikge1xuICAgICAgdGhpcy56b25lLnJ1bk91dHNpZGVBbmd1bGFyKCgpID0+IHtcbiAgICAgICAgdGhpcy5yZXNpemVPYnNlcnZlciA9IG5ldyBSZXNpemVPYnNlcnZlcigoKSA9PiB0aGlzLm1lYXN1cmVQaWxsV3JhcCgpKTtcbiAgICAgICAgY29uc3QgZWRpdG9yID0gdGhpcy5lZGl0b3JSZWY/Lm5hdGl2ZUVsZW1lbnQ7XG4gICAgICAgIGlmIChlZGl0b3IpIHRoaXMucmVzaXplT2JzZXJ2ZXIub2JzZXJ2ZShlZGl0b3IpO1xuICAgICAgfSk7XG4gICAgICB0aGlzLm1lYXN1cmVQaWxsV3JhcCgpO1xuICAgIH1cbiAgfVxuXG4gIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuY29udHJvbGxlcikgcmV0dXJuO1xuICAgIC8vIGBTaW1wbGVDaGFuZ2VzYCBpcyBgeyBba2V5OiBzdHJpbmddOiBTaW1wbGVDaGFuZ2UgfWAsIHNvIHBlclxuICAgIC8vIGBub1Byb3BlcnR5QWNjZXNzRnJvbUluZGV4U2lnbmF0dXJlYCBlYWNoIGtleSBsb29rdXAgdXNlcyBicmFja2V0XG4gICAgLy8gbm90YXRpb24g4oCUIHRoaXMga2VlcHMgdGhlIHN0cmljdG5lc3MgY29udHJhY3QgdGhhdCB0aGUgcmVzdCBvZiB0aGVcbiAgICAvLyB3b3Jrc3BhY2UgZW5mb3JjZXMuXG4gICAgLy8gQ29udHJvbGxlZC1tb2RlIHByb3BhZ2F0aW9uXG4gICAgaWYgKGNoYW5nZXNbXCJ2YWx1ZVwiXSAmJiB0aGlzLnZhbHVlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMuY29udHJvbGxlci5zZXRWYWx1ZSh0aGlzLnZhbHVlKTtcbiAgICB9XG4gICAgaWYgKGNoYW5nZXNbXCJjb21wbGV0ZWRQYXJhbXNcIl0gJiYgdGhpcy5jb21wbGV0ZWRQYXJhbXMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5jb250cm9sbGVyLnNldENvbXBsZXRlZFBhcmFtcyh0aGlzLmNvbXBsZXRlZFBhcmFtcyk7XG4gICAgfVxuICAgIC8vIFJlYWN0aXZlIG9wdGlvbnNcbiAgICBpZiAoXG4gICAgICBjaGFuZ2VzW1wiYXBpQ29uZmlnXCJdIHx8XG4gICAgICBjaGFuZ2VzW1wib3B0aW9uT3ZlcnJpZGVzXCJdIHx8XG4gICAgICBjaGFuZ2VzW1wiZHJvcGRvd25UcmlnZ2VyXCJdIHx8XG4gICAgICBjaGFuZ2VzW1wib3B0aW9uc1Bvc2l0aW9uXCJdIHx8XG4gICAgICBjaGFuZ2VzW1wiY2xvc2VEcm9wZG93bk9uQmx1clwiXSB8fFxuICAgICAgY2hhbmdlc1tcInNob3dOb25UYXBwYWJsZU9wdGlvbnNcIl1cbiAgICApIHtcbiAgICAgIHRoaXMuY29udHJvbGxlci51cGRhdGUoe1xuICAgICAgICBhcGlDb25maWc6IHRoaXMuYXBpQ29uZmlnLFxuICAgICAgICBvcHRpb25PdmVycmlkZXM6IHRoaXMub3B0aW9uT3ZlcnJpZGVzLFxuICAgICAgICBkcm9wZG93blRyaWdnZXI6IHRoaXMuZHJvcGRvd25UcmlnZ2VyLFxuICAgICAgICBvcHRpb25zUG9zaXRpb246IHRoaXMub3B0aW9uc1Bvc2l0aW9uLFxuICAgICAgICBjbG9zZURyb3Bkb3duT25CbHVyOiB0aGlzLmNsb3NlRHJvcGRvd25PbkJsdXIsXG4gICAgICAgIHNob3dOb25UYXBwYWJsZU9wdGlvbnM6IHRoaXMuc2hvd05vblRhcHBhYmxlT3B0aW9ucyxcbiAgICAgIH0pO1xuICAgIH1cbiAgICBpZiAoY2hhbmdlc1tcIm1vZGVcIl0pIHtcbiAgICAgIC8vIEtlZXAgdGhlIGJpbmRpbmcgY29ycmVjdCBldmVuIHdoZW4gTW9kZUNvbnRyb2xsZXIgZG9lc24ndCBleGlzdCB5ZXRcbiAgICAgIC8vIChTU1IgLyBwcmUtbmdBZnRlclZpZXdJbml0KS4gT24gdGhlIGJyb3dzZXIsIHNldE1vZGUgdHJpZ2dlcnMgdGhlXG4gICAgICAvLyByZXNvbHZlIGNhbGxiYWNrIHdoaWNoIHNldHMgdGhlIHNhbWUgdmFsdWUuXG4gICAgICB0aGlzLnJlc29sdmVkTW9kZSA9IHJlc29sdmVJbml0aWFsTW9kZSh0aGlzLm1vZGUpO1xuICAgICAgdGhpcy5tb2RlQ29udHJvbGxlcj8uc2V0TW9kZSh0aGlzLm1vZGUpO1xuICAgIH1cbiAgfVxuXG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgIHRoaXMucmVzaXplT2JzZXJ2ZXI/LmRpc2Nvbm5lY3QoKTtcbiAgICB0aGlzLm1vZGVDb250cm9sbGVyPy5kZXN0cm95KCk7XG4gICAgdGhpcy5jb250cm9sbGVyPy5kZXN0cm95KCk7XG4gIH1cblxuICAvLyA9PT0gSW1wZXJhdGl2ZSBBUEkgKGV4cG9zZWQgb24gdGhlIGNvbXBvbmVudCBpbnN0YW5jZSB2aWEgQFZpZXdDaGlsZCkgPT09XG5cbiAgLyoqIFByb2dyYW1tYXRpY2FsbHkgZm9jdXMgdGhlIGVkaXRvci4gKi9cbiAgZm9jdXMoKTogdm9pZCB7XG4gICAgdGhpcy5lZGl0b3JSZWY/Lm5hdGl2ZUVsZW1lbnQuZm9jdXMoKTtcbiAgfVxuXG4gIC8qKiBQcm9ncmFtbWF0aWNhbGx5IGJsdXIgdGhlIGVkaXRvci4gKi9cbiAgYmx1cigpOiB2b2lkIHtcbiAgICB0aGlzLmVkaXRvclJlZj8ubmF0aXZlRWxlbWVudC5ibHVyKCk7XG4gIH1cblxuICAvKiogQ2xlYXIgYWxsIHN0YXRlLCByb3RhdGUgc2Vzc2lvbiwgYW5kIHJlLWZldGNoLiAqL1xuICByZXNldCgpOiB2b2lkIHtcbiAgICB0aGlzLmNvbnRyb2xsZXI/LnJlc2V0KCk7XG4gIH1cblxuICAvKiogU3dpdGNoIGNvbG9yIG1vZGUgYXQgcnVudGltZS4gKi9cbiAgc2V0TW9kZShtb2RlOiBBcHBlYXJhbmNlTW9kZSk6IHZvaWQge1xuICAgIHRoaXMubW9kZSA9IG1vZGU7XG4gICAgdGhpcy5yZXNvbHZlZE1vZGUgPSByZXNvbHZlSW5pdGlhbE1vZGUobW9kZSk7XG4gICAgdGhpcy5tb2RlQ29udHJvbGxlcj8uc2V0TW9kZShtb2RlKTtcbiAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgfVxuXG4gIC8vID09PSBUZW1wbGF0ZSBoZWxwZXJzID09PVxuXG4gIC8qKlxuICAgKiAnZGVmYXVsdCcg4oaSIHJlbmRlciB0aGUgYnVpbHQtaW4gYXJyb3cgYnV0dG9uLlxuICAgKiAnY3VzdG9tJyAg4oaSIHByb2plY3QgdGhlIGNvbnN1bWVyLXN1cHBsaWVkIFRlbXBsYXRlUmVmLlxuICAgKiAnaGlkZGVuJyAg4oaSIG5vIGJ1dHRvbi5cbiAgICovXG4gIGdldCBzdWJtaXRCdXR0b25TdGF0ZSgpOiBcImRlZmF1bHRcIiB8IFwiY3VzdG9tXCIgfCBcImhpZGRlblwiIHtcbiAgICBpZiAodGhpcy5zdWJtaXRCdXR0b24gPT09IG51bGwpIHJldHVybiBcImhpZGRlblwiO1xuICAgIGlmICh0aGlzLnN1Ym1pdEJ1dHRvbiA9PT0gdW5kZWZpbmVkKSByZXR1cm4gXCJkZWZhdWx0XCI7XG4gICAgcmV0dXJuIFwiY3VzdG9tXCI7XG4gIH1cblxuICAvKiogTmFycm93ZWQgYWNjZXNzb3IgZm9yICpuZ1RlbXBsYXRlT3V0bGV0IOKAlCBuZXZlciB1bmRlZmluZWQuICovXG4gIGdldCBjdXN0b21TdWJtaXRUZW1wbGF0ZSgpOiBUZW1wbGF0ZVJlZjx1bmtub3duPiB8IG51bGwge1xuICAgIHJldHVybiB0aGlzLnN1Ym1pdEJ1dHRvbiA/PyBudWxsO1xuICB9XG5cbiAgZ2V0IHNob3dJbmxpbmVQaWxscygpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5waWxsUGxhY2VtZW50ID09PSBcImlubGluZVwiO1xuICB9XG5cbiAgZ2V0IHNob3dEcm9wZG93blBpbGxzKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLnBpbGxQbGFjZW1lbnQgPT09IFwiZHJvcGRvd25cIjtcbiAgfVxuXG4gIC8qKlxuICAgKiBgdHJ1ZWAgd2hlbiB0aGVyZSdzIHNvbWV0aGluZyB0byBzdWJtaXQg4oCUIGRyaXZlbiBieSBjdXJyZW50IHNlZ21lbnRzXG4gICAqIGFuZCBjb21wbGV0ZWQgcGFyYW1zLiBSZWFkIG9mZiB0aGUgbGl2ZSBlZGl0b3IgdmlhIHRoZSBjb250cm9sbGVyIHN0YXRlLlxuICAgKi9cbiAgY2FuU3VibWl0KHN0YXRlOiB7IHNlZ21lbnRzOiB7IGxlbmd0aDogbnVtYmVyIH07IGNvbXBsZXRlZFBhcmFtczogeyBsZW5ndGg6IG51bWJlciB9IH0pOiBib29sZWFuIHtcbiAgICByZXR1cm4gc3RhdGUuc2VnbWVudHMubGVuZ3RoID4gMCB8fCBzdGF0ZS5jb21wbGV0ZWRQYXJhbXMubGVuZ3RoID4gMDtcbiAgfVxuXG4gIG9uV3JhcHBlckNsaWNrKGV2ZW50OiBNb3VzZUV2ZW50KTogdm9pZCB7XG4gICAgLy8gQ2xpY2tpbmcgYSBwaWxsIHNob3VsZCBhY3RpdmF0ZSBpdCB3aXRob3V0IHN0ZWFsaW5nIGZvY3VzIGVsc2V3aGVyZS5cbiAgICBjb25zdCB0YXJnZXQgPSBldmVudC50YXJnZXQgYXMgSFRNTEVsZW1lbnQgfCBudWxsO1xuICAgIGlmICh0YXJnZXQ/LmNsb3Nlc3QoXCJbZGF0YS1haWEtcGlsbF1cIikpIHJldHVybjtcbiAgICB0aGlzLmZvY3VzKCk7XG4gIH1cblxuICBvblN1Ym1pdEJ1dHRvbkNsaWNrKGV2ZW50OiBNb3VzZUV2ZW50KTogdm9pZCB7XG4gICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgdGhpcy5oYW5kbGVTdWJtaXRGcm9tVXNlckFjdGlvbigpO1xuICB9XG5cbiAgb25TdWJtaXRTbG90Q2xpY2soZXZlbnQ6IE1vdXNlRXZlbnQpOiB2b2lkIHtcbiAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICB0aGlzLmhhbmRsZVN1Ym1pdEZyb21Vc2VyQWN0aW9uKCk7XG4gIH1cblxuICBvblNlbGVjdFBpbGwoaW5kZXg6IG51bWJlcik6IHZvaWQge1xuICAgIHRoaXMuY29udHJvbGxlci5zZXRBY3RpdmVQaWxsKGluZGV4KTtcbiAgfVxuXG4gIC8vID09PSBDb250cm9sVmFsdWVBY2Nlc3NvciA9PT1cblxuICB3cml0ZVZhbHVlKHZhbHVlOiBzdHJpbmcgfCBudWxsKTogdm9pZCB7XG4gICAgY29uc3QgbmV4dCA9IHZhbHVlID8/IFwiXCI7XG4gICAgaWYgKCF0aGlzLmNvbnRyb2xsZXIpIHtcbiAgICAgIC8vIFJlYWN0aXZlIEZvcm1zIGNhbiBjYWxsIHdyaXRlVmFsdWUoKSBiZWZvcmUgbmdPbkluaXQgY3JlYXRlcyB0aGVcbiAgICAgIC8vIGNvbnRyb2xsZXIgKGR5bmFtaWMgZm9ybSBjb25zdHJ1Y3Rpb24sIG9yIGEgRm9ybUNvbnRyb2wgdGhhdCBhbHJlYWR5XG4gICAgICAvLyBoYWQgYSB2YWx1ZSBhdCBkaXJlY3RpdmUtY3JlYXRpb24gdGltZSkuIEJ1ZmZlciB0aGUgdmFsdWU7IG5nT25Jbml0XG4gICAgICAvLyBmbHVzaGVzIGl0IGFzIHNvb24gYXMgdGhlIGNvbnRyb2xsZXIgZXhpc3RzLlxuICAgICAgdGhpcy5wZW5kaW5nV3JpdGVWYWx1ZSA9IG5leHQ7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuY29udHJvbGxlci5zZXRWYWx1ZShuZXh0KTtcbiAgfVxuXG4gIHJlZ2lzdGVyT25DaGFuZ2UoZm46ICh2YWx1ZTogc3RyaW5nKSA9PiB2b2lkKTogdm9pZCB7XG4gICAgdGhpcy5vbkNoYW5nZUZuID0gZm47XG4gIH1cblxuICByZWdpc3Rlck9uVG91Y2hlZChmbjogKCkgPT4gdm9pZCk6IHZvaWQge1xuICAgIHRoaXMub25Ub3VjaGVkRm4gPSBmbjtcbiAgfVxuXG4gIHNldERpc2FibGVkU3RhdGUoX2Rpc2FibGVkOiBib29sZWFuKTogdm9pZCB7XG4gICAgLy8gVGhlIGNvbnRlbnRFZGl0YWJsZSBob3N0IGRvZXNuJ3QgaGF2ZSBhIG5hdGl2ZSBkaXNhYmxlZCBhdHRyaWJ1dGUuIEZvclxuICAgIC8vIHYwLjEgd2UgYWNjZXB0IHRoZSBjYWxsIHNvIEFuZ3VsYXIncyBmb3JtcyBsYXllciBkb2Vzbid0IHRocm93LCBidXRcbiAgICAvLyB0aGUgZWRpdG9yIHN0YXlzIGludGVyYWN0aXZlLiBBIGZ1dHVyZSBlbmhhbmNlbWVudCBjYW4gdG9nZ2xlXG4gICAgLy8gY29udGVudEVkaXRhYmxlICsgQVJJQSBkaXNhYmxlZCBoZXJlLlxuICB9XG5cbiAgLy8gPT09IFN1Ym1pdCBmbG93ID09PVxuXG4gIC8qKlxuICAgKiBDYWxsZWQgYnkgdGhlIGNvbnRyb2xsZXIncyBvblN1Ym1pdCBjYWxsYmFjayAod2hpY2ggZmlyZXMgZnJvbSB0aGVcbiAgICoga2V5Ym9hcmQgY29udHJvbGxlciBvbiBFbnRlcikuIFJlYWRzIHRoZSBsaXZlIGVkaXRvciB0ZXh0IOKAlCBzYW1lIHRyaWNrXG4gICAqIHRoZSBSZWFjdCBjb21wb25lbnQgdXNlcyDigJQgc28gdGhlIGVtaXR0ZWQgcXVlcnkgcmVmbGVjdHMgd2hhdGV2ZXIncyBpblxuICAgKiB0aGUgRE9NIHJpZ2h0IG5vdywgbm90IGEgcG9zc2libHktc3RhbGUgc3RhdGUgc25hcHNob3QuXG4gICAqL1xuICBwcml2YXRlIGhhbmRsZVN1Ym1pdChfcmVzdWx0OiBBdXRvY29tcGxldGVSZXN1bHQpOiB2b2lkIHtcbiAgICBjb25zdCBlZGl0b3IgPSB0aGlzLmVkaXRvclJlZj8ubmF0aXZlRWxlbWVudDtcbiAgICBpZiAoIWVkaXRvcikgcmV0dXJuO1xuICAgIGNvbnN0IHRleHQgPSBleHRyYWN0UGxhaW5UZXh0KGVkaXRvcik7XG4gICAgY29uc3QgcGFyYW1zID0gdGhpcy5jb21wbGV0ZWRQYXJhbXMgPz8gdGhpcy5jb250cm9sbGVyLmdldFN0YXRlKCkuY29tcGxldGVkUGFyYW1zO1xuICAgIGNvbnN0IGJ1aWx0ID0gYnVpbGRRdWVyeSh0ZXh0LCBwYXJhbXMpO1xuICAgIHRoaXMuc3VibWl0dGVkLmVtaXQoe1xuICAgICAgcXVlcnk6IHRleHQudHJpbSgpLFxuICAgICAgcmF3X3F1ZXJ5OiBidWlsdC5yYXdRdWVyeSxcbiAgICAgIGNvbXBsZXRlZF9wYXJhbXM6IGJ1aWx0LmNvbXBsZXRlZFBhcmFtcyxcbiAgICB9KTtcbiAgICB0aGlzLmNvbnRyb2xsZXIucmVzZXQoKTtcbiAgfVxuXG4gIHByaXZhdGUgaGFuZGxlU3VibWl0RnJvbVVzZXJBY3Rpb24oKTogdm9pZCB7XG4gICAgY29uc3Qgc3RhdGUgPSB0aGlzLmNvbnRyb2xsZXIuZ2V0U3RhdGUoKTtcbiAgICBpZiAoIXRoaXMuY2FuU3VibWl0KHN0YXRlKSkgcmV0dXJuO1xuICAgIC8vIFN5bnRoZXNpemUgdGhlIHJlc3VsdCBmb3IgdGhlIHN1Ym1pdC1idXR0b24gY2xpY2sgcGF0aDsgc2FtZSBzaGFwZVxuICAgIC8vIHRoZSBjb250cm9sbGVyIHdvdWxkIGRlbGl2ZXIgZnJvbSBhIGtleWJvYXJkIEVudGVyLCBzbyBoYW5kbGVTdWJtaXRcbiAgICAvLyBjYW4gdGFrZSBlaXRoZXIgZW50cnkgcG9pbnQuXG4gICAgdGhpcy5oYW5kbGVTdWJtaXQoe1xuICAgICAgcXVlcnk6IHN0YXRlLnRleHQudHJpbSgpLFxuICAgICAgcmF3X3F1ZXJ5OiBcIlwiLFxuICAgICAgY29tcGxldGVkX3BhcmFtczogW10sXG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIG1lYXN1cmVQaWxsV3JhcCgpOiB2b2lkIHtcbiAgICBjb25zdCBjb250YWluZXIgPSB0aGlzLnBpbGxDb250YWluZXJSZWY/Lm5hdGl2ZUVsZW1lbnQ7XG4gICAgY29uc3QgZWRpdG9yID0gdGhpcy5lZGl0b3JSZWY/Lm5hdGl2ZUVsZW1lbnQ7XG4gICAgaWYgKCFjb250YWluZXIgfHwgIWVkaXRvcikgcmV0dXJuO1xuICAgIGNvbnN0IGlubmVyID0gY29udGFpbmVyLmZpcnN0RWxlbWVudENoaWxkIGFzIEhUTUxFbGVtZW50IHwgbnVsbDtcbiAgICBpZiAoIWlubmVyKSByZXR1cm47XG4gICAgLy8gV3JhcCBkZXRlY3Rpb246IHRoZSBwaWxsIHJvdydzIHRvcCB2cyB0aGUgZWRpdG9yJ3MgYm90dG9tLiBXaGVuIHRoZVxuICAgIC8vIHBpbGxzIHNpdCBvbiAob3IgYWJvdmUpIHRoZSBlZGl0b3IncyBsYXN0IGxpbmUgdGhleSdyZSBOT1Qgd3JhcHBlZCDigJRcbiAgICAvLyBrZWVwIHRoZSA4cHggbWFyZ2luIHNvIHRoZXkgZG9uJ3QgYnV0dCBhZ2FpbnN0IHR5cGVkIHRleHQgb3IgdGhlXG4gICAgLy8gcGxhY2Vob2xkZXIuIFRoaXMgaGFuZGxlcyB0aGUgZW1wdHktZWRpdG9yICsgcGxhY2Vob2xkZXIgY2FzZVxuICAgIC8vIG5hdHVyYWxseTogdGhlIHBsYWNlaG9sZGVyIHN0aWxsIG9jY3VwaWVzIHRoZSBlZGl0b3IncyBsaW5lIGJveC5cbiAgICBjb25zdCBjUmVjdCA9IGlubmVyLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgIGNvbnN0IGVSZWN0ID0gZWRpdG9yLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgIGNvbnN0IHdyYXBwZWQgPSBjUmVjdC50b3AgPj0gZVJlY3QuYm90dG9tIC0gMjtcbiAgICB0aGlzLnpvbmUucnVuKCgpID0+IHtcbiAgICAgIGlmICh3cmFwcGVkKSBjb250YWluZXIuc2V0QXR0cmlidXRlKFwiZGF0YS1haWEtcGlsbC13cmFwcGVkXCIsIFwiXCIpO1xuICAgICAgZWxzZSBjb250YWluZXIucmVtb3ZlQXR0cmlidXRlKFwiZGF0YS1haWEtcGlsbC13cmFwcGVkXCIpO1xuICAgIH0pO1xuICB9XG59XG5cbmZ1bmN0aW9uIG5vb3AoKTogdm9pZCB7XG4gIC8vIERlZmF1bHQgbm8tb3AgZm9yIENWQSBjYWxsYmFja3MuXG59XG5cbi8qKlxuICogUmVzb2x2ZSBhIGNvbmNyZXRlIGxpZ2h0L2RhcmsgdmFsdWUgZnJvbSB0aGUgY29uZmlndXJlZCBtb2RlLiBVc2VkIHRvIHNlZWRcbiAqIHRoZSBgZGF0YS1tb2RlYCBhdHRyaWJ1dGUgc3luY2hyb25vdXNseSAoaW5jbHVkaW5nIGR1cmluZyBTU1IsIHdoZXJlXG4gKiBNb2RlQ29udHJvbGxlciBuZXZlciBydW5zKS4gT24gdGhlIHNlcnZlciBgd2luZG93YCBpcyB1bmRlZmluZWQg4oaSIGRlZmF1bHRzXG4gKiB0byBcImRhcmtcIiAobWF0Y2hlcyB0aGUgdmFuaWxsYS9SZWFjdCBiZWhhdmlvcikuXG4gKi9cbmZ1bmN0aW9uIHJlc29sdmVJbml0aWFsTW9kZShtb2RlOiBBcHBlYXJhbmNlTW9kZSk6IFwibGlnaHRcIiB8IFwiZGFya1wiIHtcbiAgaWYgKG1vZGUgIT09IFwiYXV0b1wiKSByZXR1cm4gbW9kZTtcbiAgaWYgKHR5cGVvZiB3aW5kb3cgPT09IFwidW5kZWZpbmVkXCIpIHJldHVybiBcImRhcmtcIjtcbiAgcmV0dXJuIHdpbmRvdy5tYXRjaE1lZGlhKFwiKHByZWZlcnMtY29sb3Itc2NoZW1lOiBkYXJrKVwiKS5tYXRjaGVzID8gXCJkYXJrXCIgOiBcImxpZ2h0XCI7XG59XG4iLCI8ZGl2XG4gICNjb250YWluZXJcbiAgY2xhc3M9XCJtYWdpY3gtYWlhIG1hZ2ljeC1haWEtY29udGFpbmVyXCJcbiAgW2F0dHIuZGF0YS1waWxsLXBsYWNlbWVudF09XCJwaWxsUGxhY2VtZW50XCJcbiAgW2F0dHIuZGF0YS1vcHRpb25zLXBvc2l0aW9uXT1cIm9wdGlvbnNQb3NpdGlvblwiXG4gIFthdHRyLmRhdGEtYW5pbWF0aW9uc109XCJhbmltYXRpb25zID8gJ29uJyA6ICdvZmYnXCJcbiAgW2F0dHIuZGF0YS1tb2RlXT1cInJlc29sdmVkTW9kZVwiXG4+XG4gIDxhaS1hdXRvY29tcGxldGUtZHJvcGRvd25cbiAgICAqbmdJZj1cImNvbnRyb2xsZXJcIlxuICAgIFtjb250cm9sbGVyXT1cImNvbnRyb2xsZXJcIlxuICAgIFtzaG93UGlsbHNdPVwic2hvd0Ryb3Bkb3duUGlsbHNcIlxuICA+PC9haS1hdXRvY29tcGxldGUtZHJvcGRvd24+XG5cbiAgPGRpdlxuICAgIGNsYXNzPVwibWFnaWN4LWFpYS1pbnB1dC13cmFwcGVyXCJcbiAgICAoY2xpY2spPVwib25XcmFwcGVyQ2xpY2soJGV2ZW50KVwiXG4gICAgKGtleXVwKT1cIiRldmVudC5zdG9wUHJvcGFnYXRpb24oKVwiXG4gID5cbiAgICA8ZGl2IGNsYXNzPVwibWFnaWN4LWFpYS1lZGl0b3ItYXJlYVwiIGRhdGEtYWlhLWVkaXRvcj1cIlwiPlxuICAgICAgPGRpdlxuICAgICAgICAjZWRpdG9yXG4gICAgICAgICpuZ0lmPVwiY29udHJvbGxlclwiXG4gICAgICAgIFthaWFFZGl0b3JIb3N0XT1cImNvbnRyb2xsZXJcIlxuICAgICAgICBbYXV0b0ZvY3VzXT1cImF1dG9Gb2N1c1wiXG4gICAgICAgIGNsYXNzPVwibWFnaWN4LWFpYS1pbnB1dFwiXG4gICAgICAgIGRhdGEtYWlhLWlucHV0PVwiXCJcbiAgICAgID48L2Rpdj5cblxuICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImNvbnRyb2xsZXIgJiYgc2hvd0lubGluZVBpbGxzXCI+XG4gICAgICAgIDxzcGFuXG4gICAgICAgICAgI3BpbGxDb250YWluZXJcbiAgICAgICAgICBjbGFzcz1cIm1hZ2ljeC1haWEtcGlsbC1saXN0LWNvbnRhaW5lclwiXG4gICAgICAgICAgZGF0YS1haWEtcGlsbC1saXN0LWNvbnRhaW5lcj1cIlwiXG4gICAgICAgICAgKm5nSWY9XCJcbiAgICAgICAgICAgIChjb250cm9sbGVyLmlzTG9hZGluZyQgfCBhc3luYykgfHxcbiAgICAgICAgICAgICAgKChjb250cm9sbGVyLnN1Z2dlc3Rpb25QaWxscyQgfCBhc3luYyk/Lmxlbmd0aCA/PyAwKSA+IDBcbiAgICAgICAgICBcIlxuICAgICAgICA+XG4gICAgICAgICAgPGFpYS1waWxsLWxpc3RcbiAgICAgICAgICAgIFtwaWxsc109XCIoY29udHJvbGxlci5zdWdnZXN0aW9uUGlsbHMkIHwgYXN5bmMpID8/IFtdXCJcbiAgICAgICAgICAgIFthY3RpdmVQaWxsSW5kZXhdPVwiMFwiXG4gICAgICAgICAgICBbYWN0aXZlU2VsZWN0ZWRdPVwiKGNvbnRyb2xsZXIuaXNBY3RpdmVQaWxsU2VsZWN0ZWQkIHwgYXN5bmMpID8/IGZhbHNlXCJcbiAgICAgICAgICAgIFtsb2FkaW5nXT1cIihjb250cm9sbGVyLmlzTG9hZGluZyQgfCBhc3luYykgPz8gZmFsc2VcIlxuICAgICAgICAgICAgKHNlbGVjdFBpbGwpPVwib25TZWxlY3RQaWxsKCRldmVudClcIlxuICAgICAgICAgID48L2FpYS1waWxsLWxpc3Q+XG4gICAgICAgIDwvc3Bhbj5cbiAgICAgIDwvbmctY29udGFpbmVyPlxuICAgIDwvZGl2PlxuXG4gICAgPG5nLWNvbnRhaW5lciBbbmdTd2l0Y2hdPVwic3VibWl0QnV0dG9uU3RhdGVcIj5cbiAgICAgIDxhaWEtc3VibWl0LWJ1dHRvblxuICAgICAgICAqbmdTd2l0Y2hDYXNlPVwiJ2RlZmF1bHQnXCJcbiAgICAgICAgW2Rpc2FibGVkXT1cIlxuICAgICAgICAgICEoXG4gICAgICAgICAgICBjb250cm9sbGVyICYmXG4gICAgICAgICAgICBjYW5TdWJtaXQoe1xuICAgICAgICAgICAgICBzZWdtZW50czogKGNvbnRyb2xsZXIuc2VnbWVudHMkIHwgYXN5bmMpID8/IFtdLFxuICAgICAgICAgICAgICBjb21wbGV0ZWRQYXJhbXM6IChjb250cm9sbGVyLmNvbXBsZXRlZFBhcmFtcyQgfCBhc3luYykgPz8gW11cbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgKVxuICAgICAgICBcIlxuICAgICAgICAoc3VibWl0KT1cIm9uU3VibWl0QnV0dG9uQ2xpY2soJGV2ZW50KVwiXG4gICAgICA+PC9haWEtc3VibWl0LWJ1dHRvbj5cblxuICAgICAgPHNwYW5cbiAgICAgICAgKm5nU3dpdGNoQ2FzZT1cIidjdXN0b20nXCJcbiAgICAgICAgZGF0YS1haWEtc3VibWl0PVwiXCJcbiAgICAgICAgY2xhc3M9XCJtYWdpY3gtYWlhLXN1Ym1pdC1zbG90XCJcbiAgICAgICAgKGNsaWNrKT1cIm9uU3VibWl0U2xvdENsaWNrKCRldmVudClcIlxuICAgICAgPlxuICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiY3VzdG9tU3VibWl0VGVtcGxhdGVcIj48L25nLWNvbnRhaW5lcj5cbiAgICAgIDwvc3Bhbj5cbiAgICA8L25nLWNvbnRhaW5lcj5cbiAgPC9kaXY+XG48L2Rpdj5cbiJdfQ==
|
|
411
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWktYXV0b2NvbXBsZXRlLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9saWIvYWktYXV0b2NvbXBsZXRlL2FpLWF1dG9jb21wbGV0ZS5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi9zcmMvbGliL2FpLWF1dG9jb21wbGV0ZS9haS1hdXRvY29tcGxldGUuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFlBQVksRUFBRSxpQkFBaUIsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQ2xFLE9BQU8sRUFFTCx1QkFBdUIsRUFDdkIsaUJBQWlCLEVBQ2pCLFNBQVMsRUFFVCxZQUFZLEVBQ1osVUFBVSxFQUNWLEtBQUssRUFDTCxNQUFNLEVBQ04sTUFBTSxFQUlOLE1BQU0sRUFDTixXQUFXLEVBR1gsU0FBUyxFQUNULGlCQUFpQixHQUNsQixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQTZCLGlCQUFpQixFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDOUUsT0FBTyxFQUlMLFVBQVUsRUFFVixnQkFBZ0IsRUFDaEIsY0FBYyxFQUVkLGVBQWUsR0FDaEIsTUFBTSxxQ0FBcUMsQ0FBQztBQUM3QyxPQUFPLEVBQUUsK0JBQStCLEVBQUUsTUFBTSxnRUFBZ0UsQ0FBQztBQUNqSCxPQUFPLEVBQUUsd0JBQXdCLEVBQUUsTUFBTSwwQ0FBMEMsQ0FBQztBQUNwRixPQUFPLEVBQUUsaUNBQWlDLEVBQUUsTUFBTSwrQ0FBK0MsQ0FBQztBQUNsRyxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSwyQ0FBMkMsQ0FBQztBQUM5RSxPQUFPLEVBQUUscUJBQXFCLEVBQUUsTUFBTSxtREFBbUQsQ0FBQzs7O0FBRTFGOzs7Ozs7O0dBT0c7QUF3QkgsTUFBTSxPQUFPLHVCQUF1QjtJQXZCcEM7UUE4Qlcsc0JBQWlCLEdBQUcsS0FBSyxDQUFDO1FBRW5DLHNEQUFzRDtRQUM3QyxrQkFB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QU8sQ0FBQztBQUN0RixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tbW9uTW9kdWxlLCBpc1BsYXRmb3JtQnJvd3NlciB9IGZyb20gXCJAYW5ndWxhci9jb21tb25cIjtcbmltcG9ydCB7XG4gIHR5cGUgQWZ0ZXJWaWV3SW5pdCxcbiAgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksXG4gIENoYW5nZURldGVjdG9yUmVmLFxuICBDb21wb25lbnQsXG4gIHR5cGUgRWxlbWVudFJlZixcbiAgRXZlbnRFbWl0dGVyLFxuICBmb3J3YXJkUmVmLFxuICBJbnB1dCxcbiAgaW5qZWN0LFxuICBOZ1pvbmUsXG4gIHR5cGUgT25DaGFuZ2VzLFxuICB0eXBlIE9uRGVzdHJveSxcbiAgdHlwZSBPbkluaXQsXG4gIE91dHB1dCxcbiAgUExBVEZPUk1fSUQsXG4gIHR5cGUgU2ltcGxlQ2hhbmdlcyxcbiAgdHlwZSBUZW1wbGF0ZVJlZixcbiAgVmlld0NoaWxkLFxuICBWaWV3RW5jYXBzdWxhdGlvbixcbn0gZnJvbSBcIkBhbmd1bGFyL2NvcmVcIjtcbmltcG9ydCB7IHR5cGUgQ29udHJvbFZhbHVlQWNjZXNzb3IsIE5HX1ZBTFVFX0FDQ0VTU09SIH0gZnJvbSBcIkBhbmd1bGFyL2Zvcm1zXCI7XG5pbXBvcnQge1xuICB0eXBlIEFQSUNvbmZpZyxcbiAgdHlwZSBBcHBlYXJhbmNlTW9kZSxcbiAgdHlwZSBBdXRvY29tcGxldGVSZXN1bHQsXG4gIGJ1aWxkUXVlcnksXG4gIHR5cGUgQ29tcGxldGVkUGFyYW1TdGF0ZSxcbiAgZXh0cmFjdFBsYWluVGV4dCxcbiAgTW9kZUNvbnRyb2xsZXIsXG4gIHR5cGUgT3B0aW9uT3ZlcnJpZGVzLFxuICBzZXRDdXJzb3JPZmZzZXQsXG59IGZyb20gXCJAbWFnaWN4LWVuZy9haS1hdXRvY29tcGxldGUtdmFuaWxsYVwiO1xuaW1wb3J0IHsgQUlBdXRvY29tcGxldGVEcm9wZG93bkNvbXBvbmVudCB9IGZyb20gXCIuLi9haS1hdXRvY29tcGxldGUtZHJvcGRvd24vYWktYXV0b2NvbXBsZXRlLWRyb3Bkb3duLmNvbXBvbmVudFwiO1xuaW1wb3J0IHsgQUlBdXRvY29tcGxldGVDb250cm9sbGVyIH0gZnJvbSBcIi4uL2NvbnRyb2xsZXIvYWktYXV0b2NvbXBsZXRlLmNvbnRyb2xsZXJcIjtcbmltcG9ydCB7IEFJQXV0b2NvbXBsZXRlRWRpdG9ySG9zdERpcmVjdGl2ZSB9IGZyb20gXCIuLi9pbnRlcm5hbC9lZGl0b3ItaG9zdC9lZGl0b3ItaG9zdC5kaXJlY3RpdmVcIjtcbmltcG9ydCB7IFBpbGxMaXN0Q29tcG9uZW50IH0gZnJvbSBcIi4uL2ludGVybmFsL3BpbGwtbGlzdC9waWxsLWxpc3QuY29tcG9uZW50XCI7XG5pbXBvcnQgeyBTdWJtaXRCdXR0b25Db21wb25lbnQgfSBmcm9tIFwiLi4vaW50ZXJuYWwvc3VibWl0LWJ1dHRvbi9zdWJtaXQtYnV0dG9uLmNvbXBvbmVudFwiO1xuXG4vKipcbiAqIFRpZXIgMSBjb21wb25lbnQg4oCUIGA8YWktYXV0b2NvbXBsZXRlPmAuIFRoZSBBbmd1bGFyIGVxdWl2YWxlbnQgb2YgUmVhY3Qnc1xuICogYDxBSUF1dG9jb21wbGV0ZSAvPmAuIE93bnMgdGhlIGNvbnRlbnRFZGl0YWJsZSBlZGl0b3IsIGlubGluZSBwaWxscywgbW9kZVxuICogY29udHJvbGxlciwgc3VibWl0IGJ1dHRvbiBzbG90LCBhbmQgYW4gZW1iZWRkZWRcbiAqIHtAbGluayBBSUF1dG9jb21wbGV0ZUNvbnRyb2xsZXJ9IHRoYXQgZHJpdmVzIHRoZSBkcm9wZG93bi5cbiAqXG4gKiBAcHVibGljXG4gKi9cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogXCJhaS1hdXRvY29tcGxldGVcIixcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgaW1wb3J0czogW1xuICAgIENvbW1vbk1vZHVsZSxcbiAgICBBSUF1dG9jb21wbGV0ZURyb3Bkb3duQ29tcG9uZW50LFxuICAgIEFJQXV0b2NvbXBsZXRlRWRpdG9ySG9zdERpcmVjdGl2ZSxcbiAgICBQaWxsTGlzdENvbXBvbmVudCxcbiAgICBTdWJtaXRCdXR0b25Db21wb25lbnQsXG4gIF0sXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxuICBlbmNhcHN1bGF0aW9uOiBWaWV3RW5jYXBzdWxhdGlvbi5Ob25lLFxuICB0ZW1wbGF0ZVVybDogXCIuL2FpLWF1dG9jb21wbGV0ZS5jb21wb25lbnQuaHRtbFwiLFxuICBzdHlsZVVybHM6IFtcIi4vYWktYXV0b2NvbXBsZXRlLmNvbXBvbmVudC5jc3NcIl0sXG4gIHByb3ZpZGVyczogW1xuICAgIHtcbiAgICAgIHByb3ZpZGU6IE5HX1ZBTFVFX0FDQ0VTU09SLFxuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11c2UtYmVmb3JlLWRlZmluZVxuICAgICAgdXNlRXhpc3Rpbmc6IGZvcndhcmRSZWYoKCkgPT4gQUlBdXRvY29tcGxldGVDb21wb25lbnQpLFxuICAgICAgbXVsdGk6IHRydWUsXG4gICAgfSxcbiAgXSxcbn0pXG5leHBvcnQgY2xhc3MgQUlBdXRvY29tcGxldGVDb21wb25lbnRcbiAgaW1wbGVtZW50cyBPbkluaXQsIEFmdGVyVmlld0luaXQsIE9uQ2hhbmdlcywgT25EZXN0cm95LCBDb250cm9sVmFsdWVBY2Nlc3Nvclxue1xuICAvLyA9PT0gSW5wdXRzIChtaXJyb3JzIFJlYWN0J3MgQUlBdXRvY29tcGxldGVQcm9wcykgPT09XG5cbiAgQElucHV0KCkgYXBpQ29uZmlnPzogQVBJQ29uZmlnO1xuICBASW5wdXQoKSBvcHRpb25PdmVycmlkZXM/OiBPcHRpb25PdmVycmlkZXM7XG4gIEBJbnB1dCgpIG1hc2tDb21wbGV0ZWRUZXh0ID0gZmFsc2U7XG4gIEBJbnB1dCgpIGNvbHVtbnM/OiBudW1iZXI7XG4gIC8qKiBXaGVyZSB1bmZpbGxlZCBwaWxscyByZW5kZXIuIERlZmF1bHQ6IFwiaW5saW5lXCIuICovXG4gIEBJbnB1dCgpIHBpbGxQbGFjZW1lbnQ6IFwiaW5saW5lXCIgfCBcImRyb3Bkb3duXCIgfCBcImhpZGRlblwiID0gXCJpbmxpbmVcIjtcbiAgLyoqIENvbG9yIG1vZGUuIFwiYXV0b1wiIGZvbGxvd3MgcHJlZmVycy1jb2xvci1zY2hlbWUuIERlZmF1bHQ6IFwiYXV0b1wiLiAqL1xuICBASW5wdXQoKSBtb2RlOiBBcHBlYXJhbmNlTW9kZSA9IFwiYXV0b1wiO1xuICBASW5wdXQoKSBvcHRpb25zUG9zaXRpb246IFwiYWJvdmVcIiB8IFwiYmVsb3dcIiA9IFwiYmVsb3dcIjtcbiAgQElucHV0KCkgYW5pbWF0aW9ucyA9IHRydWU7XG4gIEBJbnB1dCgpIGRyb3Bkb3duVHJpZ2dlcj86IFwiYXV0b1wiIHwgXCJtYW51YWxcIiB8IFwiaGlkZGVuXCI7XG4gIEBJbnB1dCgpIGNsb3NlRHJvcGRvd25PbkJsdXI/OiBib29sZWFuO1xuICBASW5wdXQoKSBzaG93Tm9uVGFwcGFibGVPcHRpb25zPzogYm9vbGVhbjtcbiAgLyoqIEZvY3VzIHRoZSBlZGl0b3Igb24gbW91bnQuIERlZmF1bHQ6IHRydWUuICovXG4gIEBJbnB1dCgpIGF1dG9Gb2N1cyA9IHRydWU7XG4gIC8qKiBDb250cm9sbGVkLW1vZGUgdGV4dCB2YWx1ZS4gKi9cbiAgQElucHV0KCkgdmFsdWU/OiBzdHJpbmc7XG4gIC8qKiBDb250cm9sbGVkLW1vZGUgY29tcGxldGVkIHBhcmFtcy4gKi9cbiAgQElucHV0KCkgY29tcGxldGVkUGFyYW1zPzogQ29tcGxldGVkUGFyYW1TdGF0ZVtdO1xuICAvKipcbiAgICogQ3VzdG9tIHN1Ym1pdCBidXR0b24uIFBhc3MgYSBgPG5nLXRlbXBsYXRlPmAgdG8gcmVwbGFjZSB0aGUgZGVmYXVsdCBhcnJvd1xuICAgKiBidXR0b24uIFBhc3MgYG51bGxgIHRvIHJlbmRlciBubyBidXR0b24uIERlZmF1bHQgKGB1bmRlZmluZWRgKSByZW5kZXJzXG4gICAqIHRoZSBidWlsdC1pbiBhcnJvdy5cbiAgICovXG4gIEBJbnB1dCgpIHN1Ym1pdEJ1dHRvbj86IFRlbXBsYXRlUmVmPHVua25vd24+IHwgbnVsbDtcblxuICAvLyA9PT0gT3V0cHV0cyA9PT1cblxuICAvKiogQ2FsbGVkIG9uIEVudGVyIG9yIHN1Ym1pdC1idXR0b24gY2xpY2suICovXG4gIEBPdXRwdXQoKSByZWFkb25seSBzdWJtaXR0ZWQgPSBuZXcgRXZlbnRFbWl0dGVyPEF1dG9jb21wbGV0ZVJlc3VsdD4oKTtcbiAgQE91dHB1dCgpIHJlYWRvbmx5IGVycm9yZWQgPSBuZXcgRXZlbnRFbWl0dGVyPEVycm9yPigpO1xuICBAT3V0cHV0KCkgcmVhZG9ubHkgdmFsdWVDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPHN0cmluZz4oKTtcbiAgQE91dHB1dCgpIHJlYWRvbmx5IGNvbXBsZXRlZFBhcmFtc0NoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8Q29tcGxldGVkUGFyYW1TdGF0ZVtdPigpO1xuICBAT3V0cHV0KCkgcmVhZG9ubHkgZm9jdXNlZCA9IG5ldyBFdmVudEVtaXR0ZXI8dm9pZD4oKTtcbiAgQE91dHB1dCgpIHJlYWRvbmx5IGJsdXJyZWQgPSBuZXcgRXZlbnRFbWl0dGVyPHZvaWQ+KCk7XG5cbiAgLy8gPT09IFZpZXcgcmVmcyA9PT1cblxuICBAVmlld0NoaWxkKFwiY29udGFpbmVyXCIsIHsgc3RhdGljOiB0cnVlIH0pIGNvbnRhaW5lclJlZiE6IEVsZW1lbnRSZWY8SFRNTERpdkVsZW1lbnQ+O1xuICBAVmlld0NoaWxkKFwiZWRpdG9yXCIsIHsgc3RhdGljOiBmYWxzZSB9KSBlZGl0b3JSZWY/OiBFbGVtZW50UmVmPEhUTUxEaXZFbGVtZW50PjtcbiAgQFZpZXdDaGlsZChcInBpbGxDb250YWluZXJcIikgcGlsbENvbnRhaW5lclJlZj86IEVsZW1lbnRSZWY8SFRNTFNwYW5FbGVtZW50PjtcblxuICAvLyA9PT0gUHVibGljIHN0YXRlIGZvciB0aGUgdGVtcGxhdGUgPT09XG5cbiAgY29udHJvbGxlciE6IEFJQXV0b2NvbXBsZXRlQ29udHJvbGxlcjtcbiAgLyoqXG4gICAqIENvbmNyZXRlIGxpZ2h0L2RhcmsgdmFsdWUgYm91bmQgdG8gYFthdHRyLmRhdGEtbW9kZV1gLiBTZWVkZWQgaW4gbmdPbkluaXRcbiAgICogc28gdGhlIGF0dHJpYnV0ZSBpcyBwcmVzZW50IGR1cmluZyBTU1IgKHdoZXJlIE1vZGVDb250cm9sbGVyLCBnYXRlZCBiZWhpbmRcbiAgICogaXNQbGF0Zm9ybUJyb3dzZXIgaW4gbmdBZnRlclZpZXdJbml0LCBuZXZlciBydW5zKS4gT24gdGhlIGJyb3dzZXIgdGhlXG4gICAqIE1vZGVDb250cm9sbGVyJ3MgcmVzb2x2ZSBjYWxsYmFjayBrZWVwcyB0aGlzIGluIHN5bmMg4oCUIHNvIGl0cyBydW50aW1lXG4gICAqIHByZWZlcnMtY29sb3Itc2NoZW1lIHVwZGF0ZXMgYW5kIHRoaXMgYmluZGluZyBhbHdheXMgYWdyZWUgKG5vIGNsb2JiZXIpLlxuICAgKi9cbiAgcmVzb2x2ZWRNb2RlOiBcImxpZ2h0XCIgfCBcImRhcmtcIiA9IFwiZGFya1wiO1xuXG4gIC8vID09PSBJbnRlcm5hbCA9PT1cblxuICBwcml2YXRlIG1vZGVDb250cm9sbGVyPzogTW9kZUNvbnRyb2xsZXI7XG4gIHByaXZhdGUgcmVzaXplT2JzZXJ2ZXI/OiBSZXNpemVPYnNlcnZlcjtcbiAgcHJpdmF0ZSBvbkNoYW5nZUZuOiAodmFsdWU6IHN0cmluZykgPT4gdm9pZCA9IG5vb3A7XG4gIHByaXZhdGUgb25Ub3VjaGVkRm46ICgpID0+IHZvaWQgPSBub29wO1xuICAvLyBIb2xkcyBhIHZhbHVlIHdyaXR0ZW4gYnkgUmVhY3RpdmUgRm9ybXMgYmVmb3JlIG5nT25Jbml0IHJhbi4gUmVhY3RpdmVcbiAgLy8gRm9ybXMgY2FuIGNhbGwgd3JpdGVWYWx1ZSgpIGR1cmluZyBkeW5hbWljIGZvcm0gY29uc3RydWN0aW9uIChlLmcuIHdoZW5cbiAgLy8gYSBGb3JtQ29udHJvbCBhbHJlYWR5IGhvbGRzIGEgdmFsdWUgYXQgdGhlIG1vbWVudCB0aGUgZGlyZWN0aXZlIGlzXG4gIC8vIGNyZWF0ZWQpLiBXZSBzdGFzaCB0aGUgdmFsdWUgaGVyZSBhbmQgZmx1c2ggaXQgaW4gbmdPbkluaXQgKmFmdGVyKlxuICAvLyB0aGUgY29udHJvbGxlciBleGlzdHMg4oCUIG90aGVyd2lzZSB0aGUgZWRpdG9yIHJlbmRlcnMgZW1wdHkgZXZlbiB0aG91Z2hcbiAgLy8gdGhlIGZvcm0gaGFkIGEgdmFsdWUuIGB1bmRlZmluZWRgIG1lYW5zIFwibm8gcGVuZGluZyB3cml0ZVwiLlxuICBwcml2YXRlIHBlbmRpbmdXcml0ZVZhbHVlOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG5cbiAgLy8gwqcxNi45OiBwcmVmZXIgYGluamVjdCgpYCBvdmVyIGNvbnN0cnVjdG9yLXBhcmFtZXRlciBESSBmb3IgY29tcG9uZW50cy5cbiAgcHJpdmF0ZSByZWFkb25seSBwbGF0Zm9ybUlkID0gaW5qZWN0KFBMQVRGT1JNX0lEKTtcbiAgcHJpdmF0ZSByZWFkb25seSB6b25lID0gaW5qZWN0KE5nWm9uZSk7XG4gIHByaXZhdGUgcmVhZG9ubHkgY2RyID0gaW5qZWN0KENoYW5nZURldGVjdG9yUmVmKTtcblxuICBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICAvLyBTZWVkIGJlZm9yZSB0aGUgYnJvd3NlciBndWFyZCBzbyBTU1IgcmVuZGVycyBhIGNvbmNyZXRlIGRhdGEtbW9kZS5cbiAgICB0aGlzLnJlc29sdmVkTW9kZSA9IHJlc29sdmVJbml0aWFsTW9kZSh0aGlzLm1vZGUpO1xuICAgIGlmICghaXNQbGF0Zm9ybUJyb3dzZXIodGhpcy5wbGF0Zm9ybUlkKSkgcmV0dXJuO1xuXG4gICAgdGhpcy5jb250cm9sbGVyID0gbmV3IEFJQXV0b2NvbXBsZXRlQ29udHJvbGxlcih7XG4gICAgICBhcGlDb25maWc6IHRoaXMuYXBpQ29uZmlnLFxuICAgICAgb3B0aW9uT3ZlcnJpZGVzOiB0aGlzLm9wdGlvbk92ZXJyaWRlcyxcbiAgICAgIG1hc2tDb21wbGV0ZWRUZXh0OiB0aGlzLm1hc2tDb21wbGV0ZWRUZXh0LFxuICAgICAgY29sdW1uczogdGhpcy5jb2x1bW5zLFxuICAgICAgZHJvcGRvd25UcmlnZ2VyOiB0aGlzLmRyb3Bkb3duVHJpZ2dlcixcbiAgICAgIG9wdGlvbnNQb3NpdGlvbjogdGhpcy5vcHRpb25zUG9zaXRpb24sXG4gICAgICBjbG9zZURyb3Bkb3duT25CbHVyOiB0aGlzLmNsb3NlRHJvcGRvd25PbkJsdXIsXG4gICAgICBzaG93Tm9uVGFwcGFibGVPcHRpb25zOiB0aGlzLnNob3dOb25UYXBwYWJsZU9wdGlvbnMsXG4gICAgICBzb3VyY2U6IFwiZnVsbC1zZGtcIixcbiAgICAgIHZhbHVlOiB0aGlzLnZhbHVlLFxuICAgICAgY29tcGxldGVkUGFyYW1zOiB0aGlzLmNvbXBsZXRlZFBhcmFtcyxcbiAgICAgIG9uU3VibWl0OiAocmVzdWx0KSA9PiB0aGlzLmhhbmRsZVN1Ym1pdChyZXN1bHQpLFxuICAgICAgb25FcnJvcjogKGVycm9yKSA9PiB0aGlzLmVycm9yZWQuZW1pdChlcnJvciksXG4gICAgICBvbkNoYW5nZTogKHRleHQpID0+IHtcbiAgICAgICAgdGhpcy52YWx1ZUNoYW5nZS5lbWl0KHRleHQpO1xuICAgICAgICB0aGlzLm9uQ2hhbmdlRm4odGV4dCk7XG4gICAgICB9LFxuICAgICAgb25QYXJhbXNDaGFuZ2U6IChwYXJhbXMpID0+IHRoaXMuY29tcGxldGVkUGFyYW1zQ2hhbmdlLmVtaXQocGFyYW1zKSxcbiAgICAgIG9uRm9jdXM6ICgpID0+IHRoaXMuZm9jdXNlZC5lbWl0KCksXG4gICAgICBvbkJsdXI6ICgpID0+IHtcbiAgICAgICAgdGhpcy5ibHVycmVkLmVtaXQoKTtcbiAgICAgICAgdGhpcy5vblRvdWNoZWRGbigpO1xuICAgICAgfSxcbiAgICAgIHNldEN1cnNvcjogKG9mZnNldCkgPT4ge1xuICAgICAgICBjb25zdCBlZGl0b3IgPSB0aGlzLmVkaXRvclJlZj8ubmF0aXZlRWxlbWVudDtcbiAgICAgICAgaWYgKCFlZGl0b3IpIHJldHVybjtcbiAgICAgICAgZWRpdG9yLmZvY3VzKCk7XG4gICAgICAgIHNldEN1cnNvck9mZnNldChlZGl0b3IsIG9mZnNldCk7XG4gICAgICB9LFxuICAgIH0pO1xuXG4gICAgaWYgKHRoaXMucGVuZGluZ1dyaXRlVmFsdWUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5jb250cm9sbGVyLnNldFZhbHVlKHRoaXMucGVuZGluZ1dyaXRlVmFsdWUpO1xuICAgICAgdGhpcy5wZW5kaW5nV3JpdGVWYWx1ZSA9IHVuZGVmaW5lZDtcbiAgICB9XG4gIH1cblxuICBuZ0FmdGVyVmlld0luaXQoKTogdm9pZCB7XG4gICAgaWYgKCFpc1BsYXRmb3JtQnJvd3Nlcih0aGlzLnBsYXRmb3JtSWQpKSByZXR1cm47XG4gICAgLy8gTW9kZUNvbnRyb2xsZXIgd3JpdGVzIGBkYXRhLW1vZGVgIHRvIHRoZSBlbGVtZW50IGl0J3MgZ2l2ZW4uIFRoZSBDU1NcbiAgICAvLyBzZWxlY3RvcnMgYXJlIHNjb3BlZCB0byBgLm1hZ2ljeC1haWFbZGF0YS1tb2RlPVwiLi4uXCJdYCDigJQgd2hpY2ggbGl2ZXMgb25cbiAgICAvLyB0aGUgaW5uZXIgYDxkaXYgY2xhc3M9XCJtYWdpY3gtYWlhIG1hZ2ljeC1haWEtY29udGFpbmVyXCIgI2NvbnRhaW5lcj5gLFxuICAgIC8vIE5PVCB0aGUgaG9zdCBgPGFpLWF1dG9jb21wbGV0ZT5gIGVsZW1lbnQuIFRoZSByZXNvbHZlIGNhbGxiYWNrIG1pcnJvcnNcbiAgICAvLyB0aGUgdmFsdWUgaW50byBgcmVzb2x2ZWRNb2RlYCBzbyB0aGUgYFthdHRyLmRhdGEtbW9kZV1gIGJpbmRpbmcgc3RheXMgaW5cbiAgICAvLyBsb2Nrc3RlcCB3aXRoIE1vZGVDb250cm9sbGVyIOKAlCB0aGUgYmluZGluZyBoYW5kbGVzIFNTUiwgTW9kZUNvbnRyb2xsZXJcbiAgICAvLyBoYW5kbGVzIHJ1bnRpbWUgcHJlZmVycy1jb2xvci1zY2hlbWUgc3dpdGNoZXMsIGFuZCBiZWNhdXNlIHRoZXkgYWx3YXlzXG4gICAgLy8gYWdyZWUgbmVpdGhlciBjbG9iYmVycyB0aGUgb3RoZXIuXG4gICAgdGhpcy5tb2RlQ29udHJvbGxlciA9IG5ldyBNb2RlQ29udHJvbGxlcihcbiAgICAgIHRoaXMuY29udGFpbmVyUmVmLm5hdGl2ZUVsZW1lbnQsXG4gICAgICB0aGlzLm1vZGUsXG4gICAgICAocmVzb2x2ZWQpID0+IHtcbiAgICAgICAgdGhpcy5yZXNvbHZlZE1vZGUgPSByZXNvbHZlZDtcbiAgICAgICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gICAgICB9LFxuICAgICk7XG5cbiAgICAvLyBQaWxsLXdyYXAgZGV0ZWN0aW9uIOKAlCB3aGVuIHRoZSBwaWxsIGxpc3Qgd3JhcHMgYmVsb3cgdGhlIGVkaXRvcidzIGxhc3RcbiAgICAvLyBsaW5lLCBkcm9wIGl0cyA4cHggbGVmdCBtYXJnaW4gdmlhIGEgZGF0YSBhdHRyaWJ1dGUgdGhlIENTUyBrZXlzIG9mZi5cbiAgICAvLyBNaXJyb3JzIHRoZSBSZWFjdCBjb21wb25lbnQncyB1c2VMYXlvdXRFZmZlY3QuXG4gICAgaWYgKHR5cGVvZiBSZXNpemVPYnNlcnZlciAhPT0gXCJ1bmRlZmluZWRcIikge1xuICAgICAgdGhpcy56b25lLnJ1bk91dHNpZGVBbmd1bGFyKCgpID0+IHtcbiAgICAgICAgdGhpcy5yZXNpemVPYnNlcnZlciA9IG5ldyBSZXNpemVPYnNlcnZlcigoKSA9PiB0aGlzLm1lYXN1cmVQaWxsV3JhcCgpKTtcbiAgICAgICAgY29uc3QgZWRpdG9yID0gdGhpcy5lZGl0b3JSZWY/Lm5hdGl2ZUVsZW1lbnQ7XG4gICAgICAgIGlmIChlZGl0b3IpIHRoaXMucmVzaXplT2JzZXJ2ZXIub2JzZXJ2ZShlZGl0b3IpO1xuICAgICAgfSk7XG4gICAgICB0aGlzLm1lYXN1cmVQaWxsV3JhcCgpO1xuICAgIH1cbiAgfVxuXG4gIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuY29udHJvbGxlcikgcmV0dXJuO1xuICAgIC8vIGBTaW1wbGVDaGFuZ2VzYCBpcyBgeyBba2V5OiBzdHJpbmddOiBTaW1wbGVDaGFuZ2UgfWAsIHNvIHBlclxuICAgIC8vIGBub1Byb3BlcnR5QWNjZXNzRnJvbUluZGV4U2lnbmF0dXJlYCBlYWNoIGtleSBsb29rdXAgdXNlcyBicmFja2V0XG4gICAgLy8gbm90YXRpb24g4oCUIHRoaXMga2VlcHMgdGhlIHN0cmljdG5lc3MgY29udHJhY3QgdGhhdCB0aGUgcmVzdCBvZiB0aGVcbiAgICAvLyB3b3Jrc3BhY2UgZW5mb3JjZXMuXG4gICAgLy8gQ29udHJvbGxlZC1tb2RlIHByb3BhZ2F0aW9uXG4gICAgaWYgKGNoYW5nZXNbXCJ2YWx1ZVwiXSAmJiB0aGlzLnZhbHVlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMuY29udHJvbGxlci5zZXRWYWx1ZSh0aGlzLnZhbHVlKTtcbiAgICB9XG4gICAgaWYgKGNoYW5nZXNbXCJjb21wbGV0ZWRQYXJhbXNcIl0gJiYgdGhpcy5jb21wbGV0ZWRQYXJhbXMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5jb250cm9sbGVyLnNldENvbXBsZXRlZFBhcmFtcyh0aGlzLmNvbXBsZXRlZFBhcmFtcyk7XG4gICAgfVxuICAgIC8vIFJlYWN0aXZlIG9wdGlvbnNcbiAgICBpZiAoXG4gICAgICBjaGFuZ2VzW1wiYXBpQ29uZmlnXCJdIHx8XG4gICAgICBjaGFuZ2VzW1wib3B0aW9uT3ZlcnJpZGVzXCJdIHx8XG4gICAgICBjaGFuZ2VzW1wiZHJvcGRvd25UcmlnZ2VyXCJdIHx8XG4gICAgICBjaGFuZ2VzW1wib3B0aW9uc1Bvc2l0aW9uXCJdIHx8XG4gICAgICBjaGFuZ2VzW1wiY2xvc2VEcm9wZG93bk9uQmx1clwiXSB8fFxuICAgICAgY2hhbmdlc1tcInNob3dOb25UYXBwYWJsZU9wdGlvbnNcIl1cbiAgICApIHtcbiAgICAgIHRoaXMuY29udHJvbGxlci51cGRhdGUoe1xuICAgICAgICBhcGlDb25maWc6IHRoaXMuYXBpQ29uZmlnLFxuICAgICAgICBvcHRpb25PdmVycmlkZXM6IHRoaXMub3B0aW9uT3ZlcnJpZGVzLFxuICAgICAgICBkcm9wZG93blRyaWdnZXI6IHRoaXMuZHJvcGRvd25UcmlnZ2VyLFxuICAgICAgICBvcHRpb25zUG9zaXRpb246IHRoaXMub3B0aW9uc1Bvc2l0aW9uLFxuICAgICAgICBjbG9zZURyb3Bkb3duT25CbHVyOiB0aGlzLmNsb3NlRHJvcGRvd25PbkJsdXIsXG4gICAgICAgIHNob3dOb25UYXBwYWJsZU9wdGlvbnM6IHRoaXMuc2hvd05vblRhcHBhYmxlT3B0aW9ucyxcbiAgICAgIH0pO1xuICAgIH1cbiAgICBpZiAoY2hhbmdlc1tcIm1vZGVcIl0pIHtcbiAgICAgIC8vIEtlZXAgdGhlIGJpbmRpbmcgY29ycmVjdCBldmVuIHdoZW4gTW9kZUNvbnRyb2xsZXIgZG9lc24ndCBleGlzdCB5ZXRcbiAgICAgIC8vIChTU1IgLyBwcmUtbmdBZnRlclZpZXdJbml0KS4gT24gdGhlIGJyb3dzZXIsIHNldE1vZGUgdHJpZ2dlcnMgdGhlXG4gICAgICAvLyByZXNvbHZlIGNhbGxiYWNrIHdoaWNoIHNldHMgdGhlIHNhbWUgdmFsdWUuXG4gICAgICB0aGlzLnJlc29sdmVkTW9kZSA9IHJlc29sdmVJbml0aWFsTW9kZSh0aGlzLm1vZGUpO1xuICAgICAgdGhpcy5tb2RlQ29udHJvbGxlcj8uc2V0TW9kZSh0aGlzLm1vZGUpO1xuICAgIH1cbiAgfVxuXG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgIHRoaXMucmVzaXplT2JzZXJ2ZXI/LmRpc2Nvbm5lY3QoKTtcbiAgICB0aGlzLm1vZGVDb250cm9sbGVyPy5kZXN0cm95KCk7XG4gICAgdGhpcy5jb250cm9sbGVyPy5kZXN0cm95KCk7XG4gIH1cblxuICAvLyA9PT0gSW1wZXJhdGl2ZSBBUEkgKGV4cG9zZWQgb24gdGhlIGNvbXBvbmVudCBpbnN0YW5jZSB2aWEgQFZpZXdDaGlsZCkgPT09XG5cbiAgLyoqIFByb2dyYW1tYXRpY2FsbHkgZm9jdXMgdGhlIGVkaXRvci4gKi9cbiAgZm9jdXMoKTogdm9pZCB7XG4gICAgdGhpcy5lZGl0b3JSZWY/Lm5hdGl2ZUVsZW1lbnQuZm9jdXMoKTtcbiAgfVxuXG4gIC8qKiBQcm9ncmFtbWF0aWNhbGx5IGJsdXIgdGhlIGVkaXRvci4gKi9cbiAgYmx1cigpOiB2b2lkIHtcbiAgICB0aGlzLmVkaXRvclJlZj8ubmF0aXZlRWxlbWVudC5ibHVyKCk7XG4gIH1cblxuICAvKiogQ2xlYXIgYWxsIHN0YXRlLCByb3RhdGUgc2Vzc2lvbiwgYW5kIHJlLWZldGNoLiAqL1xuICByZXNldCgpOiB2b2lkIHtcbiAgICB0aGlzLmNvbnRyb2xsZXI/LnJlc2V0KCk7XG4gIH1cblxuICAvKiogU3dpdGNoIGNvbG9yIG1vZGUgYXQgcnVudGltZS4gKi9cbiAgc2V0TW9kZShtb2RlOiBBcHBlYXJhbmNlTW9kZSk6IHZvaWQge1xuICAgIHRoaXMubW9kZSA9IG1vZGU7XG4gICAgdGhpcy5yZXNvbHZlZE1vZGUgPSByZXNvbHZlSW5pdGlhbE1vZGUobW9kZSk7XG4gICAgdGhpcy5tb2RlQ29udHJvbGxlcj8uc2V0TW9kZShtb2RlKTtcbiAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgfVxuXG4gIC8vID09PSBUZW1wbGF0ZSBoZWxwZXJzID09PVxuXG4gIC8qKlxuICAgKiAnZGVmYXVsdCcg4oaSIHJlbmRlciB0aGUgYnVpbHQtaW4gYXJyb3cgYnV0dG9uLlxuICAgKiAnY3VzdG9tJyAg4oaSIHByb2plY3QgdGhlIGNvbnN1bWVyLXN1cHBsaWVkIFRlbXBsYXRlUmVmLlxuICAgKiAnaGlkZGVuJyAg4oaSIG5vIGJ1dHRvbi5cbiAgICovXG4gIGdldCBzdWJtaXRCdXR0b25TdGF0ZSgpOiBcImRlZmF1bHRcIiB8IFwiY3VzdG9tXCIgfCBcImhpZGRlblwiIHtcbiAgICBpZiAodGhpcy5zdWJtaXRCdXR0b24gPT09IG51bGwpIHJldHVybiBcImhpZGRlblwiO1xuICAgIGlmICh0aGlzLnN1Ym1pdEJ1dHRvbiA9PT0gdW5kZWZpbmVkKSByZXR1cm4gXCJkZWZhdWx0XCI7XG4gICAgcmV0dXJuIFwiY3VzdG9tXCI7XG4gIH1cblxuICAvKiogTmFycm93ZWQgYWNjZXNzb3IgZm9yICpuZ1RlbXBsYXRlT3V0bGV0IOKAlCBuZXZlciB1bmRlZmluZWQuICovXG4gIGdldCBjdXN0b21TdWJtaXRUZW1wbGF0ZSgpOiBUZW1wbGF0ZVJlZjx1bmtub3duPiB8IG51bGwge1xuICAgIHJldHVybiB0aGlzLnN1Ym1pdEJ1dHRvbiA/PyBudWxsO1xuICB9XG5cbiAgZ2V0IHNob3dJbmxpbmVQaWxscygpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5waWxsUGxhY2VtZW50ID09PSBcImlubGluZVwiO1xuICB9XG5cbiAgZ2V0IHNob3dEcm9wZG93blBpbGxzKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLnBpbGxQbGFjZW1lbnQgPT09IFwiZHJvcGRvd25cIjtcbiAgfVxuXG4gIC8qKlxuICAgKiBgdHJ1ZWAgd2hlbiB0aGVyZSdzIHNvbWV0aGluZyB0byBzdWJtaXQg4oCUIGRyaXZlbiBieSBjdXJyZW50IHNlZ21lbnRzXG4gICAqIGFuZCBjb21wbGV0ZWQgcGFyYW1zLiBSZWFkIG9mZiB0aGUgbGl2ZSBlZGl0b3IgdmlhIHRoZSBjb250cm9sbGVyIHN0YXRlLlxuICAgKi9cbiAgY2FuU3VibWl0KHN0YXRlOiB7IHNlZ21lbnRzOiB7IGxlbmd0aDogbnVtYmVyIH07IGNvbXBsZXRlZFBhcmFtczogeyBsZW5ndGg6IG51bWJlciB9IH0pOiBib29sZWFuIHtcbiAgICByZXR1cm4gc3RhdGUuc2VnbWVudHMubGVuZ3RoID4gMCB8fCBzdGF0ZS5jb21wbGV0ZWRQYXJhbXMubGVuZ3RoID4gMDtcbiAgfVxuXG4gIG9uV3JhcHBlckNsaWNrKGV2ZW50OiBNb3VzZUV2ZW50KTogdm9pZCB7XG4gICAgLy8gQ2xpY2tpbmcgYSBwaWxsIHNob3VsZCBhY3RpdmF0ZSBpdCB3aXRob3V0IHN0ZWFsaW5nIGZvY3VzIGVsc2V3aGVyZS5cbiAgICBjb25zdCB0YXJnZXQgPSBldmVudC50YXJnZXQgYXMgSFRNTEVsZW1lbnQgfCBudWxsO1xuICAgIGlmICh0YXJnZXQ/LmNsb3Nlc3QoXCJbZGF0YS1haWEtcGlsbF1cIikpIHJldHVybjtcbiAgICB0aGlzLmZvY3VzKCk7XG4gIH1cblxuICBvblN1Ym1pdEJ1dHRvbkNsaWNrKGV2ZW50OiBNb3VzZUV2ZW50KTogdm9pZCB7XG4gICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgdGhpcy5oYW5kbGVTdWJtaXRGcm9tVXNlckFjdGlvbigpO1xuICB9XG5cbiAgb25TdWJtaXRTbG90Q2xpY2soZXZlbnQ6IE1vdXNlRXZlbnQpOiB2b2lkIHtcbiAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICB0aGlzLmhhbmRsZVN1Ym1pdEZyb21Vc2VyQWN0aW9uKCk7XG4gIH1cblxuICBvblNlbGVjdFBpbGwoaW5kZXg6IG51bWJlcik6IHZvaWQge1xuICAgIHRoaXMuY29udHJvbGxlci5zZXRBY3RpdmVQaWxsKGluZGV4KTtcbiAgfVxuXG4gIC8vID09PSBDb250cm9sVmFsdWVBY2Nlc3NvciA9PT1cblxuICB3cml0ZVZhbHVlKHZhbHVlOiBzdHJpbmcgfCBudWxsKTogdm9pZCB7XG4gICAgY29uc3QgbmV4dCA9IHZhbHVlID8/IFwiXCI7XG4gICAgaWYgKCF0aGlzLmNvbnRyb2xsZXIpIHtcbiAgICAgIC8vIFJlYWN0aXZlIEZvcm1zIGNhbiBjYWxsIHdyaXRlVmFsdWUoKSBiZWZvcmUgbmdPbkluaXQgY3JlYXRlcyB0aGVcbiAgICAgIC8vIGNvbnRyb2xsZXIgKGR5bmFtaWMgZm9ybSBjb25zdHJ1Y3Rpb24sIG9yIGEgRm9ybUNvbnRyb2wgdGhhdCBhbHJlYWR5XG4gICAgICAvLyBoYWQgYSB2YWx1ZSBhdCBkaXJlY3RpdmUtY3JlYXRpb24gdGltZSkuIEJ1ZmZlciB0aGUgdmFsdWU7IG5nT25Jbml0XG4gICAgICAvLyBmbHVzaGVzIGl0IGFzIHNvb24gYXMgdGhlIGNvbnRyb2xsZXIgZXhpc3RzLlxuICAgICAgdGhpcy5wZW5kaW5nV3JpdGVWYWx1ZSA9IG5leHQ7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuY29udHJvbGxlci5zZXRWYWx1ZShuZXh0KTtcbiAgfVxuXG4gIHJlZ2lzdGVyT25DaGFuZ2UoZm46ICh2YWx1ZTogc3RyaW5nKSA9PiB2b2lkKTogdm9pZCB7XG4gICAgdGhpcy5vbkNoYW5nZUZuID0gZm47XG4gIH1cblxuICByZWdpc3Rlck9uVG91Y2hlZChmbjogKCkgPT4gdm9pZCk6IHZvaWQge1xuICAgIHRoaXMub25Ub3VjaGVkRm4gPSBmbjtcbiAgfVxuXG4gIHNldERpc2FibGVkU3RhdGUoX2Rpc2FibGVkOiBib29sZWFuKTogdm9pZCB7XG4gICAgLy8gVGhlIGNvbnRlbnRFZGl0YWJsZSBob3N0IGRvZXNuJ3QgaGF2ZSBhIG5hdGl2ZSBkaXNhYmxlZCBhdHRyaWJ1dGUuIEZvclxuICAgIC8vIHYwLjEgd2UgYWNjZXB0IHRoZSBjYWxsIHNvIEFuZ3VsYXIncyBmb3JtcyBsYXllciBkb2Vzbid0IHRocm93LCBidXRcbiAgICAvLyB0aGUgZWRpdG9yIHN0YXlzIGludGVyYWN0aXZlLiBBIGZ1dHVyZSBlbmhhbmNlbWVudCBjYW4gdG9nZ2xlXG4gICAgLy8gY29udGVudEVkaXRhYmxlICsgQVJJQSBkaXNhYmxlZCBoZXJlLlxuICB9XG5cbiAgLy8gPT09IFN1Ym1pdCBmbG93ID09PVxuXG4gIC8qKlxuICAgKiBDYWxsZWQgYnkgdGhlIGNvbnRyb2xsZXIncyBvblN1Ym1pdCBjYWxsYmFjayAod2hpY2ggZmlyZXMgZnJvbSB0aGVcbiAgICoga2V5Ym9hcmQgY29udHJvbGxlciBvbiBFbnRlcikuIFJlYWRzIHRoZSBsaXZlIGVkaXRvciB0ZXh0IOKAlCBzYW1lIHRyaWNrXG4gICAqIHRoZSBSZWFjdCBjb21wb25lbnQgdXNlcyDigJQgc28gdGhlIGVtaXR0ZWQgcXVlcnkgcmVmbGVjdHMgd2hhdGV2ZXIncyBpblxuICAgKiB0aGUgRE9NIHJpZ2h0IG5vdywgbm90IGEgcG9zc2libHktc3RhbGUgc3RhdGUgc25hcHNob3QuXG4gICAqL1xuICBwcml2YXRlIGhhbmRsZVN1Ym1pdChfcmVzdWx0OiBBdXRvY29tcGxldGVSZXN1bHQpOiB2b2lkIHtcbiAgICBjb25zdCBlZGl0b3IgPSB0aGlzLmVkaXRvclJlZj8ubmF0aXZlRWxlbWVudDtcbiAgICBpZiAoIWVkaXRvcikgcmV0dXJuO1xuICAgIGNvbnN0IHRleHQgPSBleHRyYWN0UGxhaW5UZXh0KGVkaXRvcik7XG4gICAgY29uc3QgcGFyYW1zID0gdGhpcy5jb21wbGV0ZWRQYXJhbXMgPz8gdGhpcy5jb250cm9sbGVyLmdldFN0YXRlKCkuY29tcGxldGVkUGFyYW1zO1xuICAgIGNvbnN0IGJ1aWx0ID0gYnVpbGRRdWVyeSh0ZXh0LCBwYXJhbXMpO1xuICAgIHRoaXMuc3VibWl0dGVkLmVtaXQoe1xuICAgICAgcXVlcnk6IHRleHQudHJpbSgpLFxuICAgICAgcmF3X3F1ZXJ5OiBidWlsdC5yYXdRdWVyeSxcbiAgICAgIGNvbXBsZXRlZF9wYXJhbXM6IGJ1aWx0LmNvbXBsZXRlZFBhcmFtcyxcbiAgICB9KTtcbiAgICB0aGlzLmNvbnRyb2xsZXIucmVzZXQoKTtcbiAgfVxuXG4gIHByaXZhdGUgaGFuZGxlU3VibWl0RnJvbVVzZXJBY3Rpb24oKTogdm9pZCB7XG4gICAgY29uc3Qgc3RhdGUgPSB0aGlzLmNvbnRyb2xsZXIuZ2V0U3RhdGUoKTtcbiAgICBpZiAoIXRoaXMuY2FuU3VibWl0KHN0YXRlKSkgcmV0dXJuO1xuICAgIC8vIFN5bnRoZXNpemUgdGhlIHJlc3VsdCBmb3IgdGhlIHN1Ym1pdC1idXR0b24gY2xpY2sgcGF0aDsgc2FtZSBzaGFwZVxuICAgIC8vIHRoZSBjb250cm9sbGVyIHdvdWxkIGRlbGl2ZXIgZnJvbSBhIGtleWJvYXJkIEVudGVyLCBzbyBoYW5kbGVTdWJtaXRcbiAgICAvLyBjYW4gdGFrZSBlaXRoZXIgZW50cnkgcG9pbnQuXG4gICAgdGhpcy5oYW5kbGVTdWJtaXQoe1xuICAgICAgcXVlcnk6IHN0YXRlLnRleHQudHJpbSgpLFxuICAgICAgcmF3X3F1ZXJ5OiBcIlwiLFxuICAgICAgY29tcGxldGVkX3BhcmFtczogW10sXG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIG1lYXN1cmVQaWxsV3JhcCgpOiB2b2lkIHtcbiAgICBjb25zdCBjb250YWluZXIgPSB0aGlzLnBpbGxDb250YWluZXJSZWY/Lm5hdGl2ZUVsZW1lbnQ7XG4gICAgY29uc3QgZWRpdG9yID0gdGhpcy5lZGl0b3JSZWY/Lm5hdGl2ZUVsZW1lbnQ7XG4gICAgaWYgKCFjb250YWluZXIgfHwgIWVkaXRvcikgcmV0dXJuO1xuICAgIGNvbnN0IGlubmVyID0gY29udGFpbmVyLmZpcnN0RWxlbWVudENoaWxkIGFzIEhUTUxFbGVtZW50IHwgbnVsbDtcbiAgICBpZiAoIWlubmVyKSByZXR1cm47XG4gICAgLy8gV3JhcCBkZXRlY3Rpb246IHRoZSBwaWxsIHJvdydzIHRvcCB2cyB0aGUgZWRpdG9yJ3MgYm90dG9tLiBXaGVuIHRoZVxuICAgIC8vIHBpbGxzIHNpdCBvbiAob3IgYWJvdmUpIHRoZSBlZGl0b3IncyBsYXN0IGxpbmUgdGhleSdyZSBOT1Qgd3JhcHBlZCDigJRcbiAgICAvLyBrZWVwIHRoZSA4cHggbWFyZ2luIHNvIHRoZXkgZG9uJ3QgYnV0dCBhZ2FpbnN0IHR5cGVkIHRleHQgb3IgdGhlXG4gICAgLy8gcGxhY2Vob2xkZXIuIFRoaXMgaGFuZGxlcyB0aGUgZW1wdHktZWRpdG9yICsgcGxhY2Vob2xkZXIgY2FzZVxuICAgIC8vIG5hdHVyYWxseTogdGhlIHBsYWNlaG9sZGVyIHN0aWxsIG9jY3VwaWVzIHRoZSBlZGl0b3IncyBsaW5lIGJveC5cbiAgICBjb25zdCBjUmVjdCA9IGlubmVyLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgIGNvbnN0IGVSZWN0ID0gZWRpdG9yLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgIGNvbnN0IHdyYXBwZWQgPSBjUmVjdC50b3AgPj0gZVJlY3QuYm90dG9tIC0gMjtcbiAgICB0aGlzLnpvbmUucnVuKCgpID0+IHtcbiAgICAgIGlmICh3cmFwcGVkKSBjb250YWluZXIuc2V0QXR0cmlidXRlKFwiZGF0YS1haWEtcGlsbC13cmFwcGVkXCIsIFwiXCIpO1xuICAgICAgZWxzZSBjb250YWluZXIucmVtb3ZlQXR0cmlidXRlKFwiZGF0YS1haWEtcGlsbC13cmFwcGVkXCIpO1xuICAgIH0pO1xuICB9XG59XG5cbmZ1bmN0aW9uIG5vb3AoKTogdm9pZCB7XG4gIC8vIERlZmF1bHQgbm8tb3AgZm9yIENWQSBjYWxsYmFja3MuXG59XG5cbi8qKlxuICogUmVzb2x2ZSBhIGNvbmNyZXRlIGxpZ2h0L2RhcmsgdmFsdWUgZnJvbSB0aGUgY29uZmlndXJlZCBtb2RlLiBVc2VkIHRvIHNlZWRcbiAqIHRoZSBgZGF0YS1tb2RlYCBhdHRyaWJ1dGUgc3luY2hyb25vdXNseSAoaW5jbHVkaW5nIGR1cmluZyBTU1IsIHdoZXJlXG4gKiBNb2RlQ29udHJvbGxlciBuZXZlciBydW5zKS4gT24gdGhlIHNlcnZlciBgd2luZG93YCBpcyB1bmRlZmluZWQg4oaSIGRlZmF1bHRzXG4gKiB0byBcImRhcmtcIiAobWF0Y2hlcyB0aGUgdmFuaWxsYS9SZWFjdCBiZWhhdmlvcikuXG4gKi9cbmZ1bmN0aW9uIHJlc29sdmVJbml0aWFsTW9kZShtb2RlOiBBcHBlYXJhbmNlTW9kZSk6IFwibGlnaHRcIiB8IFwiZGFya1wiIHtcbiAgaWYgKG1vZGUgIT09IFwiYXV0b1wiKSByZXR1cm4gbW9kZTtcbiAgaWYgKHR5cGVvZiB3aW5kb3cgPT09IFwidW5kZWZpbmVkXCIpIHJldHVybiBcImRhcmtcIjtcbiAgcmV0dXJuIHdpbmRvdy5tYXRjaE1lZGlhKFwiKHByZWZlcnMtY29sb3Itc2NoZW1lOiBkYXJrKVwiKS5tYXRjaGVzID8gXCJkYXJrXCIgOiBcImxpZ2h0XCI7XG59XG4iLCI8ZGl2XG4gICNjb250YWluZXJcbiAgY2xhc3M9XCJtYWdpY3gtYWlhIG1hZ2ljeC1haWEtY29udGFpbmVyXCJcbiAgW2F0dHIuZGF0YS1waWxsLXBsYWNlbWVudF09XCJwaWxsUGxhY2VtZW50XCJcbiAgW2F0dHIuZGF0YS1vcHRpb25zLXBvc2l0aW9uXT1cIm9wdGlvbnNQb3NpdGlvblwiXG4gIFthdHRyLmRhdGEtYW5pbWF0aW9uc109XCJhbmltYXRpb25zID8gJ29uJyA6ICdvZmYnXCJcbiAgW2F0dHIuZGF0YS1tb2RlXT1cInJlc29sdmVkTW9kZVwiXG4+XG4gIDxhaS1hdXRvY29tcGxldGUtZHJvcGRvd25cbiAgICAqbmdJZj1cImNvbnRyb2xsZXJcIlxuICAgIFtjb250cm9sbGVyXT1cImNvbnRyb2xsZXJcIlxuICAgIFtzaG93UGlsbHNdPVwic2hvd0Ryb3Bkb3duUGlsbHNcIlxuICA+PC9haS1hdXRvY29tcGxldGUtZHJvcGRvd24+XG5cbiAgPGRpdlxuICAgIGNsYXNzPVwibWFnaWN4LWFpYS1pbnB1dC13cmFwcGVyXCJcbiAgICAoY2xpY2spPVwib25XcmFwcGVyQ2xpY2soJGV2ZW50KVwiXG4gICAgKGtleXVwKT1cIiRldmVudC5zdG9wUHJvcGFnYXRpb24oKVwiXG4gID5cbiAgICA8ZGl2IGNsYXNzPVwibWFnaWN4LWFpYS1lZGl0b3ItYXJlYVwiIGRhdGEtYWlhLWVkaXRvcj1cIlwiPlxuICAgICAgPGRpdlxuICAgICAgICAjZWRpdG9yXG4gICAgICAgICpuZ0lmPVwiY29udHJvbGxlclwiXG4gICAgICAgIFthaWFFZGl0b3JIb3N0XT1cImNvbnRyb2xsZXJcIlxuICAgICAgICBbYXV0b0ZvY3VzXT1cImF1dG9Gb2N1c1wiXG4gICAgICAgIGNsYXNzPVwibWFnaWN4LWFpYS1pbnB1dFwiXG4gICAgICAgIGRhdGEtYWlhLWlucHV0PVwiXCJcbiAgICAgID48L2Rpdj5cblxuICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImNvbnRyb2xsZXIgJiYgc2hvd0lubGluZVBpbGxzXCI+XG4gICAgICAgIDxzcGFuXG4gICAgICAgICAgI3BpbGxDb250YWluZXJcbiAgICAgICAgICBjbGFzcz1cIm1hZ2ljeC1haWEtcGlsbC1saXN0LWNvbnRhaW5lclwiXG4gICAgICAgICAgZGF0YS1haWEtcGlsbC1saXN0LWNvbnRhaW5lcj1cIlwiXG4gICAgICAgICAgKm5nSWY9XCJcbiAgICAgICAgICAgIChjb250cm9sbGVyLmlzTG9hZGluZyQgfCBhc3luYykgfHxcbiAgICAgICAgICAgICAgKChjb250cm9sbGVyLnN1Z2dlc3Rpb25QaWxscyQgfCBhc3luYyk/Lmxlbmd0aCA/PyAwKSA+IDBcbiAgICAgICAgICBcIlxuICAgICAgICA+XG4gICAgICAgICAgPGFpYS1waWxsLWxpc3RcbiAgICAgICAgICAgIFtwaWxsc109XCIoY29udHJvbGxlci5zdWdnZXN0aW9uUGlsbHMkIHwgYXN5bmMpID8/IFtdXCJcbiAgICAgICAgICAgIFthY3RpdmVQaWxsSW5kZXhdPVwiMFwiXG4gICAgICAgICAgICBbYWN0aXZlU2VsZWN0ZWRdPVwiKGNvbnRyb2xsZXIuaXNBY3RpdmVQaWxsU2VsZWN0ZWQkIHwgYXN5bmMpID8/IGZhbHNlXCJcbiAgICAgICAgICAgIFtsb2FkaW5nXT1cIihjb250cm9sbGVyLmlzTG9hZGluZyQgfCBhc3luYykgPz8gZmFsc2VcIlxuICAgICAgICAgICAgKHNlbGVjdFBpbGwpPVwib25TZWxlY3RQaWxsKCRldmVudClcIlxuICAgICAgICAgID48L2FpYS1waWxsLWxpc3Q+XG4gICAgICAgIDwvc3Bhbj5cbiAgICAgIDwvbmctY29udGFpbmVyPlxuICAgIDwvZGl2PlxuXG4gICAgPG5nLWNvbnRhaW5lciBbbmdTd2l0Y2hdPVwic3VibWl0QnV0dG9uU3RhdGVcIj5cbiAgICAgIDxhaWEtc3VibWl0LWJ1dHRvblxuICAgICAgICAqbmdTd2l0Y2hDYXNlPVwiJ2RlZmF1bHQnXCJcbiAgICAgICAgW2Rpc2FibGVkXT1cIlxuICAgICAgICAgICEoXG4gICAgICAgICAgICBjb250cm9sbGVyICYmXG4gICAgICAgICAgICBjYW5TdWJtaXQoe1xuICAgICAgICAgICAgICBzZWdtZW50czogKGNvbnRyb2xsZXIuc2VnbWVudHMkIHwgYXN5bmMpID8/IFtdLFxuICAgICAgICAgICAgICBjb21wbGV0ZWRQYXJhbXM6IChjb250cm9sbGVyLmNvbXBsZXRlZFBhcmFtcyQgfCBhc3luYykgPz8gW11cbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgKVxuICAgICAgICBcIlxuICAgICAgICAoc3VibWl0KT1cIm9uU3VibWl0QnV0dG9uQ2xpY2soJGV2ZW50KVwiXG4gICAgICA+PC9haWEtc3VibWl0LWJ1dHRvbj5cblxuICAgICAgPHNwYW5cbiAgICAgICAgKm5nU3dpdGNoQ2FzZT1cIidjdXN0b20nXCJcbiAgICAgICAgZGF0YS1haWEtc3VibWl0PVwiXCJcbiAgICAgICAgY2xhc3M9XCJtYWdpY3gtYWlhLXN1Ym1pdC1zbG90XCJcbiAgICAgICAgKGNsaWNrKT1cIm9uU3VibWl0U2xvdENsaWNrKCRldmVudClcIlxuICAgICAgPlxuICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiY3VzdG9tU3VibWl0VGVtcGxhdGVcIj48L25nLWNvbnRhaW5lcj5cbiAgICAgIDwvc3Bhbj5cbiAgICA8L25nLWNvbnRhaW5lcj5cbiAgPC9kaXY+XG48L2Rpdj5cbiJdfQ==
|