@magicx-eng/ai-autocomplete-angular 0.11.1 → 0.13.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 (34) hide show
  1. package/README.md +122 -6
  2. package/esm2020/lib/ai-autocomplete/ai-autocomplete.component.mjs +3 -3
  3. package/esm2020/lib/ai-autocomplete-dropdown/ai-autocomplete-dropdown.component.mjs +66 -8
  4. package/esm2020/lib/controller/ai-autocomplete.controller.mjs +36 -4
  5. package/esm2020/lib/internal/date-grid/date-grid.component.mjs +101 -0
  6. package/esm2020/lib/internal/editor-host/editor-host.directive.mjs +12 -3
  7. package/esm2020/lib/internal/layout/grid.component.mjs +10 -4
  8. package/esm2020/lib/internal/suggestion-grid/suggestion-grid.component.mjs +79 -18
  9. package/esm2020/lib/internal/suggestion-item/suggestion-item.component.mjs +25 -4
  10. package/esm2020/lib/shared/types.mjs +1 -1
  11. package/esm2020/public-api.mjs +23 -2
  12. package/fesm2015/magicx-eng-ai-autocomplete-angular.mjs +348 -43
  13. package/fesm2015/magicx-eng-ai-autocomplete-angular.mjs.map +1 -1
  14. package/fesm2020/magicx-eng-ai-autocomplete-angular.mjs +339 -37
  15. package/fesm2020/magicx-eng-ai-autocomplete-angular.mjs.map +1 -1
  16. package/lib/ai-autocomplete-dropdown/ai-autocomplete-dropdown.component.d.ts +26 -3
  17. package/lib/ai-autocomplete-dropdown/ai-autocomplete-dropdown.component.d.ts.map +1 -1
  18. package/lib/controller/ai-autocomplete.controller.d.ts +5 -1
  19. package/lib/controller/ai-autocomplete.controller.d.ts.map +1 -1
  20. package/lib/internal/date-grid/date-grid.component.d.ts +48 -0
  21. package/lib/internal/date-grid/date-grid.component.d.ts.map +1 -0
  22. package/lib/internal/editor-host/editor-host.directive.d.ts +6 -0
  23. package/lib/internal/editor-host/editor-host.directive.d.ts.map +1 -1
  24. package/lib/internal/layout/grid.component.d.ts +10 -2
  25. package/lib/internal/layout/grid.component.d.ts.map +1 -1
  26. package/lib/internal/suggestion-grid/suggestion-grid.component.d.ts +30 -9
  27. package/lib/internal/suggestion-grid/suggestion-grid.component.d.ts.map +1 -1
  28. package/lib/internal/suggestion-item/suggestion-item.component.d.ts +16 -2
  29. package/lib/internal/suggestion-item/suggestion-item.component.d.ts.map +1 -1
  30. package/lib/shared/types.d.ts +25 -2
  31. package/lib/shared/types.d.ts.map +1 -1
  32. package/package.json +2 -2
  33. package/public-api.d.ts +21 -2
  34. package/public-api.d.ts.map +1 -1
package/README.md CHANGED
@@ -18,12 +18,13 @@ An Angular SDK that provides a guided AI-powered autocomplete experience with pi
18
18
  - **Keyboard navigation** — arrow keys, enter to submit, tab to autocomplete, backspace to un-bold the last completed param
19
19
  - **IME-safe** — composition events are buffered so input text is committed once, after composition ends
20
20
  - **Client-side filtering** — instant substring filtering on every keystroke
21
+ - **Datepicker** — date parameters are answered with a calendar instead of an option list. Click a day or navigate with the arrow keys; the date is committed the way it would be written — `Tuesday` for a date inside the next week, `March 23` for one later this year, `March 23 2027` for another year. Tapping a committed date re-opens the calendar on the month that text names now — for a weekday name, that is the next such day, not the one originally picked.
21
22
  - **Option overrides** — inject or dynamically generate client-side options per suggestion type
22
23
  - **Product strip (opt-in)** — plug in any platform's product search and the dropdown renders a horizontal row of product cards below the options; the SDK owns the UI, your integration owns only `fetch` and `transform`
23
24
  - **Controlled & uncontrolled** — works out of the box or integrates with external state, including **Reactive Forms** via `ControlValueAccessor`
24
25
  - **Imperative handle** — `focus()`, `blur()`, `reset()`, and `setMode()` via `@ViewChild`
25
26
  - **Accessible** — ARIA combobox 1.2 pattern with `role="listbox"`, `aria-activedescendant`
26
- - **Animations** — option selection streak animation, text shimmer on newly added params
27
+ - **Animations** — option press (the picked option compresses while the rest step back), text shimmer on newly added params
27
28
  - **Loading skeleton** — while a fetch is in flight, the dropdown and inline pills keep the previous layout (same count and widths) with their text masked and a shimmer pulse
28
29
  - **Lightweight** — styles bundled via ng-packagr; no global style import required
29
30
  - **TypeScript first** — full type definitions shipped with the package
@@ -171,6 +172,87 @@ After a completed param is added (by any means — option click, exact-match typ
171
172
 
172
173
  ---
173
174
 
175
+ ### Datepicker
176
+
177
+ When the next parameter is a date, the dropdown shows a calendar instead of a
178
+ list of options. A parameter counts as a date when its name says so, or when at
179
+ least three of the options it offers are themselves written as dates — so a
180
+ parameter called `when` or `arrival` still gets a calendar. Options written as
181
+ relative phrases (`today`, `next week`) are not read as dates; a parameter
182
+ offering those needs a name that says date.
183
+
184
+ Nothing is required to switch it on — a date parameter renders this way
185
+ automatically, and every other parameter is unaffected. Tier 1 and Tier 2
186
+ render the calendar for you; in Tier 3 the same data reaches `dropdown$` so you
187
+ can render your own (see [Tier 3](#tier-3-headless)).
188
+
189
+ **What the user can do**
190
+
191
+ | Input | Result |
192
+ |---|---|
193
+ | Click a day | Commits that date |
194
+ | <kbd>↓</kbd> | Moves into the calendar, starting on today |
195
+ | <kbd>←</kbd> / <kbd>→</kbd> | Previous / next day, crossing week boundaries |
196
+ | <kbd>↑</kbd> / <kbd>↓</kbd> | Previous / next week. Past either end of the month, focus returns to the input |
197
+ | <kbd>Enter</kbd> | Commits the highlighted day |
198
+ | Month arrows | Page the calendar. Paging never commits anything |
199
+ | <kbd>→</kbd> at the end of the input | Skips the parameter, same as any other pill |
200
+
201
+ **The committed value** is written the way a person would write it, always in
202
+ English regardless of the visitor's locale, so the value you receive has one
203
+ vocabulary everywhere:
204
+
205
+ - a date inside the next week (today included) commits as its weekday name —
206
+ `Tuesday`. Like the sentence it sits in, that name is relative: read later,
207
+ it means the next such day;
208
+ - one further out in the current year as `MONTH DAY` — `March 23`;
209
+ - one in another year as `MONTH DAY YEAR` — `March 23 2027`.
210
+
211
+ It arrives as an ordinary completed parameter: bold in the input,
212
+ and present in `completed_params` on submit like any other answer.
213
+
214
+ **Re-editing** a committed date re-opens the calendar on the month the committed
215
+ text names, with that day marked, so changing an answer takes one click. For a
216
+ weekday name that reading is relative, so once the day it named has gone by,
217
+ re-editing marks the next such day rather than the one originally picked — the
218
+ calendar shows what the sentence says today, which is also what gets submitted.
219
+
220
+ **Reading the value back.** The date arrives as text, so if you need a `Date`
221
+ object, `parseDate` is exported for it:
222
+
223
+ ```ts
224
+ import { parseDate } from "@magicx-eng/ai-autocomplete-angular";
225
+
226
+ // Reads all three committed shapes: a weekday name is the one date it can
227
+ // mean in the next seven days, and a yearless month-day is the current year.
228
+ const due = parseDate("March 23"); // Date, or null if the text isn't one of ours
229
+ ```
230
+
231
+ `parseLooseDate` is exported too, for the looser shapes a person types into a
232
+ query — it reads `september 5th`, `5th September`, `Sept 5` and `2026-09-05`,
233
+ and answers `null` for anything ambiguous rather than guessing.
234
+
235
+ **Dates the user writes themselves.** When someone types a date into their query
236
+ — "fly to vegas on september 5th" — the parameter it answers is recognised in
237
+ place and the date becomes tappable. Tapping it opens the calendar on that
238
+ month with the day already marked, so confirming or changing it takes one tap,
239
+ and the picked date replaces their words with the canonical form.
240
+
241
+ The written date is read where it can be: `september 5th`, `5th September`,
242
+ `Sept 5`, `September 5, 2026` and `2026-09-05` all resolve, in any of those
243
+ orders and with or without the year (a date with no year means its next
244
+ occurrence). Two cases deliberately don't pre-select — a numeric date like
245
+ `09/05`, which is September 5th in the US and May 9th elsewhere with nothing to
246
+ say which, and phrases like `next friday`. Those still open the calendar, just
247
+ on the current month with nothing marked, so the user picks rather than being
248
+ shown a guess that might be wrong.
249
+
250
+ **Typing** while the calendar is open does not filter it. The text is treated as
251
+ a new query, so suggestions refresh as the user types — useful when someone
252
+ would rather describe what they want than pick a day.
253
+
254
+ ---
255
+
174
256
  ## Tier 2: Controller + Dropdown
175
257
 
176
258
  Drive state with the controller and render our dropdown; you own the input element and layout:
@@ -271,6 +353,8 @@ export class SearchComponent implements OnInit, OnDestroy {
271
353
 
272
354
  ---
273
355
 
356
+
357
+ > **Datepicker in a custom UI.** For a date parameter, `dd.formatType` is `"date"` and `dd.suggestions[0].options` holds that month's day cells. Each cell's `text` is the date it commits (`"March 23"`, or `"Tuesday"` inside the next week), so the list above already works — `selectOption(cell)` behaves exactly as it does for an option. To draw an actual calendar, read `dd.dateView` for the month on show, `cellDay(cell)` for the number to paint, and call `ac.showPreviousMonth()` / `ac.showNextMonth()` to page. Cells that pad the start and end of the month have `is_tappable: false`.
274
358
  ## Convenience NgModule
275
359
 
276
360
  For codebases that prefer the older NgModule pattern, an `AIAutocompleteModule` re-exports every public component and directive:
@@ -301,7 +385,7 @@ Standalone-first apps don't need this — import the components/directive direct
301
385
  | `pillPlacement` | `"inline" \| "dropdown" \| "hidden"` | `"dropdown"` | Where to render unfilled pills. `"hidden"` hides pills entirely. |
302
386
  | `mode` | `"light" \| "dark" \| "auto"` | `"auto"` | Color mode. `"auto"` follows `prefers-color-scheme`. |
303
387
  | `optionsPosition` | `"above" \| "below"` | `"below"` | Where the dropdown opens relative to the input. |
304
- | `animations` | `boolean` | `true` | Enable/disable all SDK animations (streak + shimmer). |
388
+ | `animations` | `boolean` | `true` | Enable/disable all SDK animations (press + shimmer, the typed-in starting-state placeholder, the option rows' staggered entrance, and the "more below" arrow's slide). `prefers-reduced-motion` also switches the last three off. |
305
389
  | `dropdownTrigger` | `"auto" \| "manual" \| "hidden"` | `"auto"` | When the dropdown appears. `"auto"` = when options available. `"manual"` = only on pill tap, closes after selection. `"hidden"` = never shows. |
306
390
  | `closeDropdownOnBlur` | `boolean` | `true` | When `true`, the dropdown closes if the input loses focus. Set to `false` to keep it open whenever options are available, regardless of focus. |
307
391
  | `showNonTappableOptions` | `boolean` | `true` | When `true`, non-tappable options are rendered alongside tappable ones in the dropdown. Set to `false` to hide non-tappable options entirely. |
@@ -543,7 +627,7 @@ Accepts the same shape as `<ai-autocomplete>`'s inputs (`apiConfig`, `additional
543
627
  | `editingAnchor$` | `Observable<number \| null>` | Plain-text offset where the edit region starts. |
544
628
  | `caretOffset$` | `Observable<number \| null>` | Live caret offset within the editor. |
545
629
  | `state$` | `Observable<AIAutocompleteControllerState>` | Composite snapshot of every public field. |
546
- | `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. |
630
+ | `dropdown$` | `Observable<AIAutocompleteDropdownState>` | Composite snapshot for the dropdown (suggestions, `activeIndex`, `isOpen`, pills, `optionsPosition`, `formatType`, `dateView`, …). Bound to `<ai-autocomplete-dropdown>`, or subscribe directly to render your own dropdown in Tier 3. For a date parameter, `formatType` is `"date"` and `suggestions[0].options` holds that month's day cells — each cell's `text` is the date it commits, and cells padding the start/end of the month have `is_tappable: false`. See [Datepicker](#datepicker). |
547
631
 
548
632
  Every observable is gated by `distinctUntilChanged` + `shareReplay({ bufferSize: 1, refCount: true })`, so multiple `async`-pipe subscriptions share one upstream subscription and dedupe identical emissions.
549
633
 
@@ -555,6 +639,7 @@ Every observable is gated by `distinctUntilChanged` + `shareReplay({ bufferSize:
555
639
  | `selectOption(option)` | Pick a dropdown option (or replace the re-edited param if in re-edit mode). |
556
640
  | `selectProduct(product)` | Announce a product selection (fires `onProductSelect`). `<ai-autocomplete-dropdown>` calls this for you; hand-rolled strips call it themselves. Never navigates. |
557
641
  | `setActivePill(index)` | Promote the pill at `index` to active. |
642
+ | `showPreviousMonth()` / `showNextMonth()` | Page the calendar a month at a time; paging never commits anything. `<ai-autocomplete-dropdown>` wires its own month arrows to these, so you only need them for a hand-rolled calendar. No-ops unless the active parameter is a date. |
558
643
  | `skipActivePill()` | Skip the active pill — same action as → / the dropdown's skip button. Records it in `skippedParams$`; no-ops during re-edit and the post-selection window. Use it to drive a custom skip affordance (e.g. with `[showSkipButton]="false"`). Also exposed as a Tier 1 component method. |
559
644
  | `removeLastParam()` | Drop the last completed param's "completed" status. |
560
645
  | `clearNewParamId()` | Clear the shimmer-animation state. |
@@ -656,13 +741,17 @@ Override on the host element (via `class`). All defaults use `:where()` (zero sp
656
741
  | `--aia-submit-color` | `#ffffff` | `#000000` | Submit button icon color |
657
742
  | `--aia-dropdown-bg` | — | — | Optional bg color the dropdown's "glass" rim shadow tints toward. Set this to the page background behind the dropdown so the bottom-corner glow blends seamlessly. |
658
743
  | `--aia-scrollbar-thumb` | `rgba(0, 0, 0, 0.3)` | `rgba(0, 0, 0, 0.3)` | Color of the option list's scrollbar thumb (Firefox + WebKit). |
659
- | `--aia-streak-rgb` | `99, 102, 241` | `255, 255, 255` | Comma-separated RGB triplet used to tint the option-selection streak animation. |
660
- | `--aia-streak-glass-bg` | `rgba(99, 102, 241, 0.1)` | `rgba(255, 255, 255, 0.1)` | Background fill for the streak's glass-pill effect. |
744
+ | `--aia-streak-rgb` | `99, 102, 241` | `255, 255, 255` | Comma-separated RGB triplet tinting the datepicker's pressed cell, and its selected cell when `--aia-date-selected-bg` is unset. The today ring uses `--aia-date-today-ring`, not this. |
661
745
  | `--aia-product-card-width` | `116px` | `116px` | Width of a product card in the strip. The media tile is square, so this also sets its height. |
662
746
  | `--aia-product-gap` | `8px` | `8px` | Gap between product cards. |
663
747
  | `--aia-product-bg` | `transparent` | `transparent` | Product card background. |
664
748
  | `--aia-product-bg-active` | `--aia-option-bg` | `--aia-option-bg` | Product card background on hover. |
665
749
  | `--aia-product-media-bg` | `--aia-skeleton-bg` | `--aia-skeleton-bg` | Fill behind the product image, and of the placeholder tile when a product has no image. |
750
+ | `--aia-scroll-arrow-bg` | `--aia-surface` | `--aia-surface` | Fill of the "more below" arrow — the round button that rises at the bottom of the option list while there is more to scroll to. |
751
+ | `--aia-scroll-arrow-color` | `--aia-option-color` | `--aia-option-color` | Chevron color of the arrow (`--aia-scroll-arrow-color-hover` on hover). |
752
+ | `--aia-scroll-arrow-border` | `--aia-dropdown-border` | `--aia-dropdown-border` | Hairline around the arrow. |
753
+ | `--aia-scroll-arrow-shadow` | `0 2px 8px rgba(0,0,0,0.12)` | `0 2px 8px rgba(0,0,0,0.12)` | Elevation of the arrow. |
754
+ | `--aia-placeholder-fade` | `120ms` | `120ms` | Fade-out of the outgoing placeholder phrase when the starting-state placeholder changes (the incoming one types itself in). |
666
755
  | `--aia-product-placeholder-color` | `--aia-option-color` | `--aia-option-color` | Glyph color of the no-image placeholder tile. |
667
756
  | `--aia-product-title-color` | `--aia-option-color-selected` | `--aia-option-color-selected` | Product title text. Follows the option colors by default, so theming the panel moves suggestions and products together. |
668
757
  | `--aia-product-price-color` | `--aia-option-color-selected` | `--aia-option-color-selected` | Product price text. |
@@ -673,6 +762,14 @@ Override on the host element (via `class`). All defaults use `:where()` (zero sp
673
762
  | `--aia-product-price-font-size` | `11px` | `11px` | Product price font size. |
674
763
  | `--aia-product-vendor-font-size` | `10px` | `10px` | Product vendor font size. |
675
764
  | `--aia-products-label-font-size` | `11px` | `11px` | Section label font size. |
765
+ | `--aia-date-panel-width` | `312px` | `312px` | Max width of the whole dropdown panel while the calendar is up — the panel narrows to calendar size. |
766
+ | `--aia-date-cell-size` | `26px` | `26px` | Size of a day's square — the box that carries the highlight, the today ring and the selected fill. |
767
+ | `--aia-date-row-height` | `28px` | `28px` | Height of one week row. Lower it to fit a 6-week month in a shorter dropdown. |
768
+ | `--aia-date-cell-font-size` | `13px` | `13px` | Day-number font size. |
769
+ | `--aia-date-month-font-size` | `14px` | `14px` | Font size of the "March 2026" header. |
770
+ | `--aia-date-weekday-font-size` | `11px` | `11px` | Font size of the S/M/T/W/T/F/S column letters. |
771
+ | `--aia-date-today-ring` | `--aia-option-color` | `--aia-option-color` | Outline drawn around today's date. |
772
+ | `--aia-date-selected-bg` | white at 12% | white at 12% | Fill behind the date a re-edited parameter already holds. |
676
773
  | `--aia-skeleton-bg` | `rgba(189, 189, 189, 0.25)` | `#1a1b1d` | Fill color for the loading skeleton bars and masked text in cached pills/options. |
677
774
  | `--aia-footer-chip-bg` | `--aia-surface` at 65% | `--aia-surface` at 65% | Fill behind the footer's keyboard hint and AI-Autocomplete badge. The option list scrolls under the footer, so this keeps both legible over the row passing behind them. `transparent` on the glass surface. |
678
775
 
@@ -702,7 +799,13 @@ For styling beyond the CSS variables, target these stable `data-aia-*` attribute
702
799
  | `[data-aia-pill-scroll]` | Scrollable pill region inside the bar — carries the horizontal scroll and right-edge fade mask |
703
800
  | `[data-aia-skip]` | The pill bar's trailing "skip" button. Tune via `--aia-skip-font-size` / `--aia-skip-color` / `--aia-skip-color-hover` / `--aia-skip-hover-bg` |
704
801
  | `[data-aia-option]` | Each suggestion option |
802
+ | `[data-aia-scroll-arrow]` | The "more below" arrow on the dropdown — carries `data-aia-visible` while shown |
705
803
  | `[data-aia-dropdown]` | The dropdown root (listbox). Carries `data-aia-has-products` while the product strip has cards. |
804
+ | `[data-aia-datepicker]` | The calendar, rendered in place of the option list for a date parameter |
805
+ | `[data-aia-date-month]` | The "March 2026" header label |
806
+ | `[data-aia-date-prev]` / `[data-aia-date-next]` | The month arrows |
807
+ | `[data-aia-date-grid]` | The 7-column grid of day cells |
808
+ | `[data-aia-date-cell]` | Each day cell. Also carries `[data-aia-option]`, so option-level styling applies to both bodies |
706
809
  | `[data-aia-products]` | Product strip section (label + row) |
707
810
  | `[data-aia-products-row]` | The horizontally scrolling row of cards |
708
811
  | `[data-aia-product]` | Each product card |
@@ -727,11 +830,24 @@ Every `/api/suggest` request carries a `meta.session_id` UUID. A session runs fr
727
830
 
728
831
  The contract is simple: **after the user submits the query, call `reset()`**. That clears the input and rotates `session_id` so the next session begins clean.
729
832
 
730
- > **Why it matters:** the server uses `session_id` to track each session's history — what the user has been typing sequentially, which options they've selected, and how the query evolved. That context lets the model produce better, more relevant suggestions on subsequent requests within the same session.
833
+ > **Why it matters:** suggestions get sharper as a query develops. Each one
834
+ > takes account of what the user has already answered, so the parameters offered
835
+ > late in a query are shaped by the choices made early in it — that is what makes
836
+ > the experience feel guided rather than like a static list. `session_id` is what
837
+ > ties those requests together into one query.
838
+ >
839
+ > So `reset()` is not bookkeeping: it is how you say "that query is finished".
840
+ > Skip it and the next query is treated as a continuation of the last one, and
841
+ > its suggestions keep being shaped by answers the user has already moved on
842
+ > from — the failure is quiet, and shows up as steadily less relevant options
843
+ > rather than as an error.
731
844
 
732
845
  - **Tier 1 `<ai-autocomplete>`** does this automatically — it calls `reset()` for you after `submitted` fires, for both Enter-key and built-in-button submits.
733
846
  - **Tier 2 `AIAutocompleteController`** — you own the submit flow, so call `controller.reset()` from your `onSubmit` handler (see the Tier 2 example above) or from your custom button after firing your submit handler.
734
847
 
848
+ The id is a plain UUID. Log it next to your own request logs if you want to
849
+ correlate a user's report with the query that produced it.
850
+
735
851
  ## Option Overrides
736
852
 
737
853
  ```ts
@@ -351,7 +351,7 @@ AIAutocompleteComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0"
351
351
  useExisting: forwardRef(() => AIAutocompleteComponent),
352
352
  multi: true,
353
353
  },
354
- ], 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 [showSkipButton]=\"showSkipButton\"\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: rgba(231, 231, 231, .5);--aia-dropdown-shadow: 0 8px 12px rgba(0, 0, 0, .05);--aia-pill-bg: #bdbdbd;--aia-pill-color: #333539;--aia-pill-font-size: 16px;--aia-completed-pill-bg: rgba(189, 189, 189, .105);--aia-completed-pill-bg-active: rgba(189, 189, 189, .35);--aia-completed-pill-color: #000000;--aia-option-bg: #eef2ff;--aia-option-color: #1a1b1d;--aia-option-color-selected: #000000;--aia-option-font-size: 16px;--aia-written-text-color: #000000;--aia-written-text-font-size: 16px;--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, .25);--aia-streak-rgb: 99, 102, 241;--aia-streak-glass-bg: rgba(99, 102, 241, .1);--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: rgba(72, 72, 72, .5);--aia-dropdown-shadow: 0 8px 12px rgba(0, 0, 0, .05);--aia-pill-bg: #bdbdbd;--aia-pill-color: #b0b0b0;--aia-pill-font-size: 16px;--aia-completed-pill-bg: rgba(189, 189, 189, .15);--aia-completed-pill-bg-active: rgba(189, 189, 189, .35);--aia-completed-pill-color: #ffffff;--aia-option-bg: #323232;--aia-option-color: #e7e7e7;--aia-option-color-selected: #ffffff;--aia-option-font-size: 16px;--aia-written-text-color: #ffffff;--aia-written-text-font-size: 16px;--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: #1a1b1d;--aia-streak-rgb: 255, 255, 255;--aia-streak-glass-bg: rgba(255, 255, 255, .1);--aia-footer-hint-color: #b0b0b0;--aia-footer-brand-color: #505050;--aia-footer-badge-border: #505050}[data-aia-dropdown]{--aia-footer-row-height: 23px;--aia-footer-band: calc(var(--aia-footer-gap, 8px) + var(--aia-footer-row-height, 23px));--aia-grid-scroll-bottom: var(--aia-footer-band);--aia-grid-overlap-bottom: calc(-1 * (var(--aia-footer-band) + 8px));--aia-footer-fade-lead: 20px;--aia-footer-fade-inset: calc(-1 * var(--aia-footer-fade-lead)) 0 0}[data-aia-dropdown] [data-aia-pillbar] .aia-pill-list{padding-inline:10px}[data-aia-dropdown] [data-aia-pillbar] .aia-pill{justify-content:flex-start;border-inline-width:0;padding-inline:0}[data-aia-dropdown][data-aia-has-products]{--aia-grid-scroll-bottom: 0px;--aia-grid-overlap-bottom: 0px;--aia-grid-scroll-top: 0px;--aia-grid-overlap-top: 0px;--aia-footer-fade-lead: 0px}[data-aia-dropdown] .aia-grid[data-scroll]{padding-top:var(--aia-grid-scroll-top, 0);padding-bottom:var(--aia-grid-scroll-bottom, 0);margin-top:var(--aia-grid-overlap-top, 0);margin-bottom:var(--aia-grid-overlap-bottom, 0)}[data-aia-dropdown] [data-aia-footer]:before{content:\"\";position:absolute;inset:var(--aia-footer-fade-inset, -20px 0 0);z-index:-1;pointer-events:none;background:linear-gradient(to bottom,transparent,var(--aia-surface, #ffffff))}[data-aia-dropdown][data-aia-surface=glass]{--aia-footer-chip-bg: transparent}[data-aia-dropdown][data-aia-surface=glass] [data-aia-footer]:before{display:none}:where(.magicx-aia[data-options-position=\"above\"]) [data-aia-dropdown]{--aia-grid-scroll-bottom: 0px;--aia-grid-overlap-bottom: 0px;--aia-grid-scroll-top: var(--aia-footer-band);--aia-grid-overlap-top: calc(-1 * (var(--aia-footer-band) + 8px));--aia-footer-fade-inset: 0 0 calc(-1 * var(--aia-footer-fade-lead));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] [data-aia-footer]{padding:0 8px var(--aia-footer-gap, 8px)}:where(.magicx-aia[data-options-position=\"above\"]) [data-aia-dropdown] [data-aia-footer]:before{background:linear-gradient(to top,transparent,var(--aia-surface, #ffffff))}: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 16px;border:1px solid var(--aia-border, #b0b0b0);border-radius:20px;background:var(--aia-surface, #ffffff);box-shadow:var(--aia-shadow, none);overflow:hidden;display:flex;align-items:flex-start;gap:12px}.magicx-aia-editor-area{position:relative;flex:1;min-width:0;min-height:22px;line-height:var(--aia-editor-line-height, 1.9);font-family:inherit;font-size:var(--aia-written-text-font-size, 14px);white-space:pre-wrap;word-break:break-word;overflow-wrap:anywhere;max-height:var(--aia-editor-max-height, calc(var(--aia-editor-line-height, 1.9) * 5em));overflow-y:auto;scrollbar-width:none}.magicx-aia-editor-area::-webkit-scrollbar{display:none}.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[class~=magicx-aia-segment--completed]{display:inline;padding:3px 6px;border-radius:6px;-webkit-box-decoration-break:clone;box-decoration-break:clone;background:var(--aia-completed-pill-bg, rgba(189, 189, 189, .105));color:var(--aia-completed-pill-color, var(--aia-written-text-color, #fff));font-size:var(--aia-pill-font-size, 14px);font-weight:400;line-height:normal;white-space:normal;letter-spacing:var(--aia-completed-pill-tracking, -.02em);cursor:pointer;transition:background-color .15s ease}:where(.magicx-aia-input) strong[class~=magicx-aia-segment--completed]:hover{background:var(--aia-completed-pill-bg-active, rgba(189, 189, 189, .35))}:where(.magicx-aia-input) strong[class~=magicx-aia-segment--editing]{background:var(--aia-completed-pill-bg-active, rgba(189, 189, 189, .35));caret-color:transparent;cursor:text}.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-sweep]{animation:aiaPillReveal .4s cubic-bezier(.4,0,.2,1) forwards}@keyframes aiaPillReveal{0%{opacity: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", "showSkipButton", "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 });
354
+ ], 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 [showSkipButton]=\"showSkipButton\"\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: rgba(231, 231, 231, .5);--aia-dropdown-shadow: 0 8px 12px rgba(0, 0, 0, .05);--aia-pill-bg: #bdbdbd;--aia-pill-color: #333539;--aia-pill-font-size: 16px;--aia-completed-pill-bg: rgba(189, 189, 189, .105);--aia-completed-pill-bg-active: rgba(189, 189, 189, .35);--aia-completed-pill-color: #000000;--aia-option-bg: #eef2ff;--aia-option-color: #1a1b1d;--aia-option-color-selected: #000000;--aia-option-font-size: 16px;--aia-written-text-color: #000000;--aia-written-text-font-size: 16px;--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, .25);--aia-streak-rgb: 99, 102, 241;--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: rgba(72, 72, 72, .5);--aia-dropdown-shadow: 0 8px 12px rgba(0, 0, 0, .05);--aia-pill-bg: #bdbdbd;--aia-pill-color: #b0b0b0;--aia-pill-font-size: 16px;--aia-completed-pill-bg: rgba(189, 189, 189, .15);--aia-completed-pill-bg-active: rgba(189, 189, 189, .35);--aia-completed-pill-color: #ffffff;--aia-option-bg: #323232;--aia-option-color: #e7e7e7;--aia-option-color-selected: #ffffff;--aia-option-font-size: 16px;--aia-written-text-color: #ffffff;--aia-written-text-font-size: 16px;--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: #1a1b1d;--aia-streak-rgb: 255, 255, 255;--aia-footer-hint-color: #b0b0b0;--aia-footer-brand-color: #505050;--aia-footer-badge-border: #505050}[data-aia-dropdown]{--aia-footer-row-height: 23px;--aia-footer-band: calc(var(--aia-footer-gap, 8px) + var(--aia-footer-row-height, 23px));--aia-grid-scroll-bottom: var(--aia-footer-band);--aia-grid-overlap-bottom: calc(-1 * (var(--aia-footer-band) + 8px));--aia-footer-fade-lead: 20px;--aia-footer-fade-inset: calc(-1 * var(--aia-footer-fade-lead)) 0 0}[data-aia-dropdown] [data-aia-pillbar] .aia-pill-list{padding-inline:10px}[data-aia-dropdown] [data-aia-pillbar] .aia-pill{justify-content:flex-start;border-inline-width:0;padding-inline:0}[data-aia-dropdown][data-aia-has-products]{--aia-grid-scroll-bottom: 0px;--aia-grid-overlap-bottom: 0px;--aia-grid-scroll-top: 0px;--aia-grid-overlap-top: 0px;--aia-footer-fade-lead: 0px}[data-aia-dropdown] .aia-grid[data-scroll]{padding-top:var(--aia-grid-scroll-top, 0);padding-bottom:var(--aia-grid-scroll-bottom, 0);margin-top:var(--aia-grid-overlap-top, 0);margin-bottom:var(--aia-grid-overlap-bottom, 0)}[data-aia-dropdown] [data-aia-footer]:before{content:\"\";position:absolute;inset:var(--aia-footer-fade-inset, -20px 0 0);z-index:-1;pointer-events:none;background:linear-gradient(to bottom,transparent,var(--aia-surface, #ffffff))}[data-aia-dropdown][data-aia-surface=glass]{--aia-footer-chip-bg: transparent}[data-aia-dropdown][data-aia-surface=glass] [data-aia-footer]:before{display:none}:where(.magicx-aia[data-options-position=\"above\"]) [data-aia-dropdown]{--aia-grid-scroll-bottom: 0px;--aia-grid-overlap-bottom: 0px;--aia-grid-scroll-top: var(--aia-footer-band);--aia-grid-overlap-top: calc(-1 * (var(--aia-footer-band) + 8px));--aia-footer-fade-inset: 0 0 calc(-1 * var(--aia-footer-fade-lead));transform-origin:50% 100%;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] [data-aia-footer]{padding:0 0 var(--aia-footer-gap, 8px) 8px}:where(.magicx-aia[data-options-position=\"above\"]) [data-aia-dropdown] [data-aia-footer]:before{background:linear-gradient(to top,transparent,var(--aia-surface, #ffffff))}: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 16px;border:1px solid var(--aia-border, #b0b0b0);border-radius:20px;background:var(--aia-surface, #ffffff);box-shadow:var(--aia-shadow, none);overflow:hidden;display:flex;align-items:flex-start;gap:12px}.magicx-aia-editor-area{position:relative;flex:1;min-width:0;min-height:22px;line-height:var(--aia-editor-line-height, 1.9);font-family:inherit;font-size:var(--aia-written-text-font-size, 14px);white-space:pre-wrap;word-break:break-word;overflow-wrap:anywhere;max-height:var(--aia-editor-max-height, calc(var(--aia-editor-line-height, 1.9) * 5em));overflow-y:auto;scrollbar-width:none}.magicx-aia-editor-area::-webkit-scrollbar{display:none}.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[class~=magicx-aia-segment--completed]{display:inline;padding:3px 6px;border-radius:6px;-webkit-box-decoration-break:clone;box-decoration-break:clone;background:var(--aia-completed-pill-bg, rgba(189, 189, 189, .105));color:var(--aia-completed-pill-color, var(--aia-written-text-color, #fff));font-size:var(--aia-pill-font-size, 14px);font-weight:400;line-height:normal;white-space:normal;letter-spacing:var(--aia-completed-pill-tracking, -.02em);cursor:pointer;transition:background-color .15s ease}:where(.magicx-aia-input) strong[class~=magicx-aia-segment--completed]:hover{background:var(--aia-completed-pill-bg-active, rgba(189, 189, 189, .35))}:where(.magicx-aia-input) strong[class~=magicx-aia-segment--editing]{background:var(--aia-completed-pill-bg-active, rgba(189, 189, 189, .35));caret-color:transparent;cursor:text}.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;transition:opacity var(--aia-placeholder-fade, .12s) ease-out}.magicx-aia-input[data-aia-placeholder-leaving]:before{opacity:0}@media (prefers-reduced-motion: reduce){.magicx-aia-input[data-aia-empty=true][data-placeholder]:before{transition-duration:0s}}.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-sweep]{animation:aiaPillReveal .4s cubic-bezier(.4,0,.2,1) forwards}@keyframes aiaPillReveal{0%{opacity:0}}@media (min-width: 769px){[data-aia-dropdown] [data-aia-footer]:before,[data-aia-dropdown][data-options-position=above] [data-aia-footer]:before,:where(.magicx-aia[data-options-position=\"above\"]) [data-aia-dropdown] [data-aia-footer]:before{inset:0;background:var(--aia-surface, #ffffff)}}\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", "showSkipButton", "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 });
355
355
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: AIAutocompleteComponent, decorators: [{
356
356
  type: Component,
357
357
  args: [{ selector: "ai-autocomplete", standalone: true, imports: [
@@ -367,7 +367,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImpo
367
367
  useExisting: forwardRef(() => AIAutocompleteComponent),
368
368
  multi: true,
369
369
  },
370
- ], 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 [showSkipButton]=\"showSkipButton\"\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: rgba(231, 231, 231, .5);--aia-dropdown-shadow: 0 8px 12px rgba(0, 0, 0, .05);--aia-pill-bg: #bdbdbd;--aia-pill-color: #333539;--aia-pill-font-size: 16px;--aia-completed-pill-bg: rgba(189, 189, 189, .105);--aia-completed-pill-bg-active: rgba(189, 189, 189, .35);--aia-completed-pill-color: #000000;--aia-option-bg: #eef2ff;--aia-option-color: #1a1b1d;--aia-option-color-selected: #000000;--aia-option-font-size: 16px;--aia-written-text-color: #000000;--aia-written-text-font-size: 16px;--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, .25);--aia-streak-rgb: 99, 102, 241;--aia-streak-glass-bg: rgba(99, 102, 241, .1);--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: rgba(72, 72, 72, .5);--aia-dropdown-shadow: 0 8px 12px rgba(0, 0, 0, .05);--aia-pill-bg: #bdbdbd;--aia-pill-color: #b0b0b0;--aia-pill-font-size: 16px;--aia-completed-pill-bg: rgba(189, 189, 189, .15);--aia-completed-pill-bg-active: rgba(189, 189, 189, .35);--aia-completed-pill-color: #ffffff;--aia-option-bg: #323232;--aia-option-color: #e7e7e7;--aia-option-color-selected: #ffffff;--aia-option-font-size: 16px;--aia-written-text-color: #ffffff;--aia-written-text-font-size: 16px;--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: #1a1b1d;--aia-streak-rgb: 255, 255, 255;--aia-streak-glass-bg: rgba(255, 255, 255, .1);--aia-footer-hint-color: #b0b0b0;--aia-footer-brand-color: #505050;--aia-footer-badge-border: #505050}[data-aia-dropdown]{--aia-footer-row-height: 23px;--aia-footer-band: calc(var(--aia-footer-gap, 8px) + var(--aia-footer-row-height, 23px));--aia-grid-scroll-bottom: var(--aia-footer-band);--aia-grid-overlap-bottom: calc(-1 * (var(--aia-footer-band) + 8px));--aia-footer-fade-lead: 20px;--aia-footer-fade-inset: calc(-1 * var(--aia-footer-fade-lead)) 0 0}[data-aia-dropdown] [data-aia-pillbar] .aia-pill-list{padding-inline:10px}[data-aia-dropdown] [data-aia-pillbar] .aia-pill{justify-content:flex-start;border-inline-width:0;padding-inline:0}[data-aia-dropdown][data-aia-has-products]{--aia-grid-scroll-bottom: 0px;--aia-grid-overlap-bottom: 0px;--aia-grid-scroll-top: 0px;--aia-grid-overlap-top: 0px;--aia-footer-fade-lead: 0px}[data-aia-dropdown] .aia-grid[data-scroll]{padding-top:var(--aia-grid-scroll-top, 0);padding-bottom:var(--aia-grid-scroll-bottom, 0);margin-top:var(--aia-grid-overlap-top, 0);margin-bottom:var(--aia-grid-overlap-bottom, 0)}[data-aia-dropdown] [data-aia-footer]:before{content:\"\";position:absolute;inset:var(--aia-footer-fade-inset, -20px 0 0);z-index:-1;pointer-events:none;background:linear-gradient(to bottom,transparent,var(--aia-surface, #ffffff))}[data-aia-dropdown][data-aia-surface=glass]{--aia-footer-chip-bg: transparent}[data-aia-dropdown][data-aia-surface=glass] [data-aia-footer]:before{display:none}:where(.magicx-aia[data-options-position=\"above\"]) [data-aia-dropdown]{--aia-grid-scroll-bottom: 0px;--aia-grid-overlap-bottom: 0px;--aia-grid-scroll-top: var(--aia-footer-band);--aia-grid-overlap-top: calc(-1 * (var(--aia-footer-band) + 8px));--aia-footer-fade-inset: 0 0 calc(-1 * var(--aia-footer-fade-lead));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] [data-aia-footer]{padding:0 8px var(--aia-footer-gap, 8px)}:where(.magicx-aia[data-options-position=\"above\"]) [data-aia-dropdown] [data-aia-footer]:before{background:linear-gradient(to top,transparent,var(--aia-surface, #ffffff))}: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 16px;border:1px solid var(--aia-border, #b0b0b0);border-radius:20px;background:var(--aia-surface, #ffffff);box-shadow:var(--aia-shadow, none);overflow:hidden;display:flex;align-items:flex-start;gap:12px}.magicx-aia-editor-area{position:relative;flex:1;min-width:0;min-height:22px;line-height:var(--aia-editor-line-height, 1.9);font-family:inherit;font-size:var(--aia-written-text-font-size, 14px);white-space:pre-wrap;word-break:break-word;overflow-wrap:anywhere;max-height:var(--aia-editor-max-height, calc(var(--aia-editor-line-height, 1.9) * 5em));overflow-y:auto;scrollbar-width:none}.magicx-aia-editor-area::-webkit-scrollbar{display:none}.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[class~=magicx-aia-segment--completed]{display:inline;padding:3px 6px;border-radius:6px;-webkit-box-decoration-break:clone;box-decoration-break:clone;background:var(--aia-completed-pill-bg, rgba(189, 189, 189, .105));color:var(--aia-completed-pill-color, var(--aia-written-text-color, #fff));font-size:var(--aia-pill-font-size, 14px);font-weight:400;line-height:normal;white-space:normal;letter-spacing:var(--aia-completed-pill-tracking, -.02em);cursor:pointer;transition:background-color .15s ease}:where(.magicx-aia-input) strong[class~=magicx-aia-segment--completed]:hover{background:var(--aia-completed-pill-bg-active, rgba(189, 189, 189, .35))}:where(.magicx-aia-input) strong[class~=magicx-aia-segment--editing]{background:var(--aia-completed-pill-bg-active, rgba(189, 189, 189, .35));caret-color:transparent;cursor:text}.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-sweep]{animation:aiaPillReveal .4s cubic-bezier(.4,0,.2,1) forwards}@keyframes aiaPillReveal{0%{opacity:0}}\n"] }]
370
+ ], 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 [showSkipButton]=\"showSkipButton\"\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: rgba(231, 231, 231, .5);--aia-dropdown-shadow: 0 8px 12px rgba(0, 0, 0, .05);--aia-pill-bg: #bdbdbd;--aia-pill-color: #333539;--aia-pill-font-size: 16px;--aia-completed-pill-bg: rgba(189, 189, 189, .105);--aia-completed-pill-bg-active: rgba(189, 189, 189, .35);--aia-completed-pill-color: #000000;--aia-option-bg: #eef2ff;--aia-option-color: #1a1b1d;--aia-option-color-selected: #000000;--aia-option-font-size: 16px;--aia-written-text-color: #000000;--aia-written-text-font-size: 16px;--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, .25);--aia-streak-rgb: 99, 102, 241;--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: rgba(72, 72, 72, .5);--aia-dropdown-shadow: 0 8px 12px rgba(0, 0, 0, .05);--aia-pill-bg: #bdbdbd;--aia-pill-color: #b0b0b0;--aia-pill-font-size: 16px;--aia-completed-pill-bg: rgba(189, 189, 189, .15);--aia-completed-pill-bg-active: rgba(189, 189, 189, .35);--aia-completed-pill-color: #ffffff;--aia-option-bg: #323232;--aia-option-color: #e7e7e7;--aia-option-color-selected: #ffffff;--aia-option-font-size: 16px;--aia-written-text-color: #ffffff;--aia-written-text-font-size: 16px;--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: #1a1b1d;--aia-streak-rgb: 255, 255, 255;--aia-footer-hint-color: #b0b0b0;--aia-footer-brand-color: #505050;--aia-footer-badge-border: #505050}[data-aia-dropdown]{--aia-footer-row-height: 23px;--aia-footer-band: calc(var(--aia-footer-gap, 8px) + var(--aia-footer-row-height, 23px));--aia-grid-scroll-bottom: var(--aia-footer-band);--aia-grid-overlap-bottom: calc(-1 * (var(--aia-footer-band) + 8px));--aia-footer-fade-lead: 20px;--aia-footer-fade-inset: calc(-1 * var(--aia-footer-fade-lead)) 0 0}[data-aia-dropdown] [data-aia-pillbar] .aia-pill-list{padding-inline:10px}[data-aia-dropdown] [data-aia-pillbar] .aia-pill{justify-content:flex-start;border-inline-width:0;padding-inline:0}[data-aia-dropdown][data-aia-has-products]{--aia-grid-scroll-bottom: 0px;--aia-grid-overlap-bottom: 0px;--aia-grid-scroll-top: 0px;--aia-grid-overlap-top: 0px;--aia-footer-fade-lead: 0px}[data-aia-dropdown] .aia-grid[data-scroll]{padding-top:var(--aia-grid-scroll-top, 0);padding-bottom:var(--aia-grid-scroll-bottom, 0);margin-top:var(--aia-grid-overlap-top, 0);margin-bottom:var(--aia-grid-overlap-bottom, 0)}[data-aia-dropdown] [data-aia-footer]:before{content:\"\";position:absolute;inset:var(--aia-footer-fade-inset, -20px 0 0);z-index:-1;pointer-events:none;background:linear-gradient(to bottom,transparent,var(--aia-surface, #ffffff))}[data-aia-dropdown][data-aia-surface=glass]{--aia-footer-chip-bg: transparent}[data-aia-dropdown][data-aia-surface=glass] [data-aia-footer]:before{display:none}:where(.magicx-aia[data-options-position=\"above\"]) [data-aia-dropdown]{--aia-grid-scroll-bottom: 0px;--aia-grid-overlap-bottom: 0px;--aia-grid-scroll-top: var(--aia-footer-band);--aia-grid-overlap-top: calc(-1 * (var(--aia-footer-band) + 8px));--aia-footer-fade-inset: 0 0 calc(-1 * var(--aia-footer-fade-lead));transform-origin:50% 100%;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] [data-aia-footer]{padding:0 0 var(--aia-footer-gap, 8px) 8px}:where(.magicx-aia[data-options-position=\"above\"]) [data-aia-dropdown] [data-aia-footer]:before{background:linear-gradient(to top,transparent,var(--aia-surface, #ffffff))}: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 16px;border:1px solid var(--aia-border, #b0b0b0);border-radius:20px;background:var(--aia-surface, #ffffff);box-shadow:var(--aia-shadow, none);overflow:hidden;display:flex;align-items:flex-start;gap:12px}.magicx-aia-editor-area{position:relative;flex:1;min-width:0;min-height:22px;line-height:var(--aia-editor-line-height, 1.9);font-family:inherit;font-size:var(--aia-written-text-font-size, 14px);white-space:pre-wrap;word-break:break-word;overflow-wrap:anywhere;max-height:var(--aia-editor-max-height, calc(var(--aia-editor-line-height, 1.9) * 5em));overflow-y:auto;scrollbar-width:none}.magicx-aia-editor-area::-webkit-scrollbar{display:none}.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[class~=magicx-aia-segment--completed]{display:inline;padding:3px 6px;border-radius:6px;-webkit-box-decoration-break:clone;box-decoration-break:clone;background:var(--aia-completed-pill-bg, rgba(189, 189, 189, .105));color:var(--aia-completed-pill-color, var(--aia-written-text-color, #fff));font-size:var(--aia-pill-font-size, 14px);font-weight:400;line-height:normal;white-space:normal;letter-spacing:var(--aia-completed-pill-tracking, -.02em);cursor:pointer;transition:background-color .15s ease}:where(.magicx-aia-input) strong[class~=magicx-aia-segment--completed]:hover{background:var(--aia-completed-pill-bg-active, rgba(189, 189, 189, .35))}:where(.magicx-aia-input) strong[class~=magicx-aia-segment--editing]{background:var(--aia-completed-pill-bg-active, rgba(189, 189, 189, .35));caret-color:transparent;cursor:text}.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;transition:opacity var(--aia-placeholder-fade, .12s) ease-out}.magicx-aia-input[data-aia-placeholder-leaving]:before{opacity:0}@media (prefers-reduced-motion: reduce){.magicx-aia-input[data-aia-empty=true][data-placeholder]:before{transition-duration:0s}}.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-sweep]{animation:aiaPillReveal .4s cubic-bezier(.4,0,.2,1) forwards}@keyframes aiaPillReveal{0%{opacity:0}}@media (min-width: 769px){[data-aia-dropdown] [data-aia-footer]:before,[data-aia-dropdown][data-options-position=above] [data-aia-footer]:before,:where(.magicx-aia[data-options-position=\"above\"]) [data-aia-dropdown] [data-aia-footer]:before{inset:0;background:var(--aia-surface, #ffffff)}}\n"] }]
371
371
  }], propDecorators: { apiConfig: [{
372
372
  type: Input
373
373
  }], additionalContext: [{
@@ -444,4 +444,4 @@ function resolveInitialMode(mode) {
444
444
  return "dark";
445
445
  return window.matchMedia("(prefers-color-scheme: dark)").matches ? "dark" : "light";
446
446
  }
447
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWktYXV0b2NvbXBsZXRlLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9saWIvYWktYXV0b2NvbXBsZXRlL2FpLWF1dG9jb21wbGV0ZS5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi9zcmMvbGliL2FpLWF1dG9jb21wbGV0ZS9haS1hdXRvY29tcGxldGUuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFlBQVksRUFBRSxpQkFBaUIsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQ2xFLE9BQU8sRUFFTCx1QkFBdUIsRUFDdkIsaUJBQWlCLEVBQ2pCLFNBQVMsRUFFVCxZQUFZLEVBQ1osVUFBVSxFQUNWLEtBQUssRUFDTCxNQUFNLEVBQ04sTUFBTSxFQUlOLE1BQU0sRUFDTixXQUFXLEVBR1gsU0FBUyxFQUNULGlCQUFpQixHQUNsQixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQTZCLGlCQUFpQixFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDOUUsT0FBTyxFQUlMLGlCQUFpQixFQUVqQixnQkFBZ0IsRUFDaEIsY0FBYyxFQUlkLGVBQWUsR0FDaEIsTUFBTSxxQ0FBcUMsQ0FBQztBQUM3QyxPQUFPLEVBQUUsK0JBQStCLEVBQUUsTUFBTSxnRUFBZ0UsQ0FBQztBQUNqSCxPQUFPLEVBQUUsd0JBQXdCLEVBQUUsTUFBTSwwQ0FBMEMsQ0FBQztBQUNwRixPQUFPLEVBQUUsaUNBQWlDLEVBQUUsTUFBTSwrQ0FBK0MsQ0FBQztBQUNsRyxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSwyQ0FBMkMsQ0FBQztBQUM5RSxPQUFPLEVBQUUscUJBQXFCLEVBQUUsTUFBTSxtREFBbUQsQ0FBQzs7O0FBRTFGOzs7Ozs7O0dBT0c7QUF3QkgsTUFBTSxPQUFPLHVCQUF1QjtJQXZCcEM7UUFxQ1csc0JBQWlCLEdBQUcsS0FBSyxDQUFDO1FBRW5DLHdEQUF3RDtRQUMvQyxr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QUFNO2dCQUNZLE9BQU87c0JBQXpCLE1BQU07Z0JBTVksYUFBYTtzQkFBL0IsTUFBTTtnQkFJbUMsWUFBWTtzQkFBckQsU0FBUzt1QkFBQyxXQUFXLEVBQUUsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFO2dCQUNBLFNBQVM7c0JBQWhELFNBQVM7dUJBQUMsUUFBUSxFQUFFLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRTtnQkFDVixnQkFBZ0I7c0JBQTNDLFNBQVM7dUJBQUMsZUFBZTs7QUE4VTVCLFNBQVMsSUFBSTtJQUNYLG1DQUFtQztBQUNyQyxDQUFDO0FBRUQ7Ozs7O0dBS0c7QUFDSCxTQUFTLGtCQUFrQixDQUFDLElBQW9CO0lBQzlDLElBQUksSUFBSSxLQUFLLE1BQU07UUFBRSxPQUFPLElBQUksQ0FBQztJQUNqQyxJQUFJLE9BQU8sTUFBTSxLQUFLLFdBQVc7UUFBRSxPQUFPLE1BQU0sQ0FBQztJQUNqRCxPQUFPLE1BQU0sQ0FBQyxVQUFVLENBQUMsOEJBQThCLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDO0FBQ3RGLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21tb25Nb2R1bGUsIGlzUGxhdGZvcm1Ccm93c2VyIH0gZnJvbSBcIkBhbmd1bGFyL2NvbW1vblwiO1xuaW1wb3J0IHtcbiAgdHlwZSBBZnRlclZpZXdJbml0LFxuICBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSxcbiAgQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gIENvbXBvbmVudCxcbiAgdHlwZSBFbGVtZW50UmVmLFxuICBFdmVudEVtaXR0ZXIsXG4gIGZvcndhcmRSZWYsXG4gIElucHV0LFxuICBpbmplY3QsXG4gIE5nWm9uZSxcbiAgdHlwZSBPbkNoYW5nZXMsXG4gIHR5cGUgT25EZXN0cm95LFxuICB0eXBlIE9uSW5pdCxcbiAgT3V0cHV0LFxuICBQTEFURk9STV9JRCxcbiAgdHlwZSBTaW1wbGVDaGFuZ2VzLFxuICB0eXBlIFRlbXBsYXRlUmVmLFxuICBWaWV3Q2hpbGQsXG4gIFZpZXdFbmNhcHN1bGF0aW9uLFxufSBmcm9tIFwiQGFuZ3VsYXIvY29yZVwiO1xuaW1wb3J0IHsgdHlwZSBDb250cm9sVmFsdWVBY2Nlc3NvciwgTkdfVkFMVUVfQUNDRVNTT1IgfSBmcm9tIFwiQGFuZ3VsYXIvZm9ybXNcIjtcbmltcG9ydCB7XG4gIHR5cGUgQVBJQ29uZmlnLFxuICB0eXBlIEFwcGVhcmFuY2VNb2RlLFxuICB0eXBlIEF1dG9jb21wbGV0ZVJlc3VsdCxcbiAgYnVpbGRTdWJtaXRSZXN1bHQsXG4gIHR5cGUgQ29tcGxldGVkUGFyYW1TdGF0ZSxcbiAgZXh0cmFjdFBsYWluVGV4dCxcbiAgTW9kZUNvbnRyb2xsZXIsXG4gIHR5cGUgT3B0aW9uT3ZlcnJpZGVzLFxuICB0eXBlIFByb2R1Y3QsXG4gIHR5cGUgUHJvZHVjdHNDb25maWcsXG4gIHNldEN1cnNvck9mZnNldCxcbn0gZnJvbSBcIkBtYWdpY3gtZW5nL2FpLWF1dG9jb21wbGV0ZS12YW5pbGxhXCI7XG5pbXBvcnQgeyBBSUF1dG9jb21wbGV0ZURyb3Bkb3duQ29tcG9uZW50IH0gZnJvbSBcIi4uL2FpLWF1dG9jb21wbGV0ZS1kcm9wZG93bi9haS1hdXRvY29tcGxldGUtZHJvcGRvd24uY29tcG9uZW50XCI7XG5pbXBvcnQgeyBBSUF1dG9jb21wbGV0ZUNvbnRyb2xsZXIgfSBmcm9tIFwiLi4vY29udHJvbGxlci9haS1hdXRvY29tcGxldGUuY29udHJvbGxlclwiO1xuaW1wb3J0IHsgQUlBdXRvY29tcGxldGVFZGl0b3JIb3N0RGlyZWN0aXZlIH0gZnJvbSBcIi4uL2ludGVybmFsL2VkaXRvci1ob3N0L2VkaXRvci1ob3N0LmRpcmVjdGl2ZVwiO1xuaW1wb3J0IHsgUGlsbExpc3RDb21wb25lbnQgfSBmcm9tIFwiLi4vaW50ZXJuYWwvcGlsbC1saXN0L3BpbGwtbGlzdC5jb21wb25lbnRcIjtcbmltcG9ydCB7IFN1Ym1pdEJ1dHRvbkNvbXBvbmVudCB9IGZyb20gXCIuLi9pbnRlcm5hbC9zdWJtaXQtYnV0dG9uL3N1Ym1pdC1idXR0b24uY29tcG9uZW50XCI7XG5cbi8qKlxuICogVGllciAxIGNvbXBvbmVudCDigJQgYDxhaS1hdXRvY29tcGxldGU+YC4gVGhlIEFuZ3VsYXIgZXF1aXZhbGVudCBvZiBSZWFjdCdzXG4gKiBgPEFJQXV0b2NvbXBsZXRlIC8+YC4gT3ducyB0aGUgY29udGVudEVkaXRhYmxlIGVkaXRvciwgaW5saW5lIHBpbGxzLCBtb2RlXG4gKiBjb250cm9sbGVyLCBzdWJtaXQgYnV0dG9uIHNsb3QsIGFuZCBhbiBlbWJlZGRlZFxuICoge0BsaW5rIEFJQXV0b2NvbXBsZXRlQ29udHJvbGxlcn0gdGhhdCBkcml2ZXMgdGhlIGRyb3Bkb3duLlxuICpcbiAqIEBwdWJsaWNcbiAqL1xuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiBcImFpLWF1dG9jb21wbGV0ZVwiLFxuICBzdGFuZGFsb25lOiB0cnVlLFxuICBpbXBvcnRzOiBbXG4gICAgQ29tbW9uTW9kdWxlLFxuICAgIEFJQXV0b2NvbXBsZXRlRHJvcGRvd25Db21wb25lbnQsXG4gICAgQUlBdXRvY29tcGxldGVFZGl0b3JIb3N0RGlyZWN0aXZlLFxuICAgIFBpbGxMaXN0Q29tcG9uZW50LFxuICAgIFN1Ym1pdEJ1dHRvbkNvbXBvbmVudCxcbiAgXSxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG4gIGVuY2Fwc3VsYXRpb246IFZpZXdFbmNhcHN1bGF0aW9uLk5vbmUsXG4gIHRlbXBsYXRlVXJsOiBcIi4vYWktYXV0b2NvbXBsZXRlLmNvbXBvbmVudC5odG1sXCIsXG4gIHN0eWxlVXJsczogW1wiLi9haS1hdXRvY29tcGxldGUuY29tcG9uZW50LmNzc1wiXSxcbiAgcHJvdmlkZXJzOiBbXG4gICAge1xuICAgICAgcHJvdmlkZTogTkdfVkFMVUVfQUNDRVNTT1IsXG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVzZS1iZWZvcmUtZGVmaW5lXG4gICAgICB1c2VFeGlzdGluZzogZm9yd2FyZFJlZigoKSA9PiBBSUF1dG9jb21wbGV0ZUNvbXBvbmVudCksXG4gICAgICBtdWx0aTogdHJ1ZSxcbiAgICB9LFxuICBdLFxufSlcbmV4cG9ydCBjbGFzcyBBSUF1dG9jb21wbGV0ZUNvbXBvbmVudFxuICBpbXBsZW1lbnRzIE9uSW5pdCwgQWZ0ZXJWaWV3SW5pdCwgT25DaGFuZ2VzLCBPbkRlc3Ryb3ksIENvbnRyb2xWYWx1ZUFjY2Vzc29yXG57XG4gIC8vID09PSBJbnB1dHMgKG1pcnJvcnMgUmVhY3QncyBBSUF1dG9jb21wbGV0ZVByb3BzKSA9PT1cblxuICBASW5wdXQoKSBhcGlDb25maWc/OiBBUElDb25maWc7XG4gIC8qKlxuICAgKiBPcHRpb25hbCB1c2VyIGNvbnRleHQuIEluY2x1ZGUgd2hhdGV2ZXIgeW91IGtub3cgYWJvdXQgdGhlIHVzZXIg4oCUIGFcbiAgICogcHJvZmlsZSwgcHJlZmVyZW5jZXMsIHdvcmtzcGFjZSwgYW55dGhpbmcg4oCUIHRvIHBlcnNvbmFsaXplIHN1Z2dlc3RlZFxuICAgKiBwYXJhbWV0ZXJzIGFuZCBvcHRpb25zIHRvIHRoZW0uIEJpbmQgYSBzdGFibGUgcmVmZXJlbmNlOyB0aGUgc2FtZSBzd2FwXG4gICAqIHJ1bGUgdGhhdCBhcHBsaWVzIHRvIGBhcGlDb25maWdgIGFwcGxpZXMgaGVyZS5cbiAgICovXG4gIEBJbnB1dCgpIGFkZGl0aW9uYWxDb250ZXh0PzogUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gIEBJbnB1dCgpIG9wdGlvbk92ZXJyaWRlcz86IE9wdGlvbk92ZXJyaWRlcztcbiAgQElucHV0KCkgbWFza0NvbXBsZXRlZFRleHQgPSBmYWxzZTtcbiAgQElucHV0KCkgY29sdW1ucz86IG51bWJlcjtcbiAgLyoqIFdoZXJlIHVuZmlsbGVkIHBpbGxzIHJlbmRlci4gRGVmYXVsdDogXCJkcm9wZG93blwiLiAqL1xuICBASW5wdXQoKSBwaWxsUGxhY2VtZW50OiBcImlubGluZVwiIHwgXCJkcm9wZG93blwiIHwgXCJoaWRkZW5cIiA9IFwiZHJvcGRvd25cIjtcbiAgLyoqIENvbG9yIG1vZGUuIFwiYXV0b1wiIGZvbGxvd3MgcHJlZmVycy1jb2xvci1zY2hlbWUuIERlZmF1bHQ6IFwiYXV0b1wiLiAqL1xuICBASW5wdXQoKSBtb2RlOiBBcHBlYXJhbmNlTW9kZSA9IFwiYXV0b1wiO1xuICBASW5wdXQoKSBvcHRpb25zUG9zaXRpb246IFwiYWJvdmVcIiB8IFwiYmVsb3dcIiA9IFwiYmVsb3dcIjtcbiAgQElucHV0KCkgYW5pbWF0aW9ucyA9IHRydWU7XG4gIEBJbnB1dCgpIGRyb3Bkb3duVHJpZ2dlcj86IFwiYXV0b1wiIHwgXCJtYW51YWxcIiB8IFwiaGlkZGVuXCI7XG4gIEBJbnB1dCgpIGNsb3NlRHJvcGRvd25PbkJsdXI/OiBib29sZWFuO1xuICBASW5wdXQoKSBzaG93Tm9uVGFwcGFibGVPcHRpb25zPzogYm9vbGVhbjtcbiAgLyoqXG4gICAqIFdoZW4gdHJ1ZSAoZGVmYXVsdCksIHRoZSBkcm9wZG93bidzIHBpbGwgYmFyIGVuZHMgaW4gYSBzbWFsbCBcInNraXBcIiBidXR0b25cbiAgICogdGhhdCBkaXNtaXNzZXMgdGhlIGFjdGl2ZSBwaWxsIOKAlCBzYW1lIGFjdGlvbiBhcyBwcmVzc2luZyDihpIgYXQgdGhlIGVuZCBvZlxuICAgKiB0aGUgaW5wdXQuIFNldCB0byBmYWxzZSB0byBoaWRlIGl0LiBXaGVuIHBpbGxzIHJlbmRlciBlbHNld2hlcmVcbiAgICogKGBwaWxsUGxhY2VtZW50OiBcImlubGluZVwiYCAvIGBcImhpZGRlblwiYCkgdGhlIGJhciByZW5kZXJzIGFzIGEgc2tpcC1vbmx5XG4gICAqIHJvdyBob2xkaW5nIGp1c3QgdGhlIGJ1dHRvbi4gSGlkZGVuIHdoaWxlIHRoZSBpbnB1dCBpcyBlbXB0eSDigJQgaXQgYXBwZWFyc1xuICAgKiBhbG9uZ3NpZGUgdGhlIGZvb3RlcidzIFwi4oaSIHRvIHNraXBcIiBoaW50IG9uY2UgdGhlIHVzZXIgaGFzIHR5cGVkLlxuICAgKi9cbiAgQElucHV0KCkgc2hvd1NraXBCdXR0b24gPSB0cnVlO1xuICAvKiogRm9jdXMgdGhlIGVkaXRvciBvbiBtb3VudC4gRGVmYXVsdDogdHJ1ZS4gKi9cbiAgQElucHV0KCkgYXV0b0ZvY3VzID0gdHJ1ZTtcbiAgLyoqIENvbnRyb2xsZWQtbW9kZSB0ZXh0IHZhbHVlLiAqL1xuICBASW5wdXQoKSB2YWx1ZT86IHN0cmluZztcbiAgLyoqIENvbnRyb2xsZWQtbW9kZSBjb21wbGV0ZWQgcGFyYW1zLiAqL1xuICBASW5wdXQoKSBjb21wbGV0ZWRQYXJhbXM/OiBDb21wbGV0ZWRQYXJhbVN0YXRlW107XG4gIC8qKlxuICAgKiBPcHQtaW4gcHJvZHVjdCBzdHJpcC4gV2hlbiBzZXQsIHRoZSBkcm9wZG93biByZW5kZXJzIGEgaG9yaXpvbnRhbCByb3cgb2ZcbiAgICogcHJvZHVjdCBjYXJkcyBiZWxvdyB0aGUgb3B0aW9ucyBncmlkLCBmZWQgYnkgeW91ciBvd24gc2VhcmNoIGVuZHBvaW50IG9uXG4gICAqIHRoZSBTREsncyBleGlzdGluZyBmZXRjaCBjYWRlbmNlLiBPbWl0IGl0IGFuZCBub3RoaW5nIGFib3V0IHRoZSBkcm9wZG93blxuICAgKiBjaGFuZ2VzIOKAlCBubyByZXF1ZXN0LCBubyBtYXJrdXAsIG5vIGxheW91dCBzaGlmdC5cbiAgICpcbiAgICogQmluZCBhIHN0YWJsZSByZWZlcmVuY2UgKGEgY29tcG9uZW50IGZpZWxkLCBub3QgYW4gaW5saW5lIG9iamVjdCBsaXRlcmFsKTpcbiAgICogYSBuZXcgb2JqZWN0IG9uIGVhY2ggY2hhbmdlLWRldGVjdGlvbiBwYXNzIHJlYWRzIGFzIGEgc3dhcHBlZCBpbnRlZ3JhdGlvblxuICAgKiBhbmQgY2xlYXJzIHRoZSBjdXJyZW50IGNhcmRzIOKAlCB0aGUgc2FtZSBydWxlIHRoYXQgYWxyZWFkeSBhcHBsaWVzIHRvXG4gICAqIGBhcGlDb25maWdgIGFuZCBgb3B0aW9uT3ZlcnJpZGVzYC5cbiAgICovXG4gIEBJbnB1dCgpIHByb2R1Y3RzPzogUHJvZHVjdHNDb25maWc7XG4gIC8qKlxuICAgKiBDdXN0b20gc3VibWl0IGJ1dHRvbi4gUGFzcyBhIGA8bmctdGVtcGxhdGU+YCB0byByZXBsYWNlIHRoZSBkZWZhdWx0IGFycm93XG4gICAqIGJ1dHRvbi4gUGFzcyBgbnVsbGAgdG8gcmVuZGVyIG5vIGJ1dHRvbi4gRGVmYXVsdCAoYHVuZGVmaW5lZGApIHJlbmRlcnNcbiAgICogdGhlIGJ1aWx0LWluIGFycm93LlxuICAgKi9cbiAgQElucHV0KCkgc3VibWl0QnV0dG9uPzogVGVtcGxhdGVSZWY8dW5rbm93bj4gfCBudWxsO1xuXG4gIC8vID09PSBPdXRwdXRzID09PVxuXG4gIC8qKiBDYWxsZWQgb24gRW50ZXIgb3Igc3VibWl0LWJ1dHRvbiBjbGljay4gKi9cbiAgQE91dHB1dCgpIHJlYWRvbmx5IHN1Ym1pdHRlZCA9IG5ldyBFdmVudEVtaXR0ZXI8QXV0b2NvbXBsZXRlUmVzdWx0PigpO1xuICBAT3V0cHV0KCkgcmVhZG9ubHkgZXJyb3JlZCA9IG5ldyBFdmVudEVtaXR0ZXI8RXJyb3I+KCk7XG4gIEBPdXRwdXQoKSByZWFkb25seSB2YWx1ZUNoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8c3RyaW5nPigpO1xuICBAT3V0cHV0KCkgcmVhZG9ubHkgY29tcGxldGVkUGFyYW1zQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxDb21wbGV0ZWRQYXJhbVN0YXRlW10+KCk7XG4gIEBPdXRwdXQoKSByZWFkb25seSBmb2N1c2VkID0gbmV3IEV2ZW50RW1pdHRlcjx2b2lkPigpO1xuICBAT3V0cHV0KCkgcmVhZG9ubHkgYmx1cnJlZCA9IG5ldyBFdmVudEVtaXR0ZXI8dm9pZD4oKTtcbiAgLyoqXG4gICAqIEVtaXR0ZWQgd2hlbiB0aGUgdXNlciBhY3RpdmF0ZXMgYSBwcm9kdWN0IGNhcmQuIFRoZSBTREsgZG9lcyBub3RcbiAgICogbmF2aWdhdGUg4oCUIHlvdSBkZWNpZGUgd2hhdCBhIHNlbGVjdGlvbiBtZWFucy4gTW9kaWZpZXIgLyBtaWRkbGUgY2xpY2tzIGFyZVxuICAgKiBsZWZ0IHRvIHRoZSBicm93c2VyIChjbWQtY2xpY2sgc3RpbGwgb3BlbnMgYSB0YWIpIGFuZCBkb24ndCBlbWl0LlxuICAgKi9cbiAgQE91dHB1dCgpIHJlYWRvbmx5IHByb2R1Y3RTZWxlY3QgPSBuZXcgRXZlbnRFbWl0dGVyPFByb2R1Y3Q+KCk7XG5cbiAgLy8gPT09IFZpZXcgcmVmcyA9PT1cblxuICBAVmlld0NoaWxkKFwiY29udGFpbmVyXCIsIHsgc3RhdGljOiB0cnVlIH0pIGNvbnRhaW5lclJlZiE6IEVsZW1lbnRSZWY8SFRNTERpdkVsZW1lbnQ+O1xuICBAVmlld0NoaWxkKFwiZWRpdG9yXCIsIHsgc3RhdGljOiBmYWxzZSB9KSBlZGl0b3JSZWY/OiBFbGVtZW50UmVmPEhUTUxEaXZFbGVtZW50PjtcbiAgQFZpZXdDaGlsZChcInBpbGxDb250YWluZXJcIikgcGlsbENvbnRhaW5lclJlZj86IEVsZW1lbnRSZWY8SFRNTFNwYW5FbGVtZW50PjtcblxuICAvLyA9PT0gUHVibGljIHN0YXRlIGZvciB0aGUgdGVtcGxhdGUgPT09XG5cbiAgY29udHJvbGxlciE6IEFJQXV0b2NvbXBsZXRlQ29udHJvbGxlcjtcbiAgLyoqXG4gICAqIENvbmNyZXRlIGxpZ2h0L2RhcmsgdmFsdWUgYm91bmQgdG8gYFthdHRyLmRhdGEtbW9kZV1gLiBTZWVkZWQgaW4gbmdPbkluaXRcbiAgICogc28gdGhlIGF0dHJpYnV0ZSBpcyBwcmVzZW50IGR1cmluZyBTU1IgKHdoZXJlIE1vZGVDb250cm9sbGVyLCBnYXRlZCBiZWhpbmRcbiAgICogaXNQbGF0Zm9ybUJyb3dzZXIgaW4gbmdBZnRlclZpZXdJbml0LCBuZXZlciBydW5zKS4gT24gdGhlIGJyb3dzZXIgdGhlXG4gICAqIE1vZGVDb250cm9sbGVyJ3MgcmVzb2x2ZSBjYWxsYmFjayBrZWVwcyB0aGlzIGluIHN5bmMg4oCUIHNvIGl0cyBydW50aW1lXG4gICAqIHByZWZlcnMtY29sb3Itc2NoZW1lIHVwZGF0ZXMgYW5kIHRoaXMgYmluZGluZyBhbHdheXMgYWdyZWUgKG5vIGNsb2JiZXIpLlxuICAgKi9cbiAgcmVzb2x2ZWRNb2RlOiBcImxpZ2h0XCIgfCBcImRhcmtcIiA9IFwiZGFya1wiO1xuXG4gIC8vID09PSBJbnRlcm5hbCA9PT1cblxuICBwcml2YXRlIG1vZGVDb250cm9sbGVyPzogTW9kZUNvbnRyb2xsZXI7XG4gIHByaXZhdGUgcmVzaXplT2JzZXJ2ZXI/OiBSZXNpemVPYnNlcnZlcjtcbiAgcHJpdmF0ZSBvbkNoYW5nZUZuOiAodmFsdWU6IHN0cmluZykgPT4gdm9pZCA9IG5vb3A7XG4gIHByaXZhdGUgb25Ub3VjaGVkRm46ICgpID0+IHZvaWQgPSBub29wO1xuICAvLyBIb2xkcyBhIHZhbHVlIHdyaXR0ZW4gYnkgUmVhY3RpdmUgRm9ybXMgYmVmb3JlIG5nT25Jbml0IHJhbi4gUmVhY3RpdmVcbiAgLy8gRm9ybXMgY2FuIGNhbGwgd3JpdGVWYWx1ZSgpIGR1cmluZyBkeW5hbWljIGZvcm0gY29uc3RydWN0aW9uIChlLmcuIHdoZW5cbiAgLy8gYSBGb3JtQ29udHJvbCBhbHJlYWR5IGhvbGRzIGEgdmFsdWUgYXQgdGhlIG1vbWVudCB0aGUgZGlyZWN0aXZlIGlzXG4gIC8vIGNyZWF0ZWQpLiBXZSBzdGFzaCB0aGUgdmFsdWUgaGVyZSBhbmQgZmx1c2ggaXQgaW4gbmdPbkluaXQgKmFmdGVyKlxuICAvLyB0aGUgY29udHJvbGxlciBleGlzdHMg4oCUIG90aGVyd2lzZSB0aGUgZWRpdG9yIHJlbmRlcnMgZW1wdHkgZXZlbiB0aG91Z2hcbiAgLy8gdGhlIGZvcm0gaGFkIGEgdmFsdWUuIGB1bmRlZmluZWRgIG1lYW5zIFwibm8gcGVuZGluZyB3cml0ZVwiLlxuICBwcml2YXRlIHBlbmRpbmdXcml0ZVZhbHVlOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG5cbiAgLy8gwqcxNi45OiBwcmVmZXIgYGluamVjdCgpYCBvdmVyIGNvbnN0cnVjdG9yLXBhcmFtZXRlciBESSBmb3IgY29tcG9uZW50cy5cbiAgcHJpdmF0ZSByZWFkb25seSBwbGF0Zm9ybUlkID0gaW5qZWN0KFBMQVRGT1JNX0lEKTtcbiAgcHJpdmF0ZSByZWFkb25seSB6b25lID0gaW5qZWN0KE5nWm9uZSk7XG4gIHByaXZhdGUgcmVhZG9ubHkgY2RyID0gaW5qZWN0KENoYW5nZURldGVjdG9yUmVmKTtcblxuICBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICAvLyBTZWVkIGJlZm9yZSB0aGUgYnJvd3NlciBndWFyZCBzbyBTU1IgcmVuZGVycyBhIGNvbmNyZXRlIGRhdGEtbW9kZS5cbiAgICB0aGlzLnJlc29sdmVkTW9kZSA9IHJlc29sdmVJbml0aWFsTW9kZSh0aGlzLm1vZGUpO1xuICAgIGlmICghaXNQbGF0Zm9ybUJyb3dzZXIodGhpcy5wbGF0Zm9ybUlkKSkgcmV0dXJuO1xuXG4gICAgdGhpcy5jb250cm9sbGVyID0gbmV3IEFJQXV0b2NvbXBsZXRlQ29udHJvbGxlcih7XG4gICAgICBhcGlDb25maWc6IHRoaXMuYXBpQ29uZmlnLFxuICAgICAgYWRkaXRpb25hbENvbnRleHQ6IHRoaXMuYWRkaXRpb25hbENvbnRleHQsXG4gICAgICBvcHRpb25PdmVycmlkZXM6IHRoaXMub3B0aW9uT3ZlcnJpZGVzLFxuICAgICAgbWFza0NvbXBsZXRlZFRleHQ6IHRoaXMubWFza0NvbXBsZXRlZFRleHQsXG4gICAgICBjb2x1bW5zOiB0aGlzLmNvbHVtbnMsXG4gICAgICBkcm9wZG93blRyaWdnZXI6IHRoaXMuZHJvcGRvd25UcmlnZ2VyLFxuICAgICAgb3B0aW9uc1Bvc2l0aW9uOiB0aGlzLm9wdGlvbnNQb3NpdGlvbixcbiAgICAgIGNsb3NlRHJvcGRvd25PbkJsdXI6IHRoaXMuY2xvc2VEcm9wZG93bk9uQmx1cixcbiAgICAgIHNob3dOb25UYXBwYWJsZU9wdGlvbnM6IHRoaXMuc2hvd05vblRhcHBhYmxlT3B0aW9ucyxcbiAgICAgIHNvdXJjZTogXCJmdWxsLXNka1wiLFxuICAgICAgcHJvZHVjdHM6IHRoaXMucHJvZHVjdHMsXG4gICAgICB2YWx1ZTogdGhpcy52YWx1ZSxcbiAgICAgIGNvbXBsZXRlZFBhcmFtczogdGhpcy5jb21wbGV0ZWRQYXJhbXMsXG4gICAgICBvblN1Ym1pdDogKHJlc3VsdCkgPT4gdGhpcy5oYW5kbGVTdWJtaXQocmVzdWx0KSxcbiAgICAgIG9uRXJyb3I6IChlcnJvcikgPT4gdGhpcy5lcnJvcmVkLmVtaXQoZXJyb3IpLFxuICAgICAgb25DaGFuZ2U6ICh0ZXh0KSA9PiB7XG4gICAgICAgIHRoaXMudmFsdWVDaGFuZ2UuZW1pdCh0ZXh0KTtcbiAgICAgICAgdGhpcy5vbkNoYW5nZUZuKHRleHQpO1xuICAgICAgfSxcbiAgICAgIG9uUGFyYW1zQ2hhbmdlOiAocGFyYW1zKSA9PiB0aGlzLmNvbXBsZXRlZFBhcmFtc0NoYW5nZS5lbWl0KHBhcmFtcyksXG4gICAgICBvbkZvY3VzOiAoKSA9PiB0aGlzLmZvY3VzZWQuZW1pdCgpLFxuICAgICAgb25Qcm9kdWN0U2VsZWN0OiAocHJvZHVjdCkgPT4gdGhpcy5wcm9kdWN0U2VsZWN0LmVtaXQocHJvZHVjdCksXG4gICAgICBvbkJsdXI6ICgpID0+IHtcbiAgICAgICAgdGhpcy5ibHVycmVkLmVtaXQoKTtcbiAgICAgICAgdGhpcy5vblRvdWNoZWRGbigpO1xuICAgICAgfSxcbiAgICAgIHNldEN1cnNvcjogKG9mZnNldCkgPT4ge1xuICAgICAgICBjb25zdCBlZGl0b3IgPSB0aGlzLmVkaXRvclJlZj8ubmF0aXZlRWxlbWVudDtcbiAgICAgICAgaWYgKCFlZGl0b3IpIHJldHVybjtcbiAgICAgICAgZWRpdG9yLmZvY3VzKCk7XG4gICAgICAgIHNldEN1cnNvck9mZnNldChlZGl0b3IsIG9mZnNldCk7XG4gICAgICB9LFxuICAgIH0pO1xuXG4gICAgaWYgKHRoaXMucGVuZGluZ1dyaXRlVmFsdWUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5jb250cm9sbGVyLnNldFZhbHVlKHRoaXMucGVuZGluZ1dyaXRlVmFsdWUpO1xuICAgICAgdGhpcy5wZW5kaW5nV3JpdGVWYWx1ZSA9IHVuZGVmaW5lZDtcbiAgICB9XG4gIH1cblxuICBuZ0FmdGVyVmlld0luaXQoKTogdm9pZCB7XG4gICAgaWYgKCFpc1BsYXRmb3JtQnJvd3Nlcih0aGlzLnBsYXRmb3JtSWQpKSByZXR1cm47XG4gICAgLy8gTW9kZUNvbnRyb2xsZXIgd3JpdGVzIGBkYXRhLW1vZGVgIHRvIHRoZSBlbGVtZW50IGl0J3MgZ2l2ZW4uIFRoZSBDU1NcbiAgICAvLyBzZWxlY3RvcnMgYXJlIHNjb3BlZCB0byBgLm1hZ2ljeC1haWFbZGF0YS1tb2RlPVwiLi4uXCJdYCDigJQgd2hpY2ggbGl2ZXMgb25cbiAgICAvLyB0aGUgaW5uZXIgYDxkaXYgY2xhc3M9XCJtYWdpY3gtYWlhIG1hZ2ljeC1haWEtY29udGFpbmVyXCIgI2NvbnRhaW5lcj5gLFxuICAgIC8vIE5PVCB0aGUgaG9zdCBgPGFpLWF1dG9jb21wbGV0ZT5gIGVsZW1lbnQuIFRoZSByZXNvbHZlIGNhbGxiYWNrIG1pcnJvcnNcbiAgICAvLyB0aGUgdmFsdWUgaW50byBgcmVzb2x2ZWRNb2RlYCBzbyB0aGUgYFthdHRyLmRhdGEtbW9kZV1gIGJpbmRpbmcgc3RheXMgaW5cbiAgICAvLyBsb2Nrc3RlcCB3aXRoIE1vZGVDb250cm9sbGVyIOKAlCB0aGUgYmluZGluZyBoYW5kbGVzIFNTUiwgTW9kZUNvbnRyb2xsZXJcbiAgICAvLyBoYW5kbGVzIHJ1bnRpbWUgcHJlZmVycy1jb2xvci1zY2hlbWUgc3dpdGNoZXMsIGFuZCBiZWNhdXNlIHRoZXkgYWx3YXlzXG4gICAgLy8gYWdyZWUgbmVpdGhlciBjbG9iYmVycyB0aGUgb3RoZXIuXG4gICAgdGhpcy5tb2RlQ29udHJvbGxlciA9IG5ldyBNb2RlQ29udHJvbGxlcihcbiAgICAgIHRoaXMuY29udGFpbmVyUmVmLm5hdGl2ZUVsZW1lbnQsXG4gICAgICB0aGlzLm1vZGUsXG4gICAgICAocmVzb2x2ZWQpID0+IHtcbiAgICAgICAgdGhpcy5yZXNvbHZlZE1vZGUgPSByZXNvbHZlZDtcbiAgICAgICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gICAgICB9LFxuICAgICk7XG5cbiAgICAvLyBQaWxsLXdyYXAgZGV0ZWN0aW9uIOKAlCB3aGVuIHRoZSBwaWxsIGxpc3Qgd3JhcHMgYmVsb3cgdGhlIGVkaXRvcidzIGxhc3RcbiAgICAvLyBsaW5lLCBkcm9wIGl0cyA4cHggbGVmdCBtYXJnaW4gdmlhIGEgZGF0YSBhdHRyaWJ1dGUgdGhlIENTUyBrZXlzIG9mZi5cbiAgICAvLyBNaXJyb3JzIHRoZSBSZWFjdCBjb21wb25lbnQncyB1c2VMYXlvdXRFZmZlY3QuXG4gICAgaWYgKHR5cGVvZiBSZXNpemVPYnNlcnZlciAhPT0gXCJ1bmRlZmluZWRcIikge1xuICAgICAgdGhpcy56b25lLnJ1bk91dHNpZGVBbmd1bGFyKCgpID0+IHtcbiAgICAgICAgdGhpcy5yZXNpemVPYnNlcnZlciA9IG5ldyBSZXNpemVPYnNlcnZlcigoKSA9PiB0aGlzLm1lYXN1cmVQaWxsV3JhcCgpKTtcbiAgICAgICAgY29uc3QgZWRpdG9yID0gdGhpcy5lZGl0b3JSZWY/Lm5hdGl2ZUVsZW1lbnQ7XG4gICAgICAgIGlmIChlZGl0b3IpIHRoaXMucmVzaXplT2JzZXJ2ZXIub2JzZXJ2ZShlZGl0b3IpO1xuICAgICAgfSk7XG4gICAgICB0aGlzLm1lYXN1cmVQaWxsV3JhcCgpO1xuICAgIH1cbiAgfVxuXG4gIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuY29udHJvbGxlcikgcmV0dXJuO1xuICAgIC8vIGBTaW1wbGVDaGFuZ2VzYCBpcyBgeyBba2V5OiBzdHJpbmddOiBTaW1wbGVDaGFuZ2UgfWAsIHNvIHBlclxuICAgIC8vIGBub1Byb3BlcnR5QWNjZXNzRnJvbUluZGV4U2lnbmF0dXJlYCBlYWNoIGtleSBsb29rdXAgdXNlcyBicmFja2V0XG4gICAgLy8gbm90YXRpb24g4oCUIHRoaXMga2VlcHMgdGhlIHN0cmljdG5lc3MgY29udHJhY3QgdGhhdCB0aGUgcmVzdCBvZiB0aGVcbiAgICAvLyB3b3Jrc3BhY2UgZW5mb3JjZXMuXG4gICAgLy8gQ29udHJvbGxlZC1tb2RlIHByb3BhZ2F0aW9uXG4gICAgaWYgKGNoYW5nZXNbXCJ2YWx1ZVwiXSAmJiB0aGlzLnZhbHVlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMuY29udHJvbGxlci5zZXRWYWx1ZSh0aGlzLnZhbHVlKTtcbiAgICB9XG4gICAgaWYgKGNoYW5nZXNbXCJjb21wbGV0ZWRQYXJhbXNcIl0gJiYgdGhpcy5jb21wbGV0ZWRQYXJhbXMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5jb250cm9sbGVyLnNldENvbXBsZXRlZFBhcmFtcyh0aGlzLmNvbXBsZXRlZFBhcmFtcyk7XG4gICAgfVxuICAgIC8vIFJlYWN0aXZlIG9wdGlvbnNcbiAgICBpZiAoXG4gICAgICBjaGFuZ2VzW1wiYXBpQ29uZmlnXCJdIHx8XG4gICAgICBjaGFuZ2VzW1wiYWRkaXRpb25hbENvbnRleHRcIl0gfHxcbiAgICAgIGNoYW5nZXNbXCJvcHRpb25PdmVycmlkZXNcIl0gfHxcbiAgICAgIGNoYW5nZXNbXCJkcm9wZG93blRyaWdnZXJcIl0gfHxcbiAgICAgIGNoYW5nZXNbXCJvcHRpb25zUG9zaXRpb25cIl0gfHxcbiAgICAgIGNoYW5nZXNbXCJjbG9zZURyb3Bkb3duT25CbHVyXCJdIHx8XG4gICAgICBjaGFuZ2VzW1wic2hvd05vblRhcHBhYmxlT3B0aW9uc1wiXSB8fFxuICAgICAgY2hhbmdlc1tcInByb2R1Y3RzXCJdXG4gICAgKSB7XG4gICAgICB0aGlzLmNvbnRyb2xsZXIudXBkYXRlKHtcbiAgICAgICAgYXBpQ29uZmlnOiB0aGlzLmFwaUNvbmZpZyxcbiAgICAgICAgYWRkaXRpb25hbENvbnRleHQ6IHRoaXMuYWRkaXRpb25hbENvbnRleHQsXG4gICAgICAgIG9wdGlvbk92ZXJyaWRlczogdGhpcy5vcHRpb25PdmVycmlkZXMsXG4gICAgICAgIGRyb3Bkb3duVHJpZ2dlcjogdGhpcy5kcm9wZG93blRyaWdnZXIsXG4gICAgICAgIG9wdGlvbnNQb3NpdGlvbjogdGhpcy5vcHRpb25zUG9zaXRpb24sXG4gICAgICAgIGNsb3NlRHJvcGRvd25PbkJsdXI6IHRoaXMuY2xvc2VEcm9wZG93bk9uQmx1cixcbiAgICAgICAgc2hvd05vblRhcHBhYmxlT3B0aW9uczogdGhpcy5zaG93Tm9uVGFwcGFibGVPcHRpb25zLFxuICAgICAgICAvLyBTYW1lIHJlZmVyZW5jZSBvbiBhbiB1bnJlbGF0ZWQgY2hhbmdlIGlzIGEgbm8tb3AgaW4gdGhlIGNvcmU7IG9ubHkgYVxuICAgICAgICAvLyBnZW51aW5lbHkgc3dhcHBlZCAob3IgcmVtb3ZlZCkgaW50ZWdyYXRpb24gY2xlYXJzIHRoZSBzdHJpcC5cbiAgICAgICAgcHJvZHVjdHM6IHRoaXMucHJvZHVjdHMsXG4gICAgICB9KTtcbiAgICB9XG4gICAgaWYgKGNoYW5nZXNbXCJtb2RlXCJdKSB7XG4gICAgICAvLyBLZWVwIHRoZSBiaW5kaW5nIGNvcnJlY3QgZXZlbiB3aGVuIE1vZGVDb250cm9sbGVyIGRvZXNuJ3QgZXhpc3QgeWV0XG4gICAgICAvLyAoU1NSIC8gcHJlLW5nQWZ0ZXJWaWV3SW5pdCkuIE9uIHRoZSBicm93c2VyLCBzZXRNb2RlIHRyaWdnZXJzIHRoZVxuICAgICAgLy8gcmVzb2x2ZSBjYWxsYmFjayB3aGljaCBzZXRzIHRoZSBzYW1lIHZhbHVlLlxuICAgICAgdGhpcy5yZXNvbHZlZE1vZGUgPSByZXNvbHZlSW5pdGlhbE1vZGUodGhpcy5tb2RlKTtcbiAgICAgIHRoaXMubW9kZUNvbnRyb2xsZXI/LnNldE1vZGUodGhpcy5tb2RlKTtcbiAgICB9XG4gIH1cblxuICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICB0aGlzLnJlc2l6ZU9ic2VydmVyPy5kaXNjb25uZWN0KCk7XG4gICAgdGhpcy5tb2RlQ29udHJvbGxlcj8uZGVzdHJveSgpO1xuICAgIHRoaXMuY29udHJvbGxlcj8uZGVzdHJveSgpO1xuICB9XG5cbiAgLy8gPT09IEltcGVyYXRpdmUgQVBJIChleHBvc2VkIG9uIHRoZSBjb21wb25lbnQgaW5zdGFuY2UgdmlhIEBWaWV3Q2hpbGQpID09PVxuXG4gIC8qKiBQcm9ncmFtbWF0aWNhbGx5IGZvY3VzIHRoZSBlZGl0b3IuICovXG4gIGZvY3VzKCk6IHZvaWQge1xuICAgIHRoaXMuZWRpdG9yUmVmPy5uYXRpdmVFbGVtZW50LmZvY3VzKCk7XG4gIH1cblxuICAvKiogUHJvZ3JhbW1hdGljYWxseSBibHVyIHRoZSBlZGl0b3IuICovXG4gIGJsdXIoKTogdm9pZCB7XG4gICAgdGhpcy5lZGl0b3JSZWY/Lm5hdGl2ZUVsZW1lbnQuYmx1cigpO1xuICB9XG5cbiAgLyoqIENsZWFyIGFsbCBzdGF0ZSwgcm90YXRlIHNlc3Npb24sIGFuZCByZS1mZXRjaC4gKi9cbiAgcmVzZXQoKTogdm9pZCB7XG4gICAgdGhpcy5jb250cm9sbGVyPy5yZXNldCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNraXAgdGhlIGFjdGl2ZSBwaWxsIOKAlCBzYW1lIGFjdGlvbiBhcyB0aGUgZHJvcGRvd24ncyBza2lwIGJ1dHRvbiAvIOKGki5cbiAgICogTGV0cyBhIGNvbnN1bWVyIHdobyBoaWRlcyB0aGUgYnVpbHQtaW4gYnV0dG9uIChgc2hvd1NraXBCdXR0b249ZmFsc2VgKVxuICAgKiBkcml2ZSBza2lwcGluZyBmcm9tIHRoZWlyIG93biBVSS5cbiAgICovXG4gIHNraXBBY3RpdmVQaWxsKCk6IHZvaWQge1xuICAgIHRoaXMuY29udHJvbGxlcj8uc2tpcEFjdGl2ZVBpbGwoKTtcbiAgfVxuXG4gIC8qKiBTd2l0Y2ggY29sb3IgbW9kZSBhdCBydW50aW1lLiAqL1xuICBzZXRNb2RlKG1vZGU6IEFwcGVhcmFuY2VNb2RlKTogdm9pZCB7XG4gICAgdGhpcy5tb2RlID0gbW9kZTtcbiAgICB0aGlzLnJlc29sdmVkTW9kZSA9IHJlc29sdmVJbml0aWFsTW9kZShtb2RlKTtcbiAgICB0aGlzLm1vZGVDb250cm9sbGVyPy5zZXRNb2RlKG1vZGUpO1xuICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICB9XG5cbiAgLy8gPT09IFRlbXBsYXRlIGhlbHBlcnMgPT09XG5cbiAgLyoqXG4gICAqICdkZWZhdWx0JyDihpIgcmVuZGVyIHRoZSBidWlsdC1pbiBhcnJvdyBidXR0b24uXG4gICAqICdjdXN0b20nICDihpIgcHJvamVjdCB0aGUgY29uc3VtZXItc3VwcGxpZWQgVGVtcGxhdGVSZWYuXG4gICAqICdoaWRkZW4nICDihpIgbm8gYnV0dG9uLlxuICAgKi9cbiAgZ2V0IHN1Ym1pdEJ1dHRvblN0YXRlKCk6IFwiZGVmYXVsdFwiIHwgXCJjdXN0b21cIiB8IFwiaGlkZGVuXCIge1xuICAgIGlmICh0aGlzLnN1Ym1pdEJ1dHRvbiA9PT0gbnVsbCkgcmV0dXJuIFwiaGlkZGVuXCI7XG4gICAgaWYgKHRoaXMuc3VibWl0QnV0dG9uID09PSB1bmRlZmluZWQpIHJldHVybiBcImRlZmF1bHRcIjtcbiAgICByZXR1cm4gXCJjdXN0b21cIjtcbiAgfVxuXG4gIC8qKiBOYXJyb3dlZCBhY2Nlc3NvciBmb3IgKm5nVGVtcGxhdGVPdXRsZXQg4oCUIG5ldmVyIHVuZGVmaW5lZC4gKi9cbiAgZ2V0IGN1c3RvbVN1Ym1pdFRlbXBsYXRlKCk6IFRlbXBsYXRlUmVmPHVua25vd24+IHwgbnVsbCB7XG4gICAgcmV0dXJuIHRoaXMuc3VibWl0QnV0dG9uID8/IG51bGw7XG4gIH1cblxuICBnZXQgc2hvd0lubGluZVBpbGxzKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLnBpbGxQbGFjZW1lbnQgPT09IFwiaW5saW5lXCI7XG4gIH1cblxuICBnZXQgc2hvd0Ryb3Bkb3duUGlsbHMoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMucGlsbFBsYWNlbWVudCA9PT0gXCJkcm9wZG93blwiO1xuICB9XG5cbiAgLyoqXG4gICAqIGB0cnVlYCB3aGVuIHRoZXJlJ3Mgc29tZXRoaW5nIHRvIHN1Ym1pdCDigJQgZHJpdmVuIGJ5IGN1cnJlbnQgc2VnbWVudHNcbiAgICogYW5kIGNvbXBsZXRlZCBwYXJhbXMuIFJlYWQgb2ZmIHRoZSBsaXZlIGVkaXRvciB2aWEgdGhlIGNvbnRyb2xsZXIgc3RhdGUuXG4gICAqL1xuICBjYW5TdWJtaXQoc3RhdGU6IHsgc2VnbWVudHM6IHsgbGVuZ3RoOiBudW1iZXIgfTsgY29tcGxldGVkUGFyYW1zOiB7IGxlbmd0aDogbnVtYmVyIH0gfSk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBzdGF0ZS5zZWdtZW50cy5sZW5ndGggPiAwIHx8IHN0YXRlLmNvbXBsZXRlZFBhcmFtcy5sZW5ndGggPiAwO1xuICB9XG5cbiAgb25XcmFwcGVyQ2xpY2soZXZlbnQ6IE1vdXNlRXZlbnQpOiB2b2lkIHtcbiAgICAvLyBDbGlja2luZyBhIHBpbGwgc2hvdWxkIGFjdGl2YXRlIGl0IHdpdGhvdXQgc3RlYWxpbmcgZm9jdXMgZWxzZXdoZXJlLlxuICAgIGNvbnN0IHRhcmdldCA9IGV2ZW50LnRhcmdldCBhcyBIVE1MRWxlbWVudCB8IG51bGw7XG4gICAgaWYgKHRhcmdldD8uY2xvc2VzdChcIltkYXRhLWFpYS1waWxsXVwiKSkgcmV0dXJuO1xuICAgIHRoaXMuZm9jdXMoKTtcbiAgfVxuXG4gIG9uU3VibWl0QnV0dG9uQ2xpY2soZXZlbnQ6IE1vdXNlRXZlbnQpOiB2b2lkIHtcbiAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICB0aGlzLmhhbmRsZVN1Ym1pdEZyb21Vc2VyQWN0aW9uKCk7XG4gIH1cblxuICBvblN1Ym1pdFNsb3RDbGljayhldmVudDogTW91c2VFdmVudCk6IHZvaWQge1xuICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgIHRoaXMuaGFuZGxlU3VibWl0RnJvbVVzZXJBY3Rpb24oKTtcbiAgfVxuXG4gIG9uU2VsZWN0UGlsbChpbmRleDogbnVtYmVyKTogdm9pZCB7XG4gICAgdGhpcy5jb250cm9sbGVyLnNldEFjdGl2ZVBpbGwoaW5kZXgpO1xuICB9XG5cbiAgLy8gPT09IENvbnRyb2xWYWx1ZUFjY2Vzc29yID09PVxuXG4gIHdyaXRlVmFsdWUodmFsdWU6IHN0cmluZyB8IG51bGwpOiB2b2lkIHtcbiAgICBjb25zdCBuZXh0ID0gdmFsdWUgPz8gXCJcIjtcbiAgICBpZiAoIXRoaXMuY29udHJvbGxlcikge1xuICAgICAgLy8gUmVhY3RpdmUgRm9ybXMgY2FuIGNhbGwgd3JpdGVWYWx1ZSgpIGJlZm9yZSBuZ09uSW5pdCBjcmVhdGVzIHRoZVxuICAgICAgLy8gY29udHJvbGxlciAoZHluYW1pYyBmb3JtIGNvbnN0cnVjdGlvbiwgb3IgYSBGb3JtQ29udHJvbCB0aGF0IGFscmVhZHlcbiAgICAgIC8vIGhhZCBhIHZhbHVlIGF0IGRpcmVjdGl2ZS1jcmVhdGlvbiB0aW1lKS4gQnVmZmVyIHRoZSB2YWx1ZTsgbmdPbkluaXRcbiAgICAgIC8vIGZsdXNoZXMgaXQgYXMgc29vbiBhcyB0aGUgY29udHJvbGxlciBleGlzdHMuXG4gICAgICB0aGlzLnBlbmRpbmdXcml0ZVZhbHVlID0gbmV4dDtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5jb250cm9sbGVyLnNldFZhbHVlKG5leHQpO1xuICB9XG5cbiAgcmVnaXN0ZXJPbkNoYW5nZShmbjogKHZhbHVlOiBzdHJpbmcpID0+IHZvaWQpOiB2b2lkIHtcbiAgICB0aGlzLm9uQ2hhbmdlRm4gPSBmbjtcbiAgfVxuXG4gIHJlZ2lzdGVyT25Ub3VjaGVkKGZuOiAoKSA9PiB2b2lkKTogdm9pZCB7XG4gICAgdGhpcy5vblRvdWNoZWRGbiA9IGZuO1xuICB9XG5cbiAgc2V0RGlzYWJsZWRTdGF0ZShfZGlzYWJsZWQ6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICAvLyBUaGUgY29udGVudEVkaXRhYmxlIGhvc3QgZG9lc24ndCBoYXZlIGEgbmF0aXZlIGRpc2FibGVkIGF0dHJpYnV0ZS4gRm9yXG4gICAgLy8gdjAuMSB3ZSBhY2NlcHQgdGhlIGNhbGwgc28gQW5ndWxhcidzIGZvcm1zIGxheWVyIGRvZXNuJ3QgdGhyb3csIGJ1dFxuICAgIC8vIHRoZSBlZGl0b3Igc3RheXMgaW50ZXJhY3RpdmUuIEEgZnV0dXJlIGVuaGFuY2VtZW50IGNhbiB0b2dnbGVcbiAgICAvLyBjb250ZW50RWRpdGFibGUgKyBBUklBIGRpc2FibGVkIGhlcmUuXG4gIH1cblxuICAvLyA9PT0gU3VibWl0IGZsb3cgPT09XG5cbiAgLyoqXG4gICAqIENhbGxlZCBieSB0aGUgY29udHJvbGxlcidzIG9uU3VibWl0IGNhbGxiYWNrICh3aGljaCBmaXJlcyBmcm9tIHRoZVxuICAgKiBrZXlib2FyZCBjb250cm9sbGVyIG9uIEVudGVyKS4gUmVhZHMgdGhlIGxpdmUgZWRpdG9yIHRleHQg4oCUIHNhbWUgdHJpY2tcbiAgICogdGhlIFJlYWN0IGNvbXBvbmVudCB1c2VzIOKAlCBzbyB0aGUgZW1pdHRlZCBxdWVyeSByZWZsZWN0cyB3aGF0ZXZlcidzIGluXG4gICAqIHRoZSBET00gcmlnaHQgbm93LCBub3QgYSBwb3NzaWJseS1zdGFsZSBzdGF0ZSBzbmFwc2hvdC5cbiAgICovXG4gIHByaXZhdGUgaGFuZGxlU3VibWl0KF9yZXN1bHQ6IEF1dG9jb21wbGV0ZVJlc3VsdCk6IHZvaWQge1xuICAgIGNvbnN0IGVkaXRvciA9IHRoaXMuZWRpdG9yUmVmPy5uYXRpdmVFbGVtZW50O1xuICAgIGlmICghZWRpdG9yKSByZXR1cm47XG4gICAgY29uc3QgdGV4dCA9IGV4dHJhY3RQbGFpblRleHQoZWRpdG9yKTtcbiAgICBjb25zdCBzdGF0ZSA9IHRoaXMuY29udHJvbGxlci5nZXRTdGF0ZSgpO1xuICAgIGNvbnN0IHBhcmFtcyA9IHRoaXMuY29tcGxldGVkUGFyYW1zID8/IHN0YXRlLmNvbXBsZXRlZFBhcmFtcztcbiAgICB0aGlzLnN1Ym1pdHRlZC5lbWl0KGJ1aWxkU3VibWl0UmVzdWx0KHRleHQsIHBhcmFtcywgc3RhdGUuc2tpcHBlZFBhcmFtcykpO1xuICAgIHRoaXMuY29udHJvbGxlci5yZXNldCgpO1xuICB9XG5cbiAgcHJpdmF0ZSBoYW5kbGVTdWJtaXRGcm9tVXNlckFjdGlvbigpOiB2b2lkIHtcbiAgICBjb25zdCBzdGF0ZSA9IHRoaXMuY29udHJvbGxlci5nZXRTdGF0ZSgpO1xuICAgIGlmICghdGhpcy5jYW5TdWJtaXQoc3RhdGUpKSByZXR1cm47XG4gICAgLy8gU3ludGhlc2l6ZSB0aGUgcmVzdWx0IGZvciB0aGUgc3VibWl0LWJ1dHRvbiBjbGljayBwYXRoOyBzYW1lIHNoYXBlXG4gICAgLy8gdGhlIGNvbnRyb2xsZXIgd291bGQgZGVsaXZlciBmcm9tIGEga2V5Ym9hcmQgRW50ZXIsIHNvIGhhbmRsZVN1Ym1pdFxuICAgIC8vIGNhbiB0YWtlIGVpdGhlciBlbnRyeSBwb2ludC5cbiAgICB0aGlzLmhhbmRsZVN1Ym1pdCh7XG4gICAgICBxdWVyeTogc3RhdGUudGV4dC50cmltKCksXG4gICAgICByYXdfcXVlcnk6IFwiXCIsXG4gICAgICBjb21wbGV0ZWRfcGFyYW1zOiBbXSxcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgbWVhc3VyZVBpbGxXcmFwKCk6IHZvaWQge1xuICAgIGNvbnN0IGNvbnRhaW5lciA9IHRoaXMucGlsbENvbnRhaW5lclJlZj8ubmF0aXZlRWxlbWVudDtcbiAgICBjb25zdCBlZGl0b3IgPSB0aGlzLmVkaXRvclJlZj8ubmF0aXZlRWxlbWVudDtcbiAgICBpZiAoIWNvbnRhaW5lciB8fCAhZWRpdG9yKSByZXR1cm47XG4gICAgY29uc3QgaW5uZXIgPSBjb250YWluZXIuZmlyc3RFbGVtZW50Q2hpbGQgYXMgSFRNTEVsZW1lbnQgfCBudWxsO1xuICAgIGlmICghaW5uZXIpIHJldHVybjtcbiAgICAvLyBXcmFwIGRldGVjdGlvbjogdGhlIHBpbGwgcm93J3MgdG9wIHZzIHRoZSBlZGl0b3IncyBib3R0b20uIFdoZW4gdGhlXG4gICAgLy8gcGlsbHMgc2l0IG9uIChvciBhYm92ZSkgdGhlIGVkaXRvcidzIGxhc3QgbGluZSB0aGV5J3JlIE5PVCB3cmFwcGVkIOKAlFxuICAgIC8vIGtlZXAgdGhlIDhweCBtYXJnaW4gc28gdGhleSBkb24ndCBidXR0IGFnYWluc3QgdHlwZWQgdGV4dCBvciB0aGVcbiAgICAvLyBwbGFjZWhvbGRlci4gVGhpcyBoYW5kbGVzIHRoZSBlbXB0eS1lZGl0b3IgKyBwbGFjZWhvbGRlciBjYXNlXG4gICAgLy8gbmF0dXJhbGx5OiB0aGUgcGxhY2Vob2xkZXIgc3RpbGwgb2NjdXBpZXMgdGhlIGVkaXRvcidzIGxpbmUgYm94LlxuICAgIGNvbnN0IGNSZWN0ID0gaW5uZXIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgY29uc3QgZVJlY3QgPSBlZGl0b3IuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgY29uc3Qgd3JhcHBlZCA9IGNSZWN0LnRvcCA+PSBlUmVjdC5ib3R0b20gLSAyO1xuICAgIHRoaXMuem9uZS5ydW4oKCkgPT4ge1xuICAgICAgaWYgKHdyYXBwZWQpIGNvbnRhaW5lci5zZXRBdHRyaWJ1dGUoXCJkYXRhLWFpYS1waWxsLXdyYXBwZWRcIiwgXCJcIik7XG4gICAgICBlbHNlIGNvbnRhaW5lci5yZW1vdmVBdHRyaWJ1dGUoXCJkYXRhLWFpYS1waWxsLXdyYXBwZWRcIik7XG4gICAgfSk7XG4gIH1cbn1cblxuZnVuY3Rpb24gbm9vcCgpOiB2b2lkIHtcbiAgLy8gRGVmYXVsdCBuby1vcCBmb3IgQ1ZBIGNhbGxiYWNrcy5cbn1cblxuLyoqXG4gKiBSZXNvbHZlIGEgY29uY3JldGUgbGlnaHQvZGFyayB2YWx1ZSBmcm9tIHRoZSBjb25maWd1cmVkIG1vZGUuIFVzZWQgdG8gc2VlZFxuICogdGhlIGBkYXRhLW1vZGVgIGF0dHJpYnV0ZSBzeW5jaHJvbm91c2x5IChpbmNsdWRpbmcgZHVyaW5nIFNTUiwgd2hlcmVcbiAqIE1vZGVDb250cm9sbGVyIG5ldmVyIHJ1bnMpLiBPbiB0aGUgc2VydmVyIGB3aW5kb3dgIGlzIHVuZGVmaW5lZCDihpIgZGVmYXVsdHNcbiAqIHRvIFwiZGFya1wiIChtYXRjaGVzIHRoZSB2YW5pbGxhL1JlYWN0IGJlaGF2aW9yKS5cbiAqL1xuZnVuY3Rpb24gcmVzb2x2ZUluaXRpYWxNb2RlKG1vZGU6IEFwcGVhcmFuY2VNb2RlKTogXCJsaWdodFwiIHwgXCJkYXJrXCIge1xuICBpZiAobW9kZSAhPT0gXCJhdXRvXCIpIHJldHVybiBtb2RlO1xuICBpZiAodHlwZW9mIHdpbmRvdyA9PT0gXCJ1bmRlZmluZWRcIikgcmV0dXJuIFwiZGFya1wiO1xuICByZXR1cm4gd2luZG93Lm1hdGNoTWVkaWEoXCIocHJlZmVycy1jb2xvci1zY2hlbWU6IGRhcmspXCIpLm1hdGNoZXMgPyBcImRhcmtcIiA6IFwibGlnaHRcIjtcbn1cbiIsIjxkaXZcbiAgI2NvbnRhaW5lclxuICBjbGFzcz1cIm1hZ2ljeC1haWEgbWFnaWN4LWFpYS1jb250YWluZXJcIlxuICBbYXR0ci5kYXRhLXBpbGwtcGxhY2VtZW50XT1cInBpbGxQbGFjZW1lbnRcIlxuICBbYXR0ci5kYXRhLW9wdGlvbnMtcG9zaXRpb25dPVwib3B0aW9uc1Bvc2l0aW9uXCJcbiAgW2F0dHIuZGF0YS1hbmltYXRpb25zXT1cImFuaW1hdGlvbnMgPyAnb24nIDogJ29mZidcIlxuICBbYXR0ci5kYXRhLW1vZGVdPVwicmVzb2x2ZWRNb2RlXCJcbj5cbiAgPGFpLWF1dG9jb21wbGV0ZS1kcm9wZG93blxuICAgICpuZ0lmPVwiY29udHJvbGxlclwiXG4gICAgW2NvbnRyb2xsZXJdPVwiY29udHJvbGxlclwiXG4gICAgW3Nob3dQaWxsc109XCJzaG93RHJvcGRvd25QaWxsc1wiXG4gICAgW3Nob3dTa2lwQnV0dG9uXT1cInNob3dTa2lwQnV0dG9uXCJcbiAgPjwvYWktYXV0b2NvbXBsZXRlLWRyb3Bkb3duPlxuXG4gIDxkaXZcbiAgICBjbGFzcz1cIm1hZ2ljeC1haWEtaW5wdXQtd3JhcHBlclwiXG4gICAgKGNsaWNrKT1cIm9uV3JhcHBlckNsaWNrKCRldmVudClcIlxuICAgIChrZXl1cCk9XCIkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKClcIlxuICA+XG4gICAgPGRpdiBjbGFzcz1cIm1hZ2ljeC1haWEtZWRpdG9yLWFyZWFcIiBkYXRhLWFpYS1lZGl0b3I9XCJcIj5cbiAgICAgIDxkaXZcbiAgICAgICAgI2VkaXRvclxuICAgICAgICAqbmdJZj1cImNvbnRyb2xsZXJcIlxuICAgICAgICBbYWlhRWRpdG9ySG9zdF09XCJjb250cm9sbGVyXCJcbiAgICAgICAgW2F1dG9Gb2N1c109XCJhdXRvRm9jdXNcIlxuICAgICAgICBjbGFzcz1cIm1hZ2ljeC1haWEtaW5wdXRcIlxuICAgICAgICBkYXRhLWFpYS1pbnB1dD1cIlwiXG4gICAgICA+PC9kaXY+XG5cbiAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJjb250cm9sbGVyICYmIHNob3dJbmxpbmVQaWxsc1wiPlxuICAgICAgICA8c3BhblxuICAgICAgICAgICNwaWxsQ29udGFpbmVyXG4gICAgICAgICAgY2xhc3M9XCJtYWdpY3gtYWlhLXBpbGwtbGlzdC1jb250YWluZXJcIlxuICAgICAgICAgIGRhdGEtYWlhLXBpbGwtbGlzdC1jb250YWluZXI9XCJcIlxuICAgICAgICAgICpuZ0lmPVwiXG4gICAgICAgICAgICAoY29udHJvbGxlci5pc0xvYWRpbmckIHwgYXN5bmMpIHx8XG4gICAgICAgICAgICAgICgoY29udHJvbGxlci5zdWdnZXN0aW9uUGlsbHMkIHwgYXN5bmMpPy5sZW5ndGggPz8gMCkgPiAwXG4gICAgICAgICAgXCJcbiAgICAgICAgPlxuICAgICAgICAgIDxhaWEtcGlsbC1saXN0XG4gICAgICAgICAgICBbcGlsbHNdPVwiKGNvbnRyb2xsZXIuc3VnZ2VzdGlvblBpbGxzJCB8IGFzeW5jKSA/PyBbXVwiXG4gICAgICAgICAgICBbYWN0aXZlUGlsbEluZGV4XT1cIjBcIlxuICAgICAgICAgICAgW2FjdGl2ZVNlbGVjdGVkXT1cIihjb250cm9sbGVyLmlzQWN0aXZlUGlsbFNlbGVjdGVkJCB8IGFzeW5jKSA/PyBmYWxzZVwiXG4gICAgICAgICAgICBbbG9hZGluZ109XCIoY29udHJvbGxlci5pc0xvYWRpbmckIHwgYXN5bmMpID8/IGZhbHNlXCJcbiAgICAgICAgICAgIChzZWxlY3RQaWxsKT1cIm9uU2VsZWN0UGlsbCgkZXZlbnQpXCJcbiAgICAgICAgICA+PC9haWEtcGlsbC1saXN0PlxuICAgICAgICA8L3NwYW4+XG4gICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICA8L2Rpdj5cblxuICAgIDxuZy1jb250YWluZXIgW25nU3dpdGNoXT1cInN1Ym1pdEJ1dHRvblN0YXRlXCI+XG4gICAgICA8YWlhLXN1Ym1pdC1idXR0b25cbiAgICAgICAgKm5nU3dpdGNoQ2FzZT1cIidkZWZhdWx0J1wiXG4gICAgICAgIFtkaXNhYmxlZF09XCJcbiAgICAgICAgICAhKFxuICAgICAgICAgICAgY29udHJvbGxlciAmJlxuICAgICAgICAgICAgY2FuU3VibWl0KHtcbiAgICAgICAgICAgICAgc2VnbWVudHM6IChjb250cm9sbGVyLnNlZ21lbnRzJCB8IGFzeW5jKSA/PyBbXSxcbiAgICAgICAgICAgICAgY29tcGxldGVkUGFyYW1zOiAoY29udHJvbGxlci5jb21wbGV0ZWRQYXJhbXMkIHwgYXN5bmMpID8/IFtdXG4gICAgICAgICAgICB9KVxuICAgICAgICAgIClcbiAgICAgICAgXCJcbiAgICAgICAgKHN1Ym1pdCk9XCJvblN1Ym1pdEJ1dHRvbkNsaWNrKCRldmVudClcIlxuICAgICAgPjwvYWlhLXN1Ym1pdC1idXR0b24+XG5cbiAgICAgIDxzcGFuXG4gICAgICAgICpuZ1N3aXRjaENhc2U9XCInY3VzdG9tJ1wiXG4gICAgICAgIGRhdGEtYWlhLXN1Ym1pdD1cIlwiXG4gICAgICAgIGNsYXNzPVwibWFnaWN4LWFpYS1zdWJtaXQtc2xvdFwiXG4gICAgICAgIChjbGljayk9XCJvblN1Ym1pdFNsb3RDbGljaygkZXZlbnQpXCJcbiAgICAgID5cbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImN1c3RvbVN1Ym1pdFRlbXBsYXRlXCI+PC9uZy1jb250YWluZXI+XG4gICAgICA8L3NwYW4+XG4gICAgPC9uZy1jb250YWluZXI+XG4gIDwvZGl2PlxuPC9kaXY+XG4iXX0=
447
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWktYXV0b2NvbXBsZXRlLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9saWIvYWktYXV0b2NvbXBsZXRlL2FpLWF1dG9jb21wbGV0ZS5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi9zcmMvbGliL2FpLWF1dG9jb21wbGV0ZS9haS1hdXRvY29tcGxldGUuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFlBQVksRUFBRSxpQkFBaUIsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQ2xFLE9BQU8sRUFFTCx1QkFBdUIsRUFDdkIsaUJBQWlCLEVBQ2pCLFNBQVMsRUFFVCxZQUFZLEVBQ1osVUFBVSxFQUNWLEtBQUssRUFDTCxNQUFNLEVBQ04sTUFBTSxFQUlOLE1BQU0sRUFDTixXQUFXLEVBR1gsU0FBUyxFQUNULGlCQUFpQixHQUNsQixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQTZCLGlCQUFpQixFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDOUUsT0FBTyxFQUlMLGlCQUFpQixFQUVqQixnQkFBZ0IsRUFDaEIsY0FBYyxFQUlkLGVBQWUsR0FDaEIsTUFBTSxxQ0FBcUMsQ0FBQztBQUM3QyxPQUFPLEVBQUUsK0JBQStCLEVBQUUsTUFBTSxnRUFBZ0UsQ0FBQztBQUNqSCxPQUFPLEVBQUUsd0JBQXdCLEVBQUUsTUFBTSwwQ0FBMEMsQ0FBQztBQUNwRixPQUFPLEVBQUUsaUNBQWlDLEVBQUUsTUFBTSwrQ0FBK0MsQ0FBQztBQUNsRyxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSwyQ0FBMkMsQ0FBQztBQUM5RSxPQUFPLEVBQUUscUJBQXFCLEVBQUUsTUFBTSxtREFBbUQsQ0FBQzs7O0FBRTFGOzs7Ozs7O0dBT0c7QUF3QkgsTUFBTSxPQUFPLHVCQUF1QjtJQXZCcEM7UUFxQ1csc0JBQWlCLEdBQUcsS0FBSyxDQUFDO1FBRW5DLHdEQUF3RDtRQUMvQyxr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QUFNO2dCQUNZLE9BQU87c0JBQXpCLE1BQU07Z0JBTVksYUFBYTtzQkFBL0IsTUFBTTtnQkFJbUMsWUFBWTtzQkFBckQsU0FBUzt1QkFBQyxXQUFXLEVBQUUsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFO2dCQUNBLFNBQVM7c0JBQWhELFNBQVM7dUJBQUMsUUFBUSxFQUFFLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRTtnQkFDVixnQkFBZ0I7c0JBQTNDLFNBQVM7dUJBQUMsZUFBZTs7QUE4VTVCLFNBQVMsSUFBSTtJQUNYLG1DQUFtQztBQUNyQyxDQUFDO0FBRUQ7Ozs7O0dBS0c7QUFDSCxTQUFTLGtCQUFrQixDQUFDLElBQW9CO0lBQzlDLElBQUksSUFBSSxLQUFLLE1BQU07UUFBRSxPQUFPLElBQUksQ0FBQztJQUNqQyxJQUFJLE9BQU8sTUFBTSxLQUFLLFdBQVc7UUFBRSxPQUFPLE1BQU0sQ0FBQztJQUNqRCxPQUFPLE1BQU0sQ0FBQyxVQUFVLENBQUMsOEJBQThCLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDO0FBQ3RGLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21tb25Nb2R1bGUsIGlzUGxhdGZvcm1Ccm93c2VyIH0gZnJvbSBcIkBhbmd1bGFyL2NvbW1vblwiO1xuaW1wb3J0IHtcbiAgdHlwZSBBZnRlclZpZXdJbml0LFxuICBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSxcbiAgQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gIENvbXBvbmVudCxcbiAgdHlwZSBFbGVtZW50UmVmLFxuICBFdmVudEVtaXR0ZXIsXG4gIGZvcndhcmRSZWYsXG4gIElucHV0LFxuICBpbmplY3QsXG4gIE5nWm9uZSxcbiAgdHlwZSBPbkNoYW5nZXMsXG4gIHR5cGUgT25EZXN0cm95LFxuICB0eXBlIE9uSW5pdCxcbiAgT3V0cHV0LFxuICBQTEFURk9STV9JRCxcbiAgdHlwZSBTaW1wbGVDaGFuZ2VzLFxuICB0eXBlIFRlbXBsYXRlUmVmLFxuICBWaWV3Q2hpbGQsXG4gIFZpZXdFbmNhcHN1bGF0aW9uLFxufSBmcm9tIFwiQGFuZ3VsYXIvY29yZVwiO1xuaW1wb3J0IHsgdHlwZSBDb250cm9sVmFsdWVBY2Nlc3NvciwgTkdfVkFMVUVfQUNDRVNTT1IgfSBmcm9tIFwiQGFuZ3VsYXIvZm9ybXNcIjtcbmltcG9ydCB7XG4gIHR5cGUgQVBJQ29uZmlnLFxuICB0eXBlIEFwcGVhcmFuY2VNb2RlLFxuICB0eXBlIEF1dG9jb21wbGV0ZVJlc3VsdCxcbiAgYnVpbGRTdWJtaXRSZXN1bHQsXG4gIHR5cGUgQ29tcGxldGVkUGFyYW1TdGF0ZSxcbiAgZXh0cmFjdFBsYWluVGV4dCxcbiAgTW9kZUNvbnRyb2xsZXIsXG4gIHR5cGUgT3B0aW9uT3ZlcnJpZGVzLFxuICB0eXBlIFByb2R1Y3QsXG4gIHR5cGUgUHJvZHVjdHNDb25maWcsXG4gIHNldEN1cnNvck9mZnNldCxcbn0gZnJvbSBcIkBtYWdpY3gtZW5nL2FpLWF1dG9jb21wbGV0ZS12YW5pbGxhXCI7XG5pbXBvcnQgeyBBSUF1dG9jb21wbGV0ZURyb3Bkb3duQ29tcG9uZW50IH0gZnJvbSBcIi4uL2FpLWF1dG9jb21wbGV0ZS1kcm9wZG93bi9haS1hdXRvY29tcGxldGUtZHJvcGRvd24uY29tcG9uZW50XCI7XG5pbXBvcnQgeyBBSUF1dG9jb21wbGV0ZUNvbnRyb2xsZXIgfSBmcm9tIFwiLi4vY29udHJvbGxlci9haS1hdXRvY29tcGxldGUuY29udHJvbGxlclwiO1xuaW1wb3J0IHsgQUlBdXRvY29tcGxldGVFZGl0b3JIb3N0RGlyZWN0aXZlIH0gZnJvbSBcIi4uL2ludGVybmFsL2VkaXRvci1ob3N0L2VkaXRvci1ob3N0LmRpcmVjdGl2ZVwiO1xuaW1wb3J0IHsgUGlsbExpc3RDb21wb25lbnQgfSBmcm9tIFwiLi4vaW50ZXJuYWwvcGlsbC1saXN0L3BpbGwtbGlzdC5jb21wb25lbnRcIjtcbmltcG9ydCB7IFN1Ym1pdEJ1dHRvbkNvbXBvbmVudCB9IGZyb20gXCIuLi9pbnRlcm5hbC9zdWJtaXQtYnV0dG9uL3N1Ym1pdC1idXR0b24uY29tcG9uZW50XCI7XG5cbi8qKlxuICogVGllciAxIGNvbXBvbmVudCDigJQgYDxhaS1hdXRvY29tcGxldGU+YC4gVGhlIEFuZ3VsYXIgZXF1aXZhbGVudCBvZiBSZWFjdCdzXG4gKiBgPEFJQXV0b2NvbXBsZXRlIC8+YC4gT3ducyB0aGUgY29udGVudEVkaXRhYmxlIGVkaXRvciwgaW5saW5lIHBpbGxzLCBtb2RlXG4gKiBjb250cm9sbGVyLCBzdWJtaXQgYnV0dG9uIHNsb3QsIGFuZCBhbiBlbWJlZGRlZFxuICoge0BsaW5rIEFJQXV0b2NvbXBsZXRlQ29udHJvbGxlcn0gdGhhdCBkcml2ZXMgdGhlIGRyb3Bkb3duLlxuICpcbiAqIEBwdWJsaWNcbiAqL1xuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiBcImFpLWF1dG9jb21wbGV0ZVwiLFxuICBzdGFuZGFsb25lOiB0cnVlLFxuICBpbXBvcnRzOiBbXG4gICAgQ29tbW9uTW9kdWxlLFxuICAgIEFJQXV0b2NvbXBsZXRlRHJvcGRvd25Db21wb25lbnQsXG4gICAgQUlBdXRvY29tcGxldGVFZGl0b3JIb3N0RGlyZWN0aXZlLFxuICAgIFBpbGxMaXN0Q29tcG9uZW50LFxuICAgIFN1Ym1pdEJ1dHRvbkNvbXBvbmVudCxcbiAgXSxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG4gIGVuY2Fwc3VsYXRpb246IFZpZXdFbmNhcHN1bGF0aW9uLk5vbmUsXG4gIHRlbXBsYXRlVXJsOiBcIi4vYWktYXV0b2NvbXBsZXRlLmNvbXBvbmVudC5odG1sXCIsXG4gIHN0eWxlVXJsczogW1wiLi9haS1hdXRvY29tcGxldGUuY29tcG9uZW50LmNzc1wiXSxcbiAgcHJvdmlkZXJzOiBbXG4gICAge1xuICAgICAgcHJvdmlkZTogTkdfVkFMVUVfQUNDRVNTT1IsXG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVzZS1iZWZvcmUtZGVmaW5lXG4gICAgICB1c2VFeGlzdGluZzogZm9yd2FyZFJlZigoKSA9PiBBSUF1dG9jb21wbGV0ZUNvbXBvbmVudCksXG4gICAgICBtdWx0aTogdHJ1ZSxcbiAgICB9LFxuICBdLFxufSlcbmV4cG9ydCBjbGFzcyBBSUF1dG9jb21wbGV0ZUNvbXBvbmVudFxuICBpbXBsZW1lbnRzIE9uSW5pdCwgQWZ0ZXJWaWV3SW5pdCwgT25DaGFuZ2VzLCBPbkRlc3Ryb3ksIENvbnRyb2xWYWx1ZUFjY2Vzc29yXG57XG4gIC8vID09PSBJbnB1dHMgKG1pcnJvcnMgUmVhY3QncyBBSUF1dG9jb21wbGV0ZVByb3BzKSA9PT1cblxuICBASW5wdXQoKSBhcGlDb25maWc/OiBBUElDb25maWc7XG4gIC8qKlxuICAgKiBPcHRpb25hbCB1c2VyIGNvbnRleHQuIEluY2x1ZGUgd2hhdGV2ZXIgeW91IGtub3cgYWJvdXQgdGhlIHVzZXIg4oCUIGFcbiAgICogcHJvZmlsZSwgcHJlZmVyZW5jZXMsIHdvcmtzcGFjZSwgYW55dGhpbmcg4oCUIHRvIHBlcnNvbmFsaXplIHN1Z2dlc3RlZFxuICAgKiBwYXJhbWV0ZXJzIGFuZCBvcHRpb25zIHRvIHRoZW0uIEJpbmQgYSBzdGFibGUgcmVmZXJlbmNlOyB0aGUgc2FtZSBzd2FwXG4gICAqIHJ1bGUgdGhhdCBhcHBsaWVzIHRvIGBhcGlDb25maWdgIGFwcGxpZXMgaGVyZS5cbiAgICovXG4gIEBJbnB1dCgpIGFkZGl0aW9uYWxDb250ZXh0PzogUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gIEBJbnB1dCgpIG9wdGlvbk92ZXJyaWRlcz86IE9wdGlvbk92ZXJyaWRlcztcbiAgQElucHV0KCkgbWFza0NvbXBsZXRlZFRleHQgPSBmYWxzZTtcbiAgQElucHV0KCkgY29sdW1ucz86IG51bWJlcjtcbiAgLyoqIFdoZXJlIHVuZmlsbGVkIHBpbGxzIHJlbmRlci4gRGVmYXVsdDogXCJkcm9wZG93blwiLiAqL1xuICBASW5wdXQoKSBwaWxsUGxhY2VtZW50OiBcImlubGluZVwiIHwgXCJkcm9wZG93blwiIHwgXCJoaWRkZW5cIiA9IFwiZHJvcGRvd25cIjtcbiAgLyoqIENvbG9yIG1vZGUuIFwiYXV0b1wiIGZvbGxvd3MgcHJlZmVycy1jb2xvci1zY2hlbWUuIERlZmF1bHQ6IFwiYXV0b1wiLiAqL1xuICBASW5wdXQoKSBtb2RlOiBBcHBlYXJhbmNlTW9kZSA9IFwiYXV0b1wiO1xuICBASW5wdXQoKSBvcHRpb25zUG9zaXRpb246IFwiYWJvdmVcIiB8IFwiYmVsb3dcIiA9IFwiYmVsb3dcIjtcbiAgQElucHV0KCkgYW5pbWF0aW9ucyA9IHRydWU7XG4gIEBJbnB1dCgpIGRyb3Bkb3duVHJpZ2dlcj86IFwiYXV0b1wiIHwgXCJtYW51YWxcIiB8IFwiaGlkZGVuXCI7XG4gIEBJbnB1dCgpIGNsb3NlRHJvcGRvd25PbkJsdXI/OiBib29sZWFuO1xuICBASW5wdXQoKSBzaG93Tm9uVGFwcGFibGVPcHRpb25zPzogYm9vbGVhbjtcbiAgLyoqXG4gICAqIFdoZW4gdHJ1ZSAoZGVmYXVsdCksIHRoZSBkcm9wZG93bidzIHBpbGwgYmFyIGVuZHMgaW4gYSBzbWFsbCBcInNraXBcIiBidXR0b25cbiAgICogdGhhdCBkaXNtaXNzZXMgdGhlIGFjdGl2ZSBwaWxsIOKAlCBzYW1lIGFjdGlvbiBhcyBwcmVzc2luZyDihpIgYXQgdGhlIGVuZCBvZlxuICAgKiB0aGUgaW5wdXQuIFNldCB0byBmYWxzZSB0byBoaWRlIGl0LiBXaGVuIHBpbGxzIHJlbmRlciBlbHNld2hlcmVcbiAgICogKGBwaWxsUGxhY2VtZW50OiBcImlubGluZVwiYCAvIGBcImhpZGRlblwiYCkgdGhlIGJhciByZW5kZXJzIGFzIGEgc2tpcC1vbmx5XG4gICAqIHJvdyBob2xkaW5nIGp1c3QgdGhlIGJ1dHRvbi4gSGlkZGVuIHdoaWxlIHRoZSBpbnB1dCBpcyBlbXB0eSDigJQgaXQgYXBwZWFyc1xuICAgKiBhbG9uZ3NpZGUgdGhlIGZvb3RlcidzIFwi4oaSIHRvIHNraXBcIiBoaW50IG9uY2UgdGhlIHVzZXIgaGFzIHR5cGVkLlxuICAgKi9cbiAgQElucHV0KCkgc2hvd1NraXBCdXR0b24gPSB0cnVlO1xuICAvKiogRm9jdXMgdGhlIGVkaXRvciBvbiBtb3VudC4gRGVmYXVsdDogdHJ1ZS4gKi9cbiAgQElucHV0KCkgYXV0b0ZvY3VzID0gdHJ1ZTtcbiAgLyoqIENvbnRyb2xsZWQtbW9kZSB0ZXh0IHZhbHVlLiAqL1xuICBASW5wdXQoKSB2YWx1ZT86IHN0cmluZztcbiAgLyoqIENvbnRyb2xsZWQtbW9kZSBjb21wbGV0ZWQgcGFyYW1zLiAqL1xuICBASW5wdXQoKSBjb21wbGV0ZWRQYXJhbXM/OiBDb21wbGV0ZWRQYXJhbVN0YXRlW107XG4gIC8qKlxuICAgKiBPcHQtaW4gcHJvZHVjdCBzdHJpcC4gV2hlbiBzZXQsIHRoZSBkcm9wZG93biByZW5kZXJzIGEgaG9yaXpvbnRhbCByb3cgb2ZcbiAgICogcHJvZHVjdCBjYXJkcyBiZWxvdyB0aGUgb3B0aW9ucyBncmlkLCBmZWQgYnkgeW91ciBvd24gc2VhcmNoIGVuZHBvaW50IG9uXG4gICAqIHRoZSBTREsncyBleGlzdGluZyBmZXRjaCBjYWRlbmNlLiBPbWl0IGl0IGFuZCBub3RoaW5nIGFib3V0IHRoZSBkcm9wZG93blxuICAgKiBjaGFuZ2VzIOKAlCBubyByZXF1ZXN0LCBubyBtYXJrdXAsIG5vIGxheW91dCBzaGlmdC5cbiAgICpcbiAgICogQmluZCBhIHN0YWJsZSByZWZlcmVuY2UgKGEgY29tcG9uZW50IGZpZWxkLCBub3QgYW4gaW5saW5lIG9iamVjdCBsaXRlcmFsKTpcbiAgICogYSBuZXcgb2JqZWN0IG9uIGVhY2ggY2hhbmdlLWRldGVjdGlvbiBwYXNzIHJlYWRzIGFzIGEgc3dhcHBlZCBpbnRlZ3JhdGlvblxuICAgKiBhbmQgY2xlYXJzIHRoZSBjdXJyZW50IGNhcmRzIOKAlCB0aGUgc2FtZSBydWxlIHRoYXQgYWxyZWFkeSBhcHBsaWVzIHRvXG4gICAqIGBhcGlDb25maWdgIGFuZCBgb3B0aW9uT3ZlcnJpZGVzYC5cbiAgICovXG4gIEBJbnB1dCgpIHByb2R1Y3RzPzogUHJvZHVjdHNDb25maWc7XG4gIC8qKlxuICAgKiBDdXN0b20gc3VibWl0IGJ1dHRvbi4gUGFzcyBhIGA8bmctdGVtcGxhdGU+YCB0byByZXBsYWNlIHRoZSBkZWZhdWx0IGFycm93XG4gICAqIGJ1dHRvbi4gUGFzcyBgbnVsbGAgdG8gcmVuZGVyIG5vIGJ1dHRvbi4gRGVmYXVsdCAoYHVuZGVmaW5lZGApIHJlbmRlcnNcbiAgICogdGhlIGJ1aWx0LWluIGFycm93LlxuICAgKi9cbiAgQElucHV0KCkgc3VibWl0QnV0dG9uPzogVGVtcGxhdGVSZWY8dW5rbm93bj4gfCBudWxsO1xuXG4gIC8vID09PSBPdXRwdXRzID09PVxuXG4gIC8qKiBDYWxsZWQgb24gRW50ZXIgb3Igc3VibWl0LWJ1dHRvbiBjbGljay4gKi9cbiAgQE91dHB1dCgpIHJlYWRvbmx5IHN1Ym1pdHRlZCA9IG5ldyBFdmVudEVtaXR0ZXI8QXV0b2NvbXBsZXRlUmVzdWx0PigpO1xuICBAT3V0cHV0KCkgcmVhZG9ubHkgZXJyb3JlZCA9IG5ldyBFdmVudEVtaXR0ZXI8RXJyb3I+KCk7XG4gIEBPdXRwdXQoKSByZWFkb25seSB2YWx1ZUNoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8c3RyaW5nPigpO1xuICBAT3V0cHV0KCkgcmVhZG9ubHkgY29tcGxldGVkUGFyYW1zQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxDb21wbGV0ZWRQYXJhbVN0YXRlW10+KCk7XG4gIEBPdXRwdXQoKSByZWFkb25seSBmb2N1c2VkID0gbmV3IEV2ZW50RW1pdHRlcjx2b2lkPigpO1xuICBAT3V0cHV0KCkgcmVhZG9ubHkgYmx1cnJlZCA9IG5ldyBFdmVudEVtaXR0ZXI8dm9pZD4oKTtcbiAgLyoqXG4gICAqIEVtaXR0ZWQgd2hlbiB0aGUgdXNlciBhY3RpdmF0ZXMgYSBwcm9kdWN0IGNhcmQuIFRoZSBTREsgZG9lcyBub3RcbiAgICogbmF2aWdhdGUg4oCUIHlvdSBkZWNpZGUgd2hhdCBhIHNlbGVjdGlvbiBtZWFucy4gTW9kaWZpZXIgLyBtaWRkbGUgY2xpY2tzIGFyZVxuICAgKiBsZWZ0IHRvIHRoZSBicm93c2VyIChjbWQtY2xpY2sgc3RpbGwgb3BlbnMgYSB0YWIpIGFuZCBkb24ndCBlbWl0LlxuICAgKi9cbiAgQE91dHB1dCgpIHJlYWRvbmx5IHByb2R1Y3RTZWxlY3QgPSBuZXcgRXZlbnRFbWl0dGVyPFByb2R1Y3Q+KCk7XG5cbiAgLy8gPT09IFZpZXcgcmVmcyA9PT1cblxuICBAVmlld0NoaWxkKFwiY29udGFpbmVyXCIsIHsgc3RhdGljOiB0cnVlIH0pIGNvbnRhaW5lclJlZiE6IEVsZW1lbnRSZWY8SFRNTERpdkVsZW1lbnQ+O1xuICBAVmlld0NoaWxkKFwiZWRpdG9yXCIsIHsgc3RhdGljOiBmYWxzZSB9KSBlZGl0b3JSZWY/OiBFbGVtZW50UmVmPEhUTUxEaXZFbGVtZW50PjtcbiAgQFZpZXdDaGlsZChcInBpbGxDb250YWluZXJcIikgcGlsbENvbnRhaW5lclJlZj86IEVsZW1lbnRSZWY8SFRNTFNwYW5FbGVtZW50PjtcblxuICAvLyA9PT0gUHVibGljIHN0YXRlIGZvciB0aGUgdGVtcGxhdGUgPT09XG5cbiAgY29udHJvbGxlciE6IEFJQXV0b2NvbXBsZXRlQ29udHJvbGxlcjtcbiAgLyoqXG4gICAqIENvbmNyZXRlIGxpZ2h0L2RhcmsgdmFsdWUgYm91bmQgdG8gYFthdHRyLmRhdGEtbW9kZV1gLiBTZWVkZWQgaW4gbmdPbkluaXRcbiAgICogc28gdGhlIGF0dHJpYnV0ZSBpcyBwcmVzZW50IGR1cmluZyBTU1IgKHdoZXJlIE1vZGVDb250cm9sbGVyLCBnYXRlZCBiZWhpbmRcbiAgICogaXNQbGF0Zm9ybUJyb3dzZXIgaW4gbmdBZnRlclZpZXdJbml0LCBuZXZlciBydW5zKS4gT24gdGhlIGJyb3dzZXIgdGhlXG4gICAqIE1vZGVDb250cm9sbGVyJ3MgcmVzb2x2ZSBjYWxsYmFjayBrZWVwcyB0aGlzIGluIHN5bmMg4oCUIHNvIGl0cyBydW50aW1lXG4gICAqIHByZWZlcnMtY29sb3Itc2NoZW1lIHVwZGF0ZXMgYW5kIHRoaXMgYmluZGluZyBhbHdheXMgYWdyZWUgKG5vIGNsb2JiZXIpLlxuICAgKi9cbiAgcmVzb2x2ZWRNb2RlOiBcImxpZ2h0XCIgfCBcImRhcmtcIiA9IFwiZGFya1wiO1xuXG4gIC8vID09PSBJbnRlcm5hbCA9PT1cblxuICBwcml2YXRlIG1vZGVDb250cm9sbGVyPzogTW9kZUNvbnRyb2xsZXI7XG4gIHByaXZhdGUgcmVzaXplT2JzZXJ2ZXI/OiBSZXNpemVPYnNlcnZlcjtcbiAgcHJpdmF0ZSBvbkNoYW5nZUZuOiAodmFsdWU6IHN0cmluZykgPT4gdm9pZCA9IG5vb3A7XG4gIHByaXZhdGUgb25Ub3VjaGVkRm46ICgpID0+IHZvaWQgPSBub29wO1xuICAvLyBIb2xkcyBhIHZhbHVlIHdyaXR0ZW4gYnkgUmVhY3RpdmUgRm9ybXMgYmVmb3JlIG5nT25Jbml0IHJhbi4gUmVhY3RpdmVcbiAgLy8gRm9ybXMgY2FuIGNhbGwgd3JpdGVWYWx1ZSgpIGR1cmluZyBkeW5hbWljIGZvcm0gY29uc3RydWN0aW9uIChlLmcuIHdoZW5cbiAgLy8gYSBGb3JtQ29udHJvbCBhbHJlYWR5IGhvbGRzIGEgdmFsdWUgYXQgdGhlIG1vbWVudCB0aGUgZGlyZWN0aXZlIGlzXG4gIC8vIGNyZWF0ZWQpLiBXZSBzdGFzaCB0aGUgdmFsdWUgaGVyZSBhbmQgZmx1c2ggaXQgaW4gbmdPbkluaXQgKmFmdGVyKlxuICAvLyB0aGUgY29udHJvbGxlciBleGlzdHMg4oCUIG90aGVyd2lzZSB0aGUgZWRpdG9yIHJlbmRlcnMgZW1wdHkgZXZlbiB0aG91Z2hcbiAgLy8gdGhlIGZvcm0gaGFkIGEgdmFsdWUuIGB1bmRlZmluZWRgIG1lYW5zIFwibm8gcGVuZGluZyB3cml0ZVwiLlxuICBwcml2YXRlIHBlbmRpbmdXcml0ZVZhbHVlOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG5cbiAgLy8gwqcxNi45OiBwcmVmZXIgYGluamVjdCgpYCBvdmVyIGNvbnN0cnVjdG9yLXBhcmFtZXRlciBESSBmb3IgY29tcG9uZW50cy5cbiAgcHJpdmF0ZSByZWFkb25seSBwbGF0Zm9ybUlkID0gaW5qZWN0KFBMQVRGT1JNX0lEKTtcbiAgcHJpdmF0ZSByZWFkb25seSB6b25lID0gaW5qZWN0KE5nWm9uZSk7XG4gIHByaXZhdGUgcmVhZG9ubHkgY2RyID0gaW5qZWN0KENoYW5nZURldGVjdG9yUmVmKTtcblxuICBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICAvLyBTZWVkIGJlZm9yZSB0aGUgYnJvd3NlciBndWFyZCBzbyBTU1IgcmVuZGVycyBhIGNvbmNyZXRlIGRhdGEtbW9kZS5cbiAgICB0aGlzLnJlc29sdmVkTW9kZSA9IHJlc29sdmVJbml0aWFsTW9kZSh0aGlzLm1vZGUpO1xuICAgIGlmICghaXNQbGF0Zm9ybUJyb3dzZXIodGhpcy5wbGF0Zm9ybUlkKSkgcmV0dXJuO1xuXG4gICAgdGhpcy5jb250cm9sbGVyID0gbmV3IEFJQXV0b2NvbXBsZXRlQ29udHJvbGxlcih7XG4gICAgICBhcGlDb25maWc6IHRoaXMuYXBpQ29uZmlnLFxuICAgICAgYWRkaXRpb25hbENvbnRleHQ6IHRoaXMuYWRkaXRpb25hbENvbnRleHQsXG4gICAgICBvcHRpb25PdmVycmlkZXM6IHRoaXMub3B0aW9uT3ZlcnJpZGVzLFxuICAgICAgbWFza0NvbXBsZXRlZFRleHQ6IHRoaXMubWFza0NvbXBsZXRlZFRleHQsXG4gICAgICBjb2x1bW5zOiB0aGlzLmNvbHVtbnMsXG4gICAgICBkcm9wZG93blRyaWdnZXI6IHRoaXMuZHJvcGRvd25UcmlnZ2VyLFxuICAgICAgb3B0aW9uc1Bvc2l0aW9uOiB0aGlzLm9wdGlvbnNQb3NpdGlvbixcbiAgICAgIGNsb3NlRHJvcGRvd25PbkJsdXI6IHRoaXMuY2xvc2VEcm9wZG93bk9uQmx1cixcbiAgICAgIHNob3dOb25UYXBwYWJsZU9wdGlvbnM6IHRoaXMuc2hvd05vblRhcHBhYmxlT3B0aW9ucyxcbiAgICAgIHNvdXJjZTogXCJmdWxsLXNka1wiLFxuICAgICAgcHJvZHVjdHM6IHRoaXMucHJvZHVjdHMsXG4gICAgICB2YWx1ZTogdGhpcy52YWx1ZSxcbiAgICAgIGNvbXBsZXRlZFBhcmFtczogdGhpcy5jb21wbGV0ZWRQYXJhbXMsXG4gICAgICBvblN1Ym1pdDogKHJlc3VsdCkgPT4gdGhpcy5oYW5kbGVTdWJtaXQocmVzdWx0KSxcbiAgICAgIG9uRXJyb3I6IChlcnJvcikgPT4gdGhpcy5lcnJvcmVkLmVtaXQoZXJyb3IpLFxuICAgICAgb25DaGFuZ2U6ICh0ZXh0KSA9PiB7XG4gICAgICAgIHRoaXMudmFsdWVDaGFuZ2UuZW1pdCh0ZXh0KTtcbiAgICAgICAgdGhpcy5vbkNoYW5nZUZuKHRleHQpO1xuICAgICAgfSxcbiAgICAgIG9uUGFyYW1zQ2hhbmdlOiAocGFyYW1zKSA9PiB0aGlzLmNvbXBsZXRlZFBhcmFtc0NoYW5nZS5lbWl0KHBhcmFtcyksXG4gICAgICBvbkZvY3VzOiAoKSA9PiB0aGlzLmZvY3VzZWQuZW1pdCgpLFxuICAgICAgb25Qcm9kdWN0U2VsZWN0OiAocHJvZHVjdCkgPT4gdGhpcy5wcm9kdWN0U2VsZWN0LmVtaXQocHJvZHVjdCksXG4gICAgICBvbkJsdXI6ICgpID0+IHtcbiAgICAgICAgdGhpcy5ibHVycmVkLmVtaXQoKTtcbiAgICAgICAgdGhpcy5vblRvdWNoZWRGbigpO1xuICAgICAgfSxcbiAgICAgIHNldEN1cnNvcjogKG9mZnNldCkgPT4ge1xuICAgICAgICBjb25zdCBlZGl0b3IgPSB0aGlzLmVkaXRvclJlZj8ubmF0aXZlRWxlbWVudDtcbiAgICAgICAgaWYgKCFlZGl0b3IpIHJldHVybjtcbiAgICAgICAgZWRpdG9yLmZvY3VzKCk7XG4gICAgICAgIHNldEN1cnNvck9mZnNldChlZGl0b3IsIG9mZnNldCk7XG4gICAgICB9LFxuICAgIH0pO1xuXG4gICAgaWYgKHRoaXMucGVuZGluZ1dyaXRlVmFsdWUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5jb250cm9sbGVyLnNldFZhbHVlKHRoaXMucGVuZGluZ1dyaXRlVmFsdWUpO1xuICAgICAgdGhpcy5wZW5kaW5nV3JpdGVWYWx1ZSA9IHVuZGVmaW5lZDtcbiAgICB9XG4gIH1cblxuICBuZ0FmdGVyVmlld0luaXQoKTogdm9pZCB7XG4gICAgaWYgKCFpc1BsYXRmb3JtQnJvd3Nlcih0aGlzLnBsYXRmb3JtSWQpKSByZXR1cm47XG4gICAgLy8gTW9kZUNvbnRyb2xsZXIgd3JpdGVzIGBkYXRhLW1vZGVgIHRvIHRoZSBlbGVtZW50IGl0J3MgZ2l2ZW4uIFRoZSBDU1NcbiAgICAvLyBzZWxlY3RvcnMgYXJlIHNjb3BlZCB0byBgLm1hZ2ljeC1haWFbZGF0YS1tb2RlPVwiLi4uXCJdYCDigJQgd2hpY2ggbGl2ZXMgb25cbiAgICAvLyB0aGUgaW5uZXIgYDxkaXYgY2xhc3M9XCJtYWdpY3gtYWlhIG1hZ2ljeC1haWEtY29udGFpbmVyXCIgI2NvbnRhaW5lcj5gLFxuICAgIC8vIE5PVCB0aGUgaG9zdCBgPGFpLWF1dG9jb21wbGV0ZT5gIGVsZW1lbnQuIFRoZSByZXNvbHZlIGNhbGxiYWNrIG1pcnJvcnNcbiAgICAvLyB0aGUgdmFsdWUgaW50byBgcmVzb2x2ZWRNb2RlYCBzbyB0aGUgYFthdHRyLmRhdGEtbW9kZV1gIGJpbmRpbmcgc3RheXMgaW5cbiAgICAvLyBsb2Nrc3RlcCB3aXRoIE1vZGVDb250cm9sbGVyIOKAlCB0aGUgYmluZGluZyBoYW5kbGVzIFNTUiwgTW9kZUNvbnRyb2xsZXJcbiAgICAvLyBoYW5kbGVzIHJ1bnRpbWUgcHJlZmVycy1jb2xvci1zY2hlbWUgc3dpdGNoZXMsIGFuZCBiZWNhdXNlIHRoZXkgYWx3YXlzXG4gICAgLy8gYWdyZWUgbmVpdGhlciBjbG9iYmVycyB0aGUgb3RoZXIuXG4gICAgdGhpcy5tb2RlQ29udHJvbGxlciA9IG5ldyBNb2RlQ29udHJvbGxlcihcbiAgICAgIHRoaXMuY29udGFpbmVyUmVmLm5hdGl2ZUVsZW1lbnQsXG4gICAgICB0aGlzLm1vZGUsXG4gICAgICAocmVzb2x2ZWQpID0+IHtcbiAgICAgICAgdGhpcy5yZXNvbHZlZE1vZGUgPSByZXNvbHZlZDtcbiAgICAgICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gICAgICB9LFxuICAgICk7XG5cbiAgICAvLyBQaWxsLXdyYXAgZGV0ZWN0aW9uIOKAlCB3aGVuIHRoZSBwaWxsIGxpc3Qgd3JhcHMgYmVsb3cgdGhlIGVkaXRvcidzIGxhc3RcbiAgICAvLyBsaW5lLCBkcm9wIGl0cyA4cHggbGVmdCBtYXJnaW4gdmlhIGEgZGF0YSBhdHRyaWJ1dGUgdGhlIENTUyBrZXlzIG9mZi5cbiAgICAvLyBNaXJyb3JzIHRoZSBSZWFjdCBjb21wb25lbnQncyB1c2VMYXlvdXRFZmZlY3QuXG4gICAgaWYgKHR5cGVvZiBSZXNpemVPYnNlcnZlciAhPT0gXCJ1bmRlZmluZWRcIikge1xuICAgICAgdGhpcy56b25lLnJ1bk91dHNpZGVBbmd1bGFyKCgpID0+IHtcbiAgICAgICAgdGhpcy5yZXNpemVPYnNlcnZlciA9IG5ldyBSZXNpemVPYnNlcnZlcigoKSA9PiB0aGlzLm1lYXN1cmVQaWxsV3JhcCgpKTtcbiAgICAgICAgY29uc3QgZWRpdG9yID0gdGhpcy5lZGl0b3JSZWY/Lm5hdGl2ZUVsZW1lbnQ7XG4gICAgICAgIGlmIChlZGl0b3IpIHRoaXMucmVzaXplT2JzZXJ2ZXIub2JzZXJ2ZShlZGl0b3IpO1xuICAgICAgfSk7XG4gICAgICB0aGlzLm1lYXN1cmVQaWxsV3JhcCgpO1xuICAgIH1cbiAgfVxuXG4gIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuY29udHJvbGxlcikgcmV0dXJuO1xuICAgIC8vIGBTaW1wbGVDaGFuZ2VzYCBpcyBgeyBba2V5OiBzdHJpbmddOiBTaW1wbGVDaGFuZ2UgfWAsIHNvIHBlclxuICAgIC8vIGBub1Byb3BlcnR5QWNjZXNzRnJvbUluZGV4U2lnbmF0dXJlYCBlYWNoIGtleSBsb29rdXAgdXNlcyBicmFja2V0XG4gICAgLy8gbm90YXRpb24g4oCUIHRoaXMga2VlcHMgdGhlIHN0cmljdG5lc3MgY29udHJhY3QgdGhhdCB0aGUgcmVzdCBvZiB0aGVcbiAgICAvLyB3b3Jrc3BhY2UgZW5mb3JjZXMuXG4gICAgLy8gQ29udHJvbGxlZC1tb2RlIHByb3BhZ2F0aW9uXG4gICAgaWYgKGNoYW5nZXNbXCJ2YWx1ZVwiXSAmJiB0aGlzLnZhbHVlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMuY29udHJvbGxlci5zZXRWYWx1ZSh0aGlzLnZhbHVlKTtcbiAgICB9XG4gICAgaWYgKGNoYW5nZXNbXCJjb21wbGV0ZWRQYXJhbXNcIl0gJiYgdGhpcy5jb21wbGV0ZWRQYXJhbXMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5jb250cm9sbGVyLnNldENvbXBsZXRlZFBhcmFtcyh0aGlzLmNvbXBsZXRlZFBhcmFtcyk7XG4gICAgfVxuICAgIC8vIFJlYWN0aXZlIG9wdGlvbnNcbiAgICBpZiAoXG4gICAgICBjaGFuZ2VzW1wiYXBpQ29uZmlnXCJdIHx8XG4gICAgICBjaGFuZ2VzW1wiYWRkaXRpb25hbENvbnRleHRcIl0gfHxcbiAgICAgIGNoYW5nZXNbXCJvcHRpb25PdmVycmlkZXNcIl0gfHxcbiAgICAgIGNoYW5nZXNbXCJkcm9wZG93blRyaWdnZXJcIl0gfHxcbiAgICAgIGNoYW5nZXNbXCJvcHRpb25zUG9zaXRpb25cIl0gfHxcbiAgICAgIGNoYW5nZXNbXCJjbG9zZURyb3Bkb3duT25CbHVyXCJdIHx8XG4gICAgICBjaGFuZ2VzW1wic2hvd05vblRhcHBhYmxlT3B0aW9uc1wiXSB8fFxuICAgICAgY2hhbmdlc1tcInByb2R1Y3RzXCJdXG4gICAgKSB7XG4gICAgICB0aGlzLmNvbnRyb2xsZXIudXBkYXRlKHtcbiAgICAgICAgYXBpQ29uZmlnOiB0aGlzLmFwaUNvbmZpZyxcbiAgICAgICAgYWRkaXRpb25hbENvbnRleHQ6IHRoaXMuYWRkaXRpb25hbENvbnRleHQsXG4gICAgICAgIG9wdGlvbk92ZXJyaWRlczogdGhpcy5vcHRpb25PdmVycmlkZXMsXG4gICAgICAgIGRyb3Bkb3duVHJpZ2dlcjogdGhpcy5kcm9wZG93blRyaWdnZXIsXG4gICAgICAgIG9wdGlvbnNQb3NpdGlvbjogdGhpcy5vcHRpb25zUG9zaXRpb24sXG4gICAgICAgIGNsb3NlRHJvcGRvd25PbkJsdXI6IHRoaXMuY2xvc2VEcm9wZG93bk9uQmx1cixcbiAgICAgICAgc2hvd05vblRhcHBhYmxlT3B0aW9uczogdGhpcy5zaG93Tm9uVGFwcGFibGVPcHRpb25zLFxuICAgICAgICAvLyBTYW1lIHJlZmVyZW5jZSBvbiBhbiB1bnJlbGF0ZWQgY2hhbmdlIGlzIGEgbm8tb3AgaW4gdGhlIGNvcmU7IG9ubHkgYVxuICAgICAgICAvLyBnZW51aW5lbHkgc3dhcHBlZCAob3IgcmVtb3ZlZCkgaW50ZWdyYXRpb24gY2xlYXJzIHRoZSBzdHJpcC5cbiAgICAgICAgcHJvZHVjdHM6IHRoaXMucHJvZHVjdHMsXG4gICAgICB9KTtcbiAgICB9XG4gICAgaWYgKGNoYW5nZXNbXCJtb2RlXCJdKSB7XG4gICAgICAvLyBLZWVwIHRoZSBiaW5kaW5nIGNvcnJlY3QgZXZlbiB3aGVuIE1vZGVDb250cm9sbGVyIGRvZXNuJ3QgZXhpc3QgeWV0XG4gICAgICAvLyAoU1NSIC8gcHJlLW5nQWZ0ZXJWaWV3SW5pdCkuIE9uIHRoZSBicm93c2VyLCBzZXRNb2RlIHRyaWdnZXJzIHRoZVxuICAgICAgLy8gcmVzb2x2ZSBjYWxsYmFjayB3aGljaCBzZXRzIHRoZSBzYW1lIHZhbHVlLlxuICAgICAgdGhpcy5yZXNvbHZlZE1vZGUgPSByZXNvbHZlSW5pdGlhbE1vZGUodGhpcy5tb2RlKTtcbiAgICAgIHRoaXMubW9kZUNvbnRyb2xsZXI/LnNldE1vZGUodGhpcy5tb2RlKTtcbiAgICB9XG4gIH1cblxuICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICB0aGlzLnJlc2l6ZU9ic2VydmVyPy5kaXNjb25uZWN0KCk7XG4gICAgdGhpcy5tb2RlQ29udHJvbGxlcj8uZGVzdHJveSgpO1xuICAgIHRoaXMuY29udHJvbGxlcj8uZGVzdHJveSgpO1xuICB9XG5cbiAgLy8gPT09IEltcGVyYXRpdmUgQVBJIChleHBvc2VkIG9uIHRoZSBjb21wb25lbnQgaW5zdGFuY2UgdmlhIEBWaWV3Q2hpbGQpID09PVxuXG4gIC8qKiBQcm9ncmFtbWF0aWNhbGx5IGZvY3VzIHRoZSBlZGl0b3IuICovXG4gIGZvY3VzKCk6IHZvaWQge1xuICAgIHRoaXMuZWRpdG9yUmVmPy5uYXRpdmVFbGVtZW50LmZvY3VzKCk7XG4gIH1cblxuICAvKiogUHJvZ3JhbW1hdGljYWxseSBibHVyIHRoZSBlZGl0b3IuICovXG4gIGJsdXIoKTogdm9pZCB7XG4gICAgdGhpcy5lZGl0b3JSZWY/Lm5hdGl2ZUVsZW1lbnQuYmx1cigpO1xuICB9XG5cbiAgLyoqIENsZWFyIGFsbCBzdGF0ZSwgcm90YXRlIHNlc3Npb24sIGFuZCByZS1mZXRjaC4gKi9cbiAgcmVzZXQoKTogdm9pZCB7XG4gICAgdGhpcy5jb250cm9sbGVyPy5yZXNldCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNraXAgdGhlIGFjdGl2ZSBwaWxsIOKAlCBzYW1lIGFjdGlvbiBhcyB0aGUgZHJvcGRvd24ncyBza2lwIGJ1dHRvbiAvIOKGki5cbiAgICogTGV0cyBhIGNvbnN1bWVyIHdobyBoaWRlcyB0aGUgYnVpbHQtaW4gYnV0dG9uIChgc2hvd1NraXBCdXR0b249ZmFsc2VgKVxuICAgKiBkcml2ZSBza2lwcGluZyBmcm9tIHRoZWlyIG93biBVSS5cbiAgICovXG4gIHNraXBBY3RpdmVQaWxsKCk6IHZvaWQge1xuICAgIHRoaXMuY29udHJvbGxlcj8uc2tpcEFjdGl2ZVBpbGwoKTtcbiAgfVxuXG4gIC8qKiBTd2l0Y2ggY29sb3IgbW9kZSBhdCBydW50aW1lLiAqL1xuICBzZXRNb2RlKG1vZGU6IEFwcGVhcmFuY2VNb2RlKTogdm9pZCB7XG4gICAgdGhpcy5tb2RlID0gbW9kZTtcbiAgICB0aGlzLnJlc29sdmVkTW9kZSA9IHJlc29sdmVJbml0aWFsTW9kZShtb2RlKTtcbiAgICB0aGlzLm1vZGVDb250cm9sbGVyPy5zZXRNb2RlKG1vZGUpO1xuICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICB9XG5cbiAgLy8gPT09IFRlbXBsYXRlIGhlbHBlcnMgPT09XG5cbiAgLyoqXG4gICAqICdkZWZhdWx0JyDihpIgcmVuZGVyIHRoZSBidWlsdC1pbiBhcnJvdyBidXR0b24uXG4gICAqICdjdXN0b20nICDihpIgcHJvamVjdCB0aGUgY29uc3VtZXItc3VwcGxpZWQgVGVtcGxhdGVSZWYuXG4gICAqICdoaWRkZW4nICDihpIgbm8gYnV0dG9uLlxuICAgKi9cbiAgZ2V0IHN1Ym1pdEJ1dHRvblN0YXRlKCk6IFwiZGVmYXVsdFwiIHwgXCJjdXN0b21cIiB8IFwiaGlkZGVuXCIge1xuICAgIGlmICh0aGlzLnN1Ym1pdEJ1dHRvbiA9PT0gbnVsbCkgcmV0dXJuIFwiaGlkZGVuXCI7XG4gICAgaWYgKHRoaXMuc3VibWl0QnV0dG9uID09PSB1bmRlZmluZWQpIHJldHVybiBcImRlZmF1bHRcIjtcbiAgICByZXR1cm4gXCJjdXN0b21cIjtcbiAgfVxuXG4gIC8qKiBOYXJyb3dlZCBhY2Nlc3NvciBmb3IgKm5nVGVtcGxhdGVPdXRsZXQg4oCUIG5ldmVyIHVuZGVmaW5lZC4gKi9cbiAgZ2V0IGN1c3RvbVN1Ym1pdFRlbXBsYXRlKCk6IFRlbXBsYXRlUmVmPHVua25vd24+IHwgbnVsbCB7XG4gICAgcmV0dXJuIHRoaXMuc3VibWl0QnV0dG9uID8/IG51bGw7XG4gIH1cblxuICBnZXQgc2hvd0lubGluZVBpbGxzKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLnBpbGxQbGFjZW1lbnQgPT09IFwiaW5saW5lXCI7XG4gIH1cblxuICBnZXQgc2hvd0Ryb3Bkb3duUGlsbHMoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMucGlsbFBsYWNlbWVudCA9PT0gXCJkcm9wZG93blwiO1xuICB9XG5cbiAgLyoqXG4gICAqIGB0cnVlYCB3aGVuIHRoZXJlJ3Mgc29tZXRoaW5nIHRvIHN1Ym1pdCDigJQgZHJpdmVuIGJ5IGN1cnJlbnQgc2VnbWVudHNcbiAgICogYW5kIGNvbXBsZXRlZCBwYXJhbXMuIFJlYWQgb2ZmIHRoZSBsaXZlIGVkaXRvciB2aWEgdGhlIGNvbnRyb2xsZXIgc3RhdGUuXG4gICAqL1xuICBjYW5TdWJtaXQoc3RhdGU6IHsgc2VnbWVudHM6IHsgbGVuZ3RoOiBudW1iZXIgfTsgY29tcGxldGVkUGFyYW1zOiB7IGxlbmd0aDogbnVtYmVyIH0gfSk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBzdGF0ZS5zZWdtZW50cy5sZW5ndGggPiAwIHx8IHN0YXRlLmNvbXBsZXRlZFBhcmFtcy5sZW5ndGggPiAwO1xuICB9XG5cbiAgb25XcmFwcGVyQ2xpY2soZXZlbnQ6IE1vdXNlRXZlbnQpOiB2b2lkIHtcbiAgICAvLyBDbGlja2luZyBhIHBpbGwgc2hvdWxkIGFjdGl2YXRlIGl0IHdpdGhvdXQgc3RlYWxpbmcgZm9jdXMgZWxzZXdoZXJlLlxuICAgIGNvbnN0IHRhcmdldCA9IGV2ZW50LnRhcmdldCBhcyBIVE1MRWxlbWVudCB8IG51bGw7XG4gICAgaWYgKHRhcmdldD8uY2xvc2VzdChcIltkYXRhLWFpYS1waWxsXVwiKSkgcmV0dXJuO1xuICAgIHRoaXMuZm9jdXMoKTtcbiAgfVxuXG4gIG9uU3VibWl0QnV0dG9uQ2xpY2soZXZlbnQ6IE1vdXNlRXZlbnQpOiB2b2lkIHtcbiAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICB0aGlzLmhhbmRsZVN1Ym1pdEZyb21Vc2VyQWN0aW9uKCk7XG4gIH1cblxuICBvblN1Ym1pdFNsb3RDbGljayhldmVudDogTW91c2VFdmVudCk6IHZvaWQge1xuICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgIHRoaXMuaGFuZGxlU3VibWl0RnJvbVVzZXJBY3Rpb24oKTtcbiAgfVxuXG4gIG9uU2VsZWN0UGlsbChpbmRleDogbnVtYmVyKTogdm9pZCB7XG4gICAgdGhpcy5jb250cm9sbGVyLnNldEFjdGl2ZVBpbGwoaW5kZXgpO1xuICB9XG5cbiAgLy8gPT09IENvbnRyb2xWYWx1ZUFjY2Vzc29yID09PVxuXG4gIHdyaXRlVmFsdWUodmFsdWU6IHN0cmluZyB8IG51bGwpOiB2b2lkIHtcbiAgICBjb25zdCBuZXh0ID0gdmFsdWUgPz8gXCJcIjtcbiAgICBpZiAoIXRoaXMuY29udHJvbGxlcikge1xuICAgICAgLy8gUmVhY3RpdmUgRm9ybXMgY2FuIGNhbGwgd3JpdGVWYWx1ZSgpIGJlZm9yZSBuZ09uSW5pdCBjcmVhdGVzIHRoZVxuICAgICAgLy8gY29udHJvbGxlciAoZHluYW1pYyBmb3JtIGNvbnN0cnVjdGlvbiwgb3IgYSBGb3JtQ29udHJvbCB0aGF0IGFscmVhZHlcbiAgICAgIC8vIGhhZCBhIHZhbHVlIGF0IGRpcmVjdGl2ZS1jcmVhdGlvbiB0aW1lKS4gQnVmZmVyIHRoZSB2YWx1ZTsgbmdPbkluaXRcbiAgICAgIC8vIGZsdXNoZXMgaXQgYXMgc29vbiBhcyB0aGUgY29udHJvbGxlciBleGlzdHMuXG4gICAgICB0aGlzLnBlbmRpbmdXcml0ZVZhbHVlID0gbmV4dDtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5jb250cm9sbGVyLnNldFZhbHVlKG5leHQpO1xuICB9XG5cbiAgcmVnaXN0ZXJPbkNoYW5nZShmbjogKHZhbHVlOiBzdHJpbmcpID0+IHZvaWQpOiB2b2lkIHtcbiAgICB0aGlzLm9uQ2hhbmdlRm4gPSBmbjtcbiAgfVxuXG4gIHJlZ2lzdGVyT25Ub3VjaGVkKGZuOiAoKSA9PiB2b2lkKTogdm9pZCB7XG4gICAgdGhpcy5vblRvdWNoZWRGbiA9IGZuO1xuICB9XG5cbiAgc2V0RGlzYWJsZWRTdGF0ZShfZGlzYWJsZWQ6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICAvLyBUaGUgY29udGVudEVkaXRhYmxlIGhvc3QgZG9lc24ndCBoYXZlIGEgbmF0aXZlIGRpc2FibGVkIGF0dHJpYnV0ZS4gRm9yXG4gICAgLy8gdjAuMSB3ZSBhY2NlcHQgdGhlIGNhbGwgc28gQW5ndWxhcidzIGZvcm1zIGxheWVyIGRvZXNuJ3QgdGhyb3csIGJ1dFxuICAgIC8vIHRoZSBlZGl0b3Igc3RheXMgaW50ZXJhY3RpdmUuIEEgZnV0dXJlIGVuaGFuY2VtZW50IGNhbiB0b2dnbGVcbiAgICAvLyBjb250ZW50RWRpdGFibGUgKyBBUklBIGRpc2FibGVkIGhlcmUuXG4gIH1cblxuICAvLyA9PT0gU3VibWl0IGZsb3cgPT09XG5cbiAgLyoqXG4gICAqIENhbGxlZCBieSB0aGUgY29udHJvbGxlcidzIG9uU3VibWl0IGNhbGxiYWNrICh3aGljaCBmaXJlcyBmcm9tIHRoZVxuICAgKiBrZXlib2FyZCBjb250cm9sbGVyIG9uIEVudGVyKS4gUmVhZHMgdGhlIGxpdmUgZWRpdG9yIHRleHQg4oCUIHNhbWUgdHJpY2tcbiAgICogdGhlIFJlYWN0IGNvbXBvbmVudCB1c2VzIOKAlCBzbyB0aGUgZW1pdHRlZCBxdWVyeSByZWZsZWN0cyB3aGF0ZXZlcidzIGluXG4gICAqIHRoZSBET00gcmlnaHQgbm93LCBub3QgYSBwb3NzaWJseS1zdGFsZSBzdGF0ZSBzbmFwc2hvdC5cbiAgICovXG4gIHByaXZhdGUgaGFuZGxlU3VibWl0KF9yZXN1bHQ6IEF1dG9jb21wbGV0ZVJlc3VsdCk6IHZvaWQge1xuICAgIGNvbnN0IGVkaXRvciA9IHRoaXMuZWRpdG9yUmVmPy5uYXRpdmVFbGVtZW50O1xuICAgIGlmICghZWRpdG9yKSByZXR1cm47XG4gICAgY29uc3QgdGV4dCA9IGV4dHJhY3RQbGFpblRleHQoZWRpdG9yKTtcbiAgICBjb25zdCBzdGF0ZSA9IHRoaXMuY29udHJvbGxlci5nZXRTdGF0ZSgpO1xuICAgIGNvbnN0IHBhcmFtcyA9IHRoaXMuY29tcGxldGVkUGFyYW1zID8/IHN0YXRlLmNvbXBsZXRlZFBhcmFtcztcbiAgICB0aGlzLnN1Ym1pdHRlZC5lbWl0KGJ1aWxkU3VibWl0UmVzdWx0KHRleHQsIHBhcmFtcywgc3RhdGUuc2tpcHBlZFBhcmFtcykpO1xuICAgIHRoaXMuY29udHJvbGxlci5yZXNldCgpO1xuICB9XG5cbiAgcHJpdmF0ZSBoYW5kbGVTdWJtaXRGcm9tVXNlckFjdGlvbigpOiB2b2lkIHtcbiAgICBjb25zdCBzdGF0ZSA9IHRoaXMuY29udHJvbGxlci5nZXRTdGF0ZSgpO1xuICAgIGlmICghdGhpcy5jYW5TdWJtaXQoc3RhdGUpKSByZXR1cm47XG4gICAgLy8gU3ludGhlc2l6ZSB0aGUgcmVzdWx0IGZvciB0aGUgc3VibWl0LWJ1dHRvbiBjbGljayBwYXRoOyBzYW1lIHNoYXBlXG4gICAgLy8gdGhlIGNvbnRyb2xsZXIgd291bGQgZGVsaXZlciBmcm9tIGEga2V5Ym9hcmQgRW50ZXIsIHNvIGhhbmRsZVN1Ym1pdFxuICAgIC8vIGNhbiB0YWtlIGVpdGhlciBlbnRyeSBwb2ludC5cbiAgICB0aGlzLmhhbmRsZVN1Ym1pdCh7XG4gICAgICBxdWVyeTogc3RhdGUudGV4dC50cmltKCksXG4gICAgICByYXdfcXVlcnk6IFwiXCIsXG4gICAgICBjb21wbGV0ZWRfcGFyYW1zOiBbXSxcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgbWVhc3VyZVBpbGxXcmFwKCk6IHZvaWQge1xuICAgIGNvbnN0IGNvbnRhaW5lciA9IHRoaXMucGlsbENvbnRhaW5lclJlZj8ubmF0aXZlRWxlbWVudDtcbiAgICBjb25zdCBlZGl0b3IgPSB0aGlzLmVkaXRvclJlZj8ubmF0aXZlRWxlbWVudDtcbiAgICBpZiAoIWNvbnRhaW5lciB8fCAhZWRpdG9yKSByZXR1cm47XG4gICAgY29uc3QgaW5uZXIgPSBjb250YWluZXIuZmlyc3RFbGVtZW50Q2hpbGQgYXMgSFRNTEVsZW1lbnQgfCBudWxsO1xuICAgIGlmICghaW5uZXIpIHJldHVybjtcbiAgICAvLyBXcmFwIGRldGVjdGlvbjogdGhlIHBpbGwgcm93J3MgdG9wIHZzIHRoZSBlZGl0b3IncyBib3R0b20uIFdoZW4gdGhlXG4gICAgLy8gcGlsbHMgc2l0IG9uIChvciBhYm92ZSkgdGhlIGVkaXRvcidzIGxhc3QgbGluZSB0aGV5J3JlIE5PVCB3cmFwcGVkIOKAlFxuICAgIC8vIGtlZXAgdGhlIDhweCBtYXJnaW4gc28gdGhleSBkb24ndCBidXR0IGFnYWluc3QgdHlwZWQgdGV4dCBvciB0aGVcbiAgICAvLyBwbGFjZWhvbGRlci4gVGhpcyBoYW5kbGVzIHRoZSBlbXB0eS1lZGl0b3IgKyBwbGFjZWhvbGRlciBjYXNlXG4gICAgLy8gbmF0dXJhbGx5OiB0aGUgcGxhY2Vob2xkZXIgc3RpbGwgb2NjdXBpZXMgdGhlIGVkaXRvcidzIGxpbmUgYm94LlxuICAgIGNvbnN0IGNSZWN0ID0gaW5uZXIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgY29uc3QgZVJlY3QgPSBlZGl0b3IuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgY29uc3Qgd3JhcHBlZCA9IGNSZWN0LnRvcCA+PSBlUmVjdC5ib3R0b20gLSAyO1xuICAgIHRoaXMuem9uZS5ydW4oKCkgPT4ge1xuICAgICAgaWYgKHdyYXBwZWQpIGNvbnRhaW5lci5zZXRBdHRyaWJ1dGUoXCJkYXRhLWFpYS1waWxsLXdyYXBwZWRcIiwgXCJcIik7XG4gICAgICBlbHNlIGNvbnRhaW5lci5yZW1vdmVBdHRyaWJ1dGUoXCJkYXRhLWFpYS1waWxsLXdyYXBwZWRcIik7XG4gICAgfSk7XG4gIH1cbn1cblxuZnVuY3Rpb24gbm9vcCgpOiB2b2lkIHtcbiAgLy8gRGVmYXVsdCBuby1vcCBmb3IgQ1ZBIGNhbGxiYWNrcy5cbn1cblxuLyoqXG4gKiBSZXNvbHZlIGEgY29uY3JldGUgbGlnaHQvZGFyayB2YWx1ZSBmcm9tIHRoZSBjb25maWd1cmVkIG1vZGUuIFVzZWQgdG8gc2VlZFxuICogdGhlIGBkYXRhLW1vZGVgIGF0dHJpYnV0ZSBzeW5jaHJvbm91c2x5IChpbmNsdWRpbmcgZHVyaW5nIFNTUiwgd2hlcmVcbiAqIE1vZGVDb250cm9sbGVyIG5ldmVyIHJ1bnMpLiBPbiB0aGUgc2VydmVyIGB3aW5kb3dgIGlzIHVuZGVmaW5lZCDihpIgZGVmYXVsdHNcbiAqIHRvIFwiZGFya1wiIChtYXRjaGVzIHRoZSB2YW5pbGxhL1JlYWN0IGJlaGF2aW9yKS5cbiAqL1xuZnVuY3Rpb24gcmVzb2x2ZUluaXRpYWxNb2RlKG1vZGU6IEFwcGVhcmFuY2VNb2RlKTogXCJsaWdodFwiIHwgXCJkYXJrXCIge1xuICBpZiAobW9kZSAhPT0gXCJhdXRvXCIpIHJldHVybiBtb2RlO1xuICBpZiAodHlwZW9mIHdpbmRvdyA9PT0gXCJ1bmRlZmluZWRcIikgcmV0dXJuIFwiZGFya1wiO1xuICByZXR1cm4gd2luZG93Lm1hdGNoTWVkaWEoXCIocHJlZmVycy1jb2xvci1zY2hlbWU6IGRhcmspXCIpLm1hdGNoZXMgPyBcImRhcmtcIiA6IFwibGlnaHRcIjtcbn1cbiIsIjxkaXZcbiAgI2NvbnRhaW5lclxuICBjbGFzcz1cIm1hZ2ljeC1haWEgbWFnaWN4LWFpYS1jb250YWluZXJcIlxuICBbYXR0ci5kYXRhLXBpbGwtcGxhY2VtZW50XT1cInBpbGxQbGFjZW1lbnRcIlxuICBbYXR0ci5kYXRhLW9wdGlvbnMtcG9zaXRpb25dPVwib3B0aW9uc1Bvc2l0aW9uXCJcbiAgW2F0dHIuZGF0YS1hbmltYXRpb25zXT1cImFuaW1hdGlvbnMgPyAnb24nIDogJ29mZidcIlxuICBbYXR0ci5kYXRhLW1vZGVdPVwicmVzb2x2ZWRNb2RlXCJcbj5cbiAgPGFpLWF1dG9jb21wbGV0ZS1kcm9wZG93blxuICAgICpuZ0lmPVwiY29udHJvbGxlclwiXG4gICAgW2NvbnRyb2xsZXJdPVwiY29udHJvbGxlclwiXG4gICAgW3Nob3dQaWxsc109XCJzaG93RHJvcGRvd25QaWxsc1wiXG4gICAgW3Nob3dTa2lwQnV0dG9uXT1cInNob3dTa2lwQnV0dG9uXCJcbiAgPjwvYWktYXV0b2NvbXBsZXRlLWRyb3Bkb3duPlxuXG4gIDxkaXZcbiAgICBjbGFzcz1cIm1hZ2ljeC1haWEtaW5wdXQtd3JhcHBlclwiXG4gICAgKGNsaWNrKT1cIm9uV3JhcHBlckNsaWNrKCRldmVudClcIlxuICAgIChrZXl1cCk9XCIkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKClcIlxuICA+XG4gICAgPGRpdiBjbGFzcz1cIm1hZ2ljeC1haWEtZWRpdG9yLWFyZWFcIiBkYXRhLWFpYS1lZGl0b3I9XCJcIj5cbiAgICAgIDxkaXZcbiAgICAgICAgI2VkaXRvclxuICAgICAgICAqbmdJZj1cImNvbnRyb2xsZXJcIlxuICAgICAgICBbYWlhRWRpdG9ySG9zdF09XCJjb250cm9sbGVyXCJcbiAgICAgICAgW2F1dG9Gb2N1c109XCJhdXRvRm9jdXNcIlxuICAgICAgICBjbGFzcz1cIm1hZ2ljeC1haWEtaW5wdXRcIlxuICAgICAgICBkYXRhLWFpYS1pbnB1dD1cIlwiXG4gICAgICA+PC9kaXY+XG5cbiAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJjb250cm9sbGVyICYmIHNob3dJbmxpbmVQaWxsc1wiPlxuICAgICAgICA8c3BhblxuICAgICAgICAgICNwaWxsQ29udGFpbmVyXG4gICAgICAgICAgY2xhc3M9XCJtYWdpY3gtYWlhLXBpbGwtbGlzdC1jb250YWluZXJcIlxuICAgICAgICAgIGRhdGEtYWlhLXBpbGwtbGlzdC1jb250YWluZXI9XCJcIlxuICAgICAgICAgICpuZ0lmPVwiXG4gICAgICAgICAgICAoY29udHJvbGxlci5pc0xvYWRpbmckIHwgYXN5bmMpIHx8XG4gICAgICAgICAgICAgICgoY29udHJvbGxlci5zdWdnZXN0aW9uUGlsbHMkIHwgYXN5bmMpPy5sZW5ndGggPz8gMCkgPiAwXG4gICAgICAgICAgXCJcbiAgICAgICAgPlxuICAgICAgICAgIDxhaWEtcGlsbC1saXN0XG4gICAgICAgICAgICBbcGlsbHNdPVwiKGNvbnRyb2xsZXIuc3VnZ2VzdGlvblBpbGxzJCB8IGFzeW5jKSA/PyBbXVwiXG4gICAgICAgICAgICBbYWN0aXZlUGlsbEluZGV4XT1cIjBcIlxuICAgICAgICAgICAgW2FjdGl2ZVNlbGVjdGVkXT1cIihjb250cm9sbGVyLmlzQWN0aXZlUGlsbFNlbGVjdGVkJCB8IGFzeW5jKSA/PyBmYWxzZVwiXG4gICAgICAgICAgICBbbG9hZGluZ109XCIoY29udHJvbGxlci5pc0xvYWRpbmckIHwgYXN5bmMpID8/IGZhbHNlXCJcbiAgICAgICAgICAgIChzZWxlY3RQaWxsKT1cIm9uU2VsZWN0UGlsbCgkZXZlbnQpXCJcbiAgICAgICAgICA+PC9haWEtcGlsbC1saXN0PlxuICAgICAgICA8L3NwYW4+XG4gICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICA8L2Rpdj5cblxuICAgIDxuZy1jb250YWluZXIgW25nU3dpdGNoXT1cInN1Ym1pdEJ1dHRvblN0YXRlXCI+XG4gICAgICA8YWlhLXN1Ym1pdC1idXR0b25cbiAgICAgICAgKm5nU3dpdGNoQ2FzZT1cIidkZWZhdWx0J1wiXG4gICAgICAgIFtkaXNhYmxlZF09XCJcbiAgICAgICAgICAhKFxuICAgICAgICAgICAgY29udHJvbGxlciAmJlxuICAgICAgICAgICAgY2FuU3VibWl0KHtcbiAgICAgICAgICAgICAgc2VnbWVudHM6IChjb250cm9sbGVyLnNlZ21lbnRzJCB8IGFzeW5jKSA/PyBbXSxcbiAgICAgICAgICAgICAgY29tcGxldGVkUGFyYW1zOiAoY29udHJvbGxlci5jb21wbGV0ZWRQYXJhbXMkIHwgYXN5bmMpID8/IFtdXG4gICAgICAgICAgICB9KVxuICAgICAgICAgIClcbiAgICAgICAgXCJcbiAgICAgICAgKHN1Ym1pdCk9XCJvblN1Ym1pdEJ1dHRvbkNsaWNrKCRldmVudClcIlxuICAgICAgPjwvYWlhLXN1Ym1pdC1idXR0b24+XG5cbiAgICAgIDxzcGFuXG4gICAgICAgICpuZ1N3aXRjaENhc2U9XCInY3VzdG9tJ1wiXG4gICAgICAgIGRhdGEtYWlhLXN1Ym1pdD1cIlwiXG4gICAgICAgIGNsYXNzPVwibWFnaWN4LWFpYS1zdWJtaXQtc2xvdFwiXG4gICAgICAgIChjbGljayk9XCJvblN1Ym1pdFNsb3RDbGljaygkZXZlbnQpXCJcbiAgICAgID5cbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImN1c3RvbVN1Ym1pdFRlbXBsYXRlXCI+PC9uZy1jb250YWluZXI+XG4gICAgICA8L3NwYW4+XG4gICAgPC9uZy1jb250YWluZXI+XG4gIDwvZGl2PlxuPC9kaXY+XG4iXX0=