@ieeesa-npm/dashboard 0.0.0-stage → 0.0.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.
Files changed (63) hide show
  1. package/README.md +75 -3
  2. package/esm2022/ieeesa-npm-dashboard.mjs +5 -0
  3. package/esm2022/lib/assets/constants.json +141 -0
  4. package/esm2022/lib/assets/dashboard-mock.mjs +217 -0
  5. package/esm2022/lib/assets/dashboard-route-paths.mock.mjs +12 -0
  6. package/esm2022/lib/assets/dashboard-user-permissions.mock.mjs +23 -0
  7. package/esm2022/lib/assets/date-formats.mjs +28 -0
  8. package/esm2022/lib/components/event-group-card/event-group-card.component.mjs +277 -0
  9. package/esm2022/lib/components/meeting-attendance-row/meeting-attendance-row.component.mjs +181 -0
  10. package/esm2022/lib/components/member-level-badge/member-level-badge.component.mjs +79 -0
  11. package/esm2022/lib/components/upcoming-meetings-events/upcoming-meetings-events.component.mjs +163 -0
  12. package/esm2022/lib/components/welcome-header/dashboard-welcome-header.component.mjs +151 -0
  13. package/esm2022/lib/components/your-groups/your-groups.component.mjs +206 -0
  14. package/esm2022/lib/dashboard.component.mjs +377 -0
  15. package/esm2022/lib/dashboard.module.mjs +16 -0
  16. package/esm2022/lib/dashboard.routes.mjs +7 -0
  17. package/esm2022/lib/models/attendance-action-permissions.model.mjs +2 -0
  18. package/esm2022/lib/models/attendance-state.model.mjs +7 -0
  19. package/esm2022/lib/models/dashboard-list-response.model.mjs +2 -0
  20. package/esm2022/lib/models/dashboard-route-config.model.mjs +2 -0
  21. package/esm2022/lib/models/dashboard-section-state.model.mjs +9 -0
  22. package/esm2022/lib/models/dashboard-user-info.model.mjs +2 -0
  23. package/esm2022/lib/models/group-row.model.mjs +2 -0
  24. package/esm2022/lib/models/meeting-row.model.mjs +2 -0
  25. package/esm2022/lib/models/page-change.model.mjs +2 -0
  26. package/esm2022/lib/models/upcoming-event.model.mjs +2 -0
  27. package/esm2022/lib/services/attendance-reducers.mjs +54 -0
  28. package/esm2022/lib/services/dashboard.service.mjs +208 -0
  29. package/esm2022/lib/services/user-permissions.service.mjs +50 -0
  30. package/esm2022/lib/utils/attendance-action.util.mjs +53 -0
  31. package/esm2022/public-api.mjs +34 -0
  32. package/fesm2022/ieeesa-npm-dashboard.mjs +2234 -0
  33. package/fesm2022/ieeesa-npm-dashboard.mjs.map +1 -0
  34. package/index.d.ts +5 -0
  35. package/lib/assets/dashboard-mock.d.ts +31 -0
  36. package/lib/assets/dashboard-route-paths.mock.d.ts +2 -0
  37. package/lib/assets/dashboard-user-permissions.mock.d.ts +2 -0
  38. package/lib/assets/date-formats.d.ts +27 -0
  39. package/lib/components/event-group-card/event-group-card.component.d.ts +300 -0
  40. package/lib/components/meeting-attendance-row/meeting-attendance-row.component.d.ts +239 -0
  41. package/lib/components/member-level-badge/member-level-badge.component.d.ts +161 -0
  42. package/lib/components/upcoming-meetings-events/upcoming-meetings-events.component.d.ts +238 -0
  43. package/lib/components/welcome-header/dashboard-welcome-header.component.d.ts +98 -0
  44. package/lib/components/your-groups/your-groups.component.d.ts +110 -0
  45. package/lib/dashboard.component.d.ts +376 -0
  46. package/lib/dashboard.module.d.ts +7 -0
  47. package/lib/dashboard.routes.d.ts +2 -0
  48. package/lib/models/attendance-action-permissions.model.d.ts +4 -0
  49. package/lib/models/attendance-state.model.d.ts +4 -0
  50. package/lib/models/dashboard-list-response.model.d.ts +5 -0
  51. package/lib/models/dashboard-route-config.model.d.ts +7 -0
  52. package/lib/models/dashboard-section-state.model.d.ts +6 -0
  53. package/lib/models/dashboard-user-info.model.d.ts +5 -0
  54. package/lib/models/group-row.model.d.ts +8 -0
  55. package/lib/models/meeting-row.model.d.ts +12 -0
  56. package/lib/models/page-change.model.d.ts +4 -0
  57. package/lib/models/upcoming-event.model.d.ts +13 -0
  58. package/lib/services/attendance-reducers.d.ts +43 -0
  59. package/lib/services/dashboard.service.d.ts +119 -0
  60. package/lib/services/user-permissions.service.d.ts +31 -0
  61. package/lib/utils/attendance-action.util.d.ts +38 -0
  62. package/package.json +30 -3
  63. package/public-api.d.ts +24 -0
@@ -0,0 +1,277 @@
1
+ import { CommonModule } from '@angular/common';
2
+ import { Component, EventEmitter, Input, Output, ViewEncapsulation, } from '@angular/core';
3
+ import { MatPaginatorModule, } from '@angular/material/paginator';
4
+ import { DateTime } from 'luxon';
5
+ import { AttendanceState } from '../../models/attendance-state.model';
6
+ import { DateFormats } from '../../assets/date-formats';
7
+ import { MeetingAttendanceRowComponent } from '../meeting-attendance-row/meeting-attendance-row.component';
8
+ import * as constants from '../../assets/constants.json';
9
+ import * as i0 from "@angular/core";
10
+ import * as i1 from "@angular/common";
11
+ import * as i2 from "@angular/material/paginator";
12
+ /**
13
+ * Event_Group_Card renders a single upcoming event as a card: the status badge,
14
+ * title, day indicator, meeting-count summary sub-line, start/end date, and
15
+ * timezone (all luxon-formatted). It exposes a "View Event" action, a
16
+ * show/hide toggle for the meeting list labeled with the open-for-attendance
17
+ * count, the per-event meeting rows (one {@link MeetingAttendanceRowComponent}
18
+ * per meeting on the current page), and a per-card paginator.
19
+ *
20
+ * The component is purely presentational — it emits navigation, attendance, and
21
+ * pagination intents via `@Output()` and never performs navigation or HTTP
22
+ * itself. Meeting-row outputs (`openMeeting`/`logAttendance`/`leaveMeeting`) are
23
+ * bubbled upward unchanged so the container can delegate to the service.
24
+ * @export
25
+ * @class EventGroupCardComponent
26
+ */
27
+ export class EventGroupCardComponent {
28
+ constructor() {
29
+ /** User-facing strings sourced from `constants.json`. */
30
+ this.constants = constants;
31
+ /** Host permissions gating the per-row log-attendance / leave-meeting buttons. */
32
+ this.permissions = {
33
+ canLogAttendance: false,
34
+ canLeaveMeeting: false,
35
+ };
36
+ /** Map of meeting id to current attendance state, passed down to each row. */
37
+ this.attendanceStates = {};
38
+ /** Set of meeting ids with an attendance action awaiting resolution. */
39
+ this.inFlightMeetingIds = new Set();
40
+ /** Whether the host has determined the viewport is at/below the mobile breakpoint. */
41
+ this.isMobileView = false;
42
+ /** Emits the event id when the "View Event" button is activated (Req 6.4). */
43
+ this.viewEvent = new EventEmitter();
44
+ /** Bubbles the meeting id when a row's meeting-name link is activated (Req 6.7, 7.4). */
45
+ this.openMeeting = new EventEmitter();
46
+ /** Bubbles the meeting id when a row requests logging attendance (Req 6.7, 7.7). */
47
+ this.logAttendance = new EventEmitter();
48
+ /** Bubbles the meeting id when a row requests leaving the meeting (Req 6.7, 7.8). */
49
+ this.leaveMeeting = new EventEmitter();
50
+ /** Emits the requested page when the per-card paginator changes (Req 6.9, 3.3). */
51
+ this.pageChange = new EventEmitter();
52
+ /** The default page size for the per-card meeting paginator. */
53
+ this.defaultPageSize = 5;
54
+ /** The current zero-based page index of the meeting list. */
55
+ this.pageIndex = 0;
56
+ /** The current page size of the meeting list. */
57
+ this.pageSize = this.defaultPageSize;
58
+ /** Whether the meeting list is currently shown (toggled open). */
59
+ this.isMeetingListOpen = false;
60
+ }
61
+ /**
62
+ * The full list of meetings for the event, defaulting to an empty list when
63
+ * the event has none.
64
+ * @return {MeetingRow[]} The event's meetings.
65
+ * @memberof EventGroupCardComponent
66
+ */
67
+ get meetings() {
68
+ return this.event?.meetings ?? [];
69
+ }
70
+ /** The total number of meetings for the event (paginator length). */
71
+ get totalMeetings() {
72
+ return this.meetings.length;
73
+ }
74
+ /**
75
+ * The slice of meetings for the current page, used by the row `*ngFor`.
76
+ * @return {MeetingRow[]} The meetings on the current page.
77
+ * @memberof EventGroupCardComponent
78
+ */
79
+ get pagedMeetings() {
80
+ const start = this.pageIndex * this.pageSize;
81
+ return this.meetings.slice(start, start + this.pageSize);
82
+ }
83
+ /**
84
+ * The one-based index of the first meeting shown on the current page, or 0
85
+ * when there are no meetings.
86
+ * @return {number} The start index for the range template.
87
+ * @memberof EventGroupCardComponent
88
+ */
89
+ get rangeStart() {
90
+ return this.totalMeetings === 0 ? 0 : this.pageIndex * this.pageSize + 1;
91
+ }
92
+ /**
93
+ * The one-based index of the last meeting shown on the current page, clamped
94
+ * to the total meeting count.
95
+ * @return {number} The end index for the range template.
96
+ * @memberof EventGroupCardComponent
97
+ */
98
+ get rangeEnd() {
99
+ return Math.min((this.pageIndex + 1) * this.pageSize, this.totalMeetings);
100
+ }
101
+ /**
102
+ * The paginator range label (e.g. "Showing 1-5 of 12") built from the
103
+ * `constants.json` range template with the current start/end/total values.
104
+ * @return {string} The formatted range label.
105
+ * @memberof EventGroupCardComponent
106
+ */
107
+ get rangeLabel() {
108
+ const template = this.constants?.eventGroupCard?.paginator?.rangeTemplate ??
109
+ 'Showing {start}-{end} of {total}';
110
+ return template
111
+ .replace('{start}', `${this.rangeStart}`)
112
+ .replace('{end}', `${this.rangeEnd}`)
113
+ .replace('{total}', `${this.totalMeetings}`);
114
+ }
115
+ /**
116
+ * The meeting-count summary sub-line (e.g. "12 meetings") built from the
117
+ * `constants.json` total template with the event's meeting count.
118
+ * @return {string} The formatted meeting-count summary.
119
+ * @memberof EventGroupCardComponent
120
+ */
121
+ get meetingCountSummary() {
122
+ const template = this.constants?.eventGroupCard?.paginator?.totalTemplate ??
123
+ '{total} meetings';
124
+ return template.replace('{total}', `${this.event?.meetingCount ?? 0}`);
125
+ }
126
+ /**
127
+ * The meeting-list show/hide toggle label. When the list is hidden the label
128
+ * reads "Show Meetings ({count} open for attendance)" built from the
129
+ * `constants.json` templates and the event's open-for-attendance count; when
130
+ * the list is shown the label reads the configured hide label (Req 6.5).
131
+ * @return {string} The toggle button label.
132
+ * @memberof EventGroupCardComponent
133
+ */
134
+ get meetingListToggleLabel() {
135
+ const toggle = this.constants?.eventGroupCard?.meetingListToggle;
136
+ if (this.isMeetingListOpen) {
137
+ return toggle?.hideLabel ?? 'Hide Meetings';
138
+ }
139
+ const prefix = toggle?.showLabelPrefix ?? 'Show Meetings (';
140
+ const suffix = toggle?.showLabelSuffix ?? ' open for attendance)';
141
+ return `${prefix}${this.event?.openForAttendanceCount ?? 0}${suffix}`;
142
+ }
143
+ /** The luxon-formatted start date of the event (Req 6.2). */
144
+ get formattedStartDate() {
145
+ return this.formatIso(this.event?.startDate, DateFormats.displayFormat);
146
+ }
147
+ /** The luxon-formatted end date of the event (Req 6.2). */
148
+ get formattedEndDate() {
149
+ return this.formatIso(this.event?.endDate, DateFormats.displayFormat);
150
+ }
151
+ /**
152
+ * `trackBy` for the meeting-row `*ngFor`, keyed by the stable meeting id so
153
+ * Angular reuses row components across pagination/state changes (Req 6.7, 14.4).
154
+ * @param {number} _index - The iteration index (unused).
155
+ * @param {MeetingRow} meeting - The meeting for this row.
156
+ * @return {string} The stable track key (meeting id).
157
+ * @memberof EventGroupCardComponent
158
+ */
159
+ trackByMeetingId(_index, meeting) {
160
+ return meeting?.meetingId ?? `${_index}`;
161
+ }
162
+ /**
163
+ * Resolves the attendance state for a meeting from the `attendanceStates` map,
164
+ * defaulting to `NOT_ATTENDING` when the map has no entry for it.
165
+ * @param {MeetingRow} meeting - The meeting to resolve state for.
166
+ * @return {AttendanceState} The attendance state passed to the row.
167
+ * @memberof EventGroupCardComponent
168
+ */
169
+ resolveAttendanceState(meeting) {
170
+ return (this.attendanceStates?.[meeting?.meetingId] ??
171
+ AttendanceState.NOT_ATTENDING);
172
+ }
173
+ /**
174
+ * Resolves whether a meeting has an attendance action in flight from the
175
+ * `inFlightMeetingIds` set.
176
+ * @param {MeetingRow} meeting - The meeting to check.
177
+ * @return {boolean} True when the meeting's action is awaiting resolution.
178
+ * @memberof EventGroupCardComponent
179
+ */
180
+ resolveIsInFlight(meeting) {
181
+ return this.inFlightMeetingIds?.has(meeting?.meetingId) ?? false;
182
+ }
183
+ /**
184
+ * Toggles the meeting-list visibility (Req 6.6).
185
+ * @memberof EventGroupCardComponent
186
+ */
187
+ onToggleMeetingList() {
188
+ this.isMeetingListOpen = !this.isMeetingListOpen;
189
+ }
190
+ /**
191
+ * Handles the "View Event" button, emitting the event id to the host (Req 6.4).
192
+ * @memberof EventGroupCardComponent
193
+ */
194
+ onViewEvent() {
195
+ this.viewEvent.emit(this.event?.eventId);
196
+ }
197
+ /**
198
+ * Bubbles a row's meeting-name link activation upward (Req 6.7, 7.4).
199
+ * @param {string} meetingId - The id emitted by the row.
200
+ * @memberof EventGroupCardComponent
201
+ */
202
+ onOpenMeeting(meetingId) {
203
+ this.openMeeting.emit(meetingId);
204
+ }
205
+ /**
206
+ * Bubbles a row's log-attendance request upward (Req 6.7, 7.7).
207
+ * @param {string} meetingId - The id emitted by the row.
208
+ * @memberof EventGroupCardComponent
209
+ */
210
+ onLogAttendance(meetingId) {
211
+ this.logAttendance.emit(meetingId);
212
+ }
213
+ /**
214
+ * Bubbles a row's leave-meeting request upward (Req 6.7, 7.8).
215
+ * @param {string} meetingId - The id emitted by the row.
216
+ * @memberof EventGroupCardComponent
217
+ */
218
+ onLeaveMeeting(meetingId) {
219
+ this.leaveMeeting.emit(meetingId);
220
+ }
221
+ /**
222
+ * Handles the per-card paginator change, updating the local page state and
223
+ * emitting the requested page as a {@link PageChange} (Req 6.9, 3.3).
224
+ * @param {PageEvent} event - The Material paginator page event.
225
+ * @memberof EventGroupCardComponent
226
+ */
227
+ onPageChange(event) {
228
+ this.pageIndex = event.pageIndex;
229
+ this.pageSize = event.pageSize;
230
+ this.pageChange.emit({
231
+ pageIndex: event.pageIndex,
232
+ pageSize: event.pageSize,
233
+ });
234
+ }
235
+ /**
236
+ * Parses an ISO string with luxon and formats it with the supplied token,
237
+ * returning the raw value unchanged when it is missing or unparseable.
238
+ * @param {string | undefined} isoValue - The ISO date/time string.
239
+ * @param {string} format - The luxon format token.
240
+ * @return {string} The formatted value or the raw/empty fallback.
241
+ * @memberof EventGroupCardComponent
242
+ */
243
+ formatIso(isoValue, format) {
244
+ if (!isoValue) {
245
+ return '';
246
+ }
247
+ const parsed = DateTime.fromISO(isoValue, { setZone: true });
248
+ return parsed.isValid ? parsed.toFormat(format) : isoValue;
249
+ }
250
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: EventGroupCardComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
251
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: EventGroupCardComponent, isStandalone: true, selector: "ieeesa-event-group-card", inputs: { event: "event", permissions: "permissions", attendanceStates: "attendanceStates", inFlightMeetingIds: "inFlightMeetingIds", isMobileView: "isMobileView" }, outputs: { viewEvent: "viewEvent", openMeeting: "openMeeting", logAttendance: "logAttendance", leaveMeeting: "leaveMeeting", pageChange: "pageChange" }, ngImport: i0, template: "<article\r\n class=\"ieeesa-event-group-card\"\r\n [class.ieeesa-event-group-card--mobile]=\"isMobileView\"\r\n>\r\n <header class=\"ieeesa-event-group-card__header\">\r\n <div class=\"ieeesa-event-group-card__heading\">\r\n <!-- Status badge (Req 6.1). -->\r\n <span\r\n *ngIf=\"event?.status\"\r\n class=\"ieeesa-event-group-card__status\"\r\n >\r\n {{ event?.status }}\r\n </span>\r\n\r\n <!-- Event title (Req 6.1). -->\r\n <h3 class=\"ieeesa-event-group-card__title\">{{ event?.title }}</h3>\r\n\r\n <!-- Day indicator (Req 6.1). -->\r\n <span\r\n *ngIf=\"event?.dayIndicator\"\r\n class=\"ieeesa-event-group-card__day-indicator\"\r\n >\r\n {{ event?.dayIndicator }}\r\n </span>\r\n </div>\r\n\r\n <!-- View Event action (Req 6.3, 6.4). -->\r\n <button\r\n type=\"button\"\r\n class=\"ieeesa-event-group-card__view-event\"\r\n [attr.aria-label]=\"constants?.eventGroupCard?.ariaLabel?.viewEvent ?? 'View event details'\"\r\n (click)=\"onViewEvent()\"\r\n >\r\n {{ constants?.eventGroupCard?.viewEventLabel ?? 'View Event' }}\r\n </button>\r\n </header>\r\n\r\n <dl class=\"ieeesa-event-group-card__meta\">\r\n <!-- Meeting-count summary sub-line (Req 6.1). -->\r\n <div class=\"ieeesa-event-group-card__meta-item\">\r\n <dd class=\"ieeesa-event-group-card__meeting-count\">\r\n {{ meetingCountSummary }}\r\n </dd>\r\n </div>\r\n\r\n <!-- Start / end date (Req 6.2). -->\r\n <div class=\"ieeesa-event-group-card__meta-item\">\r\n <dd class=\"ieeesa-event-group-card__dates\">\r\n {{ formattedStartDate }}<ng-container *ngIf=\"formattedEndDate\">\r\n &ndash; {{ formattedEndDate }}</ng-container>\r\n </dd>\r\n </div>\r\n\r\n <!-- Timezone (Req 6.2). -->\r\n <div class=\"ieeesa-event-group-card__meta-item\" *ngIf=\"event?.timezone\">\r\n <dd class=\"ieeesa-event-group-card__timezone\">{{ event?.timezone }}</dd>\r\n </div>\r\n </dl>\r\n\r\n <!-- Meeting-list show/hide toggle labeled with open-for-attendance count (Req 6.5, 6.6). -->\r\n <button\r\n type=\"button\"\r\n class=\"ieeesa-event-group-card__meeting-toggle\"\r\n [attr.aria-expanded]=\"isMeetingListOpen\"\r\n [attr.aria-label]=\"constants?.eventGroupCard?.ariaLabel?.meetingListToggle ?? 'Show or hide the meeting list for this event'\"\r\n (click)=\"onToggleMeetingList()\"\r\n >\r\n {{ meetingListToggleLabel }}\r\n </button>\r\n\r\n <!-- Meeting list + per-card paginator, shown only when the toggle is open (Req 6.7, 6.8). -->\r\n <div *ngIf=\"isMeetingListOpen\" class=\"ieeesa-event-group-card__meetings\">\r\n <ieeesa-meeting-attendance-row\r\n *ngFor=\"let meeting of pagedMeetings; trackBy: trackByMeetingId\"\r\n [meeting]=\"meeting\"\r\n [attendanceState]=\"resolveAttendanceState(meeting)\"\r\n [isInFlight]=\"resolveIsInFlight(meeting)\"\r\n [permissions]=\"permissions\"\r\n (openMeeting)=\"onOpenMeeting($event)\"\r\n (logAttendance)=\"onLogAttendance($event)\"\r\n (leaveMeeting)=\"onLeaveMeeting($event)\"\r\n ></ieeesa-meeting-attendance-row>\r\n\r\n <div\r\n class=\"ieeesa-event-group-card__paginator\"\r\n [attr.aria-label]=\"constants?.eventGroupCard?.ariaLabel?.meetingListToggle ?? 'Meeting list pagination'\"\r\n >\r\n <!-- Range + total count label from constants.json (Req 6.8). -->\r\n <span class=\"ieeesa-event-group-card__paginator-range\">\r\n {{ rangeLabel }}\r\n </span>\r\n\r\n <!-- Presentation paginator emitting pageChange({ pageIndex, pageSize }) (Req 6.9, 3.3). -->\r\n <mat-paginator\r\n class=\"ieeesa-event-group-card__paginator-control\"\r\n [pageIndex]=\"pageIndex\"\r\n [pageSize]=\"pageSize\"\r\n [length]=\"totalMeetings\"\r\n [hidePageSize]=\"true\"\r\n (page)=\"onPageChange($event)\"\r\n ></mat-paginator>\r\n </div>\r\n </div>\r\n</article>\r\n", styles: [".ieeesa-subtitle{text-align:left;font-family:Calibri Regular;font-size:1.5625rem;letter-spacing:0;color:#000;opacity:1}.ieeesa-body{text-align:left;font-family:Calibri Regular;font-size:1.25rem;letter-spacing:0;color:#000;opacity:1}.ieeesa-display-lg-57{font-family:Calibri Regular;font-style:normal;font-weight:400;font-size:3.5625rem;line-height:64px;color:#000;letter-spacing:0}.ieeesa-display-md-45{font-family:Calibri Regular;font-style:normal;font-weight:400;font-size:2.813rem;line-height:52px;color:#000;letter-spacing:0}.ieeesa-display-md-47{font-family:Calibri Regular;font-style:normal;font-weight:400;font-size:2.9375rem;line-height:52px;color:#000;letter-spacing:0}.ieeesa-display-sm-38{font-family:Calibri Regular;font-style:normal;font-weight:400;font-size:2.375rem;line-height:44px;color:#000;letter-spacing:0}.ieeesa-headline-lg-32{font-family:Calibri Regular;font-style:normal;font-weight:400;font-size:2rem;line-height:40px;color:#000;letter-spacing:0}.ieeesa-headline-lg-34{font-family:Calibri Regular;font-style:normal;font-weight:400;font-size:2.125rem;line-height:40px;color:#000;letter-spacing:0}.ieeesa-headline-md-30{font-family:Calibri Regular;font-style:normal;font-weight:400;font-size:1.875rem;line-height:36px;color:#000;letter-spacing:0}.ieeesa-headline-sm-24{font-family:Calibri Regular;font-style:normal;font-weight:400;font-size:1.5rem;line-height:32px;color:#00629b;letter-spacing:0}.ieeesa-headline-sm-26{font-family:Calibri Regular;font-style:normal;font-weight:400;font-size:1.625rem;line-height:32px;color:#000;letter-spacing:0}.ieeesa-title-lg-bold-24{font-family:Calibri Bold;font-style:normal;font-weight:700;font-size:1.5rem;line-height:28px;color:#000;letter-spacing:0}.ieeesa-title-lg-24{font-family:Calibri Regular;font-style:normal;font-weight:400;font-size:1.5rem;line-height:28px;color:#000;letter-spacing:0}.ieeesa-title-md-18{font-family:Calibri Regular;font-style:normal;font-weight:400;font-size:1.125rem;line-height:24px;color:#000;letter-spacing:.009375em}.ieeesa-title-sm-14{font-family:Calibri Regular;font-style:normal;font-weight:400;font-size:.875rem;line-height:20px;color:#000;letter-spacing:.00625em}.ieeesa-title-sm-16{font-family:Calibri Regular;font-style:normal;font-weight:400;font-size:1rem;line-height:20px;color:#000;letter-spacing:.00625em}.ieeesa-label-lg-bold-16{font-family:Calibri Bold;font-style:normal;font-weight:700;font-size:1rem;line-height:20px;color:#000;letter-spacing:.00625em}.ieeesa-label-lg-16{font-family:Calibri Regular;font-style:normal;font-weight:400;font-size:1rem;line-height:20px;color:#000;letter-spacing:.00625em}.ieeesa-btn-label-lg-bold-16{font-family:Calibri Regular;font-style:normal;font-weight:700;font-size:1rem;line-height:20px;color:#00629b;letter-spacing:.00625em}.ieeesa-label-md-14{font-family:Calibri Regular;font-style:normal;font-weight:400;font-size:.875rem;line-height:16px;color:#000;letter-spacing:.03125em}.ieeesa-label-sm-13{font-family:Calibri Regular;font-style:normal;font-weight:400;font-size:.8125rem;line-height:16px;color:#000;letter-spacing:.03125em}.ieeesa-body-lg-bold-16{font-family:Calibri Bold;font-style:normal;font-weight:700;font-size:1rem;line-height:24px;color:#000;letter-spacing:.03125em}.ieeesa-body-lg-bold-18{font-family:Calibri Bold;font-style:normal;font-weight:700;font-size:1.125rem;line-height:24px;color:#000;letter-spacing:.03125em}.ieeesa-body-lg-18{font-family:Calibri Regular;font-style:normal;font-weight:400;font-size:1.125rem;line-height:24px;color:#000;letter-spacing:.03125em}.ieeesa-body-md-14{font-family:Calibri Regular;font-style:normal;font-weight:400;font-size:.875rem;line-height:20px;color:#1c1b1f;letter-spacing:.015625em}.ieeesa-body-md-16{font-family:Calibri Regular;font-style:normal;font-weight:400;font-size:1rem;line-height:20px;color:#000;letter-spacing:.015625em}.ieeesa-body-sm-14{font-family:Calibri Regular;font-style:normal;font-weight:400;font-size:.875rem;line-height:16px;color:#000;letter-spacing:.025em}.ieeesa-body-sm-12{font-family:Calibri Regular;font-style:normal;font-weight:400;font-size:.75rem;line-height:16px;color:#000;letter-spacing:.025em}.ieeesa-body-color-sm-14{font-family:Calibri Regular;font-style:normal;font-weight:400;font-size:.875rem;line-height:18px;color:#49454f;letter-spacing:.025em}.ieeesa-body-sm-bold-14{font-family:Calibri Bold;font-style:normal;font-weight:700;font-size:.875rem;line-height:16px;color:#000;letter-spacing:.025em}.ieeesa-title-inter-lg-bold-24{font-family:Inter Bold;font-style:normal;font-weight:700;font-size:1.5rem;line-height:29px;color:#000;letter-spacing:0}.mat-mdc-button.mat-mdc-button-base.mat-primary-button,.mat-mdc-button.mat-mdc-button-base.mat-secondary-button,.mat-mdc-button.mat-mdc-button-base.mat-tertiary-button,.mat-mdc-button.mat-mdc-button-base.mat-text-button{min-width:103px;width:auto;min-height:40px;height:auto;border-radius:3px;text-align:center;padding:.625em 1.5em;border:none;font-family:Calibri Bold;font-style:normal;font-weight:700;font-size:1rem;line-height:20px;color:#000;letter-spacing:.00625em}.mat-mdc-button.mat-mdc-button-base>.mat-icon{margin-right:11px}.mat-mdc-button.mat-mdc-button-base.mat-primary-button{background-color:#00629b;color:#fff}.mat-mdc-button.mat-mdc-button-base.mat-primary-button:focus{background:#1f75a7}.mat-mdc-button.mat-mdc-button-base.mat-primary-button:hover{background-color:#003e65}.mat-mdc-button.mat-mdc-button-base.mat-primary-button:active{background-color:#00629b}.mat-mdc-button.mat-mdc-button-base.mat-primary-button:disabled{background-color:#1c1b1f1f}.mat-mdc-button.mat-mdc-button-base.mat-secondary-button{color:#fff;background:#a7a8aa;box-shadow:0 1px 2px #0000004d,0 2px 6px 2px #00000026}.mat-mdc-button.mat-mdc-button-base.mat-secondary-button:hover{background:#a7a8aa}.mat-mdc-button.mat-mdc-button-base.mat-secondary-button:focus{background:#f0f5f9}.mat-mdc-button.mat-mdc-button-base.mat-secondary-button:active{background:#1d192b1f}.mat-mdc-button.mat-mdc-button-base.mat-secondary-button:disabled{background:#1c1b1f1f;color:#1c1b1f;opacity:.38}.mat-mdc-button.mat-mdc-button-base.mat-tertiary-button{background-color:#fff;border:1px solid #00629b;color:#00629b}.mat-mdc-button.mat-mdc-button-base.mat-tertiary-button:hover{background-color:#6750a414}.mat-mdc-button.mat-mdc-button-base.mat-tertiary-button:focus{background-color:#f0f5f9}.mat-mdc-button.mat-mdc-button-base.mat-tertiary-button:active{background:#6750a41f}.mat-mdc-button.mat-mdc-button-base.mat-tertiary-button:disabled{border:1px solid rgba(28,27,31,.12);color:#1c1b1f;opacity:.38}.mat-mdc-button.mat-mdc-button-base.mat-text-button{color:#00629b}.mat-mdc-button.mat-mdc-button-base.mat-text-button:hover,.mat-mdc-button.mat-mdc-button-base.mat-text-button:active{background:#6750a414}.mat-mdc-button.mat-mdc-button-base.mat-text-button:disabled{color:#1c1b1f;opacity:.38}.ieeesa-text-button{color:#cac4d0;background:none;border:none}.ieeesa-view-more-or-less-button{border:none;background:none;text-decoration:underline;color:#00629b}.flex-align-center{display:flex;align-items:center;justify-content:center}.mat-button-toggle-checked{background-color:#a7a8aa}.mat-button-toggle-checked .mat-button-toggle-label-content:before{font-family:\"Font Awesome 5 Free\";font-weight:900;content:\"\\f00c\";padding-right:.5625em}.mat-button-toggle-group .mat-button-toggle-label-content{font-family:Calibri Bold;font-style:normal;font-weight:700;font-size:1rem;line-height:20px;color:#1c1b1f;letter-spacing:.00625em}.no-bg-color-btn{color:#00629b;border-radius:3px;border:1px solid #00629b;min-height:40px;height:auto}@media (max-width: 768px){.mat-button-toggle-group .mat-button-toggle-label-content{max-width:8ch;text-overflow:ellipsis;white-space:nowrap;overflow:hidden;position:relative}}.cdk-overlay-pane .mat-mdc-tooltip .mdc-tooltip__surface{color:#525252;padding:6px 12px;font-family:Calibri Regular;font-size:1rem;border:1px solid #cac4d0;background:#fff;box-shadow:0 4px 8px #00000040;max-width:unset!important}.cdk-overlay-pane .mat-mdc-option .mdc-list-item__primary-text{font-family:Calibri Regular!important}.cdk-overlay-pane.ieeesa-modal-confirm-dialog,.cdk-overlay-pane.ieeesa-modal-dialog,.cdk-overlay-pane.ieeesa-alert-dialog{width:100%;min-width:312px}.mat-mdc-form-field{font-family:Calibri Regular;font-style:normal;font-weight:400;font-size:1rem;line-height:24px;color:#49454f;letter-spacing:.03125em}.ieeesa-cancel-modal-confirm-dialog{width:25vw!important}.ieeesa-cancel-modal-confirm-dialog .ieeesa-confirmation{padding:1.5em 1.5em 1em}.ieeesa-cancel-modal-confirm-dialog .ieeesa-confirmation .mat-mdc-dialog-content{text-align:center;padding:0 0 1em!important}.mat-mdc-button,.mat-mdc-outlined-button{--mat-mdc-button-persistent-ripple-color: unset}@media (max-width: 768px){.ieeesa-cancel-modal-confirm-dialog{width:90vw!important}}.ieeesa-wrapper-border{border:1px solid #b2b7be;border-top:none;padding:1.5em;border-radius:0 0 4px 4px}.ieeesa-event-group-card{display:flex;flex-direction:column;gap:12px;padding:16px;border:1px solid #d7d6d6;border-radius:8px;background-color:#fff}.ieeesa-event-group-card__header{display:flex;align-items:flex-start;justify-content:space-between;gap:16px}.ieeesa-event-group-card__heading{display:flex;flex-direction:column;gap:4px;min-width:0}.ieeesa-event-group-card__status{display:inline-flex;align-items:center;align-self:flex-start;padding:4px 12px;border-radius:16px;font-size:.75rem;color:#00629b;background-color:#f0f5f9}.ieeesa-event-group-card__title{margin:0;font-size:1.125rem;color:#000}.ieeesa-event-group-card__day-indicator{font-size:.8125rem;color:#939094}.ieeesa-event-group-card__view-event{flex-shrink:0;padding:8px 16px;border:1px solid #00629b;border-radius:4px;background-color:#fff;font-size:.875rem;color:#00629b;cursor:pointer}.ieeesa-event-group-card__meta{display:flex;flex-wrap:wrap;gap:4px 24px;margin:0}.ieeesa-event-group-card__meta-item{display:flex;flex-direction:column;gap:4px}.ieeesa-event-group-card__meeting-count,.ieeesa-event-group-card__dates,.ieeesa-event-group-card__timezone{margin:0;font-size:.875rem;color:#000}.ieeesa-event-group-card__timezone{color:#939094}.ieeesa-event-group-card__meeting-toggle{align-self:flex-start;padding:8px 0;border:0;background:none;text-align:left;text-decoration:underline;font-size:.875rem;color:#00629b;cursor:pointer}.ieeesa-event-group-card__meetings{display:flex;flex-direction:column;border-top:1px solid #d7d6d6}.ieeesa-event-group-card__paginator{display:flex;align-items:center;justify-content:space-between;flex-wrap:wrap;gap:8px;padding-top:8px}.ieeesa-event-group-card__paginator-range{font-size:.8125rem;color:#939094}.ieeesa-event-group-card--mobile .ieeesa-event-group-card__header{flex-direction:column;align-items:stretch}.ieeesa-event-group-card--mobile .ieeesa-event-group-card__view-event{align-self:stretch}.ieeesa-event-group-card--mobile .ieeesa-event-group-card__paginator{flex-direction:column;align-items:stretch}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "ngmodule", type: MatPaginatorModule }, { kind: "component", type: i2.MatPaginator, selector: "mat-paginator", inputs: ["disabled"], exportAs: ["matPaginator"] }, { kind: "component", type: MeetingAttendanceRowComponent, selector: "ieeesa-meeting-attendance-row", inputs: ["meeting", "attendanceState", "isInFlight", "permissions"], outputs: ["openMeeting", "logAttendance", "leaveMeeting"] }], encapsulation: i0.ViewEncapsulation.None }); }
252
+ }
253
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: EventGroupCardComponent, decorators: [{
254
+ type: Component,
255
+ args: [{ selector: 'ieeesa-event-group-card', standalone: true, imports: [CommonModule, MatPaginatorModule, MeetingAttendanceRowComponent], encapsulation: ViewEncapsulation.None, template: "<article\r\n class=\"ieeesa-event-group-card\"\r\n [class.ieeesa-event-group-card--mobile]=\"isMobileView\"\r\n>\r\n <header class=\"ieeesa-event-group-card__header\">\r\n <div class=\"ieeesa-event-group-card__heading\">\r\n <!-- Status badge (Req 6.1). -->\r\n <span\r\n *ngIf=\"event?.status\"\r\n class=\"ieeesa-event-group-card__status\"\r\n >\r\n {{ event?.status }}\r\n </span>\r\n\r\n <!-- Event title (Req 6.1). -->\r\n <h3 class=\"ieeesa-event-group-card__title\">{{ event?.title }}</h3>\r\n\r\n <!-- Day indicator (Req 6.1). -->\r\n <span\r\n *ngIf=\"event?.dayIndicator\"\r\n class=\"ieeesa-event-group-card__day-indicator\"\r\n >\r\n {{ event?.dayIndicator }}\r\n </span>\r\n </div>\r\n\r\n <!-- View Event action (Req 6.3, 6.4). -->\r\n <button\r\n type=\"button\"\r\n class=\"ieeesa-event-group-card__view-event\"\r\n [attr.aria-label]=\"constants?.eventGroupCard?.ariaLabel?.viewEvent ?? 'View event details'\"\r\n (click)=\"onViewEvent()\"\r\n >\r\n {{ constants?.eventGroupCard?.viewEventLabel ?? 'View Event' }}\r\n </button>\r\n </header>\r\n\r\n <dl class=\"ieeesa-event-group-card__meta\">\r\n <!-- Meeting-count summary sub-line (Req 6.1). -->\r\n <div class=\"ieeesa-event-group-card__meta-item\">\r\n <dd class=\"ieeesa-event-group-card__meeting-count\">\r\n {{ meetingCountSummary }}\r\n </dd>\r\n </div>\r\n\r\n <!-- Start / end date (Req 6.2). -->\r\n <div class=\"ieeesa-event-group-card__meta-item\">\r\n <dd class=\"ieeesa-event-group-card__dates\">\r\n {{ formattedStartDate }}<ng-container *ngIf=\"formattedEndDate\">\r\n &ndash; {{ formattedEndDate }}</ng-container>\r\n </dd>\r\n </div>\r\n\r\n <!-- Timezone (Req 6.2). -->\r\n <div class=\"ieeesa-event-group-card__meta-item\" *ngIf=\"event?.timezone\">\r\n <dd class=\"ieeesa-event-group-card__timezone\">{{ event?.timezone }}</dd>\r\n </div>\r\n </dl>\r\n\r\n <!-- Meeting-list show/hide toggle labeled with open-for-attendance count (Req 6.5, 6.6). -->\r\n <button\r\n type=\"button\"\r\n class=\"ieeesa-event-group-card__meeting-toggle\"\r\n [attr.aria-expanded]=\"isMeetingListOpen\"\r\n [attr.aria-label]=\"constants?.eventGroupCard?.ariaLabel?.meetingListToggle ?? 'Show or hide the meeting list for this event'\"\r\n (click)=\"onToggleMeetingList()\"\r\n >\r\n {{ meetingListToggleLabel }}\r\n </button>\r\n\r\n <!-- Meeting list + per-card paginator, shown only when the toggle is open (Req 6.7, 6.8). -->\r\n <div *ngIf=\"isMeetingListOpen\" class=\"ieeesa-event-group-card__meetings\">\r\n <ieeesa-meeting-attendance-row\r\n *ngFor=\"let meeting of pagedMeetings; trackBy: trackByMeetingId\"\r\n [meeting]=\"meeting\"\r\n [attendanceState]=\"resolveAttendanceState(meeting)\"\r\n [isInFlight]=\"resolveIsInFlight(meeting)\"\r\n [permissions]=\"permissions\"\r\n (openMeeting)=\"onOpenMeeting($event)\"\r\n (logAttendance)=\"onLogAttendance($event)\"\r\n (leaveMeeting)=\"onLeaveMeeting($event)\"\r\n ></ieeesa-meeting-attendance-row>\r\n\r\n <div\r\n class=\"ieeesa-event-group-card__paginator\"\r\n [attr.aria-label]=\"constants?.eventGroupCard?.ariaLabel?.meetingListToggle ?? 'Meeting list pagination'\"\r\n >\r\n <!-- Range + total count label from constants.json (Req 6.8). -->\r\n <span class=\"ieeesa-event-group-card__paginator-range\">\r\n {{ rangeLabel }}\r\n </span>\r\n\r\n <!-- Presentation paginator emitting pageChange({ pageIndex, pageSize }) (Req 6.9, 3.3). -->\r\n <mat-paginator\r\n class=\"ieeesa-event-group-card__paginator-control\"\r\n [pageIndex]=\"pageIndex\"\r\n [pageSize]=\"pageSize\"\r\n [length]=\"totalMeetings\"\r\n [hidePageSize]=\"true\"\r\n (page)=\"onPageChange($event)\"\r\n ></mat-paginator>\r\n </div>\r\n </div>\r\n</article>\r\n", styles: [".ieeesa-subtitle{text-align:left;font-family:Calibri Regular;font-size:1.5625rem;letter-spacing:0;color:#000;opacity:1}.ieeesa-body{text-align:left;font-family:Calibri Regular;font-size:1.25rem;letter-spacing:0;color:#000;opacity:1}.ieeesa-display-lg-57{font-family:Calibri Regular;font-style:normal;font-weight:400;font-size:3.5625rem;line-height:64px;color:#000;letter-spacing:0}.ieeesa-display-md-45{font-family:Calibri Regular;font-style:normal;font-weight:400;font-size:2.813rem;line-height:52px;color:#000;letter-spacing:0}.ieeesa-display-md-47{font-family:Calibri Regular;font-style:normal;font-weight:400;font-size:2.9375rem;line-height:52px;color:#000;letter-spacing:0}.ieeesa-display-sm-38{font-family:Calibri Regular;font-style:normal;font-weight:400;font-size:2.375rem;line-height:44px;color:#000;letter-spacing:0}.ieeesa-headline-lg-32{font-family:Calibri Regular;font-style:normal;font-weight:400;font-size:2rem;line-height:40px;color:#000;letter-spacing:0}.ieeesa-headline-lg-34{font-family:Calibri Regular;font-style:normal;font-weight:400;font-size:2.125rem;line-height:40px;color:#000;letter-spacing:0}.ieeesa-headline-md-30{font-family:Calibri Regular;font-style:normal;font-weight:400;font-size:1.875rem;line-height:36px;color:#000;letter-spacing:0}.ieeesa-headline-sm-24{font-family:Calibri Regular;font-style:normal;font-weight:400;font-size:1.5rem;line-height:32px;color:#00629b;letter-spacing:0}.ieeesa-headline-sm-26{font-family:Calibri Regular;font-style:normal;font-weight:400;font-size:1.625rem;line-height:32px;color:#000;letter-spacing:0}.ieeesa-title-lg-bold-24{font-family:Calibri Bold;font-style:normal;font-weight:700;font-size:1.5rem;line-height:28px;color:#000;letter-spacing:0}.ieeesa-title-lg-24{font-family:Calibri Regular;font-style:normal;font-weight:400;font-size:1.5rem;line-height:28px;color:#000;letter-spacing:0}.ieeesa-title-md-18{font-family:Calibri Regular;font-style:normal;font-weight:400;font-size:1.125rem;line-height:24px;color:#000;letter-spacing:.009375em}.ieeesa-title-sm-14{font-family:Calibri Regular;font-style:normal;font-weight:400;font-size:.875rem;line-height:20px;color:#000;letter-spacing:.00625em}.ieeesa-title-sm-16{font-family:Calibri Regular;font-style:normal;font-weight:400;font-size:1rem;line-height:20px;color:#000;letter-spacing:.00625em}.ieeesa-label-lg-bold-16{font-family:Calibri Bold;font-style:normal;font-weight:700;font-size:1rem;line-height:20px;color:#000;letter-spacing:.00625em}.ieeesa-label-lg-16{font-family:Calibri Regular;font-style:normal;font-weight:400;font-size:1rem;line-height:20px;color:#000;letter-spacing:.00625em}.ieeesa-btn-label-lg-bold-16{font-family:Calibri Regular;font-style:normal;font-weight:700;font-size:1rem;line-height:20px;color:#00629b;letter-spacing:.00625em}.ieeesa-label-md-14{font-family:Calibri Regular;font-style:normal;font-weight:400;font-size:.875rem;line-height:16px;color:#000;letter-spacing:.03125em}.ieeesa-label-sm-13{font-family:Calibri Regular;font-style:normal;font-weight:400;font-size:.8125rem;line-height:16px;color:#000;letter-spacing:.03125em}.ieeesa-body-lg-bold-16{font-family:Calibri Bold;font-style:normal;font-weight:700;font-size:1rem;line-height:24px;color:#000;letter-spacing:.03125em}.ieeesa-body-lg-bold-18{font-family:Calibri Bold;font-style:normal;font-weight:700;font-size:1.125rem;line-height:24px;color:#000;letter-spacing:.03125em}.ieeesa-body-lg-18{font-family:Calibri Regular;font-style:normal;font-weight:400;font-size:1.125rem;line-height:24px;color:#000;letter-spacing:.03125em}.ieeesa-body-md-14{font-family:Calibri Regular;font-style:normal;font-weight:400;font-size:.875rem;line-height:20px;color:#1c1b1f;letter-spacing:.015625em}.ieeesa-body-md-16{font-family:Calibri Regular;font-style:normal;font-weight:400;font-size:1rem;line-height:20px;color:#000;letter-spacing:.015625em}.ieeesa-body-sm-14{font-family:Calibri Regular;font-style:normal;font-weight:400;font-size:.875rem;line-height:16px;color:#000;letter-spacing:.025em}.ieeesa-body-sm-12{font-family:Calibri Regular;font-style:normal;font-weight:400;font-size:.75rem;line-height:16px;color:#000;letter-spacing:.025em}.ieeesa-body-color-sm-14{font-family:Calibri Regular;font-style:normal;font-weight:400;font-size:.875rem;line-height:18px;color:#49454f;letter-spacing:.025em}.ieeesa-body-sm-bold-14{font-family:Calibri Bold;font-style:normal;font-weight:700;font-size:.875rem;line-height:16px;color:#000;letter-spacing:.025em}.ieeesa-title-inter-lg-bold-24{font-family:Inter Bold;font-style:normal;font-weight:700;font-size:1.5rem;line-height:29px;color:#000;letter-spacing:0}.mat-mdc-button.mat-mdc-button-base.mat-primary-button,.mat-mdc-button.mat-mdc-button-base.mat-secondary-button,.mat-mdc-button.mat-mdc-button-base.mat-tertiary-button,.mat-mdc-button.mat-mdc-button-base.mat-text-button{min-width:103px;width:auto;min-height:40px;height:auto;border-radius:3px;text-align:center;padding:.625em 1.5em;border:none;font-family:Calibri Bold;font-style:normal;font-weight:700;font-size:1rem;line-height:20px;color:#000;letter-spacing:.00625em}.mat-mdc-button.mat-mdc-button-base>.mat-icon{margin-right:11px}.mat-mdc-button.mat-mdc-button-base.mat-primary-button{background-color:#00629b;color:#fff}.mat-mdc-button.mat-mdc-button-base.mat-primary-button:focus{background:#1f75a7}.mat-mdc-button.mat-mdc-button-base.mat-primary-button:hover{background-color:#003e65}.mat-mdc-button.mat-mdc-button-base.mat-primary-button:active{background-color:#00629b}.mat-mdc-button.mat-mdc-button-base.mat-primary-button:disabled{background-color:#1c1b1f1f}.mat-mdc-button.mat-mdc-button-base.mat-secondary-button{color:#fff;background:#a7a8aa;box-shadow:0 1px 2px #0000004d,0 2px 6px 2px #00000026}.mat-mdc-button.mat-mdc-button-base.mat-secondary-button:hover{background:#a7a8aa}.mat-mdc-button.mat-mdc-button-base.mat-secondary-button:focus{background:#f0f5f9}.mat-mdc-button.mat-mdc-button-base.mat-secondary-button:active{background:#1d192b1f}.mat-mdc-button.mat-mdc-button-base.mat-secondary-button:disabled{background:#1c1b1f1f;color:#1c1b1f;opacity:.38}.mat-mdc-button.mat-mdc-button-base.mat-tertiary-button{background-color:#fff;border:1px solid #00629b;color:#00629b}.mat-mdc-button.mat-mdc-button-base.mat-tertiary-button:hover{background-color:#6750a414}.mat-mdc-button.mat-mdc-button-base.mat-tertiary-button:focus{background-color:#f0f5f9}.mat-mdc-button.mat-mdc-button-base.mat-tertiary-button:active{background:#6750a41f}.mat-mdc-button.mat-mdc-button-base.mat-tertiary-button:disabled{border:1px solid rgba(28,27,31,.12);color:#1c1b1f;opacity:.38}.mat-mdc-button.mat-mdc-button-base.mat-text-button{color:#00629b}.mat-mdc-button.mat-mdc-button-base.mat-text-button:hover,.mat-mdc-button.mat-mdc-button-base.mat-text-button:active{background:#6750a414}.mat-mdc-button.mat-mdc-button-base.mat-text-button:disabled{color:#1c1b1f;opacity:.38}.ieeesa-text-button{color:#cac4d0;background:none;border:none}.ieeesa-view-more-or-less-button{border:none;background:none;text-decoration:underline;color:#00629b}.flex-align-center{display:flex;align-items:center;justify-content:center}.mat-button-toggle-checked{background-color:#a7a8aa}.mat-button-toggle-checked .mat-button-toggle-label-content:before{font-family:\"Font Awesome 5 Free\";font-weight:900;content:\"\\f00c\";padding-right:.5625em}.mat-button-toggle-group .mat-button-toggle-label-content{font-family:Calibri Bold;font-style:normal;font-weight:700;font-size:1rem;line-height:20px;color:#1c1b1f;letter-spacing:.00625em}.no-bg-color-btn{color:#00629b;border-radius:3px;border:1px solid #00629b;min-height:40px;height:auto}@media (max-width: 768px){.mat-button-toggle-group .mat-button-toggle-label-content{max-width:8ch;text-overflow:ellipsis;white-space:nowrap;overflow:hidden;position:relative}}.cdk-overlay-pane .mat-mdc-tooltip .mdc-tooltip__surface{color:#525252;padding:6px 12px;font-family:Calibri Regular;font-size:1rem;border:1px solid #cac4d0;background:#fff;box-shadow:0 4px 8px #00000040;max-width:unset!important}.cdk-overlay-pane .mat-mdc-option .mdc-list-item__primary-text{font-family:Calibri Regular!important}.cdk-overlay-pane.ieeesa-modal-confirm-dialog,.cdk-overlay-pane.ieeesa-modal-dialog,.cdk-overlay-pane.ieeesa-alert-dialog{width:100%;min-width:312px}.mat-mdc-form-field{font-family:Calibri Regular;font-style:normal;font-weight:400;font-size:1rem;line-height:24px;color:#49454f;letter-spacing:.03125em}.ieeesa-cancel-modal-confirm-dialog{width:25vw!important}.ieeesa-cancel-modal-confirm-dialog .ieeesa-confirmation{padding:1.5em 1.5em 1em}.ieeesa-cancel-modal-confirm-dialog .ieeesa-confirmation .mat-mdc-dialog-content{text-align:center;padding:0 0 1em!important}.mat-mdc-button,.mat-mdc-outlined-button{--mat-mdc-button-persistent-ripple-color: unset}@media (max-width: 768px){.ieeesa-cancel-modal-confirm-dialog{width:90vw!important}}.ieeesa-wrapper-border{border:1px solid #b2b7be;border-top:none;padding:1.5em;border-radius:0 0 4px 4px}.ieeesa-event-group-card{display:flex;flex-direction:column;gap:12px;padding:16px;border:1px solid #d7d6d6;border-radius:8px;background-color:#fff}.ieeesa-event-group-card__header{display:flex;align-items:flex-start;justify-content:space-between;gap:16px}.ieeesa-event-group-card__heading{display:flex;flex-direction:column;gap:4px;min-width:0}.ieeesa-event-group-card__status{display:inline-flex;align-items:center;align-self:flex-start;padding:4px 12px;border-radius:16px;font-size:.75rem;color:#00629b;background-color:#f0f5f9}.ieeesa-event-group-card__title{margin:0;font-size:1.125rem;color:#000}.ieeesa-event-group-card__day-indicator{font-size:.8125rem;color:#939094}.ieeesa-event-group-card__view-event{flex-shrink:0;padding:8px 16px;border:1px solid #00629b;border-radius:4px;background-color:#fff;font-size:.875rem;color:#00629b;cursor:pointer}.ieeesa-event-group-card__meta{display:flex;flex-wrap:wrap;gap:4px 24px;margin:0}.ieeesa-event-group-card__meta-item{display:flex;flex-direction:column;gap:4px}.ieeesa-event-group-card__meeting-count,.ieeesa-event-group-card__dates,.ieeesa-event-group-card__timezone{margin:0;font-size:.875rem;color:#000}.ieeesa-event-group-card__timezone{color:#939094}.ieeesa-event-group-card__meeting-toggle{align-self:flex-start;padding:8px 0;border:0;background:none;text-align:left;text-decoration:underline;font-size:.875rem;color:#00629b;cursor:pointer}.ieeesa-event-group-card__meetings{display:flex;flex-direction:column;border-top:1px solid #d7d6d6}.ieeesa-event-group-card__paginator{display:flex;align-items:center;justify-content:space-between;flex-wrap:wrap;gap:8px;padding-top:8px}.ieeesa-event-group-card__paginator-range{font-size:.8125rem;color:#939094}.ieeesa-event-group-card--mobile .ieeesa-event-group-card__header{flex-direction:column;align-items:stretch}.ieeesa-event-group-card--mobile .ieeesa-event-group-card__view-event{align-self:stretch}.ieeesa-event-group-card--mobile .ieeesa-event-group-card__paginator{flex-direction:column;align-items:stretch}\n"] }]
256
+ }], propDecorators: { event: [{
257
+ type: Input
258
+ }], permissions: [{
259
+ type: Input
260
+ }], attendanceStates: [{
261
+ type: Input
262
+ }], inFlightMeetingIds: [{
263
+ type: Input
264
+ }], isMobileView: [{
265
+ type: Input
266
+ }], viewEvent: [{
267
+ type: Output
268
+ }], openMeeting: [{
269
+ type: Output
270
+ }], logAttendance: [{
271
+ type: Output
272
+ }], leaveMeeting: [{
273
+ type: Output
274
+ }], pageChange: [{
275
+ type: Output
276
+ }] } });
277
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXZlbnQtZ3JvdXAtY2FyZC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9kYXNoYm9hcmQvc3JjL2xpYi9jb21wb25lbnRzL2V2ZW50LWdyb3VwLWNhcmQvZXZlbnQtZ3JvdXAtY2FyZC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9kYXNoYm9hcmQvc3JjL2xpYi9jb21wb25lbnRzL2V2ZW50LWdyb3VwLWNhcmQvZXZlbnQtZ3JvdXAtY2FyZC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDL0MsT0FBTyxFQUNMLFNBQVMsRUFDVCxZQUFZLEVBQ1osS0FBSyxFQUNMLE1BQU0sRUFDTixpQkFBaUIsR0FDbEIsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUNMLGtCQUFrQixHQUVuQixNQUFNLDZCQUE2QixDQUFDO0FBQ3JDLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxPQUFPLENBQUM7QUFFakMsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLHFDQUFxQyxDQUFDO0FBSXRFLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUN4RCxPQUFPLEVBQUUsNkJBQTZCLEVBQUUsTUFBTSw0REFBNEQsQ0FBQztBQUMzRyxPQUFPLEtBQUssU0FBUyxNQUFNLDZCQUE2QixDQUFDOzs7O0FBRXpEOzs7Ozs7Ozs7Ozs7OztHQWNHO0FBVUgsTUFBTSxPQUFPLHVCQUF1QjtJQVRwQztRQVVFLHlEQUF5RDtRQUN6RCxjQUFTLEdBQUcsU0FBUyxDQUFDO1FBS3RCLGtGQUFrRjtRQUN6RSxnQkFBVyxHQUFnQztZQUNsRCxnQkFBZ0IsRUFBRSxLQUFLO1lBQ3ZCLGVBQWUsRUFBRSxLQUFLO1NBQ3ZCLENBQUM7UUFFRiw4RUFBOEU7UUFDckUscUJBQWdC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Q0FBQyxPQUFPLENBQUMsUUFBUSxFQUFFLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7UUFDN0QsT0FBTyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUM7SUFDN0QsQ0FBQzsrR0FwUVUsdUJBQXVCO21HQUF2Qix1QkFBdUIsa1pDOUNwQyxvOUhBd0dBLGd4VkQvRFksWUFBWSwrUEFBRSxrQkFBa0IsMEpBQUUsNkJBQTZCOzs0RkFLOUQsdUJBQXVCO2tCQVRuQyxTQUFTOytCQUVFLHlCQUF5QixjQUN2QixJQUFJLFdBQ1AsQ0FBQyxZQUFZLEVBQUUsa0JBQWtCLEVBQUUsNkJBQTZCLENBQUMsaUJBRzNELGlCQUFpQixDQUFDLElBQUk7OEJBTzVCLEtBQUs7c0JBQWIsS0FBSztnQkFHRyxXQUFXO3NCQUFuQixLQUFLO2dCQU1HLGdCQUFnQjtzQkFBeEIsS0FBSztnQkFHRyxrQkFBa0I7c0JBQTFCLEtBQUs7Z0JBR0csWUFBWTtzQkFBcEIsS0FBSztnQkFHSSxTQUFTO3NCQUFsQixNQUFNO2dCQUdHLFdBQVc7c0JBQXBCLE1BQU07Z0JBR0csYUFBYTtzQkFBdEIsTUFBTTtnQkFHRyxZQUFZO3NCQUFyQixNQUFNO2dCQUdHLFVBQVU7c0JBQW5CLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21tb25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xyXG5pbXBvcnQge1xyXG4gIENvbXBvbmVudCxcclxuICBFdmVudEVtaXR0ZXIsXHJcbiAgSW5wdXQsXHJcbiAgT3V0cHV0LFxyXG4gIFZpZXdFbmNhcHN1bGF0aW9uLFxyXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQge1xyXG4gIE1hdFBhZ2luYXRvck1vZHVsZSxcclxuICBQYWdlRXZlbnQsXHJcbn0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvcGFnaW5hdG9yJztcclxuaW1wb3J0IHsgRGF0ZVRpbWUgfSBmcm9tICdsdXhvbic7XHJcbmltcG9ydCB7IEF0dGVuZGFuY2VBY3Rpb25QZXJtaXNzaW9ucyB9IGZyb20gJy4uLy4uL21vZGVscy9hdHRlbmRhbmNlLWFjdGlvbi1wZXJtaXNzaW9ucy5tb2RlbCc7XHJcbmltcG9ydCB7IEF0dGVuZGFuY2VTdGF0ZSB9IGZyb20gJy4uLy4uL21vZGVscy9hdHRlbmRhbmNlLXN0YXRlLm1vZGVsJztcclxuaW1wb3J0IHsgTWVldGluZ1JvdyB9IGZyb20gJy4uLy4uL21vZGVscy9tZWV0aW5nLXJvdy5tb2RlbCc7XHJcbmltcG9ydCB7IFBhZ2VDaGFuZ2UgfSBmcm9tICcuLi8uLi9tb2RlbHMvcGFnZS1jaGFuZ2UubW9kZWwnO1xyXG5pbXBvcnQgeyBVcGNvbWluZ0V2ZW50IH0gZnJvbSAnLi4vLi4vbW9kZWxzL3VwY29taW5nLWV2ZW50Lm1vZGVsJztcclxuaW1wb3J0IHsgRGF0ZUZvcm1hdHMgfSBmcm9tICcuLi8uLi9hc3NldHMvZGF0ZS1mb3JtYXRzJztcclxuaW1wb3J0IHsgTWVldGluZ0F0dGVuZGFuY2VSb3dDb21wb25lbnQgfSBmcm9tICcuLi9tZWV0aW5nLWF0dGVuZGFuY2Utcm93L21lZXRpbmctYXR0ZW5kYW5jZS1yb3cuY29tcG9uZW50JztcclxuaW1wb3J0ICogYXMgY29uc3RhbnRzIGZyb20gJy4uLy4uL2Fzc2V0cy9jb25zdGFudHMuanNvbic7XHJcblxyXG4vKipcclxuICogRXZlbnRfR3JvdXBfQ2FyZCByZW5kZXJzIGEgc2luZ2xlIHVwY29taW5nIGV2ZW50IGFzIGEgY2FyZDogdGhlIHN0YXR1cyBiYWRnZSxcclxuICogdGl0bGUsIGRheSBpbmRpY2F0b3IsIG1lZXRpbmctY291bnQgc3VtbWFyeSBzdWItbGluZSwgc3RhcnQvZW5kIGRhdGUsIGFuZFxyXG4gKiB0aW1lem9uZSAoYWxsIGx1eG9uLWZvcm1hdHRlZCkuIEl0IGV4cG9zZXMgYSBcIlZpZXcgRXZlbnRcIiBhY3Rpb24sIGFcclxuICogc2hvdy9oaWRlIHRvZ2dsZSBmb3IgdGhlIG1lZXRpbmcgbGlzdCBsYWJlbGVkIHdpdGggdGhlIG9wZW4tZm9yLWF0dGVuZGFuY2VcclxuICogY291bnQsIHRoZSBwZXItZXZlbnQgbWVldGluZyByb3dzIChvbmUge0BsaW5rIE1lZXRpbmdBdHRlbmRhbmNlUm93Q29tcG9uZW50fVxyXG4gKiBwZXIgbWVldGluZyBvbiB0aGUgY3VycmVudCBwYWdlKSwgYW5kIGEgcGVyLWNhcmQgcGFnaW5hdG9yLlxyXG4gKlxyXG4gKiBUaGUgY29tcG9uZW50IGlzIHB1cmVseSBwcmVzZW50YXRpb25hbCDigJQgaXQgZW1pdHMgbmF2aWdhdGlvbiwgYXR0ZW5kYW5jZSwgYW5kXHJcbiAqIHBhZ2luYXRpb24gaW50ZW50cyB2aWEgYEBPdXRwdXQoKWAgYW5kIG5ldmVyIHBlcmZvcm1zIG5hdmlnYXRpb24gb3IgSFRUUFxyXG4gKiBpdHNlbGYuIE1lZXRpbmctcm93IG91dHB1dHMgKGBvcGVuTWVldGluZ2AvYGxvZ0F0dGVuZGFuY2VgL2BsZWF2ZU1lZXRpbmdgKSBhcmVcclxuICogYnViYmxlZCB1cHdhcmQgdW5jaGFuZ2VkIHNvIHRoZSBjb250YWluZXIgY2FuIGRlbGVnYXRlIHRvIHRoZSBzZXJ2aWNlLlxyXG4gKiBAZXhwb3J0XHJcbiAqIEBjbGFzcyBFdmVudEdyb3VwQ2FyZENvbXBvbmVudFxyXG4gKi9cclxuQENvbXBvbmVudCh7XHJcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEBhbmd1bGFyLWVzbGludC9jb21wb25lbnQtc2VsZWN0b3JcclxuICBzZWxlY3RvcjogJ2llZWVzYS1ldmVudC1ncm91cC1jYXJkJyxcclxuICBzdGFuZGFsb25lOiB0cnVlLFxyXG4gIGltcG9ydHM6IFtDb21tb25Nb2R1bGUsIE1hdFBhZ2luYXRvck1vZHVsZSwgTWVldGluZ0F0dGVuZGFuY2VSb3dDb21wb25lbnRdLFxyXG4gIHRlbXBsYXRlVXJsOiAnLi9ldmVudC1ncm91cC1jYXJkLmNvbXBvbmVudC5odG1sJyxcclxuICBzdHlsZVVybHM6IFsnLi9ldmVudC1ncm91cC1jYXJkLmNvbXBvbmVudC5zY3NzJ10sXHJcbiAgZW5jYXBzdWxhdGlvbjogVmlld0VuY2Fwc3VsYXRpb24uTm9uZSxcclxufSlcclxuZXhwb3J0IGNsYXNzIEV2ZW50R3JvdXBDYXJkQ29tcG9uZW50IHtcclxuICAvKiogVXNlci1mYWNpbmcgc3RyaW5ncyBzb3VyY2VkIGZyb20gYGNvbnN0YW50cy5qc29uYC4gKi9cclxuICBjb25zdGFudHMgPSBjb25zdGFudHM7XHJcblxyXG4gIC8qKiBUaGUgdXBjb21pbmcgZXZlbnQgcmVuZGVyZWQgYnkgdGhpcyBjYXJkLiAqL1xyXG4gIEBJbnB1dCgpIGV2ZW50ITogVXBjb21pbmdFdmVudDtcclxuXHJcbiAgLyoqIEhvc3QgcGVybWlzc2lvbnMgZ2F0aW5nIHRoZSBwZXItcm93IGxvZy1hdHRlbmRhbmNlIC8gbGVhdmUtbWVldGluZyBidXR0b25zLiAqL1xyXG4gIEBJbnB1dCgpIHBlcm1pc3Npb25zOiBBdHRlbmRhbmNlQWN0aW9uUGVybWlzc2lvbnMgPSB7XHJcbiAgICBjYW5Mb2dBdHRlbmRhbmNlOiBmYWxzZSxcclxuICAgIGNhbkxlYXZlTWVldGluZzogZmFsc2UsXHJcbiAgfTtcclxuXHJcbiAgLyoqIE1hcCBvZiBtZWV0aW5nIGlkIHRvIGN1cnJlbnQgYXR0ZW5kYW5jZSBzdGF0ZSwgcGFzc2VkIGRvd24gdG8gZWFjaCByb3cuICovXHJcbiAgQElucHV0KCkgYXR0ZW5kYW5jZVN0YXRlczogUmVjb3JkPHN0cmluZywgQXR0ZW5kYW5jZVN0YXRlPiA9IHt9O1xyXG5cclxuICAvKiogU2V0IG9mIG1lZXRpbmcgaWRzIHdpdGggYW4gYXR0ZW5kYW5jZSBhY3Rpb24gYXdhaXRpbmcgcmVzb2x1dGlvbi4gKi9cclxuICBASW5wdXQoKSBpbkZsaWdodE1lZXRpbmdJZHM6IFJlYWRvbmx5U2V0PHN0cmluZz4gPSBuZXcgU2V0PHN0cmluZz4oKTtcclxuXHJcbiAgLyoqIFdoZXRoZXIgdGhlIGhvc3QgaGFzIGRldGVybWluZWQgdGhlIHZpZXdwb3J0IGlzIGF0L2JlbG93IHRoZSBtb2JpbGUgYnJlYWtwb2ludC4gKi9cclxuICBASW5wdXQoKSBpc01vYmlsZVZpZXcgPSBmYWxzZTtcclxuXHJcbiAgLyoqIEVtaXRzIHRoZSBldmVudCBpZCB3aGVuIHRoZSBcIlZpZXcgRXZlbnRcIiBidXR0b24gaXMgYWN0aXZhdGVkIChSZXEgNi40KS4gKi9cclxuICBAT3V0cHV0KCkgdmlld0V2ZW50ID0gbmV3IEV2ZW50RW1pdHRlcjxzdHJpbmc+KCk7XHJcblxyXG4gIC8qKiBCdWJibGVzIHRoZSBtZWV0aW5nIGlkIHdoZW4gYSByb3cncyBtZWV0aW5nLW5hbWUgbGluayBpcyBhY3RpdmF0ZWQgKFJlcSA2LjcsIDcuNCkuICovXHJcbiAgQE91dHB1dCgpIG9wZW5NZWV0aW5nID0gbmV3IEV2ZW50RW1pdHRlcjxzdHJpbmc+KCk7XHJcblxyXG4gIC8qKiBCdWJibGVzIHRoZSBtZWV0aW5nIGlkIHdoZW4gYSByb3cgcmVxdWVzdHMgbG9nZ2luZyBhdHRlbmRhbmNlIChSZXEgNi43LCA3LjcpLiAqL1xyXG4gIEBPdXRwdXQoKSBsb2dBdHRlbmRhbmNlID0gbmV3IEV2ZW50RW1pdHRlcjxzdHJpbmc+KCk7XHJcblxyXG4gIC8qKiBCdWJibGVzIHRoZSBtZWV0aW5nIGlkIHdoZW4gYSByb3cgcmVxdWVzdHMgbGVhdmluZyB0aGUgbWVldGluZyAoUmVxIDYuNywgNy44KS4gKi9cclxuICBAT3V0cHV0KCkgbGVhdmVNZWV0aW5nID0gbmV3IEV2ZW50RW1pdHRlcjxzdHJpbmc+KCk7XHJcblxyXG4gIC8qKiBFbWl0cyB0aGUgcmVxdWVzdGVkIHBhZ2Ugd2hlbiB0aGUgcGVyLWNhcmQgcGFnaW5hdG9yIGNoYW5nZXMgKFJlcSA2LjksIDMuMykuICovXHJcbiAgQE91dHB1dCgpIHBhZ2VDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPFBhZ2VDaGFuZ2U+KCk7XHJcblxyXG4gIC8qKiBUaGUgZGVmYXVsdCBwYWdlIHNpemUgZm9yIHRoZSBwZXItY2FyZCBtZWV0aW5nIHBhZ2luYXRvci4gKi9cclxuICByZWFkb25seSBkZWZhdWx0UGFnZVNpemUgPSA1O1xyXG5cclxuICAvKiogVGhlIGN1cnJlbnQgemVyby1iYXNlZCBwYWdlIGluZGV4IG9mIHRoZSBtZWV0aW5nIGxpc3QuICovXHJcbiAgcGFnZUluZGV4ID0gMDtcclxuXHJcbiAgLyoqIFRoZSBjdXJyZW50IHBhZ2Ugc2l6ZSBvZiB0aGUgbWVldGluZyBsaXN0LiAqL1xyXG4gIHBhZ2VTaXplID0gdGhpcy5kZWZhdWx0UGFnZVNpemU7XHJcblxyXG4gIC8qKiBXaGV0aGVyIHRoZSBtZWV0aW5nIGxpc3QgaXMgY3VycmVudGx5IHNob3duICh0b2dnbGVkIG9wZW4pLiAqL1xyXG4gIGlzTWVldGluZ0xpc3RPcGVuID0gZmFsc2U7XHJcblxyXG4gIC8qKlxyXG4gICAqIFRoZSBmdWxsIGxpc3Qgb2YgbWVldGluZ3MgZm9yIHRoZSBldmVudCwgZGVmYXVsdGluZyB0byBhbiBlbXB0eSBsaXN0IHdoZW5cclxuICAgKiB0aGUgZXZlbnQgaGFzIG5vbmUuXHJcbiAgICogQHJldHVybiB7TWVldGluZ1Jvd1tdfSBUaGUgZXZlbnQncyBtZWV0aW5ncy5cclxuICAgKiBAbWVtYmVyb2YgRXZlbnRHcm91cENhcmRDb21wb25lbnRcclxuICAgKi9cclxuICBnZXQgbWVldGluZ3MoKTogTWVldGluZ1Jvd1tdIHtcclxuICAgIHJldHVybiB0aGlzLmV2ZW50Py5tZWV0aW5ncyA/PyBbXTtcclxuICB9XHJcblxyXG4gIC8qKiBUaGUgdG90YWwgbnVtYmVyIG9mIG1lZXRpbmdzIGZvciB0aGUgZXZlbnQgKHBhZ2luYXRvciBsZW5ndGgpLiAqL1xyXG4gIGdldCB0b3RhbE1lZXRpbmdzKCk6IG51bWJlciB7XHJcbiAgICByZXR1cm4gdGhpcy5tZWV0aW5ncy5sZW5ndGg7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBUaGUgc2xpY2Ugb2YgbWVldGluZ3MgZm9yIHRoZSBjdXJyZW50IHBhZ2UsIHVzZWQgYnkgdGhlIHJvdyBgKm5nRm9yYC5cclxuICAgKiBAcmV0dXJuIHtNZWV0aW5nUm93W119IFRoZSBtZWV0aW5ncyBvbiB0aGUgY3VycmVudCBwYWdlLlxyXG4gICAqIEBtZW1iZXJvZiBFdmVudEdyb3VwQ2FyZENvbXBvbmVudFxyXG4gICAqL1xyXG4gIGdldCBwYWdlZE1lZXRpbmdzKCk6IE1lZXRpbmdSb3dbXSB7XHJcbiAgICBjb25zdCBzdGFydCA9IHRoaXMucGFnZUluZGV4ICogdGhpcy5wYWdlU2l6ZTtcclxuICAgIHJldHVybiB0aGlzLm1lZXRpbmdzLnNsaWNlKHN0YXJ0LCBzdGFydCArIHRoaXMucGFnZVNpemUpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogVGhlIG9uZS1iYXNlZCBpbmRleCBvZiB0aGUgZmlyc3QgbWVldGluZyBzaG93biBvbiB0aGUgY3VycmVudCBwYWdlLCBvciAwXHJcbiAgICogd2hlbiB0aGVyZSBhcmUgbm8gbWVldGluZ3MuXHJcbiAgICogQHJldHVybiB7bnVtYmVyfSBUaGUgc3RhcnQgaW5kZXggZm9yIHRoZSByYW5nZSB0ZW1wbGF0ZS5cclxuICAgKiBAbWVtYmVyb2YgRXZlbnRHcm91cENhcmRDb21wb25lbnRcclxuICAgKi9cclxuICBnZXQgcmFuZ2VTdGFydCgpOiBudW1iZXIge1xyXG4gICAgcmV0dXJuIHRoaXMudG90YWxNZWV0aW5ncyA9PT0gMCA/IDAgOiB0aGlzLnBhZ2VJbmRleCAqIHRoaXMucGFnZVNpemUgKyAxO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogVGhlIG9uZS1iYXNlZCBpbmRleCBvZiB0aGUgbGFzdCBtZWV0aW5nIHNob3duIG9uIHRoZSBjdXJyZW50IHBhZ2UsIGNsYW1wZWRcclxuICAgKiB0byB0aGUgdG90YWwgbWVldGluZyBjb3VudC5cclxuICAgKiBAcmV0dXJuIHtudW1iZXJ9IFRoZSBlbmQgaW5kZXggZm9yIHRoZSByYW5nZSB0ZW1wbGF0ZS5cclxuICAgKiBAbWVtYmVyb2YgRXZlbnRHcm91cENhcmRDb21wb25lbnRcclxuICAgKi9cclxuICBnZXQgcmFuZ2VFbmQoKTogbnVtYmVyIHtcclxuICAgIHJldHVybiBNYXRoLm1pbigodGhpcy5wYWdlSW5kZXggKyAxKSAqIHRoaXMucGFnZVNpemUsIHRoaXMudG90YWxNZWV0aW5ncyk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBUaGUgcGFnaW5hdG9yIHJhbmdlIGxhYmVsIChlLmcuIFwiU2hvd2luZyAxLTUgb2YgMTJcIikgYnVpbHQgZnJvbSB0aGVcclxuICAgKiBgY29uc3RhbnRzLmpzb25gIHJhbmdlIHRlbXBsYXRlIHdpdGggdGhlIGN1cnJlbnQgc3RhcnQvZW5kL3RvdGFsIHZhbHVlcy5cclxuICAgKiBAcmV0dXJuIHtzdHJpbmd9IFRoZSBmb3JtYXR0ZWQgcmFuZ2UgbGFiZWwuXHJcbiAgICogQG1lbWJlcm9mIEV2ZW50R3JvdXBDYXJkQ29tcG9uZW50XHJcbiAgICovXHJcbiAgZ2V0IHJhbmdlTGFiZWwoKTogc3RyaW5nIHtcclxuICAgIGNvbnN0IHRlbXBsYXRlID1cclxuICAgICAgdGhpcy5jb25zdGFudHM/LmV2ZW50R3JvdXBDYXJkPy5wYWdpbmF0b3I/LnJhbmdlVGVtcGxhdGUgPz9cclxuICAgICAgJ1Nob3dpbmcge3N0YXJ0fS17ZW5kfSBvZiB7dG90YWx9JztcclxuICAgIHJldHVybiB0ZW1wbGF0ZVxyXG4gICAgICAucmVwbGFjZSgne3N0YXJ0fScsIGAke3RoaXMucmFuZ2VTdGFydH1gKVxyXG4gICAgICAucmVwbGFjZSgne2VuZH0nLCBgJHt0aGlzLnJhbmdlRW5kfWApXHJcbiAgICAgIC5yZXBsYWNlKCd7dG90YWx9JywgYCR7dGhpcy50b3RhbE1lZXRpbmdzfWApO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogVGhlIG1lZXRpbmctY291bnQgc3VtbWFyeSBzdWItbGluZSAoZS5nLiBcIjEyIG1lZXRpbmdzXCIpIGJ1aWx0IGZyb20gdGhlXHJcbiAgICogYGNvbnN0YW50cy5qc29uYCB0b3RhbCB0ZW1wbGF0ZSB3aXRoIHRoZSBldmVudCdzIG1lZXRpbmcgY291bnQuXHJcbiAgICogQHJldHVybiB7c3RyaW5nfSBUaGUgZm9ybWF0dGVkIG1lZXRpbmctY291bnQgc3VtbWFyeS5cclxuICAgKiBAbWVtYmVyb2YgRXZlbnRHcm91cENhcmRDb21wb25lbnRcclxuICAgKi9cclxuICBnZXQgbWVldGluZ0NvdW50U3VtbWFyeSgpOiBzdHJpbmcge1xyXG4gICAgY29uc3QgdGVtcGxhdGUgPVxyXG4gICAgICB0aGlzLmNvbnN0YW50cz8uZXZlbnRHcm91cENhcmQ/LnBhZ2luYXRvcj8udG90YWxUZW1wbGF0ZSA/P1xyXG4gICAgICAne3RvdGFsfSBtZWV0aW5ncyc7XHJcbiAgICByZXR1cm4gdGVtcGxhdGUucmVwbGFjZSgne3RvdGFsfScsIGAke3RoaXMuZXZlbnQ/Lm1lZXRpbmdDb3VudCA/PyAwfWApO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogVGhlIG1lZXRpbmctbGlzdCBzaG93L2hpZGUgdG9nZ2xlIGxhYmVsLiBXaGVuIHRoZSBsaXN0IGlzIGhpZGRlbiB0aGUgbGFiZWxcclxuICAgKiByZWFkcyBcIlNob3cgTWVldGluZ3MgKHtjb3VudH0gb3BlbiBmb3IgYXR0ZW5kYW5jZSlcIiBidWlsdCBmcm9tIHRoZVxyXG4gICAqIGBjb25zdGFudHMuanNvbmAgdGVtcGxhdGVzIGFuZCB0aGUgZXZlbnQncyBvcGVuLWZvci1hdHRlbmRhbmNlIGNvdW50OyB3aGVuXHJcbiAgICogdGhlIGxpc3QgaXMgc2hvd24gdGhlIGxhYmVsIHJlYWRzIHRoZSBjb25maWd1cmVkIGhpZGUgbGFiZWwgKFJlcSA2LjUpLlxyXG4gICAqIEByZXR1cm4ge3N0cmluZ30gVGhlIHRvZ2dsZSBidXR0b24gbGFiZWwuXHJcbiAgICogQG1lbWJlcm9mIEV2ZW50R3JvdXBDYXJkQ29tcG9uZW50XHJcbiAgICovXHJcbiAgZ2V0IG1lZXRpbmdMaXN0VG9nZ2xlTGFiZWwoKTogc3RyaW5nIHtcclxuICAgIGNvbnN0IHRvZ2dsZSA9IHRoaXMuY29uc3RhbnRzPy5ldmVudEdyb3VwQ2FyZD8ubWVldGluZ0xpc3RUb2dnbGU7XHJcbiAgICBpZiAodGhpcy5pc01lZXRpbmdMaXN0T3Blbikge1xyXG4gICAgICByZXR1cm4gdG9nZ2xlPy5oaWRlTGFiZWwgPz8gJ0hpZGUgTWVldGluZ3MnO1xyXG4gICAgfVxyXG4gICAgY29uc3QgcHJlZml4ID0gdG9nZ2xlPy5zaG93TGFiZWxQcmVmaXggPz8gJ1Nob3cgTWVldGluZ3MgKCc7XHJcbiAgICBjb25zdCBzdWZmaXggPSB0b2dnbGU/LnNob3dMYWJlbFN1ZmZpeCA/PyAnIG9wZW4gZm9yIGF0dGVuZGFuY2UpJztcclxuICAgIHJldHVybiBgJHtwcmVmaXh9JHt0aGlzLmV2ZW50Py5vcGVuRm9yQXR0ZW5kYW5jZUNvdW50ID8/IDB9JHtzdWZmaXh9YDtcclxuICB9XHJcblxyXG4gIC8qKiBUaGUgbHV4b24tZm9ybWF0dGVkIHN0YXJ0IGRhdGUgb2YgdGhlIGV2ZW50IChSZXEgNi4yKS4gKi9cclxuICBnZXQgZm9ybWF0dGVkU3RhcnREYXRlKCk6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gdGhpcy5mb3JtYXRJc28odGhpcy5ldmVudD8uc3RhcnREYXRlLCBEYXRlRm9ybWF0cy5kaXNwbGF5Rm9ybWF0KTtcclxuICB9XHJcblxyXG4gIC8qKiBUaGUgbHV4b24tZm9ybWF0dGVkIGVuZCBkYXRlIG9mIHRoZSBldmVudCAoUmVxIDYuMikuICovXHJcbiAgZ2V0IGZvcm1hdHRlZEVuZERhdGUoKTogc3RyaW5nIHtcclxuICAgIHJldHVybiB0aGlzLmZvcm1hdElzbyh0aGlzLmV2ZW50Py5lbmREYXRlLCBEYXRlRm9ybWF0cy5kaXNwbGF5Rm9ybWF0KTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIGB0cmFja0J5YCBmb3IgdGhlIG1lZXRpbmctcm93IGAqbmdGb3JgLCBrZXllZCBieSB0aGUgc3RhYmxlIG1lZXRpbmcgaWQgc29cclxuICAgKiBBbmd1bGFyIHJldXNlcyByb3cgY29tcG9uZW50cyBhY3Jvc3MgcGFnaW5hdGlvbi9zdGF0ZSBjaGFuZ2VzIChSZXEgNi43LCAxNC40KS5cclxuICAgKiBAcGFyYW0ge251bWJlcn0gX2luZGV4IC0gVGhlIGl0ZXJhdGlvbiBpbmRleCAodW51c2VkKS5cclxuICAgKiBAcGFyYW0ge01lZXRpbmdSb3d9IG1lZXRpbmcgLSBUaGUgbWVldGluZyBmb3IgdGhpcyByb3cuXHJcbiAgICogQHJldHVybiB7c3RyaW5nfSBUaGUgc3RhYmxlIHRyYWNrIGtleSAobWVldGluZyBpZCkuXHJcbiAgICogQG1lbWJlcm9mIEV2ZW50R3JvdXBDYXJkQ29tcG9uZW50XHJcbiAgICovXHJcbiAgdHJhY2tCeU1lZXRpbmdJZChfaW5kZXg6IG51bWJlciwgbWVldGluZzogTWVldGluZ1Jvdyk6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gbWVldGluZz8ubWVldGluZ0lkID8/IGAke19pbmRleH1gO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogUmVzb2x2ZXMgdGhlIGF0dGVuZGFuY2Ugc3RhdGUgZm9yIGEgbWVldGluZyBmcm9tIHRoZSBgYXR0ZW5kYW5jZVN0YXRlc2AgbWFwLFxyXG4gICAqIGRlZmF1bHRpbmcgdG8gYE5PVF9BVFRFTkRJTkdgIHdoZW4gdGhlIG1hcCBoYXMgbm8gZW50cnkgZm9yIGl0LlxyXG4gICAqIEBwYXJhbSB7TWVldGluZ1Jvd30gbWVldGluZyAtIFRoZSBtZWV0aW5nIHRvIHJlc29sdmUgc3RhdGUgZm9yLlxyXG4gICAqIEByZXR1cm4ge0F0dGVuZGFuY2VTdGF0ZX0gVGhlIGF0dGVuZGFuY2Ugc3RhdGUgcGFzc2VkIHRvIHRoZSByb3cuXHJcbiAgICogQG1lbWJlcm9mIEV2ZW50R3JvdXBDYXJkQ29tcG9uZW50XHJcbiAgICovXHJcbiAgcmVzb2x2ZUF0dGVuZGFuY2VTdGF0ZShtZWV0aW5nOiBNZWV0aW5nUm93KTogQXR0ZW5kYW5jZVN0YXRlIHtcclxuICAgIHJldHVybiAoXHJcbiAgICAgIHRoaXMuYXR0ZW5kYW5jZVN0YXRlcz8uW21lZXRpbmc/Lm1lZXRpbmdJZF0gPz9cclxuICAgICAgQXR0ZW5kYW5jZVN0YXRlLk5PVF9BVFRFTkRJTkdcclxuICAgICk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBSZXNvbHZlcyB3aGV0aGVyIGEgbWVldGluZyBoYXMgYW4gYXR0ZW5kYW5jZSBhY3Rpb24gaW4gZmxpZ2h0IGZyb20gdGhlXHJcbiAgICogYGluRmxpZ2h0TWVldGluZ0lkc2Agc2V0LlxyXG4gICAqIEBwYXJhbSB7TWVldGluZ1Jvd30gbWVldGluZyAtIFRoZSBtZWV0aW5nIHRvIGNoZWNrLlxyXG4gICAqIEByZXR1cm4ge2Jvb2xlYW59IFRydWUgd2hlbiB0aGUgbWVldGluZydzIGFjdGlvbiBpcyBhd2FpdGluZyByZXNvbHV0aW9uLlxyXG4gICAqIEBtZW1iZXJvZiBFdmVudEdyb3VwQ2FyZENvbXBvbmVudFxyXG4gICAqL1xyXG4gIHJlc29sdmVJc0luRmxpZ2h0KG1lZXRpbmc6IE1lZXRpbmdSb3cpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLmluRmxpZ2h0TWVldGluZ0lkcz8uaGFzKG1lZXRpbmc/Lm1lZXRpbmdJZCkgPz8gZmFsc2U7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBUb2dnbGVzIHRoZSBtZWV0aW5nLWxpc3QgdmlzaWJpbGl0eSAoUmVxIDYuNikuXHJcbiAgICogQG1lbWJlcm9mIEV2ZW50R3JvdXBDYXJkQ29tcG9uZW50XHJcbiAgICovXHJcbiAgb25Ub2dnbGVNZWV0aW5nTGlzdCgpOiB2b2lkIHtcclxuICAgIHRoaXMuaXNNZWV0aW5nTGlzdE9wZW4gPSAhdGhpcy5pc01lZXRpbmdMaXN0T3BlbjtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEhhbmRsZXMgdGhlIFwiVmlldyBFdmVudFwiIGJ1dHRvbiwgZW1pdHRpbmcgdGhlIGV2ZW50IGlkIHRvIHRoZSBob3N0IChSZXEgNi40KS5cclxuICAgKiBAbWVtYmVyb2YgRXZlbnRHcm91cENhcmRDb21wb25lbnRcclxuICAgKi9cclxuICBvblZpZXdFdmVudCgpOiB2b2lkIHtcclxuICAgIHRoaXMudmlld0V2ZW50LmVtaXQodGhpcy5ldmVudD8uZXZlbnRJZCk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBCdWJibGVzIGEgcm93J3MgbWVldGluZy1uYW1lIGxpbmsgYWN0aXZhdGlvbiB1cHdhcmQgKFJlcSA2LjcsIDcuNCkuXHJcbiAgICogQHBhcmFtIHtzdHJpbmd9IG1lZXRpbmdJZCAtIFRoZSBpZCBlbWl0dGVkIGJ5IHRoZSByb3cuXHJcbiAgICogQG1lbWJlcm9mIEV2ZW50R3JvdXBDYXJkQ29tcG9uZW50XHJcbiAgICovXHJcbiAgb25PcGVuTWVldGluZyhtZWV0aW5nSWQ6IHN0cmluZyk6IHZvaWQge1xyXG4gICAgdGhpcy5vcGVuTWVldGluZy5lbWl0KG1lZXRpbmdJZCk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBCdWJibGVzIGEgcm93J3MgbG9nLWF0dGVuZGFuY2UgcmVxdWVzdCB1cHdhcmQgKFJlcSA2LjcsIDcuNykuXHJcbiAgICogQHBhcmFtIHtzdHJpbmd9IG1lZXRpbmdJZCAtIFRoZSBpZCBlbWl0dGVkIGJ5IHRoZSByb3cuXHJcbiAgICogQG1lbWJlcm9mIEV2ZW50R3JvdXBDYXJkQ29tcG9uZW50XHJcbiAgICovXHJcbiAgb25Mb2dBdHRlbmRhbmNlKG1lZXRpbmdJZDogc3RyaW5nKTogdm9pZCB7XHJcbiAgICB0aGlzLmxvZ0F0dGVuZGFuY2UuZW1pdChtZWV0aW5nSWQpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQnViYmxlcyBhIHJvdydzIGxlYXZlLW1lZXRpbmcgcmVxdWVzdCB1cHdhcmQgKFJlcSA2LjcsIDcuOCkuXHJcbiAgICogQHBhcmFtIHtzdHJpbmd9IG1lZXRpbmdJZCAtIFRoZSBpZCBlbWl0dGVkIGJ5IHRoZSByb3cuXHJcbiAgICogQG1lbWJlcm9mIEV2ZW50R3JvdXBDYXJkQ29tcG9uZW50XHJcbiAgICovXHJcbiAgb25MZWF2ZU1lZXRpbmcobWVldGluZ0lkOiBzdHJpbmcpOiB2b2lkIHtcclxuICAgIHRoaXMubGVhdmVNZWV0aW5nLmVtaXQobWVldGluZ0lkKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEhhbmRsZXMgdGhlIHBlci1jYXJkIHBhZ2luYXRvciBjaGFuZ2UsIHVwZGF0aW5nIHRoZSBsb2NhbCBwYWdlIHN0YXRlIGFuZFxyXG4gICAqIGVtaXR0aW5nIHRoZSByZXF1ZXN0ZWQgcGFnZSBhcyBhIHtAbGluayBQYWdlQ2hhbmdlfSAoUmVxIDYuOSwgMy4zKS5cclxuICAgKiBAcGFyYW0ge1BhZ2VFdmVudH0gZXZlbnQgLSBUaGUgTWF0ZXJpYWwgcGFnaW5hdG9yIHBhZ2UgZXZlbnQuXHJcbiAgICogQG1lbWJlcm9mIEV2ZW50R3JvdXBDYXJkQ29tcG9uZW50XHJcbiAgICovXHJcbiAgb25QYWdlQ2hhbmdlKGV2ZW50OiBQYWdlRXZlbnQpOiB2b2lkIHtcclxuICAgIHRoaXMucGFnZUluZGV4ID0gZXZlbnQucGFnZUluZGV4O1xyXG4gICAgdGhpcy5wYWdlU2l6ZSA9IGV2ZW50LnBhZ2VTaXplO1xyXG4gICAgdGhpcy5wYWdlQ2hhbmdlLmVtaXQoe1xyXG4gICAgICBwYWdlSW5kZXg6IGV2ZW50LnBhZ2VJbmRleCxcclxuICAgICAgcGFnZVNpemU6IGV2ZW50LnBhZ2VTaXplLFxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBQYXJzZXMgYW4gSVNPIHN0cmluZyB3aXRoIGx1eG9uIGFuZCBmb3JtYXRzIGl0IHdpdGggdGhlIHN1cHBsaWVkIHRva2VuLFxyXG4gICAqIHJldHVybmluZyB0aGUgcmF3IHZhbHVlIHVuY2hhbmdlZCB3aGVuIGl0IGlzIG1pc3Npbmcgb3IgdW5wYXJzZWFibGUuXHJcbiAgICogQHBhcmFtIHtzdHJpbmcgfCB1bmRlZmluZWR9IGlzb1ZhbHVlIC0gVGhlIElTTyBkYXRlL3RpbWUgc3RyaW5nLlxyXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBmb3JtYXQgLSBUaGUgbHV4b24gZm9ybWF0IHRva2VuLlxyXG4gICAqIEByZXR1cm4ge3N0cmluZ30gVGhlIGZvcm1hdHRlZCB2YWx1ZSBvciB0aGUgcmF3L2VtcHR5IGZhbGxiYWNrLlxyXG4gICAqIEBtZW1iZXJvZiBFdmVudEdyb3VwQ2FyZENvbXBvbmVudFxyXG4gICAqL1xyXG4gIHByaXZhdGUgZm9ybWF0SXNvKGlzb1ZhbHVlOiBzdHJpbmcgfCB1bmRlZmluZWQsIGZvcm1hdDogc3RyaW5nKTogc3RyaW5nIHtcclxuICAgIGlmICghaXNvVmFsdWUpIHtcclxuICAgICAgcmV0dXJuICcnO1xyXG4gICAgfVxyXG4gICAgY29uc3QgcGFyc2VkID0gRGF0ZVRpbWUuZnJvbUlTTyhpc29WYWx1ZSwgeyBzZXRab25lOiB0cnVlIH0pO1xyXG4gICAgcmV0dXJuIHBhcnNlZC5pc1ZhbGlkID8gcGFyc2VkLnRvRm9ybWF0KGZvcm1hdCkgOiBpc29WYWx1ZTtcclxuICB9XHJcbn1cclxuIiwiPGFydGljbGVcclxuICBjbGFzcz1cImllZWVzYS1ldmVudC1ncm91cC1jYXJkXCJcclxuICBbY2xhc3MuaWVlZXNhLWV2ZW50LWdyb3VwLWNhcmQtLW1vYmlsZV09XCJpc01vYmlsZVZpZXdcIlxyXG4+XHJcbiAgPGhlYWRlciBjbGFzcz1cImllZWVzYS1ldmVudC1ncm91cC1jYXJkX19oZWFkZXJcIj5cclxuICAgIDxkaXYgY2xhc3M9XCJpZWVlc2EtZXZlbnQtZ3JvdXAtY2FyZF9faGVhZGluZ1wiPlxyXG4gICAgICA8IS0tIFN0YXR1cyBiYWRnZSAoUmVxIDYuMSkuIC0tPlxyXG4gICAgICA8c3BhblxyXG4gICAgICAgICpuZ0lmPVwiZXZlbnQ/LnN0YXR1c1wiXHJcbiAgICAgICAgY2xhc3M9XCJpZWVlc2EtZXZlbnQtZ3JvdXAtY2FyZF9fc3RhdHVzXCJcclxuICAgICAgPlxyXG4gICAgICAgIHt7IGV2ZW50Py5zdGF0dXMgfX1cclxuICAgICAgPC9zcGFuPlxyXG5cclxuICAgICAgPCEtLSBFdmVudCB0aXRsZSAoUmVxIDYuMSkuIC0tPlxyXG4gICAgICA8aDMgY2xhc3M9XCJpZWVlc2EtZXZlbnQtZ3JvdXAtY2FyZF9fdGl0bGVcIj57eyBldmVudD8udGl0bGUgfX08L2gzPlxyXG5cclxuICAgICAgPCEtLSBEYXkgaW5kaWNhdG9yIChSZXEgNi4xKS4gLS0+XHJcbiAgICAgIDxzcGFuXHJcbiAgICAgICAgKm5nSWY9XCJldmVudD8uZGF5SW5kaWNhdG9yXCJcclxuICAgICAgICBjbGFzcz1cImllZWVzYS1ldmVudC1ncm91cC1jYXJkX19kYXktaW5kaWNhdG9yXCJcclxuICAgICAgPlxyXG4gICAgICAgIHt7IGV2ZW50Py5kYXlJbmRpY2F0b3IgfX1cclxuICAgICAgPC9zcGFuPlxyXG4gICAgPC9kaXY+XHJcblxyXG4gICAgPCEtLSBWaWV3IEV2ZW50IGFjdGlvbiAoUmVxIDYuMywgNi40KS4gLS0+XHJcbiAgICA8YnV0dG9uXHJcbiAgICAgIHR5cGU9XCJidXR0b25cIlxyXG4gICAgICBjbGFzcz1cImllZWVzYS1ldmVudC1ncm91cC1jYXJkX192aWV3LWV2ZW50XCJcclxuICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCJjb25zdGFudHM/LmV2ZW50R3JvdXBDYXJkPy5hcmlhTGFiZWw/LnZpZXdFdmVudCA/PyAnVmlldyBldmVudCBkZXRhaWxzJ1wiXHJcbiAgICAgIChjbGljayk9XCJvblZpZXdFdmVudCgpXCJcclxuICAgID5cclxuICAgICAge3sgY29uc3RhbnRzPy5ldmVudEdyb3VwQ2FyZD8udmlld0V2ZW50TGFiZWwgPz8gJ1ZpZXcgRXZlbnQnIH19XHJcbiAgICA8L2J1dHRvbj5cclxuICA8L2hlYWRlcj5cclxuXHJcbiAgPGRsIGNsYXNzPVwiaWVlZXNhLWV2ZW50LWdyb3VwLWNhcmRfX21ldGFcIj5cclxuICAgIDwhLS0gTWVldGluZy1jb3VudCBzdW1tYXJ5IHN1Yi1saW5lIChSZXEgNi4xKS4gLS0+XHJcbiAgICA8ZGl2IGNsYXNzPVwiaWVlZXNhLWV2ZW50LWdyb3VwLWNhcmRfX21ldGEtaXRlbVwiPlxyXG4gICAgICA8ZGQgY2xhc3M9XCJpZWVlc2EtZXZlbnQtZ3JvdXAtY2FyZF9fbWVldGluZy1jb3VudFwiPlxyXG4gICAgICAgIHt7IG1lZXRpbmdDb3VudFN1bW1hcnkgfX1cclxuICAgICAgPC9kZD5cclxuICAgIDwvZGl2PlxyXG5cclxuICAgIDwhLS0gU3RhcnQgLyBlbmQgZGF0ZSAoUmVxIDYuMikuIC0tPlxyXG4gICAgPGRpdiBjbGFzcz1cImllZWVzYS1ldmVudC1ncm91cC1jYXJkX19tZXRhLWl0ZW1cIj5cclxuICAgICAgPGRkIGNsYXNzPVwiaWVlZXNhLWV2ZW50LWdyb3VwLWNhcmRfX2RhdGVzXCI+XHJcbiAgICAgICAge3sgZm9ybWF0dGVkU3RhcnREYXRlIH19PG5nLWNvbnRhaW5lciAqbmdJZj1cImZvcm1hdHRlZEVuZERhdGVcIj5cclxuICAgICAgICAgICZuZGFzaDsge3sgZm9ybWF0dGVkRW5kRGF0ZSB9fTwvbmctY29udGFpbmVyPlxyXG4gICAgICA8L2RkPlxyXG4gICAgPC9kaXY+XHJcblxyXG4gICAgPCEtLSBUaW1lem9uZSAoUmVxIDYuMikuIC0tPlxyXG4gICAgPGRpdiBjbGFzcz1cImllZWVzYS1ldmVudC1ncm91cC1jYXJkX19tZXRhLWl0ZW1cIiAqbmdJZj1cImV2ZW50Py50aW1lem9uZVwiPlxyXG4gICAgICA8ZGQgY2xhc3M9XCJpZWVlc2EtZXZlbnQtZ3JvdXAtY2FyZF9fdGltZXpvbmVcIj57eyBldmVudD8udGltZXpvbmUgfX08L2RkPlxyXG4gICAgPC9kaXY+XHJcbiAgPC9kbD5cclxuXHJcbiAgPCEtLSBNZWV0aW5nLWxpc3Qgc2hvdy9oaWRlIHRvZ2dsZSBsYWJlbGVkIHdpdGggb3Blbi1mb3ItYXR0ZW5kYW5jZSBjb3VudCAoUmVxIDYuNSwgNi42KS4gLS0+XHJcbiAgPGJ1dHRvblxyXG4gICAgdHlwZT1cImJ1dHRvblwiXHJcbiAgICBjbGFzcz1cImllZWVzYS1ldmVudC1ncm91cC1jYXJkX19tZWV0aW5nLXRvZ2dsZVwiXHJcbiAgICBbYXR0ci5hcmlhLWV4cGFuZGVkXT1cImlzTWVldGluZ0xpc3RPcGVuXCJcclxuICAgIFthdHRyLmFyaWEtbGFiZWxdPVwiY29uc3RhbnRzPy5ldmVudEdyb3VwQ2FyZD8uYXJpYUxhYmVsPy5tZWV0aW5nTGlzdFRvZ2dsZSA/PyAnU2hvdyBvciBoaWRlIHRoZSBtZWV0aW5nIGxpc3QgZm9yIHRoaXMgZXZlbnQnXCJcclxuICAgIChjbGljayk9XCJvblRvZ2dsZU1lZXRpbmdMaXN0KClcIlxyXG4gID5cclxuICAgIHt7IG1lZXRpbmdMaXN0VG9nZ2xlTGFiZWwgfX1cclxuICA8L2J1dHRvbj5cclxuXHJcbiAgPCEtLSBNZWV0aW5nIGxpc3QgKyBwZXItY2FyZCBwYWdpbmF0b3IsIHNob3duIG9ubHkgd2hlbiB0aGUgdG9nZ2xlIGlzIG9wZW4gKFJlcSA2LjcsIDYuOCkuIC0tPlxyXG4gIDxkaXYgKm5nSWY9XCJpc01lZXRpbmdMaXN0T3BlblwiIGNsYXNzPVwiaWVlZXNhLWV2ZW50LWdyb3VwLWNhcmRfX21lZXRpbmdzXCI+XHJcbiAgICA8aWVlZXNhLW1lZXRpbmctYXR0ZW5kYW5jZS1yb3dcclxuICAgICAgKm5nRm9yPVwibGV0IG1lZXRpbmcgb2YgcGFnZWRNZWV0aW5nczsgdHJhY2tCeTogdHJhY2tCeU1lZXRpbmdJZFwiXHJcbiAgICAgIFttZWV0aW5nXT1cIm1lZXRpbmdcIlxyXG4gICAgICBbYXR0ZW5kYW5jZVN0YXRlXT1cInJlc29sdmVBdHRlbmRhbmNlU3RhdGUobWVldGluZylcIlxyXG4gICAgICBbaXNJbkZsaWdodF09XCJyZXNvbHZlSXNJbkZsaWdodChtZWV0aW5nKVwiXHJcbiAgICAgIFtwZXJtaXNzaW9uc109XCJwZXJtaXNzaW9uc1wiXHJcbiAgICAgIChvcGVuTWVldGluZyk9XCJvbk9wZW5NZWV0aW5nKCRldmVudClcIlxyXG4gICAgICAobG9nQXR0ZW5kYW5jZSk9XCJvbkxvZ0F0dGVuZGFuY2UoJGV2ZW50KVwiXHJcbiAgICAgIChsZWF2ZU1lZXRpbmcpPVwib25MZWF2ZU1lZXRpbmcoJGV2ZW50KVwiXHJcbiAgICA+PC9pZWVlc2EtbWVldGluZy1hdHRlbmRhbmNlLXJvdz5cclxuXHJcbiAgICA8ZGl2XHJcbiAgICAgIGNsYXNzPVwiaWVlZXNhLWV2ZW50LWdyb3VwLWNhcmRfX3BhZ2luYXRvclwiXHJcbiAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwiY29uc3RhbnRzPy5ldmVudEdyb3VwQ2FyZD8uYXJpYUxhYmVsPy5tZWV0aW5nTGlzdFRvZ2dsZSA/PyAnTWVldGluZyBsaXN0IHBhZ2luYXRpb24nXCJcclxuICAgID5cclxuICAgICAgPCEtLSBSYW5nZSArIHRvdGFsIGNvdW50IGxhYmVsIGZyb20gY29uc3RhbnRzLmpzb24gKFJlcSA2LjgpLiAtLT5cclxuICAgICAgPHNwYW4gY2xhc3M9XCJpZWVlc2EtZXZlbnQtZ3JvdXAtY2FyZF9fcGFnaW5hdG9yLXJhbmdlXCI+XHJcbiAgICAgICAge3sgcmFuZ2VMYWJlbCB9fVxyXG4gICAgICA8L3NwYW4+XHJcblxyXG4gICAgICA8IS0tIFByZXNlbnRhdGlvbiBwYWdpbmF0b3IgZW1pdHRpbmcgcGFnZUNoYW5nZSh7IHBhZ2VJbmRleCwgcGFnZVNpemUgfSkgKFJlcSA2LjksIDMuMykuIC0tPlxyXG4gICAgICA8bWF0LXBhZ2luYXRvclxyXG4gICAgICAgIGNsYXNzPVwiaWVlZXNhLWV2ZW50LWdyb3VwLWNhcmRfX3BhZ2luYXRvci1jb250cm9sXCJcclxuICAgICAgICBbcGFnZUluZGV4XT1cInBhZ2VJbmRleFwiXHJcbiAgICAgICAgW3BhZ2VTaXplXT1cInBhZ2VTaXplXCJcclxuICAgICAgICBbbGVuZ3RoXT1cInRvdGFsTWVldGluZ3NcIlxyXG4gICAgICAgIFtoaWRlUGFnZVNpemVdPVwidHJ1ZVwiXHJcbiAgICAgICAgKHBhZ2UpPVwib25QYWdlQ2hhbmdlKCRldmVudClcIlxyXG4gICAgICA+PC9tYXQtcGFnaW5hdG9yPlxyXG4gICAgPC9kaXY+XHJcbiAgPC9kaXY+XHJcbjwvYXJ0aWNsZT5cclxuIl19