@ieeesa-npm/dashboard 0.0.0-stage → 0.0.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (73) hide show
  1. package/README.md +75 -3
  2. package/esm2022/ieeesa-npm-dashboard.mjs +5 -0
  3. package/esm2022/lib/assets/constants.json +158 -0
  4. package/esm2022/lib/assets/dashboard-mock.mjs +221 -0
  5. package/esm2022/lib/assets/dashboard-route-paths.mock.mjs +14 -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 +414 -0
  9. package/esm2022/lib/components/meeting-attendance-row/meeting-attendance-row.component.mjs +182 -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 +261 -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 +243 -0
  14. package/esm2022/lib/dashboard.component.mjs +417 -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/event-meeting-list-item.model.mjs +2 -0
  24. package/esm2022/lib/models/event-meeting-list-payload.model.mjs +8 -0
  25. package/esm2022/lib/models/group-row.model.mjs +2 -0
  26. package/esm2022/lib/models/meeting-row.model.mjs +2 -0
  27. package/esm2022/lib/models/my-groups-view.model.mjs +2 -0
  28. package/esm2022/lib/models/page-change.model.mjs +2 -0
  29. package/esm2022/lib/models/upcoming-event.model.mjs +13 -0
  30. package/esm2022/lib/services/attendance-reducers.mjs +54 -0
  31. package/esm2022/lib/services/dashboard.service.mjs +402 -0
  32. package/esm2022/lib/services/user-permissions.service.mjs +50 -0
  33. package/esm2022/lib/utils/attendance-action.util.mjs +53 -0
  34. package/esm2022/lib/utils/date-format.util.mjs +110 -0
  35. package/esm2022/lib/utils/event-meeting-mapper.util.mjs +96 -0
  36. package/esm2022/public-api.mjs +36 -0
  37. package/fesm2022/ieeesa-npm-dashboard.mjs +2981 -0
  38. package/fesm2022/ieeesa-npm-dashboard.mjs.map +1 -0
  39. package/index.d.ts +5 -0
  40. package/lib/assets/dashboard-mock.d.ts +31 -0
  41. package/lib/assets/dashboard-route-paths.mock.d.ts +2 -0
  42. package/lib/assets/dashboard-user-permissions.mock.d.ts +2 -0
  43. package/lib/assets/date-formats.d.ts +27 -0
  44. package/lib/components/event-group-card/event-group-card.component.d.ts +268 -0
  45. package/lib/components/meeting-attendance-row/meeting-attendance-row.component.d.ts +115 -0
  46. package/lib/components/member-level-badge/member-level-badge.component.d.ts +177 -0
  47. package/lib/components/upcoming-meetings-events/upcoming-meetings-events.component.d.ts +175 -0
  48. package/lib/components/welcome-header/dashboard-welcome-header.component.d.ts +98 -0
  49. package/lib/components/your-groups/your-groups.component.d.ts +159 -0
  50. package/lib/dashboard.component.d.ts +414 -0
  51. package/lib/dashboard.module.d.ts +7 -0
  52. package/lib/dashboard.routes.d.ts +2 -0
  53. package/lib/models/attendance-action-permissions.model.d.ts +4 -0
  54. package/lib/models/attendance-state.model.d.ts +4 -0
  55. package/lib/models/dashboard-list-response.model.d.ts +5 -0
  56. package/lib/models/dashboard-route-config.model.d.ts +7 -0
  57. package/lib/models/dashboard-section-state.model.d.ts +6 -0
  58. package/lib/models/dashboard-user-info.model.d.ts +5 -0
  59. package/lib/models/event-meeting-list-item.model.d.ts +107 -0
  60. package/lib/models/event-meeting-list-payload.model.d.ts +40 -0
  61. package/lib/models/group-row.model.d.ts +33 -0
  62. package/lib/models/meeting-row.model.d.ts +28 -0
  63. package/lib/models/my-groups-view.model.d.ts +56 -0
  64. package/lib/models/page-change.model.d.ts +4 -0
  65. package/lib/models/upcoming-event.model.d.ts +51 -0
  66. package/lib/services/attendance-reducers.d.ts +43 -0
  67. package/lib/services/dashboard.service.d.ts +202 -0
  68. package/lib/services/user-permissions.service.d.ts +31 -0
  69. package/lib/utils/attendance-action.util.d.ts +38 -0
  70. package/lib/utils/date-format.util.d.ts +60 -0
  71. package/lib/utils/event-meeting-mapper.util.d.ts +50 -0
  72. package/package.json +30 -3
  73. package/public-api.d.ts +26 -0
@@ -0,0 +1,414 @@
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 { AttendanceState } from '../../models/attendance-state.model';
5
+ import { UpcomingItemKind, } from '../../models/upcoming-event.model';
6
+ import { DateFormats } from '../../assets/date-formats';
7
+ import { MeetingAttendanceRowComponent } from '../meeting-attendance-row/meeting-attendance-row.component';
8
+ import { formatEpoch } from '../../utils/date-format.util';
9
+ import * as screenTexts from '../../assets/constants.json';
10
+ import * as i0 from "@angular/core";
11
+ import * as i1 from "@angular/common";
12
+ import * as i2 from "@angular/material/paginator";
13
+ /**
14
+ * Event_Group_Card renders a single upcoming event as a card: the status badge,
15
+ * title, day indicator, meeting-count summary sub-line, start/end date, and
16
+ * timezone (all luxon-formatted). It exposes a "View Event" action, a
17
+ * show/hide toggle for the meeting list labeled with the open-for-attendance
18
+ * count, the per-event meeting rows (one {@link MeetingAttendanceRowComponent}
19
+ * per meeting on the current page), and a per-card paginator.
20
+ *
21
+ * The component is purely presentational — it emits navigation, attendance, and
22
+ * pagination intents via `@Output()` and never performs navigation or HTTP
23
+ * itself. Meeting-row outputs (`openMeeting`/`logAttendance`/`leaveMeeting`) are
24
+ * bubbled upward unchanged so the container can delegate to the service.
25
+ * @export
26
+ * @class EventGroupCardComponent
27
+ */
28
+ export class EventGroupCardComponent {
29
+ constructor() {
30
+ /** User-facing strings sourced from `constants.json`. */
31
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
32
+ this.constants = screenTexts;
33
+ /** Enum reference for EVENT vs STANDALONE_MEETING comparisons in the template. */
34
+ this.itemKinds = UpcomingItemKind;
35
+ /** Host permissions gating the per-row log-attendance / leave-meeting buttons. */
36
+ this.permissions = {
37
+ canLogAttendance: false,
38
+ canLeaveMeeting: false,
39
+ };
40
+ /** Map of meeting id to current attendance state, passed down to each row. */
41
+ this.attendanceStates = {};
42
+ /** Set of meeting ids with an attendance action awaiting resolution. */
43
+ this.inFlightMeetingIds = new Set();
44
+ /** Whether the host has determined the viewport is at/below the mobile breakpoint. */
45
+ this.isMobileView = false;
46
+ /** Emits the event id when the "View Event" button is activated (Req 6.4). */
47
+ this.viewEvent = new EventEmitter();
48
+ /** Bubbles the meeting id when a row's meeting-name link is activated (Req 6.7, 7.4). */
49
+ this.openMeeting = new EventEmitter();
50
+ /** Bubbles the meeting id when a row requests logging attendance (Req 6.7, 7.7). */
51
+ this.logAttendance = new EventEmitter();
52
+ /** Bubbles the meeting id when a row requests leaving the meeting (Req 6.7, 7.8). */
53
+ this.leaveMeeting = new EventEmitter();
54
+ /** Emits the requested page when the per-card paginator changes (Req 6.9, 3.3). */
55
+ this.pageChange = new EventEmitter();
56
+ /**
57
+ * Emits the one-based page to load when the meeting list is opened (or paged)
58
+ * so the container can lazily fetch the event's child meetings from the
59
+ * backend. Standalone-meeting cards never emit this.
60
+ */
61
+ this.loadMeetings = new EventEmitter();
62
+ /** The default page size for the per-card meeting paginator. */
63
+ this.defaultPageSize = 5;
64
+ /** The current zero-based page index of the meeting list. */
65
+ this.pageIndex = 0;
66
+ /** The current page size of the meeting list. */
67
+ this.pageSize = this.defaultPageSize;
68
+ /** Whether the meeting list is currently shown (toggled open). */
69
+ this.isMeetingListOpen = false;
70
+ }
71
+ /**
72
+ * The event status slugified into a BEM modifier suffix (lowercase, spaces to
73
+ * hyphens), e.g. "In Progress" -> "in-progress", used to colour the status
74
+ * pill per status.
75
+ * @return {string} The status modifier suffix.
76
+ * @memberof EventGroupCardComponent
77
+ */
78
+ get statusModifier() {
79
+ return (this.event?.status ?? '')
80
+ .trim()
81
+ .toLowerCase()
82
+ .replace(/\s+/g, '-');
83
+ }
84
+ /**
85
+ * Whether this card renders a STANDALONE_MEETING (leaner single-meeting card
86
+ * with no child-meeting list) rather than an expandable EVENT block.
87
+ * @return {boolean} True for standalone-meeting cards.
88
+ * @memberof EventGroupCardComponent
89
+ */
90
+ get isStandalone() {
91
+ return this.event?.kind === UpcomingItemKind.STANDALONE_MEETING;
92
+ }
93
+ /**
94
+ * The full list of meetings for the event, defaulting to an empty list when
95
+ * the event has none.
96
+ * @return {MeetingRow[]} The event's meetings.
97
+ * @memberof EventGroupCardComponent
98
+ */
99
+ get meetings() {
100
+ return this.event?.meetings ?? [];
101
+ }
102
+ /**
103
+ * The total number of meetings for the event (paginator length). Uses the
104
+ * backend `meetingCount` (the full total) rather than the length of the
105
+ * currently loaded page, so the paginator can advance through every page.
106
+ * @return {number} The total meeting count.
107
+ * @memberof EventGroupCardComponent
108
+ */
109
+ get totalMeetings() {
110
+ return this.event?.meetingCount || this.meetings.length;
111
+ }
112
+ /**
113
+ * The meetings to render for the current page. The server returns exactly one
114
+ * page of meetings into `event.meetings`, so the card renders them as-is
115
+ * without local slicing (pagination is server-side).
116
+ * @return {MeetingRow[]} The meetings on the current page.
117
+ * @memberof EventGroupCardComponent
118
+ */
119
+ get pagedMeetings() {
120
+ return this.meetings;
121
+ }
122
+ /**
123
+ * The one-based index of the first meeting shown on the current page, or 0
124
+ * when there are no meetings.
125
+ * @return {number} The start index for the range template.
126
+ * @memberof EventGroupCardComponent
127
+ */
128
+ get rangeStart() {
129
+ return this.totalMeetings === 0 ? 0 : this.pageIndex * this.pageSize + 1;
130
+ }
131
+ /**
132
+ * The one-based index of the last meeting shown on the current page, clamped
133
+ * to the total meeting count.
134
+ * @return {number} The end index for the range template.
135
+ * @memberof EventGroupCardComponent
136
+ */
137
+ get rangeEnd() {
138
+ return Math.min((this.pageIndex + 1) * this.pageSize, this.totalMeetings);
139
+ }
140
+ /**
141
+ * The paginator range label (e.g. "Showing 1-5 of 12") built from the
142
+ * `constants.json` range template with the current start/end/total values.
143
+ * @return {string} The formatted range label.
144
+ * @memberof EventGroupCardComponent
145
+ */
146
+ get rangeLabel() {
147
+ const template = this.constants?.eventGroupCard?.paginator?.rangeTemplate ??
148
+ 'Showing {start}-{end} of {total}';
149
+ return template
150
+ .replace('{start}', `${this.rangeStart}`)
151
+ .replace('{end}', `${this.rangeEnd}`)
152
+ .replace('{total}', `${this.totalMeetings}`);
153
+ }
154
+ /**
155
+ * The meeting-count summary sub-line (e.g. "12 meetings") built from the
156
+ * `constants.json` total template with the event's meeting count.
157
+ * @return {string} The formatted meeting-count summary.
158
+ * @memberof EventGroupCardComponent
159
+ */
160
+ get meetingCountSummary() {
161
+ const template = this.constants?.eventGroupCard?.paginator?.totalTemplate ??
162
+ '{total} meetings';
163
+ return template.replace('{total}', `${this.event?.meetingCount ?? 0}`);
164
+ }
165
+ /**
166
+ * The header sub-line: the group · location line for a STANDALONE meeting, or
167
+ * the "{n} meetings scheduled across the event" summary for an EVENT when its
168
+ * meeting count is known (hidden until the count is loaded so it never shows
169
+ * "0 meetings").
170
+ * @return {string} The sub-line text, or an empty string to hide it.
171
+ * @memberof EventGroupCardComponent
172
+ */
173
+ get subtitleText() {
174
+ if (this.isStandalone) {
175
+ const group = this.event?.groupOrCommittee ?? '';
176
+ const location = this.event?.roomOrLocation ?? '';
177
+ if (group && location) {
178
+ return `${group} \u00b7 ${location}`;
179
+ }
180
+ return group || location;
181
+ }
182
+ return (this.event?.meetingCount ?? 0) > 0 ? this.meetingCountSummary : '';
183
+ }
184
+ /**
185
+ * The meeting-list show/hide toggle label. When the list is hidden the label
186
+ * reads "Show Meetings ({count} open for attendance)" built from the
187
+ * `constants.json` templates and the event's open-for-attendance count; when
188
+ * the list is shown the label reads the configured hide label (Req 6.5).
189
+ * @return {string} The toggle button label.
190
+ * @memberof EventGroupCardComponent
191
+ */
192
+ get meetingListToggleLabel() {
193
+ const toggle = this.constants?.eventGroupCard?.meetingListToggle;
194
+ if (this.isMeetingListOpen) {
195
+ return toggle?.hideLabel ?? 'Hide meetings';
196
+ }
197
+ return toggle?.showLabel ?? 'Show meetings';
198
+ }
199
+ /**
200
+ * The "{count} Meetings open for attendance" summary shown in the event's
201
+ * meetings bar, built from the `constants.json` template and the event's
202
+ * open-for-attendance count (Req 6.5).
203
+ * @return {string} The formatted open-for-attendance summary.
204
+ * @memberof EventGroupCardComponent
205
+ */
206
+ get openForAttendanceSummary() {
207
+ const template = this.constants?.eventGroupCard?.openForAttendanceTemplate ??
208
+ '{count} Meetings open for attendance';
209
+ return template.replace('{count}', `${this.event?.openForAttendanceCount ?? 0}`);
210
+ }
211
+ /**
212
+ * The {@link MeetingRow} view model for a STANDALONE_MEETING card, projected
213
+ * from the event entry so the shared {@link MeetingAttendanceRowComponent}
214
+ * renders its time/timezone block and attendance action.
215
+ * @return {MeetingRow} The standalone meeting row.
216
+ * @memberof EventGroupCardComponent
217
+ */
218
+ get standaloneMeeting() {
219
+ return {
220
+ meetingId: this.event?.eventId ?? '',
221
+ meetingName: this.event?.title ?? '',
222
+ groupOrCommittee: this.event?.groupOrCommittee,
223
+ roomOrLocation: this.event?.roomOrLocation,
224
+ startDateTime: this.event?.startDateTime ?? this.event?.startDate,
225
+ endDateTime: this.event?.endDateTime ?? this.event?.endDate,
226
+ timezone: this.event?.timezone ?? '',
227
+ status: this.event?.status,
228
+ isMemberOfGroup: this.event?.isMemberOfGroup,
229
+ };
230
+ }
231
+ /**
232
+ * The formatted "start – end time (timezone)" string for a STANDALONE meeting,
233
+ * mirroring the inner meeting row's TIME & TIMEZONE value.
234
+ * @return {string} The formatted time + timezone.
235
+ * @memberof EventGroupCardComponent
236
+ */
237
+ get standaloneTime() {
238
+ const timezone = this.event?.timezone ?? '';
239
+ const start = formatEpoch(this.event?.startDateTime ?? this.event?.startDate, DateFormats.timeMeridiemFormat, timezone);
240
+ const end = formatEpoch(this.event?.endDateTime ?? this.event?.endDate, DateFormats.timeMeridiemFormat, timezone);
241
+ const range = end ? `${start} \u2013 ${end}` : start;
242
+ if (!range) {
243
+ return '';
244
+ }
245
+ return timezone ? `${range} ${timezone}` : range;
246
+ }
247
+ /**
248
+ * Whether the STANDALONE meeting is currently being attended (drives the pill
249
+ * and the leave action).
250
+ * @return {boolean} True when the standalone meeting is currently attending.
251
+ * @memberof EventGroupCardComponent
252
+ */
253
+ get isStandaloneAttending() {
254
+ return (this.resolveAttendanceState(this.standaloneMeeting) ===
255
+ AttendanceState.CURRENTLY_ATTENDING);
256
+ }
257
+ /**
258
+ * Whether the STANDALONE meeting's Log Attendance button is shown (not
259
+ * attending and the host grants the permission).
260
+ * @return {boolean} True when the log-attendance button is visible.
261
+ * @memberof EventGroupCardComponent
262
+ */
263
+ get showStandaloneLog() {
264
+ return !this.isStandaloneAttending && !!this.permissions?.canLogAttendance;
265
+ }
266
+ /**
267
+ * Whether the STANDALONE meeting's Leave Meeting button is shown (attending
268
+ * and the host grants the permission).
269
+ * @return {boolean} True when the leave-meeting button is visible.
270
+ * @memberof EventGroupCardComponent
271
+ */
272
+ get showStandaloneLeave() {
273
+ return this.isStandaloneAttending && !!this.permissions?.canLeaveMeeting;
274
+ }
275
+ /** The luxon-formatted start date of the event (ISO or epoch ms) (Req 6.2). */
276
+ get formattedStartDate() {
277
+ return this.formatDate(this.event?.startDateTime ?? this.event?.startDate);
278
+ }
279
+ /** The luxon-formatted end date of the event (ISO or epoch ms) (Req 6.2). */
280
+ get formattedEndDate() {
281
+ return this.formatDate(this.event?.endDateTime ?? this.event?.endDate);
282
+ }
283
+ /**
284
+ * `trackBy` for the meeting-row `*ngFor`, keyed by the stable meeting id so
285
+ * Angular reuses row components across pagination/state changes (Req 6.7, 14.4).
286
+ * @param {number} _index - The iteration index (unused).
287
+ * @param {MeetingRow} meeting - The meeting for this row.
288
+ * @return {string} The stable track key (meeting id).
289
+ * @memberof EventGroupCardComponent
290
+ */
291
+ trackByMeetingId(_index, meeting) {
292
+ return meeting?.meetingId ?? `${_index}`;
293
+ }
294
+ /**
295
+ * Resolves the attendance state for a meeting from the `attendanceStates` map,
296
+ * defaulting to `NOT_ATTENDING` when the map has no entry for it.
297
+ * @param {MeetingRow} meeting - The meeting to resolve state for.
298
+ * @return {AttendanceState} The attendance state passed to the row.
299
+ * @memberof EventGroupCardComponent
300
+ */
301
+ resolveAttendanceState(meeting) {
302
+ return (this.attendanceStates?.[meeting?.meetingId] ??
303
+ AttendanceState.NOT_ATTENDING);
304
+ }
305
+ /**
306
+ * Resolves whether a meeting has an attendance action in flight from the
307
+ * `inFlightMeetingIds` set.
308
+ * @param {MeetingRow} meeting - The meeting to check.
309
+ * @return {boolean} True when the meeting's action is awaiting resolution.
310
+ * @memberof EventGroupCardComponent
311
+ */
312
+ resolveIsInFlight(meeting) {
313
+ return this.inFlightMeetingIds?.has(meeting?.meetingId) ?? false;
314
+ }
315
+ /**
316
+ * Toggles the meeting-list visibility, lazily requesting the first page of the
317
+ * event's child meetings from the container the first time it is opened (Req 6.6).
318
+ * @memberof EventGroupCardComponent
319
+ */
320
+ onToggleMeetingList() {
321
+ this.isMeetingListOpen = !this.isMeetingListOpen;
322
+ if (this.isMeetingListOpen) {
323
+ this.loadMeetings.emit(this.pageIndex + 1);
324
+ }
325
+ }
326
+ /**
327
+ * Handles the "View Event" button, emitting the event id to the host (Req 6.4).
328
+ * @memberof EventGroupCardComponent
329
+ */
330
+ onViewEvent() {
331
+ this.viewEvent.emit(this.event?.eventId);
332
+ }
333
+ /**
334
+ * Bubbles a row's meeting-name link activation upward (Req 6.7, 7.4).
335
+ * @param {string} meetingId - The id emitted by the row.
336
+ * @memberof EventGroupCardComponent
337
+ */
338
+ onOpenMeeting(meetingId) {
339
+ this.openMeeting.emit(meetingId);
340
+ }
341
+ /**
342
+ * Bubbles a row's log-attendance request upward (Req 6.7, 7.7).
343
+ * @param {string} meetingId - The id emitted by the row.
344
+ * @memberof EventGroupCardComponent
345
+ */
346
+ onLogAttendance(meetingId) {
347
+ this.logAttendance.emit(meetingId);
348
+ }
349
+ /**
350
+ * Bubbles a row's leave-meeting request upward (Req 6.7, 7.8).
351
+ * @param {string} meetingId - The id emitted by the row.
352
+ * @memberof EventGroupCardComponent
353
+ */
354
+ onLeaveMeeting(meetingId) {
355
+ this.leaveMeeting.emit(meetingId);
356
+ }
357
+ /**
358
+ * Handles the per-card paginator change, updating the local page state and
359
+ * emitting the requested page as a {@link PageChange} (Req 6.9, 3.3).
360
+ * @param {PageEvent} event - The Material paginator page event.
361
+ * @memberof EventGroupCardComponent
362
+ */
363
+ onPageChange(event) {
364
+ this.pageIndex = event.pageIndex;
365
+ this.pageSize = event.pageSize;
366
+ this.pageChange.emit({
367
+ pageIndex: event.pageIndex,
368
+ pageSize: event.pageSize,
369
+ });
370
+ // Request the newly selected page's child meetings from the container.
371
+ this.loadMeetings.emit(event.pageIndex + 1);
372
+ }
373
+ /**
374
+ * Formats a date for display, preferring the epoch-milliseconds value (from
375
+ * the real API) formatted in the event's timezone and falling back to a legacy
376
+ * ISO string. Returns an empty string when neither is present.
377
+ * @param {number | undefined} epochMs - The epoch-milliseconds value.
378
+ * @param {string | undefined} isoValue - The legacy ISO fallback.
379
+ * @return {string} The formatted date or an empty string.
380
+ * @memberof EventGroupCardComponent
381
+ */
382
+ formatDate(value) {
383
+ return formatEpoch(value, DateFormats.displayFormat, this.event?.timezone);
384
+ }
385
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: EventGroupCardComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
386
+ 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", loadMeetings: "loadMeetings" }, ngImport: i0, template: "<article\r\n class=\"ieeesa-event-group-card\"\r\n [class.ieeesa-event-group-card--mobile]=\"isMobileView\"\r\n [class.ieeesa-event-group-card--standalone]=\"isStandalone\"\r\n>\r\n <!-- ============================ EVENT ============================ -->\r\n <ng-container *ngIf=\"!isStandalone\">\r\n <header class=\"ieeesa-event-group-card__header\">\r\n <div class=\"ieeesa-event-group-card__header-main\">\r\n <!-- EVENT badge + day indicator. -->\r\n <div class=\"ieeesa-event-group-card__badge-row\">\r\n <span class=\"ieeesa-event-group-card__badge\">\r\n {{ constants.eventGroupCard.eventBadge }}\r\n </span>\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 <div class=\"ieeesa-event-group-card__title-row\">\r\n <h3 class=\"ieeesa-event-group-card__title\">{{ event.title }}</h3>\r\n <span\r\n *ngIf=\"event.status\"\r\n class=\"ieeesa-event-group-card__status-pill\"\r\n [ngClass]=\"'ieeesa-event-group-card__status-pill--' + statusModifier\"\r\n >\r\n <span class=\"ieeesa-event-group-card__status-dot\" aria-hidden=\"true\"></span>\r\n {{ event.status }}\r\n </span>\r\n </div>\r\n\r\n <p\r\n *ngIf=\"subtitleText\"\r\n class=\"ieeesa-event-group-card__subtitle\"\r\n >\r\n {{ subtitleText }}\r\n </p>\r\n </div>\r\n\r\n <div class=\"ieeesa-event-group-card__header-side\">\r\n <dl class=\"ieeesa-event-group-card__dates-block\">\r\n <dt class=\"ieeesa-event-group-card__dates-label\">\r\n {{ constants.eventGroupCard.eventDatesLabel }}\r\n </dt>\r\n <dd class=\"ieeesa-event-group-card__dates-value\">\r\n {{ formattedStartDate }}<ng-container *ngIf=\"formattedEndDate && formattedEndDate !== formattedStartDate\">\r\n &ndash; {{ formattedEndDate }}</ng-container>\r\n </dd>\r\n <dd\r\n *ngIf=\"event.timezone\"\r\n class=\"ieeesa-event-group-card__timezone-value\"\r\n >\r\n {{ event.timezone }}\r\n </dd>\r\n </dl>\r\n\r\n <button\r\n type=\"button\"\r\n class=\"ieeesa-event-group-card__view\"\r\n [attr.aria-label]=\"constants.eventGroupCard.ariaLabel.viewEvent\"\r\n (click)=\"onViewEvent()\"\r\n >\r\n {{ constants.eventGroupCard.viewEventLabel }}\r\n </button>\r\n </div>\r\n </header>\r\n\r\n <!-- Meetings label row + Show/Hide toggle. -->\r\n <div class=\"ieeesa-event-group-card__meetings-bar\">\r\n <span class=\"ieeesa-event-group-card__meetings-open\">\r\n <span class=\"ieeesa-event-group-card__meetings-dot\" aria-hidden=\"true\"></span>\r\n {{ openForAttendanceSummary }}\r\n </span>\r\n\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\"\r\n (click)=\"onToggleMeetingList()\"\r\n >\r\n <span>{{ meetingListToggleLabel }}</span>\r\n <i\r\n class=\"fa-solid\"\r\n [ngClass]=\"isMeetingListOpen ? 'fa-chevron-up' : 'fa-chevron-down'\"\r\n aria-hidden=\"true\"\r\n ></i>\r\n </button>\r\n </div>\r\n\r\n <!-- Expanded inner meeting list + per-event paginator. -->\r\n <div\r\n *ngIf=\"isMeetingListOpen\"\r\n class=\"ieeesa-event-group-card__meetings\"\r\n >\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\"\r\n >\r\n <span class=\"ieeesa-event-group-card__paginator-range\">\r\n {{ rangeLabel }}\r\n </span>\r\n\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 </ng-container>\r\n\r\n <!-- ======================= STANDALONE MEETING ======================= -->\r\n <!-- Single horizontal row: badge+name+subtitle | MEETING DATE | TIME & TIMEZONE | action. -->\r\n <div *ngIf=\"isStandalone\" class=\"ieeesa-event-group-card__standalone\">\r\n <div class=\"ieeesa-event-group-card__standalone-main\">\r\n <span class=\"ieeesa-event-group-card__badge ieeesa-event-group-card__badge--standalone\">\r\n {{ constants.eventGroupCard.standaloneBadge }}\r\n </span>\r\n\r\n <div class=\"ieeesa-event-group-card__standalone-title-row\">\r\n <button\r\n type=\"button\"\r\n class=\"ieeesa-event-group-card__standalone-name\"\r\n [attr.aria-label]=\"constants.meetingRow.ariaLabel.meetingNameLink\"\r\n (click)=\"onOpenMeeting(event.eventId)\"\r\n >\r\n {{ event.title }}\r\n </button>\r\n <span\r\n *ngIf=\"event.status\"\r\n class=\"ieeesa-event-group-card__status-pill\"\r\n [ngClass]=\"'ieeesa-event-group-card__status-pill--' + statusModifier\"\r\n >\r\n <span class=\"ieeesa-event-group-card__status-dot\" aria-hidden=\"true\"></span>\r\n {{ event.status }}\r\n </span>\r\n </div>\r\n\r\n <p\r\n *ngIf=\"subtitleText\"\r\n class=\"ieeesa-event-group-card__standalone-subtitle\"\r\n >\r\n {{ subtitleText }}\r\n </p>\r\n </div>\r\n\r\n <!-- MEETING DATE column. -->\r\n <dl class=\"ieeesa-event-group-card__standalone-col\">\r\n <dt class=\"ieeesa-event-group-card__standalone-col-label\">\r\n {{ constants.eventGroupCard.meetingDateLabel }}\r\n </dt>\r\n <dd class=\"ieeesa-event-group-card__standalone-col-value\">\r\n {{ formattedStartDate }}<ng-container *ngIf=\"formattedEndDate && formattedEndDate !== formattedStartDate\">\r\n &ndash; {{ formattedEndDate }}</ng-container>\r\n </dd>\r\n </dl>\r\n\r\n <!-- TIME & TIMEZONE column. -->\r\n <dl class=\"ieeesa-event-group-card__standalone-col\">\r\n <dt class=\"ieeesa-event-group-card__standalone-col-label\">\r\n {{ constants.eventGroupCard.timeTimezoneLabel }}\r\n </dt>\r\n <dd class=\"ieeesa-event-group-card__standalone-col-value\">\r\n {{ standaloneTime }}\r\n </dd>\r\n </dl>\r\n\r\n <!-- Attendance action column. -->\r\n <div class=\"ieeesa-event-group-card__standalone-actions\">\r\n <span\r\n *ngIf=\"isStandaloneAttending\"\r\n class=\"ieeesa-event-group-card__attending-pill\"\r\n >\r\n <span class=\"ieeesa-event-group-card__status-dot\" aria-hidden=\"true\"></span>\r\n {{ constants.meetingRow.currentlyAttendingIndicator }}\r\n </span>\r\n\r\n <button\r\n *ngIf=\"showStandaloneLog\"\r\n type=\"button\"\r\n class=\"ieeesa-event-group-card__standalone-action ieeesa-event-group-card__standalone-action--log\"\r\n [disabled]=\"resolveIsInFlight(standaloneMeeting)\"\r\n [attr.aria-label]=\"constants.meetingRow.ariaLabel.logAttendance\"\r\n (click)=\"onLogAttendance(event.eventId)\"\r\n >\r\n {{ constants.meetingRow.logAttendanceLabel }}\r\n </button>\r\n\r\n <button\r\n *ngIf=\"showStandaloneLeave\"\r\n type=\"button\"\r\n class=\"ieeesa-event-group-card__standalone-action ieeesa-event-group-card__standalone-action--leave\"\r\n [disabled]=\"resolveIsInFlight(standaloneMeeting)\"\r\n [attr.aria-label]=\"constants.meetingRow.ariaLabel.leaveMeeting\"\r\n (click)=\"onLeaveMeeting(event.eventId)\"\r\n >\r\n {{ constants.meetingRow.leaveMeetingLabel }}\r\n </button>\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:16px;padding:20px 24px;border:1px solid #d7d6d6;border-radius:8px;background-color:#fff;box-shadow:0 1px 2px #0000004d,0 2px 6px 2px #00000026;font-family:Calibri Regular}.ieeesa-event-group-card__header{display:flex;align-items:flex-start;justify-content:space-between;gap:24px}.ieeesa-event-group-card__header-main{display:flex;flex-direction:column;gap:8px;min-width:0}.ieeesa-event-group-card__badge-row{display:flex;align-items:center;gap:12px}.ieeesa-event-group-card__badge{display:inline-flex;align-items:center;padding:4px 12px;border-radius:4px;font-family:Calibri Bold;font-size:.75rem;letter-spacing:.03125em;text-transform:uppercase;color:#00629b;background-color:#eaf3f9}.ieeesa-event-group-card__badge--standalone{color:#333436;background-color:#f0f0f0}.ieeesa-event-group-card__day-indicator{font-size:.875rem;line-height:18px;color:#333436}.ieeesa-event-group-card__title-row{display:flex;align-items:center;flex-wrap:wrap;gap:12px}.ieeesa-event-group-card__title{margin:0;font-family:Calibri Bold;font-size:1.25rem;line-height:24px;color:#333436}.ieeesa-event-group-card__status-pill{display:inline-flex;align-items:center;gap:6px;padding:2px 12px;border-radius:16px;font-size:.8125rem;color:#1a7f37;background-color:#e8f5ec}.ieeesa-event-group-card__status-pill--upcoming,.ieeesa-event-group-card__status-pill--starts-soon{color:#8a6d00;background-color:#fef7e0}.ieeesa-event-group-card__status-pill--upcoming .ieeesa-event-group-card__status-dot,.ieeesa-event-group-card__status-pill--starts-soon .ieeesa-event-group-card__status-dot{background-color:#e5a200}.ieeesa-event-group-card__status-dot{width:8px;height:8px;border-radius:50%;background-color:#1a7f37}.ieeesa-event-group-card__subtitle{margin:0;font-size:.875rem;line-height:18px;color:#333436}.ieeesa-event-group-card__header-side{display:flex;align-items:flex-start;gap:24px;flex-shrink:0}.ieeesa-event-group-card__dates-block{display:flex;flex-direction:column;gap:2px;margin:0;text-align:right}.ieeesa-event-group-card__dates-label{font-family:Calibri Bold;font-size:.75rem;letter-spacing:.03125em;text-transform:uppercase;color:#939094}.ieeesa-event-group-card__dates-value{margin:0;font-size:.875rem;line-height:18px;color:#333436}.ieeesa-event-group-card__timezone-value{margin:0;font-size:.8125rem;color:#939094}.ieeesa-event-group-card__view{flex-shrink:0;min-width:122px;padding:8px 16px;border:1px solid #00629b;border-radius:4px;background-color:#fff;font-size:.875rem;color:#00629b;cursor:pointer}.ieeesa-event-group-card__view:hover{background-color:#eaf3f9}.ieeesa-event-group-card__meetings-bar{display:flex;align-items:center;justify-content:space-between;flex-wrap:wrap;gap:12px;padding-top:16px;border-top:1px solid #d7d6d6}.ieeesa-event-group-card__meetings-open{display:inline-flex;align-items:center;gap:8px;font-size:.875rem;color:#333436}.ieeesa-event-group-card__meetings-dot{width:8px;height:8px;border-radius:50%;background-color:#1a7f37}.ieeesa-event-group-card__meeting-toggle{display:inline-flex;align-items:center;gap:8px;padding:8px 0;border:0;background:none;font-size:.875rem;color:#00629b;cursor:pointer}.ieeesa-event-group-card__meetings{display:flex;flex-direction:column;border:1px solid #d7d6d6;border-radius:8px;overflow:hidden}.ieeesa-event-group-card__paginator{display:flex;align-items:center;justify-content:space-between;flex-wrap:wrap;gap:8px;padding:12px 20px;border-top:1px solid #d7d6d6}.ieeesa-event-group-card__paginator-range{font-size:.8125rem;color:#939094}.ieeesa-event-group-card__standalone{display:grid;grid-template-columns:minmax(260px,2.4fr) minmax(130px,1fr) minmax(200px,1.3fr) auto;align-items:center;column-gap:24px}.ieeesa-event-group-card__standalone-main{display:flex;flex-direction:column;gap:6px;min-width:0}.ieeesa-event-group-card__standalone-title-row{display:flex;align-items:center;flex-wrap:wrap;gap:12px}.ieeesa-event-group-card__standalone-name{padding:0;border:0;background:none;text-align:left;text-decoration:underline;font-family:Calibri Bold;font-size:1rem;line-height:20px;color:#00629b;cursor:pointer}.ieeesa-event-group-card__standalone-subtitle{margin:0;font-size:.875rem;line-height:18px;color:#333436}.ieeesa-event-group-card__standalone-col{display:flex;flex-direction:column;gap:4px;margin:0;min-width:0}.ieeesa-event-group-card__standalone-col-label{font-family:Calibri Bold;font-size:.75rem;letter-spacing:.03125em;text-transform:uppercase;color:#939094}.ieeesa-event-group-card__standalone-col-value{margin:0;font-size:.875rem;line-height:18px;color:#333436}.ieeesa-event-group-card__standalone-actions{display:flex;align-items:center;justify-content:flex-end;gap:16px}.ieeesa-event-group-card__attending-pill{display:inline-flex;align-items:center;gap:6px;padding:4px 12px;border-radius:16px;white-space:nowrap;font-size:.8125rem;color:#1a7f37;background-color:#e8f5ec}.ieeesa-event-group-card__standalone-action{min-width:146px;padding:10px 16px;border-radius:4px;font-family:Calibri Bold;font-size:.875rem;cursor:pointer}.ieeesa-event-group-card__standalone-action--log{border:1px solid #00629b;background-color:#00629b;color:#fff}.ieeesa-event-group-card__standalone-action--leave{border:1px solid #00629b;background-color:#fff;color:#00629b}.ieeesa-event-group-card__standalone-action:disabled{border-color:#939094;background-color:#939094;color:#fff;cursor:default}.ieeesa-event-group-card--mobile{padding:16px}.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__header-side{flex-direction:column;align-items:stretch;gap:12px}.ieeesa-event-group-card--mobile .ieeesa-event-group-card__dates-block{text-align:left}.ieeesa-event-group-card--mobile .ieeesa-event-group-card__view{align-self:stretch;width:100%}.ieeesa-event-group-card--mobile .ieeesa-event-group-card__paginator{flex-direction:column;align-items:stretch}.ieeesa-event-group-card--mobile .ieeesa-event-group-card__standalone{grid-template-columns:1fr;row-gap:12px}.ieeesa-event-group-card--mobile .ieeesa-event-group-card__standalone-actions{justify-content:flex-start}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { 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", "compact"], outputs: ["openMeeting", "logAttendance", "leaveMeeting"] }], encapsulation: i0.ViewEncapsulation.None }); }
387
+ }
388
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: EventGroupCardComponent, decorators: [{
389
+ type: Component,
390
+ 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 [class.ieeesa-event-group-card--standalone]=\"isStandalone\"\r\n>\r\n <!-- ============================ EVENT ============================ -->\r\n <ng-container *ngIf=\"!isStandalone\">\r\n <header class=\"ieeesa-event-group-card__header\">\r\n <div class=\"ieeesa-event-group-card__header-main\">\r\n <!-- EVENT badge + day indicator. -->\r\n <div class=\"ieeesa-event-group-card__badge-row\">\r\n <span class=\"ieeesa-event-group-card__badge\">\r\n {{ constants.eventGroupCard.eventBadge }}\r\n </span>\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 <div class=\"ieeesa-event-group-card__title-row\">\r\n <h3 class=\"ieeesa-event-group-card__title\">{{ event.title }}</h3>\r\n <span\r\n *ngIf=\"event.status\"\r\n class=\"ieeesa-event-group-card__status-pill\"\r\n [ngClass]=\"'ieeesa-event-group-card__status-pill--' + statusModifier\"\r\n >\r\n <span class=\"ieeesa-event-group-card__status-dot\" aria-hidden=\"true\"></span>\r\n {{ event.status }}\r\n </span>\r\n </div>\r\n\r\n <p\r\n *ngIf=\"subtitleText\"\r\n class=\"ieeesa-event-group-card__subtitle\"\r\n >\r\n {{ subtitleText }}\r\n </p>\r\n </div>\r\n\r\n <div class=\"ieeesa-event-group-card__header-side\">\r\n <dl class=\"ieeesa-event-group-card__dates-block\">\r\n <dt class=\"ieeesa-event-group-card__dates-label\">\r\n {{ constants.eventGroupCard.eventDatesLabel }}\r\n </dt>\r\n <dd class=\"ieeesa-event-group-card__dates-value\">\r\n {{ formattedStartDate }}<ng-container *ngIf=\"formattedEndDate && formattedEndDate !== formattedStartDate\">\r\n &ndash; {{ formattedEndDate }}</ng-container>\r\n </dd>\r\n <dd\r\n *ngIf=\"event.timezone\"\r\n class=\"ieeesa-event-group-card__timezone-value\"\r\n >\r\n {{ event.timezone }}\r\n </dd>\r\n </dl>\r\n\r\n <button\r\n type=\"button\"\r\n class=\"ieeesa-event-group-card__view\"\r\n [attr.aria-label]=\"constants.eventGroupCard.ariaLabel.viewEvent\"\r\n (click)=\"onViewEvent()\"\r\n >\r\n {{ constants.eventGroupCard.viewEventLabel }}\r\n </button>\r\n </div>\r\n </header>\r\n\r\n <!-- Meetings label row + Show/Hide toggle. -->\r\n <div class=\"ieeesa-event-group-card__meetings-bar\">\r\n <span class=\"ieeesa-event-group-card__meetings-open\">\r\n <span class=\"ieeesa-event-group-card__meetings-dot\" aria-hidden=\"true\"></span>\r\n {{ openForAttendanceSummary }}\r\n </span>\r\n\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\"\r\n (click)=\"onToggleMeetingList()\"\r\n >\r\n <span>{{ meetingListToggleLabel }}</span>\r\n <i\r\n class=\"fa-solid\"\r\n [ngClass]=\"isMeetingListOpen ? 'fa-chevron-up' : 'fa-chevron-down'\"\r\n aria-hidden=\"true\"\r\n ></i>\r\n </button>\r\n </div>\r\n\r\n <!-- Expanded inner meeting list + per-event paginator. -->\r\n <div\r\n *ngIf=\"isMeetingListOpen\"\r\n class=\"ieeesa-event-group-card__meetings\"\r\n >\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\"\r\n >\r\n <span class=\"ieeesa-event-group-card__paginator-range\">\r\n {{ rangeLabel }}\r\n </span>\r\n\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 </ng-container>\r\n\r\n <!-- ======================= STANDALONE MEETING ======================= -->\r\n <!-- Single horizontal row: badge+name+subtitle | MEETING DATE | TIME & TIMEZONE | action. -->\r\n <div *ngIf=\"isStandalone\" class=\"ieeesa-event-group-card__standalone\">\r\n <div class=\"ieeesa-event-group-card__standalone-main\">\r\n <span class=\"ieeesa-event-group-card__badge ieeesa-event-group-card__badge--standalone\">\r\n {{ constants.eventGroupCard.standaloneBadge }}\r\n </span>\r\n\r\n <div class=\"ieeesa-event-group-card__standalone-title-row\">\r\n <button\r\n type=\"button\"\r\n class=\"ieeesa-event-group-card__standalone-name\"\r\n [attr.aria-label]=\"constants.meetingRow.ariaLabel.meetingNameLink\"\r\n (click)=\"onOpenMeeting(event.eventId)\"\r\n >\r\n {{ event.title }}\r\n </button>\r\n <span\r\n *ngIf=\"event.status\"\r\n class=\"ieeesa-event-group-card__status-pill\"\r\n [ngClass]=\"'ieeesa-event-group-card__status-pill--' + statusModifier\"\r\n >\r\n <span class=\"ieeesa-event-group-card__status-dot\" aria-hidden=\"true\"></span>\r\n {{ event.status }}\r\n </span>\r\n </div>\r\n\r\n <p\r\n *ngIf=\"subtitleText\"\r\n class=\"ieeesa-event-group-card__standalone-subtitle\"\r\n >\r\n {{ subtitleText }}\r\n </p>\r\n </div>\r\n\r\n <!-- MEETING DATE column. -->\r\n <dl class=\"ieeesa-event-group-card__standalone-col\">\r\n <dt class=\"ieeesa-event-group-card__standalone-col-label\">\r\n {{ constants.eventGroupCard.meetingDateLabel }}\r\n </dt>\r\n <dd class=\"ieeesa-event-group-card__standalone-col-value\">\r\n {{ formattedStartDate }}<ng-container *ngIf=\"formattedEndDate && formattedEndDate !== formattedStartDate\">\r\n &ndash; {{ formattedEndDate }}</ng-container>\r\n </dd>\r\n </dl>\r\n\r\n <!-- TIME & TIMEZONE column. -->\r\n <dl class=\"ieeesa-event-group-card__standalone-col\">\r\n <dt class=\"ieeesa-event-group-card__standalone-col-label\">\r\n {{ constants.eventGroupCard.timeTimezoneLabel }}\r\n </dt>\r\n <dd class=\"ieeesa-event-group-card__standalone-col-value\">\r\n {{ standaloneTime }}\r\n </dd>\r\n </dl>\r\n\r\n <!-- Attendance action column. -->\r\n <div class=\"ieeesa-event-group-card__standalone-actions\">\r\n <span\r\n *ngIf=\"isStandaloneAttending\"\r\n class=\"ieeesa-event-group-card__attending-pill\"\r\n >\r\n <span class=\"ieeesa-event-group-card__status-dot\" aria-hidden=\"true\"></span>\r\n {{ constants.meetingRow.currentlyAttendingIndicator }}\r\n </span>\r\n\r\n <button\r\n *ngIf=\"showStandaloneLog\"\r\n type=\"button\"\r\n class=\"ieeesa-event-group-card__standalone-action ieeesa-event-group-card__standalone-action--log\"\r\n [disabled]=\"resolveIsInFlight(standaloneMeeting)\"\r\n [attr.aria-label]=\"constants.meetingRow.ariaLabel.logAttendance\"\r\n (click)=\"onLogAttendance(event.eventId)\"\r\n >\r\n {{ constants.meetingRow.logAttendanceLabel }}\r\n </button>\r\n\r\n <button\r\n *ngIf=\"showStandaloneLeave\"\r\n type=\"button\"\r\n class=\"ieeesa-event-group-card__standalone-action ieeesa-event-group-card__standalone-action--leave\"\r\n [disabled]=\"resolveIsInFlight(standaloneMeeting)\"\r\n [attr.aria-label]=\"constants.meetingRow.ariaLabel.leaveMeeting\"\r\n (click)=\"onLeaveMeeting(event.eventId)\"\r\n >\r\n {{ constants.meetingRow.leaveMeetingLabel }}\r\n </button>\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:16px;padding:20px 24px;border:1px solid #d7d6d6;border-radius:8px;background-color:#fff;box-shadow:0 1px 2px #0000004d,0 2px 6px 2px #00000026;font-family:Calibri Regular}.ieeesa-event-group-card__header{display:flex;align-items:flex-start;justify-content:space-between;gap:24px}.ieeesa-event-group-card__header-main{display:flex;flex-direction:column;gap:8px;min-width:0}.ieeesa-event-group-card__badge-row{display:flex;align-items:center;gap:12px}.ieeesa-event-group-card__badge{display:inline-flex;align-items:center;padding:4px 12px;border-radius:4px;font-family:Calibri Bold;font-size:.75rem;letter-spacing:.03125em;text-transform:uppercase;color:#00629b;background-color:#eaf3f9}.ieeesa-event-group-card__badge--standalone{color:#333436;background-color:#f0f0f0}.ieeesa-event-group-card__day-indicator{font-size:.875rem;line-height:18px;color:#333436}.ieeesa-event-group-card__title-row{display:flex;align-items:center;flex-wrap:wrap;gap:12px}.ieeesa-event-group-card__title{margin:0;font-family:Calibri Bold;font-size:1.25rem;line-height:24px;color:#333436}.ieeesa-event-group-card__status-pill{display:inline-flex;align-items:center;gap:6px;padding:2px 12px;border-radius:16px;font-size:.8125rem;color:#1a7f37;background-color:#e8f5ec}.ieeesa-event-group-card__status-pill--upcoming,.ieeesa-event-group-card__status-pill--starts-soon{color:#8a6d00;background-color:#fef7e0}.ieeesa-event-group-card__status-pill--upcoming .ieeesa-event-group-card__status-dot,.ieeesa-event-group-card__status-pill--starts-soon .ieeesa-event-group-card__status-dot{background-color:#e5a200}.ieeesa-event-group-card__status-dot{width:8px;height:8px;border-radius:50%;background-color:#1a7f37}.ieeesa-event-group-card__subtitle{margin:0;font-size:.875rem;line-height:18px;color:#333436}.ieeesa-event-group-card__header-side{display:flex;align-items:flex-start;gap:24px;flex-shrink:0}.ieeesa-event-group-card__dates-block{display:flex;flex-direction:column;gap:2px;margin:0;text-align:right}.ieeesa-event-group-card__dates-label{font-family:Calibri Bold;font-size:.75rem;letter-spacing:.03125em;text-transform:uppercase;color:#939094}.ieeesa-event-group-card__dates-value{margin:0;font-size:.875rem;line-height:18px;color:#333436}.ieeesa-event-group-card__timezone-value{margin:0;font-size:.8125rem;color:#939094}.ieeesa-event-group-card__view{flex-shrink:0;min-width:122px;padding:8px 16px;border:1px solid #00629b;border-radius:4px;background-color:#fff;font-size:.875rem;color:#00629b;cursor:pointer}.ieeesa-event-group-card__view:hover{background-color:#eaf3f9}.ieeesa-event-group-card__meetings-bar{display:flex;align-items:center;justify-content:space-between;flex-wrap:wrap;gap:12px;padding-top:16px;border-top:1px solid #d7d6d6}.ieeesa-event-group-card__meetings-open{display:inline-flex;align-items:center;gap:8px;font-size:.875rem;color:#333436}.ieeesa-event-group-card__meetings-dot{width:8px;height:8px;border-radius:50%;background-color:#1a7f37}.ieeesa-event-group-card__meeting-toggle{display:inline-flex;align-items:center;gap:8px;padding:8px 0;border:0;background:none;font-size:.875rem;color:#00629b;cursor:pointer}.ieeesa-event-group-card__meetings{display:flex;flex-direction:column;border:1px solid #d7d6d6;border-radius:8px;overflow:hidden}.ieeesa-event-group-card__paginator{display:flex;align-items:center;justify-content:space-between;flex-wrap:wrap;gap:8px;padding:12px 20px;border-top:1px solid #d7d6d6}.ieeesa-event-group-card__paginator-range{font-size:.8125rem;color:#939094}.ieeesa-event-group-card__standalone{display:grid;grid-template-columns:minmax(260px,2.4fr) minmax(130px,1fr) minmax(200px,1.3fr) auto;align-items:center;column-gap:24px}.ieeesa-event-group-card__standalone-main{display:flex;flex-direction:column;gap:6px;min-width:0}.ieeesa-event-group-card__standalone-title-row{display:flex;align-items:center;flex-wrap:wrap;gap:12px}.ieeesa-event-group-card__standalone-name{padding:0;border:0;background:none;text-align:left;text-decoration:underline;font-family:Calibri Bold;font-size:1rem;line-height:20px;color:#00629b;cursor:pointer}.ieeesa-event-group-card__standalone-subtitle{margin:0;font-size:.875rem;line-height:18px;color:#333436}.ieeesa-event-group-card__standalone-col{display:flex;flex-direction:column;gap:4px;margin:0;min-width:0}.ieeesa-event-group-card__standalone-col-label{font-family:Calibri Bold;font-size:.75rem;letter-spacing:.03125em;text-transform:uppercase;color:#939094}.ieeesa-event-group-card__standalone-col-value{margin:0;font-size:.875rem;line-height:18px;color:#333436}.ieeesa-event-group-card__standalone-actions{display:flex;align-items:center;justify-content:flex-end;gap:16px}.ieeesa-event-group-card__attending-pill{display:inline-flex;align-items:center;gap:6px;padding:4px 12px;border-radius:16px;white-space:nowrap;font-size:.8125rem;color:#1a7f37;background-color:#e8f5ec}.ieeesa-event-group-card__standalone-action{min-width:146px;padding:10px 16px;border-radius:4px;font-family:Calibri Bold;font-size:.875rem;cursor:pointer}.ieeesa-event-group-card__standalone-action--log{border:1px solid #00629b;background-color:#00629b;color:#fff}.ieeesa-event-group-card__standalone-action--leave{border:1px solid #00629b;background-color:#fff;color:#00629b}.ieeesa-event-group-card__standalone-action:disabled{border-color:#939094;background-color:#939094;color:#fff;cursor:default}.ieeesa-event-group-card--mobile{padding:16px}.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__header-side{flex-direction:column;align-items:stretch;gap:12px}.ieeesa-event-group-card--mobile .ieeesa-event-group-card__dates-block{text-align:left}.ieeesa-event-group-card--mobile .ieeesa-event-group-card__view{align-self:stretch;width:100%}.ieeesa-event-group-card--mobile .ieeesa-event-group-card__paginator{flex-direction:column;align-items:stretch}.ieeesa-event-group-card--mobile .ieeesa-event-group-card__standalone{grid-template-columns:1fr;row-gap:12px}.ieeesa-event-group-card--mobile .ieeesa-event-group-card__standalone-actions{justify-content:flex-start}\n"] }]
391
+ }], propDecorators: { event: [{
392
+ type: Input
393
+ }], permissions: [{
394
+ type: Input
395
+ }], attendanceStates: [{
396
+ type: Input
397
+ }], inFlightMeetingIds: [{
398
+ type: Input
399
+ }], isMobileView: [{
400
+ type: Input
401
+ }], viewEvent: [{
402
+ type: Output
403
+ }], openMeeting: [{
404
+ type: Output
405
+ }], logAttendance: [{
406
+ type: Output
407
+ }], leaveMeeting: [{
408
+ type: Output
409
+ }], pageChange: [{
410
+ type: Output
411
+ }], loadMeetings: [{
412
+ type: Output
413
+ }] } });
414
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXZlbnQtZ3JvdXAtY2FyZC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9kYXNoYm9hcmQvc3JjL2xpYi9jb21wb25lbnRzL2V2ZW50LWdyb3VwLWNhcmQvZXZlbnQtZ3JvdXAtY2FyZC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9kYXNoYm9hcmQvc3JjL2xpYi9jb21wb25lbnRzL2V2ZW50LWdyb3VwLWNhcmQvZXZlbnQtZ3JvdXAtY2FyZC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDL0MsT0FBTyxFQUNMLFNBQVMsRUFDVCxZQUFZLEVBQ1osS0FBSyxFQUNMLE1BQU0sRUFDTixpQkFBaUIsR0FDbEIsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUNMLGtCQUFrQixHQUVuQixNQUFNLDZCQUE2QixDQUFDO0FBRXJDLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxxQ0FBcUMsQ0FBQztBQUd0RSxPQUFPLEVBRUwsZ0JBQWdCLEdBQ2pCLE1BQU0sbUNBQW1DLENBQUM7QUFDM0MsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBQ3hELE9BQU8sRUFBRSw2QkFBNkIsRUFBRSxNQUFNLDREQUE0RCxDQUFDO0FBQzNHLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQztBQUMzRCxPQUFPLEtBQUssV0FBVyxNQUFNLDZCQUE2QixDQUFDOzs7O0FBRTNEOzs7Ozs7Ozs7Ozs7OztHQWNHO0FBVUgsTUFBTSxPQUFPLHVCQUF1QjtJQVRwQztRQVVFLHlEQUF5RDtRQUN6RCw4REFBOEQ7UUFDOUQsY0FBUyxHQUFRLFdBQVcsQ0FBQztRQUU3QixrRkFBa0Y7UUFDekUsY0FBUyxHQUFHLGdCQUFnQixDQUFDO1FBbUJ0Qyxr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QUFZLEVBQUUsa0JBQWtCLEVBQUUsNkJBQTZCLENBQUMsaUJBRzNELGlCQUFpQixDQUFDLElBQUk7OEJBeUI1QixLQUFLO3NCQUFiLEtBQUs7Z0JBR0csV0FBVztzQkFBbkIsS0FBSztnQkFNRyxnQkFBZ0I7c0JBQXhCLEtBQUs7Z0JBR0csa0JBQWtCO3NCQUExQixLQUFLO2dCQUdHLFlBQVk7c0JBQXBCLEtBQUs7Z0JBR0ksU0FBUztzQkFBbEIsTUFBTTtnQkFHRyxXQUFXO3NCQUFwQixNQUFNO2dCQUdHLGFBQWE7c0JBQXRCLE1BQU07Z0JBR0csWUFBWTtzQkFBckIsTUFBTTtnQkFHRyxVQUFVO3NCQUFuQixNQUFNO2dCQU9HLFlBQVk7c0JBQXJCLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21tb25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xyXG5pbXBvcnQge1xyXG4gIENvbXBvbmVudCxcclxuICBFdmVudEVtaXR0ZXIsXHJcbiAgSW5wdXQsXHJcbiAgT3V0cHV0LFxyXG4gIFZpZXdFbmNhcHN1bGF0aW9uLFxyXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQge1xyXG4gIE1hdFBhZ2luYXRvck1vZHVsZSxcclxuICBQYWdlRXZlbnQsXHJcbn0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvcGFnaW5hdG9yJztcclxuaW1wb3J0IHsgQXR0ZW5kYW5jZUFjdGlvblBlcm1pc3Npb25zIH0gZnJvbSAnLi4vLi4vbW9kZWxzL2F0dGVuZGFuY2UtYWN0aW9uLXBlcm1pc3Npb25zLm1vZGVsJztcclxuaW1wb3J0IHsgQXR0ZW5kYW5jZVN0YXRlIH0gZnJvbSAnLi4vLi4vbW9kZWxzL2F0dGVuZGFuY2Utc3RhdGUubW9kZWwnO1xyXG5pbXBvcnQgeyBNZWV0aW5nUm93IH0gZnJvbSAnLi4vLi4vbW9kZWxzL21lZXRpbmctcm93Lm1vZGVsJztcclxuaW1wb3J0IHsgUGFnZUNoYW5nZSB9IGZyb20gJy4uLy4uL21vZGVscy9wYWdlLWNoYW5nZS5tb2RlbCc7XHJcbmltcG9ydCB7XHJcbiAgVXBjb21pbmdFdmVudCxcclxuICBVcGNvbWluZ0l0ZW1LaW5kLFxyXG59IGZyb20gJy4uLy4uL21vZGVscy91cGNvbWluZy1ldmVudC5tb2RlbCc7XHJcbmltcG9ydCB7IERhdGVGb3JtYXRzIH0gZnJvbSAnLi4vLi4vYXNzZXRzL2RhdGUtZm9ybWF0cyc7XHJcbmltcG9ydCB7IE1lZXRpbmdBdHRlbmRhbmNlUm93Q29tcG9uZW50IH0gZnJvbSAnLi4vbWVldGluZy1hdHRlbmRhbmNlLXJvdy9tZWV0aW5nLWF0dGVuZGFuY2Utcm93LmNvbXBvbmVudCc7XHJcbmltcG9ydCB7IGZvcm1hdEVwb2NoIH0gZnJvbSAnLi4vLi4vdXRpbHMvZGF0ZS1mb3JtYXQudXRpbCc7XHJcbmltcG9ydCAqIGFzIHNjcmVlblRleHRzIGZyb20gJy4uLy4uL2Fzc2V0cy9jb25zdGFudHMuanNvbic7XHJcblxyXG4vKipcclxuICogRXZlbnRfR3JvdXBfQ2FyZCByZW5kZXJzIGEgc2luZ2xlIHVwY29taW5nIGV2ZW50IGFzIGEgY2FyZDogdGhlIHN0YXR1cyBiYWRnZSxcclxuICogdGl0bGUsIGRheSBpbmRpY2F0b3IsIG1lZXRpbmctY291bnQgc3VtbWFyeSBzdWItbGluZSwgc3RhcnQvZW5kIGRhdGUsIGFuZFxyXG4gKiB0aW1lem9uZSAoYWxsIGx1eG9uLWZvcm1hdHRlZCkuIEl0IGV4cG9zZXMgYSBcIlZpZXcgRXZlbnRcIiBhY3Rpb24sIGFcclxuICogc2hvdy9oaWRlIHRvZ2dsZSBmb3IgdGhlIG1lZXRpbmcgbGlzdCBsYWJlbGVkIHdpdGggdGhlIG9wZW4tZm9yLWF0dGVuZGFuY2VcclxuICogY291bnQsIHRoZSBwZXItZXZlbnQgbWVldGluZyByb3dzIChvbmUge0BsaW5rIE1lZXRpbmdBdHRlbmRhbmNlUm93Q29tcG9uZW50fVxyXG4gKiBwZXIgbWVldGluZyBvbiB0aGUgY3VycmVudCBwYWdlKSwgYW5kIGEgcGVyLWNhcmQgcGFnaW5hdG9yLlxyXG4gKlxyXG4gKiBUaGUgY29tcG9uZW50IGlzIHB1cmVseSBwcmVzZW50YXRpb25hbCDigJQgaXQgZW1pdHMgbmF2aWdhdGlvbiwgYXR0ZW5kYW5jZSwgYW5kXHJcbiAqIHBhZ2luYXRpb24gaW50ZW50cyB2aWEgYEBPdXRwdXQoKWAgYW5kIG5ldmVyIHBlcmZvcm1zIG5hdmlnYXRpb24gb3IgSFRUUFxyXG4gKiBpdHNlbGYuIE1lZXRpbmctcm93IG91dHB1dHMgKGBvcGVuTWVldGluZ2AvYGxvZ0F0dGVuZGFuY2VgL2BsZWF2ZU1lZXRpbmdgKSBhcmVcclxuICogYnViYmxlZCB1cHdhcmQgdW5jaGFuZ2VkIHNvIHRoZSBjb250YWluZXIgY2FuIGRlbGVnYXRlIHRvIHRoZSBzZXJ2aWNlLlxyXG4gKiBAZXhwb3J0XHJcbiAqIEBjbGFzcyBFdmVudEdyb3VwQ2FyZENvbXBvbmVudFxyXG4gKi9cclxuQENvbXBvbmVudCh7XHJcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEBhbmd1bGFyLWVzbGludC9jb21wb25lbnQtc2VsZWN0b3JcclxuICBzZWxlY3RvcjogJ2llZWVzYS1ldmVudC1ncm91cC1jYXJkJyxcclxuICBzdGFuZGFsb25lOiB0cnVlLFxyXG4gIGltcG9ydHM6IFtDb21tb25Nb2R1bGUsIE1hdFBhZ2luYXRvck1vZHVsZSwgTWVldGluZ0F0dGVuZGFuY2VSb3dDb21wb25lbnRdLFxyXG4gIHRlbXBsYXRlVXJsOiAnLi9ldmVudC1ncm91cC1jYXJkLmNvbXBvbmVudC5odG1sJyxcclxuICBzdHlsZVVybHM6IFsnLi9ldmVudC1ncm91cC1jYXJkLmNvbXBvbmVudC5zY3NzJ10sXHJcbiAgZW5jYXBzdWxhdGlvbjogVmlld0VuY2Fwc3VsYXRpb24uTm9uZSxcclxufSlcclxuZXhwb3J0IGNsYXNzIEV2ZW50R3JvdXBDYXJkQ29tcG9uZW50IHtcclxuICAvKiogVXNlci1mYWNpbmcgc3RyaW5ncyBzb3VyY2VkIGZyb20gYGNvbnN0YW50cy5qc29uYC4gKi9cclxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxyXG4gIGNvbnN0YW50czogYW55ID0gc2NyZWVuVGV4dHM7XHJcblxyXG4gIC8qKiBFbnVtIHJlZmVyZW5jZSBmb3IgRVZFTlQgdnMgU1RBTkRBTE9ORV9NRUVUSU5HIGNvbXBhcmlzb25zIGluIHRoZSB0ZW1wbGF0ZS4gKi9cclxuICByZWFkb25seSBpdGVtS2luZHMgPSBVcGNvbWluZ0l0ZW1LaW5kO1xyXG5cclxuICAvKipcclxuICAgKiBUaGUgZXZlbnQgc3RhdHVzIHNsdWdpZmllZCBpbnRvIGEgQkVNIG1vZGlmaWVyIHN1ZmZpeCAobG93ZXJjYXNlLCBzcGFjZXMgdG9cclxuICAgKiBoeXBoZW5zKSwgZS5nLiBcIkluIFByb2dyZXNzXCIgLT4gXCJpbi1wcm9ncmVzc1wiLCB1c2VkIHRvIGNvbG91ciB0aGUgc3RhdHVzXHJcbiAgICogcGlsbCBwZXIgc3RhdHVzLlxyXG4gICAqIEByZXR1cm4ge3N0cmluZ30gVGhlIHN0YXR1cyBtb2RpZmllciBzdWZmaXguXHJcbiAgICogQG1lbWJlcm9mIEV2ZW50R3JvdXBDYXJkQ29tcG9uZW50XHJcbiAgICovXHJcbiAgZ2V0IHN0YXR1c01vZGlmaWVyKCk6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gKHRoaXMuZXZlbnQ/LnN0YXR1cyA/PyAnJylcclxuICAgICAgLnRyaW0oKVxyXG4gICAgICAudG9Mb3dlckNhc2UoKVxyXG4gICAgICAucmVwbGFjZSgvXFxzKy9nLCAnLScpO1xyXG4gIH1cclxuXHJcbiAgLyoqIFRoZSB1cGNvbWluZyBldmVudCByZW5kZXJlZCBieSB0aGlzIGNhcmQuICovXHJcbiAgQElucHV0KCkgZXZlbnQhOiBVcGNvbWluZ0V2ZW50O1xyXG5cclxuICAvKiogSG9zdCBwZXJtaXNzaW9ucyBnYXRpbmcgdGhlIHBlci1yb3cgbG9nLWF0dGVuZGFuY2UgLyBsZWF2ZS1tZWV0aW5nIGJ1dHRvbnMuICovXHJcbiAgQElucHV0KCkgcGVybWlzc2lvbnM6IEF0dGVuZGFuY2VBY3Rpb25QZXJtaXNzaW9ucyA9IHtcclxuICAgIGNhbkxvZ0F0dGVuZGFuY2U6IGZhbHNlLFxyXG4gICAgY2FuTGVhdmVNZWV0aW5nOiBmYWxzZSxcclxuICB9O1xyXG5cclxuICAvKiogTWFwIG9mIG1lZXRpbmcgaWQgdG8gY3VycmVudCBhdHRlbmRhbmNlIHN0YXRlLCBwYXNzZWQgZG93biB0byBlYWNoIHJvdy4gKi9cclxuICBASW5wdXQoKSBhdHRlbmRhbmNlU3RhdGVzOiBSZWNvcmQ8c3RyaW5nLCBBdHRlbmRhbmNlU3RhdGU+ID0ge307XHJcblxyXG4gIC8qKiBTZXQgb2YgbWVldGluZyBpZHMgd2l0aCBhbiBhdHRlbmRhbmNlIGFjdGlvbiBhd2FpdGluZyByZXNvbHV0aW9uLiAqL1xyXG4gIEBJbnB1dCgpIGluRmxpZ2h0TWVldGluZ0lkczogUmVhZG9ubHlTZXQ8c3RyaW5nPiA9IG5ldyBTZXQ8c3RyaW5nPigpO1xyXG5cclxuICAvKiogV2hldGhlciB0aGUgaG9zdCBoYXMgZGV0ZXJtaW5lZCB0aGUgdmlld3BvcnQgaXMgYXQvYmVsb3cgdGhlIG1vYmlsZSBicmVha3BvaW50LiAqL1xyXG4gIEBJbnB1dCgpIGlzTW9iaWxlVmlldyA9IGZhbHNlO1xyXG5cclxuICAvKiogRW1pdHMgdGhlIGV2ZW50IGlkIHdoZW4gdGhlIFwiVmlldyBFdmVudFwiIGJ1dHRvbiBpcyBhY3RpdmF0ZWQgKFJlcSA2LjQpLiAqL1xyXG4gIEBPdXRwdXQoKSB2aWV3RXZlbnQgPSBuZXcgRXZlbnRFbWl0dGVyPHN0cmluZz4oKTtcclxuXHJcbiAgLyoqIEJ1YmJsZXMgdGhlIG1lZXRpbmcgaWQgd2hlbiBhIHJvdydzIG1lZXRpbmctbmFtZSBsaW5rIGlzIGFjdGl2YXRlZCAoUmVxIDYuNywgNy40KS4gKi9cclxuICBAT3V0cHV0KCkgb3Blbk1lZXRpbmcgPSBuZXcgRXZlbnRFbWl0dGVyPHN0cmluZz4oKTtcclxuXHJcbiAgLyoqIEJ1YmJsZXMgdGhlIG1lZXRpbmcgaWQgd2hlbiBhIHJvdyByZXF1ZXN0cyBsb2dnaW5nIGF0dGVuZGFuY2UgKFJlcSA2LjcsIDcuNykuICovXHJcbiAgQE91dHB1dCgpIGxvZ0F0dGVuZGFuY2UgPSBuZXcgRXZlbnRFbWl0dGVyPHN0cmluZz4oKTtcclxuXHJcbiAgLyoqIEJ1YmJsZXMgdGhlIG1lZXRpbmcgaWQgd2hlbiBhIHJvdyByZXF1ZXN0cyBsZWF2aW5nIHRoZSBtZWV0aW5nIChSZXEgNi43LCA3LjgpLiAqL1xyXG4gIEBPdXRwdXQoKSBsZWF2ZU1lZXRpbmcgPSBuZXcgRXZlbnRFbWl0dGVyPHN0cmluZz4oKTtcclxuXHJcbiAgLyoqIEVtaXRzIHRoZSByZXF1ZXN0ZWQgcGFnZSB3aGVuIHRoZSBwZXItY2FyZCBwYWdpbmF0b3IgY2hhbmdlcyAoUmVxIDYuOSwgMy4zKS4gKi9cclxuICBAT3V0cHV0KCkgcGFnZUNoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8UGFnZUNoYW5nZT4oKTtcclxuXHJcbiAgLyoqXHJcbiAgICogRW1pdHMgdGhlIG9uZS1iYXNlZCBwYWdlIHRvIGxvYWQgd2hlbiB0aGUgbWVldGluZyBsaXN0IGlzIG9wZW5lZCAob3IgcGFnZWQpXHJcbiAgICogc28gdGhlIGNvbnRhaW5lciBjYW4gbGF6aWx5IGZldGNoIHRoZSBldmVudCdzIGNoaWxkIG1lZXRpbmdzIGZyb20gdGhlXHJcbiAgICogYmFja2VuZC4gU3RhbmRhbG9uZS1tZWV0aW5nIGNhcmRzIG5ldmVyIGVtaXQgdGhpcy5cclxuICAgKi9cclxuICBAT3V0cHV0KCkgbG9hZE1lZXRpbmdzID0gbmV3IEV2ZW50RW1pdHRlcjxudW1iZXI+KCk7XHJcblxyXG4gIC8qKiBUaGUgZGVmYXVsdCBwYWdlIHNpemUgZm9yIHRoZSBwZXItY2FyZCBtZWV0aW5nIHBhZ2luYXRvci4gKi9cclxuICByZWFkb25seSBkZWZhdWx0UGFnZVNpemUgPSA1O1xyXG5cclxuICAvKiogVGhlIGN1cnJlbnQgemVyby1iYXNlZCBwYWdlIGluZGV4IG9mIHRoZSBtZWV0aW5nIGxpc3QuICovXHJcbiAgcGFnZUluZGV4ID0gMDtcclxuXHJcbiAgLyoqIFRoZSBjdXJyZW50IHBhZ2Ugc2l6ZSBvZiB0aGUgbWVldGluZyBsaXN0LiAqL1xyXG4gIHBhZ2VTaXplID0gdGhpcy5kZWZhdWx0UGFnZVNpemU7XHJcblxyXG4gIC8qKiBXaGV0aGVyIHRoZSBtZWV0aW5nIGxpc3QgaXMgY3VycmVudGx5IHNob3duICh0b2dnbGVkIG9wZW4pLiAqL1xyXG4gIGlzTWVldGluZ0xpc3RPcGVuID0gZmFsc2U7XHJcblxyXG4gIC8qKlxyXG4gICAqIFdoZXRoZXIgdGhpcyBjYXJkIHJlbmRlcnMgYSBTVEFOREFMT05FX01FRVRJTkcgKGxlYW5lciBzaW5nbGUtbWVldGluZyBjYXJkXHJcbiAgICogd2l0aCBubyBjaGlsZC1tZWV0aW5nIGxpc3QpIHJhdGhlciB0aGFuIGFuIGV4cGFuZGFibGUgRVZFTlQgYmxvY2suXHJcbiAgICogQHJldHVybiB7Ym9vbGVhbn0gVHJ1ZSBmb3Igc3RhbmRhbG9uZS1tZWV0aW5nIGNhcmRzLlxyXG4gICAqIEBtZW1iZXJvZiBFdmVudEdyb3VwQ2FyZENvbXBvbmVudFxyXG4gICAqL1xyXG4gIGdldCBpc1N0YW5kYWxvbmUoKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5ldmVudD8ua2luZCA9PT0gVXBjb21pbmdJdGVtS2luZC5TVEFOREFMT05FX01FRVRJTkc7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBUaGUgZnVsbCBsaXN0IG9mIG1lZXRpbmdzIGZvciB0aGUgZXZlbnQsIGRlZmF1bHRpbmcgdG8gYW4gZW1wdHkgbGlzdCB3aGVuXHJcbiAgICogdGhlIGV2ZW50IGhhcyBub25lLlxyXG4gICAqIEByZXR1cm4ge01lZXRpbmdSb3dbXX0gVGhlIGV2ZW50J3MgbWVldGluZ3MuXHJcbiAgICogQG1lbWJlcm9mIEV2ZW50R3JvdXBDYXJkQ29tcG9uZW50XHJcbiAgICovXHJcbiAgZ2V0IG1lZXRpbmdzKCk6IE1lZXRpbmdSb3dbXSB7XHJcbiAgICByZXR1cm4gdGhpcy5ldmVudD8ubWVldGluZ3MgPz8gW107XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBUaGUgdG90YWwgbnVtYmVyIG9mIG1lZXRpbmdzIGZvciB0aGUgZXZlbnQgKHBhZ2luYXRvciBsZW5ndGgpLiBVc2VzIHRoZVxyXG4gICAqIGJhY2tlbmQgYG1lZXRpbmdDb3VudGAgKHRoZSBmdWxsIHRvdGFsKSByYXRoZXIgdGhhbiB0aGUgbGVuZ3RoIG9mIHRoZVxyXG4gICAqIGN1cnJlbnRseSBsb2FkZWQgcGFnZSwgc28gdGhlIHBhZ2luYXRvciBjYW4gYWR2YW5jZSB0aHJvdWdoIGV2ZXJ5IHBhZ2UuXHJcbiAgICogQHJldHVybiB7bnVtYmVyfSBUaGUgdG90YWwgbWVldGluZyBjb3VudC5cclxuICAgKiBAbWVtYmVyb2YgRXZlbnRHcm91cENhcmRDb21wb25lbnRcclxuICAgKi9cclxuICBnZXQgdG90YWxNZWV0aW5ncygpOiBudW1iZXIge1xyXG4gICAgcmV0dXJuIHRoaXMuZXZlbnQ/Lm1lZXRpbmdDb3VudCB8fCB0aGlzLm1lZXRpbmdzLmxlbmd0aDtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFRoZSBtZWV0aW5ncyB0byByZW5kZXIgZm9yIHRoZSBjdXJyZW50IHBhZ2UuIFRoZSBzZXJ2ZXIgcmV0dXJucyBleGFjdGx5IG9uZVxyXG4gICAqIHBhZ2Ugb2YgbWVldGluZ3MgaW50byBgZXZlbnQubWVldGluZ3NgLCBzbyB0aGUgY2FyZCByZW5kZXJzIHRoZW0gYXMtaXNcclxuICAgKiB3aXRob3V0IGxvY2FsIHNsaWNpbmcgKHBhZ2luYXRpb24gaXMgc2VydmVyLXNpZGUpLlxyXG4gICAqIEByZXR1cm4ge01lZXRpbmdSb3dbXX0gVGhlIG1lZXRpbmdzIG9uIHRoZSBjdXJyZW50IHBhZ2UuXHJcbiAgICogQG1lbWJlcm9mIEV2ZW50R3JvdXBDYXJkQ29tcG9uZW50XHJcbiAgICovXHJcbiAgZ2V0IHBhZ2VkTWVldGluZ3MoKTogTWVldGluZ1Jvd1tdIHtcclxuICAgIHJldHVybiB0aGlzLm1lZXRpbmdzO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogVGhlIG9uZS1iYXNlZCBpbmRleCBvZiB0aGUgZmlyc3QgbWVldGluZyBzaG93biBvbiB0aGUgY3VycmVudCBwYWdlLCBvciAwXHJcbiAgICogd2hlbiB0aGVyZSBhcmUgbm8gbWVldGluZ3MuXHJcbiAgICogQHJldHVybiB7bnVtYmVyfSBUaGUgc3RhcnQgaW5kZXggZm9yIHRoZSByYW5nZSB0ZW1wbGF0ZS5cclxuICAgKiBAbWVtYmVyb2YgRXZlbnRHcm91cENhcmRDb21wb25lbnRcclxuICAgKi9cclxuICBnZXQgcmFuZ2VTdGFydCgpOiBudW1iZXIge1xyXG4gICAgcmV0dXJuIHRoaXMudG90YWxNZWV0aW5ncyA9PT0gMCA/IDAgOiB0aGlzLnBhZ2VJbmRleCAqIHRoaXMucGFnZVNpemUgKyAxO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogVGhlIG9uZS1iYXNlZCBpbmRleCBvZiB0aGUgbGFzdCBtZWV0aW5nIHNob3duIG9uIHRoZSBjdXJyZW50IHBhZ2UsIGNsYW1wZWRcclxuICAgKiB0byB0aGUgdG90YWwgbWVldGluZyBjb3VudC5cclxuICAgKiBAcmV0dXJuIHtudW1iZXJ9IFRoZSBlbmQgaW5kZXggZm9yIHRoZSByYW5nZSB0ZW1wbGF0ZS5cclxuICAgKiBAbWVtYmVyb2YgRXZlbnRHcm91cENhcmRDb21wb25lbnRcclxuICAgKi9cclxuICBnZXQgcmFuZ2VFbmQoKTogbnVtYmVyIHtcclxuICAgIHJldHVybiBNYXRoLm1pbigodGhpcy5wYWdlSW5kZXggKyAxKSAqIHRoaXMucGFnZVNpemUsIHRoaXMudG90YWxNZWV0aW5ncyk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBUaGUgcGFnaW5hdG9yIHJhbmdlIGxhYmVsIChlLmcuIFwiU2hvd2luZyAxLTUgb2YgMTJcIikgYnVpbHQgZnJvbSB0aGVcclxuICAgKiBgY29uc3RhbnRzLmpzb25gIHJhbmdlIHRlbXBsYXRlIHdpdGggdGhlIGN1cnJlbnQgc3RhcnQvZW5kL3RvdGFsIHZhbHVlcy5cclxuICAgKiBAcmV0dXJuIHtzdHJpbmd9IFRoZSBmb3JtYXR0ZWQgcmFuZ2UgbGFiZWwuXHJcbiAgICogQG1lbWJlcm9mIEV2ZW50R3JvdXBDYXJkQ29tcG9uZW50XHJcbiAgICovXHJcbiAgZ2V0IHJhbmdlTGFiZWwoKTogc3RyaW5nIHtcclxuICAgIGNvbnN0IHRlbXBsYXRlID1cclxuICAgICAgdGhpcy5jb25zdGFudHM/LmV2ZW50R3JvdXBDYXJkPy5wYWdpbmF0b3I/LnJhbmdlVGVtcGxhdGUgPz9cclxuICAgICAgJ1Nob3dpbmcge3N0YXJ0fS17ZW5kfSBvZiB7dG90YWx9JztcclxuICAgIHJldHVybiB0ZW1wbGF0ZVxyXG4gICAgICAucmVwbGFjZSgne3N0YXJ0fScsIGAke3RoaXMucmFuZ2VTdGFydH1gKVxyXG4gICAgICAucmVwbGFjZSgne2VuZH0nLCBgJHt0aGlzLnJhbmdlRW5kfWApXHJcbiAgICAgIC5yZXBsYWNlKCd7dG90YWx9JywgYCR7dGhpcy50b3RhbE1lZXRpbmdzfWApO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogVGhlIG1lZXRpbmctY291bnQgc3VtbWFyeSBzdWItbGluZSAoZS5nLiBcIjEyIG1lZXRpbmdzXCIpIGJ1aWx0IGZyb20gdGhlXHJcbiAgICogYGNvbnN0YW50cy5qc29uYCB0b3RhbCB0ZW1wbGF0ZSB3aXRoIHRoZSBldmVudCdzIG1lZXRpbmcgY291bnQuXHJcbiAgICogQHJldHVybiB7c3RyaW5nfSBUaGUgZm9ybWF0dGVkIG1lZXRpbmctY291bnQgc3VtbWFyeS5cclxuICAgKiBAbWVtYmVyb2YgRXZlbnRHcm91cENhcmRDb21wb25lbnRcclxuICAgKi9cclxuICBnZXQgbWVldGluZ0NvdW50U3VtbWFyeSgpOiBzdHJpbmcge1xyXG4gICAgY29uc3QgdGVtcGxhdGUgPVxyXG4gICAgICB0aGlzLmNvbnN0YW50cz8uZXZlbnRHcm91cENhcmQ/LnBhZ2luYXRvcj8udG90YWxUZW1wbGF0ZSA/P1xyXG4gICAgICAne3RvdGFsfSBtZWV0aW5ncyc7XHJcbiAgICByZXR1cm4gdGVtcGxhdGUucmVwbGFjZSgne3RvdGFsfScsIGAke3RoaXMuZXZlbnQ/Lm1lZXRpbmdDb3VudCA/PyAwfWApO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogVGhlIGhlYWRlciBzdWItbGluZTogdGhlIGdyb3VwIMK3IGxvY2F0aW9uIGxpbmUgZm9yIGEgU1RBTkRBTE9ORSBtZWV0aW5nLCBvclxyXG4gICAqIHRoZSBcIntufSBtZWV0aW5ncyBzY2hlZHVsZWQgYWNyb3NzIHRoZSBldmVudFwiIHN1bW1hcnkgZm9yIGFuIEVWRU5UIHdoZW4gaXRzXHJcbiAgICogbWVldGluZyBjb3VudCBpcyBrbm93biAoaGlkZGVuIHVudGlsIHRoZSBjb3VudCBpcyBsb2FkZWQgc28gaXQgbmV2ZXIgc2hvd3NcclxuICAgKiBcIjAgbWVldGluZ3NcIikuXHJcbiAgICogQHJldHVybiB7c3RyaW5nfSBUaGUgc3ViLWxpbmUgdGV4dCwgb3IgYW4gZW1wdHkgc3RyaW5nIHRvIGhpZGUgaXQuXHJcbiAgICogQG1lbWJlcm9mIEV2ZW50R3JvdXBDYXJkQ29tcG9uZW50XHJcbiAgICovXHJcbiAgZ2V0IHN1YnRpdGxlVGV4dCgpOiBzdHJpbmcge1xyXG4gICAgaWYgKHRoaXMuaXNTdGFuZGFsb25lKSB7XHJcbiAgICAgIGNvbnN0IGdyb3VwID0gdGhpcy5ldmVudD8uZ3JvdXBPckNvbW1pdHRlZSA/PyAnJztcclxuICAgICAgY29uc3QgbG9jYXRpb24gPSB0aGlzLmV2ZW50Py5yb29tT3JMb2NhdGlvbiA/PyAnJztcclxuICAgICAgaWYgKGdyb3VwICYmIGxvY2F0aW9uKSB7XHJcbiAgICAgICAgcmV0dXJuIGAke2dyb3VwfSBcXHUwMGI3ICR7bG9jYXRpb259YDtcclxuICAgICAgfVxyXG4gICAgICByZXR1cm4gZ3JvdXAgfHwgbG9jYXRpb247XHJcbiAgICB9XHJcbiAgICByZXR1cm4gKHRoaXMuZXZlbnQ/Lm1lZXRpbmdDb3VudCA/PyAwKSA+IDAgPyB0aGlzLm1lZXRpbmdDb3VudFN1bW1hcnkgOiAnJztcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFRoZSBtZWV0aW5nLWxpc3Qgc2hvdy9oaWRlIHRvZ2dsZSBsYWJlbC4gV2hlbiB0aGUgbGlzdCBpcyBoaWRkZW4gdGhlIGxhYmVsXHJcbiAgICogcmVhZHMgXCJTaG93IE1lZXRpbmdzICh7Y291bnR9IG9wZW4gZm9yIGF0dGVuZGFuY2UpXCIgYnVpbHQgZnJvbSB0aGVcclxuICAgKiBgY29uc3RhbnRzLmpzb25gIHRlbXBsYXRlcyBhbmQgdGhlIGV2ZW50J3Mgb3Blbi1mb3ItYXR0ZW5kYW5jZSBjb3VudDsgd2hlblxyXG4gICAqIHRoZSBsaXN0IGlzIHNob3duIHRoZSBsYWJlbCByZWFkcyB0aGUgY29uZmlndXJlZCBoaWRlIGxhYmVsIChSZXEgNi41KS5cclxuICAgKiBAcmV0dXJuIHtzdHJpbmd9IFRoZSB0b2dnbGUgYnV0dG9uIGxhYmVsLlxyXG4gICAqIEBtZW1iZXJvZiBFdmVudEdyb3VwQ2FyZENvbXBvbmVudFxyXG4gICAqL1xyXG4gIGdldCBtZWV0aW5nTGlzdFRvZ2dsZUxhYmVsKCk6IHN0cmluZyB7XHJcbiAgICBjb25zdCB0b2dnbGUgPSB0aGlzLmNvbnN0YW50cz8uZXZlbnRHcm91cENhcmQ/Lm1lZXRpbmdMaXN0VG9nZ2xlO1xyXG4gICAgaWYgKHRoaXMuaXNNZWV0aW5nTGlzdE9wZW4pIHtcclxuICAgICAgcmV0dXJuIHRvZ2dsZT8uaGlkZUxhYmVsID8/ICdIaWRlIG1lZXRpbmdzJztcclxuICAgIH1cclxuICAgIHJldHVybiB0b2dnbGU/LnNob3dMYWJlbCA/PyAnU2hvdyBtZWV0aW5ncyc7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBUaGUgXCJ7Y291bnR9IE1lZXRpbmdzIG9wZW4gZm9yIGF0dGVuZGFuY2VcIiBzdW1tYXJ5IHNob3duIGluIHRoZSBldmVudCdzXHJcbiAgICogbWVldGluZ3MgYmFyLCBidWlsdCBmcm9tIHRoZSBgY29uc3RhbnRzLmpzb25gIHRlbXBsYXRlIGFuZCB0aGUgZXZlbnQnc1xyXG4gICAqIG9wZW4tZm9yLWF0dGVuZGFuY2UgY291bnQgKFJlcSA2LjUpLlxyXG4gICAqIEByZXR1cm4ge3N0cmluZ30gVGhlIGZvcm1hdHRlZCBvcGVuLWZvci1hdHRlbmRhbmNlIHN1bW1hcnkuXHJcbiAgICogQG1lbWJlcm9mIEV2ZW50R3JvdXBDYXJkQ29tcG9uZW50XHJcbiAgICovXHJcbiAgZ2V0IG9wZW5Gb3JBdHRlbmRhbmNlU3VtbWFyeSgpOiBzdHJpbmcge1xyXG4gICAgY29uc3QgdGVtcGxhdGUgPVxyXG4gICAgICB0aGlzLmNvbnN0YW50cz8uZXZlbnRHcm91cENhcmQ/Lm9wZW5Gb3JBdHRlbmRhbmNlVGVtcGxhdGUgPz9cclxuICAgICAgJ3tjb3VudH0gTWVldGluZ3Mgb3BlbiBmb3IgYXR0ZW5kYW5jZSc7XHJcbiAgICByZXR1cm4gdGVtcGxhdGUucmVwbGFjZShcclxuICAgICAgJ3tjb3VudH0nLFxyXG4gICAgICBgJHt0aGlzLmV2ZW50Py5vcGVuRm9yQXR0ZW5kYW5jZUNvdW50ID8/IDB9YFxyXG4gICAgKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFRoZSB7QGxpbmsgTWVldGluZ1Jvd30gdmlldyBtb2RlbCBmb3IgYSBTVEFOREFMT05FX01FRVRJTkcgY2FyZCwgcHJvamVjdGVkXHJcbiAgICogZnJvbSB0aGUgZXZlbnQgZW50cnkgc28gdGhlIHNoYXJlZCB7QGxpbmsgTWVldGluZ0F0dGVuZGFuY2VSb3dDb21wb25lbnR9XHJcbiAgICogcmVuZGVycyBpdHMgdGltZS90aW1lem9uZSBibG9jayBhbmQgYXR0ZW5kYW5jZSBhY3Rpb24uXHJcbiAgICogQHJldHVybiB7TWVldGluZ1Jvd30gVGhlIHN0YW5kYWxvbmUgbWVldGluZyByb3cuXHJcbiAgICogQG1lbWJlcm9mIEV2ZW50R3JvdXBDYXJkQ29tcG9uZW50XHJcbiAgICovXHJcbiAgZ2V0IHN0YW5kYWxvbmVNZWV0aW5nKCk6IE1lZXRpbmdSb3cge1xyXG4gICAgcmV0dXJuIHtcclxuICAgICAgbWVldGluZ0lkOiB0aGlzLmV2ZW50Py5ldmVudElkID8/ICcnLFxyXG4gICAgICBtZWV0aW5nTmFtZTogdGhpcy5ldmVudD8udGl0bGUgPz8gJycsXHJcbiAgICAgIGdyb3VwT3JDb21taXR0ZWU6IHRoaXMuZXZlbnQ/Lmdyb3VwT3JDb21taXR0ZWUsXHJcbiAgICAgIHJvb21PckxvY2F0aW9uOiB0aGlzLmV2ZW50Py5yb29tT3JMb2NhdGlvbixcclxuICAgICAgc3RhcnREYXRlVGltZTogdGhpcy5ldmVudD8uc3RhcnREYXRlVGltZSA/PyB0aGlzLmV2ZW50Py5zdGFydERhdGUsXHJcbiAgICAgIGVuZERhdGVUaW1lOiB0aGlzLmV2ZW50Py5lbmREYXRlVGltZSA/PyB0aGlzLmV2ZW50Py5lbmREYXRlLFxyXG4gICAgICB0aW1lem9uZTogdGhpcy5ldmVudD8udGltZXpvbmUgPz8gJycsXHJcbiAgICAgIHN0YXR1czogdGhpcy5ldmVudD8uc3RhdHVzLFxyXG4gICAgICBpc01lbWJlck9mR3JvdXA6IHRoaXMuZXZlbnQ/LmlzTWVtYmVyT2ZHcm91cCxcclxuICAgIH07XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBUaGUgZm9ybWF0dGVkIFwic3RhcnQg4oCTIGVuZCB0aW1lICh0aW1lem9uZSlcIiBzdHJpbmcgZm9yIGEgU1RBTkRBTE9ORSBtZWV0aW5nLFxyXG4gICAqIG1pcnJvcmluZyB0aGUgaW5uZXIgbWVldGluZyByb3cncyBUSU1FICYgVElNRVpPTkUgdmFsdWUuXHJcbiAgICogQHJldHVybiB7c3RyaW5nfSBUaGUgZm9ybWF0dGVkIHRpbWUgKyB0aW1lem9uZS5cclxuICAgKiBAbWVtYmVyb2YgRXZlbnRHcm91cENhcmRDb21wb25lbnRcclxuICAgKi9cclxuICBnZXQgc3RhbmRhbG9uZVRpbWUoKTogc3RyaW5nIHtcclxuICAgIGNvbnN0IHRpbWV6b25lID0gdGhpcy5ldmVudD8udGltZXpvbmUgPz8gJyc7XHJcbiAgICBjb25zdCBzdGFydCA9IGZvcm1hdEVwb2NoKFxyXG4gICAgICB0aGlzLmV2ZW50Py5zdGFydERhdGVUaW1lID8/IHRoaXMuZXZlbnQ/LnN0YXJ0RGF0ZSxcclxuICAgICAgRGF0ZUZvcm1hdHMudGltZU1lcmlkaWVtRm9ybWF0LFxyXG4gICAgICB0aW1lem9uZVxyXG4gICAgKTtcclxuICAgIGNvbnN0IGVuZCA9IGZvcm1hdEVwb2NoKFxyXG4gICAgICB0aGlzLmV2ZW50Py5lbmREYXRlVGltZSA/PyB0aGlzLmV2ZW50Py5lbmREYXRlLFxyXG4gICAgICBEYXRlRm9ybWF0cy50aW1lTWVyaWRpZW1Gb3JtYXQsXHJcbiAgICAgIHRpbWV6b25lXHJcbiAgICApO1xyXG4gICAgY29uc3QgcmFuZ2UgPSBlbmQgPyBgJHtzdGFydH0gXFx1MjAxMyAke2VuZH1gIDogc3RhcnQ7XHJcbiAgICBpZiAoIXJhbmdlKSB7XHJcbiAgICAgIHJldHVybiAnJztcclxuICAgIH1cclxuICAgIHJldHVybiB0aW1lem9uZSA/IGAke3JhbmdlfSAke3RpbWV6b25lfWAgOiByYW5nZTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFdoZXRoZXIgdGhlIFNUQU5EQUxPTkUgbWVldGluZyBpcyBjdXJyZW50bHkgYmVpbmcgYXR0ZW5kZWQgKGRyaXZlcyB0aGUgcGlsbFxyXG4gICAqIGFuZCB0aGUgbGVhdmUgYWN0aW9uKS5cclxuICAgKiBAcmV0dXJuIHtib29sZWFufSBUcnVlIHdoZW4gdGhlIHN0YW5kYWxvbmUgbWVldGluZyBpcyBjdXJyZW50bHkgYXR0ZW5kaW5nLlxyXG4gICAqIEBtZW1iZXJvZiBFdmVudEdyb3VwQ2FyZENvbXBvbmVudFxyXG4gICAqL1xyXG4gIGdldCBpc1N0YW5kYWxvbmVBdHRlbmRpbmcoKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gKFxyXG4gICAgICB0aGlzLnJlc29sdmVBdHRlbmRhbmNlU3RhdGUodGhpcy5zdGFuZGFsb25lTWVldGluZykgPT09XHJcbiAgICAgIEF0dGVuZGFuY2VTdGF0ZS5DVVJSRU5UTFlfQVRURU5ESU5HXHJcbiAgICApO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogV2hldGhlciB0aGUgU1RBTkRBTE9ORSBtZWV0aW5nJ3MgTG9nIEF0dGVuZGFuY2UgYnV0dG9uIGlzIHNob3duIChub3RcclxuICAgKiBhdHRlbmRpbmcgYW5kIHRoZSBob3N0IGdyYW50cyB0aGUgcGVybWlzc2lvbikuXHJcbiAgICogQHJldHVybiB7Ym9vbGVhbn0gVHJ1ZSB3aGVuIHRoZSBsb2ctYXR0ZW5kYW5jZSBidXR0b24gaXMgdmlzaWJsZS5cclxuICAgKiBAbWVtYmVyb2YgRXZlbnRHcm91cENhcmRDb21wb25lbnRcclxuICAgKi9cclxuICBnZXQgc2hvd1N0YW5kYWxvbmVMb2coKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gIXRoaXMuaXNTdGFuZGFsb25lQXR0ZW5kaW5nICYmICEhdGhpcy5wZXJtaXNzaW9ucz8uY2FuTG9nQXR0ZW5kYW5jZTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFdoZXRoZXIgdGhlIFNUQU5EQUxPTkUgbWVldGluZydzIExlYXZlIE1lZXRpbmcgYnV0dG9uIGlzIHNob3duIChhdHRlbmRpbmdcclxuICAgKiBhbmQgdGhlIGhvc3QgZ3JhbnRzIHRoZSBwZXJtaXNzaW9uKS5cclxuICAgKiBAcmV0dXJuIHtib29sZWFufSBUcnVlIHdoZW4gdGhlIGxlYXZlLW1lZXRpbmcgYnV0dG9uIGlzIHZpc2libGUuXHJcbiAgICogQG1lbWJlcm9mIEV2ZW50R3JvdXBDYXJkQ29tcG9uZW50XHJcbiAgICovXHJcbiAgZ2V0IHNob3dTdGFuZGFsb25lTGVhdmUoKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5pc1N0YW5kYWxvbmVBdHRlbmRpbmcgJiYgISF0aGlzLnBlcm1pc3Npb25zPy5jYW5MZWF2ZU1lZXRpbmc7XHJcbiAgfVxyXG5cclxuICAvKiogVGhlIGx1eG9uLWZvcm1hdHRlZCBzdGFydCBkYXRlIG9mIHRoZSBldmVudCAoSVNPIG9yIGVwb2NoIG1zKSAoUmVxIDYuMikuICovXHJcbiAgZ2V0IGZvcm1hdHRlZFN0YXJ0RGF0ZSgpOiBzdHJpbmcge1xyXG4gICAgcmV0dXJuIHRoaXMuZm9ybWF0RGF0ZShcclxuICAgICAgdGhpcy5ldmVudD8uc3RhcnREYXRlVGltZSA/PyB0aGlzLmV2ZW50Py5zdGFydERhdGVcclxuICAgICk7XHJcbiAgfVxyXG5cclxuICAvKiogVGhlIGx1eG9uLWZvcm1hdHRlZCBlbmQgZGF0ZSBvZiB0aGUgZXZlbnQgKElTTyBvciBlcG9jaCBtcykgKFJlcSA2LjIpLiAqL1xyXG4gIGdldCBmb3JtYXR0ZWRFbmREYXRlKCk6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gdGhpcy5mb3JtYXREYXRlKHRoaXMuZXZlbnQ/LmVuZERhdGVUaW1lID8/IHRoaXMuZXZlbnQ/LmVuZERhdGUpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogYHRyYWNrQnlgIGZvciB0aGUgbWVldGluZy1yb3cgYCpuZ0ZvcmAsIGtleWVkIGJ5IHRoZSBzdGFibGUgbWVldGluZyBpZCBzb1xyXG4gICAqIEFuZ3VsYXIgcmV1c2VzIHJvdyBjb21wb25lbnRzIGFjcm9zcyBwYWdpbmF0aW9uL3N0YXRlIGNoYW5nZXMgKFJlcSA2LjcsIDE0LjQpLlxyXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBfaW5kZXggLSBUaGUgaXRlcmF0aW9uIGluZGV4ICh1bnVzZWQpLlxyXG4gICAqIEBwYXJhbSB7TWVldGluZ1Jvd30gbWVldGluZyAtIFRoZSBtZWV0aW5nIGZvciB0aGlzIHJvdy5cclxuICAgKiBAcmV0dXJuIHtzdHJpbmd9IFRoZSBzdGFibGUgdHJhY2sga2V5IChtZWV0aW5nIGlkKS5cclxuICAgKiBAbWVtYmVyb2YgRXZlbnRHcm91cENhcmRDb21wb25lbnRcclxuICAgKi9cclxuICB0cmFja0J5TWVldGluZ0lkKF9pbmRleDogbnVtYmVyLCBtZWV0aW5nOiBNZWV0aW5nUm93KTogc3RyaW5nIHtcclxuICAgIHJldHVybiBtZWV0aW5nPy5tZWV0aW5nSWQgPz8gYCR7X2luZGV4fWA7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBSZXNvbHZlcyB0aGUgYXR0ZW5kYW5jZSBzdGF0ZSBmb3IgYSBtZWV0aW5nIGZyb20gdGhlIGBhdHRlbmRhbmNlU3RhdGVzYCBtYXAsXHJcbiAgICogZGVmYXVsdGluZyB0byBgTk9UX0FUVEVORElOR2Agd2hlbiB0aGUgbWFwIGhhcyBubyBlbnRyeSBmb3IgaXQuXHJcbiAgICogQHBhcmFtIHtNZWV0aW5nUm93fSBtZWV0aW5nIC0gVGhlIG1lZXRpbmcgdG8gcmVzb2x2ZSBzdGF0ZSBmb3IuXHJcbiAgICogQHJldHVybiB7QXR0ZW5kYW5jZVN0YXRlfSBUaGUgYXR0ZW5kYW5jZSBzdGF0ZSBwYXNzZWQgdG8gdGhlIHJvdy5cclxuICAgKiBAbWVtYmVyb2YgRXZlbnRHcm91cENhcmRDb21wb25lbnRcclxuICAgKi9cclxuICByZXNvbHZlQXR0ZW5kYW5jZVN0YXRlKG1lZXRpbmc6IE1lZXRpbmdSb3cpOiBBdHRlbmRhbmNlU3RhdGUge1xyXG4gICAgcmV0dXJuIChcclxuICAgICAgdGhpcy5hdHRlbmRhbmNlU3RhdGVzPy5bbWVldGluZz8ubWVldGluZ0lkXSA/P1xyXG4gICAgICBBdHRlbmRhbmNlU3RhdGUuTk9UX0FUVEVORElOR1xyXG4gICAgKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFJlc29sdmVzIHdoZXRoZXIgYSBtZWV0aW5nIGhhcyBhbiBhdHRlbmRhbmNlIGFjdGlvbiBpbiBmbGlnaHQgZnJvbSB0aGVcclxuICAgKiBgaW5GbGlnaHRNZWV0aW5nSWRzYCBzZXQuXHJcbiAgICogQHBhcmFtIHtNZWV0aW5nUm93fSBtZWV0aW5nIC0gVGhlIG1lZXRpbmcgdG8gY2hlY2suXHJcbiAgICogQHJldHVybiB7Ym9vbGVhbn0gVHJ1ZSB3aGVuIHRoZSBtZWV0aW5nJ3MgYWN0aW9uIGlzIGF3YWl0aW5nIHJlc29sdXRpb24uXHJcbiAgICogQG1lbWJlcm9mIEV2ZW50R3JvdXBDYXJkQ29tcG9uZW50XHJcbiAgICovXHJcbiAgcmVzb2x2ZUlzSW5GbGlnaHQobWVldGluZzogTWVldGluZ1Jvdyk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMuaW5GbGlnaHRNZWV0aW5nSWRzPy5oYXMobWVldGluZz8ubWVldGluZ0lkKSA/PyBmYWxzZTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFRvZ2dsZXMgdGhlIG1lZXRpbmctbGlzdCB2aXNpYmlsaXR5LCBsYXppbHkgcmVxdWVzdGluZyB0aGUgZmlyc3QgcGFnZSBvZiB0aGVcclxuICAgKiBldmVudCdzIGNoaWxkIG1lZXRpbmdzIGZyb20gdGhlIGNvbnRhaW5lciB0aGUgZmlyc3QgdGltZSBpdCBpcyBvcGVuZWQgKFJlcSA2LjYpLlxyXG4gICAqIEBtZW1iZXJvZiBFdmVudEdyb3VwQ2FyZENvbXBvbmVudFxyXG4gICAqL1xyXG4gIG9uVG9nZ2xlTWVldGluZ0xpc3QoKTogdm9pZCB7XHJcbiAgICB0aGlzLmlzTWVldGluZ0xpc3RPcGVuID0gIXRoaXMuaXNNZWV0aW5nTGlzdE9wZW47XHJcbiAgICBpZiAodGhpcy5pc01lZXRpbmdMaXN0T3Blbikge1xyXG4gICAgICB0aGlzLmxvYWRNZWV0aW5ncy5lbWl0KHRoaXMucGFnZUluZGV4ICsgMSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBIYW5kbGVzIHRoZSBcIlZpZXcgRXZlbnRcIiBidXR0b24sIGVtaXR0aW5nIHRoZSBldmVudCBpZCB0byB0aGUgaG9zdCAoUmVxIDYuNCkuXHJcbiAgICogQG1lbWJlcm9mIEV2ZW50R3JvdXBDYXJkQ29tcG9uZW50XHJcbiAgICovXHJcbiAgb25WaWV3RXZlbnQoKTogdm9pZCB7XHJcbiAgICB0aGlzLnZpZXdFdmVudC5lbWl0KHRoaXMuZXZlbnQ/LmV2ZW50SWQpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQnViYmxlcyBhIHJvdydzIG1lZXRpbmctbmFtZSBsaW5rIGFjdGl2YXRpb24gdXB3YXJkIChSZXEgNi43LCA3LjQpLlxyXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBtZWV0aW5nSWQgLSBUaGUgaWQgZW1pdHRlZCBieSB0aGUgcm93LlxyXG4gICAqIEBtZW1iZXJvZiBFdmVudEdyb3VwQ2FyZENvbXBvbmVudFxyXG4gICAqL1xyXG4gIG9uT3Blbk1lZXRpbmcobWVldGluZ0lkOiBzdHJpbmcpOiB2b2lkIHtcclxuICAgIHRoaXMub3Blbk1lZXRpbmcuZW1pdChtZWV0aW5nSWQpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQnViYmxlcyBhIHJvdydzIGxvZy1hdHRlbmRhbmNlIHJlcXVlc3QgdXB3YXJkIChSZXEgNi43LCA3LjcpLlxyXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBtZWV0aW5nSWQgLSBUaGUgaWQgZW1pdHRlZCBieSB0aGUgcm93LlxyXG4gICAqIEBtZW1iZXJvZiBFdmVudEdyb3VwQ2FyZENvbXBvbmVudFxyXG4gICAqL1xyXG4gIG9uTG9nQXR0ZW5kYW5jZShtZWV0aW5nSWQ6IHN0cmluZyk6IHZvaWQge1xyXG4gICAgdGhpcy5sb2dBdHRlbmRhbmNlLmVtaXQobWVldGluZ0lkKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEJ1YmJsZXMgYSByb3cncyBsZWF2ZS1tZWV0aW5nIHJlcXVlc3QgdXB3YXJkIChSZXEgNi43LCA3LjgpLlxyXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBtZWV0aW5nSWQgLSBUaGUgaWQgZW1pdHRlZCBieSB0aGUgcm93LlxyXG4gICAqIEBtZW1iZXJvZiBFdmVudEdyb3VwQ2FyZENvbXBvbmVudFxyXG4gICAqL1xyXG4gIG9uTGVhdmVNZWV0aW5nKG1lZXRpbmdJZDogc3RyaW5nKTogdm9pZCB7XHJcbiAgICB0aGlzLmxlYXZlTWVldGluZy5lbWl0KG1lZXRpbmdJZCk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBIYW5kbGVzIHRoZSBwZXItY2FyZCBwYWdpbmF0b3IgY2hhbmdlLCB1cGRhdGluZyB0aGUgbG9jYWwgcGFnZSBzdGF0ZSBhbmRcclxuICAgKiBlbWl0dGluZyB0aGUgcmVxdWVzdGVkIHBhZ2UgYXMgYSB7QGxpbmsgUGFnZUNoYW5nZX0gKFJlcSA2LjksIDMuMykuXHJcbiAgICogQHBhcmFtIHtQYWdlRXZlbnR9IGV2ZW50IC0gVGhlIE1hdGVyaWFsIHBhZ2luYXRvciBwYWdlIGV2ZW50LlxyXG4gICAqIEBtZW1iZXJvZiBFdmVudEdyb3VwQ2FyZENvbXBvbmVudFxyXG4gICAqL1xyXG4gIG9uUGFnZUNoYW5nZShldmVudDogUGFnZUV2ZW50KTogdm9pZCB7XHJcbiAgICB0aGlzLnBhZ2VJbmRleCA9IGV2ZW50LnBhZ2VJbmRleDtcclxuICAgIHRoaXMucGFnZVNpemUgPSBldmVudC5wYWdlU2l6ZTtcclxuICAgIHRoaXMucGFnZUNoYW5nZS5lbWl0KHtcclxuICAgICAgcGFnZUluZGV4OiBldmVudC5wYWdlSW5kZXgsXHJcbiAgICAgIHBhZ2VTaXplOiBldmVudC5wYWdlU2l6ZSxcclxuICAgIH0pO1xyXG4gICAgLy8gUmVxdWVzdCB0aGUgbmV3bHkgc2VsZWN0ZWQgcGFnZSdzIGNoaWxkIG1lZXRpbmdzIGZyb20gdGhlIGNvbnRhaW5lci5cclxuICAgIHRoaXMubG9hZE1lZXRpbmdzLmVtaXQoZXZlbnQucGFnZUluZGV4ICsgMSk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBGb3JtYXRzIGEgZGF0ZSBmb3IgZGlzcGxheSwgcHJlZmVycmluZyB0aGUgZXBvY2gtbWlsbGlzZWNvbmRzIHZhbHVlIChmcm9tXHJcbiAgICogdGhlIHJlYWwgQVBJKSBmb3JtYXR0ZWQgaW4gdGhlIGV2ZW50J3MgdGltZXpvbmUgYW5kIGZhbGxpbmcgYmFjayB0byBhIGxlZ2FjeVxyXG4gICAqIElTTyBzdHJpbmcuIFJldHVybnMgYW4gZW1wdHkgc3RyaW5nIHdoZW4gbmVpdGhlciBpcyBwcmVzZW50LlxyXG4gICAqIEBwYXJhbSB7bnVtYmVyIHwgdW5kZWZpbmVkfSBlcG9jaE1zIC0gVGhlIGVwb2NoLW1pbGxpc2Vjb25kcyB2YWx1ZS5cclxuICAgKiBAcGFyYW0ge3N0cmluZyB8IHVuZGVmaW5lZH0gaXNvVmFsdWUgLSBUaGUgbGVnYWN5IElTTyBmYWxsYmFjay5cclxuICAgKiBAcmV0dXJuIHtzdHJpbmd9IFRoZSBmb3JtYXR0ZWQgZGF0ZSBvciBhbiBlbXB0eSBzdHJpbmcuXHJcbiAgICogQG1lbWJlcm9mIEV2ZW50R3JvdXBDYXJkQ29tcG9uZW50XHJcbiAgICovXHJcbiAgcHJpdmF0ZSBmb3JtYXREYXRlKHZhbHVlOiBzdHJpbmcgfCBudW1iZXIgfCB1bmRlZmluZWQgfCBudWxsKTogc3RyaW5nIHtcclxuICAgIHJldHVybiBmb3JtYXRFcG9jaCh2YWx1ZSwgRGF0ZUZvcm1hdHMuZGlzcGxheUZvcm1hdCwgdGhpcy5ldmVudD8udGltZXpvbmUpO1xyXG4gIH1cclxufVxyXG4iLCI8YXJ0aWNsZVxyXG4gIGNsYXNzPVwiaWVlZXNhLWV2ZW50LWdyb3VwLWNhcmRcIlxyXG4gIFtjbGFzcy5pZWVlc2EtZXZlbnQtZ3JvdXAtY2FyZC0tbW9iaWxlXT1cImlzTW9iaWxlVmlld1wiXHJcbiAgW2NsYXNzLmllZWVzYS1ldmVudC1ncm91cC1jYXJkLS1zdGFuZGFsb25lXT1cImlzU3RhbmRhbG9uZVwiXHJcbj5cclxuICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT0gRVZFTlQgPT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT5cclxuICA8bmctY29udGFpbmVyICpuZ0lmPVwiIWlzU3RhbmRhbG9uZVwiPlxyXG4gICAgPGhlYWRlciBjbGFzcz1cImllZWVzYS1ldmVudC1ncm91cC1jYXJkX19oZWFkZXJcIj5cclxuICAgICAgPGRpdiBjbGFzcz1cImllZWVzYS1ldmVudC1ncm91cC1jYXJkX19oZWFkZXItbWFpblwiPlxyXG4gICAgICAgIDwhLS0gRVZFTlQgYmFkZ2UgKyBkYXkgaW5kaWNhdG9yLiAtLT5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiaWVlZXNhLWV2ZW50LWdyb3VwLWNhcmRfX2JhZGdlLXJvd1wiPlxyXG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJpZWVlc2EtZXZlbnQtZ3JvdXAtY2FyZF9fYmFkZ2VcIj5cclxuICAgICAgICAgICAge3sgY29uc3RhbnRzLmV2ZW50R3JvdXBDYXJkLmV2ZW50QmFkZ2UgfX1cclxuICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgIDxzcGFuXHJcbiAgICAgICAgICAgICpuZ0lmPVwiZXZlbnQuZGF5SW5kaWNhdG9yXCJcclxuICAgICAgICAgICAgY2xhc3M9XCJpZWVlc2EtZXZlbnQtZ3JvdXAtY2FyZF9fZGF5LWluZGljYXRvclwiXHJcbiAgICAgICAgICA+XHJcbiAgICAgICAgICAgIHt7IGV2ZW50LmRheUluZGljYXRvciB9fVxyXG4gICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiaWVlZXNhLWV2ZW50LWdyb3VwLWNhcmRfX3RpdGxlLXJvd1wiPlxyXG4gICAgICAgICAgPGgzIGNsYXNzPVwiaWVlZXNhLWV2ZW50LWdyb3VwLWNhcmRfX3RpdGxlXCI+e3sgZXZlbnQudGl0bGUgfX08L2gzPlxyXG4gICAgICAgICAgPHNwYW5cclxuICAgICAgICAgICAgKm5nSWY9XCJldmVudC5zdGF0dXNcIlxyXG4gICAgICAgICAgICBjbGFzcz1cImllZWVzYS1ldmVudC1ncm91cC1jYXJkX19zdGF0dXMtcGlsbFwiXHJcbiAgICAgICAgICAgIFtuZ0NsYXNzXT1cIidpZWVlc2EtZXZlbnQtZ3JvdXAtY2FyZF9fc3RhdHVzLXBpbGwtLScgKyBzdGF0dXNNb2RpZmllclwiXHJcbiAgICAgICAgICA+XHJcbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiaWVlZXNhLWV2ZW50LWdyb3VwLWNhcmRfX3N0YXR1cy1kb3RcIiBhcmlhLWhpZGRlbj1cInRydWVcIj48L3NwYW4+XHJcbiAgICAgICAgICAgIHt7IGV2ZW50LnN0YXR1cyB9fVxyXG4gICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICA8cFxyXG4gICAgICAgICAgKm5nSWY9XCJzdWJ0aXRsZVRleHRcIlxyXG4gICAgICAgICAgY2xhc3M9XCJpZWVlc2EtZXZlbnQtZ3JvdXAtY2FyZF9fc3VidGl0bGVcIlxyXG4gICAgICAgID5cclxuICAgICAgICAgIHt7IHN1YnRpdGxlVGV4dCB9fVxyXG4gICAgICAgIDwvcD5cclxuICAgICAgPC9kaXY+XHJcblxyXG4gICAgICA8ZGl2IGNsYXNzPVwiaWVlZXNhLWV2ZW50LWdyb3VwLWNhcmRfX2hlYWRlci1zaWRlXCI+XHJcbiAgICAgICAgPGRsIGNsYXNzPVwiaWVlZXNhLWV2ZW50LWdyb3VwLWNhcmRfX2RhdGVzLWJsb2NrXCI+XHJcbiAgICAgICAgICA8ZHQgY2xhc3M9XCJpZWVlc2EtZXZlbnQtZ3JvdXAtY2FyZF9fZGF0ZXMtbGFiZWxcIj5cclxuICAgICAgICAgICAge3sgY29uc3RhbnRzLmV2ZW50R3JvdXBDYXJkLmV2ZW50RGF0ZXNMYWJlbCB9fVxyXG4gICAgICAgICAgPC9kdD5cclxuICAgICAgICAgIDxkZCBjbGFzcz1cImllZWVzYS1ldmVudC1ncm91cC1jYXJkX19kYXRlcy12YWx1ZVwiPlxyXG4gICAgICAgICAgICB7eyBmb3JtYXR0ZWRTdGFydERhdGUgfX08bmctY29udGFpbmVyICpuZ0lmPVwiZm9ybWF0dGVkRW5kRGF0ZSAmJiBmb3JtYXR0ZWRFbmREYXRlICE9PSBmb3JtYXR0ZWRTdGFydERhdGVcIj5cclxuICAgICAgICAgICAgICAmbmRhc2g7IHt7IGZvcm1hdHRlZEVuZERhdGUgfX08L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgIDwvZGQ+XHJcbiAgICAgICAgICA8ZGRcclxuICAgICAgICAgICAgKm5nSWY9XCJldmVudC50aW1lem9uZVwiXHJcbiAgICAgICAgICAgIGNsYXNzPVwiaWVlZXNhLWV2ZW50LWdyb3VwLWNhcmRfX3RpbWV6b25lLXZhbHVlXCJcclxuICAgICAgICAgID5cclxuICAgICAgICAgICAge3sgZXZlbnQudGltZXpvbmUgfX1cclxuICAgICAgICAgIDwvZGQ+XHJcbiAgICAgICAgPC9kbD5cclxuXHJcbiAgICAgICAgPGJ1dHRvblxyXG4gICAgICAgICAgdHlwZT1cImJ1dHRvblwiXHJcbiAgICAgICAgICBjbGFzcz1cImllZWVzYS1ldmVudC1ncm91cC1jYXJkX192aWV3XCJcclxuICAgICAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwiY29uc3RhbnRzLmV2ZW50R3JvdXBDYXJkLmFyaWFMYWJlbC52aWV3RXZlbnRcIlxyXG4gICAgICAgICAgKGNsaWNrKT1cIm9uVmlld0V2ZW50KClcIlxyXG4gICAgICAgID5cclxuICAgICAgICAgIHt7IGNvbnN0YW50cy5ldmVudEdyb3VwQ2FyZC52aWV3RXZlbnRMYWJlbCB9fVxyXG4gICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICA8L2Rpdj5cclxuICAgIDwvaGVhZGVyPlxyXG5cclxuICAgIDwhLS0gTWVldGluZ3MgbGFiZWwgcm93ICsgU2hvdy9IaWRlIHRvZ2dsZS4gLS0+XHJcbiAgICA8ZGl2IGNsYXNzPVwiaWVlZXNhLWV2ZW50LWdyb3VwLWNhcmRfX21lZXRpbmdzLWJhclwiPlxyXG4gICAgICA8c3BhbiBjbGFzcz1cImllZWVzYS1ldmVudC1ncm91cC1jYXJkX19tZWV0aW5ncy1vcGVuXCI+XHJcbiAgICAgICAgPHNwYW4gY2xhc3M9XCJpZWVlc2EtZXZlbnQtZ3JvdXAtY2FyZF9fbWVldGluZ3MtZG90XCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+PC9zcGFuPlxyXG4gICAgICAgIHt7IG9wZW5Gb3JBdHRlbmRhbmNlU3VtbWFyeSB9fVxyXG4gICAgICA8L3NwYW4+XHJcblxyXG4gICAgICA8YnV0dG9uXHJcbiAgICAgICAgdHlwZT1cImJ1dHRvblwiXHJcbiAgICAgICAgY2xhc3M9XCJpZWVlc2EtZXZlbnQtZ3JvdXAtY2FyZF9fbWVldGluZy10b2dnbGVcIlxyXG4gICAgICAgIFthdHRyLmFyaWEtZXhwYW5kZWRdPVwiaXNNZWV0aW5nTGlzdE9wZW5cIlxyXG4gICAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwiY29uc3RhbnRzLmV2ZW50R3JvdXBDYXJkLmFyaWFMYWJlbC5tZWV0aW5nTGlzdFRvZ2dsZVwiXHJcbiAgICAgICAgKGNsaWNrKT1cIm9uVG9nZ2xlTWVldGluZ0xpc3QoKVwiXHJcbiAgICAgID5cclxuICAgICAgICA8c3Bhbj57eyBtZWV0aW5nTGlzdFRvZ2dsZUxhYmVsIH19PC9zcGFuPlxyXG4gICAgICAgIDxpXHJcbiAgICAgICAgICBjbGFzcz1cImZhLXNvbGlkXCJcclxuICAgICAgICAgIFtuZ0NsYXNzXT1cImlzTWVldGluZ0xpc3RPcGVuID8gJ2ZhLWNoZXZyb24tdXAnIDogJ2ZhLWNoZXZyb24tZG93bidcIlxyXG4gICAgICAgICAgYXJpYS1oaWRkZW49XCJ0cnVlXCJcclxuICAgICAgICA+PC9pPlxyXG4gICAgICA8L2J1dHRvbj5cclxuICAgIDwvZGl2PlxyXG5cclxuICAgIDwhLS0gRXhwYW5kZWQgaW5uZXIgbWVldGluZyBsaXN0ICsgcGVyLWV2ZW50IHBhZ2luYXRvci4gLS0+XHJcbiAgICA8ZGl2XHJcbiAgICAgICpuZ0lmPVwiaXNNZWV0aW5nTGlzdE9wZW5cIlxyXG4gICAgICBjbGFzcz1cImllZWVzYS1ldmVudC1ncm91cC1jYXJkX19tZWV0aW5nc1wiXHJcbiAgICA+XHJcbiAgICAgIDxpZWVlc2EtbWVldGluZy1hdHRlbmRhbmNlLXJvd1xyXG4gICAgICAgICpuZ0Zvcj1cImxldCBtZWV0aW5nIG9mIHBhZ2VkTWVldGluZ3M7IHRyYWNrQnk6IHRyYWNrQnlNZWV0aW5nSWRcIlxyXG4gICAgICAgIFttZWV0aW5nXT1cIm1lZXRpbmdcIlxyXG4gICAgICAgIFthdHRlbmRhbmNlU3RhdGVdPVwicmVzb2x2ZUF0dGVuZGFuY2VTdGF0ZShtZWV0aW5nKVwiXHJcbiAgICAgICAgW2lzSW5GbGlnaHRdPVwicmVzb2x2ZUlzSW5GbGlnaHQobWVldGluZylcIlxyXG4gICAgICAgIFtwZXJtaXNzaW9uc109XCJwZXJtaXNzaW9uc1wiXHJcbiAgICAgICAgKG9wZW5NZWV0aW5nKT1cIm9uT3Blbk1lZXRpbmcoJGV2ZW50KVwiXHJcbiAgICAgICAgKGxvZ0F0dGVuZGFuY2UpPVwib25Mb2dBdHRlbmRhbmNlKCRldmVudClcIlxyXG4gICAgICAgIChsZWF2ZU1lZXRpbmcpPVwib25MZWF2ZU1lZXRpbmcoJGV2ZW50KVwiXHJcbiAgICAgID48L2llZWVzYS1tZWV0aW5nLWF0dGVuZGFuY2Utcm93PlxyXG5cclxuICAgICAgPGRpdlxyXG4gICAgICAgIGNsYXNzPVwiaWVlZXNhLWV2ZW50LWdyb3VwLWNhcmRfX3BhZ2luYXRvclwiXHJcbiAgICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCJjb25zdGFudHMuZXZlbnRHcm91cENhcmQuYXJpYUxhYmVsLm1lZXRpbmdMaXN0VG9nZ2xlXCJcclxuICAgICAgPlxyXG4gICAgICAgIDxzcGFuIGNsYXNzPVwiaWVlZXNhLWV2ZW50LWdyb3VwLWNhcmRfX3BhZ2luYXRvci1yYW5nZVwiPlxyXG4gICAgICAgICAge3sgcmFuZ2VMYWJlbCB9fVxyXG4gICAgICAgIDwvc3Bhbj5cclxuXHJcbiAgICAgICAgPG1hdC1wYWdpbmF0b3JcclxuICAgICAgICAgIGNsYXNzPVwiaWVlZXNhLWV2ZW50LWdyb3VwLWNhcmRfX3BhZ2luYXRvci1jb250cm9sXCJcclxuICAgICAgICAgIFtwYWdlSW5kZXhdPVwicGFnZUluZGV4XCJcclxuICAgICAgICAgIFtwYWdlU2l6ZV09XCJwYWdlU2l6ZVwiXHJcbiAgICAgICAgICBbbGVuZ3RoXT1cInRvdGFsTWVldGluZ3NcIlxyXG4gICAgICAgICAgW2hpZGVQYWdlU2l6ZV09XCJ0cnVlXCJcclxuICAgICAgICAgIChwYWdlKT1cIm9uUGFnZUNoYW5nZSgkZXZlbnQpXCJcclxuICAgICAgICA+PC9tYXQtcGFnaW5hdG9yPlxyXG4gICAgICA8L2Rpdj5cclxuICAgIDwvZGl2PlxyXG4gIDwvbmctY29udGFpbmVyPlxyXG5cclxuICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09IFNUQU5EQUxPTkUgTUVFVElORyA9PT09PT09PT09PT09PT09PT09PT09PSAtLT5cclxuICA8IS0tIFNpbmdsZSBob3Jpem9udGFsIHJvdzogYmFkZ2UrbmFtZStzdWJ0aXRsZSB8IE1FRVRJTkcgREFURSB8IFRJTUUgJiBUSU1FWk9ORSB8IGFjdGlvbi4gLS0+XHJcbiAgPGRpdiAqbmdJZj1cImlzU3RhbmRhbG9uZVwiIGNsYXNzPVwiaWVlZXNhLWV2ZW50LWdyb3VwLWNhcmRfX3N0YW5kYWxvbmVcIj5cclxuICAgIDxkaXYgY2xhc3M9XCJpZWVlc2EtZXZlbnQtZ3JvdXAtY2FyZF9fc3RhbmRhbG9uZS1tYWluXCI+XHJcbiAgICAgIDxzcGFuIGNsYXNzPVwiaWVlZXNhLWV2ZW50LWdyb3VwLWNhcmRfX2JhZGdlIGllZWVzYS1ldmVudC1ncm91cC1jYXJkX19iYWRnZS0tc3RhbmRhbG9uZVwiPlxyXG4gICAgICAgIHt7IGNvbnN0YW50cy5ldmVudEdyb3VwQ2FyZC5zdGFuZGFsb25lQmFkZ2UgfX1cclxuICAgICAgPC9zcGFuPlxyXG5cclxuICAgICAgPGRpdiBjbGFzcz1cImllZWVzYS1ldmVudC1ncm91cC1jYXJkX19zdGFuZGFsb25lLXRpdGxlLXJvd1wiPlxyXG4gICAgICAgIDxidXR0b25cclxuICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxyXG4gICAgICAgICAgY2xhc3M9XCJpZWVlc2EtZXZlbnQtZ3JvdXAtY2FyZF9fc3RhbmRhbG9uZS1uYW1lXCJcclxuICAgICAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwiY29uc3RhbnRzLm1lZXRpbmdSb3cuYXJpYUxhYmVsLm1lZXRpbmdOYW1lTGlua1wiXHJcbiAgICAgICAgICAoY2xpY2spPVwib25PcGVuTWVldGluZyhldmVudC5ldmVudElkKVwiXHJcbiAgICAgICAgPlxyXG4gICAgICAgICAge3sgZXZlbnQudGl0bGUgfX1cclxuICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICA8c3BhblxyXG4gICAgICAgICAgKm5nSWY9XCJldmVudC5zdGF0dXNcIlxyXG4gICAgICAgICAgY2xhc3M9XCJpZWVlc2EtZXZlbnQtZ3JvdXAtY2FyZF9fc3RhdHVzLXBpbGxcIlxyXG4gICAgICAgICAgW25nQ2xhc3NdPVwiJ2llZWVzYS1ldmVudC1ncm91cC1jYXJkX19zdGF0dXMtcGlsbC0tJyArIHN0YXR1c01vZGlmaWVyXCJcclxuICAgICAgICA+XHJcbiAgICAgICAgICA8c3BhbiBjbGFzcz1cImllZWVzYS1ldmVudC1ncm91cC1jYXJkX19zdGF0dXMtZG90XCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+PC9zcGFuPlxyXG4gICAgICAgICAge3sgZXZlbnQuc3RhdHVzIH19XHJcbiAgICAgICAgPC9zcGFuPlxyXG4gICAgICA8L2Rpdj5cclxuXHJcbiAgICAgIDxwXHJcbiAgICAgICAgKm5nSWY9XCJzdWJ0aXRsZVRleHRcIlxyXG4gICAgICAgIGNsYXNzPVwiaWVlZXNhLWV2ZW50LWdyb3VwLWNhcmRfX3N0YW5kYWxvbmUtc3VidGl0bGVcIlxyXG4gICAgICA+XHJcbiAgICAgICAge3sgc3VidGl0bGVUZXh0IH19XHJcbiAgICAgIDwvcD5cclxuICAgIDwvZGl2PlxyXG5cclxuICAgIDwhLS0gTUVFVElORyBEQVRFIGNvbHVtbi4gLS0+XHJcbiAgICA8ZGwgY2xhc3M9XCJpZWVlc2EtZXZlbnQtZ3JvdXAtY2FyZF9fc3RhbmRhbG9uZS1jb2xcIj5cclxuICAgICAgPGR0IGNsYXNzPVwiaWVlZXNhLWV2ZW50LWdyb3VwLWNhcmRfX3N0YW5kYWxvbmUtY29sLWxhYmVsXCI+XHJcbiAgICAgICAge3sgY29uc3RhbnRzLmV2ZW50R3JvdXBDYXJkLm1lZXRpbmdEYXRlTGFiZWwgfX1cclxuICAgICAgPC9kdD5cclxuICAgICAgPGRkIGNsYXNzPVwiaWVlZXNhLWV2ZW50LWdyb3VwLWNhcmRfX3N0YW5kYWxvbmUtY29sLXZhbHVlXCI+XHJcbiAgICAgICAge3sgZm9ybWF0dGVkU3RhcnREYXRlIH19PG5nLWNvbnRhaW5lciAqbmdJZj1cImZvcm1hdHRlZEVuZERhdGUgJiYgZm9ybWF0dGVkRW5kRGF0ZSAhPT0gZm9ybWF0dGVkU3RhcnREYXRlXCI+XHJcbiAgICAgICAgICAmbmRhc2g7IHt7IGZvcm1hdHRlZEVuZERhdGUgfX08L25nLWNvbnRhaW5lcj5cclxuICAgICAgPC9kZD5cclxuICAgIDwvZGw+XHJcblxyXG4gICAgPCEtLSBUSU1FICYgVElNRVpPTkUgY29sdW1uLiAtLT5cclxuICAgIDxkbCBjbGFzcz1cImllZWVzYS1ldmVudC1ncm91cC1jYXJkX19zdGFuZGFsb25lLWNvbFwiPlxyXG4gICAgICA8ZHQgY2xhc3M9XCJpZWVlc2EtZXZlbnQtZ3JvdXAtY2FyZF9fc3RhbmRhbG9uZS1jb2wtbGFiZWxcIj5cclxuICAgICAgICB7eyBjb25zdGFudHMuZXZlbnRHcm91cENhcmQudGltZVRpbWV6b25lTGFiZWwgfX1cclxuICAgICAgPC9kdD5cclxuICAgICAgPGRkIGNsYXNzPVwiaWVlZXNhLWV2ZW50LWdyb3VwLWNhcmRfX3N0YW5kYWxvbmUtY29sLXZhbHVlXCI+XHJcbiAgICAgICAge3sgc3RhbmRhbG9uZVRpbWUgfX1cclxuICAgICAgPC9kZD5cclxuICAgIDwvZGw+XHJcblxyXG4gICAgPCEtLSBBdHRlbmRhbmNlIGFjdGlvbiBjb2x1bW4uIC0tPlxyXG4gICAgPGRpdiBjbGFzcz1cImllZWVzYS1ldmVudC1ncm91cC1jYXJkX19zdGFuZGFsb25lLWFjdGlvbnNcIj5cclxuICAgICAgPHNwYW5cclxuICAgICAgICAqbmdJZj1cImlzU3RhbmRhbG9uZUF0dGVuZGluZ1wiXHJcbiAgICAgICAgY2xhc3M9XCJpZWVlc2EtZXZlbnQtZ3JvdXAtY2FyZF9fYXR0ZW5kaW5nLXBpbGxcIlxyXG4gICAgICA+XHJcbiAgICAgICAgPHNwYW4gY2xhc3M9XCJpZWVlc2EtZXZlbnQtZ3JvdXAtY2FyZF9fc3RhdHVzLWRvdFwiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPjwvc3Bhbj5cclxuICAgICAgICB7eyBjb25zdGFudHMubWVldGluZ1Jvdy5jdXJyZW50bHlBdHRlbmRpbmdJbmRpY2F0b3IgfX1cclxuICAgICAgPC9zcGFuPlxyXG5cclxuICAgICAgPGJ1dHRvblxyXG4gICAgICAgICpuZ0lmPVwic2hvd1N0YW5kYWxvbmVMb2dcIlxyXG4gICAgICAgIHR5cGU9XCJidXR0b25cIlxyXG4gICAgICAgIGNsYXNzPVwiaWVlZXNhLWV2ZW50LWdyb3VwLWNhcmRfX3N0YW5kYWxvbmUtYWN0aW9uIGllZWVzYS1ldmVudC1ncm91cC1jYXJkX19zdGFuZGFsb25lLWFjdGlvbi0tbG9nXCJcclxuICAgICAgICBbZGlzYWJsZWRdPVwicmVzb2x2ZUlzSW5GbGlnaHQoc3RhbmRhbG9uZU1lZXRpbmcpXCJcclxuICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cImNvbnN0YW50cy5tZWV0aW5nUm93LmFyaWFMYWJlbC5sb2dBdHRlbmRhbmNlXCJcclxuICAgICAgICAoY2xpY2spPVwib25Mb2dBdHRlbmRhbmNlKGV2ZW50LmV2ZW50SWQpXCJcclxuICAgICAgPlxyXG4gICAgICAgIHt7IGNvbnN0YW50cy5tZWV0aW5nUm93LmxvZ0F0dGVuZGFuY2VMYWJlbCB9fVxyXG4gICAgICA8L2J1dHRvbj5cclxuXHJcbiAgICAgIDxidXR0b25cclxuICAgICAgICAqbmdJZj1cInNob3dTdGFuZGFsb25lTGVhdmVcIlxyXG4gICAgICAgIHR5cGU9XCJidXR0b25cIlxyXG4gICAgICAgIGNsYXNzPVwiaWVlZXNhLWV2ZW50LWdyb3VwLWNhcmRfX3N0YW5kYWxvbmUtYWN0aW9uIGllZWVzYS1ldmVudC1ncm91cC1jYXJkX19zdGFuZGFsb25lLWFjdGlvbi0tbGVhdmVcIlxyXG4gICAgICAgIFtkaXNhYmxlZF09XCJyZXNvbHZlSXNJbkZsaWdodChzdGFuZGFsb25lTWVldGluZylcIlxyXG4gICAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwiY29uc3RhbnRzLm1lZXRpbmdSb3cuYXJpYUxhYmVsLmxlYXZlTWVldGluZ1wiXHJcbiAgICAgICAgKGNsaWNrKT1cIm9uTGVhdmVNZWV0aW5nKGV2ZW50LmV2ZW50SWQpXCJcclxuICAgICAgPlxyXG4gICAgICAgIHt7IGNvbnN0YW50cy5tZWV0aW5nUm93LmxlYXZlTWVldGluZ0xhYmVsIH19XHJcbiAgICAgIDwvYnV0dG9uPlxyXG4gICAgPC9kaXY+XHJcbiAgPC9kaXY+XHJcbjwvYXJ0aWNsZT5cclxuIl19