tas-uell-sdk 0.3.0 → 0.3.1

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.
@@ -136,10 +136,10 @@ export class TasIncomingAppointmentComponent {
136
136
  }
137
137
  }
138
138
  TasIncomingAppointmentComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.3.12", ngImport: i0, type: TasIncomingAppointmentComponent, deps: [{ token: i1.TasService }], target: i0.ɵɵFactoryTarget.Component });
139
- TasIncomingAppointmentComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.3.12", type: TasIncomingAppointmentComponent, selector: "tas-incoming-appointment", inputs: { roomType: "roomType", entityId: "entityId", tenant: "tenant", businessRole: "businessRole", currentUser: "currentUser", fromDate: "fromDate", toDate: "toDate" }, outputs: { enterCall: "enterCall" }, ngImport: i0, template: "<div class=\"incoming-appointment-card\">\n <h3 class=\"card-title\">Pr\u00F3ximo turno</h3>\n\n <!-- Loading state -->\n <div class=\"card-content\" *ngIf=\"isLoading\">\n <div class=\"loading-spinner\"></div>\n </div>\n\n <!-- Empty state -->\n <div class=\"card-content empty-state\" *ngIf=\"!isLoading && appointments.length === 0\">\n <div class=\"icon-container\">\n <div class=\"icon-circle\">\n <i class=\"fa fa-calendar\" aria-hidden=\"true\"></i>\n </div>\n <span class=\"sparkle sparkle-1\">\u2726</span>\n <span class=\"sparkle sparkle-2\">\u2726</span>\n <span class=\"sparkle sparkle-3\">\u2726</span>\n <span class=\"sparkle sparkle-4\">\u2726</span>\n </div>\n <h4 class=\"empty-title\">Todav\u00EDa no ten\u00E9s turnos agendados</h4>\n <p class=\"empty-subtitle\">\n En caso de que Medicina Laboral requiera una consulta, lo ver\u00E1s en esta secci\u00F3n.\n </p>\n </div>\n\n <!-- Appointments list -->\n <div class=\"card-content appointment-state\" *ngIf=\"!isLoading && appointments.length > 0\">\n <div class=\"appointment-card\" *ngFor=\"let appt of appointments; trackBy: trackByAppointmentId\">\n <div class=\"appointment-header\">\n <tas-avatar [name]=\"getOtherParticipant(appt)\" [size]=\"48\"></tas-avatar>\n <span class=\"doctor-name\">{{ getOtherParticipant(appt) }}</span>\n </div>\n <div class=\"appointment-details\">\n <div class=\"date-time\">\n <span class=\"date\">{{ formatAppointmentDate(appt) }}</span>\n <span class=\"time\">{{ formatTimeRange(appt) }}</span>\n </div>\n <tas-btn\n *ngIf=\"shouldShowTasBtn(appt)\"\n variant=\"teal\"\n buttonLabel=\"Ingresar\"\n [roomType]=\"appt.roomType\"\n [entityId]=\"appt.entityId\"\n [tenant]=\"tenant\"\n [businessRole]=\"businessRole\"\n [currentUser]=\"currentUser\"\n ></tas-btn>\n </div>\n </div>\n </div>\n</div>\n\n", styles: [":host{display:block}.incoming-appointment-card{background:#ffffff;border-radius:12px;box-shadow:0 2px 8px #00000014;padding:24px;min-width:360px}.card-title{font-size:16px;font-weight:400;color:#6b7280;margin:0 0 24px}.card-content{display:flex;flex-direction:column;align-items:center}.loading-spinner{width:40px;height:40px;border:3px solid #e0f7fa;border-top-color:#0097a7;border-radius:50%;animation:spin 1s linear infinite}@keyframes spin{to{transform:rotate(360deg)}}.empty-state{text-align:center;padding:20px 0}.icon-container{position:relative;width:120px;height:120px;margin-bottom:24px}.icon-circle{width:100%;height:100%;background:#e0f7fa;border-radius:50%;display:flex;align-items:center;justify-content:center}.icon-circle i{font-size:40px;color:#0097a7}.sparkle{position:absolute;color:#0097a7;font-size:12px}.sparkle-1{top:10px;right:5px}.sparkle-2{top:0;right:30px}.sparkle-3{top:25px;left:0}.sparkle-4{bottom:20px;right:0}.empty-title{font-size:18px;font-weight:600;color:#1f2937;margin:0 0 12px}.empty-subtitle{font-size:14px;color:#6b7280;margin:0;max-width:320px;line-height:1.5}.appointment-state{align-items:stretch;gap:16px}.appointment-card{border-radius:12px;border:1px solid var(--Primary-White-Uell50, #8ED1D8);background:#F1FAFA;padding:1.5rem}.appointment-header{display:flex;align-items:center;gap:12px;margin-bottom:16px}.doctor-name{overflow:hidden;color:var(--Neutral-GreyDark, #383E52);text-overflow:ellipsis;font-size:16px;font-style:normal;font-weight:600;line-height:24px;letter-spacing:.016px}.appointment-details{display:flex;justify-content:space-between;align-items:flex-end}.date-time{display:flex;flex-direction:column;gap:4px}.date{color:var(--Neutral-GreyDark, #383E52);font-size:12px;font-style:normal;font-weight:600;line-height:16px;letter-spacing:.06px}.time{font-size:14px;color:var(--Neutral-GreyDark, #383E52);font-family:Inter;font-size:10px;font-style:normal;font-weight:400;line-height:14px;letter-spacing:.04px}\n"], components: [{ type: i2.TasAvatarComponent, selector: "tas-avatar", inputs: ["name", "size"] }, { type: i3.TasButtonComponent, selector: "tas-btn", inputs: ["roomType", "entityId", "tenant", "businessRole", "currentUser", "variant", "buttonLabel"] }], directives: [{ type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i4.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }] });
139
+ TasIncomingAppointmentComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.3.12", type: TasIncomingAppointmentComponent, selector: "tas-incoming-appointment", inputs: { roomType: "roomType", entityId: "entityId", tenant: "tenant", businessRole: "businessRole", currentUser: "currentUser", fromDate: "fromDate", toDate: "toDate" }, outputs: { enterCall: "enterCall" }, ngImport: i0, template: "<div class=\"incoming-appointment-card\">\n <h3 class=\"card-title\">Pr\u00F3ximo turno</h3>\n\n <!-- Loading state -->\n <div class=\"card-content\" *ngIf=\"isLoading\">\n <div class=\"loading-spinner\"></div>\n </div>\n\n <!-- Empty state -->\n <div class=\"card-content empty-state\" *ngIf=\"!isLoading && appointments.length === 0\">\n <div class=\"icon-container\">\n <div class=\"icon-circle\">\n <i class=\"fa fa-calendar\" aria-hidden=\"true\"></i>\n </div>\n <span class=\"sparkle sparkle-1\">\u2726</span>\n <span class=\"sparkle sparkle-2\">\u2726</span>\n <span class=\"sparkle sparkle-3\">\u2726</span>\n <span class=\"sparkle sparkle-4\">\u2726</span>\n </div>\n <h4 class=\"empty-title\">Todav\u00EDa no ten\u00E9s turnos agendados</h4>\n <p class=\"empty-subtitle\">\n En caso de que Medicina Laboral requiera una consulta, lo ver\u00E1s en esta secci\u00F3n.\n </p>\n </div>\n\n <!-- Appointments list -->\n <div class=\"card-content appointment-state\" *ngIf=\"!isLoading && appointments.length > 0\">\n <div class=\"appointment-card\" [ngClass]=\"{ 'cancelled': appt.status === 'CANCELLED' || appt.status === 'RESCHEDULED' }\" *ngFor=\"let appt of appointments; trackBy: trackByAppointmentId\">\n <div class=\"appointment-header\">\n <tas-avatar [name]=\"getOtherParticipant(appt)\" [size]=\"48\"></tas-avatar>\n <span class=\"doctor-name\">{{ getOtherParticipant(appt) }}</span>\n </div>\n <div class=\"appointment-details\">\n <div class=\"date-time\" [ngClass]=\"{ 'compact': !shouldShowTasBtn(appt), 'cancelled': appt.status === 'CANCELLED' || appt.status === 'RESCHEDULED' }\">\n <span class=\"date\">{{ formatAppointmentDate(appt) }}</span>\n <span class=\"time\">{{ formatTimeRange(appt) }}</span>\n </div>\n <tas-btn\n *ngIf=\"shouldShowTasBtn(appt)\"\n variant=\"teal\"\n buttonLabel=\"Ingresar\"\n [roomType]=\"appt.roomType\"\n [entityId]=\"appt.entityId\"\n [tenant]=\"tenant\"\n [businessRole]=\"businessRole\"\n [currentUser]=\"currentUser\"\n ></tas-btn>\n </div>\n </div>\n </div>\n</div>\n\n", styles: ["@charset \"UTF-8\";:host{display:block}.incoming-appointment-card{background:#ffffff;border-radius:12px;box-shadow:0 2px 8px #00000014;padding:24px;min-width:360px}.card-title{font-size:16px;font-weight:400;color:#6b7280;margin:0 0 24px}.card-content{display:flex;flex-direction:column;align-items:center}.loading-spinner{width:40px;height:40px;border:3px solid #e0f7fa;border-top-color:#0097a7;border-radius:50%;animation:spin 1s linear infinite}@keyframes spin{to{transform:rotate(360deg)}}.empty-state{text-align:center;padding:20px 0}.icon-container{position:relative;width:120px;height:120px;margin-bottom:24px}.icon-circle{width:100%;height:100%;background:#e0f7fa;border-radius:50%;display:flex;align-items:center;justify-content:center}.icon-circle i{font-size:40px;color:#0097a7}.sparkle{position:absolute;color:#0097a7;font-size:12px}.sparkle-1{top:10px;right:5px}.sparkle-2{top:0;right:30px}.sparkle-3{top:25px;left:0}.sparkle-4{bottom:20px;right:0}.empty-title{font-size:18px;font-weight:600;color:#1f2937;margin:0 0 12px}.empty-subtitle{font-size:14px;color:#6b7280;margin:0;max-width:320px;line-height:1.5}.appointment-state{align-items:stretch;gap:16px}.appointment-card{border-radius:12px;border:1px solid var(--Primary-White-Uell50, #8ED1D8);background:#F1FAFA;padding:1.5rem}.appointment-header{display:flex;align-items:center;gap:12px;margin-bottom:16px}.doctor-name{overflow:hidden;color:var(--Neutral-GreyDark, #383E52);text-overflow:ellipsis;font-size:16px;font-style:normal;font-weight:600;line-height:24px;letter-spacing:.016px}.appointment-details{display:flex;justify-content:space-between;align-items:flex-end}.date-time{display:flex;flex-direction:column;gap:4px}.date{color:var(--Neutral-GreyDark, #383E52);font-size:12px;font-style:normal;font-weight:600;line-height:16px;letter-spacing:.06px}.time{font-size:14px;color:var(--Neutral-GreyDark, #383E52);font-family:Inter;font-size:10px;font-style:normal;font-weight:400;line-height:14px;letter-spacing:.04px}.date-time.compact{flex-direction:row;align-items:center;gap:8px}.date-time.compact .date:after{content:\"\\b7\";margin-left:8px}.date-time.cancelled{color:#8a95ab}.date-time.cancelled .date{color:#8a95ab;text-decoration:line-through;font-size:14px}.date-time.cancelled .time{color:#8a95ab;text-decoration:line-through;font-size:12px}.appointment-card.cancelled{background:#f3f4f6;border:none}.appointment-card.cancelled .doctor-name{color:#8a95ab;text-decoration:line-through}.appointment-card.cancelled tas-avatar ::ng-deep .avatar{box-shadow:none}\n"], components: [{ type: i2.TasAvatarComponent, selector: "tas-avatar", inputs: ["name", "size"] }, { type: i3.TasButtonComponent, selector: "tas-btn", inputs: ["roomType", "entityId", "tenant", "businessRole", "currentUser", "variant", "buttonLabel"] }], directives: [{ type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i4.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { type: i4.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }] });
140
140
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.12", ngImport: i0, type: TasIncomingAppointmentComponent, decorators: [{
141
141
  type: Component,
142
- args: [{ selector: 'tas-incoming-appointment', template: "<div class=\"incoming-appointment-card\">\n <h3 class=\"card-title\">Pr\u00F3ximo turno</h3>\n\n <!-- Loading state -->\n <div class=\"card-content\" *ngIf=\"isLoading\">\n <div class=\"loading-spinner\"></div>\n </div>\n\n <!-- Empty state -->\n <div class=\"card-content empty-state\" *ngIf=\"!isLoading && appointments.length === 0\">\n <div class=\"icon-container\">\n <div class=\"icon-circle\">\n <i class=\"fa fa-calendar\" aria-hidden=\"true\"></i>\n </div>\n <span class=\"sparkle sparkle-1\">\u2726</span>\n <span class=\"sparkle sparkle-2\">\u2726</span>\n <span class=\"sparkle sparkle-3\">\u2726</span>\n <span class=\"sparkle sparkle-4\">\u2726</span>\n </div>\n <h4 class=\"empty-title\">Todav\u00EDa no ten\u00E9s turnos agendados</h4>\n <p class=\"empty-subtitle\">\n En caso de que Medicina Laboral requiera una consulta, lo ver\u00E1s en esta secci\u00F3n.\n </p>\n </div>\n\n <!-- Appointments list -->\n <div class=\"card-content appointment-state\" *ngIf=\"!isLoading && appointments.length > 0\">\n <div class=\"appointment-card\" *ngFor=\"let appt of appointments; trackBy: trackByAppointmentId\">\n <div class=\"appointment-header\">\n <tas-avatar [name]=\"getOtherParticipant(appt)\" [size]=\"48\"></tas-avatar>\n <span class=\"doctor-name\">{{ getOtherParticipant(appt) }}</span>\n </div>\n <div class=\"appointment-details\">\n <div class=\"date-time\">\n <span class=\"date\">{{ formatAppointmentDate(appt) }}</span>\n <span class=\"time\">{{ formatTimeRange(appt) }}</span>\n </div>\n <tas-btn\n *ngIf=\"shouldShowTasBtn(appt)\"\n variant=\"teal\"\n buttonLabel=\"Ingresar\"\n [roomType]=\"appt.roomType\"\n [entityId]=\"appt.entityId\"\n [tenant]=\"tenant\"\n [businessRole]=\"businessRole\"\n [currentUser]=\"currentUser\"\n ></tas-btn>\n </div>\n </div>\n </div>\n</div>\n\n", styles: [":host{display:block}.incoming-appointment-card{background:#ffffff;border-radius:12px;box-shadow:0 2px 8px #00000014;padding:24px;min-width:360px}.card-title{font-size:16px;font-weight:400;color:#6b7280;margin:0 0 24px}.card-content{display:flex;flex-direction:column;align-items:center}.loading-spinner{width:40px;height:40px;border:3px solid #e0f7fa;border-top-color:#0097a7;border-radius:50%;animation:spin 1s linear infinite}@keyframes spin{to{transform:rotate(360deg)}}.empty-state{text-align:center;padding:20px 0}.icon-container{position:relative;width:120px;height:120px;margin-bottom:24px}.icon-circle{width:100%;height:100%;background:#e0f7fa;border-radius:50%;display:flex;align-items:center;justify-content:center}.icon-circle i{font-size:40px;color:#0097a7}.sparkle{position:absolute;color:#0097a7;font-size:12px}.sparkle-1{top:10px;right:5px}.sparkle-2{top:0;right:30px}.sparkle-3{top:25px;left:0}.sparkle-4{bottom:20px;right:0}.empty-title{font-size:18px;font-weight:600;color:#1f2937;margin:0 0 12px}.empty-subtitle{font-size:14px;color:#6b7280;margin:0;max-width:320px;line-height:1.5}.appointment-state{align-items:stretch;gap:16px}.appointment-card{border-radius:12px;border:1px solid var(--Primary-White-Uell50, #8ED1D8);background:#F1FAFA;padding:1.5rem}.appointment-header{display:flex;align-items:center;gap:12px;margin-bottom:16px}.doctor-name{overflow:hidden;color:var(--Neutral-GreyDark, #383E52);text-overflow:ellipsis;font-size:16px;font-style:normal;font-weight:600;line-height:24px;letter-spacing:.016px}.appointment-details{display:flex;justify-content:space-between;align-items:flex-end}.date-time{display:flex;flex-direction:column;gap:4px}.date{color:var(--Neutral-GreyDark, #383E52);font-size:12px;font-style:normal;font-weight:600;line-height:16px;letter-spacing:.06px}.time{font-size:14px;color:var(--Neutral-GreyDark, #383E52);font-family:Inter;font-size:10px;font-style:normal;font-weight:400;line-height:14px;letter-spacing:.04px}\n"] }]
142
+ args: [{ selector: 'tas-incoming-appointment', template: "<div class=\"incoming-appointment-card\">\n <h3 class=\"card-title\">Pr\u00F3ximo turno</h3>\n\n <!-- Loading state -->\n <div class=\"card-content\" *ngIf=\"isLoading\">\n <div class=\"loading-spinner\"></div>\n </div>\n\n <!-- Empty state -->\n <div class=\"card-content empty-state\" *ngIf=\"!isLoading && appointments.length === 0\">\n <div class=\"icon-container\">\n <div class=\"icon-circle\">\n <i class=\"fa fa-calendar\" aria-hidden=\"true\"></i>\n </div>\n <span class=\"sparkle sparkle-1\">\u2726</span>\n <span class=\"sparkle sparkle-2\">\u2726</span>\n <span class=\"sparkle sparkle-3\">\u2726</span>\n <span class=\"sparkle sparkle-4\">\u2726</span>\n </div>\n <h4 class=\"empty-title\">Todav\u00EDa no ten\u00E9s turnos agendados</h4>\n <p class=\"empty-subtitle\">\n En caso de que Medicina Laboral requiera una consulta, lo ver\u00E1s en esta secci\u00F3n.\n </p>\n </div>\n\n <!-- Appointments list -->\n <div class=\"card-content appointment-state\" *ngIf=\"!isLoading && appointments.length > 0\">\n <div class=\"appointment-card\" [ngClass]=\"{ 'cancelled': appt.status === 'CANCELLED' || appt.status === 'RESCHEDULED' }\" *ngFor=\"let appt of appointments; trackBy: trackByAppointmentId\">\n <div class=\"appointment-header\">\n <tas-avatar [name]=\"getOtherParticipant(appt)\" [size]=\"48\"></tas-avatar>\n <span class=\"doctor-name\">{{ getOtherParticipant(appt) }}</span>\n </div>\n <div class=\"appointment-details\">\n <div class=\"date-time\" [ngClass]=\"{ 'compact': !shouldShowTasBtn(appt), 'cancelled': appt.status === 'CANCELLED' || appt.status === 'RESCHEDULED' }\">\n <span class=\"date\">{{ formatAppointmentDate(appt) }}</span>\n <span class=\"time\">{{ formatTimeRange(appt) }}</span>\n </div>\n <tas-btn\n *ngIf=\"shouldShowTasBtn(appt)\"\n variant=\"teal\"\n buttonLabel=\"Ingresar\"\n [roomType]=\"appt.roomType\"\n [entityId]=\"appt.entityId\"\n [tenant]=\"tenant\"\n [businessRole]=\"businessRole\"\n [currentUser]=\"currentUser\"\n ></tas-btn>\n </div>\n </div>\n </div>\n</div>\n\n", styles: ["@charset \"UTF-8\";:host{display:block}.incoming-appointment-card{background:#ffffff;border-radius:12px;box-shadow:0 2px 8px #00000014;padding:24px;min-width:360px}.card-title{font-size:16px;font-weight:400;color:#6b7280;margin:0 0 24px}.card-content{display:flex;flex-direction:column;align-items:center}.loading-spinner{width:40px;height:40px;border:3px solid #e0f7fa;border-top-color:#0097a7;border-radius:50%;animation:spin 1s linear infinite}@keyframes spin{to{transform:rotate(360deg)}}.empty-state{text-align:center;padding:20px 0}.icon-container{position:relative;width:120px;height:120px;margin-bottom:24px}.icon-circle{width:100%;height:100%;background:#e0f7fa;border-radius:50%;display:flex;align-items:center;justify-content:center}.icon-circle i{font-size:40px;color:#0097a7}.sparkle{position:absolute;color:#0097a7;font-size:12px}.sparkle-1{top:10px;right:5px}.sparkle-2{top:0;right:30px}.sparkle-3{top:25px;left:0}.sparkle-4{bottom:20px;right:0}.empty-title{font-size:18px;font-weight:600;color:#1f2937;margin:0 0 12px}.empty-subtitle{font-size:14px;color:#6b7280;margin:0;max-width:320px;line-height:1.5}.appointment-state{align-items:stretch;gap:16px}.appointment-card{border-radius:12px;border:1px solid var(--Primary-White-Uell50, #8ED1D8);background:#F1FAFA;padding:1.5rem}.appointment-header{display:flex;align-items:center;gap:12px;margin-bottom:16px}.doctor-name{overflow:hidden;color:var(--Neutral-GreyDark, #383E52);text-overflow:ellipsis;font-size:16px;font-style:normal;font-weight:600;line-height:24px;letter-spacing:.016px}.appointment-details{display:flex;justify-content:space-between;align-items:flex-end}.date-time{display:flex;flex-direction:column;gap:4px}.date{color:var(--Neutral-GreyDark, #383E52);font-size:12px;font-style:normal;font-weight:600;line-height:16px;letter-spacing:.06px}.time{font-size:14px;color:var(--Neutral-GreyDark, #383E52);font-family:Inter;font-size:10px;font-style:normal;font-weight:400;line-height:14px;letter-spacing:.04px}.date-time.compact{flex-direction:row;align-items:center;gap:8px}.date-time.compact .date:after{content:\"\\b7\";margin-left:8px}.date-time.cancelled{color:#8a95ab}.date-time.cancelled .date{color:#8a95ab;text-decoration:line-through;font-size:14px}.date-time.cancelled .time{color:#8a95ab;text-decoration:line-through;font-size:12px}.appointment-card.cancelled{background:#f3f4f6;border:none}.appointment-card.cancelled .doctor-name{color:#8a95ab;text-decoration:line-through}.appointment-card.cancelled tas-avatar ::ng-deep .avatar{box-shadow:none}\n"] }]
143
143
  }], ctorParameters: function () { return [{ type: i1.TasService }]; }, propDecorators: { roomType: [{
144
144
  type: Input
145
145
  }], entityId: [{
@@ -157,4 +157,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.12", ngImpo
157
157
  }], enterCall: [{
158
158
  type: Output
159
159
  }] } });
160
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFzLWluY29taW5nLWFwcG9pbnRtZW50LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3Rhcy11ZWxsLXNkay9zcmMvbGliL2NvbXBvbmVudHMvdGFzLWluY29taW5nLWFwcG9pbnRtZW50L3Rhcy1pbmNvbWluZy1hcHBvaW50bWVudC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy90YXMtdWVsbC1zZGsvc3JjL2xpYi9jb21wb25lbnRzL3Rhcy1pbmNvbWluZy1hcHBvaW50bWVudC90YXMtaW5jb21pbmctYXBwb2ludG1lbnQuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNMLFNBQVMsRUFHVCxLQUFLLEVBQ0wsTUFBTSxFQUNOLFlBQVksR0FDYixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBRXBDLE9BQU8sRUFFTCxpQkFBaUIsRUFDakIsV0FBVyxFQUNYLGVBQWUsR0FFaEIsTUFBTSxpQ0FBaUMsQ0FBQzs7Ozs7O0FBT3pDLE1BQU0sT0FBTywrQkFBK0I7SUF1QjFDLFlBQW9CLFVBQXNCO1FBQXRCLGVBQVUsR0FBVixVQUFVLENBQVk7UUF0QjFDLGlDQUFpQztRQUN4QixhQUFRLEdBQWdCLFdBQVcsQ0FBQyxHQUFHLENBQUM7UUFHeEMsaUJBQVksR0FBb0IsZUFBZSxDQUFDLElBQUksQ0FBQztRQU9wRCxjQUFTLEdBQUcsSUFBSSxZQUFZLEVBQWtCLENBQUM7UUFFbEQsaUJBQVksR0FBcUIsRUFBRSxDQUFDO1FBQ3BDLGNBQVMsR0FBRyxJQUFJLENBQUM7UUFDakIsYUFBUSxHQUFHLEtBQUssQ0FBQztRQUV4QiwwRUFBMEU7UUFDbkUsd0JBQW1CLEdBQWtCLElBQUksQ0FBQztRQUV6QyxrQkFBYSxHQUFHLElBQUksWUFBWSxFQUFFLENBQUM7SUFF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b250ZW50IjpbImltcG9ydCB7XG4gIENvbXBvbmVudCxcbiAgT25Jbml0LFxuICBPbkRlc3Ryb3ksXG4gIElucHV0LFxuICBPdXRwdXQsXG4gIEV2ZW50RW1pdHRlcixcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBTdWJzY3JpcHRpb24gfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IFRhc1NlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy90YXMuc2VydmljZSc7XG5pbXBvcnQge1xuICBUYXNBcHBvaW50bWVudCxcbiAgQXBwb2ludG1lbnRTdGF0dXMsXG4gIFRhc1Jvb21UeXBlLFxuICBUYXNCdXNpbmVzc1JvbGUsXG4gIFRhc0N1cnJlbnRVc2VyLFxufSBmcm9tICcuLi8uLi9pbnRlcmZhY2VzL3Rhcy5pbnRlcmZhY2VzJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAndGFzLWluY29taW5nLWFwcG9pbnRtZW50JyxcbiAgdGVtcGxhdGVVcmw6ICcuL3Rhcy1pbmNvbWluZy1hcHBvaW50bWVudC5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL3Rhcy1pbmNvbWluZy1hcHBvaW50bWVudC5jb21wb25lbnQuc2NzcyddLFxufSlcbmV4cG9ydCBjbGFzcyBUYXNJbmNvbWluZ0FwcG9pbnRtZW50Q29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBPbkRlc3Ryb3kge1xuICAvLyBQYXNzdGhyb3VnaCBpbnB1dHMgZm9yIHRhcy1idG5cbiAgQElucHV0KCkgcm9vbVR5cGU6IFRhc1Jvb21UeXBlID0gVGFzUm9vbVR5cGUuVEFTO1xuICBASW5wdXQoKSBlbnRpdHlJZCE6IG51bWJlcjtcbiAgQElucHV0KCkgdGVuYW50ITogc3RyaW5nO1xuICBASW5wdXQoKSBidXNpbmVzc1JvbGU6IFRhc0J1c2luZXNzUm9sZSA9IFRhc0J1c2luZXNzUm9sZS5VU0VSO1xuICBASW5wdXQoKSBjdXJyZW50VXNlciE6IFRhc0N1cnJlbnRVc2VyO1xuICBcbiAgLy8gRGF0ZSByYW5nZSBpbnB1dHMgZm9yIGZldGNoaW5nIGFwcG9pbnRtZW50c1xuICBASW5wdXQoKSBmcm9tRGF0ZSE6IHN0cmluZzsgLy8gWVlZWS1NTS1ERCBmb3JtYXRcbiAgQElucHV0KCkgdG9EYXRlITogc3RyaW5nOyAgIC8vIFlZWVktTU0tREQgZm9ybWF0XG5cbiAgQE91dHB1dCgpIGVudGVyQ2FsbCA9IG5ldyBFdmVudEVtaXR0ZXI8VGFzQXBwb2ludG1lbnQ+KCk7XG5cbiAgcHVibGljIGFwcG9pbnRtZW50czogVGFzQXBwb2ludG1lbnRbXSA9IFtdO1xuICBwdWJsaWMgaXNMb2FkaW5nID0gdHJ1ZTtcbiAgcHVibGljIGhhc0Vycm9yID0gZmFsc2U7XG5cbiAgLy8gVGhlIGFwcG9pbnRtZW50SWQgZnJvbSBzdGF0dXMgQVBJIC0gb25seSB0aGlzIGFwcG9pbnRtZW50IHNob3dzIHRhcy1idG5cbiAgcHVibGljIGFjdGl2ZUFwcG9pbnRtZW50SWQ6IG51bWJlciB8IG51bGwgPSBudWxsO1xuXG4gIHByaXZhdGUgc3Vic2NyaXB0aW9ucyA9IG5ldyBTdWJzY3JpcHRpb24oKTtcblxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIHRhc1NlcnZpY2U6IFRhc1NlcnZpY2UpIHt9XG5cbiAgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgdGhpcy5sb2FkQXBwb2ludG1lbnRzKCk7XG4gICAgdGhpcy5jaGVja1N0YXR1cygpO1xuICB9XG5cbiAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgdGhpcy5zdWJzY3JpcHRpb25zLnVuc3Vic2NyaWJlKCk7XG4gIH1cblxuICBwcml2YXRlIGxvYWRBcHBvaW50bWVudHMoKTogdm9pZCB7XG4gICAgdGhpcy5zdWJzY3JpcHRpb25zLmFkZChcbiAgICAgIHRoaXMudGFzU2VydmljZVxuICAgICAgICAuZ2V0QXBwb2ludG1lbnRzKHsgXG4gICAgICAgICAgZnJvbURhdGU6IHRoaXMuZnJvbURhdGUsIFxuICAgICAgICAgIHRvRGF0ZTogdGhpcy50b0RhdGUsIFxuICAgICAgICAgIGVudGl0eUlkOiB0aGlzLmVudGl0eUlkIFxuICAgICAgICB9KVxuICAgICAgICAuc3Vic2NyaWJlKHtcbiAgICAgICAgICBuZXh0OiAocmVzcG9uc2U6IGFueSkgPT4ge1xuICAgICAgICAgICAgLy8gSGFuZGxlIGJvdGggYXJyYXkgcmVzcG9uc2UgYW5kIHdyYXBwZWQgcmVzcG9uc2UgKGUuZy4sIHsgY29udGVudDogWy4uLl0gfSlcbiAgICAgICAgICAgIGNvbnN0IGFwcG9pbnRtZW50cyA9IEFycmF5LmlzQXJyYXkocmVzcG9uc2UpXG4gICAgICAgICAgICAgID8gcmVzcG9uc2VcbiAgICAgICAgICAgICAgOiByZXNwb25zZT8uY29udGVudCB8fCBbXTtcbiAgICAgICAgICAgIFxuICAgICAgICAgICAgLy8gRGVkdXBsaWNhdGUgYnkgaWQgYW5kIHNvcnQgYnkgZGF0ZSBhbmQgc3RhcnRUaW1lIGFzY2VuZGluZyAoZWFybGllc3QgZmlyc3QpXG4gICAgICAgICAgICBjb25zdCB1bmlxdWVBcHBvaW50bWVudHMgPSBhcHBvaW50bWVudHMuZmlsdGVyKFxuICAgICAgICAgICAgICAoYXBwdDogVGFzQXBwb2ludG1lbnQsIGluZGV4OiBudW1iZXIsIHNlbGY6IFRhc0FwcG9pbnRtZW50W10pID0+XG4gICAgICAgICAgICAgICAgaW5kZXggPT09IHNlbGYuZmluZEluZGV4KChhOiBUYXNBcHBvaW50bWVudCkgPT4gYS5pZCA9PT0gYXBwdC5pZClcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICB0aGlzLmFwcG9pbnRtZW50cyA9IHVuaXF1ZUFwcG9pbnRtZW50cy5zb3J0KChhOiBUYXNBcHBvaW50bWVudCwgYjogVGFzQXBwb2ludG1lbnQpID0+IHtcbiAgICAgICAgICAgICAgY29uc3QgZGF0ZVRpbWVBID0gYCR7YS5kYXRlfVQke2Euc3RhcnRUaW1lfWA7XG4gICAgICAgICAgICAgIGNvbnN0IGRhdGVUaW1lQiA9IGAke2IuZGF0ZX1UJHtiLnN0YXJ0VGltZX1gO1xuICAgICAgICAgICAgICByZXR1cm4gZGF0ZVRpbWVCLmxvY2FsZUNvbXBhcmUoZGF0ZVRpbWVBKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgdGhpcy5pc0xvYWRpbmcgPSBmYWxzZTtcbiAgICAgICAgICB9LFxuICAgICAgICAgIGVycm9yOiAoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLmhhc0Vycm9yID0gdHJ1ZTtcbiAgICAgICAgICAgIHRoaXMuaXNMb2FkaW5nID0gZmFsc2U7XG4gICAgICAgICAgfSxcbiAgICAgICAgfSlcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrIHN0YXR1cyBlbmRwb2ludCB0byBnZXQgdGhlIGFjdGl2ZSBhcHBvaW50bWVudElkXG4gICAqL1xuICBwcml2YXRlIGNoZWNrU3RhdHVzKCk6IHZvaWQge1xuICAgIGlmICghdGhpcy50ZW5hbnQgfHwgIXRoaXMuZW50aXR5SWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLnN1YnNjcmlwdGlvbnMuYWRkKFxuICAgICAgdGhpcy50YXNTZXJ2aWNlXG4gICAgICAgIC5nZXRQcm94eVZpZGVvU3RhdHVzKHtcbiAgICAgICAgICByb29tVHlwZTogdGhpcy5yb29tVHlwZSxcbiAgICAgICAgICBlbnRpdHlJZDogdGhpcy5lbnRpdHlJZCxcbiAgICAgICAgICB0ZW5hbnQ6IHRoaXMudGVuYW50LFxuICAgICAgICAgIGJ1c2luZXNzUm9sZTogdGhpcy5idXNpbmVzc1JvbGUsXG4gICAgICAgIH0pXG4gICAgICAgIC5zdWJzY3JpYmUoe1xuICAgICAgICAgIG5leHQ6IChyZXNwb25zZSkgPT4ge1xuICAgICAgICAgICAgLy8gU3RvcmUgdGhlIGFwcG9pbnRtZW50SWQgZnJvbSBzdGF0dXMgLSB0YXMtYnRuIG9ubHkgc2hvd3MgZm9yIHRoaXMgb25lXG4gICAgICAgICAgICB0aGlzLmFjdGl2ZUFwcG9pbnRtZW50SWQgPSByZXNwb25zZT8uY29udGVudD8uYXBwb2ludG1lbnRJZCA/PyBudWxsO1xuICAgICAgICAgIH0sXG4gICAgICAgICAgZXJyb3I6ICgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuYWN0aXZlQXBwb2ludG1lbnRJZCA9IG51bGw7XG4gICAgICAgICAgfSxcbiAgICAgICAgfSlcbiAgICApO1xuICB9XG5cbiAgcHVibGljIG9uRW50ZXJDYWxsKGFwcG9pbnRtZW50OiBUYXNBcHBvaW50bWVudCk6IHZvaWQge1xuICAgIHRoaXMuZW50ZXJDYWxsLmVtaXQoYXBwb2ludG1lbnQpO1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrIGlmIHRhcy1idG4gc2hvdWxkIGJlIHNob3duIGZvciBhbiBhcHBvaW50bWVudC5cbiAgICogT25seSBzaG93cyB3aGVuIGFwcG9pbnRtZW50LmlkIG1hdGNoZXMgdGhlIGFjdGl2ZUFwcG9pbnRtZW50SWQgZnJvbSBzdGF0dXMgQVBJLlxuICAgKiB0YXMtYnRuIGhhbmRsZXMgaXRzIG93biBwb2xsaW5nIGZvciBqb2luYWJsZSBzdGF0ZS5cbiAgICovXG4gIHB1YmxpYyBzaG91bGRTaG93VGFzQnRuKGFwcG9pbnRtZW50OiBUYXNBcHBvaW50bWVudCk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IGhhc1ZhbGlkU3RhdHVzID0gYXBwb2ludG1lbnQuc3RhdHVzID09PSBBcHBvaW50bWVudFN0YXR1cy5DT05GSVJNRUQgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgYXBwb2ludG1lbnQuc3RhdHVzID09PSBBcHBvaW50bWVudFN0YXR1cy5BQ1RJVkU7XG4gICAgXG4gICAgLy8gT25seSBzaG93IGZvciB0aGUgYXBwb2ludG1lbnQgdGhhdCBtYXRjaGVzIHN0YXR1cyBBUEkgcmVzcG9uc2VcbiAgICByZXR1cm4gaGFzVmFsaWRTdGF0dXMgJiYgYXBwb2ludG1lbnQuaWQgPT09IHRoaXMuYWN0aXZlQXBwb2ludG1lbnRJZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBUcmFja0J5IGZ1bmN0aW9uIGZvciBuZ0ZvclxuICAgKi9cbiAgcHVibGljIHRyYWNrQnlBcHBvaW50bWVudElkKGluZGV4OiBudW1iZXIsIGFwcG9pbnRtZW50OiBUYXNBcHBvaW50bWVudCk6IG51bWJlciB7XG4gICAgcmV0dXJuIGFwcG9pbnRtZW50LmlkO1xuICB9XG5cbiAgLyoqXG4gICAqIEZvcm1hdCBkYXRlIHRvIFNwYW5pc2ggZm9ybWF0OiBcIkx1bmVzIDggZGUgZGljaWVtYnJlXCJcbiAgICovXG4gIHB1YmxpYyBmb3JtYXRBcHBvaW50bWVudERhdGUoYXBwb2ludG1lbnQ6IFRhc0FwcG9pbnRtZW50KTogc3RyaW5nIHtcbiAgICBjb25zdCBbeWVhciwgbW9udGgsIGRheV0gPSBhcHBvaW50bWVudC5kYXRlLnNwbGl0KCctJykubWFwKE51bWJlcik7XG4gICAgY29uc3QgZGF0ZSA9IG5ldyBEYXRlKHllYXIsIG1vbnRoIC0gMSwgZGF5KTtcblxuICAgIGNvbnN0IGRheU5hbWVzID0gW1xuICAgICAgJ0RvbWluZ28nLCAnTHVuZXMnLCAnTWFydGVzJywgJ01pw6lyY29sZXMnLFxuICAgICAgJ0p1ZXZlcycsICdWaWVybmVzJywgJ1PDoWJhZG8nXG4gICAgXTtcbiAgICBjb25zdCBtb250aE5hbWVzID0gW1xuICAgICAgJ2VuZXJvJywgJ2ZlYnJlcm8nLCAnbWFyem8nLCAnYWJyaWwnLCAnbWF5bycsICdqdW5pbycsXG4gICAgICAnanVsaW8nLCAnYWdvc3RvJywgJ3NlcHRpZW1icmUnLCAnb2N0dWJyZScsICdub3ZpZW1icmUnLCAnZGljaWVtYnJlJ1xuICAgIF07XG5cbiAgICBjb25zdCBkYXlOYW1lID0gZGF5TmFtZXNbZGF0ZS5nZXREYXkoKV07XG4gICAgY29uc3QgZGF5TnVtID0gZGF0ZS5nZXREYXRlKCk7XG4gICAgY29uc3QgbW9udGhOYW1lID0gbW9udGhOYW1lc1tkYXRlLmdldE1vbnRoKCldO1xuXG4gICAgcmV0dXJuIGAke2RheU5hbWV9ICR7ZGF5TnVtfSBkZSAke21vbnRoTmFtZX1gO1xuICB9XG5cbiAgLyoqXG4gICAqIEZvcm1hdCB0aW1lIHJhbmdlOiBcIjk6MDAgLSA5OjMwXCJcbiAgICovXG4gIHB1YmxpYyBmb3JtYXRUaW1lUmFuZ2UoYXBwb2ludG1lbnQ6IFRhc0FwcG9pbnRtZW50KTogc3RyaW5nIHtcbiAgICByZXR1cm4gYCR7YXBwb2ludG1lbnQuc3RhcnRUaW1lfSAtICR7YXBwb2ludG1lbnQuZW5kVGltZX1gO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgb3RoZXIgcGFydGljaXBhbnQgaW4gdGhlIGNhbGwgKG5vdCB0aGUgY3VycmVudCB1c2VyKVxuICAgKi9cbiAgcHVibGljIGdldE90aGVyUGFydGljaXBhbnQoYXBwb2ludG1lbnQ6IFRhc0FwcG9pbnRtZW50KTogc3RyaW5nIHtcbiAgICBpZiAoIWFwcG9pbnRtZW50LnBhcnRpY2lwYW50cyB8fCBhcHBvaW50bWVudC5wYXJ0aWNpcGFudHMubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm4gYXBwb2ludG1lbnQudGl0bGU7XG4gICAgfVxuICAgIFxuICAgIGNvbnN0IG90aGVyUGFydGljaXBhbnQgPSBhcHBvaW50bWVudC5wYXJ0aWNpcGFudHMuZmluZChcbiAgICAgIHAgPT4gcC51c2VySWQgIT09IHRoaXMuY3VycmVudFVzZXI/LmlkXG4gICAgKTtcbiAgICBcbiAgICByZXR1cm4gb3RoZXJQYXJ0aWNpcGFudD8ubmFtZSB8fCBhcHBvaW50bWVudC50aXRsZTtcbiAgfVxufVxuXG4iLCI8ZGl2IGNsYXNzPVwiaW5jb21pbmctYXBwb2ludG1lbnQtY2FyZFwiPlxuICA8aDMgY2xhc3M9XCJjYXJkLXRpdGxlXCI+UHLDs3hpbW8gdHVybm88L2gzPlxuXG4gIDwhLS0gTG9hZGluZyBzdGF0ZSAtLT5cbiAgPGRpdiBjbGFzcz1cImNhcmQtY29udGVudFwiICpuZ0lmPVwiaXNMb2FkaW5nXCI+XG4gICAgPGRpdiBjbGFzcz1cImxvYWRpbmctc3Bpbm5lclwiPjwvZGl2PlxuICA8L2Rpdj5cblxuICA8IS0tIEVtcHR5IHN0YXRlIC0tPlxuICA8ZGl2IGNsYXNzPVwiY2FyZC1jb250ZW50IGVtcHR5LXN0YXRlXCIgKm5nSWY9XCIhaXNMb2FkaW5nICYmIGFwcG9pbnRtZW50cy5sZW5ndGggPT09IDBcIj5cbiAgICA8ZGl2IGNsYXNzPVwiaWNvbi1jb250YWluZXJcIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJpY29uLWNpcmNsZVwiPlxuICAgICAgICA8aSBjbGFzcz1cImZhIGZhLWNhbGVuZGFyXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+PC9pPlxuICAgICAgPC9kaXY+XG4gICAgICA8c3BhbiBjbGFzcz1cInNwYXJrbGUgc3BhcmtsZS0xXCI+4pymPC9zcGFuPlxuICAgICAgPHNwYW4gY2xhc3M9XCJzcGFya2xlIHNwYXJrbGUtMlwiPuKcpjwvc3Bhbj5cbiAgICAgIDxzcGFuIGNsYXNzPVwic3BhcmtsZSBzcGFya2xlLTNcIj7inKY8L3NwYW4+XG4gICAgICA8c3BhbiBjbGFzcz1cInNwYXJrbGUgc3BhcmtsZS00XCI+4pymPC9zcGFuPlxuICAgIDwvZGl2PlxuICAgIDxoNCBjbGFzcz1cImVtcHR5LXRpdGxlXCI+VG9kYXbDrWEgbm8gdGVuw6lzIHR1cm5vcyBhZ2VuZGFkb3M8L2g0PlxuICAgIDxwIGNsYXNzPVwiZW1wdHktc3VidGl0bGVcIj5cbiAgICAgIEVuIGNhc28gZGUgcXVlIE1lZGljaW5hIExhYm9yYWwgcmVxdWllcmEgdW5hIGNvbnN1bHRhLCBsbyB2ZXLDoXMgZW4gZXN0YSBzZWNjacOzbi5cbiAgICA8L3A+XG4gIDwvZGl2PlxuXG4gIDwhLS0gQXBwb2ludG1lbnRzIGxpc3QgLS0+XG4gIDxkaXYgY2xhc3M9XCJjYXJkLWNvbnRlbnQgYXBwb2ludG1lbnQtc3RhdGVcIiAqbmdJZj1cIiFpc0xvYWRpbmcgJiYgYXBwb2ludG1lbnRzLmxlbmd0aCA+IDBcIj5cbiAgICA8ZGl2IGNsYXNzPVwiYXBwb2ludG1lbnQtY2FyZFwiICpuZ0Zvcj1cImxldCBhcHB0IG9mIGFwcG9pbnRtZW50czsgdHJhY2tCeTogdHJhY2tCeUFwcG9pbnRtZW50SWRcIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJhcHBvaW50bWVudC1oZWFkZXJcIj5cbiAgICAgICAgPHRhcy1hdmF0YXIgW25hbWVdPVwiZ2V0T3RoZXJQYXJ0aWNpcGFudChhcHB0KVwiIFtzaXplXT1cIjQ4XCI+PC90YXMtYXZhdGFyPlxuICAgICAgICA8c3BhbiBjbGFzcz1cImRvY3Rvci1uYW1lXCI+e3sgZ2V0T3RoZXJQYXJ0aWNpcGFudChhcHB0KSB9fTwvc3Bhbj5cbiAgICAgIDwvZGl2PlxuICAgICAgPGRpdiBjbGFzcz1cImFwcG9pbnRtZW50LWRldGFpbHNcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImRhdGUtdGltZVwiPlxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZGF0ZVwiPnt7IGZvcm1hdEFwcG9pbnRtZW50RGF0ZShhcHB0KSB9fTwvc3Bhbj5cbiAgICAgICAgICA8c3BhbiBjbGFzcz1cInRpbWVcIj57eyBmb3JtYXRUaW1lUmFuZ2UoYXBwdCkgfX08L3NwYW4+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8dGFzLWJ0blxuICAgICAgICAgICpuZ0lmPVwic2hvdWxkU2hvd1Rhc0J0bihhcHB0KVwiXG4gICAgICAgICAgdmFyaWFudD1cInRlYWxcIlxuICAgICAgICAgIGJ1dHRvbkxhYmVsPVwiSW5ncmVzYXJcIlxuICAgICAgICAgIFtyb29tVHlwZV09XCJhcHB0LnJvb21UeXBlXCJcbiAgICAgICAgICBbZW50aXR5SWRdPVwiYXBwdC5lbnRpdHlJZFwiXG4gICAgICAgICAgW3RlbmFudF09XCJ0ZW5hbnRcIlxuICAgICAgICAgIFtidXNpbmVzc1JvbGVdPVwiYnVzaW5lc3NSb2xlXCJcbiAgICAgICAgICBbY3VycmVudFVzZXJdPVwiY3VycmVudFVzZXJcIlxuICAgICAgICA+PC90YXMtYnRuPlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gIDwvZGl2PlxuPC9kaXY+XG5cbiJdfQ==
160
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFzLWluY29taW5nLWFwcG9pbnRtZW50LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3Rhcy11ZWxsLXNkay9zcmMvbGliL2NvbXBvbmVudHMvdGFzLWluY29taW5nLWFwcG9pbnRtZW50L3Rhcy1pbmNvbWluZy1hcHBvaW50bWVudC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy90YXMtdWVsbC1zZGsvc3JjL2xpYi9jb21wb25lbnRzL3Rhcy1pbmNvbWluZy1hcHBvaW50bWVudC90YXMtaW5jb21pbmctYXBwb2ludG1lbnQuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNMLFNBQVMsRUFHVCxLQUFLLEVBQ0wsTUFBTSxFQUNOLFlBQVksR0FDYixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBRXBDLE9BQU8sRUFFTCxpQkFBaUIsRUFDakIsV0FBVyxFQUNYLGVBQWUsR0FFaEIsTUFBTSxpQ0FBaUMsQ0FBQzs7Ozs7O0FBT3pDLE1BQU0sT0FBTywrQkFBK0I7SUF1QjFDLFlBQW9CLFVBQXNCO1FBQXRCLGVBQVUsR0FBVixVQUFVLENBQVk7UUF0QjFDLGlDQUFpQztRQUN4QixhQUFRLEdBQWdCLFdBQVcsQ0FBQyxHQUFHLENBQUM7UUFHeEMsaUJBQVksR0FBb0IsZUFBZSxDQUFDLElBQUksQ0FBQztRQU9wRCxjQUFTLEdBQUcsSUFBSSxZQUFZLEVBQWtCLENBQUM7UUFFbEQsaUJBQVksR0FBcUIsRUFBRSxDQUFDO1FBQ3BDLGNBQVMsR0FBRyxJQUFJLENBQUM7UUFDakIsYUFBUSxHQUFHLEtBQUssQ0FBQztRQUV4QiwwRUFBMEU7UUFDbkUsd0JBQW1CLEdBQWtCLElBQUksQ0FBQztRQUV6QyxrQkFBYSxHQUFHLElBQUksWUFBWSxFQUFFLENBQUM7SUFFRSxDQUFDO0lBRTlDLFFBQVE7UUFDTixJQUFJLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQztRQUN4QixJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7SUFDckIsQ0FBQztJQUVELFdBQVc7UUFDVCxJQUFJLENBQUMsYUFBYSxDQUFDLFdBQVcsRUFBRSxDQUFDO0lBQ25DLENBQUM7SUFFTyxnQkFBZ0I7UUFDdEIsSUFBSSxDQUFDLGFBQWEsQ0FBQyxHQUFHLENBQ3BCLElBQUksQ0FBQyxVQUFVO2FBQ1osZUFBZSxDQUFDO1lBQ2YsUUFBUSxFQUFFLElBQUksQ0FBQyxRQUFRO1lBQ3ZCLE1BQU0sRUFBRSxJQUFJLENBQUMsTUFBTTtZQUNuQixRQUFRLEVBQUUsSUFBSSxDQUFDLFFBQVE7U0FDeEIsQ0FBQzthQUNELFNBQVMsQ0FBQztZQUNULElBQUksRUFBRSxDQUFDLFFBQWEsRUFBRSxFQUFFO2dCQUN0Qiw2RUFBNkU7Z0JBQzdFLE1BQU0sWUFBWSxHQUFHLEtBQUssQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDO29CQUMxQyxDQUFDLENBQUMsUUFBUTtvQkFDVixDQUFDLENBQUMsUUFBUSxFQUFFLE9BQU8sSUFBSSxFQUFFLENBQUM7Z0JBRTVCLDhFQUE4RTtnQkFDOUUsTUFBTSxrQkFBa0IsR0FBRyxZQUFZLENBQUMsTUFBTSxDQUM1QyxDQUFDLElBQW9CLEVBQUUsS0FBYSxFQUFFLElBQXNCLEVBQUUsRUFBRSxDQUM5RCxLQUFLLEtBQUssSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQWlCLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLEtBQUssSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUNwRSxDQUFDO2dCQUNGLElBQUksQ0FBQyxZQUFZLEdBQUcsa0JBQWtCLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBaUIsRUFBRSxDQUFpQixFQUFFLEVBQUU7b0JBQ25GLE1BQU0sU0FBUyxHQUFHLEdBQUcsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLENBQUMsU0FBUyxFQUFFLENBQUM7b0JBQzdDLE1BQU0sU0FBUyxHQUFHLEdBQUcsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLENBQUMsU0FBUyxFQUFFLENBQUM7b0JBQzdDLE9BQU8sU0FBUyxDQUFDLGFBQWEsQ0FBQyxTQUFTLENBQUMsQ0FBQztnQkFDNUMsQ0FBQyxDQUFDLENBQUM7Z0JBQ0gsSUFBSSxDQUFDLFNBQVMsR0FBRyxLQUFLLENBQUM7WUFDekIsQ0FBQztZQUNELEtBQUssRUFBRSxHQUFHLEVBQUU7Z0JBQ1YsSUFBSSxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUM7Z0JBQ3JCLElBQUksQ0FBQyxTQUFTLEdBQUcsS0FBSyxDQUFDO1lBQ3pCLENBQUM7U0FDRixDQUFDLENBQ0wsQ0FBQztJQUNKLENBQUM7SUFFRDs7T0FFRztJQUNLLFdBQVc7UUFDakIsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFO1lBQ2xDLE9BQU87U0FDUjtRQUVELElBQUksQ0FBQyxhQUFhLENBQUMsR0FBRyxDQUNwQixJQUFJLENBQUMsVUFBVTthQUNaLG1CQUFtQixDQUFDO1lBQ25CLFFBQVEsRUFBRSxJQUFJLENBQUMsUUFBUTtZQUN2QixRQUFRLEVBQUUsSUFBSSxDQUFDLFFBQVE7WUFDdkIsTUFBTSxFQUFFLElBQUksQ0FBQyxNQUFNO1lBQ25CLFlBQVksRUFBRSxJQUFJLENBQUMsWUFBWTtTQUNoQyxDQUFDO2FBQ0QsU0FBUyxDQUFDO1lBQ1QsSUFBSSxFQUFFLENBQUMsUUFBUSxFQUFFLEVBQUU7Z0JBQ2pCLHdFQUF3RTtnQkFDeEUsSUFBSSxDQUFDLG1CQUFtQixHQUFHLFFBQVEsRUFBRSxPQUFPLEVBQUUsYUFBYSxJQUFJLElBQUksQ0FBQztZQUN0RSxDQUFDO1lBQ0QsS0FBSyxFQUFFLEdBQUcsRUFBRTtnQkFDVixJQUFJLENBQUMsbUJBQW1CLEdBQUcsSUFBSSxDQUFDO1lBQ2xDLENBQUM7U0FDRixDQUFDLENBQ0wsQ0FBQztJQUNKLENBQUM7SUFFTSxXQUFXLENBQUMsV0FBMkI7UUFDNUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUM7SUFDbkMsQ0FBQztJQUVEOzs7O09BSUc7SUFDSSxnQkFBZ0IsQ0FBQyxXQUEyQjtRQUNqRCxNQUFNLGNBQWMsR0FBRyxXQUFXLENBQUMsTUFBTSxLQUFLLGlCQUFpQixDQUFDLFNBQVM7WUFDbkQsV0FBVyxDQUFDLE1BQU0sS0FBSyxpQkFBaUIsQ0FBQyxNQUFNLENBQUM7UUFFdEUsaUVBQWlFO1FBQ2pFLE9BQU8sY0FBYyxJQUFJLFdBQVcsQ0FBQyxFQUFFLEtBQUssSUFBSSxDQUFDLG1CQUFtQixDQUFDO0lBQ3ZFLENBQUM7SUFFRDs7T0FFRztJQUNJLG9CQUFvQixDQUFDLEtBQWEsRUFBRSxXQUEyQjtRQUNwRSxPQUFPLFdBQVcsQ0FBQyxFQUFFLENBQUM7SUFDeEIsQ0FBQztJQUVEOztPQUVHO0lBQ0kscUJBQXFCLENBQUMsV0FBMkI7UUFDdEQsTUFBTSxDQUFDLElBQUksRUFBRSxLQUFLLEVBQUUsR0FBRyxDQUFDLEdBQUcsV0FBVyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ25FLE1BQU0sSUFBSSxHQUFHLElBQUksSUFBSSxDQUFDLElBQUksRUFBRSxLQUFLLEdBQUcsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDO1FBRTVDLE1BQU0sUUFBUSxHQUFHO1lBQ2YsU0FBUyxFQUFFLE9BQU8sRUFBRSxRQUFRLEVBQUUsV0FBVztZQUN6QyxRQUFRLEVBQUUsU0FBUyxFQUFFLFFBQVE7U0FDOUIsQ0FBQztRQUNGLE1BQU0sVUFBVSxHQUFHO1lBQ2pCLE9BQU8sRUFBRSxTQUFTLEVBQUUsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLEVBQUUsT0FBTztZQUNyRCxPQUFPLEVBQUUsUUFBUSxFQUFFLFlBQVksRUFBRSxTQUFTLEVBQUUsV0FBVyxFQUFFLFdBQVc7U0FDckUsQ0FBQztRQUVGLE1BQU0sT0FBTyxHQUFHLFFBQVEsQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQztRQUN4QyxNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7UUFDOUIsTUFBTSxTQUFTLEdBQUcsVUFBVSxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDO1FBRTlDLE9BQU8sR0FBRyxPQUFPLElBQUksTUFBTSxPQUFPLFNBQVMsRUFBRSxDQUFDO0lBQ2hELENBQUM7SUFFRDs7T0FFRztJQUNJLGVBQWUsQ0FBQyxXQUEyQjtRQUNoRCxPQUFPLEdBQUcsV0FBVyxDQUFDLFNBQVMsTUFBTSxXQUFXLENBQUMsT0FBTyxFQUFFLENBQUM7SUFDN0QsQ0FBQztJQUVEOztPQUVHO0lBQ0ksbUJBQW1CLENBQUMsV0FBMkI7UUFDcEQsSUFBSSxDQUFDLFdBQVcsQ0FBQyxZQUFZLElBQUksV0FBVyxDQUFDLFlBQVksQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFO1lBQ3RFLE9BQU8sV0FBVyxDQUFDLEtBQUssQ0FBQztTQUMxQjtRQUVELE1BQU0sZ0JBQWdCLEdBQUcsV0FBVyxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQ3BELENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLE1BQU0sS0FBSyxJQUFJLENBQUMsV0FBVyxFQUFFLEVBQUUsQ0FDdkMsQ0FBQztRQUVGLE9BQU8sZ0JBQWdCLEVBQUUsSUFBSSxJQUFJLFdBQVcsQ0FBQyxLQUFLLENBQUM7SUFDckQsQ0FBQzs7NkhBcEtVLCtCQUErQjtpSEFBL0IsK0JBQStCLGlSQ3ZCNUMsaXRFQW9EQTs0RkQ3QmEsK0JBQStCO2tCQUwzQyxTQUFTOytCQUNFLDBCQUEwQjtpR0FNM0IsUUFBUTtzQkFBaEIsS0FBSztnQkFDRyxRQUFRO3NCQUFoQixLQUFLO2dCQUNHLE1BQU07c0JBQWQsS0FBSztnQkFDRyxZQUFZO3NCQUFwQixLQUFLO2dCQUNHLFdBQVc7c0JBQW5CLEtBQUs7Z0JBR0csUUFBUTtzQkFBaEIsS0FBSztnQkFDRyxNQUFNO3NCQUFkLEtBQUs7Z0JBRUksU0FBUztzQkFBbEIsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIENvbXBvbmVudCxcbiAgT25Jbml0LFxuICBPbkRlc3Ryb3ksXG4gIElucHV0LFxuICBPdXRwdXQsXG4gIEV2ZW50RW1pdHRlcixcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBTdWJzY3JpcHRpb24gfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IFRhc1NlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy90YXMuc2VydmljZSc7XG5pbXBvcnQge1xuICBUYXNBcHBvaW50bWVudCxcbiAgQXBwb2ludG1lbnRTdGF0dXMsXG4gIFRhc1Jvb21UeXBlLFxuICBUYXNCdXNpbmVzc1JvbGUsXG4gIFRhc0N1cnJlbnRVc2VyLFxufSBmcm9tICcuLi8uLi9pbnRlcmZhY2VzL3Rhcy5pbnRlcmZhY2VzJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAndGFzLWluY29taW5nLWFwcG9pbnRtZW50JyxcbiAgdGVtcGxhdGVVcmw6ICcuL3Rhcy1pbmNvbWluZy1hcHBvaW50bWVudC5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL3Rhcy1pbmNvbWluZy1hcHBvaW50bWVudC5jb21wb25lbnQuc2NzcyddLFxufSlcbmV4cG9ydCBjbGFzcyBUYXNJbmNvbWluZ0FwcG9pbnRtZW50Q29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBPbkRlc3Ryb3kge1xuICAvLyBQYXNzdGhyb3VnaCBpbnB1dHMgZm9yIHRhcy1idG5cbiAgQElucHV0KCkgcm9vbVR5cGU6IFRhc1Jvb21UeXBlID0gVGFzUm9vbVR5cGUuVEFTO1xuICBASW5wdXQoKSBlbnRpdHlJZCE6IG51bWJlcjtcbiAgQElucHV0KCkgdGVuYW50ITogc3RyaW5nO1xuICBASW5wdXQoKSBidXNpbmVzc1JvbGU6IFRhc0J1c2luZXNzUm9sZSA9IFRhc0J1c2luZXNzUm9sZS5VU0VSO1xuICBASW5wdXQoKSBjdXJyZW50VXNlciE6IFRhc0N1cnJlbnRVc2VyO1xuICBcbiAgLy8gRGF0ZSByYW5nZSBpbnB1dHMgZm9yIGZldGNoaW5nIGFwcG9pbnRtZW50c1xuICBASW5wdXQoKSBmcm9tRGF0ZSE6IHN0cmluZzsgLy8gWVlZWS1NTS1ERCBmb3JtYXRcbiAgQElucHV0KCkgdG9EYXRlITogc3RyaW5nOyAgIC8vIFlZWVktTU0tREQgZm9ybWF0XG5cbiAgQE91dHB1dCgpIGVudGVyQ2FsbCA9IG5ldyBFdmVudEVtaXR0ZXI8VGFzQXBwb2ludG1lbnQ+KCk7XG5cbiAgcHVibGljIGFwcG9pbnRtZW50czogVGFzQXBwb2ludG1lbnRbXSA9IFtdO1xuICBwdWJsaWMgaXNMb2FkaW5nID0gdHJ1ZTtcbiAgcHVibGljIGhhc0Vycm9yID0gZmFsc2U7XG5cbiAgLy8gVGhlIGFwcG9pbnRtZW50SWQgZnJvbSBzdGF0dXMgQVBJIC0gb25seSB0aGlzIGFwcG9pbnRtZW50IHNob3dzIHRhcy1idG5cbiAgcHVibGljIGFjdGl2ZUFwcG9pbnRtZW50SWQ6IG51bWJlciB8IG51bGwgPSBudWxsO1xuXG4gIHByaXZhdGUgc3Vic2NyaXB0aW9ucyA9IG5ldyBTdWJzY3JpcHRpb24oKTtcblxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIHRhc1NlcnZpY2U6IFRhc1NlcnZpY2UpIHt9XG5cbiAgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgdGhpcy5sb2FkQXBwb2ludG1lbnRzKCk7XG4gICAgdGhpcy5jaGVja1N0YXR1cygpO1xuICB9XG5cbiAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgdGhpcy5zdWJzY3JpcHRpb25zLnVuc3Vic2NyaWJlKCk7XG4gIH1cblxuICBwcml2YXRlIGxvYWRBcHBvaW50bWVudHMoKTogdm9pZCB7XG4gICAgdGhpcy5zdWJzY3JpcHRpb25zLmFkZChcbiAgICAgIHRoaXMudGFzU2VydmljZVxuICAgICAgICAuZ2V0QXBwb2ludG1lbnRzKHsgXG4gICAgICAgICAgZnJvbURhdGU6IHRoaXMuZnJvbURhdGUsIFxuICAgICAgICAgIHRvRGF0ZTogdGhpcy50b0RhdGUsIFxuICAgICAgICAgIGVudGl0eUlkOiB0aGlzLmVudGl0eUlkIFxuICAgICAgICB9KVxuICAgICAgICAuc3Vic2NyaWJlKHtcbiAgICAgICAgICBuZXh0OiAocmVzcG9uc2U6IGFueSkgPT4ge1xuICAgICAgICAgICAgLy8gSGFuZGxlIGJvdGggYXJyYXkgcmVzcG9uc2UgYW5kIHdyYXBwZWQgcmVzcG9uc2UgKGUuZy4sIHsgY29udGVudDogWy4uLl0gfSlcbiAgICAgICAgICAgIGNvbnN0IGFwcG9pbnRtZW50cyA9IEFycmF5LmlzQXJyYXkocmVzcG9uc2UpXG4gICAgICAgICAgICAgID8gcmVzcG9uc2VcbiAgICAgICAgICAgICAgOiByZXNwb25zZT8uY29udGVudCB8fCBbXTtcbiAgICAgICAgICAgIFxuICAgICAgICAgICAgLy8gRGVkdXBsaWNhdGUgYnkgaWQgYW5kIHNvcnQgYnkgZGF0ZSBhbmQgc3RhcnRUaW1lIGFzY2VuZGluZyAoZWFybGllc3QgZmlyc3QpXG4gICAgICAgICAgICBjb25zdCB1bmlxdWVBcHBvaW50bWVudHMgPSBhcHBvaW50bWVudHMuZmlsdGVyKFxuICAgICAgICAgICAgICAoYXBwdDogVGFzQXBwb2ludG1lbnQsIGluZGV4OiBudW1iZXIsIHNlbGY6IFRhc0FwcG9pbnRtZW50W10pID0+XG4gICAgICAgICAgICAgICAgaW5kZXggPT09IHNlbGYuZmluZEluZGV4KChhOiBUYXNBcHBvaW50bWVudCkgPT4gYS5pZCA9PT0gYXBwdC5pZClcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICB0aGlzLmFwcG9pbnRtZW50cyA9IHVuaXF1ZUFwcG9pbnRtZW50cy5zb3J0KChhOiBUYXNBcHBvaW50bWVudCwgYjogVGFzQXBwb2ludG1lbnQpID0+IHtcbiAgICAgICAgICAgICAgY29uc3QgZGF0ZVRpbWVBID0gYCR7YS5kYXRlfVQke2Euc3RhcnRUaW1lfWA7XG4gICAgICAgICAgICAgIGNvbnN0IGRhdGVUaW1lQiA9IGAke2IuZGF0ZX1UJHtiLnN0YXJ0VGltZX1gO1xuICAgICAgICAgICAgICByZXR1cm4gZGF0ZVRpbWVCLmxvY2FsZUNvbXBhcmUoZGF0ZVRpbWVBKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgdGhpcy5pc0xvYWRpbmcgPSBmYWxzZTtcbiAgICAgICAgICB9LFxuICAgICAgICAgIGVycm9yOiAoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLmhhc0Vycm9yID0gdHJ1ZTtcbiAgICAgICAgICAgIHRoaXMuaXNMb2FkaW5nID0gZmFsc2U7XG4gICAgICAgICAgfSxcbiAgICAgICAgfSlcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrIHN0YXR1cyBlbmRwb2ludCB0byBnZXQgdGhlIGFjdGl2ZSBhcHBvaW50bWVudElkXG4gICAqL1xuICBwcml2YXRlIGNoZWNrU3RhdHVzKCk6IHZvaWQge1xuICAgIGlmICghdGhpcy50ZW5hbnQgfHwgIXRoaXMuZW50aXR5SWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLnN1YnNjcmlwdGlvbnMuYWRkKFxuICAgICAgdGhpcy50YXNTZXJ2aWNlXG4gICAgICAgIC5nZXRQcm94eVZpZGVvU3RhdHVzKHtcbiAgICAgICAgICByb29tVHlwZTogdGhpcy5yb29tVHlwZSxcbiAgICAgICAgICBlbnRpdHlJZDogdGhpcy5lbnRpdHlJZCxcbiAgICAgICAgICB0ZW5hbnQ6IHRoaXMudGVuYW50LFxuICAgICAgICAgIGJ1c2luZXNzUm9sZTogdGhpcy5idXNpbmVzc1JvbGUsXG4gICAgICAgIH0pXG4gICAgICAgIC5zdWJzY3JpYmUoe1xuICAgICAgICAgIG5leHQ6IChyZXNwb25zZSkgPT4ge1xuICAgICAgICAgICAgLy8gU3RvcmUgdGhlIGFwcG9pbnRtZW50SWQgZnJvbSBzdGF0dXMgLSB0YXMtYnRuIG9ubHkgc2hvd3MgZm9yIHRoaXMgb25lXG4gICAgICAgICAgICB0aGlzLmFjdGl2ZUFwcG9pbnRtZW50SWQgPSByZXNwb25zZT8uY29udGVudD8uYXBwb2ludG1lbnRJZCA/PyBudWxsO1xuICAgICAgICAgIH0sXG4gICAgICAgICAgZXJyb3I6ICgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuYWN0aXZlQXBwb2ludG1lbnRJZCA9IG51bGw7XG4gICAgICAgICAgfSxcbiAgICAgICAgfSlcbiAgICApO1xuICB9XG5cbiAgcHVibGljIG9uRW50ZXJDYWxsKGFwcG9pbnRtZW50OiBUYXNBcHBvaW50bWVudCk6IHZvaWQge1xuICAgIHRoaXMuZW50ZXJDYWxsLmVtaXQoYXBwb2ludG1lbnQpO1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrIGlmIHRhcy1idG4gc2hvdWxkIGJlIHNob3duIGZvciBhbiBhcHBvaW50bWVudC5cbiAgICogT25seSBzaG93cyB3aGVuIGFwcG9pbnRtZW50LmlkIG1hdGNoZXMgdGhlIGFjdGl2ZUFwcG9pbnRtZW50SWQgZnJvbSBzdGF0dXMgQVBJLlxuICAgKiB0YXMtYnRuIGhhbmRsZXMgaXRzIG93biBwb2xsaW5nIGZvciBqb2luYWJsZSBzdGF0ZS5cbiAgICovXG4gIHB1YmxpYyBzaG91bGRTaG93VGFzQnRuKGFwcG9pbnRtZW50OiBUYXNBcHBvaW50bWVudCk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IGhhc1ZhbGlkU3RhdHVzID0gYXBwb2ludG1lbnQuc3RhdHVzID09PSBBcHBvaW50bWVudFN0YXR1cy5DT05GSVJNRUQgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgYXBwb2ludG1lbnQuc3RhdHVzID09PSBBcHBvaW50bWVudFN0YXR1cy5BQ1RJVkU7XG4gICAgXG4gICAgLy8gT25seSBzaG93IGZvciB0aGUgYXBwb2ludG1lbnQgdGhhdCBtYXRjaGVzIHN0YXR1cyBBUEkgcmVzcG9uc2VcbiAgICByZXR1cm4gaGFzVmFsaWRTdGF0dXMgJiYgYXBwb2ludG1lbnQuaWQgPT09IHRoaXMuYWN0aXZlQXBwb2ludG1lbnRJZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBUcmFja0J5IGZ1bmN0aW9uIGZvciBuZ0ZvclxuICAgKi9cbiAgcHVibGljIHRyYWNrQnlBcHBvaW50bWVudElkKGluZGV4OiBudW1iZXIsIGFwcG9pbnRtZW50OiBUYXNBcHBvaW50bWVudCk6IG51bWJlciB7XG4gICAgcmV0dXJuIGFwcG9pbnRtZW50LmlkO1xuICB9XG5cbiAgLyoqXG4gICAqIEZvcm1hdCBkYXRlIHRvIFNwYW5pc2ggZm9ybWF0OiBcIkx1bmVzIDggZGUgZGljaWVtYnJlXCJcbiAgICovXG4gIHB1YmxpYyBmb3JtYXRBcHBvaW50bWVudERhdGUoYXBwb2ludG1lbnQ6IFRhc0FwcG9pbnRtZW50KTogc3RyaW5nIHtcbiAgICBjb25zdCBbeWVhciwgbW9udGgsIGRheV0gPSBhcHBvaW50bWVudC5kYXRlLnNwbGl0KCctJykubWFwKE51bWJlcik7XG4gICAgY29uc3QgZGF0ZSA9IG5ldyBEYXRlKHllYXIsIG1vbnRoIC0gMSwgZGF5KTtcblxuICAgIGNvbnN0IGRheU5hbWVzID0gW1xuICAgICAgJ0RvbWluZ28nLCAnTHVuZXMnLCAnTWFydGVzJywgJ01pw6lyY29sZXMnLFxuICAgICAgJ0p1ZXZlcycsICdWaWVybmVzJywgJ1PDoWJhZG8nXG4gICAgXTtcbiAgICBjb25zdCBtb250aE5hbWVzID0gW1xuICAgICAgJ2VuZXJvJywgJ2ZlYnJlcm8nLCAnbWFyem8nLCAnYWJyaWwnLCAnbWF5bycsICdqdW5pbycsXG4gICAgICAnanVsaW8nLCAnYWdvc3RvJywgJ3NlcHRpZW1icmUnLCAnb2N0dWJyZScsICdub3ZpZW1icmUnLCAnZGljaWVtYnJlJ1xuICAgIF07XG5cbiAgICBjb25zdCBkYXlOYW1lID0gZGF5TmFtZXNbZGF0ZS5nZXREYXkoKV07XG4gICAgY29uc3QgZGF5TnVtID0gZGF0ZS5nZXREYXRlKCk7XG4gICAgY29uc3QgbW9udGhOYW1lID0gbW9udGhOYW1lc1tkYXRlLmdldE1vbnRoKCldO1xuXG4gICAgcmV0dXJuIGAke2RheU5hbWV9ICR7ZGF5TnVtfSBkZSAke21vbnRoTmFtZX1gO1xuICB9XG5cbiAgLyoqXG4gICAqIEZvcm1hdCB0aW1lIHJhbmdlOiBcIjk6MDAgLSA5OjMwXCJcbiAgICovXG4gIHB1YmxpYyBmb3JtYXRUaW1lUmFuZ2UoYXBwb2ludG1lbnQ6IFRhc0FwcG9pbnRtZW50KTogc3RyaW5nIHtcbiAgICByZXR1cm4gYCR7YXBwb2ludG1lbnQuc3RhcnRUaW1lfSAtICR7YXBwb2ludG1lbnQuZW5kVGltZX1gO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgb3RoZXIgcGFydGljaXBhbnQgaW4gdGhlIGNhbGwgKG5vdCB0aGUgY3VycmVudCB1c2VyKVxuICAgKi9cbiAgcHVibGljIGdldE90aGVyUGFydGljaXBhbnQoYXBwb2ludG1lbnQ6IFRhc0FwcG9pbnRtZW50KTogc3RyaW5nIHtcbiAgICBpZiAoIWFwcG9pbnRtZW50LnBhcnRpY2lwYW50cyB8fCBhcHBvaW50bWVudC5wYXJ0aWNpcGFudHMubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm4gYXBwb2ludG1lbnQudGl0bGU7XG4gICAgfVxuICAgIFxuICAgIGNvbnN0IG90aGVyUGFydGljaXBhbnQgPSBhcHBvaW50bWVudC5wYXJ0aWNpcGFudHMuZmluZChcbiAgICAgIHAgPT4gcC51c2VySWQgIT09IHRoaXMuY3VycmVudFVzZXI/LmlkXG4gICAgKTtcbiAgICBcbiAgICByZXR1cm4gb3RoZXJQYXJ0aWNpcGFudD8ubmFtZSB8fCBhcHBvaW50bWVudC50aXRsZTtcbiAgfVxufVxuXG4iLCI8ZGl2IGNsYXNzPVwiaW5jb21pbmctYXBwb2ludG1lbnQtY2FyZFwiPlxuICA8aDMgY2xhc3M9XCJjYXJkLXRpdGxlXCI+UHLDs3hpbW8gdHVybm88L2gzPlxuXG4gIDwhLS0gTG9hZGluZyBzdGF0ZSAtLT5cbiAgPGRpdiBjbGFzcz1cImNhcmQtY29udGVudFwiICpuZ0lmPVwiaXNMb2FkaW5nXCI+XG4gICAgPGRpdiBjbGFzcz1cImxvYWRpbmctc3Bpbm5lclwiPjwvZGl2PlxuICA8L2Rpdj5cblxuICA8IS0tIEVtcHR5IHN0YXRlIC0tPlxuICA8ZGl2IGNsYXNzPVwiY2FyZC1jb250ZW50IGVtcHR5LXN0YXRlXCIgKm5nSWY9XCIhaXNMb2FkaW5nICYmIGFwcG9pbnRtZW50cy5sZW5ndGggPT09IDBcIj5cbiAgICA8ZGl2IGNsYXNzPVwiaWNvbi1jb250YWluZXJcIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJpY29uLWNpcmNsZVwiPlxuICAgICAgICA8aSBjbGFzcz1cImZhIGZhLWNhbGVuZGFyXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+PC9pPlxuICAgICAgPC9kaXY+XG4gICAgICA8c3BhbiBjbGFzcz1cInNwYXJrbGUgc3BhcmtsZS0xXCI+4pymPC9zcGFuPlxuICAgICAgPHNwYW4gY2xhc3M9XCJzcGFya2xlIHNwYXJrbGUtMlwiPuKcpjwvc3Bhbj5cbiAgICAgIDxzcGFuIGNsYXNzPVwic3BhcmtsZSBzcGFya2xlLTNcIj7inKY8L3NwYW4+XG4gICAgICA8c3BhbiBjbGFzcz1cInNwYXJrbGUgc3BhcmtsZS00XCI+4pymPC9zcGFuPlxuICAgIDwvZGl2PlxuICAgIDxoNCBjbGFzcz1cImVtcHR5LXRpdGxlXCI+VG9kYXbDrWEgbm8gdGVuw6lzIHR1cm5vcyBhZ2VuZGFkb3M8L2g0PlxuICAgIDxwIGNsYXNzPVwiZW1wdHktc3VidGl0bGVcIj5cbiAgICAgIEVuIGNhc28gZGUgcXVlIE1lZGljaW5hIExhYm9yYWwgcmVxdWllcmEgdW5hIGNvbnN1bHRhLCBsbyB2ZXLDoXMgZW4gZXN0YSBzZWNjacOzbi5cbiAgICA8L3A+XG4gIDwvZGl2PlxuXG4gIDwhLS0gQXBwb2ludG1lbnRzIGxpc3QgLS0+XG4gIDxkaXYgY2xhc3M9XCJjYXJkLWNvbnRlbnQgYXBwb2ludG1lbnQtc3RhdGVcIiAqbmdJZj1cIiFpc0xvYWRpbmcgJiYgYXBwb2ludG1lbnRzLmxlbmd0aCA+IDBcIj5cbiAgICA8ZGl2IGNsYXNzPVwiYXBwb2ludG1lbnQtY2FyZFwiIFtuZ0NsYXNzXT1cInsgJ2NhbmNlbGxlZCc6IGFwcHQuc3RhdHVzID09PSAnQ0FOQ0VMTEVEJyB8fCBhcHB0LnN0YXR1cyA9PT0gJ1JFU0NIRURVTEVEJyB9XCIgKm5nRm9yPVwibGV0IGFwcHQgb2YgYXBwb2ludG1lbnRzOyB0cmFja0J5OiB0cmFja0J5QXBwb2ludG1lbnRJZFwiPlxuICAgICAgPGRpdiBjbGFzcz1cImFwcG9pbnRtZW50LWhlYWRlclwiPlxuICAgICAgICA8dGFzLWF2YXRhciBbbmFtZV09XCJnZXRPdGhlclBhcnRpY2lwYW50KGFwcHQpXCIgW3NpemVdPVwiNDhcIj48L3Rhcy1hdmF0YXI+XG4gICAgICAgIDxzcGFuIGNsYXNzPVwiZG9jdG9yLW5hbWVcIj57eyBnZXRPdGhlclBhcnRpY2lwYW50KGFwcHQpIH19PC9zcGFuPlxuICAgICAgPC9kaXY+XG4gICAgICA8ZGl2IGNsYXNzPVwiYXBwb2ludG1lbnQtZGV0YWlsc1wiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiZGF0ZS10aW1lXCIgW25nQ2xhc3NdPVwieyAnY29tcGFjdCc6ICFzaG91bGRTaG93VGFzQnRuKGFwcHQpLCAnY2FuY2VsbGVkJzogYXBwdC5zdGF0dXMgPT09ICdDQU5DRUxMRUQnIHx8IGFwcHQuc3RhdHVzID09PSAnUkVTQ0hFRFVMRUQnIH1cIj5cbiAgICAgICAgICA8c3BhbiBjbGFzcz1cImRhdGVcIj57eyBmb3JtYXRBcHBvaW50bWVudERhdGUoYXBwdCkgfX08L3NwYW4+XG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJ0aW1lXCI+e3sgZm9ybWF0VGltZVJhbmdlKGFwcHQpIH19PC9zcGFuPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPHRhcy1idG5cbiAgICAgICAgICAqbmdJZj1cInNob3VsZFNob3dUYXNCdG4oYXBwdClcIlxuICAgICAgICAgIHZhcmlhbnQ9XCJ0ZWFsXCJcbiAgICAgICAgICBidXR0b25MYWJlbD1cIkluZ3Jlc2FyXCJcbiAgICAgICAgICBbcm9vbVR5cGVdPVwiYXBwdC5yb29tVHlwZVwiXG4gICAgICAgICAgW2VudGl0eUlkXT1cImFwcHQuZW50aXR5SWRcIlxuICAgICAgICAgIFt0ZW5hbnRdPVwidGVuYW50XCJcbiAgICAgICAgICBbYnVzaW5lc3NSb2xlXT1cImJ1c2luZXNzUm9sZVwiXG4gICAgICAgICAgW2N1cnJlbnRVc2VyXT1cImN1cnJlbnRVc2VyXCJcbiAgICAgICAgPjwvdGFzLWJ0bj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICA8L2Rpdj5cbjwvZGl2PlxuXG4iXX0=
@@ -2667,10 +2667,10 @@ class TasIncomingAppointmentComponent {
2667
2667
  }
2668
2668
  }
2669
2669
  TasIncomingAppointmentComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.3.12", ngImport: i0, type: TasIncomingAppointmentComponent, deps: [{ token: TasService }], target: i0.ɵɵFactoryTarget.Component });
2670
- TasIncomingAppointmentComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.3.12", type: TasIncomingAppointmentComponent, selector: "tas-incoming-appointment", inputs: { roomType: "roomType", entityId: "entityId", tenant: "tenant", businessRole: "businessRole", currentUser: "currentUser", fromDate: "fromDate", toDate: "toDate" }, outputs: { enterCall: "enterCall" }, ngImport: i0, template: "<div class=\"incoming-appointment-card\">\n <h3 class=\"card-title\">Pr\u00F3ximo turno</h3>\n\n <!-- Loading state -->\n <div class=\"card-content\" *ngIf=\"isLoading\">\n <div class=\"loading-spinner\"></div>\n </div>\n\n <!-- Empty state -->\n <div class=\"card-content empty-state\" *ngIf=\"!isLoading && appointments.length === 0\">\n <div class=\"icon-container\">\n <div class=\"icon-circle\">\n <i class=\"fa fa-calendar\" aria-hidden=\"true\"></i>\n </div>\n <span class=\"sparkle sparkle-1\">\u2726</span>\n <span class=\"sparkle sparkle-2\">\u2726</span>\n <span class=\"sparkle sparkle-3\">\u2726</span>\n <span class=\"sparkle sparkle-4\">\u2726</span>\n </div>\n <h4 class=\"empty-title\">Todav\u00EDa no ten\u00E9s turnos agendados</h4>\n <p class=\"empty-subtitle\">\n En caso de que Medicina Laboral requiera una consulta, lo ver\u00E1s en esta secci\u00F3n.\n </p>\n </div>\n\n <!-- Appointments list -->\n <div class=\"card-content appointment-state\" *ngIf=\"!isLoading && appointments.length > 0\">\n <div class=\"appointment-card\" *ngFor=\"let appt of appointments; trackBy: trackByAppointmentId\">\n <div class=\"appointment-header\">\n <tas-avatar [name]=\"getOtherParticipant(appt)\" [size]=\"48\"></tas-avatar>\n <span class=\"doctor-name\">{{ getOtherParticipant(appt) }}</span>\n </div>\n <div class=\"appointment-details\">\n <div class=\"date-time\">\n <span class=\"date\">{{ formatAppointmentDate(appt) }}</span>\n <span class=\"time\">{{ formatTimeRange(appt) }}</span>\n </div>\n <tas-btn\n *ngIf=\"shouldShowTasBtn(appt)\"\n variant=\"teal\"\n buttonLabel=\"Ingresar\"\n [roomType]=\"appt.roomType\"\n [entityId]=\"appt.entityId\"\n [tenant]=\"tenant\"\n [businessRole]=\"businessRole\"\n [currentUser]=\"currentUser\"\n ></tas-btn>\n </div>\n </div>\n </div>\n</div>\n\n", styles: [":host{display:block}.incoming-appointment-card{background:#ffffff;border-radius:12px;box-shadow:0 2px 8px #00000014;padding:24px;min-width:360px}.card-title{font-size:16px;font-weight:400;color:#6b7280;margin:0 0 24px}.card-content{display:flex;flex-direction:column;align-items:center}.loading-spinner{width:40px;height:40px;border:3px solid #e0f7fa;border-top-color:#0097a7;border-radius:50%;animation:spin 1s linear infinite}@keyframes spin{to{transform:rotate(360deg)}}.empty-state{text-align:center;padding:20px 0}.icon-container{position:relative;width:120px;height:120px;margin-bottom:24px}.icon-circle{width:100%;height:100%;background:#e0f7fa;border-radius:50%;display:flex;align-items:center;justify-content:center}.icon-circle i{font-size:40px;color:#0097a7}.sparkle{position:absolute;color:#0097a7;font-size:12px}.sparkle-1{top:10px;right:5px}.sparkle-2{top:0;right:30px}.sparkle-3{top:25px;left:0}.sparkle-4{bottom:20px;right:0}.empty-title{font-size:18px;font-weight:600;color:#1f2937;margin:0 0 12px}.empty-subtitle{font-size:14px;color:#6b7280;margin:0;max-width:320px;line-height:1.5}.appointment-state{align-items:stretch;gap:16px}.appointment-card{border-radius:12px;border:1px solid var(--Primary-White-Uell50, #8ED1D8);background:#F1FAFA;padding:1.5rem}.appointment-header{display:flex;align-items:center;gap:12px;margin-bottom:16px}.doctor-name{overflow:hidden;color:var(--Neutral-GreyDark, #383E52);text-overflow:ellipsis;font-size:16px;font-style:normal;font-weight:600;line-height:24px;letter-spacing:.016px}.appointment-details{display:flex;justify-content:space-between;align-items:flex-end}.date-time{display:flex;flex-direction:column;gap:4px}.date{color:var(--Neutral-GreyDark, #383E52);font-size:12px;font-style:normal;font-weight:600;line-height:16px;letter-spacing:.06px}.time{font-size:14px;color:var(--Neutral-GreyDark, #383E52);font-family:Inter;font-size:10px;font-style:normal;font-weight:400;line-height:14px;letter-spacing:.04px}\n"], components: [{ type: TasAvatarComponent, selector: "tas-avatar", inputs: ["name", "size"] }, { type: TasButtonComponent, selector: "tas-btn", inputs: ["roomType", "entityId", "tenant", "businessRole", "currentUser", "variant", "buttonLabel"] }], directives: [{ type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i4.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }] });
2670
+ TasIncomingAppointmentComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.3.12", type: TasIncomingAppointmentComponent, selector: "tas-incoming-appointment", inputs: { roomType: "roomType", entityId: "entityId", tenant: "tenant", businessRole: "businessRole", currentUser: "currentUser", fromDate: "fromDate", toDate: "toDate" }, outputs: { enterCall: "enterCall" }, ngImport: i0, template: "<div class=\"incoming-appointment-card\">\n <h3 class=\"card-title\">Pr\u00F3ximo turno</h3>\n\n <!-- Loading state -->\n <div class=\"card-content\" *ngIf=\"isLoading\">\n <div class=\"loading-spinner\"></div>\n </div>\n\n <!-- Empty state -->\n <div class=\"card-content empty-state\" *ngIf=\"!isLoading && appointments.length === 0\">\n <div class=\"icon-container\">\n <div class=\"icon-circle\">\n <i class=\"fa fa-calendar\" aria-hidden=\"true\"></i>\n </div>\n <span class=\"sparkle sparkle-1\">\u2726</span>\n <span class=\"sparkle sparkle-2\">\u2726</span>\n <span class=\"sparkle sparkle-3\">\u2726</span>\n <span class=\"sparkle sparkle-4\">\u2726</span>\n </div>\n <h4 class=\"empty-title\">Todav\u00EDa no ten\u00E9s turnos agendados</h4>\n <p class=\"empty-subtitle\">\n En caso de que Medicina Laboral requiera una consulta, lo ver\u00E1s en esta secci\u00F3n.\n </p>\n </div>\n\n <!-- Appointments list -->\n <div class=\"card-content appointment-state\" *ngIf=\"!isLoading && appointments.length > 0\">\n <div class=\"appointment-card\" [ngClass]=\"{ 'cancelled': appt.status === 'CANCELLED' || appt.status === 'RESCHEDULED' }\" *ngFor=\"let appt of appointments; trackBy: trackByAppointmentId\">\n <div class=\"appointment-header\">\n <tas-avatar [name]=\"getOtherParticipant(appt)\" [size]=\"48\"></tas-avatar>\n <span class=\"doctor-name\">{{ getOtherParticipant(appt) }}</span>\n </div>\n <div class=\"appointment-details\">\n <div class=\"date-time\" [ngClass]=\"{ 'compact': !shouldShowTasBtn(appt), 'cancelled': appt.status === 'CANCELLED' || appt.status === 'RESCHEDULED' }\">\n <span class=\"date\">{{ formatAppointmentDate(appt) }}</span>\n <span class=\"time\">{{ formatTimeRange(appt) }}</span>\n </div>\n <tas-btn\n *ngIf=\"shouldShowTasBtn(appt)\"\n variant=\"teal\"\n buttonLabel=\"Ingresar\"\n [roomType]=\"appt.roomType\"\n [entityId]=\"appt.entityId\"\n [tenant]=\"tenant\"\n [businessRole]=\"businessRole\"\n [currentUser]=\"currentUser\"\n ></tas-btn>\n </div>\n </div>\n </div>\n</div>\n\n", styles: ["@charset \"UTF-8\";:host{display:block}.incoming-appointment-card{background:#ffffff;border-radius:12px;box-shadow:0 2px 8px #00000014;padding:24px;min-width:360px}.card-title{font-size:16px;font-weight:400;color:#6b7280;margin:0 0 24px}.card-content{display:flex;flex-direction:column;align-items:center}.loading-spinner{width:40px;height:40px;border:3px solid #e0f7fa;border-top-color:#0097a7;border-radius:50%;animation:spin 1s linear infinite}@keyframes spin{to{transform:rotate(360deg)}}.empty-state{text-align:center;padding:20px 0}.icon-container{position:relative;width:120px;height:120px;margin-bottom:24px}.icon-circle{width:100%;height:100%;background:#e0f7fa;border-radius:50%;display:flex;align-items:center;justify-content:center}.icon-circle i{font-size:40px;color:#0097a7}.sparkle{position:absolute;color:#0097a7;font-size:12px}.sparkle-1{top:10px;right:5px}.sparkle-2{top:0;right:30px}.sparkle-3{top:25px;left:0}.sparkle-4{bottom:20px;right:0}.empty-title{font-size:18px;font-weight:600;color:#1f2937;margin:0 0 12px}.empty-subtitle{font-size:14px;color:#6b7280;margin:0;max-width:320px;line-height:1.5}.appointment-state{align-items:stretch;gap:16px}.appointment-card{border-radius:12px;border:1px solid var(--Primary-White-Uell50, #8ED1D8);background:#F1FAFA;padding:1.5rem}.appointment-header{display:flex;align-items:center;gap:12px;margin-bottom:16px}.doctor-name{overflow:hidden;color:var(--Neutral-GreyDark, #383E52);text-overflow:ellipsis;font-size:16px;font-style:normal;font-weight:600;line-height:24px;letter-spacing:.016px}.appointment-details{display:flex;justify-content:space-between;align-items:flex-end}.date-time{display:flex;flex-direction:column;gap:4px}.date{color:var(--Neutral-GreyDark, #383E52);font-size:12px;font-style:normal;font-weight:600;line-height:16px;letter-spacing:.06px}.time{font-size:14px;color:var(--Neutral-GreyDark, #383E52);font-family:Inter;font-size:10px;font-style:normal;font-weight:400;line-height:14px;letter-spacing:.04px}.date-time.compact{flex-direction:row;align-items:center;gap:8px}.date-time.compact .date:after{content:\"\\b7\";margin-left:8px}.date-time.cancelled{color:#8a95ab}.date-time.cancelled .date{color:#8a95ab;text-decoration:line-through;font-size:14px}.date-time.cancelled .time{color:#8a95ab;text-decoration:line-through;font-size:12px}.appointment-card.cancelled{background:#f3f4f6;border:none}.appointment-card.cancelled .doctor-name{color:#8a95ab;text-decoration:line-through}.appointment-card.cancelled tas-avatar ::ng-deep .avatar{box-shadow:none}\n"], components: [{ type: TasAvatarComponent, selector: "tas-avatar", inputs: ["name", "size"] }, { type: TasButtonComponent, selector: "tas-btn", inputs: ["roomType", "entityId", "tenant", "businessRole", "currentUser", "variant", "buttonLabel"] }], directives: [{ type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i4.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { type: i4.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }] });
2671
2671
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.12", ngImport: i0, type: TasIncomingAppointmentComponent, decorators: [{
2672
2672
  type: Component,
2673
- args: [{ selector: 'tas-incoming-appointment', template: "<div class=\"incoming-appointment-card\">\n <h3 class=\"card-title\">Pr\u00F3ximo turno</h3>\n\n <!-- Loading state -->\n <div class=\"card-content\" *ngIf=\"isLoading\">\n <div class=\"loading-spinner\"></div>\n </div>\n\n <!-- Empty state -->\n <div class=\"card-content empty-state\" *ngIf=\"!isLoading && appointments.length === 0\">\n <div class=\"icon-container\">\n <div class=\"icon-circle\">\n <i class=\"fa fa-calendar\" aria-hidden=\"true\"></i>\n </div>\n <span class=\"sparkle sparkle-1\">\u2726</span>\n <span class=\"sparkle sparkle-2\">\u2726</span>\n <span class=\"sparkle sparkle-3\">\u2726</span>\n <span class=\"sparkle sparkle-4\">\u2726</span>\n </div>\n <h4 class=\"empty-title\">Todav\u00EDa no ten\u00E9s turnos agendados</h4>\n <p class=\"empty-subtitle\">\n En caso de que Medicina Laboral requiera una consulta, lo ver\u00E1s en esta secci\u00F3n.\n </p>\n </div>\n\n <!-- Appointments list -->\n <div class=\"card-content appointment-state\" *ngIf=\"!isLoading && appointments.length > 0\">\n <div class=\"appointment-card\" *ngFor=\"let appt of appointments; trackBy: trackByAppointmentId\">\n <div class=\"appointment-header\">\n <tas-avatar [name]=\"getOtherParticipant(appt)\" [size]=\"48\"></tas-avatar>\n <span class=\"doctor-name\">{{ getOtherParticipant(appt) }}</span>\n </div>\n <div class=\"appointment-details\">\n <div class=\"date-time\">\n <span class=\"date\">{{ formatAppointmentDate(appt) }}</span>\n <span class=\"time\">{{ formatTimeRange(appt) }}</span>\n </div>\n <tas-btn\n *ngIf=\"shouldShowTasBtn(appt)\"\n variant=\"teal\"\n buttonLabel=\"Ingresar\"\n [roomType]=\"appt.roomType\"\n [entityId]=\"appt.entityId\"\n [tenant]=\"tenant\"\n [businessRole]=\"businessRole\"\n [currentUser]=\"currentUser\"\n ></tas-btn>\n </div>\n </div>\n </div>\n</div>\n\n", styles: [":host{display:block}.incoming-appointment-card{background:#ffffff;border-radius:12px;box-shadow:0 2px 8px #00000014;padding:24px;min-width:360px}.card-title{font-size:16px;font-weight:400;color:#6b7280;margin:0 0 24px}.card-content{display:flex;flex-direction:column;align-items:center}.loading-spinner{width:40px;height:40px;border:3px solid #e0f7fa;border-top-color:#0097a7;border-radius:50%;animation:spin 1s linear infinite}@keyframes spin{to{transform:rotate(360deg)}}.empty-state{text-align:center;padding:20px 0}.icon-container{position:relative;width:120px;height:120px;margin-bottom:24px}.icon-circle{width:100%;height:100%;background:#e0f7fa;border-radius:50%;display:flex;align-items:center;justify-content:center}.icon-circle i{font-size:40px;color:#0097a7}.sparkle{position:absolute;color:#0097a7;font-size:12px}.sparkle-1{top:10px;right:5px}.sparkle-2{top:0;right:30px}.sparkle-3{top:25px;left:0}.sparkle-4{bottom:20px;right:0}.empty-title{font-size:18px;font-weight:600;color:#1f2937;margin:0 0 12px}.empty-subtitle{font-size:14px;color:#6b7280;margin:0;max-width:320px;line-height:1.5}.appointment-state{align-items:stretch;gap:16px}.appointment-card{border-radius:12px;border:1px solid var(--Primary-White-Uell50, #8ED1D8);background:#F1FAFA;padding:1.5rem}.appointment-header{display:flex;align-items:center;gap:12px;margin-bottom:16px}.doctor-name{overflow:hidden;color:var(--Neutral-GreyDark, #383E52);text-overflow:ellipsis;font-size:16px;font-style:normal;font-weight:600;line-height:24px;letter-spacing:.016px}.appointment-details{display:flex;justify-content:space-between;align-items:flex-end}.date-time{display:flex;flex-direction:column;gap:4px}.date{color:var(--Neutral-GreyDark, #383E52);font-size:12px;font-style:normal;font-weight:600;line-height:16px;letter-spacing:.06px}.time{font-size:14px;color:var(--Neutral-GreyDark, #383E52);font-family:Inter;font-size:10px;font-style:normal;font-weight:400;line-height:14px;letter-spacing:.04px}\n"] }]
2673
+ args: [{ selector: 'tas-incoming-appointment', template: "<div class=\"incoming-appointment-card\">\n <h3 class=\"card-title\">Pr\u00F3ximo turno</h3>\n\n <!-- Loading state -->\n <div class=\"card-content\" *ngIf=\"isLoading\">\n <div class=\"loading-spinner\"></div>\n </div>\n\n <!-- Empty state -->\n <div class=\"card-content empty-state\" *ngIf=\"!isLoading && appointments.length === 0\">\n <div class=\"icon-container\">\n <div class=\"icon-circle\">\n <i class=\"fa fa-calendar\" aria-hidden=\"true\"></i>\n </div>\n <span class=\"sparkle sparkle-1\">\u2726</span>\n <span class=\"sparkle sparkle-2\">\u2726</span>\n <span class=\"sparkle sparkle-3\">\u2726</span>\n <span class=\"sparkle sparkle-4\">\u2726</span>\n </div>\n <h4 class=\"empty-title\">Todav\u00EDa no ten\u00E9s turnos agendados</h4>\n <p class=\"empty-subtitle\">\n En caso de que Medicina Laboral requiera una consulta, lo ver\u00E1s en esta secci\u00F3n.\n </p>\n </div>\n\n <!-- Appointments list -->\n <div class=\"card-content appointment-state\" *ngIf=\"!isLoading && appointments.length > 0\">\n <div class=\"appointment-card\" [ngClass]=\"{ 'cancelled': appt.status === 'CANCELLED' || appt.status === 'RESCHEDULED' }\" *ngFor=\"let appt of appointments; trackBy: trackByAppointmentId\">\n <div class=\"appointment-header\">\n <tas-avatar [name]=\"getOtherParticipant(appt)\" [size]=\"48\"></tas-avatar>\n <span class=\"doctor-name\">{{ getOtherParticipant(appt) }}</span>\n </div>\n <div class=\"appointment-details\">\n <div class=\"date-time\" [ngClass]=\"{ 'compact': !shouldShowTasBtn(appt), 'cancelled': appt.status === 'CANCELLED' || appt.status === 'RESCHEDULED' }\">\n <span class=\"date\">{{ formatAppointmentDate(appt) }}</span>\n <span class=\"time\">{{ formatTimeRange(appt) }}</span>\n </div>\n <tas-btn\n *ngIf=\"shouldShowTasBtn(appt)\"\n variant=\"teal\"\n buttonLabel=\"Ingresar\"\n [roomType]=\"appt.roomType\"\n [entityId]=\"appt.entityId\"\n [tenant]=\"tenant\"\n [businessRole]=\"businessRole\"\n [currentUser]=\"currentUser\"\n ></tas-btn>\n </div>\n </div>\n </div>\n</div>\n\n", styles: ["@charset \"UTF-8\";:host{display:block}.incoming-appointment-card{background:#ffffff;border-radius:12px;box-shadow:0 2px 8px #00000014;padding:24px;min-width:360px}.card-title{font-size:16px;font-weight:400;color:#6b7280;margin:0 0 24px}.card-content{display:flex;flex-direction:column;align-items:center}.loading-spinner{width:40px;height:40px;border:3px solid #e0f7fa;border-top-color:#0097a7;border-radius:50%;animation:spin 1s linear infinite}@keyframes spin{to{transform:rotate(360deg)}}.empty-state{text-align:center;padding:20px 0}.icon-container{position:relative;width:120px;height:120px;margin-bottom:24px}.icon-circle{width:100%;height:100%;background:#e0f7fa;border-radius:50%;display:flex;align-items:center;justify-content:center}.icon-circle i{font-size:40px;color:#0097a7}.sparkle{position:absolute;color:#0097a7;font-size:12px}.sparkle-1{top:10px;right:5px}.sparkle-2{top:0;right:30px}.sparkle-3{top:25px;left:0}.sparkle-4{bottom:20px;right:0}.empty-title{font-size:18px;font-weight:600;color:#1f2937;margin:0 0 12px}.empty-subtitle{font-size:14px;color:#6b7280;margin:0;max-width:320px;line-height:1.5}.appointment-state{align-items:stretch;gap:16px}.appointment-card{border-radius:12px;border:1px solid var(--Primary-White-Uell50, #8ED1D8);background:#F1FAFA;padding:1.5rem}.appointment-header{display:flex;align-items:center;gap:12px;margin-bottom:16px}.doctor-name{overflow:hidden;color:var(--Neutral-GreyDark, #383E52);text-overflow:ellipsis;font-size:16px;font-style:normal;font-weight:600;line-height:24px;letter-spacing:.016px}.appointment-details{display:flex;justify-content:space-between;align-items:flex-end}.date-time{display:flex;flex-direction:column;gap:4px}.date{color:var(--Neutral-GreyDark, #383E52);font-size:12px;font-style:normal;font-weight:600;line-height:16px;letter-spacing:.06px}.time{font-size:14px;color:var(--Neutral-GreyDark, #383E52);font-family:Inter;font-size:10px;font-style:normal;font-weight:400;line-height:14px;letter-spacing:.04px}.date-time.compact{flex-direction:row;align-items:center;gap:8px}.date-time.compact .date:after{content:\"\\b7\";margin-left:8px}.date-time.cancelled{color:#8a95ab}.date-time.cancelled .date{color:#8a95ab;text-decoration:line-through;font-size:14px}.date-time.cancelled .time{color:#8a95ab;text-decoration:line-through;font-size:12px}.appointment-card.cancelled{background:#f3f4f6;border:none}.appointment-card.cancelled .doctor-name{color:#8a95ab;text-decoration:line-through}.appointment-card.cancelled tas-avatar ::ng-deep .avatar{box-shadow:none}\n"] }]
2674
2674
  }], ctorParameters: function () { return [{ type: TasService }]; }, propDecorators: { roomType: [{
2675
2675
  type: Input
2676
2676
  }], entityId: [{