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