@magicx-eng/ai-autocomplete-angular 0.1.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 (57) hide show
  1. package/README.md +582 -0
  2. package/esm2020/lib/ai-autocomplete/ai-autocomplete.component.mjs +365 -0
  3. package/esm2020/lib/ai-autocomplete/index.mjs +2 -0
  4. package/esm2020/lib/ai-autocomplete-dropdown/ai-autocomplete-dropdown.component.mjs +81 -0
  5. package/esm2020/lib/ai-autocomplete-dropdown/index.mjs +2 -0
  6. package/esm2020/lib/ai-autocomplete.module.mjs +26 -0
  7. package/esm2020/lib/controller/ai-autocomplete.controller.mjs +226 -0
  8. package/esm2020/lib/controller/index.mjs +2 -0
  9. package/esm2020/lib/controller/observables.mjs +24 -0
  10. package/esm2020/lib/input/ai-autocomplete-input.directive.mjs +180 -0
  11. package/esm2020/lib/input/index.mjs +2 -0
  12. package/esm2020/lib/internal/editor-host/editor-host.directive.mjs +253 -0
  13. package/esm2020/lib/internal/pill-list/pill-list.component.mjs +65 -0
  14. package/esm2020/lib/internal/suggestion-grid/suggestion-grid.component.mjs +97 -0
  15. package/esm2020/lib/internal/suggestion-item/suggestion-item.component.mjs +76 -0
  16. package/esm2020/lib/shared/types.mjs +2 -0
  17. package/esm2020/magicx-eng-ai-autocomplete-angular.mjs +5 -0
  18. package/esm2020/public-api.mjs +18 -0
  19. package/fesm2015/magicx-eng-ai-autocomplete-angular.mjs +1386 -0
  20. package/fesm2015/magicx-eng-ai-autocomplete-angular.mjs.map +1 -0
  21. package/fesm2020/magicx-eng-ai-autocomplete-angular.mjs +1370 -0
  22. package/fesm2020/magicx-eng-ai-autocomplete-angular.mjs.map +1 -0
  23. package/index.d.ts +6 -0
  24. package/lib/ai-autocomplete/ai-autocomplete.component.d.ts +113 -0
  25. package/lib/ai-autocomplete/ai-autocomplete.component.d.ts.map +1 -0
  26. package/lib/ai-autocomplete/index.d.ts +2 -0
  27. package/lib/ai-autocomplete/index.d.ts.map +1 -0
  28. package/lib/ai-autocomplete-dropdown/ai-autocomplete-dropdown.component.d.ts +51 -0
  29. package/lib/ai-autocomplete-dropdown/ai-autocomplete-dropdown.component.d.ts.map +1 -0
  30. package/lib/ai-autocomplete-dropdown/index.d.ts +2 -0
  31. package/lib/ai-autocomplete-dropdown/index.d.ts.map +1 -0
  32. package/lib/ai-autocomplete.module.d.ts +18 -0
  33. package/lib/ai-autocomplete.module.d.ts.map +1 -0
  34. package/lib/controller/ai-autocomplete.controller.d.ts +131 -0
  35. package/lib/controller/ai-autocomplete.controller.d.ts.map +1 -0
  36. package/lib/controller/index.d.ts +2 -0
  37. package/lib/controller/index.d.ts.map +1 -0
  38. package/lib/controller/observables.d.ts +22 -0
  39. package/lib/controller/observables.d.ts.map +1 -0
  40. package/lib/input/ai-autocomplete-input.directive.d.ts +60 -0
  41. package/lib/input/ai-autocomplete-input.directive.d.ts.map +1 -0
  42. package/lib/input/index.d.ts +2 -0
  43. package/lib/input/index.d.ts.map +1 -0
  44. package/lib/internal/editor-host/editor-host.directive.d.ts +46 -0
  45. package/lib/internal/editor-host/editor-host.directive.d.ts.map +1 -0
  46. package/lib/internal/pill-list/pill-list.component.d.ts +35 -0
  47. package/lib/internal/pill-list/pill-list.component.d.ts.map +1 -0
  48. package/lib/internal/suggestion-grid/suggestion-grid.component.d.ts +37 -0
  49. package/lib/internal/suggestion-grid/suggestion-grid.component.d.ts.map +1 -0
  50. package/lib/internal/suggestion-item/suggestion-item.component.d.ts +33 -0
  51. package/lib/internal/suggestion-item/suggestion-item.component.d.ts.map +1 -0
  52. package/lib/shared/types.d.ts +125 -0
  53. package/lib/shared/types.d.ts.map +1 -0
  54. package/magicx-eng-ai-autocomplete-angular.d.ts.map +1 -0
  55. package/package.json +46 -0
  56. package/public-api.d.ts +15 -0
  57. package/public-api.d.ts.map +1 -0
@@ -0,0 +1,226 @@
1
+ import { AIAutocomplete as CoreAIAutocomplete, } from "@magicx-eng/ai-autocomplete-vanilla";
2
+ import { BehaviorSubject, map, shareReplay } from "rxjs";
3
+ import { deriveField } from "./observables";
4
+ /**
5
+ * Tier 2 logic surface for `@magicx-eng/ai-autocomplete-angular` — the Angular
6
+ * equivalent of React's `useAIAutocomplete()` hook. Wraps a headless
7
+ * `@magicx-eng/ai-autocomplete-vanilla` core and exposes its state as RxJS
8
+ * observables plus thin action methods.
9
+ *
10
+ * Per TDB §3.3, the controller is consumer-managed — the consumer creates it
11
+ * with `new`, holds the reference, and **must call `destroy()`** in their
12
+ * own `ngOnDestroy`. The Tier 1 `<ai-autocomplete>` component does this
13
+ * automatically; Tier 2 consumers do not get auto-cleanup.
14
+ *
15
+ * @public
16
+ */
17
+ export class AIAutocompleteController {
18
+ /**
19
+ * Throws if invoked outside a browser environment. For SSR / Angular
20
+ * Universal, gate construction with `isPlatformBrowser` — see TDB §16.3.
21
+ */
22
+ constructor(opts = {}) {
23
+ this.isDestroyed = false;
24
+ if (typeof document === "undefined") {
25
+ throw new Error("AIAutocompleteController requires a browser environment. " +
26
+ "For SSR / Angular Universal, gate construction with isPlatformBrowser.");
27
+ }
28
+ // Headless mode never renders to the host, so a throwaway div is fine —
29
+ // it's required by the core's signature for symmetry with full mode.
30
+ const host = document.createElement("div");
31
+ this.core = new CoreAIAutocomplete(host, {
32
+ ...opts,
33
+ renderMode: "headless",
34
+ source: opts.source ?? "headless-sdk",
35
+ // Headless mode never renders the dropdown DOM, but the keyboard
36
+ // controller still reads `optionsPosition` to decide which vertical
37
+ // arrow opens the dropdown from the input.
38
+ optionsPosition: opts.optionsPosition ?? "below",
39
+ });
40
+ this.rawState$ = new BehaviorSubject(this.core.getState());
41
+ this.unsubscribeCore = this.core.subscribe((state) => {
42
+ if (!this.isDestroyed)
43
+ this.rawState$.next(state);
44
+ });
45
+ // === Per-field observables ===
46
+ this.text$ = deriveField(this.rawState$, (s) => s.text);
47
+ this.completedParams$ = deriveField(this.rawState$, (s) => s.completedParams);
48
+ this.suggestionPills$ = deriveField(this.rawState$, (s) => s.actionableSuggestions);
49
+ this.segments$ = deriveField(this.rawState$, (s) => s.segments);
50
+ this.newParamId$ = deriveField(this.rawState$, (s) => s.newParamId);
51
+ this.suggestions$ = deriveField(this.rawState$, (s) => s.suggestions);
52
+ this.activeIndex$ = deriveField(this.rawState$, (s) => s.activeDropdownIndex);
53
+ this.isLoading$ = deriveField(this.rawState$, computeUiLoading);
54
+ this.isReady$ = deriveField(this.rawState$, (s) => s.isReady);
55
+ this.isFocused$ = deriveField(this.rawState$, (s) => s.isFocused);
56
+ this.isDropdownOpen$ = deriveField(this.rawState$, (s) => s.isDropdownOpen);
57
+ this.placeholderText$ = deriveField(this.rawState$, (s) => s.placeholderText);
58
+ this.error$ = deriveField(this.rawState$, (s) => s.error);
59
+ this.editingParam$ = deriveField(this.rawState$, (s) => s.editingParam);
60
+ this.editingAnchor$ = deriveField(this.rawState$, (s) => s.editingAnchor);
61
+ this.caretOffset$ = deriveField(this.rawState$, (s) => s.caretOffset);
62
+ // === Composite observables ===
63
+ // Project directly off `rawState$` with a single map() so each store
64
+ // tick produces exactly ONE coherent state$ emission. Using
65
+ // `combineLatest` over the per-field observables here would fire one
66
+ // emission per inner-source tick (up to N per store update), and the
67
+ // editor-host directive's post-promote refocus would run against an
68
+ // intermediate state where `newParamId` was set but `segments` /
69
+ // `caretOffset` still held their old values — leaving the caret stuck
70
+ // at the pre-click position.
71
+ this.state$ = this.rawState$.pipe(map(computeState), shareReplay({ bufferSize: 1, refCount: true }));
72
+ this.dropdown$ = deriveField(this.rawState$, computeDropdown);
73
+ }
74
+ // === Read-only accessors ===
75
+ /** Stable ARIA listbox ID for the dropdown. Pass to `<textarea aria-controls="...">`. */
76
+ get listboxId() {
77
+ return this.core.listboxId;
78
+ }
79
+ /** Whether `destroy()` has been called. After destruction all action methods no-op. */
80
+ get destroyed() {
81
+ return this.isDestroyed;
82
+ }
83
+ /**
84
+ * Synchronous snapshot of the controller's current public state. Mirrors
85
+ * the latest emission of `state$`. Useful in callbacks where you can't
86
+ * `subscribe` (e.g. inside an event handler).
87
+ */
88
+ getState() {
89
+ return computeState(this.rawState$.value);
90
+ }
91
+ // === Action methods (pass-through to the core) ===
92
+ /** Clear all state, rotate `session_id`, and re-fetch. Call after submit. */
93
+ reset() {
94
+ this.core.reset();
95
+ }
96
+ /** Pick a dropdown option (or replace the re-edited param if in re-edit mode). */
97
+ selectOption(option) {
98
+ this.core.selectOption(option);
99
+ }
100
+ /** Promote the pill at `index` to active (front of the list). */
101
+ setActivePill(index) {
102
+ this.core.setActivePill(index);
103
+ }
104
+ /** Drop the last completed param's "completed" status. Text stays as plain text. */
105
+ removeLastParam() {
106
+ this.core.removeLastParam();
107
+ }
108
+ /** Clear the shimmer animation state for the most-recently-added param. */
109
+ clearNewParamId() {
110
+ this.core.clearNewParamId();
111
+ }
112
+ /** Controlled-mode setter for editor text. */
113
+ setValue(text) {
114
+ this.core.setValue(text);
115
+ }
116
+ /** Controlled-mode setter for completed params. */
117
+ setCompletedParams(params) {
118
+ this.core.setCompletedParams(params);
119
+ }
120
+ /** Forward plain-text input from the consumer's `<textarea>` to the core. */
121
+ handleTextChange(value) {
122
+ this.core.handleTextChange(value);
123
+ }
124
+ /** Forward keyboard events from the consumer's `<textarea>` to the core. */
125
+ handleKeyDown(event) {
126
+ this.core.handleKeyDown(event);
127
+ }
128
+ /** Notify the core of focus state. */
129
+ setFocused(focused) {
130
+ this.core.setFocused(focused);
131
+ }
132
+ /** Enter re-edit mode for the bold param with the given id. */
133
+ startEditingParam(paramId) {
134
+ this.core.startEditingParam(paramId);
135
+ }
136
+ /** Exit re-edit mode without changing the bold param. */
137
+ exitEditMode() {
138
+ this.core.exitEditMode();
139
+ }
140
+ /** Forward post-input caret position (extends the edit tail). */
141
+ handleCaretAfterInput(offset) {
142
+ this.core.handleCaretAfterInput(offset);
143
+ }
144
+ /** Forward selection-only caret moves (may exit re-edit). */
145
+ handleCaretMove(offset) {
146
+ this.core.handleCaretMove(offset);
147
+ }
148
+ /** Replace the bold param being re-edited. Returns true when applied. */
149
+ replaceEditingRange(replacement) {
150
+ return this.core.replaceEditingRange(replacement);
151
+ }
152
+ /** Set the highlighted option index (typically driven by hover). */
153
+ setActiveDropdownIndex(index) {
154
+ this.core.setActiveDropdownIndex(index);
155
+ }
156
+ // === Lifecycle ===
157
+ /**
158
+ * Apply runtime changes to a subset of options. Event callbacks
159
+ * (`onSubmit`, `onError`, etc.) cannot be swapped this way — they are
160
+ * registered once at construction (matches the React hook's design). For
161
+ * dynamic event reactivity, subscribe to the corresponding observable
162
+ * (e.g. `text$` instead of `onChange`).
163
+ */
164
+ update(opts) {
165
+ this.core.update(opts);
166
+ }
167
+ /**
168
+ * Release all resources — unsubscribes from the core, destroys the core,
169
+ * and completes the internal state subject. Safe to call multiple times.
170
+ * After destruction, action methods no-op silently.
171
+ */
172
+ destroy() {
173
+ if (this.isDestroyed)
174
+ return;
175
+ this.isDestroyed = true;
176
+ this.unsubscribeCore();
177
+ this.core.destroy();
178
+ this.rawState$.complete();
179
+ }
180
+ }
181
+ // ===== Pure helpers — not part of the public surface =====
182
+ function computeUiLoading(s) {
183
+ return s.isLoading && !s.editingParam && !s.inSelectionAnimation;
184
+ }
185
+ function computeState(s) {
186
+ return {
187
+ text: s.text,
188
+ completedParams: s.completedParams,
189
+ suggestionPills: s.actionableSuggestions,
190
+ segments: s.segments,
191
+ newParamId: s.newParamId,
192
+ suggestions: s.suggestions,
193
+ activeIndex: s.activeDropdownIndex,
194
+ isLoading: computeUiLoading(s),
195
+ isReady: s.isReady,
196
+ isFocused: s.isFocused,
197
+ isDropdownOpen: s.isDropdownOpen,
198
+ placeholderText: s.placeholderText,
199
+ error: s.error,
200
+ editingParam: s.editingParam,
201
+ editingAnchor: s.editingAnchor,
202
+ caretOffset: s.caretOffset,
203
+ };
204
+ }
205
+ function computeDropdown(s) {
206
+ const editingParam = s.editingParam;
207
+ const activeSuggestion = s.actionableSuggestions[0];
208
+ const dropdownPill = editingParam
209
+ ? {
210
+ type: editingParam.suggestionType,
211
+ text: editingParam.suggestionPlaceholder,
212
+ required: true,
213
+ options: editingParam.options,
214
+ }
215
+ : null;
216
+ const dropdownActivePill = dropdownPill ?? activeSuggestion;
217
+ const dropdownPills = dropdownPill ? [dropdownPill] : s.actionableSuggestions;
218
+ return {
219
+ suggestions: dropdownActivePill ? [{ ...dropdownActivePill, options: s.filteredOptions }] : [],
220
+ activeIndex: s.activeDropdownIndex,
221
+ isOpen: s.isDropdownOpen,
222
+ pills: dropdownPills,
223
+ isLoading: computeUiLoading(s),
224
+ };
225
+ }
226
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWktYXV0b2NvbXBsZXRlLmNvbnRyb2xsZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvbGliL2NvbnRyb2xsZXIvYWktYXV0b2NvbXBsZXRlLmNvbnRyb2xsZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUVMLGNBQWMsSUFBSSxrQkFBa0IsR0FLckMsTUFBTSxxQ0FBcUMsQ0FBQztBQUM3QyxPQUFPLEVBQUUsZUFBZSxFQUFFLEdBQUcsRUFBbUIsV0FBVyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBTzFFLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFFNUM7Ozs7Ozs7Ozs7OztHQVlHO0FBQ0gsTUFBTSxPQUFPLHdCQUF3QjtJQThEbkM7OztPQUdHO0lBQ0gsWUFBWSxPQUF3QyxFQUFFO1FBOUQ5QyxnQkFBVyxHQUFHLEtBQUssQ0FBQztRQStEMUIsSUFBSSxPQUFPLFFBQVEsS0FBSyxXQUFXLEVBQUU7WUFDbkMsTUFBTSxJQUFJLEtBQUssQ0FDYiwyREFBMkQ7Z0JBQ3pELHdFQUF3RSxDQUMzRSxDQUFDO1NBQ0g7UUFFRCx3RUFBd0U7UUFDeEUscUVBQXFFO1FBQ3JFLE1BQU0sSUFBSSxHQUFHLFFBQVEsQ0FBQyxhQUFhLENBQUMsS0FBSyxDQUFDLENBQUM7UUFFM0MsSUFBSSxDQUFDLElBQUksR0FBRyxJQUFJLGtCQUFrQixDQUFDLElBQUksRUFBRTtZQUN2QyxHQUFHLElBQUk7WUFDUCxVQUFVLEVBQUUsVUFBVTtZQUN0QixNQUFNLEVBQUUsSUFBSSxDQUFDLE1BQU0sSUFBSSxjQUFjO1lBQ3JDLGlFQUFpRTtZQUNqRSxvRUFBb0U7WUFDcEUsMkNBQTJDO1lBQzNDLGVBQWUsRUFBRSxJQUFJLENBQUMsZUFBZSxJQUFJLE9BQU87U0FDakQsQ0FBQyxDQUFDO1FBRUgsSUFBSSxDQUFDLFNBQVMsR0FBRyxJQUFJLGVBQWUsQ0FBWSxJQUFJLENBQUMsSUFBSSxDQUFDLFFB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QyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLHFCQUFxQixDQUFDO0lBQzlFLE9BQU87UUFDTCxXQUFXLEVBQUUsa0JBQWtCLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxHQUFHLGtCQUFrQixFQUFFLE9BQU8sRUFBRSxDQUFDLENBQUMsZUFBZSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRTtRQUM5RixXQUFXLEVBQUUsQ0FBQyxDQUFDLG1CQUFtQjtRQUNsQyxNQUFNLEVBQUUsQ0FBQyxDQUFDLGNBQWM7UUFDeEIsS0FBSyxFQUFFLGFBQWE7UUFDcEIsU0FBUyxFQUFFLGdCQUFnQixDQUFDLENBQUMsQ0FBQztLQUMvQixDQUFDO0FBQ0osQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIHR5cGUgQ29tcGxldGVkUGFyYW1TdGF0ZSxcbiAgQUlBdXRvY29tcGxldGUgYXMgQ29yZUFJQXV0b2NvbXBsZXRlLFxuICB0eXBlIENvcmVTdGF0ZSxcbiAgdHlwZSBTZWdtZW50LFxuICB0eXBlIFN1Z2dlc3Rpb24sXG4gIHR5cGUgU3VnZ2VzdGlvbk9wdGlvbixcbn0gZnJvbSBcIkBtYWdpY3gtZW5nL2FpLWF1dG9jb21wbGV0ZS12YW5pbGxhXCI7XG5pbXBvcnQgeyBCZWhhdmlvclN1YmplY3QsIG1hcCwgdHlwZSBPYnNlcnZhYmxlLCBzaGFyZVJlcGxheSB9IGZyb20gXCJyeGpzXCI7XG5pbXBvcnQgdHlwZSB7XG4gIEFJQXV0b2NvbXBsZXRlQ29udHJvbGxlck9wdGlvbnMsXG4gIEFJQXV0b2NvbXBsZXRlQ29udHJvbGxlclN0YXRlLFxuICBBSUF1dG9jb21wbGV0ZUNvbnRyb2xsZXJVcGRhdGUsXG4gIEFJQXV0b2NvbXBsZXRlRHJvcGRvd25TdGF0ZSxcbn0gZnJvbSBcIi4uL3NoYXJlZC90eXBlc1wiO1xuaW1wb3J0IHsgZGVyaXZlRmllbGQgfSBmcm9tIFwiLi9vYnNlcnZhYmxlc1wiO1xuXG4vKipcbiAqIFRpZXIgMiBsb2dpYyBzdXJmYWNlIGZvciBgQG1hZ2ljeC1lbmcvYWktYXV0b2NvbXBsZXRlLWFuZ3VsYXJgIOKAlCB0aGUgQW5ndWxhclxuICogZXF1aXZhbGVudCBvZiBSZWFjdCdzIGB1c2VBSUF1dG9jb21wbGV0ZSgpYCBob29rLiBXcmFwcyBhIGhlYWRsZXNzXG4gKiBgQG1hZ2ljeC1lbmcvYWktYXV0b2NvbXBsZXRlLXZhbmlsbGFgIGNvcmUgYW5kIGV4cG9zZXMgaXRzIHN0YXRlIGFzIFJ4SlNcbiAqIG9ic2VydmFibGVzIHBsdXMgdGhpbiBhY3Rpb24gbWV0aG9kcy5cbiAqXG4gKiBQZXIgVERCIMKnMy4zLCB0aGUgY29udHJvbGxlciBpcyBjb25zdW1lci1tYW5hZ2VkIOKAlCB0aGUgY29uc3VtZXIgY3JlYXRlcyBpdFxuICogd2l0aCBgbmV3YCwgaG9sZHMgdGhlIHJlZmVyZW5jZSwgYW5kICoqbXVzdCBjYWxsIGBkZXN0cm95KClgKiogaW4gdGhlaXJcbiAqIG93biBgbmdPbkRlc3Ryb3lgLiBUaGUgVGllciAxIGA8YWktYXV0b2NvbXBsZXRlPmAgY29tcG9uZW50IGRvZXMgdGhpc1xuICogYXV0b21hdGljYWxseTsgVGllciAyIGNvbnN1bWVycyBkbyBub3QgZ2V0IGF1dG8tY2xlYW51cC5cbiAqXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBjbGFzcyBBSUF1dG9jb21wbGV0ZUNvbnRyb2xsZXIge1xuICBwcml2YXRlIHJlYWRvbmx5IGNvcmU6IENvcmVBSUF1dG9jb21wbGV0ZTtcbiAgcHJpdmF0ZSByZWFkb25seSByYXdTdGF0ZSQ6IEJlaGF2aW9yU3ViamVjdDxDb3JlU3RhdGU+O1xuICBwcml2YXRlIHJlYWRvbmx5IHVuc3Vic2NyaWJlQ29yZTogKCkgPT4gdm9pZDtcbiAgcHJpdmF0ZSBpc0Rlc3Ryb3llZCA9IGZhbHNlO1xuXG4gIC8vID09PSBQZXItZmllbGQgb2JzZXJ2YWJsZXMgPT09XG4gIC8vIEVhY2ggb25lIHJ1bnMgdGhyb3VnaCBkZXJpdmVGaWVsZCwgd2hpY2ggYmFrZXMgaW4gZGlzdGluY3RVbnRpbENoYW5nZWRcbiAgLy8gYW5kIHNoYXJlUmVwbGF5KHsgYnVmZmVyU2l6ZTogMSwgcmVmQ291bnQ6IHRydWUgfSkgcGVyIMKnMTkuNC5cblxuICAvKiogUGxhaW4tdGV4dCBjb250ZW50IG9mIHRoZSBlZGl0b3IuICovXG4gIHJlYWRvbmx5IHRleHQkOiBPYnNlcnZhYmxlPHN0cmluZz47XG4gIC8qKiBDb21wbGV0ZWQgKGJvbGQpIHBhcmFtcyBjdXJyZW50bHkgaW4gdGhlIGVkaXRvci4gKi9cbiAgcmVhZG9ubHkgY29tcGxldGVkUGFyYW1zJDogT2JzZXJ2YWJsZTxDb21wbGV0ZWRQYXJhbVN0YXRlW10+O1xuICAvKiogQWN0aW9uYWJsZSBzdWdnZXN0aW9uIHBpbGxzIChmaXJzdCBvbmUgaXMgdGhlIGFjdGl2ZSBwaWxsKS4gKi9cbiAgcmVhZG9ubHkgc3VnZ2VzdGlvblBpbGxzJDogT2JzZXJ2YWJsZTxTdWdnZXN0aW9uW10+O1xuICAvKiogVGV4dCArIGNvbXBsZXRlZC1wYXJhbSBzZWdtZW50cyBmb3IgcmVuZGVyaW5nIHRoZSBlZGl0b3IgYm9keS4gKi9cbiAgcmVhZG9ubHkgc2VnbWVudHMkOiBPYnNlcnZhYmxlPFNlZ21lbnRbXT47XG4gIC8qKiBJRCBvZiB0aGUgbW9zdC1yZWNlbnRseS1wcm9tb3RlZCBwYXJhbSAoZHJpdmVzIHNoaW1tZXIgYW5pbWF0aW9uKS4gKi9cbiAgcmVhZG9ubHkgbmV3UGFyYW1JZCQ6IE9ic2VydmFibGU8c3RyaW5nIHwgbnVsbD47XG4gIC8qKiBBbGwgc3VnZ2VzdGlvbnMgZnJvbSB0aGUgc2VydmVyIChpbmNsdWRpbmcgbm9uLWFjdGlvbmFibGUgb25lcykuICovXG4gIHJlYWRvbmx5IHN1Z2dlc3Rpb25zJDogT2JzZXJ2YWJsZTxTdWdnZXN0aW9uW10+O1xuICAvKiogQ3VycmVudGx5IGhpZ2hsaWdodGVkIGRyb3Bkb3duIG9wdGlvbiBpbmRleC4gLTEgPSBub25lLiAqL1xuICByZWFkb25seSBhY3RpdmVJbmRleCQ6IE9ic2VydmFibGU8bnVtYmVyPjtcbiAgLyoqXG4gICAqIFVJLXZpc2libGUgbG9hZGluZyBmbGFnIOKAlCBzdXBwcmVzc2VkIGR1cmluZyB0aGUgcG9zdC1zZWxlY3Qgc3RyZWFrXG4gICAqIGFuaW1hdGlvbiBhbmQgZHVyaW5nIHJlLWVkaXQgKGNhY2hlZCBvcHRpb25zIHN0YXkgdmlzaWJsZSB0aGVyZSkuIFVzZVxuICAgKiB0aGlzIGluc3RlYWQgb2YgdGhlIHJhdyBjb3JlIHN0YXRlIGZvciBhbnkgbG9hZGluZy1za2VsZXRvbiBiaW5kaW5nLlxuICAgKi9cbiAgcmVhZG9ubHkgaXNMb2FkaW5nJDogT2JzZXJ2YWJsZTxib29sZWFuPjtcbiAgLyoqIFNlcnZlci1yZXBvcnRlZCBcInF1ZXJ5IGlzIGNvbXBsZXRlXCIgZmxhZy4gKi9cbiAgcmVhZG9ubHkgaXNSZWFkeSQ6IE9ic2VydmFibGU8Ym9vbGVhbj47XG4gIC8qKiBXaGV0aGVyIHRoZSBlZGl0b3IgY3VycmVudGx5IGhhcyBmb2N1cy4gKi9cbiAgcmVhZG9ubHkgaXNGb2N1c2VkJDogT2JzZXJ2YWJsZTxib29sZWFuPjtcbiAgLyoqIFdoZXRoZXIgdGhlIGRyb3Bkb3duIHNob3VsZCBjdXJyZW50bHkgYmUgdmlzaWJsZS4gKi9cbiAgcmVhZG9ubHkgaXNEcm9wZG93bk9wZW4kOiBPYnNlcnZhYmxlPGJvb2xlYW4+O1xuICAvKiogU2VydmVyLXN1Z2dlc3RlZCBwbGFjZWhvbGRlciB0ZXh0IGZvciB0aGUgZWRpdG9yLiAqL1xuICByZWFkb25seSBwbGFjZWhvbGRlclRleHQkOiBPYnNlcnZhYmxlPHN0cmluZz47XG4gIC8qKiBMYXN0IGZldGNoIGVycm9yLCBvciBudWxsLiAqL1xuICByZWFkb25seSBlcnJvciQ6IE9ic2VydmFibGU8RXJyb3IgfCBudWxsPjtcbiAgLyoqIFBhcmFtIGN1cnJlbnRseSBiZWluZyByZS1lZGl0ZWQsIG9yIG51bGwuICovXG4gIHJlYWRvbmx5IGVkaXRpbmdQYXJhbSQ6IE9ic2VydmFibGU8Q29tcGxldGVkUGFyYW1TdGF0ZSB8IG51bGw+O1xuICAvKiogUGxhaW4tdGV4dCBvZmZzZXQgd2hlcmUgdGhlIGVkaXQgcmVnaW9uIHN0YXJ0cywgb3IgbnVsbC4gKi9cbiAgcmVhZG9ubHkgZWRpdGluZ0FuY2hvciQ6IE9ic2VydmFibGU8bnVtYmVyIHwgbnVsbD47XG4gIC8qKiBMaXZlIGNhcmV0IG9mZnNldCB3aXRoaW4gdGhlIGVkaXRvci4gKi9cbiAgcmVhZG9ubHkgY2FyZXRPZmZzZXQkOiBPYnNlcnZhYmxlPG51bWJlciB8IG51bGw+O1xuXG4gIC8vID09PSBDb21wb3NpdGUgb2JzZXJ2YWJsZXMgPT09XG5cbiAgLyoqXG4gICAqIFNuYXBzaG90IG9mIGV2ZXJ5IHB1YmxpYyBmaWVsZCBpbiBvbmUgb2JqZWN0LiBDb252ZW5pZW50IGZvclxuICAgKiBgKm5nSWY9XCJjdHJsLnN0YXRlJCB8IGFzeW5jIGFzIHN0YXRlXCJgIHRlbXBsYXRpbmcg4oCUIGFsaWFzZXMgYWxsIGZpZWxkc1xuICAgKiB1bmRlciBhIHNpbmdsZSBzdWJzY3JpcHRpb24gaW5zdGVhZCBvZiBtdWx0aXBsZSBgfCBhc3luY2AgcGlwZXMuXG4gICAqL1xuICByZWFkb25seSBzdGF0ZSQ6IE9ic2VydmFibGU8QUlBdXRvY29tcGxldGVDb250cm9sbGVyU3RhdGU+O1xuXG4gIC8qKlxuICAgKiBDb21wb3NpdGUgc3RhdGUgZm9yIHRoZSBkcm9wZG93biB2aWV3LiBUaWVyIDIgY29uc3VtZXJzIHNwcmVhZCB0aGlzIGludG9cbiAgICogYDxhaS1hdXRvY29tcGxldGUtZHJvcGRvd24+YDsgVGllciAxIHVzZXMgdGhlIHNhbWUgc2hhcGUgaW50ZXJuYWxseS5cbiAgICovXG4gIHJlYWRvbmx5IGRyb3Bkb3duJDogT2JzZXJ2YWJsZTxBSUF1dG9jb21wbGV0ZURyb3Bkb3duU3RhdGU+O1xuXG4gIC8qKlxuICAgKiBUaHJvd3MgaWYgaW52b2tlZCBvdXRzaWRlIGEgYnJvd3NlciBlbnZpcm9ubWVudC4gRm9yIFNTUiAvIEFuZ3VsYXJcbiAgICogVW5pdmVyc2FsLCBnYXRlIGNvbnN0cnVjdGlvbiB3aXRoIGBpc1BsYXRmb3JtQnJvd3NlcmAg4oCUIHNlZSBUREIgwqcxNi4zLlxuICAgKi9cbiAgY29uc3RydWN0b3Iob3B0czogQUlBdXRvY29tcGxldGVDb250cm9sbGVyT3B0aW9ucyA9IHt9KSB7XG4gICAgaWYgKHR5cGVvZiBkb2N1bWVudCA9PT0gXCJ1bmRlZmluZWRcIikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBcIkFJQXV0b2NvbXBsZXRlQ29udHJvbGxlciByZXF1aXJlcyBhIGJyb3dzZXIgZW52aXJvbm1lbnQuIFwiICtcbiAgICAgICAgICBcIkZvciBTU1IgLyBBbmd1bGFyIFVuaXZlcnNhbCwgZ2F0ZSBjb25zdHJ1Y3Rpb24gd2l0aCBpc1BsYXRmb3JtQnJvd3Nlci5cIixcbiAgICAgICk7XG4gICAgfVxuXG4gICAgLy8gSGVhZGxlc3MgbW9kZSBuZXZlciByZW5kZXJzIHRvIHRoZSBob3N0LCBzbyBhIHRocm93YXdheSBkaXYgaXMgZmluZSDigJRcbiAgICAvLyBpdCdzIHJlcXVpcmVkIGJ5IHRoZSBjb3JlJ3Mgc2lnbmF0dXJlIGZvciBzeW1tZXRyeSB3aXRoIGZ1bGwgbW9kZS5cbiAgICBjb25zdCBob3N0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcblxuICAgIHRoaXMuY29yZSA9IG5ldyBDb3JlQUlBdXRvY29tcGxldGUoaG9zdCwge1xuICAgICAgLi4ub3B0cyxcbiAgICAgIHJlbmRlck1vZGU6IFwiaGVhZGxlc3NcIixcbiAgICAgIHNvdXJjZTogb3B0cy5zb3VyY2UgPz8gXCJoZWFkbGVzcy1zZGtcIixcbiAgICAgIC8vIEhlYWRsZXNzIG1vZGUgbmV2ZXIgcmVuZGVycyB0aGUgZHJvcGRvd24gRE9NLCBidXQgdGhlIGtleWJvYXJkXG4gICAgICAvLyBjb250cm9sbGVyIHN0aWxsIHJlYWRzIGBvcHRpb25zUG9zaXRpb25gIHRvIGRlY2lkZSB3aGljaCB2ZXJ0aWNhbFxuICAgICAgLy8gYXJyb3cgb3BlbnMgdGhlIGRyb3Bkb3duIGZyb20gdGhlIGlucHV0LlxuICAgICAgb3B0aW9uc1Bvc2l0aW9uOiBvcHRzLm9wdGlvbnNQb3NpdGlvbiA/PyBcImJlbG93XCIsXG4gICAgfSk7XG5cbiAgICB0aGlzLnJhd1N0YXRlJCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8Q29yZVN0YXRlPih0aGlzLmNvcmUuZ2V0U3RhdGUoKSk7XG4gICAgdGhpcy51bnN1YnNjcmliZUNvcmUgPSB0aGlzLmNvcmUuc3Vic2NyaWJlKChzdGF0ZSkgPT4ge1xuICAgICAgaWYgKCF0aGlzLmlzRGVzdHJveWVkKSB0aGlzLnJhd1N0YXRlJC5uZXh0KHN0YXRlKTtcbiAgICB9KTtcblxuICAgIC8vID09PSBQZXItZmllbGQgb2JzZXJ2YWJsZXMgPT09XG4gICAgdGhpcy50ZXh0JCA9IGRlcml2ZUZpZWxkKHRoaXMucmF3U3RhdGUkLCAocykgPT4gcy50ZXh0KTtcbiAgICB0aGlzLmNvbXBsZXRlZFBhcmFtcyQgPSBkZXJpdmVGaWVsZCh0aGlzLnJhd1N0YXRlJCwgKHMpID0+IHMuY29tcGxldGVkUGFyYW1zKTtcbiAgICB0aGlzLnN1Z2dlc3Rpb25QaWxscyQgPSBkZXJpdmVGaWVsZCh0aGlzLnJhd1N0YXRlJCwgKHMpID0+IHMuYWN0aW9uYWJsZVN1Z2dlc3Rpb25zKTtcbiAgICB0aGlzLnNlZ21lbnRzJCA9IGRlcml2ZUZpZWxkKHRoaXMucmF3U3RhdGUkLCAocykgPT4gcy5zZWdtZW50cyk7XG4gICAgdGhpcy5uZXdQYXJhbUlkJCA9IGRlcml2ZUZpZWxkKHRoaXMucmF3U3RhdGUkLCAocykgPT4gcy5uZXdQYXJhbUlkKTtcbiAgICB0aGlzLnN1Z2dlc3Rpb25zJCA9IGRlcml2ZUZpZWxkKHRoaXMucmF3U3RhdGUkLCAocykgPT4gcy5zdWdnZXN0aW9ucyk7XG4gICAgdGhpcy5hY3RpdmVJbmRleCQgPSBkZXJpdmVGaWVsZCh0aGlzLnJhd1N0YXRlJCwgKHMpID0+IHMuYWN0aXZlRHJvcGRvd25JbmRleCk7XG4gICAgdGhpcy5pc0xvYWRpbmckID0gZGVyaXZlRmllbGQodGhpcy5yYXdTdGF0ZSQsIGNvbXB1dGVVaUxvYWRpbmcpO1xuICAgIHRoaXMuaXNSZWFkeSQgPSBkZXJpdmVGaWVsZCh0aGlzLnJhd1N0YXRlJCwgKHMpID0+IHMuaXNSZWFkeSk7XG4gICAgdGhpcy5pc0ZvY3VzZWQkID0gZGVyaXZlRmllbGQodGhpcy5yYXdTdGF0ZSQsIChzKSA9PiBzLmlzRm9jdXNlZCk7XG4gICAgdGhpcy5pc0Ryb3Bkb3duT3BlbiQgPSBkZXJpdmVGaWVsZCh0aGlzLnJhd1N0YXRlJCwgKHMpID0+IHMuaXNEcm9wZG93bk9wZW4pO1xuICAgIHRoaXMucGxhY2Vob2xkZXJUZXh0JCA9IGRlcml2ZUZpZWxkKHRoaXMucmF3U3RhdGUkLCAocykgPT4gcy5wbGFjZWhvbGRlclRleHQpO1xuICAgIHRoaXMuZXJyb3IkID0gZGVyaXZlRmllbGQodGhpcy5yYXdTdGF0ZSQsIChzKSA9PiBzLmVycm9yKTtcbiAgICB0aGlzLmVkaXRpbmdQYXJhbSQgPSBkZXJpdmVGaWVsZCh0aGlzLnJhd1N0YXRlJCwgKHMpID0+IHMuZWRpdGluZ1BhcmFtKTtcbiAgICB0aGlzLmVkaXRpbmdBbmNob3IkID0gZGVyaXZlRmllbGQodGhpcy5yYXdTdGF0ZSQsIChzKSA9PiBzLmVkaXRpbmdBbmNob3IpO1xuICAgIHRoaXMuY2FyZXRPZmZzZXQkID0gZGVyaXZlRmllbGQodGhpcy5yYXdTdGF0ZSQsIChzKSA9PiBzLmNhcmV0T2Zmc2V0KTtcblxuICAgIC8vID09PSBDb21wb3NpdGUgb2JzZXJ2YWJsZXMgPT09XG4gICAgLy8gUHJvamVjdCBkaXJlY3RseSBvZmYgYHJhd1N0YXRlJGAgd2l0aCBhIHNpbmdsZSBtYXAoKSBzbyBlYWNoIHN0b3JlXG4gICAgLy8gdGljayBwcm9kdWNlcyBleGFjdGx5IE9ORSBjb2hlcmVudCBzdGF0ZSQgZW1pc3Npb24uIFVzaW5nXG4gICAgLy8gYGNvbWJpbmVMYXRlc3RgIG92ZXIgdGhlIHBlci1maWVsZCBvYnNlcnZhYmxlcyBoZXJlIHdvdWxkIGZpcmUgb25lXG4gICAgLy8gZW1pc3Npb24gcGVyIGlubmVyLXNvdXJjZSB0aWNrICh1cCB0byBOIHBlciBzdG9yZSB1cGRhdGUpLCBhbmQgdGhlXG4gICAgLy8gZWRpdG9yLWhvc3QgZGlyZWN0aXZlJ3MgcG9zdC1wcm9tb3RlIHJlZm9jdXMgd291bGQgcnVuIGFnYWluc3QgYW5cbiAgICAvLyBpbnRlcm1lZGlhdGUgc3RhdGUgd2hlcmUgYG5ld1BhcmFtSWRgIHdhcyBzZXQgYnV0IGBzZWdtZW50c2AgL1xuICAgIC8vIGBjYXJldE9mZnNldGAgc3RpbGwgaGVsZCB0aGVpciBvbGQgdmFsdWVzIOKAlCBsZWF2aW5nIHRoZSBjYXJldCBzdHVja1xuICAgIC8vIGF0IHRoZSBwcmUtY2xpY2sgcG9zaXRpb24uXG4gICAgdGhpcy5zdGF0ZSQgPSB0aGlzLnJhd1N0YXRlJC5waXBlKFxuICAgICAgbWFwKGNvbXB1dGVTdGF0ZSksXG4gICAgICBzaGFyZVJlcGxheSh7IGJ1ZmZlclNpemU6IDEsIHJlZkNvdW50OiB0cnVlIH0pLFxuICAgICk7XG5cbiAgICB0aGlzLmRyb3Bkb3duJCA9IGRlcml2ZUZpZWxkKHRoaXMucmF3U3RhdGUkLCBjb21wdXRlRHJvcGRvd24pO1xuICB9XG5cbiAgLy8gPT09IFJlYWQtb25seSBhY2Nlc3NvcnMgPT09XG5cbiAgLyoqIFN0YWJsZSBBUklBIGxpc3Rib3ggSUQgZm9yIHRoZSBkcm9wZG93bi4gUGFzcyB0byBgPHRleHRhcmVhIGFyaWEtY29udHJvbHM9XCIuLi5cIj5gLiAqL1xuICBnZXQgbGlzdGJveElkKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuY29yZS5saXN0Ym94SWQ7XG4gIH1cblxuICAvKiogV2hldGhlciBgZGVzdHJveSgpYCBoYXMgYmVlbiBjYWxsZWQuIEFmdGVyIGRlc3RydWN0aW9uIGFsbCBhY3Rpb24gbWV0aG9kcyBuby1vcC4gKi9cbiAgZ2V0IGRlc3Ryb3llZCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5pc0Rlc3Ryb3llZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBTeW5jaHJvbm91cyBzbmFwc2hvdCBvZiB0aGUgY29udHJvbGxlcidzIGN1cnJlbnQgcHVibGljIHN0YXRlLiBNaXJyb3JzXG4gICAqIHRoZSBsYXRlc3QgZW1pc3Npb24gb2YgYHN0YXRlJGAuIFVzZWZ1bCBpbiBjYWxsYmFja3Mgd2hlcmUgeW91IGNhbid0XG4gICAqIGBzdWJzY3JpYmVgIChlLmcuIGluc2lkZSBhbiBldmVudCBoYW5kbGVyKS5cbiAgICovXG4gIGdldFN0YXRlKCk6IEFJQXV0b2NvbXBsZXRlQ29udHJvbGxlclN0YXRlIHtcbiAgICByZXR1cm4gY29tcHV0ZVN0YXRlKHRoaXMucmF3U3RhdGUkLnZhbHVlKTtcbiAgfVxuXG4gIC8vID09PSBBY3Rpb24gbWV0aG9kcyAocGFzcy10aHJvdWdoIHRvIHRoZSBjb3JlKSA9PT1cblxuICAvKiogQ2xlYXIgYWxsIHN0YXRlLCByb3RhdGUgYHNlc3Npb25faWRgLCBhbmQgcmUtZmV0Y2guIENhbGwgYWZ0ZXIgc3VibWl0LiAqL1xuICByZXNldCgpOiB2b2lkIHtcbiAgICB0aGlzLmNvcmUucmVzZXQoKTtcbiAgfVxuXG4gIC8qKiBQaWNrIGEgZHJvcGRvd24gb3B0aW9uIChvciByZXBsYWNlIHRoZSByZS1lZGl0ZWQgcGFyYW0gaWYgaW4gcmUtZWRpdCBtb2RlKS4gKi9cbiAgc2VsZWN0T3B0aW9uKG9wdGlvbjogU3VnZ2VzdGlvbk9wdGlvbik6IHZvaWQge1xuICAgIHRoaXMuY29yZS5zZWxlY3RPcHRpb24ob3B0aW9uKTtcbiAgfVxuXG4gIC8qKiBQcm9tb3RlIHRoZSBwaWxsIGF0IGBpbmRleGAgdG8gYWN0aXZlIChmcm9udCBvZiB0aGUgbGlzdCkuICovXG4gIHNldEFjdGl2ZVBpbGwoaW5kZXg6IG51bWJlcik6IHZvaWQge1xuICAgIHRoaXMuY29yZS5zZXRBY3RpdmVQaWxsKGluZGV4KTtcbiAgfVxuXG4gIC8qKiBEcm9wIHRoZSBsYXN0IGNvbXBsZXRlZCBwYXJhbSdzIFwiY29tcGxldGVkXCIgc3RhdHVzLiBUZXh0IHN0YXlzIGFzIHBsYWluIHRleHQuICovXG4gIHJlbW92ZUxhc3RQYXJhbSgpOiB2b2lkIHtcbiAgICB0aGlzLmNvcmUucmVtb3ZlTGFzdFBhcmFtKCk7XG4gIH1cblxuICAvKiogQ2xlYXIgdGhlIHNoaW1tZXIgYW5pbWF0aW9uIHN0YXRlIGZvciB0aGUgbW9zdC1yZWNlbnRseS1hZGRlZCBwYXJhbS4gKi9cbiAgY2xlYXJOZXdQYXJhbUlkKCk6IHZvaWQge1xuICAgIHRoaXMuY29yZS5jbGVhck5ld1BhcmFtSWQoKTtcbiAgfVxuXG4gIC8qKiBDb250cm9sbGVkLW1vZGUgc2V0dGVyIGZvciBlZGl0b3IgdGV4dC4gKi9cbiAgc2V0VmFsdWUodGV4dDogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy5jb3JlLnNldFZhbHVlKHRleHQpO1xuICB9XG5cbiAgLyoqIENvbnRyb2xsZWQtbW9kZSBzZXR0ZXIgZm9yIGNvbXBsZXRlZCBwYXJhbXMuICovXG4gIHNldENvbXBsZXRlZFBhcmFtcyhwYXJhbXM6IENvbXBsZXRlZFBhcmFtU3RhdGVbXSk6IHZvaWQge1xuICAgIHRoaXMuY29yZS5zZXRDb21wbGV0ZWRQYXJhbXMocGFyYW1zKTtcbiAgfVxuXG4gIC8qKiBGb3J3YXJkIHBsYWluLXRleHQgaW5wdXQgZnJvbSB0aGUgY29uc3VtZXIncyBgPHRleHRhcmVhPmAgdG8gdGhlIGNvcmUuICovXG4gIGhhbmRsZVRleHRDaGFuZ2UodmFsdWU6IHN0cmluZyk6IHZvaWQge1xuICAgIHRoaXMuY29yZS5oYW5kbGVUZXh0Q2hhbmdlKHZhbHVlKTtcbiAgfVxuXG4gIC8qKiBGb3J3YXJkIGtleWJvYXJkIGV2ZW50cyBmcm9tIHRoZSBjb25zdW1lcidzIGA8dGV4dGFyZWE+YCB0byB0aGUgY29yZS4gKi9cbiAgaGFuZGxlS2V5RG93bihldmVudDogS2V5Ym9hcmRFdmVudCk6IHZvaWQge1xuICAgIHRoaXMuY29yZS5oYW5kbGVLZXlEb3duKGV2ZW50KTtcbiAgfVxuXG4gIC8qKiBOb3RpZnkgdGhlIGNvcmUgb2YgZm9jdXMgc3RhdGUuICovXG4gIHNldEZvY3VzZWQoZm9jdXNlZDogYm9vbGVhbik6IHZvaWQge1xuICAgIHRoaXMuY29yZS5zZXRGb2N1c2VkKGZvY3VzZWQpO1xuICB9XG5cbiAgLyoqIEVudGVyIHJlLWVkaXQgbW9kZSBmb3IgdGhlIGJvbGQgcGFyYW0gd2l0aCB0aGUgZ2l2ZW4gaWQuICovXG4gIHN0YXJ0RWRpdGluZ1BhcmFtKHBhcmFtSWQ6IHN0cmluZyk6IHZvaWQge1xuICAgIHRoaXMuY29yZS5zdGFydEVkaXRpbmdQYXJhbShwYXJhbUlkKTtcbiAgfVxuXG4gIC8qKiBFeGl0IHJlLWVkaXQgbW9kZSB3aXRob3V0IGNoYW5naW5nIHRoZSBib2xkIHBhcmFtLiAqL1xuICBleGl0RWRpdE1vZGUoKTogdm9pZCB7XG4gICAgdGhpcy5jb3JlLmV4aXRFZGl0TW9kZSgpO1xuICB9XG5cbiAgLyoqIEZvcndhcmQgcG9zdC1pbnB1dCBjYXJldCBwb3NpdGlvbiAoZXh0ZW5kcyB0aGUgZWRpdCB0YWlsKS4gKi9cbiAgaGFuZGxlQ2FyZXRBZnRlcklucHV0KG9mZnNldDogbnVtYmVyIHwgbnVsbCk6IHZvaWQge1xuICAgIHRoaXMuY29yZS5oYW5kbGVDYXJldEFmdGVySW5wdXQob2Zmc2V0KTtcbiAgfVxuXG4gIC8qKiBGb3J3YXJkIHNlbGVjdGlvbi1vbmx5IGNhcmV0IG1vdmVzIChtYXkgZXhpdCByZS1lZGl0KS4gKi9cbiAgaGFuZGxlQ2FyZXRNb3ZlKG9mZnNldDogbnVtYmVyIHwgbnVsbCk6IHZvaWQge1xuICAgIHRoaXMuY29yZS5oYW5kbGVDYXJldE1vdmUob2Zmc2V0KTtcbiAgfVxuXG4gIC8qKiBSZXBsYWNlIHRoZSBib2xkIHBhcmFtIGJlaW5nIHJlLWVkaXRlZC4gUmV0dXJucyB0cnVlIHdoZW4gYXBwbGllZC4gKi9cbiAgcmVwbGFjZUVkaXRpbmdSYW5nZShyZXBsYWNlbWVudDogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuY29yZS5yZXBsYWNlRWRpdGluZ1JhbmdlKHJlcGxhY2VtZW50KTtcbiAgfVxuXG4gIC8qKiBTZXQgdGhlIGhpZ2hsaWdodGVkIG9wdGlvbiBpbmRleCAodHlwaWNhbGx5IGRyaXZlbiBieSBob3ZlcikuICovXG4gIHNldEFjdGl2ZURyb3Bkb3duSW5kZXgoaW5kZXg6IG51bWJlcik6IHZvaWQge1xuICAgIHRoaXMuY29yZS5zZXRBY3RpdmVEcm9wZG93bkluZGV4KGluZGV4KTtcbiAgfVxuXG4gIC8vID09PSBMaWZlY3ljbGUgPT09XG5cbiAgLyoqXG4gICAqIEFwcGx5IHJ1bnRpbWUgY2hhbmdlcyB0byBhIHN1YnNldCBvZiBvcHRpb25zLiBFdmVudCBjYWxsYmFja3NcbiAgICogKGBvblN1Ym1pdGAsIGBvbkVycm9yYCwgZXRjLikgY2Fubm90IGJlIHN3YXBwZWQgdGhpcyB3YXkg4oCUIHRoZXkgYXJlXG4gICAqIHJlZ2lzdGVyZWQgb25jZSBhdCBjb25zdHJ1Y3Rpb24gKG1hdGNoZXMgdGhlIFJlYWN0IGhvb2sncyBkZXNpZ24pLiBGb3JcbiAgICogZHluYW1pYyBldmVudCByZWFjdGl2aXR5LCBzdWJzY3JpYmUgdG8gdGhlIGNvcnJlc3BvbmRpbmcgb2JzZXJ2YWJsZVxuICAgKiAoZS5nLiBgdGV4dCRgIGluc3RlYWQgb2YgYG9uQ2hhbmdlYCkuXG4gICAqL1xuICB1cGRhdGUob3B0czogQUlBdXRvY29tcGxldGVDb250cm9sbGVyVXBkYXRlKTogdm9pZCB7XG4gICAgdGhpcy5jb3JlLnVwZGF0ZShvcHRzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWxlYXNlIGFsbCByZXNvdXJjZXMg4oCUIHVuc3Vic2NyaWJlcyBmcm9tIHRoZSBjb3JlLCBkZXN0cm95cyB0aGUgY29yZSxcbiAgICogYW5kIGNvbXBsZXRlcyB0aGUgaW50ZXJuYWwgc3RhdGUgc3ViamVjdC4gU2FmZSB0byBjYWxsIG11bHRpcGxlIHRpbWVzLlxuICAgKiBBZnRlciBkZXN0cnVjdGlvbiwgYWN0aW9uIG1ldGhvZHMgbm8tb3Agc2lsZW50bHkuXG4gICAqL1xuICBkZXN0cm95KCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmlzRGVzdHJveWVkKSByZXR1cm47XG4gICAgdGhpcy5pc0Rlc3Ryb3llZCA9IHRydWU7XG4gICAgdGhpcy51bnN1YnNjcmliZUNvcmUoKTtcbiAgICB0aGlzLmNvcmUuZGVzdHJveSgpO1xuICAgIHRoaXMucmF3U3RhdGUkLmNvbXBsZXRlKCk7XG4gIH1cbn1cblxuLy8gPT09PT0gUHVyZSBoZWxwZXJzIOKAlCBub3QgcGFydCBvZiB0aGUgcHVibGljIHN1cmZhY2UgPT09PT1cblxuZnVuY3Rpb24gY29tcHV0ZVVpTG9hZGluZyhzOiBDb3JlU3RhdGUpOiBib29sZWFuIHtcbiAgcmV0dXJuIHMuaXNMb2FkaW5nICYmICFzLmVkaXRpbmdQYXJhbSAmJiAhcy5pblNlbGVjdGlvbkFuaW1hdGlvbjtcbn1cblxuZnVuY3Rpb24gY29tcHV0ZVN0YXRlKHM6IENvcmVTdGF0ZSk6IEFJQXV0b2NvbXBsZXRlQ29udHJvbGxlclN0YXRlIHtcbiAgcmV0dXJuIHtcbiAgICB0ZXh0OiBzLnRleHQsXG4gICAgY29tcGxldGVkUGFyYW1zOiBzLmNvbXBsZXRlZFBhcmFtcyxcbiAgICBzdWdnZXN0aW9uUGlsbHM6IHMuYWN0aW9uYWJsZVN1Z2dlc3Rpb25zLFxuICAgIHNlZ21lbnRzOiBzLnNlZ21lbnRzLFxuICAgIG5ld1BhcmFtSWQ6IHMubmV3UGFyYW1JZCxcbiAgICBzdWdnZXN0aW9uczogcy5zdWdnZXN0aW9ucyxcbiAgICBhY3RpdmVJbmRleDogcy5hY3RpdmVEcm9wZG93bkluZGV4LFxuICAgIGlzTG9hZGluZzogY29tcHV0ZVVpTG9hZGluZyhzKSxcbiAgICBpc1JlYWR5OiBzLmlzUmVhZHksXG4gICAgaXNGb2N1c2VkOiBzLmlzRm9jdXNlZCxcbiAgICBpc0Ryb3Bkb3duT3Blbjogcy5pc0Ryb3Bkb3duT3BlbixcbiAgICBwbGFjZWhvbGRlclRleHQ6IHMucGxhY2Vob2xkZXJUZXh0LFxuICAgIGVycm9yOiBzLmVycm9yLFxuICAgIGVkaXRpbmdQYXJhbTogcy5lZGl0aW5nUGFyYW0sXG4gICAgZWRpdGluZ0FuY2hvcjogcy5lZGl0aW5nQW5jaG9yLFxuICAgIGNhcmV0T2Zmc2V0OiBzLmNhcmV0T2Zmc2V0LFxuICB9O1xufVxuXG5mdW5jdGlvbiBjb21wdXRlRHJvcGRvd24oczogQ29yZVN0YXRlKTogQUlBdXRvY29tcGxldGVEcm9wZG93blN0YXRlIHtcbiAgY29uc3QgZWRpdGluZ1BhcmFtID0gcy5lZGl0aW5nUGFyYW07XG4gIGNvbnN0IGFjdGl2ZVN1Z2dlc3Rpb24gPSBzLmFjdGlvbmFibGVTdWdnZXN0aW9uc1swXTtcbiAgY29uc3QgZHJvcGRvd25QaWxsOiBTdWdnZXN0aW9uIHwgbnVsbCA9IGVkaXRpbmdQYXJhbVxuICAgID8ge1xuICAgICAgICB0eXBlOiBlZGl0aW5nUGFyYW0uc3VnZ2VzdGlvblR5cGUsXG4gICAgICAgIHRleHQ6IGVkaXRpbmdQYXJhbS5zdWdnZXN0aW9uUGxhY2Vob2xkZXIsXG4gICAgICAgIHJlcXVpcmVkOiB0cnVlLFxuICAgICAgICBvcHRpb25zOiBlZGl0aW5nUGFyYW0ub3B0aW9ucyxcbiAgICAgIH1cbiAgICA6IG51bGw7XG4gIGNvbnN0IGRyb3Bkb3duQWN0aXZlUGlsbCA9IGRyb3Bkb3duUGlsbCA/PyBhY3RpdmVTdWdnZXN0aW9uO1xuICBjb25zdCBkcm9wZG93blBpbGxzID0gZHJvcGRvd25QaWxsID8gW2Ryb3Bkb3duUGlsbF0gOiBzLmFjdGlvbmFibGVTdWdnZXN0aW9ucztcbiAgcmV0dXJuIHtcbiAgICBzdWdnZXN0aW9uczogZHJvcGRvd25BY3RpdmVQaWxsID8gW3sgLi4uZHJvcGRvd25BY3RpdmVQaWxsLCBvcHRpb25zOiBzLmZpbHRlcmVkT3B0aW9ucyB9XSA6IFtdLFxuICAgIGFjdGl2ZUluZGV4OiBzLmFjdGl2ZURyb3Bkb3duSW5kZXgsXG4gICAgaXNPcGVuOiBzLmlzRHJvcGRvd25PcGVuLFxuICAgIHBpbGxzOiBkcm9wZG93blBpbGxzLFxuICAgIGlzTG9hZGluZzogY29tcHV0ZVVpTG9hZGluZyhzKSxcbiAgfTtcbn1cbiJdfQ==
@@ -0,0 +1,2 @@
1
+ export { AIAutocompleteController } from "./ai-autocomplete.controller";
2
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvbGliL2NvbnRyb2xsZXIvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLHdCQUF3QixFQUFFLE1BQU0sOEJBQThCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgeyBBSUF1dG9jb21wbGV0ZUNvbnRyb2xsZXIgfSBmcm9tIFwiLi9haS1hdXRvY29tcGxldGUuY29udHJvbGxlclwiO1xuIl19
@@ -0,0 +1,24 @@
1
+ import { distinctUntilChanged, map, shareReplay } from "rxjs";
2
+ /**
3
+ * Per-field observable derivation factory. Enforces the §19.4 invariant:
4
+ *
5
+ * - `distinctUntilChanged` — prevents re-emission storms when the upstream
6
+ * state object ticks but the field a consumer cares about hasn't changed.
7
+ * Without this, every keystroke would re-render every async-pipe binding
8
+ * in the consumer's template even when nothing changed for that binding.
9
+ * - `shareReplay({ bufferSize: 1, refCount: true })` — guarantees that
10
+ * multiple subscribers (multiple `async` pipes in a template, e.g.
11
+ * `*ngIf="isLoading$ | async"` and `[disabled]="isLoading$ | async"`)
12
+ * share a single upstream subscription. `refCount: true` is non-obvious
13
+ * but essential: without it, the inner subscription survives after the
14
+ * last subscriber unmounts, leaking the chain back to `state$`.
15
+ *
16
+ * Every public observable on {@link AIAutocompleteController} must go through
17
+ * this factory — no exceptions.
18
+ *
19
+ * @internal
20
+ */
21
+ export function deriveField(source$, selector, equalityFn) {
22
+ return source$.pipe(map(selector), distinctUntilChanged(equalityFn), shareReplay({ bufferSize: 1, refCount: true }));
23
+ }
24
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib2JzZXJ2YWJsZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvbGliL2NvbnRyb2xsZXIvb2JzZXJ2YWJsZXMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLG9CQUFvQixFQUFFLEdBQUcsRUFBbUIsV0FBVyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBRS9FOzs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FrQkc7QUFDSCxNQUFNLFVBQVUsV0FBVyxDQUN6QixPQUFzQixFQUN0QixRQUF5QixFQUN6QixVQUFvQztJQUVwQyxPQUFPLE9BQU8sQ0FBQyxJQUFJLENBQ2pCLEdBQUcsQ0FBQyxRQUFRLENBQUMsRUFDYixvQkFBb0IsQ0FBQyxVQUFVLENBQUMsRUFDaEMsV0FBVyxDQUFDLEVBQUUsVUFBVSxFQUFFLENBQUMsRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FDL0MsQ0FBQztBQUNKLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBkaXN0aW5jdFVudGlsQ2hhbmdlZCwgbWFwLCB0eXBlIE9ic2VydmFibGUsIHNoYXJlUmVwbGF5IH0gZnJvbSBcInJ4anNcIjtcblxuLyoqXG4gKiBQZXItZmllbGQgb2JzZXJ2YWJsZSBkZXJpdmF0aW9uIGZhY3RvcnkuIEVuZm9yY2VzIHRoZSDCpzE5LjQgaW52YXJpYW50OlxuICpcbiAqIC0gYGRpc3RpbmN0VW50aWxDaGFuZ2VkYCDigJQgcHJldmVudHMgcmUtZW1pc3Npb24gc3Rvcm1zIHdoZW4gdGhlIHVwc3RyZWFtXG4gKiAgIHN0YXRlIG9iamVjdCB0aWNrcyBidXQgdGhlIGZpZWxkIGEgY29uc3VtZXIgY2FyZXMgYWJvdXQgaGFzbid0IGNoYW5nZWQuXG4gKiAgIFdpdGhvdXQgdGhpcywgZXZlcnkga2V5c3Ryb2tlIHdvdWxkIHJlLXJlbmRlciBldmVyeSBhc3luYy1waXBlIGJpbmRpbmdcbiAqICAgaW4gdGhlIGNvbnN1bWVyJ3MgdGVtcGxhdGUgZXZlbiB3aGVuIG5vdGhpbmcgY2hhbmdlZCBmb3IgdGhhdCBiaW5kaW5nLlxuICogLSBgc2hhcmVSZXBsYXkoeyBidWZmZXJTaXplOiAxLCByZWZDb3VudDogdHJ1ZSB9KWAg4oCUIGd1YXJhbnRlZXMgdGhhdFxuICogICBtdWx0aXBsZSBzdWJzY3JpYmVycyAobXVsdGlwbGUgYGFzeW5jYCBwaXBlcyBpbiBhIHRlbXBsYXRlLCBlLmcuXG4gKiAgIGAqbmdJZj1cImlzTG9hZGluZyQgfCBhc3luY1wiYCBhbmQgYFtkaXNhYmxlZF09XCJpc0xvYWRpbmckIHwgYXN5bmNcImApXG4gKiAgIHNoYXJlIGEgc2luZ2xlIHVwc3RyZWFtIHN1YnNjcmlwdGlvbi4gYHJlZkNvdW50OiB0cnVlYCBpcyBub24tb2J2aW91c1xuICogICBidXQgZXNzZW50aWFsOiB3aXRob3V0IGl0LCB0aGUgaW5uZXIgc3Vic2NyaXB0aW9uIHN1cnZpdmVzIGFmdGVyIHRoZVxuICogICBsYXN0IHN1YnNjcmliZXIgdW5tb3VudHMsIGxlYWtpbmcgdGhlIGNoYWluIGJhY2sgdG8gYHN0YXRlJGAuXG4gKlxuICogRXZlcnkgcHVibGljIG9ic2VydmFibGUgb24ge0BsaW5rIEFJQXV0b2NvbXBsZXRlQ29udHJvbGxlcn0gbXVzdCBnbyB0aHJvdWdoXG4gKiB0aGlzIGZhY3Rvcnkg4oCUIG5vIGV4Y2VwdGlvbnMuXG4gKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkZXJpdmVGaWVsZDxULCBSPihcbiAgc291cmNlJDogT2JzZXJ2YWJsZTxUPixcbiAgc2VsZWN0b3I6ICh2YWx1ZTogVCkgPT4gUixcbiAgZXF1YWxpdHlGbj86IChhOiBSLCBiOiBSKSA9PiBib29sZWFuLFxuKTogT2JzZXJ2YWJsZTxSPiB7XG4gIHJldHVybiBzb3VyY2UkLnBpcGUoXG4gICAgbWFwKHNlbGVjdG9yKSxcbiAgICBkaXN0aW5jdFVudGlsQ2hhbmdlZChlcXVhbGl0eUZuKSxcbiAgICBzaGFyZVJlcGxheSh7IGJ1ZmZlclNpemU6IDEsIHJlZkNvdW50OiB0cnVlIH0pLFxuICApO1xufVxuIl19
@@ -0,0 +1,180 @@
1
+ import { Directive, ElementRef, forwardRef, Input, inject, Renderer2, } from "@angular/core";
2
+ import { NG_VALUE_ACCESSOR } from "@angular/forms";
3
+ import { Subject, takeUntil } from "rxjs";
4
+ import * as i0 from "@angular/core";
5
+ /**
6
+ * Tier 2 input binder. Attach to a `<textarea>` or `<input>` and pass an
7
+ * {@link AIAutocompleteController}:
8
+ *
9
+ * ```html
10
+ * <textarea [aiaInput]="ac"></textarea>
11
+ * ```
12
+ *
13
+ * The directive wires the input's events (input/keydown/focus/blur) to the
14
+ * controller, mirrors controller state into ARIA attributes
15
+ * (`role="combobox"`, `aria-expanded`, `aria-activedescendant`,
16
+ * `aria-autocomplete`, `aria-controls`), and implements
17
+ * {@link ControlValueAccessor} so the host element participates in Reactive
18
+ * Forms out of the box:
19
+ *
20
+ * ```html
21
+ * <textarea [aiaInput]="ac" [formControl]="myControl"></textarea>
22
+ * ```
23
+ *
24
+ * Per the React hook's behavior, the first typed character is auto-capitalized
25
+ * — typing "h" becomes "H" before being forwarded to the controller. The
26
+ * cursor position is preserved across that rewrite.
27
+ *
28
+ * @public
29
+ */
30
+ export class AIAutocompleteInputDirective {
31
+ constructor() {
32
+ this.el = inject(ElementRef);
33
+ this.renderer = inject(Renderer2);
34
+ this.destroy$ = new Subject();
35
+ this.onChangeFn = noop;
36
+ this.onTouchedFn = noop;
37
+ }
38
+ ngOnInit() {
39
+ if (!this.controller) {
40
+ throw new Error('[aiaInput] requires a controller — use `[aiaInput]="myController"`.');
41
+ }
42
+ const el = this.el.nativeElement;
43
+ this.renderer.setAttribute(el, "aria-controls", this.controller.listboxId);
44
+ // Sync editor text → DOM. Skips the write when values already match, so
45
+ // user keystrokes don't fight with our writeback. Preserves the caret
46
+ // position when we do write (and the element still has focus).
47
+ this.controller.text$.pipe(takeUntil(this.destroy$)).subscribe((text) => {
48
+ if (el.value === text)
49
+ return;
50
+ const wasFocused = typeof document !== "undefined" && document.activeElement === el;
51
+ const start = el.selectionStart;
52
+ const end = el.selectionEnd;
53
+ this.renderer.setProperty(el, "value", text);
54
+ if (wasFocused && start != null && end != null) {
55
+ const clampedStart = Math.min(start, text.length);
56
+ const clampedEnd = Math.min(end, text.length);
57
+ try {
58
+ el.setSelectionRange(clampedStart, clampedEnd);
59
+ }
60
+ catch {
61
+ // `setSelectionRange` throws on some input types (e.g. "number");
62
+ // safe to ignore — those inputs don't have a meaningful selection.
63
+ }
64
+ }
65
+ });
66
+ this.controller.isDropdownOpen$.pipe(takeUntil(this.destroy$)).subscribe((isOpen) => {
67
+ this.renderer.setAttribute(el, "aria-expanded", String(isOpen));
68
+ });
69
+ this.controller.activeIndex$.pipe(takeUntil(this.destroy$)).subscribe((idx) => {
70
+ if (idx >= 0) {
71
+ this.renderer.setAttribute(el, "aria-activedescendant", `${this.controller.listboxId}-option-${idx}`);
72
+ }
73
+ else {
74
+ this.renderer.removeAttribute(el, "aria-activedescendant");
75
+ }
76
+ });
77
+ }
78
+ ngOnDestroy() {
79
+ this.destroy$.next();
80
+ this.destroy$.complete();
81
+ }
82
+ // === Event handlers (wired via host metadata above) ===
83
+ /**
84
+ * Auto-capitalizes the first character on the user's first keystroke so the
85
+ * server receives "Create" instead of "create". Matches React's
86
+ * `handleChange` in `useAIAutocomplete`. Skipped during IME composition so
87
+ * we don't disrupt multi-keystroke input methods (Pinyin, Hangul, etc.).
88
+ */
89
+ onInput(event) {
90
+ const target = event.target;
91
+ const raw = target.value;
92
+ const isComposing = event.isComposing === true;
93
+ const shouldCapitalize = raw.length > 0 && !isComposing && raw[0] !== raw[0].toUpperCase();
94
+ let next = raw;
95
+ if (shouldCapitalize) {
96
+ const start = target.selectionStart;
97
+ const end = target.selectionEnd;
98
+ next = raw[0].toUpperCase() + raw.slice(1);
99
+ this.renderer.setProperty(target, "value", next);
100
+ if (start != null && end != null) {
101
+ try {
102
+ target.setSelectionRange(start, end);
103
+ }
104
+ catch {
105
+ // See note in ngOnInit's text$ subscriber.
106
+ }
107
+ }
108
+ }
109
+ this.controller.handleTextChange(next);
110
+ this.onChangeFn(next);
111
+ }
112
+ onKeyDown(event) {
113
+ this.controller.handleKeyDown(event);
114
+ }
115
+ onFocus() {
116
+ this.controller.setFocused(true);
117
+ }
118
+ onBlur() {
119
+ this.controller.setFocused(false);
120
+ this.onTouchedFn();
121
+ }
122
+ // === ControlValueAccessor ===
123
+ writeValue(value) {
124
+ const next = value ?? "";
125
+ this.renderer.setProperty(this.el.nativeElement, "value", next);
126
+ // The controller may be undefined transiently if Angular calls
127
+ // writeValue() before ngOnInit (rare but possible during dynamic form
128
+ // construction). Guard so we don't throw in that window.
129
+ if (this.controller)
130
+ this.controller.setValue(next);
131
+ }
132
+ registerOnChange(fn) {
133
+ this.onChangeFn = fn;
134
+ }
135
+ registerOnTouched(fn) {
136
+ this.onTouchedFn = fn;
137
+ }
138
+ setDisabledState(disabled) {
139
+ this.renderer.setProperty(this.el.nativeElement, "disabled", disabled);
140
+ }
141
+ }
142
+ AIAutocompleteInputDirective.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: AIAutocompleteInputDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive });
143
+ AIAutocompleteInputDirective.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "15.2.10", type: AIAutocompleteInputDirective, isStandalone: true, selector: "[aiaInput]", inputs: { controller: ["aiaInput", "controller"] }, host: { attributes: { "role": "combobox", "aria-autocomplete": "list" }, listeners: { "input": "onInput($event)", "keydown": "onKeyDown($event)", "focus": "onFocus()", "blur": "onBlur()" } }, providers: [
144
+ {
145
+ provide: NG_VALUE_ACCESSOR,
146
+ // eslint-disable-next-line @typescript-eslint/no-use-before-define
147
+ useExisting: forwardRef(() => AIAutocompleteInputDirective),
148
+ multi: true,
149
+ },
150
+ ], ngImport: i0 });
151
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: AIAutocompleteInputDirective, decorators: [{
152
+ type: Directive,
153
+ args: [{
154
+ selector: "[aiaInput]",
155
+ standalone: true,
156
+ host: {
157
+ role: "combobox",
158
+ "aria-autocomplete": "list",
159
+ "(input)": "onInput($event)",
160
+ "(keydown)": "onKeyDown($event)",
161
+ "(focus)": "onFocus()",
162
+ "(blur)": "onBlur()",
163
+ },
164
+ providers: [
165
+ {
166
+ provide: NG_VALUE_ACCESSOR,
167
+ // eslint-disable-next-line @typescript-eslint/no-use-before-define
168
+ useExisting: forwardRef(() => AIAutocompleteInputDirective),
169
+ multi: true,
170
+ },
171
+ ],
172
+ }]
173
+ }], propDecorators: { controller: [{
174
+ type: Input,
175
+ args: ["aiaInput"]
176
+ }] } });
177
+ function noop() {
178
+ // Default no-op callback for CVA — overwritten by Angular's form bridge.
179
+ }
180
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWktYXV0b2NvbXBsZXRlLWlucHV0LmRpcmVjdGl2ZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9saWIvaW5wdXQvYWktYXV0b2NvbXBsZXRlLWlucHV0LmRpcmVjdGl2ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0wsU0FBUyxFQUNULFVBQVUsRUFDVixVQUFVLEVBQ1YsS0FBSyxFQUNMLE1BQU0sRUFHTixTQUFTLEdBQ1YsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUE2QixpQkFBaUIsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQzlFLE9BQU8sRUFBRSxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sTUFBTSxDQUFDOztBQUcxQzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBd0JHO0FBcUJILE1BQU0sT0FBTyw0QkFBNEI7SUFwQnpDO1FBMkJtQixPQUFFLEdBQUcsTUFBTSxDQUFxRCxVQUFVLENBQUMsQ0FBQztRQUM1RSxhQUFRLEdBQUcsTUFBTSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQzdCLGFBQVEsR0FBRyxJQUFJLE9BQU8sRUFBUSxDQUFDO1FBRXhDLGVBQVUsR0FBNEIsSUFBSSxDQUFDO1FBQzNDLGdCQUFXLEdBQWUsSUFBSSxDQUFDO0tBeUh4QztJQXZIQyxRQUFRO1FBQ04sSUFBSSxDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUU7WUFDcEIsTUFBTSxJQUFJLEtBQUssQ0FBQyxxRUFBcUUsQ0FBQyxDQUFDO1NBQ3hGO1FBRUQsTUFBTSxFQUFFLEdBQUcsSUFBSSxDQUFDLEVBQUUsQ0FBQyxhQUFhLENBQUM7UUFDakMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxZQUFZLENBQUMsRUFBRSxFQUFFLGVBQWUsRUFBRSxJQUFJLENBQUMsVUFBVSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBRTNFLHdFQUF3RTtRQUN4RSxzRUFBc0U7UUFDdEUsK0RBQStEO1FBQy9ELElBQUksQ0FBQyxVQUFV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QUFHLEVBQUUsNkJBQTZCLENBQUM7NEJBQzNELEtBQUssRUFBRSxJQUFJO3lCQUNaO3FCQUNGO2lCQUNGOzhCQU1vQixVQUFVO3NCQUE1QixLQUFLO3VCQUFDLFVBQVU7O0FBa0luQixTQUFTLElBQUk7SUFDWCx5RUFBeUU7QUFDM0UsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIERpcmVjdGl2ZSxcbiAgRWxlbWVudFJlZixcbiAgZm9yd2FyZFJlZixcbiAgSW5wdXQsXG4gIGluamVjdCxcbiAgdHlwZSBPbkRlc3Ryb3ksXG4gIHR5cGUgT25Jbml0LFxuICBSZW5kZXJlcjIsXG59IGZyb20gXCJAYW5ndWxhci9jb3JlXCI7XG5pbXBvcnQgeyB0eXBlIENvbnRyb2xWYWx1ZUFjY2Vzc29yLCBOR19WQUxVRV9BQ0NFU1NPUiB9IGZyb20gXCJAYW5ndWxhci9mb3Jtc1wiO1xuaW1wb3J0IHsgU3ViamVjdCwgdGFrZVVudGlsIH0gZnJvbSBcInJ4anNcIjtcbmltcG9ydCB0eXBlIHsgQUlBdXRvY29tcGxldGVDb250cm9sbGVyIH0gZnJvbSBcIi4uL2NvbnRyb2xsZXIvYWktYXV0b2NvbXBsZXRlLmNvbnRyb2xsZXJcIjtcblxuLyoqXG4gKiBUaWVyIDIgaW5wdXQgYmluZGVyLiBBdHRhY2ggdG8gYSBgPHRleHRhcmVhPmAgb3IgYDxpbnB1dD5gIGFuZCBwYXNzIGFuXG4gKiB7QGxpbmsgQUlBdXRvY29tcGxldGVDb250cm9sbGVyfTpcbiAqXG4gKiBgYGBodG1sXG4gKiA8dGV4dGFyZWEgW2FpYUlucHV0XT1cImFjXCI+PC90ZXh0YXJlYT5cbiAqIGBgYFxuICpcbiAqIFRoZSBkaXJlY3RpdmUgd2lyZXMgdGhlIGlucHV0J3MgZXZlbnRzIChpbnB1dC9rZXlkb3duL2ZvY3VzL2JsdXIpIHRvIHRoZVxuICogY29udHJvbGxlciwgbWlycm9ycyBjb250cm9sbGVyIHN0YXRlIGludG8gQVJJQSBhdHRyaWJ1dGVzXG4gKiAoYHJvbGU9XCJjb21ib2JveFwiYCwgYGFyaWEtZXhwYW5kZWRgLCBgYXJpYS1hY3RpdmVkZXNjZW5kYW50YCxcbiAqIGBhcmlhLWF1dG9jb21wbGV0ZWAsIGBhcmlhLWNvbnRyb2xzYCksIGFuZCBpbXBsZW1lbnRzXG4gKiB7QGxpbmsgQ29udHJvbFZhbHVlQWNjZXNzb3J9IHNvIHRoZSBob3N0IGVsZW1lbnQgcGFydGljaXBhdGVzIGluIFJlYWN0aXZlXG4gKiBGb3JtcyBvdXQgb2YgdGhlIGJveDpcbiAqXG4gKiBgYGBodG1sXG4gKiA8dGV4dGFyZWEgW2FpYUlucHV0XT1cImFjXCIgW2Zvcm1Db250cm9sXT1cIm15Q29udHJvbFwiPjwvdGV4dGFyZWE+XG4gKiBgYGBcbiAqXG4gKiBQZXIgdGhlIFJlYWN0IGhvb2sncyBiZWhhdmlvciwgdGhlIGZpcnN0IHR5cGVkIGNoYXJhY3RlciBpcyBhdXRvLWNhcGl0YWxpemVkXG4gKiDigJQgdHlwaW5nIFwiaFwiIGJlY29tZXMgXCJIXCIgYmVmb3JlIGJlaW5nIGZvcndhcmRlZCB0byB0aGUgY29udHJvbGxlci4gVGhlXG4gKiBjdXJzb3IgcG9zaXRpb24gaXMgcHJlc2VydmVkIGFjcm9zcyB0aGF0IHJld3JpdGUuXG4gKlxuICogQHB1YmxpY1xuICovXG5ARGlyZWN0aXZlKHtcbiAgc2VsZWN0b3I6IFwiW2FpYUlucHV0XVwiLFxuICBzdGFuZGFsb25lOiB0cnVlLFxuICBob3N0OiB7XG4gICAgcm9sZTogXCJjb21ib2JveFwiLFxuICAgIFwiYXJpYS1hdXRvY29tcGxldGVcIjogXCJsaXN0XCIsXG4gICAgXCIoaW5wdXQpXCI6IFwib25JbnB1dCgkZXZlbnQpXCIsXG4gICAgXCIoa2V5ZG93bilcIjogXCJvbktleURvd24oJGV2ZW50KVwiLFxuICAgIFwiKGZvY3VzKVwiOiBcIm9uRm9jdXMoKVwiLFxuICAgIFwiKGJsdXIpXCI6IFwib25CbHVyKClcIixcbiAgfSxcbiAgcHJvdmlkZXJzOiBbXG4gICAge1xuICAgICAgcHJvdmlkZTogTkdfVkFMVUVfQUNDRVNTT1IsXG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVzZS1iZWZvcmUtZGVmaW5lXG4gICAgICB1c2VFeGlzdGluZzogZm9yd2FyZFJlZigoKSA9PiBBSUF1dG9jb21wbGV0ZUlucHV0RGlyZWN0aXZlKSxcbiAgICAgIG11bHRpOiB0cnVlLFxuICAgIH0sXG4gIF0sXG59KVxuZXhwb3J0IGNsYXNzIEFJQXV0b2NvbXBsZXRlSW5wdXREaXJlY3RpdmUgaW1wbGVtZW50cyBPbkluaXQsIE9uRGVzdHJveSwgQ29udHJvbFZhbHVlQWNjZXNzb3Ige1xuICAvKipcbiAgICogVGhlIHtAbGluayBBSUF1dG9jb21wbGV0ZUNvbnRyb2xsZXJ9IHRoYXQgb3ducyB0aGUgYXV0b2NvbXBsZXRlIHN0YXRlLlxuICAgKiBSZXF1aXJlZC4gVGhlIGRpcmVjdGl2ZSB0aHJvd3Mgb24gaW5pdCBpZiB0aGlzIGlzIG1pc3NpbmcuXG4gICAqL1xuICBASW5wdXQoXCJhaWFJbnB1dFwiKSBjb250cm9sbGVyITogQUlBdXRvY29tcGxldGVDb250cm9sbGVyO1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgZWwgPSBpbmplY3Q8RWxlbWVudFJlZjxIVE1MSW5wdXRFbGVtZW50IHwgSFRNTFRleHRBcmVhRWxlbWVudD4+KEVsZW1lbnRSZWYpO1xuICBwcml2YXRlIHJlYWRvbmx5IHJlbmRlcmVyID0gaW5qZWN0KFJlbmRlcmVyMik7XG4gIHByaXZhdGUgcmVhZG9ubHkgZGVzdHJveSQgPSBuZXcgU3ViamVjdDx2b2lkPigpO1xuXG4gIHByaXZhdGUgb25DaGFuZ2VGbjogKHZhbHVlOiBzdHJpbmcpID0+IHZvaWQgPSBub29wO1xuICBwcml2YXRlIG9uVG91Y2hlZEZuOiAoKSA9PiB2b2lkID0gbm9vcDtcblxuICBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuY29udHJvbGxlcikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdbYWlhSW5wdXRdIHJlcXVpcmVzIGEgY29udHJvbGxlciDigJQgdXNlIGBbYWlhSW5wdXRdPVwibXlDb250cm9sbGVyXCJgLicpO1xuICAgIH1cblxuICAgIGNvbnN0IGVsID0gdGhpcy5lbC5uYXRpdmVFbGVtZW50O1xuICAgIHRoaXMucmVuZGVyZXIuc2V0QXR0cmlidXRlKGVsLCBcImFyaWEtY29udHJvbHNcIiwgdGhpcy5jb250cm9sbGVyLmxpc3Rib3hJZCk7XG5cbiAgICAvLyBTeW5jIGVkaXRvciB0ZXh0IOKGkiBET00uIFNraXBzIHRoZSB3cml0ZSB3aGVuIHZhbHVlcyBhbHJlYWR5IG1hdGNoLCBzb1xuICAgIC8vIHVzZXIga2V5c3Ryb2tlcyBkb24ndCBmaWdodCB3aXRoIG91ciB3cml0ZWJhY2suIFByZXNlcnZlcyB0aGUgY2FyZXRcbiAgICAvLyBwb3NpdGlvbiB3aGVuIHdlIGRvIHdyaXRlIChhbmQgdGhlIGVsZW1lbnQgc3RpbGwgaGFzIGZvY3VzKS5cbiAgICB0aGlzLmNvbnRyb2xsZXIudGV4dCQucGlwZSh0YWtlVW50aWwodGhpcy5kZXN0cm95JCkpLnN1YnNjcmliZSgodGV4dCkgPT4ge1xuICAgICAgaWYgKGVsLnZhbHVlID09PSB0ZXh0KSByZXR1cm47XG4gICAgICBjb25zdCB3YXNGb2N1c2VkID0gdHlwZW9mIGRvY3VtZW50ICE9PSBcInVuZGVmaW5lZFwiICYmIGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQgPT09IGVsO1xuICAgICAgY29uc3Qgc3RhcnQgPSBlbC5zZWxlY3Rpb25TdGFydDtcbiAgICAgIGNvbnN0IGVuZCA9IGVsLnNlbGVjdGlvbkVuZDtcbiAgICAgIHRoaXMucmVuZGVyZXIuc2V0UHJvcGVydHkoZWwsIFwidmFsdWVcIiwgdGV4dCk7XG4gICAgICBpZiAod2FzRm9jdXNlZCAmJiBzdGFydCAhPSBudWxsICYmIGVuZCAhPSBudWxsKSB7XG4gICAgICAgIGNvbnN0IGNsYW1wZWRTdGFydCA9IE1hdGgubWluKHN0YXJ0LCB0ZXh0Lmxlbmd0aCk7XG4gICAgICAgIGNvbnN0IGNsYW1wZWRFbmQgPSBNYXRoLm1pbihlbmQsIHRleHQubGVuZ3RoKTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBlbC5zZXRTZWxlY3Rpb25SYW5nZShjbGFtcGVkU3RhcnQsIGNsYW1wZWRFbmQpO1xuICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICAvLyBgc2V0U2VsZWN0aW9uUmFuZ2VgIHRocm93cyBvbiBzb21lIGlucHV0IHR5cGVzIChlLmcuIFwibnVtYmVyXCIpO1xuICAgICAgICAgIC8vIHNhZmUgdG8gaWdub3JlIOKAlCB0aG9zZSBpbnB1dHMgZG9uJ3QgaGF2ZSBhIG1lYW5pbmdmdWwgc2VsZWN0aW9uLlxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICB0aGlzLmNvbnRyb2xsZXIuaXNEcm9wZG93bk9wZW4kLnBpcGUodGFrZVVudGlsKHRoaXMuZGVzdHJveSQpKS5zdWJzY3JpYmUoKGlzT3BlbikgPT4ge1xuICAgICAgdGhpcy5yZW5kZXJlci5zZXRBdHRyaWJ1dGUoZWwsIFwiYXJpYS1leHBhbmRlZFwiLCBTdHJpbmcoaXNPcGVuKSk7XG4gICAgfSk7XG5cbiAgICB0aGlzLmNvbnRyb2xsZXIuYWN0aXZlSW5kZXgkLnBpcGUodGFrZVVudGlsKHRoaXMuZGVzdHJveSQpKS5zdWJzY3JpYmUoKGlkeCkgPT4ge1xuICAgICAgaWYgKGlkeCA+PSAwKSB7XG4gICAgICAgIHRoaXMucmVuZGVyZXIuc2V0QXR0cmlidXRlKFxuICAgICAgICAgIGVsLFxuICAgICAgICAgIFwiYXJpYS1hY3RpdmVkZXNjZW5kYW50XCIsXG4gICAgICAgICAgYCR7dGhpcy5jb250cm9sbGVyLmxpc3Rib3hJZH0tb3B0aW9uLSR7aWR4fWAsXG4gICAgICAgICk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLnJlbmRlcmVyLnJlbW92ZUF0dHJpYnV0ZShlbCwgXCJhcmlhLWFjdGl2ZWRlc2NlbmRhbnRcIik7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICB0aGlzLmRlc3Ryb3kkLm5leHQoKTtcbiAgICB0aGlzLmRlc3Ryb3kkLmNvbXBsZXRlKCk7XG4gIH1cblxuICAvLyA9PT0gRXZlbnQgaGFuZGxlcnMgKHdpcmVkIHZpYSBob3N0IG1ldGFkYXRhIGFib3ZlKSA9PT1cblxuICAvKipcbiAgICogQXV0by1jYXBpdGFsaXplcyB0aGUgZmlyc3QgY2hhcmFjdGVyIG9uIHRoZSB1c2VyJ3MgZmlyc3Qga2V5c3Ryb2tlIHNvIHRoZVxuICAgKiBzZXJ2ZXIgcmVjZWl2ZXMgXCJDcmVhdGVcIiBpbnN0ZWFkIG9mIFwiY3JlYXRlXCIuIE1hdGNoZXMgUmVhY3Qnc1xuICAgKiBgaGFuZGxlQ2hhbmdlYCBpbiBgdXNlQUlBdXRvY29tcGxldGVgLiBTa2lwcGVkIGR1cmluZyBJTUUgY29tcG9zaXRpb24gc29cbiAgICogd2UgZG9uJ3QgZGlzcnVwdCBtdWx0aS1rZXlzdHJva2UgaW5wdXQgbWV0aG9kcyAoUGlueWluLCBIYW5ndWwsIGV0Yy4pLlxuICAgKi9cbiAgb25JbnB1dChldmVudDogRXZlbnQpOiB2b2lkIHtcbiAgICBjb25zdCB0YXJnZXQgPSBldmVudC50YXJnZXQgYXMgSFRNTElucHV0RWxlbWVudCB8IEhUTUxUZXh0QXJlYUVsZW1lbnQ7XG4gICAgY29uc3QgcmF3ID0gdGFyZ2V0LnZhbHVlO1xuICAgIGNvbnN0IGlzQ29tcG9zaW5nID0gKGV2ZW50IGFzIElucHV0RXZlbnQpLmlzQ29tcG9zaW5nID09PSB0cnVlO1xuICAgIGNvbnN0IHNob3VsZENhcGl0YWxpemUgPSByYXcubGVuZ3RoID4gMCAmJiAhaXNDb21wb3NpbmcgJiYgcmF3WzBdICE9PSByYXdbMF0udG9VcHBlckNhc2UoKTtcblxuICAgIGxldCBuZXh0ID0gcmF3O1xuICAgIGlmIChzaG91bGRDYXBpdGFsaXplKSB7XG4gICAgICBjb25zdCBzdGFydCA9IHRhcmdldC5zZWxlY3Rpb25TdGFydDtcbiAgICAgIGNvbnN0IGVuZCA9IHRhcmdldC5zZWxlY3Rpb25FbmQ7XG4gICAgICBuZXh0ID0gcmF3WzBdLnRvVXBwZXJDYXNlKCkgKyByYXcuc2xpY2UoMSk7XG4gICAgICB0aGlzLnJlbmRlcmVyLnNldFByb3BlcnR5KHRhcmdldCwgXCJ2YWx1ZVwiLCBuZXh0KTtcbiAgICAgIGlmIChzdGFydCAhPSBudWxsICYmIGVuZCAhPSBudWxsKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgdGFyZ2V0LnNldFNlbGVjdGlvblJhbmdlKHN0YXJ0LCBlbmQpO1xuICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICAvLyBTZWUgbm90ZSBpbiBuZ09uSW5pdCdzIHRleHQkIHN1YnNjcmliZXIuXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICB0aGlzLmNvbnRyb2xsZXIuaGFuZGxlVGV4dENoYW5nZShuZXh0KTtcbiAgICB0aGlzLm9uQ2hhbmdlRm4obmV4dCk7XG4gIH1cblxuICBvbktleURvd24oZXZlbnQ6IEtleWJvYXJkRXZlbnQpOiB2b2lkIHtcbiAgICB0aGlzLmNvbnRyb2xsZXIuaGFuZGxlS2V5RG93bihldmVudCk7XG4gIH1cblxuICBvbkZvY3VzKCk6IHZvaWQge1xuICAgIHRoaXMuY29udHJvbGxlci5zZXRGb2N1c2VkKHRydWUpO1xuICB9XG5cbiAgb25CbHVyKCk6IHZvaWQge1xuICAgIHRoaXMuY29udHJvbGxlci5zZXRGb2N1c2VkKGZhbHNlKTtcbiAgICB0aGlzLm9uVG91Y2hlZEZuKCk7XG4gIH1cblxuICAvLyA9PT0gQ29udHJvbFZhbHVlQWNjZXNzb3IgPT09XG5cbiAgd3JpdGVWYWx1ZSh2YWx1ZTogc3RyaW5nIHwgbnVsbCk6IHZvaWQge1xuICAgIGNvbnN0IG5leHQgPSB2YWx1ZSA/PyBcIlwiO1xuICAgIHRoaXMucmVuZGVyZXIuc2V0UHJvcGVydHkodGhpcy5lbC5uYXRpdmVFbGVtZW50LCBcInZhbHVlXCIsIG5leHQpO1xuICAgIC8vIFRoZSBjb250cm9sbGVyIG1heSBiZSB1bmRlZmluZWQgdHJhbnNpZW50bHkgaWYgQW5ndWxhciBjYWxsc1xuICAgIC8vIHdyaXRlVmFsdWUoKSBiZWZvcmUgbmdPbkluaXQgKHJhcmUgYnV0IHBvc3NpYmxlIGR1cmluZyBkeW5hbWljIGZvcm1cbiAgICAvLyBjb25zdHJ1Y3Rpb24pLiBHdWFyZCBzbyB3ZSBkb24ndCB0aHJvdyBpbiB0aGF0IHdpbmRvdy5cbiAgICBpZiAodGhpcy5jb250cm9sbGVyKSB0aGlzLmNvbnRyb2xsZXIuc2V0VmFsdWUobmV4dCk7XG4gIH1cblxuICByZWdpc3Rlck9uQ2hhbmdlKGZuOiAodmFsdWU6IHN0cmluZykgPT4gdm9pZCk6IHZvaWQge1xuICAgIHRoaXMub25DaGFuZ2VGbiA9IGZuO1xuICB9XG5cbiAgcmVnaXN0ZXJPblRvdWNoZWQoZm46ICgpID0+IHZvaWQpOiB2b2lkIHtcbiAgICB0aGlzLm9uVG91Y2hlZEZuID0gZm47XG4gIH1cblxuICBzZXREaXNhYmxlZFN0YXRlKGRpc2FibGVkOiBib29sZWFuKTogdm9pZCB7XG4gICAgdGhpcy5yZW5kZXJlci5zZXRQcm9wZXJ0eSh0aGlzLmVsLm5hdGl2ZUVsZW1lbnQsIFwiZGlzYWJsZWRcIiwgZGlzYWJsZWQpO1xuICB9XG59XG5cbmZ1bmN0aW9uIG5vb3AoKTogdm9pZCB7XG4gIC8vIERlZmF1bHQgbm8tb3AgY2FsbGJhY2sgZm9yIENWQSDigJQgb3ZlcndyaXR0ZW4gYnkgQW5ndWxhcidzIGZvcm0gYnJpZGdlLlxufVxuIl19
@@ -0,0 +1,2 @@
1
+ export { AIAutocompleteInputDirective } from "./ai-autocomplete-input.directive";
2
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvbGliL2lucHV0L2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSw0QkFBNEIsRUFBRSxNQUFNLG1DQUFtQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IHsgQUlBdXRvY29tcGxldGVJbnB1dERpcmVjdGl2ZSB9IGZyb20gXCIuL2FpLWF1dG9jb21wbGV0ZS1pbnB1dC5kaXJlY3RpdmVcIjtcbiJdfQ==