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

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 (90) hide show
  1. package/esm2022/lib/components/action-card/action-card.component.mjs +3 -3
  2. package/esm2022/lib/components/add-note-dialog/add-note-dialog.component.mjs +3 -3
  3. package/esm2022/lib/components/almatar-aside/aside-back-button.service.mjs +24 -0
  4. package/esm2022/lib/components/almatar-aside/aside.component.mjs +123 -0
  5. package/esm2022/lib/components/booking-input/booking-input.component.mjs +4 -3
  6. package/esm2022/lib/components/cancel-dialog/cancel-dialog.component.mjs +53 -4
  7. package/esm2022/lib/components/data-search/data-search.component.mjs +3 -3
  8. package/esm2022/lib/components/hotel-cancel/almatar-hotel-auto-cancellation.component.mjs +544 -0
  9. package/esm2022/lib/components/hotel-cancel/components/almatar-hotel-auto-cancellation-refund-method/almatar-hotel-auto-cancellation-refund-method.component.mjs +43 -0
  10. package/esm2022/lib/components/hotel-cancel/components/almatar-hotel-auto-cancellation-refund-summary/almatar-hotel-auto-cancellation-refund-summary.component.mjs +296 -0
  11. package/esm2022/lib/components/hotel-cancel/components/almatar-hotel-auto-cancellation-select-rooms/almatar-hotel-auto-cancellation-select-rooms.component.mjs +88 -0
  12. 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 +242 -0
  13. package/esm2022/lib/components/hotel-cancel/components/almatar-hotel-auto-cancellation-select-rooms/components/almatar-hotel-auto-cancellation-refundable-room/almatar-hotel-auto-cancellation-refundable-room.component.mjs +48 -0
  14. package/esm2022/lib/components/hotel-cancel/components/hotel-content/hotel-content.component.mjs +129 -0
  15. package/esm2022/lib/components/hotel-cancel/components/hotel-refund-method-selector/hotel-refund-method-selector.component.mjs +321 -0
  16. package/esm2022/lib/components/hotel-cancel/components/result-overlay/result-overlay.component.mjs +52 -0
  17. package/esm2022/lib/components/hotel-cancel/enums/almatar-hotel-auto-cancellation-endpoints.enum.mjs +9 -0
  18. package/esm2022/lib/components/hotel-cancel/enums/almatar-hotel-auto-cancellation-step.enum.mjs +7 -0
  19. package/esm2022/lib/components/hotel-cancel/interfaces/i-almatar-hotel-auto-cancellation.interface.mjs +2 -0
  20. package/esm2022/lib/components/hotel-cancel/services/almatar-hotel-auto-cancellation-endpoints.service.mjs +448 -0
  21. package/esm2022/lib/components/hotel-cancel/services/almatar-hotel-auto-cancellation.service.mjs +55 -0
  22. package/esm2022/lib/components/hotel-itinerary-card/hotel-itinerary-card.component.mjs +48 -0
  23. package/esm2022/lib/components/result-panel/result-panel.component.mjs +3 -3
  24. package/esm2022/lib/components/shared/components/confirm-modal/confirm-modal.component.mjs +75 -0
  25. package/esm2022/lib/components/shared/components/manage-booking-failed-modal/manage-booking-failed-modal.component.mjs +46 -0
  26. package/esm2022/lib/components/shared/enums/hotel-manage-booking-aside-tab.enum.mjs +9 -0
  27. package/esm2022/lib/components/shared/interfaces/i-flight-refund-details.mjs +86 -0
  28. package/esm2022/lib/components/shared/models/cancel-hotel-booking.model.mjs +7 -0
  29. package/esm2022/lib/components/shared/services/hotel-manage-booking/hotel-manage-booking.service.mjs +27 -0
  30. package/esm2022/lib/components/shared/services/hotel-manage-booking-endpoints/hotel-manage-booking-endpoints.service.mjs +17 -0
  31. package/esm2022/lib/config/hotel-actions.config.mjs +21 -1
  32. package/esm2022/lib/models/booking.types.mjs +73 -2
  33. package/esm2022/lib/pages/smart-booking-dashboard/smart-booking-dashboard.component.mjs +25 -7
  34. package/esm2022/lib/services/booking.service.mjs +6 -2
  35. package/esm2022/lib/shared/components/currency-code-icon/currency-code-icon.component.mjs +35 -0
  36. package/esm2022/lib/shared/enums/brand-enums.enum.mjs +7 -0
  37. package/esm2022/lib/shared/environments/environment.mjs +10 -0
  38. package/esm2022/lib/shared/models/index.mjs +6 -0
  39. package/esm2022/lib/shared/modules/almatar-icon/almatar-icon.module.mjs +36 -0
  40. package/esm2022/lib/shared/modules/loader/loader.module.mjs +43 -0
  41. package/esm2022/lib/shared/pipes/exchange.pipe.mjs +49 -0
  42. package/esm2022/lib/shared/services/api.service.mjs +42 -0
  43. package/esm2022/lib/shared/services/shared.service.mjs +34 -0
  44. package/esm2022/lib/shared/services/translation.service.mjs +61 -0
  45. package/esm2022/lib/shared/services/webengage-tracking.service.mjs +28 -0
  46. package/esm2022/lib/shared/store/selectors/currency.selectors.mjs +9 -0
  47. package/fesm2022/almatar-smart-booking-dashboard.mjs +3278 -180
  48. package/fesm2022/almatar-smart-booking-dashboard.mjs.map +1 -1
  49. package/lib/components/almatar-aside/aside-back-button.service.d.ts +11 -0
  50. package/lib/components/almatar-aside/aside.component.d.ts +47 -0
  51. package/lib/components/cancel-dialog/cancel-dialog.component.d.ts +7 -0
  52. package/lib/components/hotel-cancel/almatar-hotel-auto-cancellation.component.d.ts +97 -0
  53. package/lib/components/hotel-cancel/components/almatar-hotel-auto-cancellation-refund-method/almatar-hotel-auto-cancellation-refund-method.component.d.ts +25 -0
  54. package/lib/components/hotel-cancel/components/almatar-hotel-auto-cancellation-refund-summary/almatar-hotel-auto-cancellation-refund-summary.component.d.ts +91 -0
  55. package/lib/components/hotel-cancel/components/almatar-hotel-auto-cancellation-select-rooms/almatar-hotel-auto-cancellation-select-rooms.component.d.ts +39 -0
  56. package/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.d.ts +44 -0
  57. package/lib/components/hotel-cancel/components/almatar-hotel-auto-cancellation-select-rooms/components/almatar-hotel-auto-cancellation-refundable-room/almatar-hotel-auto-cancellation-refundable-room.component.d.ts +19 -0
  58. package/lib/components/hotel-cancel/components/hotel-content/hotel-content.component.d.ts +38 -0
  59. package/lib/components/hotel-cancel/components/hotel-refund-method-selector/hotel-refund-method-selector.component.d.ts +142 -0
  60. package/lib/components/hotel-cancel/components/result-overlay/result-overlay.component.d.ts +23 -0
  61. package/lib/components/hotel-cancel/enums/almatar-hotel-auto-cancellation-endpoints.enum.d.ts +7 -0
  62. package/lib/components/hotel-cancel/enums/almatar-hotel-auto-cancellation-step.enum.d.ts +5 -0
  63. package/lib/components/hotel-cancel/interfaces/i-almatar-hotel-auto-cancellation.interface.d.ts +252 -0
  64. package/lib/components/hotel-cancel/services/almatar-hotel-auto-cancellation-endpoints.service.d.ts +82 -0
  65. package/lib/components/hotel-cancel/services/almatar-hotel-auto-cancellation.service.d.ts +21 -0
  66. package/lib/components/hotel-itinerary-card/hotel-itinerary-card.component.d.ts +16 -0
  67. package/lib/components/shared/components/confirm-modal/confirm-modal.component.d.ts +17 -0
  68. package/lib/components/shared/components/manage-booking-failed-modal/manage-booking-failed-modal.component.d.ts +10 -0
  69. package/lib/components/shared/enums/hotel-manage-booking-aside-tab.enum.d.ts +7 -0
  70. package/lib/components/shared/interfaces/i-flight-refund-details.d.ts +73 -0
  71. package/lib/components/shared/models/cancel-hotel-booking.model.d.ts +6 -0
  72. package/lib/components/shared/services/hotel-manage-booking/hotel-manage-booking.service.d.ts +11 -0
  73. package/lib/components/shared/services/hotel-manage-booking-endpoints/hotel-manage-booking-endpoints.service.d.ts +7 -0
  74. package/lib/models/booking.types.d.ts +28 -0
  75. package/lib/pages/smart-booking-dashboard/smart-booking-dashboard.component.d.ts +1 -0
  76. package/lib/shared/components/currency-code-icon/currency-code-icon.component.d.ts +13 -0
  77. package/lib/shared/enums/brand-enums.enum.d.ts +5 -0
  78. package/lib/shared/environments/environment.d.ts +7 -0
  79. package/lib/shared/models/index.d.ts +11 -0
  80. package/lib/shared/modules/almatar-icon/almatar-icon.module.d.ts +13 -0
  81. package/lib/shared/modules/loader/loader.module.d.ts +13 -0
  82. package/lib/shared/pipes/exchange.pipe.d.ts +17 -0
  83. package/lib/shared/services/api.service.d.ts +43 -0
  84. package/lib/shared/services/shared.service.d.ts +12 -0
  85. package/lib/shared/services/translation.service.d.ts +17 -0
  86. package/lib/shared/services/webengage-tracking.service.d.ts +8 -0
  87. package/lib/shared/store/selectors/currency.selectors.d.ts +2 -0
  88. package/package.json +2 -19
  89. package/LICENSE +0 -21
  90. package/README.md +0 -132
@@ -0,0 +1,88 @@
1
+ import { Component, ChangeDetectionStrategy, DestroyRef, input, output, signal, computed, inject, effect, } from '@angular/core';
2
+ import { CommonModule } from '@angular/common';
3
+ import { SharedService } from '../../../../shared/services/shared.service';
4
+ import moment from 'moment';
5
+ import { AlmatarHotelAutoCancellationRefundableRoomComponent } from './components/almatar-hotel-auto-cancellation-refundable-room/almatar-hotel-auto-cancellation-refundable-room.component';
6
+ import { AlmatarHotelAutoCancellationNonRefundableRoomComponent } from './components/almatar-hotel-auto-cancellation-non-refundable-room/almatar-hotel-auto-cancellation-non-refundable-room.component';
7
+ import { AlmatarHotelAutoCancellationEndpointsService } from '../../services/almatar-hotel-auto-cancellation-endpoints.service';
8
+ import { AlmatarHotelAutoCancellationService } from '../../services/almatar-hotel-auto-cancellation.service';
9
+ import * as i0 from "@angular/core";
10
+ export class AlmatarHotelAutoCancellationSelectRoomsComponent {
11
+ constructor() {
12
+ this.sharedService = inject(SharedService);
13
+ this.endpointsService = inject(AlmatarHotelAutoCancellationEndpointsService);
14
+ this.autoCancellationService = inject(AlmatarHotelAutoCancellationService);
15
+ this.destroyRef = inject(DestroyRef);
16
+ this.packages = input.required();
17
+ this.isLoadingRefund = signal(false);
18
+ this.hotelInfo = input.required();
19
+ this.bookingId = input('');
20
+ this.hotelId = input('');
21
+ this.continueToCancel = output();
22
+ this.closeModal = output();
23
+ this.nonRefundableSubmitSuccess = output();
24
+ this.chatWithAgent = output();
25
+ this.currencyCode = input('SAR');
26
+ this.localPackages = signal([]);
27
+ this.displayPackages = computed(() => {
28
+ const local = this.localPackages();
29
+ return local.length > 0 ? local : this.packages();
30
+ });
31
+ this.selectedPackagesCount = computed(() => this.displayPackages().filter((pkg) => pkg.isSelected).length);
32
+ this.hasSelectedPackages = computed(() => this.selectedPackagesCount() > 0);
33
+ this.isSinglePackage = computed(() => this.packages().length === 1);
34
+ this.totalRoomsCount = computed(() => this.packages().reduce((acc, pkg) => acc + (pkg.rooms?.length || 0), 0));
35
+ this.allPackagesNonRefundable = computed(() => this.packages().every((pkg) => !pkg.isRefundable && !pkg.isCancelled));
36
+ effect(() => {
37
+ // get only un cancelled packages
38
+ const packagesList = this.packages().filter((pkg) => !pkg?.isCancelled);
39
+ if (packagesList.length === 1 && !packagesList[0].isSelected) {
40
+ const selectedPackage = { ...packagesList[0], isSelected: true };
41
+ this.localPackages.set([selectedPackage]);
42
+ }
43
+ }, { allowSignalWrites: true });
44
+ }
45
+ togglePackage(packageId) {
46
+ const currentPackages = this.displayPackages();
47
+ const updatedPackages = currentPackages.map((pkg) => pkg.packageId === packageId
48
+ ? { ...pkg, isSelected: !pkg.isSelected }
49
+ : pkg);
50
+ this.localPackages.set(updatedPackages);
51
+ }
52
+ onContinue() {
53
+ if (this.hasSelectedPackages()) {
54
+ const selectedPackages = this.displayPackages().filter((pkg) => pkg.isSelected && !pkg.isCancelled);
55
+ this.continueToCancel.emit(selectedPackages);
56
+ }
57
+ }
58
+ onClose() {
59
+ this.closeModal.emit();
60
+ }
61
+ onChatWithAgent() {
62
+ this.chatWithAgent.emit();
63
+ }
64
+ onNonRefundableSubmitSuccess(packageName) {
65
+ this.nonRefundableSubmitSuccess.emit(packageName);
66
+ }
67
+ formatDate(date) {
68
+ const lang = this.sharedService.getAppLanguage();
69
+ const m = moment(date).locale(lang);
70
+ return {
71
+ day: m.date(),
72
+ month: m.format('MMMM'),
73
+ year: m.year(),
74
+ dayName: m.format('dddd'),
75
+ };
76
+ }
77
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: AlmatarHotelAutoCancellationSelectRoomsComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
78
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: AlmatarHotelAutoCancellationSelectRoomsComponent, isStandalone: true, selector: "almatar-hotel-auto-cancellation-select-rooms", inputs: { packages: { classPropertyName: "packages", publicName: "packages", isSignal: true, isRequired: true, transformFunction: null }, hotelInfo: { classPropertyName: "hotelInfo", publicName: "hotelInfo", isSignal: true, isRequired: true, transformFunction: null }, bookingId: { classPropertyName: "bookingId", publicName: "bookingId", isSignal: true, isRequired: false, transformFunction: null }, hotelId: { classPropertyName: "hotelId", publicName: "hotelId", isSignal: true, isRequired: false, transformFunction: null }, currencyCode: { classPropertyName: "currencyCode", publicName: "currencyCode", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { continueToCancel: "continueToCancel", closeModal: "closeModal", nonRefundableSubmitSuccess: "nonRefundableSubmitSuccess", chatWithAgent: "chatWithAgent" }, ngImport: i0, template: "<div class=\"select-rooms\">\n <div class=\"select-rooms__content\">\n @if (hotelInfo(); as hotel) {\n <div class=\"hotel-info-card\">\n <h3 class=\"hotel-info-card__name\">{{ hotel.hotelName }}</h3>\n\n <div class=\"hotel-info-card__content\">\n @if (hotel.hotelImage) {\n <div class=\"hotel-info-card__image\">\n <img [src]=\"hotel.hotelImage\" [alt]=\"hotel.hotelName\" />\n </div>\n }\n\n <div class=\"hotel-info-card__dates\">\n <div class=\"date-box\">\n <span class=\"date-box__label\">CHECK-IN</span>\n <span class=\"date-box__day\">{{\n formatDate(hotel.checkIn).day\n }}</span>\n <span class=\"date-box__month\">{{\n formatDate(hotel.checkIn).month\n }}</span>\n <span class=\"date-box__day-name\">{{\n formatDate(hotel.checkIn).dayName\n }}</span>\n <span class=\"date-box__time\"\n >From\n {{ hotel?.checkInTime }}</span\n >\n </div>\n\n <div class=\"date-box\">\n <span class=\"date-box__label\">CHECK-OUT</span>\n <span class=\"date-box__day\">{{\n formatDate(hotel.checkOut).day\n }}</span>\n <span class=\"date-box__month\">{{\n formatDate(hotel.checkOut).month\n }}</span>\n <span class=\"date-box__day-name\">{{\n formatDate(hotel.checkOut).dayName\n }}</span>\n <span class=\"date-box__time\"\n >Until\n {{ hotel?.checkOutTime }}</span\n >\n </div>\n </div>\n\n <div class=\"hotel-info-card__stats\">\n <div class=\"stat-box\">\n <span class=\"stat-box__label\">Rooms</span>\n <span class=\"stat-box__value\">{{ totalRoomsCount() }}</span>\n </div>\n <div class=\"stat-box\">\n <span class=\"stat-box__label\">NIGHTS</span>\n <span class=\"stat-box__value\">{{ hotel.nights }}</span>\n </div>\n </div>\n </div>\n </div>\n }\n\n <div class=\"select-rooms__notice select-rooms__notice--default\">\n <svg width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\">\n <circle\n cx=\"12\"\n cy=\"12\"\n r=\"9\"\n stroke=\"currentColor\"\n stroke-width=\"1.6\"\n />\n <path\n d=\"M12 11v5.5M12 8v.01\"\n stroke=\"currentColor\"\n stroke-width=\"1.6\"\n stroke-linecap=\"round\"\n />\n </svg>\n <span>\n Some rooms in each package, share one booking reference, so they will be cancelled together.</span\n >\n </div>\n\n <div class=\"rooms-list\">\n @for (package of displayPackages(); track $index) {\n @if (!package.manualRefundRequest) {\n <almatar-hotel-auto-cancellation-refundable-room\n [package]=\"package\"\n [hideCheckbox]=\"isSinglePackage()\"\n (togglePackage)=\"togglePackage($event)\"\n />\n } @else {\n <almatar-hotel-auto-cancellation-non-refundable-room\n [package]=\"package\"\n [allPackages]=\"displayPackages()\"\n [hotelInfo]=\"hotelInfo()\"\n [hotelId]=\"hotelId()\"\n [currencyCode]=\"currencyCode()\"\n [allPackagesNonRefundable]=\"allPackagesNonRefundable()\"\n (closeModal)=\"onClose()\"\n (nonRefundableSubmitSuccess)=\"onNonRefundableSubmitSuccess($event)\"\n />\n }\n }\n </div>\n\n @if (allPackagesNonRefundable()) {\n <div class=\"select-rooms__notice select-rooms__notice--warning\">\n <svg width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\">\n <!-- warning triangle icon -->\n <path\n d=\"M12 9v4M12 17h.01M10.29 3.86L1.82 18a2 2 0 001.71 3h16.94a2 2 0 001.71-3L13.71 3.86a2 2 0 00-3.42 0z\"\n stroke=\"currentColor\"\n stroke-width=\"1.6\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n />\n </svg>\n <span>Sorry, we couldn't process your refund right now. Please chat with our Customer Service team for help.</span>\n </div>\n }\n </div>\n\n <div class=\"select-rooms__footer\">\n @if (allPackagesNonRefundable()) {\n <button\n class=\"main_btn main_btn--chat-with-us\"\n type=\"button\"\n (click)=\"onChatWithAgent()\"\n >\n Chat with customer service\n </button>\n } @else {\n @if (!hasSelectedPackages()) {\n <p class=\"select-rooms__hint\">\n Select at least one room to continue\n </p>\n }\n <button\n class=\"main_btn\"\n type=\"button\"\n [disabled]=\"!hasSelectedPackages()\"\n (click)=\"onContinue()\"\n >\n Continue to cancel\n </button>\n }\n </div>\n</div>\n", styles: [".select-rooms{display:flex;flex-direction:column;height:100%;background-color:#fff}.select-rooms__header{padding:16px;border-bottom:1px solid var(--almatar-neutral-border-default)}.select-rooms__notice{display:flex;align-items:center;gap:8px;padding:12px;border-radius:8px;font-size:calc(12 * var(--almatar-font-size-ratio, 1) * 1px);font-weight:400;margin:12px 0}.select-rooms__notice svg{flex-shrink:0;width:18px;height:18px;margin-top:1px}.select-rooms__notice--info{background:var(--almatar-info-surface, #eaf2ff);border:1px solid var(--almatar-info-border, #b9d6ff);color:var(--almatar-info-text, #1a56db);border-radius:12px}.select-rooms__notice--info svg{color:var(--almatar-info-icon, #1a56db)}.select-rooms__notice--default{background:#f7f7f8;border:1px solid rgb(217,217,222);color:#1b1a1f;border-radius:12px}.select-rooms__notice--default svg{color:#1b1a1f}.select-rooms__notice--warning{background:#faedcc;border:1px solid rgb(137,99,42);color:#89632a;border-radius:12px}.select-rooms__notice--warning svg{color:#89632a}.select-rooms__title{font-size:calc(18 * var(--almatar-font-size-ratio, 1) * 1px);font-weight:var(--almatar-font-weight-semibold);color:var(--almatar-neutral-text-primary-static);margin-bottom:4px}.select-rooms__subtitle{font-size:calc(14 * var(--almatar-font-size-ratio, 1) * 1px);color:var(--almatar-neutral-text-secondary-static)}.select-rooms__content{flex:1;overflow-y:auto;padding:12px}.select-rooms__footer{padding:16px;background:var(--almatar-neutral-surface-card);border-top:1px solid rgb(217,217,222)}.select-rooms__hint{text-align:center;font-size:calc(12 * var(--almatar-font-size-ratio, 1) * 1px);color:var(--almatar-neutral-text-secondary-static);margin-bottom:12px}.hotel-info-card{background:var(--almatar-neutral-surface-card);border-radius:12px;padding:12px;margin-bottom:12px;border:1px solid rgb(217,217,222)}.hotel-info-card__name{font-size:calc(18 * var(--almatar-font-size-ratio, 1) * 1px);font-weight:var(--almatar-font-weight-medium);color:var(--almatar-neutral-text-primary-static);margin-bottom:12px}.hotel-info-card__content{display:flex;align-items:stretch;gap:0}.hotel-info-card__image{width:120px;overflow:hidden;flex-shrink:0;padding-inline-end:12px;border-inline-end:1px solid rgb(217,217,222)}.hotel-info-card__image img{border-radius:5px;width:100%;height:100%;object-fit:cover;max-height:100px}.hotel-info-card__dates{display:flex;flex:1;border-inline-start:1px solid var(--almatar-neutral-border-default)}.hotel-info-card__stats{display:flex;flex-direction:column;justify-content:center;border-inline-start:1px solid var(--almatar-neutral-border-default);padding-inline-start:12px;margin-inline-start:0;min-width:70px}.date-box{display:flex;flex-direction:column;align-items:center;text-align:center;flex:1;padding:0 12px;border-inline-end:1px solid rgb(217,217,222);gap:4px}.date-box__label{font-size:calc(10 * var(--almatar-font-size-ratio, 1) * 1px);color:var(--almatar-neutral-text-secondary-static);text-transform:uppercase;letter-spacing:.5px}.date-box__day{font-size:calc(18 * var(--almatar-font-size-ratio, 1) * 1px);font-weight:var(--almatar-font-weight-medium);color:#491d95;line-height:1.2}.date-box__month{font-size:calc(12 * var(--almatar-font-size-ratio, 1) * 1px);font-weight:var(--almatar-font-weight-regular);color:var(--almatar-neutral-text-primary-static)}.date-box__day-name{font-size:calc(10 * var(--almatar-font-size-ratio, 1) * 1px);color:#747583}.date-box__time{font-size:calc(12 * var(--almatar-font-size-ratio, 1) * 1px);font-weight:var(--almatar-font-weight-regular);color:var(--almatar-neutral-text-primary-static)}.stat-box{display:flex;flex-direction:column;align-items:center;text-align:center;padding:4px 0;border-bottom:1px solid rgb(217,217,222)}.stat-box:last-child{border-bottom:none}.stat-box__label{font-size:calc(11 * var(--almatar-font-size-ratio, 1) * 1px);color:var(--almatar-neutral-text-secondary-static);text-transform:uppercase;letter-spacing:.5px;margin-bottom:4px}.stat-box__value{font-size:calc(18 * var(--almatar-font-size-ratio, 1) * 1px);font-weight:var(--almatar-font-weight-medium);color:var(--almatar-neutral-text-primary-static);line-height:1.3;color:#491d95}.rooms-list{display:flex;flex-direction:column;gap:12px}.main_btn{font-weight:var(--almatar-font-weight-medium);padding:17.5px;border-radius:6px;display:block;width:100%}.main_btn:disabled{opacity:.5;cursor:not-allowed}.main_btn--chat-with-us{background-color:#fff;border:1px solid rgb(217,217,222);color:#1b1a1f}button[disabled],input[type=button][disabled],input[type=reset][disabled],input[type=submit][disabled]{background-color:#747583;color:#b8b9c1;border-radius:12px}.info-banner{display:flex;gap:8px;border:1px solid rgb(11,84,194);border-radius:12px;padding:14px;align-items:flex-start;transition:all .3s cubic-bezier(.4,0,.2,1)}.info-banner__icon{color:#0b54c2;flex-shrink:0;width:20px;height:20px}.info-banner__content{flex:1}.info-banner__text{font-size:calc(12 * var(--almatar-font-size-ratio, 1) * 1px);color:#0b54c2;margin:0 0 4px;font-weight:var(--almatar-font-weight-regular);line-height:16px}.info-banner__subtext{font-size:calc(14 * var(--almatar-font-size-ratio, 1) * 1px);color:#1b1a1f;margin:0;line-height:1.4}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "component", type: AlmatarHotelAutoCancellationRefundableRoomComponent, selector: "almatar-hotel-auto-cancellation-refundable-room", inputs: ["package", "hideCheckbox"], outputs: ["togglePackage"] }, { kind: "component", type: AlmatarHotelAutoCancellationNonRefundableRoomComponent, selector: "almatar-hotel-auto-cancellation-non-refundable-room", inputs: ["package", "allPackages", "hotelInfo", "hotelId", "currencyCode", "allPackagesNonRefundable"], outputs: ["closeModal", "nonRefundableSubmitSuccess"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
79
+ }
80
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: AlmatarHotelAutoCancellationSelectRoomsComponent, decorators: [{
81
+ type: Component,
82
+ args: [{ selector: 'almatar-hotel-auto-cancellation-select-rooms', standalone: true, imports: [
83
+ CommonModule,
84
+ AlmatarHotelAutoCancellationRefundableRoomComponent,
85
+ AlmatarHotelAutoCancellationNonRefundableRoomComponent,
86
+ ], changeDetection: ChangeDetectionStrategy.OnPush, template: "<div class=\"select-rooms\">\n <div class=\"select-rooms__content\">\n @if (hotelInfo(); as hotel) {\n <div class=\"hotel-info-card\">\n <h3 class=\"hotel-info-card__name\">{{ hotel.hotelName }}</h3>\n\n <div class=\"hotel-info-card__content\">\n @if (hotel.hotelImage) {\n <div class=\"hotel-info-card__image\">\n <img [src]=\"hotel.hotelImage\" [alt]=\"hotel.hotelName\" />\n </div>\n }\n\n <div class=\"hotel-info-card__dates\">\n <div class=\"date-box\">\n <span class=\"date-box__label\">CHECK-IN</span>\n <span class=\"date-box__day\">{{\n formatDate(hotel.checkIn).day\n }}</span>\n <span class=\"date-box__month\">{{\n formatDate(hotel.checkIn).month\n }}</span>\n <span class=\"date-box__day-name\">{{\n formatDate(hotel.checkIn).dayName\n }}</span>\n <span class=\"date-box__time\"\n >From\n {{ hotel?.checkInTime }}</span\n >\n </div>\n\n <div class=\"date-box\">\n <span class=\"date-box__label\">CHECK-OUT</span>\n <span class=\"date-box__day\">{{\n formatDate(hotel.checkOut).day\n }}</span>\n <span class=\"date-box__month\">{{\n formatDate(hotel.checkOut).month\n }}</span>\n <span class=\"date-box__day-name\">{{\n formatDate(hotel.checkOut).dayName\n }}</span>\n <span class=\"date-box__time\"\n >Until\n {{ hotel?.checkOutTime }}</span\n >\n </div>\n </div>\n\n <div class=\"hotel-info-card__stats\">\n <div class=\"stat-box\">\n <span class=\"stat-box__label\">Rooms</span>\n <span class=\"stat-box__value\">{{ totalRoomsCount() }}</span>\n </div>\n <div class=\"stat-box\">\n <span class=\"stat-box__label\">NIGHTS</span>\n <span class=\"stat-box__value\">{{ hotel.nights }}</span>\n </div>\n </div>\n </div>\n </div>\n }\n\n <div class=\"select-rooms__notice select-rooms__notice--default\">\n <svg width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\">\n <circle\n cx=\"12\"\n cy=\"12\"\n r=\"9\"\n stroke=\"currentColor\"\n stroke-width=\"1.6\"\n />\n <path\n d=\"M12 11v5.5M12 8v.01\"\n stroke=\"currentColor\"\n stroke-width=\"1.6\"\n stroke-linecap=\"round\"\n />\n </svg>\n <span>\n Some rooms in each package, share one booking reference, so they will be cancelled together.</span\n >\n </div>\n\n <div class=\"rooms-list\">\n @for (package of displayPackages(); track $index) {\n @if (!package.manualRefundRequest) {\n <almatar-hotel-auto-cancellation-refundable-room\n [package]=\"package\"\n [hideCheckbox]=\"isSinglePackage()\"\n (togglePackage)=\"togglePackage($event)\"\n />\n } @else {\n <almatar-hotel-auto-cancellation-non-refundable-room\n [package]=\"package\"\n [allPackages]=\"displayPackages()\"\n [hotelInfo]=\"hotelInfo()\"\n [hotelId]=\"hotelId()\"\n [currencyCode]=\"currencyCode()\"\n [allPackagesNonRefundable]=\"allPackagesNonRefundable()\"\n (closeModal)=\"onClose()\"\n (nonRefundableSubmitSuccess)=\"onNonRefundableSubmitSuccess($event)\"\n />\n }\n }\n </div>\n\n @if (allPackagesNonRefundable()) {\n <div class=\"select-rooms__notice select-rooms__notice--warning\">\n <svg width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\">\n <!-- warning triangle icon -->\n <path\n d=\"M12 9v4M12 17h.01M10.29 3.86L1.82 18a2 2 0 001.71 3h16.94a2 2 0 001.71-3L13.71 3.86a2 2 0 00-3.42 0z\"\n stroke=\"currentColor\"\n stroke-width=\"1.6\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n />\n </svg>\n <span>Sorry, we couldn't process your refund right now. Please chat with our Customer Service team for help.</span>\n </div>\n }\n </div>\n\n <div class=\"select-rooms__footer\">\n @if (allPackagesNonRefundable()) {\n <button\n class=\"main_btn main_btn--chat-with-us\"\n type=\"button\"\n (click)=\"onChatWithAgent()\"\n >\n Chat with customer service\n </button>\n } @else {\n @if (!hasSelectedPackages()) {\n <p class=\"select-rooms__hint\">\n Select at least one room to continue\n </p>\n }\n <button\n class=\"main_btn\"\n type=\"button\"\n [disabled]=\"!hasSelectedPackages()\"\n (click)=\"onContinue()\"\n >\n Continue to cancel\n </button>\n }\n </div>\n</div>\n", styles: [".select-rooms{display:flex;flex-direction:column;height:100%;background-color:#fff}.select-rooms__header{padding:16px;border-bottom:1px solid var(--almatar-neutral-border-default)}.select-rooms__notice{display:flex;align-items:center;gap:8px;padding:12px;border-radius:8px;font-size:calc(12 * var(--almatar-font-size-ratio, 1) * 1px);font-weight:400;margin:12px 0}.select-rooms__notice svg{flex-shrink:0;width:18px;height:18px;margin-top:1px}.select-rooms__notice--info{background:var(--almatar-info-surface, #eaf2ff);border:1px solid var(--almatar-info-border, #b9d6ff);color:var(--almatar-info-text, #1a56db);border-radius:12px}.select-rooms__notice--info svg{color:var(--almatar-info-icon, #1a56db)}.select-rooms__notice--default{background:#f7f7f8;border:1px solid rgb(217,217,222);color:#1b1a1f;border-radius:12px}.select-rooms__notice--default svg{color:#1b1a1f}.select-rooms__notice--warning{background:#faedcc;border:1px solid rgb(137,99,42);color:#89632a;border-radius:12px}.select-rooms__notice--warning svg{color:#89632a}.select-rooms__title{font-size:calc(18 * var(--almatar-font-size-ratio, 1) * 1px);font-weight:var(--almatar-font-weight-semibold);color:var(--almatar-neutral-text-primary-static);margin-bottom:4px}.select-rooms__subtitle{font-size:calc(14 * var(--almatar-font-size-ratio, 1) * 1px);color:var(--almatar-neutral-text-secondary-static)}.select-rooms__content{flex:1;overflow-y:auto;padding:12px}.select-rooms__footer{padding:16px;background:var(--almatar-neutral-surface-card);border-top:1px solid rgb(217,217,222)}.select-rooms__hint{text-align:center;font-size:calc(12 * var(--almatar-font-size-ratio, 1) * 1px);color:var(--almatar-neutral-text-secondary-static);margin-bottom:12px}.hotel-info-card{background:var(--almatar-neutral-surface-card);border-radius:12px;padding:12px;margin-bottom:12px;border:1px solid rgb(217,217,222)}.hotel-info-card__name{font-size:calc(18 * var(--almatar-font-size-ratio, 1) * 1px);font-weight:var(--almatar-font-weight-medium);color:var(--almatar-neutral-text-primary-static);margin-bottom:12px}.hotel-info-card__content{display:flex;align-items:stretch;gap:0}.hotel-info-card__image{width:120px;overflow:hidden;flex-shrink:0;padding-inline-end:12px;border-inline-end:1px solid rgb(217,217,222)}.hotel-info-card__image img{border-radius:5px;width:100%;height:100%;object-fit:cover;max-height:100px}.hotel-info-card__dates{display:flex;flex:1;border-inline-start:1px solid var(--almatar-neutral-border-default)}.hotel-info-card__stats{display:flex;flex-direction:column;justify-content:center;border-inline-start:1px solid var(--almatar-neutral-border-default);padding-inline-start:12px;margin-inline-start:0;min-width:70px}.date-box{display:flex;flex-direction:column;align-items:center;text-align:center;flex:1;padding:0 12px;border-inline-end:1px solid rgb(217,217,222);gap:4px}.date-box__label{font-size:calc(10 * var(--almatar-font-size-ratio, 1) * 1px);color:var(--almatar-neutral-text-secondary-static);text-transform:uppercase;letter-spacing:.5px}.date-box__day{font-size:calc(18 * var(--almatar-font-size-ratio, 1) * 1px);font-weight:var(--almatar-font-weight-medium);color:#491d95;line-height:1.2}.date-box__month{font-size:calc(12 * var(--almatar-font-size-ratio, 1) * 1px);font-weight:var(--almatar-font-weight-regular);color:var(--almatar-neutral-text-primary-static)}.date-box__day-name{font-size:calc(10 * var(--almatar-font-size-ratio, 1) * 1px);color:#747583}.date-box__time{font-size:calc(12 * var(--almatar-font-size-ratio, 1) * 1px);font-weight:var(--almatar-font-weight-regular);color:var(--almatar-neutral-text-primary-static)}.stat-box{display:flex;flex-direction:column;align-items:center;text-align:center;padding:4px 0;border-bottom:1px solid rgb(217,217,222)}.stat-box:last-child{border-bottom:none}.stat-box__label{font-size:calc(11 * var(--almatar-font-size-ratio, 1) * 1px);color:var(--almatar-neutral-text-secondary-static);text-transform:uppercase;letter-spacing:.5px;margin-bottom:4px}.stat-box__value{font-size:calc(18 * var(--almatar-font-size-ratio, 1) * 1px);font-weight:var(--almatar-font-weight-medium);color:var(--almatar-neutral-text-primary-static);line-height:1.3;color:#491d95}.rooms-list{display:flex;flex-direction:column;gap:12px}.main_btn{font-weight:var(--almatar-font-weight-medium);padding:17.5px;border-radius:6px;display:block;width:100%}.main_btn:disabled{opacity:.5;cursor:not-allowed}.main_btn--chat-with-us{background-color:#fff;border:1px solid rgb(217,217,222);color:#1b1a1f}button[disabled],input[type=button][disabled],input[type=reset][disabled],input[type=submit][disabled]{background-color:#747583;color:#b8b9c1;border-radius:12px}.info-banner{display:flex;gap:8px;border:1px solid rgb(11,84,194);border-radius:12px;padding:14px;align-items:flex-start;transition:all .3s cubic-bezier(.4,0,.2,1)}.info-banner__icon{color:#0b54c2;flex-shrink:0;width:20px;height:20px}.info-banner__content{flex:1}.info-banner__text{font-size:calc(12 * var(--almatar-font-size-ratio, 1) * 1px);color:#0b54c2;margin:0 0 4px;font-weight:var(--almatar-font-weight-regular);line-height:16px}.info-banner__subtext{font-size:calc(14 * var(--almatar-font-size-ratio, 1) * 1px);color:#1b1a1f;margin:0;line-height:1.4}\n"] }]
87
+ }], ctorParameters: () => [] });
88
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWxtYXRhci1ob3RlbC1hdXRvLWNhbmNlbGxhdGlvbi1zZWxlY3Qtcm9vbXMuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvc21hcnQtYm9va2luZy1kYXNoYm9hcmQvc3JjL2xpYi9jb21wb25lbnRzL2hvdGVsLWNhbmNlbC9jb21wb25lbnRzL2FsbWF0YXItaG90ZWwtYXV0by1jYW5jZWxsYXRpb24tc2VsZWN0LXJvb21zL2FsbWF0YXItaG90ZWwtYXV0by1jYW5jZWxsYXRpb24tc2VsZWN0LXJvb21zLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3NtYXJ0LWJvb2tpbmctZGFzaGJvYXJkL3NyYy9saWIvY29tcG9uZW50cy9ob3RlbC1jYW5jZWwvY29tcG9uZW50cy9hbG1hdGFyLWhvdGVsLWF1dG8tY2FuY2VsbGF0aW9uLXNlbGVjdC1yb29tcy9hbG1hdGFyLWhvdGVsLWF1dG8tY2FuY2VsbGF0aW9uLXNlbGVjdC1yb29tcy5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0wsU0FBUyxFQUNULHVCQUF1QixFQUN2QixVQUFVLEVBQ1YsS0FBSyxFQUNMLE1BQU0sRUFDTixNQUFNLEVBQ04sUUFBUSxFQUNSLE1BQU0sRUFDTixNQUFNLEdBQ1AsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQy9DLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSw0Q0FBNEMsQ0FBQztBQUUzRSxPQUFPLE1BQU0sTUFBTSxRQUFRLENBQUM7QUFLNUIsT0FBTyxFQUFFLG1EQUFtRCxFQUFFLE1BQU0sd0hBQXdILENBQUM7QUFDN0wsT0FBTyxFQUFFLHNEQUFzRCxFQUFFLE1BQU0sZ0lBQWdJLENBQUM7QUFDeE0sT0FBTyxFQUFFLDRDQUE0QyxFQUFF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QUFhLENBQUMsSUFBSSxFQUFFLENBQUM7SUFDNUIsQ0FBQztJQUVELDRCQUE0QixDQUFDLFdBQW1CO1FBQzlDLElBQUksQ0FBQywwQkFBMEIsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUM7SUFDcEQsQ0FBQztJQUVELFVBQVUsQ0FBQyxJQUFTO1FBTWxCLE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsY0FBYyxFQUFFLENBQUM7UUFDakQsTUFBTSxDQUFDLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUVwQyxPQUFPO1lBQ0wsR0FBRyxFQUFFLENBQUMsQ0FBQyxJQUFJLEVBQUU7WUFDYixLQUFLLEVBQUUsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUM7WUFDdkIsSUFBSSxFQUFFLENBQUMsQ0FBQyxJQUFJLEVBQUU7WUFDZCxPQUFPLEVBQUUsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUM7U0FDMUIsQ0FBQztJQUNKLENBQUM7K0dBcEhVLGdEQUFnRDttR0FBaEQsZ0RBQWdELDY2QkNwQzdELG9rS0FzSkEsNHBLRDFISSxZQUFZLCtCQUNaLG1EQUFtRCw2SkFDbkQsc0RBQXNEOzs0RkFNN0MsZ0RBQWdEO2tCQVo1RCxTQUFTOytCQUNFLDhDQUE4QyxjQUM1QyxJQUFJLFdBQ1A7d0JBQ1AsWUFBWTt3QkFDWixtREFBbUQ7d0JBQ25ELHNEQUFzRDtxQkFDdkQsbUJBR2dCLHVCQUF1QixDQUFDLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBDb21wb25lbnQsXG4gIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LFxuICBEZXN0cm95UmVmLFxuICBpbnB1dCxcbiAgb3V0cHV0LFxuICBzaWduYWwsXG4gIGNvbXB1dGVkLFxuICBpbmplY3QsXG4gIGVmZmVjdCxcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBDb21tb25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHsgU2hhcmVkU2VydmljZSB9IGZyb20gJy4uLy4uLy4uLy4uL3NoYXJlZC9zZXJ2aWNlcy9zaGFyZWQuc2VydmljZSc7XG5pbXBvcnQgeyB0YWtlVW50aWxEZXN0cm95ZWQgfSBmcm9tICdAYW5ndWxhci9jb3JlL3J4anMtaW50ZXJvcCc7XG5pbXBvcnQgbW9tZW50IGZyb20gJ21vbWVudCc7XG5pbXBvcnQge1xuICBJQWxtYXRhckhvdGVsQXV0b0NhbmNlbGxhdGlvblBhY2thZ2UsXG4gIElBbG1hdGFySG90ZWxBdXRvQ2FuY2VsbGF0aW9uSG90ZWxJbmZvLFxufSBmcm9tICcuLi8uLi9pbnRlcmZhY2VzL2ktYWxtYXRhci1ob3RlbC1hdXRvLWNhbmNlbGxhdGlvbi5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgQWxtYXRhckhvdGVsQXV0b0NhbmNlbGxhdGlvblJlZnVuZGFibGVSb29tQ29tcG9uZW50IH0gZnJvbSAnLi9jb21wb25lbnRzL2FsbWF0YXItaG90ZWwtYXV0by1jYW5jZWxsYXRpb24tcmVmdW5kYWJsZS1yb29tL2FsbWF0YXItaG90ZWwtYXV0by1jYW5jZWxsYXRpb24tcmVmdW5kYWJsZS1yb29tLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBBbG1hdGFySG90ZWxBdXRvQ2FuY2VsbGF0aW9uTm9uUmVmdW5kYWJsZVJvb21Db21wb25lbnQgfSBmcm9tICcuL2NvbXBvbmVudHMvYWxtYXRhci1ob3RlbC1hdXRvLWNhbmNlbGxhdGlvbi1ub24tcmVmdW5kYWJsZS1yb29tL2FsbWF0YXItaG90ZWwtYXV0by1jYW5jZWxsYXRpb24tbm9uLXJlZnVuZGFibGUtcm9vbS5jb21wb25lbnQnO1xuaW1wb3J0IHsgQWxtYXRhckhvdGVsQXV0b0NhbmNlbGxhdGlvbkVuZHBvaW50c1NlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9hbG1hdGFyLWhvdGVsLWF1dG8tY2FuY2VsbGF0aW9uLWVuZHBvaW50cy5zZXJ2aWNlJztcbmltcG9ydCB7IEFsbWF0YXJIb3RlbEF1dG9DYW5jZWxsYXRpb25TZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvYWxtYXRhci1ob3RlbC1hdXRvLWNhbmNlbGxhdGlvbi5zZXJ2aWNlJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnYWxtYXRhci1ob3RlbC1hdXRvLWNhbmNlbGxhdGlvbi1zZWxlY3Qtcm9vbXMnLFxuICBzdGFuZGFsb25lOiB0cnVlLFxuICBpbXBvcnRzOiBbXG4gICAgQ29tbW9uTW9kdWxlLFxuICAgIEFsbWF0YXJIb3RlbEF1dG9DYW5jZWxsYXRpb25SZWZ1bmRhYmxlUm9vbUNvbXBvbmVudCxcbiAgICBBbG1hdGFySG90ZWxBdXRvQ2FuY2VsbGF0aW9uTm9uUmVmdW5kYWJsZVJvb21Db21wb25lbnQsXG4gIF0sXG4gIHRlbXBsYXRlVXJsOiAnLi9hbG1hdGFyLWhvdGVsLWF1dG8tY2FuY2VsbGF0aW9uLXNlbGVjdC1yb29tcy5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL2FsbWF0YXItaG90ZWwtYXV0by1jYW5jZWxsYXRpb24tc2VsZWN0LXJvb21zLmNvbXBvbmVudC5zY3NzJ10sXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxufSlcbmV4cG9ydCBjbGFzcyBBbG1hdGFySG90ZWxBdXRvQ2FuY2VsbGF0aW9uU2VsZWN0Um9vbXNDb21wb25lbnQge1xuICBwcml2YXRlIHJlYWRvbmx5IHNoYXJlZFNlcnZpY2UgPSBpbmplY3QoU2hhcmVkU2VydmljZSk7XG4gIHByaXZhdGUgcmVhZG9ubHkgZW5kcG9pbnRzU2VydmljZSA9IGluamVjdChcbiAgICBBbG1hdGFySG90ZWxBdXRvQ2FuY2VsbGF0aW9uRW5kcG9pbnRzU2VydmljZSxcbiAgKTtcblxuICBwcml2YXRlIHJlYWRvbmx5IGF1dG9DYW5jZWxsYXRpb25TZXJ2aWNlID0gaW5qZWN0KFxuICAgIEFsbWF0YXJIb3RlbEF1dG9DYW5jZWxsYXRpb25TZXJ2aWNlLFxuICApO1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgZGVzdHJveVJlZiA9IGluamVjdChEZXN0cm95UmVmKTtcblxuICByZWFkb25seSBwYWNrYWdlcyA9IGlucHV0LnJlcXVpcmVkPElBbG1hdGFySG90ZWxBdXRvQ2FuY2VsbGF0aW9uUGFja2FnZVtdPigpO1xuICByZWFkb25seSBpc0xvYWRpbmdSZWZ1bmQgPSBzaWduYWwoZmFsc2UpO1xuXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIGVmZmVjdChcbiAgICAgICgpID0+IHtcbiAgICAgICAgLy8gZ2V0IG9ubHkgdW4gY2FuY2VsbGVkIHBhY2thZ2VzXG4gICAgICAgIGNvbnN0IHBhY2thZ2VzTGlzdCA9IHRoaXMucGFja2FnZXMoKS5maWx0ZXIoXG4gICAgICAgICAgKHBrZzogYW55KSA9PiAhcGtnPy5pc0NhbmNlbGxlZCxcbiAgICAgICAgKTtcbiAgICAgICAgaWYgKHBhY2thZ2VzTGlzdC5sZW5ndGggPT09IDEgJiYgIXBhY2thZ2VzTGlzdFswXS5pc1NlbGVjdGVkKSB7XG4gICAgICAgICAgY29uc3Qgc2VsZWN0ZWRQYWNrYWdlID0geyAuLi5wYWNrYWdlc0xpc3RbMF0sIGlzU2VsZWN0ZWQ6IHRydWUgfTtcbiAgICAgICAgICB0aGlzLmxvY2FsUGFja2FnZXMuc2V0KFtzZWxlY3RlZFBhY2thZ2VdKTtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIHsgYWxsb3dTaWduYWxXcml0ZXM6IHRydWUgfSxcbiAgICApO1xuICB9XG5cbiAgcmVhZG9ubHkgaG90ZWxJbmZvID1cbiAgICBpbnB1dC5yZXF1aXJlZDxJQWxtYXRhckhvdGVsQXV0b0NhbmNlbGxhdGlvbkhvdGVsSW5mbyB8IG51bGw+KCk7XG5cbiAgcmVhZG9ubHkgYm9va2luZ0lkID0gaW5wdXQ8c3RyaW5nIHwgbnVtYmVyPignJyk7XG5cbiAgcmVhZG9ubHkgaG90ZWxJZCA9IGlucHV0PHN0cmluZyB8IG51bWJlcj4oJycpO1xuXG4gIHJlYWRvbmx5IGNvbnRpbnVlVG9DYW5jZWwgPSBvdXRwdXQ8SUFsbWF0YXJIb3RlbEF1dG9DYW5jZWxsYXRpb25QYWNrYWdlW10+KCk7XG4gIHJlYWRvbmx5IGNsb3NlTW9kYWwgPSBvdXRwdXQ8dm9pZD4oKTtcbiAgcmVhZG9ubHkgbm9uUmVmdW5kYWJsZVN1Ym1pdFN1Y2Nlc3MgPSBvdXRwdXQ8c3RyaW5nPigpO1xuICByZWFkb25seSBjaGF0V2l0aEFnZW50ID0gb3V0cHV0PHZvaWQ+KCk7XG5cbiAgcmVhZG9ubHkgY3VycmVuY3lDb2RlID0gaW5wdXQ8c3RyaW5nPignU0FSJyk7XG5cbiAgcmVhZG9ubHkgbG9jYWxQYWNrYWdlcyA9IHNpZ25hbDxJQWxtYXRhckhvdGVsQXV0b0NhbmNlbGxhdGlvblBhY2thZ2VbXT4oW10pO1xuXG4gIHJlYWRvbmx5IGRpc3BsYXlQYWNrYWdlcyA9IGNvbXB1dGVkKCgpID0+IHtcbiAgICBjb25zdCBsb2NhbCA9IHRoaXMubG9jYWxQYWNrYWdlcygpO1xuICAgIHJldHVybiBsb2NhbC5sZW5ndGggPiAwID8gbG9jYWwgOiB0aGlzLnBhY2thZ2VzKCk7XG4gIH0pO1xuXG4gIHJlYWRvbmx5IHNlbGVjdGVkUGFja2FnZXNDb3VudCA9IGNvbXB1dGVkKFxuICAgICgpID0+IHRoaXMuZGlzcGxheVBhY2thZ2VzKCkuZmlsdGVyKChwa2cpID0+IHBrZy5pc1NlbGVjdGVkKS5sZW5ndGgsXG4gICk7XG5cbiAgcmVhZG9ubHkgaGFzU2VsZWN0ZWRQYWNrYWdlcyA9IGNvbXB1dGVkKFxuICAgICgpID0+IHRoaXMuc2VsZWN0ZWRQYWNrYWdlc0NvdW50KCkgPiAwLFxuICApO1xuXG4gIHJlYWRvbmx5IGlzU2luZ2xlUGFja2FnZSA9IGNvbXB1dGVkKCgpID0+IHRoaXMucGFja2FnZXMoKS5sZW5ndGggPT09IDEpO1xuXG4gIHJlYWRvbmx5IHRvdGFsUm9vbXNDb3VudCA9IGNvbXB1dGVkKCgpID0+XG4gICAgdGhpcy5wYWNrYWdlcygpLnJlZHVjZSgoYWNjLCBwa2cpID0+IGFjYyArIChwa2cucm9vbXM/Lmxlbmd0aCB8fCAwKSwgMCksXG4gICk7XG5cbiAgcmVhZG9ubHkgYWxsUGFja2FnZXNOb25SZWZ1bmRhYmxlID0gY29tcHV0ZWQoKCkgPT5cbiAgICB0aGlzLnBhY2thZ2VzKCkuZXZlcnkoKHBrZykgPT4gIXBrZy5pc1JlZnVuZGFibGUgJiYgIXBrZy5pc0NhbmNlbGxlZCksXG4gICk7XG5cbiAgdG9nZ2xlUGFja2FnZShwYWNrYWdlSWQ6IHN0cmluZyk6IHZvaWQge1xuICAgIGNvbnN0IGN1cnJlbnRQYWNrYWdlcyA9IHRoaXMuZGlzcGxheVBhY2thZ2VzKCk7XG4gICAgY29uc3QgdXBkYXRlZFBhY2thZ2VzID0gY3VycmVudFBhY2thZ2VzLm1hcCgocGtnKSA9PlxuICAgICAgcGtnLnBhY2thZ2VJZCA9PT0gcGFja2FnZUlkXG4gICAgICAgID8geyAuLi5wa2csIGlzU2VsZWN0ZWQ6ICFwa2cuaXNTZWxlY3RlZCB9XG4gICAgICAgIDogcGtnLFxuICAgICk7XG4gICAgdGhpcy5sb2NhbFBhY2thZ2VzLnNldCh1cGRhdGVkUGFja2FnZXMpO1xuICB9XG5cbiAgb25Db250aW51ZSgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5oYXNTZWxlY3RlZFBhY2thZ2VzKCkpIHtcbiAgICAgIGNvbnN0IHNlbGVjdGVkUGFja2FnZXMgPSB0aGlzLmRpc3BsYXlQYWNrYWdlcygpLmZpbHRlcihcbiAgICAgICAgKHBrZykgPT4gcGtnLmlzU2VsZWN0ZWQgJiYgIXBrZy5pc0NhbmNlbGxlZCxcbiAgICAgICk7XG4gICAgICB0aGlzLmNvbnRpbnVlVG9DYW5jZWwuZW1pdChzZWxlY3RlZFBhY2thZ2VzKTtcbiAgICB9XG4gIH1cblxuICBvbkNsb3NlKCk6IHZvaWQge1xuICAgIHRoaXMuY2xvc2VNb2RhbC5lbWl0KCk7XG4gIH1cblxuICBvbkNoYXRXaXRoQWdlbnQoKTogdm9pZCB7XG4gICAgdGhpcy5jaGF0V2l0aEFnZW50LmVtaXQoKTtcbiAgfVxuXG4gIG9uTm9uUmVmdW5kYWJsZVN1Ym1pdFN1Y2Nlc3MocGFja2FnZU5hbWU6IHN0cmluZyk6IHZvaWQge1xuICAgIHRoaXMubm9uUmVmdW5kYWJsZVN1Ym1pdFN1Y2Nlc3MuZW1pdChwYWNrYWdlTmFtZSk7XG4gIH1cblxuICBmb3JtYXREYXRlKGRhdGU6IGFueSk6IHtcbiAgICBkYXk6IG51bWJlcjtcbiAgICBtb250aDogc3RyaW5nO1xuICAgIHllYXI6IG51bWJlcjtcbiAgICBkYXlOYW1lOiBzdHJpbmc7XG4gIH0ge1xuICAgIGNvbnN0IGxhbmcgPSB0aGlzLnNoYXJlZFNlcnZpY2UuZ2V0QXBwTGFuZ3VhZ2UoKTtcbiAgICBjb25zdCBtID0gbW9tZW50KGRhdGUpLmxvY2FsZShsYW5nKTtcblxuICAgIHJldHVybiB7XG4gICAgICBkYXk6IG0uZGF0ZSgpLFxuICAgICAgbW9udGg6IG0uZm9ybWF0KCdNTU1NJyksXG4gICAgICB5ZWFyOiBtLnllYXIoKSxcbiAgICAgIGRheU5hbWU6IG0uZm9ybWF0KCdkZGRkJyksXG4gICAgfTtcbiAgfVxufVxuIiwiPGRpdiBjbGFzcz1cInNlbGVjdC1yb29tc1wiPlxuICA8ZGl2IGNsYXNzPVwic2VsZWN0LXJvb21zX19jb250ZW50XCI+XG4gICAgQGlmIChob3RlbEluZm8oKTsgYXMgaG90ZWwpIHtcbiAgICAgIDxkaXYgY2xhc3M9XCJob3RlbC1pbmZvLWNhcmRcIj5cbiAgICAgICAgPGgzIGNsYXNzPVwiaG90ZWwtaW5mby1jYXJkX19uYW1lXCI+e3sgaG90ZWwuaG90ZWxOYW1lIH19PC9oMz5cblxuICAgICAgICA8ZGl2IGNsYXNzPVwiaG90ZWwtaW5mby1jYXJkX19jb250ZW50XCI+XG4gICAgICAgICAgQGlmIChob3RlbC5ob3RlbEltYWdlKSB7XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaG90ZWwtaW5mby1jYXJkX19pbWFnZVwiPlxuICAgICAgICAgICAgICA8aW1nIFtzcmNdPVwiaG90ZWwuaG90ZWxJbWFnZVwiIFthbHRdPVwiaG90ZWwuaG90ZWxOYW1lXCIgLz5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIH1cblxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJob3RlbC1pbmZvLWNhcmRfX2RhdGVzXCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZGF0ZS1ib3hcIj5cbiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJkYXRlLWJveF9fbGFiZWxcIj5DSEVDSy1JTjwvc3Bhbj5cbiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJkYXRlLWJveF9fZGF5XCI+e3tcbiAgICAgICAgICAgICAgICBmb3JtYXREYXRlKGhvdGVsLmNoZWNrSW4pLmRheVxuICAgICAgICAgICAgICB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJkYXRlLWJveF9fbW9udGhcIj57e1xuICAgICAgICAgICAgICAgIGZvcm1hdERhdGUoaG90ZWwuY2hlY2tJbikubW9udGhcbiAgICAgICAgICAgICAgfX08L3NwYW4+XG4gICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZGF0ZS1ib3hfX2RheS1uYW1lXCI+e3tcbiAgICAgICAgICAgICAgICBmb3JtYXREYXRlKGhvdGVsLmNoZWNrSW4pLmRheU5hbWVcbiAgICAgICAgICAgICAgfX08L3NwYW4+XG4gICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZGF0ZS1ib3hfX3RpbWVcIlxuICAgICAgICAgICAgICAgID5Gcm9tXG4gICAgICAgICAgICAgICAge3sgaG90ZWw/LmNoZWNrSW5UaW1lIH19PC9zcGFuXG4gICAgICAgICAgICAgID5cbiAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZGF0ZS1ib3hcIj5cbiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJkYXRlLWJveF9fbGFiZWxcIj5DSEVDSy1PVVQ8L3NwYW4+XG4gICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZGF0ZS1ib3hfX2RheVwiPnt7XG4gICAgICAgICAgICAgICAgZm9ybWF0RGF0ZShob3RlbC5jaGVja091dCkuZGF5XG4gICAgICAgICAgICAgIH19PC9zcGFuPlxuICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImRhdGUtYm94X19tb250aFwiPnt7XG4gICAgICAgICAgICAgICAgZm9ybWF0RGF0ZShob3RlbC5jaGVja091dCkubW9udGhcbiAgICAgICAgICAgICAgfX08L3NwYW4+XG4gICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZGF0ZS1ib3hfX2RheS1uYW1lXCI+e3tcbiAgICAgICAgICAgICAgICBmb3JtYXREYXRlKGhvdGVsLmNoZWNrT3V0KS5kYXlOYW1lXG4gICAgICAgICAgICAgIH19PC9zcGFuPlxuICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImRhdGUtYm94X190aW1lXCJcbiAgICAgICAgICAgICAgICA+VW50aWxcbiAgICAgICAgICAgICAgICB7eyBob3RlbD8uY2hlY2tPdXRUaW1lIH19PC9zcGFuXG4gICAgICAgICAgICAgID5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgPGRpdiBjbGFzcz1cImhvdGVsLWluZm8tY2FyZF9fc3RhdHNcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzdGF0LWJveFwiPlxuICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInN0YXQtYm94X19sYWJlbFwiPlJvb21zPC9zcGFuPlxuICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInN0YXQtYm94X192YWx1ZVwiPnt7IHRvdGFsUm9vbXNDb3VudCgpIH19PC9zcGFuPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwic3RhdC1ib3hcIj5cbiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJzdGF0LWJveF9fbGFiZWxcIj5OSUdIVFM8L3NwYW4+XG4gICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwic3RhdC1ib3hfX3ZhbHVlXCI+e3sgaG90ZWwubmlnaHRzIH19PC9zcGFuPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgfVxuXG4gICAgPGRpdiBjbGFzcz1cInNlbGVjdC1yb29tc19fbm90aWNlIHNlbGVjdC1yb29tc19fbm90aWNlLS1kZWZhdWx0XCI+XG4gICAgICA8c3ZnIHdpZHRoPVwiMThcIiBoZWlnaHQ9XCIxOFwiIHZpZXdCb3g9XCIwIDAgMjQgMjRcIiBmaWxsPVwibm9uZVwiPlxuICAgICAgICA8Y2lyY2xlXG4gICAgICAgICAgY3g9XCIxMlwiXG4gICAgICAgICAgY3k9XCIxMlwiXG4gICAgICAgICAgcj1cIjlcIlxuICAgICAgICAgIHN0cm9rZT1cImN1cnJlbnRDb2xvclwiXG4gICAgICAgICAgc3Ryb2tlLXdpZHRoPVwiMS42XCJcbiAgICAgICAgLz5cbiAgICAgICAgPHBhdGhcbiAgICAgICAgICBkPVwiTTEyIDExdjUuNU0xMiA4di4wMVwiXG4gICAgICAgICAgc3Ryb2tlPVwiY3VycmVudENvbG9yXCJcbiAgICAgICAgICBzdHJva2Utd2lkdGg9XCIxLjZcIlxuICAgICAgICAgIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIlxuICAgICAgICAvPlxuICAgICAgPC9zdmc+XG4gICAgICA8c3Bhbj5cbiAgICAgICAgU29tZSByb29tcyBpbiBlYWNoIHBhY2thZ2UsIHNoYXJlIG9uZSBib29raW5nIHJlZmVyZW5jZSwgc28gdGhleSB3aWxsIGJlIGNhbmNlbGxlZCB0b2dldGhlci48L3NwYW5cbiAgICAgID5cbiAgICA8L2Rpdj5cblxuICAgIDxkaXYgY2xhc3M9XCJyb29tcy1saXN0XCI+XG4gICAgICBAZm9yIChwYWNrYWdlIG9mIGRpc3BsYXlQYWNrYWdlcygpOyB0cmFjayAkaW5kZXgpIHtcbiAgICAgICAgQGlmICghcGFja2FnZS5tYW51YWxSZWZ1bmRSZXF1ZXN0KSB7XG4gICAgICAgICAgPGFsbWF0YXItaG90ZWwtYXV0by1jYW5jZWxsYXRpb24tcmVmdW5kYWJsZS1yb29tXG4gICAgICAgICAgICBbcGFja2FnZV09XCJwYWNrYWdlXCJcbiAgICAgICAgICAgIFtoaWRlQ2hlY2tib3hdPVwiaXNTaW5nbGVQYWNrYWdlKClcIlxuICAgICAgICAgICAgKHRvZ2dsZVBhY2thZ2UpPVwidG9nZ2xlUGFja2FnZSgkZXZlbnQpXCJcbiAgICAgICAgICAvPlxuICAgICAgICB9IEBlbHNlIHtcbiAgICAgICAgICA8YWxtYXRhci1ob3RlbC1hdXRvLWNhbmNlbGxhdGlvbi1ub24tcmVmdW5kYWJsZS1yb29tXG4gICAgICAgICAgICBbcGFja2FnZV09XCJwYWNrYWdlXCJcbiAgICAgICAgICAgIFthbGxQYWNrYWdlc109XCJkaXNwbGF5UGFja2FnZXMoKVwiXG4gICAgICAgICAgICBbaG90ZWxJbmZvXT1cImhvdGVsSW5mbygpXCJcbiAgICAgICAgICAgIFtob3RlbElkXT1cImhvdGVsSWQoKVwiXG4gICAgICAgICAgICBbY3VycmVuY3lDb2RlXT1cImN1cnJlbmN5Q29kZSgpXCJcbiAgICAgICAgICAgIFthbGxQYWNrYWdlc05vblJlZnVuZGFibGVdPVwiYWxsUGFja2FnZXNOb25SZWZ1bmRhYmxlKClcIlxuICAgICAgICAgICAgKGNsb3NlTW9kYWwpPVwib25DbG9zZSgpXCJcbiAgICAgICAgICAgIChub25SZWZ1bmRhYmxlU3VibWl0U3VjY2Vzcyk9XCJvbk5vblJlZnVuZGFibGVTdWJtaXRTdWNjZXNzKCRldmVudClcIlxuICAgICAgICAgIC8+XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICA8L2Rpdj5cblxuICAgIEBpZiAoYWxsUGFja2FnZXNOb25SZWZ1bmRhYmxlKCkpIHtcbiAgICAgIDxkaXYgY2xhc3M9XCJzZWxlY3Qtcm9vbXNfX25vdGljZSBzZWxlY3Qtcm9vbXNfX25vdGljZS0td2FybmluZ1wiPlxuICAgICAgICA8c3ZnIHdpZHRoPVwiMThcIiBoZWlnaHQ9XCIxOFwiIHZpZXdCb3g9XCIwIDAgMjQgMjRcIiBmaWxsPVwibm9uZVwiPlxuICAgICAgICAgIDwhLS0gd2FybmluZyB0cmlhbmdsZSBpY29uIC0tPlxuICAgICAgICAgIDxwYXRoXG4gICAgICAgICAgICBkPVwiTTEyIDl2NE0xMiAxN2guMDFNMTAuMjkgMy44NkwxLjgyIDE4YTIgMiAwIDAwMS43MSAzaDE2Ljk0YTIgMiAwIDAwMS43MS0zTDEzLjcxIDMuODZhMiAyIDAgMDAtMy40MiAwelwiXG4gICAgICAgICAgICBzdHJva2U9XCJjdXJyZW50Q29sb3JcIlxuICAgICAgICAgICAgc3Ryb2tlLXdpZHRoPVwiMS42XCJcbiAgICAgICAgICAgIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIlxuICAgICAgICAgICAgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIlxuICAgICAgICAgIC8+XG4gICAgICAgIDwvc3ZnPlxuICAgICAgICA8c3Bhbj5Tb3JyeSwgd2UgY291bGRuJ3QgcHJvY2VzcyB5b3VyIHJlZnVuZCByaWdodCBub3cuIFBsZWFzZSBjaGF0IHdpdGggb3VyIEN1c3RvbWVyIFNlcnZpY2UgdGVhbSBmb3IgaGVscC48L3NwYW4+XG4gICAgICA8L2Rpdj5cbiAgICB9XG4gIDwvZGl2PlxuXG4gIDxkaXYgY2xhc3M9XCJzZWxlY3Qtcm9vbXNfX2Zvb3RlclwiPlxuICAgIEBpZiAoYWxsUGFja2FnZXNOb25SZWZ1bmRhYmxlKCkpIHtcbiAgICAgIDxidXR0b25cbiAgICAgICAgY2xhc3M9XCJtYWluX2J0biBtYWluX2J0bi0tY2hhdC13aXRoLXVzXCJcbiAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgIChjbGljayk9XCJvbkNoYXRXaXRoQWdlbnQoKVwiXG4gICAgICA+XG4gICAgICAgIENoYXQgd2l0aCBjdXN0b21lciBzZXJ2aWNlXG4gICAgICA8L2J1dHRvbj5cbiAgICB9IEBlbHNlIHtcbiAgICAgIEBpZiAoIWhhc1NlbGVjdGVkUGFja2FnZXMoKSkge1xuICAgICAgICA8cCBjbGFzcz1cInNlbGVjdC1yb29tc19faGludFwiPlxuICAgICAgICAgIFNlbGVjdCBhdCBsZWFzdCBvbmUgcm9vbSB0byBjb250aW51ZVxuICAgICAgICA8L3A+XG4gICAgICB9XG4gICAgICA8YnV0dG9uXG4gICAgICAgIGNsYXNzPVwibWFpbl9idG5cIlxuICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgW2Rpc2FibGVkXT1cIiFoYXNTZWxlY3RlZFBhY2thZ2VzKClcIlxuICAgICAgICAoY2xpY2spPVwib25Db250aW51ZSgpXCJcbiAgICAgID5cbiAgICAgICAgQ29udGludWUgdG8gY2FuY2VsXG4gICAgICA8L2J1dHRvbj5cbiAgICB9XG4gIDwvZGl2PlxuPC9kaXY+XG4iXX0=
@@ -0,0 +1,242 @@
1
+ import { Component, ChangeDetectionStrategy, input, output, signal, inject, DestroyRef, computed, } from '@angular/core';
2
+ import { CommonModule } from '@angular/common';
3
+ import { TranslationService } from '../../../../../../shared/services/translation.service';
4
+ import { HttpClient, HttpEventType, HttpRequest } from '@angular/common/http';
5
+ import { takeUntilDestroyed } from '@angular/core/rxjs-interop';
6
+ import { AlmatarIconModule } from '../../../../../../shared/modules/almatar-icon/almatar-icon.module';
7
+ import { AlmatarHotelAutoCancellationEndpointsEnum } from '../../../../enums/almatar-hotel-auto-cancellation-endpoints.enum';
8
+ import { AlmatarHotelAutoCancellationEndpointsService } from '../../../../services/almatar-hotel-auto-cancellation-endpoints.service';
9
+ import { DialogService } from 'primeng/dynamicdialog';
10
+ import * as i0 from "@angular/core";
11
+ import * as i1 from "../../../../../../shared/modules/almatar-icon/almatar-icon.module";
12
+ export class AlmatarHotelAutoCancellationNonRefundableRoomComponent {
13
+ constructor() {
14
+ this.http = inject(HttpClient);
15
+ this.destroyRef = inject(DestroyRef);
16
+ this.endpointsService = inject(AlmatarHotelAutoCancellationEndpointsService);
17
+ this.translateService = inject(TranslationService);
18
+ this.dialogService = inject(DialogService);
19
+ this.package = input.required();
20
+ this.allPackages = input([]);
21
+ this.hotelInfo = input(null);
22
+ // constructor(){effect(() => {
23
+ // console.log(this.package())
24
+ // })}
25
+ this.hotelId = input('');
26
+ this.currencyCode = input('SAR');
27
+ this.allPackagesNonRefundable = input(false);
28
+ this.useLocalCancellationPolicies = true;
29
+ this.closeModal = output();
30
+ this.nonRefundableSubmitSuccess = output();
31
+ this.uploadedFile = signal(null);
32
+ this.uploadedFileUrl = signal(null);
33
+ this.filePicked = signal(null);
34
+ this.uploadSuccess = signal(false);
35
+ this.uploadProgress = signal(0);
36
+ this.isUploading = signal(false);
37
+ this.isSubmitting = signal(false);
38
+ this.submitSuccess = signal(false);
39
+ this.submitError = signal(null);
40
+ this.groupedRooms = computed(() => {
41
+ const rooms = this.package()?.rooms || [];
42
+ const groupMap = new Map();
43
+ for (const room of rooms) {
44
+ // const bedTypeOrRoomType = room.bedType || room.roomType || '';
45
+ const bedTypeOrRoomType = room?.roomName;
46
+ const roomBasis = room.roomBasis || '';
47
+ const key = `${bedTypeOrRoomType}|||${roomBasis}`;
48
+ if (groupMap.has(key)) {
49
+ const group = groupMap.get(key);
50
+ group.count++;
51
+ group.rooms.push(room);
52
+ }
53
+ else {
54
+ groupMap.set(key, {
55
+ key,
56
+ bedTypeOrRoomType,
57
+ roomBasis,
58
+ count: 1,
59
+ rooms: [room],
60
+ });
61
+ }
62
+ }
63
+ return Array.from(groupMap.values());
64
+ });
65
+ }
66
+ onFileSelected(event) {
67
+ const input = event.target;
68
+ if (input.files && input.files.length > 0) {
69
+ const file = input.files[0];
70
+ this.filePicked.set(file);
71
+ this.uploadFile(file);
72
+ }
73
+ }
74
+ uploadFile(file) {
75
+ this.isUploading.set(true);
76
+ this.uploadProgress.set(0);
77
+ this.uploadSuccess.set(false);
78
+ this.uploadedFileUrl.set(null);
79
+ const formData = new FormData();
80
+ formData.append('file', file);
81
+ const req = new HttpRequest('POST', AlmatarHotelAutoCancellationEndpointsEnum.uploadAttachment, formData, {
82
+ reportProgress: true,
83
+ responseType: 'json',
84
+ });
85
+ this.http
86
+ .request(req)
87
+ .pipe(takeUntilDestroyed(this.destroyRef))
88
+ .subscribe({
89
+ next: (event) => {
90
+ if (event.type === HttpEventType.UploadProgress && event.total) {
91
+ const progress = Math.round((100 * event.loaded) / event.total);
92
+ this.uploadProgress.set(progress);
93
+ }
94
+ else if (event.type === HttpEventType.Response) {
95
+ this.uploadProgress.set(100);
96
+ this.isUploading.set(false);
97
+ this.uploadSuccess.set(true);
98
+ this.uploadedFile.set(file);
99
+ this.uploadedFileUrl.set(event.body?.data?.url ?? null);
100
+ }
101
+ },
102
+ error: () => {
103
+ this.isUploading.set(false);
104
+ this.uploadProgress.set(0);
105
+ this.uploadSuccess.set(false);
106
+ this.filePicked.set(null);
107
+ this.uploadedFileUrl.set(null);
108
+ },
109
+ });
110
+ }
111
+ onSubmitRequest() {
112
+ const url = this.uploadedFileUrl();
113
+ if (!url) {
114
+ return;
115
+ }
116
+ this.isSubmitting.set(true);
117
+ this.submitError.set(null);
118
+ this.submitSuccess.set(false);
119
+ const language = 'en';
120
+ this.endpointsService
121
+ .processNonRefundableCancellation(this.package().packageId, url, language)
122
+ .pipe(takeUntilDestroyed(this.destroyRef))
123
+ .subscribe({
124
+ next: () => {
125
+ this.isSubmitting.set(false);
126
+ this.submitSuccess.set(true);
127
+ this.nonRefundableSubmitSuccess.emit(this.package().packageName);
128
+ },
129
+ error: (error) => {
130
+ this.isSubmitting.set(false);
131
+ this.submitError.set(error?.message || 'Failed to submit request');
132
+ },
133
+ });
134
+ }
135
+ onRetry() {
136
+ this.submitError.set(null);
137
+ this.onSubmitRequest();
138
+ }
139
+ onOpenCancellationPolicy() {
140
+ const hotelInfoData = this.hotelInfo();
141
+ const currencyCode = this.currencyCode();
142
+ // Use all packages if available, otherwise fall back to current package
143
+ const packagesToShow = this.allPackages().length > 0 ? this.allPackages() : [this.package()];
144
+ // Transform all packages with their cancellation policies
145
+ const packagesForPopup = packagesToShow.map((pkg) => {
146
+ // Transform cancellation policies to the format expected by mapCancellationPolicies
147
+ const rawCancellationPolicies = (pkg.cancellationPolicies || []).map((policy) => ({
148
+ dateFrom: policy.fromDate,
149
+ dateTo: policy.toDate,
150
+ currencyIsoCode: currencyCode,
151
+ finalPrice: policy.penaltyValue,
152
+ refundabilityType: policy.penaltyType === 'FullRefunded'
153
+ ? 'FullRefunded'
154
+ : policy.penaltyType === 'Percentage' ||
155
+ policy.penaltyType === 'Amount'
156
+ ? 'PartialRefunded'
157
+ : 'NonRefunded',
158
+ }));
159
+ // Ensure at least one policy exists
160
+ if (rawCancellationPolicies.length === 0) {
161
+ rawCancellationPolicies.push({
162
+ dateFrom: hotelInfoData?.checkIn,
163
+ dateTo: hotelInfoData?.checkOut,
164
+ currencyIsoCode: currencyCode,
165
+ finalPrice: pkg.cancellationFee || 0,
166
+ refundabilityType: pkg.isRefundable ? 'Refundable' : 'NonRefunded',
167
+ });
168
+ }
169
+ // Build package data with all required fields
170
+ const remarks = pkg?.cancellationPoliciesRemarks ??
171
+ pkg?.CancellationPoliciesRemarks;
172
+ return {
173
+ ...pkg,
174
+ cancellationPolicies: rawCancellationPolicies,
175
+ isRefundable: pkg.isRefundable ?? pkg.refundability ?? false,
176
+ refundableUntil: pkg.refundableUntil,
177
+ currency: currencyCode,
178
+ finalPrice: pkg.roomAmount,
179
+ bookingRemarks: remarks,
180
+ cancellationPoliciesRemarks: remarks,
181
+ };
182
+ });
183
+ const cartInfo = {
184
+ packages: packagesForPopup,
185
+ fromDate: hotelInfoData?.checkIn,
186
+ date_from: hotelInfoData?.checkIn,
187
+ toDate: hotelInfoData?.checkOut,
188
+ date_to: hotelInfoData?.checkOut,
189
+ almtaarHotelId: this.hotelId(),
190
+ };
191
+ const lang = 'en';
192
+ const formatDate = lang === 'en'
193
+ ? 'dddd Do of MMMM YYYY - hh:mm A [GMT]'
194
+ : 'dddd , DD MMMM YYYY - hh:mm A [GMT]';
195
+ // TODO: Fix import path for CancellationPolicyPopupComponent
196
+ // import('libs/features/src/lib/features/hotels/shared/modules/hotel-booking-information/components/booking-summary/components/cancellation-policy-popup/cancellation-policy.popup.component').then(
197
+ // ({ CancellationPolicyPopupComponent }) => {
198
+ const header = this.translateService.instant('HOTEL.cancellation-policy');
199
+ console.warn('CancellationPolicyPopupComponent not available - import path needs to be fixed');
200
+ // this.dialogService.open(CancellationPolicyPopupComponent, {
201
+ // header,
202
+ // data: {
203
+ // cartInfo,
204
+ // currentCurrencyObj: {
205
+ // code: currencyCode,
206
+ // currency: currencyCode,
207
+ // },
208
+ // formatDate,
209
+ // hotelDetails: {
210
+ // hotelName: hotelInfoData?.hotelName,
211
+ // paymentOption: null,
212
+ // },
213
+ // },
214
+ // styleClass: 'cancellation-policy-dialog',
215
+ // contentStyle: { overflow: 'auto' },
216
+ // baseZIndex: 10000,
217
+ // maximizable: false,
218
+ // style: { width: '600px', maxWidth: '90%' },
219
+ // });
220
+ //},
221
+ //);
222
+ }
223
+ formatFileSize(bytes) {
224
+ if (!bytes) {
225
+ return '';
226
+ }
227
+ if (bytes < 1024) {
228
+ return `${bytes} B`;
229
+ }
230
+ if (bytes < 1024 * 1024) {
231
+ return `${Math.round(bytes / 1024)} KB`;
232
+ }
233
+ return `${(bytes / (1024 * 1024)).toFixed(1)} MB`;
234
+ }
235
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: AlmatarHotelAutoCancellationNonRefundableRoomComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
236
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: AlmatarHotelAutoCancellationNonRefundableRoomComponent, isStandalone: true, selector: "almatar-hotel-auto-cancellation-non-refundable-room", inputs: { package: { classPropertyName: "package", publicName: "package", isSignal: true, isRequired: true, transformFunction: null }, allPackages: { classPropertyName: "allPackages", publicName: "allPackages", isSignal: true, isRequired: false, transformFunction: null }, hotelInfo: { classPropertyName: "hotelInfo", publicName: "hotelInfo", isSignal: true, isRequired: false, transformFunction: null }, hotelId: { classPropertyName: "hotelId", publicName: "hotelId", isSignal: true, isRequired: false, transformFunction: null }, currencyCode: { classPropertyName: "currencyCode", publicName: "currencyCode", isSignal: true, isRequired: false, transformFunction: null }, allPackagesNonRefundable: { classPropertyName: "allPackagesNonRefundable", publicName: "allPackagesNonRefundable", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { closeModal: "closeModal", nonRefundableSubmitSuccess: "nonRefundableSubmitSuccess" }, providers: [DialogService], ngImport: i0, template: "@if (!package().isCancelled) {\n <div class=\"package-item package-item--non-refundable\">\n <div class=\"package-item__header\">\n <div class=\"package-item__content\">\n <div class=\"package-item__info\">\n <h4 class=\"package-item__name\">{{ package().packageName }}</h4>\n @if (package().boardBasis) {\n <span class=\"package-item__board-basis\">{{\n package().boardBasis\n }}</span>\n }\n </div>\n\n <span\n class=\"package-item__refund-badge package-item__refund-badge--non-refundable\"\n >\n @if (\n allPackagesNonRefundable() ||\n (!package()?.isRefundable && !package()?.isCancelled)\n ) {\n NON-REFUNDABLE\n }\n @if (package()?.isCancelled) {\n PREVIOUS CANCELLATION\n }\n </span>\n </div>\n </div>\n\n @if (groupedRooms().length) {\n <div class=\"package-item__rooms\">\n @for (group of groupedRooms(); track i; let i = $index) {\n <div class=\"package-item__room\">\n <h5 class=\"package-item__room-name\">\n @if (group.count > 1) {\n {{ group.count }}x\n @if (group.bedTypeOrRoomType) {\n {{ group.bedTypeOrRoomType }}\n }\n } @else {\n Room\n {{ i + 1 }}\n @if (group.bedTypeOrRoomType) {\n <span class=\"package-item__separator\">\u2022</span>\n {{ group.bedTypeOrRoomType }}\n }\n }\n </h5>\n @if (group.roomBasis) {\n <span class=\"package-item__room-basis\">{{\n group.roomBasis\n }}</span>\n }\n </div>\n }\n </div>\n }\n\n @if (!package()?.isCancelled && !allPackagesNonRefundable()) {\n <div class=\"package-item__non-refundable-content\">\n <div class=\"info-message\">\n <almatar-icon [name]=\"'exclamation-circle'\"> </almatar-icon>\n <p\n class=\"info-message__text\"\n (click)=\"$event.preventDefault(); onOpenCancellationPolicy()\"\n [innerHTML]=\"\n 'We can\\'t process automatic cancellation with this room. Check the <a class=&quot;info-message__link&quot;>cancellation policy</a> for details'\n \"\n ></p>\n </div>\n\n @if (uploadSuccess()) {\n <div class=\"upload-success\">\n <span class=\"upload-success__icon\">\n <svg\n width=\"24\"\n height=\"24\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n d=\"M13.4697 8.20112C13.7626 7.90822 14.2373 7.90822 14.5302 8.20112C14.8231 8.49401 14.8231 8.96877 14.5302 9.26166L7.53022 16.2617C7.23732 16.5546 6.76256 16.5546 6.46967 16.2617L3.46967 13.2617C3.17678 12.9688 3.17678 12.494 3.46967 12.2011C3.74427 11.9265 4.17899 11.909 4.47358 12.1494L4.53022 12.2011L6.99994 14.6708L13.4697 8.20112Z\"\n fill=\"#1B1A1F\"\n />\n <path\n d=\"M19.4697 8.20112C19.7626 7.90822 20.2373 7.90822 20.5302 8.20112C20.8231 8.49401 20.8231 8.96877 20.5302 9.26166L13.5302 16.2617C13.2639 16.5279 12.8415 16.5556 12.5429 16.3261L11.5429 15.5576L11.4843 15.5078C11.2079 15.2468 11.1686 14.8137 11.4052 14.5058C11.6418 14.198 12.0703 14.1245 12.3935 14.3242L12.457 14.3681L12.9345 14.7353L19.4697 8.20112Z\"\n fill=\"#1B1A1F\"\n />\n </svg>\n </span>\n <div class=\"upload-success__info\">\n <p class=\"upload-success__filename\">{{ filePicked()?.name }}</p>\n <p class=\"upload-success__meta\">\n {{ formatFileSize(filePicked()?.size) }} \u2022\n Uploaded\n </p>\n </div>\n <input\n type=\"file\"\n #fileInput\n (change)=\"onFileSelected($event)\"\n style=\"display: none\"\n accept=\".pdf,.jpg,.jpeg,.png,.doc,.docx\"\n />\n <button\n type=\"button\"\n class=\"upload-success__change-btn\"\n (click)=\"fileInput.click()\"\n >\n Change\n </button>\n </div>\n } @else {\n <div class=\"upload-section\">\n <almatar-icon [name]=\"'arrow-up-on-square'\"></almatar-icon>\n <div style=\"flex: 1\">\n <h5 class=\"upload-section__title\">\n Upload a document to support your request\n </h5>\n <p class=\"upload-section__subtitle\">\n Required to submit and track your request\n </p>\n @if (filePicked() && !uploadSuccess()) {\n <p class=\"upload-section__filename\">\n {{ filePicked()?.name }}\n </p>\n }\n @if (isUploading()) {\n <div class=\"upload-progress\">\n <div class=\"upload-progress__bar\">\n <div\n class=\"upload-progress__fill\"\n [style.width.%]=\"uploadProgress()\"\n ></div>\n </div>\n <span class=\"upload-progress__text\"\n >{{ uploadProgress() }}%</span\n >\n </div>\n }\n </div>\n <input\n type=\"file\"\n #fileInput\n (change)=\"onFileSelected($event)\"\n style=\"display: none\"\n accept=\".pdf,.jpg,.jpeg,.png,.doc,.docx\"\n />\n <button\n type=\"button\"\n class=\"upload-section__button\"\n [disabled]=\"isUploading()\"\n (click)=\"fileInput.click()\"\n >\n Upload file\n </button>\n </div>\n }\n\n @if (submitError()) {\n <div class=\"submit-result submit-result--error\">\n <almatar-icon [name]=\"'exclamation-circle'\"></almatar-icon>\n <p class=\"submit-result__text\">{{ submitError() }}</p>\n <button\n type=\"button\"\n class=\"submit-result__retry-btn\"\n (click)=\"onRetry()\"\n >\n Try Again\n </button>\n </div>\n } @else if (!submitSuccess()) {\n <button\n type=\"button\"\n class=\"submit-request-btn\"\n [disabled]=\"!uploadSuccess() || isSubmitting()\"\n (click)=\"onSubmitRequest()\"\n >\n @if (isSubmitting()) {\n Submitting...\n } @else {\n Submit my request\n }\n </button>\n }\n </div>\n }\n </div>\n}\n", styles: [".package-item{display:flex;flex-direction:column;gap:12px;padding:12px;background:#fff;border:1px solid rgb(217,217,222);border-radius:16px;transition:border-color .2s ease,background-color .2s ease}.package-item--non-refundable{cursor:default}.package-item__header{display:flex;align-items:flex-start;gap:8px;width:100%}.package-item__content{flex:1;display:flex;justify-content:space-between;align-items:flex-start;gap:12px}.package-item__info{display:flex;flex-direction:column;gap:4px}.package-item__name{font-size:calc(14 * var(--almatar-font-size-ratio, 1) * 1px);font-weight:var(--almatar-font-weight-medium);color:#1b1a1f;margin:0}.package-item__board-basis{font-size:calc(12 * var(--almatar-font-size-ratio, 1) * 1px);color:#747583}.package-item__refund-badge{font-size:calc(10 * var(--almatar-font-size-ratio, 1) * 1px);font-weight:var(--almatar-font-weight-medium);text-transform:uppercase;padding:6px 8px;flex-shrink:0;border-radius:999px}.package-item__refund-badge--refundable{color:#15803c;background:#f0fdf5}.package-item__refund-badge--non-refundable{color:#6b7280;background:#f3f4f6}.package-item__rooms{display:flex;flex-direction:column;gap:8px}.package-item__room{display:flex;flex-direction:column;gap:4px;padding:12px;border-radius:16px;border:1px solid rgb(217,217,222)}.package-item__room-name{font-size:calc(14 * var(--almatar-font-size-ratio, 1) * 1px);font-weight:var(--almatar-font-weight-medium);color:#1b1a1f;display:flex;align-items:center;gap:0;margin:0}.package-item__separator{margin:0 4px;color:#1f2937;font-weight:var(--almatar-font-weight-regular)}.package-item__room-basis{font-size:calc(12 * var(--almatar-font-size-ratio, 1) * 1px);color:#747583}.package-item__non-refundable-content{display:flex;flex-direction:column;gap:8px;width:100%}.info-message{display:flex;gap:8px;padding:12px;background:#f7f7f8;border:1px solid rgb(217,217,222);border-radius:12px;align-items:center}.info-message__icon{flex-shrink:0;width:24px;height:24px;color:#1b1a1f}.info-message__text{font-size:calc(12 * var(--almatar-font-size-ratio, 1) * 1px);color:#1b1a1f;line-height:15.6px;margin:0;cursor:pointer}.info-message__text ::ng-deep a{font-size:calc(12 * var(--almatar-font-size-ratio, 1) * 1px);color:#1b1a1f;text-decoration:underline;cursor:pointer}.info-message__text ::ng-deep a:focus,.info-message__text ::ng-deep a:hover{font-size:calc(12 * var(--almatar-font-size-ratio, 1) * 1px);color:#1b1a1f;text-decoration:underline!important;cursor:pointer}.info-message__link{font-size:calc(12 * var(--almatar-font-size-ratio, 1) * 1px);color:#1b1a1f;text-decoration:underline;cursor:pointer}.info-message__link:focus,.info-message__link:hover{font-size:calc(12 * var(--almatar-font-size-ratio, 1) * 1px);color:#1b1a1f;text-decoration:underline;cursor:pointer}.upload-success{display:flex;align-items:center;gap:12px;padding:12px;border:1px dashed rgb(217,217,222);border-radius:12px;background:#fff}.upload-success__icon{flex-shrink:0;display:flex;align-items:center;justify-content:center}.upload-success__info{flex:1;min-width:0}.upload-success__filename{font-size:calc(14 * var(--almatar-font-size-ratio, 1) * 1px);font-weight:var(--almatar-font-weight-regular);color:#1b1a1f;margin:0 0 2px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.upload-success__meta{font-size:calc(12 * var(--almatar-font-size-ratio, 1) * 1px);color:#747583;margin:0}.upload-success__change-btn{flex-shrink:0;padding:8px 14px;background:#fff;border:1.5px solid rgb(217,217,222);border-radius:8px;color:#7c3aed;font-size:calc(12 * var(--almatar-font-size-ratio, 1) * 1px);font-weight:var(--almatar-font-weight-medium);cursor:pointer;transition:all .2s ease;white-space:nowrap}.upload-success__change-btn:hover:not(:disabled){background:#7c3aed;color:#fff}.upload-success__change-btn:disabled{opacity:.5;cursor:not-allowed}.upload-section{display:flex;align-items:center;gap:12px;padding:12px;border:1px dashed rgb(217,217,222);border-radius:12px;background:#fff}.upload-section__icon{flex-shrink:0;width:24px;height:24px;color:#1b1a1f}.upload-section__title{font-size:calc(14 * var(--almatar-font-size-ratio, 1) * 1px);font-weight:var(--almatar-font-weight-regular);color:#1b1a1f;margin:0 0 2px}.upload-section__subtitle{font-size:calc(12 * var(--almatar-font-size-ratio, 1) * 1px);color:#747583;margin:0;line-height:1.4}.upload-section__button{flex-shrink:0;padding:8px 14px;background:#fff;border:1.5px solid rgb(217,217,222);border-radius:8px;color:#7c3aed;font-size:calc(12 * var(--almatar-font-size-ratio, 1) * 1px);font-weight:var(--almatar-font-weight-medium);cursor:pointer;transition:all .2s ease;white-space:nowrap}.upload-section__button:hover:not(:disabled){background:#7c3aed;color:#fff}.upload-section__button:disabled{opacity:.5;cursor:not-allowed}.upload-section__filename{font-size:calc(12 * var(--almatar-font-size-ratio, 1) * 1px);color:#747583;margin:8px 0 0;font-weight:var(--almatar-font-weight-medium)}.upload-progress{display:flex;align-items:center;gap:8px;margin-top:8px}.upload-progress__bar{flex:1;height:6px;background:#e5e7eb;border-radius:3px;overflow:hidden}.upload-progress__fill{height:100%;background:#7c3aed;border-radius:3px;transition:width .2s ease}.upload-progress__text{font-size:calc(11 * var(--almatar-font-size-ratio, 1) * 1px);font-weight:var(--almatar-font-weight-medium);color:#7c3aed;min-width:36px;text-align:right}.submit-request-btn{width:100%;padding:8px 0;background:#f7f7f8;border:none;border-radius:12px;color:#7c3aed;cursor:pointer;font-size:calc(12 * var(--almatar-font-size-ratio, 1) * 1px);font-weight:var(--almatar-font-weight-semibold);transition:all .2s ease;letter-spacing:.2px}.submit-request-btn:disabled{background:#f7f7f8;color:#b8b9c1;cursor:not-allowed}.submit-request-btn:disabled:hover{background:#f7f7f8;color:#b8b9c1}.submit-request-btn:hover{background:#f7f7f8;color:#7c3aed}.submit-result{display:flex;align-items:center;gap:8px;padding:12px;border-radius:12px}.submit-result--error{background:#fef2f2;border:1px solid rgba(220,38,38,.2);flex-wrap:wrap}.submit-result--error almatar-icon{color:#dc2626}.submit-result__text{flex:1;font-size:calc(12 * var(--almatar-font-size-ratio, 1) * 1px);margin:0;line-height:1.4;color:#dc2626}.submit-result__retry-btn{width:100%;margin-top:8px;padding:8px 16px;background:#dc2626;border:none;border-radius:8px;color:#fff;font-size:calc(12 * var(--almatar-font-size-ratio, 1) * 1px);font-weight:var(--almatar-font-weight-medium);cursor:pointer;transition:all .2s ease}.submit-result__retry-btn:hover{background:#b91c1c}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: AlmatarIconModule }, { kind: "component", type: i1.AlmatarIconComponent, selector: "almatar-icon", inputs: ["name", "size"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
237
+ }
238
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: AlmatarHotelAutoCancellationNonRefundableRoomComponent, decorators: [{
239
+ type: Component,
240
+ args: [{ selector: 'almatar-hotel-auto-cancellation-non-refundable-room', standalone: true, imports: [CommonModule, AlmatarIconModule], providers: [DialogService], changeDetection: ChangeDetectionStrategy.OnPush, template: "@if (!package().isCancelled) {\n <div class=\"package-item package-item--non-refundable\">\n <div class=\"package-item__header\">\n <div class=\"package-item__content\">\n <div class=\"package-item__info\">\n <h4 class=\"package-item__name\">{{ package().packageName }}</h4>\n @if (package().boardBasis) {\n <span class=\"package-item__board-basis\">{{\n package().boardBasis\n }}</span>\n }\n </div>\n\n <span\n class=\"package-item__refund-badge package-item__refund-badge--non-refundable\"\n >\n @if (\n allPackagesNonRefundable() ||\n (!package()?.isRefundable && !package()?.isCancelled)\n ) {\n NON-REFUNDABLE\n }\n @if (package()?.isCancelled) {\n PREVIOUS CANCELLATION\n }\n </span>\n </div>\n </div>\n\n @if (groupedRooms().length) {\n <div class=\"package-item__rooms\">\n @for (group of groupedRooms(); track i; let i = $index) {\n <div class=\"package-item__room\">\n <h5 class=\"package-item__room-name\">\n @if (group.count > 1) {\n {{ group.count }}x\n @if (group.bedTypeOrRoomType) {\n {{ group.bedTypeOrRoomType }}\n }\n } @else {\n Room\n {{ i + 1 }}\n @if (group.bedTypeOrRoomType) {\n <span class=\"package-item__separator\">\u2022</span>\n {{ group.bedTypeOrRoomType }}\n }\n }\n </h5>\n @if (group.roomBasis) {\n <span class=\"package-item__room-basis\">{{\n group.roomBasis\n }}</span>\n }\n </div>\n }\n </div>\n }\n\n @if (!package()?.isCancelled && !allPackagesNonRefundable()) {\n <div class=\"package-item__non-refundable-content\">\n <div class=\"info-message\">\n <almatar-icon [name]=\"'exclamation-circle'\"> </almatar-icon>\n <p\n class=\"info-message__text\"\n (click)=\"$event.preventDefault(); onOpenCancellationPolicy()\"\n [innerHTML]=\"\n 'We can\\'t process automatic cancellation with this room. Check the <a class=&quot;info-message__link&quot;>cancellation policy</a> for details'\n \"\n ></p>\n </div>\n\n @if (uploadSuccess()) {\n <div class=\"upload-success\">\n <span class=\"upload-success__icon\">\n <svg\n width=\"24\"\n height=\"24\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n d=\"M13.4697 8.20112C13.7626 7.90822 14.2373 7.90822 14.5302 8.20112C14.8231 8.49401 14.8231 8.96877 14.5302 9.26166L7.53022 16.2617C7.23732 16.5546 6.76256 16.5546 6.46967 16.2617L3.46967 13.2617C3.17678 12.9688 3.17678 12.494 3.46967 12.2011C3.74427 11.9265 4.17899 11.909 4.47358 12.1494L4.53022 12.2011L6.99994 14.6708L13.4697 8.20112Z\"\n fill=\"#1B1A1F\"\n />\n <path\n d=\"M19.4697 8.20112C19.7626 7.90822 20.2373 7.90822 20.5302 8.20112C20.8231 8.49401 20.8231 8.96877 20.5302 9.26166L13.5302 16.2617C13.2639 16.5279 12.8415 16.5556 12.5429 16.3261L11.5429 15.5576L11.4843 15.5078C11.2079 15.2468 11.1686 14.8137 11.4052 14.5058C11.6418 14.198 12.0703 14.1245 12.3935 14.3242L12.457 14.3681L12.9345 14.7353L19.4697 8.20112Z\"\n fill=\"#1B1A1F\"\n />\n </svg>\n </span>\n <div class=\"upload-success__info\">\n <p class=\"upload-success__filename\">{{ filePicked()?.name }}</p>\n <p class=\"upload-success__meta\">\n {{ formatFileSize(filePicked()?.size) }} \u2022\n Uploaded\n </p>\n </div>\n <input\n type=\"file\"\n #fileInput\n (change)=\"onFileSelected($event)\"\n style=\"display: none\"\n accept=\".pdf,.jpg,.jpeg,.png,.doc,.docx\"\n />\n <button\n type=\"button\"\n class=\"upload-success__change-btn\"\n (click)=\"fileInput.click()\"\n >\n Change\n </button>\n </div>\n } @else {\n <div class=\"upload-section\">\n <almatar-icon [name]=\"'arrow-up-on-square'\"></almatar-icon>\n <div style=\"flex: 1\">\n <h5 class=\"upload-section__title\">\n Upload a document to support your request\n </h5>\n <p class=\"upload-section__subtitle\">\n Required to submit and track your request\n </p>\n @if (filePicked() && !uploadSuccess()) {\n <p class=\"upload-section__filename\">\n {{ filePicked()?.name }}\n </p>\n }\n @if (isUploading()) {\n <div class=\"upload-progress\">\n <div class=\"upload-progress__bar\">\n <div\n class=\"upload-progress__fill\"\n [style.width.%]=\"uploadProgress()\"\n ></div>\n </div>\n <span class=\"upload-progress__text\"\n >{{ uploadProgress() }}%</span\n >\n </div>\n }\n </div>\n <input\n type=\"file\"\n #fileInput\n (change)=\"onFileSelected($event)\"\n style=\"display: none\"\n accept=\".pdf,.jpg,.jpeg,.png,.doc,.docx\"\n />\n <button\n type=\"button\"\n class=\"upload-section__button\"\n [disabled]=\"isUploading()\"\n (click)=\"fileInput.click()\"\n >\n Upload file\n </button>\n </div>\n }\n\n @if (submitError()) {\n <div class=\"submit-result submit-result--error\">\n <almatar-icon [name]=\"'exclamation-circle'\"></almatar-icon>\n <p class=\"submit-result__text\">{{ submitError() }}</p>\n <button\n type=\"button\"\n class=\"submit-result__retry-btn\"\n (click)=\"onRetry()\"\n >\n Try Again\n </button>\n </div>\n } @else if (!submitSuccess()) {\n <button\n type=\"button\"\n class=\"submit-request-btn\"\n [disabled]=\"!uploadSuccess() || isSubmitting()\"\n (click)=\"onSubmitRequest()\"\n >\n @if (isSubmitting()) {\n Submitting...\n } @else {\n Submit my request\n }\n </button>\n }\n </div>\n }\n </div>\n}\n", styles: [".package-item{display:flex;flex-direction:column;gap:12px;padding:12px;background:#fff;border:1px solid rgb(217,217,222);border-radius:16px;transition:border-color .2s ease,background-color .2s ease}.package-item--non-refundable{cursor:default}.package-item__header{display:flex;align-items:flex-start;gap:8px;width:100%}.package-item__content{flex:1;display:flex;justify-content:space-between;align-items:flex-start;gap:12px}.package-item__info{display:flex;flex-direction:column;gap:4px}.package-item__name{font-size:calc(14 * var(--almatar-font-size-ratio, 1) * 1px);font-weight:var(--almatar-font-weight-medium);color:#1b1a1f;margin:0}.package-item__board-basis{font-size:calc(12 * var(--almatar-font-size-ratio, 1) * 1px);color:#747583}.package-item__refund-badge{font-size:calc(10 * var(--almatar-font-size-ratio, 1) * 1px);font-weight:var(--almatar-font-weight-medium);text-transform:uppercase;padding:6px 8px;flex-shrink:0;border-radius:999px}.package-item__refund-badge--refundable{color:#15803c;background:#f0fdf5}.package-item__refund-badge--non-refundable{color:#6b7280;background:#f3f4f6}.package-item__rooms{display:flex;flex-direction:column;gap:8px}.package-item__room{display:flex;flex-direction:column;gap:4px;padding:12px;border-radius:16px;border:1px solid rgb(217,217,222)}.package-item__room-name{font-size:calc(14 * var(--almatar-font-size-ratio, 1) * 1px);font-weight:var(--almatar-font-weight-medium);color:#1b1a1f;display:flex;align-items:center;gap:0;margin:0}.package-item__separator{margin:0 4px;color:#1f2937;font-weight:var(--almatar-font-weight-regular)}.package-item__room-basis{font-size:calc(12 * var(--almatar-font-size-ratio, 1) * 1px);color:#747583}.package-item__non-refundable-content{display:flex;flex-direction:column;gap:8px;width:100%}.info-message{display:flex;gap:8px;padding:12px;background:#f7f7f8;border:1px solid rgb(217,217,222);border-radius:12px;align-items:center}.info-message__icon{flex-shrink:0;width:24px;height:24px;color:#1b1a1f}.info-message__text{font-size:calc(12 * var(--almatar-font-size-ratio, 1) * 1px);color:#1b1a1f;line-height:15.6px;margin:0;cursor:pointer}.info-message__text ::ng-deep a{font-size:calc(12 * var(--almatar-font-size-ratio, 1) * 1px);color:#1b1a1f;text-decoration:underline;cursor:pointer}.info-message__text ::ng-deep a:focus,.info-message__text ::ng-deep a:hover{font-size:calc(12 * var(--almatar-font-size-ratio, 1) * 1px);color:#1b1a1f;text-decoration:underline!important;cursor:pointer}.info-message__link{font-size:calc(12 * var(--almatar-font-size-ratio, 1) * 1px);color:#1b1a1f;text-decoration:underline;cursor:pointer}.info-message__link:focus,.info-message__link:hover{font-size:calc(12 * var(--almatar-font-size-ratio, 1) * 1px);color:#1b1a1f;text-decoration:underline;cursor:pointer}.upload-success{display:flex;align-items:center;gap:12px;padding:12px;border:1px dashed rgb(217,217,222);border-radius:12px;background:#fff}.upload-success__icon{flex-shrink:0;display:flex;align-items:center;justify-content:center}.upload-success__info{flex:1;min-width:0}.upload-success__filename{font-size:calc(14 * var(--almatar-font-size-ratio, 1) * 1px);font-weight:var(--almatar-font-weight-regular);color:#1b1a1f;margin:0 0 2px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.upload-success__meta{font-size:calc(12 * var(--almatar-font-size-ratio, 1) * 1px);color:#747583;margin:0}.upload-success__change-btn{flex-shrink:0;padding:8px 14px;background:#fff;border:1.5px solid rgb(217,217,222);border-radius:8px;color:#7c3aed;font-size:calc(12 * var(--almatar-font-size-ratio, 1) * 1px);font-weight:var(--almatar-font-weight-medium);cursor:pointer;transition:all .2s ease;white-space:nowrap}.upload-success__change-btn:hover:not(:disabled){background:#7c3aed;color:#fff}.upload-success__change-btn:disabled{opacity:.5;cursor:not-allowed}.upload-section{display:flex;align-items:center;gap:12px;padding:12px;border:1px dashed rgb(217,217,222);border-radius:12px;background:#fff}.upload-section__icon{flex-shrink:0;width:24px;height:24px;color:#1b1a1f}.upload-section__title{font-size:calc(14 * var(--almatar-font-size-ratio, 1) * 1px);font-weight:var(--almatar-font-weight-regular);color:#1b1a1f;margin:0 0 2px}.upload-section__subtitle{font-size:calc(12 * var(--almatar-font-size-ratio, 1) * 1px);color:#747583;margin:0;line-height:1.4}.upload-section__button{flex-shrink:0;padding:8px 14px;background:#fff;border:1.5px solid rgb(217,217,222);border-radius:8px;color:#7c3aed;font-size:calc(12 * var(--almatar-font-size-ratio, 1) * 1px);font-weight:var(--almatar-font-weight-medium);cursor:pointer;transition:all .2s ease;white-space:nowrap}.upload-section__button:hover:not(:disabled){background:#7c3aed;color:#fff}.upload-section__button:disabled{opacity:.5;cursor:not-allowed}.upload-section__filename{font-size:calc(12 * var(--almatar-font-size-ratio, 1) * 1px);color:#747583;margin:8px 0 0;font-weight:var(--almatar-font-weight-medium)}.upload-progress{display:flex;align-items:center;gap:8px;margin-top:8px}.upload-progress__bar{flex:1;height:6px;background:#e5e7eb;border-radius:3px;overflow:hidden}.upload-progress__fill{height:100%;background:#7c3aed;border-radius:3px;transition:width .2s ease}.upload-progress__text{font-size:calc(11 * var(--almatar-font-size-ratio, 1) * 1px);font-weight:var(--almatar-font-weight-medium);color:#7c3aed;min-width:36px;text-align:right}.submit-request-btn{width:100%;padding:8px 0;background:#f7f7f8;border:none;border-radius:12px;color:#7c3aed;cursor:pointer;font-size:calc(12 * var(--almatar-font-size-ratio, 1) * 1px);font-weight:var(--almatar-font-weight-semibold);transition:all .2s ease;letter-spacing:.2px}.submit-request-btn:disabled{background:#f7f7f8;color:#b8b9c1;cursor:not-allowed}.submit-request-btn:disabled:hover{background:#f7f7f8;color:#b8b9c1}.submit-request-btn:hover{background:#f7f7f8;color:#7c3aed}.submit-result{display:flex;align-items:center;gap:8px;padding:12px;border-radius:12px}.submit-result--error{background:#fef2f2;border:1px solid rgba(220,38,38,.2);flex-wrap:wrap}.submit-result--error almatar-icon{color:#dc2626}.submit-result__text{flex:1;font-size:calc(12 * var(--almatar-font-size-ratio, 1) * 1px);margin:0;line-height:1.4;color:#dc2626}.submit-result__retry-btn{width:100%;margin-top:8px;padding:8px 16px;background:#dc2626;border:none;border-radius:8px;color:#fff;font-size:calc(12 * var(--almatar-font-size-ratio, 1) * 1px);font-weight:var(--almatar-font-weight-medium);cursor:pointer;transition:all .2s ease}.submit-result__retry-btn:hover{background:#b91c1c}\n"] }]
241
+ }] });
242
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWxtYXRhci1ob3RlbC1hdXRvLWNhbmNlbGxhdGlvbi1ub24tcmVmdW5kYWJsZS1yb29tLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3NtYXJ0LWJvb2tpbmctZGFzaGJvYXJkL3NyYy9saWIvY29tcG9uZW50cy9ob3RlbC1jYW5jZWwvY29tcG9uZW50cy9hbG1hdGFyLWhvdGVsLWF1dG8tY2FuY2VsbGF0aW9uLXNlbGVjdC1yb29tcy9jb21wb25lbnRzL2FsbWF0YXItaG90ZWwtYXV0by1jYW5jZWxsYXRpb24tbm9uLXJlZnVuZGFibGUtcm9vbS9hbG1hdGFyLWhvdGVsLWF1dG8tY2FuY2VsbGF0aW9uLW5vbi1yZWZ1bmRhYmxlLXJvb20uY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvc21hcnQtYm9va2luZy1kYXNoYm9hcmQvc3JjL2xpYi9jb21wb25lbnRzL2hvdGVsLWNhbmNlbC9jb21wb25lbnRzL2FsbWF0YXItaG90ZWwtYXV0by1jYW5jZWxsYXRpb24tc2VsZWN0LXJvb21zL2NvbXBvbmVudHMvYWxtYXRhci1ob3RlbC1hdXRvLWNhbmNlbGxhdGlvbi1ub24tcmVmdW5kYWJsZS1yb29tL2FsbWF0YXItaG90ZWwtYXV0by1jYW5jZWxsYXRpb24tbm9uLXJlZnVuZGFibGUtcm9vbS5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0wsU0FBUyxFQUNULHVCQUF1QixFQUN2QixLQUFLLEVBQ0wsTUFBTSxFQUNOLE1BQU0sRUFDTixNQUFNLEVBQ04sVUFBVSxFQUVWLFFBQVEsR0FDVCxNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDL0MsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sdURBQXVELENBQUM7QUFDM0YsT0FBTyxFQUFFLFVBQVUsRUFBRSxhQUFhLEVBQUUsV0FBVyxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDOUUsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFNaEUsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sbUVBQW1FLENBQUM7QUFDdEcsT0FBTyxFQUFFLHlDQUF5QyxFQUFFLE1BQU0sa0VBQWtFLENBQUM7QUFDN0gsT0FBTyxFQUFFLDRDQUE0QyxFQUFFLE1BQU0sd0VBQXdFLENBQUM7QUFDdEksT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLHVCQUF1QixDQUFDOzs7QUFzQnRELE1BQU0sT0FBTyxzREFBc0Q7SUFabkU7UUFhbUIsU0FBSSxHQUFHLE1BQU0sQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUMxQixlQUFVLEdBQUcsTUFBTSxDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBQ2hDLHFCQUFnQixHQUFHLE1BQU0sQ0FDeEMsNENBQTRDLENBQzdDLENBQUM7UUFFZSxxQkFBZ0IsR0FBRyxNQUFNLENBQUMsa0JBQWtCLENBQUMsQ0FBQztRQUM5QyxrQkFBYSxHQUFHLE1BQU0sQ0FBQyxhQUFhLENBQUMsQ0FBQztRQUU5QyxZQUFPLEdBQUcsS0FBSyxDQUFDLFFBQVEsRUFBd0MsQ0FBQztRQUNqRSxnQkFBVyxHQUFHLEtBQUssQ0FBeUMsRUFBRSxDQUFDLENBQUM7UUFDaEUsY0FBUyxHQUFHLEtBQUssQ0FDeEIsSUFBSSxDQUNMLENBQUM7UUFFRiwrQkFBK0I7UUFDL0IsZ0NBQWdDO1FBQ2hDLE1BQU07UUFFRyxZQUFPLEdBQUcsS0FBSyxDQUFrQixFQUFFLENBQUMsQ0FBQztRQUNyQyxpQkFBWSxHQUFHLEtBQUssQ0FBUyxLQUFLLENBQUMsQ0FBQztRQUNwQyw2QkFBd0IsR0FBRyxLQUFLLENBQVUsS0FBSyxDQUFDLENBQUM7UUFFekMsaUNBQTRCLEdBQUcsSUFBSSxDQUFDO1FBRTVDLGVBQVUsR0FBRyxNQUFNLEVBQVEsQ0FBQztRQUM1QiwrQkFBMEIsR0FBRyxNQUFNLEVBQVUsQ0FBQztRQUU5QyxpQkFBWSxHQUFHLE1BQU0sQ0FBYyxJQUFJLENBQUMsQ0FBQztRQUN6QyxvQkFBZSxHQUFHLE1BQU0sQ0FBZ0IsSUFBSSxDQUFDLENBQUM7UUFDOUMsZUFBVSxHQUFHLE1BQU0sQ0FBYyxJQUFJLENBQUMsQ0FBQztRQUN2QyxrQkFBYSxHQUFHLE1BQU0sQ0FBVSxLQUFLLENBQUMsQ0FBQztRQUN2QyxtQkFBYyxHQUFHLE1BQU0sQ0FBUyxDQUFDLENBQUMsQ0FBQztRQUNuQyxnQkFBVyxHQUFHLE1BQU0sQ0FBVSxLQUFLLENBQUMsQ0FBQztRQUNyQyxpQkFBWSxHQUFHLE1BQU0sQ0FBVSxLQUFLLENBQUMsQ0FBQztRQUN0QyxrQkFBYSxHQUFHLE1BQU0sQ0FBVSxLQUFLLENBQUMsQ0FBQztRQUN2QyxnQkFBVyxHQUFHLE1BQU0sQ0FBZ0IsSUFBSSxDQUFDLENBQUM7UUFFMUMsaUJBQVksR0FBRyxRQUFRLENBQXdCLEdBQUcsRUFBRTtZQUMzRCxNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsT0FBTyxFQUFFLEVBQUUsS0FBSyxJQUFJLEVBQUUsQ0FBQztZQUMxQyxNQUFNLFFBQVEsR0FBRyxJQUFJLEdBQUcsRUFBK0IsQ0FBQztZQUV4RCxLQUFLLE1BQU0sSUFBSSxJQUFJLEtBQUssRUFBRSxDQUFDO2dCQUN6QixpRUFBaUU7Z0JBQ2pFLE1BQU0saUJBQWlCLEdBQUcsSUFBSSxFQUFFLFFBQVEsQ0FBQztnQkFDekMsTUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLFNBQVMsSUFBSSxFQUFFLENBQUM7Z0JBQ3ZDLE1BQU0sR0FBRyxHQUFHLEdBQUcsaUJBQWlCLE1BQU0sU0FBUyxFQUFFLENBQUM7Z0JBRWxELElBQUksUUFBUSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDO29CQUN0QixNQUFNLEtBQUssR0FBRyxRQUFRLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBRSxDQUFDO29CQUNqQyxLQUFLLENBQUMsS0FBSyxFQUFFLENBQUM7b0JBQ2QsS0FBSyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7Z0JBQ3pCLENBQUM7cUJBQU0sQ0FBQztvQkFDTixRQUFRLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRTt3QkFDaEIsR0FBRzt3QkFDSCxpQkFBaUI7d0JBQ2pCLFNBQVM7d0JBQ1QsS0FBSyxFQUFFLENBQUM7d0JBQ1IsS0FBSyxFQUFFLENBQUMsSUFBSSxDQUFDO3FCQUNkLENBQUMsQ0FBQztnQkFDTCxDQUFDO1lBQ0gsQ0FBQztZQUVELE9BQU8sS0FBSyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQztRQUN2QyxDQUFDLENBQUMsQ0FBQztLQXlNSjtJQXZNQyxjQUFjLENBQUMsS0FBWTtRQUN6QixNQUFNLEtBQUssR0FBRyxLQUFLLENBQUMsTUFBMEIsQ0FBQztRQUMvQyxJQUFJLEtBQUssQ0FBQyxLQUFLLElBQUksS0FBSyxDQUFDLEtBQUssQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUM7WUFDMUMsTUFBTSxJQUFJLEdBQUcsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUM1QixJQUFJLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUMxQixJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ3hCLENBQUM7SUFDSCxDQUFDO0lBRU8sVUFBVSxDQUFDLElBQVU7UUFDM0IsSUFBSSxDQUFDLFdBQVcsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDM0IsSUFBSSxDQUFDLGNBQWMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDM0IsSUFBSSxDQUFDLGFBQWEsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDOUIsSUFBSSxDQUFDLGVBQWUsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUM7UUFFL0IsTUFBTSxRQUFRLEdBQUcsSUFBSSxRQUFRLEVBQUUsQ0FBQztRQUNoQyxRQUFRLENBQUMsTUFBTSxDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsQ0FBQztRQUU5QixNQUFNLEdBQUcsR0FBRyxJQUFJLFdBQVcsQ0FDekIsTUFBTSxFQUNOLHlDQUF5QyxDQUFDLGdCQUFnQixFQUMxRCxRQUFRLEVBQ1I7WUFDRSxjQUFjLEVBQUUsSUFBSTtZQUNwQixZQUFZLEVBQUUsTUFBTTtTQUNyQixDQUNGLENBQUM7UUFFRixJQUFJLENBQUMsSUFBSTthQUNOLE9BQU8sQ0FBNEIsR0FBRyxDQUFDO2FBQ3ZDLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUM7YUFDekMsU0FBUyxDQUFDO1lBQ1QsSUFBSSxFQUFFLENBQUMsS0FBSyxFQUFFLEVBQUU7Z0JBQ2QsSUFBSSxLQUFLLENBQUMsSUFBSSxLQUFLLGFBQWEsQ0FBQyxjQUFjLElBQUksS0FBSyxDQUFDLEtBQUssRUFBRSxDQUFDO29CQUMvRCxNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsR0FBRyxHQUFHLEtBQUssQ0FBQyxNQUFNLENBQUMsR0FBRyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUM7b0JBQ2hFLElBQUksQ0FBQyxjQUFjLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxDQUFDO2dCQUNwQyxDQUFDO3FCQUFNLElBQUksS0FBSyxDQUFDLElBQUksS0FBSyxhQUFhLENBQUMsUUFBUSxFQUFFLENBQUM7b0JBQ2pELElBQUksQ0FBQyxjQUFjLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO29CQUM3QixJQUFJLENBQUMsV0FBVyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQztvQkFDNUIsSUFBSSxDQUFDLGFBQWEsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUM7b0JBQzdCLElBQUksQ0FBQyxZQUFZLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDO29CQUM1QixJQUFJLENBQUMsZUFBZSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsSUFBSSxFQUFFLElBQUksRUFBRSxHQUFHLElBQUksSUFBSSxDQUFDLENBQUM7Z0JBQzFELENBQUM7WUFDSCxDQUFDO1lBQ0QsS0FBSyxFQUFFLEdBQUcsRUFBRTtnQkFDVixJQUFJLENBQUMsV0FBVyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQztnQkFDNUIsSUFBSSxDQUFDLGNBQWMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBQzNCLElBQUksQ0FBQyxhQUFhLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDO2dCQUM5QixJQUFJLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQztnQkFDMUIsSUFBSSxDQUFDLGVBQWUsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDakMsQ0FBQztTQUNGLENBQUMsQ0FBQztJQUNQLENBQUM7SUFFRCxlQUFlO1FBQ2IsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDO1FBQ25DLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQztZQUNULE9BQU87UUFDVCxDQUFDO1FBRUQsSUFBSSxDQUFDLFlBQVksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDNUIsSUFBSSxDQUFDLFdBQVcsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDM0IsSUFBSSxDQUFDLGFBQWEsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUM7UUFFOUIsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDO1FBRXRCLElBQUksQ0FBQyxnQkFBZ0I7YUFDbEIsZ0NBQWdDLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDLFNBQVMsRUFBRSxHQUFHLEVBQUUsUUFBUSxDQUFDO2FBQ3pFLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUM7YUFDekMsU0FBUyxDQUFDO1lBQ1QsSUFBSSxFQUFFLEdBQUcsRUFBRTtnQkFDVCxJQUFJLENBQUMsWUFBWSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQztnQkFDN0IsSUFBSSxDQUFDLGFBQWEsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUM7Z0JBQzdCLElBQUksQ0FBQywwQkFBMEIsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDLFdBQVcsQ0FBQyxDQUFDO1lBQ25FLENBQUM7WUFDRCxLQUFLLEVBQUUsQ0FBQyxLQUFLLEVBQUUsRUFBRTtnQkFDZixJQUFJLENBQUMsWUFBWSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQztnQkFDN0IsSUFBSSxDQUFDLFdBQVcsQ0FBQyxHQUFHLENBQUMsS0FBSyxFQUFFLE9BQU8sSUFBSSwwQkFBMEIsQ0FBQyxDQUFDO1lBQ3JFLENBQUM7U0FDRixDQUFDLENBQUM7SUFDUCxDQUFDO0lBRUQsT0FBTztRQUNMLElBQUksQ0FBQyxXQUFXLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQzNCLElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQztJQUN6QixDQUFDO0lBRUQsd0JBQXdCO1FBQ3RCLE1BQU0sYUFBYSxHQUFHLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQztRQUN2QyxNQUFNLFlBQVksR0FBRyxJQUFJLENBQUMsWUFBWSxFQUFFLENBQUM7UUFFekMsd0VBQXdFO1FBQ3hFLE1BQU0sY0FBYyxHQUNsQixJQUFJLENBQUMsV0FBVyxFQUFFLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDO1FBRXhFLDBEQUEwRDtRQUMxRCxNQUFNLGdCQUFnQixHQUFHLGNBQWMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLEVBQUUsRUFBRTtZQUNsRCxvRkFBb0Y7WUFDcEYsTUFBTSx1QkFBdUIsR0FBRyxDQUFDLEdBQUcsQ0FBQyxvQkFBb0IsSUFBSSxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQ2xFLENBQUMsTUFBTSxFQUFFLEVBQUUsQ0FBQyxDQUFDO2dCQUNYLFFBQVEsRUFBRSxNQUFNLENBQUMsUUFBUTtnQkFDekIsTUFBTSxFQUFFLE1BQU0sQ0FBQyxNQUFNO2dCQUNyQixlQUFlLEVBQUUsWUFBWTtnQkFDN0IsVUFBVSxFQUFFLE1BQU0sQ0FBQyxZQUFZO2dCQUMvQixpQkFBaUIsRUFDZixNQUFNLENBQUMsV0FBVyxLQUFLLGNBQWM7b0JBQ25DLENBQUMsQ0FBQyxjQUFjO29CQUNoQixDQUFDLENBQUMsTUFBTSxDQUFDLFdBQVcsS0FBSyxZQUFZO3dCQUNqQyxNQUFNLENBQUMsV0FBVyxLQUFLLFFBQVE7d0JBQ2pDLENBQUMsQ0FBQyxpQkFBaUI7d0JBQ25CLENBQUMsQ0FBQyxhQUFhO2FBQ3RCLENBQUMsQ0FDSCxDQUFDO1lBRUYsb0NBQW9DO1lBQ3BDLElBQUksdUJBQXVCLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRSxDQUFDO2dCQUN6Qyx1QkFBdUIsQ0FBQyxJQUFJLENBQUM7b0JBQzNCLFFBQVEsRUFBRSxhQUFhLEVBQUUsT0FBTztvQkFDaEMsTUFBTSxFQUFFLGFBQWEsRUFBRSxRQUFRO29CQUMvQixlQUFlLEVBQUUsWUFBWTtvQkFDN0IsVUFBVSxFQUFFLEdBQUcsQ0FBQyxlQUFlLElBQUksQ0FBQztvQkFDcEMsaUJBQWlCLEVBQUUsR0FBRyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxhQUFhO2lCQUNuRSxDQUFDLENBQUM7WUFDTCxDQUFDO1lBRUQsOENBQThDO1lBQzlDLE1BQU0sT0FBTyxHQUNWLEdBQVcsRUFBRSwyQkFBMkI7Z0JBQ3hDLEdBQVcsRUFBRSwyQkFBMkIsQ0FBQztZQUM1QyxPQUFPO2dCQUNMLEdBQUcsR0FBRztnQkFDTixvQkFBb0IsRUFBRSx1QkFBdUI7Z0JBQzdDLFlBQVksRUFBRSxHQUFHLENBQUMsWUFBWSxJQUFJLEdBQUcsQ0FBQyxhQUFhLElBQUksS0FBSztnQkFDNUQsZUFBZSxFQUFFLEdBQUcsQ0FBQyxlQUFlO2dCQUNwQyxRQUFRLEVBQUUsWUFBWTtnQkFDdEIsVUFBVSxFQUFFLEdBQUcsQ0FBQyxVQUFVO2dCQUMxQixjQUFjLEVBQUUsT0FBTztnQkFDdkIsMkJBQTJCLEVBQUUsT0FBTzthQUNyQyxDQUFDO1FBQ0osQ0FBQyxDQUFDLENBQUM7UUFFSCxNQUFNLFFBQVEsR0FBRztZQUNmLFFBQVEsRUFBRSxnQkFBZ0I7WUFDMUIsUUFBUSxFQUFFLGFBQWEsRUFBRSxPQUFPO1lBQ2hDLFNBQVMsRUFBRSxhQUFhLEVBQUUsT0FBTztZQUNqQyxNQUFNLEVBQUUsYUFBYSxFQUFFLFFBQVE7WUFDL0IsT0FBTyxFQUFFLGFBQWEsRUFBRSxRQUFRO1lBQ2hDLGNBQWMsRUFBRSxJQUFJLENBQUMsT0FBTyxFQUFFO1NBQy9CLENBQUM7UUFFRixNQUFNLElBQUksR0FBRyxJQUFJLENBQUM7UUFDbEIsTUFBTSxVQUFVLEdBQ2QsSUFBSSxLQUFLLElBQUk7WUFDWCxDQUFDLENBQUMsc0NBQXNDO1lBQ3hDLENBQUMsQ0FBQyxxQ0FBcUMsQ0FBQztRQUU1Qyw2REFBNkQ7UUFDN0QscU1BQXFNO1FBQ3JNLGdEQUFnRDtRQUM1QyxNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsT0FBTyxDQUMxQywyQkFBMkIsQ0FDNUIsQ0FBQztRQUNGLE9BQU8sQ0FBQyxJQUFJLENBQUMsZ0ZBQWdGLENBQUMsQ0FBQztRQUMvRiw4REFBOEQ7UUFDOUQsWUFBWTtRQUNaLFlBQVk7UUFDWixnQkFBZ0I7UUFDaEIsNEJBQTRCO1FBQzVCLDRCQUE0QjtRQUM1QixnQ0FBZ0M7UUFDaEMsU0FBUztRQUNULGtCQUFrQjtRQUNsQixzQkFBc0I7UUFDdEIsNkNBQTZDO1FBQzdDLDZCQUE2QjtRQUM3QixTQUFTO1FBQ1QsT0FBTztRQUNQLDhDQUE4QztRQUM5Qyx3Q0FBd0M7UUFDeEMsdUJBQXVCO1FBQ3ZCLHdCQUF3QjtRQUN4QixnREFBZ0Q7UUFDaEQsTUFBTTtRQUNSLElBQUk7UUFDTixJQUFJO0lBQ04sQ0FBQztJQUVELGNBQWMsQ0FBQyxLQUF5QjtRQUN0QyxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUM7WUFDWCxPQUFPLEVBQUUsQ0FBQztRQUNaLENBQUM7UUFDRCxJQUFJLEtBQUssR0FBRyxJQUFJLEVBQUUsQ0FBQztZQUNqQixPQUFPLEdBQUcsS0FBSyxJQUFJLENBQUM7UUFDdEIsQ0FBQztRQUNELElBQUksS0FBSyxHQUFHLElBQUksR0FBRyxJQUFJLEVBQUUsQ0FBQztZQUN4QixPQUFPLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQztRQUMxQyxDQUFDO1FBQ0QsT0FBTyxHQUFHLENBQUMsS0FBSyxHQUFHLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUM7SUFDcEQsQ0FBQzsrR0F6UVUsc0RBQXNEO21HQUF0RCxzREFBc0Qsc2hDQVJ0RCxDQUFDLGFBQWEsQ0FBQywwQkNyQzVCLHUvTkE4TEEsMDhNRDFKWSxZQUFZLDhCQUFFLGlCQUFpQjs7NEZBUzlCLHNEQUFzRDtrQkFabEUsU0FBUzsrQkFDRSxxREFBcUQsY0FDbkQsSUFBSSxXQUNQLENBQUMsWUFBWSxFQUFFLGlCQUFpQixDQUFDLGFBQy9CLENBQUMsYUFBYSxDQUFDLG1CQU1ULHVCQUF1QixDQUFDLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBDb21wb25lbnQsXG4gIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LFxuICBpbnB1dCxcbiAgb3V0cHV0LFxuICBzaWduYWwsXG4gIGluamVjdCxcbiAgRGVzdHJveVJlZixcbiAgZWZmZWN0LFxuICBjb21wdXRlZCxcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBDb21tb25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHsgVHJhbnNsYXRpb25TZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vLi4vLi4vLi4vc2hhcmVkL3NlcnZpY2VzL3RyYW5zbGF0aW9uLnNlcnZpY2UnO1xuaW1wb3J0IHsgSHR0cENsaWVudCwgSHR0cEV2ZW50VHlwZSwgSHR0cFJlcXVlc3QgfSBmcm9tICdAYW5ndWxhci9jb21tb24vaHR0cCc7XG5pbXBvcnQgeyB0YWtlVW50aWxEZXN0cm95ZWQgfSBmcm9tICdAYW5ndWxhci9jb3JlL3J4anMtaW50ZXJvcCc7XG5pbXBvcnQge1xuICBJQWxtYXRhckhvdGVsQXV0b0NhbmNlbGxhdGlvblBhY2thZ2UsXG4gIElBbG1hdGFySG90ZWxBdXRvQ2FuY2VsbGF0aW9uSG90ZWxJbmZvLFxuICBJQWxtYXRhckhvdGVsQXV0b0NhbmNlbGxhdGlvblBhY2thZ2VSb29tLFxufSBmcm9tICcuLi8uLi8uLi8uLi9pbnRlcmZhY2VzL2ktYWxtYXRhci1ob3RlbC1hdXRvLWNhbmNlbGxhdGlvbi5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgQWxtYXRhckljb25Nb2R1bGUgfSBmcm9tICcuLi8uLi8uLi8uLi8uLi8uLi9zaGFyZWQvbW9kdWxlcy9hbG1hdGFyLWljb24vYWxtYXRhci1pY29uLm1vZHVsZSc7XG5pbXBvcnQgeyBBbG1hdGFySG90ZWxBdXRvQ2FuY2VsbGF0aW9uRW5kcG9pbnRzRW51bSB9IGZyb20gJy4uLy4uLy4uLy4uL2VudW1zL2FsbWF0YXItaG90ZWwtYXV0by1jYW5jZWxsYXRpb24tZW5kcG9pbnRzLmVudW0nO1xuaW1wb3J0IHsgQWxtYXRhckhvdGVsQXV0b0NhbmNlbGxhdGlvbkVuZHBvaW50c1NlcnZpY2UgfSBmcm9tICcuLi8uLi8uLi8uLi9zZXJ2aWNlcy9hbG1hdGFyLWhvdGVsLWF1dG8tY2FuY2VsbGF0aW9uLWVuZHBvaW50cy5zZXJ2aWNlJztcbmltcG9ydCB7IERpYWxvZ1NlcnZpY2UgfSBmcm9tICdwcmltZW5nL2R5bmFtaWNkaWFsb2cnO1xuXG5pbnRlcmZhY2UgSUdyb3VwZWRQYWNrYWdlUm9vbSB7XG4gIGtleTogc3RyaW5nO1xuICBiZWRUeXBlT3JSb29tVHlwZTogc3RyaW5nO1xuICByb29tQmFzaXM6IHN0cmluZztcbiAgY291bnQ6IG51bWJlcjtcbiAgcm9vbXM6IElBbG1hdGFySG90ZWxBdXRvQ2FuY2VsbGF0aW9uUGFja2FnZVJvb21bXTtcbn1cblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnYWxtYXRhci1ob3RlbC1hdXRvLWNhbmNlbGxhdGlvbi1ub24tcmVmdW5kYWJsZS1yb29tJyxcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgaW1wb3J0czogW0NvbW1vbk1vZHVsZSwgQWxtYXRhckljb25Nb2R1bGVdLFxuICBwcm92aWRlcnM6IFtEaWFsb2dTZXJ2aWNlXSxcbiAgdGVtcGxhdGVVcmw6XG4gICAgJy4vYWxtYXRhci1ob3RlbC1hdXRvLWNhbmNlbGxhdGlvbi1ub24tcmVmdW5kYWJsZS1yb29tLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbXG4gICAgJy4vYWxtYXRhci1ob3RlbC1hdXRvLWNhbmNlbGxhdGlvbi1ub24tcmVmdW5kYWJsZS1yb29tLmNvbXBvbmVudC5zY3NzJyxcbiAgXSxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG59KVxuZXhwb3J0IGNsYXNzIEFsbWF0YXJIb3RlbEF1dG9DYW5jZWxsYXRpb25Ob25SZWZ1bmRhYmxlUm9vbUNvbXBvbmVudCB7XG4gIHByaXZhdGUgcmVhZG9ubHkgaHR0cCA9IGluamVjdChIdHRwQ2xpZW50KTtcbiAgcHJpdmF0ZSByZWFkb25seSBkZXN0cm95UmVmID0gaW5qZWN0KERlc3Ryb3lSZWYpO1xuICBwcml2YXRlIHJlYWRvbmx5IGVuZHBvaW50c1NlcnZpY2UgPSBpbmplY3QoXG4gICAgQWxtYXRhckhvdGVsQXV0b0NhbmNlbGxhdGlvbkVuZHBvaW50c1NlcnZpY2UsXG4gICk7XG5cbiAgcHJpdmF0ZSByZWFkb25seSB0cmFuc2xhdGVTZXJ2aWNlID0gaW5qZWN0KFRyYW5zbGF0aW9uU2VydmljZSk7XG4gIHByaXZhdGUgcmVhZG9ubHkgZGlhbG9nU2VydmljZSA9IGluamVjdChEaWFsb2dTZXJ2aWNlKTtcblxuICByZWFkb25seSBwYWNrYWdlID0gaW5wdXQucmVxdWlyZWQ8SUFsbWF0YXJIb3RlbEF1dG9DYW5jZWxsYXRpb25QYWNrYWdlPigpO1xuICByZWFkb25seSBhbGxQYWNrYWdlcyA9IGlucHV0PElBbG1hdGFySG90ZWxBdXRvQ2FuY2VsbGF0aW9uUGFja2FnZVtdPihbXSk7XG4gIHJlYWRvbmx5IGhvdGVsSW5mbyA9IGlucHV0PElBbG1hdGFySG90ZWxBdXRvQ2FuY2VsbGF0aW9uSG90ZWxJbmZvIHwgbnVsbD4oXG4gICAgbnVsbCxcbiAgKTtcblxuICAvLyBjb25zdHJ1Y3Rvcigpe2VmZmVjdCgoKSA9PiB7XG4gIC8vICAgY29uc29sZS5sb2codGhpcy5wYWNrYWdlKCkpXG4gIC8vIH0pfVxuXG4gIHJlYWRvbmx5IGhvdGVsSWQgPSBpbnB1dDxzdHJpbmcgfCBudW1iZXI+KCcnKTtcbiAgcmVhZG9ubHkgY3VycmVuY3lDb2RlID0gaW5wdXQ8c3RyaW5nPignU0FSJyk7XG4gIHJlYWRvbmx5IGFsbFBhY2thZ2VzTm9uUmVmdW5kYWJsZSA9IGlucHV0PGJvb2xlYW4+KGZhbHNlKTtcblxuICBwcml2YXRlIHJlYWRvbmx5IHVzZUxvY2FsQ2FuY2VsbGF0aW9uUG9saWNpZXMgPSB0cnVlO1xuXG4gIHJlYWRvbmx5IGNsb3NlTW9kYWwgPSBvdXRwdXQ8dm9pZD4oKTtcbiAgcmVhZG9ubHkgbm9uUmVmdW5kYWJsZVN1Ym1pdFN1Y2Nlc3MgPSBvdXRwdXQ8c3RyaW5nPigpO1xuXG4gIHJlYWRvbmx5IHVwbG9hZGVkRmlsZSA9IHNpZ25hbDxGaWxlIHwgbnVsbD4obnVsbCk7XG4gIHJlYWRvbmx5IHVwbG9hZGVkRmlsZVVybCA9IHNpZ25hbDxzdHJpbmcgfCBudWxsPihudWxsKTtcbiAgcmVhZG9ubHkgZmlsZVBpY2tlZCA9IHNpZ25hbDxGaWxlIHwgbnVsbD4obnVsbCk7XG4gIHJlYWRvbmx5IHVwbG9hZFN1Y2Nlc3MgPSBzaWduYWw8Ym9vbGVhbj4oZmFsc2UpO1xuICByZWFkb25seSB1cGxvYWRQcm9ncmVzcyA9IHNpZ25hbDxudW1iZXI+KDApO1xuICByZWFkb25seSBpc1VwbG9hZGluZyA9IHNpZ25hbDxib29sZWFuPihmYWxzZSk7XG4gIHJlYWRvbmx5IGlzU3VibWl0dGluZyA9IHNpZ25hbDxib29sZWFuPihmYWxzZSk7XG4gIHJlYWRvbmx5IHN1Ym1pdFN1Y2Nlc3MgPSBzaWduYWw8Ym9vbGVhbj4oZmFsc2UpO1xuICByZWFkb25seSBzdWJtaXRFcnJvciA9IHNpZ25hbDxzdHJpbmcgfCBudWxsPihudWxsKTtcblxuICByZWFkb25seSBncm91cGVkUm9vbXMgPSBjb21wdXRlZDxJR3JvdXBlZFBhY2thZ2VSb29tW10+KCgpID0+IHtcbiAgICBjb25zdCByb29tcyA9IHRoaXMucGFja2FnZSgpPy5yb29tcyB8fCBbXTtcbiAgICBjb25zdCBncm91cE1hcCA9IG5ldyBNYXA8c3RyaW5nLCBJR3JvdXBlZFBhY2thZ2VSb29tPigpO1xuXG4gICAgZm9yIChjb25zdCByb29tIG9mIHJvb21zKSB7XG4gICAgICAvLyBjb25zdCBiZWRUeXBlT3JSb29tVHlwZSA9IHJvb20uYmVkVHlwZSB8fCByb29tLnJvb21UeXBlIHx8ICcnO1xuICAgICAgY29uc3QgYmVkVHlwZU9yUm9vbVR5cGUgPSByb29tPy5yb29tTmFtZTtcbiAgICAgIGNvbnN0IHJvb21CYXNpcyA9IHJvb20ucm9vbUJhc2lzIHx8ICcnO1xuICAgICAgY29uc3Qga2V5ID0gYCR7YmVkVHlwZU9yUm9vbVR5cGV9fHx8JHtyb29tQmFzaXN9YDtcblxuICAgICAgaWYgKGdyb3VwTWFwLmhhcyhrZXkpKSB7XG4gICAgICAgIGNvbnN0IGdyb3VwID0gZ3JvdXBNYXAuZ2V0KGtleSkhO1xuICAgICAgICBncm91cC5jb3VudCsrO1xuICAgICAgICBncm91cC5yb29tcy5wdXNoKHJvb20pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZ3JvdXBNYXAuc2V0KGtleSwge1xuICAgICAgICAgIGtleSxcbiAgICAgICAgICBiZWRUeXBlT3JSb29tVHlwZSxcbiAgICAgICAgICByb29tQmFzaXMsXG4gICAgICAgICAgY291bnQ6IDEsXG4gICAgICAgICAgcm9vbXM6IFtyb29tXSxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIEFycmF5LmZyb20oZ3JvdXBNYXAudmFsdWVzKCkpO1xuICB9KTtcblxuICBvbkZpbGVTZWxlY3RlZChldmVudDogRXZlbnQpOiB2b2lkIHtcbiAgICBjb25zdCBpbnB1dCA9IGV2ZW50LnRhcmdldCBhcyBIVE1MSW5wdXRFbGVtZW50O1xuICAgIGlmIChpbnB1dC5maWxlcyAmJiBpbnB1dC5maWxlcy5sZW5ndGggPiAwKSB7XG4gICAgICBjb25zdCBmaWxlID0gaW5wdXQuZmlsZXNbMF07XG4gICAgICB0aGlzLmZpbGVQaWNrZWQuc2V0KGZpbGUpO1xuICAgICAgdGhpcy51cGxvYWRGaWxlKGZpbGUpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgdXBsb2FkRmlsZShmaWxlOiBGaWxlKTogdm9pZCB7XG4gICAgdGhpcy5pc1VwbG9hZGluZy5zZXQodHJ1ZSk7XG4gICAgdGhpcy51cGxvYWRQcm9ncmVzcy5zZXQoMCk7XG4gICAgdGhpcy51cGxvYWRTdWNjZXNzLnNldChmYWxzZSk7XG4gICAgdGhpcy51cGxvYWRlZEZpbGVVcmwuc2V0KG51bGwpO1xuXG4gICAgY29uc3QgZm9ybURhdGEgPSBuZXcgRm9ybURhdGEoKTtcbiAgICBmb3JtRGF0YS5hcHBlbmQoJ2ZpbGUnLCBmaWxlKTtcblxuICAgIGNvbnN0IHJlcSA9IG5ldyBIdHRwUmVxdWVzdChcbiAgICAgICdQT1NUJyxcbiAgICAgIEFsbWF0YXJIb3RlbEF1dG9DYW5jZWxsYXRpb25FbmRwb2ludHNFbnVtLnVwbG9hZEF0dGFjaG1lbnQsXG4gICAgICBmb3JtRGF0YSxcbiAgICAgIHtcbiAgICAgICAgcmVwb3J0UHJvZ3Jlc3M6IHRydWUsXG4gICAgICAgIHJlc3BvbnNlVHlwZTogJ2pzb24nLFxuICAgICAgfSxcbiAgICApO1xuXG4gICAgdGhpcy5odHRwXG4gICAgICAucmVxdWVzdDx7IGRhdGE6IHsgdXJsOiBzdHJpbmcgfSB9PihyZXEpXG4gICAgICAucGlwZSh0YWtlVW50aWxEZXN0cm95ZWQodGhpcy5kZXN0cm95UmVmKSlcbiAgICAgIC5zdWJzY3JpYmUoe1xuICAgICAgICBuZXh0OiAoZXZlbnQpID0+IHtcbiAgICAgICAgICBpZiAoZXZlbnQudHlwZSA9PT0gSHR0cEV2ZW50VHlwZS5VcGxvYWRQcm9ncmVzcyAmJiBldmVudC50b3RhbCkge1xuICAgICAgICAgICAgY29uc3QgcHJvZ3Jlc3MgPSBNYXRoLnJvdW5kKCgxMDAgKiBldmVudC5sb2FkZWQpIC8gZXZlbnQudG90YWwpO1xuICAgICAgICAgICAgdGhpcy51cGxvYWRQcm9ncmVzcy5zZXQocHJvZ3Jlc3MpO1xuICAgICAgICAgIH0gZWxzZSBpZiAoZXZlbnQudHlwZSA9PT0gSHR0cEV2ZW50VHlwZS5SZXNwb25zZSkge1xuICAgICAgICAgICAgdGhpcy51cGxvYWRQcm9ncmVzcy5zZXQoMTAwKTtcbiAgICAgICAgICAgIHRoaXMuaXNVcGxvYWRpbmcuc2V0KGZhbHNlKTtcbiAgICAgICAgICAgIHRoaXMudXBsb2FkU3VjY2Vzcy5zZXQodHJ1ZSk7XG4gICAgICAgICAgICB0aGlzLnVwbG9hZGVkRmlsZS5zZXQoZmlsZSk7XG4gICAgICAgICAgICB0aGlzLnVwbG9hZGVkRmlsZVVybC5zZXQoZXZlbnQuYm9keT8uZGF0YT8udXJsID8/IG51bGwpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgZXJyb3I6ICgpID0+IHtcbiAgICAgICAgICB0aGlzLmlzVXBsb2FkaW5nLnNldChmYWxzZSk7XG4gICAgICAgICAgdGhpcy51cGxvYWRQcm9ncmVzcy5zZXQoMCk7XG4gICAgICAgICAgdGhpcy51cGxvYWRTdWNjZXNzLnNldChmYWxzZSk7XG4gICAgICAgICAgdGhpcy5maWxlUGlja2VkLnNldChudWxsKTtcbiAgICAgICAgICB0aGlzLnVwbG9hZGVkRmlsZVVybC5zZXQobnVsbCk7XG4gICAgICAgIH0sXG4gICAgICB9KTtcbiAgfVxuXG4gIG9uU3VibWl0UmVxdWVzdCgpOiB2b2lkIHtcbiAgICBjb25zdCB1cmwgPSB0aGlzLnVwbG9hZGVkRmlsZVVybCgpO1xuICAgIGlmICghdXJsKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5pc1N1Ym1pdHRpbmcuc2V0KHRydWUpO1xuICAgIHRoaXMuc3VibWl0RXJyb3Iuc2V0KG51bGwpO1xuICAgIHRoaXMuc3VibWl0U3VjY2Vzcy5zZXQoZmFsc2UpO1xuXG4gICAgY29uc3QgbGFuZ3VhZ2UgPSAnZW4nO1xuXG4gICAgdGhpcy5lbmRwb2ludHNTZXJ2aWNlXG4gICAgICAucHJvY2Vzc05vblJlZnVuZGFibGVDYW5jZWxsYXRpb24odGhpcy5wYWNrYWdlKCkucGFja2FnZUlkLCB1cmwsIGxhbmd1YWdlKVxuICAgICAgLnBpcGUodGFrZVVudGlsRGVzdHJveWVkKHRoaXMuZGVzdHJveVJlZikpXG4gICAgICAuc3Vic2NyaWJlKHtcbiAgICAgICAgbmV4dDogKCkgPT4ge1xuICAgICAgICAgIHRoaXMuaXNTdWJtaXR0aW5nLnNldChmYWxzZSk7XG4gICAgICAgICAgdGhpcy5zdWJtaXRTdWNjZXNzLnNldCh0cnVlKTtcbiAgICAgICAgICB0aGlzLm5vblJlZnVuZGFibGVTdWJtaXRTdWNjZXNzLmVtaXQodGhpcy5wYWNrYWdlKCkucGFja2FnZU5hbWUpO1xuICAgICAgICB9LFxuICAgICAgICBlcnJvcjogKGVycm9yKSA9PiB7XG4gICAgICAgICAgdGhpcy5pc1N1Ym1pdHRpbmcuc2V0KGZhbHNlKTtcbiAgICAgICAgICB0aGlzLnN1Ym1pdEVycm9yLnNldChlcnJvcj8ubWVzc2FnZSB8fCAnRmFpbGVkIHRvIHN1Ym1pdCByZXF1ZXN0Jyk7XG4gICAgICAgIH0sXG4gICAgICB9KTtcbiAgfVxuXG4gIG9uUmV0cnkoKTogdm9pZCB7XG4gICAgdGhpcy5zdWJtaXRFcnJvci5zZXQobnVsbCk7XG4gICAgdGhpcy5vblN1Ym1pdFJlcXVlc3QoKTtcbiAgfVxuXG4gIG9uT3BlbkNhbmNlbGxhdGlvblBvbGljeSgpOiB2b2lkIHtcbiAgICBjb25zdCBob3RlbEluZm9EYXRhID0gdGhpcy5ob3RlbEluZm8oKTtcbiAgICBjb25zdCBjdXJyZW5jeUNvZGUgPSB0aGlzLmN1cnJlbmN5Q29kZSgpO1xuXG4gICAgLy8gVXNlIGFsbCBwYWNrYWdlcyBpZiBhdmFpbGFibGUsIG90aGVyd2lzZSBmYWxsIGJhY2sgdG8gY3VycmVudCBwYWNrYWdlXG4gICAgY29uc3QgcGFja2FnZXNUb1Nob3cgPVxuICAgICAgdGhpcy5hbGxQYWNrYWdlcygpLmxlbmd0aCA+IDAgPyB0aGlzLmFsbFBhY2thZ2VzKCkgOiBbdGhpcy5wYWNrYWdlKCldO1xuXG4gICAgLy8gVHJhbnNmb3JtIGFsbCBwYWNrYWdlcyB3aXRoIHRoZWlyIGNhbmNlbGxhdGlvbiBwb2xpY2llc1xuICAgIGNvbnN0IHBhY2thZ2VzRm9yUG9wdXAgPSBwYWNrYWdlc1RvU2hvdy5tYXAoKHBrZykgPT4ge1xuICAgICAgLy8gVHJhbnNmb3JtIGNhbmNlbGxhdGlvbiBwb2xpY2llcyB0byB0aGUgZm9ybWF0IGV4cGVjdGVkIGJ5IG1hcENhbmNlbGxhdGlvblBvbGljaWVzXG4gICAgICBjb25zdCByYXdDYW5jZWxsYXRpb25Qb2xpY2llcyA9IChwa2cuY2FuY2VsbGF0aW9uUG9saWNpZXMgfHwgW10pLm1hcChcbiAgICAgICAgKHBvbGljeSkgPT4gKHtcbiAgICAgICAgICBkYXRlRnJvbTogcG9saWN5LmZyb21EYXRlLFxuICAgICAgICAgIGRhdGVUbzogcG9saWN5LnRvRGF0ZSxcbiAgICAgICAgICBjdXJyZW5jeUlzb0NvZGU6IGN1cnJlbmN5Q29kZSxcbiAgICAgICAgICBmaW5hbFByaWNlOiBwb2xpY3kucGVuYWx0eVZhbHVlLFxuICAgICAgICAgIHJlZnVuZGFiaWxpdHlUeXBlOlxuICAgICAgICAgICAgcG9saWN5LnBlbmFsdHlUeXBlID09PSAnRnVsbFJlZnVuZGVkJ1xuICAgICAgICAgICAgICA/ICdGdWxsUmVmdW5kZWQnXG4gICAgICAgICAgICAgIDogcG9saWN5LnBlbmFsdHlUeXBlID09PSAnUGVyY2VudGFnZScgfHxcbiAgICAgICAgICAgICAgICAgIHBvbGljeS5wZW5hbHR5VHlwZSA9PT0gJ0Ftb3VudCdcbiAgICAgICAgICAgICAgICA/ICdQYXJ0aWFsUmVmdW5kZWQnXG4gICAgICAgICAgICAgICAgOiAnTm9uUmVmdW5kZWQnLFxuICAgICAgICB9KSxcbiAgICAgICk7XG5cbiAgICAgIC8vIEVuc3VyZSBhdCBsZWFzdCBvbmUgcG9saWN5IGV4aXN0c1xuICAgICAgaWYgKHJhd0NhbmNlbGxhdGlvblBvbGljaWVzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICByYXdDYW5jZWxsYXRpb25Qb2xpY2llcy5wdXNoKHtcbiAgICAgICAgICBkYXRlRnJvbTogaG90ZWxJbmZvRGF0YT8uY2hlY2tJbixcbiAgICAgICAgICBkYXRlVG86IGhvdGVsSW5mb0RhdGE/LmNoZWNrT3V0LFxuICAgICAgICAgIGN1cnJlbmN5SXNvQ29kZTogY3VycmVuY3lDb2RlLFxuICAgICAgICAgIGZpbmFsUHJpY2U6IHBrZy5jYW5jZWxsYXRpb25GZWUgfHwgMCxcbiAgICAgICAgICByZWZ1bmRhYmlsaXR5VHlwZTogcGtnLmlzUmVmdW5kYWJsZSA/ICdSZWZ1bmRhYmxlJyA6ICdOb25SZWZ1bmRlZCcsXG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICAvLyBCdWlsZCBwYWNrYWdlIGRhdGEgd2l0aCBhbGwgcmVxdWlyZWQgZmllbGRzXG4gICAgICBjb25zdCByZW1hcmtzID1cbiAgICAgICAgKHBrZyBhcyBhbnkpPy5jYW5jZWxsYXRpb25Qb2xpY2llc1JlbWFya3MgPz9cbiAgICAgICAgKHBrZyBhcyBhbnkpPy5DYW5jZWxsYXRpb25Qb2xpY2llc1JlbWFya3M7XG4gICAgICByZXR1cm4ge1xuICAgICAgICAuLi5wa2csXG4gICAgICAgIGNhbmNlbGxhdGlvblBvbGljaWVzOiByYXdDYW5jZWxsYXRpb25Qb2xpY2llcyxcbiAgICAgICAgaXNSZWZ1bmRhYmxlOiBwa2cuaXNSZWZ1bmRhYmxlID8/IHBrZy5yZWZ1bmRhYmlsaXR5ID8/IGZhbHNlLFxuICAgICAgICByZWZ1bmRhYmxlVW50aWw6IHBrZy5yZWZ1bmRhYmxlVW50aWwsXG4gICAgICAgIGN1cnJlbmN5OiBjdXJyZW5jeUNvZGUsXG4gICAgICAgIGZpbmFsUHJpY2U6IHBrZy5yb29tQW1vdW50LFxuICAgICAgICBib29raW5nUmVtYXJrczogcmVtYXJrcyxcbiAgICAgICAgY2FuY2VsbGF0aW9uUG9saWNpZXNSZW1hcmtzOiByZW1hcmtzLFxuICAgICAgfTtcbiAgICB9KTtcblxuICAgIGNvbnN0IGNhcnRJbmZvID0ge1xuICAgICAgcGFja2FnZXM6IHBhY2thZ2VzRm9yUG9wdXAsXG4gICAgICBmcm9tRGF0ZTogaG90ZWxJbmZvRGF0YT8uY2hlY2tJbixcbiAgICAgIGRhdGVfZnJvbTogaG90ZWxJbmZvRGF0YT8uY2hlY2tJbixcbiAgICAgIHRvRGF0ZTogaG90ZWxJbmZvRGF0YT8uY2hlY2tPdXQsXG4gICAgICBkYXRlX3RvOiBob3RlbEluZm9EYXRhPy5jaGVja091dCxcbiAgICAgIGFsbXRhYXJIb3RlbElkOiB0aGlzLmhvdGVsSWQoKSxcbiAgICB9O1xuXG4gICAgY29uc3QgbGFuZyA9ICdlbic7XG4gICAgY29uc3QgZm9ybWF0RGF0ZSA9XG4gICAgICBsYW5nID09PSAnZW4nXG4gICAgICAgID8gJ2RkZGQgRG8gb2YgTU1NTSBZWVlZIC0gaGg6bW0gQSBbR01UXSdcbiAgICAgICAgOiAnZGRkZCAsIEREIE1NTU0gWVlZWSAtIGhoOm1tIEEgW0dNVF0nO1xuXG4gICAgLy8gVE9ETzogRml4IGltcG9ydCBwYXRoIGZvciBDYW5jZWxsYXRpb25Qb2xpY3lQb3B1cENvbXBvbmVudFxuICAgIC8vIGltcG9ydCgnbGlicy9mZWF0dXJlcy9zcmMvbGliL2ZlYXR1cmVzL2hvdGVscy9zaGFyZWQvbW9kdWxlcy9ob3RlbC1ib29raW5nLWluZm9ybWF0aW9uL2NvbXBvbmVudHMvYm9va2luZy1zdW1tYXJ5L2NvbXBvbmVudHMvY2FuY2VsbGF0aW9uLXBvbGljeS1wb3B1cC9jYW5jZWxsYXRpb24tcG9saWN5LnBvcHVwLmNvbXBvbmVudCcpLnRoZW4oXG4gICAgLy8gICAoeyBDYW5jZWxsYXRpb25Qb2xpY3lQb3B1cENvbXBvbmVudCB9KSA9PiB7XG4gICAgICAgIGNvbnN0IGhlYWRlciA9IHRoaXMudHJhbnNsYXRlU2VydmljZS5pbnN0YW50KFxuICAgICAgICAgICdIT1RFTC5jYW5jZWxsYXRpb24tcG9saWN5JyxcbiAgICAgICAgKTtcbiAgICAgICAgY29uc29sZS53YXJuKCdDYW5jZWxsYXRpb25Qb2xpY3lQb3B1cENvbXBvbmVudCBub3QgYXZhaWxhYmxlIC0gaW1wb3J0IHBhdGggbmVlZHMgdG8gYmUgZml4ZWQnKTtcbiAgICAgICAgLy8gdGhpcy5kaWFsb2dTZXJ2aWNlLm9wZW4oQ2FuY2VsbGF0aW9uUG9saWN5UG9wdXBDb21wb25lbnQsIHtcbiAgICAgICAgLy8gICBoZWFkZXIsXG4gICAgICAgIC8vICAgZGF0YToge1xuICAgICAgICAvLyAgICAgY2FydEluZm8sXG4gICAgICAgIC8vICAgICBjdXJyZW50Q3VycmVuY3lPYmo6IHtcbiAgICAgICAgLy8gICAgICAgY29kZTogY3VycmVuY3lDb2RlLFxuICAgICAgICAvLyAgICAgICBjdXJyZW5jeTogY3VycmVuY3lDb2RlLFxuICAgICAgICAvLyAgICAgfSxcbiAgICAgICAgLy8gICAgIGZvcm1hdERhdGUsXG4gICAgICAgIC8vICAgICBob3RlbERldGFpbHM6IHtcbiAgICAgICAgLy8gICAgICAgaG90ZWxOYW1lOiBob3RlbEluZm9EYXRhPy5ob3RlbE5hbWUsXG4gICAgICAgIC8vICAgICAgIHBheW1lbnRPcHRpb246IG51bGwsXG4gICAgICAgIC8vICAgICB9LFxuICAgICAgICAvLyAgIH0sXG4gICAgICAgIC8vICAgc3R5bGVDbGFzczogJ2NhbmNlbGxhdGlvbi1wb2xpY3ktZGlhbG9nJyxcbiAgICAgICAgLy8gICBjb250ZW50U3R5bGU6IHsgb3ZlcmZsb3c6ICdhdXRvJyB9LFxuICAgICAgICAvLyAgIGJhc2VaSW5kZXg6IDEwMDAwLFxuICAgICAgICAvLyAgIG1heGltaXphYmxlOiBmYWxzZSxcbiAgICAgICAgLy8gICBzdHlsZTogeyB3aWR0aDogJzYwMHB4JywgbWF4V2lkdGg6ICc5MCUnIH0sXG4gICAgICAgIC8vIH0pO1xuICAgICAgLy99LFxuICAgIC8vKTtcbiAgfVxuXG4gIGZvcm1hdEZpbGVTaXplKGJ5dGVzOiBudW1iZXIgfCB1bmRlZmluZWQpOiBzdHJpbmcge1xuICAgIGlmICghYnl0ZXMpIHtcbiAgICAgIHJldHVybiAnJztcbiAgICB9XG4gICAgaWYgKGJ5dGVzIDwgMTAyNCkge1xuICAgICAgcmV0dXJuIGAke2J5dGVzfSBCYDtcbiAgICB9XG4gICAgaWYgKGJ5dGVzIDwgMTAyNCAqIDEwMjQpIHtcbiAgICAgIHJldHVybiBgJHtNYXRoLnJvdW5kKGJ5dGVzIC8gMTAyNCl9IEtCYDtcbiAgICB9XG4gICAgcmV0dXJuIGAkeyhieXRlcyAvICgxMDI0ICogMTAyNCkpLnRvRml4ZWQoMSl9IE1CYDtcbiAgfVxufVxuIiwiQGlmICghcGFja2FnZSgpLmlzQ2FuY2VsbGVkKSB7XG4gIDxkaXYgY2xhc3M9XCJwYWNrYWdlLWl0ZW0gcGFja2FnZS1pdGVtLS1ub24tcmVmdW5kYWJsZVwiPlxuICAgIDxkaXYgY2xhc3M9XCJwYWNrYWdlLWl0ZW1fX2hlYWRlclwiPlxuICAgICAgPGRpdiBjbGFzcz1cInBhY2thZ2UtaXRlbV9fY29udGVudFwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwicGFja2FnZS1pdGVtX19pbmZvXCI+XG4gICAgICAgICAgPGg0IGNsYXNzPVwicGFja2FnZS1pdGVtX19uYW1lXCI+e3sgcGFja2FnZSgpLnBhY2thZ2VOYW1lIH19PC9oND5cbiAgICAgICAgICBAaWYgKHBhY2thZ2UoKS5ib2FyZEJhc2lzKSB7XG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cInBhY2thZ2UtaXRlbV9fYm9hcmQtYmFzaXNcIj57e1xuICAgICAgICAgICAgICBwYWNrYWdlKCkuYm9hcmRCYXNpc1xuICAgICAgICAgICAgfX08L3NwYW4+XG4gICAgICAgICAgfVxuICAgICAgICA8L2Rpdj5cblxuICAgICAgICA8c3BhblxuICAgICAgICAgIGNsYXNzPVwicGFja2FnZS1pdGVtX19yZWZ1bmQtYmFkZ2UgcGFja2FnZS1pdGVtX19yZWZ1bmQtYmFkZ2UtLW5vbi1yZWZ1bmRhYmxlXCJcbiAgICAgICAgPlxuICAgICAgICAgIEBpZiAoXG4gICAgICAgICAgICBhbGxQYWNrYWdlc05vblJlZnVuZGFibGUoKSB8fFxuICAgICAgICAgICAgKCFwYWNrYWdlKCk/LmlzUmVmdW5kYWJsZSAmJiAhcGFja2FnZSgpPy5pc0NhbmNlbGxlZClcbiAgICAgICAgICApIHtcbiAgICAgICAgICAgIE5PTi1SRUZVTkRBQkxFXG4gICAgICAgICAgfVxuICAgICAgICAgIEBpZiAocGFja2FnZSgpPy5pc0NhbmNlbGxlZCkge1xuICAgICAgICAgICAgUFJFVklPVVMgQ0FOQ0VMTEFUSU9OXG4gICAgICAgICAgfVxuICAgICAgICA8L3NwYW4+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cblxuICAgIEBpZiAoZ3JvdXBlZFJvb21zKCkubGVuZ3RoKSB7XG4gICAgICA8ZGl2IGNsYXNzPVwicGFja2FnZS1pdGVtX19yb29tc1wiPlxuICAgICAgICBAZm9yIChncm91cCBvZiBncm91cGVkUm9vbXMoKTsgdHJhY2sgaTsgbGV0IGkgPSAkaW5kZXgpIHtcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwicGFja2FnZS1pdGVtX19yb29tXCI+XG4gICAgICAgICAgICA8aDUgY2xhc3M9XCJwYWNrYWdlLWl0ZW1fX3Jvb20tbmFtZVwiPlxuICAgICAgICAgICAgICBAaWYgKGdyb3VwLmNvdW50ID4gMSkge1xuICAgICAgICAgICAgICAgIHt7IGdyb3VwLmNvdW50IH19eFxuICAgICAgICAgICAgICAgIEBpZiAoZ3JvdXAuYmVkVHlwZU9yUm9vbVR5cGUpIHtcbiAgICAgICAgICAgICAgICAgIHt7IGdyb3VwLmJlZFR5cGVPclJvb21UeXBlIH19XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9IEBlbHNlIHtcbiAgICAgICAgICAgICAgICBSb29tXG4gICAgICAgICAgICAgICAge3sgaSArIDEgfX1cbiAgICAgICAgICAgICAgICBAaWYgKGdyb3VwLmJlZFR5cGVPclJvb21UeXBlKSB7XG4gICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInBhY2thZ2UtaXRlbV9fc2VwYXJhdG9yXCI+4oCiPC9zcGFuPlxuICAgICAgICAgICAgICAgICAge3sgZ3JvdXAuYmVkVHlwZU9yUm9vbVR5cGUgfX1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIDwvaDU+XG4gICAgICAgICAgICBAaWYgKGdyb3VwLnJvb21CYXNpcykge1xuICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInBhY2thZ2UtaXRlbV9fcm9vbS1iYXNpc1wiPnt7XG4gICAgICAgICAgICAgICAgZ3JvdXAucm9vbUJhc2lzXG4gICAgICAgICAgICAgIH19PC9zcGFuPlxuICAgICAgICAgICAgfVxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICB9XG4gICAgICA8L2Rpdj5cbiAgICB9XG5cbiAgICBAaWYgKCFwYWNrYWdlKCk/LmlzQ2FuY2VsbGVkICYmICFhbGxQYWNrYWdlc05vblJlZnVuZGFibGUoKSkge1xuICAgICAgPGRpdiBjbGFzcz1cInBhY2thZ2UtaXRlbV9fbm9uLXJlZnVuZGFibGUtY29udGVudFwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiaW5mby1tZXNzYWdlXCI+XG4gICAgICAgICAgPGFsbWF0YXItaWNvbiBbbmFtZV09XCInZXhjbGFtYXRpb24tY2lyY2xlJ1wiPiA8L2FsbWF0YXItaWNvbj5cbiAgICAgICAgICA8cFxuICAgICAgICAgICAgY2xhc3M9XCJpbmZvLW1lc3NhZ2VfX3RleHRcIlxuICAgICAgICAgICAgKGNsaWNrKT1cIiRldmVudC5wcmV2ZW50RGVmYXVsdCgpOyBvbk9wZW5DYW5jZWxsYXRpb25Qb2xpY3koKVwiXG4gICAgICAgICAgICBbaW5uZXJIVE1MXT1cIlxuICAgICAgICAgICAgICAnV2UgY2FuXFwndCBwcm9jZXNzIGF1dG9tYXRpYyBjYW5jZWxsYXRpb24gd2l0aCB0aGlzIHJvb20uIENoZWNrIHRoZSA8YSBjbGFzcz0mcXVvdDtpbmZvLW1lc3NhZ2VfX2xpbmsmcXVvdDs+Y2FuY2VsbGF0aW9uIHBvbGljeTwvYT4gZm9yIGRldGFpbHMnXG4gICAgICAgICAgICBcIlxuICAgICAgICAgID48L3A+XG4gICAgICAgIDwvZGl2PlxuXG4gICAgICAgIEBpZiAodXBsb2FkU3VjY2VzcygpKSB7XG4gICAgICAgICAgPGRpdiBjbGFzcz1cInVwbG9hZC1zdWNjZXNzXCI+XG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cInVwbG9hZC1zdWNjZXNzX19pY29uXCI+XG4gICAgICAgICAgICAgIDxzdmdcbiAgICAgICAgICAgICAgICB3aWR0aD1cIjI0XCJcbiAgICAgICAgICAgICAgICBoZWlnaHQ9XCIyNFwiXG4gICAgICAgICAgICAgICAgdmlld0JveD1cIjAgMCAyNCAyNFwiXG4gICAgICAgICAgICAgICAgZmlsbD1cIm5vbmVcIlxuICAgICAgICAgICAgICAgIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIlxuICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgPHBhdGhcbiAgICAgICAgICAgICAgICAgIGQ9XCJNMTMuNDY5NyA4LjIwMTEyQzEzLjc2MjYgNy45MDgyMiAxNC4yMzczIDcuOTA4MjIgMTQuNTMwMiA4LjIwMTEyQzE0LjgyMzEgOC40OTQwMSAxNC44MjMxIDguOTY4NzcgMTQuNTMwMiA5LjI2MTY2TDcuNTMwMjIgMTYuMjYxN0M3LjIzNzMyIDE2LjU1NDYgNi43NjI1NiAxNi41NTQ2IDYuNDY5NjcgMTYuMjYxN0wzLjQ2OTY3IDEzLjI2MTdDMy4xNzY3OCAxMi45Njg4IDMuMTc2NzggMTIuNDk0IDMuNDY5NjcgMTIuMjAxMUMzLjc0NDI3IDExLjkyNjUgNC4xNzg5OSAxMS45MDkgNC40NzM1OCAxMi4xNDk0TDQuNTMwMjIgMTIuMjAxMUw2Ljk5OTk0IDE0LjY3MDhMMTMuNDY5NyA4LjIwMTEyWlwiXG4gICAgICAgICAgICAgICAgICBmaWxsPVwiIzFCMUExRlwiXG4gICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICA8cGF0aFxuICAgICAgICAgICAgICAgICAgZD1cIk0xOS40Njk3IDguMjAxMTJDMTkuNzYyNiA3LjkwODIyIDIwLjIzNzMgNy45MDgyMiAyMC41MzAyIDguMjAxMTJDMjAuODIzMSA4LjQ5NDAxIDIwLjgyMzEgOC45Njg3NyAyMC41MzAyIDkuMjYxNjZMMTMuNTMwMiAxNi4yNjE3QzEzLjI2MzkgMTYuNTI3OSAxMi44NDE1IDE2LjU1NTYgMTIuNTQyOSAxNi4zMjYxTDExLjU0MjkgMTUuNTU3NkwxMS40ODQzIDE1LjUwNzhDMTEuMjA3OSAxNS4yNDY4IDExLjE2ODYgMTQuODEzNyAxMS40MDUyIDE0LjUwNThDMTEuNjQxOCAxNC4xOTggMTIuMDcwMyAxNC4xMjQ1IDEyLjM5MzUgMTQuMzI0MkwxMi40NTcgMTQuMzY4MUwxMi45MzQ1IDE0LjczNTNMMTkuNDY5NyA4LjIwMTEyWlwiXG4gICAgICAgICAgICAgICAgICBmaWxsPVwiIzFCMUExRlwiXG4gICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgPC9zdmc+XG4gICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwidXBsb2FkLXN1Y2Nlc3NfX2luZm9cIj5cbiAgICAgICAgICAgICAgPHAgY2xhc3M9XCJ1cGxvYWQtc3VjY2Vzc19fZmlsZW5hbWVcIj57eyBmaWxlUGlja2VkKCk/Lm5hbWUgfX08L3A+XG4gICAgICAgICAgICAgIDxwIGNsYXNzPVwidXBsb2FkLXN1Y2Nlc3NfX21ldGFcIj5cbiAgICAgICAgICAgICAgICB7eyBmb3JtYXRGaWxlU2l6ZShmaWxlUGlja2VkKCk/LnNpemUpIH19IOKAolxuICAgICAgICAgICAgICAgIFVwbG9hZGVkXG4gICAgICAgICAgICAgIDwvcD5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGlucHV0XG4gICAgICAgICAgICAgIHR5cGU9XCJmaWxlXCJcbiAgICAgICAgICAgICAgI2ZpbGVJbnB1dFxuICAgICAgICAgICAgICAoY2hhbmdlKT1cIm9uRmlsZVNlbGVjdGVkKCRldmVudClcIlxuICAgICAgICAgICAgICBzdHlsZT1cImRpc3BsYXk6IG5vbmVcIlxuICAgICAgICAgICAgICBhY2NlcHQ9XCIucGRmLC5qcGcsLmpwZWcsLnBuZywuZG9jLC5kb2N4XCJcbiAgICAgICAgICAgIC8+XG4gICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICBjbGFzcz1cInVwbG9hZC1zdWNjZXNzX19jaGFuZ2UtYnRuXCJcbiAgICAgICAgICAgICAgKGNsaWNrKT1cImZpbGVJbnB1dC5jbGljaygpXCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgQ2hhbmdlXG4gICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgfSBAZWxzZSB7XG4gICAgICAgICAgPGRpdiBjbGFzcz1cInVwbG9hZC1zZWN0aW9uXCI+XG4gICAgICAgICAgICA8YWxtYXRhci1pY29uIFtuYW1lXT1cIidhcnJvdy11cC1vbi1zcXVhcmUnXCI+PC9hbG1hdGFyLWljb24+XG4gICAgICAgICAgICA8ZGl2IHN0eWxlPVwiZmxleDogMVwiPlxuICAgICAgICAgICAgICA8aDUgY2xhc3M9XCJ1cGxvYWQtc2VjdGlvbl9fdGl0bGVcIj5cbiAgICAgICAgICAgICAgICBVcGxvYWQgYSBkb2N1bWVudCB0byBzdXBwb3J0IHlvdXIgcmVxdWVzdFxuICAgICAgICAgICAgICA8L2g1PlxuICAgICAgICAgICAgICA8cCBjbGFzcz1cInVwbG9hZC1zZWN0aW9uX19zdWJ0aXRsZVwiPlxuICAgICAgICAgICAgICAgIFJlcXVpcmVkIHRvIHN1Ym1pdCBhbmQgdHJhY2sgeW91ciByZXF1ZXN0XG4gICAgICAgICAgICAgIDwvcD5cbiAgICAgICAgICAgICAgQGlmIChmaWxlUGlja2VkKCkgJiYgIXVwbG9hZFN1Y2Nlc3MoKSkge1xuICAgICAgICAgICAgICAgIDxwIGNsYXNzPVwidXBsb2FkLXNlY3Rpb25fX2ZpbGVuYW1lXCI+XG4gICAgICAgICAgICAgICAgICB7eyBmaWxlUGlja2VkKCk/Lm5hbWUgfX1cbiAgICAgICAgICAgICAgICA8L3A+XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgQGlmIChpc1VwbG9hZGluZygpKSB7XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInVwbG9hZC1wcm9ncmVzc1wiPlxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInVwbG9hZC1wcm9ncmVzc19fYmFyXCI+XG4gICAgICAgICAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInVwbG9hZC1wcm9ncmVzc19fZmlsbFwiXG4gICAgICAgICAgICAgICAgICAgICAgW3N0eWxlLndpZHRoLiVdPVwidXBsb2FkUHJvZ3Jlc3MoKVwiXG4gICAgICAgICAgICAgICAgICAgID48L2Rpdj5cbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJ1cGxvYWQtcHJvZ3Jlc3NfX3RleHRcIlxuICAgICAgICAgICAgICAgICAgICA+e3sgdXBsb2FkUHJvZ3Jlc3MoKSB9fSU8L3NwYW5cbiAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgICAgdHlwZT1cImZpbGVcIlxuICAgICAgICAgICAgICAjZmlsZUlucHV0XG4gICAgICAgICAgICAgIChjaGFuZ2UpPVwib25GaWxlU2VsZWN0ZWQoJGV2ZW50KVwiXG4gICAgICAgICAgICAgIHN0eWxlPVwiZGlzcGxheTogbm9uZVwiXG4gICAgICAgICAgICAgIGFjY2VwdD1cIi5wZGYsLmpwZywuanBlZywucG5nLC5kb2MsLmRvY3hcIlxuICAgICAgICAgICAgLz5cbiAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgIGNsYXNzPVwidXBsb2FkLXNlY3Rpb25fX2J1dHRvblwiXG4gICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJpc1VwbG9hZGluZygpXCJcbiAgICAgICAgICAgICAgKGNsaWNrKT1cImZpbGVJbnB1dC5jbGljaygpXCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgVXBsb2FkIGZpbGVcbiAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICB9XG5cbiAgICAgICAgQGlmIChzdWJtaXRFcnJvcigpKSB7XG4gICAgICAgICAgPGRpdiBjbGFzcz1cInN1Ym1pdC1yZXN1bHQgc3VibWl0LXJlc3VsdC0tZXJyb3JcIj5cbiAgICAgICAgICAgIDxhbG1hdGFyLWljb24gW25hbWVdPVwiJ2V4Y2xhbWF0aW9uLWNpcmNsZSdcIj48L2FsbWF0YXItaWNvbj5cbiAgICAgICAgICAgIDxwIGNsYXNzPVwic3VibWl0LXJlc3VsdF9fdGV4dFwiPnt7IHN1Ym1pdEVycm9yKCkgfX08L3A+XG4gICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICBjbGFzcz1cInN1Ym1pdC1yZXN1bHRfX3JldHJ5LWJ0blwiXG4gICAgICAgICAgICAgIChjbGljayk9XCJvblJldHJ5KClcIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICBUcnkgQWdhaW5cbiAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICB9IEBlbHNlIGlmICghc3VibWl0U3VjY2VzcygpKSB7XG4gICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICBjbGFzcz1cInN1Ym1pdC1yZXF1ZXN0LWJ0blwiXG4gICAgICAgICAgICBbZGlzYWJsZWRdPVwiIXVwbG9hZFN1Y2Nlc3MoKSB8fCBpc1N1Ym1pdHRpbmcoKVwiXG4gICAgICAgICAgICAoY2xpY2spPVwib25TdWJtaXRSZXF1ZXN0KClcIlxuICAgICAgICAgID5cbiAgICAgICAgICAgIEBpZiAoaXNTdWJtaXR0aW5nKCkpIHtcbiAgICAgICAgICAgICAgU3VibWl0dGluZy4uLlxuICAgICAgICAgICAgfSBAZWxzZSB7XG4gICAgICAgICAgICAgIFN1Ym1pdCBteSByZXF1ZXN0XG4gICAgICAgICAgICB9XG4gICAgICAgICAgPC9idXR0b24+XG4gICAgICAgIH1cbiAgICAgIDwvZGl2PlxuICAgIH1cbiAgPC9kaXY+XG59XG4iXX0=