@almatar/smart-booking-dashboard 0.0.2-alpha.2 → 0.0.2-alpha.4

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 (58) hide show
  1. package/esm2022/lib/components/almatar-aside/aside.component.mjs +6 -7
  2. package/esm2022/lib/components/hotel-cancel/almatar-hotel-auto-cancellation.component.mjs +17 -12
  3. package/esm2022/lib/components/hotel-cancel/components/almatar-hotel-auto-cancellation-refund-summary/almatar-hotel-auto-cancellation-refund-summary.component.mjs +9 -3
  4. package/esm2022/lib/components/hotel-cancel/components/almatar-hotel-auto-cancellation-result-overlay/almatar-hotel-auto-cancellation-result-overlay.component.mjs +210 -0
  5. package/esm2022/lib/components/hotel-cancel/components/almatar-hotel-auto-cancellation-select-rooms/almatar-hotel-auto-cancellation-select-rooms.component.mjs +3 -3
  6. package/esm2022/lib/components/hotel-cancel/components/almatar-hotel-auto-cancellation-select-rooms/components/almatar-hotel-auto-cancellation-non-refundable-room/almatar-hotel-auto-cancellation-non-refundable-room.component.mjs +4 -4
  7. package/esm2022/lib/components/hotel-cancel/components/hotel-content/hotel-content.component.mjs +11 -4
  8. package/esm2022/lib/components/hotel-cancel/components/hotel-refund-method-selector/hotel-refund-method-selector.component.mjs +23 -21
  9. package/esm2022/lib/components/hotel-cancel/services/almatar-hotel-auto-cancellation-endpoints.service.mjs +42 -34
  10. package/esm2022/lib/components/reissue-dialog/reissue-dialog.component.mjs +135 -0
  11. package/esm2022/lib/components/reissue-dialog/reissue-upgrade.store.mjs +305 -0
  12. package/esm2022/lib/components/reissue-dialog/reissue.store.mjs +349 -0
  13. package/esm2022/lib/components/reissue-dialog/steps/reissue-date-step/reissue-date-step.component.mjs +45 -0
  14. package/esm2022/lib/components/reissue-dialog/steps/reissue-legs-step/reissue-legs-step.component.mjs +140 -0
  15. package/esm2022/lib/components/reissue-dialog/steps/reissue-notice/reissue-notice.component.mjs +16 -0
  16. package/esm2022/lib/components/reissue-dialog/steps/reissue-route-step/reissue-route-step.component.mjs +104 -0
  17. package/esm2022/lib/components/reissue-dialog/steps/reissue-service-step/reissue-service-step.component.mjs +44 -0
  18. package/esm2022/lib/components/reissue-dialog/steps/reissue-upgrade-confirm-step/reissue-upgrade-confirm-step.component.mjs +193 -0
  19. package/esm2022/lib/components/reissue-dialog/steps/reissue-upgrade-step/reissue-upgrade-step.component.mjs +88 -0
  20. package/esm2022/lib/components/workflow-actions/workflow-actions.component.mjs +5 -3
  21. package/esm2022/lib/config/dashboard.config.mjs +3 -1
  22. package/esm2022/lib/models/reissue.types.mjs +2 -0
  23. package/esm2022/lib/pages/smart-booking-dashboard/smart-booking-dashboard.component.mjs +9 -3
  24. package/esm2022/lib/services/reissue.service.mjs +142 -0
  25. package/esm2022/lib/services/toast.service.mjs +15 -7
  26. package/esm2022/lib/utils/reissue-format.mjs +64 -0
  27. package/esm2022/lib/utils/reissue-url.builder.mjs +314 -0
  28. package/esm2022/public-api.mjs +3 -1
  29. package/fesm2022/almatar-smart-booking-dashboard.mjs +2211 -102
  30. package/fesm2022/almatar-smart-booking-dashboard.mjs.map +1 -1
  31. package/lib/components/action-dialog/action-dialog.component.d.ts +1 -1
  32. package/lib/components/almatar-aside/aside.component.d.ts +1 -2
  33. package/lib/components/hotel-cancel/almatar-hotel-auto-cancellation.component.d.ts +3 -0
  34. package/lib/components/hotel-cancel/components/almatar-hotel-auto-cancellation-refund-summary/almatar-hotel-auto-cancellation-refund-summary.component.d.ts +1 -0
  35. package/lib/components/hotel-cancel/components/almatar-hotel-auto-cancellation-result-overlay/almatar-hotel-auto-cancellation-result-overlay.component.d.ts +46 -0
  36. package/lib/components/hotel-cancel/components/hotel-content/hotel-content.component.d.ts +2 -1
  37. package/lib/components/hotel-cancel/services/almatar-hotel-auto-cancellation-endpoints.service.d.ts +6 -0
  38. package/lib/components/reissue-dialog/reissue-dialog.component.d.ts +34 -0
  39. package/lib/components/reissue-dialog/reissue-upgrade.store.d.ts +96 -0
  40. package/lib/components/reissue-dialog/reissue.store.d.ts +124 -0
  41. package/lib/components/reissue-dialog/steps/reissue-date-step/reissue-date-step.component.d.ts +11 -0
  42. package/lib/components/reissue-dialog/steps/reissue-legs-step/reissue-legs-step.component.d.ts +16 -0
  43. package/lib/components/reissue-dialog/steps/reissue-notice/reissue-notice.component.d.ts +8 -0
  44. package/lib/components/reissue-dialog/steps/reissue-route-step/reissue-route-step.component.d.ts +21 -0
  45. package/lib/components/reissue-dialog/steps/reissue-service-step/reissue-service-step.component.d.ts +17 -0
  46. package/lib/components/reissue-dialog/steps/reissue-upgrade-confirm-step/reissue-upgrade-confirm-step.component.d.ts +28 -0
  47. package/lib/components/reissue-dialog/steps/reissue-upgrade-step/reissue-upgrade-step.component.d.ts +13 -0
  48. package/lib/components/result-panel/result-panel.component.d.ts +1 -1
  49. package/lib/components/workflow-actions/workflow-actions.component.d.ts +3 -1
  50. package/lib/config/dashboard.config.d.ts +29 -0
  51. package/lib/models/reissue.types.d.ts +147 -0
  52. package/lib/pages/smart-booking-dashboard/smart-booking-dashboard.component.d.ts +4 -1
  53. package/lib/services/reissue.service.d.ts +45 -0
  54. package/lib/services/toast.service.d.ts +14 -1
  55. package/lib/utils/reissue-format.d.ts +28 -0
  56. package/lib/utils/reissue-url.builder.d.ts +24 -0
  57. package/package.json +9 -7
  58. package/public-api.d.ts +5 -1
@@ -1,6 +1,7 @@
1
1
  import { Injectable, inject, signal, computed } from '@angular/core';
2
- import { map, catchError, throwError } from 'rxjs';
2
+ import { map, catchError, throwError, of } from 'rxjs';
3
3
  import { ApiService } from '../../../shared/services/api.service';
4
+ import { SBD_CONFIG } from '../../../config/dashboard.config';
4
5
  import { ActivatedRoute } from '@angular/router';
5
6
  import { environments } from '../../../shared/environments/environment';
6
7
  import { HotelManageBookingService } from '../../shared/services/hotel-manage-booking/hotel-manage-booking.service';
@@ -11,6 +12,7 @@ import * as i0 from "@angular/core";
11
12
  export class AlmatarHotelAutoCancellationEndpointsService {
12
13
  constructor() {
13
14
  this.api = inject(ApiService);
15
+ this.apiBase = inject(SBD_CONFIG).apiBase;
14
16
  this.route = inject(ActivatedRoute);
15
17
  this.hotelManageBookingService = inject(HotelManageBookingService);
16
18
  this._almatarBookingId = signal('');
@@ -33,8 +35,15 @@ export class AlmatarHotelAutoCancellationEndpointsService {
33
35
  }
34
36
  });
35
37
  }
38
+ /**
39
+ * Full URL of an endpoint from the enum. The enum paths start with `/api/`, which is the default `apiBase`; a host
40
+ * that serves the API somewhere else (Helix: its own API origin) sets `apiBase`, so that part is swapped for it.
41
+ */
42
+ resolveEndpoint(path) {
43
+ return `${this.apiBase.replace(/\/+$/, '')}/${path.replace(/^\/?api\//, '')}`;
44
+ }
36
45
  getRefundDetails(packageIds = []) {
37
- const endpoint = AlmatarHotelAutoCancellationEndpointsEnum.getRefundDetails;
46
+ const endpoint = this.resolveEndpoint(AlmatarHotelAutoCancellationEndpointsEnum.getRefundDetails);
38
47
  const payload = {
39
48
  bookingId: `${this.hotelManageBookingService.selectedHotelBooking.value?.bookingId ||
40
49
  ''}`,
@@ -326,7 +335,7 @@ export class AlmatarHotelAutoCancellationEndpointsService {
326
335
  return allRooms;
327
336
  }
328
337
  processAutoCancellation(packageIds, refundOption = 'originalPaymentMethod') {
329
- const endpoint = AlmatarHotelAutoCancellationEndpointsEnum.processAutoCancellation;
338
+ const endpoint = this.resolveEndpoint(AlmatarHotelAutoCancellationEndpointsEnum.processAutoCancellation);
330
339
  const uniquePackageIds = [...new Set(packageIds)]; // Ensure unique package IDs
331
340
  const payload = {
332
341
  bookingId: `${this.hotelManageBookingService.selectedHotelBooking.value?.bookingId ||
@@ -336,35 +345,34 @@ export class AlmatarHotelAutoCancellationEndpointsService {
336
345
  preferredPaymentMethod: refundOption
337
346
  };
338
347
  this._selectedPackageIds.set(uniquePackageIds);
339
- // return of({
340
- // data: {
341
- // error: '1',
342
- // message:
343
- // 'Cancel requested — supplier cancellation failed; ticket created',
344
- // bookingId: 144368,
345
- // preferredPaymentMethod: 'wallet',
346
- // cancel: {
347
- // status: 'failed',
348
- // packageIds: ['f03838bd-ea8d-4fe5-bfc8-dd31c9bdee95'],
349
- // },
350
- // refund: {
351
- // status: 'skipped',
352
- // bookingStatus: 'Cancelled',
353
- // amount: 1050,
354
- // currency: 'SAR',
355
- // breakdown: {
356
- // wallet: 750,
357
- // mokafa: 200,
358
- // qitaf: 100,
359
- // card: 0,
360
- // tabby: 0,
361
- // tamara: 0,
362
- // },
363
- // },
364
- // },
365
- // status: 200,
366
- // errors: null,
367
- // });
348
+ return of({
349
+ data: {
350
+ error: '1',
351
+ message: 'Cancel requested — supplier cancellation failed; ticket created',
352
+ bookingId: 144368,
353
+ preferredPaymentMethod: 'wallet',
354
+ cancel: {
355
+ status: 'failed',
356
+ packageIds: ['f03838bd-ea8d-4fe5-bfc8-dd31c9bdee95'],
357
+ },
358
+ refund: {
359
+ status: 'skipped',
360
+ bookingStatus: 'Cancelled',
361
+ amount: 1050,
362
+ currency: 'SAR',
363
+ breakdown: {
364
+ wallet: 0,
365
+ mokafa: 0,
366
+ qitaf: 0,
367
+ card: 200,
368
+ tabby: 0,
369
+ tamara: 0,
370
+ },
371
+ },
372
+ },
373
+ status: 200,
374
+ errors: null,
375
+ });
368
376
  return this.api
369
377
  .post({
370
378
  endpoint,
@@ -376,7 +384,7 @@ export class AlmatarHotelAutoCancellationEndpointsService {
376
384
  }), catchError((error) => this.handleError(error, 'Failed to process cancellation')));
377
385
  }
378
386
  processNonRefundableCancellation(packageId, attachmentUrl, language = 'en') {
379
- const endpoint = AlmatarHotelAutoCancellationEndpointsEnum.processAutoCancellation;
387
+ const endpoint = this.resolveEndpoint(AlmatarHotelAutoCancellationEndpointsEnum.processAutoCancellation);
380
388
  const payload = {
381
389
  bookingId: `${this.hotelManageBookingService.selectedHotelBooking.value?.bookingId ||
382
390
  ''}`,
@@ -445,4 +453,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
445
453
  providedIn: 'root'
446
454
  }]
447
455
  }], ctorParameters: () => [] });
448
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWxtYXRhci1ob3RlbC1hdXRvLWNhbmNlbGxhdGlvbi1lbmRwb2ludHMuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3NtYXJ0LWJvb2tpbmctZGFzaGJvYXJkL3NyYy9saWIvY29tcG9uZW50cy9ob3RlbC1jYW5jZWwvc2VydmljZXMvYWxtYXRhci1ob3RlbC1hdXRvLWNhbmNlbGxhdGlvbi1lbmRwb2ludHMuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsUUFBUSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ3JFLE9BQU8sRUFBYyxHQUFHLEVBQUUsVUFBVSxFQUFFLFVBQVUsRUFBTSxNQUFNLE1BQU0sQ0FBQztBQUNuRSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sc0NBQXNDLENBQUM7QUFDbEUsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQ2pELE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSwwQ0FBMEMsQ0FBQztBQUN4RSxPQUFPLEVBQUUseUJBQXlCLEVBQUUsTUFBTSx5RUFBeUUsQ0FBQztBQUNwSCxPQUFPLEVBQUUseUNBQXlDLEVBQUUsTUFBTSx5REFBeUQsQ0FBQztBQVFwSCxPQUFPLEVBQUUsOENBQThDLEVBQUUsTUFBTSxxREFBcUQsQ0FBQztBQUNySCxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQzs7QUErRGhFLE1BQU0sT0FBTyw0Q0FBNEM7SUFtQnZEO1FBbEJpQixRQUFHLEdBQUcsTUFBTSxDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBQ3pCLFVBQUssR0FBRyxNQUFNLENBQUMsY0FBYyxDQUFDLENBQUM7UUFDL0IsOEJBQXlCLEdBQUcsTUFBTSxDQUNqRCx5QkFBeUIsQ0FDMUIsQ0FBQztRQUVlLHNCQUFpQixHQUFHLE1BQU0s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LE9BQU8sVUFBVSxDQUFDLEdBQUcsRUFBRSxDQUFDLElBQUksS0FBSyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUM7SUFDbkQsQ0FBQzsrR0FsZ0JVLDRDQUE0QzttSEFBNUMsNENBQTRDLGNBRjNDLE1BQU07OzRGQUVQLDRDQUE0QztrQkFIeEQsVUFBVTttQkFBQztvQkFDVixVQUFVLEVBQUUsTUFBTTtpQkFDbkIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RhYmxlLCBpbmplY3QsIHNpZ25hbCwgY29tcHV0ZWQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IE9ic2VydmFibGUsIG1hcCwgY2F0Y2hFcnJvciwgdGhyb3dFcnJvciwgb2YgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IEFwaVNlcnZpY2UgfSBmcm9tICcuLi8uLi8uLi9zaGFyZWQvc2VydmljZXMvYXBpLnNlcnZpY2UnO1xuaW1wb3J0IHsgQWN0aXZhdGVkUm91dGUgfSBmcm9tICdAYW5ndWxhci9yb3V0ZXInO1xuaW1wb3J0IHsgZW52aXJvbm1lbnRzIH0gZnJvbSAnLi4vLi4vLi4vc2hhcmVkL2Vudmlyb25tZW50cy9lbnZpcm9ubWVudCc7XG5pbXBvcnQgeyBIb3RlbE1hbmFnZUJvb2tpbmdTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2hhcmVkL3NlcnZpY2VzL2hvdGVsLW1hbmFnZS1ib29raW5nL2hvdGVsLW1hbmFnZS1ib29raW5nLnNlcnZpY2UnO1xuaW1wb3J0IHsgQWxtYXRhckhvdGVsQXV0b0NhbmNlbGxhdGlvbkVuZHBvaW50c0VudW0gfSBmcm9tICcuLi9lbnVtcy9hbG1hdGFyLWhvdGVsLWF1dG8tY2FuY2VsbGF0aW9uLWVuZHBvaW50cy5lbnVtJztcbmltcG9ydCB7XG4gIElBbG1hdGFySG90ZWxBdXRvQ2FuY2VsbGF0aW9uUm9vbSxcbiAgSUFsbWF0YXJIb3RlbEF1dG9DYW5jZWxsYXRpb25SZWZ1bmRTdW1tYXJ5LFxuICBJQWxtYXRhckhvdGVsQXV0b0NhbmNlbGxhdGlvblJlZnVuZFBhY2thZ2UsXG4gIElSZWZ1bmREZXRhaWxzQXBpUmVzcG9uc2UsXG4gIElSZWZ1bmREZXRhaWxzRGF0YVxufSBmcm9tICcuLi9pbnRlcmZhY2VzL2ktYWxtYXRhci1ob3RlbC1hdXRvLWNhbmNlbGxhdGlvbi5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgcmVzb2x2ZU15VHJpcHNWaWV3ZWRFbnRyeVNvdXJjZUZyb21RdWVyeVBhcmFtcyB9IGZyb20gJy4uLy4uLy4uL3NoYXJlZC9zZXJ2aWNlcy93ZWJlbmdhZ2UtdHJhY2tpbmcuc2VydmljZSc7XG5pbXBvcnQgeyB0YWtlVW50aWxEZXN0cm95ZWQgfSBmcm9tICdAYW5ndWxhci9jb3JlL3J4anMtaW50ZXJvcCc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgSVJlZnVuZERldGFpbHNSZXF1ZXN0IHtcbiAgYm9va2luZ0lkOiBzdHJpbmc7XG4gIHByb2R1Y3Q6ICdob3RlbHMnO1xuICBwYWNrYWdlSWRzOiBzdHJpbmdbXTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBJUHJvY2Vzc0NhbmNlbGxhdGlvblJlcXVlc3Qge1xuICBib29raW5nSWQ6IHN0cmluZztcbiAgcHJvZHVjdDogJ2hvdGVscyc7XG4gIHBhY2thZ2VJZHM6IHN0cmluZ1tdO1xuICBwcmVmZXJyZWRQYXltZW50TWV0aG9kPzogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIElQcm9jZXNzTm9uUmVmdW5kYWJsZUNhbmNlbGxhdGlvblJlcXVlc3Qge1xuICBib29raW5nSWQ6IHN0cmluZztcbiAgcHJvZHVjdDogJ2hvdGVscyc7XG4gIHBhY2thZ2VJZHM6IHN0cmluZ1tdO1xuICBwcmVmZXJyZWRQYXltZW50TWV0aG9kOiBzdHJpbmc7XG4gIHByb2Nlc3NlZE1vZGU6ICdhdXRvJztcbiAgbGFuZ3VhZ2U6IHN0cmluZztcbiAgYXR0YWNobWVudFVybDogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIElBdXRvQ2FuY2VsbGF0aW9uUHJvY2Vzc1Jlc3BvbnNlIHtcbiAgc3RhdHVzOiBudW1iZXI7XG4gIGRhdGE6IHtcbiAgICBlcnJvcjogc3RyaW5nO1xuICAgIG1lc3NhZ2U6IHN0cmluZztcbiAgICBib29raW5nSWQ6IG51bWJlcjtcbiAgICBwcmVmZXJyZWRQYXltZW50TWV0aG9kOiBzdHJpbmc7XG4gICAgaXNXaGF0c0FwcD86IGJvb2xlYW47XG4gICAgY2FuY2VsOiB7XG4gICAgICBzdGF0dXM6IHN0cmluZztcbiAgICAgIHBhY2thZ2VJZHM6IHN0cmluZ1tdO1xuICAgIH07XG4gICAgcmVmdW5kOiB7XG4gICAgICBzdGF0dXM6IHN0cmluZztcbiAgICAgIGJvb2tpbmdTdGF0dXM6IHN0cmluZztcbiAgICAgIGFtb3VudDogbnVtYmVyO1xuICAgICAgY3VycmVuY3k6IHN0cmluZztcbiAgICAgIGJyZWFrZG93bjoge1xuICAgICAgICB3YWxsZXQ6IG51bWJlcjtcbiAgICAgICAgbW9rYWZhOiBudW1iZXI7XG4gICAgICAgIHFpdGFmOiBudW1iZXI7XG4gICAgICAgIGNhcmQ6IG51bWJlcjtcbiAgICAgICAgdGFiYnk6IG51bWJlcjtcbiAgICAgICAgdGFtYXJhOiBudW1iZXI7XG4gICAgICB9O1xuICAgIH07XG4gIH07XG4gIGVycm9yczogYW55O1xufVxuXG5pbnRlcmZhY2UgSUVudHJ5U291cmNlRGV2aWNlQnJhbmQge1xuICBlbnRyeVNvdXJjZTogc3RyaW5nO1xuICBkZXZpY2U6IHN0cmluZztcbn1cblxuQEluamVjdGFibGUoe1xuICBwcm92aWRlZEluOiAncm9vdCdcbn0pXG5leHBvcnQgY2xhc3MgQWxtYXRhckhvdGVsQXV0b0NhbmNlbGxhdGlvbkVuZHBvaW50c1NlcnZpY2Uge1xuICBwcml2YXRlIHJlYWRvbmx5IGFwaSA9IGluamVjdChBcGlTZXJ2aWNlKTtcbiAgcHJpdmF0ZSByZWFkb25seSByb3V0ZSA9IGluamVjdChBY3RpdmF0ZWRSb3V0ZSk7XG4gIHByaXZhdGUgcmVhZG9ubHkgaG90ZWxNYW5hZ2VCb29raW5nU2VydmljZSA9IGluamVjdChcbiAgICBIb3RlbE1hbmFnZUJvb2tpbmdTZXJ2aWNlXG4gICk7XG5cbiAgcHJpdmF0ZSByZWFkb25seSBfYWxtYXRhckJvb2tpbmdJZCA9IHNpZ25hbDxzdHJpbmc+KCcnKTtcbiAgcHJpdmF0ZSByZWFkb25seSBfY29uZmlybWF0aW9uTnVtYmVyID0gc2lnbmFsPHN0cmluZz4oJycpO1xuICBwcml2YXRlIHJlYWRvbmx5IF9pc051c3VrRmxvdyA9IHNpZ25hbDxib29sZWFuPihcbiAgICBlbnZpcm9ubWVudHMuaXNUZW5hbnQgfHwgZmFsc2VcbiAgKTtcblxuICBwcml2YXRlIHJlYWRvbmx5IF9zZWxlY3RlZFBhY2thZ2VJZHMgPSBzaWduYWw8c3RyaW5nW10+KFtdKTtcblxuICByZWFkb25seSBhbG1hdGFyQm9va2luZ0lkID0gY29tcHV0ZWQoKCkgPT4gdGhpcy5fYWxtYXRhckJvb2tpbmdJZCgpKTtcbiAgcmVhZG9ubHkgY29uZmlybWF0aW9uTnVtYmVyID0gY29tcHV0ZWQoKCkgPT4gdGhpcy5fY29uZmlybWF0aW9uTnVtYmVyKCkpO1xuICByZWFkb25seSBpc051c3VrRmxvdyA9IGNvbXB1dGVkKCgpID0+IHRoaXMuX2lzTnVzdWtGbG93KCkpO1xuXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHRoaXMuaW5pdGlhbGl6ZUJvb2tpbmdEYXRhKCk7XG4gIH1cblxuICBwcml2YXRlIGluaXRpYWxpemVCb29raW5nRGF0YSgpOiB2b2lkIHtcbiAgICB0aGlzLmhvdGVsTWFuYWdlQm9va2luZ1NlcnZpY2Uuc2VsZWN0ZWRIb3RlbEJvb2tpbmdcbiAgICAgIC5waXBlKHRha2VVbnRpbERlc3Ryb3llZCgpKVxuICAgICAgLnN1YnNjcmliZSgoc2VsZWN0ZWRIb3RlbEJvb2tpbmc6IGFueSkgPT4ge1xuICAgICAgICAvLyBjb25zb2xlLmxvZygnU2VsZWN0ZWQgSG90ZWwgQm9va2luZzonLCBzZWxlY3RlZEhvdGVsQm9va2luZyk7XG4gICAgICAgIGlmIChzZWxlY3RlZEhvdGVsQm9va2luZykge1xuICAgICAgICAgIHRoaXMuX2FsbWF0YXJCb29raW5nSWQuc2V0KHNlbGVjdGVkSG90ZWxCb29raW5nLmJvb2tpbmdJZCB8fCAnJyk7XG4gICAgICAgICAgdGhpcy5fY29uZmlybWF0aW9uTnVtYmVyLnNldChzZWxlY3RlZEhvdGVsQm9va2luZy5ib29raW5nSWQgfHwgJycpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgfVxuXG4gIGdldFJlZnVuZERldGFpbHMoXG4gICAgcGFja2FnZUlkczogc3RyaW5nW10gPSBbXVxuICApOiBPYnNlcnZhYmxlPElSZWZ1bmREZXRhaWxzQXBpUmVzcG9uc2U+IHtcbiAgICBjb25zdCBlbmRwb2ludCA9IEFsbWF0YXJIb3RlbEF1dG9DYW5jZWxsYXRpb25FbmRwb2ludHNFbnVtLmdldFJlZnVuZERldGFpbHM7XG5cbiAgICBjb25zdCBwYXlsb2FkOiBJUmVmdW5kRGV0YWlsc1JlcXVlc3QgPSB7XG4gICAgICBib29raW5nSWQ6IGAke1xuICAgICAgICB0aGlzLmhvdGVsTWFuYWdlQm9va2luZ1NlcnZpY2Uuc2VsZWN0ZWRIb3RlbEJvb2tpbmcudmFsdWU/LmJvb2tpbmdJZCB8fFxuICAgICAgICAnJ1xuICAgICAgfWAsXG4gICAgICBwcm9kdWN0OiAnaG90ZWxzJyxcbiAgICAgIHBhY2thZ2VJZHM6IFsuLi5uZXcgU2V0KHBhY2thZ2VJZHMpXSAvLyBFbnN1cmUgdW5pcXVlIHBhY2thZ2UgSURzXG4gICAgfTtcblxuICAgIC8vIHJldHVybiBvZih7XG4gICAgLy8gICBkYXRhOiB7XG4gICAgLy8gICAgIGJvb2tpbmdJZDogMTQ0MzY4LFxuICAgIC8vICAgICBjdXJyZW5jeTogJ1NBUicsXG4gICAgLy8gICAgIHN0YXR1czogJ1BhcnRpYWxseSByZWZ1bmRlZCcsXG4gICAgLy8gICAgIG1lc3NhZ2U6ICdSZWZ1bmQgZGV0YWlscyBjYWxjdWxhdGVkIHN1Y2Nlc3NmdWxseScsXG4gICAgLy8gICAgIGZsYWdzOiB7XG4gICAgLy8gICAgICAgcmVmdW5kYWJsZTogdHJ1ZSxcbiAgICAvLyAgICAgICBwYXJ0aWFsOiBmYWxzZSxcbiAgICAvLyAgICAgICBnb2xkZW5HaWZ0OiBmYWxzZVxuICAgIC8vICAgICB9LFxuICAgIC8vICAgICBzZWxlY3Rpb246IHtcbiAgICAvLyAgICAgICBwYWNrYWdlSWRzOiBbJ2YwMzgzOGJkLWVhOGQtNGZlNS1iZmM4LWRkMzFjOWJkZWU5NSddXG4gICAgLy8gICAgIH0sXG4gICAgLy8gICAgIHRvdGFsczoge1xuICAgIC8vICAgICAgIHBhaWQ6IDY4NjYsXG4gICAgLy8gICAgICAgYmVmb3JlQ291cG9uOiA2ODY1LjYxLFxuICAgIC8vICAgICAgIHJvb21zQm9va2VkOiA0LFxuICAgIC8vICAgICAgIGNvdXBvbjogMCxcbiAgICAvLyAgICAgICBnaWZ0czogMCxcbiAgICAvLyAgICAgICBzZXJ2aWNlRmVlOiAwLFxuICAgIC8vICAgICAgIHdhbGxldDogMCxcbiAgICAvLyAgICAgICBjYXJkOiAwLFxuICAgIC8vICAgICAgIHRhYmJ5OiAwLFxuICAgIC8vICAgICAgIHRhbWFyYTogMjIwLFxuICAgIC8vICAgICAgIG1va2FmYTogMCxcbiAgICAvLyAgICAgICBxaXRhZjogMCxcbiAgICAvLyAgICAgICB3YWxhOiAwLFxuICAgIC8vICAgICAgIGhhc3NhZDogMCxcbiAgICAvLyAgICAgICBhbmI6IDAsXG4gICAgLy8gICAgICAgeWdnOiAwXG4gICAgLy8gICAgIH0sXG4gICAgLy8gICAgIHByZXZpb3VzOiBbXG4gICAgLy8gICAgICAge1xuICAgIC8vICAgICAgICAgcGFja2FnZUlkOiAnNWViMzNkNTktMjYwNy00MDU3LTlkMjYtNGY3YmU3NDVmNjdmJyxcbiAgICAvLyAgICAgICAgIHJvb21OYW1lOiAnU3RhbmRhcmQgUm9vbScsXG4gICAgLy8gICAgICAgICBjYW5jZWxsZWRBdDogJzIwMjYtMDktMDJUMTM6NDI6NTQuODQ4WicsXG4gICAgLy8gICAgICAgICBhbW91bnQ6IDI5OTAuNzksXG4gICAgLy8gICAgICAgICBmZWU6IDAsXG4gICAgLy8gICAgICAgICByZWZ1bmRlZDogMjk5MC43OVxuICAgIC8vICAgICAgIH1cbiAgICAvLyAgICAgXSxcbiAgICAvLyAgICAgY3VycmVudDoge1xuICAgIC8vICAgICAgIHJvb21zOiBbXG4gICAgLy8gICAgICAgICB7XG4gICAgLy8gICAgICAgICAgIHBhY2thZ2VJZDogJ2YwMzgzOGJkLWVhOGQtNGZlNS1iZmM4LWRkMzFjOWJkZWU5NScsXG4gICAgLy8gICAgICAgICAgIHJvb21JZDogJzAyMjllNjIyLWE4OWEtNDY5ZC1hZGI4LTg2MTVkZWI5NzFjYScsXG4gICAgLy8gICAgICAgICAgIHJvb21OYW1lOiAnU2NlbmUgUm9vbSBUd2luJyxcbiAgICAvLyAgICAgICAgICAgYmFzaXM6ICdSb29tIG9ubHkgUk8nLFxuICAgIC8vICAgICAgICAgICBwYXg6IHtcbiAgICAvLyAgICAgICAgICAgICBhZHVsdHM6IDIsXG4gICAgLy8gICAgICAgICAgICAgY2hpbGRyZW46IDAsXG4gICAgLy8gICAgICAgICAgICAgdG90YWw6IDJcbiAgICAvLyAgICAgICAgICAgfSxcbiAgICAvLyAgICAgICAgICAgbmlnaHRzOiA0LFxuICAgIC8vICAgICAgICAgICBhbW91bnQ6IDE4ODcuNjEsXG4gICAgLy8gICAgICAgICAgIGZlZTogMCxcbiAgICAvLyAgICAgICAgICAgc2VydmljZUZlZTogNTAsXG4gICAgLy8gICAgICAgICAgIHJlZnVuZDogMTg4Ny42MSxcbiAgICAvLyAgICAgICAgICAgcmVmdW5kYWJsZTogdHJ1ZSxcbiAgICAvLyAgICAgICAgICAgcm91dGU6ICdBVVRPJ1xuICAgIC8vICAgICAgICAgfSxcbiAgICAvLyAgICAgICAgIHtcbiAgICAvLyAgICAgICAgICAgcGFja2FnZUlkOiAnZjAzODM4YmQtZWE4ZC00ZmU1LWJmYzgtZGQzMWM5YmRlZTk1JyxcbiAgICAvLyAgICAgICAgICAgcm9vbUlkOiAnYjhhZWQyNmUtZDkxYS00MjM0LWFlMzctOTRiMmM2MjMyZGJkJyxcbiAgICAvLyAgICAgICAgICAgcm9vbU5hbWU6ICdTY2VuZSBSb29tIFR3aW4nLFxuICAgIC8vICAgICAgICAgICBiYXNpczogJ1Jvb20gb25seSBSTycsXG4gICAgLy8gICAgICAgICAgIHBheDoge1xuICAgIC8vICAgICAgICAgICAgIGFkdWx0czogMixcbiAgICAvLyAgICAgICAgICAgICBjaGlsZHJlbjogMCxcbiAgICAvLyAgICAgICAgICAgICB0b3RhbDogMlxuICAgIC8vICAgICAgICAgICB9LFxuICAgIC8vICAgICAgICAgICBuaWdodHM6IDQsXG4gICAgLy8gICAgICAgICAgIGFtb3VudDogMTg4Ny42LFxuICAgIC8vICAgICAgICAgICBmZWU6IDAsXG4gICAgLy8gICAgICAgICAgIHNlcnZpY2VGZWU6IDUwLFxuICAgIC8vICAgICAgICAgICByZWZ1bmQ6IDE4ODcuNixcbiAgICAvLyAgICAgICAgICAgcmVmdW5kYWJsZTogdHJ1ZSxcbiAgICAvLyAgICAgICAgICAgcm91dGU6ICdBVVRPJ1xuICAgIC8vICAgICAgICAgfVxuICAgIC8vICAgICAgIF0sXG4gICAgLy8gICAgICAgYW1vdW50OiAzNzc1LjIxLFxuICAgIC8vICAgICAgIGZlZTogMCxcbiAgICAvLyAgICAgICBzdXJjaGFyZ2U6IDAsXG4gICAgLy8gICAgICAgcmVmdW5kOiAzNzc1LjIxXG4gICAgLy8gICAgIH0sXG4gICAgLy8gICAgIHBheW91dDoge1xuICAgIC8vICAgICAgIGFscmVhZHlSZWZ1bmRlZDogMjk5MC43OSxcbiAgICAvLyAgICAgICBjdXJyZW50OiAxNjAwLFxuICAgIC8vICAgICAgIGFmdGVyVGhpczogNjc2NixcbiAgICAvLyAgICAgICBmZWVzVG90YWw6IDAsXG4gICAgLy8gICAgICAgd2FsbGV0OiAwLFxuICAgIC8vICAgICAgIGNhcmQ6IDAsXG4gICAgLy8gICAgICAgdGFiYnk6IDAsXG4gICAgLy8gICAgICAgdGFtYXJhOiAyMDAsXG4gICAgLy8gICAgICAgYW13YWw6IDAsXG4gICAgLy8gICAgICAgbWlzOiAwLFxuICAgIC8vICAgICAgIGJucGxNYW51YWw6IDAsXG4gICAgLy8gICAgICAgbG95YWx0eVRvV2FsbGV0OiA2MDAsXG4gICAgLy8gICAgICAgbm90ZTogbnVsbFxuICAgIC8vICAgICB9LFxuICAgIC8vICAgICBzdW1tYXJpZXM6IFtcbiAgICAvLyAgICAgICB7XG4gICAgLy8gICAgICAgICBjb2RlOiAnQ0FSRCcsXG4gICAgLy8gICAgICAgICBsYWJlbDogJ0NhcmQnLFxuICAgIC8vICAgICAgICAgcGFpZDogNjg2NixcbiAgICAvLyAgICAgICAgIHJlZnVuZDogMzc3NS4yMSxcbiAgICAvLyAgICAgICAgIHJlZnVuZGFibGU6IHRydWUsXG4gICAgLy8gICAgICAgICBnYXRld2F5OiAnQ0gnXG4gICAgLy8gICAgICAgfSxcbiAgICAvLyAgICAgICB7XG4gICAgLy8gICAgICAgICBjb2RlOiAnU0VSVklDRV9GRUUnLFxuICAgIC8vICAgICAgICAgbGFiZWw6ICdTZXJ2aWNlIEZlZScsXG4gICAgLy8gICAgICAgICBwYWlkOiAxMDAsXG4gICAgLy8gICAgICAgICByZWZ1bmQ6IDAsXG4gICAgLy8gICAgICAgICByZWZ1bmRhYmxlOiBmYWxzZVxuICAgIC8vICAgICAgIH1cbiAgICAvLyAgICAgXSxcbiAgICAvLyAgICAgZ2lmdHM6IFtdXG4gICAgLy8gICB9LFxuICAgIC8vICAgc3RhdHVzOiAyMDAsXG4gICAgLy8gICBlcnJvcnM6IG51bGxcbiAgICAvLyB9KTtcblxuICAgIHJldHVybiB0aGlzLmFwaVxuICAgICAgLnBvc3Q8SVJlZnVuZERldGFpbHNBcGlSZXNwb25zZT4oe1xuICAgICAgICBlbmRwb2ludCxcbiAgICAgICAgLi4ucGF5bG9hZFxuICAgICAgfSlcbiAgICAgIC5waXBlKFxuICAgICAgICBjYXRjaEVycm9yKChlcnJvcikgPT5cbiAgICAgICAgICB0aGlzLmhhbmRsZUVycm9yKGVycm9yLCAnRmFpbGVkIHRvIGdldCByZWZ1bmQgZGV0YWlscycpXG4gICAgICAgIClcbiAgICAgICk7XG4gIH1cblxuICBtYXBBcGlSZXNwb25zZVRvUm9vbXMoXG4gICAgZGF0YTogSVJlZnVuZERldGFpbHNEYXRhXG4gICk6IElBbG1hdGFySG90ZWxBdXRvQ2FuY2VsbGF0aW9uUm9vbVtdIHtcbiAgICByZXR1cm4gdGhpcy5nZXRBbGxSb29tcyhkYXRhKTtcbiAgfVxuXG4gIG1hcEFwaVJlc3BvbnNlVG9SZWZ1bmRTdW1tYXJ5KFxuICAgIGRhdGE6IElSZWZ1bmREZXRhaWxzRGF0YVxuICApOiBJQWxtYXRhckhvdGVsQXV0b0NhbmNlbGxhdGlvblJlZnVuZFN1bW1hcnkge1xuICAgIHJldHVybiB7XG4gICAgICB0b3RhbFBhaWQ6IGRhdGEudG90YWxzPy5wYWlkIHx8IDAsXG4gICAgICB0b3RhbFJlZnVuZDogZGF0YS5jdXJyZW50Py5yZWZ1bmQgfHwgZGF0YS5jdXJyZW50Py5yZWZ1bmQgfHwgMCxcbiAgICAgIHRvdGFsRmVlczogZGF0YS5jdXJyZW50Py5mZWUgfHwgMCxcbiAgICAgIHJvb21zOiB0aGlzLmdldEFsbFJvb21zKGRhdGEpLFxuICAgICAgcGFja2FnZXM6IHRoaXMuZ2V0QWxsUGFja2FnZXMoZGF0YSksXG4gICAgICBzdW1tYXJpZXM6IGRhdGEuc3VtbWFyaWVzLFxuICAgICAgcGF5b3V0OiBkYXRhLnBheW91dCxcbiAgICAgIHRvdGFsczogZGF0YS50b3RhbHMsXG4gICAgICAvLyBBZGRpdGlvbmFsIGJyZWFrZG93biBmaWVsZHNcbiAgICAgIGNvdXBvbjogZGF0YS50b3RhbHM/LmNvdXBvbiB8fCAwLFxuICAgICAgZ2lmdHNUb3RhbDogZGF0YS50b3RhbHM/LmdpZnRzIHx8IDAsXG4gICAgICBnaWZ0c0RldGFpbHM6IGRhdGEuZ2lmdHMgfHwgW10sXG4gICAgICBzZXJ2aWNlRmVlOiBkYXRhLnRvdGFscz8uc2VydmljZUZlZSB8fCAwLFxuICAgICAgc3VyY2hhcmdlOiBkYXRhLmN1cnJlbnQ/LnN1cmNoYXJnZSB8fCAwLFxuICAgICAgZ29sZGVuR2lmdDogZGF0YS5mbGFncz8uZ29sZGVuR2lmdCB8fCBmYWxzZSxcbiAgICAgIHByZXZpb3VzUm9vbXM6IGRhdGEucHJldmlvdXMgfHwgW11cbiAgICB9O1xuICB9XG5cbiAgZ2V0QWxsUGFja2FnZXMoXG4gICAgZGF0YTogSVJlZnVuZERldGFpbHNEYXRhXG4gICk6IElBbG1hdGFySG90ZWxBdXRvQ2FuY2VsbGF0aW9uUmVmdW5kUGFja2FnZVtdIHtcbiAgICBjb25zdCBwYWNrYWdlczogSUFsbWF0YXJIb3RlbEF1dG9DYW5jZWxsYXRpb25SZWZ1bmRQYWNrYWdlW10gPSBbXTtcbiAgICBjb25zdCBwYWNrYWdlTWFwID0gbmV3IE1hcDxcbiAgICAgIHN0cmluZyxcbiAgICAgIElBbG1hdGFySG90ZWxBdXRvQ2FuY2VsbGF0aW9uUmVmdW5kUGFja2FnZVxuICAgID4oKTtcblxuICAgIC8vIFByb2Nlc3MgcHJldmlvdXMgKGNhbmNlbGxlZCkgcm9vbXMgLSBncm91cCBieSBwYWNrYWdlSWRcbiAgICBpZiAoZGF0YS5wcmV2aW91cz8ubGVuZ3RoKSB7XG4gICAgICBkYXRhLnByZXZpb3VzLmZvckVhY2goKHJvb206IGFueSkgPT4ge1xuICAgICAgICBjb25zdCBleGlzdGluZ1BrZyA9IHBhY2thZ2VNYXAuZ2V0KHJvb20ucGFja2FnZUlkKTtcbiAgICAgICAgaWYgKGV4aXN0aW5nUGtnKSB7XG4gICAgICAgICAgZXhpc3RpbmdQa2cucm9vbXMucHVzaCh7XG4gICAgICAgICAgICByb29tSWQ6IHJvb20ucm9vbUlkIHx8IHJvb20ucGFja2FnZUlkLFxuICAgICAgICAgICAgcm9vbU5hbWU6IHJvb20ucm9vbU5hbWUsXG4gICAgICAgICAgICBiYXNpczogcm9vbS5iYXNpcyxcbiAgICAgICAgICAgIG5pZ2h0czogcm9vbS5uaWdodHNcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBleGlzdGluZ1BrZy5hbW91bnQgKz0gcm9vbS5hbW91bnQgfHwgMDtcbiAgICAgICAgICBleGlzdGluZ1BrZy5mZWUgKz0gcm9vbS5mZWUgfHwgMDtcbiAgICAgICAgICBleGlzdGluZ1BrZy5yZWZ1bmQgKz0gcm9vbS5yZWZ1bmRlZCB8fCAwO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHBhY2thZ2VNYXAuc2V0KHJvb20ucGFja2FnZUlkLCB7XG4gICAgICAgICAgICBwYWNrYWdlSWQ6IHJvb20ucGFja2FnZUlkLFxuICAgICAgICAgICAgcGFja2FnZU5hbWU6IHJvb20ucm9vbU5hbWUsXG4gICAgICAgICAgICByb29tczogW1xuICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgcm9vbUlkOiByb29tLnJvb21JZCB8fCByb29tLnBhY2thZ2VJZCxcbiAgICAgICAgICAgICAgICByb29tTmFtZTogcm9vbS5yb29tTmFtZSxcbiAgICAgICAgICAgICAgICBiYXNpczogcm9vbS5iYXNpcyxcbiAgICAgICAgICAgICAgICBuaWdodHM6IHJvb20ubmlnaHRzXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICBhbW91bnQ6IHJvb20uYW1vdW50IHx8IDAsXG4gICAgICAgICAgICBmZWU6IHJvb20uZmVlIHx8IDAsXG4gICAgICAgICAgICBzZXJ2aWNlRmVlOiAwLFxuICAgICAgICAgICAgcmVmdW5kOiByb29tLnJlZnVuZGVkIHx8IDAsXG4gICAgICAgICAgICByZWZ1bmRhYmxlOiBmYWxzZSxcbiAgICAgICAgICAgIGNhbmNlbGxlZEJlZm9yZTogdHJ1ZSxcbiAgICAgICAgICAgIGNhbmNlbGxhdGlvbkRhdGU6IHJvb20uY2FuY2VsbGVkQXRcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgLy8gUHJvY2VzcyBjdXJyZW50IHJvb21zIC0gZ3JvdXAgYnkgcGFja2FnZUlkXG4gICAgaWYgKGRhdGEuY3VycmVudD8ucm9vbXM/Lmxlbmd0aCkge1xuICAgICAgZGF0YS5jdXJyZW50LnJvb21zLmZvckVhY2goKHJvb206IGFueSkgPT4ge1xuICAgICAgICBjb25zdCBleGlzdGluZ1BrZyA9IHBhY2thZ2VNYXAuZ2V0KHJvb20ucGFja2FnZUlkKTtcbiAgICAgICAgaWYgKGV4aXN0aW5nUGtnICYmICFleGlzdGluZ1BrZy5jYW5jZWxsZWRCZWZvcmUpIHtcbiAgICAgICAgICBleGlzdGluZ1BrZy5yb29tcy5wdXNoKHtcbiAgICAgICAgICAgIHJvb21JZDogcm9vbS5yb29tSWQgfHwgcm9vbS5wYWNrYWdlSWQsXG4gICAgICAgICAgICByb29tTmFtZTogcm9vbS5yb29tTmFtZSxcbiAgICAgICAgICAgIGJhc2lzOiByb29tLmJhc2lzLFxuICAgICAgICAgICAgbmlnaHRzOiByb29tLm5pZ2h0cyxcbiAgICAgICAgICAgIHBheDogcm9vbS5wYXgsXG4gICAgICAgICAgICBhZHVsdHM6IHJvb20ucGF4Py5hZHVsdHMsXG4gICAgICAgICAgICBjaGlsZHJlbjogcm9vbS5wYXg/LmNoaWxkcmVuXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgZXhpc3RpbmdQa2cuYW1vdW50ICs9IHJvb20uYW1vdW50IHx8IDA7XG4gICAgICAgICAgZXhpc3RpbmdQa2cuZmVlICs9IHJvb20uZmVlIHx8IDA7XG4gICAgICAgICAgZXhpc3RpbmdQa2cuc2VydmljZUZlZSArPSByb29tLnNlcnZpY2VGZWUgfHwgMDtcbiAgICAgICAgICBleGlzdGluZ1BrZy5yZWZ1bmQgKz0gcm9vbS5yZWZ1bmQgfHwgMDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBwYWNrYWdlTWFwLnNldChyb29tLnBhY2thZ2VJZCwge1xuICAgICAgICAgICAgcGFja2FnZUlkOiByb29tLnBhY2thZ2VJZCxcbiAgICAgICAgICAgIHBhY2thZ2VOYW1lOiByb29tLnJvb21OYW1lLFxuICAgICAgICAgICAgcm9vbXM6IFtcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHJvb21JZDogcm9vbS5yb29tSWQgfHwgcm9vbS5wYWNrYWdlSWQsXG4gICAgICAgICAgICAgICAgcm9vbU5hbWU6IHJvb20ucm9vbU5hbWUsXG4gICAgICAgICAgICAgICAgYmFzaXM6IHJvb20uYmFzaXMsXG4gICAgICAgICAgICAgICAgbmlnaHRzOiByb29tLm5pZ2h0cyxcbiAgICAgICAgICAgICAgICBwYXg6IHJvb20ucGF4LFxuICAgICAgICAgICAgICAgIGFkdWx0czogcm9vbS5wYXg/LmFkdWx0cyxcbiAgICAgICAgICAgICAgICBjaGlsZHJlbjogcm9vbS5wYXg/LmNoaWxkcmVuXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICBhbW91bnQ6IHJvb20uYW1vdW50IHx8IDAsXG4gICAgICAgICAgICBmZWU6IHJvb20uZmVlIHx8IDAsXG4gICAgICAgICAgICBzZXJ2aWNlRmVlOiByb29tLnNlcnZpY2VGZWUgfHwgMCxcbiAgICAgICAgICAgIHJlZnVuZDogcm9vbS5yZWZ1bmQgfHwgMCxcbiAgICAgICAgICAgIHJlZnVuZGFibGU6IHJvb20ucmVmdW5kYWJsZSxcbiAgICAgICAgICAgIHJvdXRlOiByb29tLnJvdXRlLFxuICAgICAgICAgICAgY2FuY2VsbGVkQmVmb3JlOiBmYWxzZSxcbiAgICAgICAgICAgIGNhbmNlbGxhdGlvbkRhdGU6IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKVxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBwYWNrYWdlTWFwLmZvckVhY2goKHBrZykgPT4gcGFja2FnZXMucHVzaChwa2cpKTtcbiAgICByZXR1cm4gcGFja2FnZXM7XG4gIH1cblxuICBnZXRBbGxSb29tcyhkYXRhOiBJUmVmdW5kRGV0YWlsc0RhdGEpOiBJQWxtYXRhckhvdGVsQXV0b0NhbmNlbGxhdGlvblJvb21bXSB7XG4gICAgY29uc3QgYWxsUm9vbXM6IElBbG1hdGFySG90ZWxBdXRvQ2FuY2VsbGF0aW9uUm9vbVtdID0gW107XG5cbiAgICBpZiAoZGF0YS5wcmV2aW91cz8ubGVuZ3RoKSB7XG4gICAgICBkYXRhLnByZXZpb3VzLmZvckVhY2goKHJvb20pID0+IHtcbiAgICAgICAgYWxsUm9vbXMucHVzaCh7XG4gICAgICAgICAgcGFja2FnZUlkOiByb29tLnBhY2thZ2VJZCxcbiAgICAgICAgICByb29tSWQ6IHJvb20/LnJvb21JZCxcbiAgICAgICAgICByb29tTmFtZTogcm9vbS5yb29tTmFtZSxcbiAgICAgICAgICBpc1JlZnVuZGFibGU6IGZhbHNlLFxuICAgICAgICAgIGlzU2VsZWN0ZWQ6IGZhbHNlLFxuICAgICAgICAgIGNhbmNlbGxlZEJlZm9yZTogdHJ1ZSxcbiAgICAgICAgICByb29tQW1vdW50OiByb29tLmFtb3VudCxcbiAgICAgICAgICBjYW5jZWxsYXRpb25GZWU6IHJvb20uZmVlLFxuICAgICAgICAgIHJlZnVuZEFtb3VudDogcm9vbS5yZWZ1bmRlZCxcbiAgICAgICAgICBjdXJyZW50Q2FuY2VsbGF0aW9uOiBmYWxzZSxcbiAgICAgICAgICBjYW5jZWxsYXRpb25EYXRlOiByb29tLmNhbmNlbGxlZEF0LFxuICAgICAgICAgIG5pZ2h0czogcm9vbS5uaWdodHMgPz8gMVxuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGlmIChkYXRhLmN1cnJlbnQ/LnJvb21zPy5sZW5ndGgpIHtcbiAgICAgIGRhdGEuY3VycmVudC5yb29tcy5mb3JFYWNoKChyb29tKSA9PiB7XG4gICAgICAgIGFsbFJvb21zLnB1c2goe1xuICAgICAgICAgIHBhY2thZ2VJZDogcm9vbS5wYWNrYWdlSWQsXG4gICAgICAgICAgcm9vbUlkOiByb29tPy5yb29tSWQsXG4gICAgICAgICAgcm9vbU5hbWU6IHJvb20ucm9vbU5hbWUsXG4gICAgICAgICAgaXNSZWZ1bmRhYmxlOiByb29tLnJlZnVuZGFibGUsXG4gICAgICAgICAgaXNTZWxlY3RlZDogZmFsc2UsXG4gICAgICAgICAgcm9vbUFtb3VudDogcm9vbS5hbW91bnQsXG4gICAgICAgICAgY2FuY2VsbGF0aW9uRmVlOiByb29tLmZlZSxcbiAgICAgICAgICBjYW5jZWxsZWRCZWZvcmU6IGZhbHNlLFxuICAgICAgICAgIHJlZnVuZEFtb3VudDogcm9vbS5yZWZ1bmQsXG4gICAgICAgICAgcm91dGU6IHJvb20ucm91dGUsXG4gICAgICAgICAgY3VycmVudENhbmNlbGxhdGlvbjogdHJ1ZSxcbiAgICAgICAgICBjYW5jZWxsYXRpb25EYXRlOiBgJHtuZXcgRGF0ZSgpfWAsXG4gICAgICAgICAgbmlnaHRzOiByb29tLm5pZ2h0cyA/PyAxXG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGFsbFJvb21zO1xuICB9XG5cbiAgcHJvY2Vzc0F1dG9DYW5jZWxsYXRpb24oXG4gICAgcGFja2FnZUlkczogc3RyaW5nW10sXG4gICAgcmVmdW5kT3B0aW9uID0gJ29yaWdpbmFsUGF5bWVudE1ldGhvZCdcbiAgKTogT2JzZXJ2YWJsZTxJQXV0b0NhbmNlbGxhdGlvblByb2Nlc3NSZXNwb25zZT4ge1xuICAgIGNvbnN0IGVuZHBvaW50ID0gXG4gICAgICAgQWxtYXRhckhvdGVsQXV0b0NhbmNlbGxhdGlvbkVuZHBvaW50c0VudW0ucHJvY2Vzc0F1dG9DYW5jZWxsYXRpb247XG5cbiAgICBjb25zdCB1bmlxdWVQYWNrYWdlSWRzID0gWy4uLm5ldyBTZXQocGFja2FnZUlkcyldOyAvLyBFbnN1cmUgdW5pcXVlIHBhY2thZ2UgSURzXG4gICAgY29uc3QgcGF5bG9hZDogSVByb2Nlc3NDYW5jZWxsYXRpb25SZXF1ZXN0ID0ge1xuICAgICAgYm9va2luZ0lkOiBgJHtcbiAgICAgICAgdGhpcy5ob3RlbE1hbmFnZUJvb2tpbmdTZXJ2aWNlLnNlbGVjdGVkSG90ZWxCb29raW5nLnZhbHVlPy5ib29raW5nSWQgfHxcbiAgICAgICAgJydcbiAgICAgIH1gLFxuICAgICAgcHJvZHVjdDogJ2hvdGVscycsXG4gICAgICBwYWNrYWdlSWRzOiB1bmlxdWVQYWNrYWdlSWRzLFxuICAgICAgcHJlZmVycmVkUGF5bWVudE1ldGhvZDogcmVmdW5kT3B0aW9uXG4gICAgfTtcblxuICAgIHRoaXMuX3NlbGVjdGVkUGFja2FnZUlkcy5zZXQodW5pcXVlUGFja2FnZUlkcyk7XG5cbiAgICAvLyByZXR1cm4gb2Yoe1xuICAgIC8vICAgZGF0YToge1xuICAgIC8vICAgICBlcnJvcjogJzEnLFxuICAgIC8vICAgICBtZXNzYWdlOlxuICAgIC8vICAgICAgICdDYW5jZWwgcmVxdWVzdGVkIOKAlCBzdXBwbGllciBjYW5jZWxsYXRpb24gZmFpbGVkOyB0aWNrZXQgY3JlYXRlZCcsXG4gICAgLy8gICAgIGJvb2tpbmdJZDogMTQ0MzY4LFxuICAgIC8vICAgICBwcmVmZXJyZWRQYXltZW50TWV0aG9kOiAnd2FsbGV0JyxcbiAgICAvLyAgICAgY2FuY2VsOiB7XG4gICAgLy8gICAgICAgc3RhdHVzOiAnZmFpbGVkJyxcbiAgICAvLyAgICAgICBwYWNrYWdlSWRzOiBbJ2YwMzgzOGJkLWVhOGQtNGZlNS1iZmM4LWRkMzFjOWJkZWU5NSddLFxuICAgIC8vICAgICB9LFxuICAgIC8vICAgICByZWZ1bmQ6IHtcbiAgICAvLyAgICAgICBzdGF0dXM6ICdza2lwcGVkJyxcbiAgICAvLyAgICAgICBib29raW5nU3RhdHVzOiAnQ2FuY2VsbGVkJyxcbiAgICAvLyAgICAgICBhbW91bnQ6IDEwNTAsXG4gICAgLy8gICAgICAgY3VycmVuY3k6ICdTQVInLFxuICAgIC8vICAgICAgIGJyZWFrZG93bjoge1xuICAgIC8vICAgICAgICAgd2FsbGV0OiA3NTAsXG4gICAgLy8gICAgICAgICBtb2thZmE6IDIwMCxcbiAgICAvLyAgICAgICAgIHFpdGFmOiAxMDAsXG4gICAgLy8gICAgICAgICBjYXJkOiAwLFxuICAgIC8vICAgICAgICAgdGFiYnk6IDAsXG4gICAgLy8gICAgICAgICB0YW1hcmE6IDAsXG4gICAgLy8gICAgICAgfSxcbiAgICAvLyAgICAgfSxcbiAgICAvLyAgIH0sXG4gICAgLy8gICBzdGF0dXM6IDIwMCxcbiAgICAvLyAgIGVycm9yczogbnVsbCxcbiAgICAvLyB9KTtcblxuICAgIHJldHVybiB0aGlzLmFwaVxuICAgICAgLnBvc3Q8SUF1dG9DYW5jZWxsYXRpb25Qcm9jZXNzUmVzcG9uc2U+KHtcbiAgICAgICAgZW5kcG9pbnQsXG4gICAgICAgIC4uLnBheWxvYWRcbiAgICAgIH0pXG4gICAgICAucGlwZShcbiAgICAgICAgbWFwKChyZXNwb25zZSkgPT4ge1xuICAgICAgICAgIHRoaXMuX3NlbGVjdGVkUGFja2FnZUlkcy5zZXQoW10pO1xuICAgICAgICAgIHJldHVybiByZXNwb25zZTtcbiAgICAgICAgfSksXG4gICAgICAgIGNhdGNoRXJyb3IoKGVycm9yKSA9PlxuICAgICAgICAgIHRoaXMuaGFuZGxlRXJyb3IoZXJyb3IsICdGYWlsZWQgdG8gcHJvY2VzcyBjYW5jZWxsYXRpb24nKVxuICAgICAgICApXG4gICAgICApO1xuICB9XG5cbiAgcHJvY2Vzc05vblJlZnVuZGFibGVDYW5jZWxsYXRpb24oXG4gICAgcGFja2FnZUlkOiBzdHJpbmcsXG4gICAgYXR0YWNobWVudFVybDogc3RyaW5nLFxuICAgIGxhbmd1YWdlID0gJ2VuJ1xuICApOiBPYnNlcnZhYmxlPElBdXRvQ2FuY2VsbGF0aW9uUHJvY2Vzc1Jlc3BvbnNlPiB7XG4gICAgY29uc3QgZW5kcG9pbnQgPVxuICAgICAgQWxtYXRhckhvdGVsQXV0b0NhbmNlbGxhdGlvbkVuZHBvaW50c0VudW0ucHJvY2Vzc0F1dG9DYW5jZWxsYXRpb247XG5cbiAgICBjb25zdCBwYXlsb2FkOiBJUHJvY2Vzc05vblJlZnVuZGFibGVDYW5jZWxsYXRpb25SZXF1ZXN0ID0ge1xuICAgICAgYm9va2luZ0lkOiBgJHtcbiAgICAgICAgdGhpcy5ob3RlbE1hbmFnZUJvb2tpbmdTZXJ2aWNlLnNlbGVjdGVkSG90ZWxCb29raW5nLnZhbHVlPy5ib29raW5nSWQgfHxcbiAgICAgICAgJydcbiAgICAgIH1gLFxuICAgICAgcHJvZHVjdDogJ2hvdGVscycsXG4gICAgICBwYWNrYWdlSWRzOiBbcGFja2FnZUlkXSxcbiAgICAgIHByZWZlcnJlZFBheW1lbnRNZXRob2Q6ICdvcmlnaW5hbFBheW1lbnRNZXRob2QnLFxuICAgICAgcHJvY2Vzc2VkTW9kZTogJ2F1dG8nLFxuICAgICAgbGFuZ3VhZ2UsXG4gICAgICBhdHRhY2htZW50VXJsXG4gICAgfTtcblxuICAgIHJldHVybiB0aGlzLmFwaVxuICAgICAgLnBvc3Q8SUF1dG9DYW5jZWxsYXRpb25Qcm9jZXNzUmVzcG9uc2U+KHtcbiAgICAgICAgZW5kcG9pbnQsXG4gICAgICAgIC4uLnBheWxvYWRcbiAgICAgIH0pXG4gICAgICAucGlwZShcbiAgICAgICAgY2F0Y2hFcnJvcigoZXJyb3IpID0+XG4gICAgICAgICAgdGhpcy5oYW5kbGVFcnJvcihcbiAgICAgICAgICAgIGVycm9yLFxuICAgICAgICAgICAgJ0ZhaWxlZCB0byBwcm9jZXNzIG5vbi1yZWZ1bmRhYmxlIGNhbmNlbGxhdGlvbidcbiAgICAgICAgICApXG4gICAgICAgIClcbiAgICAgICk7XG4gIH1cblxuICBjYWxjdWxhdGVMb2NhbFJlZnVuZFN1bW1hcnkoXG4gICAgcm9vbXM6IElBbG1hdGFySG90ZWxBdXRvQ2FuY2VsbGF0aW9uUm9vbVtdXG4gICk6IElBbG1hdGFySG90ZWxBdXRvQ2FuY2VsbGF0aW9uUmVmdW5kU3VtbWFyeSB7XG4gICAgY29uc3Qgc2VsZWN0ZWRSb29tcyA9IHJvb21zLmZpbHRlcigocm9vbSkgPT4gcm9vbS5pc1NlbGVjdGVkKTtcbiAgICBjb25zdCB0b3RhbFBhaWQgPSByb29tcy5yZWR1Y2UoKHN1bSwgcm9vbSkgPT4gc3VtICsgcm9vbS5yb29tQW1vdW50LCAwKTtcbiAgICBjb25zdCB0b3RhbFJlZnVuZCA9IHNlbGVjdGVkUm9vbXMucmVkdWNlKFxuICAgICAgKHN1bSwgcm9vbSkgPT4gc3VtICsgcm9vbS5yZWZ1bmRBbW91bnQsXG4gICAgICAwXG4gICAgKTtcblxuICAgIHJldHVybiB7XG4gICAgICB0b3RhbFBhaWQsXG4gICAgICB0b3RhbFJlZnVuZCxcbiAgICAgIHJvb21zOiBzZWxlY3RlZFJvb21zLm1hcCgocm9vbSkgPT4gKHtcbiAgICAgICAgLi4ucm9vbSxcbiAgICAgICAgY3VycmVudENhbmNlbGxhdGlvbjogdHJ1ZSxcbiAgICAgICAgY2FuY2VsbGF0aW9uRGF0ZTogbmV3IERhdGUoKS50b0lTT1N0cmluZygpXG4gICAgICB9KSlcbiAgICB9O1xuICB9XG5cbiAgZ2V0U2VsZWN0ZWRQYWNrYWdlSWRzKCk6IHN0cmluZ1tdIHtcbiAgICByZXR1cm4gdGhpcy5fc2VsZWN0ZWRQYWNrYWdlSWRzKCk7XG4gIH1cblxuICBjbGVhclNlbGVjdGVkUGFja2FnZUlkcygpOiB2b2lkIHtcbiAgICB0aGlzLl9zZWxlY3RlZFBhY2thZ2VJZHMuc2V0KFtdKTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0RW50cnlTb3VyY2VEZXZpY2VCcmFuZCgpOiBJRW50cnlTb3VyY2VEZXZpY2VCcmFuZCB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGVudHJ5U291cmNlOiB0aGlzLmdldEVudHJ5U291cmNlKCksXG4gICAgICBkZXZpY2U6IHRoaXMuZ2V0RGV2aWNlKClcbiAgICB9O1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRFbnRyeVNvdXJjZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiByZXNvbHZlTXlUcmlwc1ZpZXdlZEVudHJ5U291cmNlRnJvbVF1ZXJ5UGFyYW1zKFxuICAgICAgdGhpcy5yb3V0ZS5zbmFwc2hvdC5xdWVyeVBhcmFtcyBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPlxuICAgICk7XG4gIH1cblxuICBwcml2YXRlIGdldERldmljZSgpOiBzdHJpbmcge1xuICAgIGxldCBkZXZpY2UgPSAnd2ViJztcbiAgICBpZiAodGhpcy5yb3V0ZS5zbmFwc2hvdC5xdWVyeVBhcmFtc1snbW9iaWxlQXV0aCddKSB7XG4gICAgICBkZXZpY2UgPSB0aGlzLnJvdXRlLnNuYXBzaG90LnF1ZXJ5UGFyYW1zWydkZXZpY2UnXSB8fCAnbW9iaWxlJztcbiAgICB9XG4gICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oJ2RldmljZVR5cGUnLCBkZXZpY2UpO1xuICAgIHJldHVybiBkZXZpY2U7XG4gIH1cblxuICBwcml2YXRlIGhhbmRsZUVycm9yKGVycm9yOiBhbnksIG1lc3NhZ2U6IHN0cmluZyk6IE9ic2VydmFibGU8bmV2ZXI+IHtcbiAgICAvLyBjb25zb2xlLmxvZyhtZXNzYWdlLCBlcnJvcik7XG4gICAgY29uc3QgZXJyb3JNZXNzYWdlID1cbiAgICAgIGVycm9yPy5lcnJvcj8ubWVzc2FnZSB8fCBlcnJvcj8ubWVzc2FnZSB8fCBtZXNzYWdlO1xuICAgIHJldHVybiB0aHJvd0Vycm9yKCgpID0+IG5ldyBFcnJvcihlcnJvck1lc3NhZ2UpKTtcbiAgfVxufVxuIl19
456
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWxtYXRhci1ob3RlbC1hdXRvLWNhbmNlbGxhdGlvbi1lbmRwb2ludHMuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3NtYXJ0LWJvb2tpbmctZGFzaGJvYXJkL3NyYy9saWIvY29tcG9uZW50cy9ob3RlbC1jYW5jZWwvc2VydmljZXMvYWxtYXRhci1ob3RlbC1hdXRvLWNhbmNlbGxhdGlvbi1lbmRwb2ludHMuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsUUFBUSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ3JFLE9BQU8sRUFBYyxHQUFHLEVBQUUsVUFBVSxFQUFFLFVBQVUsRUFBRSxFQUFFLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDbkUsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLHNDQUFzQyxDQUFDO0FBQ2xFLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxrQ0FBa0MsQ0FBQztBQUM5RCxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDakQsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLDBDQUEwQyxDQUFDO0FBQ3hFLE9BQU8sRUFBRSx5QkFBeUIsRUFBRSxNQUFNLHlFQUF5RSxDQUFDO0FBQ3BILE9BQU8sRUFBRSx5Q0FBeUMsRUFBRSxNQUFNLHlEQUF5RCxDQUFDO0FBUXBILE9BQU8sRUFBRSw4Q0FBOEMsRUFBRSxNQUFNLHFEQUFxRCxDQUFDO0FBQ3JILE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLDRCQUE0QixDQUFDOztBQStEaEUsTUFBTSxPQUFPLDRDQUE0QztJQW9CdkQ7UUFuQmlCLFFBQUcsR0FBRyxNQUFNLENBQUMsVUFBVSxDQUFDLENBQUM7UUFDekIsWUFBTyxHQUFHLE1BQU0sQ0FBQyxVQUFVLENBQUMsQ0FBQyxPQUFPLENBQUM7UUFDckMs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SixDQUFDO0lBRU8sY0FBYztRQUNwQixPQUFPLDhDQUE4QyxDQUNuRCxJQUFJLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxXQUFzQyxDQUMzRCxDQUFDO0lBQ0osQ0FBQztJQUVPLFNBQVM7UUFDZixJQUFJLE1BQU0sR0FBRyxLQUFLLENBQUM7UUFDbkIsSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxXQUFXLENBQUMsWUFBWSxDQUFDLEVBQUUsQ0FBQztZQUNsRCxNQUFNLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsV0FBVyxDQUFDLFFBQVEsQ0FBQyxJQUFJLFFBQVEsQ0FBQztRQUNqRSxDQUFDO1FBQ0QsWUFBWSxDQUFDLE9BQU8sQ0FBQyxZQUFZLEVBQUUsTUFBTSxDQUFDLENBQUM7UUFDM0MsT0FBTyxNQUFNLENBQUM7SUFDaEIsQ0FBQztJQUVPLFdBQVcsQ0FBQyxLQUFVLEVBQUUsT0FBZTtRQUM3QywrQkFBK0I7UUFDL0IsTUFBTSxZQUFZLEdBQ2hCLEtBQUssRUFBRSxLQUFLLEVBQUUsT0FBTyxJQUFJLEtBQUssRUFBRSxPQUFPLElBQUksT0FBTyxDQUFDO1FBQ3JELE9BQU8sVUFBVSxDQUFDLEdBQUcsRUFBRSxDQUFDLElBQUksS0FBSyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUM7SUFDbkQsQ0FBQzsrR0EvZ0JVLDRDQUE0QzttSEFBNUMsNENBQTRDLGNBRjNDLE1BQU07OzRGQUVQLDRDQUE0QztrQkFIeEQsVUFBVTttQkFBQztvQkFDVixVQUFVLEVBQUUsTUFBTTtpQkFDbkIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RhYmxlLCBpbmplY3QsIHNpZ25hbCwgY29tcHV0ZWQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IE9ic2VydmFibGUsIG1hcCwgY2F0Y2hFcnJvciwgdGhyb3dFcnJvciwgb2YgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IEFwaVNlcnZpY2UgfSBmcm9tICcuLi8uLi8uLi9zaGFyZWQvc2VydmljZXMvYXBpLnNlcnZpY2UnO1xuaW1wb3J0IHsgU0JEX0NPTkZJRyB9IGZyb20gJy4uLy4uLy4uL2NvbmZpZy9kYXNoYm9hcmQuY29uZmlnJztcbmltcG9ydCB7IEFjdGl2YXRlZFJvdXRlIH0gZnJvbSAnQGFuZ3VsYXIvcm91dGVyJztcbmltcG9ydCB7IGVudmlyb25tZW50cyB9IGZyb20gJy4uLy4uLy4uL3NoYXJlZC9lbnZpcm9ubWVudHMvZW52aXJvbm1lbnQnO1xuaW1wb3J0IHsgSG90ZWxNYW5hZ2VCb29raW5nU2VydmljZSB9IGZyb20gJy4uLy4uL3NoYXJlZC9zZXJ2aWNlcy9ob3RlbC1tYW5hZ2UtYm9va2luZy9ob3RlbC1tYW5hZ2UtYm9va2luZy5zZXJ2aWNlJztcbmltcG9ydCB7IEFsbWF0YXJIb3RlbEF1dG9DYW5jZWxsYXRpb25FbmRwb2ludHNFbnVtIH0gZnJvbSAnLi4vZW51bXMvYWxtYXRhci1ob3RlbC1hdXRvLWNhbmNlbGxhdGlvbi1lbmRwb2ludHMuZW51bSc7XG5pbXBvcnQge1xuICBJQWxtYXRhckhvdGVsQXV0b0NhbmNlbGxhdGlvblJvb20sXG4gIElBbG1hdGFySG90ZWxBdXRvQ2FuY2VsbGF0aW9uUmVmdW5kU3VtbWFyeSxcbiAgSUFsbWF0YXJIb3RlbEF1dG9DYW5jZWxsYXRpb25SZWZ1bmRQYWNrYWdlLFxuICBJUmVmdW5kRGV0YWlsc0FwaVJlc3BvbnNlLFxuICBJUmVmdW5kRGV0YWlsc0RhdGFcbn0gZnJvbSAnLi4vaW50ZXJmYWNlcy9pLWFsbWF0YXItaG90ZWwtYXV0by1jYW5jZWxsYXRpb24uaW50ZXJmYWNlJztcbmltcG9ydCB7IHJlc29sdmVNeVRyaXBzVmlld2VkRW50cnlTb3VyY2VGcm9tUXVlcnlQYXJhbXMgfSBmcm9tICcuLi8uLi8uLi9zaGFyZWQvc2VydmljZXMvd2ViZW5nYWdlLXRyYWNraW5nLnNlcnZpY2UnO1xuaW1wb3J0IHsgdGFrZVVudGlsRGVzdHJveWVkIH0gZnJvbSAnQGFuZ3VsYXIvY29yZS9yeGpzLWludGVyb3AnO1xuXG5leHBvcnQgaW50ZXJmYWNlIElSZWZ1bmREZXRhaWxzUmVxdWVzdCB7XG4gIGJvb2tpbmdJZDogc3RyaW5nO1xuICBwcm9kdWN0OiAnaG90ZWxzJztcbiAgcGFja2FnZUlkczogc3RyaW5nW107XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSVByb2Nlc3NDYW5jZWxsYXRpb25SZXF1ZXN0IHtcbiAgYm9va2luZ0lkOiBzdHJpbmc7XG4gIHByb2R1Y3Q6ICdob3RlbHMnO1xuICBwYWNrYWdlSWRzOiBzdHJpbmdbXTtcbiAgcHJlZmVycmVkUGF5bWVudE1ldGhvZD86IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBJUHJvY2Vzc05vblJlZnVuZGFibGVDYW5jZWxsYXRpb25SZXF1ZXN0IHtcbiAgYm9va2luZ0lkOiBzdHJpbmc7XG4gIHByb2R1Y3Q6ICdob3RlbHMnO1xuICBwYWNrYWdlSWRzOiBzdHJpbmdbXTtcbiAgcHJlZmVycmVkUGF5bWVudE1ldGhvZDogc3RyaW5nO1xuICBwcm9jZXNzZWRNb2RlOiAnYXV0byc7XG4gIGxhbmd1YWdlOiBzdHJpbmc7XG4gIGF0dGFjaG1lbnRVcmw6IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBJQXV0b0NhbmNlbGxhdGlvblByb2Nlc3NSZXNwb25zZSB7XG4gIHN0YXR1czogbnVtYmVyO1xuICBkYXRhOiB7XG4gICAgZXJyb3I6IHN0cmluZztcbiAgICBtZXNzYWdlOiBzdHJpbmc7XG4gICAgYm9va2luZ0lkOiBudW1iZXI7XG4gICAgcHJlZmVycmVkUGF5bWVudE1ldGhvZDogc3RyaW5nO1xuICAgIGlzV2hhdHNBcHA/OiBib29sZWFuO1xuICAgIGNhbmNlbDoge1xuICAgICAgc3RhdHVzOiBzdHJpbmc7XG4gICAgICBwYWNrYWdlSWRzOiBzdHJpbmdbXTtcbiAgICB9O1xuICAgIHJlZnVuZDoge1xuICAgICAgc3RhdHVzOiBzdHJpbmc7XG4gICAgICBib29raW5nU3RhdHVzOiBzdHJpbmc7XG4gICAgICBhbW91bnQ6IG51bWJlcjtcbiAgICAgIGN1cnJlbmN5OiBzdHJpbmc7XG4gICAgICBicmVha2Rvd246IHtcbiAgICAgICAgd2FsbGV0OiBudW1iZXI7XG4gICAgICAgIG1va2FmYTogbnVtYmVyO1xuICAgICAgICBxaXRhZjogbnVtYmVyO1xuICAgICAgICBjYXJkOiBudW1iZXI7XG4gICAgICAgIHRhYmJ5OiBudW1iZXI7XG4gICAgICAgIHRhbWFyYTogbnVtYmVyO1xuICAgICAgfTtcbiAgICB9O1xuICB9O1xuICBlcnJvcnM6IGFueTtcbn1cblxuaW50ZXJmYWNlIElFbnRyeVNvdXJjZURldmljZUJyYW5kIHtcbiAgZW50cnlTb3VyY2U6IHN0cmluZztcbiAgZGV2aWNlOiBzdHJpbmc7XG59XG5cbkBJbmplY3RhYmxlKHtcbiAgcHJvdmlkZWRJbjogJ3Jvb3QnXG59KVxuZXhwb3J0IGNsYXNzIEFsbWF0YXJIb3RlbEF1dG9DYW5jZWxsYXRpb25FbmRwb2ludHNTZXJ2aWNlIHtcbiAgcHJpdmF0ZSByZWFkb25seSBhcGkgPSBpbmplY3QoQXBpU2VydmljZSk7XG4gIHByaXZhdGUgcmVhZG9ubHkgYXBpQmFzZSA9IGluamVjdChTQkRfQ09ORklHKS5hcGlCYXNlO1xuICBwcml2YXRlIHJlYWRvbmx5IHJvdXRlID0gaW5qZWN0KEFjdGl2YXRlZFJvdXRlKTtcbiAgcHJpdmF0ZSByZWFkb25seSBob3RlbE1hbmFnZUJvb2tpbmdTZXJ2aWNlID0gaW5qZWN0KFxuICAgIEhvdGVsTWFuYWdlQm9va2luZ1NlcnZpY2VcbiAgKTtcblxuICBwcml2YXRlIHJlYWRvbmx5IF9hbG1hdGFyQm9va2luZ0lkID0gc2lnbmFsPHN0cmluZz4oJycpO1xuICBwcml2YXRlIHJlYWRvbmx5IF9jb25maXJtYXRpb25OdW1iZXIgPSBzaWduYWw8c3RyaW5nPignJyk7XG4gIHByaXZhdGUgcmVhZG9ubHkgX2lzTnVzdWtGbG93ID0gc2lnbmFsPGJvb2xlYW4+KFxuICAgIGVudmlyb25tZW50cy5pc1RlbmFudCB8fCBmYWxzZVxuICApO1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgX3NlbGVjdGVkUGFja2FnZUlkcyA9IHNpZ25hbDxzdHJpbmdbXT4oW10pO1xuXG4gIHJlYWRvbmx5IGFsbWF0YXJCb29raW5nSWQgPSBjb21wdXRlZCgoKSA9PiB0aGlzLl9hbG1hdGFyQm9va2luZ0lkKCkpO1xuICByZWFkb25seSBjb25maXJtYXRpb25OdW1iZXIgPSBjb21wdXRlZCgoKSA9PiB0aGlzLl9jb25maXJtYXRpb25OdW1iZXIoKSk7XG4gIHJlYWRvbmx5IGlzTnVzdWtGbG93ID0gY29tcHV0ZWQoKCkgPT4gdGhpcy5faXNOdXN1a0Zsb3coKSk7XG5cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgdGhpcy5pbml0aWFsaXplQm9va2luZ0RhdGEoKTtcbiAgfVxuXG4gIHByaXZhdGUgaW5pdGlhbGl6ZUJvb2tpbmdEYXRhKCk6IHZvaWQge1xuICAgIHRoaXMuaG90ZWxNYW5hZ2VCb29raW5nU2VydmljZS5zZWxlY3RlZEhvdGVsQm9va2luZ1xuICAgICAgLnBpcGUodGFrZVVudGlsRGVzdHJveWVkKCkpXG4gICAgICAuc3Vic2NyaWJlKChzZWxlY3RlZEhvdGVsQm9va2luZzogYW55KSA9PiB7XG4gICAgICAgIC8vIGNvbnNvbGUubG9nKCdTZWxlY3RlZCBIb3RlbCBCb29raW5nOicsIHNlbGVjdGVkSG90ZWxCb29raW5nKTtcbiAgICAgICAgaWYgKHNlbGVjdGVkSG90ZWxCb29raW5nKSB7XG4gICAgICAgICAgdGhpcy5fYWxtYXRhckJvb2tpbmdJZC5zZXQoc2VsZWN0ZWRIb3RlbEJvb2tpbmcuYm9va2luZ0lkIHx8ICcnKTtcbiAgICAgICAgICB0aGlzLl9jb25maXJtYXRpb25OdW1iZXIuc2V0KHNlbGVjdGVkSG90ZWxCb29raW5nLmJvb2tpbmdJZCB8fCAnJyk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEZ1bGwgVVJMIG9mIGFuIGVuZHBvaW50IGZyb20gdGhlIGVudW0uIFRoZSBlbnVtIHBhdGhzIHN0YXJ0IHdpdGggYC9hcGkvYCwgd2hpY2ggaXMgdGhlIGRlZmF1bHQgYGFwaUJhc2VgOyBhIGhvc3RcbiAgICogdGhhdCBzZXJ2ZXMgdGhlIEFQSSBzb21ld2hlcmUgZWxzZSAoSGVsaXg6IGl0cyBvd24gQVBJIG9yaWdpbikgc2V0cyBgYXBpQmFzZWAsIHNvIHRoYXQgcGFydCBpcyBzd2FwcGVkIGZvciBpdC5cbiAgICovXG4gIHJlc29sdmVFbmRwb2ludChwYXRoOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIHJldHVybiBgJHt0aGlzLmFwaUJhc2UucmVwbGFjZSgvXFwvKyQvLCAnJyl9LyR7cGF0aC5yZXBsYWNlKC9eXFwvP2FwaVxcLy8sICcnKX1gO1xuICB9XG5cbiAgZ2V0UmVmdW5kRGV0YWlscyhcbiAgICBwYWNrYWdlSWRzOiBzdHJpbmdbXSA9IFtdXG4gICk6IE9ic2VydmFibGU8SVJlZnVuZERldGFpbHNBcGlSZXNwb25zZT4ge1xuICAgIGNvbnN0IGVuZHBvaW50ID0gdGhpcy5yZXNvbHZlRW5kcG9pbnQoXG4gICAgICBBbG1hdGFySG90ZWxBdXRvQ2FuY2VsbGF0aW9uRW5kcG9pbnRzRW51bS5nZXRSZWZ1bmREZXRhaWxzXG4gICAgKTtcblxuICAgIGNvbnN0IHBheWxvYWQ6IElSZWZ1bmREZXRhaWxzUmVxdWVzdCA9IHtcbiAgICAgIGJvb2tpbmdJZDogYCR7XG4gICAgICAgIHRoaXMuaG90ZWxNYW5hZ2VCb29raW5nU2VydmljZS5zZWxlY3RlZEhvdGVsQm9va2luZy52YWx1ZT8uYm9va2luZ0lkIHx8XG4gICAgICAgICcnXG4gICAgICB9YCxcbiAgICAgIHByb2R1Y3Q6ICdob3RlbHMnLFxuICAgICAgcGFja2FnZUlkczogWy4uLm5ldyBTZXQocGFja2FnZUlkcyldIC8vIEVuc3VyZSB1bmlxdWUgcGFja2FnZSBJRHNcbiAgICB9O1xuXG4gICAgLy8gcmV0dXJuIG9mKHtcbiAgICAvLyAgIGRhdGE6IHtcbiAgICAvLyAgICAgYm9va2luZ0lkOiAxNDQzNjgsXG4gICAgLy8gICAgIGN1cnJlbmN5OiAnU0FSJyxcbiAgICAvLyAgICAgc3RhdHVzOiAnUGFydGlhbGx5IHJlZnVuZGVkJyxcbiAgICAvLyAgICAgbWVzc2FnZTogJ1JlZnVuZCBkZXRhaWxzIGNhbGN1bGF0ZWQgc3VjY2Vzc2Z1bGx5JyxcbiAgICAvLyAgICAgZmxhZ3M6IHtcbiAgICAvLyAgICAgICByZWZ1bmRhYmxlOiB0cnVlLFxuICAgIC8vICAgICAgIHBhcnRpYWw6IGZhbHNlLFxuICAgIC8vICAgICAgIGdvbGRlbkdpZnQ6IGZhbHNlXG4gICAgLy8gICAgIH0sXG4gICAgLy8gICAgIHNlbGVjdGlvbjoge1xuICAgIC8vICAgICAgIHBhY2thZ2VJZHM6IFsnZjAzODM4YmQtZWE4ZC00ZmU1LWJmYzgtZGQzMWM5YmRlZTk1J11cbiAgICAvLyAgICAgfSxcbiAgICAvLyAgICAgdG90YWxzOiB7XG4gICAgLy8gICAgICAgcGFpZDogNjg2NixcbiAgICAvLyAgICAgICBiZWZvcmVDb3Vwb246IDY4NjUuNjEsXG4gICAgLy8gICAgICAgcm9vbXNCb29rZWQ6IDQsXG4gICAgLy8gICAgICAgY291cG9uOiAwLFxuICAgIC8vICAgICAgIGdpZnRzOiAwLFxuICAgIC8vICAgICAgIHNlcnZpY2VGZWU6IDAsXG4gICAgLy8gICAgICAgd2FsbGV0OiAwLFxuICAgIC8vICAgICAgIGNhcmQ6IDAsXG4gICAgLy8gICAgICAgdGFiYnk6IDAsXG4gICAgLy8gICAgICAgdGFtYXJhOiAyMjAsXG4gICAgLy8gICAgICAgbW9rYWZhOiAwLFxuICAgIC8vICAgICAgIHFpdGFmOiAwLFxuICAgIC8vICAgICAgIHdhbGE6IDAsXG4gICAgLy8gICAgICAgaGFzc2FkOiAwLFxuICAgIC8vICAgICAgIGFuYjogMCxcbiAgICAvLyAgICAgICB5Z2c6IDBcbiAgICAvLyAgICAgfSxcbiAgICAvLyAgICAgcHJldmlvdXM6IFtcbiAgICAvLyAgICAgICB7XG4gICAgLy8gICAgICAgICBwYWNrYWdlSWQ6ICc1ZWIzM2Q1OS0yNjA3LTQwNTctOWQyNi00ZjdiZTc0NWY2N2YnLFxuICAgIC8vICAgICAgICAgcm9vbU5hbWU6ICdTdGFuZGFyZCBSb29tJyxcbiAgICAvLyAgICAgICAgIGNhbmNlbGxlZEF0OiAnMjAyNi0wOS0wMlQxMzo0Mjo1NC44NDhaJyxcbiAgICAvLyAgICAgICAgIGFtb3VudDogMjk5MC43OSxcbiAgICAvLyAgICAgICAgIGZlZTogMCxcbiAgICAvLyAgICAgICAgIHJlZnVuZGVkOiAyOTkwLjc5XG4gICAgLy8gICAgICAgfVxuICAgIC8vICAgICBdLFxuICAgIC8vICAgICBjdXJyZW50OiB7XG4gICAgLy8gICAgICAgcm9vbXM6IFtcbiAgICAvLyAgICAgICAgIHtcbiAgICAvLyAgICAgICAgICAgcGFja2FnZUlkOiAnZjAzODM4YmQtZWE4ZC00ZmU1LWJmYzgtZGQzMWM5YmRlZTk1JyxcbiAgICAvLyAgICAgICAgICAgcm9vbUlkOiAnMDIyOWU2MjItYTg5YS00NjlkLWFkYjgtODYxNWRlYjk3MWNhJyxcbiAgICAvLyAgICAgICAgICAgcm9vbU5hbWU6ICdTY2VuZSBSb29tIFR3aW4nLFxuICAgIC8vICAgICAgICAgICBiYXNpczogJ1Jvb20gb25seSBSTycsXG4gICAgLy8gICAgICAgICAgIHBheDoge1xuICAgIC8vICAgICAgICAgICAgIGFkdWx0czogMixcbiAgICAvLyAgICAgICAgICAgICBjaGlsZHJlbjogMCxcbiAgICAvLyAgICAgICAgICAgICB0b3RhbDogMlxuICAgIC8vICAgICAgICAgICB9LFxuICAgIC8vICAgICAgICAgICBuaWdodHM6IDQsXG4gICAgLy8gICAgICAgICAgIGFtb3VudDogMTg4Ny42MSxcbiAgICAvLyAgICAgICAgICAgZmVlOiAwLFxuICAgIC8vICAgICAgICAgICBzZXJ2aWNlRmVlOiA1MCxcbiAgICAvLyAgICAgICAgICAgcmVmdW5kOiAxODg3LjYxLFxuICAgIC8vICAgICAgICAgICByZWZ1bmRhYmxlOiB0cnVlLFxuICAgIC8vICAgICAgICAgICByb3V0ZTogJ0FVVE8nXG4gICAgLy8gICAgICAgICB9LFxuICAgIC8vICAgICAgICAge1xuICAgIC8vICAgICAgICAgICBwYWNrYWdlSWQ6ICdmMDM4MzhiZC1lYThkLTRmZTUtYmZjOC1kZDMxYzliZGVlOTUnLFxuICAgIC8vICAgICAgICAgICByb29tSWQ6ICdiOGFlZDI2ZS1kOTFhLTQyMzQtYWUzNy05NGIyYzYyMzJkYmQnLFxuICAgIC8vICAgICAgICAgICByb29tTmFtZTogJ1NjZW5lIFJvb20gVHdpbicsXG4gICAgLy8gICAgICAgICAgIGJhc2lzOiAnUm9vbSBvbmx5IFJPJyxcbiAgICAvLyAgICAgICAgICAgcGF4OiB7XG4gICAgLy8gICAgICAgICAgICAgYWR1bHRzOiAyLFxuICAgIC8vICAgICAgICAgICAgIGNoaWxkcmVuOiAwLFxuICAgIC8vICAgICAgICAgICAgIHRvdGFsOiAyXG4gICAgLy8gICAgICAgICAgIH0sXG4gICAgLy8gICAgICAgICAgIG5pZ2h0czogNCxcbiAgICAvLyAgICAgICAgICAgYW1vdW50OiAxODg3LjYsXG4gICAgLy8gICAgICAgICAgIGZlZTogMCxcbiAgICAvLyAgICAgICAgICAgc2VydmljZUZlZTogNTAsXG4gICAgLy8gICAgICAgICAgIHJlZnVuZDogMTg4Ny42LFxuICAgIC8vICAgICAgICAgICByZWZ1bmRhYmxlOiB0cnVlLFxuICAgIC8vICAgICAgICAgICByb3V0ZTogJ0FVVE8nXG4gICAgLy8gICAgICAgICB9XG4gICAgLy8gICAgICAgXSxcbiAgICAvLyAgICAgICBhbW91bnQ6IDM3NzUuMjEsXG4gICAgLy8gICAgICAgZmVlOiAwLFxuICAgIC8vICAgICAgIHN1cmNoYXJnZTogMCxcbiAgICAvLyAgICAgICByZWZ1bmQ6IDM3NzUuMjFcbiAgICAvLyAgICAgfSxcbiAgICAvLyAgICAgcGF5b3V0OiB7XG4gICAgLy8gICAgICAgYWxyZWFkeVJlZnVuZGVkOiAyOTkwLjc5LFxuICAgIC8vICAgICAgIGN1cnJlbnQ6IDE2MDAsXG4gICAgLy8gICAgICAgYWZ0ZXJUaGlzOiA2NzY2LFxuICAgIC8vICAgICAgIGZlZXNUb3RhbDogMCxcbiAgICAvLyAgICAgICB3YWxsZXQ6IDAsXG4gICAgLy8gICAgICAgY2FyZDogMCxcbiAgICAvLyAgICAgICB0YWJieTogMCxcbiAgICAvLyAgICAgICB0YW1hcmE6IDIwMCxcbiAgICAvLyAgICAgICBhbXdhbDogMCxcbiAgICAvLyAgICAgICBtaXM6IDAsXG4gICAgLy8gICAgICAgYm5wbE1hbnVhbDogMCxcbiAgICAvLyAgICAgICBsb3lhbHR5VG9XYWxsZXQ6IDYwMCxcbiAgICAvLyAgICAgICBub3RlOiBudWxsXG4gICAgLy8gICAgIH0sXG4gICAgLy8gICAgIHN1bW1hcmllczogW1xuICAgIC8vICAgICAgIHtcbiAgICAvLyAgICAgICAgIGNvZGU6ICdDQVJEJyxcbiAgICAvLyAgICAgICAgIGxhYmVsOiAnQ2FyZCcsXG4gICAgLy8gICAgICAgICBwYWlkOiA2ODY2LFxuICAgIC8vICAgICAgICAgcmVmdW5kOiAzNzc1LjIxLFxuICAgIC8vICAgICAgICAgcmVmdW5kYWJsZTogdHJ1ZSxcbiAgICAvLyAgICAgICAgIGdhdGV3YXk6ICdDSCdcbiAgICAvLyAgICAgICB9LFxuICAgIC8vICAgICAgIHtcbiAgICAvLyAgICAgICAgIGNvZGU6ICdTRVJWSUNFX0ZFRScsXG4gICAgLy8gICAgICAgICBsYWJlbDogJ1NlcnZpY2UgRmVlJyxcbiAgICAvLyAgICAgICAgIHBhaWQ6IDEwMCxcbiAgICAvLyAgICAgICAgIHJlZnVuZDogMCxcbiAgICAvLyAgICAgICAgIHJlZnVuZGFibGU6IGZhbHNlXG4gICAgLy8gICAgICAgfVxuICAgIC8vICAgICBdLFxuICAgIC8vICAgICBnaWZ0czogW11cbiAgICAvLyAgIH0sXG4gICAgLy8gICBzdGF0dXM6IDIwMCxcbiAgICAvLyAgIGVycm9yczogbnVsbFxuICAgIC8vIH0pO1xuXG4gICAgcmV0dXJuIHRoaXMuYXBpXG4gICAgICAucG9zdDxJUmVmdW5kRGV0YWlsc0FwaVJlc3BvbnNlPih7XG4gICAgICAgIGVuZHBvaW50LFxuICAgICAgICAuLi5wYXlsb2FkXG4gICAgICB9KVxuICAgICAgLnBpcGUoXG4gICAgICAgIGNhdGNoRXJyb3IoKGVycm9yKSA9PlxuICAgICAgICAgIHRoaXMuaGFuZGxlRXJyb3IoZXJyb3IsICdGYWlsZWQgdG8gZ2V0IHJlZnVuZCBkZXRhaWxzJylcbiAgICAgICAgKVxuICAgICAgKTtcbiAgfVxuXG4gIG1hcEFwaVJlc3BvbnNlVG9Sb29tcyhcbiAgICBkYXRhOiBJUmVmdW5kRGV0YWlsc0RhdGFcbiAgKTogSUFsbWF0YXJIb3RlbEF1dG9DYW5jZWxsYXRpb25Sb29tW10ge1xuICAgIHJldHVybiB0aGlzLmdldEFsbFJvb21zKGRhdGEpO1xuICB9XG5cbiAgbWFwQXBpUmVzcG9uc2VUb1JlZnVuZFN1bW1hcnkoXG4gICAgZGF0YTogSVJlZnVuZERldGFpbHNEYXRhXG4gICk6IElBbG1hdGFySG90ZWxBdXRvQ2FuY2VsbGF0aW9uUmVmdW5kU3VtbWFyeSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHRvdGFsUGFpZDogZGF0YS50b3RhbHM/LnBhaWQgfHwgMCxcbiAgICAgIHRvdGFsUmVmdW5kOiBkYXRhLmN1cnJlbnQ/LnJlZnVuZCB8fCBkYXRhLmN1cnJlbnQ/LnJlZnVuZCB8fCAwLFxuICAgICAgdG90YWxGZWVzOiBkYXRhLmN1cnJlbnQ/LmZlZSB8fCAwLFxuICAgICAgcm9vbXM6IHRoaXMuZ2V0QWxsUm9vbXMoZGF0YSksXG4gICAgICBwYWNrYWdlczogdGhpcy5nZXRBbGxQYWNrYWdlcyhkYXRhKSxcbiAgICAgIHN1bW1hcmllczogZGF0YS5zdW1tYXJpZXMsXG4gICAgICBwYXlvdXQ6IGRhdGEucGF5b3V0LFxuICAgICAgdG90YWxzOiBkYXRhLnRvdGFscyxcbiAgICAgIC8vIEFkZGl0aW9uYWwgYnJlYWtkb3duIGZpZWxkc1xuICAgICAgY291cG9uOiBkYXRhLnRvdGFscz8uY291cG9uIHx8IDAsXG4gICAgICBnaWZ0c1RvdGFsOiBkYXRhLnRvdGFscz8uZ2lmdHMgfHwgMCxcbiAgICAgIGdpZnRzRGV0YWlsczogZGF0YS5naWZ0cyB8fCBbXSxcbiAgICAgIHNlcnZpY2VGZWU6IGRhdGEudG90YWxzPy5zZXJ2aWNlRmVlIHx8IDAsXG4gICAgICBzdXJjaGFyZ2U6IGRhdGEuY3VycmVudD8uc3VyY2hhcmdlIHx8IDAsXG4gICAgICBnb2xkZW5HaWZ0OiBkYXRhLmZsYWdzPy5nb2xkZW5HaWZ0IHx8IGZhbHNlLFxuICAgICAgcHJldmlvdXNSb29tczogZGF0YS5wcmV2aW91cyB8fCBbXVxuICAgIH07XG4gIH1cblxuICBnZXRBbGxQYWNrYWdlcyhcbiAgICBkYXRhOiBJUmVmdW5kRGV0YWlsc0RhdGFcbiAgKTogSUFsbWF0YXJIb3RlbEF1dG9DYW5jZWxsYXRpb25SZWZ1bmRQYWNrYWdlW10ge1xuICAgIGNvbnN0IHBhY2thZ2VzOiBJQWxtYXRhckhvdGVsQXV0b0NhbmNlbGxhdGlvblJlZnVuZFBhY2thZ2VbXSA9IFtdO1xuICAgIGNvbnN0IHBhY2thZ2VNYXAgPSBuZXcgTWFwPFxuICAgICAgc3RyaW5nLFxuICAgICAgSUFsbWF0YXJIb3RlbEF1dG9DYW5jZWxsYXRpb25SZWZ1bmRQYWNrYWdlXG4gICAgPigpO1xuXG4gICAgLy8gUHJvY2VzcyBwcmV2aW91cyAoY2FuY2VsbGVkKSByb29tcyAtIGdyb3VwIGJ5IHBhY2thZ2VJZFxuICAgIGlmIChkYXRhLnByZXZpb3VzPy5sZW5ndGgpIHtcbiAgICAgIGRhdGEucHJldmlvdXMuZm9yRWFjaCgocm9vbTogYW55KSA9PiB7XG4gICAgICAgIGNvbnN0IGV4aXN0aW5nUGtnID0gcGFja2FnZU1hcC5nZXQocm9vbS5wYWNrYWdlSWQpO1xuICAgICAgICBpZiAoZXhpc3RpbmdQa2cpIHtcbiAgICAgICAgICBleGlzdGluZ1BrZy5yb29tcy5wdXNoKHtcbiAgICAgICAgICAgIHJvb21JZDogcm9vbS5yb29tSWQgfHwgcm9vbS5wYWNrYWdlSWQsXG4gICAgICAgICAgICByb29tTmFtZTogcm9vbS5yb29tTmFtZSxcbiAgICAgICAgICAgIGJhc2lzOiByb29tLmJhc2lzLFxuICAgICAgICAgICAgbmlnaHRzOiByb29tLm5pZ2h0c1xuICAgICAgICAgIH0pO1xuICAgICAgICAgIGV4aXN0aW5nUGtnLmFtb3VudCArPSByb29tLmFtb3VudCB8fCAwO1xuICAgICAgICAgIGV4aXN0aW5nUGtnLmZlZSArPSByb29tLmZlZSB8fCAwO1xuICAgICAgICAgIGV4aXN0aW5nUGtnLnJlZnVuZCArPSByb29tLnJlZnVuZGVkIHx8IDA7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcGFja2FnZU1hcC5zZXQocm9vbS5wYWNrYWdlSWQsIHtcbiAgICAgICAgICAgIHBhY2thZ2VJZDogcm9vbS5wYWNrYWdlSWQsXG4gICAgICAgICAgICBwYWNrYWdlTmFtZTogcm9vbS5yb29tTmFtZSxcbiAgICAgICAgICAgIHJvb21zOiBbXG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICByb29tSWQ6IHJvb20ucm9vbUlkIHx8IHJvb20ucGFja2FnZUlkLFxuICAgICAgICAgICAgICAgIHJvb21OYW1lOiByb29tLnJvb21OYW1lLFxuICAgICAgICAgICAgICAgIGJhc2lzOiByb29tLmJhc2lzLFxuICAgICAgICAgICAgICAgIG5pZ2h0czogcm9vbS5uaWdodHNcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIGFtb3VudDogcm9vbS5hbW91bnQgfHwgMCxcbiAgICAgICAgICAgIGZlZTogcm9vbS5mZWUgfHwgMCxcbiAgICAgICAgICAgIHNlcnZpY2VGZWU6IDAsXG4gICAgICAgICAgICByZWZ1bmQ6IHJvb20ucmVmdW5kZWQgfHwgMCxcbiAgICAgICAgICAgIHJlZnVuZGFibGU6IGZhbHNlLFxuICAgICAgICAgICAgY2FuY2VsbGVkQmVmb3JlOiB0cnVlLFxuICAgICAgICAgICAgY2FuY2VsbGF0aW9uRGF0ZTogcm9vbS5jYW5jZWxsZWRBdFxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICAvLyBQcm9jZXNzIGN1cnJlbnQgcm9vbXMgLSBncm91cCBieSBwYWNrYWdlSWRcbiAgICBpZiAoZGF0YS5jdXJyZW50Py5yb29tcz8ubGVuZ3RoKSB7XG4gICAgICBkYXRhLmN1cnJlbnQucm9vbXMuZm9yRWFjaCgocm9vbTogYW55KSA9PiB7XG4gICAgICAgIGNvbnN0IGV4aXN0aW5nUGtnID0gcGFja2FnZU1hcC5nZXQocm9vbS5wYWNrYWdlSWQpO1xuICAgICAgICBpZiAoZXhpc3RpbmdQa2cgJiYgIWV4aXN0aW5nUGtnLmNhbmNlbGxlZEJlZm9yZSkge1xuICAgICAgICAgIGV4aXN0aW5nUGtnLnJvb21zLnB1c2goe1xuICAgICAgICAgICAgcm9vbUlkOiByb29tLnJvb21JZCB8fCByb29tLnBhY2thZ2VJZCxcbiAgICAgICAgICAgIHJvb21OYW1lOiByb29tLnJvb21OYW1lLFxuICAgICAgICAgICAgYmFzaXM6IHJvb20uYmFzaXMsXG4gICAgICAgICAgICBuaWdodHM6IHJvb20ubmlnaHRzLFxuICAgICAgICAgICAgcGF4OiByb29tLnBheCxcbiAgICAgICAgICAgIGFkdWx0czogcm9vbS5wYXg/LmFkdWx0cyxcbiAgICAgICAgICAgIGNoaWxkcmVuOiByb29tLnBheD8uY2hpbGRyZW5cbiAgICAgICAgICB9KTtcbiAgICAgICAgICBleGlzdGluZ1BrZy5hbW91bnQgKz0gcm9vbS5hbW91bnQgfHwgMDtcbiAgICAgICAgICBleGlzdGluZ1BrZy5mZWUgKz0gcm9vbS5mZWUgfHwgMDtcbiAgICAgICAgICBleGlzdGluZ1BrZy5zZXJ2aWNlRmVlICs9IHJvb20uc2VydmljZUZlZSB8fCAwO1xuICAgICAgICAgIGV4aXN0aW5nUGtnLnJlZnVuZCArPSByb29tLnJlZnVuZCB8fCAwO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHBhY2thZ2VNYXAuc2V0KHJvb20ucGFja2FnZUlkLCB7XG4gICAgICAgICAgICBwYWNrYWdlSWQ6IHJvb20ucGFja2FnZUlkLFxuICAgICAgICAgICAgcGFja2FnZU5hbWU6IHJvb20ucm9vbU5hbWUsXG4gICAgICAgICAgICByb29tczogW1xuICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgcm9vbUlkOiByb29tLnJvb21JZCB8fCByb29tLnBhY2thZ2VJZCxcbiAgICAgICAgICAgICAgICByb29tTmFtZTogcm9vbS5yb29tTmFtZSxcbiAgICAgICAgICAgICAgICBiYXNpczogcm9vbS5iYXNpcyxcbiAgICAgICAgICAgICAgICBuaWdodHM6IHJvb20ubmlnaHRzLFxuICAgICAgICAgICAgICAgIHBheDogcm9vbS5wYXgsXG4gICAgICAgICAgICAgICAgYWR1bHRzOiByb29tLnBheD8uYWR1bHRzLFxuICAgICAgICAgICAgICAgIGNoaWxkcmVuOiByb29tLnBheD8uY2hpbGRyZW5cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIGFtb3VudDogcm9vbS5hbW91bnQgfHwgMCxcbiAgICAgICAgICAgIGZlZTogcm9vbS5mZWUgfHwgMCxcbiAgICAgICAgICAgIHNlcnZpY2VGZWU6IHJvb20uc2VydmljZUZlZSB8fCAwLFxuICAgICAgICAgICAgcmVmdW5kOiByb29tLnJlZnVuZCB8fCAwLFxuICAgICAgICAgICAgcmVmdW5kYWJsZTogcm9vbS5yZWZ1bmRhYmxlLFxuICAgICAgICAgICAgcm91dGU6IHJvb20ucm91dGUsXG4gICAgICAgICAgICBjYW5jZWxsZWRCZWZvcmU6IGZhbHNlLFxuICAgICAgICAgICAgY2FuY2VsbGF0aW9uRGF0ZTogbmV3IERhdGUoKS50b0lTT1N0cmluZygpXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHBhY2thZ2VNYXAuZm9yRWFjaCgocGtnKSA9PiBwYWNrYWdlcy5wdXNoKHBrZykpO1xuICAgIHJldHVybiBwYWNrYWdlcztcbiAgfVxuXG4gIGdldEFsbFJvb21zKGRhdGE6IElSZWZ1bmREZXRhaWxzRGF0YSk6IElBbG1hdGFySG90ZWxBdXRvQ2FuY2VsbGF0aW9uUm9vbVtdIHtcbiAgICBjb25zdCBhbGxSb29tczogSUFsbWF0YXJIb3RlbEF1dG9DYW5jZWxsYXRpb25Sb29tW10gPSBbXTtcblxuICAgIGlmIChkYXRhLnByZXZpb3VzPy5sZW5ndGgpIHtcbiAgICAgIGRhdGEucHJldmlvdXMuZm9yRWFjaCgocm9vbSkgPT4ge1xuICAgICAgICBhbGxSb29tcy5wdXNoKHtcbiAgICAgICAgICBwYWNrYWdlSWQ6IHJvb20ucGFja2FnZUlkLFxuICAgICAgICAgIHJvb21JZDogcm9vbT8ucm9vbUlkLFxuICAgICAgICAgIHJvb21OYW1lOiByb29tLnJvb21OYW1lLFxuICAgICAgICAgIGlzUmVmdW5kYWJsZTogZmFsc2UsXG4gICAgICAgICAgaXNTZWxlY3RlZDogZmFsc2UsXG4gICAgICAgICAgY2FuY2VsbGVkQmVmb3JlOiB0cnVlLFxuICAgICAgICAgIHJvb21BbW91bnQ6IHJvb20uYW1vdW50LFxuICAgICAgICAgIGNhbmNlbGxhdGlvbkZlZTogcm9vbS5mZWUsXG4gICAgICAgICAgcmVmdW5kQW1vdW50OiByb29tLnJlZnVuZGVkLFxuICAgICAgICAgIGN1cnJlbnRDYW5jZWxsYXRpb246IGZhbHNlLFxuICAgICAgICAgIGNhbmNlbGxhdGlvbkRhdGU6IHJvb20uY2FuY2VsbGVkQXQsXG4gICAgICAgICAgbmlnaHRzOiByb29tLm5pZ2h0cyA/PyAxXG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgaWYgKGRhdGEuY3VycmVudD8ucm9vbXM/Lmxlbmd0aCkge1xuICAgICAgZGF0YS5jdXJyZW50LnJvb21zLmZvckVhY2goKHJvb20pID0+IHtcbiAgICAgICAgYWxsUm9vbXMucHVzaCh7XG4gICAgICAgICAgcGFja2FnZUlkOiByb29tLnBhY2thZ2VJZCxcbiAgICAgICAgICByb29tSWQ6IHJvb20/LnJvb21JZCxcbiAgICAgICAgICByb29tTmFtZTogcm9vbS5yb29tTmFtZSxcbiAgICAgICAgICBpc1JlZnVuZGFibGU6IHJvb20ucmVmdW5kYWJsZSxcbiAgICAgICAgICBpc1NlbGVjdGVkOiBmYWxzZSxcbiAgICAgICAgICByb29tQW1vdW50OiByb29tLmFtb3VudCxcbiAgICAgICAgICBjYW5jZWxsYXRpb25GZWU6IHJvb20uZmVlLFxuICAgICAgICAgIGNhbmNlbGxlZEJlZm9yZTogZmFsc2UsXG4gICAgICAgICAgcmVmdW5kQW1vdW50OiByb29tLnJlZnVuZCxcbiAgICAgICAgICByb3V0ZTogcm9vbS5yb3V0ZSxcbiAgICAgICAgICBjdXJyZW50Q2FuY2VsbGF0aW9uOiB0cnVlLFxuICAgICAgICAgIGNhbmNlbGxhdGlvbkRhdGU6IGAke25ldyBEYXRlKCl9YCxcbiAgICAgICAgICBuaWdodHM6IHJvb20ubmlnaHRzID8/IDFcbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICByZXR1cm4gYWxsUm9vbXM7XG4gIH1cblxuICBwcm9jZXNzQXV0b0NhbmNlbGxhdGlvbihcbiAgICBwYWNrYWdlSWRzOiBzdHJpbmdbXSxcbiAgICByZWZ1bmRPcHRpb24gPSAnb3JpZ2luYWxQYXltZW50TWV0aG9kJ1xuICApOiBPYnNlcnZhYmxlPElBdXRvQ2FuY2VsbGF0aW9uUHJvY2Vzc1Jlc3BvbnNlPiB7XG4gICAgY29uc3QgZW5kcG9pbnQgPSB0aGlzLnJlc29sdmVFbmRwb2ludChcbiAgICAgIEFsbWF0YXJIb3RlbEF1dG9DYW5jZWxsYXRpb25FbmRwb2ludHNFbnVtLnByb2Nlc3NBdXRvQ2FuY2VsbGF0aW9uXG4gICAgKTtcblxuICAgIGNvbnN0IHVuaXF1ZVBhY2thZ2VJZHMgPSBbLi4ubmV3IFNldChwYWNrYWdlSWRzKV07IC8vIEVuc3VyZSB1bmlxdWUgcGFja2FnZSBJRHNcbiAgICBjb25zdCBwYXlsb2FkOiBJUHJvY2Vzc0NhbmNlbGxhdGlvblJlcXVlc3QgPSB7XG4gICAgICBib29raW5nSWQ6IGAke1xuICAgICAgICB0aGlzLmhvdGVsTWFuYWdlQm9va2luZ1NlcnZpY2Uuc2VsZWN0ZWRIb3RlbEJvb2tpbmcudmFsdWU/LmJvb2tpbmdJZCB8fFxuICAgICAgICAnJ1xuICAgICAgfWAsXG4gICAgICBwcm9kdWN0OiAnaG90ZWxzJyxcbiAgICAgIHBhY2thZ2VJZHM6IHVuaXF1ZVBhY2thZ2VJZHMsXG4gICAgICBwcmVmZXJyZWRQYXltZW50TWV0aG9kOiByZWZ1bmRPcHRpb25cbiAgICB9O1xuXG4gICAgdGhpcy5fc2VsZWN0ZWRQYWNrYWdlSWRzLnNldCh1bmlxdWVQYWNrYWdlSWRzKTtcblxuICAgIHJldHVybiBvZih7XG4gICAgICBkYXRhOiB7XG4gICAgICAgIGVycm9yOiAnMScsXG4gICAgICAgIG1lc3NhZ2U6XG4gICAgICAgICAgJ0NhbmNlbCByZXF1ZXN0ZWQg4oCUIHN1cHBsaWVyIGNhbmNlbGxhdGlvbiBmYWlsZWQ7IHRpY2tldCBjcmVhdGVkJyxcbiAgICAgICAgYm9va2luZ0lkOiAxNDQzNjgsXG4gICAgICAgIHByZWZlcnJlZFBheW1lbnRNZXRob2Q6ICd3YWxsZXQnLFxuICAgICAgICBjYW5jZWw6IHtcbiAgICAgICAgICBzdGF0dXM6ICdmYWlsZWQnLFxuICAgICAgICAgIHBhY2thZ2VJZHM6IFsnZjAzODM4YmQtZWE4ZC00ZmU1LWJmYzgtZGQzMWM5YmRlZTk1J10sXG4gICAgICAgIH0sXG4gICAgICAgIHJlZnVuZDoge1xuICAgICAgICAgIHN0YXR1czogJ3NraXBwZWQnLFxuICAgICAgICAgIGJvb2tpbmdTdGF0dXM6ICdDYW5jZWxsZWQnLFxuICAgICAgICAgIGFtb3VudDogMTA1MCxcbiAgICAgICAgICBjdXJyZW5jeTogJ1NBUicsXG4gICAgICAgICAgYnJlYWtkb3duOiB7XG4gICAgICAgICAgICB3YWxsZXQ6IDAsXG4gICAgICAgICAgICBtb2thZmE6IDAsXG4gICAgICAgICAgICBxaXRhZjogMCxcbiAgICAgICAgICAgIGNhcmQ6IDIwMCxcbiAgICAgICAgICAgIHRhYmJ5OiAwLFxuICAgICAgICAgICAgdGFtYXJhOiAwLFxuICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgICAgc3RhdHVzOiAyMDAsXG4gICAgICBlcnJvcnM6IG51bGwsXG4gICAgfSk7XG5cbiAgICByZXR1cm4gdGhpcy5hcGlcbiAgICAgIC5wb3N0PElBdXRvQ2FuY2VsbGF0aW9uUHJvY2Vzc1Jlc3BvbnNlPih7XG4gICAgICAgIGVuZHBvaW50LFxuICAgICAgICAuLi5wYXlsb2FkXG4gICAgICB9KVxuICAgICAgLnBpcGUoXG4gICAgICAgIG1hcCgocmVzcG9uc2UpID0+IHtcbiAgICAgICAgICB0aGlzLl9zZWxlY3RlZFBhY2thZ2VJZHMuc2V0KFtdKTtcbiAgICAgICAgICByZXR1cm4gcmVzcG9uc2U7XG4gICAgICAgIH0pLFxuICAgICAgICBjYXRjaEVycm9yKChlcnJvcikgPT5cbiAgICAgICAgICB0aGlzLmhhbmRsZUVycm9yKGVycm9yLCAnRmFpbGVkIHRvIHByb2Nlc3MgY2FuY2VsbGF0aW9uJylcbiAgICAgICAgKVxuICAgICAgKTtcbiAgfVxuXG4gIHByb2Nlc3NOb25SZWZ1bmRhYmxlQ2FuY2VsbGF0aW9uKFxuICAgIHBhY2thZ2VJZDogc3RyaW5nLFxuICAgIGF0dGFjaG1lbnRVcmw6IHN0cmluZyxcbiAgICBsYW5ndWFnZSA9ICdlbidcbiAgKTogT2JzZXJ2YWJsZTxJQXV0b0NhbmNlbGxhdGlvblByb2Nlc3NSZXNwb25zZT4ge1xuICAgIGNvbnN0IGVuZHBvaW50ID0gdGhpcy5yZXNvbHZlRW5kcG9pbnQoXG4gICAgICBBbG1hdGFySG90ZWxBdXRvQ2FuY2VsbGF0aW9uRW5kcG9pbnRzRW51bS5wcm9jZXNzQXV0b0NhbmNlbGxhdGlvblxuICAgICk7XG5cbiAgICBjb25zdCBwYXlsb2FkOiBJUHJvY2Vzc05vblJlZnVuZGFibGVDYW5jZWxsYXRpb25SZXF1ZXN0ID0ge1xuICAgICAgYm9va2luZ0lkOiBgJHtcbiAgICAgICAgdGhpcy5ob3RlbE1hbmFnZUJvb2tpbmdTZXJ2aWNlLnNlbGVjdGVkSG90ZWxCb29raW5nLnZhbHVlPy5ib29raW5nSWQgfHxcbiAgICAgICAgJydcbiAgICAgIH1gLFxuICAgICAgcHJvZHVjdDogJ2hvdGVscycsXG4gICAgICBwYWNrYWdlSWRzOiBbcGFja2FnZUlkXSxcbiAgICAgIHByZWZlcnJlZFBheW1lbnRNZXRob2Q6ICdvcmlnaW5hbFBheW1lbnRNZXRob2QnLFxuICAgICAgcHJvY2Vzc2VkTW9kZTogJ2F1dG8nLFxuICAgICAgbGFuZ3VhZ2UsXG4gICAgICBhdHRhY2htZW50VXJsXG4gICAgfTtcblxuICAgIHJldHVybiB0aGlzLmFwaVxuICAgICAgLnBvc3Q8SUF1dG9DYW5jZWxsYXRpb25Qcm9jZXNzUmVzcG9uc2U+KHtcbiAgICAgICAgZW5kcG9pbnQsXG4gICAgICAgIC4uLnBheWxvYWRcbiAgICAgIH0pXG4gICAgICAucGlwZShcbiAgICAgICAgY2F0Y2hFcnJvcigoZXJyb3IpID0+XG4gICAgICAgICAgdGhpcy5oYW5kbGVFcnJvcihcbiAgICAgICAgICAgIGVycm9yLFxuICAgICAgICAgICAgJ0ZhaWxlZCB0byBwcm9jZXNzIG5vbi1yZWZ1bmRhYmxlIGNhbmNlbGxhdGlvbidcbiAgICAgICAgICApXG4gICAgICAgIClcbiAgICAgICk7XG4gIH1cblxuICBjYWxjdWxhdGVMb2NhbFJlZnVuZFN1bW1hcnkoXG4gICAgcm9vbXM6IElBbG1hdGFySG90ZWxBdXRvQ2FuY2VsbGF0aW9uUm9vbVtdXG4gICk6IElBbG1hdGFySG90ZWxBdXRvQ2FuY2VsbGF0aW9uUmVmdW5kU3VtbWFyeSB7XG4gICAgY29uc3Qgc2VsZWN0ZWRSb29tcyA9IHJvb21zLmZpbHRlcigocm9vbSkgPT4gcm9vbS5pc1NlbGVjdGVkKTtcbiAgICBjb25zdCB0b3RhbFBhaWQgPSByb29tcy5yZWR1Y2UoKHN1bSwgcm9vbSkgPT4gc3VtICsgcm9vbS5yb29tQW1vdW50LCAwKTtcbiAgICBjb25zdCB0b3RhbFJlZnVuZCA9IHNlbGVjdGVkUm9vbXMucmVkdWNlKFxuICAgICAgKHN1bSwgcm9vbSkgPT4gc3VtICsgcm9vbS5yZWZ1bmRBbW91bnQsXG4gICAgICAwXG4gICAgKTtcblxuICAgIHJldHVybiB7XG4gICAgICB0b3RhbFBhaWQsXG4gICAgICB0b3RhbFJlZnVuZCxcbiAgICAgIHJvb21zOiBzZWxlY3RlZFJvb21zLm1hcCgocm9vbSkgPT4gKHtcbiAgICAgICAgLi4ucm9vbSxcbiAgICAgICAgY3VycmVudENhbmNlbGxhdGlvbjogdHJ1ZSxcbiAgICAgICAgY2FuY2VsbGF0aW9uRGF0ZTogbmV3IERhdGUoKS50b0lTT1N0cmluZygpXG4gICAgICB9KSlcbiAgICB9O1xuICB9XG5cbiAgZ2V0U2VsZWN0ZWRQYWNrYWdlSWRzKCk6IHN0cmluZ1tdIHtcbiAgICByZXR1cm4gdGhpcy5fc2VsZWN0ZWRQYWNrYWdlSWRzKCk7XG4gIH1cblxuICBjbGVhclNlbGVjdGVkUGFja2FnZUlkcygpOiB2b2lkIHtcbiAgICB0aGlzLl9zZWxlY3RlZFBhY2thZ2VJZHMuc2V0KFtdKTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0RW50cnlTb3VyY2VEZXZpY2VCcmFuZCgpOiBJRW50cnlTb3VyY2VEZXZpY2VCcmFuZCB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGVudHJ5U291cmNlOiB0aGlzLmdldEVudHJ5U291cmNlKCksXG4gICAgICBkZXZpY2U6IHRoaXMuZ2V0RGV2aWNlKClcbiAgICB9O1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRFbnRyeVNvdXJjZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiByZXNvbHZlTXlUcmlwc1ZpZXdlZEVudHJ5U291cmNlRnJvbVF1ZXJ5UGFyYW1zKFxuICAgICAgdGhpcy5yb3V0ZS5zbmFwc2hvdC5xdWVyeVBhcmFtcyBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPlxuICAgICk7XG4gIH1cblxuICBwcml2YXRlIGdldERldmljZSgpOiBzdHJpbmcge1xuICAgIGxldCBkZXZpY2UgPSAnd2ViJztcbiAgICBpZiAodGhpcy5yb3V0ZS5zbmFwc2hvdC5xdWVyeVBhcmFtc1snbW9iaWxlQXV0aCddKSB7XG4gICAgICBkZXZpY2UgPSB0aGlzLnJvdXRlLnNuYXBzaG90LnF1ZXJ5UGFyYW1zWydkZXZpY2UnXSB8fCAnbW9iaWxlJztcbiAgICB9XG4gICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oJ2RldmljZVR5cGUnLCBkZXZpY2UpO1xuICAgIHJldHVybiBkZXZpY2U7XG4gIH1cblxuICBwcml2YXRlIGhhbmRsZUVycm9yKGVycm9yOiBhbnksIG1lc3NhZ2U6IHN0cmluZyk6IE9ic2VydmFibGU8bmV2ZXI+IHtcbiAgICAvLyBjb25zb2xlLmxvZyhtZXNzYWdlLCBlcnJvcik7XG4gICAgY29uc3QgZXJyb3JNZXNzYWdlID1cbiAgICAgIGVycm9yPy5lcnJvcj8ubWVzc2FnZSB8fCBlcnJvcj8ubWVzc2FnZSB8fCBtZXNzYWdlO1xuICAgIHJldHVybiB0aHJvd0Vycm9yKCgpID0+IG5ldyBFcnJvcihlcnJvck1lc3NhZ2UpKTtcbiAgfVxufVxuIl19
@@ -0,0 +1,135 @@
1
+ import { ChangeDetectionStrategy, Component, Injector, computed, effect, inject, input, output, runInInjectionContext, untracked, } from '@angular/core';
2
+ import { firstValueFrom, isObservable } from 'rxjs';
3
+ import { DialogModule } from 'primeng/dialog';
4
+ import { ButtonModule } from 'primeng/button';
5
+ import { SBD_CONFIG } from '../../config/dashboard.config';
6
+ import { appendAuthParams } from '../../utils/reissue-url.builder';
7
+ import { SbdReissueStore } from './reissue.store';
8
+ import { SbdReissueUpgradeStore } from './reissue-upgrade.store';
9
+ import { SbdReissueUpgradeStepComponent } from './steps/reissue-upgrade-step/reissue-upgrade-step.component';
10
+ import { SbdReissueUpgradeConfirmStepComponent } from './steps/reissue-upgrade-confirm-step/reissue-upgrade-confirm-step.component';
11
+ import { SbdReissueNoticeComponent } from './steps/reissue-notice/reissue-notice.component';
12
+ import { SbdReissueServiceStepComponent } from './steps/reissue-service-step/reissue-service-step.component';
13
+ import { SbdReissueLegsStepComponent } from './steps/reissue-legs-step/reissue-legs-step.component';
14
+ import { SbdReissueDateStepComponent } from './steps/reissue-date-step/reissue-date-step.component';
15
+ import { SbdReissueRouteStepComponent } from './steps/reissue-route-step/reissue-route-step.component';
16
+ import * as i0 from "@angular/core";
17
+ import * as i1 from "primeng/dialog";
18
+ import * as i2 from "primeng/button";
19
+ /**
20
+ * Reissue dialog shell: owns the p-dialog, the loading / error states and the footer, and swaps the step
21
+ * components. All state and rules live in `SbdReissueStore`; the steps only render and emit.
22
+ */
23
+ export class SbdReissueDialogComponent {
24
+ constructor() {
25
+ this.store = inject(SbdReissueStore);
26
+ this.upgrade = inject(SbdReissueUpgradeStore);
27
+ this.config = inject(SBD_CONFIG);
28
+ this.injector = inject(Injector);
29
+ this.visible = input(false);
30
+ this.bookingId = input('');
31
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
32
+ this.bookingData = input(null);
33
+ this.closed = output();
34
+ /** Header title per screen, like the cancel dialog's "Select Leg to Cancel" / "Refund Method". */
35
+ this.title = computed(() => {
36
+ switch (this.store.step()) {
37
+ case 'legs': return 'Select Flight to Change';
38
+ case 'edit': return this.store.service() === 'change_date' ? 'Choose New Date' : 'Choose New Route';
39
+ case 'upgrade-legs': return 'Select Flight to Upgrade';
40
+ case 'upgrade': return 'Choose New Class';
41
+ case 'confirm': return 'Review Upgrade';
42
+ default: return 'Reissue Booking';
43
+ }
44
+ });
45
+ /** Gray hint above the footer (cancel's "Select at least one flight to continue"), or why Search is disabled. */
46
+ this.hint = computed(() => {
47
+ switch (this.store.step()) {
48
+ case 'legs':
49
+ return this.store.anyAvailable() && !this.store.canContinue() ? 'Select at least one flight to continue' : null;
50
+ case 'edit':
51
+ return this.store.validationError();
52
+ case 'upgrade-legs':
53
+ return this.upgrade.anyLegUpgradable() && !this.upgrade.canContinueFromLegs() && !this.upgrade.submitting()
54
+ ? 'Select at least one flight to continue'
55
+ : null;
56
+ case 'upgrade':
57
+ return this.upgrade.sections().some(s => s.options.length) && !this.upgrade.canContinue() && !this.upgrade.submitting()
58
+ ? 'Select a class to continue'
59
+ : null;
60
+ default:
61
+ return null;
62
+ }
63
+ });
64
+ // Depends only on these three inputs; whatever the store reads while opening must not retrigger it.
65
+ effect(() => {
66
+ const [visible, data, id] = [this.visible(), this.bookingData(), this.bookingId()];
67
+ if (visible)
68
+ untracked(() => this.store.open(data, id));
69
+ }, { allowSignalWrites: true });
70
+ }
71
+ onServiceChosen(service) {
72
+ if (service === 'upgrade_class')
73
+ this.upgrade.start();
74
+ else
75
+ this.store.chooseService(service);
76
+ }
77
+ /** Back from the options returns to "select leg" only when that step was shown (the upgrade store knows). */
78
+ onBack() {
79
+ if (this.store.step() === 'upgrade')
80
+ this.upgrade.back();
81
+ else
82
+ this.store.back();
83
+ }
84
+ /** The payment link expired: redo the whole reissue from the start (a new post-booking, the service list again). */
85
+ restartFlow() {
86
+ this.store.open(this.bookingData(), this.bookingId());
87
+ }
88
+ /** Redirects to the web search (new tab: the agent keeps the dashboard open next to the web flow). */
89
+ async searchFlights() {
90
+ const url = this.store.searchUrl();
91
+ if (!url)
92
+ return;
93
+ // Open the tab now, inside the click, so the browser does not block it while the host's token is awaited.
94
+ const tab = window.open('about:blank', '_blank');
95
+ const finalUrl = appendAuthParams(url, await this.redirectAuthParams(), this.config.redirectAuthIn);
96
+ if (tab) {
97
+ tab.opener = null; // same protection as `noopener`
98
+ tab.location.href = finalUrl;
99
+ }
100
+ else {
101
+ window.open(finalUrl, '_blank', 'noopener');
102
+ }
103
+ this.closed.emit();
104
+ }
105
+ /** The host's auth parameters for the web link; `{}` when it has none or it fails (the web then asks to log in). */
106
+ async redirectAuthParams() {
107
+ const provide = this.config.redirectAuthParams;
108
+ if (!provide)
109
+ return {};
110
+ try {
111
+ const result = runInInjectionContext(this.injector, provide);
112
+ return (isObservable(result) ? await firstValueFrom(result) : await result) ?? {};
113
+ }
114
+ catch {
115
+ return {};
116
+ }
117
+ }
118
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: SbdReissueDialogComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
119
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: SbdReissueDialogComponent, isStandalone: true, selector: "app-sbd-reissue-dialog", inputs: { visible: { classPropertyName: "visible", publicName: "visible", isSignal: true, isRequired: false, transformFunction: null }, bookingId: { classPropertyName: "bookingId", publicName: "bookingId", isSignal: true, isRequired: false, transformFunction: null }, bookingData: { classPropertyName: "bookingData", publicName: "bookingData", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { closed: "closed" }, providers: [SbdReissueStore, SbdReissueUpgradeStore], ngImport: i0, template: "<p-dialog [visible]=\"visible()\" (visibleChange)=\"$event ? null : closed.emit()\"\n [modal]=\"true\" [blockScroll]=\"true\" [draggable]=\"false\" [resizable]=\"false\"\n [showHeader]=\"false\" [style]=\"{ width: '560px', padding: '0' }\" styleClass=\"sbd-reissue-dialog-wrapper\">\n\n <div class=\"sbd-reissue\">\n\n <!-- Header: same layout as the cancel dialog (round close button, centered title + booking id) -->\n <div class=\"sbd-reissue__header\">\n <button type=\"button\" class=\"sbd-reissue__close\" (click)=\"closed.emit()\" aria-label=\"Close\">\n <i class=\"pi pi-times\"></i>\n </button>\n <div class=\"sbd-reissue__header-text\">\n <h3 class=\"sbd-reissue__title\">{{ title() }}</h3>\n <span class=\"sbd-reissue__sub\">Booking ID #{{ bookingId() }}</span>\n </div>\n </div>\n\n @if (store.loading()) {\n <div class=\"sbd-reissue__state\">\n <div class=\"sbd-reissue__state-icon\"><i class=\"pi pi-spin pi-spinner\"></i></div>\n <div class=\"sbd-reissue__state-text\">Checking availability\u2026</div>\n <div class=\"sbd-reissue__dots\"><span></span><span></span><span></span></div>\n </div>\n } @else if (store.error()) {\n <div class=\"sbd-reissue__state\">\n <div class=\"sbd-reissue__state-icon sbd-reissue__state-icon--warn\"><i class=\"pi pi-exclamation-triangle\"></i></div>\n <div class=\"sbd-reissue__state-text\">{{ store.error() }}</div>\n <button pButton type=\"button\" label=\"Retry\" class=\"p-button-outlined p-button-secondary\" (click)=\"store.load()\"></button>\n </div>\n } @else if (store.blocked()) {\n <!-- No leg can be reissued online: same idea as the cancel dialog's \"not eligible, escalate\" notice. -->\n <div class=\"sbd-reissue__body\">\n <app-sbd-reissue-notice tone=\"warn\" icon=\"pi pi-exclamation-triangle\">\n <strong>{{ store.blocked()?.title }}</strong><br>{{ store.blocked()?.text }}\n </app-sbd-reissue-notice>\n </div>\n <div class=\"sbd-reissue__footer\">\n <button pButton type=\"button\" label=\"Close\" class=\"p-button-outlined p-button-secondary sbd-reissue__btn\"\n (click)=\"closed.emit()\"></button>\n </div>\n } @else {\n <div class=\"sbd-reissue__body\">\n @switch (store.step()) {\n @case ('service') {\n <app-sbd-reissue-notice>Change requests are subject to availability from the airline.</app-sbd-reissue-notice>\n <app-sbd-reissue-service-step\n [upgradeAvailable]=\"store.upgradeAvailable()\"\n (chosen)=\"onServiceChosen($event)\" />\n }\n @case ('legs') {\n <app-sbd-reissue-legs-step\n [rows]=\"store.legRows()\"\n [anyAvailable]=\"store.anyAvailable()\"\n (toggled)=\"store.toggleLeg($event)\" />\n }\n @case ('edit') {\n @if (store.service() === 'change_date') {\n <app-sbd-reissue-date-step\n [rows]=\"store.dateRows()\"\n (changed)=\"store.setDate($event.legId, $event.date)\" />\n } @else {\n <app-sbd-reissue-route-step\n [rows]=\"store.routeRows()\"\n [options]=\"store.airportOptions()\"\n (airportChanged)=\"store.setAirport($event.legId, $event.side, $event.airport)\"\n (searched)=\"store.searchAirports($event)\"\n (swapped)=\"store.swapAirports($event)\" />\n }\n }\n @case ('upgrade-legs') {\n <app-sbd-reissue-legs-step\n unavailableText=\"None of these flights can be upgraded online. Handle this booking manually.\"\n [rows]=\"upgrade.legRows()\"\n [anyAvailable]=\"upgrade.anyLegUpgradable()\"\n [note]=\"store.allowSingleLegSelection() ? null : 'These flights must be upgraded together.'\"\n [error]=\"upgrade.error()\"\n (toggled)=\"upgrade.toggleLeg($event)\" />\n }\n @case ('upgrade') {\n <app-sbd-reissue-upgrade-step\n [sections]=\"upgrade.sections()\"\n [error]=\"upgrade.error()\"\n (picked)=\"upgrade.select($event.sectionId, $event.key)\" />\n }\n @case ('confirm') {\n <app-sbd-reissue-upgrade-confirm-step\n [rows]=\"upgrade.summary()\"\n [total]=\"upgrade.total()\"\n [totalLabel]=\"upgrade.totalLabel()\"\n [priceChanged]=\"upgrade.priceChanged()\"\n [booked]=\"upgrade.booked()\"\n [link]=\"upgrade.paymentLink()\"\n [error]=\"upgrade.error()\"\n (restart)=\"restartFlow()\" />\n }\n }\n </div>\n\n @if (hint(); as text) {\n <div class=\"sbd-reissue__hint\">{{ text }}</div>\n }\n\n @if (store.step() !== 'service') {\n <div class=\"sbd-reissue__footer\">\n <button pButton type=\"button\" label=\"Back\" class=\"p-button-outlined p-button-secondary sbd-reissue__btn\"\n [disabled]=\"store.step() === 'confirm' && upgrade.locked()\" (click)=\"onBack()\"></button>\n\n @switch (store.step()) {\n @case ('legs') {\n <button pButton type=\"button\" label=\"Continue\" class=\"sbd-reissue__btn\"\n [disabled]=\"!store.canContinue()\" (click)=\"store.goToEdit()\"></button>\n }\n @case ('edit') {\n <button pButton type=\"button\" icon=\"pi pi-search\" label=\"Search flights\" class=\"sbd-reissue__btn\"\n [disabled]=\"!!store.validationError()\" (click)=\"searchFlights()\"></button>\n }\n @case ('upgrade-legs') {\n <button pButton type=\"button\" label=\"Continue\" class=\"sbd-reissue__btn\" [loading]=\"upgrade.submitting()\"\n [disabled]=\"!upgrade.canContinueFromLegs()\" (click)=\"upgrade.continueFromLegs()\"></button>\n }\n @case ('upgrade') {\n <button pButton type=\"button\" label=\"Continue\" class=\"sbd-reissue__btn\" [loading]=\"upgrade.submitting()\"\n [disabled]=\"!upgrade.canContinue()\" (click)=\"upgrade.continue()\"></button>\n }\n @case ('confirm') {\n @switch (upgrade.action()) {\n @case ('done') {\n <button pButton type=\"button\" label=\"Close\" class=\"sbd-reissue__btn\" (click)=\"closed.emit()\"></button>\n }\n @case ('book') {\n <button pButton type=\"button\" label=\"Confirm upgrade\" class=\"sbd-reissue__btn\"\n [loading]=\"upgrade.submitting()\" (click)=\"upgrade.confirm()\"></button>\n }\n @case ('link') {\n <button pButton type=\"button\" icon=\"pi pi-link\" label=\"Generate payment link\" class=\"sbd-reissue__btn\"\n [loading]=\"upgrade.submitting()\" (click)=\"upgrade.confirm()\"></button>\n }\n }\n }\n }\n </div>\n }\n }\n </div>\n</p-dialog>\n", styles: [":host ::ng-deep .sbd-reissue-dialog-wrapper{border-radius:16px;box-shadow:0 24px 60px #0f172a38}:host ::ng-deep .sbd-reissue-dialog-wrapper .p-dialog-content{padding:0;border-radius:16px;overflow:visible}.sbd-reissue{font-family:inherit;position:relative}.sbd-reissue__header{display:flex;align-items:flex-start;gap:12px;padding:20px 20px 0}.sbd-reissue__close{flex-shrink:0;width:32px;height:32px;border-radius:50%;background:#f8fafc;border:none;color:#1e2e4a;display:flex;align-items:center;justify-content:center;cursor:pointer}.sbd-reissue__close .pi{font-size:13px}.sbd-reissue__close:hover{background:#e2e8f0}.sbd-reissue__header-text{flex:1;display:flex;flex-direction:column;align-items:center;gap:4px;text-align:center;margin-right:32px}.sbd-reissue__title{font-size:19px;font-weight:800;color:#1e2e4a;margin:0}.sbd-reissue__sub{font-size:12.5px;color:#94a3b8}.sbd-reissue__body{padding:16px 20px 20px;display:flex;flex-direction:column;gap:12px}.sbd-reissue__hint{text-align:center;padding:0 20px 12px;font-size:13px;color:#94a3b8}.sbd-reissue__footer{display:flex;justify-content:flex-end;gap:10px;align-items:stretch;padding:14px 20px;border-top:1px solid #e2e8f0;background:#fff;border-radius:0 0 16px 16px}.sbd-reissue__btn{flex:1 1 0;justify-content:center}.sbd-reissue__state{padding:36px 24px 28px;display:flex;flex-direction:column;align-items:center;gap:14px;text-align:center}.sbd-reissue__state-icon{width:56px;height:56px;border-radius:50%;background:#fff7ed;border:2px solid #fed7aa;display:flex;align-items:center;justify-content:center}.sbd-reissue__state-icon .pi{font-size:24px;color:#f97316}.sbd-reissue__state-icon--warn{background:#fef2f2;border-color:#fecaca}.sbd-reissue__state-icon--warn .pi{color:#ef4444}.sbd-reissue__state-text{font-size:13px;color:#64748b;min-height:20px}.sbd-reissue__dots{display:flex;gap:6px}.sbd-reissue__dots span{width:7px;height:7px;border-radius:50%;background:#f97316;opacity:.3;animation:sbd-reissue-dot 1.2s ease-in-out infinite}.sbd-reissue__dots span:nth-child(2){animation-delay:.2s}.sbd-reissue__dots span:nth-child(3){animation-delay:.4s}@keyframes sbd-reissue-dot{0%,to{opacity:.3;transform:scale(1)}50%{opacity:1;transform:scale(1.4)}}\n"], dependencies: [{ kind: "ngmodule", type: DialogModule }, { kind: "component", type: i1.Dialog, selector: "p-dialog", inputs: ["header", "draggable", "resizable", "positionLeft", "positionTop", "contentStyle", "contentStyleClass", "modal", "closeOnEscape", "dismissableMask", "rtl", "closable", "responsive", "appendTo", "breakpoints", "styleClass", "maskStyleClass", "showHeader", "breakpoint", "blockScroll", "autoZIndex", "baseZIndex", "minX", "minY", "focusOnShow", "maximizable", "keepInViewport", "focusTrap", "transitionOptions", "closeIcon", "closeAriaLabel", "closeTabindex", "minimizeIcon", "maximizeIcon", "visible", "style", "position"], outputs: ["onShow", "onHide", "visibleChange", "onResizeInit", "onResizeEnd", "onDragEnd", "onMaximize"] }, { kind: "ngmodule", type: ButtonModule }, { kind: "directive", type: i2.ButtonDirective, selector: "[pButton]", inputs: ["iconPos", "loadingIcon", "label", "icon", "loading"] }, { kind: "component", type: SbdReissueNoticeComponent, selector: "app-sbd-reissue-notice", inputs: ["icon", "tone"] }, { kind: "component", type: SbdReissueServiceStepComponent, selector: "app-sbd-reissue-service-step", inputs: ["upgradeAvailable"], outputs: ["chosen"] }, { kind: "component", type: SbdReissueLegsStepComponent, selector: "app-sbd-reissue-legs-step", inputs: ["rows", "anyAvailable", "unavailableText", "note", "error"], outputs: ["toggled"] }, { kind: "component", type: SbdReissueDateStepComponent, selector: "app-sbd-reissue-date-step", inputs: ["rows"], outputs: ["changed"] }, { kind: "component", type: SbdReissueRouteStepComponent, selector: "app-sbd-reissue-route-step", inputs: ["rows", "options"], outputs: ["airportChanged", "searched", "swapped"] }, { kind: "component", type: SbdReissueUpgradeStepComponent, selector: "app-sbd-reissue-upgrade-step", inputs: ["sections", "error"], outputs: ["picked"] }, { kind: "component", type: SbdReissueUpgradeConfirmStepComponent, selector: "app-sbd-reissue-upgrade-confirm-step", inputs: ["rows", "total", "totalLabel", "priceChanged", "booked", "link", "error"], outputs: ["restart"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
120
+ }
121
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: SbdReissueDialogComponent, decorators: [{
122
+ type: Component,
123
+ args: [{ selector: 'app-sbd-reissue-dialog', standalone: true, imports: [
124
+ DialogModule,
125
+ ButtonModule,
126
+ SbdReissueNoticeComponent,
127
+ SbdReissueServiceStepComponent,
128
+ SbdReissueLegsStepComponent,
129
+ SbdReissueDateStepComponent,
130
+ SbdReissueRouteStepComponent,
131
+ SbdReissueUpgradeStepComponent,
132
+ SbdReissueUpgradeConfirmStepComponent,
133
+ ], providers: [SbdReissueStore, SbdReissueUpgradeStore], changeDetection: ChangeDetectionStrategy.OnPush, template: "<p-dialog [visible]=\"visible()\" (visibleChange)=\"$event ? null : closed.emit()\"\n [modal]=\"true\" [blockScroll]=\"true\" [draggable]=\"false\" [resizable]=\"false\"\n [showHeader]=\"false\" [style]=\"{ width: '560px', padding: '0' }\" styleClass=\"sbd-reissue-dialog-wrapper\">\n\n <div class=\"sbd-reissue\">\n\n <!-- Header: same layout as the cancel dialog (round close button, centered title + booking id) -->\n <div class=\"sbd-reissue__header\">\n <button type=\"button\" class=\"sbd-reissue__close\" (click)=\"closed.emit()\" aria-label=\"Close\">\n <i class=\"pi pi-times\"></i>\n </button>\n <div class=\"sbd-reissue__header-text\">\n <h3 class=\"sbd-reissue__title\">{{ title() }}</h3>\n <span class=\"sbd-reissue__sub\">Booking ID #{{ bookingId() }}</span>\n </div>\n </div>\n\n @if (store.loading()) {\n <div class=\"sbd-reissue__state\">\n <div class=\"sbd-reissue__state-icon\"><i class=\"pi pi-spin pi-spinner\"></i></div>\n <div class=\"sbd-reissue__state-text\">Checking availability\u2026</div>\n <div class=\"sbd-reissue__dots\"><span></span><span></span><span></span></div>\n </div>\n } @else if (store.error()) {\n <div class=\"sbd-reissue__state\">\n <div class=\"sbd-reissue__state-icon sbd-reissue__state-icon--warn\"><i class=\"pi pi-exclamation-triangle\"></i></div>\n <div class=\"sbd-reissue__state-text\">{{ store.error() }}</div>\n <button pButton type=\"button\" label=\"Retry\" class=\"p-button-outlined p-button-secondary\" (click)=\"store.load()\"></button>\n </div>\n } @else if (store.blocked()) {\n <!-- No leg can be reissued online: same idea as the cancel dialog's \"not eligible, escalate\" notice. -->\n <div class=\"sbd-reissue__body\">\n <app-sbd-reissue-notice tone=\"warn\" icon=\"pi pi-exclamation-triangle\">\n <strong>{{ store.blocked()?.title }}</strong><br>{{ store.blocked()?.text }}\n </app-sbd-reissue-notice>\n </div>\n <div class=\"sbd-reissue__footer\">\n <button pButton type=\"button\" label=\"Close\" class=\"p-button-outlined p-button-secondary sbd-reissue__btn\"\n (click)=\"closed.emit()\"></button>\n </div>\n } @else {\n <div class=\"sbd-reissue__body\">\n @switch (store.step()) {\n @case ('service') {\n <app-sbd-reissue-notice>Change requests are subject to availability from the airline.</app-sbd-reissue-notice>\n <app-sbd-reissue-service-step\n [upgradeAvailable]=\"store.upgradeAvailable()\"\n (chosen)=\"onServiceChosen($event)\" />\n }\n @case ('legs') {\n <app-sbd-reissue-legs-step\n [rows]=\"store.legRows()\"\n [anyAvailable]=\"store.anyAvailable()\"\n (toggled)=\"store.toggleLeg($event)\" />\n }\n @case ('edit') {\n @if (store.service() === 'change_date') {\n <app-sbd-reissue-date-step\n [rows]=\"store.dateRows()\"\n (changed)=\"store.setDate($event.legId, $event.date)\" />\n } @else {\n <app-sbd-reissue-route-step\n [rows]=\"store.routeRows()\"\n [options]=\"store.airportOptions()\"\n (airportChanged)=\"store.setAirport($event.legId, $event.side, $event.airport)\"\n (searched)=\"store.searchAirports($event)\"\n (swapped)=\"store.swapAirports($event)\" />\n }\n }\n @case ('upgrade-legs') {\n <app-sbd-reissue-legs-step\n unavailableText=\"None of these flights can be upgraded online. Handle this booking manually.\"\n [rows]=\"upgrade.legRows()\"\n [anyAvailable]=\"upgrade.anyLegUpgradable()\"\n [note]=\"store.allowSingleLegSelection() ? null : 'These flights must be upgraded together.'\"\n [error]=\"upgrade.error()\"\n (toggled)=\"upgrade.toggleLeg($event)\" />\n }\n @case ('upgrade') {\n <app-sbd-reissue-upgrade-step\n [sections]=\"upgrade.sections()\"\n [error]=\"upgrade.error()\"\n (picked)=\"upgrade.select($event.sectionId, $event.key)\" />\n }\n @case ('confirm') {\n <app-sbd-reissue-upgrade-confirm-step\n [rows]=\"upgrade.summary()\"\n [total]=\"upgrade.total()\"\n [totalLabel]=\"upgrade.totalLabel()\"\n [priceChanged]=\"upgrade.priceChanged()\"\n [booked]=\"upgrade.booked()\"\n [link]=\"upgrade.paymentLink()\"\n [error]=\"upgrade.error()\"\n (restart)=\"restartFlow()\" />\n }\n }\n </div>\n\n @if (hint(); as text) {\n <div class=\"sbd-reissue__hint\">{{ text }}</div>\n }\n\n @if (store.step() !== 'service') {\n <div class=\"sbd-reissue__footer\">\n <button pButton type=\"button\" label=\"Back\" class=\"p-button-outlined p-button-secondary sbd-reissue__btn\"\n [disabled]=\"store.step() === 'confirm' && upgrade.locked()\" (click)=\"onBack()\"></button>\n\n @switch (store.step()) {\n @case ('legs') {\n <button pButton type=\"button\" label=\"Continue\" class=\"sbd-reissue__btn\"\n [disabled]=\"!store.canContinue()\" (click)=\"store.goToEdit()\"></button>\n }\n @case ('edit') {\n <button pButton type=\"button\" icon=\"pi pi-search\" label=\"Search flights\" class=\"sbd-reissue__btn\"\n [disabled]=\"!!store.validationError()\" (click)=\"searchFlights()\"></button>\n }\n @case ('upgrade-legs') {\n <button pButton type=\"button\" label=\"Continue\" class=\"sbd-reissue__btn\" [loading]=\"upgrade.submitting()\"\n [disabled]=\"!upgrade.canContinueFromLegs()\" (click)=\"upgrade.continueFromLegs()\"></button>\n }\n @case ('upgrade') {\n <button pButton type=\"button\" label=\"Continue\" class=\"sbd-reissue__btn\" [loading]=\"upgrade.submitting()\"\n [disabled]=\"!upgrade.canContinue()\" (click)=\"upgrade.continue()\"></button>\n }\n @case ('confirm') {\n @switch (upgrade.action()) {\n @case ('done') {\n <button pButton type=\"button\" label=\"Close\" class=\"sbd-reissue__btn\" (click)=\"closed.emit()\"></button>\n }\n @case ('book') {\n <button pButton type=\"button\" label=\"Confirm upgrade\" class=\"sbd-reissue__btn\"\n [loading]=\"upgrade.submitting()\" (click)=\"upgrade.confirm()\"></button>\n }\n @case ('link') {\n <button pButton type=\"button\" icon=\"pi pi-link\" label=\"Generate payment link\" class=\"sbd-reissue__btn\"\n [loading]=\"upgrade.submitting()\" (click)=\"upgrade.confirm()\"></button>\n }\n }\n }\n }\n </div>\n }\n }\n </div>\n</p-dialog>\n", styles: [":host ::ng-deep .sbd-reissue-dialog-wrapper{border-radius:16px;box-shadow:0 24px 60px #0f172a38}:host ::ng-deep .sbd-reissue-dialog-wrapper .p-dialog-content{padding:0;border-radius:16px;overflow:visible}.sbd-reissue{font-family:inherit;position:relative}.sbd-reissue__header{display:flex;align-items:flex-start;gap:12px;padding:20px 20px 0}.sbd-reissue__close{flex-shrink:0;width:32px;height:32px;border-radius:50%;background:#f8fafc;border:none;color:#1e2e4a;display:flex;align-items:center;justify-content:center;cursor:pointer}.sbd-reissue__close .pi{font-size:13px}.sbd-reissue__close:hover{background:#e2e8f0}.sbd-reissue__header-text{flex:1;display:flex;flex-direction:column;align-items:center;gap:4px;text-align:center;margin-right:32px}.sbd-reissue__title{font-size:19px;font-weight:800;color:#1e2e4a;margin:0}.sbd-reissue__sub{font-size:12.5px;color:#94a3b8}.sbd-reissue__body{padding:16px 20px 20px;display:flex;flex-direction:column;gap:12px}.sbd-reissue__hint{text-align:center;padding:0 20px 12px;font-size:13px;color:#94a3b8}.sbd-reissue__footer{display:flex;justify-content:flex-end;gap:10px;align-items:stretch;padding:14px 20px;border-top:1px solid #e2e8f0;background:#fff;border-radius:0 0 16px 16px}.sbd-reissue__btn{flex:1 1 0;justify-content:center}.sbd-reissue__state{padding:36px 24px 28px;display:flex;flex-direction:column;align-items:center;gap:14px;text-align:center}.sbd-reissue__state-icon{width:56px;height:56px;border-radius:50%;background:#fff7ed;border:2px solid #fed7aa;display:flex;align-items:center;justify-content:center}.sbd-reissue__state-icon .pi{font-size:24px;color:#f97316}.sbd-reissue__state-icon--warn{background:#fef2f2;border-color:#fecaca}.sbd-reissue__state-icon--warn .pi{color:#ef4444}.sbd-reissue__state-text{font-size:13px;color:#64748b;min-height:20px}.sbd-reissue__dots{display:flex;gap:6px}.sbd-reissue__dots span{width:7px;height:7px;border-radius:50%;background:#f97316;opacity:.3;animation:sbd-reissue-dot 1.2s ease-in-out infinite}.sbd-reissue__dots span:nth-child(2){animation-delay:.2s}.sbd-reissue__dots span:nth-child(3){animation-delay:.4s}@keyframes sbd-reissue-dot{0%,to{opacity:.3;transform:scale(1)}50%{opacity:1;transform:scale(1.4)}}\n"] }]
134
+ }], ctorParameters: () => [] });
135
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVpc3N1ZS1kaWFsb2cuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvc21hcnQtYm9va2luZy1kYXNoYm9hcmQvc3JjL2xpYi9jb21wb25lbnRzL3JlaXNzdWUtZGlhbG9nL3JlaXNzdWUtZGlhbG9nLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3NtYXJ0LWJvb2tpbmctZGFzaGJvYXJkL3NyYy9saWIvY29tcG9uZW50cy9yZWlzc3VlLWRpYWxvZy9yZWlzc3VlLWRpYWxvZy5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0wsdUJBQXVCLEVBQ3ZCLFNBQVMsRUFDVCxRQUFRLEVBQ1IsUUFBUSxFQUNSLE1BQU0sRUFDTixNQUFNLEVBQ04sS0FBSyxFQUNMLE1BQU0sRUFDTixxQkFBcUIsRUFDckIsU0FBUyxHQUNWLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxjQUFjLEVBQUUsWUFBWSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQ3BELE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUM5QyxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFFOUMsT0FBTyxFQUFFLFVBQVUsRUFBeUIsTUFBTSwrQkFBK0IsQ0FBQztBQUNsRixPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQztBQUVuRSxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDbEQsT0FBTyxFQUFFLHNCQUFzQixFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDakUsT0FBTyxFQUFFLDhCQUE4QixFQUFFLE1BQU0sNkRBQTZELENBQUM7QUFDN0csT0FBTyxFQUFFLHFDQUFxQyxFQUFFLE1BQU0sNkVBQTZFLENBQUM7QUFDcEksT0FBTyxFQUFFLHlCQUF5QixFQUFF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QUM7SUFDSCxDQUFDOytHQWpHVSx5QkFBeUI7bUdBQXpCLHlCQUF5Qiw0ZkFMekIsQ0FBQyxlQUFlLEVBQUUsc0JBQXNCLENBQUMsMEJDL0N0RCx1bE9BaUpBLDB0RUQ1R0ksWUFBWSwwdEJBQ1osWUFBWSx1S0FDWix5QkFBeUIsNkZBQ3pCLDhCQUE4Qiw0SEFDOUIsMkJBQTJCLGtLQUMzQiwyQkFBMkIsOEdBQzNCLDRCQUE0Qix3SkFDNUIsOEJBQThCLDZIQUM5QixxQ0FBcUM7OzRGQU81Qix5QkFBeUI7a0JBbkJyQyxTQUFTOytCQUNFLHdCQUF3QixjQUN0QixJQUFJLFdBQ1A7d0JBQ1AsWUFBWTt3QkFDWixZQUFZO3dCQUNaLHlCQUF5Qjt3QkFDekIsOEJBQThCO3dCQUM5QiwyQkFBMkI7d0JBQzNCLDJCQUEyQjt3QkFDM0IsNEJBQTRCO3dCQUM1Qiw4QkFBOEI7d0JBQzlCLHFDQUFxQztxQkFDdEMsYUFDVSxDQUFDLGVBQWUsRUFBRSxzQkFBc0IsQ0FBQyxtQkFDbkMsdUJBQXVCLENBQUMsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LFxuICBDb21wb25lbnQsXG4gIEluamVjdG9yLFxuICBjb21wdXRlZCxcbiAgZWZmZWN0LFxuICBpbmplY3QsXG4gIGlucHV0LFxuICBvdXRwdXQsXG4gIHJ1bkluSW5qZWN0aW9uQ29udGV4dCxcbiAgdW50cmFja2VkLFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IGZpcnN0VmFsdWVGcm9tLCBpc09ic2VydmFibGUgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IERpYWxvZ01vZHVsZSB9IGZyb20gJ3ByaW1lbmcvZGlhbG9nJztcbmltcG9ydCB7IEJ1dHRvbk1vZHVsZSB9IGZyb20gJ3ByaW1lbmcvYnV0dG9uJztcblxuaW1wb3J0IHsgU0JEX0NPTkZJRywgU2JkUmVkaXJlY3RBdXRoUGFyYW1zIH0gZnJvbSAnLi4vLi4vY29uZmlnL2Rhc2hib2FyZC5jb25maWcnO1xuaW1wb3J0IHsgYXBwZW5kQXV0aFBhcmFtcyB9IGZyb20gJy4uLy4uL3V0aWxzL3JlaXNzdWUtdXJsLmJ1aWxkZXInO1xuaW1wb3J0IHsgUmVpc3N1ZVNlcnZpY2VLZXkgfSBmcm9tICcuLi8uLi9tb2RlbHMvcmVpc3N1ZS50eXBlcyc7XG5pbXBvcnQgeyBTYmRSZWlzc3VlU3RvcmUgfSBmcm9tICcuL3JlaXNzdWUuc3RvcmUnO1xuaW1wb3J0IHsgU2JkUmVpc3N1ZVVwZ3JhZGVTdG9yZSB9IGZyb20gJy4vcmVpc3N1ZS11cGdyYWRlLnN0b3JlJztcbmltcG9ydCB7IFNiZFJlaXNzdWVVcGdyYWRlU3RlcENvbXBvbmVudCB9IGZyb20gJy4vc3RlcHMvcmVpc3N1ZS11cGdyYWRlLXN0ZXAvcmVpc3N1ZS11cGdyYWRlLXN0ZXAuY29tcG9uZW50JztcbmltcG9ydCB7IFNiZFJlaXNzdWVVcGdyYWRlQ29uZmlybVN0ZXBDb21wb25lbnQgfSBmcm9tICcuL3N0ZXBzL3JlaXNzdWUtdXBncmFkZS1jb25maXJtLXN0ZXAvcmVpc3N1ZS11cGdyYWRlLWNvbmZpcm0tc3RlcC5jb21wb25lbnQnO1xuaW1wb3J0IHsgU2JkUmVpc3N1ZU5vdGljZUNvbXBvbmVudCB9IGZyb20gJy4vc3RlcHMvcmVpc3N1ZS1ub3RpY2UvcmVpc3N1ZS1ub3RpY2UuY29tcG9uZW50JztcbmltcG9ydCB7IFNiZFJlaXNzdWVTZXJ2aWNlU3RlcENvbXBvbmVudCB9IGZyb20gJy4vc3RlcHMvcmVpc3N1ZS1zZXJ2aWNlLXN0ZXAvcmVpc3N1ZS1zZXJ2aWNlLXN0ZXAuY29tcG9uZW50JztcbmltcG9ydCB7IFNiZFJlaXNzdWVMZWdzU3RlcENvbXBvbmVudCB9IGZyb20gJy4vc3RlcHMvcmVpc3N1ZS1sZWdzLXN0ZXAvcmVpc3N1ZS1sZWdzLXN0ZXAuY29tcG9uZW50JztcbmltcG9ydCB7IFNiZFJlaXNzdWVEYXRlU3RlcENvbXBvbmVudCB9IGZyb20gJy4vc3RlcHMvcmVpc3N1ZS1kYXRlLXN0ZXAvcmVpc3N1ZS1kYXRlLXN0ZXAuY29tcG9uZW50JztcbmltcG9ydCB7IFNiZFJlaXNzdWVSb3V0ZVN0ZXBDb21wb25lbnQgfSBmcm9tICcuL3N0ZXBzL3JlaXNzdWUtcm91dGUtc3RlcC9yZWlzc3VlLXJvdXRlLXN0ZXAuY29tcG9uZW50JztcblxuLyoqXG4gKiBSZWlzc3VlIGRpYWxvZyBzaGVsbDogb3ducyB0aGUgcC1kaWFsb2csIHRoZSBsb2FkaW5nIC8gZXJyb3Igc3RhdGVzIGFuZCB0aGUgZm9vdGVyLCBhbmQgc3dhcHMgdGhlIHN0ZXBcbiAqIGNvbXBvbmVudHMuIEFsbCBzdGF0ZSBhbmQgcnVsZXMgbGl2ZSBpbiBgU2JkUmVpc3N1ZVN0b3JlYDsgdGhlIHN0ZXBzIG9ubHkgcmVuZGVyIGFuZCBlbWl0LlxuICovXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdhcHAtc2JkLXJlaXNzdWUtZGlhbG9nJyxcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgaW1wb3J0czogW1xuICAgIERpYWxvZ01vZHVsZSxcbiAgICBCdXR0b25Nb2R1bGUsXG4gICAgU2JkUmVpc3N1ZU5vdGljZUNvbXBvbmVudCxcbiAgICBTYmRSZWlzc3VlU2VydmljZVN0ZXBDb21wb25lbnQsXG4gICAgU2JkUmVpc3N1ZUxlZ3NTdGVwQ29tcG9uZW50LFxuICAgIFNiZFJlaXNzdWVEYXRlU3RlcENvbXBvbmVudCxcbiAgICBTYmRSZWlzc3VlUm91dGVTdGVwQ29tcG9uZW50LFxuICAgIFNiZFJlaXNzdWVVcGdyYWRlU3RlcENvbXBvbmVudCxcbiAgICBTYmRSZWlzc3VlVXBncmFkZUNvbmZpcm1TdGVwQ29tcG9uZW50LFxuICBdLFxuICBwcm92aWRlcnM6IFtTYmRSZWlzc3VlU3RvcmUsIFNiZFJlaXNzdWVVcGdyYWRlU3RvcmVdLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbiAgdGVtcGxhdGVVcmw6ICcuL3JlaXNzdWUtZGlhbG9nLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmw6ICcuL3JlaXNzdWUtZGlhbG9nLmNvbXBvbmVudC5zY3NzJyxcbn0pXG5leHBvcnQgY2xhc3MgU2JkUmVpc3N1ZURpYWxvZ0NvbXBvbmVudCB7XG4gIHByb3RlY3RlZCByZWFkb25seSBzdG9yZSA9IGluamVjdChTYmRSZWlzc3VlU3RvcmUpO1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgdXBncmFkZSA9IGluamVjdChTYmRSZWlzc3VlVXBncmFkZVN0b3JlKTtcbiAgcHJpdmF0ZSByZWFkb25seSBjb25maWcgPSBpbmplY3QoU0JEX0NPTkZJRyk7XG4gIHByaXZhdGUgcmVhZG9ubHkgaW5qZWN0b3IgPSBpbmplY3QoSW5qZWN0b3IpO1xuXG4gIHZpc2libGUgPSBpbnB1dChmYWxzZSk7XG4gIGJvb2tpbmdJZCA9IGlucHV0KCcnKTtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgYm9va2luZ0RhdGEgPSBpbnB1dDxhbnkgfCBudWxsPihudWxsKTtcbiAgY2xvc2VkID0gb3V0cHV0PHZvaWQ+KCk7XG5cbiAgLyoqIEhlYWRlciB0aXRsZSBwZXIgc2NyZWVuLCBsaWtlIHRoZSBjYW5jZWwgZGlhbG9nJ3MgXCJTZWxlY3QgTGVnIHRvIENhbmNlbFwiIC8gXCJSZWZ1bmQgTWV0aG9kXCIuICovXG4gIHByb3RlY3RlZCByZWFkb25seSB0aXRsZSA9IGNvbXB1dGVkKCgpID0+IHtcbiAgICBzd2l0Y2ggKHRoaXMuc3RvcmUuc3RlcCgpKSB7XG4gICAgICBjYXNlICdsZWdzJzogcmV0dXJuICdTZWxlY3QgRmxpZ2h0IHRvIENoYW5nZSc7XG4gICAgICBjYXNlICdlZGl0JzogcmV0dXJuIHRoaXMuc3RvcmUuc2VydmljZSgpID09PSAnY2hhbmdlX2RhdGUnID8gJ0Nob29zZSBOZXcgRGF0ZScgOiAnQ2hvb3NlIE5ldyBSb3V0ZSc7XG4gICAgICBjYXNlICd1cGdyYWRlLWxlZ3MnOiByZXR1cm4gJ1NlbGVjdCBGbGlnaHQgdG8gVXBncmFkZSc7XG4gICAgICBjYXNlICd1cGdyYWRlJzogcmV0dXJuICdDaG9vc2UgTmV3IENsYXNzJztcbiAgICAgIGNhc2UgJ2NvbmZpcm0nOiByZXR1cm4gJ1JldmlldyBVcGdyYWRlJztcbiAgICAgIGRlZmF1bHQ6IHJldHVybiAnUmVpc3N1ZSBCb29raW5nJztcbiAgICB9XG4gIH0pO1xuXG4gIC8qKiBHcmF5IGhpbnQgYWJvdmUgdGhlIGZvb3RlciAoY2FuY2VsJ3MgXCJTZWxlY3QgYXQgbGVhc3Qgb25lIGZsaWdodCB0byBjb250aW51ZVwiKSwgb3Igd2h5IFNlYXJjaCBpcyBkaXNhYmxlZC4gKi9cbiAgcHJvdGVjdGVkIHJlYWRvbmx5IGhpbnQgPSBjb21wdXRlZCgoKSA9PiB7XG4gICAgc3dpdGNoICh0aGlzLnN0b3JlLnN0ZXAoKSkge1xuICAgICAgY2FzZSAnbGVncyc6XG4gICAgICAgIHJldHVybiB0aGlzLnN0b3JlLmFueUF2YWlsYWJsZSgpICYmICF0aGlzLnN0b3JlLmNhbkNvbnRpbnVlKCkgPyAnU2VsZWN0IGF0IGxlYXN0IG9uZSBmbGlnaHQgdG8gY29udGludWUnIDogbnVsbDtcbiAgICAgIGNhc2UgJ2VkaXQnOlxuICAgICAgICByZXR1cm4gdGhpcy5zdG9yZS52YWxpZGF0aW9uRXJyb3IoKTtcbiAgICAgIGNhc2UgJ3VwZ3JhZGUtbGVncyc6XG4gICAgICAgIHJldHVybiB0aGlzLnVwZ3JhZGUuYW55TGVnVXBncmFkYWJsZSgpICYmICF0aGlzLnVwZ3JhZGUuY2FuQ29udGludWVGcm9tTGVncygpICYmICF0aGlzLnVwZ3JhZGUuc3VibWl0dGluZygpXG4gICAgICAgICAgPyAnU2VsZWN0IGF0IGxlYXN0IG9uZSBmbGlnaHQgdG8gY29udGludWUnXG4gICAgICAgICAgOiBudWxsO1xuICAgICAgY2FzZSAndXBncmFkZSc6XG4gICAgICAgIHJldHVybiB0aGlzLnVwZ3JhZGUuc2VjdGlvbnMoKS5zb21lKHMgPT4gcy5vcHRpb25zLmxlbmd0aCkgJiYgIXRoaXMudXBncmFkZS5jYW5Db250aW51ZSgpICYmICF0aGlzLnVwZ3JhZGUuc3VibWl0dGluZygpXG4gICAgICAgICAgPyAnU2VsZWN0IGEgY2xhc3MgdG8gY29udGludWUnXG4gICAgICAgICAgOiBudWxsO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICB9KTtcblxuICBjb25zdHJ1Y3RvcigpIHtcbiAgICAvLyBEZXBlbmRzIG9ubHkgb24gdGhlc2UgdGhyZWUgaW5wdXRzOyB3aGF0ZXZlciB0aGUgc3RvcmUgcmVhZHMgd2hpbGUgb3BlbmluZyBtdXN0IG5vdCByZXRyaWdnZXIgaXQuXG4gICAgZWZmZWN0KFxuICAgICAgKCkgPT4ge1xuICAgICAgICBjb25zdCBbdmlzaWJsZSwgZGF0YSwgaWRdID0gW3RoaXMudmlzaWJsZSgpLCB0aGlzLmJvb2tpbmdEYXRhKCksIHRoaXMuYm9va2luZ0lkKCldO1xuICAgICAgICBpZiAodmlzaWJsZSkgdW50cmFja2VkKCgpID0+IHRoaXMuc3RvcmUub3BlbihkYXRhLCBpZCkpO1xuICAgICAgfSxcbiAgICAgIHsgYWxsb3dTaWduYWxXcml0ZXM6IHRydWUgfSxcbiAgICApO1xuICB9XG5cbiAgcHJvdGVjdGVkIG9uU2VydmljZUNob3NlbihzZXJ2aWNlOiBSZWlzc3VlU2VydmljZUtleSk6IHZvaWQge1xuICAgIGlmIChzZXJ2aWNlID09PSAndXBncmFkZV9jbGFzcycpIHRoaXMudXBncmFkZS5zdGFydCgpO1xuICAgIGVsc2UgdGhpcy5zdG9yZS5jaG9vc2VTZXJ2aWNlKHNlcnZpY2UpO1xuICB9XG5cbiAgLyoqIEJhY2sgZnJvbSB0aGUgb3B0aW9ucyByZXR1cm5zIHRvIFwic2VsZWN0IGxlZ1wiIG9ubHkgd2hlbiB0aGF0IHN0ZXAgd2FzIHNob3duICh0aGUgdXBncmFkZSBzdG9yZSBrbm93cykuICovXG4gIHByb3RlY3RlZCBvbkJhY2soKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuc3RvcmUuc3RlcCgpID09PSAndXBncmFkZScpIHRoaXMudXBncmFkZS5iYWNrKCk7XG4gICAgZWxzZSB0aGlzLnN0b3JlLmJhY2soKTtcbiAgfVxuXG4gIC8qKiBUaGUgcGF5bWVudCBsaW5rIGV4cGlyZWQ6IHJlZG8gdGhlIHdob2xlIHJlaXNzdWUgZnJvbSB0aGUgc3RhcnQgKGEgbmV3IHBvc3QtYm9va2luZywgdGhlIHNlcnZpY2UgbGlzdCBhZ2FpbikuICovXG4gIHByb3RlY3RlZCByZXN0YXJ0RmxvdygpOiB2b2lkIHtcbiAgICB0aGlzLnN0b3JlLm9wZW4odGhpcy5ib29raW5nRGF0YSgpLCB0aGlzLmJvb2tpbmdJZCgpKTtcbiAgfVxuXG4gIC8qKiBSZWRpcmVjdHMgdG8gdGhlIHdlYiBzZWFyY2ggKG5ldyB0YWI6IHRoZSBhZ2VudCBrZWVwcyB0aGUgZGFzaGJvYXJkIG9wZW4gbmV4dCB0byB0aGUgd2ViIGZsb3cpLiAqL1xuICBwcm90ZWN0ZWQgYXN5bmMgc2VhcmNoRmxpZ2h0cygpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCB1cmwgPSB0aGlzLnN0b3JlLnNlYXJjaFVybCgpO1xuICAgIGlmICghdXJsKSByZXR1cm47XG4gICAgLy8gT3BlbiB0aGUgdGFiIG5vdywgaW5zaWRlIHRoZSBjbGljaywgc28gdGhlIGJyb3dzZXIgZG9lcyBub3QgYmxvY2sgaXQgd2hpbGUgdGhlIGhvc3QncyB0b2tlbiBpcyBhd2FpdGVkLlxuICAgIGNvbnN0IHRhYiA9IHdpbmRvdy5vcGVuKCdhYm91dDpibGFuaycsICdfYmxhbmsnKTtcbiAgICBjb25zdCBmaW5hbFVybCA9IGFwcGVuZEF1dGhQYXJhbXModXJsLCBhd2FpdCB0aGlzLnJlZGlyZWN0QXV0aFBhcmFtcygpLCB0aGlzLmNvbmZpZy5yZWRpcmVjdEF1dGhJbik7XG4gICAgaWYgKHRhYikge1xuICAgICAgdGFiLm9wZW5lciA9IG51bGw7IC8vIHNhbWUgcHJvdGVjdGlvbiBhcyBgbm9vcGVuZXJgXG4gICAgICB0YWIubG9jYXRpb24uaHJlZiA9IGZpbmFsVXJsO1xuICAgIH0gZWxzZSB7XG4gICAgICB3aW5kb3cub3BlbihmaW5hbFVybCwgJ19ibGFuaycsICdub29wZW5lcicpO1xuICAgIH1cbiAgICB0aGlzLmNsb3NlZC5lbWl0KCk7XG4gIH1cblxuICAvKiogVGhlIGhvc3QncyBhdXRoIHBhcmFtZXRlcnMgZm9yIHRoZSB3ZWIgbGluazsgYHt9YCB3aGVuIGl0IGhhcyBub25lIG9yIGl0IGZhaWxzICh0aGUgd2ViIHRoZW4gYXNrcyB0byBsb2cgaW4pLiAqL1xuICBwcml2YXRlIGFzeW5jIHJlZGlyZWN0QXV0aFBhcmFtcygpOiBQcm9taXNlPFNiZFJlZGlyZWN0QXV0aFBhcmFtcz4ge1xuICAgIGNvbnN0IHByb3ZpZGUgPSB0aGlzLmNvbmZpZy5yZWRpcmVjdEF1dGhQYXJhbXM7XG4gICAgaWYgKCFwcm92aWRlKSByZXR1cm4ge307XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IHJ1bkluSW5qZWN0aW9uQ29udGV4dCh0aGlzLmluamVjdG9yLCBwcm92aWRlKTtcbiAgICAgIHJldHVybiAoaXNPYnNlcnZhYmxlKHJlc3VsdCkgPyBhd2FpdCBmaXJzdFZhbHVlRnJvbShyZXN1bHQpIDogYXdhaXQgcmVzdWx0KSA/PyB7fTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIHJldHVybiB7fTtcbiAgICB9XG4gIH1cbn1cbiIsIjxwLWRpYWxvZyBbdmlzaWJsZV09XCJ2aXNpYmxlKClcIiAodmlzaWJsZUNoYW5nZSk9XCIkZXZlbnQgPyBudWxsIDogY2xvc2VkLmVtaXQoKVwiXG4gIFttb2RhbF09XCJ0cnVlXCIgW2Jsb2NrU2Nyb2xsXT1cInRydWVcIiBbZHJhZ2dhYmxlXT1cImZhbHNlXCIgW3Jlc2l6YWJsZV09XCJmYWxzZVwiXG4gIFtzaG93SGVhZGVyXT1cImZhbHNlXCIgW3N0eWxlXT1cInsgd2lkdGg6ICc1NjBweCcsIHBhZGRpbmc6ICcwJyB9XCIgc3R5bGVDbGFzcz1cInNiZC1yZWlzc3VlLWRpYWxvZy13cmFwcGVyXCI+XG5cbiAgPGRpdiBjbGFzcz1cInNiZC1yZWlzc3VlXCI+XG5cbiAgICA8IS0tIEhlYWRlcjogc2FtZSBsYXlvdXQgYXMgdGhlIGNhbmNlbCBkaWFsb2cgKHJvdW5kIGNsb3NlIGJ1dHRvbiwgY2VudGVyZWQgdGl0bGUgKyBib29raW5nIGlkKSAtLT5cbiAgICA8ZGl2IGNsYXNzPVwic2JkLXJlaXNzdWVfX2hlYWRlclwiPlxuICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJzYmQtcmVpc3N1ZV9fY2xvc2VcIiAoY2xpY2spPVwiY2xvc2VkLmVtaXQoKVwiIGFyaWEtbGFiZWw9XCJDbG9zZVwiPlxuICAgICAgICA8aSBjbGFzcz1cInBpIHBpLXRpbWVzXCI+PC9pPlxuICAgICAgPC9idXR0b24+XG4gICAgICA8ZGl2IGNsYXNzPVwic2JkLXJlaXNzdWVfX2hlYWRlci10ZXh0XCI+XG4gICAgICAgIDxoMyBjbGFzcz1cInNiZC1yZWlzc3VlX190aXRsZVwiPnt7IHRpdGxlKCkgfX08L2gzPlxuICAgICAgICA8c3BhbiBjbGFzcz1cInNiZC1yZWlzc3VlX19zdWJcIj5Cb29raW5nIElEICN7eyBib29raW5nSWQoKSB9fTwvc3Bhbj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuXG4gICAgQGlmIChzdG9yZS5sb2FkaW5nKCkpIHtcbiAgICAgIDxkaXYgY2xhc3M9XCJzYmQtcmVpc3N1ZV9fc3RhdGVcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cInNiZC1yZWlzc3VlX19zdGF0ZS1pY29uXCI+PGkgY2xhc3M9XCJwaSBwaS1zcGluIHBpLXNwaW5uZXJcIj48L2k+PC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJzYmQtcmVpc3N1ZV9fc3RhdGUtdGV4dFwiPkNoZWNraW5nIGF2YWlsYWJpbGl0eeKApjwvZGl2PlxuICAgICAgICA8ZGl2IGNsYXNzPVwic2JkLXJlaXNzdWVfX2RvdHNcIj48c3Bhbj48L3NwYW4+PHNwYW4+PC9zcGFuPjxzcGFuPjwvc3Bhbj48L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgIH0gQGVsc2UgaWYgKHN0b3JlLmVycm9yKCkpIHtcbiAgICAgIDxkaXYgY2xhc3M9XCJzYmQtcmVpc3N1ZV9fc3RhdGVcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cInNiZC1yZWlzc3VlX19zdGF0ZS1pY29uIHNiZC1yZWlzc3VlX19zdGF0ZS1pY29uLS13YXJuXCI+PGkgY2xhc3M9XCJwaSBwaS1leGNsYW1hdGlvbi10cmlhbmdsZVwiPjwvaT48L2Rpdj5cbiAgICAgICAgPGRpdiBjbGFzcz1cInNiZC1yZWlzc3VlX19zdGF0ZS10ZXh0XCI+e3sgc3RvcmUuZXJyb3IoKSB9fTwvZGl2PlxuICAgICAgICA8YnV0dG9uIHBCdXR0b24gdHlwZT1cImJ1dHRvblwiIGxhYmVsPVwiUmV0cnlcIiBjbGFzcz1cInAtYnV0dG9uLW91dGxpbmVkIHAtYnV0dG9uLXNlY29uZGFyeVwiIChjbGljayk9XCJzdG9yZS5sb2FkKClcIj48L2J1dHRvbj5cbiAgICAgIDwvZGl2PlxuICAgIH0gQGVsc2UgaWYgKHN0b3JlLmJsb2NrZWQoKSkge1xuICAgICAgPCEtLSBObyBsZWcgY2FuIGJlIHJlaXNzdWVkIG9ubGluZTogc2FtZSBpZGVhIGFzIHRoZSBjYW5jZWwgZGlhbG9nJ3MgXCJub3QgZWxpZ2libGUsIGVzY2FsYXRlXCIgbm90aWNlLiAtLT5cbiAgICAgIDxkaXYgY2xhc3M9XCJzYmQtcmVpc3N1ZV9fYm9keVwiPlxuICAgICAgICA8YXBwLXNiZC1yZWlzc3VlLW5vdGljZSB0b25lPVwid2FyblwiIGljb249XCJwaSBwaS1leGNsYW1hdGlvbi10cmlhbmdsZVwiPlxuICAgICAgICAgIDxzdHJvbmc+e3sgc3RvcmUuYmxvY2tlZCgpPy50aXRsZSB9fTwvc3Ryb25nPjxicj57eyBzdG9yZS5ibG9ja2VkKCk/LnRleHQgfX1cbiAgICAgICAgPC9hcHAtc2JkLXJlaXNzdWUtbm90aWNlPlxuICAgICAgPC9kaXY+XG4gICAgICA8ZGl2IGNsYXNzPVwic2JkLXJlaXNzdWVfX2Zvb3RlclwiPlxuICAgICAgICA8YnV0dG9uIHBCdXR0b24gdHlwZT1cImJ1dHRvblwiIGxhYmVsPVwiQ2xvc2VcIiBjbGFzcz1cInAtYnV0dG9uLW91dGxpbmVkIHAtYnV0dG9uLXNlY29uZGFyeSBzYmQtcmVpc3N1ZV9fYnRuXCJcbiAgICAgICAgICAoY2xpY2spPVwiY2xvc2VkLmVtaXQoKVwiPjwvYnV0dG9uPlxuICAgICAgPC9kaXY+XG4gICAgfSBAZWxzZSB7XG4gICAgICA8ZGl2IGNsYXNzPVwic2JkLXJlaXNzdWVfX2JvZHlcIj5cbiAgICAgICAgQHN3aXRjaCAoc3RvcmUuc3RlcCgpKSB7XG4gICAgICAgICAgQGNhc2UgKCdzZXJ2aWNlJykge1xuICAgICAgICAgICAgPGFwcC1zYmQtcmVpc3N1ZS1ub3RpY2U+Q2hhbmdlIHJlcXVlc3RzIGFyZSBzdWJqZWN0IHRvIGF2YWlsYWJpbGl0eSBmcm9tIHRoZSBhaXJsaW5lLjwvYXBwLXNiZC1yZWlzc3VlLW5vdGljZT5cbiAgICAgICAgICAgIDxhcHAtc2JkLXJlaXNzdWUtc2VydmljZS1zdGVwXG4gICAgICAgICAgICAgIFt1cGdyYWRlQXZhaWxhYmxlXT1cInN0b3JlLnVwZ3JhZGVBdmFpbGFibGUoKVwiXG4gICAgICAgICAgICAgIChjaG9zZW4pPVwib25TZXJ2aWNlQ2hvc2VuKCRldmVudClcIiAvPlxuICAgICAgICAgIH1cbiAgICAgICAgICBAY2FzZSAoJ2xlZ3MnKSB7XG4gICAgICAgICAgICA8YXBwLXNiZC1yZWlzc3VlLWxlZ3Mtc3RlcFxuICAgICAgICAgICAgICBbcm93c109XCJzdG9yZS5sZWdSb3dzKClcIlxuICAgICAgICAgICAgICBbYW55QXZhaWxhYmxlXT1cInN0b3JlLmFueUF2YWlsYWJsZSgpXCJcbiAgICAgICAgICAgICAgKHRvZ2dsZWQpPVwic3RvcmUudG9nZ2xlTGVnKCRldmVudClcIiAvPlxuICAgICAgICAgIH1cbiAgICAgICAgICBAY2FzZSAoJ2VkaXQnKSB7XG4gICAgICAgICAgICBAaWYgKHN0b3JlLnNlcnZpY2UoKSA9PT0gJ2NoYW5nZV9kYXRlJykge1xuICAgICAgICAgICAgICA8YXBwLXNiZC1yZWlzc3VlLWRhdGUtc3RlcFxuICAgICAgICAgICAgICAgIFtyb3dzXT1cInN0b3JlLmRhdGVSb3dzKClcIlxuICAgICAgICAgICAgICAgIChjaGFuZ2VkKT1cInN0b3JlLnNldERhdGUoJGV2ZW50LmxlZ0lkLCAkZXZlbnQuZGF0ZSlcIiAvPlxuICAgICAgICAgICAgfSBAZWxzZSB7XG4gICAgICAgICAgICAgIDxhcHAtc2JkLXJlaXNzdWUtcm91dGUtc3RlcFxuICAgICAgICAgICAgICAgIFtyb3dzXT1cInN0b3JlLnJvdXRlUm93cygpXCJcbiAgICAgICAgICAgICAgICBbb3B0aW9uc109XCJzdG9yZS5haXJwb3J0T3B0aW9ucygpXCJcbiAgICAgICAgICAgICAgICAoYWlycG9ydENoYW5nZWQpPVwic3RvcmUuc2V0QWlycG9ydCgkZXZlbnQubGVnSWQsICRldmVudC5zaWRlLCAkZXZlbnQuYWlycG9ydClcIlxuICAgICAgICAgICAgICAgIChzZWFyY2hlZCk9XCJzdG9yZS5zZWFyY2hBaXJwb3J0cygkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAoc3dhcHBlZCk9XCJzdG9yZS5zd2FwQWlycG9ydHMoJGV2ZW50KVwiIC8+XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIEBjYXNlICgndXBncmFkZS1sZWdzJykge1xuICAgICAgICAgICAgPGFwcC1zYmQtcmVpc3N1ZS1sZWdzLXN0ZXBcbiAgICAgICAgICAgICAgdW5hdmFpbGFibGVUZXh0PVwiTm9uZSBvZiB0aGVzZSBmbGlnaHRzIGNhbiBiZSB1cGdyYWRlZCBvbmxpbmUuIEhhbmRsZSB0aGlzIGJvb2tpbmcgbWFudWFsbHkuXCJcbiAgICAgICAgICAgICAgW3Jvd3NdPVwidXBncmFkZS5sZWdSb3dzKClcIlxuICAgICAgICAgICAgICBbYW55QXZhaWxhYmxlXT1cInVwZ3JhZGUuYW55TGVnVXBncmFkYWJsZSgpXCJcbiAgICAgICAgICAgICAgW25vdGVdPVwic3RvcmUuYWxsb3dTaW5nbGVMZWdTZWxlY3Rpb24oKSA/IG51bGwgOiAnVGhlc2UgZmxpZ2h0cyBtdXN0IGJlIHVwZ3JhZGVkIHRvZ2V0aGVyLidcIlxuICAgICAgICAgICAgICBbZXJyb3JdPVwidXBncmFkZS5lcnJvcigpXCJcbiAgICAgICAgICAgICAgKHRvZ2dsZWQpPVwidXBncmFkZS50b2dnbGVMZWcoJGV2ZW50KVwiIC8+XG4gICAgICAgICAgfVxuICAgICAgICAgIEBjYXNlICgndXBncmFkZScpIHtcbiAgICAgICAgICAgIDxhcHAtc2JkLXJlaXNzdWUtdXBncmFkZS1zdGVwXG4gICAgICAgICAgICAgIFtzZWN0aW9uc109XCJ1cGdyYWRlLnNlY3Rpb25zKClcIlxuICAgICAgICAgICAgICBbZXJyb3JdPVwidXBncmFkZS5lcnJvcigpXCJcbiAgICAgICAgICAgICAgKHBpY2tlZCk9XCJ1cGdyYWRlLnNlbGVjdCgkZXZlbnQuc2VjdGlvbklkLCAkZXZlbnQua2V5KVwiIC8+XG4gICAgICAgICAgfVxuICAgICAgICAgIEBjYXNlICgnY29uZmlybScpIHtcbiAgICAgICAgICAgIDxhcHAtc2JkLXJlaXNzdWUtdXBncmFkZS1jb25maXJtLXN0ZXBcbiAgICAgICAgICAgICAgW3Jvd3NdPVwidXBncmFkZS5zdW1tYXJ5KClcIlxuICAgICAgICAgICAgICBbdG90YWxdPVwidXBncmFkZS50b3RhbCgpXCJcbiAgICAgICAgICAgICAgW3RvdGFsTGFiZWxdPVwidXBncmFkZS50b3RhbExhYmVsKClcIlxuICAgICAgICAgICAgICBbcHJpY2VDaGFuZ2VkXT1cInVwZ3JhZGUucHJpY2VDaGFuZ2VkKClcIlxuICAgICAgICAgICAgICBbYm9va2VkXT1cInVwZ3JhZGUuYm9va2VkKClcIlxuICAgICAgICAgICAgICBbbGlua109XCJ1cGdyYWRlLnBheW1lbnRMaW5rKClcIlxuICAgICAgICAgICAgICBbZXJyb3JdPVwidXBncmFkZS5lcnJvcigpXCJcbiAgICAgICAgICAgICAgKHJlc3RhcnQpPVwicmVzdGFydEZsb3coKVwiIC8+XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICA8L2Rpdj5cblxuICAgICAgQGlmIChoaW50KCk7IGFzIHRleHQpIHtcbiAgICAgICAgPGRpdiBjbGFzcz1cInNiZC1yZWlzc3VlX19oaW50XCI+e3sgdGV4dCB9fTwvZGl2PlxuICAgICAgfVxuXG4gICAgICBAaWYgKHN0b3JlLnN0ZXAoKSAhPT0gJ3NlcnZpY2UnKSB7XG4gICAgICAgIDxkaXYgY2xhc3M9XCJzYmQtcmVpc3N1ZV9fZm9vdGVyXCI+XG4gICAgICAgICAgPGJ1dHRvbiBwQnV0dG9uIHR5cGU9XCJidXR0b25cIiBsYWJlbD1cIkJhY2tcIiBjbGFzcz1cInAtYnV0dG9uLW91dGxpbmVkIHAtYnV0dG9uLXNlY29uZGFyeSBzYmQtcmVpc3N1ZV9fYnRuXCJcbiAgICAgICAgICAgIFtkaXNhYmxlZF09XCJzdG9yZS5zdGVwKCkgPT09ICdjb25maXJtJyAmJiB1cGdyYWRlLmxvY2tlZCgpXCIgKGNsaWNrKT1cIm9uQmFjaygpXCI+PC9idXR0b24+XG5cbiAgICAgICAgICBAc3dpdGNoIChzdG9yZS5zdGVwKCkpIHtcbiAgICAgICAgICAgIEBjYXNlICgnbGVncycpIHtcbiAgICAgICAgICAgICAgPGJ1dHRvbiBwQnV0dG9uIHR5cGU9XCJidXR0b25cIiBsYWJlbD1cIkNvbnRpbnVlXCIgY2xhc3M9XCJzYmQtcmVpc3N1ZV9fYnRuXCJcbiAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiIXN0b3JlLmNhbkNvbnRpbnVlKClcIiAoY2xpY2spPVwic3RvcmUuZ29Ub0VkaXQoKVwiPjwvYnV0dG9uPlxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgQGNhc2UgKCdlZGl0Jykge1xuICAgICAgICAgICAgICA8YnV0dG9uIHBCdXR0b24gdHlwZT1cImJ1dHRvblwiIGljb249XCJwaSBwaS1zZWFyY2hcIiBsYWJlbD1cIlNlYXJjaCBmbGlnaHRzXCIgY2xhc3M9XCJzYmQtcmVpc3N1ZV9fYnRuXCJcbiAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiISFzdG9yZS52YWxpZGF0aW9uRXJyb3IoKVwiIChjbGljayk9XCJzZWFyY2hGbGlnaHRzKClcIj48L2J1dHRvbj5cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIEBjYXNlICgndXBncmFkZS1sZWdzJykge1xuICAgICAgICAgICAgICA8YnV0dG9uIHBCdXR0b24gdHlwZT1cImJ1dHRvblwiIGxhYmVsPVwiQ29udGludWVcIiBjbGFzcz1cInNiZC1yZWlzc3VlX19idG5cIiBbbG9hZGluZ109XCJ1cGdyYWRlLnN1Ym1pdHRpbmcoKVwiXG4gICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cIiF1cGdyYWRlLmNhbkNvbnRpbnVlRnJvbUxlZ3MoKVwiIChjbGljayk9XCJ1cGdyYWRlLmNvbnRpbnVlRnJvbUxlZ3MoKVwiPjwvYnV0dG9uPlxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgQGNhc2UgKCd1cGdyYWRlJykge1xuICAgICAgICAgICAgICA8YnV0dG9uIHBCdXR0b24gdHlwZT1cImJ1dHRvblwiIGxhYmVsPVwiQ29udGludWVcIiBjbGFzcz1cInNiZC1yZWlzc3VlX19idG5cIiBbbG9hZGluZ109XCJ1cGdyYWRlLnN1Ym1pdHRpbmcoKVwiXG4gICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cIiF1cGdyYWRlLmNhbkNvbnRpbnVlKClcIiAoY2xpY2spPVwidXBncmFkZS5jb250aW51ZSgpXCI+PC9idXR0b24+XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBAY2FzZSAoJ2NvbmZpcm0nKSB7XG4gICAgICAgICAgICAgIEBzd2l0Y2ggKHVwZ3JhZGUuYWN0aW9uKCkpIHtcbiAgICAgICAgICAgICAgICBAY2FzZSAoJ2RvbmUnKSB7XG4gICAgICAgICAgICAgICAgICA8YnV0dG9uIHBCdXR0b24gdHlwZT1cImJ1dHRvblwiIGxhYmVsPVwiQ2xvc2VcIiBjbGFzcz1cInNiZC1yZWlzc3VlX19idG5cIiAoY2xpY2spPVwiY2xvc2VkLmVtaXQoKVwiPjwvYnV0dG9uPlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBAY2FzZSAoJ2Jvb2snKSB7XG4gICAgICAgICAgICAgICAgICA8YnV0dG9uIHBCdXR0b24gdHlwZT1cImJ1dHRvblwiIGxhYmVsPVwiQ29uZmlybSB1cGdyYWRlXCIgY2xhc3M9XCJzYmQtcmVpc3N1ZV9fYnRuXCJcbiAgICAgICAgICAgICAgICAgICAgW2xvYWRpbmddPVwidXBncmFkZS5zdWJtaXR0aW5nKClcIiAoY2xpY2spPVwidXBncmFkZS5jb25maXJtKClcIj48L2J1dHRvbj5cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgQGNhc2UgKCdsaW5rJykge1xuICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBwQnV0dG9uIHR5cGU9XCJidXR0b25cIiBpY29uPVwicGkgcGktbGlua1wiIGxhYmVsPVwiR2VuZXJhdGUgcGF5bWVudCBsaW5rXCIgY2xhc3M9XCJzYmQtcmVpc3N1ZV9fYnRuXCJcbiAgICAgICAgICAgICAgICAgICAgW2xvYWRpbmddPVwidXBncmFkZS5zdWJtaXR0aW5nKClcIiAoY2xpY2spPVwidXBncmFkZS5jb25maXJtKClcIj48L2J1dHRvbj5cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIDwvZGl2PlxuICAgICAgfVxuICAgIH1cbiAgPC9kaXY+XG48L3AtZGlhbG9nPlxuIl19