@ieeesa-npm/groups 0.15.9 → 0.15.11

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 (36) hide show
  1. package/esm2022/lib/assets/constants.json +87 -4
  2. package/esm2022/lib/components/interest-form/interest-form.component.mjs +104 -0
  3. package/esm2022/lib/components/interest-form-management/interest-form-management.component.mjs +63 -0
  4. package/esm2022/lib/components/interested-rosters/interested-rosters.component.mjs +28 -0
  5. package/esm2022/lib/components/roster-import/roster-import.component.mjs +243 -84
  6. package/esm2022/lib/components/roster-import-history/roster-import-history.component.mjs +232 -0
  7. package/esm2022/lib/components/tree-view/tree-view.component.mjs +26 -5
  8. package/esm2022/lib/components/view-roster/view-roster.component.mjs +10 -3
  9. package/esm2022/lib/groups.component.mjs +82 -6
  10. package/esm2022/lib/models/group-action.model.mjs +2 -1
  11. package/esm2022/lib/models/group-function-type.model.mjs +2 -1
  12. package/esm2022/lib/models/permission-type.model.mjs +2 -1
  13. package/esm2022/lib/models/roster-import.model.mjs +34 -17
  14. package/esm2022/lib/services/groups.service.mjs +24 -1
  15. package/esm2022/lib/services/roster-import-api.service.mjs +174 -0
  16. package/esm2022/public-api.mjs +6 -1
  17. package/fesm2022/ieeesa-npm-groups.mjs +1081 -213
  18. package/fesm2022/ieeesa-npm-groups.mjs.map +1 -1
  19. package/lib/components/interest-form/interest-form.component.d.ts +75 -0
  20. package/lib/components/interest-form-management/interest-form-management.component.d.ts +31 -0
  21. package/lib/components/interested-rosters/interested-rosters.component.d.ts +17 -0
  22. package/lib/components/roster-import/roster-import.component.d.ts +116 -37
  23. package/lib/components/roster-import-history/roster-import-history.component.d.ts +102 -0
  24. package/lib/components/tree-view/tree-view.component.d.ts +6 -3
  25. package/lib/components/view-roster/view-roster.component.d.ts +5 -0
  26. package/lib/groups.component.d.ts +31 -1
  27. package/lib/models/group-action.model.d.ts +2 -1
  28. package/lib/models/group-function-type.model.d.ts +2 -1
  29. package/lib/models/permission-type.model.d.ts +2 -1
  30. package/lib/models/roster-import.model.d.ts +107 -21
  31. package/lib/services/groups.service.d.ts +24 -0
  32. package/lib/services/roster-import-api.service.d.ts +108 -0
  33. package/package.json +1 -1
  34. package/public-api.d.ts +5 -0
  35. package/esm2022/lib/assets/roster-import-mocks.mjs +0 -98
  36. package/lib/assets/roster-import-mocks.d.ts +0 -27
@@ -2,30 +2,39 @@ import { Component, EventEmitter, Input, Output, ViewEncapsulation, } from '@ang
2
2
  import { CommonModule } from '@angular/common';
3
3
  import { MatButtonModule } from '@angular/material/button';
4
4
  import { MatProgressBarModule } from '@angular/material/progress-bar';
5
- import { interval, Subject, timer, takeUntil, takeWhile } from 'rxjs';
6
- import { RosterImportMockScenario, } from '../../models/roster-import.model';
7
- import { RosterImportMocks } from '../../assets/roster-import-mocks';
5
+ import { Subject, switchMap, takeUntil } from 'rxjs';
8
6
  import * as constants from '../../assets/constants.json';
9
7
  import * as i0 from "@angular/core";
10
- import * as i1 from "@angular/common";
11
- import * as i2 from "@angular/material/button";
12
- import * as i3 from "@angular/material/progress-bar";
13
- /** Simulated processing duration (ms) for the mock flow. */
14
- const MOCK_PROCESSING_MS = 1800;
8
+ import * as i1 from "../../services/roster-import-api.service";
9
+ import * as i2 from "../../services/groups.service";
10
+ import * as i3 from "@angular/common";
11
+ import * as i4 from "@angular/material/button";
12
+ import * as i5 from "@angular/material/progress-bar";
15
13
  /**
16
- * Roster Import dialog (MOCK data phase).
14
+ * Roster Import dialog.
17
15
  *
18
- * Lets an admin upload a CSV/XLS/XLSX roster file, shows a processing progress
16
+ * Lets an admin upload a CSV/XLSX roster file, shows a processing progress
19
17
  * bar, then a result summary (added / skipped) with per-row errors and an
20
- * error-log download. Mirrors the events-and-meetings bulk-import-participants
21
- * flow. The real backend is not wired yet — {@link onImport} resolves a mock
22
- * response after a short delay so every Figma state can be exercised.
18
+ * error-log download.
19
+ *
20
+ * Wired to the real backend roster-import state machine
21
+ * (sa-saapps-groups-api `RosterImportController`) via
22
+ * {@link RosterImportApiService}: on Import it runs
23
+ * upload → validate → confirm and renders the confirmed job's terminal counts
24
+ * and per-row errors. Server-side validation errors (1072 unsupported format,
25
+ * 1073 too large, 1074 row limit, 1075 invalid status) are surfaced inline.
23
26
  *
24
27
  * @export
25
28
  * @class RosterImportComponent
26
29
  */
27
30
  export class RosterImportComponent {
28
- constructor() {
31
+ constructor(
32
+ // eslint-disable-next-line no-unused-vars
33
+ rosterImportApiService,
34
+ // eslint-disable-next-line no-unused-vars
35
+ groupService) {
36
+ this.rosterImportApiService = rosterImportApiService;
37
+ this.groupService = groupService;
29
38
  /** Emitted after an import that added at least one row (parent refreshes). */
30
39
  // eslint-disable-next-line @typescript-eslint/no-explicit-any
31
40
  this.submitFormResponse = new EventEmitter();
@@ -41,9 +50,7 @@ export class RosterImportComponent {
41
50
  this.selectedFile = null;
42
51
  /** File drag-over state. */
43
52
  this.isDragOver = false;
44
- /** Processing progress percentage (0–100) shown next to the progress bar. */
45
- this.progressValue = 0;
46
- /** Terminal upload result (mock). */
53
+ /** Terminal upload result. */
47
54
  this.uploadResult = null;
48
55
  /** Row-level errors for the completed job. */
49
56
  this.jobErrors = [];
@@ -54,31 +61,101 @@ export class RosterImportComponent {
54
61
  * (Figma: "No roster data found...").
55
62
  */
56
63
  this.noDataMessage = null;
57
- /** Maximum file size in bytes (5 MB). */
58
- this.MAX_FILE_SIZE = 5242880;
59
- /** Accepted file extensions. */
60
- this.ACCEPTED_EXTENSIONS = ['.csv', '.xls', '.xlsx'];
61
- /**
62
- * MOCK ONLY: which scenario the next import simulates. Cycles through the
63
- * scenarios so QA can see every result state by importing repeatedly. Remove
64
- * when the real API is wired in.
65
- */
66
- this.mockScenarios = [
67
- RosterImportMockScenario.ALL_SUCCESS,
68
- RosterImportMockScenario.PARTIAL,
69
- RosterImportMockScenario.ALL_SKIPPED,
70
- RosterImportMockScenario.EMPTY,
71
- ];
72
- this.mockScenarioIndex = 0;
64
+ /** The import job id returned by upload (kept so cancel can clean it up). */
65
+ this.importId = null;
66
+ /** Maximum file size in bytes (10 MB) — matches the BE 10MB limit. */
67
+ this.MAX_FILE_SIZE = 10485760;
68
+ /** Accepted file extensions (must match the BE contract: only .csv / .xlsx). */
69
+ this.ACCEPTED_EXTENSIONS = ['.csv', '.xlsx'];
73
70
  }
74
- /** Required column headers for display. */
71
+ /**
72
+ * Required column headers for display and the sample file. This is the static
73
+ * base set from constants PLUS any tenant-level required profile fields the
74
+ * host app configured (e.g. phone / address / employer), mapped to friendly
75
+ * headers and de-duplicated (case-insensitive) against the base columns.
76
+ * @return {string[]}
77
+ */
75
78
  get requiredColumns() {
76
- return this.screenTexts?.requiredColumns ?? [];
79
+ const base = this.screenTexts?.requiredColumns ?? [];
80
+ return this.mergeTenantColumns(base);
81
+ }
82
+ /**
83
+ * Appends the tenant-configured columns (from {@link tenantExtraColumns}) to
84
+ * the base column headers.
85
+ * @param {string[]} base - The static base column headers.
86
+ * @return {string[]}
87
+ * @memberof RosterImportComponent
88
+ */
89
+ mergeTenantColumns(base) {
90
+ const extras = this.tenantExtraColumns(base);
91
+ return extras.length ? [...base, ...extras.map((c) => c.label)] : base;
92
+ }
93
+ /**
94
+ * Resolves the tenant-configured required profile fields into the EXTRA
95
+ * columns to append after the base set — the single source of truth shared by
96
+ * both the header list ({@link requiredColumns}) and the sample file
97
+ * ({@link downloadSampleFile}) so the two never drift out of alignment.
98
+ *
99
+ * Each field becomes one column with its friendly `label` (known keys use the
100
+ * label map; unknown keys fall back to a title-cased key) and a `sampleValue`
101
+ * for the sample row. Fields whose label already exists in the base set
102
+ * (case-insensitive) are skipped so a tenant field like "employer" that is
103
+ * already a base column is not duplicated.
104
+ * @param {string[]} base - The static base column headers.
105
+ * @return {{ label: string; sampleValue: string }[]}
106
+ * @memberof RosterImportComponent
107
+ */
108
+ tenantExtraColumns(base) {
109
+ const tenantFields = this.groupService?.getRequiredProfileFields() ?? [];
110
+ if (!tenantFields.length) {
111
+ return [];
112
+ }
113
+ const sampleMap = this.screenTexts?.tenantFieldSampleValues ?? {};
114
+ const seen = new Set(base.map((col) => col.toLowerCase()));
115
+ const extras = [];
116
+ tenantFields.forEach((field) => {
117
+ const label = this.tenantFieldLabel(field);
118
+ if (label && !seen.has(label.toLowerCase())) {
119
+ seen.add(label.toLowerCase());
120
+ extras.push({ label, sampleValue: sampleMap[field] ?? '' });
121
+ }
122
+ });
123
+ return extras;
124
+ }
125
+ /**
126
+ * Maps a tenant field key to its display header. Known keys use the configured
127
+ * label map; unknown keys fall back to a title-cased key.
128
+ * @param {string} field - The tenant field key (e.g. 'phone').
129
+ * @return {string}
130
+ * @memberof RosterImportComponent
131
+ */
132
+ tenantFieldLabel(field) {
133
+ const labels = this.screenTexts?.tenantFieldLabels ?? {};
134
+ if (labels[field]) {
135
+ return labels[field];
136
+ }
137
+ // Fallback: "phone_number" -> "Phone Number".
138
+ return field
139
+ .replace(/[_-]+/g, ' ')
140
+ .replace(/\b\w/g, (char) => char.toUpperCase());
77
141
  }
78
142
  /** Comma-separated accepted file types for the input element. */
79
143
  get acceptedFileTypes() {
80
144
  return this.ACCEPTED_EXTENSIONS.join(',');
81
145
  }
146
+ /** The target group id from the dialog payload (falls back to selection). */
147
+ get groupId() {
148
+ return (this.componentData?.groupId ??
149
+ this.groupService?.getSelectedGroupInfo()?.groupId ??
150
+ '');
151
+ }
152
+ /**
153
+ * Sets the API base URL on the import service.
154
+ * @memberof RosterImportComponent
155
+ */
156
+ ngOnInit() {
157
+ this.rosterImportApiService.setApiBaseUrl(this.groupService?.apiBaseUrl);
158
+ }
82
159
  /**
83
160
  * Cleans up subscriptions when the component is destroyed.
84
161
  * @memberof RosterImportComponent
@@ -151,6 +228,7 @@ export class RosterImportComponent {
151
228
  this.errorMessage = null;
152
229
  this.noDataMessage = null;
153
230
  this.uploadResult = null;
231
+ this.importId = null;
154
232
  // Clear any previously selected (valid) file so an invalid new selection
155
233
  // can't leave the Import button enabled for a stale file.
156
234
  this.selectedFile = null;
@@ -171,7 +249,7 @@ export class RosterImportComponent {
171
249
  if (file.size > this.MAX_FILE_SIZE) {
172
250
  this.errorMessage =
173
251
  this.screenTexts?.validation?.fileTooLarge ??
174
- 'File size exceeds the maximum allowed size of 5 MB.';
252
+ 'File size exceeds the maximum allowed size of 10MB.';
175
253
  return;
176
254
  }
177
255
  this.selectedFile = file;
@@ -194,60 +272,141 @@ export class RosterImportComponent {
194
272
  this.errorMessage = null;
195
273
  this.noDataMessage = null;
196
274
  this.uploadResult = null;
275
+ this.importId = null;
197
276
  this.importState = 'upload';
198
277
  }
199
278
  /**
200
- * MOCK: "uploads" the file by simulating a short processing delay, then
201
- * resolves the next mock scenario. Replace the timer + mock lookup with the
202
- * real service call once the API is available.
279
+ * Runs the real import: upload → validate → confirm. The progress bar is
280
+ * shown in indeterminate mode while the chain is in flight, then the
281
+ * confirmed job's terminal counts + per-row errors drive the result screen.
203
282
  * @memberof RosterImportComponent
204
283
  */
205
284
  onImport() {
206
285
  if (!this.selectedFile) {
207
286
  return;
208
287
  }
288
+ if (!this.groupId) {
289
+ this.errorMessage =
290
+ this.screenTexts?.validation?.uploadFailed ??
291
+ 'An error occurred while importing the roster. Please try again.';
292
+ return;
293
+ }
209
294
  this.errorMessage = null;
210
295
  this.noDataMessage = null;
211
296
  this.uploadResult = null;
212
297
  this.jobErrors = [];
213
- this.progressValue = 0;
298
+ this.importId = null;
214
299
  this.importState = 'processing';
215
- const scenario = this.nextMockScenario();
216
- // MOCK: animate the progress bar from 0 → 100 over the processing window,
217
- // then finalize with the mock result. Replace with real upload progress /
218
- // job-status polling once the API is available.
219
- const steps = 20;
220
- const stepMs = MOCK_PROCESSING_MS / steps;
221
- interval(stepMs)
222
- .pipe(takeWhile(() => this.progressValue < 100), takeUntil(this.destroy$))
223
- .subscribe(() => {
224
- this.progressValue = Math.min(100, this.progressValue + 100 / steps);
225
- });
226
- timer(MOCK_PROCESSING_MS)
227
- .pipe(takeUntil(this.destroy$))
228
- .subscribe(() => {
229
- this.progressValue = 100;
230
- const response = RosterImportMocks.getMockResponse(scenario);
231
- this.finalizeResult(response);
300
+ this.rosterImportApiService
301
+ .uploadImportFile(this.selectedFile, this.groupId)
302
+ .pipe(switchMap((job) => {
303
+ this.importId = job?.importId ?? null;
304
+ return this.rosterImportApiService.validateImportJob(this.importId);
305
+ }), switchMap(() => this.rosterImportApiService.confirmImportJob(this.importId)), takeUntil(this.destroy$))
306
+ .subscribe({
307
+ next: (confirmedJob) => {
308
+ this.finalizeResult(confirmedJob);
309
+ },
310
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
311
+ error: (error) => {
312
+ this.handleImportError(error);
313
+ },
232
314
  });
233
315
  }
234
316
  /**
235
- * Stores the terminal result and moves to the result state. When the file
236
- * had no data rows, shows the "no roster data" info banner instead of the
237
- * summary cards.
238
- * @param {RosterUploadResponse} body - The terminal (mock) result.
317
+ * Maps a failed import call to an inline error message and returns the UI to
318
+ * the upload state so the user can retry. Known BE error codes (1072–1075)
319
+ * are mapped via constants; anything else uses the generic message.
320
+ * @param {*} error - The HttpErrorResponse.
321
+ * @memberof RosterImportComponent
322
+ */
323
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
324
+ handleImportError(error) {
325
+ this.importState = 'upload';
326
+ // BE error codes take priority when present (e.g. 1071 no permission, 1072
327
+ // format, 1073 too large, 1074 row limit, 1075 invalid status).
328
+ const errorCodes = error?.error?.body?.errorCodes;
329
+ if (Array.isArray(errorCodes) && errorCodes.length) {
330
+ const code = errorCodes[0];
331
+ this.errorMessage =
332
+ this.constants?.errors?.[code] ??
333
+ this.screenTexts?.validation?.uploadFailed ??
334
+ 'An error occurred while importing the roster. Please try again.';
335
+ return;
336
+ }
337
+ // A 403 with no error-code body comes from the endpoint's @PreAuthorize
338
+ // (the user lacks Manage Group Member / Manage All Rosters for this group).
339
+ // Show the permission message — retrying will not help.
340
+ const status = error?.status ?? error?.error?.status;
341
+ if (status === 403) {
342
+ this.errorMessage =
343
+ this.screenTexts?.validation?.forbidden ??
344
+ 'You do not have permission to import a roster for this group.';
345
+ return;
346
+ }
347
+ this.errorMessage =
348
+ this.screenTexts?.validation?.uploadFailed ??
349
+ 'An error occurred while importing the roster. Please try again.';
350
+ }
351
+ /**
352
+ * Stores the terminal result and moves to the result state. When the job had
353
+ * no data rows, shows the "no roster data" info banner instead of the summary
354
+ * cards.
355
+ * @param {RosterImportJob} job - The confirmed import job.
239
356
  * @memberof RosterImportComponent
240
357
  */
241
- finalizeResult(body) {
242
- this.uploadResult = body;
243
- this.jobErrors = body.rowErrors ?? [];
358
+ finalizeResult(job) {
359
+ const totalRecords = job?.totalRows ?? 0;
360
+ const successCount = job?.successRows ?? 0;
361
+ const failureCount = job?.failedRows ?? 0;
362
+ this.uploadResult = { totalRecords, successCount, failureCount };
363
+ this.jobErrors = this.parseErrorReport(job?.errorReport);
244
364
  this.importState = 'result';
245
- if (body.totalRecords === 0) {
365
+ if (totalRecords === 0) {
246
366
  this.noDataMessage =
247
367
  this.screenTexts?.validation?.noDataRecords ??
248
368
  'No roster data found. The selected file contains headers but no roster records.';
249
369
  }
250
370
  }
371
+ /**
372
+ * Normalizes the BE `error_report` into row-error view models.
373
+ *
374
+ * The BE wraps the per-row entries in a `{ rows: [ { row, field, message } ] }`
375
+ * document, but that value has been observed to arrive in MULTIPLE shapes:
376
+ * - a parsed object `{ rows: [...] }` (confirm response — the common case),
377
+ * - a raw JSON string of the same object (JSONB passthrough), or
378
+ * - a bare array `[ { row, field, message } ]`.
379
+ * This handles all three (and `null`) so the error log renders regardless of
380
+ * how the field is serialized.
381
+ * @param {*} errorReport - The BE error_report (object, string, array, or null).
382
+ * @return {RosterImportRowError[]}
383
+ * @memberof RosterImportComponent
384
+ */
385
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
386
+ parseErrorReport(errorReport) {
387
+ if (!errorReport) {
388
+ return [];
389
+ }
390
+ // If it's a string, parse it first; on parse failure, no row errors.
391
+ let value = errorReport;
392
+ if (typeof errorReport === 'string') {
393
+ try {
394
+ value = JSON.parse(errorReport);
395
+ }
396
+ catch {
397
+ return [];
398
+ }
399
+ }
400
+ // Accept either a bare array or a { rows: [...] } wrapper object.
401
+ const entries = Array.isArray(value)
402
+ ? value
403
+ : (value?.rows ?? []);
404
+ return entries.map((entry) => ({
405
+ rowNumber: entry?.row,
406
+ field: entry?.field,
407
+ errorMessage: entry?.message,
408
+ }));
409
+ }
251
410
  /**
252
411
  * Whether the result state should show the summary cards (added / skipped).
253
412
  * Hidden for the "no data records" case.
@@ -274,10 +433,22 @@ export class RosterImportComponent {
274
433
  * @memberof RosterImportComponent
275
434
  */
276
435
  downloadSampleFile() {
277
- const headers = this.requiredColumns
436
+ const headerLine = this.requiredColumns
278
437
  .map((col) => this.toCsvCell(col))
279
438
  .join(',');
280
- const blob = new Blob([headers + '\r\n'], {
439
+ // Sample data rows so the downloaded file shows the expected format, not
440
+ // just the column headers. The base row values come from constants; sample
441
+ // values for any tenant-configured columns are appended (from the SAME
442
+ // source that builds the headers) so every row lines up with the
443
+ // (base + tenant) header set.
444
+ const base = this.screenTexts?.requiredColumns ?? [];
445
+ const baseSampleRows = this.screenTexts?.sampleRows ?? [];
446
+ const tenantSampleCells = this.tenantExtraColumns(base).map((col) => col.sampleValue);
447
+ const dataLines = baseSampleRows.map((row) => [...row, ...tenantSampleCells]
448
+ .map((cell) => this.toCsvCell(cell))
449
+ .join(','));
450
+ const csvContent = [headerLine, ...dataLines].join('\r\n') + '\r\n';
451
+ const blob = new Blob([csvContent], {
281
452
  type: 'text/csv;charset=utf-8;',
282
453
  });
283
454
  const fileName = this.screenTexts?.sampleFileName ?? 'Roster_Sample.csv';
@@ -348,29 +519,17 @@ export class RosterImportComponent {
348
519
  link.click();
349
520
  URL.revokeObjectURL(url);
350
521
  }
351
- /**
352
- * MOCK ONLY: returns the next scenario in the cycle so repeated imports show
353
- * every result state.
354
- * @return {RosterImportMockScenario}
355
- * @memberof RosterImportComponent
356
- */
357
- nextMockScenario() {
358
- const scenario = this.mockScenarios[this.mockScenarioIndex];
359
- this.mockScenarioIndex =
360
- (this.mockScenarioIndex + 1) % this.mockScenarios.length;
361
- return scenario;
362
- }
363
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: RosterImportComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
364
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: RosterImportComponent, isStandalone: true, selector: "ieeesa-roster-import", inputs: { componentData: "componentData" }, outputs: { submitFormResponse: "submitFormResponse", formCancel: "formCancel" }, ngImport: i0, template: "<div class=\"ieeesa-roster-import\">\r\n <!-- Sub-heading band: \"Bulk Import Participants\" on the left, Import Roster\r\n action on the right (appears once a file is selected) \u2014 matches the Figma.\r\n The \"\u2190 Back to Rosters / Import Roster\" title row + X are rendered by the\r\n shared ModalComponent above this. -->\r\n <div class=\"ieeesa-roster-import__subheader\">\r\n <span class=\"ieeesa-roster-import__subheader-title\">\r\n {{ screenTexts?.subHeading ?? 'Bulk Import Participants' }}\r\n </span>\r\n <button\r\n *ngIf=\"selectedFile\"\r\n mat-button\r\n type=\"button\"\r\n class=\"mat-tertiary-button ieeesa-roster-import__import-btn\"\r\n [disabled]=\"importState === 'processing'\"\r\n (click)=\"onImport()\"\r\n [attr.aria-label]=\"screenTexts?.buttons?.import ?? 'Import Roster'\"\r\n >\r\n <svg class=\"ieeesa-roster-import__import-btn-icon\" width=\"14\" height=\"14\" aria-hidden=\"true\">\r\n <use xlink:href=\"assets/images/sprites/sprites.svg#icon-import\"></use>\r\n </svg>\r\n {{ screenTexts?.buttons?.import ?? 'Import Roster' }}\r\n </button>\r\n </div>\r\n\r\n <!-- Required Columns Info -->\r\n <div class=\"ieeesa-roster-import__columns-card\">\r\n <div class=\"ieeesa-roster-import__columns-content\">\r\n <p class=\"ieeesa-roster-import__columns-title\">\r\n {{ screenTexts?.requiredColumnsTitle ?? 'Required columns' }}\r\n </p>\r\n <div class=\"ieeesa-roster-import__columns-chips\">\r\n <span\r\n *ngFor=\"let col of requiredColumns\"\r\n class=\"ieeesa-roster-import__chip\"\r\n >\r\n {{ col }}\r\n </span>\r\n </div>\r\n </div>\r\n <div class=\"ieeesa-roster-import__sample-wrapper\">\r\n <button\r\n mat-button\r\n class=\"mat-tertiary-button ieeesa-roster-import__download-btn\"\r\n (click)=\"downloadSampleFile()\"\r\n type=\"button\"\r\n [attr.aria-label]=\"screenTexts?.ariaLabel?.downloadSample ?? 'Download Sample File'\"\r\n >\r\n <svg\r\n class=\"ieeesa-roster-import__download-btn-icon\"\r\n aria-hidden=\"true\"\r\n >\r\n <use xlink:href=\"assets/images/sprites/sprites.svg#icon-file-doc\"></use>\r\n </svg>\r\n {{ screenTexts?.downloadSampleLabel ?? 'Download Sample File' }}\r\n </button>\r\n </div>\r\n </div>\r\n\r\n <p class=\"ieeesa-roster-import__upload-label\">\r\n {{ screenTexts?.uploadLabel ?? 'Upload your file' }}\r\n </p>\r\n\r\n <!-- Upload State -->\r\n <ng-container *ngIf=\"importState === 'upload'\">\r\n <!-- Hidden file input -->\r\n <input\r\n #fileInput\r\n type=\"file\"\r\n [accept]=\"acceptedFileTypes\"\r\n (change)=\"onFileSelected($event)\"\r\n hidden\r\n [attr.aria-label]=\"screenTexts?.uploadLabel ?? 'Upload your file'\"\r\n />\r\n\r\n <!-- Drag & Drop Zone -->\r\n <div\r\n class=\"ieeesa-roster-import__dropzone\"\r\n [class.ieeesa-roster-import__dropzone--active]=\"isDragOver\"\r\n (dragover)=\"onDragOver($event)\"\r\n (dragleave)=\"onDragLeave($event)\"\r\n (drop)=\"onFileDrop($event)\"\r\n (click)=\"fileInput.click()\"\r\n role=\"button\"\r\n tabindex=\"0\"\r\n (keydown.enter)=\"fileInput.click()\"\r\n (keydown.space)=\"fileInput.click()\"\r\n [attr.aria-label]=\"screenTexts?.ariaLabel?.dropzone ?? 'Drag and drop file upload area'\"\r\n >\r\n <ng-container *ngIf=\"!selectedFile\">\r\n <svg class=\"ieeesa-roster-import__upload-icon\" width=\"22\" height=\"22\">\r\n <use xlink:href=\"assets/images/sprites/sprites.svg#icon-upload-gray\"></use>\r\n </svg>\r\n <p class=\"ieeesa-roster-import__dropzone-text\">\r\n {{ screenTexts?.dropzoneText ?? 'Drag & drop a file here, or click to browse' }}\r\n </p>\r\n <p class=\"ieeesa-roster-import__dropzone-hint\">\r\n {{ screenTexts?.dropzoneHint ?? 'Accepted formats: .csv, .xls, .xlsx' }}\r\n </p>\r\n </ng-container>\r\n <ng-container *ngIf=\"selectedFile\">\r\n <svg class=\"ieeesa-roster-import__upload-icon\" width=\"22\" height=\"22\">\r\n <use xlink:href=\"assets/images/sprites/sprites.svg#icon-upload-gray\"></use>\r\n </svg>\r\n <div class=\"ieeesa-roster-import__file-row\">\r\n <p class=\"ieeesa-roster-import__file-name\">\r\n <svg width=\"14\" height=\"14\">\r\n <use xlink:href=\"assets/images/sprites/sprites.svg#icon-file-doc\"></use>\r\n </svg>\r\n {{ selectedFile.name }}\r\n </p>\r\n <button\r\n mat-button\r\n class=\"ieeesa-roster-import__remove-file-btn\"\r\n (click)=\"onRemoveFile(); $event.stopPropagation()\"\r\n type=\"button\"\r\n [attr.aria-label]=\"screenTexts?.ariaLabel?.remove ?? 'Remove selected file'\"\r\n >\r\n &times;\r\n </button>\r\n </div>\r\n </ng-container>\r\n </div>\r\n\r\n <!-- Inline Error Message -->\r\n <div\r\n *ngIf=\"errorMessage\"\r\n class=\"ieeesa-roster-import__error-banner\"\r\n role=\"alert\"\r\n >\r\n {{ errorMessage }}\r\n </div>\r\n </ng-container>\r\n\r\n <!-- Processing / Result share the file display + progress bar -->\r\n <ng-container *ngIf=\"importState === 'processing' || importState === 'result'\">\r\n <div\r\n class=\"ieeesa-roster-import__dropzone ieeesa-roster-import__dropzone--result\"\r\n >\r\n <svg class=\"ieeesa-roster-import__upload-icon\" width=\"22\" height=\"22\">\r\n <use xlink:href=\"assets/images/sprites/sprites.svg#icon-upload-gray\"></use>\r\n </svg>\r\n <p class=\"ieeesa-roster-import__file-name\">\r\n <svg width=\"14\" height=\"14\">\r\n <use xlink:href=\"assets/images/sprites/sprites.svg#icon-file-doc\"></use>\r\n </svg>\r\n {{ selectedFile?.name }}\r\n </p>\r\n </div>\r\n\r\n <!-- Progress label + percentage -->\r\n <div class=\"ieeesa-roster-import__progress-head\">\r\n <span class=\"ieeesa-roster-import__progress-label\">\r\n {{ screenTexts?.processingLabel ?? 'Processing file records....' }}\r\n </span>\r\n <span class=\"ieeesa-roster-import__progress-percent\">\r\n {{ progressValue | number: '1.0-0' }}%\r\n </span>\r\n </div>\r\n <mat-progress-bar\r\n class=\"ieeesa-roster-import__progress-bar\"\r\n mode=\"determinate\"\r\n [value]=\"progressValue\"\r\n [attr.aria-label]=\"screenTexts?.processingLabel ?? 'Processing file records....'\"\r\n ></mat-progress-bar>\r\n </ng-container>\r\n\r\n <!-- Result State (summary + errors) -->\r\n <ng-container *ngIf=\"importState === 'result' && uploadResult\">\r\n <!-- No data records banner (headers only, zero rows) -->\r\n <div\r\n *ngIf=\"noDataMessage\"\r\n class=\"ieeesa-roster-import__no-data-banner\"\r\n role=\"status\"\r\n >\r\n {{ noDataMessage }}\r\n </div>\r\n\r\n <!-- Summary cards -->\r\n <div *ngIf=\"showSummaryCards\" class=\"ieeesa-roster-import__summary-cards\">\r\n <div\r\n class=\"ieeesa-roster-import__summary-card ieeesa-roster-import__summary-card--success\"\r\n >\r\n <p class=\"ieeesa-roster-import__summary-card-count\">\r\n {{ uploadResult.successCount }}\r\n </p>\r\n <p class=\"ieeesa-roster-import__summary-card-label\">\r\n {{ screenTexts?.result?.successCardLabel ?? 'Rosters added successfully' }}\r\n </p>\r\n </div>\r\n <div\r\n class=\"ieeesa-roster-import__summary-card ieeesa-roster-import__summary-card--skipped\"\r\n >\r\n <p class=\"ieeesa-roster-import__summary-card-count\">\r\n {{ uploadResult.failureCount }}\r\n </p>\r\n <p class=\"ieeesa-roster-import__summary-card-label\">\r\n {{ screenTexts?.result?.skippedCardLabel ?? 'Skipped Rows' }}\r\n </p>\r\n </div>\r\n </div>\r\n\r\n <!-- Row Errors Card -->\r\n <div *ngIf=\"jobErrors.length\" class=\"ieeesa-roster-import__errors-card\">\r\n <p class=\"ieeesa-roster-import__errors-header\">\r\n <ng-container *ngIf=\"allRowsSkipped; else someErrors\">\r\n {{ screenTexts?.result?.allRowsSkippedHeader ?? 'All Rows are skipped' }}\r\n </ng-container>\r\n <ng-template #someErrors>\r\n {{ screenTexts?.result?.errorsHeader ?? 'Row errors \u2014 these rows will be skipped' }}\r\n </ng-template>\r\n </p>\r\n <div class=\"ieeesa-roster-import__errors-body\">\r\n <div\r\n *ngFor=\"let rowErr of jobErrors\"\r\n class=\"ieeesa-roster-import__error-row\"\r\n >\r\n <p class=\"ieeesa-roster-import__error-row-title\">\r\n Row {{ rowErr.rowNumber }} \u2014 {{ rowErr.errorMessage }}\r\n </p>\r\n </div>\r\n </div>\r\n </div>\r\n </ng-container>\r\n\r\n <!-- Footer actions -->\r\n <div class=\"ieeesa-roster-import__actions\">\r\n <button\r\n mat-button\r\n class=\"mat-tertiary-button ieeesa-roster-import__cancel-btn\"\r\n (click)=\"onCancel()\"\r\n type=\"button\"\r\n >\r\n {{ screenTexts?.buttons?.cancel ?? 'Cancel' }}\r\n </button>\r\n <button\r\n *ngIf=\"importState === 'result' && jobErrors.length\"\r\n mat-button\r\n type=\"button\"\r\n class=\"mat-primary-button ieeesa-roster-import__error-log-btn\"\r\n (click)=\"downloadErrorLog()\"\r\n [attr.aria-label]=\"screenTexts?.ariaLabel?.downloadErrorLog ?? 'Download Error log'\"\r\n >\r\n {{ screenTexts?.buttons?.downloadErrorLog ?? 'Download Error log' }}\r\n </button>\r\n </div>\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}.mat-mdc-dialog-content:has(>.ieeesa-roster-import),.mdc-dialog__content:has(>.ieeesa-roster-import),.mat-mdc-dialog-content:has(.ieeesa-roster-import),.mdc-dialog__content:has(.ieeesa-roster-import){max-height:none!important;min-height:320px!important;height:auto!important;overflow:visible!important}.ieeesa-modal-dialog.ieeesa-roster-import-dialog{width:720px!important;max-width:calc(100vw - 32px)!important}.ieeesa-modal-dialog.ieeesa-roster-import-dialog .ieeesa-modal{box-shadow:0 4px 24px #00000080!important}.ieeesa-modal-dialog.ieeesa-roster-import-dialog .mat-mdc-dialog-content,.ieeesa-modal-dialog.ieeesa-roster-import-dialog [mat-dialog-content],.ieeesa-modal-dialog.ieeesa-roster-import-dialog .mdc-dialog__content,.ieeesa-modal-dialog.ieeesa-roster-import-dialog .mat-mdc-dialog-container .mdc-dialog__content,.ieeesa-modal-dialog.ieeesa-roster-import-dialog .mat-mdc-dialog-surface,.ieeesa-modal-dialog.ieeesa-roster-import-dialog .mdc-dialog__surface,.ieeesa-modal-dialog.ieeesa-roster-import-dialog .ieeesa-modal,.ieeesa-modal-dialog.ieeesa-roster-import-dialog .ieeesa-modal>.ieeesa-label-lg-16{max-height:none!important;overflow:visible!important}.ieeesa-modal-dialog.ieeesa-roster-import-dialog .ieeesa-modal-title{border-bottom:1px solid #e5e7eb;padding-bottom:16px;margin-bottom:16px!important}.ieeesa-modal-dialog.ieeesa-roster-import-dialog .mat-mdc-dialog-content{min-height:0!important;padding:0!important}.ieeesa-modal-dialog.ieeesa-roster-import-dialog .ieeesa-modal-title{display:flex;align-items:center;gap:4px}.ieeesa-roster-import{background:#fff;position:relative;box-sizing:border-box;width:100%;font-family:Calibri Regular,sans-serif}.ieeesa-roster-import strong,.ieeesa-roster-import b,.ieeesa-roster-import .ieeesa-roster-import__subheader-title,.ieeesa-roster-import .ieeesa-roster-import__columns-title,.ieeesa-roster-import .ieeesa-roster-import__import-btn,.ieeesa-roster-import .ieeesa-roster-import__summary-card-count{font-family:Calibri Bold,sans-serif}.ieeesa-roster-import__subheader{display:flex;align-items:center;justify-content:space-between;gap:12px;padding:10px 1.5em;margin:0 -1.5em 20px;min-height:48px;background-color:#f4f5f7}.ieeesa-roster-import__subheader-title{font-size:14px;font-weight:600;color:#4a5565}.ieeesa-roster-import__import-btn.mat-tertiary-button{display:inline-flex;align-items:center;justify-content:center;gap:6px;min-width:auto;width:auto;border:1px solid #00629b;color:#00629b;border-radius:4px;background-color:#fff;font-size:13px;font-weight:600;line-height:1;height:36px!important;min-height:36px!important;padding:0 16px!important;white-space:nowrap;box-shadow:none}.ieeesa-roster-import__import-btn.mat-tertiary-button .mdc-button__label{display:inline-flex;align-items:center;gap:6px}.ieeesa-roster-import__import-btn.mat-tertiary-button:hover:not(:disabled){background-color:#f7fbff}.ieeesa-roster-import__import-btn.mat-tertiary-button:disabled{border-color:#cbd5e1;color:#9aa4b2}.ieeesa-roster-import__import-btn-icon{width:14px;height:14px;flex-shrink:0;display:block;vertical-align:middle}.ieeesa-roster-import__columns-card{display:flex;align-items:flex-start;justify-content:space-between;gap:12px;border:1px solid #2f9fe6;border-radius:6px;background:#f3f9ff;padding:10px;margin:0 0 24px}.ieeesa-roster-import__columns-content{flex:1;min-width:0}.ieeesa-roster-import__columns-title{margin:0 0 10px;font-family:Calibri Bold,sans-serif;font-size:14px;font-weight:700;color:#005587}.ieeesa-roster-import__columns-chips{display:flex;flex-wrap:wrap;gap:6px}.ieeesa-roster-import__chip{display:inline-block;font-family:Calibri Bold,sans-serif;border:1px solid #d4d8e1;border-radius:4px;background:#e9edf4;padding:6px 12px;color:#6b7280;font-size:12px;font-weight:600}.ieeesa-roster-import__download-btn.mat-tertiary-button{display:inline-flex;align-items:center;gap:4px;min-width:auto;width:auto;border:1px solid #00629b;color:#00629b;border-radius:4px;background-color:#fff;font-size:12px;font-weight:600;line-height:18px;height:30px!important;min-height:30px!important;padding:0 12px!important;white-space:nowrap;box-shadow:none}.ieeesa-roster-import__download-btn.mat-tertiary-button:hover{background-color:#f7fbff}.ieeesa-roster-import__download-btn-icon{width:14px;height:14px;flex-shrink:0}.ieeesa-roster-import__upload-label{margin:0 0 8px;font-family:Calibri Bold,sans-serif;font-size:14px;font-weight:600;color:#4a5565}.ieeesa-roster-import__dropzone{border:2px dashed #cccccc;border-radius:8px;min-height:108px;padding:20px 16px;margin:0 0 12px;display:flex;flex-direction:column;align-items:center;justify-content:center;text-align:center;cursor:pointer;background:#fafafa}.ieeesa-roster-import__dropzone:hover,.ieeesa-roster-import__dropzone--active{border-color:#00629b;background:#f4f9fc}.ieeesa-roster-import__dropzone--result{cursor:default;pointer-events:none}.ieeesa-roster-import__upload-icon{color:#5c6371;font-size:18px;line-height:1;margin-bottom:8px}.ieeesa-roster-import__dropzone-text{margin:0;font-family:Calibri Bold,sans-serif;font-size:14px;font-weight:600;color:#4a5565}.ieeesa-roster-import__dropzone-hint{margin:6px 0 0;font-family:Calibri Regular,sans-serif;font-size:12px;color:#99a1af}.ieeesa-roster-import__file-row{display:flex;align-items:center;justify-content:center;gap:6px}.ieeesa-roster-import__file-name{margin:0;font-size:14px;font-weight:600;color:#00629b;display:flex;align-items:center;gap:4px}.ieeesa-roster-import__remove-file-btn{display:inline-flex;align-items:center;justify-content:center;font-size:16px;line-height:1;color:#ba0c2f;min-width:auto;width:20px;height:20px;padding:0;cursor:pointer}.ieeesa-roster-import__error-banner{display:flex;flex-direction:column;padding:10px 14px;background-color:#fdecea;border:1px solid #ff6467;border-radius:4px;margin:0 0 12px;font-size:12px;color:#ba0c2f}.ieeesa-roster-import__no-data-banner{padding:10px 14px;background-color:#fefce8;border:1px solid #fdc700;border-radius:4px;margin:16px 0 0;font-size:13px;color:#894b00}.ieeesa-roster-import__progress-head{display:flex;align-items:center;justify-content:space-between;margin:16px 0 8px}.ieeesa-roster-import__progress-label{font-family:Calibri Regular,sans-serif;font-size:14px;color:#6f7782}.ieeesa-roster-import__progress-percent{font-family:Calibri Regular,sans-serif;font-size:14px;font-weight:600;color:#6f7782}.ieeesa-roster-import__progress-bar{--mdc-linear-progress-active-indicator-color: #00629b;--mdc-linear-progress-track-color: #dce6ef;border-radius:6px;height:14px;margin:0 0 8px;overflow:hidden}.ieeesa-roster-import__progress-bar .mdc-linear-progress__bar-inner{border-color:#00629b}.ieeesa-roster-import__summary-cards{display:flex;gap:16px;margin:16px 0}.ieeesa-roster-import__summary-card{flex:1;border:1px solid #e3e5e8;border-radius:6px;padding:14px 16px;background:#fff}.ieeesa-roster-import__summary-card-count{margin:0 0 4px;font-family:Calibri Bold,sans-serif;font-size:28px;font-weight:700;line-height:1.1}.ieeesa-roster-import__summary-card--success .ieeesa-roster-import__summary-card-count{color:#27783a}.ieeesa-roster-import__summary-card--skipped .ieeesa-roster-import__summary-card-count{color:#ba0c2f}.ieeesa-roster-import__summary-card-label{margin:0;font-family:Calibri Regular,sans-serif;font-size:14px;color:#6f7782}.ieeesa-roster-import__errors-card{border:1px solid #ff6467;border-radius:4px;margin:0 0 16px;background-color:#fdecea;overflow:hidden}.ieeesa-roster-import__errors-header{margin:0;padding:8px 14px;font-size:12px;font-weight:700;color:#ba0c2f;background-color:#fcd9dd;border-bottom:1px solid #ff6467}.ieeesa-roster-import__errors-body{max-height:200px;overflow-y:auto;padding:10px 14px}.ieeesa-roster-import__error-row{margin-bottom:8px}.ieeesa-roster-import__error-row:last-child{margin-bottom:0}.ieeesa-roster-import__error-row-title{margin:0;font-size:12px;font-weight:400;color:#ba0c2f;line-height:1.5}.ieeesa-roster-import__actions{display:flex;align-items:center;gap:14px;margin:20px -1.5em 0;padding:16px 1.5em 0;border-top:1px solid #e5e7eb}.ieeesa-roster-import__import-submit-btn{background-color:#00629b;color:#fff;font-size:13px;font-weight:600;border-radius:4px;padding:7px 14px}.ieeesa-roster-import__error-log-btn{margin-left:auto;background-color:#00629b;color:#fff;font-size:13px;font-weight:600;border-radius:4px;padding:7px 14px}.ieeesa-roster-import__error-log-btn:hover{background-color:#005587}\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: "pipe", type: i1.DecimalPipe, name: "number" }, { kind: "ngmodule", type: MatButtonModule }, { kind: "component", type: i2.MatButton, selector: " button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button] ", inputs: ["disabled", "disableRipple", "color"], exportAs: ["matButton"] }, { kind: "ngmodule", type: MatProgressBarModule }, { kind: "component", type: i3.MatProgressBar, selector: "mat-progress-bar", inputs: ["color", "value", "bufferValue", "mode"], outputs: ["animationEnd"], exportAs: ["matProgressBar"] }], encapsulation: i0.ViewEncapsulation.None }); }
522
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: RosterImportComponent, deps: [{ token: i1.RosterImportApiService }, { token: i2.GroupsService }], target: i0.ɵɵFactoryTarget.Component }); }
523
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: RosterImportComponent, isStandalone: true, selector: "ieeesa-roster-import", inputs: { componentData: "componentData" }, outputs: { submitFormResponse: "submitFormResponse", formCancel: "formCancel" }, ngImport: i0, template: "<div class=\"ieeesa-roster-import\">\r\n <!-- Sub-heading band: \"Bulk Import Participants\" on the left, Import Roster\r\n action on the right (appears once a file is selected) \u2014 matches the Figma.\r\n The \"\u2190 Back to Rosters / Import Roster\" title row + X are rendered by the\r\n shared ModalComponent above this. -->\r\n <div class=\"ieeesa-roster-import__subheader\">\r\n <span class=\"ieeesa-roster-import__subheader-title\">\r\n {{ screenTexts?.subHeading ?? 'Bulk Import Participants' }}\r\n </span>\r\n <button\r\n *ngIf=\"selectedFile\"\r\n mat-button\r\n type=\"button\"\r\n class=\"mat-tertiary-button ieeesa-roster-import__import-btn\"\r\n [disabled]=\"importState === 'processing'\"\r\n (click)=\"onImport()\"\r\n [attr.aria-label]=\"screenTexts?.buttons?.import ?? 'Import Roster'\"\r\n >\r\n <svg class=\"ieeesa-roster-import__import-btn-icon\" width=\"14\" height=\"14\" aria-hidden=\"true\">\r\n <use xlink:href=\"assets/images/sprites/sprites.svg#icon-import\"></use>\r\n </svg>\r\n {{ screenTexts?.buttons?.import ?? 'Import Roster' }}\r\n </button>\r\n </div>\r\n\r\n <!-- Required Columns Info -->\r\n <div class=\"ieeesa-roster-import__columns-card\">\r\n <div class=\"ieeesa-roster-import__columns-content\">\r\n <p class=\"ieeesa-roster-import__columns-title\">\r\n {{ screenTexts?.requiredColumnsTitle ?? 'Required columns' }}\r\n </p>\r\n <div class=\"ieeesa-roster-import__columns-chips\">\r\n <span\r\n *ngFor=\"let col of requiredColumns\"\r\n class=\"ieeesa-roster-import__chip\"\r\n >\r\n {{ col }}\r\n </span>\r\n </div>\r\n </div>\r\n <div class=\"ieeesa-roster-import__sample-wrapper\">\r\n <button\r\n mat-button\r\n class=\"mat-tertiary-button ieeesa-roster-import__download-btn\"\r\n (click)=\"downloadSampleFile()\"\r\n type=\"button\"\r\n [attr.aria-label]=\"screenTexts?.ariaLabel?.downloadSample ?? 'Download Sample File'\"\r\n >\r\n <svg\r\n class=\"ieeesa-roster-import__download-btn-icon\"\r\n aria-hidden=\"true\"\r\n >\r\n <use xlink:href=\"assets/images/sprites/sprites.svg#icon-file-doc\"></use>\r\n </svg>\r\n {{ screenTexts?.downloadSampleLabel ?? 'Download Sample File' }}\r\n </button>\r\n </div>\r\n </div>\r\n\r\n <p class=\"ieeesa-roster-import__upload-label\">\r\n {{ screenTexts?.uploadLabel ?? 'Upload your file' }}\r\n </p>\r\n\r\n <!-- Upload State -->\r\n <ng-container *ngIf=\"importState === 'upload'\">\r\n <!-- Hidden file input -->\r\n <input\r\n #fileInput\r\n type=\"file\"\r\n [accept]=\"acceptedFileTypes\"\r\n (change)=\"onFileSelected($event)\"\r\n hidden\r\n [attr.aria-label]=\"screenTexts?.uploadLabel ?? 'Upload your file'\"\r\n />\r\n\r\n <!-- Drag & Drop Zone -->\r\n <div\r\n class=\"ieeesa-roster-import__dropzone\"\r\n [class.ieeesa-roster-import__dropzone--active]=\"isDragOver\"\r\n (dragover)=\"onDragOver($event)\"\r\n (dragleave)=\"onDragLeave($event)\"\r\n (drop)=\"onFileDrop($event)\"\r\n (click)=\"fileInput.click()\"\r\n role=\"button\"\r\n tabindex=\"0\"\r\n (keydown.enter)=\"fileInput.click()\"\r\n (keydown.space)=\"fileInput.click()\"\r\n [attr.aria-label]=\"screenTexts?.ariaLabel?.dropzone ?? 'Drag and drop file upload area'\"\r\n >\r\n <ng-container *ngIf=\"!selectedFile\">\r\n <svg class=\"ieeesa-roster-import__upload-icon\" width=\"22\" height=\"22\">\r\n <use xlink:href=\"assets/images/sprites/sprites.svg#icon-upload-gray\"></use>\r\n </svg>\r\n <p class=\"ieeesa-roster-import__dropzone-text\">\r\n {{ screenTexts?.dropzoneText ?? 'Drag & drop a file here, or click to browse' }}\r\n </p>\r\n <p class=\"ieeesa-roster-import__dropzone-hint\">\r\n {{ screenTexts?.dropzoneHint ?? 'Accepted formats: .csv, .xlsx' }}\r\n </p>\r\n </ng-container>\r\n <ng-container *ngIf=\"selectedFile\">\r\n <svg class=\"ieeesa-roster-import__upload-icon\" width=\"22\" height=\"22\">\r\n <use xlink:href=\"assets/images/sprites/sprites.svg#icon-upload-gray\"></use>\r\n </svg>\r\n <div class=\"ieeesa-roster-import__file-row\">\r\n <p class=\"ieeesa-roster-import__file-name\">\r\n <svg width=\"14\" height=\"14\">\r\n <use xlink:href=\"assets/images/sprites/sprites.svg#icon-file-doc\"></use>\r\n </svg>\r\n {{ selectedFile.name }}\r\n </p>\r\n <button\r\n mat-button\r\n class=\"ieeesa-roster-import__remove-file-btn\"\r\n (click)=\"onRemoveFile(); $event.stopPropagation()\"\r\n type=\"button\"\r\n [attr.aria-label]=\"screenTexts?.ariaLabel?.remove ?? 'Remove selected file'\"\r\n >\r\n &times;\r\n </button>\r\n </div>\r\n </ng-container>\r\n </div>\r\n\r\n <!-- Inline Error Message -->\r\n <div\r\n *ngIf=\"errorMessage\"\r\n class=\"ieeesa-roster-import__error-banner\"\r\n role=\"alert\"\r\n >\r\n {{ errorMessage }}\r\n </div>\r\n </ng-container>\r\n\r\n <!-- Processing / Result share the file display + progress bar -->\r\n <ng-container *ngIf=\"importState === 'processing' || importState === 'result'\">\r\n <div\r\n class=\"ieeesa-roster-import__dropzone ieeesa-roster-import__dropzone--result\"\r\n >\r\n <svg class=\"ieeesa-roster-import__upload-icon\" width=\"22\" height=\"22\">\r\n <use xlink:href=\"assets/images/sprites/sprites.svg#icon-upload-gray\"></use>\r\n </svg>\r\n <p class=\"ieeesa-roster-import__file-name\">\r\n <svg width=\"14\" height=\"14\">\r\n <use xlink:href=\"assets/images/sprites/sprites.svg#icon-file-doc\"></use>\r\n </svg>\r\n {{ selectedFile?.name }}\r\n </p>\r\n </div>\r\n\r\n <!-- Progress label (processing only) -->\r\n <div\r\n *ngIf=\"importState === 'processing'\"\r\n class=\"ieeesa-roster-import__progress-head\"\r\n >\r\n <span class=\"ieeesa-roster-import__progress-label\">\r\n {{ screenTexts?.processingLabel ?? 'Processing file records....' }}\r\n </span>\r\n </div>\r\n <mat-progress-bar\r\n *ngIf=\"importState === 'processing'\"\r\n class=\"ieeesa-roster-import__progress-bar\"\r\n mode=\"indeterminate\"\r\n [attr.aria-label]=\"screenTexts?.processingLabel ?? 'Processing file records....'\"\r\n ></mat-progress-bar>\r\n </ng-container>\r\n\r\n <!-- Result State (summary + errors) -->\r\n <ng-container *ngIf=\"importState === 'result' && uploadResult\">\r\n <!-- No data records banner (headers only, zero rows) -->\r\n <div\r\n *ngIf=\"noDataMessage\"\r\n class=\"ieeesa-roster-import__no-data-banner\"\r\n role=\"status\"\r\n >\r\n {{ noDataMessage }}\r\n </div>\r\n\r\n <!-- Summary cards -->\r\n <div *ngIf=\"showSummaryCards\" class=\"ieeesa-roster-import__summary-cards\">\r\n <div\r\n class=\"ieeesa-roster-import__summary-card ieeesa-roster-import__summary-card--success\"\r\n >\r\n <p class=\"ieeesa-roster-import__summary-card-count\">\r\n {{ uploadResult.successCount }}\r\n </p>\r\n <p class=\"ieeesa-roster-import__summary-card-label\">\r\n {{ screenTexts?.result?.successCardLabel ?? 'Rosters added successfully' }}\r\n </p>\r\n </div>\r\n <div\r\n class=\"ieeesa-roster-import__summary-card ieeesa-roster-import__summary-card--skipped\"\r\n >\r\n <p class=\"ieeesa-roster-import__summary-card-count\">\r\n {{ uploadResult.failureCount }}\r\n </p>\r\n <p class=\"ieeesa-roster-import__summary-card-label\">\r\n {{ screenTexts?.result?.skippedCardLabel ?? 'Skipped Rows' }}\r\n </p>\r\n </div>\r\n </div>\r\n\r\n <!-- Row Errors Card -->\r\n <div *ngIf=\"jobErrors.length\" class=\"ieeesa-roster-import__errors-card\">\r\n <p class=\"ieeesa-roster-import__errors-header\">\r\n <ng-container *ngIf=\"allRowsSkipped; else someErrors\">\r\n {{ screenTexts?.result?.allRowsSkippedHeader ?? 'All Rows are skipped' }}\r\n </ng-container>\r\n <ng-template #someErrors>\r\n {{ screenTexts?.result?.errorsHeader ?? 'Row errors \u2014 these rows will be skipped' }}\r\n </ng-template>\r\n </p>\r\n <div class=\"ieeesa-roster-import__errors-body\">\r\n <div\r\n *ngFor=\"let rowErr of jobErrors\"\r\n class=\"ieeesa-roster-import__error-row\"\r\n >\r\n <p class=\"ieeesa-roster-import__error-row-title\">\r\n Row {{ rowErr.rowNumber }} \u2014 {{ rowErr.errorMessage }}\r\n </p>\r\n </div>\r\n </div>\r\n </div>\r\n </ng-container>\r\n\r\n <!-- Footer actions -->\r\n <div class=\"ieeesa-roster-import__actions\">\r\n <button\r\n mat-button\r\n class=\"mat-tertiary-button ieeesa-roster-import__cancel-btn\"\r\n (click)=\"onCancel()\"\r\n type=\"button\"\r\n >\r\n {{ screenTexts?.buttons?.cancel ?? 'Cancel' }}\r\n </button>\r\n <button\r\n *ngIf=\"importState === 'result' && jobErrors.length\"\r\n mat-button\r\n type=\"button\"\r\n class=\"mat-primary-button ieeesa-roster-import__error-log-btn\"\r\n (click)=\"downloadErrorLog()\"\r\n [attr.aria-label]=\"screenTexts?.ariaLabel?.downloadErrorLog ?? 'Download Error log'\"\r\n >\r\n {{ screenTexts?.buttons?.downloadErrorLog ?? 'Download Error log' }}\r\n </button>\r\n </div>\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}.mat-mdc-dialog-content:has(>.ieeesa-roster-import),.mdc-dialog__content:has(>.ieeesa-roster-import),.mat-mdc-dialog-content:has(.ieeesa-roster-import),.mdc-dialog__content:has(.ieeesa-roster-import){max-height:none!important;min-height:320px!important;height:auto!important;overflow:visible!important}.ieeesa-modal-dialog.ieeesa-roster-import-dialog{width:720px!important;max-width:calc(100vw - 32px)!important}.ieeesa-modal-dialog.ieeesa-roster-import-dialog .ieeesa-modal{box-shadow:0 4px 24px #00000080!important}.ieeesa-modal-dialog.ieeesa-roster-import-dialog .mat-mdc-dialog-content,.ieeesa-modal-dialog.ieeesa-roster-import-dialog [mat-dialog-content],.ieeesa-modal-dialog.ieeesa-roster-import-dialog .mdc-dialog__content,.ieeesa-modal-dialog.ieeesa-roster-import-dialog .mat-mdc-dialog-container .mdc-dialog__content,.ieeesa-modal-dialog.ieeesa-roster-import-dialog .mat-mdc-dialog-surface,.ieeesa-modal-dialog.ieeesa-roster-import-dialog .mdc-dialog__surface,.ieeesa-modal-dialog.ieeesa-roster-import-dialog .ieeesa-modal,.ieeesa-modal-dialog.ieeesa-roster-import-dialog .ieeesa-modal>.ieeesa-label-lg-16{max-height:none!important;overflow:visible!important}.ieeesa-modal-dialog.ieeesa-roster-import-dialog .ieeesa-modal-title{border-bottom:1px solid #e5e7eb;padding-bottom:16px;margin-bottom:16px!important}.ieeesa-modal-dialog.ieeesa-roster-import-dialog .mat-mdc-dialog-content{min-height:0!important;padding:0!important}.ieeesa-modal-dialog.ieeesa-roster-import-dialog .ieeesa-modal-title{display:flex;align-items:center;gap:4px}.ieeesa-roster-import{background:#fff;position:relative;box-sizing:border-box;width:100%;font-family:Calibri Regular,sans-serif}.ieeesa-roster-import strong,.ieeesa-roster-import b,.ieeesa-roster-import .ieeesa-roster-import__subheader-title,.ieeesa-roster-import .ieeesa-roster-import__columns-title,.ieeesa-roster-import .ieeesa-roster-import__import-btn,.ieeesa-roster-import .ieeesa-roster-import__summary-card-count{font-family:Calibri Bold,sans-serif}.ieeesa-roster-import__subheader{display:flex;align-items:center;justify-content:space-between;gap:12px;padding:10px 1.5em;margin:0 -1.5em 20px;min-height:48px;background-color:#f4f5f7}.ieeesa-roster-import__subheader-title{font-size:14px;font-weight:600;color:#4a5565}.ieeesa-roster-import__import-btn.mat-tertiary-button{display:inline-flex;align-items:center;justify-content:center;gap:6px;min-width:auto;width:auto;border:1px solid #00629b;color:#00629b;border-radius:4px;background-color:#fff;font-size:13px;font-weight:600;line-height:1;height:36px!important;min-height:36px!important;padding:0 16px!important;white-space:nowrap;box-shadow:none}.ieeesa-roster-import__import-btn.mat-tertiary-button .mdc-button__label{display:inline-flex;align-items:center;gap:6px}.ieeesa-roster-import__import-btn.mat-tertiary-button:hover:not(:disabled){background-color:#f7fbff}.ieeesa-roster-import__import-btn.mat-tertiary-button:disabled{border-color:#cbd5e1;color:#9aa4b2}.ieeesa-roster-import__import-btn-icon{width:14px;height:14px;flex-shrink:0;display:block;vertical-align:middle}.ieeesa-roster-import__columns-card{display:flex;align-items:flex-start;justify-content:space-between;gap:12px;border:1px solid #2f9fe6;border-radius:6px;background:#f3f9ff;padding:10px;margin:0 0 24px}.ieeesa-roster-import__columns-content{flex:1;min-width:0}.ieeesa-roster-import__columns-title{margin:0 0 10px;font-family:Calibri Bold,sans-serif;font-size:14px;font-weight:700;color:#005587}.ieeesa-roster-import__columns-chips{display:flex;flex-wrap:wrap;gap:6px}.ieeesa-roster-import__chip{display:inline-block;font-family:Calibri Bold,sans-serif;border:1px solid #d4d8e1;border-radius:4px;background:#e9edf4;padding:6px 12px;color:#6b7280;font-size:12px;font-weight:600}.ieeesa-roster-import__download-btn.mat-tertiary-button{display:inline-flex;align-items:center;gap:4px;min-width:auto;width:auto;border:1px solid #00629b;color:#00629b;border-radius:4px;background-color:#fff;font-size:12px;font-weight:600;line-height:18px;height:30px!important;min-height:30px!important;padding:0 12px!important;white-space:nowrap;box-shadow:none}.ieeesa-roster-import__download-btn.mat-tertiary-button:hover{background-color:#f7fbff}.ieeesa-roster-import__download-btn-icon{width:14px;height:14px;flex-shrink:0}.ieeesa-roster-import__upload-label{margin:0 0 8px;font-family:Calibri Bold,sans-serif;font-size:14px;font-weight:600;color:#4a5565}.ieeesa-roster-import__dropzone{border:2px dashed #cccccc;border-radius:8px;min-height:108px;padding:20px 16px;margin:0 0 12px;display:flex;flex-direction:column;align-items:center;justify-content:center;text-align:center;cursor:pointer;background:#fafafa}.ieeesa-roster-import__dropzone:hover,.ieeesa-roster-import__dropzone--active{border-color:#00629b;background:#f4f9fc}.ieeesa-roster-import__dropzone--result{cursor:default;pointer-events:none}.ieeesa-roster-import__upload-icon{color:#5c6371;font-size:18px;line-height:1;margin-bottom:8px}.ieeesa-roster-import__dropzone-text{margin:0;font-family:Calibri Bold,sans-serif;font-size:14px;font-weight:600;color:#4a5565}.ieeesa-roster-import__dropzone-hint{margin:6px 0 0;font-family:Calibri Regular,sans-serif;font-size:12px;color:#99a1af}.ieeesa-roster-import__file-row{display:flex;align-items:center;justify-content:center;gap:6px}.ieeesa-roster-import__file-name{margin:0;font-size:14px;font-weight:600;color:#00629b;display:flex;align-items:center;gap:4px}.ieeesa-roster-import__remove-file-btn{display:inline-flex;align-items:center;justify-content:center;font-size:16px;line-height:1;color:#ba0c2f;min-width:auto;width:20px;height:20px;padding:0;cursor:pointer}.ieeesa-roster-import__error-banner{display:flex;flex-direction:column;padding:10px 14px;background-color:#fdecea;border:1px solid #ff6467;border-radius:4px;margin:0 0 12px;font-family:Calibri Regular,sans-serif;font-size:13px;font-weight:400;color:#b3261e}.ieeesa-roster-import__no-data-banner{padding:10px 14px;background-color:#fefce8;border:1px solid #fdc700;border-radius:4px;margin:16px 0 0;font-size:13px;color:#894b00}.ieeesa-roster-import__progress-head{display:flex;align-items:center;justify-content:space-between;margin:16px 0 8px}.ieeesa-roster-import__progress-label{font-family:Calibri Regular,sans-serif;font-size:14px;color:#6f7782}.ieeesa-roster-import__progress-percent{font-family:Calibri Regular,sans-serif;font-size:14px;font-weight:600;color:#6f7782}.ieeesa-roster-import__progress-bar{--mdc-linear-progress-active-indicator-color: #00629b;--mdc-linear-progress-track-color: #dce6ef;border-radius:6px;height:14px;margin:0 0 8px;overflow:hidden}.ieeesa-roster-import__progress-bar .mdc-linear-progress__bar-inner{border-color:#00629b}.ieeesa-roster-import__summary-cards{display:flex;gap:16px;margin:16px 0}.ieeesa-roster-import__summary-card{flex:1;border:1px solid #e3e5e8;border-radius:6px;padding:14px 16px;background:#fff}.ieeesa-roster-import__summary-card-count{margin:0 0 4px;font-family:Calibri Bold,sans-serif;font-size:28px;font-weight:700;line-height:1.1}.ieeesa-roster-import__summary-card--success .ieeesa-roster-import__summary-card-count{color:#27783a}.ieeesa-roster-import__summary-card--skipped .ieeesa-roster-import__summary-card-count{color:#ba0c2f}.ieeesa-roster-import__summary-card-label{margin:0;font-family:Calibri Regular,sans-serif;font-size:14px;color:#6f7782}.ieeesa-roster-import__errors-card{border:1px solid #ff6467;border-radius:4px;margin:0 0 16px;background-color:#fdecea;overflow:hidden}.ieeesa-roster-import__errors-header{margin:0;padding:8px 14px;font-size:12px;font-weight:700;color:#ba0c2f;background-color:#fcd9dd;border-bottom:1px solid #ff6467}.ieeesa-roster-import__errors-body{max-height:200px;overflow-y:auto;padding:10px 14px}.ieeesa-roster-import__error-row{margin-bottom:8px}.ieeesa-roster-import__error-row:last-child{margin-bottom:0}.ieeesa-roster-import__error-row-title{margin:0;font-size:12px;font-weight:400;color:#ba0c2f;line-height:1.5}.ieeesa-roster-import__actions{display:flex;align-items:center;gap:14px;margin:20px -1.5em 0;padding:16px 1.5em 0;border-top:1px solid #e5e7eb}.ieeesa-roster-import__import-submit-btn{background-color:#00629b;color:#fff;font-size:13px;font-weight:600;border-radius:4px;padding:7px 14px}.ieeesa-roster-import__error-log-btn{margin-left:auto;background-color:#00629b;color:#fff;font-size:13px;font-weight:600;border-radius:4px;padding:7px 14px}.ieeesa-roster-import__error-log-btn:hover{background-color:#005587}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i3.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "ngmodule", type: MatButtonModule }, { kind: "component", type: i4.MatButton, selector: " button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button] ", inputs: ["disabled", "disableRipple", "color"], exportAs: ["matButton"] }, { kind: "ngmodule", type: MatProgressBarModule }, { kind: "component", type: i5.MatProgressBar, selector: "mat-progress-bar", inputs: ["color", "value", "bufferValue", "mode"], outputs: ["animationEnd"], exportAs: ["matProgressBar"] }], encapsulation: i0.ViewEncapsulation.None }); }
365
524
  }
366
525
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: RosterImportComponent, decorators: [{
367
526
  type: Component,
368
- args: [{ selector: 'ieeesa-roster-import', standalone: true, imports: [CommonModule, MatButtonModule, MatProgressBarModule], encapsulation: ViewEncapsulation.None, template: "<div class=\"ieeesa-roster-import\">\r\n <!-- Sub-heading band: \"Bulk Import Participants\" on the left, Import Roster\r\n action on the right (appears once a file is selected) \u2014 matches the Figma.\r\n The \"\u2190 Back to Rosters / Import Roster\" title row + X are rendered by the\r\n shared ModalComponent above this. -->\r\n <div class=\"ieeesa-roster-import__subheader\">\r\n <span class=\"ieeesa-roster-import__subheader-title\">\r\n {{ screenTexts?.subHeading ?? 'Bulk Import Participants' }}\r\n </span>\r\n <button\r\n *ngIf=\"selectedFile\"\r\n mat-button\r\n type=\"button\"\r\n class=\"mat-tertiary-button ieeesa-roster-import__import-btn\"\r\n [disabled]=\"importState === 'processing'\"\r\n (click)=\"onImport()\"\r\n [attr.aria-label]=\"screenTexts?.buttons?.import ?? 'Import Roster'\"\r\n >\r\n <svg class=\"ieeesa-roster-import__import-btn-icon\" width=\"14\" height=\"14\" aria-hidden=\"true\">\r\n <use xlink:href=\"assets/images/sprites/sprites.svg#icon-import\"></use>\r\n </svg>\r\n {{ screenTexts?.buttons?.import ?? 'Import Roster' }}\r\n </button>\r\n </div>\r\n\r\n <!-- Required Columns Info -->\r\n <div class=\"ieeesa-roster-import__columns-card\">\r\n <div class=\"ieeesa-roster-import__columns-content\">\r\n <p class=\"ieeesa-roster-import__columns-title\">\r\n {{ screenTexts?.requiredColumnsTitle ?? 'Required columns' }}\r\n </p>\r\n <div class=\"ieeesa-roster-import__columns-chips\">\r\n <span\r\n *ngFor=\"let col of requiredColumns\"\r\n class=\"ieeesa-roster-import__chip\"\r\n >\r\n {{ col }}\r\n </span>\r\n </div>\r\n </div>\r\n <div class=\"ieeesa-roster-import__sample-wrapper\">\r\n <button\r\n mat-button\r\n class=\"mat-tertiary-button ieeesa-roster-import__download-btn\"\r\n (click)=\"downloadSampleFile()\"\r\n type=\"button\"\r\n [attr.aria-label]=\"screenTexts?.ariaLabel?.downloadSample ?? 'Download Sample File'\"\r\n >\r\n <svg\r\n class=\"ieeesa-roster-import__download-btn-icon\"\r\n aria-hidden=\"true\"\r\n >\r\n <use xlink:href=\"assets/images/sprites/sprites.svg#icon-file-doc\"></use>\r\n </svg>\r\n {{ screenTexts?.downloadSampleLabel ?? 'Download Sample File' }}\r\n </button>\r\n </div>\r\n </div>\r\n\r\n <p class=\"ieeesa-roster-import__upload-label\">\r\n {{ screenTexts?.uploadLabel ?? 'Upload your file' }}\r\n </p>\r\n\r\n <!-- Upload State -->\r\n <ng-container *ngIf=\"importState === 'upload'\">\r\n <!-- Hidden file input -->\r\n <input\r\n #fileInput\r\n type=\"file\"\r\n [accept]=\"acceptedFileTypes\"\r\n (change)=\"onFileSelected($event)\"\r\n hidden\r\n [attr.aria-label]=\"screenTexts?.uploadLabel ?? 'Upload your file'\"\r\n />\r\n\r\n <!-- Drag & Drop Zone -->\r\n <div\r\n class=\"ieeesa-roster-import__dropzone\"\r\n [class.ieeesa-roster-import__dropzone--active]=\"isDragOver\"\r\n (dragover)=\"onDragOver($event)\"\r\n (dragleave)=\"onDragLeave($event)\"\r\n (drop)=\"onFileDrop($event)\"\r\n (click)=\"fileInput.click()\"\r\n role=\"button\"\r\n tabindex=\"0\"\r\n (keydown.enter)=\"fileInput.click()\"\r\n (keydown.space)=\"fileInput.click()\"\r\n [attr.aria-label]=\"screenTexts?.ariaLabel?.dropzone ?? 'Drag and drop file upload area'\"\r\n >\r\n <ng-container *ngIf=\"!selectedFile\">\r\n <svg class=\"ieeesa-roster-import__upload-icon\" width=\"22\" height=\"22\">\r\n <use xlink:href=\"assets/images/sprites/sprites.svg#icon-upload-gray\"></use>\r\n </svg>\r\n <p class=\"ieeesa-roster-import__dropzone-text\">\r\n {{ screenTexts?.dropzoneText ?? 'Drag & drop a file here, or click to browse' }}\r\n </p>\r\n <p class=\"ieeesa-roster-import__dropzone-hint\">\r\n {{ screenTexts?.dropzoneHint ?? 'Accepted formats: .csv, .xls, .xlsx' }}\r\n </p>\r\n </ng-container>\r\n <ng-container *ngIf=\"selectedFile\">\r\n <svg class=\"ieeesa-roster-import__upload-icon\" width=\"22\" height=\"22\">\r\n <use xlink:href=\"assets/images/sprites/sprites.svg#icon-upload-gray\"></use>\r\n </svg>\r\n <div class=\"ieeesa-roster-import__file-row\">\r\n <p class=\"ieeesa-roster-import__file-name\">\r\n <svg width=\"14\" height=\"14\">\r\n <use xlink:href=\"assets/images/sprites/sprites.svg#icon-file-doc\"></use>\r\n </svg>\r\n {{ selectedFile.name }}\r\n </p>\r\n <button\r\n mat-button\r\n class=\"ieeesa-roster-import__remove-file-btn\"\r\n (click)=\"onRemoveFile(); $event.stopPropagation()\"\r\n type=\"button\"\r\n [attr.aria-label]=\"screenTexts?.ariaLabel?.remove ?? 'Remove selected file'\"\r\n >\r\n &times;\r\n </button>\r\n </div>\r\n </ng-container>\r\n </div>\r\n\r\n <!-- Inline Error Message -->\r\n <div\r\n *ngIf=\"errorMessage\"\r\n class=\"ieeesa-roster-import__error-banner\"\r\n role=\"alert\"\r\n >\r\n {{ errorMessage }}\r\n </div>\r\n </ng-container>\r\n\r\n <!-- Processing / Result share the file display + progress bar -->\r\n <ng-container *ngIf=\"importState === 'processing' || importState === 'result'\">\r\n <div\r\n class=\"ieeesa-roster-import__dropzone ieeesa-roster-import__dropzone--result\"\r\n >\r\n <svg class=\"ieeesa-roster-import__upload-icon\" width=\"22\" height=\"22\">\r\n <use xlink:href=\"assets/images/sprites/sprites.svg#icon-upload-gray\"></use>\r\n </svg>\r\n <p class=\"ieeesa-roster-import__file-name\">\r\n <svg width=\"14\" height=\"14\">\r\n <use xlink:href=\"assets/images/sprites/sprites.svg#icon-file-doc\"></use>\r\n </svg>\r\n {{ selectedFile?.name }}\r\n </p>\r\n </div>\r\n\r\n <!-- Progress label + percentage -->\r\n <div class=\"ieeesa-roster-import__progress-head\">\r\n <span class=\"ieeesa-roster-import__progress-label\">\r\n {{ screenTexts?.processingLabel ?? 'Processing file records....' }}\r\n </span>\r\n <span class=\"ieeesa-roster-import__progress-percent\">\r\n {{ progressValue | number: '1.0-0' }}%\r\n </span>\r\n </div>\r\n <mat-progress-bar\r\n class=\"ieeesa-roster-import__progress-bar\"\r\n mode=\"determinate\"\r\n [value]=\"progressValue\"\r\n [attr.aria-label]=\"screenTexts?.processingLabel ?? 'Processing file records....'\"\r\n ></mat-progress-bar>\r\n </ng-container>\r\n\r\n <!-- Result State (summary + errors) -->\r\n <ng-container *ngIf=\"importState === 'result' && uploadResult\">\r\n <!-- No data records banner (headers only, zero rows) -->\r\n <div\r\n *ngIf=\"noDataMessage\"\r\n class=\"ieeesa-roster-import__no-data-banner\"\r\n role=\"status\"\r\n >\r\n {{ noDataMessage }}\r\n </div>\r\n\r\n <!-- Summary cards -->\r\n <div *ngIf=\"showSummaryCards\" class=\"ieeesa-roster-import__summary-cards\">\r\n <div\r\n class=\"ieeesa-roster-import__summary-card ieeesa-roster-import__summary-card--success\"\r\n >\r\n <p class=\"ieeesa-roster-import__summary-card-count\">\r\n {{ uploadResult.successCount }}\r\n </p>\r\n <p class=\"ieeesa-roster-import__summary-card-label\">\r\n {{ screenTexts?.result?.successCardLabel ?? 'Rosters added successfully' }}\r\n </p>\r\n </div>\r\n <div\r\n class=\"ieeesa-roster-import__summary-card ieeesa-roster-import__summary-card--skipped\"\r\n >\r\n <p class=\"ieeesa-roster-import__summary-card-count\">\r\n {{ uploadResult.failureCount }}\r\n </p>\r\n <p class=\"ieeesa-roster-import__summary-card-label\">\r\n {{ screenTexts?.result?.skippedCardLabel ?? 'Skipped Rows' }}\r\n </p>\r\n </div>\r\n </div>\r\n\r\n <!-- Row Errors Card -->\r\n <div *ngIf=\"jobErrors.length\" class=\"ieeesa-roster-import__errors-card\">\r\n <p class=\"ieeesa-roster-import__errors-header\">\r\n <ng-container *ngIf=\"allRowsSkipped; else someErrors\">\r\n {{ screenTexts?.result?.allRowsSkippedHeader ?? 'All Rows are skipped' }}\r\n </ng-container>\r\n <ng-template #someErrors>\r\n {{ screenTexts?.result?.errorsHeader ?? 'Row errors \u2014 these rows will be skipped' }}\r\n </ng-template>\r\n </p>\r\n <div class=\"ieeesa-roster-import__errors-body\">\r\n <div\r\n *ngFor=\"let rowErr of jobErrors\"\r\n class=\"ieeesa-roster-import__error-row\"\r\n >\r\n <p class=\"ieeesa-roster-import__error-row-title\">\r\n Row {{ rowErr.rowNumber }} \u2014 {{ rowErr.errorMessage }}\r\n </p>\r\n </div>\r\n </div>\r\n </div>\r\n </ng-container>\r\n\r\n <!-- Footer actions -->\r\n <div class=\"ieeesa-roster-import__actions\">\r\n <button\r\n mat-button\r\n class=\"mat-tertiary-button ieeesa-roster-import__cancel-btn\"\r\n (click)=\"onCancel()\"\r\n type=\"button\"\r\n >\r\n {{ screenTexts?.buttons?.cancel ?? 'Cancel' }}\r\n </button>\r\n <button\r\n *ngIf=\"importState === 'result' && jobErrors.length\"\r\n mat-button\r\n type=\"button\"\r\n class=\"mat-primary-button ieeesa-roster-import__error-log-btn\"\r\n (click)=\"downloadErrorLog()\"\r\n [attr.aria-label]=\"screenTexts?.ariaLabel?.downloadErrorLog ?? 'Download Error log'\"\r\n >\r\n {{ screenTexts?.buttons?.downloadErrorLog ?? 'Download Error log' }}\r\n </button>\r\n </div>\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}.mat-mdc-dialog-content:has(>.ieeesa-roster-import),.mdc-dialog__content:has(>.ieeesa-roster-import),.mat-mdc-dialog-content:has(.ieeesa-roster-import),.mdc-dialog__content:has(.ieeesa-roster-import){max-height:none!important;min-height:320px!important;height:auto!important;overflow:visible!important}.ieeesa-modal-dialog.ieeesa-roster-import-dialog{width:720px!important;max-width:calc(100vw - 32px)!important}.ieeesa-modal-dialog.ieeesa-roster-import-dialog .ieeesa-modal{box-shadow:0 4px 24px #00000080!important}.ieeesa-modal-dialog.ieeesa-roster-import-dialog .mat-mdc-dialog-content,.ieeesa-modal-dialog.ieeesa-roster-import-dialog [mat-dialog-content],.ieeesa-modal-dialog.ieeesa-roster-import-dialog .mdc-dialog__content,.ieeesa-modal-dialog.ieeesa-roster-import-dialog .mat-mdc-dialog-container .mdc-dialog__content,.ieeesa-modal-dialog.ieeesa-roster-import-dialog .mat-mdc-dialog-surface,.ieeesa-modal-dialog.ieeesa-roster-import-dialog .mdc-dialog__surface,.ieeesa-modal-dialog.ieeesa-roster-import-dialog .ieeesa-modal,.ieeesa-modal-dialog.ieeesa-roster-import-dialog .ieeesa-modal>.ieeesa-label-lg-16{max-height:none!important;overflow:visible!important}.ieeesa-modal-dialog.ieeesa-roster-import-dialog .ieeesa-modal-title{border-bottom:1px solid #e5e7eb;padding-bottom:16px;margin-bottom:16px!important}.ieeesa-modal-dialog.ieeesa-roster-import-dialog .mat-mdc-dialog-content{min-height:0!important;padding:0!important}.ieeesa-modal-dialog.ieeesa-roster-import-dialog .ieeesa-modal-title{display:flex;align-items:center;gap:4px}.ieeesa-roster-import{background:#fff;position:relative;box-sizing:border-box;width:100%;font-family:Calibri Regular,sans-serif}.ieeesa-roster-import strong,.ieeesa-roster-import b,.ieeesa-roster-import .ieeesa-roster-import__subheader-title,.ieeesa-roster-import .ieeesa-roster-import__columns-title,.ieeesa-roster-import .ieeesa-roster-import__import-btn,.ieeesa-roster-import .ieeesa-roster-import__summary-card-count{font-family:Calibri Bold,sans-serif}.ieeesa-roster-import__subheader{display:flex;align-items:center;justify-content:space-between;gap:12px;padding:10px 1.5em;margin:0 -1.5em 20px;min-height:48px;background-color:#f4f5f7}.ieeesa-roster-import__subheader-title{font-size:14px;font-weight:600;color:#4a5565}.ieeesa-roster-import__import-btn.mat-tertiary-button{display:inline-flex;align-items:center;justify-content:center;gap:6px;min-width:auto;width:auto;border:1px solid #00629b;color:#00629b;border-radius:4px;background-color:#fff;font-size:13px;font-weight:600;line-height:1;height:36px!important;min-height:36px!important;padding:0 16px!important;white-space:nowrap;box-shadow:none}.ieeesa-roster-import__import-btn.mat-tertiary-button .mdc-button__label{display:inline-flex;align-items:center;gap:6px}.ieeesa-roster-import__import-btn.mat-tertiary-button:hover:not(:disabled){background-color:#f7fbff}.ieeesa-roster-import__import-btn.mat-tertiary-button:disabled{border-color:#cbd5e1;color:#9aa4b2}.ieeesa-roster-import__import-btn-icon{width:14px;height:14px;flex-shrink:0;display:block;vertical-align:middle}.ieeesa-roster-import__columns-card{display:flex;align-items:flex-start;justify-content:space-between;gap:12px;border:1px solid #2f9fe6;border-radius:6px;background:#f3f9ff;padding:10px;margin:0 0 24px}.ieeesa-roster-import__columns-content{flex:1;min-width:0}.ieeesa-roster-import__columns-title{margin:0 0 10px;font-family:Calibri Bold,sans-serif;font-size:14px;font-weight:700;color:#005587}.ieeesa-roster-import__columns-chips{display:flex;flex-wrap:wrap;gap:6px}.ieeesa-roster-import__chip{display:inline-block;font-family:Calibri Bold,sans-serif;border:1px solid #d4d8e1;border-radius:4px;background:#e9edf4;padding:6px 12px;color:#6b7280;font-size:12px;font-weight:600}.ieeesa-roster-import__download-btn.mat-tertiary-button{display:inline-flex;align-items:center;gap:4px;min-width:auto;width:auto;border:1px solid #00629b;color:#00629b;border-radius:4px;background-color:#fff;font-size:12px;font-weight:600;line-height:18px;height:30px!important;min-height:30px!important;padding:0 12px!important;white-space:nowrap;box-shadow:none}.ieeesa-roster-import__download-btn.mat-tertiary-button:hover{background-color:#f7fbff}.ieeesa-roster-import__download-btn-icon{width:14px;height:14px;flex-shrink:0}.ieeesa-roster-import__upload-label{margin:0 0 8px;font-family:Calibri Bold,sans-serif;font-size:14px;font-weight:600;color:#4a5565}.ieeesa-roster-import__dropzone{border:2px dashed #cccccc;border-radius:8px;min-height:108px;padding:20px 16px;margin:0 0 12px;display:flex;flex-direction:column;align-items:center;justify-content:center;text-align:center;cursor:pointer;background:#fafafa}.ieeesa-roster-import__dropzone:hover,.ieeesa-roster-import__dropzone--active{border-color:#00629b;background:#f4f9fc}.ieeesa-roster-import__dropzone--result{cursor:default;pointer-events:none}.ieeesa-roster-import__upload-icon{color:#5c6371;font-size:18px;line-height:1;margin-bottom:8px}.ieeesa-roster-import__dropzone-text{margin:0;font-family:Calibri Bold,sans-serif;font-size:14px;font-weight:600;color:#4a5565}.ieeesa-roster-import__dropzone-hint{margin:6px 0 0;font-family:Calibri Regular,sans-serif;font-size:12px;color:#99a1af}.ieeesa-roster-import__file-row{display:flex;align-items:center;justify-content:center;gap:6px}.ieeesa-roster-import__file-name{margin:0;font-size:14px;font-weight:600;color:#00629b;display:flex;align-items:center;gap:4px}.ieeesa-roster-import__remove-file-btn{display:inline-flex;align-items:center;justify-content:center;font-size:16px;line-height:1;color:#ba0c2f;min-width:auto;width:20px;height:20px;padding:0;cursor:pointer}.ieeesa-roster-import__error-banner{display:flex;flex-direction:column;padding:10px 14px;background-color:#fdecea;border:1px solid #ff6467;border-radius:4px;margin:0 0 12px;font-size:12px;color:#ba0c2f}.ieeesa-roster-import__no-data-banner{padding:10px 14px;background-color:#fefce8;border:1px solid #fdc700;border-radius:4px;margin:16px 0 0;font-size:13px;color:#894b00}.ieeesa-roster-import__progress-head{display:flex;align-items:center;justify-content:space-between;margin:16px 0 8px}.ieeesa-roster-import__progress-label{font-family:Calibri Regular,sans-serif;font-size:14px;color:#6f7782}.ieeesa-roster-import__progress-percent{font-family:Calibri Regular,sans-serif;font-size:14px;font-weight:600;color:#6f7782}.ieeesa-roster-import__progress-bar{--mdc-linear-progress-active-indicator-color: #00629b;--mdc-linear-progress-track-color: #dce6ef;border-radius:6px;height:14px;margin:0 0 8px;overflow:hidden}.ieeesa-roster-import__progress-bar .mdc-linear-progress__bar-inner{border-color:#00629b}.ieeesa-roster-import__summary-cards{display:flex;gap:16px;margin:16px 0}.ieeesa-roster-import__summary-card{flex:1;border:1px solid #e3e5e8;border-radius:6px;padding:14px 16px;background:#fff}.ieeesa-roster-import__summary-card-count{margin:0 0 4px;font-family:Calibri Bold,sans-serif;font-size:28px;font-weight:700;line-height:1.1}.ieeesa-roster-import__summary-card--success .ieeesa-roster-import__summary-card-count{color:#27783a}.ieeesa-roster-import__summary-card--skipped .ieeesa-roster-import__summary-card-count{color:#ba0c2f}.ieeesa-roster-import__summary-card-label{margin:0;font-family:Calibri Regular,sans-serif;font-size:14px;color:#6f7782}.ieeesa-roster-import__errors-card{border:1px solid #ff6467;border-radius:4px;margin:0 0 16px;background-color:#fdecea;overflow:hidden}.ieeesa-roster-import__errors-header{margin:0;padding:8px 14px;font-size:12px;font-weight:700;color:#ba0c2f;background-color:#fcd9dd;border-bottom:1px solid #ff6467}.ieeesa-roster-import__errors-body{max-height:200px;overflow-y:auto;padding:10px 14px}.ieeesa-roster-import__error-row{margin-bottom:8px}.ieeesa-roster-import__error-row:last-child{margin-bottom:0}.ieeesa-roster-import__error-row-title{margin:0;font-size:12px;font-weight:400;color:#ba0c2f;line-height:1.5}.ieeesa-roster-import__actions{display:flex;align-items:center;gap:14px;margin:20px -1.5em 0;padding:16px 1.5em 0;border-top:1px solid #e5e7eb}.ieeesa-roster-import__import-submit-btn{background-color:#00629b;color:#fff;font-size:13px;font-weight:600;border-radius:4px;padding:7px 14px}.ieeesa-roster-import__error-log-btn{margin-left:auto;background-color:#00629b;color:#fff;font-size:13px;font-weight:600;border-radius:4px;padding:7px 14px}.ieeesa-roster-import__error-log-btn:hover{background-color:#005587}\n"] }]
369
- }], propDecorators: { componentData: [{
527
+ args: [{ selector: 'ieeesa-roster-import', standalone: true, imports: [CommonModule, MatButtonModule, MatProgressBarModule], encapsulation: ViewEncapsulation.None, template: "<div class=\"ieeesa-roster-import\">\r\n <!-- Sub-heading band: \"Bulk Import Participants\" on the left, Import Roster\r\n action on the right (appears once a file is selected) \u2014 matches the Figma.\r\n The \"\u2190 Back to Rosters / Import Roster\" title row + X are rendered by the\r\n shared ModalComponent above this. -->\r\n <div class=\"ieeesa-roster-import__subheader\">\r\n <span class=\"ieeesa-roster-import__subheader-title\">\r\n {{ screenTexts?.subHeading ?? 'Bulk Import Participants' }}\r\n </span>\r\n <button\r\n *ngIf=\"selectedFile\"\r\n mat-button\r\n type=\"button\"\r\n class=\"mat-tertiary-button ieeesa-roster-import__import-btn\"\r\n [disabled]=\"importState === 'processing'\"\r\n (click)=\"onImport()\"\r\n [attr.aria-label]=\"screenTexts?.buttons?.import ?? 'Import Roster'\"\r\n >\r\n <svg class=\"ieeesa-roster-import__import-btn-icon\" width=\"14\" height=\"14\" aria-hidden=\"true\">\r\n <use xlink:href=\"assets/images/sprites/sprites.svg#icon-import\"></use>\r\n </svg>\r\n {{ screenTexts?.buttons?.import ?? 'Import Roster' }}\r\n </button>\r\n </div>\r\n\r\n <!-- Required Columns Info -->\r\n <div class=\"ieeesa-roster-import__columns-card\">\r\n <div class=\"ieeesa-roster-import__columns-content\">\r\n <p class=\"ieeesa-roster-import__columns-title\">\r\n {{ screenTexts?.requiredColumnsTitle ?? 'Required columns' }}\r\n </p>\r\n <div class=\"ieeesa-roster-import__columns-chips\">\r\n <span\r\n *ngFor=\"let col of requiredColumns\"\r\n class=\"ieeesa-roster-import__chip\"\r\n >\r\n {{ col }}\r\n </span>\r\n </div>\r\n </div>\r\n <div class=\"ieeesa-roster-import__sample-wrapper\">\r\n <button\r\n mat-button\r\n class=\"mat-tertiary-button ieeesa-roster-import__download-btn\"\r\n (click)=\"downloadSampleFile()\"\r\n type=\"button\"\r\n [attr.aria-label]=\"screenTexts?.ariaLabel?.downloadSample ?? 'Download Sample File'\"\r\n >\r\n <svg\r\n class=\"ieeesa-roster-import__download-btn-icon\"\r\n aria-hidden=\"true\"\r\n >\r\n <use xlink:href=\"assets/images/sprites/sprites.svg#icon-file-doc\"></use>\r\n </svg>\r\n {{ screenTexts?.downloadSampleLabel ?? 'Download Sample File' }}\r\n </button>\r\n </div>\r\n </div>\r\n\r\n <p class=\"ieeesa-roster-import__upload-label\">\r\n {{ screenTexts?.uploadLabel ?? 'Upload your file' }}\r\n </p>\r\n\r\n <!-- Upload State -->\r\n <ng-container *ngIf=\"importState === 'upload'\">\r\n <!-- Hidden file input -->\r\n <input\r\n #fileInput\r\n type=\"file\"\r\n [accept]=\"acceptedFileTypes\"\r\n (change)=\"onFileSelected($event)\"\r\n hidden\r\n [attr.aria-label]=\"screenTexts?.uploadLabel ?? 'Upload your file'\"\r\n />\r\n\r\n <!-- Drag & Drop Zone -->\r\n <div\r\n class=\"ieeesa-roster-import__dropzone\"\r\n [class.ieeesa-roster-import__dropzone--active]=\"isDragOver\"\r\n (dragover)=\"onDragOver($event)\"\r\n (dragleave)=\"onDragLeave($event)\"\r\n (drop)=\"onFileDrop($event)\"\r\n (click)=\"fileInput.click()\"\r\n role=\"button\"\r\n tabindex=\"0\"\r\n (keydown.enter)=\"fileInput.click()\"\r\n (keydown.space)=\"fileInput.click()\"\r\n [attr.aria-label]=\"screenTexts?.ariaLabel?.dropzone ?? 'Drag and drop file upload area'\"\r\n >\r\n <ng-container *ngIf=\"!selectedFile\">\r\n <svg class=\"ieeesa-roster-import__upload-icon\" width=\"22\" height=\"22\">\r\n <use xlink:href=\"assets/images/sprites/sprites.svg#icon-upload-gray\"></use>\r\n </svg>\r\n <p class=\"ieeesa-roster-import__dropzone-text\">\r\n {{ screenTexts?.dropzoneText ?? 'Drag & drop a file here, or click to browse' }}\r\n </p>\r\n <p class=\"ieeesa-roster-import__dropzone-hint\">\r\n {{ screenTexts?.dropzoneHint ?? 'Accepted formats: .csv, .xlsx' }}\r\n </p>\r\n </ng-container>\r\n <ng-container *ngIf=\"selectedFile\">\r\n <svg class=\"ieeesa-roster-import__upload-icon\" width=\"22\" height=\"22\">\r\n <use xlink:href=\"assets/images/sprites/sprites.svg#icon-upload-gray\"></use>\r\n </svg>\r\n <div class=\"ieeesa-roster-import__file-row\">\r\n <p class=\"ieeesa-roster-import__file-name\">\r\n <svg width=\"14\" height=\"14\">\r\n <use xlink:href=\"assets/images/sprites/sprites.svg#icon-file-doc\"></use>\r\n </svg>\r\n {{ selectedFile.name }}\r\n </p>\r\n <button\r\n mat-button\r\n class=\"ieeesa-roster-import__remove-file-btn\"\r\n (click)=\"onRemoveFile(); $event.stopPropagation()\"\r\n type=\"button\"\r\n [attr.aria-label]=\"screenTexts?.ariaLabel?.remove ?? 'Remove selected file'\"\r\n >\r\n &times;\r\n </button>\r\n </div>\r\n </ng-container>\r\n </div>\r\n\r\n <!-- Inline Error Message -->\r\n <div\r\n *ngIf=\"errorMessage\"\r\n class=\"ieeesa-roster-import__error-banner\"\r\n role=\"alert\"\r\n >\r\n {{ errorMessage }}\r\n </div>\r\n </ng-container>\r\n\r\n <!-- Processing / Result share the file display + progress bar -->\r\n <ng-container *ngIf=\"importState === 'processing' || importState === 'result'\">\r\n <div\r\n class=\"ieeesa-roster-import__dropzone ieeesa-roster-import__dropzone--result\"\r\n >\r\n <svg class=\"ieeesa-roster-import__upload-icon\" width=\"22\" height=\"22\">\r\n <use xlink:href=\"assets/images/sprites/sprites.svg#icon-upload-gray\"></use>\r\n </svg>\r\n <p class=\"ieeesa-roster-import__file-name\">\r\n <svg width=\"14\" height=\"14\">\r\n <use xlink:href=\"assets/images/sprites/sprites.svg#icon-file-doc\"></use>\r\n </svg>\r\n {{ selectedFile?.name }}\r\n </p>\r\n </div>\r\n\r\n <!-- Progress label (processing only) -->\r\n <div\r\n *ngIf=\"importState === 'processing'\"\r\n class=\"ieeesa-roster-import__progress-head\"\r\n >\r\n <span class=\"ieeesa-roster-import__progress-label\">\r\n {{ screenTexts?.processingLabel ?? 'Processing file records....' }}\r\n </span>\r\n </div>\r\n <mat-progress-bar\r\n *ngIf=\"importState === 'processing'\"\r\n class=\"ieeesa-roster-import__progress-bar\"\r\n mode=\"indeterminate\"\r\n [attr.aria-label]=\"screenTexts?.processingLabel ?? 'Processing file records....'\"\r\n ></mat-progress-bar>\r\n </ng-container>\r\n\r\n <!-- Result State (summary + errors) -->\r\n <ng-container *ngIf=\"importState === 'result' && uploadResult\">\r\n <!-- No data records banner (headers only, zero rows) -->\r\n <div\r\n *ngIf=\"noDataMessage\"\r\n class=\"ieeesa-roster-import__no-data-banner\"\r\n role=\"status\"\r\n >\r\n {{ noDataMessage }}\r\n </div>\r\n\r\n <!-- Summary cards -->\r\n <div *ngIf=\"showSummaryCards\" class=\"ieeesa-roster-import__summary-cards\">\r\n <div\r\n class=\"ieeesa-roster-import__summary-card ieeesa-roster-import__summary-card--success\"\r\n >\r\n <p class=\"ieeesa-roster-import__summary-card-count\">\r\n {{ uploadResult.successCount }}\r\n </p>\r\n <p class=\"ieeesa-roster-import__summary-card-label\">\r\n {{ screenTexts?.result?.successCardLabel ?? 'Rosters added successfully' }}\r\n </p>\r\n </div>\r\n <div\r\n class=\"ieeesa-roster-import__summary-card ieeesa-roster-import__summary-card--skipped\"\r\n >\r\n <p class=\"ieeesa-roster-import__summary-card-count\">\r\n {{ uploadResult.failureCount }}\r\n </p>\r\n <p class=\"ieeesa-roster-import__summary-card-label\">\r\n {{ screenTexts?.result?.skippedCardLabel ?? 'Skipped Rows' }}\r\n </p>\r\n </div>\r\n </div>\r\n\r\n <!-- Row Errors Card -->\r\n <div *ngIf=\"jobErrors.length\" class=\"ieeesa-roster-import__errors-card\">\r\n <p class=\"ieeesa-roster-import__errors-header\">\r\n <ng-container *ngIf=\"allRowsSkipped; else someErrors\">\r\n {{ screenTexts?.result?.allRowsSkippedHeader ?? 'All Rows are skipped' }}\r\n </ng-container>\r\n <ng-template #someErrors>\r\n {{ screenTexts?.result?.errorsHeader ?? 'Row errors \u2014 these rows will be skipped' }}\r\n </ng-template>\r\n </p>\r\n <div class=\"ieeesa-roster-import__errors-body\">\r\n <div\r\n *ngFor=\"let rowErr of jobErrors\"\r\n class=\"ieeesa-roster-import__error-row\"\r\n >\r\n <p class=\"ieeesa-roster-import__error-row-title\">\r\n Row {{ rowErr.rowNumber }} \u2014 {{ rowErr.errorMessage }}\r\n </p>\r\n </div>\r\n </div>\r\n </div>\r\n </ng-container>\r\n\r\n <!-- Footer actions -->\r\n <div class=\"ieeesa-roster-import__actions\">\r\n <button\r\n mat-button\r\n class=\"mat-tertiary-button ieeesa-roster-import__cancel-btn\"\r\n (click)=\"onCancel()\"\r\n type=\"button\"\r\n >\r\n {{ screenTexts?.buttons?.cancel ?? 'Cancel' }}\r\n </button>\r\n <button\r\n *ngIf=\"importState === 'result' && jobErrors.length\"\r\n mat-button\r\n type=\"button\"\r\n class=\"mat-primary-button ieeesa-roster-import__error-log-btn\"\r\n (click)=\"downloadErrorLog()\"\r\n [attr.aria-label]=\"screenTexts?.ariaLabel?.downloadErrorLog ?? 'Download Error log'\"\r\n >\r\n {{ screenTexts?.buttons?.downloadErrorLog ?? 'Download Error log' }}\r\n </button>\r\n </div>\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}.mat-mdc-dialog-content:has(>.ieeesa-roster-import),.mdc-dialog__content:has(>.ieeesa-roster-import),.mat-mdc-dialog-content:has(.ieeesa-roster-import),.mdc-dialog__content:has(.ieeesa-roster-import){max-height:none!important;min-height:320px!important;height:auto!important;overflow:visible!important}.ieeesa-modal-dialog.ieeesa-roster-import-dialog{width:720px!important;max-width:calc(100vw - 32px)!important}.ieeesa-modal-dialog.ieeesa-roster-import-dialog .ieeesa-modal{box-shadow:0 4px 24px #00000080!important}.ieeesa-modal-dialog.ieeesa-roster-import-dialog .mat-mdc-dialog-content,.ieeesa-modal-dialog.ieeesa-roster-import-dialog [mat-dialog-content],.ieeesa-modal-dialog.ieeesa-roster-import-dialog .mdc-dialog__content,.ieeesa-modal-dialog.ieeesa-roster-import-dialog .mat-mdc-dialog-container .mdc-dialog__content,.ieeesa-modal-dialog.ieeesa-roster-import-dialog .mat-mdc-dialog-surface,.ieeesa-modal-dialog.ieeesa-roster-import-dialog .mdc-dialog__surface,.ieeesa-modal-dialog.ieeesa-roster-import-dialog .ieeesa-modal,.ieeesa-modal-dialog.ieeesa-roster-import-dialog .ieeesa-modal>.ieeesa-label-lg-16{max-height:none!important;overflow:visible!important}.ieeesa-modal-dialog.ieeesa-roster-import-dialog .ieeesa-modal-title{border-bottom:1px solid #e5e7eb;padding-bottom:16px;margin-bottom:16px!important}.ieeesa-modal-dialog.ieeesa-roster-import-dialog .mat-mdc-dialog-content{min-height:0!important;padding:0!important}.ieeesa-modal-dialog.ieeesa-roster-import-dialog .ieeesa-modal-title{display:flex;align-items:center;gap:4px}.ieeesa-roster-import{background:#fff;position:relative;box-sizing:border-box;width:100%;font-family:Calibri Regular,sans-serif}.ieeesa-roster-import strong,.ieeesa-roster-import b,.ieeesa-roster-import .ieeesa-roster-import__subheader-title,.ieeesa-roster-import .ieeesa-roster-import__columns-title,.ieeesa-roster-import .ieeesa-roster-import__import-btn,.ieeesa-roster-import .ieeesa-roster-import__summary-card-count{font-family:Calibri Bold,sans-serif}.ieeesa-roster-import__subheader{display:flex;align-items:center;justify-content:space-between;gap:12px;padding:10px 1.5em;margin:0 -1.5em 20px;min-height:48px;background-color:#f4f5f7}.ieeesa-roster-import__subheader-title{font-size:14px;font-weight:600;color:#4a5565}.ieeesa-roster-import__import-btn.mat-tertiary-button{display:inline-flex;align-items:center;justify-content:center;gap:6px;min-width:auto;width:auto;border:1px solid #00629b;color:#00629b;border-radius:4px;background-color:#fff;font-size:13px;font-weight:600;line-height:1;height:36px!important;min-height:36px!important;padding:0 16px!important;white-space:nowrap;box-shadow:none}.ieeesa-roster-import__import-btn.mat-tertiary-button .mdc-button__label{display:inline-flex;align-items:center;gap:6px}.ieeesa-roster-import__import-btn.mat-tertiary-button:hover:not(:disabled){background-color:#f7fbff}.ieeesa-roster-import__import-btn.mat-tertiary-button:disabled{border-color:#cbd5e1;color:#9aa4b2}.ieeesa-roster-import__import-btn-icon{width:14px;height:14px;flex-shrink:0;display:block;vertical-align:middle}.ieeesa-roster-import__columns-card{display:flex;align-items:flex-start;justify-content:space-between;gap:12px;border:1px solid #2f9fe6;border-radius:6px;background:#f3f9ff;padding:10px;margin:0 0 24px}.ieeesa-roster-import__columns-content{flex:1;min-width:0}.ieeesa-roster-import__columns-title{margin:0 0 10px;font-family:Calibri Bold,sans-serif;font-size:14px;font-weight:700;color:#005587}.ieeesa-roster-import__columns-chips{display:flex;flex-wrap:wrap;gap:6px}.ieeesa-roster-import__chip{display:inline-block;font-family:Calibri Bold,sans-serif;border:1px solid #d4d8e1;border-radius:4px;background:#e9edf4;padding:6px 12px;color:#6b7280;font-size:12px;font-weight:600}.ieeesa-roster-import__download-btn.mat-tertiary-button{display:inline-flex;align-items:center;gap:4px;min-width:auto;width:auto;border:1px solid #00629b;color:#00629b;border-radius:4px;background-color:#fff;font-size:12px;font-weight:600;line-height:18px;height:30px!important;min-height:30px!important;padding:0 12px!important;white-space:nowrap;box-shadow:none}.ieeesa-roster-import__download-btn.mat-tertiary-button:hover{background-color:#f7fbff}.ieeesa-roster-import__download-btn-icon{width:14px;height:14px;flex-shrink:0}.ieeesa-roster-import__upload-label{margin:0 0 8px;font-family:Calibri Bold,sans-serif;font-size:14px;font-weight:600;color:#4a5565}.ieeesa-roster-import__dropzone{border:2px dashed #cccccc;border-radius:8px;min-height:108px;padding:20px 16px;margin:0 0 12px;display:flex;flex-direction:column;align-items:center;justify-content:center;text-align:center;cursor:pointer;background:#fafafa}.ieeesa-roster-import__dropzone:hover,.ieeesa-roster-import__dropzone--active{border-color:#00629b;background:#f4f9fc}.ieeesa-roster-import__dropzone--result{cursor:default;pointer-events:none}.ieeesa-roster-import__upload-icon{color:#5c6371;font-size:18px;line-height:1;margin-bottom:8px}.ieeesa-roster-import__dropzone-text{margin:0;font-family:Calibri Bold,sans-serif;font-size:14px;font-weight:600;color:#4a5565}.ieeesa-roster-import__dropzone-hint{margin:6px 0 0;font-family:Calibri Regular,sans-serif;font-size:12px;color:#99a1af}.ieeesa-roster-import__file-row{display:flex;align-items:center;justify-content:center;gap:6px}.ieeesa-roster-import__file-name{margin:0;font-size:14px;font-weight:600;color:#00629b;display:flex;align-items:center;gap:4px}.ieeesa-roster-import__remove-file-btn{display:inline-flex;align-items:center;justify-content:center;font-size:16px;line-height:1;color:#ba0c2f;min-width:auto;width:20px;height:20px;padding:0;cursor:pointer}.ieeesa-roster-import__error-banner{display:flex;flex-direction:column;padding:10px 14px;background-color:#fdecea;border:1px solid #ff6467;border-radius:4px;margin:0 0 12px;font-family:Calibri Regular,sans-serif;font-size:13px;font-weight:400;color:#b3261e}.ieeesa-roster-import__no-data-banner{padding:10px 14px;background-color:#fefce8;border:1px solid #fdc700;border-radius:4px;margin:16px 0 0;font-size:13px;color:#894b00}.ieeesa-roster-import__progress-head{display:flex;align-items:center;justify-content:space-between;margin:16px 0 8px}.ieeesa-roster-import__progress-label{font-family:Calibri Regular,sans-serif;font-size:14px;color:#6f7782}.ieeesa-roster-import__progress-percent{font-family:Calibri Regular,sans-serif;font-size:14px;font-weight:600;color:#6f7782}.ieeesa-roster-import__progress-bar{--mdc-linear-progress-active-indicator-color: #00629b;--mdc-linear-progress-track-color: #dce6ef;border-radius:6px;height:14px;margin:0 0 8px;overflow:hidden}.ieeesa-roster-import__progress-bar .mdc-linear-progress__bar-inner{border-color:#00629b}.ieeesa-roster-import__summary-cards{display:flex;gap:16px;margin:16px 0}.ieeesa-roster-import__summary-card{flex:1;border:1px solid #e3e5e8;border-radius:6px;padding:14px 16px;background:#fff}.ieeesa-roster-import__summary-card-count{margin:0 0 4px;font-family:Calibri Bold,sans-serif;font-size:28px;font-weight:700;line-height:1.1}.ieeesa-roster-import__summary-card--success .ieeesa-roster-import__summary-card-count{color:#27783a}.ieeesa-roster-import__summary-card--skipped .ieeesa-roster-import__summary-card-count{color:#ba0c2f}.ieeesa-roster-import__summary-card-label{margin:0;font-family:Calibri Regular,sans-serif;font-size:14px;color:#6f7782}.ieeesa-roster-import__errors-card{border:1px solid #ff6467;border-radius:4px;margin:0 0 16px;background-color:#fdecea;overflow:hidden}.ieeesa-roster-import__errors-header{margin:0;padding:8px 14px;font-size:12px;font-weight:700;color:#ba0c2f;background-color:#fcd9dd;border-bottom:1px solid #ff6467}.ieeesa-roster-import__errors-body{max-height:200px;overflow-y:auto;padding:10px 14px}.ieeesa-roster-import__error-row{margin-bottom:8px}.ieeesa-roster-import__error-row:last-child{margin-bottom:0}.ieeesa-roster-import__error-row-title{margin:0;font-size:12px;font-weight:400;color:#ba0c2f;line-height:1.5}.ieeesa-roster-import__actions{display:flex;align-items:center;gap:14px;margin:20px -1.5em 0;padding:16px 1.5em 0;border-top:1px solid #e5e7eb}.ieeesa-roster-import__import-submit-btn{background-color:#00629b;color:#fff;font-size:13px;font-weight:600;border-radius:4px;padding:7px 14px}.ieeesa-roster-import__error-log-btn{margin-left:auto;background-color:#00629b;color:#fff;font-size:13px;font-weight:600;border-radius:4px;padding:7px 14px}.ieeesa-roster-import__error-log-btn:hover{background-color:#005587}\n"] }]
528
+ }], ctorParameters: function () { return [{ type: i1.RosterImportApiService }, { type: i2.GroupsService }]; }, propDecorators: { componentData: [{
370
529
  type: Input
371
530
  }], submitFormResponse: [{
372
531
  type: Output
373
532
  }], formCancel: [{
374
533
  type: Output
375
534
  }] } });
376
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicm9zdGVyLWltcG9ydC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9ncm91cHMvc3JjL2xpYi9jb21wb25lbnRzL3Jvc3Rlci1pbXBvcnQvcm9zdGVyLWltcG9ydC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9ncm91cHMvc3JjL2xpYi9jb21wb25lbnRzL3Jvc3Rlci1pbXBvcnQvcm9zdGVyLWltcG9ydC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0wsU0FBUyxFQUNULFlBQVksRUFDWixLQUFLLEVBRUwsTUFBTSxFQUNOLGlCQUFpQixHQUNsQixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDL0MsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQzNELE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLGdDQUFnQyxDQUFDO0FBQ3RFLE9BQU8sRUFBRSxRQUFRLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQ3RFLE9BQU8sRUFDTCx3QkFBd0IsR0FHekIsTUFBTSxrQ0FBa0MsQ0FBQztBQUMxQyxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxrQ0FBa0MsQ0FBQztBQUNyRSxPQUFPLEtBQUssU0FBUyxNQUFNLDZCQUE2QixDQUFDOzs7OztBQUt6RCw0REFBNEQ7QUFDNUQsTUFBTSxrQkFBa0IsR0FBRyxJQUFJLENBQUM7QUFFaEM7Ozs7Ozs7Ozs7O0dBV0c7QUFTSCxNQUFNLE9BQU8scUJBQXFCO0lBUmxDO1FBYUUsOEVBQThFO1FBQzlFLDhEQUE4RDtRQUNwRCx1QkFBa0IsR0FBRyxJQUFJLFlBQVksRUFBTyxDQUFDO1FBRXZELHFFQUFxRTtRQUMzRCxl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cUIsNk1DOUNsQyw2c1RBdVBBLHdnaUJEOU1ZLFlBQVksdVRBQUUsZUFBZSwyUUFBRSxvQkFBb0I7OzRGQUtsRCxxQkFBcUI7a0JBUmpDLFNBQVM7K0JBQ0Usc0JBQXNCLGNBQ3BCLElBQUksV0FDUCxDQUFDLFlBQVksRUFBRSxlQUFlLEVBQUUsb0JBQW9CLENBQUMsaUJBRy9DLGlCQUFpQixDQUFDLElBQUk7OEJBSzVCLGFBQWE7c0JBQXJCLEtBQUs7Z0JBSUksa0JBQWtCO3NCQUEzQixNQUFNO2dCQUdHLFVBQVU7c0JBQW5CLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xyXG4gIENvbXBvbmVudCxcclxuICBFdmVudEVtaXR0ZXIsXHJcbiAgSW5wdXQsXHJcbiAgT25EZXN0cm95LFxyXG4gIE91dHB1dCxcclxuICBWaWV3RW5jYXBzdWxhdGlvbixcclxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgQ29tbW9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcclxuaW1wb3J0IHsgTWF0QnV0dG9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvYnV0dG9uJztcclxuaW1wb3J0IHsgTWF0UHJvZ3Jlc3NCYXJNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9wcm9ncmVzcy1iYXInO1xyXG5pbXBvcnQgeyBpbnRlcnZhbCwgU3ViamVjdCwgdGltZXIsIHRha2VVbnRpbCwgdGFrZVdoaWxlIH0gZnJvbSAncnhqcyc7XHJcbmltcG9ydCB7XHJcbiAgUm9zdGVySW1wb3J0TW9ja1NjZW5hcmlvLFxyXG4gIFJvc3RlclVwbG9hZEVycm9yLFxyXG4gIFJvc3RlclVwbG9hZFJlc3BvbnNlLFxyXG59IGZyb20gJy4uLy4uL21vZGVscy9yb3N0ZXItaW1wb3J0Lm1vZGVsJztcclxuaW1wb3J0IHsgUm9zdGVySW1wb3J0TW9ja3MgfSBmcm9tICcuLi8uLi9hc3NldHMvcm9zdGVyLWltcG9ydC1tb2Nrcyc7XHJcbmltcG9ydCAqIGFzIGNvbnN0YW50cyBmcm9tICcuLi8uLi9hc3NldHMvY29uc3RhbnRzLmpzb24nO1xyXG5cclxuLyoqIFN0YXRlcyBvZiB0aGUgcm9zdGVyIGltcG9ydCBmbG93LiAqL1xyXG50eXBlIFJvc3RlckltcG9ydFN0YXRlID0gJ3VwbG9hZCcgfCAncHJvY2Vzc2luZycgfCAncmVzdWx0JztcclxuXHJcbi8qKiBTaW11bGF0ZWQgcHJvY2Vzc2luZyBkdXJhdGlvbiAobXMpIGZvciB0aGUgbW9jayBmbG93LiAqL1xyXG5jb25zdCBNT0NLX1BST0NFU1NJTkdfTVMgPSAxODAwO1xyXG5cclxuLyoqXHJcbiAqIFJvc3RlciBJbXBvcnQgZGlhbG9nIChNT0NLIGRhdGEgcGhhc2UpLlxyXG4gKlxyXG4gKiBMZXRzIGFuIGFkbWluIHVwbG9hZCBhIENTVi9YTFMvWExTWCByb3N0ZXIgZmlsZSwgc2hvd3MgYSBwcm9jZXNzaW5nIHByb2dyZXNzXHJcbiAqIGJhciwgdGhlbiBhIHJlc3VsdCBzdW1tYXJ5IChhZGRlZCAvIHNraXBwZWQpIHdpdGggcGVyLXJvdyBlcnJvcnMgYW5kIGFuXHJcbiAqIGVycm9yLWxvZyBkb3dubG9hZC4gTWlycm9ycyB0aGUgZXZlbnRzLWFuZC1tZWV0aW5ncyBidWxrLWltcG9ydC1wYXJ0aWNpcGFudHNcclxuICogZmxvdy4gVGhlIHJlYWwgYmFja2VuZCBpcyBub3Qgd2lyZWQgeWV0IOKAlCB7QGxpbmsgb25JbXBvcnR9IHJlc29sdmVzIGEgbW9ja1xyXG4gKiByZXNwb25zZSBhZnRlciBhIHNob3J0IGRlbGF5IHNvIGV2ZXJ5IEZpZ21hIHN0YXRlIGNhbiBiZSBleGVyY2lzZWQuXHJcbiAqXHJcbiAqIEBleHBvcnRcclxuICogQGNsYXNzIFJvc3RlckltcG9ydENvbXBvbmVudFxyXG4gKi9cclxuQENvbXBvbmVudCh7XHJcbiAgc2VsZWN0b3I6ICdpZWVlc2Etcm9zdGVyLWltcG9ydCcsXHJcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcclxuICBpbXBvcnRzOiBbQ29tbW9uTW9kdWxlLCBNYXRCdXR0b25Nb2R1bGUsIE1hdFByb2dyZXNzQmFyTW9kdWxlXSxcclxuICB0ZW1wbGF0ZVVybDogJy4vcm9zdGVyLWltcG9ydC5jb21wb25lbnQuaHRtbCcsXHJcbiAgc3R5bGVVcmxzOiBbJy4vcm9zdGVyLWltcG9ydC5jb21wb25lbnQuc2NzcyddLFxyXG4gIGVuY2Fwc3VsYXRpb246IFZpZXdFbmNhcHN1bGF0aW9uLk5vbmUsXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBSb3N0ZXJJbXBvcnRDb21wb25lbnQgaW1wbGVtZW50cyBPbkRlc3Ryb3kge1xyXG4gIC8qKiBDYXJyaWVzIHRoZSB7IGdyb3VwSWQsIGdyb3VwTmFtZSB9IHBheWxvYWQgZnJvbSB0aGUgb3BlbmluZyBkaWFsb2cuICovXHJcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcclxuICBASW5wdXQoKSBjb21wb25lbnREYXRhOiBhbnk7XHJcblxyXG4gIC8qKiBFbWl0dGVkIGFmdGVyIGFuIGltcG9ydCB0aGF0IGFkZGVkIGF0IGxlYXN0IG9uZSByb3cgKHBhcmVudCByZWZyZXNoZXMpLiAqL1xyXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XHJcbiAgQE91dHB1dCgpIHN1Ym1pdEZvcm1SZXNwb25zZSA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xyXG5cclxuICAvKiogRW1pdHRlZCB3aGVuIHRoZSB1c2VyIGNhbmNlbHMvY2xvc2VzIHdpdGhvdXQgYSBzdWNjZXNzZnVsIGFkZC4gKi9cclxuICBAT3V0cHV0KCkgZm9ybUNhbmNlbCA9IG5ldyBFdmVudEVtaXR0ZXI8dm9pZD4oKTtcclxuXHJcbiAgZGVzdHJveSQgPSBuZXcgU3ViamVjdDxib29sZWFuPigpO1xyXG5cclxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxyXG4gIGNvbnN0YW50czogYW55ID0gY29uc3RhbnRzO1xyXG4gIHNjcmVlblRleHRzID0gdGhpcy5jb25zdGFudHM/LnJvc3RlckltcG9ydDtcclxuXHJcbiAgLyoqIEN1cnJlbnQgc3RhdGUgb2YgdGhlIGltcG9ydCBmbG93LiAqL1xyXG4gIGltcG9ydFN0YXRlOiBSb3N0ZXJJbXBvcnRTdGF0ZSA9ICd1cGxvYWQnO1xyXG5cclxuICAvKiogVGhlIHNlbGVjdGVkIGZpbGUuICovXHJcbiAgc2VsZWN0ZWRGaWxlOiBGaWxlIHwgbnVsbCA9IG51bGw7XHJcblxyXG4gIC8qKiBGaWxlIGRyYWctb3ZlciBzdGF0ZS4gKi9cclxuICBpc0RyYWdPdmVyID0gZmFsc2U7XHJcblxyXG4gIC8qKiBQcm9jZXNzaW5nIHByb2dyZXNzIHBlcmNlbnRhZ2UgKDDigJMxMDApIHNob3duIG5leHQgdG8gdGhlIHByb2dyZXNzIGJhci4gKi9cclxuICBwcm9ncmVzc1ZhbHVlID0gMDtcclxuXHJcbiAgLyoqIFRlcm1pbmFsIHVwbG9hZCByZXN1bHQgKG1vY2spLiAqL1xyXG4gIHVwbG9hZFJlc3VsdDogUm9zdGVyVXBsb2FkUmVzcG9uc2UgfCBudWxsID0gbnVsbDtcclxuXHJcbiAgLyoqIFJvdy1sZXZlbCBlcnJvcnMgZm9yIHRoZSBjb21wbGV0ZWQgam9iLiAqL1xyXG4gIGpvYkVycm9yczogUm9zdGVyVXBsb2FkRXJyb3JbXSA9IFtdO1xyXG5cclxuICAvKiogSW5saW5lIHZhbGlkYXRpb24gLyBBUEkgZXJyb3IgbWVzc2FnZS4gKi9cclxuICBlcnJvck1lc3NhZ2U6IHN0cmluZyB8IG51bGwgPSBudWxsO1xyXG5cclxuICAvKipcclxuICAgKiBJbmZvIGJhbm5lciBzaG93biB3aGVuIHRoZSBmaWxlIGhhcyBoZWFkZXJzIGJ1dCBubyBkYXRhIHJvd3NcclxuICAgKiAoRmlnbWE6IFwiTm8gcm9zdGVyIGRhdGEgZm91bmQuLi5cIikuXHJcbiAgICovXHJcbiAgbm9EYXRhTWVzc2FnZTogc3RyaW5nIHwgbnVsbCA9IG51bGw7XHJcblxyXG4gIC8qKiBNYXhpbXVtIGZpbGUgc2l6ZSBpbiBieXRlcyAoNSBNQikuICovXHJcbiAgcmVhZG9ubHkgTUFYX0ZJTEVfU0laRSA9IDVfMjQyXzg4MDtcclxuXHJcbiAgLyoqIEFjY2VwdGVkIGZpbGUgZXh0ZW5zaW9ucy4gKi9cclxuICByZWFkb25seSBBQ0NFUFRFRF9FWFRFTlNJT05TID0gWycuY3N2JywgJy54bHMnLCAnLnhsc3gnXTtcclxuXHJcbiAgLyoqXHJcbiAgICogTU9DSyBPTkxZOiB3aGljaCBzY2VuYXJpbyB0aGUgbmV4dCBpbXBvcnQgc2ltdWxhdGVzLiBDeWNsZXMgdGhyb3VnaCB0aGVcclxuICAgKiBzY2VuYXJpb3Mgc28gUUEgY2FuIHNlZSBldmVyeSByZXN1bHQgc3RhdGUgYnkgaW1wb3J0aW5nIHJlcGVhdGVkbHkuIFJlbW92ZVxyXG4gICAqIHdoZW4gdGhlIHJlYWwgQVBJIGlzIHdpcmVkIGluLlxyXG4gICAqL1xyXG4gIHByaXZhdGUgbW9ja1NjZW5hcmlvczogUm9zdGVySW1wb3J0TW9ja1NjZW5hcmlvW10gPSBbXHJcbiAgICBSb3N0ZXJJbXBvcnRNb2NrU2NlbmFyaW8uQUxMX1NVQ0NFU1MsXHJcbiAgICBSb3N0ZXJJbXBvcnRNb2NrU2NlbmFyaW8uUEFSVElBTCxcclxuICAgIFJvc3RlckltcG9ydE1vY2tTY2VuYXJpby5BTExfU0tJUFBFRCxcclxuICAgIFJvc3RlckltcG9ydE1vY2tTY2VuYXJpby5FTVBUWSxcclxuICBdO1xyXG4gIHByaXZhdGUgbW9ja1NjZW5hcmlvSW5kZXggPSAwO1xyXG5cclxuICAvKiogUmVxdWlyZWQgY29sdW1uIGhlYWRlcnMgZm9yIGRpc3BsYXkuICovXHJcbiAgZ2V0IHJlcXVpcmVkQ29sdW1ucygpOiBzdHJpbmdbXSB7XHJcbiAgICByZXR1cm4gdGhpcy5zY3JlZW5UZXh0cz8ucmVxdWlyZWRDb2x1bW5zID8/IFtdO1xyXG4gIH1cclxuXHJcbiAgLyoqIENvbW1hLXNlcGFyYXRlZCBhY2NlcHRlZCBmaWxlIHR5cGVzIGZvciB0aGUgaW5wdXQgZWxlbWVudC4gKi9cclxuICBnZXQgYWNjZXB0ZWRGaWxlVHlwZXMoKTogc3RyaW5nIHtcclxuICAgIHJldHVybiB0aGlzLkFDQ0VQVEVEX0VYVEVOU0lPTlMuam9pbignLCcpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQ2xlYW5zIHVwIHN1YnNjcmlwdGlvbnMgd2hlbiB0aGUgY29tcG9uZW50IGlzIGRlc3Ryb3llZC5cclxuICAgKiBAbWVtYmVyb2YgUm9zdGVySW1wb3J0Q29tcG9uZW50XHJcbiAgICovXHJcbiAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XHJcbiAgICB0aGlzLmRlc3Ryb3kkLm5leHQodHJ1ZSk7XHJcbiAgICB0aGlzLmRlc3Ryb3kkLmNvbXBsZXRlKCk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBIYW5kbGVzIGEgZmlsZSBzZWxlY3RlZCB2aWEgdGhlIGJyb3dzZSBkaWFsb2cuXHJcbiAgICogQHBhcmFtIHtFdmVudH0gZXZlbnQgLSBUaGUgY2hhbmdlIGV2ZW50IGZyb20gdGhlIGhpZGRlbiBmaWxlIGlucHV0LlxyXG4gICAqIEBtZW1iZXJvZiBSb3N0ZXJJbXBvcnRDb21wb25lbnRcclxuICAgKi9cclxuICBvbkZpbGVTZWxlY3RlZChldmVudDogRXZlbnQpOiB2b2lkIHtcclxuICAgIGNvbnN0IGlucHV0ID0gZXZlbnQudGFyZ2V0IGFzIEhUTUxJbnB1dEVsZW1lbnQ7XHJcbiAgICBpZiAoIWlucHV0LmZpbGVzIHx8IGlucHV0LmZpbGVzLmxlbmd0aCA9PT0gMCkge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICBpZiAoaW5wdXQuZmlsZXMubGVuZ3RoID4gMSkge1xyXG4gICAgICB0aGlzLnNob3dTaW5nbGVGaWxlT25seUVycm9yKCk7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIHRoaXMucHJvY2Vzc0ZpbGUoaW5wdXQuZmlsZXNbMF0pO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogSGFuZGxlcyBhIGZpbGUgZHJvcHBlZCBvbnRvIHRoZSBkcm9wem9uZS5cclxuICAgKiBAcGFyYW0ge0RyYWdFdmVudH0gZXZlbnQgLSBUaGUgZHJvcCBldmVudC5cclxuICAgKiBAbWVtYmVyb2YgUm9zdGVySW1wb3J0Q29tcG9uZW50XHJcbiAgICovXHJcbiAgb25GaWxlRHJvcChldmVudDogRHJhZ0V2ZW50KTogdm9pZCB7XHJcbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XHJcbiAgICB0aGlzLmlzRHJhZ092ZXIgPSBmYWxzZTtcclxuICAgIGNvbnN0IGZpbGVzID0gZXZlbnQuZGF0YVRyYW5zZmVyPy5maWxlcztcclxuICAgIGlmICghZmlsZXMgfHwgZmlsZXMubGVuZ3RoID09PSAwKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIGlmIChmaWxlcy5sZW5ndGggPiAxKSB7XHJcbiAgICAgIHRoaXMuc2hvd1NpbmdsZUZpbGVPbmx5RXJyb3IoKTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgdGhpcy5wcm9jZXNzRmlsZShmaWxlc1swXSk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBIYW5kbGVzIGRyYWctb3ZlciBvbiB0aGUgZHJvcHpvbmUuXHJcbiAgICogQHBhcmFtIHtEcmFnRXZlbnR9IGV2ZW50IC0gVGhlIGRyYWdvdmVyIGV2ZW50LlxyXG4gICAqIEBtZW1iZXJvZiBSb3N0ZXJJbXBvcnRDb21wb25lbnRcclxuICAgKi9cclxuICBvbkRyYWdPdmVyKGV2ZW50OiBEcmFnRXZlbnQpOiB2b2lkIHtcclxuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcclxuICAgIHRoaXMuaXNEcmFnT3ZlciA9IHRydWU7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBIYW5kbGVzIGRyYWctbGVhdmUgb24gdGhlIGRyb3B6b25lLlxyXG4gICAqIEBwYXJhbSB7RHJhZ0V2ZW50fSBldmVudCAtIFRoZSBkcmFnbGVhdmUgZXZlbnQuXHJcbiAgICogQG1lbWJlcm9mIFJvc3RlckltcG9ydENvbXBvbmVudFxyXG4gICAqL1xyXG4gIG9uRHJhZ0xlYXZlKGV2ZW50OiBEcmFnRXZlbnQpOiB2b2lkIHtcclxuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcclxuICAgIHRoaXMuaXNEcmFnT3ZlciA9IGZhbHNlO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogVmFsaWRhdGVzIHRoZSBmaWxlIHR5cGUgYW5kIHNpemUsIHRoZW4gZWl0aGVyIHNldHMgaXQgb3Igc2hvd3MgYW4gZXJyb3IuXHJcbiAgICogQHBhcmFtIHtGaWxlfSBmaWxlIC0gVGhlIGNhbmRpZGF0ZSBmaWxlLlxyXG4gICAqIEBtZW1iZXJvZiBSb3N0ZXJJbXBvcnRDb21wb25lbnRcclxuICAgKi9cclxuICBwcm9jZXNzRmlsZShmaWxlOiBGaWxlKTogdm9pZCB7XHJcbiAgICB0aGlzLmVycm9yTWVzc2FnZSA9IG51bGw7XHJcbiAgICB0aGlzLm5vRGF0YU1lc3NhZ2UgPSBudWxsO1xyXG4gICAgdGhpcy51cGxvYWRSZXN1bHQgPSBudWxsO1xyXG4gICAgLy8gQ2xlYXIgYW55IHByZXZpb3VzbHkgc2VsZWN0ZWQgKHZhbGlkKSBmaWxlIHNvIGFuIGludmFsaWQgbmV3IHNlbGVjdGlvblxyXG4gICAgLy8gY2FuJ3QgbGVhdmUgdGhlIEltcG9ydCBidXR0b24gZW5hYmxlZCBmb3IgYSBzdGFsZSBmaWxlLlxyXG4gICAgdGhpcy5zZWxlY3RlZEZpbGUgPSBudWxsO1xyXG5cclxuICAgIGNvbnN0IGZpbGVOYW1lID0gZmlsZS5uYW1lLnRvTG93ZXJDYXNlKCk7XHJcbiAgICBjb25zdCBpc1ZhbGlkRXh0ZW5zaW9uID0gdGhpcy5BQ0NFUFRFRF9FWFRFTlNJT05TLnNvbWUoKGV4dCkgPT5cclxuICAgICAgZmlsZU5hbWUuZW5kc1dpdGgoZXh0KVxyXG4gICAgKTtcclxuICAgIGlmICghaXNWYWxpZEV4dGVuc2lvbikge1xyXG4gICAgICB0aGlzLmVycm9yTWVzc2FnZSA9XHJcbiAgICAgICAgdGhpcy5zY3JlZW5UZXh0cz8udmFsaWRhdGlvbj8udW5zdXBwb3J0ZWRUeXBlID8/XHJcbiAgICAgICAgJ0luY29ycmVjdCBmaWxlIHR5cGUuIFBsZWFzZSB1cGxvYWQgYSB2YWxpZCAuY3N2IG9yIC54bHN4IGZpbGUuJztcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIGlmIChmaWxlLnNpemUgPT09IDApIHtcclxuICAgICAgdGhpcy5lcnJvck1lc3NhZ2UgPVxyXG4gICAgICAgIHRoaXMuc2NyZWVuVGV4dHM/LnZhbGlkYXRpb24/LmVtcHR5RmlsZSA/P1xyXG4gICAgICAgICdUaGUgc2VsZWN0ZWQgZmlsZSBpcyBlbXB0eS4gUGxlYXNlIHVwbG9hZCBhIGZpbGUgd2l0aCByb3N0ZXIgcmVjb3Jkcy4nO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKGZpbGUuc2l6ZSA+IHRoaXMuTUFYX0ZJTEVfU0laRSkge1xyXG4gICAgICB0aGlzLmVycm9yTWVzc2FnZSA9XHJcbiAgICAgICAgdGhpcy5zY3JlZW5UZXh0cz8udmFsaWRhdGlvbj8uZmlsZVRvb0xhcmdlID8/XHJcbiAgICAgICAgJ0ZpbGUgc2l6ZSBleGNlZWRzIHRoZSBtYXhpbXVtIGFsbG93ZWQgc2l6ZSBvZiA1IE1CLic7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLnNlbGVjdGVkRmlsZSA9IGZpbGU7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBTaG93cyB0aGUgc2luZ2xlLWZpbGUtb25seSB2YWxpZGF0aW9uIG1lc3NhZ2UuXHJcbiAgICogQG1lbWJlcm9mIFJvc3RlckltcG9ydENvbXBvbmVudFxyXG4gICAqL1xyXG4gIHNob3dTaW5nbGVGaWxlT25seUVycm9yKCk6IHZvaWQge1xyXG4gICAgdGhpcy5lcnJvck1lc3NhZ2UgPVxyXG4gICAgICB0aGlzLnNjcmVlblRleHRzPy52YWxpZGF0aW9uPy5zaW5nbGVGaWxlT25seSA/P1xyXG4gICAgICAnUGxlYXNlIHVwbG9hZCBhIHNpbmdsZSBmaWxlIGF0IGEgdGltZS4nO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogUmVtb3ZlcyB0aGUgY3VycmVudGx5IHNlbGVjdGVkIGZpbGUgYW5kIHJlc2V0cyB0byB0aGUgdXBsb2FkIHN0YXRlLlxyXG4gICAqIEBtZW1iZXJvZiBSb3N0ZXJJbXBvcnRDb21wb25lbnRcclxuICAgKi9cclxuICBvblJlbW92ZUZpbGUoKTogdm9pZCB7XHJcbiAgICB0aGlzLnNlbGVjdGVkRmlsZSA9IG51bGw7XHJcbiAgICB0aGlzLmVycm9yTWVzc2FnZSA9IG51bGw7XHJcbiAgICB0aGlzLm5vRGF0YU1lc3NhZ2UgPSBudWxsO1xyXG4gICAgdGhpcy51cGxvYWRSZXN1bHQgPSBudWxsO1xyXG4gICAgdGhpcy5pbXBvcnRTdGF0ZSA9ICd1cGxvYWQnO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogTU9DSzogXCJ1cGxvYWRzXCIgdGhlIGZpbGUgYnkgc2ltdWxhdGluZyBhIHNob3J0IHByb2Nlc3NpbmcgZGVsYXksIHRoZW5cclxuICAgKiByZXNvbHZlcyB0aGUgbmV4dCBtb2NrIHNjZW5hcmlvLiBSZXBsYWNlIHRoZSB0aW1lciArIG1vY2sgbG9va3VwIHdpdGggdGhlXHJcbiAgICogcmVhbCBzZXJ2aWNlIGNhbGwgb25jZSB0aGUgQVBJIGlzIGF2YWlsYWJsZS5cclxuICAgKiBAbWVtYmVyb2YgUm9zdGVySW1wb3J0Q29tcG9uZW50XHJcbiAgICovXHJcbiAgb25JbXBvcnQoKTogdm9pZCB7XHJcbiAgICBpZiAoIXRoaXMuc2VsZWN0ZWRGaWxlKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIHRoaXMuZXJyb3JNZXNzYWdlID0gbnVsbDtcclxuICAgIHRoaXMubm9EYXRhTWVzc2FnZSA9IG51bGw7XHJcbiAgICB0aGlzLnVwbG9hZFJlc3VsdCA9IG51bGw7XHJcbiAgICB0aGlzLmpvYkVycm9ycyA9IFtdO1xyXG4gICAgdGhpcy5wcm9ncmVzc1ZhbHVlID0gMDtcclxuICAgIHRoaXMuaW1wb3J0U3RhdGUgPSAncHJvY2Vzc2luZyc7XHJcblxyXG4gICAgY29uc3Qgc2NlbmFyaW8gPSB0aGlzLm5leHRNb2NrU2NlbmFyaW8oKTtcclxuXHJcbiAgICAvLyBNT0NLOiBhbmltYXRlIHRoZSBwcm9ncmVzcyBiYXIgZnJvbSAwIOKGkiAxMDAgb3ZlciB0aGUgcHJvY2Vzc2luZyB3aW5kb3csXHJcbiAgICAvLyB0aGVuIGZpbmFsaXplIHdpdGggdGhlIG1vY2sgcmVzdWx0LiBSZXBsYWNlIHdpdGggcmVhbCB1cGxvYWQgcHJvZ3Jlc3MgL1xyXG4gICAgLy8gam9iLXN0YXR1cyBwb2xsaW5nIG9uY2UgdGhlIEFQSSBpcyBhdmFpbGFibGUuXHJcbiAgICBjb25zdCBzdGVwcyA9IDIwO1xyXG4gICAgY29uc3Qgc3RlcE1zID0gTU9DS19QUk9DRVNTSU5HX01TIC8gc3RlcHM7XHJcbiAgICBpbnRlcnZhbChzdGVwTXMpXHJcbiAgICAgIC5waXBlKFxyXG4gICAgICAgIHRha2VXaGlsZSgoKSA9PiB0aGlzLnByb2dyZXNzVmFsdWUgPCAxMDApLFxyXG4gICAgICAgIHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKVxyXG4gICAgICApXHJcbiAgICAgIC5zdWJzY3JpYmUoKCkgPT4ge1xyXG4gICAgICAgIHRoaXMucHJvZ3Jlc3NWYWx1ZSA9IE1hdGgubWluKDEwMCwgdGhpcy5wcm9ncmVzc1ZhbHVlICsgMTAwIC8gc3RlcHMpO1xyXG4gICAgICB9KTtcclxuXHJcbiAgICB0aW1lcihNT0NLX1BST0NFU1NJTkdfTVMpXHJcbiAgICAgIC5waXBlKHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSlcclxuICAgICAgLnN1YnNjcmliZSgoKSA9PiB7XHJcbiAgICAgICAgdGhpcy5wcm9ncmVzc1ZhbHVlID0gMTAwO1xyXG4gICAgICAgIGNvbnN0IHJlc3BvbnNlID0gUm9zdGVySW1wb3J0TW9ja3MuZ2V0TW9ja1Jlc3BvbnNlKHNjZW5hcmlvKTtcclxuICAgICAgICB0aGlzLmZpbmFsaXplUmVzdWx0KHJlc3BvbnNlKTtcclxuICAgICAgfSk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBTdG9yZXMgdGhlIHRlcm1pbmFsIHJlc3VsdCBhbmQgbW92ZXMgdG8gdGhlIHJlc3VsdCBzdGF0ZS4gV2hlbiB0aGUgZmlsZVxyXG4gICAqIGhhZCBubyBkYXRhIHJvd3MsIHNob3dzIHRoZSBcIm5vIHJvc3RlciBkYXRhXCIgaW5mbyBiYW5uZXIgaW5zdGVhZCBvZiB0aGVcclxuICAgKiBzdW1tYXJ5IGNhcmRzLlxyXG4gICAqIEBwYXJhbSB7Um9zdGVyVXBsb2FkUmVzcG9uc2V9IGJvZHkgLSBUaGUgdGVybWluYWwgKG1vY2spIHJlc3VsdC5cclxuICAgKiBAbWVtYmVyb2YgUm9zdGVySW1wb3J0Q29tcG9uZW50XHJcbiAgICovXHJcbiAgZmluYWxpemVSZXN1bHQoYm9keTogUm9zdGVyVXBsb2FkUmVzcG9uc2UpOiB2b2lkIHtcclxuICAgIHRoaXMudXBsb2FkUmVzdWx0ID0gYm9keTtcclxuICAgIHRoaXMuam9iRXJyb3JzID0gYm9keS5yb3dFcnJvcnMgPz8gW107XHJcbiAgICB0aGlzLmltcG9ydFN0YXRlID0gJ3Jlc3VsdCc7XHJcblxyXG4gICAgaWYgKGJvZHkudG90YWxSZWNvcmRzID09PSAwKSB7XHJcbiAgICAgIHRoaXMubm9EYXRhTWVzc2FnZSA9XHJcbiAgICAgICAgdGhpcy5zY3JlZW5UZXh0cz8udmFsaWRhdGlvbj8ubm9EYXRhUmVjb3JkcyA/P1xyXG4gICAgICAgICdObyByb3N0ZXIgZGF0YSBmb3VuZC4gVGhlIHNlbGVjdGVkIGZpbGUgY29udGFpbnMgaGVhZGVycyBidXQgbm8gcm9zdGVyIHJlY29yZHMuJztcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFdoZXRoZXIgdGhlIHJlc3VsdCBzdGF0ZSBzaG91bGQgc2hvdyB0aGUgc3VtbWFyeSBjYXJkcyAoYWRkZWQgLyBza2lwcGVkKS5cclxuICAgKiBIaWRkZW4gZm9yIHRoZSBcIm5vIGRhdGEgcmVjb3Jkc1wiIGNhc2UuXHJcbiAgICogQHJldHVybiB7Ym9vbGVhbn1cclxuICAgKiBAbWVtYmVyb2YgUm9zdGVySW1wb3J0Q29tcG9uZW50XHJcbiAgICovXHJcbiAgZ2V0IHNob3dTdW1tYXJ5Q2FyZHMoKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gISF0aGlzLnVwbG9hZFJlc3VsdCAmJiB0aGlzLnVwbG9hZFJlc3VsdC50b3RhbFJlY29yZHMgPiAwO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogV2hldGhlciBldmVyeSBwcm9jZXNzZWQgcm93IHdhcyBza2lwcGVkIChkcml2ZXMgdGhlIFwiQWxsIFJvd3MgYXJlIHNraXBwZWRcIlxyXG4gICAqIGhlYWRlciBvbiB0aGUgZXJyb3JzIGNhcmQpLlxyXG4gICAqIEByZXR1cm4ge2Jvb2xlYW59XHJcbiAgICogQG1lbWJlcm9mIFJvc3RlckltcG9ydENvbXBvbmVudFxyXG4gICAqL1xyXG4gIGdldCBhbGxSb3dzU2tpcHBlZCgpOiBib29sZWFuIHtcclxuICAgIHJldHVybiAoXHJcbiAgICAgICEhdGhpcy51cGxvYWRSZXN1bHQgJiZcclxuICAgICAgdGhpcy51cGxvYWRSZXN1bHQudG90YWxSZWNvcmRzID4gMCAmJlxyXG4gICAgICB0aGlzLnVwbG9hZFJlc3VsdC5zdWNjZXNzQ291bnQgPT09IDBcclxuICAgICk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBCdWlsZHMgYSBjbGllbnQtc2lkZSBDU1Ygc2FtcGxlIGZpbGUgZnJvbSB0aGUgcmVxdWlyZWQgY29sdW1ucyBhbmQgdHJpZ2dlcnNcclxuICAgKiBhIGJyb3dzZXIgZG93bmxvYWQuIChDbGllbnQtc2lkZSBnZW5lcmF0aW9uIHVudGlsIHRoZSB0ZW1wbGF0ZSBBUEkgZXhpc3RzLilcclxuICAgKiBAbWVtYmVyb2YgUm9zdGVySW1wb3J0Q29tcG9uZW50XHJcbiAgICovXHJcbiAgZG93bmxvYWRTYW1wbGVGaWxlKCk6IHZvaWQge1xyXG4gICAgY29uc3QgaGVhZGVycyA9IHRoaXMucmVxdWlyZWRDb2x1bW5zXHJcbiAgICAgIC5tYXAoKGNvbCkgPT4gdGhpcy50b0NzdkNlbGwoY29sKSlcclxuICAgICAgLmpvaW4oJywnKTtcclxuICAgIGNvbnN0IGJsb2IgPSBuZXcgQmxvYihbaGVhZGVycyArICdcXHJcXG4nXSwge1xyXG4gICAgICB0eXBlOiAndGV4dC9jc3Y7Y2hhcnNldD11dGYtODsnLFxyXG4gICAgfSk7XHJcbiAgICBjb25zdCBmaWxlTmFtZSA9IHRoaXMuc2NyZWVuVGV4dHM/LnNhbXBsZUZpbGVOYW1lID8/ICdSb3N0ZXJfU2FtcGxlLmNzdic7XHJcbiAgICB0aGlzLnRyaWdnZXJEb3dubG9hZChibG9iLCBmaWxlTmFtZSk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBCdWlsZHMgYSBDU1YgZnJvbSB0aGUgcm93LWxldmVsIGVycm9ycyBhbmQgdHJpZ2dlcnMgYSBicm93c2VyIGRvd25sb2FkIHNvXHJcbiAgICogdGhlIHVzZXIgY2FuIGNvcnJlY3QgYW5kIHJlLXVwbG9hZC5cclxuICAgKiBAbWVtYmVyb2YgUm9zdGVySW1wb3J0Q29tcG9uZW50XHJcbiAgICovXHJcbiAgZG93bmxvYWRFcnJvckxvZygpOiB2b2lkIHtcclxuICAgIGlmICghdGhpcy5qb2JFcnJvcnMubGVuZ3RoKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIGNvbnN0IGhlYWRlcnM6IHN0cmluZ1tdID0gdGhpcy5zY3JlZW5UZXh0cz8uZXJyb3JMb2c/LmhlYWRlcnMgPz8gW1xyXG4gICAgICAnUm93JyxcclxuICAgICAgJ0ZpZWxkJyxcclxuICAgICAgJ0Vycm9yJyxcclxuICAgIF07XHJcbiAgICBjb25zdCByb3dzID0gdGhpcy5qb2JFcnJvcnMubWFwKChyb3dFcnIpID0+XHJcbiAgICAgIFtyb3dFcnIucm93TnVtYmVyLCByb3dFcnIuZmllbGQsIHJvd0Vyci5lcnJvck1lc3NhZ2VdXHJcbiAgICAgICAgLm1hcCgodmFsdWUpID0+IHRoaXMudG9Dc3ZDZWxsKHZhbHVlKSlcclxuICAgICAgICAuam9pbignLCcpXHJcbiAgICApO1xyXG4gICAgY29uc3QgY3N2Q29udGVudCA9IFtcclxuICAgICAgaGVhZGVycy5tYXAoKGhlYWRlcikgPT4gdGhpcy50b0NzdkNlbGwoaGVhZGVyKSkuam9pbignLCcpLFxyXG4gICAgICAuLi5yb3dzLFxyXG4gICAgXS5qb2luKCdcXHJcXG4nKTtcclxuICAgIGNvbnN0IGZpbGVOYW1lID1cclxuICAgICAgdGhpcy5zY3JlZW5UZXh0cz8uZXJyb3JMb2c/LmZpbGVOYW1lID8/ICdSb3N0ZXJfSW1wb3J0X0Vycm9yX0xvZy5jc3YnO1xyXG4gICAgY29uc3QgYmxvYiA9IG5ldyBCbG9iKFtjc3ZDb250ZW50XSwgeyB0eXBlOiAndGV4dC9jc3Y7Y2hhcnNldD11dGYtODsnIH0pO1xyXG4gICAgdGhpcy50cmlnZ2VyRG93bmxvYWQoYmxvYiwgZmlsZU5hbWUpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogRXNjYXBlcyBhIHZhbHVlIGZvciBzYWZlIGluY2x1c2lvbiBpbiBhIENTViBjZWxsLlxyXG4gICAqIEBwYXJhbSB7KHN0cmluZyB8IG51bWJlciB8IHVuZGVmaW5lZCB8IG51bGwpfSB2YWx1ZSAtIFRoZSByYXcgY2VsbCB2YWx1ZS5cclxuICAgKiBAcmV0dXJuIHtzdHJpbmd9IC0gdGhlIENTVi1zYWZlIGNlbGwgc3RyaW5nLlxyXG4gICAqIEBtZW1iZXJvZiBSb3N0ZXJJbXBvcnRDb21wb25lbnRcclxuICAgKi9cclxuICB0b0NzdkNlbGwodmFsdWU6IHN0cmluZyB8IG51bWJlciB8IHVuZGVmaW5lZCB8IG51bGwpOiBzdHJpbmcge1xyXG4gICAgY29uc3QgcmF3ID0gdmFsdWUgPT09IHVuZGVmaW5lZCB8fCB2YWx1ZSA9PT0gbnVsbCA/ICcnIDogU3RyaW5nKHZhbHVlKTtcclxuICAgIGlmICgvW1wiLFxcclxcbl0vLnRlc3QocmF3KSkge1xyXG4gICAgICByZXR1cm4gYFwiJHtyYXcucmVwbGFjZSgvXCIvZywgJ1wiXCInKX1cImA7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gcmF3O1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQ2xvc2VzIHRoZSBkaWFsb2cuIEVtaXRzIHN1Ym1pdEZvcm1SZXNwb25zZSB3aGVuIGF0IGxlYXN0IG9uZSByb3cgd2FzIGFkZGVkXHJcbiAgICogc28gdGhlIHBhcmVudCByZWZyZXNoZXM7IG90aGVyd2lzZSBlbWl0cyBmb3JtQ2FuY2VsLlxyXG4gICAqIEBtZW1iZXJvZiBSb3N0ZXJJbXBvcnRDb21wb25lbnRcclxuICAgKi9cclxuICBvbkNhbmNlbCgpOiB2b2lkIHtcclxuICAgIGlmICh0aGlzLnVwbG9hZFJlc3VsdCAmJiB0aGlzLnVwbG9hZFJlc3VsdC5zdWNjZXNzQ291bnQgPiAwKSB7XHJcbiAgICAgIHRoaXMuc3VibWl0Rm9ybVJlc3BvbnNlLmVtaXQodGhpcy51cGxvYWRSZXN1bHQpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5mb3JtQ2FuY2VsLmVtaXQoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFRyaWdnZXJzIGEgYnJvd3NlciBkb3dubG9hZCBmb3IgYSBnZW5lcmF0ZWQgYmxvYi5cclxuICAgKiBAcGFyYW0ge0Jsb2J9IGJsb2IgLSBUaGUgZmlsZSBjb250ZW50LlxyXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBmaWxlTmFtZSAtIFRoZSBzdWdnZXN0ZWQgZmlsZW5hbWUuXHJcbiAgICogQG1lbWJlcm9mIFJvc3RlckltcG9ydENvbXBvbmVudFxyXG4gICAqL1xyXG4gIHByaXZhdGUgdHJpZ2dlckRvd25sb2FkKGJsb2I6IEJsb2IsIGZpbGVOYW1lOiBzdHJpbmcpOiB2b2lkIHtcclxuICAgIGNvbnN0IHVybCA9IFVSTC5jcmVhdGVPYmplY3RVUkwoYmxvYik7XHJcbiAgICBjb25zdCBsaW5rID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYScpO1xyXG4gICAgbGluay5ocmVmID0gdXJsO1xyXG4gICAgbGluay5kb3dubG9hZCA9IGZpbGVOYW1lO1xyXG4gICAgbGluay5jbGljaygpO1xyXG4gICAgVVJMLnJldm9rZU9iamVjdFVSTCh1cmwpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogTU9DSyBPTkxZOiByZXR1cm5zIHRoZSBuZXh0IHNjZW5hcmlvIGluIHRoZSBjeWNsZSBzbyByZXBlYXRlZCBpbXBvcnRzIHNob3dcclxuICAgKiBldmVyeSByZXN1bHQgc3RhdGUuXHJcbiAgICogQHJldHVybiB7Um9zdGVySW1wb3J0TW9ja1NjZW5hcmlvfVxyXG4gICAqIEBtZW1iZXJvZiBSb3N0ZXJJbXBvcnRDb21wb25lbnRcclxuICAgKi9cclxuICBwcml2YXRlIG5leHRNb2NrU2NlbmFyaW8oKTogUm9zdGVySW1wb3J0TW9ja1NjZW5hcmlvIHtcclxuICAgIGNvbnN0IHNjZW5hcmlvID0gdGhpcy5tb2NrU2NlbmFyaW9zW3RoaXMubW9ja1NjZW5hcmlvSW5kZXhdO1xyXG4gICAgdGhpcy5tb2NrU2NlbmFyaW9JbmRleCA9XHJcbiAgICAgICh0aGlzLm1vY2tTY2VuYXJpb0luZGV4ICsgMSkgJSB0aGlzLm1vY2tTY2VuYXJpb3MubGVuZ3RoO1xyXG4gICAgcmV0dXJuIHNjZW5hcmlvO1xyXG4gIH1cclxufVxyXG4iLCI8ZGl2IGNsYXNzPVwiaWVlZXNhLXJvc3Rlci1pbXBvcnRcIj5cclxuICA8IS0tIFN1Yi1oZWFkaW5nIGJhbmQ6IFwiQnVsayBJbXBvcnQgUGFydGljaXBhbnRzXCIgb24gdGhlIGxlZnQsIEltcG9ydCBSb3N0ZXJcclxuICAgICAgIGFjdGlvbiBvbiB0aGUgcmlnaHQgKGFwcGVhcnMgb25jZSBhIGZpbGUgaXMgc2VsZWN0ZWQpIOKAlCBtYXRjaGVzIHRoZSBGaWdtYS5cclxuICAgICAgIFRoZSBcIuKGkCBCYWNrIHRvIFJvc3RlcnMgLyBJbXBvcnQgUm9zdGVyXCIgdGl0bGUgcm93ICsgWCBhcmUgcmVuZGVyZWQgYnkgdGhlXHJcbiAgICAgICBzaGFyZWQgTW9kYWxDb21wb25lbnQgYWJvdmUgdGhpcy4gLS0+XHJcbiAgPGRpdiBjbGFzcz1cImllZWVzYS1yb3N0ZXItaW1wb3J0X19zdWJoZWFkZXJcIj5cclxuICAgIDxzcGFuIGNsYXNzPVwiaWVlZXNhLXJvc3Rlci1pbXBvcnRfX3N1YmhlYWRlci10aXRsZVwiPlxyXG4gICAgICB7eyBzY3JlZW5UZXh0cz8uc3ViSGVhZGluZyA/PyAnQnVsayBJbXBvcnQgUGFydGljaXBhbnRzJyB9fVxyXG4gICAgPC9zcGFuPlxyXG4gICAgPGJ1dHRvblxyXG4gICAgICAqbmdJZj1cInNlbGVjdGVkRmlsZVwiXHJcbiAgICAgIG1hdC1idXR0b25cclxuICAgICAgdHlwZT1cImJ1dHRvblwiXHJcbiAgICAgIGNsYXNzPVwibWF0LXRlcnRpYXJ5LWJ1dHRvbiBpZWVlc2Etcm9zdGVyLWltcG9ydF9faW1wb3J0LWJ0blwiXHJcbiAgICAgIFtkaXNhYmxlZF09XCJpbXBvcnRTdGF0ZSA9PT0gJ3Byb2Nlc3NpbmcnXCJcclxuICAgICAgKGNsaWNrKT1cIm9uSW1wb3J0KClcIlxyXG4gICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cInNjcmVlblRleHRzPy5idXR0b25zPy5pbXBvcnQgPz8gJ0ltcG9ydCBSb3N0ZXInXCJcclxuICAgID5cclxuICAgICAgPHN2ZyBjbGFzcz1cImllZWVzYS1yb3N0ZXItaW1wb3J0X19pbXBvcnQtYnRuLWljb25cIiB3aWR0aD1cIjE0XCIgaGVpZ2h0PVwiMTRcIiBhcmlhLWhpZGRlbj1cInRydWVcIj5cclxuICAgICAgICA8dXNlIHhsaW5rOmhyZWY9XCJhc3NldHMvaW1hZ2VzL3Nwcml0ZXMvc3ByaXRlcy5zdmcjaWNvbi1pbXBvcnRcIj48L3VzZT5cclxuICAgICAgPC9zdmc+XHJcbiAgICAgIHt7IHNjcmVlblRleHRzPy5idXR0b25zPy5pbXBvcnQgPz8gJ0ltcG9ydCBSb3N0ZXInIH19XHJcbiAgICA8L2J1dHRvbj5cclxuICA8L2Rpdj5cclxuXHJcbiAgPCEtLSBSZXF1aXJlZCBDb2x1bW5zIEluZm8gLS0+XHJcbiAgPGRpdiBjbGFzcz1cImllZWVzYS1yb3N0ZXItaW1wb3J0X19jb2x1bW5zLWNhcmRcIj5cclxuICAgIDxkaXYgY2xhc3M9XCJpZWVlc2Etcm9zdGVyLWltcG9ydF9fY29sdW1ucy1jb250ZW50XCI+XHJcbiAgICAgIDxwIGNsYXNzPVwiaWVlZXNhLXJvc3Rlci1pbXBvcnRfX2NvbHVtbnMtdGl0bGVcIj5cclxuICAgICAgICB7eyBzY3JlZW5UZXh0cz8ucmVxdWlyZWRDb2x1bW5zVGl0bGUgPz8gJ1JlcXVpcmVkIGNvbHVtbnMnIH19XHJcbiAgICAgIDwvcD5cclxuICAgICAgPGRpdiBjbGFzcz1cImllZWVzYS1yb3N0ZXItaW1wb3J0X19jb2x1bW5zLWNoaXBzXCI+XHJcbiAgICAgICAgPHNwYW5cclxuICAgICAgICAgICpuZ0Zvcj1cImxldCBjb2wgb2YgcmVxdWlyZWRDb2x1bW5zXCJcclxuICAgICAgICAgIGNsYXNzPVwiaWVlZXNhLXJvc3Rlci1pbXBvcnRfX2NoaXBcIlxyXG4gICAgICAgID5cclxuICAgICAgICAgIHt7IGNvbCB9fVxyXG4gICAgICAgIDwvc3Bhbj5cclxuICAgICAgPC9kaXY+XHJcbiAgICA8L2Rpdj5cclxuICAgIDxkaXYgY2xhc3M9XCJpZWVlc2Etcm9zdGVyLWltcG9ydF9fc2FtcGxlLXdyYXBwZXJcIj5cclxuICAgICAgPGJ1dHRvblxyXG4gICAgICAgIG1hdC1idXR0b25cclxuICAgICAgICBjbGFzcz1cIm1hdC10ZXJ0aWFyeS1idXR0b24gaWVlZXNhLXJvc3Rlci1pbXBvcnRfX2Rvd25sb2FkLWJ0blwiXHJcbiAgICAgICAgKGNsaWNrKT1cImRvd25sb2FkU2FtcGxlRmlsZSgpXCJcclxuICAgICAgICB0eXBlPVwiYnV0dG9uXCJcclxuICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cInNjcmVlblRleHRzPy5hcmlhTGFiZWw/LmRvd25sb2FkU2FtcGxlID8/ICdEb3dubG9hZCBTYW1wbGUgRmlsZSdcIlxyXG4gICAgICA+XHJcbiAgICAgICAgPHN2Z1xyXG4gICAgICAgICAgY2xhc3M9XCJpZWVlc2Etcm9zdGVyLWltcG9ydF9fZG93bmxvYWQtYnRuLWljb25cIlxyXG4gICAgICAgICAgYXJpYS1oaWRkZW49XCJ0cnVlXCJcclxuICAgICAgICA+XHJcbiAgICAgICAgICA8dXNlIHhsaW5rOmhyZWY9XCJhc3NldHMvaW1hZ2VzL3Nwcml0ZXMvc3ByaXRlcy5zdmcjaWNvbi1maWxlLWRvY1wiPjwvdXNlPlxyXG4gICAgICAgIDwvc3ZnPlxyXG4gICAgICAgIHt7IHNjcmVlblRleHRzPy5kb3dubG9hZFNhbXBsZUxhYmVsID8/ICdEb3dubG9hZCBTYW1wbGUgRmlsZScgfX1cclxuICAgICAgPC9idXR0b24+XHJcbiAgICA8L2Rpdj5cclxuICA8L2Rpdj5cclxuXHJcbiAgPHAgY2xhc3M9XCJpZWVlc2Etcm9zdGVyLWltcG9ydF9fdXBsb2FkLWxhYmVsXCI+XHJcbiAgICB7eyBzY3JlZW5UZXh0cz8udXBsb2FkTGFiZWwgPz8gJ1VwbG9hZCB5b3VyIGZpbGUnIH19XHJcbiAgPC9wPlxyXG5cclxuICA8IS0tIFVwbG9hZCBTdGF0ZSAtLT5cclxuICA8bmctY29udGFpbmVyICpuZ0lmPVwiaW1wb3J0U3RhdGUgPT09ICd1cGxvYWQnXCI+XHJcbiAgICA8IS0tIEhpZGRlbiBmaWxlIGlucHV0IC0tPlxyXG4gICAgPGlucHV0XHJcbiAgICAgICNmaWxlSW5wdXRcclxuICAgICAgdHlwZT1cImZpbGVcIlxyXG4gICAgICBbYWNjZXB0XT1cImFjY2VwdGVkRmlsZVR5cGVzXCJcclxuICAgICAgKGNoYW5nZSk9XCJvbkZpbGVTZWxlY3RlZCgkZXZlbnQpXCJcclxuICAgICAgaGlkZGVuXHJcbiAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwic2NyZWVuVGV4dHM/LnVwbG9hZExhYmVsID8/ICdVcGxvYWQgeW91ciBmaWxlJ1wiXHJcbiAgICAvPlxyXG5cclxuICAgIDwhLS0gRHJhZyAmIERyb3AgWm9uZSAtLT5cclxuICAgIDxkaXZcclxuICAgICAgY2xhc3M9XCJpZWVlc2Etcm9zdGVyLWltcG9ydF9fZHJvcHpvbmVcIlxyXG4gICAgICBbY2xhc3MuaWVlZXNhLXJvc3Rlci1pbXBvcnRfX2Ryb3B6b25lLS1hY3RpdmVdPVwiaXNEcmFnT3ZlclwiXHJcbiAgICAgIChkcmFnb3Zlcik9XCJvbkRyYWdPdmVyKCRldmVudClcIlxyXG4gICAgICAoZHJhZ2xlYXZlKT1cIm9uRHJhZ0xlYXZlKCRldmVudClcIlxyXG4gICAgICAoZHJvcCk9XCJvbkZpbGVEcm9wKCRldmVudClcIlxyXG4gICAgICAoY2xpY2spPVwiZmlsZUlucHV0LmNsaWNrKClcIlxyXG4gICAgICByb2xlPVwiYnV0dG9uXCJcclxuICAgICAgdGFiaW5kZXg9XCIwXCJcclxuICAgICAgKGtleWRvd24uZW50ZXIpPVwiZmlsZUlucHV0LmNsaWNrKClcIlxyXG4gICAgICAoa2V5ZG93bi5zcGFjZSk9XCJmaWxlSW5wdXQuY2xpY2soKVwiXHJcbiAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwic2NyZWVuVGV4dHM/LmFyaWFMYWJlbD8uZHJvcHpvbmUgPz8gJ0RyYWcgYW5kIGRyb3AgZmlsZSB1cGxvYWQgYXJlYSdcIlxyXG4gICAgPlxyXG4gICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiIXNlbGVjdGVkRmlsZVwiPlxyXG4gICAgICAgIDxzdmcgY2xhc3M9XCJpZWVlc2Etcm9zdGVyLWltcG9ydF9fdXBsb2FkLWljb25cIiB3aWR0aD1cIjIyXCIgaGVpZ2h0PVwiMjJcIj5cclxuICAgICAgICAgIDx1c2UgeGxpbms6aHJlZj1cImFzc2V0cy9pbWFnZXMvc3ByaXRlcy9zcHJpdGVzLnN2ZyNpY29uLXVwbG9hZC1ncmF5XCI+PC91c2U+XHJcbiAgICAgICAgPC9zdmc+XHJcbiAgICAgICAgPHAgY2xhc3M9XCJpZWVlc2Etcm9zdGVyLWltcG9ydF9fZHJvcHpvbmUtdGV4dFwiPlxyXG4gICAgICAgICAge3sgc2NyZWVuVGV4dHM/LmRyb3B6b25lVGV4dCA/PyAnRHJhZyAmIGRyb3AgYSBmaWxlIGhlcmUsIG9yIGNsaWNrIHRvIGJyb3dzZScgfX1cclxuICAgICAgICA8L3A+XHJcbiAgICAgICAgPHAgY2xhc3M9XCJpZWVlc2Etcm9zdGVyLWltcG9ydF9fZHJvcHpvbmUtaGludFwiPlxyXG4gICAgICAgICAge3sgc2NyZWVuVGV4dHM/LmRyb3B6b25lSGludCA/PyAnQWNjZXB0ZWQgZm9ybWF0czogLmNzdiwgLnhscywgLnhsc3gnIH19XHJcbiAgICAgICAgPC9wPlxyXG4gICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cInNlbGVjdGVkRmlsZVwiPlxyXG4gICAgICAgIDxzdmcgY2xhc3M9XCJpZWVlc2Etcm9zdGVyLWltcG9ydF9fdXBsb2FkLWljb25cIiB3aWR0aD1cIjIyXCIgaGVpZ2h0PVwiMjJcIj5cclxuICAgICAgICAgIDx1c2UgeGxpbms6aHJlZj1cImFzc2V0cy9pbWFnZXMvc3ByaXRlcy9zcHJpdGVzLnN2ZyNpY29uLXVwbG9hZC1ncmF5XCI+PC91c2U+XHJcbiAgICAgICAgPC9zdmc+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImllZWVzYS1yb3N0ZXItaW1wb3J0X19maWxlLXJvd1wiPlxyXG4gICAgICAgICAgPHAgY2xhc3M9XCJpZWVlc2Etcm9zdGVyLWltcG9ydF9fZmlsZS1uYW1lXCI+XHJcbiAgICAgICAgICAgIDxzdmcgd2lkdGg9XCIxNFwiIGhlaWdodD1cIjE0XCI+XHJcbiAgICAgICAgICAgICAgPHVzZSB4bGluazpocmVmPVwiYXNzZXRzL2ltYWdlcy9zcHJpdGVzL3Nwcml0ZXMuc3ZnI2ljb24tZmlsZS1kb2NcIj48L3VzZT5cclxuICAgICAgICAgICAgPC9zdmc+XHJcbiAgICAgICAgICAgIHt7IHNlbGVjdGVkRmlsZS5uYW1lIH19XHJcbiAgICAgICAgICA8L3A+XHJcbiAgICAgICAgICA8YnV0dG9uXHJcbiAgICAgICAgICAgIG1hdC1idXR0b25cclxuICAgICAgICAgICAgY2xhc3M9XCJpZWVlc2Etcm9zdGVyLWltcG9ydF9fcmVtb3ZlLWZpbGUtYnRuXCJcclxuICAgICAgICAgICAgKGNsaWNrKT1cIm9uUmVtb3ZlRmlsZSgpOyAkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKClcIlxyXG4gICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcclxuICAgICAgICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCJzY3JlZW5UZXh0cz8uYXJpYUxhYmVsPy5yZW1vdmUgPz8gJ1JlbW92ZSBzZWxlY3RlZCBmaWxlJ1wiXHJcbiAgICAgICAgICA+XHJcbiAgICAgICAgICAgICZ0aW1lcztcclxuICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgIDwvZGl2PlxyXG5cclxuICAgIDwhLS0gSW5saW5lIEVycm9yIE1lc3NhZ2UgLS0+XHJcbiAgICA8ZGl2XHJcbiAgICAgICpuZ0lmPVwiZXJyb3JNZXNzYWdlXCJcclxuICAgICAgY2xhc3M9XCJpZWVlc2Etcm9zdGVyLWltcG9ydF9fZXJyb3ItYmFubmVyXCJcclxuICAgICAgcm9sZT1cImFsZXJ0XCJcclxuICAgID5cclxuICAgICAge3sgZXJyb3JNZXNzYWdlIH19XHJcbiAgICA8L2Rpdj5cclxuICA8L25nLWNvbnRhaW5lcj5cclxuXHJcbiAgPCEtLSBQcm9jZXNzaW5nIC8gUmVzdWx0IHNoYXJlIHRoZSBmaWxlIGRpc3BsYXkgKyBwcm9ncmVzcyBiYXIgLS0+XHJcbiAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImltcG9ydFN0YXRlID09PSAncHJvY2Vzc2luZycgfHwgaW1wb3J0U3RhdGUgPT09ICdyZXN1bHQnXCI+XHJcbiAgICA8ZGl2XHJcbiAgICAgIGNsYXNzPVwiaWVlZXNhLXJvc3Rlci1pbXBvcnRfX2Ryb3B6b25lIGllZWVzYS1yb3N0ZXItaW1wb3J0X19kcm9wem9uZS0tcmVzdWx0XCJcclxuICAgID5cclxuICAgICAgPHN2ZyBjbGFzcz1cImllZWVzYS1yb3N0ZXItaW1wb3J0X191cGxvYWQtaWNvblwiIHdpZHRoPVwiMjJcIiBoZWlnaHQ9XCIyMlwiPlxyXG4gICAgICAgIDx1c2UgeGxpbms6aHJlZj1cImFzc2V0cy9pbWFnZXMvc3ByaXRlcy9zcHJpdGVzLnN2ZyNpY29uLXVwbG9hZC1ncmF5XCI+PC91c2U+XHJcbiAgICAgIDwvc3ZnPlxyXG4gICAgICA8cCBjbGFzcz1cImllZWVzYS1yb3N0ZXItaW1wb3J0X19maWxlLW5hbWVcIj5cclxuICAgICAgICA8c3ZnIHdpZHRoPVwiMTRcIiBoZWlnaHQ9XCIxNFwiPlxyXG4gICAgICAgICAgPHVzZSB4bGluazpocmVmPVwiYXNzZXRzL2ltYWdlcy9zcHJpdGVzL3Nwcml0ZXMuc3ZnI2ljb24tZmlsZS1kb2NcIj48L3VzZT5cclxuICAgICAgICA8L3N2Zz5cclxuICAgICAgICB7eyBzZWxlY3RlZEZpbGU/Lm5hbWUgfX1cclxuICAgICAgPC9wPlxyXG4gICAgPC9kaXY+XHJcblxyXG4gICAgPCEtLSBQcm9ncmVzcyBsYWJlbCArIHBlcmNlbnRhZ2UgLS0+XHJcbiAgICA8ZGl2IGNsYXNzPVwiaWVlZXNhLXJvc3Rlci1pbXBvcnRfX3Byb2dyZXNzLWhlYWRcIj5cclxuICAgICAgPHNwYW4gY2xhc3M9XCJpZWVlc2Etcm9zdGVyLWltcG9ydF9fcHJvZ3Jlc3MtbGFiZWxcIj5cclxuICAgICAgICB7eyBzY3JlZW5UZXh0cz8ucHJvY2Vzc2luZ0xhYmVsID8/ICdQcm9jZXNzaW5nIGZpbGUgcmVjb3Jkcy4uLi4nIH19XHJcbiAgICAgIDwvc3Bhbj5cclxuICAgICAgPHNwYW4gY2xhc3M9XCJpZWVlc2Etcm9zdGVyLWltcG9ydF9fcHJvZ3Jlc3MtcGVyY2VudFwiPlxyXG4gICAgICAgIHt7IHByb2dyZXNzVmFsdWUgfCBudW1iZXI6ICcxLjAtMCcgfX0lXHJcbiAgICAgIDwvc3Bhbj5cclxuICAgIDwvZGl2PlxyXG4gICAgPG1hdC1wcm9ncmVzcy1iYXJcclxuICAgICAgY2xhc3M9XCJpZWVlc2Etcm9zdGVyLWltcG9ydF9fcHJvZ3Jlc3MtYmFyXCJcclxuICAgICAgbW9kZT1cImRldGVybWluYXRlXCJcclxuICAgICAgW3ZhbHVlXT1cInByb2dyZXNzVmFsdWVcIlxyXG4gICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cInNjcmVlblRleHRzPy5wcm9jZXNzaW5nTGFiZWwgPz8gJ1Byb2Nlc3NpbmcgZmlsZSByZWNvcmRzLi4uLidcIlxyXG4gICAgPjwvbWF0LXByb2dyZXNzLWJhcj5cclxuICA8L25nLWNvbnRhaW5lcj5cclxuXHJcbiAgPCEtLSBSZXN1bHQgU3RhdGUgKHN1bW1hcnkgKyBlcnJvcnMpIC0tPlxyXG4gIDxuZy1jb250YWluZXIgKm5nSWY9XCJpbXBvcnRTdGF0ZSA9PT0gJ3Jlc3VsdCcgJiYgdXBsb2FkUmVzdWx0XCI+XHJcbiAgICA8IS0tIE5vIGRhdGEgcmVjb3JkcyBiYW5uZXIgKGhlYWRlcnMgb25seSwgemVybyByb3dzKSAtLT5cclxuICAgIDxkaXZcclxuICAgICAgKm5nSWY9XCJub0RhdGFNZXNzYWdlXCJcclxuICAgICAgY2xhc3M9XCJpZWVlc2Etcm9zdGVyLWltcG9ydF9fbm8tZGF0YS1iYW5uZXJcIlxyXG4gICAgICByb2xlPVwic3RhdHVzXCJcclxuICAgID5cclxuICAgICAge3sgbm9EYXRhTWVzc2FnZSB9fVxyXG4gICAgPC9kaXY+XHJcblxyXG4gICAgPCEtLSBTdW1tYXJ5IGNhcmRzIC0tPlxyXG4gICAgPGRpdiAqbmdJZj1cInNob3dTdW1tYXJ5Q2FyZHNcIiBjbGFzcz1cImllZWVzYS1yb3N0ZXItaW1wb3J0X19zdW1tYXJ5LWNhcmRzXCI+XHJcbiAgICAgIDxkaXZcclxuICAgICAgICBjbGFzcz1cImllZWVzYS1yb3N0ZXItaW1wb3J0X19zdW1tYXJ5LWNhcmQgaWVlZXNhLXJvc3Rlci1pbXBvcnRfX3N1bW1hcnktY2FyZC0tc3VjY2Vzc1wiXHJcbiAgICAgID5cclxuICAgICAgICA8cCBjbGFzcz1cImllZWVzYS1yb3N0ZXItaW1wb3J0X19zdW1tYXJ5LWNhcmQtY291bnRcIj5cclxuICAgICAgICAgIHt7IHVwbG9hZFJlc3VsdC5zdWNjZXNzQ291bnQgfX1cclxuICAgICAgICA8L3A+XHJcbiAgICAgICAgPHAgY2xhc3M9XCJpZWVlc2Etcm9zdGVyLWltcG9ydF9fc3VtbWFyeS1jYXJkLWxhYmVsXCI+XHJcbiAgICAgICAgICB7eyBzY3JlZW5UZXh0cz8ucmVzdWx0Py5zdWNjZXNzQ2FyZExhYmVsID8/ICdSb3N0ZXJzIGFkZGVkIHN1Y2Nlc3NmdWxseScgfX1cclxuICAgICAgICA8L3A+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgICA8ZGl2XHJcbiAgICAgICAgY2xhc3M9XCJpZWVlc2Etcm9zdGVyLWltcG9ydF9fc3VtbWFyeS1jYXJkIGllZWVzYS1yb3N0ZXItaW1wb3J0X19zdW1tYXJ5LWNhcmQtLXNraXBwZWRcIlxyXG4gICAgICA+XHJcbiAgICAgICAgPHAgY2xhc3M9XCJpZWVlc2Etcm9zdGVyLWltcG9ydF9fc3VtbWFyeS1jYXJkLWNvdW50XCI+XHJcbiAgICAgICAgICB7eyB1cGxvYWRSZXN1bHQuZmFpbHVyZUNvdW50IH19XHJcbiAgICAgICAgPC9wPlxyXG4gICAgICAgIDxwIGNsYXNzPVwiaWVlZXNhLXJvc3Rlci1pbXBvcnRfX3N1bW1hcnktY2FyZC1sYWJlbFwiPlxyXG4gICAgICAgICAge3sgc2NyZWVuVGV4dHM/LnJlc3VsdD8uc2tpcHBlZENhcmRMYWJlbCA/PyAnU2tpcHBlZCBSb3dzJyB9fVxyXG4gICAgICAgIDwvcD5cclxuICAgICAgPC9kaXY+XHJcbiAgICA8L2Rpdj5cclxuXHJcbiAgICA8IS0tIFJvdyBFcnJvcnMgQ2FyZCAtLT5cclxuICAgIDxkaXYgKm5nSWY9XCJqb2JFcnJvcnMubGVuZ3RoXCIgY2xhc3M9XCJpZWVlc2Etcm9zdGVyLWltcG9ydF9fZXJyb3JzLWNhcmRcIj5cclxuICAgICAgPHAgY2xhc3M9XCJpZWVlc2Etcm9zdGVyLWltcG9ydF9fZXJyb3JzLWhlYWRlclwiPlxyXG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJhbGxSb3dzU2tpcHBlZDsgZWxzZSBzb21lRXJyb3JzXCI+XHJcbiAgICAgICAgICB7eyBzY3JlZW5UZXh0cz8ucmVzdWx0Py5hbGxSb3dzU2tpcHBlZEhlYWRlciA/PyAnQWxsIFJvd3MgYXJlIHNraXBwZWQnIH19XHJcbiAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgPG5nLXRlbXBsYXRlICNzb21lRXJyb3JzPlxyXG4gICAgICAgICAge3sgc2NyZWVuVGV4dHM/LnJlc3VsdD8uZXJyb3JzSGVhZGVyID8/ICdSb3cgZXJyb3JzIOKAlCB0aGVzZSByb3dzIHdpbGwgYmUgc2tpcHBlZCcgfX1cclxuICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICA8L3A+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJpZWVlc2Etcm9zdGVyLWltcG9ydF9fZXJyb3JzLWJvZHlcIj5cclxuICAgICAgICA8ZGl2XHJcbiAgICAgICAgICAqbmdGb3I9XCJsZXQgcm93RXJyIG9mIGpvYkVycm9yc1wiXHJcbiAgICAgICAgICBjbGFzcz1cImllZWVzYS1yb3N0ZXItaW1wb3J0X19lcnJvci1yb3dcIlxyXG4gICAgICAgID5cclxuICAgICAgICAgIDxwIGNsYXNzPVwiaWVlZXNhLXJvc3Rlci1pbXBvcnRfX2Vycm9yLXJvdy10aXRsZVwiPlxyXG4gICAgICAgICAgICBSb3cge3sgcm93RXJyLnJvd051bWJlciB9fSDigJQge3sgcm93RXJyLmVycm9yTWVzc2FnZSB9fVxyXG4gICAgICAgICAgPC9wPlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICA8L2Rpdj5cclxuICAgIDwvZGl2PlxyXG4gIDwvbmctY29udGFpbmVyPlxyXG5cclxuICA8IS0tIEZvb3RlciBhY3Rpb25zIC0tPlxyXG4gIDxkaXYgY2xhc3M9XCJpZWVlc2Etcm9zdGVyLWltcG9ydF9fYWN0aW9uc1wiPlxyXG4gICAgPGJ1dHRvblxyXG4gICAgICBtYXQtYnV0dG9uXHJcbiAgICAgIGNsYXNzPVwibWF0LXRlcnRpYXJ5LWJ1dHRvbiBpZWVlc2Etcm9zdGVyLWltcG9ydF9fY2FuY2VsLWJ0blwiXHJcbiAgICAgIChjbGljayk9XCJvbkNhbmNlbCgpXCJcclxuICAgICAgdHlwZT1cImJ1dHRvblwiXHJcbiAgICA+XHJcbiAgICAgIHt7IHNjcmVlblRleHRzPy5idXR0b25zPy5jYW5jZWwgPz8gJ0NhbmNlbCcgfX1cclxuICAgIDwvYnV0dG9uPlxyXG4gICAgPGJ1dHRvblxyXG4gICAgICAqbmdJZj1cImltcG9ydFN0YXRlID09PSAncmVzdWx0JyAmJiBqb2JFcnJvcnMubGVuZ3RoXCJcclxuICAgICAgbWF0LWJ1dHRvblxyXG4gICAgICB0eXBlPVwiYnV0dG9uXCJcclxuICAgICAgY2xhc3M9XCJtYXQtcHJpbWFyeS1idXR0b24gaWVlZXNhLXJvc3Rlci1pbXBvcnRfX2Vycm9yLWxvZy1idG5cIlxyXG4gICAgICAoY2xpY2spPVwiZG93bmxvYWRFcnJvckxvZygpXCJcclxuICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCJzY3JlZW5UZXh0cz8uYXJpYUxhYmVsPy5kb3dubG9hZEVycm9yTG9nID8/ICdEb3dubG9hZCBFcnJvciBsb2cnXCJcclxuICAgID5cclxuICAgICAge3sgc2NyZWVuVGV4dHM/LmJ1dHRvbnM/LmRvd25sb2FkRXJyb3JMb2cgPz8gJ0Rvd25sb2FkIEVycm9yIGxvZycgfX1cclxuICAgIDwvYnV0dG9uPlxyXG4gIDwvZGl2PlxyXG48L2Rpdj5cclxuIl19
535
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicm9zdGVyLWltcG9ydC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9ncm91cHMvc3JjL2xpYi9jb21wb25lbnRzL3Jvc3Rlci1pbXBvcnQvcm9zdGVyLWltcG9ydC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9ncm91cHMvc3JjL2xpYi9jb21wb25lbnRzL3Jvc3Rlci1pbXBvcnQvcm9zdGVyLWltcG9ydC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0wsU0FBUyxFQUNULFlBQVksRUFDWixLQUFLLEVBR0wsTUFBTSxFQUNOLGlCQUFpQixHQUNsQixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDL0MsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQzNELE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLGdDQUFnQyxDQUFDO0FBQ3RFLE9BQU8sRUFBRSxPQUFPLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQU9yRCxPQUFPLEtBQUssU0FBUyxNQUFNLDZCQUE2QixDQUFDOzs7Ozs7O0FBc0J6RDs7Ozs7Ozs7Ozs7Ozs7OztHQWdCRztBQVNILE1BQU0sT0FBTyxxQkFBcUI7SUFtRGhDO0lBQ0UsMENBQTBDO0lBQ2xDLHNCQUE4QztJQUN0RCwwQ0FBMEM7SUFDbEMsWUFBMkI7UUFGM0IsMkJBQXNCLEdBQXRCLHNCQUFzQixDQUF3QjtRQUU5QyxpQkFBWSxHQUFaLFlBQVksQ0FBZTtRQWxEckMsOEVBQThFO1FBQzlFLDhEQUE4RDtRQUNwRCx1QkFBa0IsR0FBRyxJQUFJLFlBQVksRUFBTyxDQUFDO1FBRXZELHFFQUFxRTtRQUMzRCxlQUFVLEdBQUcsSUFBSSxZQUFZLEVBQVEsQ0FBQztRQUVoRCxhQUFRLEdBQUcsSUFBSSxPQUFPLEVBQVcsQ0FBQztRQUVsQyw4REFBOEQ7UUFDOUQsY0FBUyxHQUFRLFNBQVMsQ0FBQztRQUMzQixnQkFBVyxHQUFHLElBQUksQ0FBQyxTQUFTLEVBQUUsWUFBWSxDQUFDO1FBRTNDLHdDQUF3QztRQUN4QyxnQkFBVyxHQUFzQixRQUFRLENBQUM7UUFFMUMseUJBQXlCO1FBQ3pCLGlCQUFZLEdBQWdCLElBQUksQ0FBQztRQUVqQyw0QkFBNEI7UUFDNUIsZUFBVSxHQUFHLEtBQUssQ0FBQztRQUVuQiw4QkFBOEI7UUFDOUIsaUJBQVksR0FBOEIsSUFBSSxDQUFDO1FBRS9DLDhDQUE4QztRQUM5QyxjQUFTLEdBQTJCLEVBQUUsQ0FBQztRQUV2Qyw2Q0FBNkM7UUFDN0MsaUJBQVksR0FBa0IsSUFBSSxDQUFDO1FBRW5DOzs7V0FHRztRQUNILGtCQUFhLEdBQWtCLElBQUksQ0FBQztRQUVwQyw2RUFBNkU7UUFDckUsYUFBUSxHQUFrQixJQUFJLENBQUM7UUFFdkMsc0VBQXNFO1FBQzdELGtCQUFhLEdBQUcsUUFBVSxDQUFDO1FBRXBDLGdGQUFnRjtRQUN2RSx3QkFBbUIsR0FBRyxDQUFDLE1BQU0sRUFBRSxPQUFPLENBQUMsQ0FBQztJQU85QyxDQUFDO0lBRUo7Ozs7OztPQU1HO0lBQ0gsSUFBSSxlQUFlO1FBQ2pCLE1BQU0sSUFBSSxHQUFhLElBQUksQ0FBQyxXQUFXLEVBQUUsZUFBZSxJQUFJLEVBQUUsQ0FBQztRQUMvRCxPQUFPLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUN2QyxDQUFDO0lBRUQ7Ozs7OztPQU1HO0lBQ0ssa0JBQWtCLENBQUMsSUFBYztRQUN2QyxNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsa0JBQWtCLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDN0MsT0FBTyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxFQUFFLEdBQUcsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQztJQUN6RSxDQUFDO0lBRUQ7Ozs7Ozs7Ozs7Ozs7O09BY0c7SUFDSyxrQkFBa0IsQ0FDeEIsSUFBYztRQUVkLE1BQU0sWUFBWSxHQUFHLElBQUksQ0FBQyxZQUFZLEVBQUUsd0JBQXdCLEVBQUUsSUFBSSxFQUFFLENBQUM7UUFDekUsSUFBSSxDQUFDLFlBQVksQ0FBQyxNQUFNLEVBQUU7WUFDeEIsT0FBTyxFQUFFLENBQUM7U0FDWDtRQUNELE1BQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxXQUFXLEVBQUUsdUJBQXVCLElBQUksRUFBRSxDQUFDO1FBQ2xFLE1BQU0sSUFBSSxHQUFHLElBQUksR0FBRyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLEdBQUcsQ0FBQyxXQUFXLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDM0QsTUFBTSxNQUFNLEdBQTZDLEVBQUUsQ0FBQztRQUM1RCxZQUFZLENBQUMsT0FBTyxDQUFDLENBQUMsS0FBSyxFQUFFLEVBQUU7WUFDN0IsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQzNDLElBQUksS0FBSyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsV0FBVyxFQUFFLENBQUMsRUFBRTtnQkFDM0MsSUFBSSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsV0FBVyxFQUFFLENBQUMsQ0FBQztnQkFDOUIsTUFBTSxDQUFDLElBQUksQ0FBQyxFQUFFLEtBQUssRUFBRSxXQUFXLEVBQUUsU0FBUyxDQUFDLEtBQUssQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLENBQUM7YUFDN0Q7UUFDSCxDQUFDLENBQUMsQ0FBQztRQUNILE9BQU8sTUFBTSxDQUFDO0lBQ2hCLENBQUM7SUFFRDs7Ozs7O09BTUc7SUFDSyxnQkFBZ0IsQ0FBQyxLQUFhO1FBQ3BDLE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxXQUFXLEVBQUUsaUJBQWlCLElBQUksRUFBRSxDQUFDO1FBQ3pELElBQUksTUFBTSxDQUFDLEtBQUssQ0FBQyxFQUFFO1lBQ2pCLE9BQU8sTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDO1NBQ3RCO1FBQ0QsOENBQThDO1FBQzlDLE9BQU8sS0FBSzthQUNULE9BQU8sQ0FBQyxRQUFRLEVBQUUsR0FBRyxDQUFDO2FBQ3RCLE9BQU8sQ0FBQyxPQUFPLEVBQUUsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQyxDQUFDO0lBQ3BELENBQUM7SUFFRCxpRUFBaUU7SUFDakUsSUFBSSxpQkFBaUI7UUFDbkIsT0FBTyxJQUFJLENBQUMsbUJBQW1CLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQzVDLENBQUM7SUFFRCw2RUFBNkU7SUFDN0UsSUFBWSxPQUFPO1FBQ2pCLE9BQU8sQ0FDTCxJQUFJLENBQUMsYUFBYSxFQUFFLE9BQU87WUFDMUIsSUFBSSxDQUFDLFlBQVksRUFBRSxvQkFBb0IsRUFBRSxFQUFFLE9BQWtCO1lBQzlELEVBQUUsQ0FDSCxDQUFDO0lBQ0osQ0FBQztJQUVEOzs7T0FHRztJQUNILFFBQVE7UUFDTixJQUFJLENBQUMsc0JBQXNCLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxZQUFZLEVBQUUsVUFBVSxDQUFDLENBQUM7SUFDM0UsQ0FBQztJQUVEOzs7T0FHRztJQUNILFdBQVc7UUFDVCxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUN6QixJQUFJLENBQUMsUUFBUSxDQUFDLFFBQVEsRUFBRSxDQUFDO0lBQzNCLENBQUM7SUFFRDs7OztPQUlHO0lBQ0gsY0FBYyxDQUFDLEtBQVk7UUFDekIsTUFBTSxLQUFLLEdBQUcsS0FBSyxDQUFDLE1BQTBCLENBQUM7UUFDL0MsSUFBSSxDQUFDLEtBQUssQ0FBQyxLQUFLLElBQUksS0FBSyxDQUFDLEtBQUssQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFO1lBQzVDLE9BQU87U0FDUjtRQUNELElBQUksS0FBSyxDQUFDLEtBQUssQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFO1lBQzFCLElBQUksQ0FBQyx1QkFBdUIsRUFBRSxDQUFDO1lBQy9CLE9BQU87U0FDUjtRQUNELElBQUksQ0FBQyxXQUFXLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ25DLENBQUM7SUFFRDs7OztPQUlHO0lBQ0gsVUFBVSxDQUFDLEtBQWdCO1FBQ3pCLEtBQUssQ0FBQyxjQUFjLEVBQUUsQ0FBQztRQUN2QixLQUFLLENBQUMsZUFBZSxFQUFFLENBQUM7UUFDeEIsSUFBSSxDQUFDLFVBQVUsR0FBRyxLQUFLLENBQUM7UUFDeEIsTUFBTSxLQUFLLEdBQUcsS0FBSyxDQUFDLFlBQVksRUFBRSxLQUFLLENBQUM7UUFDeEMsSUFBSSxDQUFDLEtBQUssSUFBSSxLQUFLLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRTtZQUNoQyxPQUFPO1NBQ1I7UUFDRCxJQUFJLEtBQUssQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFO1lBQ3BCLElBQUksQ0FBQyx1QkFBdUIsRUFBRSxDQUFDO1lBQy9CLE9BQU87U0FDUjtRQUNELElBQUksQ0FBQyxXQUFXLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDN0IsQ0FBQztJQUVEOzs7O09BSUc7SUFDSCxVQUFVLENBQUMsS0FBZ0I7UUFDekIsS0FBSyxDQUFDLGNBQWMsRUFBRSxDQUFDO1FBQ3ZCLEtBQUssQ0FBQyxlQUFlLEVBQUUsQ0FBQztRQUN4QixJQUFJLENBQUMsVUFBVSxHQUFHLElBQUksQ0FBQztJQUN6QixDQUFDO0lBRUQ7Ozs7T0FJRztJQUNILFdBQVcsQ0FBQyxLQUFnQjtRQUMxQixLQUFLLENBQUMsY0FBYyxFQUFFLENBQUM7UUFDdkIsS0FBSyxDQUFDLGVBQWUsRUFBRSxDQUFDO1FBQ3hCLElBQUksQ0FBQyxVQUFVLEdBQUcsS0FBSyxDQUFDO0lBQzFCLENBQUM7SUFFRDs7OztPQUlHO0lBQ0gsV0FBVyxDQUFDLElBQVU7UUFDcEIsSUFBSSxDQUFDLFlBQVksR0FBRyxJQUFJLENBQUM7UUFDekIsSUFBSSxDQUFDLGFBQWEsR0FBRyxJQUFJLENBQUM7UUFDMUIsSUFBSSxDQUFDLFlBQVksR0FBRyxJQUFJLENBQUM7UUFDekIsSUFBSSxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUM7UUFDckIseUVBQXlFO1FBQ3pFLDBEQUEwRDtRQUMxRCxJQUFJLENBQUMsWUFBWSxHQUFHLElBQUksQ0FBQztRQUV6QixNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO1FBQ3pDLE1BQU0sZ0JBQWdCLEdBQUcsSUFBSSxDQUFDLG1CQUFtQixDQUFDLElBQUksQ0FBQyxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQzdELFFBQVEsQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLENBQ3ZCLENBQUM7UUFDRixJQUFJLENBQUMsZ0JBQWdCLEVBQUU7WUFDckIsSUFBSSxDQUFDLFlBQVk7Z0JBQ2YsSUFBSSxDQUFDLFdBQVcsRUFBRSxVQUFVLEVBQUUsZUFBZTtvQkFDN0MsZ0VBQWdFLENBQUM7WUFDbkUsT0FBTztTQUNSO1FBRUQsSUFBSSxJQUFJLENBQUMsSUFBSSxLQUFLLENBQUMsRUFBRTtZQUNuQixJQUFJLENBQUMsWUFBWTtnQkFDZixJQUFJLENBQUMsV0FBVyxFQUFFLFVBQVUsRUFBRSxTQUFTO29CQUN2Qyx1RUFBdUUsQ0FBQztZQUMxRSxPQUFPO1NBQ1I7UUFFRCxJQUFJLElBQUksQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDLGFBQWEsRUFBRTtZQUNsQyxJQUFJLENBQUMsWUFBWTtnQkFDZixJQUFJLENBQUMsV0FBVyxFQUFFLFVBQVUsRUFBRSxZQUFZO29CQUMxQyxxREFBcUQsQ0FBQztZQUN4RCxPQUFPO1NBQ1I7UUFFRCxJQUFJLENBQUMsWUFBWSxHQUFHLElBQUksQ0FBQztJQUMzQixDQUFDO0lBRUQ7OztPQUdHO0lBQ0gsdUJBQXVCO1FBQ3JCLElBQUksQ0FBQyxZQUFZO1lBQ2YsSUFBSSxDQUFDLFdBQVcsRUFBRSxVQUFVLEVBQUUsY0FBYztnQkFDNUMsd0NBQXdDLENBQUM7SUFDN0MsQ0FBQztJQUVEOzs7T0FHRztJQUNILFlBQVk7UUFDVixJQUFJLENBQUMsWUFBWSxHQUFHLElBQUksQ0FBQztRQUN6QixJQUFJLENBQUMsWUFBWSxHQUFHLElBQUksQ0FBQztRQUN6QixJQUFJLENBQUMsYUFBYSxHQUFHLElBQUksQ0FBQztRQUMxQixJQUFJLENBQUMsWUFBWSxHQUFHLElBQUksQ0FBQztRQUN6QixJQUFJLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQztRQUNyQixJQUFJLENBQUMsV0FBVyxHQUFHLFFBQVEsQ0FBQztJQUM5QixDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDSCxRQUFRO1FBQ04sSUFBSSxDQUFDLElBQUksQ0FBQyxZQUFZLEVBQUU7WUFDdEIsT0FBTztTQUNSO1FBQ0QsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUU7WUFDakIsSUFBSSxDQUFDLFlBQVk7Z0JBQ2YsSUFBSSxDQUFDLFdBQVcsRUFBRSxVQUFVLEVBQUUsWUFBWTtvQkFDMUMsaUVBQWlFLENBQUM7WUFDcEUsT0FBTztTQUNSO1FBQ0QsSUFBSSxDQUFDLFlBQVksR0FBRyxJQUFJLENBQUM7UUFDekIsSUFBSSxDQUFDLGFBQWEsR0FBRyxJQUFJLENBQUM7UUFDMUIsSUFBSSxDQUFDLFlBQVksR0FBRyxJQUFJLENBQUM7UUFDekIsSUFBSSxDQUFDLFNBQVMsR0FBRyxFQUFFLENBQUM7UUFDcEIsSUFBSSxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUM7UUFDckIsSUFBSSxDQUFDLFdBQVcsR0FBRyxZQUFZLENBQUM7UUFFaEMsSUFBSSxDQUFDLHNCQUFzQjthQUN4QixnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsWUFBWSxFQUFFLElBQUksQ0FBQyxPQUFPLENBQUM7YUFDakQsSUFBSSxDQUNILFNBQVMsQ0FBQyxDQUFDLEdBQW9CLEVBQUUsRUFBRTtZQUNqQyxJQUFJLENBQUMsUUFBUSxHQUFHLEdBQUcsRUFBRSxRQUFRLElBQUksSUFBSSxDQUFDO1lBQ3RDLE9BQU8sSUFBSSxDQUFDLHNCQUFzQixDQUFDLGlCQUFpQixDQUNsRCxJQUFJLENBQUMsUUFBa0IsQ0FDeEIsQ0FBQztRQUNKLENBQUMsQ0FBQyxFQUNGLFNBQVMsQ0FBQyxHQUFHLEVBQUUsQ0FDYixJQUFJLENBQUMsc0JBQXNCLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLFFBQWtCLENBQUMsQ0FDdEUsRUFDRCxTQUFTLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUN6QjthQUNBLFNBQVMsQ0FBQztZQUNULElBQUksRUFBRSxDQUFDLFlBQTZCLEVBQUUsRUFBRTtnQkFDdEMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxZQUFZLENBQUMsQ0FBQztZQUNwQyxDQUFDO1lBQ0QsOERBQThEO1lBQzlELEtBQUssRUFBRSxDQUFDLEtBQVUsRUFBRSxFQUFFO2dCQUNwQixJQUFJLENBQUMsaUJBQWlCLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDaEMsQ0FBQztTQUNGLENBQUMsQ0FBQztJQUNQLENBQUM7SUFFRDs7Ozs7O09BTUc7SUFDSCw4REFBOEQ7SUFDdEQsaUJBQWlCLENBQUMsS0FBVTtRQUNsQyxJQUFJLENBQUMsV0FBVyxHQUFHLFFBQVEsQ0FBQztRQUU1QiwyRUFBMkU7UUFDM0UsZ0VBQWdFO1FBQ2hFLE1BQU0sVUFBVSxHQUF5QixLQUFLLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxVQUFVLENBQUM7UUFDeEUsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxJQUFJLFVBQVUsQ0FBQyxNQUFNLEVBQUU7WUFDbEQsTUFBTSxJQUFJLEdBQUcsVUFBVSxDQUFDLENBQUMsQ0FBdUMsQ0FBQztZQUNqRSxJQUFJLENBQUMsWUFBWTtnQkFDZixJQUFJLENBQUMsU0FBUyxFQUFFLE1BQU0sRUFBRSxDQUFDLElBQUksQ0FBQztvQkFDOUIsSUFBSSxDQUFDLFdBQVcsRUFBRSxVQUFVLEVBQUUsWUFBWTtvQkFDMUMsaUVBQWlFLENBQUM7WUFDcEUsT0FBTztTQUNSO1FBRUQsd0VBQXdFO1FBQ3hFLDRFQUE0RTtRQUM1RSx3REFBd0Q7UUFDeEQsTUFBTSxNQUFNLEdBQUcsS0FBSyxFQUFFLE1BQU0sSUFBSSxLQUFLLEVBQUUsS0FBSyxFQUFFLE1BQU0sQ0FBQztRQUNyRCxJQUFJLE1BQU0sS0FBSyxHQUFHLEVBQUU7WUFDbEIsSUFBSSxDQUFDLFlBQVk7Z0JBQ2YsSUFBSSxDQUFDLFdBQVcsRUFBRSxVQUFVLEVBQUUsU0FBUztvQkFDdkMsK0RBQStELENBQUM7WUFDbEUsT0FBTztTQUNSO1FBRUQsSUFBSSxDQUFDLFlBQVk7WUFDZixJQUFJLENBQUMsV0FBVyxFQUFFLFVBQVUsRUFBRSxZQUFZO2dCQUMxQyxpRUFBaUUsQ0FBQztJQUN0RSxDQUFDO0lBRUQ7Ozs7OztPQU1HO0lBQ0gsY0FBYyxDQUFDLEdBQW9CO1FBQ2pDLE1BQU0sWUFBWSxHQUFHLEdBQUcsRUFBRSxTQUFTLElBQUksQ0FBQyxDQUFDO1FBQ3pDLE1BQU0sWUFBWSxHQUFHLEdBQUcsRUFBRSxXQUFXLElBQUksQ0FBQyxDQUFDO1FBQzNDLE1BQU0sWUFBWSxHQUFHLEdBQUcsRUFBRSxVQUFVLElBQUksQ0FBQyxDQUFDO1FBRTFDLElBQUksQ0FBQyxZQUFZLEdBQUcsRUFBRSxZQUFZLEVBQUUsWUFBWSxFQUFFLFlBQVksRUFBRSxDQUFDO1FBQ2pFLElBQUksQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixDQUFDLEdBQUcsRUFBRSxXQUFXLENBQUMsQ0FBQztRQUN6RCxJQUFJLENBQUMsV0FBVyxHQUFHLFFBQVEsQ0FBQztRQUU1QixJQUFJLFlBQVksS0FBSyxDQUFDLEVBQUU7WUFDdEIsSUFBSSxDQUFDLGFBQWE7Z0JBQ2hCLElBQUksQ0FBQyxXQUFXLEVBQUUsVUFBVSxFQUFFLGFBQWE7b0JBQzNDLGlGQUFpRixDQUFDO1NBQ3JGO0lBQ0gsQ0FBQztJQUVEOzs7Ozs7Ozs7Ozs7O09BYUc7SUFDSCw4REFBOEQ7SUFDdEQsZ0JBQWdCLENBQUMsV0FBaUI7UUFDeEMsSUFBSSxDQUFDLFdBQVcsRUFBRTtZQUNoQixPQUFPLEVBQUUsQ0FBQztTQUNYO1FBQ0QscUVBQXFFO1FBQ3JFLElBQUksS0FBSyxHQUFZLFdBQVcsQ0FBQztRQUNqQyxJQUFJLE9BQU8sV0FBVyxLQUFLLFFBQVEsRUFBRTtZQUNuQyxJQUFJO2dCQUNGLEtBQUssR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLFdBQVcsQ0FBQyxDQUFDO2FBQ2pDO1lBQUMsTUFBTTtnQkFDTixPQUFPLEVBQUUsQ0FBQzthQUNYO1NBQ0Y7UUFDRCxrRUFBa0U7UUFDbEUsTUFBTSxPQUFPLEdBQThCLEtBQUssQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDO1lBQzdELENBQUMsQ0FBRSxLQUFtQztZQUN0QyxDQUFDLENBQUMsQ0FBRSxLQUE4QyxFQUFFLElBQUksSUFBSSxFQUFFLENBQUMsQ0FBQztRQUNsRSxPQUFPLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLENBQUM7WUFDN0IsU0FBUyxFQUFFLEtBQUssRUFBRSxHQUFHO1lBQ3JCLEtBQUssRUFBRSxLQUFLLEVBQUUsS0FBSztZQUNuQixZQUFZLEVBQUUsS0FBSyxFQUFFLE9BQU87U0FDN0IsQ0FBQyxDQUFDLENBQUM7SUFDTixDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDSCxJQUFJLGdCQUFnQjtRQUNsQixPQUFPLENBQUMsQ0FBQyxJQUFJLENBQUMsWUFBWSxJQUFJLElBQUksQ0FBQyxZQUFZLENBQUMsWUFBWSxHQUFHLENBQUMsQ0FBQztJQUNuRSxDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDSCxJQUFJLGNBQWM7UUFDaEIsT0FBTyxDQUNMLENBQUMsQ0FBQyxJQUFJLENBQUMsWUFBWTtZQUNuQixJQUFJLENBQUMsWUFBWSxDQUFDLFlBQVksR0FBRyxDQUFDO1lBQ2xDLElBQUksQ0FBQyxZQUFZLENBQUMsWUFBWSxLQUFLLENBQUMsQ0FDckMsQ0FBQztJQUNKLENBQUM7SUFFRDs7OztPQUlHO0lBQ0gsa0JBQWtCO1FBQ2hCLE1BQU0sVUFBVSxHQUFHLElBQUksQ0FBQyxlQUFlO2FBQ3BDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsQ0FBQzthQUNqQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7UUFFYix5RUFBeUU7UUFDekUsMkVBQTJFO1FBQzNFLHVFQUF1RTtRQUN2RSxpRUFBaUU7UUFDakUsOEJBQThCO1FBQzlCLE1BQU0sSUFBSSxHQUFhLElBQUksQ0FBQyxXQUFXLEVBQUUsZUFBZSxJQUFJLEVBQUUsQ0FBQztRQUMvRCxNQUFNLGNBQWMsR0FBZSxJQUFJLENBQUMsV0FBVyxFQUFFLFVBQVUsSUFBSSxFQUFFLENBQUM7UUFDdEUsTUFBTSxpQkFBaUIsR0FBRyxJQUFJLENBQUMsa0JBQWtCLENBQUMsSUFBSSxDQUFDLENBQUMsR0FBRyxDQUN6RCxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUMsR0FBRyxDQUFDLFdBQVcsQ0FDekIsQ0FBQztRQUNGLE1BQU0sU0FBUyxHQUFHLGNBQWMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUMzQyxDQUFDLEdBQUcsR0FBRyxFQUFFLEdBQUcsaUJBQWlCLENBQUM7YUFDM0IsR0FBRyxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFDO2FBQ25DLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FDYixDQUFDO1FBRUYsTUFBTSxVQUFVLEdBQUcsQ0FBQyxVQUFVLEVBQUUsR0FBRyxTQUFTLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLEdBQUcsTUFBTSxDQUFDO1FBQ3BFLE1BQU0sSUFBSSxHQUFHLElBQUksSUFBSSxDQUFDLENBQUMsVUFBVSxDQUFDLEVBQUU7WUFDbEMsSUFBSSxFQUFFLHlCQUF5QjtTQUNoQyxDQUFDLENBQUM7UUFDSCxNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsV0FBVyxFQUFFLGNBQWMsSUFBSSxtQkFBbUIsQ0FBQztRQUN6RSxJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksRUFBRSxRQUFRLENBQUMsQ0FBQztJQUN2QyxDQUFDO0lBRUQ7Ozs7T0FJRztJQUNILGdCQUFnQjtRQUNkLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLE1BQU0sRUFBRTtZQUMxQixPQUFPO1NBQ1I7UUFDRCxNQUFNLE9BQU8sR0FBYSxJQUFJLENBQUMsV0FBVyxFQUFFLFFBQVEsRUFBRSxPQUFPLElBQUk7WUFDL0QsS0FBSztZQUNMLE9BQU87WUFDUCxPQUFPO1NBQ1IsQ0FBQztRQUNGLE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLENBQUMsTUFBTSxFQUFFLEVBQUUsQ0FDekMsQ0FBQyxNQUFNLENBQUMsU0FBUyxFQUFFLE1BQU0sQ0FBQyxLQUFLLEVBQUUsTUFBTSxDQUFDLFlBQVksQ0FBQzthQUNsRCxHQUFHLENBQUMsQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLENBQUM7YUFDckMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUNiLENBQUM7UUFDRixNQUFNLFVBQVUsR0FBRztZQUNqQixPQUFPLENBQUMsR0FBRyxDQUFDLENBQUMsTUFBTSxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQztZQUN6RCxHQUFHLElBQUk7U0FDUixDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUNmLE1BQU0sUUFBUSxHQUNaLElBQUksQ0FBQyxXQUFXLEVBQUUsUUFBUSxFQUFFLFFBQVEsSUFBSSw2QkFBNkIsQ0FBQztRQUN4RSxNQUFNLElBQUksR0FBRyxJQUFJLElBQUksQ0FBQyxDQUFDLFVBQVUsQ0FBQyxFQUFFLEVBQUUsSUFBSSxFQUFFLHlCQUF5QixFQUFFLENBQUMsQ0FBQztRQUN6RSxJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksRUFBRSxRQUFRLENBQUMsQ0FBQztJQUN2QyxDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDSCxTQUFTLENBQUMsS0FBeUM7UUFDakQsTUFBTSxHQUFHLEdBQUcsS0FBSyxLQUFLLFNBQVMsSUFBSSxLQUFLLEtBQUssSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUN2RSxJQUFJLFVBQVUsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUU7WUFDeEIsT0FBTyxJQUFJLEdBQUcsQ0FBQyxPQUFPLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUM7U0FDdkM7UUFDRCxPQUFPLEdBQUcsQ0FBQztJQUNiLENBQUM7SUFFRDs7OztPQUlHO0lBQ0gsUUFBUTtRQUNOLElBQUksSUFBSSxDQUFDLFlBQVksSUFBSSxJQUFJLENBQUMsWUFBWSxDQUFDLFlBQVksR0FBRyxDQUFDLEVBQUU7WUFDM0QsSUFBSSxDQUFDLGtCQUFrQixDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUM7U0FDakQ7YUFBTTtZQUNMLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxFQUFFLENBQUM7U0FDeEI7SUFDSCxDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDSyxlQUFlLENBQUMsSUFBVSxFQUFFLFFBQWdCO1FBQ2xELE1BQU0sR0FBRyxHQUFHLEdBQUcsQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDdEMsTUFBTSxJQUFJLEdBQUcsUUFBUSxDQUFDLGFBQWEsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUN6QyxJQUFJLENBQUMsSUFBSSxHQUFHLEdBQUcsQ0FBQztRQUNoQixJQUFJLENBQUMsUUFBUSxHQUFHLFFBQVEsQ0FBQztRQUN6QixJQUFJLENBQUMsS0FBSyxFQUFFLENBQUM7UUFDYixHQUFHLENBQUMsZUFBZSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQzNCLENBQUM7K0dBdGpCVSxxQkFBcUI7bUdBQXJCLHFCQUFxQiw2TUNsRWxDLHdwVEF1UEEsK2ppQkQxTFksWUFBWSwrUEFBRSxlQUFlLDJRQUFFLG9CQUFvQjs7NEZBS2xELHFCQUFxQjtrQkFSakMsU0FBUzsrQkFDRSxzQkFBc0IsY0FDcEIsSUFBSSxXQUNQLENBQUMsWUFBWSxFQUFFLGVBQWUsRUFBRSxvQkFBb0IsQ0FBQyxpQkFHL0MsaUJBQWlCLENBQUMsSUFBSTt5SUFLNUIsYUFBYTtzQkFBckIsS0FBSztnQkFJSSxrQkFBa0I7c0JBQTNCLE1BQU07Z0JBR0csVUFBVTtzQkFBbkIsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XHJcbiAgQ29tcG9uZW50LFxyXG4gIEV2ZW50RW1pdHRlcixcclxuICBJbnB1dCxcclxuICBPbkRlc3Ryb3ksXHJcbiAgT25Jbml0LFxyXG4gIE91dHB1dCxcclxuICBWaWV3RW5jYXBzdWxhdGlvbixcclxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgQ29tbW9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcclxuaW1wb3J0IHsgTWF0QnV0dG9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvYnV0dG9uJztcclxuaW1wb3J0IHsgTWF0UHJvZ3Jlc3NCYXJNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9wcm9ncmVzcy1iYXInO1xyXG5pbXBvcnQgeyBTdWJqZWN0LCBzd2l0Y2hNYXAsIHRha2VVbnRpbCB9IGZyb20gJ3J4anMnO1xyXG5pbXBvcnQge1xyXG4gIFJvc3RlckltcG9ydEVycm9yUmVwb3J0LFxyXG4gIFJvc3RlckltcG9ydEpvYixcclxufSBmcm9tICcuLi8uLi9tb2RlbHMvcm9zdGVyLWltcG9ydC5tb2RlbCc7XHJcbmltcG9ydCB7IFJvc3RlckltcG9ydEFwaVNlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9yb3N0ZXItaW1wb3J0LWFwaS5zZXJ2aWNlJztcclxuaW1wb3J0IHsgR3JvdXBzU2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL2dyb3Vwcy5zZXJ2aWNlJztcclxuaW1wb3J0ICogYXMgY29uc3RhbnRzIGZyb20gJy4uLy4uL2Fzc2V0cy9jb25zdGFudHMuanNvbic7XHJcblxyXG4vKiogU3RhdGVzIG9mIHRoZSByb3N0ZXIgaW1wb3J0IGZsb3cuICovXHJcbnR5cGUgUm9zdGVySW1wb3J0U3RhdGUgPSAndXBsb2FkJyB8ICdwcm9jZXNzaW5nJyB8ICdyZXN1bHQnO1xyXG5cclxuLyoqXHJcbiAqIFZpZXctbW9kZWwgZm9yIHRoZSByZXN1bHQgc2NyZWVuLiBQb3B1bGF0ZWQgZnJvbSB0aGUgY29uZmlybWVkXHJcbiAqIHtAbGluayBSb3N0ZXJJbXBvcnRKb2J9IHJldHVybmVkIGJ5IHRoZSBiYWNrZW5kLlxyXG4gKi9cclxuaW50ZXJmYWNlIFJvc3RlckltcG9ydFJlc3VsdCB7XHJcbiAgdG90YWxSZWNvcmRzOiBudW1iZXI7XHJcbiAgc3VjY2Vzc0NvdW50OiBudW1iZXI7XHJcbiAgZmFpbHVyZUNvdW50OiBudW1iZXI7XHJcbn1cclxuXHJcbi8qKiBSb3cgZXJyb3Igc2hvd24gb24gdGhlIHJlc3VsdCBzY3JlZW4gKG1hcHBlZCBmcm9tIHRoZSBCRSBlcnJvciByZXBvcnQpLiAqL1xyXG5pbnRlcmZhY2UgUm9zdGVySW1wb3J0Um93RXJyb3Ige1xyXG4gIHJvd051bWJlcjogbnVtYmVyO1xyXG4gIGZpZWxkPzogc3RyaW5nO1xyXG4gIGVycm9yTWVzc2FnZTogc3RyaW5nO1xyXG59XHJcblxyXG4vKipcclxuICogUm9zdGVyIEltcG9ydCBkaWFsb2cuXHJcbiAqXHJcbiAqIExldHMgYW4gYWRtaW4gdXBsb2FkIGEgQ1NWL1hMU1ggcm9zdGVyIGZpbGUsIHNob3dzIGEgcHJvY2Vzc2luZyBwcm9ncmVzc1xyXG4gKiBiYXIsIHRoZW4gYSByZXN1bHQgc3VtbWFyeSAoYWRkZWQgLyBza2lwcGVkKSB3aXRoIHBlci1yb3cgZXJyb3JzIGFuZCBhblxyXG4gKiBlcnJvci1sb2cgZG93bmxvYWQuXHJcbiAqXHJcbiAqIFdpcmVkIHRvIHRoZSByZWFsIGJhY2tlbmQgcm9zdGVyLWltcG9ydCBzdGF0ZSBtYWNoaW5lXHJcbiAqIChzYS1zYWFwcHMtZ3JvdXBzLWFwaSBgUm9zdGVySW1wb3J0Q29udHJvbGxlcmApIHZpYVxyXG4gKiB7QGxpbmsgUm9zdGVySW1wb3J0QXBpU2VydmljZX06IG9uIEltcG9ydCBpdCBydW5zXHJcbiAqIHVwbG9hZCDihpIgdmFsaWRhdGUg4oaSIGNvbmZpcm0gYW5kIHJlbmRlcnMgdGhlIGNvbmZpcm1lZCBqb2IncyB0ZXJtaW5hbCBjb3VudHNcclxuICogYW5kIHBlci1yb3cgZXJyb3JzLiBTZXJ2ZXItc2lkZSB2YWxpZGF0aW9uIGVycm9ycyAoMTA3MiB1bnN1cHBvcnRlZCBmb3JtYXQsXHJcbiAqIDEwNzMgdG9vIGxhcmdlLCAxMDc0IHJvdyBsaW1pdCwgMTA3NSBpbnZhbGlkIHN0YXR1cykgYXJlIHN1cmZhY2VkIGlubGluZS5cclxuICpcclxuICogQGV4cG9ydFxyXG4gKiBAY2xhc3MgUm9zdGVySW1wb3J0Q29tcG9uZW50XHJcbiAqL1xyXG5AQ29tcG9uZW50KHtcclxuICBzZWxlY3RvcjogJ2llZWVzYS1yb3N0ZXItaW1wb3J0JyxcclxuICBzdGFuZGFsb25lOiB0cnVlLFxyXG4gIGltcG9ydHM6IFtDb21tb25Nb2R1bGUsIE1hdEJ1dHRvbk1vZHVsZSwgTWF0UHJvZ3Jlc3NCYXJNb2R1bGVdLFxyXG4gIHRlbXBsYXRlVXJsOiAnLi9yb3N0ZXItaW1wb3J0LmNvbXBvbmVudC5odG1sJyxcclxuICBzdHlsZVVybHM6IFsnLi9yb3N0ZXItaW1wb3J0LmNvbXBvbmVudC5zY3NzJ10sXHJcbiAgZW5jYXBzdWxhdGlvbjogVmlld0VuY2Fwc3VsYXRpb24uTm9uZSxcclxufSlcclxuZXhwb3J0IGNsYXNzIFJvc3RlckltcG9ydENvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgT25EZXN0cm95IHtcclxuICAvKiogQ2FycmllcyB0aGUgeyBncm91cElkLCBncm91cE5hbWUgfSBwYXlsb2FkIGZyb20gdGhlIG9wZW5pbmcgZGlhbG9nLiAqL1xyXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XHJcbiAgQElucHV0KCkgY29tcG9uZW50RGF0YTogYW55O1xyXG5cclxuICAvKiogRW1pdHRlZCBhZnRlciBhbiBpbXBvcnQgdGhhdCBhZGRlZCBhdCBsZWFzdCBvbmUgcm93IChwYXJlbnQgcmVmcmVzaGVzKS4gKi9cclxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxyXG4gIEBPdXRwdXQoKSBzdWJtaXRGb3JtUmVzcG9uc2UgPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcclxuXHJcbiAgLyoqIEVtaXR0ZWQgd2hlbiB0aGUgdXNlciBjYW5jZWxzL2Nsb3NlcyB3aXRob3V0IGEgc3VjY2Vzc2Z1bCBhZGQuICovXHJcbiAgQE91dHB1dCgpIGZvcm1DYW5jZWwgPSBuZXcgRXZlbnRFbWl0dGVyPHZvaWQ+KCk7XHJcblxyXG4gIGRlc3Ryb3kkID0gbmV3IFN1YmplY3Q8Ym9vbGVhbj4oKTtcclxuXHJcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcclxuICBjb25zdGFudHM6IGFueSA9IGNvbnN0YW50cztcclxuICBzY3JlZW5UZXh0cyA9IHRoaXMuY29uc3RhbnRzPy5yb3N0ZXJJbXBvcnQ7XHJcblxyXG4gIC8qKiBDdXJyZW50IHN0YXRlIG9mIHRoZSBpbXBvcnQgZmxvdy4gKi9cclxuICBpbXBvcnRTdGF0ZTogUm9zdGVySW1wb3J0U3RhdGUgPSAndXBsb2FkJztcclxuXHJcbiAgLyoqIFRoZSBzZWxlY3RlZCBmaWxlLiAqL1xyXG4gIHNlbGVjdGVkRmlsZTogRmlsZSB8IG51bGwgPSBudWxsO1xyXG5cclxuICAvKiogRmlsZSBkcmFnLW92ZXIgc3RhdGUuICovXHJcbiAgaXNEcmFnT3ZlciA9IGZhbHNlO1xyXG5cclxuICAvKiogVGVybWluYWwgdXBsb2FkIHJlc3VsdC4gKi9cclxuICB1cGxvYWRSZXN1bHQ6IFJvc3RlckltcG9ydFJlc3VsdCB8IG51bGwgPSBudWxsO1xyXG5cclxuICAvKiogUm93LWxldmVsIGVycm9ycyBmb3IgdGhlIGNvbXBsZXRlZCBqb2IuICovXHJcbiAgam9iRXJyb3JzOiBSb3N0ZXJJbXBvcnRSb3dFcnJvcltdID0gW107XHJcblxyXG4gIC8qKiBJbmxpbmUgdmFsaWRhdGlvbiAvIEFQSSBlcnJvciBtZXNzYWdlLiAqL1xyXG4gIGVycm9yTWVzc2FnZTogc3RyaW5nIHwgbnVsbCA9IG51bGw7XHJcblxyXG4gIC8qKlxyXG4gICAqIEluZm8gYmFubmVyIHNob3duIHdoZW4gdGhlIGZpbGUgaGFzIGhlYWRlcnMgYnV0IG5vIGRhdGEgcm93c1xyXG4gICAqIChGaWdtYTogXCJObyByb3N0ZXIgZGF0YSBmb3VuZC4uLlwiKS5cclxuICAgKi9cclxuICBub0RhdGFNZXNzYWdlOiBzdHJpbmcgfCBudWxsID0gbnVsbDtcclxuXHJcbiAgLyoqIFRoZSBpbXBvcnQgam9iIGlkIHJldHVybmVkIGJ5IHVwbG9hZCAoa2VwdCBzbyBjYW5jZWwgY2FuIGNsZWFuIGl0IHVwKS4gKi9cclxuICBwcml2YXRlIGltcG9ydElkOiBzdHJpbmcgfCBudWxsID0gbnVsbDtcclxuXHJcbiAgLyoqIE1heGltdW0gZmlsZSBzaXplIGluIGJ5dGVzICgxMCBNQikg4oCUIG1hdGNoZXMgdGhlIEJFIDEwTUIgbGltaXQuICovXHJcbiAgcmVhZG9ubHkgTUFYX0ZJTEVfU0laRSA9IDEwXzQ4NV83NjA7XHJcblxyXG4gIC8qKiBBY2NlcHRlZCBmaWxlIGV4dGVuc2lvbnMgKG11c3QgbWF0Y2ggdGhlIEJFIGNvbnRyYWN0OiBvbmx5IC5jc3YgLyAueGxzeCkuICovXHJcbiAgcmVhZG9ubHkgQUNDRVBURURfRVhURU5TSU9OUyA9IFsnLmNzdicsICcueGxzeCddO1xyXG5cclxuICBjb25zdHJ1Y3RvcihcclxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11bnVzZWQtdmFyc1xyXG4gICAgcHJpdmF0ZSByb3N0ZXJJbXBvcnRBcGlTZXJ2aWNlOiBSb3N0ZXJJbXBvcnRBcGlTZXJ2aWNlLFxyXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVudXNlZC12YXJzXHJcbiAgICBwcml2YXRlIGdyb3VwU2VydmljZTogR3JvdXBzU2VydmljZVxyXG4gICkge31cclxuXHJcbiAgLyoqXHJcbiAgICogUmVxdWlyZWQgY29sdW1uIGhlYWRlcnMgZm9yIGRpc3BsYXkgYW5kIHRoZSBzYW1wbGUgZmlsZS4gVGhpcyBpcyB0aGUgc3RhdGljXHJcbiAgICogYmFzZSBzZXQgZnJvbSBjb25zdGFudHMgUExVUyBhbnkgdGVuYW50LWxldmVsIHJlcXVpcmVkIHByb2ZpbGUgZmllbGRzIHRoZVxyXG4gICAqIGhvc3QgYXBwIGNvbmZpZ3VyZWQgKGUuZy4gcGhvbmUgLyBhZGRyZXNzIC8gZW1wbG95ZXIpLCBtYXBwZWQgdG8gZnJpZW5kbHlcclxuICAgKiBoZWFkZXJzIGFuZCBkZS1kdXBsaWNhdGVkIChjYXNlLWluc2Vuc2l0aXZlKSBhZ2FpbnN0IHRoZSBiYXNlIGNvbHVtbnMuXHJcbiAgICogQHJldHVybiB7c3RyaW5nW119XHJcbiAgICovXHJcbiAgZ2V0IHJlcXVpcmVkQ29sdW1ucygpOiBzdHJpbmdbXSB7XHJcbiAgICBjb25zdCBiYXNlOiBzdHJpbmdbXSA9IHRoaXMuc2NyZWVuVGV4dHM/LnJlcXVpcmVkQ29sdW1ucyA/PyBbXTtcclxuICAgIHJldHVybiB0aGlzLm1lcmdlVGVuYW50Q29sdW1ucyhiYXNlKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEFwcGVuZHMgdGhlIHRlbmFudC1jb25maWd1cmVkIGNvbHVtbnMgKGZyb20ge0BsaW5rIHRlbmFudEV4dHJhQ29sdW1uc30pIHRvXHJcbiAgICogdGhlIGJhc2UgY29sdW1uIGhlYWRlcnMuXHJcbiAgICogQHBhcmFtIHtzdHJpbmdbXX0gYmFzZSAtIFRoZSBzdGF0aWMgYmFzZSBjb2x1bW4gaGVhZGVycy5cclxuICAgKiBAcmV0dXJuIHtzdHJpbmdbXX1cclxuICAgKiBAbWVtYmVyb2YgUm9zdGVySW1wb3J0Q29tcG9uZW50XHJcbiAgICovXHJcbiAgcHJpdmF0ZSBtZXJnZVRlbmFudENvbHVtbnMoYmFzZTogc3RyaW5nW10pOiBzdHJpbmdbXSB7XHJcbiAgICBjb25zdCBleHRyYXMgPSB0aGlzLnRlbmFudEV4dHJhQ29sdW1ucyhiYXNlKTtcclxuICAgIHJldHVybiBleHRyYXMubGVuZ3RoID8gWy4uLmJhc2UsIC4uLmV4dHJhcy5tYXAoKGMpID0+IGMubGFiZWwpXSA6IGJhc2U7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBSZXNvbHZlcyB0aGUgdGVuYW50LWNvbmZpZ3VyZWQgcmVxdWlyZWQgcHJvZmlsZSBmaWVsZHMgaW50byB0aGUgRVhUUkFcclxuICAgKiBjb2x1bW5zIHRvIGFwcGVuZCBhZnRlciB0aGUgYmFzZSBzZXQg4oCUIHRoZSBzaW5nbGUgc291cmNlIG9mIHRydXRoIHNoYXJlZCBieVxyXG4gICAqIGJvdGggdGhlIGhlYWRlciBsaXN0ICh7QGxpbmsgcmVxdWlyZWRDb2x1bW5zfSkgYW5kIHRoZSBzYW1wbGUgZmlsZVxyXG4gICAqICh7QGxpbmsgZG93bmxvYWRTYW1wbGVGaWxlfSkgc28gdGhlIHR3byBuZXZlciBkcmlmdCBvdXQgb2YgYWxpZ25tZW50LlxyXG4gICAqXHJcbiAgICogRWFjaCBmaWVsZCBiZWNvbWVzIG9uZSBjb2x1bW4gd2l0aCBpdHMgZnJpZW5kbHkgYGxhYmVsYCAoa25vd24ga2V5cyB1c2UgdGhlXHJcbiAgICogbGFiZWwgbWFwOyB1bmtub3duIGtleXMgZmFsbCBiYWNrIHRvIGEgdGl0bGUtY2FzZWQga2V5KSBhbmQgYSBgc2FtcGxlVmFsdWVgXHJcbiAgICogZm9yIHRoZSBzYW1wbGUgcm93LiBGaWVsZHMgd2hvc2UgbGFiZWwgYWxyZWFkeSBleGlzdHMgaW4gdGhlIGJhc2Ugc2V0XHJcbiAgICogKGNhc2UtaW5zZW5zaXRpdmUpIGFyZSBza2lwcGVkIHNvIGEgdGVuYW50IGZpZWxkIGxpa2UgXCJlbXBsb3llclwiIHRoYXQgaXNcclxuICAgKiBhbHJlYWR5IGEgYmFzZSBjb2x1bW4gaXMgbm90IGR1cGxpY2F0ZWQuXHJcbiAgICogQHBhcmFtIHtzdHJpbmdbXX0gYmFzZSAtIFRoZSBzdGF0aWMgYmFzZSBjb2x1bW4gaGVhZGVycy5cclxuICAgKiBAcmV0dXJuIHt7IGxhYmVsOiBzdHJpbmc7IHNhbXBsZVZhbHVlOiBzdHJpbmcgfVtdfVxyXG4gICAqIEBtZW1iZXJvZiBSb3N0ZXJJbXBvcnRDb21wb25lbnRcclxuICAgKi9cclxuICBwcml2YXRlIHRlbmFudEV4dHJhQ29sdW1ucyhcclxuICAgIGJhc2U6IHN0cmluZ1tdXHJcbiAgKTogeyBsYWJlbDogc3RyaW5nOyBzYW1wbGVWYWx1ZTogc3RyaW5nIH1bXSB7XHJcbiAgICBjb25zdCB0ZW5hbnRGaWVsZHMgPSB0aGlzLmdyb3VwU2VydmljZT8uZ2V0UmVxdWlyZWRQcm9maWxlRmllbGRzKCkgPz8gW107XHJcbiAgICBpZiAoIXRlbmFudEZpZWxkcy5sZW5ndGgpIHtcclxuICAgICAgcmV0dXJuIFtdO1xyXG4gICAgfVxyXG4gICAgY29uc3Qgc2FtcGxlTWFwID0gdGhpcy5zY3JlZW5UZXh0cz8udGVuYW50RmllbGRTYW1wbGVWYWx1ZXMgPz8ge307XHJcbiAgICBjb25zdCBzZWVuID0gbmV3IFNldChiYXNlLm1hcCgoY29sKSA9PiBjb2wudG9Mb3dlckNhc2UoKSkpO1xyXG4gICAgY29uc3QgZXh0cmFzOiB7IGxhYmVsOiBzdHJpbmc7IHNhbXBsZVZhbHVlOiBzdHJpbmcgfVtdID0gW107XHJcbiAgICB0ZW5hbnRGaWVsZHMuZm9yRWFjaCgoZmllbGQpID0+IHtcclxuICAgICAgY29uc3QgbGFiZWwgPSB0aGlzLnRlbmFudEZpZWxkTGFiZWwoZmllbGQpO1xyXG4gICAgICBpZiAobGFiZWwgJiYgIXNlZW4uaGFzKGxhYmVsLnRvTG93ZXJDYXNlKCkpKSB7XHJcbiAgICAgICAgc2Vlbi5hZGQobGFiZWwudG9Mb3dlckNhc2UoKSk7XHJcbiAgICAgICAgZXh0cmFzLnB1c2goeyBsYWJlbCwgc2FtcGxlVmFsdWU6IHNhbXBsZU1hcFtmaWVsZF0gPz8gJycgfSk7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gICAgcmV0dXJuIGV4dHJhcztcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIE1hcHMgYSB0ZW5hbnQgZmllbGQga2V5IHRvIGl0cyBkaXNwbGF5IGhlYWRlci4gS25vd24ga2V5cyB1c2UgdGhlIGNvbmZpZ3VyZWRcclxuICAgKiBsYWJlbCBtYXA7IHVua25vd24ga2V5cyBmYWxsIGJhY2sgdG8gYSB0aXRsZS1jYXNlZCBrZXkuXHJcbiAgICogQHBhcmFtIHtzdHJpbmd9IGZpZWxkIC0gVGhlIHRlbmFudCBmaWVsZCBrZXkgKGUuZy4gJ3Bob25lJykuXHJcbiAgICogQHJldHVybiB7c3RyaW5nfVxyXG4gICAqIEBtZW1iZXJvZiBSb3N0ZXJJbXBvcnRDb21wb25lbnRcclxuICAgKi9cclxuICBwcml2YXRlIHRlbmFudEZpZWxkTGFiZWwoZmllbGQ6IHN0cmluZyk6IHN0cmluZyB7XHJcbiAgICBjb25zdCBsYWJlbHMgPSB0aGlzLnNjcmVlblRleHRzPy50ZW5hbnRGaWVsZExhYmVscyA/PyB7fTtcclxuICAgIGlmIChsYWJlbHNbZmllbGRdKSB7XHJcbiAgICAgIHJldHVybiBsYWJlbHNbZmllbGRdO1xyXG4gICAgfVxyXG4gICAgLy8gRmFsbGJhY2s6IFwicGhvbmVfbnVtYmVyXCIgLT4gXCJQaG9uZSBOdW1iZXJcIi5cclxuICAgIHJldHVybiBmaWVsZFxyXG4gICAgICAucmVwbGFjZSgvW18tXSsvZywgJyAnKVxyXG4gICAgICAucmVwbGFjZSgvXFxiXFx3L2csIChjaGFyKSA9PiBjaGFyLnRvVXBwZXJDYXNlKCkpO1xyXG4gIH1cclxuXHJcbiAgLyoqIENvbW1hLXNlcGFyYXRlZCBhY2NlcHRlZCBmaWxlIHR5cGVzIGZvciB0aGUgaW5wdXQgZWxlbWVudC4gKi9cclxuICBnZXQgYWNjZXB0ZWRGaWxlVHlwZXMoKTogc3RyaW5nIHtcclxuICAgIHJldHVybiB0aGlzLkFDQ0VQVEVEX0VYVEVOU0lPTlMuam9pbignLCcpO1xyXG4gIH1cclxuXHJcbiAgLyoqIFRoZSB0YXJnZXQgZ3JvdXAgaWQgZnJvbSB0aGUgZGlhbG9nIHBheWxvYWQgKGZhbGxzIGJhY2sgdG8gc2VsZWN0aW9uKS4gKi9cclxuICBwcml2YXRlIGdldCBncm91cElkKCk6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gKFxyXG4gICAgICB0aGlzLmNvbXBvbmVudERhdGE/Lmdyb3VwSWQgPz9cclxuICAgICAgKHRoaXMuZ3JvdXBTZXJ2aWNlPy5nZXRTZWxlY3RlZEdyb3VwSW5mbygpPy5ncm91cElkIGFzIHN0cmluZykgPz9cclxuICAgICAgJydcclxuICAgICk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBTZXRzIHRoZSBBUEkgYmFzZSBVUkwgb24gdGhlIGltcG9ydCBzZXJ2aWNlLlxyXG4gICAqIEBtZW1iZXJvZiBSb3N0ZXJJbXBvcnRDb21wb25lbnRcclxuICAgKi9cclxuICBuZ09uSW5pdCgpOiB2b2lkIHtcclxuICAgIHRoaXMucm9zdGVySW1wb3J0QXBpU2VydmljZS5zZXRBcGlCYXNlVXJsKHRoaXMuZ3JvdXBTZXJ2aWNlPy5hcGlCYXNlVXJsKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIENsZWFucyB1cCBzdWJzY3JpcHRpb25zIHdoZW4gdGhlIGNvbXBvbmVudCBpcyBkZXN0cm95ZWQuXHJcbiAgICogQG1lbWJlcm9mIFJvc3RlckltcG9ydENvbXBvbmVudFxyXG4gICAqL1xyXG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xyXG4gICAgdGhpcy5kZXN0cm95JC5uZXh0KHRydWUpO1xyXG4gICAgdGhpcy5kZXN0cm95JC5jb21wbGV0ZSgpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogSGFuZGxlcyBhIGZpbGUgc2VsZWN0ZWQgdmlhIHRoZSBicm93c2UgZGlhbG9nLlxyXG4gICAqIEBwYXJhbSB7RXZlbnR9IGV2ZW50IC0gVGhlIGNoYW5nZSBldmVudCBmcm9tIHRoZSBoaWRkZW4gZmlsZSBpbnB1dC5cclxuICAgKiBAbWVtYmVyb2YgUm9zdGVySW1wb3J0Q29tcG9uZW50XHJcbiAgICovXHJcbiAgb25GaWxlU2VsZWN0ZWQoZXZlbnQ6IEV2ZW50KTogdm9pZCB7XHJcbiAgICBjb25zdCBpbnB1dCA9IGV2ZW50LnRhcmdldCBhcyBIVE1MSW5wdXRFbGVtZW50O1xyXG4gICAgaWYgKCFpbnB1dC5maWxlcyB8fCBpbnB1dC5maWxlcy5sZW5ndGggPT09IDApIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgaWYgKGlucHV0LmZpbGVzLmxlbmd0aCA+IDEpIHtcclxuICAgICAgdGhpcy5zaG93U2luZ2xlRmlsZU9ubHlFcnJvcigpO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICB0aGlzLnByb2Nlc3NGaWxlKGlucHV0LmZpbGVzWzBdKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEhhbmRsZXMgYSBmaWxlIGRyb3BwZWQgb250byB0aGUgZHJvcHpvbmUuXHJcbiAgICogQHBhcmFtIHtEcmFnRXZlbnR9IGV2ZW50IC0gVGhlIGRyb3AgZXZlbnQuXHJcbiAgICogQG1lbWJlcm9mIFJvc3RlckltcG9ydENvbXBvbmVudFxyXG4gICAqL1xyXG4gIG9uRmlsZURyb3AoZXZlbnQ6IERyYWdFdmVudCk6IHZvaWQge1xyXG4gICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcclxuICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xyXG4gICAgdGhpcy5pc0RyYWdPdmVyID0gZmFsc2U7XHJcbiAgICBjb25zdCBmaWxlcyA9IGV2ZW50LmRhdGFUcmFuc2Zlcj8uZmlsZXM7XHJcbiAgICBpZiAoIWZpbGVzIHx8IGZpbGVzLmxlbmd0aCA9PT0gMCkge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICBpZiAoZmlsZXMubGVuZ3RoID4gMSkge1xyXG4gICAgICB0aGlzLnNob3dTaW5nbGVGaWxlT25seUVycm9yKCk7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIHRoaXMucHJvY2Vzc0ZpbGUoZmlsZXNbMF0pO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogSGFuZGxlcyBkcmFnLW92ZXIgb24gdGhlIGRyb3B6b25lLlxyXG4gICAqIEBwYXJhbSB7RHJhZ0V2ZW50fSBldmVudCAtIFRoZSBkcmFnb3ZlciBldmVudC5cclxuICAgKiBAbWVtYmVyb2YgUm9zdGVySW1wb3J0Q29tcG9uZW50XHJcbiAgICovXHJcbiAgb25EcmFnT3ZlcihldmVudDogRHJhZ0V2ZW50KTogdm9pZCB7XHJcbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XHJcbiAgICB0aGlzLmlzRHJhZ092ZXIgPSB0cnVlO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogSGFuZGxlcyBkcmFnLWxlYXZlIG9uIHRoZSBkcm9wem9uZS5cclxuICAgKiBAcGFyYW0ge0RyYWdFdmVudH0gZXZlbnQgLSBUaGUgZHJhZ2xlYXZlIGV2ZW50LlxyXG4gICAqIEBtZW1iZXJvZiBSb3N0ZXJJbXBvcnRDb21wb25lbnRcclxuICAgKi9cclxuICBvbkRyYWdMZWF2ZShldmVudDogRHJhZ0V2ZW50KTogdm9pZCB7XHJcbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XHJcbiAgICB0aGlzLmlzRHJhZ092ZXIgPSBmYWxzZTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFZhbGlkYXRlcyB0aGUgZmlsZSB0eXBlIGFuZCBzaXplLCB0aGVuIGVpdGhlciBzZXRzIGl0IG9yIHNob3dzIGFuIGVycm9yLlxyXG4gICAqIEBwYXJhbSB7RmlsZX0gZmlsZSAtIFRoZSBjYW5kaWRhdGUgZmlsZS5cclxuICAgKiBAbWVtYmVyb2YgUm9zdGVySW1wb3J0Q29tcG9uZW50XHJcbiAgICovXHJcbiAgcHJvY2Vzc0ZpbGUoZmlsZTogRmlsZSk6IHZvaWQge1xyXG4gICAgdGhpcy5lcnJvck1lc3NhZ2UgPSBudWxsO1xyXG4gICAgdGhpcy5ub0RhdGFNZXNzYWdlID0gbnVsbDtcclxuICAgIHRoaXMudXBsb2FkUmVzdWx0ID0gbnVsbDtcclxuICAgIHRoaXMuaW1wb3J0SWQgPSBudWxsO1xyXG4gICAgLy8gQ2xlYXIgYW55IHByZXZpb3VzbHkgc2VsZWN0ZWQgKHZhbGlkKSBmaWxlIHNvIGFuIGludmFsaWQgbmV3IHNlbGVjdGlvblxyXG4gICAgLy8gY2FuJ3QgbGVhdmUgdGhlIEltcG9ydCBidXR0b24gZW5hYmxlZCBmb3IgYSBzdGFsZSBmaWxlLlxyXG4gICAgdGhpcy5zZWxlY3RlZEZpbGUgPSBudWxsO1xyXG5cclxuICAgIGNvbnN0IGZpbGVOYW1lID0gZmlsZS5uYW1lLnRvTG93ZXJDYXNlKCk7XHJcbiAgICBjb25zdCBpc1ZhbGlkRXh0ZW5zaW9uID0gdGhpcy5BQ0NFUFRFRF9FWFRFTlNJT05TLnNvbWUoKGV4dCkgPT5cclxuICAgICAgZmlsZU5hbWUuZW5kc1dpdGgoZXh0KVxyXG4gICAgKTtcclxuICAgIGlmICghaXNWYWxpZEV4dGVuc2lvbikge1xyXG4gICAgICB0aGlzLmVycm9yTWVzc2FnZSA9XHJcbiAgICAgICAgdGhpcy5zY3JlZW5UZXh0cz8udmFsaWRhdGlvbj8udW5zdXBwb3J0ZWRUeXBlID8/XHJcbiAgICAgICAgJ0luY29ycmVjdCBmaWxlIHR5cGUuIFBsZWFzZSB1cGxvYWQgYSB2YWxpZCAuY3N2IG9yIC54bHN4IGZpbGUuJztcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIGlmIChmaWxlLnNpemUgPT09IDApIHtcclxuICAgICAgdGhpcy5lcnJvck1lc3NhZ2UgPVxyXG4gICAgICAgIHRoaXMuc2NyZWVuVGV4dHM/LnZhbGlkYXRpb24/LmVtcHR5RmlsZSA/P1xyXG4gICAgICAgICdUaGUgc2VsZWN0ZWQgZmlsZSBpcyBlbXB0eS4gUGxlYXNlIHVwbG9hZCBhIGZpbGUgd2l0aCByb3N0ZXIgcmVjb3Jkcy4nO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKGZpbGUuc2l6ZSA+IHRoaXMuTUFYX0ZJTEVfU0laRSkge1xyXG4gICAgICB0aGlzLmVycm9yTWVzc2FnZSA9XHJcbiAgICAgICAgdGhpcy5zY3JlZW5UZXh0cz8udmFsaWRhdGlvbj8uZmlsZVRvb0xhcmdlID8/XHJcbiAgICAgICAgJ0ZpbGUgc2l6ZSBleGNlZWRzIHRoZSBtYXhpbXVtIGFsbG93ZWQgc2l6ZSBvZiAxME1CLic7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLnNlbGVjdGVkRmlsZSA9IGZpbGU7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBTaG93cyB0aGUgc2luZ2xlLWZpbGUtb25seSB2YWxpZGF0aW9uIG1lc3NhZ2UuXHJcbiAgICogQG1lbWJlcm9mIFJvc3RlckltcG9ydENvbXBvbmVudFxyXG4gICAqL1xyXG4gIHNob3dTaW5nbGVGaWxlT25seUVycm9yKCk6IHZvaWQge1xyXG4gICAgdGhpcy5lcnJvck1lc3NhZ2UgPVxyXG4gICAgICB0aGlzLnNjcmVlblRleHRzPy52YWxpZGF0aW9uPy5zaW5nbGVGaWxlT25seSA/P1xyXG4gICAgICAnUGxlYXNlIHVwbG9hZCBhIHNpbmdsZSBmaWxlIGF0IGEgdGltZS4nO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogUmVtb3ZlcyB0aGUgY3VycmVudGx5IHNlbGVjdGVkIGZpbGUgYW5kIHJlc2V0cyB0byB0aGUgdXBsb2FkIHN0YXRlLlxyXG4gICAqIEBtZW1iZXJvZiBSb3N0ZXJJbXBvcnRDb21wb25lbnRcclxuICAgKi9cclxuICBvblJlbW92ZUZpbGUoKTogdm9pZCB7XHJcbiAgICB0aGlzLnNlbGVjdGVkRmlsZSA9IG51bGw7XHJcbiAgICB0aGlzLmVycm9yTWVzc2FnZSA9IG51bGw7XHJcbiAgICB0aGlzLm5vRGF0YU1lc3NhZ2UgPSBudWxsO1xyXG4gICAgdGhpcy51cGxvYWRSZXN1bHQgPSBudWxsO1xyXG4gICAgdGhpcy5pbXBvcnRJZCA9IG51bGw7XHJcbiAgICB0aGlzLmltcG9ydFN0YXRlID0gJ3VwbG9hZCc7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBSdW5zIHRoZSByZWFsIGltcG9ydDogdXBsb2FkIOKGkiB2YWxpZGF0ZSDihpIgY29uZmlybS4gVGhlIHByb2dyZXNzIGJhciBpc1xyXG4gICAqIHNob3duIGluIGluZGV0ZXJtaW5hdGUgbW9kZSB3aGlsZSB0aGUgY2hhaW4gaXMgaW4gZmxpZ2h0LCB0aGVuIHRoZVxyXG4gICAqIGNvbmZpcm1lZCBqb2IncyB0ZXJtaW5hbCBjb3VudHMgKyBwZXItcm93IGVycm9ycyBkcml2ZSB0aGUgcmVzdWx0IHNjcmVlbi5cclxuICAgKiBAbWVtYmVyb2YgUm9zdGVySW1wb3J0Q29tcG9uZW50XHJcbiAgICovXHJcbiAgb25JbXBvcnQoKTogdm9pZCB7XHJcbiAgICBpZiAoIXRoaXMuc2VsZWN0ZWRGaWxlKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIGlmICghdGhpcy5ncm91cElkKSB7XHJcbiAgICAgIHRoaXMuZXJyb3JNZXNzYWdlID1cclxuICAgICAgICB0aGlzLnNjcmVlblRleHRzPy52YWxpZGF0aW9uPy51cGxvYWRGYWlsZWQgPz9cclxuICAgICAgICAnQW4gZXJyb3Igb2NjdXJyZWQgd2hpbGUgaW1wb3J0aW5nIHRoZSByb3N0ZXIuIFBsZWFzZSB0cnkgYWdhaW4uJztcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgdGhpcy5lcnJvck1lc3NhZ2UgPSBudWxsO1xyXG4gICAgdGhpcy5ub0RhdGFNZXNzYWdlID0gbnVsbDtcclxuICAgIHRoaXMudXBsb2FkUmVzdWx0ID0gbnVsbDtcclxuICAgIHRoaXMuam9iRXJyb3JzID0gW107XHJcbiAgICB0aGlzLmltcG9ydElkID0gbnVsbDtcclxuICAgIHRoaXMuaW1wb3J0U3RhdGUgPSAncHJvY2Vzc2luZyc7XHJcblxyXG4gICAgdGhpcy5yb3N0ZXJJbXBvcnRBcGlTZXJ2aWNlXHJcbiAgICAgIC51cGxvYWRJbXBvcnRGaWxlKHRoaXMuc2VsZWN0ZWRGaWxlLCB0aGlzLmdyb3VwSWQpXHJcbiAgICAgIC5waXBlKFxyXG4gICAgICAgIHN3aXRjaE1hcCgoam9iOiBSb3N0ZXJJbXBvcnRKb2IpID0+IHtcclxuICAgICAgICAgIHRoaXMuaW1wb3J0SWQgPSBqb2I/LmltcG9ydElkID8/IG51bGw7XHJcbiAgICAgICAgICByZXR1cm4gdGhpcy5yb3N0ZXJJbXBvcnRBcGlTZXJ2aWNlLnZhbGlkYXRlSW1wb3J0Sm9iKFxyXG4gICAgICAgICAgICB0aGlzLmltcG9ydElkIGFzIHN0cmluZ1xyXG4gICAgICAgICAgKTtcclxuICAgICAgICB9KSxcclxuICAgICAgICBzd2l0Y2hNYXAoKCkgPT5cclxuICAgICAgICAgIHRoaXMucm9zdGVySW1wb3J0QXBpU2VydmljZS5jb25maXJtSW1wb3J0Sm9iKHRoaXMuaW1wb3J0SWQgYXMgc3RyaW5nKVxyXG4gICAgICAgICksXHJcbiAgICAgICAgdGFrZVVudGlsKHRoaXMuZGVzdHJveSQpXHJcbiAgICAgIClcclxuICAgICAgLnN1YnNjcmliZSh7XHJcbiAgICAgICAgbmV4dDogKGNvbmZpcm1lZEpvYjogUm9zdGVySW1wb3J0Sm9iKSA9PiB7XHJcbiAgICAgICAgICB0aGlzLmZpbmFsaXplUmVzdWx0KGNvbmZpcm1lZEpvYik7XHJcbiAgICAgICAgfSxcclxuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxyXG4gICAgICAgIGVycm9yOiAoZXJyb3I6IGFueSkgPT4ge1xyXG4gICAgICAgICAgdGhpcy5oYW5kbGVJbXBvcnRFcnJvcihlcnJvcik7XHJcbiAgICAgICAgfSxcclxuICAgICAgfSk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBNYXBzIGEgZmFpbGVkIGltcG9ydCBjYWxsIHRvIGFuIGlubGluZSBlcnJvciBtZXNzYWdlIGFuZCByZXR1cm5zIHRoZSBVSSB0b1xyXG4gICAqIHRoZSB1cGxvYWQgc3RhdGUgc28gdGhlIHVzZXIgY2FuIHJldHJ5LiBLbm93biBCRSBlcnJvciBjb2RlcyAoMTA3MuKAkzEwNzUpXHJcbiAgICogYXJlIG1hcHBlZCB2aWEgY29uc3RhbnRzOyBhbnl0aGluZyBlbHNlIHVzZXMgdGhlIGdlbmVyaWMgbWVzc2FnZS5cclxuICAgKiBAcGFyYW0geyp9IGVycm9yIC0gVGhlIEh0dHBFcnJvclJlc3BvbnNlLlxyXG4gICAqIEBtZW1iZXJvZiBSb3N0ZXJJbXBvcnRDb21wb25lbnRcclxuICAgKi9cclxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxyXG4gIHByaXZhdGUgaGFuZGxlSW1wb3J0RXJyb3IoZXJyb3I6IGFueSk6IHZvaWQge1xyXG4gICAgdGhpcy5pbXBvcnRTdGF0ZSA9ICd1cGxvYWQnO1xyXG5cclxuICAgIC8vIEJFIGVycm9yIGNvZGVzIHRha2UgcHJpb3JpdHkgd2hlbiBwcmVzZW50IChlLmcuIDEwNzEgbm8gcGVybWlzc2lvbiwgMTA3MlxyXG4gICAgLy8gZm9ybWF0LCAxMDczIHRvbyBsYXJnZSwgMTA3NCByb3cgbGltaXQsIDEwNzUgaW52YWxpZCBzdGF0dXMpLlxyXG4gICAgY29uc3QgZXJyb3JDb2Rlczogc3RyaW5nW10gfCB1bmRlZmluZWQgPSBlcnJvcj8uZXJyb3I/LmJvZHk/LmVycm9yQ29kZXM7XHJcbiAgICBpZiAoQXJyYXkuaXNBcnJheShlcnJvckNvZGVzKSAmJiBlcnJvckNvZGVzLmxlbmd0aCkge1xyXG4gICAgICBjb25zdCBjb2RlID0gZXJyb3JDb2Rlc1swXSBhcyBrZXlvZiB0eXBlb2YgdGhpcy5jb25zdGFudHMuZXJyb3JzO1xyXG4gICAgICB0aGlzLmVycm9yTWVzc2FnZSA9XHJcbiAgICAgICAgdGhpcy5jb25zdGFudHM/LmVycm9ycz8uW2NvZGVdID8/XHJcbiAgICAgICAgdGhpcy5zY3JlZW5UZXh0cz8udmFsaWRhdGlvbj8udXBsb2FkRmFpbGVkID8/XHJcbiAgICAgICAgJ0FuIGVycm9yIG9jY3VycmVkIHdoaWxlIGltcG9ydGluZyB0aGUgcm9zdGVyLiBQbGVhc2UgdHJ5IGFnYWluLic7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICAvLyBBIDQwMyB3aXRoIG5vIGVycm9yLWNvZGUgYm9keSBjb21lcyBmcm9tIHRoZSBlbmRwb2ludCdzIEBQcmVBdXRob3JpemVcclxuICAgIC8vICh0aGUgdXNlciBsYWNrcyBNYW5hZ2UgR3JvdXAgTWVtYmVyIC8gTWFuYWdlIEFsbCBSb3N0ZXJzIGZvciB0aGlzIGdyb3VwKS5cclxuICAgIC8vIFNob3cgdGhlIHBlcm1pc3Npb24gbWVzc2FnZSDigJQgcmV0cnlpbmcgd2lsbCBub3QgaGVscC5cclxuICAgIGNvbnN0IHN0YXR1cyA9IGVycm9yPy5zdGF0dXMgPz8gZXJyb3I/LmVycm9yPy5zdGF0dXM7XHJcbiAgICBpZiAoc3RhdHVzID09PSA0MDMpIHtcclxuICAgICAgdGhpcy5lcnJvck1lc3NhZ2UgPVxyXG4gICAgICAgIHRoaXMuc2NyZWVuVGV4dHM/LnZhbGlkYXRpb24/LmZvcmJpZGRlbiA/P1xyXG4gICAgICAgICdZb3UgZG8gbm90IGhhdmUgcGVybWlzc2lvbiB0byBpbXBvcnQgYSByb3N0ZXIgZm9yIHRoaXMgZ3JvdXAuJztcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuZXJyb3JNZXNzYWdlID1cclxuICAgICAgdGhpcy5zY3JlZW5UZXh0cz8udmFsaWRhdGlvbj8udXBsb2FkRmFpbGVkID8/XHJcbiAgICAgICdBbiBlcnJvciBvY2N1cnJlZCB3aGlsZSBpbXBvcnRpbmcgdGhlIHJvc3Rlci4gUGxlYXNlIHRyeSBhZ2Fpbi4nO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogU3RvcmVzIHRoZSB0ZXJtaW5hbCByZXN1bHQgYW5kIG1vdmVzIHRvIHRoZSByZXN1bHQgc3RhdGUuIFdoZW4gdGhlIGpvYiBoYWRcclxuICAgKiBubyBkYXRhIHJvd3MsIHNob3dzIHRoZSBcIm5vIHJvc3RlciBkYXRhXCIgaW5mbyBiYW5uZXIgaW5zdGVhZCBvZiB0aGUgc3VtbWFyeVxyXG4gICAqIGNhcmRzLlxyXG4gICAqIEBwYXJhbSB7Um9zdGVySW1wb3J0Sm9ifSBqb2IgLSBUaGUgY29uZmlybWVkIGltcG9ydCBqb2IuXHJcbiAgICogQG1lbWJlcm9mIFJvc3RlckltcG9ydENvbXBvbmVudFxyXG4gICAqL1xyXG4gIGZpbmFsaXplUmVzdWx0KGpvYjogUm9zdGVySW1wb3J0Sm9iKTogdm9pZCB7XHJcbiAgICBjb25zdCB0b3RhbFJlY29yZHMgPSBqb2I/LnRvdGFsUm93cyA/PyAwO1xyXG4gICAgY29uc3Qgc3VjY2Vzc0NvdW50ID0gam9iPy5zdWNjZXNzUm93cyA/PyAwO1xyXG4gICAgY29uc3QgZmFpbHVyZUNvdW50ID0gam9iPy5mYWlsZWRSb3dzID8/IDA7XHJcblxyXG4gICAgdGhpcy51cGxvYWRSZXN1bHQgPSB7IHRvdGFsUmVjb3Jkcywgc3VjY2Vzc0NvdW50LCBmYWlsdXJlQ291bnQgfTtcclxuICAgIHRoaXMuam9iRXJyb3JzID0gdGhpcy5wYXJzZUVycm9yUmVwb3J0KGpvYj8uZXJyb3JSZXBvcnQpO1xyXG4gICAgdGhpcy5pbXBvcnRTdGF0ZSA9ICdyZXN1bHQnO1xyXG5cclxuICAgIGlmICh0b3RhbFJlY29yZHMgPT09IDApIHtcclxuICAgICAgdGhpcy5ub0RhdGFNZXNzYWdlID1cclxuICAgICAgICB0aGlzLnNjcmVlblRleHRzPy52YWxpZGF0aW9uPy5ub0RhdGFSZWNvcmRzID8/XHJcbiAgICAgICAgJ05vIHJvc3RlciBkYXRhIGZvdW5kLiBUaGUgc2VsZWN0ZWQgZmlsZSBjb250YWlucyBoZWFkZXJzIGJ1dCBubyByb3N0ZXIgcmVjb3Jkcy4nO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogTm9ybWFsaXplcyB0aGUgQkUgYGVycm9yX3JlcG9ydGAgaW50byByb3ctZXJyb3IgdmlldyBtb2RlbHMuXHJcbiAgICpcclxuICAgKiBUaGUgQkUgd3JhcHMgdGhlIHBlci1yb3cgZW50cmllcyBpbiBhIGB7IHJvd3M6IFsgeyByb3csIGZpZWxkLCBtZXNzYWdlIH0gXSB9YFxyXG4gICAqIGRvY3VtZW50LCBidXQgdGhhdCB2YWx1ZSBoYXMgYmVlbiBvYnNlcnZlZCB0byBhcnJpdmUgaW4gTVVMVElQTEUgc2hhcGVzOlxyXG4gICAqICAtIGEgcGFyc2VkIG9iamVjdCBgeyByb3dzOiBbLi4uXSB9YCAoY29uZmlybSByZXNwb25zZSDigJQgdGhlIGNvbW1vbiBjYXNlKSxcclxuICAgKiAgLSBhIHJhdyBKU09OIHN0cmluZyBvZiB0aGUgc2FtZSBvYmplY3QgKEpTT05CIHBhc3N0aHJvdWdoKSwgb3JcclxuICAgKiAgLSBhIGJhcmUgYXJyYXkgYFsgeyByb3csIGZpZWxkLCBtZXNzYWdlIH0gXWAuXHJcbiAgICogVGhpcyBoYW5kbGVzIGFsbCB0aHJlZSAoYW5kIGBudWxsYCkgc28gdGhlIGVycm9yIGxvZyByZW5kZXJzIHJlZ2FyZGxlc3Mgb2ZcclxuICAgKiBob3cgdGhlIGZpZWxkIGlzIHNlcmlhbGl6ZWQuXHJcbiAgICogQHBhcmFtIHsqfSBlcnJvclJlcG9ydCAtIFRoZSBCRSBlcnJvcl9yZXBvcnQgKG9iamVjdCwgc3RyaW5nLCBhcnJheSwgb3IgbnVsbCkuXHJcbiAgICogQHJldHVybiB7Um9zdGVySW1wb3J0Um93RXJyb3JbXX1cclxuICAgKiBAbWVtYmVyb2YgUm9zdGVySW1wb3J0Q29tcG9uZW50XHJcbiAgICovXHJcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcclxuICBwcml2YXRlIHBhcnNlRXJyb3JSZXBvcnQoZXJyb3JSZXBvcnQ/OiBhbnkpOiBSb3N0ZXJJbXBvcnRSb3dFcnJvcltdIHtcclxuICAgIGlmICghZXJyb3JSZXBvcnQpIHtcclxuICAgICAgcmV0dXJuIFtdO1xyXG4gICAgfVxyXG4gICAgLy8gSWYgaXQncyBhIHN0cmluZywgcGFyc2UgaXQgZmlyc3Q7IG9uIHBhcnNlIGZhaWx1cmUsIG5vIHJvdyBlcnJvcnMuXHJcbiAgICBsZXQgdmFsdWU6IHVua25vd24gPSBlcnJvclJlcG9ydDtcclxuICAgIGlmICh0eXBlb2YgZXJyb3JSZXBvcnQgPT09ICdzdHJpbmcnKSB7XHJcbiAgICAgIHRyeSB7XHJcbiAgICAgICAgdmFsdWUgPSBKU09OLnBhcnNlKGVycm9yUmVwb3J0KTtcclxuICAgICAgfSBjYXRjaCB7XHJcbiAgICAgICAgcmV0dXJuIFtdO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICAvLyBBY2NlcHQgZWl0aGVyIGEgYmFyZSBhcnJheSBvciBhIHsgcm93czogWy4uLl0gfSB3cmFwcGVyIG9iamVjdC5cclxuICAgIGNvbnN0IGVudHJpZXM6IFJvc3RlckltcG9ydEVycm9yUmVwb3J0W10gPSBBcnJheS5pc0FycmF5KHZhbHVlKVxyXG4gICAgICA/ICh2YWx1ZSBhcyBSb3N0ZXJJbXBvcnRFcnJvclJlcG9ydFtdKVxyXG4gICAgICA6ICgodmFsdWUgYXMgeyByb3dzPzogUm9zdGVySW1wb3J0RXJyb3JSZXBvcnRbXSB9KT8ucm93cyA/PyBbXSk7XHJcbiAgICByZXR1cm4gZW50cmllcy5tYXAoKGVudHJ5KSA9PiAoe1xyXG4gICAgICByb3dOdW1iZXI6IGVudHJ5Py5yb3csXHJcbiAgICAgIGZpZWxkOiBlbnRyeT8uZmllbGQsXHJcbiAgICAgIGVycm9yTWVzc2FnZTogZW50cnk/Lm1lc3NhZ2UsXHJcbiAgICB9KSk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBXaGV0aGVyIHRoZSByZXN1bHQgc3RhdGUgc2hvdWxkIHNob3cgdGhlIHN1bW1hcnkgY2FyZHMgKGFkZGVkIC8gc2tpcHBlZCkuXHJcbiAgICogSGlkZGVuIGZvciB0aGUgXCJubyBkYXRhIHJlY29yZHNcIiBjYXNlLlxyXG4gICAqIEByZXR1cm4ge2Jvb2xlYW59XHJcbiAgICogQG1lbWJlcm9mIFJvc3RlckltcG9ydENvbXBvbmVudFxyXG4gICAqL1xyXG4gIGdldCBzaG93U3VtbWFyeUNhcmRzKCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuICEhdGhpcy51cGxvYWRSZXN1bHQgJiYgdGhpcy51cGxvYWRSZXN1bHQudG90YWxSZWNvcmRzID4gMDtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFdoZXRoZXIgZXZlcnkgcHJvY2Vzc2VkIHJvdyB3YXMgc2tpcHBlZCAoZHJpdmVzIHRoZSBcIkFsbCBSb3dzIGFyZSBza2lwcGVkXCJcclxuICAgKiBoZWFkZXIgb24gdGhlIGVycm9ycyBjYXJkKS5cclxuICAgKiBAcmV0dXJuIHtib29sZWFufVxyXG4gICAqIEBtZW1iZXJvZiBSb3N0ZXJJbXBvcnRDb21wb25lbnRcclxuICAgKi9cclxuICBnZXQgYWxsUm93c1NraXBwZWQoKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gKFxyXG4gICAgICAhIXRoaXMudXBsb2FkUmVzdWx0ICYmXHJcbiAgICAgIHRoaXMudXBsb2FkUmVzdWx0LnRvdGFsUmVjb3JkcyA+IDAgJiZcclxuICAgICAgdGhpcy51cGxvYWRSZXN1bHQuc3VjY2Vzc0NvdW50ID09PSAwXHJcbiAgICApO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQnVpbGRzIGEgY2xpZW50LXNpZGUgQ1NWIHNhbXBsZSBmaWxlIGZyb20gdGhlIHJlcXVpcmVkIGNvbHVtbnMgYW5kIHRyaWdnZXJzXHJcbiAgICogYSBicm93c2VyIGRvd25sb2FkLiAoQ2xpZW50LXNpZGUgZ2VuZXJhdGlvbiB1bnRpbCB0aGUgdGVtcGxhdGUgQVBJIGV4aXN0cy4pXHJcbiAgICogQG1lbWJlcm9mIFJvc3RlckltcG9ydENvbXBvbmVudFxyXG4gICAqL1xyXG4gIGRvd25sb2FkU2FtcGxlRmlsZSgpOiB2b2lkIHtcclxuICAgIGNvbnN0IGhlYWRlckxpbmUgPSB0aGlzLnJlcXVpcmVkQ29sdW1uc1xyXG4gICAgICAubWFwKChjb2wpID0+IHRoaXMudG9Dc3ZDZWxsKGNvbCkpXHJcbiAgICAgIC5qb2luKCcsJyk7XHJcblxyXG4gICAgLy8gU2FtcGxlIGRhdGEgcm93cyBzbyB0aGUgZG93bmxvYWRlZCBmaWxlIHNob3dzIHRoZSBleHBlY3RlZCBmb3JtYXQsIG5vdFxyXG4gICAgLy8ganVzdCB0aGUgY29sdW1uIGhlYWRlcnMuIFRoZSBiYXNlIHJvdyB2YWx1ZXMgY29tZSBmcm9tIGNvbnN0YW50czsgc2FtcGxlXHJcbiAgICAvLyB2YWx1ZXMgZm9yIGFueSB0ZW5hbnQtY29uZmlndXJlZCBjb2x1bW5zIGFyZSBhcHBlbmRlZCAoZnJvbSB0aGUgU0FNRVxyXG4gICAgLy8gc291cmNlIHRoYXQgYnVpbGRzIHRoZSBoZWFkZXJzKSBzbyBldmVyeSByb3cgbGluZXMgdXAgd2l0aCB0aGVcclxuICAgIC8vIChiYXNlICsgdGVuYW50KSBoZWFkZXIgc2V0LlxyXG4gICAgY29uc3QgYmFzZTogc3RyaW5nW10gPSB0aGlzLnNjcmVlblRleHRzPy5yZXF1aXJlZENvbHVtbnMgPz8gW107XHJcbiAgICBjb25zdCBiYXNlU2FtcGxlUm93czogc3RyaW5nW11bXSA9IHRoaXMuc2NyZWVuVGV4dHM/LnNhbXBsZVJvd3MgPz8gW107XHJcbiAgICBjb25zdCB0ZW5hbnRTYW1wbGVDZWxscyA9IHRoaXMudGVuYW50RXh0cmFDb2x1bW5zKGJhc2UpLm1hcChcclxuICAgICAgKGNvbCkgPT4gY29sLnNhbXBsZVZhbHVlXHJcbiAgICApO1xyXG4gICAgY29uc3QgZGF0YUxpbmVzID0gYmFzZVNhbXBsZVJvd3MubWFwKChyb3cpID0+XHJcbiAgICAgIFsuLi5yb3csIC4uLnRlbmFudFNhbXBsZUNlbGxzXVxyXG4gICAgICAgIC5tYXAoKGNlbGwpID0+IHRoaXMudG9Dc3ZDZWxsKGNlbGwpKVxyXG4gICAgICAgIC5qb2luKCcsJylcclxuICAgICk7XHJcblxyXG4gICAgY29uc3QgY3N2Q29udGVudCA9IFtoZWFkZXJMaW5lLCAuLi5kYXRhTGluZXNdLmpvaW4oJ1xcclxcbicpICsgJ1xcclxcbic7XHJcbiAgICBjb25zdCBibG9iID0gbmV3IEJsb2IoW2NzdkNvbnRlbnRdLCB7XHJcbiAgICAgIHR5cGU6ICd0ZXh0L2NzdjtjaGFyc2V0PXV0Zi04OycsXHJcbiAgICB9KTtcclxuICAgIGNvbnN0IGZpbGVOYW1lID0gdGhpcy5zY3JlZW5UZXh0cz8uc2FtcGxlRmlsZU5hbWUgPz8gJ1Jvc3Rlcl9TYW1wbGUuY3N2JztcclxuICAgIHRoaXMudHJpZ2dlckRvd25sb2FkKGJsb2IsIGZpbGVOYW1lKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEJ1aWxkcyBhIENTViBmcm9tIHRoZSByb3ctbGV2ZWwgZXJyb3JzIGFuZCB0cmlnZ2VycyBhIGJyb3dzZXIgZG93bmxvYWQgc29cclxuICAgKiB0aGUgdXNlciBjYW4gY29ycmVjdCBhbmQgcmUtdXBsb2FkLlxyXG4gICAqIEBtZW1iZXJvZiBSb3N0ZXJJbXBvcnRDb21wb25lbnRcclxuICAgKi9cclxuICBkb3dubG9hZEVycm9yTG9nKCk6IHZvaWQge1xyXG4gICAgaWYgKCF0aGlzLmpvYkVycm9ycy5sZW5ndGgpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgY29uc3QgaGVhZGVyczogc3RyaW5nW10gPSB0aGlzLnNjcmVlblRleHRzPy5lcnJvckxvZz8uaGVhZGVycyA/PyBbXHJcbiAgICAgICdSb3cnLFxyXG4gICAgICAnRmllbGQnLFxyXG4gICAgICAnRXJyb3InLFxyXG4gICAgXTtcclxuICAgIGNvbnN0IHJvd3MgPSB0aGlzLmpvYkVycm9ycy5tYXAoKHJvd0VycikgPT5cclxuICAgICAgW3Jvd0Vyci5yb3dOdW1iZXIsIHJvd0Vyci5maWVsZCwgcm93RXJyLmVycm9yTWVzc2FnZV1cclxuICAgICAgICAubWFwKCh2YWx1ZSkgPT4gdGhpcy50b0NzdkNlbGwodmFsdWUpKVxyXG4gICAgICAgIC5qb2luKCcsJylcclxuICAgICk7XHJcbiAgICBjb25zdCBjc3ZDb250ZW50ID0gW1xyXG4gICAgICBoZWFkZXJzLm1hcCgoaGVhZGVyKSA9PiB0aGlzLnRvQ3N2Q2VsbChoZWFkZXIpKS5qb2luKCcsJyksXHJcbiAgICAgIC4uLnJvd3MsXHJcbiAgICBdLmpvaW4oJ1xcclxcbicpO1xyXG4gICAgY29uc3QgZmlsZU5hbWUgPVxyXG4gICAgICB0aGlzLnNjcmVlblRleHRzPy5lcnJvckxvZz8uZmlsZU5hbWUgPz8gJ1Jvc3Rlcl9JbXBvcnRfRXJyb3JfTG9nLmNzdic7XHJcbiAgICBjb25zdCBibG9iID0gbmV3IEJsb2IoW2NzdkNvbnRlbnRdLCB7IHR5cGU6ICd0ZXh0L2NzdjtjaGFyc2V0PXV0Zi04OycgfSk7XHJcbiAgICB0aGlzLnRyaWdnZXJEb3dubG9hZChibG9iLCBmaWxlTmFtZSk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBFc2NhcGVzIGEgdmFsdWUgZm9yIHNhZmUgaW5jbHVzaW9uIGluIGEgQ1NWIGNlbGwuXHJcbiAgICogQHBhcmFtIHsoc3RyaW5nIHwgbnVtYmVyIHwgdW5kZWZpbmVkIHwgbnVsbCl9IHZhbHVlIC0gVGhlIHJhdyBjZWxsIHZhbHVlLlxyXG4gICAqIEByZXR1cm4ge3N0cmluZ30gLSB0aGUgQ1NWLXNhZmUgY2VsbCBzdHJpbmcuXHJcbiAgICogQG1lbWJlcm9mIFJvc3RlckltcG9ydENvbXBvbmVudFxyXG4gICAqL1xyXG4gIHRvQ3N2Q2VsbCh2YWx1ZTogc3RyaW5nIHwgbnVtYmVyIHwgdW5kZWZpbmVkIHwgbnVsbCk6IHN0cmluZyB7XHJcbiAgICBjb25zdCByYXcgPSB2YWx1ZSA9PT0gdW5kZWZpbmVkIHx8IHZhbHVlID09PSBudWxsID8gJycgOiBTdHJpbmcodmFsdWUpO1xyXG4gICAgaWYgKC9bXCIsXFxyXFxuXS8udGVzdChyYXcpKSB7XHJcbiAgICAgIHJldHVybiBgXCIke3Jhdy5yZXBsYWNlKC9cIi9nLCAnXCJcIicpfVwiYDtcclxuICAgIH1cclxuICAgIHJldHVybiByYXc7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBDbG9zZXMgdGhlIGRpYWxvZy4gRW1pdHMgc3VibWl0Rm9ybVJlc3BvbnNlIHdoZW4gYXQgbGVhc3Qgb25lIHJvdyB3YXMgYWRkZWRcclxuICAgKiBzbyB0aGUgcGFyZW50IHJlZnJlc2hlczsgb3RoZXJ3aXNlIGVtaXRzIGZvcm1DYW5jZWwuXHJcbiAgICogQG1lbWJlcm9mIFJvc3RlckltcG9ydENvbXBvbmVudFxyXG4gICAqL1xyXG4gIG9uQ2FuY2VsKCk6IHZvaWQge1xyXG4gICAgaWYgKHRoaXMudXBsb2FkUmVzdWx0ICYmIHRoaXMudXBsb2FkUmVzdWx0LnN1Y2Nlc3NDb3VudCA+IDApIHtcclxuICAgICAgdGhpcy5zdWJtaXRGb3JtUmVzcG9uc2UuZW1pdCh0aGlzLnVwbG9hZFJlc3VsdCk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLmZvcm1DYW5jZWwuZW1pdCgpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogVHJpZ2dlcnMgYSBicm93c2VyIGRvd25sb2FkIGZvciBhIGdlbmVyYXRlZCBibG9iLlxyXG4gICAqIEBwYXJhbSB7QmxvYn0gYmxvYiAtIFRoZSBmaWxlIGNvbnRlbnQuXHJcbiAgICogQHBhcmFtIHtzdHJpbmd9IGZpbGVOYW1lIC0gVGhlIHN1Z2dlc3RlZCBmaWxlbmFtZS5cclxuICAgKiBAbWVtYmVyb2YgUm9zdGVySW1wb3J0Q29tcG9uZW50XHJcbiAgICovXHJcbiAgcHJpdmF0ZSB0cmlnZ2VyRG93bmxvYWQoYmxvYjogQmxvYiwgZmlsZU5hbWU6IHN0cmluZyk6IHZvaWQge1xyXG4gICAgY29uc3QgdXJsID0gVVJMLmNyZWF0ZU9iamVjdFVSTChibG9iKTtcclxuICAgIGNvbnN0IGxpbmsgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdhJyk7XHJcbiAgICBsaW5rLmhyZWYgPSB1cmw7XHJcbiAgICBsaW5rLmRvd25sb2FkID0gZmlsZU5hbWU7XHJcbiAgICBsaW5rLmNsaWNrKCk7XHJcbiAgICBVUkwucmV2b2tlT2JqZWN0VVJMKHVybCk7XHJcbiAgfVxyXG59XHJcbiIsIjxkaXYgY2xhc3M9XCJpZWVlc2Etcm9zdGVyLWltcG9ydFwiPlxyXG4gIDwhLS0gU3ViLWhlYWRpbmcgYmFuZDogXCJCdWxrIEltcG9ydCBQYXJ0aWNpcGFudHNcIiBvbiB0aGUgbGVmdCwgSW1wb3J0IFJvc3RlclxyXG4gICAgICAgYWN0aW9uIG9uIHRoZSByaWdodCAoYXBwZWFycyBvbmNlIGEgZmlsZSBpcyBzZWxlY3RlZCkg4oCUIG1hdGNoZXMgdGhlIEZpZ21hLlxyXG4gICAgICAgVGhlIFwi4oaQIEJhY2sgdG8gUm9zdGVycyAvIEltcG9ydCBSb3N0ZXJcIiB0aXRsZSByb3cgKyBYIGFyZSByZW5kZXJlZCBieSB0aGVcclxuICAgICAgIHNoYXJlZCBNb2RhbENvbXBvbmVudCBhYm92ZSB0aGlzLiAtLT5cclxuICA8ZGl2IGNsYXNzPVwiaWVlZXNhLXJvc3Rlci1pbXBvcnRfX3N1YmhlYWRlclwiPlxyXG4gICAgPHNwYW4gY2xhc3M9XCJpZWVlc2Etcm9zdGVyLWltcG9ydF9fc3ViaGVhZGVyLXRpdGxlXCI+XHJcbiAgICAgIHt7IHNjcmVlblRleHRzPy5zdWJIZWFkaW5nID8/ICdCdWxrIEltcG9ydCBQYXJ0aWNpcGFudHMnIH19XHJcbiAgICA8L3NwYW4+XHJcbiAgICA8YnV0dG9uXHJcbiAgICAgICpuZ0lmPVwic2VsZWN0ZWRGaWxlXCJcclxuICAgICAgbWF0LWJ1dHRvblxyXG4gICAgICB0eXBlPVwiYnV0dG9uXCJcclxuICAgICAgY2xhc3M9XCJtYXQtdGVydGlhcnktYnV0dG9uIGllZWVzYS1yb3N0ZXItaW1wb3J0X19pbXBvcnQtYnRuXCJcclxuICAgICAgW2Rpc2FibGVkXT1cImltcG9ydFN0YXRlID09PSAncHJvY2Vzc2luZydcIlxyXG4gICAgICAoY2xpY2spPVwib25JbXBvcnQoKVwiXHJcbiAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwic2NyZWVuVGV4dHM/LmJ1dHRvbnM/LmltcG9ydCA/PyAnSW1wb3J0IFJvc3RlcidcIlxyXG4gICAgPlxyXG4gICAgICA8c3ZnIGNsYXNzPVwiaWVlZXNhLXJvc3Rlci1pbXBvcnRfX2ltcG9ydC1idG4taWNvblwiIHdpZHRoPVwiMTRcIiBoZWlnaHQ9XCIxNFwiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPlxyXG4gICAgICAgIDx1c2UgeGxpbms6aHJlZj1cImFzc2V0cy9pbWFnZXMvc3ByaXRlcy9zcHJpdGVzLnN2ZyNpY29uLWltcG9ydFwiPjwvdXNlPlxyXG4gICAgICA8L3N2Zz5cclxuICAgICAge3sgc2NyZWVuVGV4dHM/LmJ1dHRvbnM/LmltcG9ydCA/PyAnSW1wb3J0IFJvc3RlcicgfX1cclxuICAgIDwvYnV0dG9uPlxyXG4gIDwvZGl2PlxyXG5cclxuICA8IS0tIFJlcXVpcmVkIENvbHVtbnMgSW5mbyAtLT5cclxuICA8ZGl2IGNsYXNzPVwiaWVlZXNhLXJvc3Rlci1pbXBvcnRfX2NvbHVtbnMtY2FyZFwiPlxyXG4gICAgPGRpdiBjbGFzcz1cImllZWVzYS1yb3N0ZXItaW1wb3J0X19jb2x1bW5zLWNvbnRlbnRcIj5cclxuICAgICAgPHAgY2xhc3M9XCJpZWVlc2Etcm9zdGVyLWltcG9ydF9fY29sdW1ucy10aXRsZVwiPlxyXG4gICAgICAgIHt7IHNjcmVlblRleHRzPy5yZXF1aXJlZENvbHVtbnNUaXRsZSA/PyAnUmVxdWlyZWQgY29sdW1ucycgfX1cclxuICAgICAgPC9wPlxyXG4gICAgICA8ZGl2IGNsYXNzPVwiaWVlZXNhLXJvc3Rlci1pbXBvcnRfX2NvbHVtbnMtY2hpcHNcIj5cclxuICAgICAgICA8c3BhblxyXG4gICAgICAgICAgKm5nRm9yPVwibGV0IGNvbCBvZiByZXF1aXJlZENvbHVtbnNcIlxyXG4gICAgICAgICAgY2xhc3M9XCJpZWVlc2Etcm9zdGVyLWltcG9ydF9fY2hpcFwiXHJcbiAgICAgICAgPlxyXG4gICAgICAgICAge3sgY29sIH19XHJcbiAgICAgICAgPC9zcGFuPlxyXG4gICAgICA8L2Rpdj5cclxuICAgIDwvZGl2PlxyXG4gICAgPGRpdiBjbGFzcz1cImllZWVzYS1yb3N0ZXItaW1wb3J0X19zYW1wbGUtd3JhcHBlclwiPlxyXG4gICAgICA8YnV0dG9uXHJcbiAgICAgICAgbWF0LWJ1dHRvblxyXG4gICAgICAgIGNsYXNzPVwibWF0LXRlcnRpYXJ5LWJ1dHRvbiBpZWVlc2Etcm9zdGVyLWltcG9ydF9fZG93bmxvYWQtYnRuXCJcclxuICAgICAgICAoY2xpY2spPVwiZG93bmxvYWRTYW1wbGVGaWxlKClcIlxyXG4gICAgICAgIHR5cGU9XCJidXR0b25cIlxyXG4gICAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwic2NyZWVuVGV4dHM/LmFyaWFMYWJlbD8uZG93bmxvYWRTYW1wbGUgPz8gJ0Rvd25sb2FkIFNhbXBsZSBGaWxlJ1wiXHJcbiAgICAgID5cclxuICAgICAgICA8c3ZnXHJcbiAgICAgICAgICBjbGFzcz1cImllZWVzYS1yb3N0ZXItaW1wb3J0X19kb3dubG9hZC1idG4taWNvblwiXHJcbiAgICAgICAgICBhcmlhLWhpZGRlbj1cInRydWVcIlxyXG4gICAgICAgID5cclxuICAgICAgICAgIDx1c2UgeGxpbms6aHJlZj1cImFzc2V0cy9pbWFnZXMvc3ByaXRlcy9zcHJpdGVzLnN2ZyNpY29uLWZpbGUtZG9jXCI+PC91c2U+XHJcbiAgICAgICAgPC9zdmc+XHJcbiAgICAgICAge3sgc2NyZWVuVGV4dHM/LmRvd25sb2FkU2FtcGxlTGFiZWwgPz8gJ0Rvd25sb2FkIFNhbXBsZSBGaWxlJyB9fVxyXG4gICAgICA8L2J1dHRvbj5cclxuICAgIDwvZGl2PlxyXG4gIDwvZGl2PlxyXG5cclxuICA8cCBjbGFzcz1cImllZWVzYS1yb3N0ZXItaW1wb3J0X191cGxvYWQtbGFiZWxcIj5cclxuICAgIHt7IHNjcmVlblRleHRzPy51cGxvYWRMYWJlbCA/PyAnVXBsb2FkIHlvdXIgZmlsZScgfX1cclxuICA8L3A+XHJcblxyXG4gIDwhLS0gVXBsb2FkIFN0YXRlIC0tPlxyXG4gIDxuZy1jb250YWluZXIgKm5nSWY9XCJpbXBvcnRTdGF0ZSA9PT0gJ3VwbG9hZCdcIj5cclxuICAgIDwhLS0gSGlkZGVuIGZpbGUgaW5wdXQgLS0+XHJcbiAgICA8aW5wdXRcclxuICAgICAgI2ZpbGVJbnB1dFxyXG4gICAgICB0eXBlPVwiZmlsZVwiXHJcbiAgICAgIFthY2NlcHRdPVwiYWNjZXB0ZWRGaWxlVHlwZXNcIlxyXG4gICAgICAoY2hhbmdlKT1cIm9uRmlsZVNlbGVjdGVkKCRldmVudClcIlxyXG4gICAgICBoaWRkZW5cclxuICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCJzY3JlZW5UZXh0cz8udXBsb2FkTGFiZWwgPz8gJ1VwbG9hZCB5b3VyIGZpbGUnXCJcclxuICAgIC8+XHJcblxyXG4gICAgPCEtLSBEcmFnICYgRHJvcCBab25lIC0tPlxyXG4gICAgPGRpdlxyXG4gICAgICBjbGFzcz1cImllZWVzYS1yb3N0ZXItaW1wb3J0X19kcm9wem9uZVwiXHJcbiAgICAgIFtjbGFzcy5pZWVlc2Etcm9zdGVyLWltcG9ydF9fZHJvcHpvbmUtLWFjdGl2ZV09XCJpc0RyYWdPdmVyXCJcclxuICAgICAgKGRyYWdvdmVyKT1cIm9uRHJhZ092ZXIoJGV2ZW50KVwiXHJcbiAgICAgIChkcmFnbGVhdmUpPVwib25EcmFnTGVhdmUoJGV2ZW50KVwiXHJcbiAgICAgIChkcm9wKT1cIm9uRmlsZURyb3AoJGV2ZW50KVwiXHJcbiAgICAgIChjbGljayk9XCJmaWxlSW5wdXQuY2xpY2soKVwiXHJcbiAgICAgIHJvbGU9XCJidXR0b25cIlxyXG4gICAgICB0YWJpbmRleD1cIjBcIlxyXG4gICAgICAoa2V5ZG93bi5lbnRlcik9XCJmaWxlSW5wdXQuY2xpY2soKVwiXHJcbiAgICAgIChrZXlkb3duLnNwYWNlKT1cImZpbGVJbnB1dC5jbGljaygpXCJcclxuICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCJzY3JlZW5UZXh0cz8uYXJpYUxhYmVsPy5kcm9wem9uZSA/PyAnRHJhZyBhbmQgZHJvcCBmaWxlIHVwbG9hZCBhcmVhJ1wiXHJcbiAgICA+XHJcbiAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhc2VsZWN0ZWRGaWxlXCI+XHJcbiAgICAgICAgPHN2ZyBjbGFzcz1cImllZWVzYS1yb3N0ZXItaW1wb3J0X191cGxvYWQtaWNvblwiIHdpZHRoPVwiMjJcIiBoZWlnaHQ9XCIyMlwiPlxyXG4gICAgICAgICAgPHVzZSB4bGluazpocmVmPVwiYXNzZXRzL2ltYWdlcy9zcHJpdGVzL3Nwcml0ZXMuc3ZnI2ljb24tdXBsb2FkLWdyYXlcIj48L3VzZT5cclxuICAgICAgICA8L3N2Zz5cclxuICAgICAgICA8cCBjbGFzcz1cImllZWVzYS1yb3N0ZXItaW1wb3J0X19kcm9wem9uZS10ZXh0XCI+XHJcbiAgICAgICAgICB7eyBzY3JlZW5UZXh0cz8uZHJvcHpvbmVUZXh0ID8/ICdEcmFnICYgZHJvcCBhIGZpbGUgaGVyZSwgb3IgY2xpY2sgdG8gYnJvd3NlJyB9fVxyXG4gICAgICAgIDwvcD5cclxuICAgICAgICA8cCBjbGFzcz1cImllZWVzYS1yb3N0ZXItaW1wb3J0X19kcm9wem9uZS1oaW50XCI+XHJcbiAgICAgICAgICB7eyBzY3JlZW5UZXh0cz8uZHJvcHpvbmVIaW50ID8/ICdBY2NlcHRlZCBmb3JtYXRzOiAuY3N2LCAueGxzeCcgfX1cclxuICAgICAgICA8L3A+XHJcbiAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwic2VsZWN0ZWRGaWxlXCI+XHJcbiAgICAgICAgPHN2ZyBjbGFzcz1cImllZWVzYS1yb3N0ZXItaW1wb3J0X191cGxvYWQtaWNvblwiIHdpZHRoPVwiMjJcIiBoZWlnaHQ9XCIyMlwiPlxyXG4gICAgICAgICAgPHVzZSB4bGluazpocmVmPVwiYXNzZXRzL2ltYWdlcy9zcHJpdGVzL3Nwcml0ZXMuc3ZnI2ljb24tdXBsb2FkLWdyYXlcIj48L3VzZT5cclxuICAgICAgICA8L3N2Zz5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiaWVlZXNhLXJvc3Rlci1pbXBvcnRfX2ZpbGUtcm93XCI+XHJcbiAgICAgICAgICA8cCBjbGFzcz1cImllZWVzYS1yb3N0ZXItaW1wb3J0X19maWxlLW5hbWVcIj5cclxuICAgICAgICAgICAgPHN2ZyB3aWR0aD1cIjE0XCIgaGVpZ2h0PVwiMTRcIj5cclxuICAgICAgICAgICAgICA8dXNlIHhsaW5rOmhyZWY9XCJhc3NldHMvaW1hZ2VzL3Nwcml0ZXMvc3ByaXRlcy5zdmcjaWNvbi1maWxlLWRvY1wiPjwvdXNlPlxyXG4gICAgICAgICAgICA8L3N2Zz5cclxuICAgICAgICAgICAge3sgc2VsZWN0ZWRGaWxlLm5hbWUgfX1cclxuICAgICAgICAgIDwvcD5cclxuICAgICAgICAgIDxidXR0b25cclxuICAgICAgICAgICAgbWF0LWJ1dHRvblxyXG4gICAgICAgICAgICBjbGFzcz1cImllZWVzYS1yb3N0ZXItaW1wb3J0X19yZW1vdmUtZmlsZS1idG5cIlxyXG4gICAgICAgICAgICAoY2xpY2spPVwib25SZW1vdmVGaWxlKCk7ICRldmVudC5zdG9wUHJvcGFnYXRpb24oKVwiXHJcbiAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxyXG4gICAgICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cInNjcmVlblRleHRzPy5hcmlhTGFiZWw/LnJlbW92ZSA/PyAnUmVtb3ZlIHNlbGVjdGVkIGZpbGUnXCJcclxuICAgICAgICAgID5cclxuICAgICAgICAgICAgJnRpbWVzO1xyXG4gICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgPC9kaXY+XHJcblxyXG4gICAgPCEtLSBJbmxpbmUgRXJyb3IgTWVzc2FnZSAtLT5cclxuICAgIDxkaXZcclxuICAgICAgKm5nSWY9XCJlcnJvck1lc3NhZ2VcIlxyXG4gICAgICBjbGFzcz1cImllZWVzYS1yb3N0ZXItaW1wb3J0X19lcnJvci1iYW5uZXJcIlxyXG4gICAgICByb2xlPVwiYWxlcnRcIlxyXG4gICAgPlxyXG4gICAgICB7eyBlcnJvck1lc3NhZ2UgfX1cclxuICAgIDwvZGl2PlxyXG4gIDwvbmctY29udGFpbmVyPlxyXG5cclxuICA8IS0tIFByb2Nlc3NpbmcgLyBSZXN1bHQgc2hhcmUgdGhlIGZpbGUgZGlzcGxheSArIHByb2dyZXNzIGJhciAtLT5cclxuICA8bmctY29udGFpbmVyICpuZ0lmPVwiaW1wb3J0U3RhdGUgPT09ICdwcm9jZXNzaW5nJyB8fCBpbXBvcnRTdGF0ZSA9PT0gJ3Jlc3VsdCdcIj5cclxuICAgIDxkaXZcclxuICAgICAgY2xhc3M9XCJpZWVlc2Etcm9zdGVyLWltcG9ydF9fZHJvcHpvbmUgaWVlZXNhLXJvc3Rlci1pbXBvcnRfX2Ryb3B6b25lLS1yZXN1bHRcIlxyXG4gICAgPlxyXG4gICAgICA8c3ZnIGNsYXNzPVwiaWVlZXNhLXJvc3Rlci1pbXBvcnRfX3VwbG9hZC1pY29uXCIgd2lkdGg9XCIyMlwiIGhlaWdodD1cIjIyXCI+XHJcbiAgICAgICAgPHVzZSB4bGluazpocmVmPVwiYXNzZXRzL2ltYWdlcy9zcHJpdGVzL3Nwcml0ZXMuc3ZnI2ljb24tdXBsb2FkLWdyYXlcIj48L3VzZT5cclxuICAgICAgPC9zdmc+XHJcbiAgICAgIDxwIGNsYXNzPVwiaWVlZXNhLXJvc3Rlci1pbXBvcnRfX2ZpbGUtbmFtZVwiPlxyXG4gICAgICAgIDxzdmcgd2lkdGg9XCIxNFwiIGhlaWdodD1cIjE0XCI+XHJcbiAgICAgICAgICA8dXNlIHhsaW5rOmhyZWY9XCJhc3NldHMvaW1hZ2VzL3Nwcml0ZXMvc3ByaXRlcy5zdmcjaWNvbi1maWxlLWRvY1wiPjwvdXNlPlxyXG4gICAgICAgIDwvc3ZnPlxyXG4gICAgICAgIHt7IHNlbGVjdGVkRmlsZT8ubmFtZSB9fVxyXG4gICAgICA8L3A+XHJcbiAgICA8L2Rpdj5cclxuXHJcbiAgICA8IS0tIFByb2dyZXNzIGxhYmVsIChwcm9jZXNzaW5nIG9ubHkpIC0tPlxyXG4gICAgPGRpdlxyXG4gICAgICAqbmdJZj1cImltcG9ydFN0YXRlID09PSAncHJvY2Vzc2luZydcIlxyXG4gICAgICBjbGFzcz1cImllZWVzYS1yb3N0ZXItaW1wb3J0X19wcm9ncmVzcy1oZWFkXCJcclxuICAgID5cclxuICAgICAgPHNwYW4gY2xhc3M9XCJpZWVlc2Etcm9zdGVyLWltcG9ydF9fcHJvZ3Jlc3MtbGFiZWxcIj5cclxuICAgICAgICB7eyBzY3JlZW5UZXh0cz8ucHJvY2Vzc2luZ0xhYmVsID8/ICdQcm9jZXNzaW5nIGZpbGUgcmVjb3Jkcy4uLi4nIH19XHJcbiAgICAgIDwvc3Bhbj5cclxuICAgIDwvZGl2PlxyXG4gICAgPG1hdC1wcm9ncmVzcy1iYXJcclxuICAgICAgKm5nSWY9XCJpbXBvcnRTdGF0ZSA9PT0gJ3Byb2Nlc3NpbmcnXCJcclxuICAgICAgY2xhc3M9XCJpZWVlc2Etcm9zdGVyLWltcG9ydF9fcHJvZ3Jlc3MtYmFyXCJcclxuICAgICAgbW9kZT1cImluZGV0ZXJtaW5hdGVcIlxyXG4gICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cInNjcmVlblRleHRzPy5wcm9jZXNzaW5nTGFiZWwgPz8gJ1Byb2Nlc3NpbmcgZmlsZSByZWNvcmRzLi4uLidcIlxyXG4gICAgPjwvbWF0LXByb2dyZXNzLWJhcj5cclxuICA8L25nLWNvbnRhaW5lcj5cclxuXHJcbiAgPCEtLSBSZXN1bHQgU3RhdGUgKHN1bW1hcnkgKyBlcnJvcnMpIC0tPlxyXG4gIDxuZy1jb250YWluZXIgKm5nSWY9XCJpbXBvcnRTdGF0ZSA9PT0gJ3Jlc3VsdCcgJiYgdXBsb2FkUmVzdWx0XCI+XHJcbiAgICA8IS0tIE5vIGRhdGEgcmVjb3JkcyBiYW5uZXIgKGhlYWRlcnMgb25seSwgemVybyByb3dzKSAtLT5cclxuICAgIDxkaXZcclxuICAgICAgKm5nSWY9XCJub0RhdGFNZXNzYWdlXCJcclxuICAgICAgY2xhc3M9XCJpZWVlc2Etcm9zdGVyLWltcG9ydF9fbm8tZGF0YS1iYW5uZXJcIlxyXG4gICAgICByb2xlPVwic3RhdHVzXCJcclxuICAgID5cclxuICAgICAge3sgbm9EYXRhTWVzc2FnZSB9fVxyXG4gICAgPC9kaXY+XHJcblxyXG4gICAgPCEtLSBTdW1tYXJ5IGNhcmRzIC0tPlxyXG4gICAgPGRpdiAqbmdJZj1cInNob3dTdW1tYXJ5Q2FyZHNcIiBjbGFzcz1cImllZWVzYS1yb3N0ZXItaW1wb3J0X19zdW1tYXJ5LWNhcmRzXCI+XHJcbiAgICAgIDxkaXZcclxuICAgICAgICBjbGFzcz1cImllZWVzYS1yb3N0ZXItaW1wb3J0X19zdW1tYXJ5LWNhcmQgaWVlZXNhLXJvc3Rlci1pbXBvcnRfX3N1bW1hcnktY2FyZC0tc3VjY2Vzc1wiXHJcbiAgICAgID5cclxuICAgICAgICA8cCBjbGFzcz1cImllZWVzYS1yb3N0ZXItaW1wb3J0X19zdW1tYXJ5LWNhcmQtY291bnRcIj5cclxuICAgICAgICAgIHt7IHVwbG9hZFJlc3VsdC5zdWNjZXNzQ291bnQgfX1cclxuICAgICAgICA8L3A+XHJcbiAgICAgICAgPHAgY2xhc3M9XCJpZWVlc2Etcm9zdGVyLWltcG9ydF9fc3VtbWFyeS1jYXJkLWxhYmVsXCI+XHJcbiAgICAgICAgICB7eyBzY3JlZW5UZXh0cz8ucmVzdWx0Py5zdWNjZXNzQ2FyZExhYmVsID8/ICdSb3N0ZXJzIGFkZGVkIHN1Y2Nlc3NmdWxseScgfX1cclxuICAgICAgICA8L3A+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgICA8ZGl2XHJcbiAgICAgICAgY2xhc3M9XCJpZWVlc2Etcm9zdGVyLWltcG9ydF9fc3VtbWFyeS1jYXJkIGllZWVzYS1yb3N0ZXItaW1wb3J0X19zdW1tYXJ5LWNhcmQtLXNraXBwZWRcIlxyXG4gICAgICA+XHJcbiAgICAgICAgPHAgY2xhc3M9XCJpZWVlc2Etcm9zdGVyLWltcG9ydF9fc3VtbWFyeS1jYXJkLWNvdW50XCI+XHJcbiAgICAgICAgICB7eyB1cGxvYWRSZXN1bHQuZmFpbHVyZUNvdW50IH19XHJcbiAgICAgICAgPC9wPlxyXG4gICAgICAgIDxwIGNsYXNzPVwiaWVlZXNhLXJvc3Rlci1pbXBvcnRfX3N1bW1hcnktY2FyZC1sYWJlbFwiPlxyXG4gICAgICAgICAge3sgc2NyZWVuVGV4dHM/LnJlc3VsdD8uc2tpcHBlZENhcmRMYWJlbCA/PyAnU2tpcHBlZCBSb3dzJyB9fVxyXG4gICAgICAgIDwvcD5cclxuICAgICAgPC9kaXY+XHJcbiAgICA8L2Rpdj5cclxuXHJcbiAgICA8IS0tIFJvdyBFcnJvcnMgQ2FyZCAtLT5cclxuICAgIDxkaXYgKm5nSWY9XCJqb2JFcnJvcnMubGVuZ3RoXCIgY2xhc3M9XCJpZWVlc2Etcm9zdGVyLWltcG9ydF9fZXJyb3JzLWNhcmRcIj5cclxuICAgICAgPHAgY2xhc3M9XCJpZWVlc2Etcm9zdGVyLWltcG9ydF9fZXJyb3JzLWhlYWRlclwiPlxyXG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJhbGxSb3dzU2tpcHBlZDsgZWxzZSBzb21lRXJyb3JzXCI+XHJcbiAgICAgICAgICB7eyBzY3JlZW5UZXh0cz8ucmVzdWx0Py5hbGxSb3dzU2tpcHBlZEhlYWRlciA/PyAnQWxsIFJvd3MgYXJlIHNraXBwZWQnIH19XHJcbiAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgPG5nLXRlbXBsYXRlICNzb21lRXJyb3JzPlxyXG4gICAgICAgICAge3sgc2NyZWVuVGV4dHM/LnJlc3VsdD8uZXJyb3JzSGVhZGVyID8/ICdSb3cgZXJyb3JzIOKAlCB0aGVzZSByb3dzIHdpbGwgYmUgc2tpcHBlZCcgfX1cclxuICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICA8L3A+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJpZWVlc2Etcm9zdGVyLWltcG9ydF9fZXJyb3JzLWJvZHlcIj5cclxuICAgICAgICA8ZGl2XHJcbiAgICAgICAgICAqbmdGb3I9XCJsZXQgcm93RXJyIG9mIGpvYkVycm9yc1wiXHJcbiAgICAgICAgICBjbGFzcz1cImllZWVzYS1yb3N0ZXItaW1wb3J0X19lcnJvci1yb3dcIlxyXG4gICAgICAgID5cclxuICAgICAgICAgIDxwIGNsYXNzPVwiaWVlZXNhLXJvc3Rlci1pbXBvcnRfX2Vycm9yLXJvdy10aXRsZVwiPlxyXG4gICAgICAgICAgICBSb3cge3sgcm93RXJyLnJvd051bWJlciB9fSDigJQge3sgcm93RXJyLmVycm9yTWVzc2FnZSB9fVxyXG4gICAgICAgICAgPC9wPlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICA8L2Rpdj5cclxuICAgIDwvZGl2PlxyXG4gIDwvbmctY29udGFpbmVyPlxyXG5cclxuICA8IS0tIEZvb3RlciBhY3Rpb25zIC0tPlxyXG4gIDxkaXYgY2xhc3M9XCJpZWVlc2Etcm9zdGVyLWltcG9ydF9fYWN0aW9uc1wiPlxyXG4gICAgPGJ1dHRvblxyXG4gICAgICBtYXQtYnV0dG9uXHJcbiAgICAgIGNsYXNzPVwibWF0LXRlcnRpYXJ5LWJ1dHRvbiBpZWVlc2Etcm9zdGVyLWltcG9ydF9fY2FuY2VsLWJ0blwiXHJcbiAgICAgIChjbGljayk9XCJvbkNhbmNlbCgpXCJcclxuICAgICAgdHlwZT1cImJ1dHRvblwiXHJcbiAgICA+XHJcbiAgICAgIHt7IHNjcmVlblRleHRzPy5idXR0b25zPy5jYW5jZWwgPz8gJ0NhbmNlbCcgfX1cclxuICAgIDwvYnV0dG9uPlxyXG4gICAgPGJ1dHRvblxyXG4gICAgICAqbmdJZj1cImltcG9ydFN0YXRlID09PSAncmVzdWx0JyAmJiBqb2JFcnJvcnMubGVuZ3RoXCJcclxuICAgICAgbWF0LWJ1dHRvblxyXG4gICAgICB0eXBlPVwiYnV0dG9uXCJcclxuICAgICAgY2xhc3M9XCJtYXQtcHJpbWFyeS1idXR0b24gaWVlZXNhLXJvc3Rlci1pbXBvcnRfX2Vycm9yLWxvZy1idG5cIlxyXG4gICAgICAoY2xpY2spPVwiZG93bmxvYWRFcnJvckxvZygpXCJcclxuICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCJzY3JlZW5UZXh0cz8uYXJpYUxhYmVsPy5kb3dubG9hZEVycm9yTG9nID8/ICdEb3dubG9hZCBFcnJvciBsb2cnXCJcclxuICAgID5cclxuICAgICAge3sgc2NyZWVuVGV4dHM/LmJ1dHRvbnM/LmRvd25sb2FkRXJyb3JMb2cgPz8gJ0Rvd25sb2FkIEVycm9yIGxvZycgfX1cclxuICAgIDwvYnV0dG9uPlxyXG4gIDwvZGl2PlxyXG48L2Rpdj5cclxuIl19