@provoly/hypervisor 0.0.22 → 0.0.24
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/assets/svgs/i.svg +18 -0
- package/esm2022/src/lib/event/detail/event-detail.component.mjs +92 -32
- package/esm2022/src/lib/event/filters/choice/choice-filter.component.mjs +21 -21
- package/esm2022/src/lib/event/filters/date/date-filter.component.mjs +7 -9
- package/esm2022/src/lib/event/filters/event-filters.component.mjs +14 -9
- package/esm2022/src/lib/event/filters/hvy-unit-filter.class.mjs +21 -1
- package/esm2022/src/lib/event/list/event-list.component.mjs +22 -16
- package/esm2022/src/lib/event-summary/list/event-summary-list.component.mjs +4 -3
- package/esm2022/src/lib/event-summary/page/event-summary-page.component.mjs +14 -7
- package/esm2022/src/lib/general/i18n/en.translations.mjs +25 -18
- package/esm2022/src/lib/general/i18n/fr.translations.mjs +33 -24
- package/esm2022/src/lib/general/status-display/status-display.component.mjs +3 -3
- package/esm2022/src/lib/model/event/hyp-event-detail.interface.mjs +1 -1
- package/esm2022/src/lib/model/event/hyp-event-summary.interface.mjs +1 -1
- package/esm2022/src/lib/model/event/hyp-event.interface.mjs +1 -1
- package/esm2022/src/lib/store/event/event.actions.mjs +2 -2
- package/esm2022/src/lib/store/event/event.effects.mjs +3 -3
- package/esm2022/src/lib/store/event/event.reducer.mjs +15 -13
- package/esm2022/src/lib/store/event/event.service.mjs +22 -31
- package/esm2022/src/lib/store/event-summary/event-summary.service.mjs +5 -5
- package/fesm2022/provoly-hypervisor.mjs +327 -232
- package/fesm2022/provoly-hypervisor.mjs.map +1 -1
- package/package.json +1 -1
- package/src/lib/event/detail/event-detail.component.d.ts +16 -2
- package/src/lib/event/filters/choice/choice-filter.component.d.ts +6 -5
- package/src/lib/event/filters/date/date-filter.component.d.ts +5 -4
- package/src/lib/event/filters/event-filters.component.d.ts +5 -3
- package/src/lib/event/filters/hvy-unit-filter.class.d.ts +14 -2
- package/src/lib/event/list/event-list.component.d.ts +7 -1
- package/src/lib/general/i18n/en.translations.d.ts +7 -0
- package/src/lib/general/i18n/fr.translations.d.ts +9 -0
- package/src/lib/model/event/hyp-event-detail.interface.d.ts +1 -2
- package/src/lib/model/event/hyp-event-summary.interface.d.ts +0 -1
- package/src/lib/model/event/hyp-event.interface.d.ts +1 -0
- package/src/lib/model/hyp-procedure.interface.d.ts +1 -1
- package/src/lib/store/event/event.actions.d.ts +4 -0
- package/src/lib/store/event/event.service.d.ts +10 -3
- package/styles/components/_a-chip-status.scss +0 -14
- package/styles/components/_m-hvy-event-summary-item.scss +37 -7
- package/styles/components/_o-hvy-event-detail.scss +41 -0
- package/styles/components/_o-hvy-event-filters.scss +1 -0
- package/styles/components/_o-hvy-events-table.scss +2 -1
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
<svg width="18" height="18" viewBox="0 0 18 18" fill="none" xmlns="http://www.w3.org/2000/svg">
|
|
2
|
+
<g clip-path="url(#clip0_3998_14321)">
|
|
3
|
+
<path
|
|
4
|
+
d="M15.3734 2.65039C13.6696 0.942205 11.4055 0.00117482 8.99736 0H8.99384C4.03956 0 0.004704 4.03433 4.10473e-06 8.99383C-0.00469579 13.948 4.02722 17.9883 8.98737 18H9.00911C13.9563 18 17.9877 13.9739 18 9.01439C18.0059 6.61482 17.0729 4.35447 15.3734 2.64981V2.65039ZM9.01028 16.8904H8.9956C6.8877 16.8863 4.90434 16.0586 3.41154 14.559C1.92167 13.0622 1.10448 11.0809 1.11094 8.97973C1.12387 4.63525 4.65525 1.10962 8.98855 1.10962C8.99619 1.10962 9.00382 1.10962 9.01146 1.10962C11.1141 1.11549 13.0933 1.94315 14.5855 3.4387C16.0777 4.93483 16.8955 6.91205 16.8885 9.00675C16.8738 13.3571 13.3412 16.891 9.01028 16.8904Z"
|
|
5
|
+
fill="#113B6E" />
|
|
6
|
+
<path
|
|
7
|
+
d="M9.90907 12.1938C9.80978 12.1903 9.71226 12.1915 9.60945 12.192C9.59183 12.192 9.57361 12.192 9.55599 12.192V10.9526C9.55599 10.0151 9.55599 9.07759 9.5554 8.1395C9.5554 7.73007 9.34097 7.50862 8.93619 7.49981C8.68005 7.49394 8.3769 7.48982 8.07376 7.50216C7.74535 7.51567 7.50507 7.7477 7.50331 8.05433C7.50096 8.37094 7.74183 8.60238 8.08904 8.61706C8.18538 8.62118 8.27997 8.62 8.37984 8.61941C8.39688 8.61941 8.41392 8.61941 8.43154 8.61941V12.192C8.41039 12.192 8.38983 12.192 8.36927 12.192C8.26763 12.1909 8.17128 12.1903 8.07494 12.1938C7.74712 12.2073 7.50684 12.4388 7.50272 12.7448C7.4992 13.0579 7.74242 13.2975 8.06906 13.3011C8.38219 13.3052 8.70178 13.3069 9.02549 13.3069C9.31982 13.3069 9.61768 13.3052 9.91671 13.3022C10.2545 13.2987 10.4842 13.0802 10.4877 12.7583C10.4913 12.4323 10.2592 12.205 9.91024 12.1932L9.90907 12.1938Z"
|
|
8
|
+
fill="#113B6E" />
|
|
9
|
+
<path
|
|
10
|
+
d="M8.98923 6.73932H8.99452C9.55674 6.73932 10.0191 6.28467 10.025 5.72369C10.0314 5.16859 9.56438 4.69455 9.00568 4.6875C9.00156 4.6875 8.99804 4.6875 8.99393 4.6875C8.7278 4.6875 8.47576 4.79206 8.28189 4.98179C8.08391 5.17623 7.97405 5.43351 7.9717 5.70666C7.96994 5.98039 8.0751 6.23944 8.26838 6.43504C8.46108 6.63006 8.71663 6.73815 8.98923 6.73932Z"
|
|
11
|
+
fill="#113B6E" />
|
|
12
|
+
</g>
|
|
13
|
+
<defs>
|
|
14
|
+
<clipPath id="clip0_3998_14321">
|
|
15
|
+
<rect width="18" height="18" fill="white" />
|
|
16
|
+
</clipPath>
|
|
17
|
+
</defs>
|
|
18
|
+
</svg>
|
|
@@ -1,28 +1,30 @@
|
|
|
1
|
-
import { Component, EventEmitter, Input, Output } from '@angular/core';
|
|
1
|
+
import { Component, EventEmitter, Input, Output, TemplateRef, ViewChild } from '@angular/core';
|
|
2
2
|
import { HypEventCriticality } from '../../model/event/hyp-event-criticality.type';
|
|
3
3
|
import { SubscriptionnerDirective } from '@provoly/dashboard';
|
|
4
4
|
import { DOMAINS } from '../../model/domains.constant';
|
|
5
5
|
import { CATEGORIES_BY_TYPE } from '../../model/event/hyp-event-category.type';
|
|
6
6
|
import { EventActions } from '../../store/event/event.actions';
|
|
7
|
+
import { OverlayConfig } from '@angular/cdk/overlay';
|
|
8
|
+
import { TemplatePortal } from '@angular/cdk/portal';
|
|
7
9
|
import * as i0 from "@angular/core";
|
|
8
10
|
import * as i1 from "../../store/equipment/equipment.service";
|
|
9
11
|
import * as i2 from "@ngrx/store";
|
|
10
|
-
import * as i3 from "@
|
|
11
|
-
import * as i4 from "@
|
|
12
|
-
import * as i5 from "@
|
|
13
|
-
import * as i6 from "
|
|
14
|
-
import * as i7 from "../../general/
|
|
15
|
-
import * as i8 from "../../general/
|
|
16
|
-
import * as i9 from "../../general/
|
|
12
|
+
import * as i3 from "@angular/cdk/overlay";
|
|
13
|
+
import * as i4 from "@provoly/dashboard/components/checkbox";
|
|
14
|
+
import * as i5 from "@angular/forms";
|
|
15
|
+
import * as i6 from "@provoly/dashboard";
|
|
16
|
+
import * as i7 from "../../general/icon-display/icon-display.component";
|
|
17
|
+
import * as i8 from "../../general/status-display/status-display.component";
|
|
18
|
+
import * as i9 from "../../general/progress-display/progress-display.component";
|
|
19
|
+
import * as i10 from "../../general/for-datetime-local-pipe/for-datetime-local.pipe";
|
|
17
20
|
export class EventDetailComponent extends SubscriptionnerDirective {
|
|
18
21
|
static { this.CARD_HEIGHT = 75; }
|
|
19
22
|
set events(events) {
|
|
20
|
-
this._events = events.filter(ev => !!ev);
|
|
23
|
+
this._events = events.filter((ev) => !!ev);
|
|
21
24
|
this.eventModifications = new Array(this._events.length);
|
|
22
25
|
this.opened = this._events.length === 1 ? [true] : [];
|
|
23
|
-
this.canCloseSome = this._events.filter(ev => ev.status !== 'DONE').length > 0;
|
|
26
|
+
this.canCloseSome = this._events.filter((ev) => ev.status !== 'DONE').length > 0;
|
|
24
27
|
}
|
|
25
|
-
;
|
|
26
28
|
set procedure(procedure) {
|
|
27
29
|
this._procedure = procedure;
|
|
28
30
|
this.procedureModifications = {};
|
|
@@ -32,10 +34,12 @@ export class EventDetailComponent extends SubscriptionnerDirective {
|
|
|
32
34
|
this.procedureModifications = {};
|
|
33
35
|
this._outputModifications();
|
|
34
36
|
}
|
|
35
|
-
constructor(equipmentService, store) {
|
|
37
|
+
constructor(equipmentService, store, overlay, viewContainerRef) {
|
|
36
38
|
super();
|
|
37
39
|
this.equipmentService = equipmentService;
|
|
38
40
|
this.store = store;
|
|
41
|
+
this.overlay = overlay;
|
|
42
|
+
this.viewContainerRef = viewContainerRef;
|
|
39
43
|
this.opened = [];
|
|
40
44
|
this.criticalities = HypEventCriticality.values;
|
|
41
45
|
this._events = [];
|
|
@@ -52,16 +56,24 @@ export class EventDetailComponent extends SubscriptionnerDirective {
|
|
|
52
56
|
this.moveInitialIndex = 0;
|
|
53
57
|
this.initialActionList = [];
|
|
54
58
|
this.previousOffset = 0;
|
|
59
|
+
this.changeStatusContext = {
|
|
60
|
+
comment: '',
|
|
61
|
+
events: [],
|
|
62
|
+
status: 'DONE',
|
|
63
|
+
all: false
|
|
64
|
+
};
|
|
55
65
|
}
|
|
56
66
|
get events() {
|
|
57
67
|
return this._events.map((evt, idx) => ({ ...evt, ...(this.eventModifications[idx] ?? {}) }));
|
|
58
68
|
}
|
|
59
69
|
get procedure() {
|
|
60
|
-
return this._procedure
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
70
|
+
return this._procedure
|
|
71
|
+
? {
|
|
72
|
+
...this._procedure,
|
|
73
|
+
...(this.procedureModifications ?? {}),
|
|
74
|
+
events: this.events
|
|
75
|
+
}
|
|
76
|
+
: undefined;
|
|
65
77
|
}
|
|
66
78
|
toggle(i) {
|
|
67
79
|
this.opened[i] = !this.opened[i];
|
|
@@ -94,7 +106,7 @@ export class EventDetailComponent extends SubscriptionnerDirective {
|
|
|
94
106
|
eqName: true,
|
|
95
107
|
eqEntity: true,
|
|
96
108
|
startDate: true,
|
|
97
|
-
endDate: true
|
|
109
|
+
endDate: true
|
|
98
110
|
};
|
|
99
111
|
}
|
|
100
112
|
switch (event.type) {
|
|
@@ -111,7 +123,7 @@ export class EventDetailComponent extends SubscriptionnerDirective {
|
|
|
111
123
|
eqName: true,
|
|
112
124
|
eqEntity: true,
|
|
113
125
|
startDate: true,
|
|
114
|
-
endDate: true
|
|
126
|
+
endDate: true
|
|
115
127
|
};
|
|
116
128
|
case 'REPORT':
|
|
117
129
|
return {
|
|
@@ -125,7 +137,7 @@ export class EventDetailComponent extends SubscriptionnerDirective {
|
|
|
125
137
|
eqName: false,
|
|
126
138
|
eqEntity: true,
|
|
127
139
|
startDate: true,
|
|
128
|
-
endDate: true
|
|
140
|
+
endDate: true
|
|
129
141
|
};
|
|
130
142
|
case 'OPERATOR':
|
|
131
143
|
return {
|
|
@@ -139,7 +151,7 @@ export class EventDetailComponent extends SubscriptionnerDirective {
|
|
|
139
151
|
eqName: false,
|
|
140
152
|
eqEntity: false,
|
|
141
153
|
startDate: false,
|
|
142
|
-
endDate: false
|
|
154
|
+
endDate: false
|
|
143
155
|
};
|
|
144
156
|
}
|
|
145
157
|
}
|
|
@@ -162,7 +174,7 @@ export class EventDetailComponent extends SubscriptionnerDirective {
|
|
|
162
174
|
}
|
|
163
175
|
validateEvents(events) {
|
|
164
176
|
this.errors = [];
|
|
165
|
-
events.forEach(event => {
|
|
177
|
+
events.forEach((event) => {
|
|
166
178
|
const eventErrors = [];
|
|
167
179
|
if (!event.name || event.name.length === 0) {
|
|
168
180
|
eventErrors.push({ field: 'name', code: 'required' });
|
|
@@ -193,20 +205,62 @@ export class EventDetailComponent extends SubscriptionnerDirective {
|
|
|
193
205
|
this.eventErrors.next(this.errors);
|
|
194
206
|
}
|
|
195
207
|
hasError(prop, idx) {
|
|
196
|
-
return this.errors[idx]?.find(err => err.field === prop) ?? false;
|
|
208
|
+
return this.errors[idx]?.find((err) => err.field === prop) ?? false;
|
|
197
209
|
}
|
|
198
210
|
categories(event) {
|
|
199
211
|
return CATEGORIES_BY_TYPE.values[event.type];
|
|
200
212
|
}
|
|
201
213
|
changeStatus($event, event) {
|
|
202
|
-
this.
|
|
214
|
+
this.changeStatusContext.events = [event];
|
|
215
|
+
this.changeStatusContext.status = $event;
|
|
216
|
+
this.changeStatusContext.all = false;
|
|
217
|
+
this.toggleConfirm();
|
|
203
218
|
}
|
|
204
219
|
closeAll() {
|
|
205
|
-
|
|
206
|
-
|
|
220
|
+
this.changeStatusContext.all = true;
|
|
221
|
+
this.changeStatusContext.events = this.events;
|
|
222
|
+
this.changeStatusContext.status = 'DONE';
|
|
223
|
+
this.toggleConfirm();
|
|
224
|
+
}
|
|
225
|
+
confirmedClose() {
|
|
226
|
+
if (this.changeStatusContext.all) {
|
|
227
|
+
if (!this.procedure) {
|
|
228
|
+
this.store.dispatch(EventActions.status({
|
|
229
|
+
targetStatus: this.changeStatusContext.status,
|
|
230
|
+
event: this.changeStatusContext.events[0],
|
|
231
|
+
comment: this.changeStatusContext.comment
|
|
232
|
+
}));
|
|
233
|
+
}
|
|
234
|
+
else {
|
|
235
|
+
this.store.dispatch(EventActions.status({
|
|
236
|
+
targetStatus: this.changeStatusContext.status,
|
|
237
|
+
procedure: this.procedure,
|
|
238
|
+
comment: this.changeStatusContext.comment
|
|
239
|
+
}));
|
|
240
|
+
}
|
|
207
241
|
}
|
|
208
242
|
else {
|
|
209
|
-
this.store.dispatch(EventActions.status({
|
|
243
|
+
this.store.dispatch(EventActions.status({
|
|
244
|
+
targetStatus: this.changeStatusContext.status,
|
|
245
|
+
event: this.changeStatusContext.events[0],
|
|
246
|
+
comment: this.changeStatusContext.comment
|
|
247
|
+
}));
|
|
248
|
+
}
|
|
249
|
+
this.toggleConfirm();
|
|
250
|
+
}
|
|
251
|
+
toggleConfirm() {
|
|
252
|
+
if (!this.overlayRef) {
|
|
253
|
+
this.overlayRef = this.overlay.create(new OverlayConfig({
|
|
254
|
+
hasBackdrop: true,
|
|
255
|
+
backdropClass: 'backdrop-dark',
|
|
256
|
+
panelClass: ['o-hvy-close-confirm']
|
|
257
|
+
}));
|
|
258
|
+
this.overlayRef.backdropClick().subscribe(() => this.toggleConfirm());
|
|
259
|
+
this.overlayRef.attach(new TemplatePortal(this.confirmDialog, this.viewContainerRef));
|
|
260
|
+
}
|
|
261
|
+
else {
|
|
262
|
+
this.overlayRef.dispose();
|
|
263
|
+
this.overlayRef = undefined;
|
|
210
264
|
}
|
|
211
265
|
}
|
|
212
266
|
onMouseDown($event) {
|
|
@@ -246,18 +300,24 @@ export class EventDetailComponent extends SubscriptionnerDirective {
|
|
|
246
300
|
allowDrop($event) {
|
|
247
301
|
$event.preventDefault();
|
|
248
302
|
}
|
|
249
|
-
|
|
250
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "17.1.3", type: EventDetailComponent, selector: "hvy-event-detail", inputs: { events: "events", procedure: "procedure", cancelModifications: "cancelModifications" }, outputs: { modifiedEvents: "modifiedEvents", modifiedProcedure: "modifiedProcedure", eventErrors: "eventErrors" }, usesInheritance: true, ngImport: i0, template: "<div class=\"o-hvy-events-detail\">\n <div class=\"o-hvy-events-detail__header\">\n <div class=\"o-hvy-events-detail__header__split\">\n <h1>{{ '@hvy.event.detail' | i18n }}</h1>\n @if (events.length > 1) {\n <button class=\"a-btn a-btn--secondary -fix-right\" [disabled]=\"!canCloseSome\"\n (click)=\"closeAll()\">{{ '@hvy.event.log.event.close' | i18n }}\n </button>\n }\n </div>\n <div class=\"o-hvy-events-detail__header__split\">\n <button class=\"a-btn a-btn--secondary\">{{ '@hvy.event.log.procedure.delete' | i18n }}</button>\n </div>\n </div>\n <div class=\"o-hvy-events-detail__container\">\n <div class=\"o-hvy-events-detail__container__scrollable\">\n <div class=\"o-hvy-events-detail__events\">\n @for (event of events;track event.id;let idx = $index) {\n <div class=\"o-hvy-events-detail__events__event\">\n <div class=\"o-hvy-events-detail__events__event__header\">\n <pry-icon [iconSvg]=\"!opened[idx] ? 'chevron_bottom' : 'chevron_top'\" (click)=\"toggle(idx)\"></pry-icon>\n <hvy-icon-display [event]=\"event\"></hvy-icon-display>\n <h2>{{ event.name }}</h2>\n <hvy-status-display [event]=\"event\" [modifiable]=\"event.status !== 'DONE'\"\n (modified)=\"changeStatus($event, event)\"></hvy-status-display>\n </div>\n <div class=\"o-hvy-events-detail__events__event__content\">\n @if (!opened[idx]) {\n <div>{{ '@hvy.event.log.event.description' | i18n }}: {{ event.description }}</div>\n <div>{{ '@hvy.event.log.event.address' | i18n }}: {{ event.address }}</div>\n } @else {\n @if (access(event);as accessValue) {\n <h3>{{ '@hvy.event.log.event.detail' | i18n }}</h3>\n <table>\n <tbody>\n <tr>\n <td>{{ '@hvy.event.log.event.name' | i18n }}<span class=\"required\">*</span></td>\n <td><input type=\"text\" class=\"a-form-field\" [class.-error]=\"hasError('name', idx)\"\n [value]=\"event.name\"\n (change)=\"modifyEvent(idx, 'name', $event)\" [readonly]=\"accessValue.name\"></td>\n </tr>\n <tr>\n <td>{{ '@hvy.event.log.event.category' | i18n }}<span class=\"required\">*</span></td>\n <td>\n <pry-select [ngModel]=\"event.category\"\n [items]=\"categories(event)\"\n [class.-error]=\"hasError('category', idx)\"\n (ngModelChange)=\"modifyEvent(idx, 'category', $event)\"\n i18nPrefix=\"@hvy.event.category.\" [disabled]=\"accessValue.category\"></pry-select>\n </td>\n </tr>\n <tr>\n <td>{{ '@hvy.event.criticality.name' | i18n }}<span class=\"required\">*</span></td>\n <td>\n <pry-select [ngModel]=\"event.criticality\" [items]=\"criticalities\"\n [class.-error]=\"hasError('criticality', idx)\"\n i18nPrefix=\"@hvy.event.criticality.\"\n [disabled]=\"accessValue.criticality\"\n (ngModelChange)=\"modifyEvent(idx, 'criticality', $event)\"></pry-select>\n </td>\n </tr>\n <tr>\n <td>{{ '@hvy.event.log.event.description' | i18n }}<span class=\"required\">*</span></td>\n <td><textarea [ngModel]=\"event.description\" class=\"a-form-field\"\n [class.-error]=\"hasError('description', idx)\"\n [readonly]=\"accessValue.description\"\n (ngModelChange)=\"modifyEvent(idx, 'description', $event)\"></textarea></td>\n </tr>\n <tr>\n <td>{{ '@hvy.event.log.event.address' | i18n }}</td>\n <td><textarea [ngModel]=\"event.address\" class=\"a-form-field\"\n [class.-error]=\"hasError('address', idx)\"\n [readonly]=\"accessValue.address\"\n (ngModelChange)=\"modifyEvent(idx, 'address', $event)\"></textarea></td>\n </tr>\n @if (['ALERT', 'REPORT'].includes(event.type)) {\n <tr>\n <td>{{ '@hvy.event.source' | i18n }}</td>\n <td><input type=\"text\" class=\"a-form-field\" [value]=\"event.externalSourceRef ?? ''\"\n [class.-error]=\"hasError('source', idx)\"\n [readonly]=\"accessValue.source\" (change)=\"modifyEvent(idx, 'source', $event)\"></td>\n </tr>\n }\n <tr>\n <td>{{ '@hvy.event.equipment' | i18n }}</td>\n <td>\n <input type=\"text\" class=\"a-form-field\"\n [value]=\"event.equipment?.name ?? ''\"\n [class.-error]=\"hasError('equipment', idx)\"\n [readonly]=\"accessValue.eqName\"\n (change)=\"changeEquipment(idx, $event)\">\n </td>\n </tr>\n <tr>\n <td>{{ '@hvy.event.equipmentEntity' | i18n }}</td>\n <td><input type=\"text\" class=\"a-form-field\" [value]=\"event.equipment?.entity ?? ''\"\n readonly></td>\n </tr>\n <tr>\n <td>{{ '@hvy.event.domain.name' | i18n }}</td>\n <td>\n <pry-select [items]=\"DOMAINS\" [ngModel]=\"event.domain\" i18nPrefix=\"@hvy.event.domain.\"\n [class.-error]=\"hasError('domain', idx)\"\n (ngModelChange)=\"modifyEvent(idx, 'domain', $event)\"\n [disabled]=\"accessValue.domain\"\n ></pry-select>\n </td>\n </tr>\n <tr>\n <td>\n {{ '@hvy.event.startDate' | i18n }}\n @if (event.category === 'MANIFESTATION') {\n <span class=\"required\">*</span>\n }\n </td>\n <td>\n <input type=\"datetime-local\" class=\"a-form-field\"\n [value]=\"event.startDate | forDateTimeLocal\"\n [class.-error]=\"hasError('startDate', idx)\"\n [readonly]=\"accessValue.startDate\" (change)=\"modifyEvent(idx, 'startDate', $event)\">\n </td>\n </tr>\n <tr>\n <td>\n {{ '@hvy.event.endDate' | i18n }}\n @if (event.category === 'MANIFESTATION') {\n <span class=\"required\">*</span>\n }\n </td>\n <td>\n <input type=\"datetime-local\" class=\"a-form-field\"\n [value]=\"event.endDate | forDateTimeLocal\"\n [class.-error]=\"hasError('endDate', idx)\"\n [readonly]=\"accessValue.endDate\" (change)=\"modifyEvent(idx, 'endDate', $event)\">\n </td>\n </tr>\n <tr>\n <td>{{ '@hvy.event.creationDate' | i18n }}</td>\n <td>\n <input type=\"datetime-local\" class=\"a-form-field\"\n [value]=\"event.creationDate | forDateTimeLocal\"\n readonly>\n </td>\n </tr>\n <tr>\n <td>{{ '@hvy.event.lastModificationDate' | i18n }}</td>\n <td>\n <input type=\"datetime-local\" class=\"a-form-field\"\n [value]=\"event.lastModificationDate | forDateTimeLocal\" readonly>\n </td>\n </tr>\n <tr>\n <td>{{ '@hvy.event.closeDate' | i18n }}</td>\n <td>\n <input type=\"datetime-local\" class=\"a-form-field\" [value]=\"event.closeDate | forDateTimeLocal\"\n readonly>\n </td>\n </tr>\n </tbody>\n </table>\n <div class=\"o-hvy-events-detail__events__event__content__comments\">\n <h3>{{ '@hvy.event.log.event.comments.name' | i18n }}</h3>\n <textarea [placeholder]=\"('@hvy.event.log.event.comments.placeholder' | i18n) + '...'\"\n [(ngModel)]=\"newComentContent\"></textarea>\n <div class=\"o-hvy-events-detail__events__event__content__comments__button\">\n <button class=\"a-btn a-btn--primary\"\n [disabled]=\"newComentContent.length === 0\">{{ '@hvy.action.comment' | i18n }}\n </button>\n </div>\n </div>\n }\n }\n </div>\n </div>\n }\n </div>\n <div class=\"o-hvy-events-detail__procedure\">\n <div class=\"o-hvy-events-detail__procedure__header\">\n <h2>{{ (events.length === 1 ? '@hvy.event.log.procedure.name1' : '@hvy.event.log.procedure.name') | i18n }}</h2>\n </div>\n @if (procedure) {\n <div>\n <p>{{ procedure.name }}</p>\n </div>\n <div class=\"o-hvy-events-detail__procedure__progress\">\n <p>{{ '@hvy.event.log.procedure.progress' | i18n }}</p>\n <hvy-progress-display [progress]=\"procedure.progress\"></hvy-progress-display>\n </div>\n <div class=\"o-hvy-events-detail__procedure__actions\" (drag)=\"move($event)\" (drop)=\"drop($event)\" (dragover)=\"allowDrop($event)\">\n @for (action of procedure.actions;track action.id;let idx = $index) {\n <div class=\"o-hvy-events-detail__procedure__actions__action\" [draggable]=\"true\" (dragstart)=\"dragStart($event, action, idx)\" (mousedown)=\"onMouseDown($event)\">\n <pry-icon iconSvg=\"six_dot\" #handle></pry-icon>\n <pry-checkbox [ngModel]=\"action.status === 'DONE'\"></pry-checkbox>\n <div>{{ action.name }}</div>\n <pry-icon iconSvg=\"more_horiz\"></pry-icon>\n </div>\n } @empty {\n <div>\n {{ '@hvy.event.log.procedure.noAction' | i18n }}\n </div>\n }\n </div>\n <div>\n <button class=\"a-btn a-btn--primary\">\n <pry-icon iconSvg=\"add\"></pry-icon>\n {{ '@hvy.event.log.procedure.addAction' | i18n }}\n </button>\n </div>\n } @else {\n <button class=\"a-btn a-btn--secondary\">\n {{ '@chh.actions.associate' | i18n }}\n </button>\n }\n </div>\n </div>\n </div>\n</div>\n", dependencies: [{ kind: "component", type: i3.PryCheckboxComponent, selector: "pry-checkbox", inputs: ["circle"] }, { kind: "directive", type: i4.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i4.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i4.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: i5.PryIconComponent, selector: "pry-icon", inputs: ["color", "iconSvg", "animation", "iconImage", "alt", "width", "height", "classes"] }, { kind: "component", type: i5.PrySelectComponent, selector: "pry-select", inputs: ["items", "clearable", "multiple", "closeOnSelect", "placeholder", "isForm", "required", "name", "readonly", "autocomplete", "alwaysShowAutosuggestedValues", "externalAutocompleteService", "bindValue", "bindLabel", "iconSize", "bindIcon", "template", "i18nPrefix", "bindClasses", "loading", "elementRef"], outputs: ["searched", "cleared", "clicked"] }, { kind: "component", type: i6.IconDisplayComponent, selector: "hvy-icon-display", inputs: ["event"] }, { kind: "component", type: i7.StatusDisplayComponent, selector: "hvy-status-display", inputs: ["event", "modifiable"], outputs: ["modified"] }, { kind: "component", type: i8.ProgressDisplayComponent, selector: "hvy-progress-display", inputs: ["progress"] }, { kind: "pipe", type: i5.I18nPipe, name: "i18n" }, { kind: "pipe", type: i9.ForDatetimeLocalPipe, name: "forDateTimeLocal" }] }); }
|
|
303
|
+
confirmDisabled() {
|
|
304
|
+
return this.changeStatusContext.comment.length === 0;
|
|
305
|
+
}
|
|
306
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.1.3", ngImport: i0, type: EventDetailComponent, deps: [{ token: i1.EquipmentService }, { token: i2.Store }, { token: i3.Overlay }, { token: i0.ViewContainerRef }], target: i0.ɵɵFactoryTarget.Component }); }
|
|
307
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "17.1.3", type: EventDetailComponent, selector: "hvy-event-detail", inputs: { events: "events", procedure: "procedure", cancelModifications: "cancelModifications" }, outputs: { modifiedEvents: "modifiedEvents", modifiedProcedure: "modifiedProcedure", eventErrors: "eventErrors" }, viewQueries: [{ propertyName: "confirmDialog", first: true, predicate: ["confirmDialog"], descendants: true, read: TemplateRef }], usesInheritance: true, ngImport: i0, template: "<div class=\"o-hvy-events-detail\">\n <div class=\"o-hvy-events-detail__header\">\n <div class=\"o-hvy-events-detail__header__split\">\n <h1>{{ '@hvy.event.detail' | i18n }}</h1>\n @if (events.length > 1) {\n <button class=\"a-btn a-btn--secondary -fix-right\" [disabled]=\"!canCloseSome\"\n (click)=\"closeAll()\">{{ (canCloseSome ? '@hvy.event.log.event.close' : '@hvy.event.log.event.closed') | i18n }}\n </button>\n @if (!canCloseSome) {\n <div\n class=\"a-tooltip\"\n [attr.data-tooltip]=\"'... TODO: get closing comment ...'\"\n data-tooltip-position=\"bottom\">\n <pry-icon iconSvg=\"i\" [height]=\"18\" [width]=\"18\">i</pry-icon>\n </div>\n }\n }\n </div>\n <div class=\"o-hvy-events-detail__header__split\">\n <button class=\"a-btn a-btn--secondary\">{{ '@hvy.event.log.procedure.delete' | i18n }}</button>\n </div>\n </div>\n <div class=\"o-hvy-events-detail__container\">\n <div class=\"o-hvy-events-detail__container__scrollable\">\n <div class=\"o-hvy-events-detail__events\">\n @for (event of events; track event.id; let idx = $index) {\n <div class=\"o-hvy-events-detail__events__event\">\n <div class=\"o-hvy-events-detail__events__event__header\">\n <pry-icon [iconSvg]=\"!opened[idx] ? 'chevron_bottom' : 'chevron_top'\" (click)=\"toggle(idx)\"></pry-icon>\n <hvy-icon-display [event]=\"event\"></hvy-icon-display>\n <h2>{{ event.name }}</h2>\n <hvy-status-display [event]=\"event\" [modifiable]=\"event.status !== 'DONE'\"\n (modified)=\"changeStatus($event, event)\"></hvy-status-display>\n </div>\n <div class=\"o-hvy-events-detail__events__event__content\">\n @if (!opened[idx]) {\n <div>{{ '@hvy.event.log.event.description' | i18n }}: {{ event.description }}</div>\n <div>{{ '@hvy.event.log.event.address' | i18n }}: {{ event.address }}</div>\n } @else {\n @if (access(event); as accessValue) {\n <h3>{{ '@hvy.event.log.event.detail' | i18n }}</h3>\n <table>\n <tbody>\n <tr>\n <td>{{ '@hvy.event.log.event.name' | i18n }}<span class=\"required\">*</span></td>\n <td><input type=\"text\" class=\"a-form-field\" [class.-error]=\"hasError('name', idx)\"\n [value]=\"event.name\"\n (change)=\"modifyEvent(idx, 'name', $event)\" [readonly]=\"accessValue.name\"></td>\n </tr>\n <tr>\n <td>{{ '@hvy.event.log.event.category' | i18n }}<span class=\"required\">*</span></td>\n <td>\n <pry-select [ngModel]=\"event.category\"\n [items]=\"categories(event)\"\n [class.-error]=\"hasError('category', idx)\"\n (ngModelChange)=\"modifyEvent(idx, 'category', $event)\"\n i18nPrefix=\"@hvy.event.category.\" [disabled]=\"accessValue.category\"></pry-select>\n </td>\n </tr>\n <tr>\n <td>{{ '@hvy.event.criticality.name' | i18n }}<span class=\"required\">*</span></td>\n <td>\n <pry-select [ngModel]=\"event.criticality\" [items]=\"criticalities\"\n [class.-error]=\"hasError('criticality', idx)\"\n i18nPrefix=\"@hvy.event.criticality.\"\n [disabled]=\"accessValue.criticality\"\n (ngModelChange)=\"modifyEvent(idx, 'criticality', $event)\"></pry-select>\n </td>\n </tr>\n <tr>\n <td>{{ '@hvy.event.log.event.description' | i18n }}<span class=\"required\">*</span></td>\n <td><textarea [ngModel]=\"event.description\" class=\"a-form-field\"\n [class.-error]=\"hasError('description', idx)\"\n [readonly]=\"accessValue.description\"\n (ngModelChange)=\"modifyEvent(idx, 'description', $event)\"></textarea></td>\n </tr>\n <tr>\n <td>{{ '@hvy.event.log.event.address' | i18n }}</td>\n <td><textarea [ngModel]=\"event.address\" class=\"a-form-field\"\n [class.-error]=\"hasError('address', idx)\"\n [readonly]=\"accessValue.address\"\n (ngModelChange)=\"modifyEvent(idx, 'address', $event)\"></textarea></td>\n </tr>\n @if (['ALERT', 'REPORT'].includes(event.type)) {\n <tr>\n <td>{{ '@hvy.event.source' | i18n }}</td>\n <td><input type=\"text\" class=\"a-form-field\" [value]=\"event.externalSourceRef ?? ''\"\n [class.-error]=\"hasError('source', idx)\"\n [readonly]=\"accessValue.source\" (change)=\"modifyEvent(idx, 'source', $event)\"></td>\n </tr>\n }\n <tr>\n <td>{{ '@hvy.event.equipment' | i18n }}</td>\n <td>\n <input type=\"text\" class=\"a-form-field\"\n [value]=\"event.equipment?.name ?? ''\"\n [class.-error]=\"hasError('equipment', idx)\"\n [readonly]=\"accessValue.eqName\"\n (change)=\"changeEquipment(idx, $event)\">\n </td>\n </tr>\n <tr>\n <td>{{ '@hvy.event.equipmentEntity' | i18n }}</td>\n <td><input type=\"text\" class=\"a-form-field\" [value]=\"event.equipment?.entity ?? ''\"\n readonly></td>\n </tr>\n <tr>\n <td>{{ '@hvy.event.domain.name' | i18n }}</td>\n <td>\n <pry-select [items]=\"DOMAINS\" [ngModel]=\"event.domain\" i18nPrefix=\"@hvy.event.domain.\"\n [class.-error]=\"hasError('domain', idx)\"\n (ngModelChange)=\"modifyEvent(idx, 'domain', $event)\"\n [disabled]=\"accessValue.domain\"\n ></pry-select>\n </td>\n </tr>\n <tr>\n <td>\n {{ '@hvy.event.startDate' | i18n }}\n @if (event.category === 'MANIFESTATION') {\n <span class=\"required\">*</span>\n }\n </td>\n <td>\n <input type=\"datetime-local\" class=\"a-form-field\"\n [value]=\"event.startDate | forDateTimeLocal\"\n [class.-error]=\"hasError('startDate', idx)\"\n [readonly]=\"accessValue.startDate\" (change)=\"modifyEvent(idx, 'startDate', $event)\">\n </td>\n </tr>\n <tr>\n <td>\n {{ '@hvy.event.endDate' | i18n }}\n @if (event.category === 'MANIFESTATION') {\n <span class=\"required\">*</span>\n }\n </td>\n <td>\n <input type=\"datetime-local\" class=\"a-form-field\"\n [value]=\"event.endDate | forDateTimeLocal\"\n [class.-error]=\"hasError('endDate', idx)\"\n [readonly]=\"accessValue.endDate\" (change)=\"modifyEvent(idx, 'endDate', $event)\">\n </td>\n </tr>\n <tr>\n <td>{{ '@hvy.event.creationDate' | i18n }}</td>\n <td>\n <input type=\"datetime-local\" class=\"a-form-field\"\n [value]=\"event.creationDate | forDateTimeLocal\"\n readonly>\n </td>\n </tr>\n <tr>\n <td>{{ '@hvy.event.lastModificationDate' | i18n }}</td>\n <td>\n <input type=\"datetime-local\" class=\"a-form-field\"\n [value]=\"event.lastModificationDate | forDateTimeLocal\" readonly>\n </td>\n </tr>\n <tr>\n <td>{{ '@hvy.event.closeDate' | i18n }}</td>\n <td>\n <input type=\"datetime-local\" class=\"a-form-field\" [value]=\"event.closeDate | forDateTimeLocal\"\n readonly>\n </td>\n </tr>\n </tbody>\n </table>\n <div class=\"o-hvy-events-detail__events__event__content__comments\">\n <h3>{{ '@hvy.event.log.event.comments.name' | i18n }}</h3>\n <textarea [placeholder]=\"('@hvy.event.log.event.comments.placeholder' | i18n) + '...'\"\n [(ngModel)]=\"newComentContent\"></textarea>\n <div class=\"o-hvy-events-detail__events__event__content__comments__button\">\n <button class=\"a-btn a-btn--primary\"\n [disabled]=\"newComentContent.length === 0\">{{ '@hvy.action.comment' | i18n }}\n </button>\n </div>\n </div>\n }\n }\n </div>\n </div>\n }\n </div>\n <div class=\"o-hvy-events-detail__procedure\">\n <div class=\"o-hvy-events-detail__procedure__header\">\n <h2>{{ (events.length === 1 ? '@hvy.event.log.procedure.name1' : '@hvy.event.log.procedure.name') | i18n }}</h2>\n </div>\n @if (procedure) {\n <div>\n <p>{{ procedure.name }}</p>\n </div>\n <div class=\"o-hvy-events-detail__procedure__progress\">\n <p>{{ '@hvy.event.log.procedure.progress' | i18n }}</p>\n <hvy-progress-display [progress]=\"procedure.progress\"></hvy-progress-display>\n </div>\n <div class=\"o-hvy-events-detail__procedure__actions\" (drag)=\"move($event)\" (drop)=\"drop($event)\"\n (dragover)=\"allowDrop($event)\">\n @for (action of procedure.actions; track action.id; let idx = $index) {\n <div class=\"o-hvy-events-detail__procedure__actions__action\" [draggable]=\"true\"\n (dragstart)=\"dragStart($event, action, idx)\" (mousedown)=\"onMouseDown($event)\">\n <pry-icon iconSvg=\"six_dot\" #handle></pry-icon>\n <pry-checkbox [ngModel]=\"action.status === 'DONE'\"></pry-checkbox>\n <div>{{ action.name }}</div>\n <pry-icon iconSvg=\"more_horiz\"></pry-icon>\n </div>\n } @empty {\n <div>\n {{ '@hvy.event.log.procedure.noAction' | i18n }}\n </div>\n }\n </div>\n <div>\n <button class=\"a-btn a-btn--primary\">\n <pry-icon iconSvg=\"add\"></pry-icon>\n {{ '@hvy.event.log.procedure.addAction' | i18n }}\n </button>\n </div>\n } @else {\n <button class=\"a-btn a-btn--secondary\">\n {{ '@hvy.action.associate' | i18n }}\n </button>\n }\n </div>\n </div>\n </div>\n</div>\n\n<ng-template #confirmDialog>\n <div\n class=\"o-hvy-close-confirm__dialog\"\n aria-labelledby=\"confirm\"\n tabindex=\"-1\"\n id=\"choice\"\n role=\"dialog\"\n aria-modal=\"true\"\n >\n <h2>{{ (changeStatusContext.events.length === 1 ? '@hvy.event.close.one' : '@hvy.event.close.multi') | i18n }}</h2>\n <ul>\n @for (event of changeStatusContext.events; track event.id) {\n <li>{{ event.name }}</li>\n }\n </ul>\n <p class=\"o-hvy-close-confirm__dialog__comment-title\">\n {{ '@hvy.event.close.comment' | i18n }}<span class=\"required\">*</span>:\n </p>\n <div class=\"o-hvy-close-confirm__dialog__comment\">\n <textarea [(ngModel)]=\"changeStatusContext.comment\" class=\"a-form-field\"></textarea>\n </div>\n <div class=\"o-hvy-close-confirm__dialog__actions\">\n <button class=\"a-btn a-btn--primary\" (click)=\"confirmedClose()\"\n [disabled]=\"confirmDisabled()\">{{ '@hvy.action.validate' | i18n }}\n </button>\n <button class=\"a-btn a-btn--secondary\" (click)=\"toggleConfirm()\">{{ '@hvy.action.cancel' | i18n }}</button>\n </div>\n </div>\n</ng-template>\n", dependencies: [{ kind: "component", type: i4.PryCheckboxComponent, selector: "pry-checkbox", inputs: ["circle"] }, { kind: "directive", type: i5.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i5.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i5.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: i6.PryIconComponent, selector: "pry-icon", inputs: ["color", "iconSvg", "animation", "iconImage", "alt", "width", "height", "classes"] }, { kind: "component", type: i6.PrySelectComponent, selector: "pry-select", inputs: ["items", "clearable", "multiple", "closeOnSelect", "placeholder", "isForm", "required", "name", "readonly", "autocomplete", "alwaysShowAutosuggestedValues", "externalAutocompleteService", "bindValue", "bindLabel", "iconSize", "bindIcon", "template", "i18nPrefix", "bindClasses", "loading", "elementRef"], outputs: ["searched", "cleared", "clicked"] }, { kind: "component", type: i7.IconDisplayComponent, selector: "hvy-icon-display", inputs: ["event"] }, { kind: "component", type: i8.StatusDisplayComponent, selector: "hvy-status-display", inputs: ["event", "modifiable"], outputs: ["modified"] }, { kind: "component", type: i9.ProgressDisplayComponent, selector: "hvy-progress-display", inputs: ["progress"] }, { kind: "pipe", type: i6.I18nPipe, name: "i18n" }, { kind: "pipe", type: i10.ForDatetimeLocalPipe, name: "forDateTimeLocal" }] }); }
|
|
251
308
|
}
|
|
252
309
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.1.3", ngImport: i0, type: EventDetailComponent, decorators: [{
|
|
253
310
|
type: Component,
|
|
254
|
-
args: [{ selector: 'hvy-event-detail', template: "<div class=\"o-hvy-events-detail\">\n <div class=\"o-hvy-events-detail__header\">\n <div class=\"o-hvy-events-detail__header__split\">\n <h1>{{ '@hvy.event.detail' | i18n }}</h1>\n @if (events.length > 1) {\n <button class=\"a-btn a-btn--secondary -fix-right\" [disabled]=\"!canCloseSome\"\n (click)=\"closeAll()\">{{ '@hvy.event.log.event.close' | i18n }}\n </button>\n }\n </div>\n <div class=\"o-hvy-events-detail__header__split\">\n <button class=\"a-btn a-btn--secondary\">{{ '@hvy.event.log.procedure.delete' | i18n }}</button>\n </div>\n </div>\n <div class=\"o-hvy-events-detail__container\">\n <div class=\"o-hvy-events-detail__container__scrollable\">\n <div class=\"o-hvy-events-detail__events\">\n @for (event of events;track event.id;let idx = $index) {\n <div class=\"o-hvy-events-detail__events__event\">\n <div class=\"o-hvy-events-detail__events__event__header\">\n <pry-icon [iconSvg]=\"!opened[idx] ? 'chevron_bottom' : 'chevron_top'\" (click)=\"toggle(idx)\"></pry-icon>\n <hvy-icon-display [event]=\"event\"></hvy-icon-display>\n <h2>{{ event.name }}</h2>\n <hvy-status-display [event]=\"event\" [modifiable]=\"event.status !== 'DONE'\"\n (modified)=\"changeStatus($event, event)\"></hvy-status-display>\n </div>\n <div class=\"o-hvy-events-detail__events__event__content\">\n @if (!opened[idx]) {\n <div>{{ '@hvy.event.log.event.description' | i18n }}: {{ event.description }}</div>\n <div>{{ '@hvy.event.log.event.address' | i18n }}: {{ event.address }}</div>\n } @else {\n @if (access(event);as accessValue) {\n <h3>{{ '@hvy.event.log.event.detail' | i18n }}</h3>\n <table>\n <tbody>\n <tr>\n <td>{{ '@hvy.event.log.event.name' | i18n }}<span class=\"required\">*</span></td>\n <td><input type=\"text\" class=\"a-form-field\" [class.-error]=\"hasError('name', idx)\"\n [value]=\"event.name\"\n (change)=\"modifyEvent(idx, 'name', $event)\" [readonly]=\"accessValue.name\"></td>\n </tr>\n <tr>\n <td>{{ '@hvy.event.log.event.category' | i18n }}<span class=\"required\">*</span></td>\n <td>\n <pry-select [ngModel]=\"event.category\"\n [items]=\"categories(event)\"\n [class.-error]=\"hasError('category', idx)\"\n (ngModelChange)=\"modifyEvent(idx, 'category', $event)\"\n i18nPrefix=\"@hvy.event.category.\" [disabled]=\"accessValue.category\"></pry-select>\n </td>\n </tr>\n <tr>\n <td>{{ '@hvy.event.criticality.name' | i18n }}<span class=\"required\">*</span></td>\n <td>\n <pry-select [ngModel]=\"event.criticality\" [items]=\"criticalities\"\n [class.-error]=\"hasError('criticality', idx)\"\n i18nPrefix=\"@hvy.event.criticality.\"\n [disabled]=\"accessValue.criticality\"\n (ngModelChange)=\"modifyEvent(idx, 'criticality', $event)\"></pry-select>\n </td>\n </tr>\n <tr>\n <td>{{ '@hvy.event.log.event.description' | i18n }}<span class=\"required\">*</span></td>\n <td><textarea [ngModel]=\"event.description\" class=\"a-form-field\"\n [class.-error]=\"hasError('description', idx)\"\n [readonly]=\"accessValue.description\"\n (ngModelChange)=\"modifyEvent(idx, 'description', $event)\"></textarea></td>\n </tr>\n <tr>\n <td>{{ '@hvy.event.log.event.address' | i18n }}</td>\n <td><textarea [ngModel]=\"event.address\" class=\"a-form-field\"\n [class.-error]=\"hasError('address', idx)\"\n [readonly]=\"accessValue.address\"\n (ngModelChange)=\"modifyEvent(idx, 'address', $event)\"></textarea></td>\n </tr>\n @if (['ALERT', 'REPORT'].includes(event.type)) {\n <tr>\n <td>{{ '@hvy.event.source' | i18n }}</td>\n <td><input type=\"text\" class=\"a-form-field\" [value]=\"event.externalSourceRef ?? ''\"\n [class.-error]=\"hasError('source', idx)\"\n [readonly]=\"accessValue.source\" (change)=\"modifyEvent(idx, 'source', $event)\"></td>\n </tr>\n }\n <tr>\n <td>{{ '@hvy.event.equipment' | i18n }}</td>\n <td>\n <input type=\"text\" class=\"a-form-field\"\n [value]=\"event.equipment?.name ?? ''\"\n [class.-error]=\"hasError('equipment', idx)\"\n [readonly]=\"accessValue.eqName\"\n (change)=\"changeEquipment(idx, $event)\">\n </td>\n </tr>\n <tr>\n <td>{{ '@hvy.event.equipmentEntity' | i18n }}</td>\n <td><input type=\"text\" class=\"a-form-field\" [value]=\"event.equipment?.entity ?? ''\"\n readonly></td>\n </tr>\n <tr>\n <td>{{ '@hvy.event.domain.name' | i18n }}</td>\n <td>\n <pry-select [items]=\"DOMAINS\" [ngModel]=\"event.domain\" i18nPrefix=\"@hvy.event.domain.\"\n [class.-error]=\"hasError('domain', idx)\"\n (ngModelChange)=\"modifyEvent(idx, 'domain', $event)\"\n [disabled]=\"accessValue.domain\"\n ></pry-select>\n </td>\n </tr>\n <tr>\n <td>\n {{ '@hvy.event.startDate' | i18n }}\n @if (event.category === 'MANIFESTATION') {\n <span class=\"required\">*</span>\n }\n </td>\n <td>\n <input type=\"datetime-local\" class=\"a-form-field\"\n [value]=\"event.startDate | forDateTimeLocal\"\n [class.-error]=\"hasError('startDate', idx)\"\n [readonly]=\"accessValue.startDate\" (change)=\"modifyEvent(idx, 'startDate', $event)\">\n </td>\n </tr>\n <tr>\n <td>\n {{ '@hvy.event.endDate' | i18n }}\n @if (event.category === 'MANIFESTATION') {\n <span class=\"required\">*</span>\n }\n </td>\n <td>\n <input type=\"datetime-local\" class=\"a-form-field\"\n [value]=\"event.endDate | forDateTimeLocal\"\n [class.-error]=\"hasError('endDate', idx)\"\n [readonly]=\"accessValue.endDate\" (change)=\"modifyEvent(idx, 'endDate', $event)\">\n </td>\n </tr>\n <tr>\n <td>{{ '@hvy.event.creationDate' | i18n }}</td>\n <td>\n <input type=\"datetime-local\" class=\"a-form-field\"\n [value]=\"event.creationDate | forDateTimeLocal\"\n readonly>\n </td>\n </tr>\n <tr>\n <td>{{ '@hvy.event.lastModificationDate' | i18n }}</td>\n <td>\n <input type=\"datetime-local\" class=\"a-form-field\"\n [value]=\"event.lastModificationDate | forDateTimeLocal\" readonly>\n </td>\n </tr>\n <tr>\n <td>{{ '@hvy.event.closeDate' | i18n }}</td>\n <td>\n <input type=\"datetime-local\" class=\"a-form-field\" [value]=\"event.closeDate | forDateTimeLocal\"\n readonly>\n </td>\n </tr>\n </tbody>\n </table>\n <div class=\"o-hvy-events-detail__events__event__content__comments\">\n <h3>{{ '@hvy.event.log.event.comments.name' | i18n }}</h3>\n <textarea [placeholder]=\"('@hvy.event.log.event.comments.placeholder' | i18n) + '...'\"\n [(ngModel)]=\"newComentContent\"></textarea>\n <div class=\"o-hvy-events-detail__events__event__content__comments__button\">\n <button class=\"a-btn a-btn--primary\"\n [disabled]=\"newComentContent.length === 0\">{{ '@hvy.action.comment' | i18n }}\n </button>\n </div>\n </div>\n }\n }\n </div>\n </div>\n }\n </div>\n <div class=\"o-hvy-events-detail__procedure\">\n <div class=\"o-hvy-events-detail__procedure__header\">\n <h2>{{ (events.length === 1 ? '@hvy.event.log.procedure.name1' : '@hvy.event.log.procedure.name') | i18n }}</h2>\n </div>\n @if (procedure) {\n <div>\n <p>{{ procedure.name }}</p>\n </div>\n <div class=\"o-hvy-events-detail__procedure__progress\">\n <p>{{ '@hvy.event.log.procedure.progress' | i18n }}</p>\n <hvy-progress-display [progress]=\"procedure.progress\"></hvy-progress-display>\n </div>\n <div class=\"o-hvy-events-detail__procedure__actions\" (drag)=\"move($event)\" (drop)=\"drop($event)\" (dragover)=\"allowDrop($event)\">\n @for (action of procedure.actions;track action.id;let idx = $index) {\n <div class=\"o-hvy-events-detail__procedure__actions__action\" [draggable]=\"true\" (dragstart)=\"dragStart($event, action, idx)\" (mousedown)=\"onMouseDown($event)\">\n <pry-icon iconSvg=\"six_dot\" #handle></pry-icon>\n <pry-checkbox [ngModel]=\"action.status === 'DONE'\"></pry-checkbox>\n <div>{{ action.name }}</div>\n <pry-icon iconSvg=\"more_horiz\"></pry-icon>\n </div>\n } @empty {\n <div>\n {{ '@hvy.event.log.procedure.noAction' | i18n }}\n </div>\n }\n </div>\n <div>\n <button class=\"a-btn a-btn--primary\">\n <pry-icon iconSvg=\"add\"></pry-icon>\n {{ '@hvy.event.log.procedure.addAction' | i18n }}\n </button>\n </div>\n } @else {\n <button class=\"a-btn a-btn--secondary\">\n {{ '@chh.actions.associate' | i18n }}\n </button>\n }\n </div>\n </div>\n </div>\n</div>\n" }]
|
|
255
|
-
}], ctorParameters: () => [{ type: i1.EquipmentService }, { type: i2.Store }], propDecorators: { modifiedEvents: [{
|
|
311
|
+
args: [{ selector: 'hvy-event-detail', template: "<div class=\"o-hvy-events-detail\">\n <div class=\"o-hvy-events-detail__header\">\n <div class=\"o-hvy-events-detail__header__split\">\n <h1>{{ '@hvy.event.detail' | i18n }}</h1>\n @if (events.length > 1) {\n <button class=\"a-btn a-btn--secondary -fix-right\" [disabled]=\"!canCloseSome\"\n (click)=\"closeAll()\">{{ (canCloseSome ? '@hvy.event.log.event.close' : '@hvy.event.log.event.closed') | i18n }}\n </button>\n @if (!canCloseSome) {\n <div\n class=\"a-tooltip\"\n [attr.data-tooltip]=\"'... TODO: get closing comment ...'\"\n data-tooltip-position=\"bottom\">\n <pry-icon iconSvg=\"i\" [height]=\"18\" [width]=\"18\">i</pry-icon>\n </div>\n }\n }\n </div>\n <div class=\"o-hvy-events-detail__header__split\">\n <button class=\"a-btn a-btn--secondary\">{{ '@hvy.event.log.procedure.delete' | i18n }}</button>\n </div>\n </div>\n <div class=\"o-hvy-events-detail__container\">\n <div class=\"o-hvy-events-detail__container__scrollable\">\n <div class=\"o-hvy-events-detail__events\">\n @for (event of events; track event.id; let idx = $index) {\n <div class=\"o-hvy-events-detail__events__event\">\n <div class=\"o-hvy-events-detail__events__event__header\">\n <pry-icon [iconSvg]=\"!opened[idx] ? 'chevron_bottom' : 'chevron_top'\" (click)=\"toggle(idx)\"></pry-icon>\n <hvy-icon-display [event]=\"event\"></hvy-icon-display>\n <h2>{{ event.name }}</h2>\n <hvy-status-display [event]=\"event\" [modifiable]=\"event.status !== 'DONE'\"\n (modified)=\"changeStatus($event, event)\"></hvy-status-display>\n </div>\n <div class=\"o-hvy-events-detail__events__event__content\">\n @if (!opened[idx]) {\n <div>{{ '@hvy.event.log.event.description' | i18n }}: {{ event.description }}</div>\n <div>{{ '@hvy.event.log.event.address' | i18n }}: {{ event.address }}</div>\n } @else {\n @if (access(event); as accessValue) {\n <h3>{{ '@hvy.event.log.event.detail' | i18n }}</h3>\n <table>\n <tbody>\n <tr>\n <td>{{ '@hvy.event.log.event.name' | i18n }}<span class=\"required\">*</span></td>\n <td><input type=\"text\" class=\"a-form-field\" [class.-error]=\"hasError('name', idx)\"\n [value]=\"event.name\"\n (change)=\"modifyEvent(idx, 'name', $event)\" [readonly]=\"accessValue.name\"></td>\n </tr>\n <tr>\n <td>{{ '@hvy.event.log.event.category' | i18n }}<span class=\"required\">*</span></td>\n <td>\n <pry-select [ngModel]=\"event.category\"\n [items]=\"categories(event)\"\n [class.-error]=\"hasError('category', idx)\"\n (ngModelChange)=\"modifyEvent(idx, 'category', $event)\"\n i18nPrefix=\"@hvy.event.category.\" [disabled]=\"accessValue.category\"></pry-select>\n </td>\n </tr>\n <tr>\n <td>{{ '@hvy.event.criticality.name' | i18n }}<span class=\"required\">*</span></td>\n <td>\n <pry-select [ngModel]=\"event.criticality\" [items]=\"criticalities\"\n [class.-error]=\"hasError('criticality', idx)\"\n i18nPrefix=\"@hvy.event.criticality.\"\n [disabled]=\"accessValue.criticality\"\n (ngModelChange)=\"modifyEvent(idx, 'criticality', $event)\"></pry-select>\n </td>\n </tr>\n <tr>\n <td>{{ '@hvy.event.log.event.description' | i18n }}<span class=\"required\">*</span></td>\n <td><textarea [ngModel]=\"event.description\" class=\"a-form-field\"\n [class.-error]=\"hasError('description', idx)\"\n [readonly]=\"accessValue.description\"\n (ngModelChange)=\"modifyEvent(idx, 'description', $event)\"></textarea></td>\n </tr>\n <tr>\n <td>{{ '@hvy.event.log.event.address' | i18n }}</td>\n <td><textarea [ngModel]=\"event.address\" class=\"a-form-field\"\n [class.-error]=\"hasError('address', idx)\"\n [readonly]=\"accessValue.address\"\n (ngModelChange)=\"modifyEvent(idx, 'address', $event)\"></textarea></td>\n </tr>\n @if (['ALERT', 'REPORT'].includes(event.type)) {\n <tr>\n <td>{{ '@hvy.event.source' | i18n }}</td>\n <td><input type=\"text\" class=\"a-form-field\" [value]=\"event.externalSourceRef ?? ''\"\n [class.-error]=\"hasError('source', idx)\"\n [readonly]=\"accessValue.source\" (change)=\"modifyEvent(idx, 'source', $event)\"></td>\n </tr>\n }\n <tr>\n <td>{{ '@hvy.event.equipment' | i18n }}</td>\n <td>\n <input type=\"text\" class=\"a-form-field\"\n [value]=\"event.equipment?.name ?? ''\"\n [class.-error]=\"hasError('equipment', idx)\"\n [readonly]=\"accessValue.eqName\"\n (change)=\"changeEquipment(idx, $event)\">\n </td>\n </tr>\n <tr>\n <td>{{ '@hvy.event.equipmentEntity' | i18n }}</td>\n <td><input type=\"text\" class=\"a-form-field\" [value]=\"event.equipment?.entity ?? ''\"\n readonly></td>\n </tr>\n <tr>\n <td>{{ '@hvy.event.domain.name' | i18n }}</td>\n <td>\n <pry-select [items]=\"DOMAINS\" [ngModel]=\"event.domain\" i18nPrefix=\"@hvy.event.domain.\"\n [class.-error]=\"hasError('domain', idx)\"\n (ngModelChange)=\"modifyEvent(idx, 'domain', $event)\"\n [disabled]=\"accessValue.domain\"\n ></pry-select>\n </td>\n </tr>\n <tr>\n <td>\n {{ '@hvy.event.startDate' | i18n }}\n @if (event.category === 'MANIFESTATION') {\n <span class=\"required\">*</span>\n }\n </td>\n <td>\n <input type=\"datetime-local\" class=\"a-form-field\"\n [value]=\"event.startDate | forDateTimeLocal\"\n [class.-error]=\"hasError('startDate', idx)\"\n [readonly]=\"accessValue.startDate\" (change)=\"modifyEvent(idx, 'startDate', $event)\">\n </td>\n </tr>\n <tr>\n <td>\n {{ '@hvy.event.endDate' | i18n }}\n @if (event.category === 'MANIFESTATION') {\n <span class=\"required\">*</span>\n }\n </td>\n <td>\n <input type=\"datetime-local\" class=\"a-form-field\"\n [value]=\"event.endDate | forDateTimeLocal\"\n [class.-error]=\"hasError('endDate', idx)\"\n [readonly]=\"accessValue.endDate\" (change)=\"modifyEvent(idx, 'endDate', $event)\">\n </td>\n </tr>\n <tr>\n <td>{{ '@hvy.event.creationDate' | i18n }}</td>\n <td>\n <input type=\"datetime-local\" class=\"a-form-field\"\n [value]=\"event.creationDate | forDateTimeLocal\"\n readonly>\n </td>\n </tr>\n <tr>\n <td>{{ '@hvy.event.lastModificationDate' | i18n }}</td>\n <td>\n <input type=\"datetime-local\" class=\"a-form-field\"\n [value]=\"event.lastModificationDate | forDateTimeLocal\" readonly>\n </td>\n </tr>\n <tr>\n <td>{{ '@hvy.event.closeDate' | i18n }}</td>\n <td>\n <input type=\"datetime-local\" class=\"a-form-field\" [value]=\"event.closeDate | forDateTimeLocal\"\n readonly>\n </td>\n </tr>\n </tbody>\n </table>\n <div class=\"o-hvy-events-detail__events__event__content__comments\">\n <h3>{{ '@hvy.event.log.event.comments.name' | i18n }}</h3>\n <textarea [placeholder]=\"('@hvy.event.log.event.comments.placeholder' | i18n) + '...'\"\n [(ngModel)]=\"newComentContent\"></textarea>\n <div class=\"o-hvy-events-detail__events__event__content__comments__button\">\n <button class=\"a-btn a-btn--primary\"\n [disabled]=\"newComentContent.length === 0\">{{ '@hvy.action.comment' | i18n }}\n </button>\n </div>\n </div>\n }\n }\n </div>\n </div>\n }\n </div>\n <div class=\"o-hvy-events-detail__procedure\">\n <div class=\"o-hvy-events-detail__procedure__header\">\n <h2>{{ (events.length === 1 ? '@hvy.event.log.procedure.name1' : '@hvy.event.log.procedure.name') | i18n }}</h2>\n </div>\n @if (procedure) {\n <div>\n <p>{{ procedure.name }}</p>\n </div>\n <div class=\"o-hvy-events-detail__procedure__progress\">\n <p>{{ '@hvy.event.log.procedure.progress' | i18n }}</p>\n <hvy-progress-display [progress]=\"procedure.progress\"></hvy-progress-display>\n </div>\n <div class=\"o-hvy-events-detail__procedure__actions\" (drag)=\"move($event)\" (drop)=\"drop($event)\"\n (dragover)=\"allowDrop($event)\">\n @for (action of procedure.actions; track action.id; let idx = $index) {\n <div class=\"o-hvy-events-detail__procedure__actions__action\" [draggable]=\"true\"\n (dragstart)=\"dragStart($event, action, idx)\" (mousedown)=\"onMouseDown($event)\">\n <pry-icon iconSvg=\"six_dot\" #handle></pry-icon>\n <pry-checkbox [ngModel]=\"action.status === 'DONE'\"></pry-checkbox>\n <div>{{ action.name }}</div>\n <pry-icon iconSvg=\"more_horiz\"></pry-icon>\n </div>\n } @empty {\n <div>\n {{ '@hvy.event.log.procedure.noAction' | i18n }}\n </div>\n }\n </div>\n <div>\n <button class=\"a-btn a-btn--primary\">\n <pry-icon iconSvg=\"add\"></pry-icon>\n {{ '@hvy.event.log.procedure.addAction' | i18n }}\n </button>\n </div>\n } @else {\n <button class=\"a-btn a-btn--secondary\">\n {{ '@hvy.action.associate' | i18n }}\n </button>\n }\n </div>\n </div>\n </div>\n</div>\n\n<ng-template #confirmDialog>\n <div\n class=\"o-hvy-close-confirm__dialog\"\n aria-labelledby=\"confirm\"\n tabindex=\"-1\"\n id=\"choice\"\n role=\"dialog\"\n aria-modal=\"true\"\n >\n <h2>{{ (changeStatusContext.events.length === 1 ? '@hvy.event.close.one' : '@hvy.event.close.multi') | i18n }}</h2>\n <ul>\n @for (event of changeStatusContext.events; track event.id) {\n <li>{{ event.name }}</li>\n }\n </ul>\n <p class=\"o-hvy-close-confirm__dialog__comment-title\">\n {{ '@hvy.event.close.comment' | i18n }}<span class=\"required\">*</span>:\n </p>\n <div class=\"o-hvy-close-confirm__dialog__comment\">\n <textarea [(ngModel)]=\"changeStatusContext.comment\" class=\"a-form-field\"></textarea>\n </div>\n <div class=\"o-hvy-close-confirm__dialog__actions\">\n <button class=\"a-btn a-btn--primary\" (click)=\"confirmedClose()\"\n [disabled]=\"confirmDisabled()\">{{ '@hvy.action.validate' | i18n }}\n </button>\n <button class=\"a-btn a-btn--secondary\" (click)=\"toggleConfirm()\">{{ '@hvy.action.cancel' | i18n }}</button>\n </div>\n </div>\n</ng-template>\n" }]
|
|
312
|
+
}], ctorParameters: () => [{ type: i1.EquipmentService }, { type: i2.Store }, { type: i3.Overlay }, { type: i0.ViewContainerRef }], propDecorators: { modifiedEvents: [{
|
|
256
313
|
type: Output
|
|
257
314
|
}], modifiedProcedure: [{
|
|
258
315
|
type: Output
|
|
259
316
|
}], eventErrors: [{
|
|
260
317
|
type: Output
|
|
318
|
+
}], confirmDialog: [{
|
|
319
|
+
type: ViewChild,
|
|
320
|
+
args: ['confirmDialog', { read: TemplateRef }]
|
|
261
321
|
}], events: [{
|
|
262
322
|
type: Input
|
|
263
323
|
}], procedure: [{
|
|
@@ -265,4 +325,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.1.3", ngImpor
|
|
|
265
325
|
}], cancelModifications: [{
|
|
266
326
|
type: Input
|
|
267
327
|
}] } });
|
|
268
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXZlbnQtZGV0YWlsLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3Byb3ZvbHkvaHlwZXJ2aXNvci9zcmMvbGliL2V2ZW50L2RldGFpbC9ldmVudC1kZXRhaWwuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvcHJvdm9seS9oeXBlcnZpc29yL3NyYy9saWIvZXZlbnQvZGV0YWlsL2V2ZW50LWRldGFpbC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLFlBQVksRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBR3ZFLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLDhDQUE4QyxDQUFDO0FBQ25GLE9BQU8sRUFBRSx3QkFBd0IsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBRzlELE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQztBQUN2RCxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSwyQ0FBMkMsQ0FBQztBQUMvRSxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0saUNBQWlDLENBQUM7Ozs7Ozs7Ozs7O0FBUS9ELE1BQU0sT0FBTyxvQkFBcUIsU0FBUSx3QkFBd0I7YUFDekQsZ0JBQVcsR0FBRyxFQUFFLEFBQUwsQ0FBTTtJQXFCeEIsSUFBYSxNQUFNLENBQUMsTUFBeUI7UUFDM0MsSUFBSSxDQUFDLE9BQU8sR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQ3pDLElBQUksQ0FBQyxrQkFBa0IsR0FBRyxJQUFJLEtBQUssQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ3pELElBQUksQ0FBQyxNQUFNLEdBQUcsSUFBSSxD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O1FBQ3JCLE1BQU0sQ0FBQyxjQUFjLEVBQUUsQ0FBQztRQUN4QixJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ2xCLElBQUksQ0FBQyxZQUFZLEdBQUcsU0FBUyxDQUFDO1FBQzlCLElBQUksQ0FBQyxvQkFBb0IsRUFBRSxDQUFDO0lBQzlCLENBQUM7SUFFRCxTQUFTLENBQUMsTUFBa0I7UUFDMUIsTUFBTSxDQUFDLGNBQWMsRUFBRSxDQUFDO0lBQzFCLENBQUM7OEdBOVBVLG9CQUFvQjtrR0FBcEIsb0JBQW9CLG9TQ2pCakMsNnVYQXlOQTs7MkZEeE1hLG9CQUFvQjtrQkFKaEMsU0FBUzsrQkFDRSxrQkFBa0I7eUdBU2xCLGNBQWM7c0JBQXZCLE1BQU07Z0JBR0csaUJBQWlCO3NCQUExQixNQUFNO2dCQUVHLFdBQVc7c0JBQXBCLE1BQU07Z0JBV00sTUFBTTtzQkFBbEIsS0FBSztnQkFPTyxTQUFTO3NCQUFyQixLQUFLO2dCQUtPLG1CQUFtQjtzQkFBL0IsS0FBSyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgRXZlbnRFbWl0dGVyLCBJbnB1dCwgT3V0cHV0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBIeXBQcm9jZWR1cmUgfSBmcm9tICcuLi8uLi9tb2RlbC9oeXAtcHJvY2VkdXJlLmludGVyZmFjZSc7XG5pbXBvcnQgeyBIeXBFdmVudERldGFpbHMgfSBmcm9tICcuLi8uLi9tb2RlbC9ldmVudC9oeXAtZXZlbnQtZGV0YWlsLmludGVyZmFjZSc7XG5pbXBvcnQgeyBIeXBFdmVudENyaXRpY2FsaXR5IH0gZnJvbSAnLi4vLi4vbW9kZWwvZXZlbnQvaHlwLWV2ZW50LWNyaXRpY2FsaXR5LnR5cGUnO1xuaW1wb3J0IHsgU3Vic2NyaXB0aW9ubmVyRGlyZWN0aXZlIH0gZnJvbSAnQHByb3ZvbHkvZGFzaGJvYXJkJztcbmltcG9ydCB7IEh5cEVxdWlwbWVudCB9IGZyb20gJy4uLy4uL21vZGVsL2h5cC1lcXVpcG1lbnQuaW50ZXJmYWNlJztcbmltcG9ydCB7IEVxdWlwbWVudFNlcnZpY2UgfSBmcm9tICcuLi8uLi9zdG9yZS9lcXVpcG1lbnQvZXF1aXBtZW50LnNlcnZpY2UnO1xuaW1wb3J0IHsgRE9NQUlOUyB9IGZyb20gJy4uLy4uL21vZGVsL2RvbWFpbnMuY29uc3RhbnQnO1xuaW1wb3J0IHsgQ0FURUdPUklFU19CWV9UWVBFIH0gZnJvbSAnLi4vLi4vbW9kZWwvZXZlbnQvaHlwLWV2ZW50LWNhdGVnb3J5LnR5cGUnO1xuaW1wb3J0IHsgRXZlbnRBY3Rpb25zIH0gZnJvbSAnLi4vLi4vc3RvcmUvZXZlbnQvZXZlbnQuYWN0aW9ucyc7XG5pbXBvcnQgeyBTdG9yZSB9IGZyb20gJ0BuZ3J4L3N0b3JlJztcbmltcG9ydCB7IEh5cEFjdGlvbiB9IGZyb20gJy4uLy4uL21vZGVsL2h5cC1hY3Rpb24uaW50ZXJmYWNlJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnaHZ5LWV2ZW50LWRldGFpbCcsXG4gIHRlbXBsYXRlVXJsOiAnLi9ldmVudC1kZXRhaWwuY29tcG9uZW50Lmh0bWwnLFxufSlcbmV4cG9ydCBjbGFzcyBFdmVudERldGFpbENvbXBvbmVudCBleHRlbmRzIFN1YnNjcmlwdGlvbm5lckRpcmVjdGl2ZSB7XG4gIHN0YXRpYyBDQVJEX0hFSUdIVCA9IDc1O1xuICBvcGVuZWQ6IGJvb2xlYW5bXSA9IFtdO1xuICBjcml0aWNhbGl0aWVzID0gSHlwRXZlbnRDcml0aWNhbGl0eS52YWx1ZXM7XG4gIF9ldmVudHM6IEh5cEV2ZW50RGV0YWlsc1tdID0gW107XG4gIGV2ZW50TW9kaWZpY2F0aW9uczogUGFydGlhbDxIeXBFdmVudERldGFpbHM+W10gPSBbXTtcbiAgQE91dHB1dCgpIG1vZGlmaWVkRXZlbnRzID0gbmV3IEV2ZW50RW1pdHRlcjxbUGFydGlhbDxIeXBFdmVudERldGFpbHM+LCBIeXBFdmVudERldGFpbHNdW10+KCk7XG4gIF9wcm9jZWR1cmU/OiBIeXBQcm9jZWR1cmU7XG4gIHByb2NlZHVyZU1vZGlmaWNhdGlvbnM6IFBhcnRpYWw8SHlwUHJvY2VkdXJlPiA9IHt9O1xuICBAT3V0cHV0KCkgbW9kaWZpZWRQcm9jZWR1cmUgPSBuZXcgRXZlbnRFbWl0dGVyPFtQYXJ0aWFsPEh5cFByb2NlZHVyZT4sIEh5cFByb2NlZHVyZV0gfCB1bmRlZmluZWQ+KCk7XG4gIHByb3RlY3RlZCByZWFkb25seSBET01BSU5TID0gRE9NQUlOUy52YWx1ZXM7XG4gIEBPdXRwdXQoKSBldmVudEVycm9ycyA9IG5ldyBFdmVudEVtaXR0ZXI8eyBmaWVsZDogc3RyaW5nOyBjb2RlOiBzdHJpbmcgfVtdW10+KCk7XG4gIGVycm9yczogeyBmaWVsZDogc3RyaW5nOyBjb2RlOiBzdHJpbmcgfVtdW10gPSBbXTtcbiAgY2FuQ2xvc2VTb21lID0gZmFsc2U7XG4gIG5ld0NvbWVudENvbnRlbnQgPSAnJztcbiAgbW92aW5nQWN0aW9uPzogSHlwQWN0aW9uO1xuICBtb3ZlU3RhcnQgPSAwO1xuICBtb3ZlSW5pdGlhbEluZGV4ID0gMDtcbiAgaW5pdGlhbEFjdGlvbkxpc3Q6IEh5cEFjdGlvbltdID0gW107XG4gIHByZXZpb3VzT2Zmc2V0ID0gMDtcbiAgZHJhZ1RhcmdldD86IEV2ZW50VGFyZ2V0IHwgbnVsbDtcblxuICBASW5wdXQoKSBzZXQgZXZlbnRzKGV2ZW50czogSHlwRXZlbnREZXRhaWxzW10pIHtcbiAgICB0aGlzLl9ldmVudHMgPSBldmVudHMuZmlsdGVyKGV2ID0+ICEhZXYpO1xuICAgIHRoaXMuZXZlbnRNb2RpZmljYXRpb25zID0gbmV3IEFycmF5KHRoaXMuX2V2ZW50cy5sZW5ndGgpO1xuICAgIHRoaXMub3BlbmVkID0gdGhpcy5fZXZlbnRzLmxlbmd0aCA9PT0gMSA/IFt0cnVlXSA6IFtdO1xuICAgIHRoaXMuY2FuQ2xvc2VTb21lID0gdGhpcy5fZXZlbnRzLmZpbHRlcihldiA9PiBldi5zdGF0dXMgIT09ICdET05FJykubGVuZ3RoID4gMDtcbiAgfTtcblxuICBASW5wdXQoKSBzZXQgcHJvY2VkdXJlKHByb2NlZHVyZTogSHlwUHJvY2VkdXJlKSB7XG4gICAgdGhpcy5fcHJvY2VkdXJlID0gcHJvY2VkdXJlO1xuICAgIHRoaXMucHJvY2VkdXJlTW9kaWZpY2F0aW9ucyA9IHt9O1xuICB9XG5cbiAgQElucHV0KCkgc2V0IGNhbmNlbE1vZGlmaWNhdGlvbnMoZXZ0OiBhbnkpIHtcbiAgICB0aGlzLmV2ZW50TW9kaWZpY2F0aW9ucyA9IG5ldyBBcnJheSh0aGlzLl9ldmVudHMubGVuZ3RoKTtcbiAgICB0aGlzLnByb2NlZHVyZU1vZGlmaWNhdGlvbnMgPSB7fTtcbiAgICB0aGlzLl9vdXRwdXRNb2RpZmljYXRpb25zKCk7XG4gIH1cblxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIGVxdWlwbWVudFNlcnZpY2U6IEVxdWlwbWVudFNlcnZpY2UsIHByaXZhdGUgc3RvcmU6IFN0b3JlKSB7XG4gICAgc3VwZXIoKTtcbiAgfVxuXG4gIGdldCBldmVudHMoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2V2ZW50cy5tYXAoKGV2dCwgaWR4KSA9PiAoeyAuLi5ldnQsIC4uLih0aGlzLmV2ZW50TW9kaWZpY2F0aW9uc1tpZHhdID8/IHt9KSB9KSk7XG4gIH1cblxuICBnZXQgcHJvY2VkdXJlKCk6IEh5cFByb2NlZHVyZSB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuX3Byb2NlZHVyZSA/ICh7XG4gICAgICAuLi50aGlzLl9wcm9jZWR1cmUsXG4gICAgICAuLi4odGhpcy5wcm9jZWR1cmVNb2RpZmljYXRpb25zID8/IHt9KSxcbiAgICAgIGV2ZW50czogdGhpcy5ldmVudHMsXG4gICAgfSkgOiB1bmRlZmluZWQ7XG4gIH1cblxuICB0b2dnbGUoaTogbnVtYmVyKSB7XG4gICAgdGhpcy5vcGVuZWRbaV0gPSAhdGhpcy5vcGVuZWRbaV07XG4gIH1cblxuICBtb2RpZnlFdmVudChpbmRleDogbnVtYmVyLCBwcm9wOiBzdHJpbmcsICRldmVudDogRXZlbnQgfCBzdHJpbmcpIHtcbiAgICBjb25zdCBpc0RhdGUgPSBwcm9wLmluZGV4T2YoJ0RhdGUnKSA+IC0xO1xuICAgIC8vIEB0cy1pZ25vcmVcbiAgICBjb25zdCBuZXdWYWx1ZSA9ICRldmVudCBpbnN0YW5jZW9mIEV2ZW50ID8gJGV2ZW50LnRhcmdldD8udmFsdWUgOiAkZXZlbnQ7XG5cbiAgICBjb25zdCBjb3JyZWN0ZWRWYWx1ZSA9ICFpc0RhdGUgPyBuZXdWYWx1ZSA6IGAke25ld1ZhbHVlfTowMC4wMDAwMDBaYDtcbiAgICAvLyBAdHMtaWdub3JlXG4gICAgaWYgKHRoaXMuZXZlbnRzW2luZGV4XVtwcm9wXSAhPT0gY29ycmVjdGVkVmFsdWUpIHtcblxuICAgICAgaWYgKCF0aGlzLmV2ZW50TW9kaWZpY2F0aW9uc1tpbmRleF0pIHtcbiAgICAgICAgdGhpcy5ldmVudE1vZGlmaWNhdGlvbnNbaW5kZXhdID0ge307XG4gICAgICB9XG4gICAgICAvLyBAdHMtaWdub3JlXG4gICAgICB0aGlzLmV2ZW50TW9kaWZpY2F0aW9uc1tpbmRleF1bcHJvcF0gPSBjb3JyZWN0ZWRWYWx1ZTtcblxuICAgICAgdGhpcy5fb3V0cHV0TW9kaWZpY2F0aW9ucygpO1xuICAgIH1cbiAgfVxuXG4gIGFjY2VzcyhldmVudDogSHlwRXZlbnREZXRhaWxzKSB7XG4gICAgaWYgKGV2ZW50LnN0YXR1cyA9PT0gJ0RPTkUnKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBuYW1lOiB0cnVlLFxuICAgICAgICBjYXRlZ29yeTogdHJ1ZSxcbiAgICAgICAgY3JpdGljYWxpdHk6IHRydWUsXG4gICAgICAgIGRlc2NyaXB0aW9uOiB0cnVlLFxuICAgICAgICBhZGRyZXNzOiB0cnVlLFxuICAgICAgICBzb3VyY2U6IHRydWUsXG4gICAgICAgIGRvbWFpbjogdHJ1ZSxcbiAgICAgICAgZXFOYW1lOiB0cnVlLFxuICAgICAgICBlcUVudGl0eTogdHJ1ZSxcbiAgICAgICAgc3RhcnREYXRlOiB0cnVlLFxuICAgICAgICBlbmREYXRlOiB0cnVlLFxuICAgICAgfTtcbiAgICB9XG4gICAgc3dpdGNoIChldmVudC50eXBlKSB7XG4gICAgICBjYXNlICdBTEVSVCc6XG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIG5hbWU6IHRydWUsXG4gICAgICAgICAgY2F0ZWdvcnk6IHRydWUsXG4gICAgICAgICAgY3JpdGljYWxpdHk6IHRydWUsXG4gICAgICAgICAgZGVzY3JpcHRpb246IHRydWUsXG4gICAgICAgICAgYWRkcmVzczogdHJ1ZSxcbiAgICAgICAgICBzb3VyY2U6IHRydWUsXG4gICAgICAgICAgZG9tYWluOiB0cnVlLFxuICAgICAgICAgIGVxTmFtZTogdHJ1ZSxcbiAgICAgICAgICBlcUVudGl0eTogdHJ1ZSxcbiAgICAgICAgICBzdGFydERhdGU6IHRydWUsXG4gICAgICAgICAgZW5kRGF0ZTogdHJ1ZSxcbiAgICAgICAgfTtcbiAgICAgIGNhc2UgJ1JFUE9SVCc6XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgbmFtZTogZmFsc2UsXG4gICAgICAgICAgY2F0ZWdvcnk6IHRydWUsXG4gICAgICAgICAgY3JpdGljYWxpdHk6IGZhbHNlLFxuICAgICAgICAgIGRlc2NyaXB0aW9uOiB0cnVlLFxuICAgICAgICAgIGFkZHJlc3M6IGZhbHNlLFxuICAgICAgICAgIHNvdXJjZTogdHJ1ZSxcbiAgICAgICAgICBkb21haW46IGZhbHNlLFxuICAgICAgICAgIGVxTmFtZTogZmFsc2UsXG4gICAgICAgICAgZXFFbnRpdHk6IHRydWUsXG4gICAgICAgICAgc3RhcnREYXRlOiB0cnVlLFxuICAgICAgICAgIGVuZERhdGU6IHRydWUsXG4gICAgICAgIH07XG4gICAgICBjYXNlICdPUEVSQVRPUic6XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgbmFtZTogZmFsc2UsXG4gICAgICAgICAgY2F0ZWdvcnk6IGZhbHNlLFxuICAgICAgICAgIGNyaXRpY2FsaXR5OiBmYWxzZSxcbiAgICAgICAgICBkZXNjcmlwdGlvbjogZmFsc2UsXG4gICAgICAgICAgYWRkcmVzczogZmFsc2UsXG4gICAgICAgICAgc291cmNlOiBmYWxzZSxcbiAgICAgICAgICBkb21haW46IGZhbHNlLFxuICAgICAgICAgIGVxTmFtZTogZmFsc2UsXG4gICAgICAgICAgZXFFbnRpdHk6IGZhbHNlLFxuICAgICAgICAgIHN0YXJ0RGF0ZTogZmFsc2UsXG4gICAgICAgICAgZW5kRGF0ZTogZmFsc2UsXG4gICAgICAgIH07XG4gICAgfVxuICB9XG5cbiAgY2hhbmdlRXF1aXBtZW50KGluZGV4OiBudW1iZXIsICRldmVudDogYW55KSB7XG4gICAgdGhpcy5lcXVpcG1lbnRTZXJ2aWNlLmZpbmRCeU5hbWUoJGV2ZW50LnRhcmdldC52YWx1ZSkuc3Vic2NyaWJlKChlcXVpcG1lbnQ6IEh5cEVxdWlwbWVudCkgPT4ge1xuICAgICAgaWYgKGVxdWlwbWVudCAmJiB0aGlzLl9ldmVudHNbaW5kZXhdLm5hbWUgIT09IGVxdWlwbWVudC5uYW1lKSB7XG5cbiAgICAgICAgaWYgKCF0aGlzLmV2ZW50TW9kaWZpY2F0aW9uc1tpbmRleF0pIHtcbiAgICAgICAgICB0aGlzLmV2ZW50TW9kaWZpY2F0aW9uc1tpbmRleF0gPSB7fTtcbiAgICAgICAgfVxuICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgIHRoaXMuZXZlbnRNb2RpZmljYXRpb25zW2luZGV4XS5lcXVpcG1lbnQgPSBlcXVpcG1lbnQ7XG4gICAgICAgIHRoaXMuX291dHB1dE1vZGlmaWNhdGlvbnMoKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIF9vdXRwdXRNb2RpZmljYXRpb25zKCkge1xuICAgIHRoaXMudmFsaWRhdGVFdmVudHModGhpcy5ldmVudHMpO1xuICAgIHRoaXMubW9kaWZpZWRFdmVudHMubmV4dCh0aGlzLmV2ZW50cy5tYXAoKGV2LCBpZHgpID0+IFt0aGlzLmV2ZW50TW9kaWZpY2F0aW9uc1tpZHhdLCBldl0pKTtcbiAgICB0aGlzLm1vZGlmaWVkUHJvY2VkdXJlLm5leHQodGhpcy5wcm9jZWR1cmUgPyBbdGhpcy5wcm9jZWR1cmVNb2RpZmljYXRpb25zLCB0aGlzLnByb2NlZHVyZSFdIDogdW5kZWZpbmVkKTtcbiAgfVxuXG4gIHZhbGlkYXRlRXZlbnRzKGV2ZW50czogSHlwRXZlbnREZXRhaWxzW10pIHtcbiAgICB0aGlzLmVycm9ycyA9IFtdO1xuICAgIGV2ZW50cy5mb3JFYWNoKGV2ZW50ID0+IHtcbiAgICAgIGNvbnN0IGV2ZW50RXJyb3JzID0gW107XG4gICAgICBpZiAoIWV2ZW50Lm5hbWUgfHwgZXZlbnQubmFtZS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgZXZlbnRFcnJvcnMucHVzaCh7IGZpZWxkOiAnbmFtZScsIGNvZGU6ICdyZXF1aXJlZCcgfSk7XG4gICAgICB9XG4gICAgICBpZiAoIWV2ZW50LmNhdGVnb3J5IHx8IGV2ZW50LmNhdGVnb3J5Lmxlbmd0aCA9PT0gMCkge1xuICAgICAgICBldmVudEVycm9ycy5wdXNoKHsgZmllbGQ6ICdjYXRlZ29yeScsIGNvZGU6ICdyZXF1aXJlZCcgfSk7XG4gICAgICB9XG4gICAgICBpZiAoIWV2ZW50LmNyaXRpY2FsaXR5IHx8IGV2ZW50LmNyaXRpY2FsaXR5Lmxlbmd0aCA9PT0gMCkge1xuICAgICAgICBldmVudEVycm9ycy5wdXNoKHsgZmllbGQ6ICdjcml0aWNhbGl0eScsIGNvZGU6ICdyZXF1aXJlZCcgfSk7XG4gICAgICB9XG4gICAgICBpZiAoIWV2ZW50LmRlc2NyaXB0aW9uIHx8IGV2ZW50LmRlc2NyaXB0aW9uLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICBldmVudEVycm9ycy5wdXNoKHsgZmllbGQ6ICdkZXNjcmlwdGlvbicsIGNvZGU6ICdyZXF1aXJlZCcgfSk7XG4gICAgICB9XG4gICAgICBpZiAoZXZlbnQuY2F0ZWdvcnkgPT09ICdNQU5JRkVTVEFUSU9OJykge1xuICAgICAgICBpZiAoIWV2ZW50LnN0YXJ0RGF0ZSB8fCBldmVudC5zdGFydERhdGUubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgZXZlbnRFcnJvcnMucHVzaCh7IGZpZWxkOiAnc3RhcnREYXRlJywgY29kZTogJ3JlcXVpcmVkJyB9KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIWV2ZW50LmVuZERhdGUgfHwgZXZlbnQuZW5kRGF0ZS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICBldmVudEVycm9ycy5wdXNoKHsgZmllbGQ6ICdlbmREYXRlJywgY29kZTogJ3JlcXVpcmVkJyB9KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoKGV2ZW50LnN0YXJ0RGF0ZT8ubG9jYWxlQ29tcGFyZShldmVudC5lbmREYXRlID8/ICcnKSA/PyAwKSA+IDApIHtcbiAgICAgICAgICBldmVudEVycm9ycy5wdXNoKHsgZmllbGQ6ICdzdGFydERhdGUnLCBjb2RlOiAnYmVmb3JlJyB9KTtcbiAgICAgICAgICBldmVudEVycm9ycy5wdXNoKHsgZmllbGQ6ICdlbmREYXRlJywgY29kZTogJ2FmdGVyJyB9KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgdGhpcy5lcnJvcnMucHVzaChldmVudEVycm9ycyk7XG4gICAgfSk7XG4gICAgdGhpcy5ldmVudEVycm9ycy5uZXh0KHRoaXMuZXJyb3JzKTtcbiAgfVxuXG4gIGhhc0Vycm9yKHByb3A6IHN0cmluZywgaWR4OiBudW1iZXIpIHtcbiAgICByZXR1cm4gdGhpcy5lcnJvcnNbaWR4XT8uZmluZChlcnIgPT4gZXJyLmZpZWxkID09PSBwcm9wKSA/PyBmYWxzZTtcbiAgfVxuXG4gIGNhdGVnb3JpZXMoZXZlbnQ6IEh5cEV2ZW50RGV0YWlscykge1xuICAgIHJldHVybiBDQVRFR09SSUVTX0JZX1RZUEUudmFsdWVzW2V2ZW50LnR5cGVdO1xuICB9XG5cbiAgY2hhbmdlU3RhdHVzKCRldmVudDogc3RyaW5nLCBldmVudDogSHlwRXZlbnREZXRhaWxzKSB7XG4gICAgdGhpcy5zdG9yZS5kaXNwYXRjaChFdmVudEFjdGlvbnMuc3RhdHVzKHsgdGFyZ2V0U3RhdHVzOiAkZXZlbnQsIGV2ZW50OiBldmVudCB9KSk7XG4gIH1cblxuICBjbG9zZUFsbCgpIHtcbiAgICBpZiAoIXRoaXMucHJvY2VkdXJlKSB7XG4gICAgICB0aGlzLnN0b3JlLmRpc3BhdGNoKEV2ZW50QWN0aW9ucy5zdGF0dXMoeyB0YXJnZXRTdGF0dXM6ICdET05FJywgZXZlbnQ6IHRoaXMuZXZlbnRzWzBdIH0pKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5zdG9yZS5kaXNwYXRjaChFdmVudEFjdGlvbnMuc3RhdHVzKHsgdGFyZ2V0U3RhdHVzOiAnRE9ORScsIHByb2NlZHVyZTogdGhpcy5wcm9jZWR1cmUgfSkpO1xuICAgIH1cbiAgfVxuXG4gIG9uTW91c2VEb3duKCRldmVudDogTW91c2VFdmVudCkge1xuICAgIHRoaXMuZHJhZ1RhcmdldCA9ICRldmVudC50YXJnZXQ7XG4gIH1cblxuICBkcmFnU3RhcnQoJGV2ZW50OiBNb3VzZUV2ZW50LCBhY3Rpb246IEh5cEFjdGlvbiwgaW5kZXg6IG51bWJlcikge1xuICAgIGlmICh0aGlzLmRyYWdUYXJnZXQgJiYgKHRoaXMuZHJhZ1RhcmdldCBhcyBIVE1MRGl2RWxlbWVudCkuc3R5bGUubWFza0ltYWdlLmluZGV4T2YoJ3NpeF9kb3QnKSA+IC0xKSB7XG4gICAgICB0aGlzLm1vdmluZ0FjdGlvbiA9IGFjdGlvbjtcbiAgICAgIHRoaXMubW92ZVN0YXJ0ID0gJGV2ZW50LmNsaWVudFk7XG4gICAgICB0aGlzLm1vdmVJbml0aWFsSW5kZXggPSBpbmRleDtcbiAgICAgIHRoaXMuaW5pdGlhbEFjdGlvbkxpc3QgPSBbLi4udGhpcy5wcm9jZWR1cmUhLmFjdGlvbnNdO1xuICAgIH0gZWxzZSB7XG4gICAgICAkZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICB9XG4gIH1cblxuICBtb3ZlKCRldmVudDogTW91c2VFdmVudCkge1xuICAgICRldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIGlmICh0aGlzLm1vdmluZ0FjdGlvbikge1xuICAgICAgY29uc3Qgb2Zmc2V0SW5DYXJkcyA9IE1hdGgucm91bmQoKCRldmVudC5jbGllbnRZIC0gdGhpcy5tb3ZlU3RhcnQpIC8gRXZlbnREZXRhaWxDb21wb25lbnQuQ0FSRF9IRUlHSFQpO1xuICAgICAgaWYgKHRoaXMucHJldmlvdXNPZmZzZXQgIT09IG9mZnNldEluQ2FyZHMpIHtcbiAgICAgICAgdGhpcy5wcmV2aW91c09mZnNldCA9IG9mZnNldEluQ2FyZHM7XG4gICAgICAgIGNvbnN0IG5ld0luZGV4ID0gTWF0aC5taW4oTWF0aC5tYXgodGhpcy5tb3ZlSW5pdGlhbEluZGV4ICsgb2Zmc2V0SW5DYXJkcywgMCksIHRoaXMuaW5pdGlhbEFjdGlvbkxpc3QubGVuZ3RoIC0gMSk7XG4gICAgICAgIGNvbnN0IG5ld1RhYiA9IFsuLi50aGlzLmluaXRpYWxBY3Rpb25MaXN0XTtcbiAgICAgICAgY29uc3QgZWxlbWVudCA9IG5ld1RhYi5zcGxpY2UodGhpcy5tb3ZlSW5pdGlhbEluZGV4LCAxKVswXTtcbiAgICAgICAgbmV3VGFiLnNwbGljZShuZXdJbmRleCwgMCwgZWxlbWVudCk7XG4gICAgICAgIHRoaXMucHJvY2VkdXJlTW9kaWZpY2F0aW9ucy5hY3Rpb25zID0gbmV3VGFiO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGRyb3AoJGV2ZW50OiBNb3VzZUV2ZW50KSB7XG4gICAgJGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgdGhpcy5tb3ZlKCRldmVudCk7XG4gICAgdGhpcy5tb3ZpbmdBY3Rpb24gPSB1bmRlZmluZWQ7XG4gICAgdGhpcy5fb3V0cHV0TW9kaWZpY2F0aW9ucygpO1xuICB9XG5cbiAgYWxsb3dEcm9wKCRldmVudDogTW91c2VFdmVudCkge1xuICAgICRldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICB9XG59XG4iLCI8ZGl2IGNsYXNzPVwiby1odnktZXZlbnRzLWRldGFpbFwiPlxuICA8ZGl2IGNsYXNzPVwiby1odnktZXZlbnRzLWRldGFpbF9faGVhZGVyXCI+XG4gICAgPGRpdiBjbGFzcz1cIm8taHZ5LWV2ZW50cy1kZXRhaWxfX2hlYWRlcl9fc3BsaXRcIj5cbiAgICAgIDxoMT57eyAnQGh2eS5ldmVudC5kZXRhaWwnIHwgaTE4biB9fTwvaDE+XG4gICAgICBAaWYgKGV2ZW50cy5sZW5ndGggPiAxKSB7XG4gICAgICAgIDxidXR0b24gY2xhc3M9XCJhLWJ0biBhLWJ0bi0tc2Vjb25kYXJ5IC1maXgtcmlnaHRcIiBbZGlzYWJsZWRdPVwiIWNhbkNsb3NlU29tZVwiXG4gICAgICAgICAgICAgICAgKGNsaWNrKT1cImNsb3NlQWxsKClcIj57eyAnQGh2eS5ldmVudC5sb2cuZXZlbnQuY2xvc2UnIHwgaTE4biB9fVxuICAgICAgICA8L2J1dHRvbj5cbiAgICAgIH1cbiAgICA8L2Rpdj5cbiAgICA8ZGl2IGNsYXNzPVwiby1odnktZXZlbnRzLWRldGFpbF9faGVhZGVyX19zcGxpdFwiPlxuICAgICAgPGJ1dHRvbiBjbGFzcz1cImEtYnRuIGEtYnRuLS1zZWNvbmRhcnlcIj57eyAnQGh2eS5ldmVudC5sb2cucHJvY2VkdXJlLmRlbGV0ZScgfCBpMThuIH19PC9idXR0b24+XG4gICAgPC9kaXY+XG4gIDwvZGl2PlxuICA8ZGl2IGNsYXNzPVwiby1odnktZXZlbnRzLWRldGFpbF9fY29udGFpbmVyXCI+XG4gICAgPGRpdiBjbGFzcz1cIm8taHZ5LWV2ZW50cy1kZXRhaWxfX2NvbnRhaW5lcl9fc2Nyb2xsYWJsZVwiPlxuICAgICAgPGRpdiBjbGFzcz1cIm8taHZ5LWV2ZW50cy1kZXRhaWxfX2V2ZW50c1wiPlxuICAgICAgICBAZm9yIChldmVudCBvZiBldmVudHM7dHJhY2sgZXZlbnQuaWQ7bGV0IGlkeCA9ICRpbmRleCkge1xuICAgICAgICAgIDxkaXYgY2xhc3M9XCJvLWh2eS1ldmVudHMtZGV0YWlsX19ldmVudHNfX2V2ZW50XCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiby1odnktZXZlbnRzLWRldGFpbF9fZXZlbnRzX19ldmVudF9faGVhZGVyXCI+XG4gICAgICAgICAgICAgIDxwcnktaWNvbiBbaWNvblN2Z109XCIhb3BlbmVkW2lkeF0gPyAnY2hldnJvbl9ib3R0b20nIDogJ2NoZXZyb25fdG9wJ1wiIChjbGljayk9XCJ0b2dnbGUoaWR4KVwiPjwvcHJ5LWljb24+XG4gICAgICAgICAgICAgIDxodnktaWNvbi1kaXNwbGF5IFtldmVudF09XCJldmVudFwiPjwvaHZ5LWljb24tZGlzcGxheT5cbiAgICAgICAgICAgICAgPGgyPnt7IGV2ZW50Lm5hbWUgfX08L2gyPlxuICAgICAgICAgICAgICA8aHZ5LXN0YXR1cy1kaXNwbGF5IFtldmVudF09XCJldmVudFwiIFttb2RpZmlhYmxlXT1cImV2ZW50LnN0YXR1cyAhPT0gJ0RPTkUnXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobW9kaWZpZWQpPVwiY2hhbmdlU3RhdHVzKCRldmVudCwgZXZlbnQpXCI+PC9odnktc3RhdHVzLWRpc3BsYXk+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJvLWh2eS1ldmVudHMtZGV0YWlsX19ldmVudHNfX2V2ZW50X19jb250ZW50XCI+XG4gICAgICAgICAgICAgIEBpZiAoIW9wZW5lZFtpZHhdKSB7XG4gICAgICAgICAgICAgICAgPGRpdj57eyAnQGh2eS5ldmVudC5sb2cuZXZlbnQuZGVzY3JpcHRpb24nIHwgaTE4biB9fToge3sgZXZlbnQuZGVzY3JpcHRpb24gfX08L2Rpdj5cbiAgICAgICAgICAgICAgICA8ZGl2Pnt7ICdAaHZ5LmV2ZW50LmxvZy5ldmVudC5hZGRyZXNzJyB8IGkxOG4gfX06IHt7IGV2ZW50LmFkZHJlc3MgfX08L2Rpdj5cbiAgICAgICAgICAgICAgfSBAZWxzZSB7XG4gICAgICAgICAgICAgICAgQGlmIChhY2Nlc3MoZXZlbnQpO2FzIGFjY2Vzc1ZhbHVlKSB7XG4gICAgICAgICAgICAgICAgICA8aDM+e3sgJ0BodnkuZXZlbnQubG9nLmV2ZW50LmRldGFpbCcgfCBpMThuIH19PC9oMz5cbiAgICAgICAgICAgICAgICAgIDx0YWJsZT5cbiAgICAgICAgICAgICAgICAgICAgPHRib2R5PlxuICAgICAgICAgICAgICAgICAgICA8dHI+XG4gICAgICAgICAgICAgICAgICAgICAgPHRkPnt7ICdAaHZ5LmV2ZW50LmxvZy5ldmVudC5uYW1lJyB8IGkxOG4gfX08c3BhbiBjbGFzcz1cInJlcXVpcmVkXCI+Kjwvc3Bhbj48L3RkPlxuICAgICAgICAgICAgICAgICAgICAgIDx0ZD48aW5wdXQgdHlwZT1cInRleHRcIiBjbGFzcz1cImEtZm9ybS1maWVsZFwiIFtjbGFzcy4tZXJyb3JdPVwiaGFzRXJyb3IoJ25hbWUnLCBpZHgpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFt2YWx1ZV09XCJldmVudC5uYW1lXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjaGFuZ2UpPVwibW9kaWZ5RXZlbnQoaWR4LCAnbmFtZScsICRldmVudClcIiBbcmVhZG9ubHldPVwiYWNjZXNzVmFsdWUubmFtZVwiPjwvdGQ+XG4gICAgICAgICAgICAgICAgICAgIDwvdHI+XG4gICAgICAgICAgICAgICAgICAgIDx0cj5cbiAgICAgICAgICAgICAgICAgICAgICA8dGQ+e3sgJ0BodnkuZXZlbnQubG9nLmV2ZW50LmNhdGVnb3J5JyB8IGkxOG4gfX08c3BhbiBjbGFzcz1cInJlcXVpcmVkXCI+Kjwvc3Bhbj48L3RkPlxuICAgICAgICAgICAgICAgICAgICAgIDx0ZD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxwcnktc2VsZWN0IFtuZ01vZGVsXT1cImV2ZW50LmNhdGVnb3J5XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtpdGVtc109XCJjYXRlZ29yaWVzKGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3MuLWVycm9yXT1cImhhc0Vycm9yKCdjYXRlZ29yeScsIGlkeClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG5nTW9kZWxDaGFuZ2UpPVwibW9kaWZ5RXZlbnQoaWR4LCAnY2F0ZWdvcnknLCAkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkxOG5QcmVmaXg9XCJAaHZ5LmV2ZW50LmNhdGVnb3J5LlwiIFtkaXNhYmxlZF09XCJhY2Nlc3NWYWx1ZS5jYXRlZ29yeVwiPjwvcHJ5LXNlbGVjdD5cbiAgICAgICAgICAgICAgICAgICAgICA8L3RkPlxuICAgICAgICAgICAgICAgICAgICA8L3RyPlxuICAgICAgICAgICAgICAgICAgICA8dHI+XG4gICAgICAgICAgICAgICAgICAgICAgPHRkPnt7ICdAaHZ5LmV2ZW50LmNyaXRpY2FsaXR5Lm5hbWUnIHwgaTE4biB9fTxzcGFuIGNsYXNzPVwicmVxdWlyZWRcIj4qPC9zcGFuPjwvdGQ+XG4gICAgICAgICAgICAgICAgICAgICAgPHRkPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHByeS1zZWxlY3QgW25nTW9kZWxdPVwiZXZlbnQuY3JpdGljYWxpdHlcIiBbaXRlbXNdPVwiY3JpdGljYWxpdGllc1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3MuLWVycm9yXT1cImhhc0Vycm9yKCdjcml0aWNhbGl0eScsIGlkeClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaTE4blByZWZpeD1cIkBodnkuZXZlbnQuY3JpdGljYWxpdHkuXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJhY2Nlc3NWYWx1ZS5jcml0aWNhbGl0eVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobmdNb2RlbENoYW5nZSk9XCJtb2RpZnlFdmVudChpZHgsICdjcml0aWNhbGl0eScsICRldmVudClcIj48L3ByeS1zZWxlY3Q+XG4gICAgICAgICAgICAgICAgICAgICAgPC90ZD5cbiAgICAgICAgICAgICAgICAgICAgPC90cj5cbiAgICAgICAgICAgICAgICAgICAgPHRyPlxuICAgICAgICAgICAgICAgICAgICAgIDx0ZD57eyAnQGh2eS5ldmVudC5sb2cuZXZlbnQuZGVzY3JpcHRpb24nIHwgaTE4biB9fTxzcGFuIGNsYXNzPVwicmVxdWlyZWRcIj4qPC9zcGFuPjwvdGQ+XG4gICAgICAgICAgICAgICAgICAgICAgPHRkPjx0ZXh0YXJlYSBbbmdNb2RlbF09XCJldmVudC5kZXNjcmlwdGlvblwiIGNsYXNzPVwiYS1mb3JtLWZpZWxkXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzcy4tZXJyb3JdPVwiaGFzRXJyb3IoJ2Rlc2NyaXB0aW9uJywgaWR4KVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbcmVhZG9ubHldPVwiYWNjZXNzVmFsdWUuZGVzY3JpcHRpb25cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG5nTW9kZWxDaGFuZ2UpPVwibW9kaWZ5RXZlbnQoaWR4LCAnZGVzY3JpcHRpb24nLCAkZXZlbnQpXCI+PC90ZXh0YXJlYT48L3RkPlxuICAgICAgICAgICAgICAgICAgICA8L3RyPlxuICAgICAgICAgICAgICAgICAgICA8dHI+XG4gICAgICAgICAgICAgICAgICAgICAgPHRkPnt7ICdAaHZ5LmV2ZW50LmxvZy5ldmVudC5hZGRyZXNzJyB8IGkxOG4gfX08L3RkPlxuICAgICAgICAgICAgICAgICAgICAgIDx0ZD48dGV4dGFyZWEgW25nTW9kZWxdPVwiZXZlbnQuYWRkcmVzc1wiIGNsYXNzPVwiYS1mb3JtLWZpZWxkXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzcy4tZXJyb3JdPVwiaGFzRXJyb3IoJ2FkZHJlc3MnLCBpZHgpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtyZWFkb25seV09XCJhY2Nlc3NWYWx1ZS5hZGRyZXNzXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChuZ01vZGVsQ2hhbmdlKT1cIm1vZGlmeUV2ZW50KGlkeCwgJ2FkZHJlc3MnLCAkZXZlbnQpXCI+PC90ZXh0YXJlYT48L3RkPlxuICAgICAgICAgICAgICAgICAgICA8L3RyPlxuICAgICAgICAgICAgICAgICAgICAgIEBpZiAoWydBTEVSVCcsICdSRVBPUlQnXS5pbmNsdWRlcyhldmVudC50eXBlKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgPHRyPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQ+e3sgJ0BodnkuZXZlbnQuc291cmNlJyB8IGkxOG4gfX08L3RkPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQ+PGlucHV0IHR5cGU9XCJ0ZXh0XCIgY2xhc3M9XCJhLWZvcm0tZmllbGRcIiBbdmFsdWVdPVwiZXZlbnQuZXh0ZXJuYWxTb3VyY2VSZWYgPz8gJydcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzcy4tZXJyb3JdPVwiaGFzRXJyb3IoJ3NvdXJjZScsIGlkeClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtyZWFkb25seV09XCJhY2Nlc3NWYWx1ZS5zb3VyY2VcIiAoY2hhbmdlKT1cIm1vZGlmeUV2ZW50KGlkeCwgJ3NvdXJjZScsICRldmVudClcIj48L3RkPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC90cj5cbiAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIDx0cj5cbiAgICAgICAgICAgICAgICAgICAgICA8dGQ+e3sgJ0BodnkuZXZlbnQuZXF1aXBtZW50JyB8IGkxOG4gfX08L3RkPlxuICAgICAgICAgICAgICAgICAgICAgIDx0ZD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIGNsYXNzPVwiYS1mb3JtLWZpZWxkXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbdmFsdWVdPVwiZXZlbnQuZXF1aXBtZW50Py5uYW1lID8/ICcnXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3MuLWVycm9yXT1cImhhc0Vycm9yKCdlcXVpcG1lbnQnLCBpZHgpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbcmVhZG9ubHldPVwiYWNjZXNzVmFsdWUuZXFOYW1lXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2hhbmdlKT1cImNoYW5nZUVxdWlwbWVudChpZHgsICRldmVudClcIj5cbiAgICAgICAgICAgICAgICAgICAgICA8L3RkPlxuICAgICAgICAgICAgICAgICAgICA8L3RyPlxuICAgICAgICAgICAgICAgICAgICA8dHI+XG4gICAgICAgICAgICAgICAgICAgICAgPHRkPnt7ICdAaHZ5LmV2ZW50LmVxdWlwbWVudEVudGl0eScgfCBpMThuIH19PC90ZD5cbiAgICAgICAgICAgICAgICAgICAgICA8dGQ+PGlucHV0IHR5cGU9XCJ0ZXh0XCIgY2xhc3M9XCJhLWZvcm0tZmllbGRcIiBbdmFsdWVdPVwiZXZlbnQuZXF1aXBtZW50Py5lbnRpdHkgPz8gJydcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVhZG9ubHk+PC90ZD5cbiAgICAgICAgICAgICAgICAgICAgPC90cj5cbiAgICAgICAgICAgICAgICAgICAgPHRyPlxuICAgICAgICAgICAgICAgICAgICAgIDx0ZD57eyAnQGh2eS5ldmVudC5kb21haW4ubmFtZScgfCBpMThuIH19PC90ZD5cbiAgICAgICAgICAgICAgICAgICAgICA8dGQ+XG4gICAgICAgICAgICAgICAgICAgICAgICA8cHJ5LXNlbGVjdCBbaXRlbXNdPVwiRE9NQUlOU1wiIFtuZ01vZGVsXT1cImV2ZW50LmRvbWFpblwiIGkxOG5QcmVmaXg9XCJAaHZ5LmV2ZW50LmRvbWFpbi5cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzLi1lcnJvcl09XCJoYXNFcnJvcignZG9tYWluJywgaWR4KVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobmdNb2RlbENoYW5nZSk9XCJtb2RpZnlFdmVudChpZHgsICdkb21haW4nLCAkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJhY2Nlc3NWYWx1ZS5kb21haW5cIlxuICAgICAgICAgICAgICAgICAgICAgICAgPjwvcHJ5LXNlbGVjdD5cbiAgICAgICAgICAgICAgICAgICAgICA8L3RkPlxuICAgICAgICAgICAgICAgICAgICA8L3RyPlxuICAgICAgICAgICAgICAgICAgICA8dHI+XG4gICAgICAgICAgICAgICAgICAgICAgPHRkPlxuICAgICAgICAgICAgICAgICAgICAgICAge3sgJ0BodnkuZXZlbnQuc3RhcnREYXRlJyB8IGkxOG4gfX1cbiAgICAgICAgICAgICAgICAgICAgICAgIEBpZiAoZXZlbnQuY2F0ZWdvcnkgPT09ICdNQU5JRkVTVEFUSU9OJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInJlcXVpcmVkXCI+Kjwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICA8L3RkPlxuICAgICAgICAgICAgICAgICAgICAgIDx0ZD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwiZGF0ZXRpbWUtbG9jYWxcIiBjbGFzcz1cImEtZm9ybS1maWVsZFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3ZhbHVlXT1cImV2ZW50LnN0YXJ0RGF0ZSB8IGZvckRhdGVUaW1lTG9jYWxcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzcy4tZXJyb3JdPVwiaGFzRXJyb3IoJ3N0YXJ0RGF0ZScsIGlkeClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtyZWFkb25seV09XCJhY2Nlc3NWYWx1ZS5zdGFydERhdGVcIiAoY2hhbmdlKT1cIm1vZGlmeUV2ZW50KGlkeCwgJ3N0YXJ0RGF0ZScsICRldmVudClcIj5cbiAgICAgICAgICAgICAgICAgICAgICA8L3RkPlxuICAgICAgICAgICAgICAgICAgICA8L3RyPlxuICAgICAgICAgICAgICAgICAgICA8dHI+XG4gICAgICAgICAgICAgICAgICAgICAgPHRkPlxuICAgICAgICAgICAgICAgICAgICAgICAge3sgJ0BodnkuZXZlbnQuZW5kRGF0ZScgfCBpMThuIH19XG4gICAgICAgICAgICAgICAgICAgICAgICBAaWYgKGV2ZW50LmNhdGVnb3J5ID09PSAnTUFOSUZFU1RBVElPTicpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJyZXF1aXJlZFwiPio8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgPC90ZD5cbiAgICAgICAgICAgICAgICAgICAgICA8dGQ+XG4gICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cImRhdGV0aW1lLWxvY2FsXCIgY2xhc3M9XCJhLWZvcm0tZmllbGRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFt2YWx1ZV09XCJldmVudC5lbmREYXRlIHwgZm9yRGF0ZVRpbWVMb2NhbFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzLi1lcnJvcl09XCJoYXNFcnJvcignZW5kRGF0ZScsIGlkeClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtyZWFkb25seV09XCJhY2Nlc3NWYWx1ZS5lbmREYXRlXCIgKGNoYW5nZSk9XCJtb2RpZnlFdmVudChpZHgsICdlbmREYXRlJywgJGV2ZW50KVwiPlxuICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+XG4gICAgICAgICAgICAgICAgICAgIDwvdHI+XG4gICAgICAgICAgICAgICAgICAgIDx0cj5cbiAgICAgICAgICAgICAgICAgICAgICA8dGQ+e3sgJ0BodnkuZXZlbnQuY3JlYXRpb25EYXRlJyB8IGkxOG4gfX08L3RkPlxuICAgICAgICAgICAgICAgICAgICAgIDx0ZD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwiZGF0ZXRpbWUtbG9jYWxcIiBjbGFzcz1cImEtZm9ybS1maWVsZFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3ZhbHVlXT1cImV2ZW50LmNyZWF0aW9uRGF0ZSB8IGZvckRhdGVUaW1lTG9jYWxcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlYWRvbmx5PlxuICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+XG4gICAgICAgICAgICAgICAgICAgIDwvdHI+XG4gICAgICAgICAgICAgICAgICAgIDx0cj5cbiAgICAgICAgICAgICAgICAgICAgICA8dGQ+e3sgJ0BodnkuZXZlbnQubGFzdE1vZGlmaWNhdGlvbkRhdGUnIHwgaTE4biB9fTwvdGQ+XG4gICAgICAgICAgICAgICAgICAgICAgPHRkPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJkYXRldGltZS1sb2NhbFwiIGNsYXNzPVwiYS1mb3JtLWZpZWxkXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbdmFsdWVdPVwiZXZlbnQubGFzdE1vZGlmaWNhdGlvbkRhdGUgfCBmb3JEYXRlVGltZUxvY2FsXCIgcmVhZG9ubHk+XG4gICAgICAgICAgICAgICAgICAgICAgPC90ZD5cbiAgICAgICAgICAgICAgICAgICAgPC90cj5cbiAgICAgICAgICAgICAgICAgICAgPHRyPlxuICAgICAgICAgICAgICAgICAgICAgIDx0ZD57eyAnQGh2eS5ldmVudC5jbG9zZURhdGUnIHwgaTE4biB9fTwvdGQ+XG4gICAgICAgICAgICAgICAgICAgICAgPHRkPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJkYXRldGltZS1sb2NhbFwiIGNsYXNzPVwiYS1mb3JtLWZpZWxkXCIgW3ZhbHVlXT1cImV2ZW50LmNsb3NlRGF0ZSB8IGZvckRhdGVUaW1lTG9jYWxcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlYWRvbmx5PlxuICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+XG4gICAgICAgICAgICAgICAgICAgIDwvdHI+XG4gICAgICAgICAgICAgICAgICAgIDwvdGJvZHk+XG4gICAgICAgICAgICAgICAgICA8L3RhYmxlPlxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm8taHZ5LWV2ZW50cy1kZXRhaWxfX2V2ZW50c19fZXZlbnRfX2NvbnRlbnRfX2NvbW1lbnRzXCI+XG4gICAgICAgICAgICAgICAgICAgIDxoMz57eyAnQGh2eS5ldmVudC5sb2cuZXZlbnQuY29tbWVudHMubmFtZScgfCBpMThuIH19PC9oMz5cbiAgICAgICAgICAgICAgICAgICAgPHRleHRhcmVhIFtwbGFjZWhvbGRlcl09XCIoJ0BodnkuZXZlbnQubG9nLmV2ZW50LmNvbW1lbnRzLnBsYWNlaG9sZGVyJyB8IGkxOG4pICsgJy4uLidcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJuZXdDb21lbnRDb250ZW50XCI+PC90ZXh0YXJlYT5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm8taHZ5LWV2ZW50cy1kZXRhaWxfX2V2ZW50c19fZXZlbnRfX2NvbnRlbnRfX2NvbW1lbnRzX19idXR0b25cIj5cbiAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYS1idG4gYS1idG4tLXByaW1hcnlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cIm5ld0NvbWVudENvbnRlbnQubGVuZ3RoID09PSAwXCI+e3sgJ0BodnkuYWN0aW9uLmNvbW1lbnQnIHwgaTE4biB9fVxuICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIH1cbiAgICAgIDwvZGl2PlxuICAgICAgPGRpdiBjbGFzcz1cIm8taHZ5LWV2ZW50cy1kZXRhaWxfX3Byb2NlZHVyZVwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiby1odnktZXZlbnRzLWRldGFpbF9fcHJvY2VkdXJlX19oZWFkZXJcIj5cbiAgICAgICAgICA8aDI+e3sgKGV2ZW50cy5sZW5ndGggPT09IDEgPyAnQGh2eS5ldmVudC5sb2cucHJvY2VkdXJlLm5hbWUxJyA6ICdAaHZ5LmV2ZW50LmxvZy5wcm9jZWR1cmUubmFtZScpIHwgaTE4biB9fTwvaDI+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICBAaWYgKHByb2NlZHVyZSkge1xuICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICA8cD57eyBwcm9jZWR1cmUubmFtZSB9fTwvcD5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiby1odnktZXZlbnRzLWRldGFpbF9fcHJvY2VkdXJlX19wcm9ncmVzc1wiPlxuICAgICAgICAgICAgPHA+e3sgJ0BodnkuZXZlbnQubG9nLnByb2NlZHVyZS5wcm9ncmVzcycgfCBpMThuIH19PC9wPlxuICAgICAgICAgICAgPGh2eS1wcm9ncmVzcy1kaXNwbGF5IFtwcm9ncmVzc109XCJwcm9jZWR1cmUucHJvZ3Jlc3NcIj48L2h2eS1wcm9ncmVzcy1kaXNwbGF5PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJvLWh2eS1ldmVudHMtZGV0YWlsX19wcm9jZWR1cmVfX2FjdGlvbnNcIiAoZHJhZyk9XCJtb3ZlKCRldmVudClcIiAoZHJvcCk9XCJkcm9wKCRldmVudClcIiAoZHJhZ292ZXIpPVwiYWxsb3dEcm9wKCRldmVudClcIj5cbiAgICAgICAgICAgIEBmb3IgKGFjdGlvbiBvZiBwcm9jZWR1cmUuYWN0aW9uczt0cmFjayBhY3Rpb24uaWQ7bGV0IGlkeCA9ICRpbmRleCkge1xuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiby1odnktZXZlbnRzLWRldGFpbF9fcHJvY2VkdXJlX19hY3Rpb25zX19hY3Rpb25cIiBbZHJhZ2dhYmxlXT1cInRydWVcIiAoZHJhZ3N0YXJ0KT1cImRyYWdTdGFydCgkZXZlbnQsIGFjdGlvbiwgaWR4KVwiIChtb3VzZWRvd24pPVwib25Nb3VzZURvd24oJGV2ZW50KVwiPlxuICAgICAgICAgICAgICAgIDxwcnktaWNvbiBpY29uU3ZnPVwic2l4X2RvdFwiICNoYW5kbGU+PC9wcnktaWNvbj5cbiAgICAgICAgICAgICAgICA8cHJ5LWNoZWNrYm94IFtuZ01vZGVsXT1cImFjdGlvbi5zdGF0dXMgPT09ICdET05FJ1wiPjwvcHJ5LWNoZWNrYm94PlxuICAgICAgICAgICAgICAgIDxkaXY+e3sgYWN0aW9uLm5hbWUgfX08L2Rpdj5cbiAgICAgICAgICAgICAgICA8cHJ5LWljb24gaWNvblN2Zz1cIm1vcmVfaG9yaXpcIj48L3ByeS1pY29uPlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIH0gQGVtcHR5IHtcbiAgICAgICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgICAgICB7eyAnQGh2eS5ldmVudC5sb2cucHJvY2VkdXJlLm5vQWN0aW9uJyB8IGkxOG4gfX1cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICB9XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJhLWJ0biBhLWJ0bi0tcHJpbWFyeVwiPlxuICAgICAgICAgICAgICA8cHJ5LWljb24gaWNvblN2Zz1cImFkZFwiPjwvcHJ5LWljb24+XG4gICAgICAgICAgICAgIHt7ICdAaHZ5LmV2ZW50LmxvZy5wcm9jZWR1cmUuYWRkQWN0aW9uJyB8IGkxOG4gfX1cbiAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICB9IEBlbHNlIHtcbiAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYS1idG4gYS1idG4tLXNlY29uZGFyeVwiPlxuICAgICAgICAgICAge3sgJ0BjaGguYWN0aW9ucy5hc3NvY2lhdGUnIHwgaTE4biB9fVxuICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICB9XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+XG48L2Rpdj5cbiJdfQ==
|
|
328
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXZlbnQtZGV0YWlsLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3Byb3ZvbHkvaHlwZXJ2aXNvci9zcmMvbGliL2V2ZW50L2RldGFpbC9ldmVudC1kZXRhaWwuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvcHJvdm9seS9oeXBlcnZpc29yL3NyYy9saWIvZXZlbnQvZGV0YWlsL2V2ZW50LWRldGFpbC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLFlBQVksRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLFdBQVcsRUFBRSxTQUFTLEVBQW9CLE1BQU0sZUFBZSxDQUFDO0FBR2pILE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLDhDQUE4QyxDQUFDO0FBQ25GLE9BQU8sRUFBRSx3QkFBd0IsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBRzlELE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQztBQUN2RCxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSwyQ0FBMkMsQ0FBQztBQUMvRSxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0saUNBQWlDLENBQUM7QUFHL0QsT0FBTyxFQUFXLGFBQWEsRUFBYyxNQUFNLHNCQUFzQixDQUFDO0FBQzFFLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQzs7Ozs7Ozs7Ozs7O0FBTXJELE1BQU0sT0FBTyxvQkFBcUIsU0FBUSx3QkFBd0I7YUFDekQsZ0JBQVcsR0FBRyxFQUFFLEFBQUwsQ0FBTTtJQWtDeEIsSUFBYSxNQUFNLENBQUMsTUFBeUI7UUFDM0MsSUFBSSxDQUFDLE9BQU8sR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENB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RUFBRSxDQUFDO0lBQzFCLENBQUM7SUFFRCxlQUFlO1FBQ2IsT0FBTyxJQUFJLENBQUMsbUJBQW1CLENBQUMsT0FBTyxDQUFDLE1BQU0sS0FBSyxDQUFDLENBQUM7SUFDdkQsQ0FBQzs4R0F6VVUsb0JBQW9CO2tHQUFwQixvQkFBb0Isd1dBaUNLLFdBQVcsb0RDcERqRCwrd2FBaVFBOzsyRkQ5T2Esb0JBQW9CO2tCQUpoQyxTQUFTOytCQUNFLGtCQUFrQjs4SkFTbEIsY0FBYztzQkFBdkIsTUFBTTtnQkFHRyxpQkFBaUI7c0JBQTFCLE1BQU07Z0JBRUcsV0FBVztzQkFBcEIsTUFBTTtnQkFzQjRDLGFBQWE7c0JBQS9ELFNBQVM7dUJBQUMsZUFBZSxFQUFFLEVBQUUsSUFBSSxFQUFFLFdBQVcsRUFBRTtnQkFFcEMsTUFBTTtzQkFBbEIsS0FBSztnQkFPTyxTQUFTO3NCQUFyQixLQUFLO2dCQUtPLG1CQUFtQjtzQkFBL0IsS0FBSyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgRXZlbnRFbWl0dGVyLCBJbnB1dCwgT3V0cHV0LCBUZW1wbGF0ZVJlZiwgVmlld0NoaWxkLCBWaWV3Q29udGFpbmVyUmVmIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBIeXBQcm9jZWR1cmUgfSBmcm9tICcuLi8uLi9tb2RlbC9oeXAtcHJvY2VkdXJlLmludGVyZmFjZSc7XG5pbXBvcnQgeyBIeXBFdmVudERldGFpbHMgfSBmcm9tICcuLi8uLi9tb2RlbC9ldmVudC9oeXAtZXZlbnQtZGV0YWlsLmludGVyZmFjZSc7XG5pbXBvcnQgeyBIeXBFdmVudENyaXRpY2FsaXR5IH0gZnJvbSAnLi4vLi4vbW9kZWwvZXZlbnQvaHlwLWV2ZW50LWNyaXRpY2FsaXR5LnR5cGUnO1xuaW1wb3J0IHsgU3Vic2NyaXB0aW9ubmVyRGlyZWN0aXZlIH0gZnJvbSAnQHByb3ZvbHkvZGFzaGJvYXJkJztcbmltcG9ydCB7IEh5cEVxdWlwbWVudCB9IGZyb20gJy4uLy4uL21vZGVsL2h5cC1lcXVpcG1lbnQuaW50ZXJmYWNlJztcbmltcG9ydCB7IEVxdWlwbWVudFNlcnZpY2UgfSBmcm9tICcuLi8uLi9zdG9yZS9lcXVpcG1lbnQvZXF1aXBtZW50LnNlcnZpY2UnO1xuaW1wb3J0IHsgRE9NQUlOUyB9IGZyb20gJy4uLy4uL21vZGVsL2RvbWFpbnMuY29uc3RhbnQnO1xuaW1wb3J0IHsgQ0FURUdPUklFU19CWV9UWVBFIH0gZnJvbSAnLi4vLi4vbW9kZWwvZXZlbnQvaHlwLWV2ZW50LWNhdGVnb3J5LnR5cGUnO1xuaW1wb3J0IHsgRXZlbnRBY3Rpb25zIH0gZnJvbSAnLi4vLi4vc3RvcmUvZXZlbnQvZXZlbnQuYWN0aW9ucyc7XG5pbXBvcnQgeyBTdG9yZSB9IGZyb20gJ0BuZ3J4L3N0b3JlJztcbmltcG9ydCB7IEh5cEFjdGlvbiB9IGZyb20gJy4uLy4uL21vZGVsL2h5cC1hY3Rpb24uaW50ZXJmYWNlJztcbmltcG9ydCB7IE92ZXJsYXksIE92ZXJsYXlDb25maWcsIE92ZXJsYXlSZWYgfSBmcm9tICdAYW5ndWxhci9jZGsvb3ZlcmxheSc7XG5pbXBvcnQgeyBUZW1wbGF0ZVBvcnRhbCB9IGZyb20gJ0Bhbmd1bGFyL2Nkay9wb3J0YWwnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdodnktZXZlbnQtZGV0YWlsJyxcbiAgdGVtcGxhdGVVcmw6ICcuL2V2ZW50LWRldGFpbC5jb21wb25lbnQuaHRtbCdcbn0pXG5leHBvcnQgY2xhc3MgRXZlbnREZXRhaWxDb21wb25lbnQgZXh0ZW5kcyBTdWJzY3JpcHRpb25uZXJEaXJlY3RpdmUge1xuICBzdGF0aWMgQ0FSRF9IRUlHSFQgPSA3NTtcbiAgb3BlbmVkOiBib29sZWFuW10gPSBbXTtcbiAgY3JpdGljYWxpdGllcyA9IEh5cEV2ZW50Q3JpdGljYWxpdHkudmFsdWVzO1xuICBfZXZlbnRzOiBIeXBFdmVudERldGFpbHNbXSA9IFtdO1xuICBldmVudE1vZGlmaWNhdGlvbnM6IFBhcnRpYWw8SHlwRXZlbnREZXRhaWxzPltdID0gW107XG4gIEBPdXRwdXQoKSBtb2RpZmllZEV2ZW50cyA9IG5ldyBFdmVudEVtaXR0ZXI8W1BhcnRpYWw8SHlwRXZlbnREZXRhaWxzPiwgSHlwRXZlbnREZXRhaWxzXVtdPigpO1xuICBfcHJvY2VkdXJlPzogSHlwUHJvY2VkdXJlO1xuICBwcm9jZWR1cmVNb2RpZmljYXRpb25zOiBQYXJ0aWFsPEh5cFByb2NlZHVyZT4gPSB7fTtcbiAgQE91dHB1dCgpIG1vZGlmaWVkUHJvY2VkdXJlID0gbmV3IEV2ZW50RW1pdHRlcjxbUGFydGlhbDxIeXBQcm9jZWR1cmU+LCBIeXBQcm9jZWR1cmVdIHwgdW5kZWZpbmVkPigpO1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgRE9NQUlOUyA9IERPTUFJTlMudmFsdWVzO1xuICBAT3V0cHV0KCkgZXZlbnRFcnJvcnMgPSBuZXcgRXZlbnRFbWl0dGVyPHsgZmllbGQ6IHN0cmluZzsgY29kZTogc3RyaW5nIH1bXVtdPigpO1xuICBlcnJvcnM6IHsgZmllbGQ6IHN0cmluZzsgY29kZTogc3RyaW5nIH1bXVtdID0gW107XG4gIGNhbkNsb3NlU29tZSA9IGZhbHNlO1xuICBuZXdDb21lbnRDb250ZW50ID0gJyc7XG4gIG1vdmluZ0FjdGlvbj86IEh5cEFjdGlvbjtcbiAgbW92ZVN0YXJ0ID0gMDtcbiAgbW92ZUluaXRpYWxJbmRleCA9IDA7XG4gIGluaXRpYWxBY3Rpb25MaXN0OiBIeXBBY3Rpb25bXSA9IFtdO1xuICBwcmV2aW91c09mZnNldCA9IDA7XG4gIGRyYWdUYXJnZXQ/OiBFdmVudFRhcmdldCB8IG51bGw7XG4gIGNoYW5nZVN0YXR1c0NvbnRleHQ6IHtcbiAgICBjb21tZW50OiBzdHJpbmc7XG4gICAgZXZlbnRzOiBIeXBFdmVudERldGFpbHNbXTtcbiAgICBzdGF0dXM6IHN0cmluZztcbiAgICBhbGw6IGJvb2xlYW47XG4gIH0gPSB7XG4gICAgY29tbWVudDogJycsXG4gICAgZXZlbnRzOiBbXSxcbiAgICBzdGF0dXM6ICdET05FJyxcbiAgICBhbGw6IGZhbHNlXG4gIH07XG4gIG92ZXJsYXlSZWY/OiBPdmVybGF5UmVmO1xuICBAVmlld0NoaWxkKCdjb25maXJtRGlhbG9nJywgeyByZWFkOiBUZW1wbGF0ZVJlZiB9KSBjb25maXJtRGlhbG9nITogVGVtcGxhdGVSZWY8YW55PjtcblxuICBASW5wdXQoKSBzZXQgZXZlbnRzKGV2ZW50czogSHlwRXZlbnREZXRhaWxzW10pIHtcbiAgICB0aGlzLl9ldmVudHMgPSBldmVudHMuZmlsdGVyKChldikgPT4gISFldik7XG4gICAgdGhpcy5ldmVudE1vZGlmaWNhdGlvbnMgPSBuZXcgQXJyYXkodGhpcy5fZXZlbnRzLmxlbmd0aCk7XG4gICAgdGhpcy5vcGVuZWQgPSB0aGlzLl9ldmVudHMubGVuZ3RoID09PSAxID8gW3RydWVdIDogW107XG4gICAgdGhpcy5jYW5DbG9zZVNvbWUgPSB0aGlzLl9ldmVudHMuZmlsdGVyKChldikgPT4gZXYuc3RhdHVzICE9PSAnRE9ORScpLmxlbmd0aCA+IDA7XG4gIH1cblxuICBASW5wdXQoKSBzZXQgcHJvY2VkdXJlKHByb2NlZHVyZTogSHlwUHJvY2VkdXJlKSB7XG4gICAgdGhpcy5fcHJvY2VkdXJlID0gcHJvY2VkdXJlO1xuICAgIHRoaXMucHJvY2VkdXJlTW9kaWZpY2F0aW9ucyA9IHt9O1xuICB9XG5cbiAgQElucHV0KCkgc2V0IGNhbmNlbE1vZGlmaWNhdGlvbnMoZXZ0OiBhbnkpIHtcbiAgICB0aGlzLmV2ZW50TW9kaWZpY2F0aW9ucyA9IG5ldyBBcnJheSh0aGlzLl9ldmVudHMubGVuZ3RoKTtcbiAgICB0aGlzLnByb2NlZHVyZU1vZGlmaWNhdGlvbnMgPSB7fTtcbiAgICB0aGlzLl9vdXRwdXRNb2RpZmljYXRpb25zKCk7XG4gIH1cblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIGVxdWlwbWVudFNlcnZpY2U6IEVxdWlwbWVudFNlcnZpY2UsXG4gICAgcHJpdmF0ZSBzdG9yZTogU3RvcmUsXG4gICAgcHJpdmF0ZSBvdmVybGF5OiBPdmVybGF5LFxuICAgIHByaXZhdGUgdmlld0NvbnRhaW5lclJlZjogVmlld0NvbnRhaW5lclJlZlxuICApIHtcbiAgICBzdXBlcigpO1xuICB9XG5cbiAgZ2V0IGV2ZW50cygpIHtcbiAgICByZXR1cm4gdGhpcy5fZXZlbnRzLm1hcCgoZXZ0LCBpZHgpID0+ICh7IC4uLmV2dCwgLi4uKHRoaXMuZXZlbnRNb2RpZmljYXRpb25zW2lkeF0gPz8ge30pIH0pKTtcbiAgfVxuXG4gIGdldCBwcm9jZWR1cmUoKTogSHlwUHJvY2VkdXJlIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5fcHJvY2VkdXJlXG4gICAgICA/IHtcbiAgICAgICAgICAuLi50aGlzLl9wcm9jZWR1cmUsXG4gICAgICAgICAgLi4uKHRoaXMucHJvY2VkdXJlTW9kaWZpY2F0aW9ucyA/PyB7fSksXG4gICAgICAgICAgZXZlbnRzOiB0aGlzLmV2ZW50c1xuICAgICAgICB9XG4gICAgICA6IHVuZGVmaW5lZDtcbiAgfVxuXG4gIHRvZ2dsZShpOiBudW1iZXIpIHtcbiAgICB0aGlzLm9wZW5lZFtpXSA9ICF0aGlzLm9wZW5lZFtpXTtcbiAgfVxuXG4gIG1vZGlmeUV2ZW50KGluZGV4OiBudW1iZXIsIHByb3A6IHN0cmluZywgJGV2ZW50OiBFdmVudCB8IHN0cmluZykge1xuICAgIGNvbnN0IGlzRGF0ZSA9IHByb3AuaW5kZXhPZignRGF0ZScpID4gLTE7XG4gICAgLy8gQHRzLWlnbm9yZVxuICAgIGNvbnN0IG5ld1ZhbHVlID0gJGV2ZW50IGluc3RhbmNlb2YgRXZlbnQgPyAkZXZlbnQudGFyZ2V0Py52YWx1ZSA6ICRldmVudDtcblxuICAgIGNvbnN0IGNvcnJlY3RlZFZhbHVlID0gIWlzRGF0ZSA/IG5ld1ZhbHVlIDogYCR7bmV3VmFsdWV9OjAwLjAwMDAwMFpgO1xuICAgIC8vIEB0cy1pZ25vcmVcbiAgICBpZiAodGhpcy5ldmVudHNbaW5kZXhdW3Byb3BdICE9PSBjb3JyZWN0ZWRWYWx1ZSkge1xuICAgICAgaWYgKCF0aGlzLmV2ZW50TW9kaWZpY2F0aW9uc1tpbmRleF0pIHtcbiAgICAgICAgdGhpcy5ldmVudE1vZGlmaWNhdGlvbnNbaW5kZXhdID0ge307XG4gICAgICB9XG4gICAgICAvLyBAdHMtaWdub3JlXG4gICAgICB0aGlzLmV2ZW50TW9kaWZpY2F0aW9uc1tpbmRleF1bcHJvcF0gPSBjb3JyZWN0ZWRWYWx1ZTtcblxuICAgICAgdGhpcy5fb3V0cHV0TW9kaWZpY2F0aW9ucygpO1xuICAgIH1cbiAgfVxuXG4gIGFjY2VzcyhldmVudDogSHlwRXZlbnREZXRhaWxzKSB7XG4gICAgaWYgKGV2ZW50LnN0YXR1cyA9PT0gJ0RPTkUnKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBuYW1lOiB0cnVlLFxuICAgICAgICBjYXRlZ29yeTogdHJ1ZSxcbiAgICAgICAgY3JpdGljYWxpdHk6IHRydWUsXG4gICAgICAgIGRlc2NyaXB0aW9uOiB0cnVlLFxuICAgICAgICBhZGRyZXNzOiB0cnVlLFxuICAgICAgICBzb3VyY2U6IHRydWUsXG4gICAgICAgIGRvbWFpbjogdHJ1ZSxcbiAgICAgICAgZXFOYW1lOiB0cnVlLFxuICAgICAgICBlcUVudGl0eTogdHJ1ZSxcbiAgICAgICAgc3RhcnREYXRlOiB0cnVlLFxuICAgICAgICBlbmREYXRlOiB0cnVlXG4gICAgICB9O1xuICAgIH1cbiAgICBzd2l0Y2ggKGV2ZW50LnR5cGUpIHtcbiAgICAgIGNhc2UgJ0FMRVJUJzpcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgbmFtZTogdHJ1ZSxcbiAgICAgICAgICBjYXRlZ29yeTogdHJ1ZSxcbiAgICAgICAgICBjcml0aWNhbGl0eTogdHJ1ZSxcbiAgICAgICAgICBkZXNjcmlwdGlvbjogdHJ1ZSxcbiAgICAgICAgICBhZGRyZXNzOiB0cnVlLFxuICAgICAgICAgIHNvdXJjZTogdHJ1ZSxcbiAgICAgICAgICBkb21haW46IHRydWUsXG4gICAgICAgICAgZXFOYW1lOiB0cnVlLFxuICAgICAgICAgIGVxRW50aXR5OiB0cnVlLFxuICAgICAgICAgIHN0YXJ0RGF0ZTogdHJ1ZSxcbiAgICAgICAgICBlbmREYXRlOiB0cnVlXG4gICAgICAgIH07XG4gICAgICBjYXNlICdSRVBPUlQnOlxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIG5hbWU6IGZhbHNlLFxuICAgICAgICAgIGNhdGVnb3J5OiB0cnVlLFxuICAgICAgICAgIGNyaXRpY2FsaXR5OiBmYWxzZSxcbiAgICAgICAgICBkZXNjcmlwdGlvbjogdHJ1ZSxcbiAgICAgICAgICBhZGRyZXNzOiBmYWxzZSxcbiAgICAgICAgICBzb3VyY2U6IHRydWUsXG4gICAgICAgICAgZG9tYWluOiBmYWxzZSxcbiAgICAgICAgICBlcU5hbWU6IGZhbHNlLFxuICAgICAgICAgIGVxRW50aXR5OiB0cnVlLFxuICAgICAgICAgIHN0YXJ0RGF0ZTogdHJ1ZSxcbiAgICAgICAgICBlbmREYXRlOiB0cnVlXG4gICAgICAgIH07XG4gICAgICBjYXNlICdPUEVSQVRPUic6XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgbmFtZTogZmFsc2UsXG4gICAgICAgICAgY2F0ZWdvcnk6IGZhbHNlLFxuICAgICAgICAgIGNyaXRpY2FsaXR5OiBmYWxzZSxcbiAgICAgICAgICBkZXNjcmlwdGlvbjogZmFsc2UsXG4gICAgICAgICAgYWRkcmVzczogZmFsc2UsXG4gICAgICAgICAgc291cmNlOiBmYWxzZSxcbiAgICAgICAgICBkb21haW46IGZhbHNlLFxuICAgICAgICAgIGVxTmFtZTogZmFsc2UsXG4gICAgICAgICAgZXFFbnRpdHk6IGZhbHNlLFxuICAgICAgICAgIHN0YXJ0RGF0ZTogZmFsc2UsXG4gICAgICAgICAgZW5kRGF0ZTogZmFsc2VcbiAgICAgICAgfTtcbiAgICB9XG4gIH1cblxuICBjaGFuZ2VFcXVpcG1lbnQoaW5kZXg6IG51bWJlciwgJGV2ZW50OiBhbnkpIHtcbiAgICB0aGlzLmVxdWlwbWVudFNlcnZpY2UuZmluZEJ5TmFtZSgkZXZlbnQudGFyZ2V0LnZhbHVlKS5zdWJzY3JpYmUoKGVxdWlwbWVudDogSHlwRXF1aXBtZW50KSA9PiB7XG4gICAgICBpZiAoZXF1aXBtZW50ICYmIHRoaXMuX2V2ZW50c1tpbmRleF0ubmFtZSAhPT0gZXF1aXBtZW50Lm5hbWUpIHtcbiAgICAgICAgaWYgKCF0aGlzLmV2ZW50TW9kaWZpY2F0aW9uc1tpbmRleF0pIHtcbiAgICAgICAgICB0aGlzLmV2ZW50TW9kaWZpY2F0aW9uc1tpbmRleF0gPSB7fTtcbiAgICAgICAgfVxuICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgIHRoaXMuZXZlbnRNb2RpZmljYXRpb25zW2luZGV4XS5lcXVpcG1lbnQgPSBlcXVpcG1lbnQ7XG4gICAgICAgIHRoaXMuX291dHB1dE1vZGlmaWNhdGlvbnMoKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIF9vdXRwdXRNb2RpZmljYXRpb25zKCkge1xuICAgIHRoaXMudmFsaWRhdGVFdmVudHModGhpcy5ldmVudHMpO1xuICAgIHRoaXMubW9kaWZpZWRFdmVudHMubmV4dCh0aGlzLmV2ZW50cy5tYXAoKGV2LCBpZHgpID0+IFt0aGlzLmV2ZW50TW9kaWZpY2F0aW9uc1tpZHhdLCBldl0pKTtcbiAgICB0aGlzLm1vZGlmaWVkUHJvY2VkdXJlLm5leHQodGhpcy5wcm9jZWR1cmUgPyBbdGhpcy5wcm9jZWR1cmVNb2RpZmljYXRpb25zLCB0aGlzLnByb2NlZHVyZSFdIDogdW5kZWZpbmVkKTtcbiAgfVxuXG4gIHZhbGlkYXRlRXZlbnRzKGV2ZW50czogSHlwRXZlbnREZXRhaWxzW10pIHtcbiAgICB0aGlzLmVycm9ycyA9IFtdO1xuICAgIGV2ZW50cy5mb3JFYWNoKChldmVudCkgPT4ge1xuICAgICAgY29uc3QgZXZlbnRFcnJvcnMgPSBbXTtcbiAgICAgIGlmICghZXZlbnQubmFtZSB8fCBldmVudC5uYW1lLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICBldmVudEVycm9ycy5wdXNoKHsgZmllbGQ6ICduYW1lJywgY29kZTogJ3JlcXVpcmVkJyB9KTtcbiAgICAgIH1cbiAgICAgIGlmICghZXZlbnQuY2F0ZWdvcnkgfHwgZXZlbnQuY2F0ZWdvcnkubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIGV2ZW50RXJyb3JzLnB1c2goeyBmaWVsZDogJ2NhdGVnb3J5JywgY29kZTogJ3JlcXVpcmVkJyB9KTtcbiAgICAgIH1cbiAgICAgIGlmICghZXZlbnQuY3JpdGljYWxpdHkgfHwgZXZlbnQuY3JpdGljYWxpdHkubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIGV2ZW50RXJyb3JzLnB1c2goeyBmaWVsZDogJ2NyaXRpY2FsaXR5JywgY29kZTogJ3JlcXVpcmVkJyB9KTtcbiAgICAgIH1cbiAgICAgIGlmICghZXZlbnQuZGVzY3JpcHRpb24gfHwgZXZlbnQuZGVzY3JpcHRpb24ubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIGV2ZW50RXJyb3JzLnB1c2goeyBmaWVsZDogJ2Rlc2NyaXB0aW9uJywgY29kZTogJ3JlcXVpcmVkJyB9KTtcbiAgICAgIH1cbiAgICAgIGlmIChldmVudC5jYXRlZ29yeSA9PT0gJ01BTklGRVNUQVRJT04nKSB7XG4gICAgICAgIGlmICghZXZlbnQuc3RhcnREYXRlIHx8IGV2ZW50LnN0YXJ0RGF0ZS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICBldmVudEVycm9ycy5wdXNoKHsgZmllbGQ6ICdzdGFydERhdGUnLCBjb2RlOiAncmVxdWlyZWQnIH0pO1xuICAgICAgICB9XG4gICAgICAgIGlmICghZXZlbnQuZW5kRGF0ZSB8fCBldmVudC5lbmREYXRlLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgIGV2ZW50RXJyb3JzLnB1c2goeyBmaWVsZDogJ2VuZERhdGUnLCBjb2RlOiAncmVxdWlyZWQnIH0pO1xuICAgICAgICB9XG4gICAgICAgIGlmICgoZXZlbnQuc3RhcnREYXRlPy5sb2NhbGVDb21wYXJlKGV2ZW50LmVuZERhdGUgPz8gJycpID8/IDApID4gMCkge1xuICAgICAgICAgIGV2ZW50RXJyb3JzLnB1c2goeyBmaWVsZDogJ3N0YXJ0RGF0ZScsIGNvZGU6ICdiZWZvcmUnIH0pO1xuICAgICAgICAgIGV2ZW50RXJyb3JzLnB1c2goeyBmaWVsZDogJ2VuZERhdGUnLCBjb2RlOiAnYWZ0ZXInIH0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICB0aGlzLmVycm9ycy5wdXNoKGV2ZW50RXJyb3JzKTtcbiAgICB9KTtcbiAgICB0aGlzLmV2ZW50RXJyb3JzLm5leHQodGhpcy5lcnJvcnMpO1xuICB9XG5cbiAgaGFzRXJyb3IocHJvcDogc3RyaW5nLCBpZHg6IG51bWJlcikge1xuICAgIHJldHVybiB0aGlzLmVycm9yc1tpZHhdPy5maW5kKChlcnIpID0+IGVyci5maWVsZCA9PT0gcHJvcCkgPz8gZmFsc2U7XG4gIH1cblxuICBjYXRlZ29yaWVzKGV2ZW50OiBIeXBFdmVudERldGFpbHMpIHtcbiAgICByZXR1cm4gQ0FURUdPUklFU19CWV9UWVBFLnZhbHVlc1tldmVudC50eXBlXTtcbiAgfVxuXG4gIGNoYW5nZVN0YXR1cygkZXZlbnQ6IHN0cmluZywgZXZlbnQ6IEh5cEV2ZW50RGV0YWlscykge1xuICAgIHRoaXMuY2hhbmdlU3RhdHVzQ29udGV4dC5ldmVudHMgPSBbZXZlbnRdO1xuICAgIHRoaXMuY2hhbmdlU3RhdHVzQ29udGV4dC5zdGF0dXMgPSAkZXZlbnQ7XG4gICAgdGhpcy5jaGFuZ2VTdGF0dXNDb250ZXh0LmFsbCA9IGZhbHNlO1xuICAgIHRoaXMudG9nZ2xlQ29uZmlybSgpO1xuICB9XG5cbiAgY2xvc2VBbGwoKSB7XG4gICAgdGhpcy5jaGFuZ2VTdGF0dXNDb250ZXh0LmFsbCA9IHRydWU7XG4gICAgdGhpcy5jaGFuZ2VTdGF0dXNDb250ZXh0LmV2ZW50cyA9IHRoaXMuZXZlbnRzO1xuICAgIHRoaXMuY2hhbmdlU3RhdHVzQ29udGV4dC5zdGF0dXMgPSAnRE9ORSc7XG4gICAgdGhpcy50b2dnbGVDb25maXJtKCk7XG4gIH1cblxuICBjb25maXJtZWRDbG9zZSgpIHtcbiAgICBpZiAodGhpcy5jaGFuZ2VTdGF0dXNDb250ZXh0LmFsbCkge1xuICAgICAgaWYgKCF0aGlzLnByb2NlZHVyZSkge1xuICAgICAgICB0aGlzLnN0b3JlLmRpc3BhdGNoKFxuICAgICAgICAgIEV2ZW50QWN0aW9ucy5zdGF0dXMoe1xuICAgICAgICAgICAgdGFyZ2V0U3RhdHVzOiB0aGlzLmNoYW5nZVN0YXR1c0NvbnRleHQuc3RhdHVzLFxuICAgICAgICAgICAgZXZlbnQ6IHRoaXMuY2hhbmdlU3RhdHVzQ29udGV4dC5ldmVudHNbMF0sXG4gICAgICAgICAgICBjb21tZW50OiB0aGlzLmNoYW5nZVN0YXR1c0NvbnRleHQuY29tbWVudFxuICAgICAgICAgIH0pXG4gICAgICAgICk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLnN0b3JlLmRpc3BhdGNoKFxuICAgICAgICAgIEV2ZW50QWN0aW9ucy5zdGF0dXMoe1xuICAgICAgICAgICAgdGFyZ2V0U3RhdHVzOiB0aGlzLmNoYW5nZVN0YXR1c0NvbnRleHQuc3RhdHVzLFxuICAgICAgICAgICAgcHJvY2VkdXJlOiB0aGlzLnByb2NlZHVyZSxcbiAgICAgICAgICAgIGNvbW1lbnQ6IHRoaXMuY2hhbmdlU3RhdHVzQ29udGV4dC5jb21tZW50XG4gICAgICAgICAgfSlcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5zdG9yZS5kaXNwYXRjaChcbiAgICAgICAgRXZlbnRBY3Rpb25zLnN0YXR1cyh7XG4gICAgICAgICAgdGFyZ2V0U3RhdHVzOiB0aGlzLmNoYW5nZVN0YXR1c0NvbnRleHQuc3RhdHVzLFxuICAgICAgICAgIGV2ZW50OiB0aGlzLmNoYW5nZVN0YXR1c0NvbnRleHQuZXZlbnRzWzBdLFxuICAgICAgICAgIGNvbW1lbnQ6IHRoaXMuY2hhbmdlU3RhdHVzQ29udGV4dC5jb21tZW50XG4gICAgICAgIH0pXG4gICAgICApO1xuICAgIH1cbiAgICB0aGlzLnRvZ2dsZUNvbmZpcm0oKTtcbiAgfVxuXG4gIHRvZ2dsZUNvbmZpcm0oKSB7XG4gICAgaWYgKCF0aGlzLm92ZXJsYXlSZWYpIHtcbiAgICAgIHRoaXMub3ZlcmxheVJlZiA9IHRoaXMub3ZlcmxheS5jcmVhdGUoXG4gICAgICAgIG5ldyBPdmVybGF5Q29uZmlnKHtcbiAgICAgICAgICBoYXNCYWNrZHJvcDogdHJ1ZSxcbiAgICAgICAgICBiYWNrZHJvcENsYXNzOiAnYmFja2Ryb3AtZGFyaycsXG4gICAgICAgICAgcGFuZWxDbGFzczogWydvLWh2eS1jbG9zZS1jb25maXJtJ11cbiAgICAgICAgfSlcbiAgICAgICk7XG4gICAgICB0aGlzLm92ZXJsYXlSZWYuYmFja2Ryb3BDbGljaygpLnN1YnNjcmliZSgoKSA9PiB0aGlzLnRvZ2dsZUNvbmZpcm0oKSk7XG4gICAgICB0aGlzLm92ZXJsYXlSZWYuYXR0YWNoKG5ldyBUZW1wbGF0ZVBvcnRhbCh0aGlzLmNvbmZpcm1EaWFsb2csIHRoaXMudmlld0NvbnRhaW5lclJlZikpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLm92ZXJsYXlSZWYuZGlzcG9zZSgpO1xuICAgICAgdGhpcy5vdmVybGF5UmVmID0gdW5kZWZpbmVkO1xuICAgIH1cbiAgfVxuXG4gIG9uTW91c2VEb3duKCRldmVudDogTW91c2VFdmVudCkge1xuICAgIHRoaXMuZHJhZ1RhcmdldCA9ICRldmVudC50YXJnZXQ7XG4gIH1cblxuICBkcmFnU3RhcnQoJGV2ZW50OiBNb3VzZUV2ZW50LCBhY3Rpb246IEh5cEFjdGlvbiwgaW5kZXg6IG51bWJlcikge1xuICAgIGlmICh0aGlzLmRyYWdUYXJnZXQgJiYgKHRoaXMuZHJhZ1RhcmdldCBhcyBIVE1MRGl2RWxlbWVudCkuc3R5bGUubWFza0ltYWdlLmluZGV4T2YoJ3NpeF9kb3QnKSA+IC0xKSB7XG4gICAgICB0aGlzLm1vdmluZ0FjdGlvbiA9IGFjdGlvbjtcbiAgICAgIHRoaXMubW92ZVN0YXJ0ID0gJGV2ZW50LmNsaWVudFk7XG4gICAgICB0aGlzLm1vdmVJbml0aWFsSW5kZXggPSBpbmRleDtcbiAgICAgIHRoaXMuaW5pdGlhbEFjdGlvbkxpc3QgPSBbLi4udGhpcy5wcm9jZWR1cmUhLmFjdGlvbnNdO1xuICAgIH0gZWxzZSB7XG4gICAgICAkZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICB9XG4gIH1cblxuICBtb3ZlKCRldmVudDogTW91c2VFdmVudCkge1xuICAgICRldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIGlmICh0aGlzLm1vdmluZ0FjdGlvbikge1xuICAgICAgY29uc3Qgb2Zmc2V0SW5DYXJkcyA9IE1hdGgucm91bmQoKCRldmVudC5jbGllbnRZIC0gdGhpcy5tb3ZlU3RhcnQpIC8gRXZlbnREZXRhaWxDb21wb25lbnQuQ0FSRF9IRUlHSFQpO1xuICAgICAgaWYgKHRoaXMucHJldmlvdXNPZmZzZXQgIT09IG9mZnNldEluQ2FyZHMpIHtcbiAgICAgICAgdGhpcy5wcmV2aW91c09mZnNldCA9IG9mZnNldEluQ2FyZHM7XG4gICAgICAgIGNvbnN0IG5ld0luZGV4ID0gTWF0aC5taW4oXG4gICAgICAgICAgTWF0aC5tYXgodGhpcy5tb3ZlSW5pdGlhbEluZGV4ICsgb2Zmc2V0SW5DYXJkcywgMCksXG4gICAgICAgICAgdGhpcy5pbml0aWFsQWN0aW9uTGlzdC5sZW5ndGggLSAxXG4gICAgICAgICk7XG4gICAgICAgIGNvbnN0IG5ld1RhYiA9IFsuLi50aGlzLmluaXRpYWxBY3Rpb25MaXN0XTtcbiAgICAgICAgY29uc3QgZWxlbWVudCA9IG5ld1RhYi5zcGxpY2UodGhpcy5tb3ZlSW5pdGlhbEluZGV4LCAxKVswXTtcbiAgICAgICAgbmV3VGFiLnNwbGljZShuZXdJbmRleCwgMCwgZWxlbWVudCk7XG4gICAgICAgIHRoaXMucHJvY2VkdXJlTW9kaWZpY2F0aW9ucy5hY3Rpb25zID0gbmV3VGFiO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGRyb3AoJGV2ZW50OiBNb3VzZUV2ZW50KSB7XG4gICAgJGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgdGhpcy5tb3ZlKCRldmVudCk7XG4gICAgdGhpcy5tb3ZpbmdBY3Rpb24gPSB1bmRlZmluZWQ7XG4gICAgdGhpcy5fb3V0cHV0TW9kaWZpY2F0aW9ucygpO1xuICB9XG5cbiAgYWxsb3dEcm9wKCRldmVudDogTW91c2VFdmVudCkge1xuICAgICRldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICB9XG5cbiAgY29uZmlybURpc2FibGVkKCkge1xuICAgIHJldHVybiB0aGlzLmNoYW5nZVN0YXR1c0NvbnRleHQuY29tbWVudC5sZW5ndGggPT09IDA7XG4gIH1cbn1cbiIsIjxkaXYgY2xhc3M9XCJvLWh2eS1ldmVudHMtZGV0YWlsXCI+XG4gIDxkaXYgY2xhc3M9XCJvLWh2eS1ldmVudHMtZGV0YWlsX19oZWFkZXJcIj5cbiAgICA8ZGl2IGNsYXNzPVwiby1odnktZXZlbnRzLWRldGFpbF9faGVhZGVyX19zcGxpdFwiPlxuICAgICAgPGgxPnt7ICdAaHZ5LmV2ZW50LmRldGFpbCcgfCBpMThuIH19PC9oMT5cbiAgICAgIEBpZiAoZXZlbnRzLmxlbmd0aCA+IDEpIHtcbiAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImEtYnRuIGEtYnRuLS1zZWNvbmRhcnkgLWZpeC1yaWdodFwiIFtkaXNhYmxlZF09XCIhY2FuQ2xvc2VTb21lXCJcbiAgICAgICAgICAgICAgICAoY2xpY2spPVwiY2xvc2VBbGwoKVwiPnt7IChjYW5DbG9zZVNvbWUgPyAnQGh2eS5ldmVudC5sb2cuZXZlbnQuY2xvc2UnIDogJ0BodnkuZXZlbnQubG9nLmV2ZW50LmNsb3NlZCcpIHwgaTE4biB9fVxuICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgQGlmICghY2FuQ2xvc2VTb21lKSB7XG4gICAgICAgICAgPGRpdlxuICAgICAgICAgICAgY2xhc3M9XCJhLXRvb2x0aXBcIlxuICAgICAgICAgICAgW2F0dHIuZGF0YS10b29sdGlwXT1cIicuLi4gVE9ETzogZ2V0IGNsb3NpbmcgY29tbWVudCAuLi4nXCJcbiAgICAgICAgICAgIGRhdGEtdG9vbHRpcC1wb3NpdGlvbj1cImJvdHRvbVwiPlxuICAgICAgICAgICAgPHByeS1pY29uIGljb25Tdmc9XCJpXCIgW2hlaWdodF09XCIxOFwiIFt3aWR0aF09XCIxOFwiPmk8L3ByeS1pY29uPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICB9XG4gICAgICB9XG4gICAgPC9kaXY+XG4gICAgPGRpdiBjbGFzcz1cIm8taHZ5LWV2ZW50cy1kZXRhaWxfX2hlYWRlcl9fc3BsaXRcIj5cbiAgICAgIDxidXR0b24gY2xhc3M9XCJhLWJ0biBhLWJ0bi0tc2Vjb25kYXJ5XCI+e3sgJ0BodnkuZXZlbnQubG9nLnByb2NlZHVyZS5kZWxldGUnIHwgaTE4biB9fTwvYnV0dG9uPlxuICAgIDwvZGl2PlxuICA8L2Rpdj5cbiAgPGRpdiBjbGFzcz1cIm8taHZ5LWV2ZW50cy1kZXRhaWxfX2NvbnRhaW5lclwiPlxuICAgIDxkaXYgY2xhc3M9XCJvLWh2eS1ldmVudHMtZGV0YWlsX19jb250YWluZXJfX3Njcm9sbGFibGVcIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJvLWh2eS1ldmVudHMtZGV0YWlsX19ldmVudHNcIj5cbiAgICAgICAgQGZvciAoZXZlbnQgb2YgZXZlbnRzOyB0cmFjayBldmVudC5pZDsgbGV0IGlkeCA9ICRpbmRleCkge1xuICAgICAgICAgIDxkaXYgY2xhc3M9XCJvLWh2eS1ldmVudHMtZGV0YWlsX19ldmVudHNfX2V2ZW50XCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiby1odnktZXZlbnRzLWRldGFpbF9fZXZlbnRzX19ldmVudF9faGVhZGVyXCI+XG4gICAgICAgICAgICAgIDxwcnktaWNvbiBbaWNvblN2Z109XCIhb3BlbmVkW2lkeF0gPyAnY2hldnJvbl9ib3R0b20nIDogJ2NoZXZyb25fdG9wJ1wiIChjbGljayk9XCJ0b2dnbGUoaWR4KVwiPjwvcHJ5LWljb24+XG4gICAgICAgICAgICAgIDxodnktaWNvbi1kaXNwbGF5IFtldmVudF09XCJldmVudFwiPjwvaHZ5LWljb24tZGlzcGxheT5cbiAgICAgICAgICAgICAgPGgyPnt7IGV2ZW50Lm5hbWUgfX08L2gyPlxuICAgICAgICAgICAgICA8aHZ5LXN0YXR1cy1kaXNwbGF5IFtldmVudF09XCJldmVudFwiIFttb2RpZmlhYmxlXT1cImV2ZW50LnN0YXR1cyAhPT0gJ0RPTkUnXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobW9kaWZpZWQpPVwiY2hhbmdlU3RhdHVzKCRldmVudCwgZXZlbnQpXCI+PC9odnktc3RhdHVzLWRpc3BsYXk+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJvLWh2eS1ldmVudHMtZGV0YWlsX19ldmVudHNfX2V2ZW50X19jb250ZW50XCI+XG4gICAgICAgICAgICAgIEBpZiAoIW9wZW5lZFtpZHhdKSB7XG4gICAgICAgICAgICAgICAgPGRpdj57eyAnQGh2eS5ldmVudC5sb2cuZXZlbnQuZGVzY3JpcHRpb24nIHwgaTE4biB9fToge3sgZXZlbnQuZGVzY3JpcHRpb24gfX08L2Rpdj5cbiAgICAgICAgICAgICAgICA8ZGl2Pnt7ICdAaHZ5LmV2ZW50LmxvZy5ldmVudC5hZGRyZXNzJyB8IGkxOG4gfX06IHt7IGV2ZW50LmFkZHJlc3MgfX08L2Rpdj5cbiAgICAgICAgICAgICAgfSBAZWxzZSB7XG4gICAgICAgICAgICAgICAgQGlmIChhY2Nlc3MoZXZlbnQpOyBhcyBhY2Nlc3NWYWx1ZSkge1xuICAgICAgICAgICAgICAgICAgPGgzPnt7ICdAaHZ5LmV2ZW50LmxvZy5ldmVudC5kZXRhaWwnIHwgaTE4biB9fTwvaDM+XG4gICAgICAgICAgICAgICAgICA8dGFibGU+XG4gICAgICAgICAgICAgICAgICAgIDx0Ym9keT5cbiAgICAgICAgICAgICAgICAgICAgPHRyPlxuICAgICAgICAgICAgICAgICAgICAgIDx0ZD57eyAnQGh2eS5ldmVudC5sb2cuZXZlbnQubmFtZScgfCBpMThuIH19PHNwYW4gY2xhc3M9XCJyZXF1aXJlZFwiPio8L3NwYW4+PC90ZD5cbiAgICAgICAgICAgICAgICAgICAgICA8dGQ+PGlucHV0IHR5cGU9XCJ0ZXh0XCIgY2xhc3M9XCJhLWZvcm0tZmllbGRcIiBbY2xhc3MuLWVycm9yXT1cImhhc0Vycm9yKCduYW1lJywgaWR4KVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbdmFsdWVdPVwiZXZlbnQubmFtZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2hhbmdlKT1cIm1vZGlmeUV2ZW50KGlkeCwgJ25hbWUnLCAkZXZlbnQpXCIgW3JlYWRvbmx5XT1cImFjY2Vzc1ZhbHVlLm5hbWVcIj48L3RkPlxuICAgICAgICAgICAgICAgICAgICA8L3RyPlxuICAgICAgICAgICAgICAgICAgICA8dHI+XG4gICAgICAgICAgICAgICAgICAgICAgPHRkPnt7ICdAaHZ5LmV2ZW50LmxvZy5ldmVudC5jYXRlZ29yeScgfCBpMThuIH19PHNwYW4gY2xhc3M9XCJyZXF1aXJlZFwiPio8L3NwYW4+PC90ZD5cbiAgICAgICAgICAgICAgICAgICAgICA8dGQ+XG4gICAgICAgICAgICAgICAgICAgICAgICA8cHJ5LXNlbGVjdCBbbmdNb2RlbF09XCJldmVudC5jYXRlZ29yeVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbaXRlbXNdPVwiY2F0ZWdvcmllcyhldmVudClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzLi1lcnJvcl09XCJoYXNFcnJvcignY2F0ZWdvcnknLCBpZHgpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChuZ01vZGVsQ2hhbmdlKT1cIm1vZGlmeUV2ZW50KGlkeCwgJ2NhdGVnb3J5JywgJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpMThuUHJlZml4PVwiQGh2eS5ldmVudC5jYXRlZ29yeS5cIiBbZGlzYWJsZWRdPVwiYWNjZXNzVmFsdWUuY2F0ZWdvcnlcIj48L3ByeS1zZWxlY3Q+XG4gICAgICAgICAgICAgICAgICAgICAgPC90ZD5cbiAgICAgICAgICAgICAgICAgICAgPC90cj5cbiAgICAgICAgICAgICAgICAgICAgPHRyPlxuICAgICAgICAgICAgICAgICAgICAgIDx0ZD57eyAnQGh2eS5ldmVudC5jcml0aWNhbGl0eS5uYW1lJyB8IGkxOG4gfX08c3BhbiBjbGFzcz1cInJlcXVpcmVkXCI+Kjwvc3Bhbj48L3RkPlxuICAgICAgICAgICAgICAgICAgICAgIDx0ZD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxwcnktc2VsZWN0IFtuZ01vZGVsXT1cImV2ZW50LmNyaXRpY2FsaXR5XCIgW2l0ZW1zXT1cImNyaXRpY2FsaXRpZXNcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzLi1lcnJvcl09XCJoYXNFcnJvcignY3JpdGljYWxpdHknLCBpZHgpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkxOG5QcmVmaXg9XCJAaHZ5LmV2ZW50LmNyaXRpY2FsaXR5LlwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiYWNjZXNzVmFsdWUuY3JpdGljYWxpdHlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG5nTW9kZWxDaGFuZ2UpPVwibW9kaWZ5RXZlbnQoaWR4LCAnY3JpdGljYWxpdHknLCAkZXZlbnQpXCI+PC9wcnktc2VsZWN0PlxuICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+XG4gICAgICAgICAgICAgICAgICAgIDwvdHI+XG4gICAgICAgICAgICAgICAgICAgIDx0cj5cbiAgICAgICAgICAgICAgICAgICAgICA8dGQ+e3sgJ0BodnkuZXZlbnQubG9nLmV2ZW50LmRlc2NyaXB0aW9uJyB8IGkxOG4gfX08c3BhbiBjbGFzcz1cInJlcXVpcmVkXCI+Kjwvc3Bhbj48L3RkPlxuICAgICAgICAgICAgICAgICAgICAgIDx0ZD48dGV4dGFyZWEgW25nTW9kZWxdPVwiZXZlbnQuZGVzY3JpcHRpb25cIiBjbGFzcz1cImEtZm9ybS1maWVsZFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3MuLWVycm9yXT1cImhhc0Vycm9yKCdkZXNjcmlwdGlvbicsIGlkeClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3JlYWRvbmx5XT1cImFjY2Vzc1ZhbHVlLmRlc2NyaXB0aW9uXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChuZ01vZGVsQ2hhbmdlKT1cIm1vZGlmeUV2ZW50KGlkeCwgJ2Rlc2NyaXB0aW9uJywgJGV2ZW50KVwiPjwvdGV4dGFyZWE+PC90ZD5cbiAgICAgICAgICAgICAgICAgICAgPC90cj5cbiAgICAgICAgICAgICAgICAgICAgPHRyPlxuICAgICAgICAgICAgICAgICAgICAgIDx0ZD57eyAnQGh2eS5ldmVudC5sb2cuZXZlbnQuYWRkcmVzcycgfCBpMThuIH19PC90ZD5cbiAgICAgICAgICAgICAgICAgICAgICA8dGQ+PHRleHRhcmVhIFtuZ01vZGVsXT1cImV2ZW50LmFkZHJlc3NcIiBjbGFzcz1cImEtZm9ybS1maWVsZFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3MuLWVycm9yXT1cImhhc0Vycm9yKCdhZGRyZXNzJywgaWR4KVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbcmVhZG9ubHldPVwiYWNjZXNzVmFsdWUuYWRkcmVzc1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobmdNb2RlbENoYW5nZSk9XCJtb2RpZnlFdmVudChpZHgsICdhZGRyZXNzJywgJGV2ZW50KVwiPjwvdGV4dGFyZWE+PC90ZD5cbiAgICAgICAgICAgICAgICAgICAgPC90cj5cbiAgICAgICAgICAgICAgICAgICAgICBAaWYgKFsnQUxFUlQnLCAnUkVQT1JUJ10uaW5jbHVkZXMoZXZlbnQudHlwZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIDx0cj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkPnt7ICdAaHZ5LmV2ZW50LnNvdXJjZScgfCBpMThuIH19PC90ZD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkPjxpbnB1dCB0eXBlPVwidGV4dFwiIGNsYXNzPVwiYS1mb3JtLWZpZWxkXCIgW3ZhbHVlXT1cImV2ZW50LmV4dGVybmFsU291cmNlUmVmID8/ICcnXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3MuLWVycm9yXT1cImhhc0Vycm9yKCdzb3VyY2UnLCBpZHgpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbcmVhZG9ubHldPVwiYWNjZXNzVmFsdWUuc291cmNlXCIgKGNoYW5nZSk9XCJtb2RpZnlFdmVudChpZHgsICdzb3VyY2UnLCAkZXZlbnQpXCI+PC90ZD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+XG4gICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICA8dHI+XG4gICAgICAgICAgICAgICAgICAgICAgPHRkPnt7ICdAaHZ5LmV2ZW50LmVxdWlwbWVudCcgfCBpMThuIH19PC90ZD5cbiAgICAgICAgICAgICAgICAgICAgICA8dGQ+XG4gICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBjbGFzcz1cImEtZm9ybS1maWVsZFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3ZhbHVlXT1cImV2ZW50LmVxdWlwbWVudD8ubmFtZSA/PyAnJ1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzLi1lcnJvcl09XCJoYXNFcnJvcignZXF1aXBtZW50JywgaWR4KVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3JlYWRvbmx5XT1cImFjY2Vzc1ZhbHVlLmVxTmFtZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNoYW5nZSk9XCJjaGFuZ2VFcXVpcG1lbnQoaWR4LCAkZXZlbnQpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgPC90ZD5cbiAgICAgICAgICAgICAgICAgICAgPC90cj5cbiAgICAgICAgICAgICAgICAgICAgPHRyPlxuICAgICAgICAgICAgICAgICAgICAgIDx0ZD57eyAnQGh2eS5ldmVudC5lcXVpcG1lbnRFbnRpdHknIHwgaTE4biB9fTwvdGQ+XG4gICAgICAgICAgICAgICAgICAgICAgPHRkPjxpbnB1dCB0eXBlPVwidGV4dFwiIGNsYXNzPVwiYS1mb3JtLWZpZWxkXCIgW3ZhbHVlXT1cImV2ZW50LmVxdWlwbWVudD8uZW50aXR5ID8/ICcnXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlYWRvbmx5PjwvdGQ+XG4gICAgICAgICAgICAgICAgICAgIDwvdHI+XG4gICAgICAgICAgICAgICAgICAgIDx0cj5cbiAgICAgICAgICAgICAgICAgICAgICA8dGQ+e3sgJ0BodnkuZXZlbnQuZG9tYWluLm5hbWUnIHwgaTE4biB9fTwvdGQ+XG4gICAgICAgICAgICAgICAgICAgICAgPHRkPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHByeS1zZWxlY3QgW2l0ZW1zXT1cIkRPTUFJTlNcIiBbbmdNb2RlbF09XCJldmVudC5kb21haW5cIiBpMThuUHJlZml4PVwiQGh2eS5ldmVudC5kb21haW4uXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzcy4tZXJyb3JdPVwiaGFzRXJyb3IoJ2RvbWFpbicsIGlkeClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG5nTW9kZWxDaGFuZ2UpPVwibW9kaWZ5RXZlbnQoaWR4LCAnZG9tYWluJywgJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiYWNjZXNzVmFsdWUuZG9tYWluXCJcbiAgICAgICAgICAgICAgICAgICAgICAgID48L3ByeS1zZWxlY3Q+XG4gICAgICAgICAgICAgICAgICAgICAgPC90ZD5cbiAgICAgICAgICAgICAgICAgICAgPC90cj5cbiAgICAgICAgICAgICAgICAgICAgPHRyPlxuICAgICAgICAgICAgICAgICAgICAgIDx0ZD5cbiAgICAgICAgICAgICAgICAgICAgICAgIHt7ICdAaHZ5LmV2ZW50LnN0YXJ0RGF0ZScgfCBpMThuIH19XG4gICAgICAgICAgICAgICAgICAgICAgICBAaWYgKGV2ZW50LmNhdGVnb3J5ID09PSAnTUFOSUZFU1RBVElPTicpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJyZXF1aXJlZFwiPio8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgPC90ZD5cbiAgICAgICAgICAgICAgICAgICAgICA8dGQ+XG4gICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cImRhdGV0aW1lLWxvY2FsXCIgY2xhc3M9XCJhLWZvcm0tZmllbGRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFt2YWx1ZV09XCJldmVudC5zdGFydERhdGUgfCBmb3JEYXRlVGltZUxvY2FsXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3MuLWVycm9yXT1cImhhc0Vycm9yKCdzdGFydERhdGUnLCBpZHgpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbcmVhZG9ubHldPVwiYWNjZXNzVmFsdWUuc3RhcnREYXRlXCIgKGNoYW5nZSk9XCJtb2RpZnlFdmVudChpZHgsICdzdGFydERhdGUnLCAkZXZlbnQpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgPC90ZD5cbiAgICAgICAgICAgICAgICAgICAgPC90cj5cbiAgICAgICAgICAgICAgICAgICAgPHRyPlxuICAgICAgICAgICAgICAgICAgICAgIDx0ZD5cbiAgICAgICAgICAgICAgICAgICAgICAgIHt7ICdAaHZ5LmV2ZW50LmVuZERhdGUnIHwgaTE4biB9fVxuICAgICAgICAgICAgICAgICAgICAgICAgQGlmIChldmVudC5jYXRlZ29yeSA9PT0gJ01BTklGRVNUQVRJT04nKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwicmVxdWlyZWRcIj4qPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+XG4gICAgICAgICAgICAgICAgICAgICAgPHRkPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJkYXRldGltZS1sb2NhbFwiIGNsYXNzPVwiYS1mb3JtLWZpZWxkXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbdmFsdWVdPVwiZXZlbnQuZW5kRGF0ZSB8IGZvckRhdGVUaW1lTG9jYWxcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzcy4tZXJyb3JdPVwiaGFzRXJyb3IoJ2VuZERhdGUnLCBpZHgpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbcmVhZG9ubHldPVwiYWNjZXNzVmFsdWUuZW5kRGF0ZVwiIChjaGFuZ2UpPVwibW9kaWZ5RXZlbnQoaWR4LCAnZW5kRGF0ZScsICRldmVudClcIj5cbiAgICAgICAgICAgICAgICAgICAgICA8L3RkPlxuICAgICAgICAgICAgICAgICAgICA8L3RyPlxuICAgICAgICAgICAgICAgICAgICA8dHI+XG4gICAgICAgICAgICAgICAgICAgICAgPHRkPnt7ICdAaHZ5LmV2ZW50LmNyZWF0aW9uRGF0ZScgfCBpMThuIH19PC90ZD5cbiAgICAgICAgICAgICAgICAgICAgICA8dGQ+XG4gICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cImRhdGV0aW1lLWxvY2FsXCIgY2xhc3M9XCJhLWZvcm0tZmllbGRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFt2YWx1ZV09XCJldmVudC5jcmVhdGlvbkRhdGUgfCBmb3JEYXRlVGltZUxvY2FsXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWFkb25seT5cbiAgICAgICAgICAgICAgICAgICAgICA8L3RkPlxuICAgICAgICAgICAgICAgICAgICA8L3RyPlxuICAgICAgICAgICAgICAgICAgICA8dHI+XG4gICAgICAgICAgICAgICAgICAgICAgPHRkPnt7ICdAaHZ5LmV2ZW50Lmxhc3RNb2RpZmljYXRpb25EYXRlJyB8IGkxOG4gfX08L3RkPlxuICAgICAgICAgICAgICAgICAgICAgIDx0ZD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwiZGF0ZXRpbWUtbG9jYWxcIiBjbGFzcz1cImEtZm9ybS1maWVsZFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3ZhbHVlXT1cImV2ZW50Lmxhc3RNb2RpZmljYXRpb25EYXRlIHwgZm9yRGF0ZVRpbWVMb2NhbFwiIHJlYWRvbmx5PlxuICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+XG4gICAgICAgICAgICAgICAgICAgIDwvdHI+XG4gICAgICAgICAgICAgICAgICAgIDx0cj5cbiAgICAgICAgICAgICAgICAgICAgICA8dGQ+e3sgJ0BodnkuZXZlbnQuY2xvc2VEYXRlJyB8IGkxOG4gfX08L3RkPlxuICAgICAgICAgICAgICAgICAgICAgIDx0ZD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwiZGF0ZXRpbWUtbG9jYWxcIiBjbGFzcz1cImEtZm9ybS1maWVsZFwiIFt2YWx1ZV09XCJldmVudC5jbG9zZURhdGUgfCBmb3JEYXRlVGltZUxvY2FsXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWFkb25seT5cbiAgICAgICAgICAgICAgICAgICAgICA8L3RkPlxuICAgICAgICAgICAgICAgICAgICA8L3RyPlxuICAgICAgICAgICAgICAgICAgICA8L3Rib2R5PlxuICAgICAgICAgICAgICAgICAgPC90YWJsZT5cbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJvLWh2eS1ldmVudHMtZGV0YWlsX19ldmVudHNfX2V2ZW50X19jb250ZW50X19jb21tZW50c1wiPlxuICAgICAgICAgICAgICAgICAgICA8aDM+e3sgJ0BodnkuZXZlbnQubG9nLmV2ZW50LmNvbW1lbnRzLm5hbWUnIHwgaTE4biB9fTwvaDM+XG4gICAgICAgICAgICAgICAgICAgIDx0ZXh0YXJlYSBbcGxhY2Vob2xkZXJdPVwiKCdAaHZ5LmV2ZW50LmxvZy5ldmVudC5jb21tZW50cy5wbGFjZWhvbGRlcicgfCBpMThuKSArICcuLi4nXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsobmdNb2RlbCldPVwibmV3Q29tZW50Q29udGVudFwiPjwvdGV4dGFyZWE+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJvLWh2eS1ldmVudHMtZGV0YWlsX19ldmVudHNfX2V2ZW50X19jb250ZW50X19jb21tZW50c19fYnV0dG9uXCI+XG4gICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImEtYnRuIGEtYnRuLS1wcmltYXJ5XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJuZXdDb21lbnRDb250ZW50Lmxlbmd0aCA9PT0gMFwiPnt7ICdAaHZ5LmFjdGlvbi5jb21tZW50JyB8IGkxOG4gfX1cbiAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICB9XG4gICAgICA8L2Rpdj5cbiAgICAgIDxkaXYgY2xhc3M9XCJvLWh2eS1ldmVudHMtZGV0YWlsX19wcm9jZWR1cmVcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cIm8taHZ5LWV2ZW50cy1kZXRhaWxfX3Byb2NlZHVyZV9faGVhZGVyXCI+XG4gICAgICAgICAgPGgyPnt7IChldmVudHMubGVuZ3RoID09PSAxID8gJ0BodnkuZXZlbnQubG9nLnByb2NlZHVyZS5uYW1lMScgOiAnQGh2eS5ldmVudC5sb2cucHJvY2VkdXJlLm5hbWUnKSB8IGkxOG4gfX08L2gyPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgQGlmIChwcm9jZWR1cmUpIHtcbiAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgPHA+e3sgcHJvY2VkdXJlLm5hbWUgfX08L3A+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cIm8taHZ5LWV2ZW50cy1kZXRhaWxfX3Byb2NlZHVyZV9fcHJvZ3Jlc3NcIj5cbiAgICAgICAgICAgIDxwPnt7ICdAaHZ5LmV2ZW50LmxvZy5wcm9jZWR1cmUucHJvZ3Jlc3MnIHwgaTE4biB9fTwvcD5cbiAgICAgICAgICAgIDxodnktcHJvZ3Jlc3MtZGlzcGxheSBbcHJvZ3Jlc3NdPVwicHJvY2VkdXJlLnByb2dyZXNzXCI+PC9odnktcHJvZ3Jlc3MtZGlzcGxheT5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiby1odnktZXZlbnRzLWRldGFpbF9fcHJvY2VkdXJlX19hY3Rpb25zXCIgKGRyYWcpPVwibW92ZSgkZXZlbnQpXCIgKGRyb3ApPVwiZHJvcCgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgIChkcmFnb3Zlcik9XCJhbGxvd0Ryb3AoJGV2ZW50KVwiPlxuICAgICAgICAgICAgQGZvciAoYWN0aW9uIG9mIHByb2NlZHVyZS5hY3Rpb25zOyB0cmFjayBhY3Rpb24uaWQ7IGxldCBpZHggPSAkaW5kZXgpIHtcbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm8taHZ5LWV2ZW50cy1kZXRhaWxfX3Byb2NlZHVyZV9fYWN0aW9uc19fYWN0aW9uXCIgW2RyYWdnYWJsZV09XCJ0cnVlXCJcbiAgICAgICAgICAgICAgICAgICAoZHJhZ3N0YXJ0KT1cImRyYWdTdGFydCgkZXZlbnQsIGFjdGlvbiwgaWR4KVwiIChtb3VzZWRvd24pPVwib25Nb3VzZURvd24oJGV2ZW50KVwiPlxuICAgICAgICAgICAgICAgIDxwcnktaWNvbiBpY29uU3ZnPVwic2l4X2RvdFwiICNoYW5kbGU+PC9wcnktaWNvbj5cbiAgICAgICAgICAgICAgICA8cHJ5LWNoZWNrYm94IFtuZ01vZGVsXT1cImFjdGlvbi5zdGF0dXMgPT09ICdET05FJ1wiPjwvcHJ5LWNoZWNrYm94PlxuICAgICAgICAgICAgICAgIDxkaXY+e3sgYWN0aW9uLm5hbWUgfX08L2Rpdj5cbiAgICAgICAgICAgICAgICA8cHJ5LWljb24gaWNvblN2Zz1cIm1vcmVfaG9yaXpcIj48L3ByeS1pY29uPlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIH0gQGVtcHR5IHtcbiAgICAgICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgICAgICB7eyAnQGh2eS5ldmVudC5sb2cucHJvY2VkdXJlLm5vQWN0aW9uJyB8IGkxOG4gfX1cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICB9XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJhLWJ0biBhLWJ0bi0tcHJpbWFyeVwiPlxuICAgICAgICAgICAgICA8cHJ5LWljb24gaWNvblN2Zz1cImFkZFwiPjwvcHJ5LWljb24+XG4gICAgICAgICAgICAgIHt7ICdAaHZ5LmV2ZW50LmxvZy5wcm9jZWR1cmUuYWRkQWN0aW9uJyB8IGkxOG4gfX1cbiAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICB9IEBlbHNlIHtcbiAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYS1idG4gYS1idG4tLXNlY29uZGFyeVwiPlxuICAgICAgICAgICAge3sgJ0BodnkuYWN0aW9uLmFzc29jaWF0ZScgfCBpMThuIH19XG4gICAgICAgICAgPC9idXR0b24+XG4gICAgICAgIH1cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICA8L2Rpdj5cbjwvZGl2PlxuXG48bmctdGVtcGxhdGUgI2NvbmZpcm1EaWFsb2c+XG4gIDxkaXZcbiAgICBjbGFzcz1cIm8taHZ5LWNsb3NlLWNvbmZpcm1fX2RpYWxvZ1wiXG4gICAgYXJpYS1sYWJlbGxlZGJ5PVwiY29uZmlybVwiXG4gICAgdGFiaW5kZXg9XCItMVwiXG4gICAgaWQ9XCJjaG9pY2VcIlxuICAgIHJvbGU9XCJkaWFsb2dcIlxuICAgIGFyaWEtbW9kYWw9XCJ0cnVlXCJcbiAgPlxuICAgIDxoMj57eyAoY2hhbmdlU3RhdHVzQ29udGV4dC5ldmVudHMubGVuZ3RoID09PSAxID8gJ0BodnkuZXZlbnQuY2xvc2Uub25lJyA6ICdAaHZ5LmV2ZW50LmNsb3NlLm11bHRpJykgfCBpMThuIH19PC9oMj5cbiAgICA8dWw+XG4gICAgICBAZm9yIChldmVudCBvZiBjaGFuZ2VTdGF0dXNDb250ZXh0LmV2ZW50czsgdHJhY2sgZXZlbnQuaWQpIHtcbiAgICAgICAgPGxpPnt7IGV2ZW50Lm5hbWUgfX08L2xpPlxuICAgICAgfVxuICAgIDwvdWw+XG4gICAgPHAgY2xhc3M9XCJvLWh2eS1jbG9zZS1jb25maXJtX19kaWFsb2dfX2NvbW1lbnQtdGl0bGVcIj5cbiAgICAgIHt7ICdAaHZ5LmV2ZW50LmNsb3NlLmNvbW1lbnQnIHwgaTE4biB9fTxzcGFuIGNsYXNzPVwicmVxdWlyZWRcIj4qPC9zcGFuPjpcbiAgICA8L3A+XG4gICAgPGRpdiBjbGFzcz1cIm8taHZ5LWNsb3NlLWNvbmZpcm1fX2RpYWxvZ19fY29tbWVudFwiPlxuICAgICAgPHRleHRhcmVhIFsobmdNb2RlbCldPVwiY2hhbmdlU3RhdHVzQ29udGV4dC5jb21tZW50XCIgY2xhc3M9XCJhLWZvcm0tZmllbGRcIj48L3RleHRhcmVhPlxuICAgIDwvZGl2PlxuICAgIDxkaXYgY2xhc3M9XCJvLWh2eS1jbG9zZS1jb25maXJtX19kaWFsb2dfX2FjdGlvbnNcIj5cbiAgICAgIDxidXR0b24gY2xhc3M9XCJhLWJ0biBhLWJ0bi0tcHJpbWFyeVwiIChjbGljayk9XCJjb25maXJtZWRDbG9zZSgpXCJcbiAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cImNvbmZpcm1EaXNhYmxlZCgpXCI+e3sgJ0BodnkuYWN0aW9uLnZhbGlkYXRlJyB8IGkxOG4gfX1cbiAgICAgIDwvYnV0dG9uPlxuICAgICAgPGJ1dHRvbiBjbGFzcz1cImEtYnRuIGEtYnRuLS1zZWNvbmRhcnlcIiAoY2xpY2spPVwidG9nZ2xlQ29uZmlybSgpXCI+e3sgJ0BodnkuYWN0aW9uLmNhbmNlbCcgfCBpMThuIH19PC9idXR0b24+XG4gICAgPC9kaXY+XG4gIDwvZGl2PlxuPC9uZy10ZW1wbGF0ZT5cbiJdfQ==
|