@ieeesa-npm/groups 0.15.8 → 0.15.9

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.
@@ -0,0 +1,455 @@
1
+ import { COMMA, DOWN_ARROW, ENTER, ESCAPE, UP_ARROW, } from '@angular/cdk/keycodes';
2
+ import { CommonModule } from '@angular/common';
3
+ import { Component, EventEmitter, Input, Output, ViewChild, ViewEncapsulation, } from '@angular/core';
4
+ import { MatButtonModule } from '@angular/material/button';
5
+ import { MatCheckboxModule } from '@angular/material/checkbox';
6
+ import { MatIconModule } from '@angular/material/icon';
7
+ import { MatTooltipModule } from '@angular/material/tooltip';
8
+ import { Subject, timer } from 'rxjs';
9
+ import * as screenTexts from '../../assets/constants.json';
10
+ import { GroupsValidationPatterns } from '../../assets/form-validations';
11
+ import * as i0 from "@angular/core";
12
+ import * as i1 from "@angular/common";
13
+ import * as i2 from "@angular/material/checkbox";
14
+ import * as i3 from "@angular/material/tooltip";
15
+ /**
16
+ * A self-contained multi-select organization field used inside the Add/Edit
17
+ * roster popups.
18
+ *
19
+ * It intentionally does NOT reuse the shared MultiSelectAutocompleteComponent
20
+ * (which is built on mat-autocomplete). Material's autocomplete closes its panel
21
+ * and overwrites the input on every option pick, which made multi-selection
22
+ * feel single-select and cleared the user's typed text. This component uses a
23
+ * fully-owned custom dropdown (<div> + checkboxes) so:
24
+ * - the panel stays open while the user ticks several results,
25
+ * - the typed search text is never overwritten by a pick,
26
+ * - pressing Enter adds the typed value as a free-text chip,
27
+ * - clicking outside clears any leftover typed text (old behavior),
28
+ * - selected values render as removable chips (old behavior).
29
+ *
30
+ * The parent supplies search results via {@link options} and reacts to
31
+ * {@link search} (debounced typed term) and {@link selectionChange}.
32
+ * @export
33
+ * @class OrgMultiSelectComponent
34
+ */
35
+ export class OrgMultiSelectComponent {
36
+ constructor() {
37
+ /** Field label (e.g. "Representing Organization *"). */
38
+ this.label = '';
39
+ /** Placeholder for the input. */
40
+ this.placeholder = '';
41
+ /** Support/help text shown below the field. */
42
+ this.supportMessage = '';
43
+ /** aria-label for the input. */
44
+ this.ariaLabel = '';
45
+ this._options = [];
46
+ this._selectedOptions = [];
47
+ /** Marks the field required (drives the required message + error border). */
48
+ this.required = true;
49
+ /**
50
+ * Icon URLs (same sprite refs the shared multi-select field used). Defaulted
51
+ * so the popups don't need to pass them; overridable via input if needed.
52
+ */
53
+ this.removeIconURL = 'assets/images/sprites/sprites.svg#icon-trailing';
54
+ this.clearAllIconURL = 'assets/images/sprites/sprites.svg#icon-clear-all';
55
+ /** Emits the trimmed typed term (debounced) so the parent can call the API. */
56
+ this.search = new EventEmitter();
57
+ /** Emits the current selection array whenever it changes. */
58
+ this.selectionChange = new EventEmitter();
59
+ /** Emitted when the field is blurred (parent can re-evaluate validation). */
60
+ this.fieldBlur = new EventEmitter();
61
+ /**
62
+ * Emits true when the input holds an uncommitted free-text token that fails
63
+ * validation (too short / too long / invalid pattern), and false when the
64
+ * input is empty or the token is valid. The parent uses this to keep the Save
65
+ * button disabled while an invalid token remains — otherwise a previously
66
+ * added valid chip would keep the parent control valid and let the form submit
67
+ * with an invalid token still in the input.
68
+ */
69
+ this.invalidFreeText = new EventEmitter();
70
+ /** Tracks the last emitted invalid-token state to avoid duplicate emits. */
71
+ this.hasInvalidFreeText = false;
72
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
73
+ this.constants = screenTexts;
74
+ this.addUserRosterTexts = this.constants?.addUserRoster;
75
+ /** Whether the results dropdown is open. */
76
+ this.isDropdownOpen = false;
77
+ /** The current typed search text. */
78
+ this.searchText = '';
79
+ /** Inline validation message for the free-text (Enter) path. */
80
+ this.errorMessage = '';
81
+ /** Whether the field has been touched (to show required error after blur). */
82
+ this.isTouched = false;
83
+ /**
84
+ * Index of the keyboard-highlighted result row (-1 = none). Enables arrow-key
85
+ * navigation and Enter-to-toggle for keyboard users, mirroring the mat-option
86
+ * behavior this custom dropdown replaces.
87
+ */
88
+ this.activeOptionIndex = -1;
89
+ /** Stable id prefix for option rows (used for aria-activedescendant). */
90
+ this.optionIdPrefix = 'ieeesa-org-option-';
91
+ this.destroy$ = new Subject();
92
+ this.debounceMs = 300;
93
+ this.minCharToSearch = 3;
94
+ this.separatorKeys = [ENTER, COMMA];
95
+ }
96
+ /** Search results supplied by the parent (repopulated on each search). */
97
+ set options(value) {
98
+ this._options = value ?? [];
99
+ // Reset keyboard highlight whenever the result set changes.
100
+ this.activeOptionIndex = -1;
101
+ // Open the dropdown as soon as fresh results arrive while the user is still
102
+ // typing/searching (has non-empty text). Closes when results are emptied.
103
+ this.isDropdownOpen =
104
+ this._options.length > 0 && this.searchText.trim().length > 0;
105
+ }
106
+ get options() {
107
+ return this._options;
108
+ }
109
+ /** Pre-selected options (edit prefill). Rendered as chips. */
110
+ set selectedOptions(value) {
111
+ this._selectedOptions = value ?? [];
112
+ }
113
+ get selectedOptions() {
114
+ return this._selectedOptions;
115
+ }
116
+ ngOnInit() {
117
+ // Fallback labels from the shared constants if inputs are not provided.
118
+ this.placeholder = this.placeholder ?? '';
119
+ }
120
+ /**
121
+ * Handles typing in the search input: tracks the text, opens/closes the
122
+ * dropdown and debounces the search emit to the parent.
123
+ * @param {Event} event -input event.
124
+ * @memberof OrgMultiSelectComponent
125
+ */
126
+ onInput(event) {
127
+ const value = event.target.value;
128
+ this.searchText = value;
129
+ this.errorMessage = '';
130
+ // Any non-empty, uncommitted text is a pending token — flag the field
131
+ // invalid so the parent disables Save until it is committed (Enter) or
132
+ // cleared. Cleared text resets the flag.
133
+ this.emitInvalidState(!!value.trim());
134
+ const trimmed = value.trim();
135
+ this.searchDebounce?.unsubscribe();
136
+ if (trimmed.length < this.minCharToSearch) {
137
+ this.options = [];
138
+ this.isDropdownOpen = false;
139
+ return;
140
+ }
141
+ this.searchDebounce = timer(this.debounceMs).subscribe(() => {
142
+ this.search.emit(trimmed);
143
+ });
144
+ }
145
+ /**
146
+ * Emits the invalid-free-text state to the parent (deduped). True means an
147
+ * uncommitted token is present and Save should stay disabled.
148
+ * @param {boolean} isInvalid -whether an uncommitted token is present.
149
+ * @memberof OrgMultiSelectComponent
150
+ */
151
+ emitInvalidState(isInvalid) {
152
+ if (this.hasInvalidFreeText !== isInvalid) {
153
+ this.hasInvalidFreeText = isInvalid;
154
+ this.invalidFreeText.emit(isInvalid);
155
+ }
156
+ }
157
+ /**
158
+ * Opens the dropdown on focus only when there are results AND the input still
159
+ * holds a valid search term (at or above minCharToSearch). This prevents
160
+ * re-opening stale results — e.g. a late API response that populated options
161
+ * after the input was cleared — when the user simply refocuses the field.
162
+ * @memberof OrgMultiSelectComponent
163
+ */
164
+ onFocus() {
165
+ if (this.options?.length &&
166
+ this.searchText.trim().length >= this.minCharToSearch) {
167
+ this.isDropdownOpen = true;
168
+ }
169
+ }
170
+ /**
171
+ * Called by the parent (via a setter re-assign) or internally after new
172
+ * options arrive so the dropdown opens to show them.
173
+ * @memberof OrgMultiSelectComponent
174
+ */
175
+ showResults() {
176
+ this.isDropdownOpen = !!this.options?.length;
177
+ }
178
+ /**
179
+ * Handles keydown for the Enter/comma "add typed value" path.
180
+ * @param {KeyboardEvent} event -keyboard event.
181
+ * @memberof OrgMultiSelectComponent
182
+ */
183
+ onKeydown(event) {
184
+ // Arrow keys move the highlight through the open results list (opening it
185
+ // first if there are results). This makes the custom dropdown operable by
186
+ // keyboard, matching the mat-option list it replaces.
187
+ if (event.keyCode === DOWN_ARROW || event.keyCode === UP_ARROW) {
188
+ if (!this.options?.length) {
189
+ return;
190
+ }
191
+ event.preventDefault();
192
+ this.isDropdownOpen = true;
193
+ this.moveActiveOption(event.keyCode === DOWN_ARROW ? 1 : -1);
194
+ return;
195
+ }
196
+ // Escape closes the results without committing anything.
197
+ if (event.keyCode === ESCAPE) {
198
+ if (this.isDropdownOpen) {
199
+ event.preventDefault();
200
+ this.isDropdownOpen = false;
201
+ this.activeOptionIndex = -1;
202
+ }
203
+ return;
204
+ }
205
+ if (!this.separatorKeys.includes(event.keyCode)) {
206
+ return;
207
+ }
208
+ event.preventDefault();
209
+ // Enter/comma: if a result row is highlighted, toggle that option (keyboard
210
+ // parity with clicking it). Otherwise fall back to adding the typed text as
211
+ // a free-text chip.
212
+ if (this.isDropdownOpen &&
213
+ this.activeOptionIndex >= 0 &&
214
+ this.activeOptionIndex < this.options.length) {
215
+ this.toggleOption(this.options[this.activeOptionIndex]);
216
+ return;
217
+ }
218
+ this.addTypedValue();
219
+ }
220
+ /**
221
+ * Moves the keyboard highlight up/down the results list, wrapping at the ends.
222
+ * @param {number} delta -+1 to move down, -1 to move up.
223
+ * @memberof OrgMultiSelectComponent
224
+ */
225
+ moveActiveOption(delta) {
226
+ const count = this.options.length;
227
+ if (!count) {
228
+ return;
229
+ }
230
+ const next = this.activeOptionIndex + delta;
231
+ // Wrap around so the highlight cycles through the list.
232
+ this.activeOptionIndex = (next + count) % count;
233
+ }
234
+ /**
235
+ * Whether the given result index is the keyboard-highlighted row.
236
+ * @param {number} index -the option's index.
237
+ * @return {boolean}
238
+ * @memberof OrgMultiSelectComponent
239
+ */
240
+ isActiveOption(index) {
241
+ return index === this.activeOptionIndex;
242
+ }
243
+ /**
244
+ * Adds the typed free-text value as a selection (chip) after validating its
245
+ * length and pattern (parity with the previous chip-input behavior).
246
+ * @memberof OrgMultiSelectComponent
247
+ */
248
+ addTypedValue() {
249
+ const value = this.searchText.trim();
250
+ if (!value) {
251
+ return;
252
+ }
253
+ const validationError = this.validateFreeText(value);
254
+ if (validationError) {
255
+ this.errorMessage = validationError;
256
+ // Keep the field flagged invalid so the parent's Save button stays
257
+ // disabled even when a valid chip already exists — the uncommitted token
258
+ // is invalid and must be corrected or cleared before submitting.
259
+ this.emitInvalidState(true);
260
+ return;
261
+ }
262
+ // Avoid duplicates (case-insensitive by name).
263
+ const exists = this._selectedOptions.some((option) => option.name?.toLowerCase() === value.toLowerCase());
264
+ if (!exists) {
265
+ this._selectedOptions = [
266
+ ...this._selectedOptions,
267
+ { id: '', name: value },
268
+ ];
269
+ this.emitSelection();
270
+ }
271
+ // Token committed successfully — input is cleared, so the field is valid.
272
+ this.clearSearchText();
273
+ }
274
+ /**
275
+ * Validates a free-text organization value against the shared min/max/pattern
276
+ * rules. Returns an error message when invalid, otherwise an empty string.
277
+ * @param {string} value -the typed value.
278
+ * @return {string}
279
+ * @memberof OrgMultiSelectComponent
280
+ */
281
+ validateFreeText(value) {
282
+ const messages = this.addUserRosterTexts?.message?.error;
283
+ if (value.length < GroupsValidationPatterns.representingOrgNameMinLength) {
284
+ return messages?.limit?.representingOrganizationMinChars ?? '';
285
+ }
286
+ if (value.length > GroupsValidationPatterns.representingOrgNameMaxLength) {
287
+ return messages?.limit?.representingOrganizationMaxChars ?? '';
288
+ }
289
+ if (!GroupsValidationPatterns.representingOrganization.test(value)) {
290
+ return messages?.pattern?.representingOrganization ?? '';
291
+ }
292
+ return '';
293
+ }
294
+ /**
295
+ * Toggles selection of a result option. Keeps the dropdown open and the typed
296
+ * text intact so the user can keep selecting.
297
+ * @param {SelectOption} option -the clicked result option.
298
+ * @memberof OrgMultiSelectComponent
299
+ */
300
+ toggleOption(option) {
301
+ const index = this._selectedOptions.findIndex((item) => item.id === option.id && item.name === option.name);
302
+ if (index >= 0) {
303
+ this._selectedOptions = this._selectedOptions.filter((_, i) => i !== index);
304
+ }
305
+ else {
306
+ this._selectedOptions = [...this._selectedOptions, option];
307
+ }
308
+ this.emitSelection();
309
+ // Keep focus in the input so the user can continue typing/selecting.
310
+ this.searchInput?.nativeElement?.focus();
311
+ }
312
+ /**
313
+ * Whether an option is currently selected (drives the checkbox checked state).
314
+ * @param {SelectOption} option -option to test.
315
+ * @return {boolean}
316
+ * @memberof OrgMultiSelectComponent
317
+ */
318
+ isSelected(option) {
319
+ return this._selectedOptions.some((item) => item.id === option.id && item.name === option.name);
320
+ }
321
+ /**
322
+ * Removes a selected chip.
323
+ * @param {SelectOption} option -the option to remove.
324
+ * @memberof OrgMultiSelectComponent
325
+ */
326
+ removeOption(option) {
327
+ this._selectedOptions = this._selectedOptions.filter((item) => !(item.id === option.id && item.name === option.name));
328
+ this.emitSelection();
329
+ }
330
+ /**
331
+ * Clears all selected chips.
332
+ * @memberof OrgMultiSelectComponent
333
+ */
334
+ clearAll() {
335
+ this._selectedOptions = [];
336
+ this.options = [];
337
+ this.isDropdownOpen = false;
338
+ this.emitSelection();
339
+ }
340
+ /**
341
+ * Clears the leftover typed text on blur (old behavior) and closes the
342
+ * dropdown. Deferred so a click on a dropdown option (which also blurs the
343
+ * input) is handled first.
344
+ * @memberof OrgMultiSelectComponent
345
+ */
346
+ onBlur() {
347
+ this.isTouched = true;
348
+ this.blurTimer?.unsubscribe();
349
+ this.blurTimer = timer(150).subscribe(() => {
350
+ // If focus moved into the dropdown (option click), the click handler
351
+ // re-focuses the input, so document.activeElement is the input again.
352
+ const active = document.activeElement;
353
+ if (active === this.searchInput?.nativeElement) {
354
+ return;
355
+ }
356
+ this.clearSearchText();
357
+ this.isDropdownOpen = false;
358
+ this.fieldBlur.emit();
359
+ });
360
+ }
361
+ /**
362
+ * Whether the required error should show (touched, no selection).
363
+ * @return {boolean}
364
+ * @memberof OrgMultiSelectComponent
365
+ */
366
+ get showRequiredError() {
367
+ return (this.required && this.isTouched && this._selectedOptions.length === 0);
368
+ }
369
+ /**
370
+ * Clears the typed search text and hides the results.
371
+ * @memberof OrgMultiSelectComponent
372
+ */
373
+ clearSearchText() {
374
+ // Cancel any pending debounced search so a blur/clear before the timer
375
+ // expires does not emit the now-cleared query to the parent.
376
+ this.searchDebounce?.unsubscribe();
377
+ this.searchDebounce = undefined;
378
+ this.searchText = '';
379
+ if (this.searchInput?.nativeElement) {
380
+ this.searchInput.nativeElement.value = '';
381
+ }
382
+ this.options = [];
383
+ this.errorMessage = '';
384
+ // No leftover text — the field is no longer holding an invalid token.
385
+ this.emitInvalidState(false);
386
+ }
387
+ /**
388
+ * Emits the current selection to the parent.
389
+ * @memberof OrgMultiSelectComponent
390
+ */
391
+ emitSelection() {
392
+ this.selectionChange.emit(this._selectedOptions.map((option) => ({
393
+ id: option.id,
394
+ name: option.name,
395
+ })));
396
+ }
397
+ /**
398
+ * TrackBy for both result and chip lists.
399
+ * @param {number} index -list index.
400
+ * @param {SelectOption} option -the option.
401
+ * @return {(string | number)}
402
+ * @memberof OrgMultiSelectComponent
403
+ */
404
+ trackByFn(index, option) {
405
+ return `${option.id}-${option.name}`;
406
+ }
407
+ ngOnDestroy() {
408
+ this.searchDebounce?.unsubscribe();
409
+ this.blurTimer?.unsubscribe();
410
+ this.destroy$.next(true);
411
+ this.destroy$.complete();
412
+ }
413
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: OrgMultiSelectComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
414
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: OrgMultiSelectComponent, isStandalone: true, selector: "ieeesa-org-multi-select", inputs: { label: "label", placeholder: "placeholder", supportMessage: "supportMessage", ariaLabel: "ariaLabel", options: "options", selectedOptions: "selectedOptions", required: "required", removeIconURL: "removeIconURL", clearAllIconURL: "clearAllIconURL" }, outputs: { search: "search", selectionChange: "selectionChange", fieldBlur: "fieldBlur", invalidFreeText: "invalidFreeText" }, viewQueries: [{ propertyName: "searchInput", first: true, predicate: ["searchInput"], descendants: true }], ngImport: i0, template: "<div\r\n class=\"ieeesa-org-multi-select\"\r\n [class.ieeesa-org-multi-select--invalid]=\"showRequiredError || errorMessage\"\r\n>\r\n <label class=\"ieeesa-org-multi-select__label ieeesa-body-sm-14\">\r\n {{ label }}\r\n </label>\r\n\r\n <div class=\"ieeesa-org-multi-select__field\">\r\n <!--\r\n Chips and the search input flow together inline (like the Material\r\n chip-grid). This keeps a single-row field appearance that grows as chips\r\n wrap, with the clear-all button pinned to the right as a suffix.\r\n -->\r\n <div class=\"ieeesa-org-multi-select__control\">\r\n <span\r\n class=\"ieeesa-org-multi-select__chip\"\r\n *ngFor=\"let option of selectedOptions; trackBy: trackByFn\"\r\n [attr.aria-label]=\"option.name\"\r\n >\r\n <span class=\"ieeesa-org-multi-select__chip-label\">\r\n {{ option.name }}\r\n </span>\r\n <button\r\n type=\"button\"\r\n class=\"ieeesa-org-multi-select__chip-remove\"\r\n [attr.aria-label]=\"'Remove ' + option.name\"\r\n (click)=\"removeOption(option)\"\r\n >\r\n <svg\r\n class=\"ieeesa-org-multi-select__chip-remove-icon\"\r\n *ngIf=\"removeIconURL\"\r\n >\r\n <use [attr.xlink:href]=\"removeIconURL\"></use>\r\n </svg>\r\n <span *ngIf=\"!removeIconURL\" aria-hidden=\"true\">&times;</span>\r\n </button>\r\n </span>\r\n\r\n <input\r\n #searchInput\r\n type=\"text\"\r\n class=\"ieeesa-org-multi-select__input ieeesa-title-sm-16\"\r\n role=\"combobox\"\r\n aria-haspopup=\"listbox\"\r\n [attr.aria-expanded]=\"isDropdownOpen\"\r\n [attr.aria-controls]=\"optionIdPrefix + 'listbox'\"\r\n [attr.aria-activedescendant]=\"\r\n isDropdownOpen && activeOptionIndex >= 0\r\n ? optionIdPrefix + activeOptionIndex\r\n : null\r\n \"\r\n [attr.aria-label]=\"ariaLabel\"\r\n [placeholder]=\"placeholder\"\r\n [value]=\"searchText\"\r\n (input)=\"onInput($event)\"\r\n (focus)=\"onFocus()\"\r\n (keydown)=\"onKeydown($event)\"\r\n (blur)=\"onBlur()\"\r\n />\r\n </div>\r\n\r\n <button\r\n type=\"button\"\r\n class=\"ieeesa-org-multi-select__clear-all\"\r\n [matTooltip]=\"'Clear all'\"\r\n aria-label=\"Clear all\"\r\n *ngIf=\"selectedOptions.length\"\r\n (click)=\"clearAll()\"\r\n >\r\n <svg\r\n class=\"ieeesa-org-multi-select__clear-all-icon\"\r\n *ngIf=\"clearAllIconURL\"\r\n >\r\n <use [attr.xlink:href]=\"clearAllIconURL\"></use>\r\n </svg>\r\n <span *ngIf=\"!clearAllIconURL\" aria-hidden=\"true\">&times;</span>\r\n </button>\r\n\r\n <!--\r\n Custom results dropdown. Fully owned (not mat-autocomplete) so a pick never\r\n closes the panel or overwrites the typed text. mousedown is prevented so\r\n clicking a row does not blur the input before the click registers.\r\n -->\r\n <div\r\n class=\"ieeesa-org-multi-select__dropdown\"\r\n role=\"listbox\"\r\n [id]=\"optionIdPrefix + 'listbox'\"\r\n aria-multiselectable=\"true\"\r\n *ngIf=\"isDropdownOpen && options.length\"\r\n (mousedown)=\"$event.preventDefault()\"\r\n >\r\n <div\r\n class=\"ieeesa-org-multi-select__option\"\r\n role=\"option\"\r\n *ngFor=\"let option of options; let i = index; trackBy: trackByFn\"\r\n [id]=\"optionIdPrefix + i\"\r\n [attr.aria-selected]=\"isSelected(option)\"\r\n [class.ieeesa-org-multi-select__option--selected]=\"isSelected(option)\"\r\n [class.ieeesa-org-multi-select__option--active]=\"isActiveOption(i)\"\r\n (click)=\"toggleOption(option)\"\r\n (mouseenter)=\"activeOptionIndex = i\"\r\n >\r\n <mat-checkbox\r\n color=\"primary\"\r\n [checked]=\"isSelected(option)\"\r\n (click)=\"$event.preventDefault()\"\r\n ></mat-checkbox>\r\n <span\r\n class=\"ieeesa-org-multi-select__option-label ieeesa-title-sm-16\"\r\n >\r\n {{ option.name }}\r\n </span>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- Inline free-text validation error (Enter path) -->\r\n <p\r\n class=\"ieeesa-org-multi-select__error ieeesa-body-sm-14\"\r\n *ngIf=\"errorMessage\"\r\n >\r\n {{ errorMessage }}\r\n </p>\r\n\r\n <!-- Required error (touched, nothing selected) -->\r\n <p\r\n class=\"ieeesa-org-multi-select__error ieeesa-body-sm-14\"\r\n *ngIf=\"showRequiredError && !errorMessage\"\r\n >\r\n {{ addUserRosterTexts?.message?.error?.required }}\r\n </p>\r\n\r\n <!-- Support/help text -->\r\n <p\r\n class=\"ieeesa-org-multi-select__support ieeesa-body-sm-14\"\r\n *ngIf=\"supportMessage && !errorMessage && !showRequiredError\"\r\n >\r\n {{ supportMessage }}\r\n </p>\r\n</div>\r\n", styles: [".ieeesa-subtitle{text-align:left;font-family:Calibri Regular;font-size:1.5625rem;letter-spacing:0;color:#000;opacity:1}.ieeesa-body{text-align:left;font-family:Calibri Regular;font-size:1.25rem;letter-spacing:0;color:#000;opacity:1}.ieeesa-display-lg-57{font-family:Calibri Regular;font-style:normal;font-weight:400;font-size:3.5625rem;line-height:64px;color:#000;letter-spacing:0}.ieeesa-display-md-45{font-family:Calibri Regular;font-style:normal;font-weight:400;font-size:2.813rem;line-height:52px;color:#000;letter-spacing:0}.ieeesa-display-md-47{font-family:Calibri Regular;font-style:normal;font-weight:400;font-size:2.9375rem;line-height:52px;color:#000;letter-spacing:0}.ieeesa-display-sm-38{font-family:Calibri Regular;font-style:normal;font-weight:400;font-size:2.375rem;line-height:44px;color:#000;letter-spacing:0}.ieeesa-headline-lg-32{font-family:Calibri Regular;font-style:normal;font-weight:400;font-size:2rem;line-height:40px;color:#000;letter-spacing:0}.ieeesa-headline-lg-34{font-family:Calibri Regular;font-style:normal;font-weight:400;font-size:2.125rem;line-height:40px;color:#000;letter-spacing:0}.ieeesa-headline-md-30{font-family:Calibri Regular;font-style:normal;font-weight:400;font-size:1.875rem;line-height:36px;color:#000;letter-spacing:0}.ieeesa-headline-sm-24{font-family:Calibri Regular;font-style:normal;font-weight:400;font-size:1.5rem;line-height:32px;color:#00629b;letter-spacing:0}.ieeesa-headline-sm-26{font-family:Calibri Regular;font-style:normal;font-weight:400;font-size:1.625rem;line-height:32px;color:#000;letter-spacing:0}.ieeesa-title-lg-bold-24{font-family:Calibri Bold;font-style:normal;font-weight:700;font-size:1.5rem;line-height:28px;color:#000;letter-spacing:0}.ieeesa-title-lg-24{font-family:Calibri Regular;font-style:normal;font-weight:400;font-size:1.5rem;line-height:28px;color:#000;letter-spacing:0}.ieeesa-title-md-18{font-family:Calibri Regular;font-style:normal;font-weight:400;font-size:1.125rem;line-height:24px;color:#000;letter-spacing:.009375em}.ieeesa-title-sm-14{font-family:Calibri Regular;font-style:normal;font-weight:400;font-size:.875rem;line-height:20px;color:#000;letter-spacing:.00625em}.ieeesa-title-sm-16{font-family:Calibri Regular;font-style:normal;font-weight:400;font-size:1rem;line-height:20px;color:#000;letter-spacing:.00625em}.ieeesa-label-lg-bold-16{font-family:Calibri Bold;font-style:normal;font-weight:700;font-size:1rem;line-height:20px;color:#000;letter-spacing:.00625em}.ieeesa-label-lg-16{font-family:Calibri Regular;font-style:normal;font-weight:400;font-size:1rem;line-height:20px;color:#000;letter-spacing:.00625em}.ieeesa-btn-label-lg-bold-16{font-family:Calibri Regular;font-style:normal;font-weight:700;font-size:1rem;line-height:20px;color:#00629b;letter-spacing:.00625em}.ieeesa-label-md-14{font-family:Calibri Regular;font-style:normal;font-weight:400;font-size:.875rem;line-height:16px;color:#000;letter-spacing:.03125em}.ieeesa-label-sm-13{font-family:Calibri Regular;font-style:normal;font-weight:400;font-size:.8125rem;line-height:16px;color:#000;letter-spacing:.03125em}.ieeesa-body-lg-bold-16{font-family:Calibri Bold;font-style:normal;font-weight:700;font-size:1rem;line-height:24px;color:#000;letter-spacing:.03125em}.ieeesa-body-lg-bold-18{font-family:Calibri Bold;font-style:normal;font-weight:700;font-size:1.125rem;line-height:24px;color:#000;letter-spacing:.03125em}.ieeesa-body-lg-18{font-family:Calibri Regular;font-style:normal;font-weight:400;font-size:1.125rem;line-height:24px;color:#000;letter-spacing:.03125em}.ieeesa-body-md-14{font-family:Calibri Regular;font-style:normal;font-weight:400;font-size:.875rem;line-height:20px;color:#1c1b1f;letter-spacing:.015625em}.ieeesa-body-md-16{font-family:Calibri Regular;font-style:normal;font-weight:400;font-size:1rem;line-height:20px;color:#000;letter-spacing:.015625em}.ieeesa-body-sm-14{font-family:Calibri Regular;font-style:normal;font-weight:400;font-size:.875rem;line-height:16px;color:#000;letter-spacing:.025em}.ieeesa-body-sm-12{font-family:Calibri Regular;font-style:normal;font-weight:400;font-size:.75rem;line-height:16px;color:#000;letter-spacing:.025em}.ieeesa-body-color-sm-14{font-family:Calibri Regular;font-style:normal;font-weight:400;font-size:.875rem;line-height:18px;color:#49454f;letter-spacing:.025em}.ieeesa-body-sm-bold-14{font-family:Calibri Bold;font-style:normal;font-weight:700;font-size:.875rem;line-height:16px;color:#000;letter-spacing:.025em}.ieeesa-title-inter-lg-bold-24{font-family:Inter Bold;font-style:normal;font-weight:700;font-size:1.5rem;line-height:29px;color:#000;letter-spacing:0}.mat-mdc-button.mat-mdc-button-base.mat-primary-button,.mat-mdc-button.mat-mdc-button-base.mat-secondary-button,.mat-mdc-button.mat-mdc-button-base.mat-tertiary-button,.mat-mdc-button.mat-mdc-button-base.mat-text-button{min-width:103px;width:auto;min-height:40px;height:auto;border-radius:3px;text-align:center;padding:.625em 1.5em;border:none;font-family:Calibri Bold;font-style:normal;font-weight:700;font-size:1rem;line-height:20px;color:#000;letter-spacing:.00625em}.mat-mdc-button.mat-mdc-button-base>.mat-icon{margin-right:11px}.mat-mdc-button.mat-mdc-button-base.mat-primary-button{background-color:#00629b;color:#fff}.mat-mdc-button.mat-mdc-button-base.mat-primary-button:focus{background:#1f75a7}.mat-mdc-button.mat-mdc-button-base.mat-primary-button:hover{background-color:#003e65}.mat-mdc-button.mat-mdc-button-base.mat-primary-button:active{background-color:#00629b}.mat-mdc-button.mat-mdc-button-base.mat-primary-button:disabled{background-color:#1c1b1f1f}.mat-mdc-button.mat-mdc-button-base.mat-secondary-button{color:#fff;background:#a7a8aa;box-shadow:0 1px 2px #0000004d,0 2px 6px 2px #00000026}.mat-mdc-button.mat-mdc-button-base.mat-secondary-button:hover{background:#a7a8aa}.mat-mdc-button.mat-mdc-button-base.mat-secondary-button:focus{background:#f0f5f9}.mat-mdc-button.mat-mdc-button-base.mat-secondary-button:active{background:#1d192b1f}.mat-mdc-button.mat-mdc-button-base.mat-secondary-button:disabled{background:#1c1b1f1f;color:#1c1b1f;opacity:.38}.mat-mdc-button.mat-mdc-button-base.mat-tertiary-button{background-color:#fff;border:1px solid #00629b;color:#00629b}.mat-mdc-button.mat-mdc-button-base.mat-tertiary-button:hover{background-color:#6750a414}.mat-mdc-button.mat-mdc-button-base.mat-tertiary-button:focus{background-color:#f0f5f9}.mat-mdc-button.mat-mdc-button-base.mat-tertiary-button:active{background:#6750a41f}.mat-mdc-button.mat-mdc-button-base.mat-tertiary-button:disabled{border:1px solid rgba(28,27,31,.12);color:#1c1b1f;opacity:.38}.mat-mdc-button.mat-mdc-button-base.mat-text-button{color:#00629b}.mat-mdc-button.mat-mdc-button-base.mat-text-button:hover,.mat-mdc-button.mat-mdc-button-base.mat-text-button:active{background:#6750a414}.mat-mdc-button.mat-mdc-button-base.mat-text-button:disabled{color:#1c1b1f;opacity:.38}.ieeesa-text-button{color:#cac4d0;background:none;border:none}.ieeesa-view-more-or-less-button{border:none;background:none;text-decoration:underline;color:#00629b}.flex-align-center{display:flex;align-items:center;justify-content:center}.mat-button-toggle-checked{background-color:#a7a8aa}.mat-button-toggle-checked .mat-button-toggle-label-content:before{font-family:\"Font Awesome 5 Free\";font-weight:900;content:\"\\f00c\";padding-right:.5625em}.mat-button-toggle-group .mat-button-toggle-label-content{font-family:Calibri Bold;font-style:normal;font-weight:700;font-size:1rem;line-height:20px;color:#1c1b1f;letter-spacing:.00625em}.no-bg-color-btn{color:#00629b;border-radius:3px;border:1px solid #00629b;min-height:40px;height:auto}@media (max-width: 768px){.mat-button-toggle-group .mat-button-toggle-label-content{max-width:8ch;text-overflow:ellipsis;white-space:nowrap;overflow:hidden;position:relative}}.cdk-overlay-pane .mat-mdc-tooltip .mdc-tooltip__surface{color:#525252;padding:6px 12px;font-family:Calibri Regular;font-size:1rem;border:1px solid #cac4d0;background:#fff;box-shadow:0 4px 8px #00000040;max-width:unset!important}.cdk-overlay-pane .mat-mdc-option .mdc-list-item__primary-text{font-family:Calibri Regular!important}.cdk-overlay-pane.ieeesa-modal-confirm-dialog,.cdk-overlay-pane.ieeesa-modal-dialog,.cdk-overlay-pane.ieeesa-alert-dialog{width:100%;min-width:312px}.mat-mdc-form-field{font-family:Calibri Regular;font-style:normal;font-weight:400;font-size:1rem;line-height:24px;color:#49454f;letter-spacing:.03125em}.ieeesa-cancel-modal-confirm-dialog{width:25vw!important}.ieeesa-cancel-modal-confirm-dialog .ieeesa-confirmation{padding:1.5em 1.5em 1em}.ieeesa-cancel-modal-confirm-dialog .ieeesa-confirmation .mat-mdc-dialog-content{text-align:center;padding:0 0 1em!important}.mat-mdc-button,.mat-mdc-outlined-button{--mat-mdc-button-persistent-ripple-color: unset}@media (max-width: 768px){.ieeesa-cancel-modal-confirm-dialog{width:90vw!important}}.ieeesa-wrapper-border{border:1px solid #b2b7be;border-top:none;padding:1.5em;border-radius:0 0 4px 4px}.ieeesa-org-multi-select{display:block;width:100%;position:relative;font-family:Calibri Regular}.ieeesa-org-multi-select__label,.ieeesa-org-multi-select__label.ieeesa-body-sm-14{display:block;margin-bottom:4px;color:#49454f;font-family:Calibri Regular;font-size:.75rem}.ieeesa-org-multi-select__field{display:flex;align-items:center;gap:8px;position:relative;background:#fff;border:1px solid #878b8f;border-radius:4px;padding:8px 12px;min-height:48px;transition:border-color .15s ease}.ieeesa-org-multi-select__field:focus-within{border:2px solid #00629b;padding:7px 11px}.ieeesa-org-multi-select__control{flex:1 1 auto;display:flex;flex-wrap:wrap;align-items:center;gap:6px;min-width:0}.ieeesa-org-multi-select__chip{display:inline-flex;align-items:center;max-width:100%;padding:4px 8px;border:1px solid #79747e;border-radius:.25em;background-color:linear-gradient(0deg,rgba(0,98,155,.05) 0%,rgba(0,98,155,.05) 100%),#fffbfe}.ieeesa-org-multi-select__chip-label{max-width:200px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;color:#49454f;font-family:Calibri Regular;font-size:1rem}.ieeesa-org-multi-select__chip-remove{display:inline-flex;align-items:center;justify-content:center;border:none;background:transparent;cursor:pointer;padding:0;margin-left:6px;color:#878b8f;font-size:16px;line-height:1}.ieeesa-org-multi-select__chip-remove-icon{height:18px;width:18px;fill:currentColor}.ieeesa-org-multi-select__input,.ieeesa-org-multi-select__input.ieeesa-title-sm-16{flex:1 1 120px;border:none;outline:none;background:transparent;min-width:120px;padding:4px 0;color:#1c1b1f;font-family:Calibri Regular;font-size:1rem}.ieeesa-org-multi-select__input::placeholder,.ieeesa-org-multi-select__input.ieeesa-title-sm-16::placeholder{color:#63666a;font-family:Calibri Regular;font-size:1rem}.ieeesa-org-multi-select__clear-all{flex:0 0 auto;display:inline-flex;align-items:center;justify-content:center;border:none;background:transparent;cursor:pointer;padding:0;color:#878b8f}.ieeesa-org-multi-select__clear-all-icon{height:24px;width:24px;fill:currentColor}.ieeesa-org-multi-select__dropdown{position:absolute;left:0;right:0;top:calc(100% + 2px);z-index:1000;max-height:240px;overflow-y:auto;background:#fff;border:1px solid #878b8f;border-radius:4px;box-shadow:0 4px 12px #0000001f}.ieeesa-org-multi-select__option{display:flex;align-items:center;gap:8px;padding:10px 12px;cursor:pointer;font-family:Calibri Regular}.ieeesa-org-multi-select__option:hover,.ieeesa-org-multi-select__option--active{background:#fff}.ieeesa-org-multi-select__option--selected .ieeesa-org-multi-select__option-label{color:#00629b}.ieeesa-org-multi-select__option-label,.ieeesa-org-multi-select__option-label.ieeesa-title-sm-16{flex:1 1 auto;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;color:#000;font-family:Calibri Regular;font-size:1rem}.ieeesa-org-multi-select__error,.ieeesa-org-multi-select__error.ieeesa-body-sm-14{margin:4px 0 0;color:#ba0c2f;font-family:Calibri Regular;font-size:.75rem}.ieeesa-org-multi-select__support,.ieeesa-org-multi-select__support.ieeesa-body-sm-14{margin:4px 0 0;color:#49454f;font-family:Calibri Regular;font-size:.75rem}.ieeesa-org-multi-select--invalid .ieeesa-org-multi-select__label{color:#ba0c2f}.ieeesa-org-multi-select--invalid .ieeesa-org-multi-select__field{border:2px solid #ba0c2f;padding:7px 11px}.ieeesa-org-multi-select .mdc-checkbox .mdc-checkbox__native-control:enabled:checked~.mdc-checkbox__background{background-color:#00629b;border-color:#00629b}@media (max-width: 767px){.ieeesa-org-multi-select__chip-label{max-width:120px}}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "ngmodule", type: MatButtonModule }, { kind: "ngmodule", type: MatCheckboxModule }, { kind: "component", type: i2.MatCheckbox, selector: "mat-checkbox", inputs: ["disableRipple", "color", "tabIndex"], exportAs: ["matCheckbox"] }, { kind: "ngmodule", type: MatIconModule }, { kind: "ngmodule", type: MatTooltipModule }, { kind: "directive", type: i3.MatTooltip, selector: "[matTooltip]", exportAs: ["matTooltip"] }], encapsulation: i0.ViewEncapsulation.None }); }
415
+ }
416
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: OrgMultiSelectComponent, decorators: [{
417
+ type: Component,
418
+ args: [{ selector: 'ieeesa-org-multi-select', standalone: true, imports: [
419
+ CommonModule,
420
+ MatButtonModule,
421
+ MatCheckboxModule,
422
+ MatIconModule,
423
+ MatTooltipModule,
424
+ ], encapsulation: ViewEncapsulation.None, template: "<div\r\n class=\"ieeesa-org-multi-select\"\r\n [class.ieeesa-org-multi-select--invalid]=\"showRequiredError || errorMessage\"\r\n>\r\n <label class=\"ieeesa-org-multi-select__label ieeesa-body-sm-14\">\r\n {{ label }}\r\n </label>\r\n\r\n <div class=\"ieeesa-org-multi-select__field\">\r\n <!--\r\n Chips and the search input flow together inline (like the Material\r\n chip-grid). This keeps a single-row field appearance that grows as chips\r\n wrap, with the clear-all button pinned to the right as a suffix.\r\n -->\r\n <div class=\"ieeesa-org-multi-select__control\">\r\n <span\r\n class=\"ieeesa-org-multi-select__chip\"\r\n *ngFor=\"let option of selectedOptions; trackBy: trackByFn\"\r\n [attr.aria-label]=\"option.name\"\r\n >\r\n <span class=\"ieeesa-org-multi-select__chip-label\">\r\n {{ option.name }}\r\n </span>\r\n <button\r\n type=\"button\"\r\n class=\"ieeesa-org-multi-select__chip-remove\"\r\n [attr.aria-label]=\"'Remove ' + option.name\"\r\n (click)=\"removeOption(option)\"\r\n >\r\n <svg\r\n class=\"ieeesa-org-multi-select__chip-remove-icon\"\r\n *ngIf=\"removeIconURL\"\r\n >\r\n <use [attr.xlink:href]=\"removeIconURL\"></use>\r\n </svg>\r\n <span *ngIf=\"!removeIconURL\" aria-hidden=\"true\">&times;</span>\r\n </button>\r\n </span>\r\n\r\n <input\r\n #searchInput\r\n type=\"text\"\r\n class=\"ieeesa-org-multi-select__input ieeesa-title-sm-16\"\r\n role=\"combobox\"\r\n aria-haspopup=\"listbox\"\r\n [attr.aria-expanded]=\"isDropdownOpen\"\r\n [attr.aria-controls]=\"optionIdPrefix + 'listbox'\"\r\n [attr.aria-activedescendant]=\"\r\n isDropdownOpen && activeOptionIndex >= 0\r\n ? optionIdPrefix + activeOptionIndex\r\n : null\r\n \"\r\n [attr.aria-label]=\"ariaLabel\"\r\n [placeholder]=\"placeholder\"\r\n [value]=\"searchText\"\r\n (input)=\"onInput($event)\"\r\n (focus)=\"onFocus()\"\r\n (keydown)=\"onKeydown($event)\"\r\n (blur)=\"onBlur()\"\r\n />\r\n </div>\r\n\r\n <button\r\n type=\"button\"\r\n class=\"ieeesa-org-multi-select__clear-all\"\r\n [matTooltip]=\"'Clear all'\"\r\n aria-label=\"Clear all\"\r\n *ngIf=\"selectedOptions.length\"\r\n (click)=\"clearAll()\"\r\n >\r\n <svg\r\n class=\"ieeesa-org-multi-select__clear-all-icon\"\r\n *ngIf=\"clearAllIconURL\"\r\n >\r\n <use [attr.xlink:href]=\"clearAllIconURL\"></use>\r\n </svg>\r\n <span *ngIf=\"!clearAllIconURL\" aria-hidden=\"true\">&times;</span>\r\n </button>\r\n\r\n <!--\r\n Custom results dropdown. Fully owned (not mat-autocomplete) so a pick never\r\n closes the panel or overwrites the typed text. mousedown is prevented so\r\n clicking a row does not blur the input before the click registers.\r\n -->\r\n <div\r\n class=\"ieeesa-org-multi-select__dropdown\"\r\n role=\"listbox\"\r\n [id]=\"optionIdPrefix + 'listbox'\"\r\n aria-multiselectable=\"true\"\r\n *ngIf=\"isDropdownOpen && options.length\"\r\n (mousedown)=\"$event.preventDefault()\"\r\n >\r\n <div\r\n class=\"ieeesa-org-multi-select__option\"\r\n role=\"option\"\r\n *ngFor=\"let option of options; let i = index; trackBy: trackByFn\"\r\n [id]=\"optionIdPrefix + i\"\r\n [attr.aria-selected]=\"isSelected(option)\"\r\n [class.ieeesa-org-multi-select__option--selected]=\"isSelected(option)\"\r\n [class.ieeesa-org-multi-select__option--active]=\"isActiveOption(i)\"\r\n (click)=\"toggleOption(option)\"\r\n (mouseenter)=\"activeOptionIndex = i\"\r\n >\r\n <mat-checkbox\r\n color=\"primary\"\r\n [checked]=\"isSelected(option)\"\r\n (click)=\"$event.preventDefault()\"\r\n ></mat-checkbox>\r\n <span\r\n class=\"ieeesa-org-multi-select__option-label ieeesa-title-sm-16\"\r\n >\r\n {{ option.name }}\r\n </span>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- Inline free-text validation error (Enter path) -->\r\n <p\r\n class=\"ieeesa-org-multi-select__error ieeesa-body-sm-14\"\r\n *ngIf=\"errorMessage\"\r\n >\r\n {{ errorMessage }}\r\n </p>\r\n\r\n <!-- Required error (touched, nothing selected) -->\r\n <p\r\n class=\"ieeesa-org-multi-select__error ieeesa-body-sm-14\"\r\n *ngIf=\"showRequiredError && !errorMessage\"\r\n >\r\n {{ addUserRosterTexts?.message?.error?.required }}\r\n </p>\r\n\r\n <!-- Support/help text -->\r\n <p\r\n class=\"ieeesa-org-multi-select__support ieeesa-body-sm-14\"\r\n *ngIf=\"supportMessage && !errorMessage && !showRequiredError\"\r\n >\r\n {{ supportMessage }}\r\n </p>\r\n</div>\r\n", styles: [".ieeesa-subtitle{text-align:left;font-family:Calibri Regular;font-size:1.5625rem;letter-spacing:0;color:#000;opacity:1}.ieeesa-body{text-align:left;font-family:Calibri Regular;font-size:1.25rem;letter-spacing:0;color:#000;opacity:1}.ieeesa-display-lg-57{font-family:Calibri Regular;font-style:normal;font-weight:400;font-size:3.5625rem;line-height:64px;color:#000;letter-spacing:0}.ieeesa-display-md-45{font-family:Calibri Regular;font-style:normal;font-weight:400;font-size:2.813rem;line-height:52px;color:#000;letter-spacing:0}.ieeesa-display-md-47{font-family:Calibri Regular;font-style:normal;font-weight:400;font-size:2.9375rem;line-height:52px;color:#000;letter-spacing:0}.ieeesa-display-sm-38{font-family:Calibri Regular;font-style:normal;font-weight:400;font-size:2.375rem;line-height:44px;color:#000;letter-spacing:0}.ieeesa-headline-lg-32{font-family:Calibri Regular;font-style:normal;font-weight:400;font-size:2rem;line-height:40px;color:#000;letter-spacing:0}.ieeesa-headline-lg-34{font-family:Calibri Regular;font-style:normal;font-weight:400;font-size:2.125rem;line-height:40px;color:#000;letter-spacing:0}.ieeesa-headline-md-30{font-family:Calibri Regular;font-style:normal;font-weight:400;font-size:1.875rem;line-height:36px;color:#000;letter-spacing:0}.ieeesa-headline-sm-24{font-family:Calibri Regular;font-style:normal;font-weight:400;font-size:1.5rem;line-height:32px;color:#00629b;letter-spacing:0}.ieeesa-headline-sm-26{font-family:Calibri Regular;font-style:normal;font-weight:400;font-size:1.625rem;line-height:32px;color:#000;letter-spacing:0}.ieeesa-title-lg-bold-24{font-family:Calibri Bold;font-style:normal;font-weight:700;font-size:1.5rem;line-height:28px;color:#000;letter-spacing:0}.ieeesa-title-lg-24{font-family:Calibri Regular;font-style:normal;font-weight:400;font-size:1.5rem;line-height:28px;color:#000;letter-spacing:0}.ieeesa-title-md-18{font-family:Calibri Regular;font-style:normal;font-weight:400;font-size:1.125rem;line-height:24px;color:#000;letter-spacing:.009375em}.ieeesa-title-sm-14{font-family:Calibri Regular;font-style:normal;font-weight:400;font-size:.875rem;line-height:20px;color:#000;letter-spacing:.00625em}.ieeesa-title-sm-16{font-family:Calibri Regular;font-style:normal;font-weight:400;font-size:1rem;line-height:20px;color:#000;letter-spacing:.00625em}.ieeesa-label-lg-bold-16{font-family:Calibri Bold;font-style:normal;font-weight:700;font-size:1rem;line-height:20px;color:#000;letter-spacing:.00625em}.ieeesa-label-lg-16{font-family:Calibri Regular;font-style:normal;font-weight:400;font-size:1rem;line-height:20px;color:#000;letter-spacing:.00625em}.ieeesa-btn-label-lg-bold-16{font-family:Calibri Regular;font-style:normal;font-weight:700;font-size:1rem;line-height:20px;color:#00629b;letter-spacing:.00625em}.ieeesa-label-md-14{font-family:Calibri Regular;font-style:normal;font-weight:400;font-size:.875rem;line-height:16px;color:#000;letter-spacing:.03125em}.ieeesa-label-sm-13{font-family:Calibri Regular;font-style:normal;font-weight:400;font-size:.8125rem;line-height:16px;color:#000;letter-spacing:.03125em}.ieeesa-body-lg-bold-16{font-family:Calibri Bold;font-style:normal;font-weight:700;font-size:1rem;line-height:24px;color:#000;letter-spacing:.03125em}.ieeesa-body-lg-bold-18{font-family:Calibri Bold;font-style:normal;font-weight:700;font-size:1.125rem;line-height:24px;color:#000;letter-spacing:.03125em}.ieeesa-body-lg-18{font-family:Calibri Regular;font-style:normal;font-weight:400;font-size:1.125rem;line-height:24px;color:#000;letter-spacing:.03125em}.ieeesa-body-md-14{font-family:Calibri Regular;font-style:normal;font-weight:400;font-size:.875rem;line-height:20px;color:#1c1b1f;letter-spacing:.015625em}.ieeesa-body-md-16{font-family:Calibri Regular;font-style:normal;font-weight:400;font-size:1rem;line-height:20px;color:#000;letter-spacing:.015625em}.ieeesa-body-sm-14{font-family:Calibri Regular;font-style:normal;font-weight:400;font-size:.875rem;line-height:16px;color:#000;letter-spacing:.025em}.ieeesa-body-sm-12{font-family:Calibri Regular;font-style:normal;font-weight:400;font-size:.75rem;line-height:16px;color:#000;letter-spacing:.025em}.ieeesa-body-color-sm-14{font-family:Calibri Regular;font-style:normal;font-weight:400;font-size:.875rem;line-height:18px;color:#49454f;letter-spacing:.025em}.ieeesa-body-sm-bold-14{font-family:Calibri Bold;font-style:normal;font-weight:700;font-size:.875rem;line-height:16px;color:#000;letter-spacing:.025em}.ieeesa-title-inter-lg-bold-24{font-family:Inter Bold;font-style:normal;font-weight:700;font-size:1.5rem;line-height:29px;color:#000;letter-spacing:0}.mat-mdc-button.mat-mdc-button-base.mat-primary-button,.mat-mdc-button.mat-mdc-button-base.mat-secondary-button,.mat-mdc-button.mat-mdc-button-base.mat-tertiary-button,.mat-mdc-button.mat-mdc-button-base.mat-text-button{min-width:103px;width:auto;min-height:40px;height:auto;border-radius:3px;text-align:center;padding:.625em 1.5em;border:none;font-family:Calibri Bold;font-style:normal;font-weight:700;font-size:1rem;line-height:20px;color:#000;letter-spacing:.00625em}.mat-mdc-button.mat-mdc-button-base>.mat-icon{margin-right:11px}.mat-mdc-button.mat-mdc-button-base.mat-primary-button{background-color:#00629b;color:#fff}.mat-mdc-button.mat-mdc-button-base.mat-primary-button:focus{background:#1f75a7}.mat-mdc-button.mat-mdc-button-base.mat-primary-button:hover{background-color:#003e65}.mat-mdc-button.mat-mdc-button-base.mat-primary-button:active{background-color:#00629b}.mat-mdc-button.mat-mdc-button-base.mat-primary-button:disabled{background-color:#1c1b1f1f}.mat-mdc-button.mat-mdc-button-base.mat-secondary-button{color:#fff;background:#a7a8aa;box-shadow:0 1px 2px #0000004d,0 2px 6px 2px #00000026}.mat-mdc-button.mat-mdc-button-base.mat-secondary-button:hover{background:#a7a8aa}.mat-mdc-button.mat-mdc-button-base.mat-secondary-button:focus{background:#f0f5f9}.mat-mdc-button.mat-mdc-button-base.mat-secondary-button:active{background:#1d192b1f}.mat-mdc-button.mat-mdc-button-base.mat-secondary-button:disabled{background:#1c1b1f1f;color:#1c1b1f;opacity:.38}.mat-mdc-button.mat-mdc-button-base.mat-tertiary-button{background-color:#fff;border:1px solid #00629b;color:#00629b}.mat-mdc-button.mat-mdc-button-base.mat-tertiary-button:hover{background-color:#6750a414}.mat-mdc-button.mat-mdc-button-base.mat-tertiary-button:focus{background-color:#f0f5f9}.mat-mdc-button.mat-mdc-button-base.mat-tertiary-button:active{background:#6750a41f}.mat-mdc-button.mat-mdc-button-base.mat-tertiary-button:disabled{border:1px solid rgba(28,27,31,.12);color:#1c1b1f;opacity:.38}.mat-mdc-button.mat-mdc-button-base.mat-text-button{color:#00629b}.mat-mdc-button.mat-mdc-button-base.mat-text-button:hover,.mat-mdc-button.mat-mdc-button-base.mat-text-button:active{background:#6750a414}.mat-mdc-button.mat-mdc-button-base.mat-text-button:disabled{color:#1c1b1f;opacity:.38}.ieeesa-text-button{color:#cac4d0;background:none;border:none}.ieeesa-view-more-or-less-button{border:none;background:none;text-decoration:underline;color:#00629b}.flex-align-center{display:flex;align-items:center;justify-content:center}.mat-button-toggle-checked{background-color:#a7a8aa}.mat-button-toggle-checked .mat-button-toggle-label-content:before{font-family:\"Font Awesome 5 Free\";font-weight:900;content:\"\\f00c\";padding-right:.5625em}.mat-button-toggle-group .mat-button-toggle-label-content{font-family:Calibri Bold;font-style:normal;font-weight:700;font-size:1rem;line-height:20px;color:#1c1b1f;letter-spacing:.00625em}.no-bg-color-btn{color:#00629b;border-radius:3px;border:1px solid #00629b;min-height:40px;height:auto}@media (max-width: 768px){.mat-button-toggle-group .mat-button-toggle-label-content{max-width:8ch;text-overflow:ellipsis;white-space:nowrap;overflow:hidden;position:relative}}.cdk-overlay-pane .mat-mdc-tooltip .mdc-tooltip__surface{color:#525252;padding:6px 12px;font-family:Calibri Regular;font-size:1rem;border:1px solid #cac4d0;background:#fff;box-shadow:0 4px 8px #00000040;max-width:unset!important}.cdk-overlay-pane .mat-mdc-option .mdc-list-item__primary-text{font-family:Calibri Regular!important}.cdk-overlay-pane.ieeesa-modal-confirm-dialog,.cdk-overlay-pane.ieeesa-modal-dialog,.cdk-overlay-pane.ieeesa-alert-dialog{width:100%;min-width:312px}.mat-mdc-form-field{font-family:Calibri Regular;font-style:normal;font-weight:400;font-size:1rem;line-height:24px;color:#49454f;letter-spacing:.03125em}.ieeesa-cancel-modal-confirm-dialog{width:25vw!important}.ieeesa-cancel-modal-confirm-dialog .ieeesa-confirmation{padding:1.5em 1.5em 1em}.ieeesa-cancel-modal-confirm-dialog .ieeesa-confirmation .mat-mdc-dialog-content{text-align:center;padding:0 0 1em!important}.mat-mdc-button,.mat-mdc-outlined-button{--mat-mdc-button-persistent-ripple-color: unset}@media (max-width: 768px){.ieeesa-cancel-modal-confirm-dialog{width:90vw!important}}.ieeesa-wrapper-border{border:1px solid #b2b7be;border-top:none;padding:1.5em;border-radius:0 0 4px 4px}.ieeesa-org-multi-select{display:block;width:100%;position:relative;font-family:Calibri Regular}.ieeesa-org-multi-select__label,.ieeesa-org-multi-select__label.ieeesa-body-sm-14{display:block;margin-bottom:4px;color:#49454f;font-family:Calibri Regular;font-size:.75rem}.ieeesa-org-multi-select__field{display:flex;align-items:center;gap:8px;position:relative;background:#fff;border:1px solid #878b8f;border-radius:4px;padding:8px 12px;min-height:48px;transition:border-color .15s ease}.ieeesa-org-multi-select__field:focus-within{border:2px solid #00629b;padding:7px 11px}.ieeesa-org-multi-select__control{flex:1 1 auto;display:flex;flex-wrap:wrap;align-items:center;gap:6px;min-width:0}.ieeesa-org-multi-select__chip{display:inline-flex;align-items:center;max-width:100%;padding:4px 8px;border:1px solid #79747e;border-radius:.25em;background-color:linear-gradient(0deg,rgba(0,98,155,.05) 0%,rgba(0,98,155,.05) 100%),#fffbfe}.ieeesa-org-multi-select__chip-label{max-width:200px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;color:#49454f;font-family:Calibri Regular;font-size:1rem}.ieeesa-org-multi-select__chip-remove{display:inline-flex;align-items:center;justify-content:center;border:none;background:transparent;cursor:pointer;padding:0;margin-left:6px;color:#878b8f;font-size:16px;line-height:1}.ieeesa-org-multi-select__chip-remove-icon{height:18px;width:18px;fill:currentColor}.ieeesa-org-multi-select__input,.ieeesa-org-multi-select__input.ieeesa-title-sm-16{flex:1 1 120px;border:none;outline:none;background:transparent;min-width:120px;padding:4px 0;color:#1c1b1f;font-family:Calibri Regular;font-size:1rem}.ieeesa-org-multi-select__input::placeholder,.ieeesa-org-multi-select__input.ieeesa-title-sm-16::placeholder{color:#63666a;font-family:Calibri Regular;font-size:1rem}.ieeesa-org-multi-select__clear-all{flex:0 0 auto;display:inline-flex;align-items:center;justify-content:center;border:none;background:transparent;cursor:pointer;padding:0;color:#878b8f}.ieeesa-org-multi-select__clear-all-icon{height:24px;width:24px;fill:currentColor}.ieeesa-org-multi-select__dropdown{position:absolute;left:0;right:0;top:calc(100% + 2px);z-index:1000;max-height:240px;overflow-y:auto;background:#fff;border:1px solid #878b8f;border-radius:4px;box-shadow:0 4px 12px #0000001f}.ieeesa-org-multi-select__option{display:flex;align-items:center;gap:8px;padding:10px 12px;cursor:pointer;font-family:Calibri Regular}.ieeesa-org-multi-select__option:hover,.ieeesa-org-multi-select__option--active{background:#fff}.ieeesa-org-multi-select__option--selected .ieeesa-org-multi-select__option-label{color:#00629b}.ieeesa-org-multi-select__option-label,.ieeesa-org-multi-select__option-label.ieeesa-title-sm-16{flex:1 1 auto;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;color:#000;font-family:Calibri Regular;font-size:1rem}.ieeesa-org-multi-select__error,.ieeesa-org-multi-select__error.ieeesa-body-sm-14{margin:4px 0 0;color:#ba0c2f;font-family:Calibri Regular;font-size:.75rem}.ieeesa-org-multi-select__support,.ieeesa-org-multi-select__support.ieeesa-body-sm-14{margin:4px 0 0;color:#49454f;font-family:Calibri Regular;font-size:.75rem}.ieeesa-org-multi-select--invalid .ieeesa-org-multi-select__label{color:#ba0c2f}.ieeesa-org-multi-select--invalid .ieeesa-org-multi-select__field{border:2px solid #ba0c2f;padding:7px 11px}.ieeesa-org-multi-select .mdc-checkbox .mdc-checkbox__native-control:enabled:checked~.mdc-checkbox__background{background-color:#00629b;border-color:#00629b}@media (max-width: 767px){.ieeesa-org-multi-select__chip-label{max-width:120px}}\n"] }]
425
+ }], propDecorators: { label: [{
426
+ type: Input
427
+ }], placeholder: [{
428
+ type: Input
429
+ }], supportMessage: [{
430
+ type: Input
431
+ }], ariaLabel: [{
432
+ type: Input
433
+ }], options: [{
434
+ type: Input
435
+ }], selectedOptions: [{
436
+ type: Input
437
+ }], required: [{
438
+ type: Input
439
+ }], removeIconURL: [{
440
+ type: Input
441
+ }], clearAllIconURL: [{
442
+ type: Input
443
+ }], search: [{
444
+ type: Output
445
+ }], selectionChange: [{
446
+ type: Output
447
+ }], fieldBlur: [{
448
+ type: Output
449
+ }], invalidFreeText: [{
450
+ type: Output
451
+ }], searchInput: [{
452
+ type: ViewChild,
453
+ args: ['searchInput']
454
+ }] } });
455
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib3JnLW11bHRpLXNlbGVjdC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9ncm91cHMvc3JjL2xpYi9jb21wb25lbnRzL29yZy1tdWx0aS1zZWxlY3Qvb3JnLW11bHRpLXNlbGVjdC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9ncm91cHMvc3JjL2xpYi9jb21wb25lbnRzL29yZy1tdWx0aS1zZWxlY3Qvb3JnLW11bHRpLXNlbGVjdC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0wsS0FBSyxFQUNMLFVBQVUsRUFDVixLQUFLLEVBQ0wsTUFBTSxFQUNOLFFBQVEsR0FDVCxNQUFNLHVCQUF1QixDQUFDO0FBQy9CLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMvQyxPQUFPLEVBQ0wsU0FBUyxFQUVULFlBQVksRUFDWixLQUFLLEVBR0wsTUFBTSxFQUNOLFNBQVMsRUFDVCxpQkFBaUIsR0FDbEIsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQzNELE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQy9ELE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUN2RCxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUM3RCxPQUFPLEVBQUUsT0FBTyxFQUFnQixLQUFLLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFFcEQsT0FBTyxLQUFLLFdBQVcsTUFBTSw2QkFBNkIsQ0FBQztBQUMzRCxPQUFPLEVBQUUsd0JBQXdCLEVBQUUsTUFBTSwrQkFBK0IsQ0FBQzs7Ozs7QUFFekU7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FtQkc7QUFlSCxNQUFNLE9BQU8sdUJBQXVCO0lBZHBD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ekZJLFlBQVksK1BBQ1osZUFBZSw4QkFDZixpQkFBaUIsZ0xBQ2pCLGFBQWEsOEJBQ2IsZ0JBQWdCOzs0RkFNUCx1QkFBdUI7a0JBZG5DLFNBQVM7K0JBQ0UseUJBQXlCLGNBQ3ZCLElBQUksV0FDUDt3QkFDUCxZQUFZO3dCQUNaLGVBQWU7d0JBQ2YsaUJBQWlCO3dCQUNqQixhQUFhO3dCQUNiLGdCQUFnQjtxQkFDakIsaUJBR2MsaUJBQWlCLENBQUMsSUFBSTs4QkFJNUIsS0FBSztzQkFBYixLQUFLO2dCQUdHLFdBQVc7c0JBQW5CLEtBQUs7Z0JBR0csY0FBYztzQkFBdEIsS0FBSztnQkFHRyxTQUFTO3NCQUFqQixLQUFLO2dCQUdPLE9BQU87c0JBQW5CLEtBQUs7Z0JBZU8sZUFBZTtzQkFBM0IsS0FBSztnQkFTRyxRQUFRO3NCQUFoQixLQUFLO2dCQU1HLGFBQWE7c0JBQXJCLEtBQUs7Z0JBQ0csZUFBZTtzQkFBdkIsS0FBSztnQkFJSSxNQUFNO3NCQUFmLE1BQU07Z0JBR0csZUFBZTtzQkFBeEIsTUFBTTtnQkFHRyxTQUFTO3NCQUFsQixNQUFNO2dCQVVHLGVBQWU7c0JBQXhCLE1BQU07Z0JBS21CLFdBQVc7c0JBQXBDLFNBQVM7dUJBQUMsYUFBYSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XHJcbiAgQ09NTUEsXHJcbiAgRE9XTl9BUlJPVyxcclxuICBFTlRFUixcclxuICBFU0NBUEUsXHJcbiAgVVBfQVJST1csXHJcbn0gZnJvbSAnQGFuZ3VsYXIvY2RrL2tleWNvZGVzJztcclxuaW1wb3J0IHsgQ29tbW9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcclxuaW1wb3J0IHtcclxuICBDb21wb25lbnQsXHJcbiAgRWxlbWVudFJlZixcclxuICBFdmVudEVtaXR0ZXIsXHJcbiAgSW5wdXQsXHJcbiAgT25EZXN0cm95LFxyXG4gIE9uSW5pdCxcclxuICBPdXRwdXQsXHJcbiAgVmlld0NoaWxkLFxyXG4gIFZpZXdFbmNhcHN1bGF0aW9uLFxyXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBNYXRCdXR0b25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9idXR0b24nO1xyXG5pbXBvcnQgeyBNYXRDaGVja2JveE1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2NoZWNrYm94JztcclxuaW1wb3J0IHsgTWF0SWNvbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2ljb24nO1xyXG5pbXBvcnQgeyBNYXRUb29sdGlwTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvdG9vbHRpcCc7XHJcbmltcG9ydCB7IFN1YmplY3QsIFN1YnNjcmlwdGlvbiwgdGltZXIgfSBmcm9tICdyeGpzJztcclxuaW1wb3J0IHsgU2VsZWN0T3B0aW9uIH0gZnJvbSAnQGllZWVzYS1ucG0vcHJlc2VudGF0aW9uJztcclxuaW1wb3J0ICogYXMgc2NyZWVuVGV4dHMgZnJvbSAnLi4vLi4vYXNzZXRzL2NvbnN0YW50cy5qc29uJztcclxuaW1wb3J0IHsgR3JvdXBzVmFsaWRhdGlvblBhdHRlcm5zIH0gZnJvbSAnLi4vLi4vYXNzZXRzL2Zvcm0tdmFsaWRhdGlvbnMnO1xyXG5cclxuLyoqXHJcbiAqIEEgc2VsZi1jb250YWluZWQgbXVsdGktc2VsZWN0IG9yZ2FuaXphdGlvbiBmaWVsZCB1c2VkIGluc2lkZSB0aGUgQWRkL0VkaXRcclxuICogcm9zdGVyIHBvcHVwcy5cclxuICpcclxuICogSXQgaW50ZW50aW9uYWxseSBkb2VzIE5PVCByZXVzZSB0aGUgc2hhcmVkIE11bHRpU2VsZWN0QXV0b2NvbXBsZXRlQ29tcG9uZW50XHJcbiAqICh3aGljaCBpcyBidWlsdCBvbiBtYXQtYXV0b2NvbXBsZXRlKS4gTWF0ZXJpYWwncyBhdXRvY29tcGxldGUgY2xvc2VzIGl0cyBwYW5lbFxyXG4gKiBhbmQgb3ZlcndyaXRlcyB0aGUgaW5wdXQgb24gZXZlcnkgb3B0aW9uIHBpY2ssIHdoaWNoIG1hZGUgbXVsdGktc2VsZWN0aW9uXHJcbiAqIGZlZWwgc2luZ2xlLXNlbGVjdCBhbmQgY2xlYXJlZCB0aGUgdXNlcidzIHR5cGVkIHRleHQuIFRoaXMgY29tcG9uZW50IHVzZXMgYVxyXG4gKiBmdWxseS1vd25lZCBjdXN0b20gZHJvcGRvd24gKDxkaXY+ICsgY2hlY2tib3hlcykgc286XHJcbiAqICAtIHRoZSBwYW5lbCBzdGF5cyBvcGVuIHdoaWxlIHRoZSB1c2VyIHRpY2tzIHNldmVyYWwgcmVzdWx0cyxcclxuICogIC0gdGhlIHR5cGVkIHNlYXJjaCB0ZXh0IGlzIG5ldmVyIG92ZXJ3cml0dGVuIGJ5IGEgcGljayxcclxuICogIC0gcHJlc3NpbmcgRW50ZXIgYWRkcyB0aGUgdHlwZWQgdmFsdWUgYXMgYSBmcmVlLXRleHQgY2hpcCxcclxuICogIC0gY2xpY2tpbmcgb3V0c2lkZSBjbGVhcnMgYW55IGxlZnRvdmVyIHR5cGVkIHRleHQgKG9sZCBiZWhhdmlvciksXHJcbiAqICAtIHNlbGVjdGVkIHZhbHVlcyByZW5kZXIgYXMgcmVtb3ZhYmxlIGNoaXBzIChvbGQgYmVoYXZpb3IpLlxyXG4gKlxyXG4gKiBUaGUgcGFyZW50IHN1cHBsaWVzIHNlYXJjaCByZXN1bHRzIHZpYSB7QGxpbmsgb3B0aW9uc30gYW5kIHJlYWN0cyB0b1xyXG4gKiB7QGxpbmsgc2VhcmNofSAoZGVib3VuY2VkIHR5cGVkIHRlcm0pIGFuZCB7QGxpbmsgc2VsZWN0aW9uQ2hhbmdlfS5cclxuICogQGV4cG9ydFxyXG4gKiBAY2xhc3MgT3JnTXVsdGlTZWxlY3RDb21wb25lbnRcclxuICovXHJcbkBDb21wb25lbnQoe1xyXG4gIHNlbGVjdG9yOiAnaWVlZXNhLW9yZy1tdWx0aS1zZWxlY3QnLFxyXG4gIHN0YW5kYWxvbmU6IHRydWUsXHJcbiAgaW1wb3J0czogW1xyXG4gICAgQ29tbW9uTW9kdWxlLFxyXG4gICAgTWF0QnV0dG9uTW9kdWxlLFxyXG4gICAgTWF0Q2hlY2tib3hNb2R1bGUsXHJcbiAgICBNYXRJY29uTW9kdWxlLFxyXG4gICAgTWF0VG9vbHRpcE1vZHVsZSxcclxuICBdLFxyXG4gIHRlbXBsYXRlVXJsOiAnLi9vcmctbXVsdGktc2VsZWN0LmNvbXBvbmVudC5odG1sJyxcclxuICBzdHlsZVVybHM6IFsnLi9vcmctbXVsdGktc2VsZWN0LmNvbXBvbmVudC5zY3NzJ10sXHJcbiAgZW5jYXBzdWxhdGlvbjogVmlld0VuY2Fwc3VsYXRpb24uTm9uZSxcclxufSlcclxuZXhwb3J0IGNsYXNzIE9yZ011bHRpU2VsZWN0Q29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBPbkRlc3Ryb3kge1xyXG4gIC8qKiBGaWVsZCBsYWJlbCAoZS5nLiBcIlJlcHJlc2VudGluZyBPcmdhbml6YXRpb24gKlwiKS4gKi9cclxuICBASW5wdXQoKSBsYWJlbCA9ICcnO1xyXG5cclxuICAvKiogUGxhY2Vob2xkZXIgZm9yIHRoZSBpbnB1dC4gKi9cclxuICBASW5wdXQoKSBwbGFjZWhvbGRlciA9ICcnO1xyXG5cclxuICAvKiogU3VwcG9ydC9oZWxwIHRleHQgc2hvd24gYmVsb3cgdGhlIGZpZWxkLiAqL1xyXG4gIEBJbnB1dCgpIHN1cHBvcnRNZXNzYWdlID0gJyc7XHJcblxyXG4gIC8qKiBhcmlhLWxhYmVsIGZvciB0aGUgaW5wdXQuICovXHJcbiAgQElucHV0KCkgYXJpYUxhYmVsID0gJyc7XHJcblxyXG4gIC8qKiBTZWFyY2ggcmVzdWx0cyBzdXBwbGllZCBieSB0aGUgcGFyZW50IChyZXBvcHVsYXRlZCBvbiBlYWNoIHNlYXJjaCkuICovXHJcbiAgQElucHV0KCkgc2V0IG9wdGlvbnModmFsdWU6IFNlbGVjdE9wdGlvbltdKSB7XHJcbiAgICB0aGlzLl9vcHRpb25zID0gdmFsdWUgPz8gW107XHJcbiAgICAvLyBSZXNldCBrZXlib2FyZCBoaWdobGlnaHQgd2hlbmV2ZXIgdGhlIHJlc3VsdCBzZXQgY2hhbmdlcy5cclxuICAgIHRoaXMuYWN0aXZlT3B0aW9uSW5kZXggPSAtMTtcclxuICAgIC8vIE9wZW4gdGhlIGRyb3Bkb3duIGFzIHNvb24gYXMgZnJlc2ggcmVzdWx0cyBhcnJpdmUgd2hpbGUgdGhlIHVzZXIgaXMgc3RpbGxcclxuICAgIC8vIHR5cGluZy9zZWFyY2hpbmcgKGhhcyBub24tZW1wdHkgdGV4dCkuIENsb3NlcyB3aGVuIHJlc3VsdHMgYXJlIGVtcHRpZWQuXHJcbiAgICB0aGlzLmlzRHJvcGRvd25PcGVuID1cclxuICAgICAgdGhpcy5fb3B0aW9ucy5sZW5ndGggPiAwICYmIHRoaXMuc2VhcmNoVGV4dC50cmltKCkubGVuZ3RoID4gMDtcclxuICB9XHJcbiAgZ2V0IG9wdGlvbnMoKTogU2VsZWN0T3B0aW9uW10ge1xyXG4gICAgcmV0dXJuIHRoaXMuX29wdGlvbnM7XHJcbiAgfVxyXG4gIHByaXZhdGUgX29wdGlvbnM6IFNlbGVjdE9wdGlvbltdID0gW107XHJcblxyXG4gIC8qKiBQcmUtc2VsZWN0ZWQgb3B0aW9ucyAoZWRpdCBwcmVmaWxsKS4gUmVuZGVyZWQgYXMgY2hpcHMuICovXHJcbiAgQElucHV0KCkgc2V0IHNlbGVjdGVkT3B0aW9ucyh2YWx1ZTogU2VsZWN0T3B0aW9uW10pIHtcclxuICAgIHRoaXMuX3NlbGVjdGVkT3B0aW9ucyA9IHZhbHVlID8/IFtdO1xyXG4gIH1cclxuICBnZXQgc2VsZWN0ZWRPcHRpb25zKCk6IFNlbGVjdE9wdGlvbltdIHtcclxuICAgIHJldHVybiB0aGlzLl9zZWxlY3RlZE9wdGlvbnM7XHJcbiAgfVxyXG4gIHByaXZhdGUgX3NlbGVjdGVkT3B0aW9uczogU2VsZWN0T3B0aW9uW10gPSBbXTtcclxuXHJcbiAgLyoqIE1hcmtzIHRoZSBmaWVsZCByZXF1aXJlZCAoZHJpdmVzIHRoZSByZXF1aXJlZCBtZXNzYWdlICsgZXJyb3IgYm9yZGVyKS4gKi9cclxuICBASW5wdXQoKSByZXF1aXJlZCA9IHRydWU7XHJcblxyXG4gIC8qKlxyXG4gICAqIEljb24gVVJMcyAoc2FtZSBzcHJpdGUgcmVmcyB0aGUgc2hhcmVkIG11bHRpLXNlbGVjdCBmaWVsZCB1c2VkKS4gRGVmYXVsdGVkXHJcbiAgICogc28gdGhlIHBvcHVwcyBkb24ndCBuZWVkIHRvIHBhc3MgdGhlbTsgb3ZlcnJpZGFibGUgdmlhIGlucHV0IGlmIG5lZWRlZC5cclxuICAgKi9cclxuICBASW5wdXQoKSByZW1vdmVJY29uVVJMID0gJ2Fzc2V0cy9pbWFnZXMvc3ByaXRlcy9zcHJpdGVzLnN2ZyNpY29uLXRyYWlsaW5nJztcclxuICBASW5wdXQoKSBjbGVhckFsbEljb25VUkwgPVxyXG4gICAgJ2Fzc2V0cy9pbWFnZXMvc3ByaXRlcy9zcHJpdGVzLnN2ZyNpY29uLWNsZWFyLWFsbCc7XHJcblxyXG4gIC8qKiBFbWl0cyB0aGUgdHJpbW1lZCB0eXBlZCB0ZXJtIChkZWJvdW5jZWQpIHNvIHRoZSBwYXJlbnQgY2FuIGNhbGwgdGhlIEFQSS4gKi9cclxuICBAT3V0cHV0KCkgc2VhcmNoID0gbmV3IEV2ZW50RW1pdHRlcjxzdHJpbmc+KCk7XHJcblxyXG4gIC8qKiBFbWl0cyB0aGUgY3VycmVudCBzZWxlY3Rpb24gYXJyYXkgd2hlbmV2ZXIgaXQgY2hhbmdlcy4gKi9cclxuICBAT3V0cHV0KCkgc2VsZWN0aW9uQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxTZWxlY3RPcHRpb25bXT4oKTtcclxuXHJcbiAgLyoqIEVtaXR0ZWQgd2hlbiB0aGUgZmllbGQgaXMgYmx1cnJlZCAocGFyZW50IGNhbiByZS1ldmFsdWF0ZSB2YWxpZGF0aW9uKS4gKi9cclxuICBAT3V0cHV0KCkgZmllbGRCbHVyID0gbmV3IEV2ZW50RW1pdHRlcjx2b2lkPigpO1xyXG5cclxuICAvKipcclxuICAgKiBFbWl0cyB0cnVlIHdoZW4gdGhlIGlucHV0IGhvbGRzIGFuIHVuY29tbWl0dGVkIGZyZWUtdGV4dCB0b2tlbiB0aGF0IGZhaWxzXHJcbiAgICogdmFsaWRhdGlvbiAodG9vIHNob3J0IC8gdG9vIGxvbmcgLyBpbnZhbGlkIHBhdHRlcm4pLCBhbmQgZmFsc2Ugd2hlbiB0aGVcclxuICAgKiBpbnB1dCBpcyBlbXB0eSBvciB0aGUgdG9rZW4gaXMgdmFsaWQuIFRoZSBwYXJlbnQgdXNlcyB0aGlzIHRvIGtlZXAgdGhlIFNhdmVcclxuICAgKiBidXR0b24gZGlzYWJsZWQgd2hpbGUgYW4gaW52YWxpZCB0b2tlbiByZW1haW5zIOKAlCBvdGhlcndpc2UgYSBwcmV2aW91c2x5XHJcbiAgICogYWRkZWQgdmFsaWQgY2hpcCB3b3VsZCBrZWVwIHRoZSBwYXJlbnQgY29udHJvbCB2YWxpZCBhbmQgbGV0IHRoZSBmb3JtIHN1Ym1pdFxyXG4gICAqIHdpdGggYW4gaW52YWxpZCB0b2tlbiBzdGlsbCBpbiB0aGUgaW5wdXQuXHJcbiAgICovXHJcbiAgQE91dHB1dCgpIGludmFsaWRGcmVlVGV4dCA9IG5ldyBFdmVudEVtaXR0ZXI8Ym9vbGVhbj4oKTtcclxuXHJcbiAgLyoqIFRyYWNrcyB0aGUgbGFzdCBlbWl0dGVkIGludmFsaWQtdG9rZW4gc3RhdGUgdG8gYXZvaWQgZHVwbGljYXRlIGVtaXRzLiAqL1xyXG4gIHByaXZhdGUgaGFzSW52YWxpZEZyZWVUZXh0ID0gZmFsc2U7XHJcblxyXG4gIEBWaWV3Q2hpbGQoJ3NlYXJjaElucHV0Jykgc2VhcmNoSW5wdXQhOiBFbGVtZW50UmVmPEhUTUxJbnB1dEVsZW1lbnQ+O1xyXG5cclxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxyXG4gIGNvbnN0YW50czogYW55ID0gc2NyZWVuVGV4dHM7XHJcbiAgYWRkVXNlclJvc3RlclRleHRzID0gdGhpcy5jb25zdGFudHM/LmFkZFVzZXJSb3N0ZXI7XHJcblxyXG4gIC8qKiBXaGV0aGVyIHRoZSByZXN1bHRzIGRyb3Bkb3duIGlzIG9wZW4uICovXHJcbiAgaXNEcm9wZG93bk9wZW4gPSBmYWxzZTtcclxuXHJcbiAgLyoqIFRoZSBjdXJyZW50IHR5cGVkIHNlYXJjaCB0ZXh0LiAqL1xyXG4gIHNlYXJjaFRleHQgPSAnJztcclxuXHJcbiAgLyoqIElubGluZSB2YWxpZGF0aW9uIG1lc3NhZ2UgZm9yIHRoZSBmcmVlLXRleHQgKEVudGVyKSBwYXRoLiAqL1xyXG4gIGVycm9yTWVzc2FnZSA9ICcnO1xyXG5cclxuICAvKiogV2hldGhlciB0aGUgZmllbGQgaGFzIGJlZW4gdG91Y2hlZCAodG8gc2hvdyByZXF1aXJlZCBlcnJvciBhZnRlciBibHVyKS4gKi9cclxuICBpc1RvdWNoZWQgPSBmYWxzZTtcclxuXHJcbiAgLyoqXHJcbiAgICogSW5kZXggb2YgdGhlIGtleWJvYXJkLWhpZ2hsaWdodGVkIHJlc3VsdCByb3cgKC0xID0gbm9uZSkuIEVuYWJsZXMgYXJyb3cta2V5XHJcbiAgICogbmF2aWdhdGlvbiBhbmQgRW50ZXItdG8tdG9nZ2xlIGZvciBrZXlib2FyZCB1c2VycywgbWlycm9yaW5nIHRoZSBtYXQtb3B0aW9uXHJcbiAgICogYmVoYXZpb3IgdGhpcyBjdXN0b20gZHJvcGRvd24gcmVwbGFjZXMuXHJcbiAgICovXHJcbiAgYWN0aXZlT3B0aW9uSW5kZXggPSAtMTtcclxuXHJcbiAgLyoqIFN0YWJsZSBpZCBwcmVmaXggZm9yIG9wdGlvbiByb3dzICh1c2VkIGZvciBhcmlhLWFjdGl2ZWRlc2NlbmRhbnQpLiAqL1xyXG4gIHJlYWRvbmx5IG9wdGlvbklkUHJlZml4ID0gJ2llZWVzYS1vcmctb3B0aW9uLSc7XHJcblxyXG4gIHByaXZhdGUgZGVzdHJveSQgPSBuZXcgU3ViamVjdDxib29sZWFuPigpO1xyXG4gIHByaXZhdGUgc2VhcmNoRGVib3VuY2U/OiBTdWJzY3JpcHRpb247XHJcbiAgcHJpdmF0ZSBibHVyVGltZXI/OiBTdWJzY3JpcHRpb247XHJcbiAgcHJpdmF0ZSByZWFkb25seSBkZWJvdW5jZU1zID0gMzAwO1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgbWluQ2hhclRvU2VhcmNoID0gMztcclxuXHJcbiAgcHJpdmF0ZSBzZXBhcmF0b3JLZXlzID0gW0VOVEVSLCBDT01NQV07XHJcblxyXG4gIG5nT25Jbml0KCk6IHZvaWQge1xyXG4gICAgLy8gRmFsbGJhY2sgbGFiZWxzIGZyb20gdGhlIHNoYXJlZCBjb25zdGFudHMgaWYgaW5wdXRzIGFyZSBub3QgcHJvdmlkZWQuXHJcbiAgICB0aGlzLnBsYWNlaG9sZGVyID0gdGhpcy5wbGFjZWhvbGRlciA/PyAnJztcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEhhbmRsZXMgdHlwaW5nIGluIHRoZSBzZWFyY2ggaW5wdXQ6IHRyYWNrcyB0aGUgdGV4dCwgb3BlbnMvY2xvc2VzIHRoZVxyXG4gICAqIGRyb3Bkb3duIGFuZCBkZWJvdW5jZXMgdGhlIHNlYXJjaCBlbWl0IHRvIHRoZSBwYXJlbnQuXHJcbiAgICogQHBhcmFtIHtFdmVudH0gZXZlbnQgLWlucHV0IGV2ZW50LlxyXG4gICAqIEBtZW1iZXJvZiBPcmdNdWx0aVNlbGVjdENvbXBvbmVudFxyXG4gICAqL1xyXG4gIG9uSW5wdXQoZXZlbnQ6IEV2ZW50KTogdm9pZCB7XHJcbiAgICBjb25zdCB2YWx1ZSA9IChldmVudC50YXJnZXQgYXMgSFRNTElucHV0RWxlbWVudCkudmFsdWU7XHJcbiAgICB0aGlzLnNlYXJjaFRleHQgPSB2YWx1ZTtcclxuICAgIHRoaXMuZXJyb3JNZXNzYWdlID0gJyc7XHJcbiAgICAvLyBBbnkgbm9uLWVtcHR5LCB1bmNvbW1pdHRlZCB0ZXh0IGlzIGEgcGVuZGluZyB0b2tlbiDigJQgZmxhZyB0aGUgZmllbGRcclxuICAgIC8vIGludmFsaWQgc28gdGhlIHBhcmVudCBkaXNhYmxlcyBTYXZlIHVudGlsIGl0IGlzIGNvbW1pdHRlZCAoRW50ZXIpIG9yXHJcbiAgICAvLyBjbGVhcmVkLiBDbGVhcmVkIHRleHQgcmVzZXRzIHRoZSBmbGFnLlxyXG4gICAgdGhpcy5lbWl0SW52YWxpZFN0YXRlKCEhdmFsdWUudHJpbSgpKTtcclxuICAgIGNvbnN0IHRyaW1tZWQgPSB2YWx1ZS50cmltKCk7XHJcbiAgICB0aGlzLnNlYXJjaERlYm91bmNlPy51bnN1YnNjcmliZSgpO1xyXG4gICAgaWYgKHRyaW1tZWQubGVuZ3RoIDwgdGhpcy5taW5DaGFyVG9TZWFyY2gpIHtcclxuICAgICAgdGhpcy5vcHRpb25zID0gW107XHJcbiAgICAgIHRoaXMuaXNEcm9wZG93bk9wZW4gPSBmYWxzZTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgdGhpcy5zZWFyY2hEZWJvdW5jZSA9IHRpbWVyKHRoaXMuZGVib3VuY2VNcykuc3Vic2NyaWJlKCgpID0+IHtcclxuICAgICAgdGhpcy5zZWFyY2guZW1pdCh0cmltbWVkKTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogRW1pdHMgdGhlIGludmFsaWQtZnJlZS10ZXh0IHN0YXRlIHRvIHRoZSBwYXJlbnQgKGRlZHVwZWQpLiBUcnVlIG1lYW5zIGFuXHJcbiAgICogdW5jb21taXR0ZWQgdG9rZW4gaXMgcHJlc2VudCBhbmQgU2F2ZSBzaG91bGQgc3RheSBkaXNhYmxlZC5cclxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IGlzSW52YWxpZCAtd2hldGhlciBhbiB1bmNvbW1pdHRlZCB0b2tlbiBpcyBwcmVzZW50LlxyXG4gICAqIEBtZW1iZXJvZiBPcmdNdWx0aVNlbGVjdENvbXBvbmVudFxyXG4gICAqL1xyXG4gIHByaXZhdGUgZW1pdEludmFsaWRTdGF0ZShpc0ludmFsaWQ6IGJvb2xlYW4pOiB2b2lkIHtcclxuICAgIGlmICh0aGlzLmhhc0ludmFsaWRGcmVlVGV4dCAhPT0gaXNJbnZhbGlkKSB7XHJcbiAgICAgIHRoaXMuaGFzSW52YWxpZEZyZWVUZXh0ID0gaXNJbnZhbGlkO1xyXG4gICAgICB0aGlzLmludmFsaWRGcmVlVGV4dC5lbWl0KGlzSW52YWxpZCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBPcGVucyB0aGUgZHJvcGRvd24gb24gZm9jdXMgb25seSB3aGVuIHRoZXJlIGFyZSByZXN1bHRzIEFORCB0aGUgaW5wdXQgc3RpbGxcclxuICAgKiBob2xkcyBhIHZhbGlkIHNlYXJjaCB0ZXJtIChhdCBvciBhYm92ZSBtaW5DaGFyVG9TZWFyY2gpLiBUaGlzIHByZXZlbnRzXHJcbiAgICogcmUtb3BlbmluZyBzdGFsZSByZXN1bHRzIOKAlCBlLmcuIGEgbGF0ZSBBUEkgcmVzcG9uc2UgdGhhdCBwb3B1bGF0ZWQgb3B0aW9uc1xyXG4gICAqIGFmdGVyIHRoZSBpbnB1dCB3YXMgY2xlYXJlZCDigJQgd2hlbiB0aGUgdXNlciBzaW1wbHkgcmVmb2N1c2VzIHRoZSBmaWVsZC5cclxuICAgKiBAbWVtYmVyb2YgT3JnTXVsdGlTZWxlY3RDb21wb25lbnRcclxuICAgKi9cclxuICBvbkZvY3VzKCk6IHZvaWQge1xyXG4gICAgaWYgKFxyXG4gICAgICB0aGlzLm9wdGlvbnM/Lmxlbmd0aCAmJlxyXG4gICAgICB0aGlzLnNlYXJjaFRleHQudHJpbSgpLmxlbmd0aCA+PSB0aGlzLm1pbkNoYXJUb1NlYXJjaFxyXG4gICAgKSB7XHJcbiAgICAgIHRoaXMuaXNEcm9wZG93bk9wZW4gPSB0cnVlO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQ2FsbGVkIGJ5IHRoZSBwYXJlbnQgKHZpYSBhIHNldHRlciByZS1hc3NpZ24pIG9yIGludGVybmFsbHkgYWZ0ZXIgbmV3XHJcbiAgICogb3B0aW9ucyBhcnJpdmUgc28gdGhlIGRyb3Bkb3duIG9wZW5zIHRvIHNob3cgdGhlbS5cclxuICAgKiBAbWVtYmVyb2YgT3JnTXVsdGlTZWxlY3RDb21wb25lbnRcclxuICAgKi9cclxuICBzaG93UmVzdWx0cygpOiB2b2lkIHtcclxuICAgIHRoaXMuaXNEcm9wZG93bk9wZW4gPSAhIXRoaXMub3B0aW9ucz8ubGVuZ3RoO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogSGFuZGxlcyBrZXlkb3duIGZvciB0aGUgRW50ZXIvY29tbWEgXCJhZGQgdHlwZWQgdmFsdWVcIiBwYXRoLlxyXG4gICAqIEBwYXJhbSB7S2V5Ym9hcmRFdmVudH0gZXZlbnQgLWtleWJvYXJkIGV2ZW50LlxyXG4gICAqIEBtZW1iZXJvZiBPcmdNdWx0aVNlbGVjdENvbXBvbmVudFxyXG4gICAqL1xyXG4gIG9uS2V5ZG93bihldmVudDogS2V5Ym9hcmRFdmVudCk6IHZvaWQge1xyXG4gICAgLy8gQXJyb3cga2V5cyBtb3ZlIHRoZSBoaWdobGlnaHQgdGhyb3VnaCB0aGUgb3BlbiByZXN1bHRzIGxpc3QgKG9wZW5pbmcgaXRcclxuICAgIC8vIGZpcnN0IGlmIHRoZXJlIGFyZSByZXN1bHRzKS4gVGhpcyBtYWtlcyB0aGUgY3VzdG9tIGRyb3Bkb3duIG9wZXJhYmxlIGJ5XHJcbiAgICAvLyBrZXlib2FyZCwgbWF0Y2hpbmcgdGhlIG1hdC1vcHRpb24gbGlzdCBpdCByZXBsYWNlcy5cclxuICAgIGlmIChldmVudC5rZXlDb2RlID09PSBET1dOX0FSUk9XIHx8IGV2ZW50LmtleUNvZGUgPT09IFVQX0FSUk9XKSB7XHJcbiAgICAgIGlmICghdGhpcy5vcHRpb25zPy5sZW5ndGgpIHtcclxuICAgICAgICByZXR1cm47XHJcbiAgICAgIH1cclxuICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcclxuICAgICAgdGhpcy5pc0Ryb3Bkb3duT3BlbiA9IHRydWU7XHJcbiAgICAgIHRoaXMubW92ZUFjdGl2ZU9wdGlvbihldmVudC5rZXlDb2RlID09PSBET1dOX0FSUk9XID8gMSA6IC0xKTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIEVzY2FwZSBjbG9zZXMgdGhlIHJlc3VsdHMgd2l0aG91dCBjb21taXR0aW5nIGFueXRoaW5nLlxyXG4gICAgaWYgKGV2ZW50LmtleUNvZGUgPT09IEVTQ0FQRSkge1xyXG4gICAgICBpZiAodGhpcy5pc0Ryb3Bkb3duT3Blbikge1xyXG4gICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICAgICAgdGhpcy5pc0Ryb3Bkb3duT3BlbiA9IGZhbHNlO1xyXG4gICAgICAgIHRoaXMuYWN0aXZlT3B0aW9uSW5kZXggPSAtMTtcclxuICAgICAgfVxyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKCF0aGlzLnNlcGFyYXRvcktleXMuaW5jbHVkZXMoZXZlbnQua2V5Q29kZSkpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcclxuICAgIC8vIEVudGVyL2NvbW1hOiBpZiBhIHJlc3VsdCByb3cgaXMgaGlnaGxpZ2h0ZWQsIHRvZ2dsZSB0aGF0IG9wdGlvbiAoa2V5Ym9hcmRcclxuICAgIC8vIHBhcml0eSB3aXRoIGNsaWNraW5nIGl0KS4gT3RoZXJ3aXNlIGZhbGwgYmFjayB0byBhZGRpbmcgdGhlIHR5cGVkIHRleHQgYXNcclxuICAgIC8vIGEgZnJlZS10ZXh0IGNoaXAuXHJcbiAgICBpZiAoXHJcbiAgICAgIHRoaXMuaXNEcm9wZG93bk9wZW4gJiZcclxuICAgICAgdGhpcy5hY3RpdmVPcHRpb25JbmRleCA+PSAwICYmXHJcbiAgICAgIHRoaXMuYWN0aXZlT3B0aW9uSW5kZXggPCB0aGlzLm9wdGlvbnMubGVuZ3RoXHJcbiAgICApIHtcclxuICAgICAgdGhpcy50b2dnbGVPcHRpb24odGhpcy5vcHRpb25zW3RoaXMuYWN0aXZlT3B0aW9uSW5kZXhdKTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgdGhpcy5hZGRUeXBlZFZhbHVlKCk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBNb3ZlcyB0aGUga2V5Ym9hcmQgaGlnaGxpZ2h0IHVwL2Rvd24gdGhlIHJlc3VsdHMgbGlzdCwgd3JhcHBpbmcgYXQgdGhlIGVuZHMuXHJcbiAgICogQHBhcmFtIHtudW1iZXJ9IGRlbHRhIC0rMSB0byBtb3ZlIGRvd24sIC0xIHRvIG1vdmUgdXAuXHJcbiAgICogQG1lbWJlcm9mIE9yZ011bHRpU2VsZWN0Q29tcG9uZW50XHJcbiAgICovXHJcbiAgcHJpdmF0ZSBtb3ZlQWN0aXZlT3B0aW9uKGRlbHRhOiBudW1iZXIpOiB2b2lkIHtcclxuICAgIGNvbnN0IGNvdW50ID0gdGhpcy5vcHRpb25zLmxlbmd0aDtcclxuICAgIGlmICghY291bnQpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgY29uc3QgbmV4dCA9IHRoaXMuYWN0aXZlT3B0aW9uSW5kZXggKyBkZWx0YTtcclxuICAgIC8vIFdyYXAgYXJvdW5kIHNvIHRoZSBoaWdobGlnaHQgY3ljbGVzIHRocm91Z2ggdGhlIGxpc3QuXHJcbiAgICB0aGlzLmFjdGl2ZU9wdGlvbkluZGV4ID0gKG5leHQgKyBjb3VudCkgJSBjb3VudDtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFdoZXRoZXIgdGhlIGdpdmVuIHJlc3VsdCBpbmRleCBpcyB0aGUga2V5Ym9hcmQtaGlnaGxpZ2h0ZWQgcm93LlxyXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBpbmRleCAtdGhlIG9wdGlvbidzIGluZGV4LlxyXG4gICAqIEByZXR1cm4ge2Jvb2xlYW59XHJcbiAgICogQG1lbWJlcm9mIE9yZ011bHRpU2VsZWN0Q29tcG9uZW50XHJcbiAgICovXHJcbiAgaXNBY3RpdmVPcHRpb24oaW5kZXg6IG51bWJlcik6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIGluZGV4ID09PSB0aGlzLmFjdGl2ZU9wdGlvbkluZGV4O1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQWRkcyB0aGUgdHlwZWQgZnJlZS10ZXh0IHZhbHVlIGFzIGEgc2VsZWN0aW9uIChjaGlwKSBhZnRlciB2YWxpZGF0aW5nIGl0c1xyXG4gICAqIGxlbmd0aCBhbmQgcGF0dGVybiAocGFyaXR5IHdpdGggdGhlIHByZXZpb3VzIGNoaXAtaW5wdXQgYmVoYXZpb3IpLlxyXG4gICAqIEBtZW1iZXJvZiBPcmdNdWx0aVNlbGVjdENvbXBvbmVudFxyXG4gICAqL1xyXG4gIGFkZFR5cGVkVmFsdWUoKTogdm9pZCB7XHJcbiAgICBjb25zdCB2YWx1ZSA9IHRoaXMuc2VhcmNoVGV4dC50cmltKCk7XHJcbiAgICBpZiAoIXZhbHVlKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIGNvbnN0IHZhbGlkYXRpb25FcnJvciA9IHRoaXMudmFsaWRhdGVGcmVlVGV4dCh2YWx1ZSk7XHJcbiAgICBpZiAodmFsaWRhdGlvbkVycm9yKSB7XHJcbiAgICAgIHRoaXMuZXJyb3JNZXNzYWdlID0gdmFsaWRhdGlvbkVycm9yO1xyXG4gICAgICAvLyBLZWVwIHRoZSBmaWVsZCBmbGFnZ2VkIGludmFsaWQgc28gdGhlIHBhcmVudCdzIFNhdmUgYnV0dG9uIHN0YXlzXHJcbiAgICAgIC8vIGRpc2FibGVkIGV2ZW4gd2hlbiBhIHZhbGlkIGNoaXAgYWxyZWFkeSBleGlzdHMg4oCUIHRoZSB1bmNvbW1pdHRlZCB0b2tlblxyXG4gICAgICAvLyBpcyBpbnZhbGlkIGFuZCBtdXN0IGJlIGNvcnJlY3RlZCBvciBjbGVhcmVkIGJlZm9yZSBzdWJtaXR0aW5nLlxyXG4gICAgICB0aGlzLmVtaXRJbnZhbGlkU3RhdGUodHJ1ZSk7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIC8vIEF2b2lkIGR1cGxpY2F0ZXMgKGNhc2UtaW5zZW5zaXRpdmUgYnkgbmFtZSkuXHJcbiAgICBjb25zdCBleGlzdHMgPSB0aGlzLl9zZWxlY3RlZE9wdGlvbnMuc29tZShcclxuICAgICAgKG9wdGlvbikgPT4gb3B0aW9uLm5hbWU/LnRvTG93ZXJDYXNlKCkgPT09IHZhbHVlLnRvTG93ZXJDYXNlKClcclxuICAgICk7XHJcbiAgICBpZiAoIWV4aXN0cykge1xyXG4gICAgICB0aGlzLl9zZWxlY3RlZE9wdGlvbnMgPSBbXHJcbiAgICAgICAgLi4udGhpcy5fc2VsZWN0ZWRPcHRpb25zLFxyXG4gICAgICAgIHsgaWQ6ICcnLCBuYW1lOiB2YWx1ZSB9LFxyXG4gICAgICBdO1xyXG4gICAgICB0aGlzLmVtaXRTZWxlY3Rpb24oKTtcclxuICAgIH1cclxuICAgIC8vIFRva2VuIGNvbW1pdHRlZCBzdWNjZXNzZnVsbHkg4oCUIGlucHV0IGlzIGNsZWFyZWQsIHNvIHRoZSBmaWVsZCBpcyB2YWxpZC5cclxuICAgIHRoaXMuY2xlYXJTZWFyY2hUZXh0KCk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBWYWxpZGF0ZXMgYSBmcmVlLXRleHQgb3JnYW5pemF0aW9uIHZhbHVlIGFnYWluc3QgdGhlIHNoYXJlZCBtaW4vbWF4L3BhdHRlcm5cclxuICAgKiBydWxlcy4gUmV0dXJucyBhbiBlcnJvciBtZXNzYWdlIHdoZW4gaW52YWxpZCwgb3RoZXJ3aXNlIGFuIGVtcHR5IHN0cmluZy5cclxuICAgKiBAcGFyYW0ge3N0cmluZ30gdmFsdWUgLXRoZSB0eXBlZCB2YWx1ZS5cclxuICAgKiBAcmV0dXJuIHtzdHJpbmd9XHJcbiAgICogQG1lbWJlcm9mIE9yZ011bHRpU2VsZWN0Q29tcG9uZW50XHJcbiAgICovXHJcbiAgdmFsaWRhdGVGcmVlVGV4dCh2YWx1ZTogc3RyaW5nKTogc3RyaW5nIHtcclxuICAgIGNvbnN0IG1lc3NhZ2VzID0gdGhpcy5hZGRVc2VyUm9zdGVyVGV4dHM/Lm1lc3NhZ2U/LmVycm9yO1xyXG4gICAgaWYgKHZhbHVlLmxlbmd0aCA8IEdyb3Vwc1ZhbGlkYXRpb25QYXR0ZXJucy5yZXByZXNlbnRpbmdPcmdOYW1lTWluTGVuZ3RoKSB7XHJcbiAgICAgIHJldHVybiBtZXNzYWdlcz8ubGltaXQ/LnJlcHJlc2VudGluZ09yZ2FuaXphdGlvbk1pbkNoYXJzID8/ICcnO1xyXG4gICAgfVxyXG4gICAgaWYgKHZhbHVlLmxlbmd0aCA+IEdyb3Vwc1ZhbGlkYXRpb25QYXR0ZXJucy5yZXByZXNlbnRpbmdPcmdOYW1lTWF4TGVuZ3RoKSB7XHJcbiAgICAgIHJldHVybiBtZXNzYWdlcz8ubGltaXQ/LnJlcHJlc2VudGluZ09yZ2FuaXphdGlvbk1heENoYXJzID8/ICcnO1xyXG4gICAgfVxyXG4gICAgaWYgKCFHcm91cHNWYWxpZGF0aW9uUGF0dGVybnMucmVwcmVzZW50aW5nT3JnYW5pemF0aW9uLnRlc3QodmFsdWUpKSB7XHJcbiAgICAgIHJldHVybiBtZXNzYWdlcz8ucGF0dGVybj8ucmVwcmVzZW50aW5nT3JnYW5pemF0aW9uID8/ICcnO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuICcnO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogVG9nZ2xlcyBzZWxlY3Rpb24gb2YgYSByZXN1bHQgb3B0aW9uLiBLZWVwcyB0aGUgZHJvcGRvd24gb3BlbiBhbmQgdGhlIHR5cGVkXHJcbiAgICogdGV4dCBpbnRhY3Qgc28gdGhlIHVzZXIgY2FuIGtlZXAgc2VsZWN0aW5nLlxyXG4gICAqIEBwYXJhbSB7U2VsZWN0T3B0aW9ufSBvcHRpb24gLXRoZSBjbGlja2VkIHJlc3VsdCBvcHRpb24uXHJcbiAgICogQG1lbWJlcm9mIE9yZ011bHRpU2VsZWN0Q29tcG9uZW50XHJcbiAgICovXHJcbiAgdG9nZ2xlT3B0aW9uKG9wdGlvbjogU2VsZWN0T3B0aW9uKTogdm9pZCB7XHJcbiAgICBjb25zdCBpbmRleCA9IHRoaXMuX3NlbGVjdGVkT3B0aW9ucy5maW5kSW5kZXgoXHJcbiAgICAgIChpdGVtKSA9PiBpdGVtLmlkID09PSBvcHRpb24uaWQgJiYgaXRlbS5uYW1lID09PSBvcHRpb24ubmFtZVxyXG4gICAgKTtcclxuICAgIGlmIChpbmRleCA+PSAwKSB7XHJcbiAgICAgIHRoaXMuX3NlbGVjdGVkT3B0aW9ucyA9IHRoaXMuX3NlbGVjdGVkT3B0aW9ucy5maWx0ZXIoXHJcbiAgICAgICAgKF8sIGkpID0+IGkgIT09IGluZGV4XHJcbiAgICAgICk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLl9zZWxlY3RlZE9wdGlvbnMgPSBbLi4udGhpcy5fc2VsZWN0ZWRPcHRpb25zLCBvcHRpb25dO1xyXG4gICAgfVxyXG4gICAgdGhpcy5lbWl0U2VsZWN0aW9uKCk7XHJcbiAgICAvLyBLZWVwIGZvY3VzIGluIHRoZSBpbnB1dCBzbyB0aGUgdXNlciBjYW4gY29udGludWUgdHlwaW5nL3NlbGVjdGluZy5cclxuICAgIHRoaXMuc2VhcmNoSW5wdXQ/Lm5hdGl2ZUVsZW1lbnQ/LmZvY3VzKCk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBXaGV0aGVyIGFuIG9wdGlvbiBpcyBjdXJyZW50bHkgc2VsZWN0ZWQgKGRyaXZlcyB0aGUgY2hlY2tib3ggY2hlY2tlZCBzdGF0ZSkuXHJcbiAgICogQHBhcmFtIHtTZWxlY3RPcHRpb259IG9wdGlvbiAtb3B0aW9uIHRvIHRlc3QuXHJcbiAgICogQHJldHVybiB7Ym9vbGVhbn1cclxuICAgKiBAbWVtYmVyb2YgT3JnTXVsdGlTZWxlY3RDb21wb25lbnRcclxuICAgKi9cclxuICBpc1NlbGVjdGVkKG9wdGlvbjogU2VsZWN0T3B0aW9uKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5fc2VsZWN0ZWRPcHRpb25zLnNvbWUoXHJcbiAgICAgIChpdGVtKSA9PiBpdGVtLmlkID09PSBvcHRpb24uaWQgJiYgaXRlbS5uYW1lID09PSBvcHRpb24ubmFtZVxyXG4gICAgKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFJlbW92ZXMgYSBzZWxlY3RlZCBjaGlwLlxyXG4gICAqIEBwYXJhbSB7U2VsZWN0T3B0aW9ufSBvcHRpb24gLXRoZSBvcHRpb24gdG8gcmVtb3ZlLlxyXG4gICAqIEBtZW1iZXJvZiBPcmdNdWx0aVNlbGVjdENvbXBvbmVudFxyXG4gICAqL1xyXG4gIHJlbW92ZU9wdGlvbihvcHRpb246IFNlbGVjdE9wdGlvbik6IHZvaWQge1xyXG4gICAgdGhpcy5fc2VsZWN0ZWRPcHRpb25zID0gdGhpcy5fc2VsZWN0ZWRPcHRpb25zLmZpbHRlcihcclxuICAgICAgKGl0ZW0pID0+ICEoaXRlbS5pZCA9PT0gb3B0aW9uLmlkICYmIGl0ZW0ubmFtZSA9PT0gb3B0aW9uLm5hbWUpXHJcbiAgICApO1xyXG4gICAgdGhpcy5lbWl0U2VsZWN0aW9uKCk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBDbGVhcnMgYWxsIHNlbGVjdGVkIGNoaXBzLlxyXG4gICAqIEBtZW1iZXJvZiBPcmdNdWx0aVNlbGVjdENvbXBvbmVudFxyXG4gICAqL1xyXG4gIGNsZWFyQWxsKCk6IHZvaWQge1xyXG4gICAgdGhpcy5fc2VsZWN0ZWRPcHRpb25zID0gW107XHJcbiAgICB0aGlzLm9wdGlvbnMgPSBbXTtcclxuICAgIHRoaXMuaXNEcm9wZG93bk9wZW4gPSBmYWxzZTtcclxuICAgIHRoaXMuZW1pdFNlbGVjdGlvbigpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQ2xlYXJzIHRoZSBsZWZ0b3ZlciB0eXBlZCB0ZXh0IG9uIGJsdXIgKG9sZCBiZWhhdmlvcikgYW5kIGNsb3NlcyB0aGVcclxuICAgKiBkcm9wZG93bi4gRGVmZXJyZWQgc28gYSBjbGljayBvbiBhIGRyb3Bkb3duIG9wdGlvbiAod2hpY2ggYWxzbyBibHVycyB0aGVcclxuICAgKiBpbnB1dCkgaXMgaGFuZGxlZCBmaXJzdC5cclxuICAgKiBAbWVtYmVyb2YgT3JnTXVsdGlTZWxlY3RDb21wb25lbnRcclxuICAgKi9cclxuICBvbkJsdXIoKTogdm9pZCB7XHJcbiAgICB0aGlzLmlzVG91Y2hlZCA9IHRydWU7XHJcbiAgICB0aGlzLmJsdXJUaW1lcj8udW5zdWJzY3JpYmUoKTtcclxuICAgIHRoaXMuYmx1clRpbWVyID0gdGltZXIoMTUwKS5zdWJzY3JpYmUoKCkgPT4ge1xyXG4gICAgICAvLyBJZiBmb2N1cyBtb3ZlZCBpbnRvIHRoZSBkcm9wZG93biAob3B0aW9uIGNsaWNrKSwgdGhlIGNsaWNrIGhhbmRsZXJcclxuICAgICAgLy8gcmUtZm9jdXNlcyB0aGUgaW5wdXQsIHNvIGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQgaXMgdGhlIGlucHV0IGFnYWluLlxyXG4gICAgICBjb25zdCBhY3RpdmUgPSBkb2N1bWVudC5hY3RpdmVFbGVtZW50O1xyXG4gICAgICBpZiAoYWN0aXZlID09PSB0aGlzLnNlYXJjaElucHV0Py5uYXRpdmVFbGVtZW50KSB7XHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgICB9XHJcbiAgICAgIHRoaXMuY2xlYXJTZWFyY2hUZXh0KCk7XHJcbiAgICAgIHRoaXMuaXNEcm9wZG93bk9wZW4gPSBmYWxzZTtcclxuICAgICAgdGhpcy5maWVsZEJsdXIuZW1pdCgpO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBXaGV0aGVyIHRoZSByZXF1aXJlZCBlcnJvciBzaG91bGQgc2hvdyAodG91Y2hlZCwgbm8gc2VsZWN0aW9uKS5cclxuICAgKiBAcmV0dXJuIHtib29sZWFufVxyXG4gICAqIEBtZW1iZXJvZiBPcmdNdWx0aVNlbGVjdENvbXBvbmVudFxyXG4gICAqL1xyXG4gIGdldCBzaG93UmVxdWlyZWRFcnJvcigpOiBib29sZWFuIHtcclxuICAgIHJldHVybiAoXHJcbiAgICAgIHRoaXMucmVxdWlyZWQgJiYgdGhpcy5pc1RvdWNoZWQgJiYgdGhpcy5fc2VsZWN0ZWRPcHRpb25zLmxlbmd0aCA9PT0gMFxyXG4gICAgKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIENsZWFycyB0aGUgdHlwZWQgc2VhcmNoIHRleHQgYW5kIGhpZGVzIHRoZSByZXN1bHRzLlxyXG4gICAqIEBtZW1iZXJvZiBPcmdNdWx0aVNlbGVjdENvbXBvbmVudFxyXG4gICAqL1xyXG4gIHByaXZhdGUgY2xlYXJTZWFyY2hUZXh0KCk6IHZvaWQge1xyXG4gICAgLy8gQ2FuY2VsIGFueSBwZW5kaW5nIGRlYm91bmNlZCBzZWFyY2ggc28gYSBibHVyL2NsZWFyIGJlZm9yZSB0aGUgdGltZXJcclxuICAgIC8vIGV4cGlyZXMgZG9lcyBub3QgZW1pdCB0aGUgbm93LWNsZWFyZWQgcXVlcnkgdG8gdGhlIHBhcmVudC5cclxuICAgIHRoaXMuc2VhcmNoRGVib3VuY2U/LnVuc3Vic2NyaWJlKCk7XHJcbiAgICB0aGlzLnNlYXJjaERlYm91bmNlID0gdW5kZWZpbmVkO1xyXG4gICAgdGhpcy5zZWFyY2hUZXh0ID0gJyc7XHJcbiAgICBpZiAodGhpcy5zZWFyY2hJbnB1dD8ubmF0aXZlRWxlbWVudCkge1xyXG4gICAgICB0aGlzLnNlYXJjaElucHV0Lm5hdGl2ZUVsZW1lbnQudmFsdWUgPSAnJztcclxuICAgIH1cclxuICAgIHRoaXMub3B0aW9ucyA9IFtdO1xyXG4gICAgdGhpcy5lcnJvck1lc3NhZ2UgPSAnJztcclxuICAgIC8vIE5vIGxlZnRvdmVyIHRleHQg4oCUIHRoZSBmaWVsZCBpcyBubyBsb25nZXIgaG9sZGluZyBhbiBpbnZhbGlkIHRva2VuLlxyXG4gICAgdGhpcy5lbWl0SW52YWxpZFN0YXRlKGZhbHNlKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEVtaXRzIHRoZSBjdXJyZW50IHNlbGVjdGlvbiB0byB0aGUgcGFyZW50LlxyXG4gICAqIEBtZW1iZXJvZiBPcmdNdWx0aVNlbGVjdENvbXBvbmVudFxyXG4gICAqL1xyXG4gIHByaXZhdGUgZW1pdFNlbGVjdGlvbigpOiB2b2lkIHtcclxuICAgIHRoaXMuc2VsZWN0aW9uQ2hhbmdlLmVtaXQoXHJcbiAgICAgIHRoaXMuX3NlbGVjdGVkT3B0aW9ucy5tYXAoKG9wdGlvbikgPT4gKHtcclxuICAgICAgICBpZDogb3B0aW9uLmlkLFxyXG4gICAgICAgIG5hbWU6IG9wdGlvbi5uYW1lLFxyXG4gICAgICB9KSlcclxuICAgICk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBUcmFja0J5IGZvciBib3RoIHJlc3VsdCBhbmQgY2hpcCBsaXN0cy5cclxuICAgKiBAcGFyYW0ge251bWJlcn0gaW5kZXggLWxpc3QgaW5kZXguXHJcbiAgICogQHBhcmFtIHtTZWxlY3RPcHRpb259IG9wdGlvbiAtdGhlIG9wdGlvbi5cclxuICAgKiBAcmV0dXJuIHsoc3RyaW5nIHwgbnVtYmVyKX1cclxuICAgKiBAbWVtYmVyb2YgT3JnTXVsdGlTZWxlY3RDb21wb25lbnRcclxuICAgKi9cclxuICB0cmFja0J5Rm4oaW5kZXg6IG51bWJlciwgb3B0aW9uOiBTZWxlY3RPcHRpb24pOiBzdHJpbmcgfCBudW1iZXIge1xyXG4gICAgcmV0dXJuIGAke29wdGlvbi5pZH0tJHtvcHRpb24ubmFtZX1gO1xyXG4gIH1cclxuXHJcbiAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XHJcbiAgICB0aGlzLnNlYXJjaERlYm91bmNlPy51bnN1YnNjcmliZSgpO1xyXG4gICAgdGhpcy5ibHVyVGltZXI/LnVuc3Vic2NyaWJlKCk7XHJcbiAgICB0aGlzLmRlc3Ryb3kkLm5leHQodHJ1ZSk7XHJcbiAgICB0aGlzLmRlc3Ryb3kkLmNvbXBsZXRlKCk7XHJcbiAgfVxyXG59XHJcbiIsIjxkaXZcclxuICBjbGFzcz1cImllZWVzYS1vcmctbXVsdGktc2VsZWN0XCJcclxuICBbY2xhc3MuaWVlZXNhLW9yZy1tdWx0aS1zZWxlY3QtLWludmFsaWRdPVwic2hvd1JlcXVpcmVkRXJyb3IgfHwgZXJyb3JNZXNzYWdlXCJcclxuPlxyXG4gIDxsYWJlbCBjbGFzcz1cImllZWVzYS1vcmctbXVsdGktc2VsZWN0X19sYWJlbCBpZWVlc2EtYm9keS1zbS0xNFwiPlxyXG4gICAge3sgbGFiZWwgfX1cclxuICA8L2xhYmVsPlxyXG5cclxuICA8ZGl2IGNsYXNzPVwiaWVlZXNhLW9yZy1tdWx0aS1zZWxlY3RfX2ZpZWxkXCI+XHJcbiAgICA8IS0tXHJcbiAgICAgIENoaXBzIGFuZCB0aGUgc2VhcmNoIGlucHV0IGZsb3cgdG9nZXRoZXIgaW5saW5lIChsaWtlIHRoZSBNYXRlcmlhbFxyXG4gICAgICBjaGlwLWdyaWQpLiBUaGlzIGtlZXBzIGEgc2luZ2xlLXJvdyBmaWVsZCBhcHBlYXJhbmNlIHRoYXQgZ3Jvd3MgYXMgY2hpcHNcclxuICAgICAgd3JhcCwgd2l0aCB0aGUgY2xlYXItYWxsIGJ1dHRvbiBwaW5uZWQgdG8gdGhlIHJpZ2h0IGFzIGEgc3VmZml4LlxyXG4gICAgLS0+XHJcbiAgICA8ZGl2IGNsYXNzPVwiaWVlZXNhLW9yZy1tdWx0aS1zZWxlY3RfX2NvbnRyb2xcIj5cclxuICAgICAgPHNwYW5cclxuICAgICAgICBjbGFzcz1cImllZWVzYS1vcmctbXVsdGktc2VsZWN0X19jaGlwXCJcclxuICAgICAgICAqbmdGb3I9XCJsZXQgb3B0aW9uIG9mIHNlbGVjdGVkT3B0aW9uczsgdHJhY2tCeTogdHJhY2tCeUZuXCJcclxuICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cIm9wdGlvbi5uYW1lXCJcclxuICAgICAgPlxyXG4gICAgICAgIDxzcGFuIGNsYXNzPVwiaWVlZXNhLW9yZy1tdWx0aS1zZWxlY3RfX2NoaXAtbGFiZWxcIj5cclxuICAgICAgICAgIHt7IG9wdGlvbi5uYW1lIH19XHJcbiAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgIDxidXR0b25cclxuICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxyXG4gICAgICAgICAgY2xhc3M9XCJpZWVlc2Etb3JnLW11bHRpLXNlbGVjdF9fY2hpcC1yZW1vdmVcIlxyXG4gICAgICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCInUmVtb3ZlICcgKyBvcHRpb24ubmFtZVwiXHJcbiAgICAgICAgICAoY2xpY2spPVwicmVtb3ZlT3B0aW9uKG9wdGlvbilcIlxyXG4gICAgICAgID5cclxuICAgICAgICAgIDxzdmdcclxuICAgICAgICAgICAgY2xhc3M9XCJpZWVlc2Etb3JnLW11bHRpLXNlbGVjdF9fY2hpcC1yZW1vdmUtaWNvblwiXHJcbiAgICAgICAgICAgICpuZ0lmPVwicmVtb3ZlSWNvblVSTFwiXHJcbiAgICAgICAgICA+XHJcbiAgICAgICAgICAgIDx1c2UgW2F0dHIueGxpbms6aHJlZl09XCJyZW1vdmVJY29uVVJMXCI+PC91c2U+XHJcbiAgICAgICAgICA8L3N2Zz5cclxuICAgICAgICAgIDxzcGFuICpuZ0lmPVwiIXJlbW92ZUljb25VUkxcIiBhcmlhLWhpZGRlbj1cInRydWVcIj4mdGltZXM7PC9zcGFuPlxyXG4gICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICA8L3NwYW4+XHJcblxyXG4gICAgICA8aW5wdXRcclxuICAgICAgICAjc2VhcmNoSW5wdXRcclxuICAgICAgICB0eXBlPVwidGV4dFwiXHJcbiAgICAgICAgY2xhc3M9XCJpZWVlc2Etb3JnLW11bHRpLXNlbGVjdF9faW5wdXQgaWVlZXNhLXRpdGxlLXNtLTE2XCJcclxuICAgICAgICByb2xlPVwiY29tYm9ib3hcIlxyXG4gICAgICAgIGFyaWEtaGFzcG9wdXA9XCJsaXN0Ym94XCJcclxuICAgICAgICBbYXR0ci5hcmlhLWV4cGFuZGVkXT1cImlzRHJvcGRvd25PcGVuXCJcclxuICAgICAgICBbYXR0ci5hcmlhLWNvbnRyb2xzXT1cIm9wdGlvbklkUHJlZml4ICsgJ2xpc3Rib3gnXCJcclxuICAgICAgICBbYXR0ci5hcmlhLWFjdGl2ZWRlc2NlbmRhbnRdPVwiXHJcbiAgICAgICAgICBpc0Ryb3Bkb3duT3BlbiAmJiBhY3RpdmVPcHRpb25JbmRleCA+PSAwXHJcbiAgICAgICAgICAgID8gb3B0aW9uSWRQcmVmaXggKyBhY3RpdmVPcHRpb25JbmRleFxyXG4gICAgICAgICAgICA6IG51bGxcclxuICAgICAgICBcIlxyXG4gICAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwiYXJpYUxhYmVsXCJcclxuICAgICAgICBbcGxhY2Vob2xkZXJdPVwicGxhY2Vob2xkZXJcIlxyXG4gICAgICAgIFt2YWx1ZV09XCJzZWFyY2hUZXh0XCJcclxuICAgICAgICAoaW5wdXQpPVwib25JbnB1dCgkZXZlbnQpXCJcclxuICAgICAgICAoZm9jdXMpPVwib25Gb2N1cygpXCJcclxuICAgICAgICAoa2V5ZG93bik9XCJvbktleWRvd24oJGV2ZW50KVwiXHJcbiAgICAgICAgKGJsdXIpPVwib25CbHVyKClcIlxyXG4gICAgICAvPlxyXG4gICAgPC9kaXY+XHJcblxyXG4gICAgPGJ1dHRvblxyXG4gICAgICB0eXBlPVwiYnV0dG9uXCJcclxuICAgICAgY2xhc3M9XCJpZWVlc2Etb3JnLW11bHRpLXNlbGVjdF9fY2xlYXItYWxsXCJcclxuICAgICAgW21hdFRvb2x0aXBdPVwiJ0NsZWFyIGFsbCdcIlxyXG4gICAgICBhcmlhLWxhYmVsPVwiQ2xlYXIgYWxsXCJcclxuICAgICAgKm5nSWY9XCJzZWxlY3RlZE9wdGlvbnMubGVuZ3RoXCJcclxuICAgICAgKGNsaWNrKT1cImNsZWFyQWxsKClcIlxyXG4gICAgPlxyXG4gICAgICA8c3ZnXHJcbiAgICAgICAgY2xhc3M9XCJpZWVlc2Etb3JnLW11bHRpLXNlbGVjdF9fY2xlYXItYWxsLWljb25cIlxyXG4gICAgICAgICpuZ0lmPVwiY2xlYXJBbGxJY29uVVJMXCJcclxuICAgICAgPlxyXG4gICAgICAgIDx1c2UgW2F0dHIueGxpbms6aHJlZl09XCJjbGVhckFsbEljb25VUkxcIj48L3VzZT5cclxuICAgICAgPC9zdmc+XHJcbiAgICAgIDxzcGFuICpuZ0lmPVwiIWNsZWFyQWxsSWNvblVSTFwiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPiZ0aW1lczs8L3NwYW4+XHJcbiAgICA8L2J1dHRvbj5cclxuXHJcbiAgICA8IS0tXHJcbiAgICAgIEN1c3RvbSByZXN1bHRzIGRyb3Bkb3duLiBGdWxseSBvd25lZCAobm90IG1hdC1hdXRvY29tcGxldGUpIHNvIGEgcGljayBuZXZlclxyXG4gICAgICBjbG9zZXMgdGhlIHBhbmVsIG9yIG92ZXJ3cml0ZXMgdGhlIHR5cGVkIHRleHQuIG1vdXNlZG93biBpcyBwcmV2ZW50ZWQgc29cclxuICAgICAgY2xpY2tpbmcgYSByb3cgZG9lcyBub3QgYmx1ciB0aGUgaW5wdXQgYmVmb3JlIHRoZSBjbGljayByZWdpc3RlcnMuXHJcbiAgICAtLT5cclxuICAgIDxkaXZcclxuICAgICAgY2xhc3M9XCJpZWVlc2Etb3JnLW11bHRpLXNlbGVjdF9fZHJvcGRvd25cIlxyXG4gICAgICByb2xlPVwibGlzdGJveFwiXHJcbiAgICAgIFtpZF09XCJvcHRpb25JZFByZWZpeCArICdsaXN0Ym94J1wiXHJcbiAgICAgIGFyaWEtbXVsdGlzZWxlY3RhYmxlPVwidHJ1ZVwiXHJcbiAgICAgICpuZ0lmPVwiaXNEcm9wZG93bk9wZW4gJiYgb3B0aW9ucy5sZW5ndGhcIlxyXG4gICAgICAobW91c2Vkb3duKT1cIiRldmVudC5wcmV2ZW50RGVmYXVsdCgpXCJcclxuICAgID5cclxuICAgICAgPGRpdlxyXG4gICAgICAgIGNsYXNzPVwiaWVlZXNhLW9yZy1tdWx0aS1zZWxlY3RfX29wdGlvblwiXHJcbiAgICAgICAgcm9sZT1cIm9wdGlvblwiXHJcbiAgICAgICAgKm5nRm9yPVwibGV0IG9wdGlvbiBvZiBvcHRpb25zOyBsZXQgaSA9IGluZGV4OyB0cmFja0J5OiB0cmFja0J5Rm5cIlxyXG4gICAgICAgIFtpZF09XCJvcHRpb25JZFByZWZpeCArIGlcIlxyXG4gICAgICAgIFthdHRyLmFyaWEtc2VsZWN0ZWRdPVwiaXNTZWxlY3RlZChvcHRpb24pXCJcclxuICAgICAgICBbY2xhc3MuaWVlZXNhLW9yZy1tdWx0aS1zZWxlY3RfX29wdGlvbi0tc2VsZWN0ZWRdPVwiaXNTZWxlY3RlZChvcHRpb24pXCJcclxuICAgICAgICBbY2xhc3MuaWVlZXNhLW9yZy1tdWx0aS1zZWxlY3RfX29wdGlvbi0tYWN0aXZlXT1cImlzQWN0aXZlT3B0aW9uKGkpXCJcclxuICAgICAgICAoY2xpY2spPVwidG9nZ2xlT3B0aW9uKG9wdGlvbilcIlxyXG4gICAgICAgIChtb3VzZWVudGVyKT1cImFjdGl2ZU9wdGlvbkluZGV4ID0gaVwiXHJcbiAgICAgID5cclxuICAgICAgICA8bWF0LWNoZWNrYm94XHJcbiAgICAgICAgICBjb2xvcj1cInByaW1hcnlcIlxyXG4gICAgICAgICAgW2NoZWNrZWRdPVwiaXNTZWxlY3RlZChvcHRpb24pXCJcclxuICAgICAgICAgIChjbGljayk9XCIkZXZlbnQucHJldmVudERlZmF1bHQoKVwiXHJcbiAgICAgICAgPjwvbWF0LWNoZWNrYm94PlxyXG4gICAgICAgIDxzcGFuXHJcbiAgICAgICAgICBjbGFzcz1cImllZWVzYS1vcmctbXVsdGktc2VsZWN0X19vcHRpb24tbGFiZWwgaWVlZXNhLXRpdGxlLXNtLTE2XCJcclxuICAgICAgICA+XHJcbiAgICAgICAgICB7eyBvcHRpb24ubmFtZSB9fVxyXG4gICAgICAgIDwvc3Bhbj5cclxuICAgICAgPC9kaXY+XHJcbiAgICA8L2Rpdj5cclxuICA8L2Rpdj5cclxuXHJcbiAgPCEtLSBJbmxpbmUgZnJlZS10ZXh0IHZhbGlkYXRpb24gZXJyb3IgKEVudGVyIHBhdGgpIC0tPlxyXG4gIDxwXHJcbiAgICBjbGFzcz1cImllZWVzYS1vcmctbXVsdGktc2VsZWN0X19lcnJvciBpZWVlc2EtYm9keS1zbS0xNFwiXHJcbiAgICAqbmdJZj1cImVycm9yTWVzc2FnZVwiXHJcbiAgPlxyXG4gICAge3sgZXJyb3JNZXNzYWdlIH19XHJcbiAgPC9wPlxyXG5cclxuICA8IS0tIFJlcXVpcmVkIGVycm9yICh0b3VjaGVkLCBub3RoaW5nIHNlbGVjdGVkKSAtLT5cclxuICA8cFxyXG4gICAgY2xhc3M9XCJpZWVlc2Etb3JnLW11bHRpLXNlbGVjdF9fZXJyb3IgaWVlZXNhLWJvZHktc20tMTRcIlxyXG4gICAgKm5nSWY9XCJzaG93UmVxdWlyZWRFcnJvciAmJiAhZXJyb3JNZXNzYWdlXCJcclxuICA+XHJcbiAgICB7eyBhZGRVc2VyUm9zdGVyVGV4dHM/Lm1lc3NhZ2U/LmVycm9yPy5yZXF1aXJlZCB9fVxyXG4gIDwvcD5cclxuXHJcbiAgPCEtLSBTdXBwb3J0L2hlbHAgdGV4dCAtLT5cclxuICA8cFxyXG4gICAgY2xhc3M9XCJpZWVlc2Etb3JnLW11bHRpLXNlbGVjdF9fc3VwcG9ydCBpZWVlc2EtYm9keS1zbS0xNFwiXHJcbiAgICAqbmdJZj1cInN1cHBvcnRNZXNzYWdlICYmICFlcnJvck1lc3NhZ2UgJiYgIXNob3dSZXF1aXJlZEVycm9yXCJcclxuICA+XHJcbiAgICB7eyBzdXBwb3J0TWVzc2FnZSB9fVxyXG4gIDwvcD5cclxuPC9kaXY+XHJcbiJdfQ==