bpm-core 0.0.18 → 0.0.20

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (27) hide show
  1. package/esm2022/lib/app/app.component.mjs +22 -12
  2. package/esm2022/lib/components/app-component-sections/form-section/form-section.component.mjs +10 -8
  3. package/esm2022/lib/components/app-component-sections/main-request-details/main-request-details.component.mjs +5 -3
  4. package/esm2022/lib/components/app-component-sections/service-header/service-header.component.mjs +8 -5
  5. package/esm2022/lib/components/app-component-sections/workflow-section/workflow-section.component.mjs +4 -4
  6. package/esm2022/lib/i18n/en.mjs +2 -1
  7. package/esm2022/lib/interfaces/form.interface.mjs +1 -1
  8. package/esm2022/lib/services/core.service.ts.mjs +299 -168
  9. package/esm2022/lib/testComponent/config/segment-dynamic-loader.config.mjs +8 -0
  10. package/esm2022/lib/testComponent/general-approver-section/general-approver-section.component.mjs +52 -0
  11. package/esm2022/lib/testComponent/services/i18n.service.mjs +39 -0
  12. package/esm2022/lib/testComponent/services/segment-dynamic-loader.service.mjs +54 -0
  13. package/esm2022/lib/testComponent/services/state-machine.service.mjs +148 -0
  14. package/fesm2022/bpm-core.mjs +4779 -4353
  15. package/fesm2022/bpm-core.mjs.map +1 -1
  16. package/lib/app/app.component.d.ts +4 -2
  17. package/lib/components/app-component-sections/form-section/form-section.component.d.ts +1 -1
  18. package/lib/components/app-component-sections/service-header/service-header.component.d.ts +4 -4
  19. package/lib/i18n/en.d.ts +1 -0
  20. package/lib/interfaces/form.interface.d.ts +2 -2
  21. package/lib/services/core.service.ts.d.ts +1 -0
  22. package/lib/testComponent/config/segment-dynamic-loader.config.d.ts +8 -0
  23. package/lib/testComponent/general-approver-section/general-approver-section.component.d.ts +21 -0
  24. package/lib/testComponent/services/i18n.service.d.ts +11 -0
  25. package/lib/testComponent/services/segment-dynamic-loader.service.d.ts +17 -0
  26. package/lib/testComponent/services/state-machine.service.d.ts +29 -0
  27. package/package.json +2 -2
@@ -16,6 +16,7 @@ export class CoreService {
16
16
  userData;
17
17
  localUser;
18
18
  loggedInUserData;
19
+ currentActor;
19
20
  constructor(http, config) {
20
21
  this.http = http;
21
22
  this.config = config;
@@ -125,6 +126,154 @@ export class CoreService {
125
126
  return throwError(httpError);
126
127
  });
127
128
  }
129
+ /*successWm(...args: any[]) {
130
+ let [payload] = args;
131
+ let wasSendBack = false;
132
+ /!* Convert into Form Object *!/
133
+ let result = new Form(
134
+ constants.NO_VALUE,
135
+ constants.NO_VALUE,
136
+ constants.NO_VALUE,
137
+ constants.NO_VALUE,
138
+ constants.NO_VALUE,
139
+ constants.NO_VALUE,
140
+ constants.NO_VALUE
141
+ );
142
+ // keep emails on-track
143
+ let payloadFormDetails = payload.data.form;
144
+ let isReadOnly = (payloadFormDetails.readOnly.toUpperCase() === constants.TRUE_STRING ? constants.TRUE_BOOL : (payloadFormDetails.readOnly.toUpperCase() === constants.FALSE_STRING ? constants.FALSE_BOOL : constants.NO_VALUE))
145
+ result.header = new Header(
146
+ payload.data?.['requester'].fullName,
147
+ constants.IGATE_STATIC_ASSET_PROFILE_PHOTO_URL + payload.data.requester.employeeEmail,
148
+ (payloadFormDetails.formId ? payloadFormDetails.formId : constants.DONT_SHOW),
149
+ (payloadFormDetails.creationDate ? payloadFormDetails.creationDate : constants.DONT_SHOW),
150
+ payloadFormDetails.formStatus,
151
+ payloadFormDetails.details
152
+ );
153
+ // this.isReadOnly = payloadFormDetails.readOnly
154
+ /!* Generate Profile Information Object *!/
155
+ let payloadProfileInfo = payload.data?.['requester'];
156
+ result.profileInfoDrop = new ProfileInfoDrop(
157
+ (payloadProfileInfo.onBehalfAuthorized ? JSON.parse(payloadProfileInfo.onBehalfAuthorized) : null),
158
+ payloadProfileInfo?.['employeeId'],
159
+ payloadProfileInfo.employeeEmail,
160
+ payloadProfileInfo.fullName,
161
+ payloadProfileInfo.generalDepartmentName,
162
+ payloadProfileInfo.jobPosition,
163
+ payloadProfileInfo?.['sectorName'],
164
+ payloadProfileInfo.departmentName,
165
+ payloadProfileInfo.generalDepartmentCode,
166
+ payloadProfileInfo?.['humanResourceLocation'],
167
+ payloadProfileInfo.nationality,
168
+ payloadProfileInfo.businessPhone,
169
+ payloadProfileInfo?.['directManagerName']
170
+ );
171
+ /!* Generate Sections Object *!/
172
+ result.sections = [];
173
+ /!* Push as first object the section for the request details *!/
174
+ let requestDetailsHasComment = false;
175
+ if (payload.data.request.details.comment) {
176
+ requestDetailsHasComment = true;
177
+ }
178
+ result.sections.push(
179
+ new Section(
180
+ constants.SECTION_ID_REQUEST_DETAILS,
181
+ new SectionHeader(
182
+ constants.DONT_SHOW,
183
+ constants.DONT_SHOW,
184
+ constants.DONT_SHOW,
185
+ constants.DONT_SHOW,
186
+ constants.DONT_SHOW,
187
+ constants.DONT_SHOW,
188
+ constants.DONT_SHOW,
189
+ requestDetailsHasComment,
190
+ (payload.data.workflowSteps ? constants.READ_ONLY : isReadOnly)
191
+ ),
192
+ payload.data.request
193
+ )
194
+ );
195
+
196
+
197
+ let payloadWorkflowSteps = payload.data.workflowSteps;
198
+ if (payloadWorkflowSteps && payloadWorkflowSteps.constructor === Array && payloadWorkflowSteps.length > 0) {
199
+ payloadWorkflowSteps.forEach((step, index) => {
200
+ let currentIsRequesterSendBack = JSON.stringify(step.details) === JSON.stringify({});
201
+ let hasComments = (!currentIsRequesterSendBack && (step.details.comment || step.comment) ? constants.HAS_COMMENTS : constants.NO_COMMENTS);
202
+ this.currentActor = (step.actor.email === step.actor.recipient.email ? step.actor.recipient : (step.actor.delegate ? step.actor.delegate : null))
203
+ if (hasComments) {
204
+ result.commentsDrop = (!result.commentsDrop ? [] : result.commentsDrop);
205
+ }
206
+
207
+ if (wasSendBack && step.actor.recipient.role === 'REQUESTER') {
208
+ console.log("wasSendBack && REQUESTER")
209
+ result.sections = [new Section(
210
+ constants.SECTION_ID_REQUEST_DETAILS,
211
+ new SectionHeader(
212
+ constants.DONT_SHOW,
213
+ constants.DONT_SHOW,
214
+ constants.DONT_SHOW,
215
+ constants.DONT_SHOW,
216
+ constants.DONT_SHOW,
217
+ constants.DONT_SHOW,
218
+ constants.DONT_SHOW,
219
+ requestDetailsHasComment,
220
+ (payload.data.workflowSteps ? constants.READ_ONLY : isReadOnly)
221
+ ),
222
+ payload.data.request
223
+ )]
224
+ } else if (wasSendBack) {
225
+ console.log("Pop")
226
+ if (result.sections.length > 1) {
227
+ result.sections.pop();
228
+ }
229
+ wasSendBack = false;
230
+ }
231
+ if (step.details.decision && step.details.decision.key === constants.FORM_STATUS_SEND_BACK) {
232
+ wasSendBack = true;
233
+ } else if (JSON.stringify(step.details) !== JSON.stringify({})) {
234
+ result.sections.push(
235
+ new Section(
236
+ step.actor.recipient.role.toLowerCase() + constants.SECTION_ID_APPROVAL_PARTIAL_NAME,
237
+ new SectionHeader(
238
+ (this.getShortName(this.currentActor?.name)),
239
+ step.date,
240
+ this.getShortName(step.actor.recipient.name),
241
+ constants.IGATE_STATIC_ASSET_PROFILE_PHOTO_URL + step.actor.recipient.email,
242
+ (step.actor.delegate && step.actor.delegate.name ? this.getShortName(step.actor.delegate.name) : null),
243
+ (step.actor.delegate && step.actor.delegate.email ? constants.IGATE_STATIC_ASSET_PROFILE_PHOTO_URL + step.actor.delegate.email : null),
244
+ step.actor.status,
245
+ hasComments,
246
+ (index < payloadWorkflowSteps.length - 1 ? constants.READ_ONLY : isReadOnly)
247
+ ),
248
+ {details: step.details, processingDate: step.date}
249
+ )
250
+ );
251
+ // this.generalService.currentSubmitter = {actor: step.actor, recipient: step.recipient, delegate: step.actor.delegate};
252
+
253
+ }
254
+ });
255
+ }
256
+
257
+
258
+ /!* Create Lov Sections *!/
259
+ result.lovs = (payload.meta && payload.meta.lovs ? payload.meta.lovs : null);
260
+
261
+ if (payload.meta && payload.meta.messages) {
262
+ result.messages = new Messages(
263
+ {},
264
+ [],
265
+ [],
266
+ []
267
+ );
268
+ payload.meta.messages.forEach((message: any) => {
269
+ result.messages[message.type].push(message.message);
270
+ });
271
+ }
272
+ // result.messages = (payload.meta && payload.meta.messages ? payload.meta.messages : null);
273
+ /!* Fix last section to be the RO/WM from the variable *!/
274
+ result.sections[result.sections.length - 1].header.readOnly = isReadOnly;
275
+ return result;
276
+ }*/
128
277
  successWm(...args) {
129
278
  let [payload] = args;
130
279
  // let wasSendBack = false;
@@ -145,175 +294,157 @@ export class CoreService {
145
294
  requestDetailsHasComment = true;
146
295
  }
147
296
  result.sections.push(new Section(constants.SECTION_ID_REQUEST_DETAILS, new SectionHeader(constants.DONT_SHOW, constants.DONT_SHOW, constants.DONT_SHOW, constants.DONT_SHOW, constants.DONT_SHOW, constants.DONT_SHOW, constants.DONT_SHOW, requestDetailsHasComment, (payload.data['workflowSteps'] ? constants.READ_ONLY : isReadOnly)), payload.data.request));
148
- /* if (result.header.formId) {
149
- result.commentsDrop = (!result.commentsDrop ? [] : result.commentsDrop);
150
- this.dispatch(constants.STATE_MACHINE_ACTION_LOAD_HISTORY, result.header.formId).then((responseObject: any) => {
151
- if (responseObject) {
152
- responseObject.items.forEach((item: any) => {
153
- if (item.sequenceNumber !== '0' && item.processedBy) {
154
- const name = item.processedBy.firstName + ' ' + item.processedBy.secondMiddleName + ' ' + item.processedBy.familyName;
155
- result.commentsDrop.push(new CommentsDrop(
156
- constants.IGATE_STATIC_ASSET_PROFILE_PHOTO_URL + item.processedBy.email,
157
- name,
158
- item.comments,
159
- item.modifiedDate,
160
- item.attachments,
161
- item.processedBy.job
162
- ));
163
- }
164
- });
165
- }
166
- });
167
- }
168
- if (result.header.formId && /^DYL/.test(result.header.formId)) {
169
- this.state = constants.STATE_MACHINE_STATUS_IDLE;
170
- result.confidentialComments = [];
171
- this.dispatch('loadConfidentialComments', result.header.formId).then((responseObject: any) => {
172
- if (responseObject && responseObject.items && responseObject.items.length > 0) {
173
- responseObject.items.forEach((item: any) => {
174
- result.confidentialComments.push(new CommentsDrop(
175
- constants.IGATE_STATIC_ASSET_PROFILE_PHOTO_URL + item.email,
176
- item.name,
177
- item.comment,
178
- item.modifiedDate,
179
- item.attachment,
180
- item.position
181
- ));
182
- })
183
- }
184
- });
185
- }
186
-
187
- const inboxType = this.getInboxType(result);
188
- if (result.header.formId && (!this.isOpenOnInbox())) {
189
- this.state = constants.STATE_MACHINE_STATUS_IDLE;
190
- this.dispatch(constants.STATE_MACHINE_ACTION_GET_INBOX_ITEM, result.header.formId, inboxType).then((responseObject) => {
191
- if (responseObject) {
192
- const item = responseObject.item;
193
- result.inboxItem = new InboxItem(
194
- item.flagging.flagPriority,
195
- item.flagging.isFlagged,
196
- item.feedback.canRequestFeedback,
197
- item.feedback.hasFeedback,
198
- item.feedback.isPending,
199
- item.feedback.isRequested,
200
- item.feedback.isResponded
201
- );
202
- }
203
- });
204
- }
205
-
206
- let payloadWorkflowSteps = payload.data.workflowSteps;
207
- if (payloadWorkflowSteps && payloadWorkflowSteps.constructor === Array && payloadWorkflowSteps.length > 0) {
208
- payloadWorkflowSteps.forEach((step, index) => {
209
- let currentIsRequesterSendBack = JSON.stringify(step.details) === JSON.stringify({});
210
- let hasComments = (!currentIsRequesterSendBack && (step.details.comment || step.comment) ? constants.HAS_COMMENTS : constants.NO_COMMENTS);
211
- let currentActor = (step.actor.email === step.actor.recipient.email ? step.actor.recipient : (step.actor.delegate ? step.actor.delegate : null))
212
- if (hasComments) {
213
- result.commentsDrop = (!result.commentsDrop ? [] : result.commentsDrop);
214
- if (step.details.attachment && step.details.attachment.attachmentId && this.config.production) {
215
- this.state = constants.STATE_MACHINE_STATUS_IDLE;
216
- this.dispatch(constants.STATE_MACHINE_ACTION_LOAD_FILE, step.details.attachment.attachmentId).then((responseObject) => {
217
- let fileInformation = responseObject.body;
218
- if (currentActor) {
219
- /!*this.dispatch(constants.STATE_MACHINE_ACTION_EMPLOYEE_PROFILE, currentActor.email).then((profile) => {
220
- result.commentsDrop.push(new CommentsDrop(
221
- constants.IGATE_STATIC_ASSET_PROFILE_PHOTO_URL + currentActor.email,
222
- currentActor.name,
223
- (step.details.comment ? step.details.comment : (step.comment ? step.comment : null)),
224
- step.date,
225
- fileInformation.fileName + "|data:" + fileInformation.mimeType + ";base64," + fileInformation.fileContents,
226
- profile.job.name
227
- ))
228
- })*!/
229
- }
230
- });
231
- this.state = constants.STATE_MACHINE_STATUS_FETCHING;
232
- } else if (step.details.attachmentId) {
233
- this.state = constants.STATE_MACHINE_STATUS_IDLE;
234
- this.dispatch(constants.STATE_MACHINE_ACTION_LOAD_FILE, step.details.attchmentId).then((responseObject) => {
235
- let fileInformation = responseObject.body;
236
- if (currentActor) {
237
- /!*this.dispatch(constants.STATE_MACHINE_ACTION_EMPLOYEE_PROFILE, currentActor.email).then((profile) => {
238
- result.commentsDrop.push(new CommentsDrop(
239
- constants.IGATE_STATIC_ASSET_PROFILE_PHOTO_URL + currentActor.email,
240
- currentActor.name,
241
- (step.details.comment ? step.details.comment : (step.comment ? step.comment : null)),
242
- step.date,
243
- fileInformation.fileName + "|data:" + fileInformation.mimeType + ";base64," + fileInformation.fileContents,
244
- profile.job.name
245
- ))
246
- })*!/
247
- }
248
- });
249
- this.state = constants.STATE_MACHINE_STATUS_FETCHING;
250
- } else {
251
- if (currentActor) {
252
- this.state = constants.STATE_MACHINE_STATUS_IDLE;
253
- /!*this.dispatch(constants.STATE_MACHINE_ACTION_EMPLOYEE_PROFILE, currentActor.email).then((profile) => {
254
- result.commentsDrop.push(new CommentsDrop(
255
- constants.IGATE_STATIC_ASSET_PROFILE_PHOTO_URL + currentActor.email,
256
- currentActor.name,
257
- (step.details.comment ? step.details.comment : (step.comment ? step.comment : null)),
258
- step.date,
259
- null,
260
- profile.job.name
261
- ))
262
- })*!/
263
- }
264
- this.state = constants.STATE_MACHINE_STATUS_FETCHING;
265
- }
266
- }
267
-
268
- if (wasSendBack && step.actor.recipient.role === 'REQUESTER') {
269
- console.log("wasSendBack && REQUESTER")
270
- result.sections = [new Section(
271
- constants.SECTION_ID_REQUEST_DETAILS,
272
- new SectionHeader(
273
- constants.DONT_SHOW,
274
- constants.DONT_SHOW,
275
- constants.DONT_SHOW,
276
- constants.DONT_SHOW,
277
- constants.DONT_SHOW,
278
- constants.DONT_SHOW,
279
- constants.DONT_SHOW,
280
- requestDetailsHasComment,
281
- (payload.data.workflowSteps ? constants.READ_ONLY : isReadOnly)
282
- ),
283
- payload.data.request
284
- )]
285
- } else if (wasSendBack) {
286
- console.log("Pop")
287
- if (result.sections.length > 1) {
288
- result.sections.pop();
289
- }
290
- wasSendBack = false;
291
- }
292
- if (step.details.decision && step.details.decision.key === constants.FORM_STATUS_SEND_BACK) {
293
- wasSendBack = true;
294
- } else if (JSON.stringify(step.details) !== JSON.stringify({})) {
295
- result.sections.push(
296
- new Section(
297
- step.actor.recipient.role.toLowerCase() + constants.SECTION_ID_APPROVAL_PARTIAL_NAME,
297
+ /*if (result.header.formId) {
298
+ result.commentsDrop = (!result.commentsDrop ? [] : result.commentsDrop);
299
+ this.dispatch(constants.STATE_MACHINE_ACTION_LOAD_HISTORY, result.header.formId).then((responseObject: any) => {
300
+ if (responseObject) {
301
+ responseObject.items.forEach((item: any) => {
302
+ if (item.sequenceNumber !== '0' && item.processedBy) {
303
+ const name = item.processedBy.firstName + ' ' + item.processedBy.secondMiddleName + ' ' + item.processedBy.familyName;
304
+ result.commentsDrop.push(new CommentsDrop(
305
+ constants.IGATE_STATIC_ASSET_PROFILE_PHOTO_URL + item.processedBy.email,
306
+ name,
307
+ item.comments,
308
+ item.modifiedDate,
309
+ item.attachments,
310
+ item.processedBy.job
311
+ ));
312
+ }
313
+ });
314
+ }
315
+ });
316
+ }*/
317
+ /*if (result.header.formId && /^DYL/.test(result.header.formId)) {
318
+ this.state = constants.STATE_MACHINE_STATUS_IDLE;
319
+ result.confidentialComments = [];
320
+ this.dispatch('loadConfidentialComments', result.header.formId).then((responseObject: any) => {
321
+ if (responseObject && responseObject.items && responseObject.items.length > 0) {
322
+ responseObject.items.forEach((item: any) => {
323
+ result.confidentialComments.push(new CommentsDrop(
324
+ constants.IGATE_STATIC_ASSET_PROFILE_PHOTO_URL + item.email,
325
+ item.name,
326
+ item.comment,
327
+ item.modifiedDate,
328
+ item.attachment,
329
+ item.position
330
+ ));
331
+ })
332
+ }
333
+ });
334
+ }*/
335
+ /*const inboxType = this.getInboxType(result);
336
+ if (result.header.formId && (!this.isOpenOnInbox())) {
337
+ this.state = constants.STATE_MACHINE_STATUS_IDLE;
338
+ this.dispatch(constants.STATE_MACHINE_ACTION_GET_INBOX_ITEM, result.header.formId, inboxType).then((responseObject) => {
339
+ if (responseObject) {
340
+ const item = responseObject.item;
341
+ result.inboxItem = new InboxItem(
342
+ item.flagging.flagPriority,
343
+ item.flagging.isFlagged,
344
+ item.feedback.canRequestFeedback,
345
+ item.feedback.hasFeedback,
346
+ item.feedback.isPending,
347
+ item.feedback.isRequested,
348
+ item.feedback.isResponded
349
+ );
350
+ }
351
+ });
352
+ }*/
353
+ let payloadWorkflowSteps = payload.data.workflowSteps;
354
+ if (payloadWorkflowSteps && payloadWorkflowSteps.constructor === Array && payloadWorkflowSteps.length > 0) {
355
+ payloadWorkflowSteps.forEach((step, index) => {
356
+ let currentIsRequesterSendBack = JSON.stringify(step.details) === JSON.stringify({});
357
+ let hasComments = (!currentIsRequesterSendBack && (step.details.comment || step.comment) ? constants.HAS_COMMENTS : constants.NO_COMMENTS);
358
+ let currentActor = (step.actor.email === step.actor.recipient.email ? step.actor.recipient : (step.actor.delegate ? step.actor.delegate : null));
359
+ /*if (hasComments) {
360
+ result.commentsDrop = (!result.commentsDrop ? [] : result.commentsDrop);
361
+ if (step.details.attachment && step.details.attachment.attachmentId && this.config.production) {
362
+ this.state = constants.STATE_MACHINE_STATUS_IDLE;
363
+ this.dispatch(constants.STATE_MACHINE_ACTION_LOAD_FILE, step.details.attachment.attachmentId).then((responseObject) => {
364
+ let fileInformation = responseObject.body;
365
+ if (currentActor) {
366
+ /!*this.dispatch(constants.STATE_MACHINE_ACTION_EMPLOYEE_PROFILE, currentActor.email).then((profile) => {
367
+ result.commentsDrop.push(new CommentsDrop(
368
+ constants.IGATE_STATIC_ASSET_PROFILE_PHOTO_URL + currentActor.email,
369
+ currentActor.name,
370
+ (step.details.comment ? step.details.comment : (step.comment ? step.comment : null)),
371
+ step.date,
372
+ fileInformation.fileName + "|data:" + fileInformation.mimeType + ";base64," + fileInformation.fileContents,
373
+ profile.job.name
374
+ ))
375
+ })*!/
376
+ }
377
+ });
378
+ this.state = constants.STATE_MACHINE_STATUS_FETCHING;
379
+ } else if (step.details.attachmentId) {
380
+ this.state = constants.STATE_MACHINE_STATUS_IDLE;
381
+ this.dispatch(constants.STATE_MACHINE_ACTION_LOAD_FILE, step.details.attchmentId).then((responseObject) => {
382
+ let fileInformation = responseObject.body;
383
+ if (currentActor) {
384
+ /!*this.dispatch(constants.STATE_MACHINE_ACTION_EMPLOYEE_PROFILE, currentActor.email).then((profile) => {
385
+ result.commentsDrop.push(new CommentsDrop(
386
+ constants.IGATE_STATIC_ASSET_PROFILE_PHOTO_URL + currentActor.email,
387
+ currentActor.name,
388
+ (step.details.comment ? step.details.comment : (step.comment ? step.comment : null)),
389
+ step.date,
390
+ fileInformation.fileName + "|data:" + fileInformation.mimeType + ";base64," + fileInformation.fileContents,
391
+ profile.job.name
392
+ ))
393
+ })*!/
394
+ }
395
+ });
396
+ this.state = constants.STATE_MACHINE_STATUS_FETCHING;
397
+ } else {
398
+ if (currentActor) {
399
+ this.state = constants.STATE_MACHINE_STATUS_IDLE;
400
+ /!*this.dispatch(constants.STATE_MACHINE_ACTION_EMPLOYEE_PROFILE, currentActor.email).then((profile) => {
401
+ result.commentsDrop.push(new CommentsDrop(
402
+ constants.IGATE_STATIC_ASSET_PROFILE_PHOTO_URL + currentActor.email,
403
+ currentActor.name,
404
+ (step.details.comment ? step.details.comment : (step.comment ? step.comment : null)),
405
+ step.date,
406
+ null,
407
+ profile.job.name
408
+ ))
409
+ })*!/
410
+ }
411
+ this.state = constants.STATE_MACHINE_STATUS_FETCHING;
412
+ }
413
+ }*/
414
+ /* if (wasSendBack && step.actor.recipient.role === 'REQUESTER') {
415
+ console.log("wasSendBack && REQUESTER")
416
+ result.sections = [new Section(
417
+ constants.SECTION_ID_REQUEST_DETAILS,
298
418
  new SectionHeader(
299
- (currentActor ? this.getShortName(currentActor.name) : null),
300
- step.date,
301
- this.getShortName(step.actor.recipient.name),
302
- constants.IGATE_STATIC_ASSET_PROFILE_PHOTO_URL + step.actor.recipient.email,
303
- (step.actor.delegate && step.actor.delegate.name ? this.getShortName(step.actor.delegate.name) : null),
304
- (step.actor.delegate && step.actor.delegate.email ? constants.IGATE_STATIC_ASSET_PROFILE_PHOTO_URL + step.actor.delegate.email : null),
305
- step.actor.status,
306
- hasComments,
307
- (index < payloadWorkflowSteps.length - 1 ? constants.READ_ONLY : isReadOnly)
419
+ constants.DONT_SHOW,
420
+ constants.DONT_SHOW,
421
+ constants.DONT_SHOW,
422
+ constants.DONT_SHOW,
423
+ constants.DONT_SHOW,
424
+ constants.DONT_SHOW,
425
+ constants.DONT_SHOW,
426
+ requestDetailsHasComment,
427
+ (payload.data.workflowSteps ? constants.READ_ONLY : isReadOnly)
308
428
  ),
309
- {details: step.details, processingDate: step.date}
310
- )
311
- );
312
- this.currentSubmitter = {actor: step.actor, recipient: step.recipient, delegate: step.actor.delegate};
313
- }
314
- });
315
- }
316
- */
429
+ payload.data.request
430
+ )]
431
+ } else if (wasSendBack) {
432
+ console.log("Pop")
433
+ if (result.sections.length > 1) {
434
+ result.sections.pop();
435
+ }
436
+ wasSendBack = false;
437
+ }
438
+ */
439
+ if (step.details.decision && step.details.decision.key === constants.FORM_STATUS_SEND_BACK) {
440
+ // wasSendBack = true;
441
+ }
442
+ else if (JSON.stringify(step.details) !== JSON.stringify({})) {
443
+ result.sections.push(new Section(step.actor.recipient.role.toLowerCase() + constants.SECTION_ID_APPROVAL_PARTIAL_NAME, new SectionHeader((currentActor ? this.getShortName(currentActor.name) : "").toString(), step.date, this.getShortName(step.actor.recipient.name).toString(), constants.IGATE_STATIC_ASSET_PROFILE_PHOTO_URL + step.actor.recipient.email, (step.actor.delegate?.name ? this.getShortName(step.actor.delegate.name) : "").toString(), (step.actor.delegate?.email ? constants.IGATE_STATIC_ASSET_PROFILE_PHOTO_URL + step.actor.delegate.email : ""), step.actor.status, hasComments, (index < payloadWorkflowSteps.length - 1 ? constants.READ_ONLY : isReadOnly)), { details: step.details, processingDate: step.date }));
444
+ // this.currentSubmitter = {actor: step.actor, recipient: step.recipient, delegate: step.actor.delegate};
445
+ }
446
+ });
447
+ }
317
448
  /* Create Lov Sections */
318
449
  result.lovs = (payload.meta && payload.meta.lovs ? payload.meta.lovs : null);
319
450
  if (payload.meta && payload.meta.messages) {
@@ -362,4 +493,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.8", ngImpor
362
493
  type: Inject,
363
494
  args: [MY_LIB_CONFIG_TOKEN]
364
495
  }] }] });
365
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29yZS5zZXJ2aWNlLnRzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvYnBtLWNvcmUvc3JjL2xpYi9zZXJ2aWNlcy9jb3JlLnNlcnZpY2UudHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFhLFdBQVcsRUFBQyxNQUFNLHNCQUFzQixDQUFDO0FBQzdELE9BQU8sRUFBQyxNQUFNLEVBQUUsVUFBVSxFQUFDLE1BQU0sZUFBZSxDQUFDO0FBRWpELE9BQU8sRUFBQyxJQUFJLEVBQUUsTUFBTSxFQUFFLFFBQVEsRUFBRSxtQkFBbUIsRUFBRSxlQUFlLEVBQUUsT0FBTyxFQUFFLGFBQWEsRUFBQyxNQUFNLGtCQUFrQixDQUFDO0FBQ3RILE9BQU8sS0FBSyxTQUFTLE1BQU0sY0FBYyxDQUFBO0FBQ3pDLE9BQU8sRUFBQyxVQUFVLEVBQUUsVUFBVSxFQUFDLE1BQU0sTUFBTSxDQUFDO0FBQzVDLE9BQU8sRUFBQyxHQUFHLEVBQUMsTUFBTSxnQkFBZ0IsQ0FBQzs7O0FBS25DLE1BQU0sT0FBTyxXQUFXO0lBVUY7SUFDNkI7SUFWakQsTUFBTSxHQUFXLEVBQUUsQ0FBQTtJQUNYLFNBQVMsQ0FBUztJQUNsQixZQUFZLENBQVM7SUFDWixhQUFhLENBQVM7SUFDaEMsUUFBUSxDQUFTO0lBQ1AsU0FBUyxDQUFLO0lBQ3hCLGdCQUFnQixDQUFPO0lBRzlCLFlBQW9CLElBQWdCLEVBQ2EsTUFBbUI7UUFEaEQsU0FBSSxHQUFKLElBQUksQ0FBWTtRQUNhLFdBQU0sR0FBTixNQUFNLENBQWE7UUFDbEUsTUFBTSxRQUFRLEdBQUksTUFBYyxFQUFFLFFBQVEsRUFBRSxRQUFRLENBQUMsQ0FBQyxDQUFFLE1BQWMsQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7UUFDaEcsSUFBSSxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLG1CQUFtQixHQUFHLFFBQVEs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QUFDLENBQUMsRUFBRSxVQUFVLENBQUMsVUFBVSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztnQkFDekcsQ0FBQztxQkFBTSxDQUFDO29CQUNOLE9BQU8sQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLEVBQUUsVUFBVSxDQUFDLFVBQVUsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7Z0JBQ3RFLENBQUM7WUFDSCxDQUFDO1FBQ0gsQ0FBQzthQUFNLENBQUM7WUFDTixPQUFPLElBQUksQ0FBQztRQUNkLENBQUM7SUFDSCxDQUFDO3VHQXhaVSxXQUFXLDRDQVdGLG1CQUFtQjsyR0FYNUIsV0FBVyxjQUZWLEtBQUs7OzJGQUVOLFdBQVc7a0JBSHZCLFVBQVU7bUJBQUM7b0JBQ1YsVUFBVSxFQUFFLEtBQUs7aUJBQ2xCOzswQkFZYyxNQUFNOzJCQUFDLG1CQUFtQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7SHR0cENsaWVudCwgSHR0cEhlYWRlcnN9IGZyb20gXCJAYW5ndWxhci9jb21tb24vaHR0cFwiO1xyXG5pbXBvcnQge0luamVjdCwgSW5qZWN0YWJsZX0gZnJvbSBcIkBhbmd1bGFyL2NvcmVcIjtcclxuaW1wb3J0IHR5cGUge015TGliQ29uZmlnfSBmcm9tIFwiLi4vaW50ZXJmYWNlcy9zaGFyZWQuaW50ZXJmYWNlXCI7XHJcbmltcG9ydCB7Rm9ybSwgSGVhZGVyLCBNZXNzYWdlcywgTVlfTElCX0NPTkZJR19UT0tFTiwgUHJvZmlsZUluZm9Ecm9wLCBTZWN0aW9uLCBTZWN0aW9uSGVhZGVyfSBmcm9tIFwiLi4vLi4vcHVibGljLWFwaVwiO1xyXG5pbXBvcnQgKiBhcyBjb25zdGFudHMgZnJvbSAnLi4vY29uc3RhbnRzJ1xyXG5pbXBvcnQge2NhdGNoRXJyb3IsIHRocm93RXJyb3J9IGZyb20gXCJyeGpzXCI7XHJcbmltcG9ydCB7bWFwfSBmcm9tIFwicnhqcy9vcGVyYXRvcnNcIjtcclxuXHJcbkBJbmplY3RhYmxlKHtcclxuICBwcm92aWRlZEluOiBcImFueVwiXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBDb3JlU2VydmljZSB7XHJcbiAgYXBpVXJsOiBzdHJpbmcgPSAnJ1xyXG4gIHByaXZhdGUgYXV0aFRva2VuOiBzdHJpbmc7XHJcbiAgcHJpdmF0ZSByZWZyZXNoVG9rZW46IHN0cmluZztcclxuICBwcml2YXRlIHJlYWRvbmx5IHByb2plY3RDb25maWc6IHN0cmluZztcclxuICBwdWJsaWMgdXNlckRhdGE6IHN0cmluZztcclxuICBwcml2YXRlIHJlYWRvbmx5IGxvY2FsVXNlcjoge307XHJcbiAgcHVibGljIGxvZ2dlZEluVXNlckRhdGE6IHsgIH07XHJcblxyXG5cclxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIGh0dHA6IEh0dHBDbGllbnQsXHJcbiAgICAgICAgICAgICAgQEluamVjdChNWV9MSUJfQ09ORklHX1RPS0VOKSBwcml2YXRlIGNvbmZpZzogTXlMaWJDb25maWcpIHtcclxuICAgIGNvbnN0IGxhbmd1YWdlID0gKHdpbmRvdyBhcyBhbnkpPy53bUNvbmZpZz8ubGFuZ3VhZ2UgPyAod2luZG93IGFzIGFueSkud21Db25maWcubGFuZ3VhZ2UgOiAnZW4nO1xyXG4gICAgdGhpcy5hcGlVcmwgPSB0aGlzLmNvbmZpZy5wcm94eVNlcnZpY2VCYXNlVXJsICsgbGFuZ3VhZ2UgKyB0aGlzLmNvbmZpZy5wcm94eUZ1bGxBZGRyZXNzICsgdGhpcy5jb25maWcucHJveHlTZXJ2aWNlRXhlY3V0ZTtcclxuICAgIGNvbnNvbGUubG9nKCdDb25maWc6ICcsIHRoaXMuY29uZmlnKTsgLy8gZm9yIHRlc3RpbmcgcHVycG9zZXMgb25seVxyXG4gICAgdGhpcy5sb2NhbFVzZXIgPSB7XHJcbiAgICAgIFwiZm9ybVByZWZpeFwiOiBcIkNFUFwiLFxyXG4gICAgICBcImZvcm1JZFwiOiBcIkNFUDU1OTU0MzJcIixcclxuICAgICAgXCJpbmJveFVyaVwiOiBcIlxcL2dyb3VwXFwvaHViXFwvaW5ib3hcIixcclxuICAgICAgXCJiYXNlVXJsXCI6IFwiXFwvZ3JvdXBcXC9pLWdhdGVcXC93bS1icG1cXC9mb3Jtc1xcLy1cXC9wcm94eVwiLFxyXG4gICAgICBcInNob3dQcmludFwiOiB0cnVlLFxyXG4gICAgICBcImxhbmd1YWdlXCI6IFwiZW5cIixcclxuICAgICAgXCJpc01vYmlsZVwiOiB0cnVlLFxyXG4gICAgICBcIm91dGxvb2tcIjogZmFsc2UsXHJcbiAgICAgIFwibG9nZ2VkSW5Vc2VyRW1haWxcIjogXCJpYnJhaGltbWFhLmNAc3RjLmNvbS5zYVwiXHJcbiAgICB9XHJcbiAgICB0aGlzLnByb2plY3RDb25maWcgPSAodGhpcy5jb25maWcucHJvZHVjdGlvbikgPyAod2luZG93IGFzIGFueSlbJ3dtQ29uZmlnJ10gOiBidG9hKEpTT04uc3RyaW5naWZ5KHRoaXMubG9jYWxVc2VyKSk7XHJcbiAgICB0aGlzLnVzZXJEYXRhID0gSlNPTi5wYXJzZShhdG9iKHRoaXMucHJvamVjdENvbmZpZykpO1xyXG4gIH1cclxuXHJcbiAgZ2V0TG9nZ2VkSW5Vc2VyRGF0YSgpIHtcclxuICAgIGxldCBsb2dnZWRJbkVtYWlsID0gdGhpcy5sb2dnZWRJblVzZXJJZCgpXHJcbiAgICB0aGlzLmVtcGxveWVlUHJvZmlsZShsb2dnZWRJbkVtYWlsKS5zdWJzY3JpYmUoKHJlc3BvbnNlOiBhbnkpID0+IHtcclxuICAgICAgdGhpcy5sb2dnZWRJblVzZXJEYXRhID0gcmVzcG9uc2U/LltcIlVzZXJzXCJdPy5bMF1cclxuICAgICAgY29uc29sZS5sb2coJ2dldExvZ2dlZEluVXNlckRhdGEnLCByZXNwb25zZSlcclxuICAgIH0pXHJcbiAgfVxyXG5cclxuICBsb2FkRm9ybSgpIHtcclxuICAgIGNvbnN0IGF1dGhVcmwgPSB0aGlzLmJ1aWxkQXV0aFVybCgpO1xyXG4gICAgcmV0dXJuIHRoaXMuaHR0cC5nZXQoYXV0aFVybCwge29ic2VydmU6ICdyZXNwb25zZSd9KS50b1Byb21pc2UoKVxyXG4gICAgICAudGhlbigocmVzOiBhbnkpID0+IHtcclxuICAgICAgICBjb25zdCB0b2tlbkluZm9ybWF0aW9uID0gcmVzLmJvZHk7XHJcbiAgICAgICAgdGhpcy5hdXRoVG9rZW4gPSB0b2tlbkluZm9ybWF0aW9uLnRva2VuO1xyXG4gICAgICAgIHRoaXMuZ2V0TG9nZ2VkSW5Vc2VyRGF0YSgpXHJcbiAgICAgICAgdGhpcy5yZWZyZXNoVG9rZW4gPSB0b2tlbkluZm9ybWF0aW9uLnJlZnJlc2hUb2tlbjtcclxuICAgICAgICBjb25zdCBib2R5ID0gdGhpcy5idWlsZEJvZHkoKTtcclxuICAgICAgICBjb25zdCBvcHRpb25zID0gdGhpcy5nZXRSZXF1ZXN0T3B0aW9ucygpO1xyXG4gICAgICAgIHJldHVybiB0aGlzLmNhbGxQb3N0KGJvZHksIG9wdGlvbnMpO1xyXG4gICAgICB9KVxyXG4gICAgICAuY2F0Y2goKGh0dHBFcnJvcjogYW55KSA9PiB7XHJcbiAgICAgICAgcmV0dXJuIHRocm93RXJyb3IoaHR0cEVycm9yKTtcclxuICAgICAgfSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGJ1aWxkQXV0aFVybCgpOiBzdHJpbmcge1xyXG4gICAgY29uc3QgYmFzZVVybCA9IHRoaXMuY29uZmlnLnByb3h5U2VydmljZUJhc2VVcmw7XHJcbiAgICBjb25zdCBsYW5ndWFnZSA9ICh3aW5kb3cgYXMgYW55KT8ud21Db25maWc/Lmxhbmd1YWdlID8gKHdpbmRvdyBhcyBhbnkpLndtQ29uZmlnLmxhbmd1YWdlIDogJ2VuJztcclxuICAgIGNvbnN0IGZ1bGxBZGRyZXNzID0gdGhpcy5jb25maWcucHJveHlGdWxsQWRkcmVzcztcclxuICAgIGNvbnN0IGF1dGhQYXJ0ID0gdGhpcy5jb25maWcucHJveHlTZXJ2aWNlQXV0aG9yaXphdGlvbjtcclxuICAgIHJldHVybiBgJHtiYXNlVXJsfSR7bGFuZ3VhZ2V9JHtmdWxsQWRkcmVzc30ke2F1dGhQYXJ0fT90cz0keyhuZXcgRGF0ZSgpKS52YWx1ZU9mKCl9YDtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgYnVpbGRCb2R5KCk6IG9iamVjdCB7XHJcbiAgICBjb25zdCBiYXNlQm9keSA9IHtcclxuICAgICAgbWV0aG9kOiBjb25zdGFudHMuSFRUUF9NRVRIT0RfR0VULFxyXG4gICAgICBkZXN0aW5hdGlvbjogY29uc3RhbnRzLlRBUkdFVF9TRVJWRVJfV00sXHJcbiAgICAgIHNlcnZpY2VOYW1lOiBjb25zdGFudHMuU0VSVklDRV9OQU1FX1dNX0ZPUk0sXHJcbiAgICAgIGZvcm1OYW1lOiB0aGlzLmNvbmZpZy5mb3JtTmFtZSxcclxuICAgICAgZm9ybUlkOiBcIlwiLFxyXG4gICAgICBxdWVyeVBhcmFtZXRlcnM6IG51bGxcclxuICAgIH07XHJcbiAgICBpZiAoIXRoaXMuY29uZmlnLmZvcm1JZCkge1xyXG4gICAgICBkZWxldGUgYmFzZUJvZHkuZm9ybUlkO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgYmFzZUJvZHkuZm9ybUlkID0gdGhpcy5jb25maWcuZm9ybUlkO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIGJhc2VCb2R5O1xyXG4gIH1cclxuXHJcbiAgZW1wbG95ZWVQcm9maWxlKGVtcGxveWVlRW1haWw6IGFueSkge1xyXG4gICAgbGV0IGJvZHkgPSB7XHJcbiAgICAgIG1ldGhvZDogXCJHRVRcIixcclxuICAgICAgZm9ybU5hbWU6IFwiQUFJXCIsXHJcbiAgICAgIGRlc3RpbmF0aW9uOiBcIkRQXCIsXHJcbiAgICAgIHNlcnZpY2VOYW1lOiBcImlnYXRlLnVzZXJzLnNlYXJjaC52M1wiLFxyXG4gICAgICBwYXJhbWV0ZXJzOiB7XHJcbiAgICAgICAgcTogZW1wbG95ZWVFbWFpbFxyXG4gICAgICB9XHJcbiAgICB9O1xyXG4gICAgcmV0dXJuIHRoaXMuaHR0cC5wb3N0KHRoaXMuYXBpVXJsLCBib2R5LCB7XHJcbiAgICAgIGhlYWRlcnM6IG5ldyBIdHRwSGVhZGVycyh7XHJcbiAgICAgICAgYXV0aFRva2VuOiB0aGlzLmF1dGhUb2tlbixcclxuICAgICAgICBcIkNvbnRlbnQtVHlwZVwiOiBcImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZFwiXHJcbiAgICAgIH0pLFxyXG4gICAgICBvYnNlcnZlOiBcImJvZHlcIlxyXG4gICAgfSkucGlwZShcclxuICAgICAgbWFwKChyZXNwb25zZTogYW55KSA9PiB7XHJcbiAgICAgICAgcmV0dXJuIHJlc3BvbnNlXHJcbiAgICAgIH0pXHJcbiAgICAgICwgY2F0Y2hFcnJvcigoZXJyOiBhbnkpID0+IHtcclxuICAgICAgICByZXR1cm4gdGhyb3dFcnJvcihlcnIpXHJcbiAgICAgIH0pKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgZ2V0UmVxdWVzdE9wdGlvbnMoKSB7XHJcbiAgICByZXR1cm4ge1xyXG4gICAgICBoZWFkZXJzOiBuZXcgSHR0cEhlYWRlcnMoe1xyXG4gICAgICAgIGF1dGhUb2tlbjogdGhpcy5hdXRoVG9rZW4sXHJcbiAgICAgICAgJ0NvbnRlbnQtVHlwZSc6IGNvbnN0YW50cy5IRUFERVJfQ09OVEVOVF9UWVBFX0ZPUk1cclxuICAgICAgfSksXHJcbiAgICAgIG9ic2VydmU6ICdib2R5J1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBjYWxsUG9zdChib2R5LCBvcHRpb25zKSB7XHJcbiAgICBjb25zdCBsYW5ndWFnZSA9ICh3aW5kb3cgYXMgYW55KT8ud21Db25maWc/Lmxhbmd1YWdlID8gKHdpbmRvdyBhcyBhbnkpLndtQ29uZmlnLmxhbmd1YWdlIDogXCJlblwiO1xyXG4gICAgbGV0IGFwaVVybCA9IHRoaXMuY29uZmlnLnByb3h5U2VydmljZUJhc2VVcmwgKyBsYW5ndWFnZSArIHRoaXMuY29uZmlnLnByb3h5RnVsbEFkZHJlc3MgKyB0aGlzLmNvbmZpZy5wcm94eVNlcnZpY2VFeGVjdXRlO1xyXG4gICAgcmV0dXJuIHRoaXMuaHR0cC5wb3N0KGFwaVVybCwgZW5jb2RlVVJJQ29tcG9uZW50KEpTT04uc3RyaW5naWZ5KGJvZHkpKSwgb3B0aW9ucykudG9Qcm9taXNlKClcclxuICAgICAgLnRoZW4oXHJcbiAgICAgICAgKHJlc3BvbnNlT2JqZWN0OiBhbnkpID0+IHtcclxuICAgICAgICAgIC8vIGxldCBwYXlsb2FkID0gcmVzcG9uc2VPYmplY3QuYm9keTtcclxuICAgICAgICAgIHJldHVybiB0aGlzLnN1Y2Nlc3NXbShyZXNwb25zZU9iamVjdClcclxuICAgICAgICB9LFxyXG4gICAgICApLmNhdGNoKFxyXG4gICAgICAgIChodHRwRXJyb3I6IGFueSkgPT4ge1xyXG4gICAgICAgICAgcmV0dXJuIHRocm93RXJyb3IoaHR0cEVycm9yKVxyXG4gICAgICAgIH1cclxuICAgICAgKTtcclxuICB9XHJcblxyXG4gIHN1Y2Nlc3NXbSguLi5hcmdzKSB7XHJcbiAgICBsZXQgW3BheWxvYWRdID0gYXJncztcclxuICAgIC8vIGxldCB3YXNTZW5kQmFjayA9IGZhbHNlO1xyXG4gICAgLyogQ29udmVydCBpbnRvIEZvcm0gT2JqZWN0ICovXHJcbiAgICBsZXQgcmVzdWx0ID0gbmV3IEZvcm0oXHJcbiAgICAgIGNvbnN0YW50cy5OT19WQUxVRSxcclxuICAgICAgY29uc3RhbnRzLk5PX1ZBTFVFLFxyXG4gICAgICBjb25zdGFudHMuTk9fVkFMVUUsXHJcbiAgICAgIGNvbnN0YW50cy5OT19WQUxVRSxcclxuICAgICAgY29uc3RhbnRzLk5PX1ZBTFVFLFxyXG4gICAgICBjb25zdGFudHMuTk9fVkFMVUUsXHJcbiAgICAgIGNvbnN0YW50cy5OT19WQUxVRVxyXG4gICAgKTtcclxuICAgIC8qIEdlbmVyYXRlIEhlYWRlciBPYmplY3QgKi9cclxuICAgIGxldCBwYXlsb2FkRm9ybURldGFpbHMgPSBwYXlsb2FkLmRhdGEuZm9ybTtcclxuICAgIGxldCBpc1JlYWRPbmx5ID0gKHBheWxvYWRGb3JtRGV0YWlscy5yZWFkT25seS50b1VwcGVyQ2FzZSgpID09PSBjb25zdGFudHMuVFJVRV9TVFJJTkcgPyBjb25zdGFudHMuVFJVRV9CT09MIDogKHBheWxvYWRGb3JtRGV0YWlscy5yZWFkT25seS50b1VwcGVyQ2FzZSgpID09PSBjb25zdGFudHMuRkFMU0VfU1RSSU5HID8gY29uc3RhbnRzLkZBTFNFX0JPT0wgOiBjb25zdGFudHMuTk9fVkFMVUUpKVxyXG4gICAgcmVzdWx0LmhlYWRlciA9IG5ldyBIZWFkZXIoXHJcbiAgICAgIHBheWxvYWQuZGF0YVsncmVxdWVzdGVyJ10uZnVsbE5hbWUsXHJcbiAgICAgIGNvbnN0YW50cy5JR0FURV9TVEFUSUNfQVNTRVRfUFJPRklMRV9QSE9UT19VUkwgKyBwYXlsb2FkLmRhdGFbJ3JlcXVlc3RlciddLmVtcGxveWVlRW1haWwsXHJcbiAgICAgIChwYXlsb2FkRm9ybURldGFpbHMuZm9ybUlkID8gcGF5bG9hZEZvcm1EZXRhaWxzLmZvcm1JZCA6IGNvbnN0YW50cy5ET05UX1NIT1cpLFxyXG4gICAgICAocGF5bG9hZEZvcm1EZXRhaWxzLmNyZWF0aW9uRGF0ZSA/IHBheWxvYWRGb3JtRGV0YWlscy5jcmVhdGlvbkRhdGUgOiBjb25zdGFudHMuRE9OVF9TSE9XKSxcclxuICAgICAgcGF5bG9hZEZvcm1EZXRhaWxzWydmb3JtU3RhdHVzJ10sXHJcbiAgICAgIHBheWxvYWRGb3JtRGV0YWlscy5kZXRhaWxzXHJcbiAgICApO1xyXG4gICAgLyogR2VuZXJhdGUgUHJvZmlsZSBJbmZvcm1hdGlvbiBPYmplY3QgKi9cclxuICAgIGxldCBwYXlsb2FkUHJvZmlsZUluZm8gPSBwYXlsb2FkLmRhdGFbJ3JlcXVlc3RlciddO1xyXG4gICAgcmVzdWx0LnByb2ZpbGVJbmZvRHJvcCA9IG5ldyBQcm9maWxlSW5mb0Ryb3AoXHJcbiAgICAgIChwYXlsb2FkUHJvZmlsZUluZm8ub25CZWhhbGZBdXRob3JpemVkID8gSlNPTi5wYXJzZShwYXlsb2FkUHJvZmlsZUluZm8ub25CZWhhbGZBdXRob3JpemVkKSA6IG51bGwpLFxyXG4gICAgICBwYXlsb2FkUHJvZmlsZUluZm9bJ2VtcGxveWVlSWQnXSxcclxuICAgICAgcGF5bG9hZFByb2ZpbGVJbmZvLmVtcGxveWVlRW1haWwsXHJcbiAgICAgIHBheWxvYWRQcm9maWxlSW5mby5mdWxsTmFtZSxcclxuICAgICAgcGF5bG9hZFByb2ZpbGVJbmZvLmdlbmVyYWxEZXBhcnRtZW50TmFtZSxcclxuICAgICAgcGF5bG9hZFByb2ZpbGVJbmZvLmpvYlBvc2l0aW9uLFxyXG4gICAgICBwYXlsb2FkUHJvZmlsZUluZm8uc2VjdG9yTmFtZSxcclxuICAgICAgcGF5bG9hZFByb2ZpbGVJbmZvLmRlcGFydG1lbnROYW1lLFxyXG4gICAgICBwYXlsb2FkUHJvZmlsZUluZm8uZ2VuZXJhbERlcGFydG1lbnRDb2RlLFxyXG4gICAgICBwYXlsb2FkUHJvZmlsZUluZm9bJ2h1bWFuUmVzb3VyY2VMb2NhdGlvbiddLFxyXG4gICAgICBwYXlsb2FkUHJvZmlsZUluZm8ubmF0aW9uYWxpdHksXHJcbiAgICAgIHBheWxvYWRQcm9maWxlSW5mby5idXNpbmVzc1Bob25lLFxyXG4gICAgICBwYXlsb2FkUHJvZmlsZUluZm8uZGlyZWN0TWFuYWdlck5hbWUsXHJcbiAgICAgIHBheWxvYWRQcm9maWxlSW5mby5zZW5pb3JTZWN0b3JOYW1lXHJcbiAgICApO1xyXG4gICAgLyogR2VuZXJhdGUgU2VjdGlvbnMgT2JqZWN0ICovXHJcbiAgICByZXN1bHQuc2VjdGlvbnMgPSBbXTtcclxuICAgIC8qIFB1c2ggYXMgZmlyc3Qgb2JqZWN0IHRoZSBzZWN0aW9uIGZvciB0aGUgcmVxdWVzdCBkZXRhaWxzICovXHJcbiAgICBsZXQgcmVxdWVzdERldGFpbHNIYXNDb21tZW50ID0gZmFsc2U7XHJcbiAgICBpZiAocGF5bG9hZC5kYXRhLnJlcXVlc3QuZGV0YWlscy5jb21tZW50KSB7XHJcbiAgICAgIHJlcXVlc3REZXRhaWxzSGFzQ29tbWVudCA9IHRydWU7XHJcbiAgICB9XHJcbiAgICByZXN1bHQuc2VjdGlvbnMucHVzaChcclxuICAgICAgbmV3IFNlY3Rpb24oXHJcbiAgICAgICAgY29uc3RhbnRzLlNFQ1RJT05fSURfUkVRVUVTVF9ERVRBSUxTLFxyXG4gICAgICAgIG5ldyBTZWN0aW9uSGVhZGVyKFxyXG4gICAgICAgICAgY29uc3RhbnRzLkRPTlRfU0hPVyxcclxuICAgICAgICAgIGNvbnN0YW50cy5ET05UX1NIT1csXHJcbiAgICAgICAgICBjb25zdGFudHMuRE9OVF9TSE9XLFxyXG4gICAgICAgICAgY29uc3RhbnRzLkRPTlRfU0hPVyxcclxuICAgICAgICAgIGNvbnN0YW50cy5ET05UX1NIT1csXHJcbiAgICAgICAgICBjb25zdGFudHMuRE9OVF9TSE9XLFxyXG4gICAgICAgICAgY29uc3RhbnRzLkRPTlRfU0hPVyxcclxuICAgICAgICAgIHJlcXVlc3REZXRhaWxzSGFzQ29tbWVudCxcclxuICAgICAgICAgIChwYXlsb2FkLmRhdGFbJ3dvcmtmbG93U3RlcHMnXSA/IGNvbnN0YW50cy5SRUFEX09OTFkgOiBpc1JlYWRPbmx5KVxyXG4gICAgICAgICksXHJcbiAgICAgICAgcGF5bG9hZC5kYXRhLnJlcXVlc3RcclxuICAgICAgKVxyXG4gICAgKTtcclxuXHJcbiAgICAvKiAgIGlmIChyZXN1bHQuaGVhZGVyLmZvcm1JZCkge1xyXG4gICAgICAgICByZXN1bHQuY29tbWVudHNEcm9wID0gKCFyZXN1bHQuY29tbWVudHNEcm9wID8gW10gOiByZXN1bHQuY29tbWVudHNEcm9wKTtcclxuICAgICAgICAgdGhpcy5kaXNwYXRjaChjb25zdGFudHMuU1RBVEVfTUFDSElORV9BQ1RJT05fTE9BRF9ISVNUT1JZLCByZXN1bHQuaGVhZGVyLmZvcm1JZCkudGhlbigocmVzcG9uc2VPYmplY3Q6IGFueSkgPT4ge1xyXG4gICAgICAgICAgIGlmIChyZXNwb25zZU9iamVjdCkge1xyXG4gICAgICAgICAgICAgcmVzcG9uc2VPYmplY3QuaXRlbXMuZm9yRWFjaCgoaXRlbTogYW55KSA9PiB7XHJcbiAgICAgICAgICAgICAgIGlmIChpdGVtLnNlcXVlbmNlTnVtYmVyICE9PSAnMCcgJiYgaXRlbS5wcm9jZXNzZWRCeSkge1xyXG4gICAgICAgICAgICAgICAgIGNvbnN0IG5hbWUgPSBpdGVtLnByb2Nlc3NlZEJ5LmZpcnN0TmFtZSArICcgJyArIGl0ZW0ucHJvY2Vzc2VkQnkuc2Vjb25kTWlkZGxlTmFtZSArICcgJyArIGl0ZW0ucHJvY2Vzc2VkQnkuZmFtaWx5TmFtZTtcclxuICAgICAgICAgICAgICAgICByZXN1bHQuY29tbWVudHNEcm9wLnB1c2gobmV3IENvbW1lbnRzRHJvcChcclxuICAgICAgICAgICAgICAgICAgIGNvbnN0YW50cy5JR0FURV9TVEFUSUNfQVNTRVRfUFJPRklMRV9QSE9UT19VUkwgKyBpdGVtLnByb2Nlc3NlZEJ5LmVtYWlsLFxyXG4gICAgICAgICAgICAgICAgICAgbmFtZSxcclxuICAgICAgICAgICAgICAgICAgIGl0ZW0uY29tbWVudHMsXHJcbiAgICAgICAgICAgICAgICAgICBpdGVtLm1vZGlmaWVkRGF0ZSxcclxuICAgICAgICAgICAgICAgICAgIGl0ZW0uYXR0YWNobWVudHMsXHJcbiAgICAgICAgICAgICAgICAgICBpdGVtLnByb2Nlc3NlZEJ5LmpvYlxyXG4gICAgICAgICAgICAgICAgICkpO1xyXG4gICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICB9XHJcbiAgICAgICAgIH0pO1xyXG4gICAgICAgfVxyXG4gICAgICAgaWYgKHJlc3VsdC5oZWFkZXIuZm9ybUlkICYmIC9eRFlMLy50ZXN0KHJlc3VsdC5oZWFkZXIuZm9ybUlkKSkge1xyXG4gICAgICAgICB0aGlzLnN0YXRlID0gY29uc3RhbnRzLlNUQVRFX01BQ0hJTkVfU1RBVFVTX0lETEU7XHJcbiAgICAgICAgIHJlc3VsdC5jb25maWRlbnRpYWxDb21tZW50cyA9IFtdO1xyXG4gICAgICAgICB0aGlzLmRpc3BhdGNoKCdsb2FkQ29uZmlkZW50aWFsQ29tbWVudHMnLCByZXN1bHQuaGVhZGVyLmZvcm1JZCkudGhlbigocmVzcG9uc2VPYmplY3Q6IGFueSkgPT4ge1xyXG4gICAgICAgICAgIGlmIChyZXNwb25zZU9iamVjdCAmJiByZXNwb25zZU9iamVjdC5pdGVtcyAmJiByZXNwb25zZU9iamVjdC5pdGVtcy5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgICByZXNwb25zZU9iamVjdC5pdGVtcy5mb3JFYWNoKChpdGVtOiBhbnkpID0+IHtcclxuICAgICAgICAgICAgICAgcmVzdWx0LmNvbmZpZGVudGlhbENvbW1lbnRzLnB1c2gobmV3IENvbW1lbnRzRHJvcChcclxuICAgICAgICAgICAgICAgICBjb25zdGFudHMuSUdBVEVfU1RBVElDX0FTU0VUX1BST0ZJTEVfUEhPVE9fVVJMICsgaXRlbS5lbWFpbCxcclxuICAgICAgICAgICAgICAgICBpdGVtLm5hbWUsXHJcbiAgICAgICAgICAgICAgICAgaXRlbS5jb21tZW50LFxyXG4gICAgICAgICAgICAgICAgIGl0ZW0ubW9kaWZpZWREYXRlLFxyXG4gICAgICAgICAgICAgICAgIGl0ZW0uYXR0YWNobWVudCxcclxuICAgICAgICAgICAgICAgICBpdGVtLnBvc2l0aW9uXHJcbiAgICAgICAgICAgICAgICkpO1xyXG4gICAgICAgICAgICAgfSlcclxuICAgICAgICAgICB9XHJcbiAgICAgICAgIH0pO1xyXG4gICAgICAgfVxyXG5cclxuICAgICAgIGNvbnN0IGluYm94VHlwZSA9IHRoaXMuZ2V0SW5ib3hUeXBlKHJlc3VsdCk7XHJcbiAgICAgICBpZiAocmVzdWx0LmhlYWRlci5mb3JtSWQgJiYgKCF0aGlzLmlzT3Blbk9uSW5ib3goKSkpIHtcclxuICAgICAgICAgdGhpcy5zdGF0ZSA9IGNvbnN0YW50cy5TVEFURV9NQUNISU5FX1NUQVRVU19JRExFO1xyXG4gICAgICAgICB0aGlzLmRpc3BhdGNoKGNvbnN0YW50cy5TVEFURV9NQUNISU5FX0FDVElPTl9HRVRfSU5CT1hfSVRFTSwgcmVzdWx0LmhlYWRlci5mb3JtSWQsIGluYm94VHlwZSkudGhlbigocmVzcG9uc2VPYmplY3QpID0+IHtcclxuICAgICAgICAgICBpZiAocmVzcG9uc2VPYmplY3QpIHtcclxuICAgICAgICAgICAgIGNvbnN0IGl0ZW0gPSByZXNwb25zZU9iamVjdC5pdGVtO1xyXG4gICAgICAgICAgICAgcmVzdWx0LmluYm94SXRlbSA9IG5ldyBJbmJveEl0ZW0oXHJcbiAgICAgICAgICAgICAgIGl0ZW0uZmxhZ2dpbmcuZmxhZ1ByaW9yaXR5LFxyXG4gICAgICAgICAgICAgICBpdGVtLmZsYWdnaW5nLmlzRmxhZ2dlZCxcclxuICAgICAgICAgICAgICAgaXRlbS5mZWVkYmFjay5jYW5SZXF1ZXN0RmVlZGJhY2ssXHJcbiAgICAgICAgICAgICAgIGl0ZW0uZmVlZGJhY2suaGFzRmVlZGJhY2ssXHJcbiAgICAgICAgICAgICAgIGl0ZW0uZmVlZGJhY2suaXNQZW5kaW5nLFxyXG4gICAgICAgICAgICAgICBpdGVtLmZlZWRiYWNrLmlzUmVxdWVzdGVkLFxyXG4gICAgICAgICAgICAgICBpdGVtLmZlZWRiYWNrLmlzUmVzcG9uZGVkXHJcbiAgICAgICAgICAgICApO1xyXG4gICAgICAgICAgIH1cclxuICAgICAgICAgfSk7XHJcbiAgICAgICB9XHJcblxyXG4gICAgICAgbGV0IHBheWxvYWRXb3JrZmxvd1N0ZXBzID0gcGF5bG9hZC5kYXRhLndvcmtmbG93U3RlcHM7XHJcbiAgICAgICBpZiAocGF5bG9hZFdvcmtmbG93U3RlcHMgJiYgcGF5bG9hZFdvcmtmbG93U3RlcHMuY29uc3RydWN0b3IgPT09IEFycmF5ICYmIHBheWxvYWRXb3JrZmxvd1N0ZXBzLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgcGF5bG9hZFdvcmtmbG93U3RlcHMuZm9yRWFjaCgoc3RlcCwgaW5kZXgpID0+IHtcclxuICAgICAgICAgICBsZXQgY3VycmVudElzUmVxdWVzdGVyU2VuZEJhY2sgPSBKU09OLnN0cmluZ2lmeShzdGVwLmRldGFpbHMpID09PSBKU09OLnN0cmluZ2lmeSh7fSk7XHJcbiAgICAgICAgICAgbGV0IGhhc0NvbW1lbnRzID0gKCFjdXJyZW50SXNSZXF1ZXN0ZXJTZW5kQmFjayAmJiAoc3RlcC5kZXRhaWxzLmNvbW1lbnQgfHwgc3RlcC5jb21tZW50KSA/IGNvbnN0YW50cy5IQVNfQ09NTUVOVFMgOiBjb25zdGFudHMuTk9fQ09NTUVOVFMpO1xyXG4gICAgICAgICAgIGxldCBjdXJyZW50QWN0b3IgPSAoc3RlcC5hY3Rvci5lbWFpbCA9PT0gc3RlcC5hY3Rvci5yZWNpcGllbnQuZW1haWwgPyBzdGVwLmFjdG9yLnJlY2lwaWVudCA6IChzdGVwLmFjdG9yLmRlbGVnYXRlID8gc3RlcC5hY3Rvci5kZWxlZ2F0ZSA6IG51bGwpKVxyXG4gICAgICAgICAgIGlmIChoYXNDb21tZW50cykge1xyXG4gICAgICAgICAgICAgcmVzdWx0LmNvbW1lbnRzRHJvcCA9ICghcmVzdWx0LmNvbW1lbnRzRHJvcCA/IFtdIDogcmVzdWx0LmNvbW1lbnRzRHJvcCk7XHJcbiAgICAgICAgICAgICBpZiAoc3RlcC5kZXRhaWxzLmF0dGFjaG1lbnQgJiYgc3RlcC5kZXRhaWxzLmF0dGFjaG1lbnQuYXR0YWNobWVudElkICYmIHRoaXMuY29uZmlnLnByb2R1Y3Rpb24pIHtcclxuICAgICAgICAgICAgICAgdGhpcy5zdGF0ZSA9IGNvbnN0YW50cy5TVEFURV9NQUNISU5FX1NUQVRVU19JRExFO1xyXG4gICAgICAgICAgICAgICB0aGlzLmRpc3BhdGNoKGNvbnN0YW50cy5TVEFURV9NQUNISU5FX0FDVElPTl9MT0FEX0ZJTEUsIHN0ZXAuZGV0YWlscy5hdHRhY2htZW50LmF0dGFjaG1lbnRJZCkudGhlbigocmVzcG9uc2VPYmplY3QpID0+IHtcclxuICAgICAgICAgICAgICAgICBsZXQgZmlsZUluZm9ybWF0aW9uID0gcmVzcG9uc2VPYmplY3QuYm9keTtcclxuICAgICAgICAgICAgICAgICBpZiAoY3VycmVudEFjdG9yKSB7XHJcbiAgICAgICAgICAgICAgICAgICAvISp0aGlzLmRpc3BhdGNoKGNvbnN0YW50cy5TVEFURV9NQUNISU5FX0FDVElPTl9FTVBMT1lFRV9QUk9GSUxFLCBjdXJyZW50QWN0b3IuZW1haWwpLnRoZW4oKHByb2ZpbGUpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgcmVzdWx0LmNvbW1lbnRzRHJvcC5wdXNoKG5ldyBDb21tZW50c0Ryb3AoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgY29uc3RhbnRzLklHQVRFX1NUQVRJQ19BU1NFVF9QUk9GSUxFX1BIT1RPX1VSTCArIGN1cnJlbnRBY3Rvci5lbWFpbCxcclxuICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50QWN0b3IubmFtZSxcclxuICAgICAgICAgICAgICAgICAgICAgICAoc3RlcC5kZXRhaWxzLmNvbW1lbnQgPyBzdGVwLmRldGFpbHMuY29tbWVudCA6IChzdGVwLmNvbW1lbnQgPyBzdGVwLmNvbW1lbnQgOiBudWxsKSksXHJcbiAgICAgICAgICAgICAgICAgICAgICAgc3RlcC5kYXRlLFxyXG4gICAgICAgICAgICAgICAgICAgICAgIGZpbGVJbmZvcm1hdGlvbi5maWxlTmFtZSArIFwifGRhdGE6XCIgKyBmaWxlSW5mb3JtYXRpb24ubWltZVR5cGUgKyBcIjtiYXNlNjQsXCIgKyBmaWxlSW5mb3JtYXRpb24uZmlsZUNvbnRlbnRzLFxyXG4gICAgICAgICAgICAgICAgICAgICAgIHByb2ZpbGUuam9iLm5hbWVcclxuICAgICAgICAgICAgICAgICAgICAgKSlcclxuICAgICAgICAgICAgICAgICAgIH0pKiEvXHJcbiAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgdGhpcy5zdGF0ZSA9IGNvbnN0YW50cy5TVEFURV9NQUNISU5FX1NUQVRVU19GRVRDSElORztcclxuICAgICAgICAgICAgIH0gZWxzZSBpZiAoc3RlcC5kZXRhaWxzLmF0dGFjaG1lbnRJZCkge1xyXG4gICAgICAgICAgICAgICB0aGlzLnN0YXRlID0gY29uc3RhbnRzLlNUQVRFX01BQ0hJTkVfU1RBVFVTX0lETEU7XHJcbiAgICAgICAgICAgICAgIHRoaXMuZGlzcGF0Y2goY29uc3RhbnRzLlNUQVRFX01BQ0hJTkVfQUNUSU9OX0xPQURfRklMRSwgc3RlcC5kZXRhaWxzLmF0dGNobWVudElkKS50aGVuKChyZXNwb25zZU9iamVjdCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgIGxldCBmaWxlSW5mb3JtYXRpb24gPSByZXNwb25zZU9iamVjdC5ib2R5O1xyXG4gICAgICAgICAgICAgICAgIGlmIChjdXJyZW50QWN0b3IpIHtcclxuICAgICAgICAgICAgICAgICAgIC8hKnRoaXMuZGlzcGF0Y2goY29uc3RhbnRzLlNUQVRFX01BQ0hJTkVfQUNUSU9OX0VNUExPWUVFX1BST0ZJTEUsIGN1cnJlbnRBY3Rvci5lbWFpbCkudGhlbigocHJvZmlsZSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICByZXN1bHQuY29tbWVudHNEcm9wLnB1c2gobmV3IENvbW1lbnRzRHJvcChcclxuICAgICAgICAgICAgICAgICAgICAgICBjb25zdGFudHMuSUdBVEVfU1RBVElDX0FTU0VUX1BST0ZJTEVfUEhPVE9fVVJMICsgY3VycmVudEFjdG9yLmVtYWlsLFxyXG4gICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRBY3Rvci5uYW1lLFxyXG4gICAgICAgICAgICAgICAgICAgICAgIChzdGVwLmRldGFpbHMuY29tbWVudCA/IHN0ZXAuZGV0YWlscy5jb21tZW50IDogKHN0ZXAuY29tbWVudCA/IHN0ZXAuY29tbWVudCA6IG51bGwpKSxcclxuICAgICAgICAgICAgICAgICAgICAgICBzdGVwLmRhdGUsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgZmlsZUluZm9ybWF0aW9uLmZpbGVOYW1lICsgXCJ8ZGF0YTpcIiArIGZpbGVJbmZvcm1hdGlvbi5taW1lVHlwZSArIFwiO2Jhc2U2NCxcIiArIGZpbGVJbmZvcm1hdGlvbi5maWxlQ29udGVudHMsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgcHJvZmlsZS5qb2IubmFtZVxyXG4gICAgICAgICAgICAgICAgICAgICApKVxyXG4gICAgICAgICAgICAgICAgICAgfSkqIS9cclxuICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICB0aGlzLnN0YXRlID0gY29uc3RhbnRzLlNUQVRFX01BQ0hJTkVfU1RBVFVTX0ZFVENISU5HO1xyXG4gICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgaWYgKGN1cnJlbnRBY3Rvcikge1xyXG4gICAgICAgICAgICAgICAgIHRoaXMuc3RhdGUgPSBjb25zdGFudHMuU1RBVEVfTUFDSElORV9TVEFUVVNfSURMRTtcclxuICAgICAgICAgICAgICAgICAvISp0aGlzLmRpc3BhdGNoKGNvbnN0YW50cy5TVEFURV9NQUNISU5FX0FDVElPTl9FTVBMT1lFRV9QUk9GSUxFLCBjdXJyZW50QWN0b3IuZW1haWwpLnRoZW4oKHByb2ZpbGUpID0+IHtcclxuICAgICAgICAgICAgICAgICAgIHJlc3VsdC5jb21tZW50c0Ryb3AucHVzaChuZXcgQ29tbWVudHNEcm9wKFxyXG4gICAgICAgICAgICAgICAgICAgICBjb25zdGFudHMuSUdBVEVfU1RBVElDX0FTU0VUX1BST0ZJTEVfUEhPVE9fVVJMICsgY3VycmVudEFjdG9yLmVtYWlsLFxyXG4gICAgICAgICAgICAgICAgICAgICBjdXJyZW50QWN0b3IubmFtZSxcclxuICAgICAgICAgICAgICAgICAgICAgKHN0ZXAuZGV0YWlscy5jb21tZW50ID8gc3RlcC5kZXRhaWxzLmNvbW1lbnQgOiAoc3RlcC5jb21tZW50ID8gc3RlcC5jb21tZW50IDogbnVsbCkpLFxyXG4gICAgICAgICAgICAgICAgICAgICBzdGVwLmRhdGUsXHJcbiAgICAgICAgICAgICAgICAgICAgIG51bGwsXHJcbiAgICAgICAgICAgICAgICAgICAgIHByb2ZpbGUuam9iLm5hbWVcclxuICAgICAgICAgICAgICAgICAgICkpXHJcbiAgICAgICAgICAgICAgICAgfSkqIS9cclxuICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICB0aGlzLnN0YXRlID0gY29uc3RhbnRzLlNUQVRFX01BQ0hJTkVfU1RBVFVTX0ZFVENISU5HO1xyXG4gICAgICAgICAgICAgfVxyXG4gICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgaWYgKHdhc1NlbmRCYWNrICYmIHN0ZXAuYWN0b3IucmVjaXBpZW50LnJvbGUgPT09ICdSRVFVRVNURVInKSB7XHJcbiAgICAgICAgICAgICBjb25zb2xlLmxvZyhcIndhc1NlbmRCYWNrICYmIFJFUVVFU1RFUlwiKVxyXG4gICAgICAgICAgICAgcmVzdWx0LnNlY3Rpb25zID0gW25ldyBTZWN0aW9uKFxyXG4gICAgICAgICAgICAgICBjb25zdGFudHMuU0VDVElPTl9JRF9SRVFVRVNUX0RFVEFJTFMsXHJcbiAgICAgICAgICAgICAgIG5ldyBTZWN0aW9uSGVhZGVyKFxyXG4gICAgICAgICAgICAgICAgIGNvbnN0YW50cy5ET05UX1NIT1csXHJcbiAgICAgICAgICAgICAgICAgY29uc3RhbnRzLkRPTlRfU0hPVyxcclxuICAgICAgICAgICAgICAgICBjb25zdGFudHMuRE9OVF9TSE9XLFxyXG4gICAgICAgICAgICAgICAgIGNvbnN0YW50cy5ET05UX1NIT1csXHJcbiAgICAgICAgICAgICAgICAgY29uc3RhbnRzLkRPTlRfU0hPVyxcclxuICAgICAgICAgICAgICAgICBjb25zdGFudHMuRE9OVF9TSE9XLFxyXG4gICAgICAgICAgICAgICAgIGNvbnN0YW50cy5ET05UX1NIT1csXHJcbiAgICAgICAgICAgICAgICAgcmVxdWVzdERldGFpbHNIYXNDb21tZW50LFxyXG4gICAgICAgICAgICAgICAgIChwYXlsb2FkLmRhdGEud29ya2Zsb3dTdGVwcyA/IGNvbnN0YW50cy5SRUFEX09OTFkgOiBpc1JlYWRPbmx5KVxyXG4gICAgICAgICAgICAgICApLFxyXG4gICAgICAgICAgICAgICBwYXlsb2FkLmRhdGEucmVxdWVzdFxyXG4gICAgICAgICAgICAgKV1cclxuICAgICAgICAgICB9IGVsc2UgaWYgKHdhc1NlbmRCYWNrKSB7XHJcbiAgICAgICAgICAgICBjb25zb2xlLmxvZyhcIlBvcFwiKVxyXG4gICAgICAgICAgICAgaWYgKHJlc3VsdC5zZWN0aW9ucy5sZW5ndGggPiAxKSB7XHJcbiAgICAgICAgICAgICAgIHJlc3VsdC5zZWN0aW9ucy5wb3AoKTtcclxuICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgIHdhc1NlbmRCYWNrID0gZmFsc2U7XHJcbiAgICAgICAgICAgfVxyXG4gICAgICAgICAgIGlmIChzdGVwLmRldGFpbHMuZGVjaXNpb24gJiYgc3RlcC5kZXRhaWxzLmRlY2lzaW9uLmtleSA9PT0gY29uc3RhbnRzLkZPUk1fU1RBVFVTX1NFTkRfQkFDSykge1xyXG4gICAgICAgICAgICAgd2FzU2VuZEJhY2sgPSB0cnVlO1xyXG4gICAgICAgICAgIH0gZWxzZSBpZiAoSlNPTi5zdHJpbmdpZnkoc3RlcC5kZXRhaWxzKSAhPT0gSlNPTi5zdHJpbmdpZnkoe30pKSB7XHJcbiAgICAgICAgICAgICByZXN1bHQuc2VjdGlvbnMucHVzaChcclxuICAgICAgICAgICAgICAgbmV3IFNlY3Rpb24oXHJcbiAgICAgICAgICAgICAgICAgc3RlcC5hY3Rvci5yZWNpcGllbnQucm9sZS50b0xvd2VyQ2FzZSgpICsgY29uc3RhbnRzLlNFQ1RJT05fSURfQVBQUk9WQUxfUEFSVElBTF9OQU1FLFxyXG4gICAgICAgICAgICAgICAgIG5ldyBTZWN0aW9uSGVhZGVyKFxyXG4gICAgICAgICAgICAgICAgICAgKGN1cnJlbnRBY3RvciA/IHRoaXMuZ2V0U2hvcnROYW1lKGN1cnJlbnRBY3Rvci5uYW1lKSA6IG51bGwpLFxyXG4gICAgICAgICAgICAgICAgICAgc3RlcC5kYXRlLFxyXG4gICAgICAgICAgICAgICAgICAgdGhpcy5nZXRTaG9ydE5hbWUoc3RlcC5hY3Rvci5yZWNpcGllbnQubmFtZSksXHJcbiAgICAgICAgICAgICAgICAgICBjb25zdGFudHMuSUdBVEVfU1RBVElDX0FTU0VUX1BST0ZJTEVfUEhPVE9fVVJMICsgc3RlcC5hY3Rvci5yZWNpcGllbnQuZW1haWwsXHJcbiAgICAgICAgICAgICAgICAgICAoc3RlcC5hY3Rvci5kZWxlZ2F0ZSAmJiBzdGVwLmFjdG9yLmRlbGVnYXRlLm5hbWUgPyB0aGlzLmdldFNob3J0TmFtZShzdGVwLmFjdG9yLmRlbGVnYXRlLm5hbWUpIDogbnVsbCksXHJcbiAgICAgICAgICAgICAgICAgICAoc3RlcC5hY3Rvci5kZWxlZ2F0ZSAmJiBzdGVwLmFjdG9yLmRlbGVnYXRlLmVtYWlsID8gY29uc3RhbnRzLklHQVRFX1NUQVRJQ19BU1NFVF9QUk9GSUxFX1BIT1RPX1VSTCArIHN0ZXAuYWN0b3IuZGVsZWdhdGUuZW1haWwgOiBudWxsKSxcclxuICAgICAgICAgICAgICAgICAgIHN0ZXAuYWN0b3Iuc3RhdHVzLFxyXG4gICAgICAgICAgICAgICAgICAgaGFzQ29tbWVudHMsXHJcbiAgICAgICAgICAgICAgICAgICAoaW5kZXggPCBwYXlsb2FkV29ya2Zsb3dTdGVwcy5sZW5ndGggLSAxID8gY29uc3RhbnRzLlJFQURfT05MWSA6IGlzUmVhZE9ubHkpXHJcbiAgICAgICAgICAgICAgICAgKSxcclxuICAgICAgICAgICAgICAgICB7ZGV0YWlsczogc3RlcC5kZXRhaWxzLCBwcm9jZXNzaW5nRGF0ZTogc3RlcC5kYXRlfVxyXG4gICAgICAgICAgICAgICApXHJcbiAgICAgICAgICAgICApO1xyXG4gICAgICAgICAgICAgdGhpcy5jdXJyZW50U3VibWl0dGVyID0ge2FjdG9yOiBzdGVwLmFjdG9yLCByZWNpcGllbnQ6IHN0ZXAucmVjaXBpZW50LCBkZWxlZ2F0ZTogc3RlcC5hY3Rvci5kZWxlZ2F0ZX07XHJcbiAgICAgICAgICAgfVxyXG4gICAgICAgICB9KTtcclxuICAgICAgIH1cclxuICAgKi9cclxuICAgIC8qIENyZWF0ZSBMb3YgU2VjdGlvbnMgKi9cclxuICAgIHJlc3VsdC5sb3ZzID0gKHBheWxvYWQubWV0YSAmJiBwYXlsb2FkLm1ldGEubG92cyA/IHBheWxvYWQubWV0YS5sb3ZzIDogbnVsbCk7XHJcblxyXG4gICAgaWYgKHBheWxvYWQubWV0YSAmJiBwYXlsb2FkLm1ldGEubWVzc2FnZXMpIHtcclxuICAgICAgcmVzdWx0Lm1lc3NhZ2VzID0gbmV3IE1lc3NhZ2VzKFxyXG4gICAgICAgIHt9LFxyXG4gICAgICAgIFtdLFxyXG4gICAgICAgIFtdLFxyXG4gICAgICAgIFtdXHJcbiAgICAgICk7XHJcbiAgICAgIHBheWxvYWQubWV0YS5tZXNzYWdlcy5mb3JFYWNoKChtZXNzYWdlKSA9PiB7XHJcbiAgICAgICAgcmVzdWx0Lm1lc3NhZ2VzLm9yaWdpbmFsTXNncy5wdXNoKG1lc3NhZ2UpO1xyXG4gICAgICAgIHJlc3VsdC5tZXNzYWdlc1ttZXNzYWdlLnR5cGVdLnB1c2gobWVzc2FnZS5tZXNzYWdlKTtcclxuICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gcmVzdWx0Lm1lc3NhZ2VzID0gKHBheWxvYWQubWV0YSAmJiBwYXlsb2FkLm1ldGEubWVzc2FnZXMgPyBwYXlsb2FkLm1ldGEubWVzc2FnZXMgOiBudWxsKTtcclxuICAgIC8qIEZpeCBsYXN0IHNlY3Rpb24gdG8gYmUgdGhlIFJPL1dNIGZyb20gdGhlIHZhcmlhYmxlICovXHJcbiAgICByZXN1bHQuc2VjdGlvbnNbcmVzdWx0LnNlY3Rpb25zLmxlbmd0aCAtIDFdLmhlYWRlci5yZWFkT25seSA9IGlzUmVhZE9ubHk7XHJcbiAgICByZXR1cm4gcmVzdWx0O1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGxvZ2dlZEluVXNlcklkKCkge1xyXG4gICAgcmV0dXJuIHRoaXMudXNlckRhdGFbJ2xvZ2dlZEluVXNlckVtYWlsJ107XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZ2V0U2hvcnROYW1lKG5hbWU6IHN0cmluZykge1xyXG4gICAgaWYgKG5hbWUpIHtcclxuICAgICAgbGV0IG5hbWVUb2tlbnMgPSBuYW1lLnNwbGl0KCcgJyk7XHJcbiAgICAgIGlmIChuYW1lVG9rZW5zLmxlbmd0aCA9PSAxKSB7XHJcbiAgICAgICAgcmV0dXJuIFtuYW1lVG9rZW5zWzBdXVxyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIGlmIChuYW1lVG9rZW5zW25hbWVUb2tlbnMubGVuZ3RoIC0gMl0udG9Mb3dlckNhc2UoKSA9PSAnYWwnKSB7XHJcbiAgICAgICAgICByZXR1cm4gW25hbWVUb2tlbnNbMF0sIG5hbWVUb2tlbnNbbmFtZVRva2Vucy5sZW5ndGggLSAyXSwgbmFtZVRva2Vuc1tuYW1lVG9rZW5zLmxlbmd0aCAtIDFdXS5qb2luKCcgJyk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIHJldHVybiBbbmFtZVRva2Vuc1swXSwgbmFtZVRva2Vuc1tuYW1lVG9rZW5zLmxlbmd0aCAtIDFdXS5qb2luKCcgJyk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICByZXR1cm4gbnVsbDtcclxuICAgIH1cclxuICB9XHJcbn1cclxuIl19
496
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29yZS5zZXJ2aWNlLnRzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvYnBtLWNvcmUvc3JjL2xpYi9zZXJ2aWNlcy9jb3JlLnNlcnZpY2UudHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFhLFdBQVcsRUFBQyxNQUFNLHNCQUFzQixDQUFDO0FBQzdELE9BQU8sRUFBQyxNQUFNLEVBQUUsVUFBVSxFQUFDLE1BQU0sZUFBZSxDQUFDO0FBRWpELE9BQU8sRUFBQyxJQUFJLEVBQUUsTUFBTSxFQUFFLFFBQVEsRUFBRSxtQkFBbUIsRUFBRSxlQUFlLEVBQUUsT0FBTyxFQUFFLGFBQWEsRUFBQyxNQUFNLGtCQUFrQixDQUFDO0FBQ3RILE9BQU8sS0FBSyxTQUFTLE1BQU0sY0FBYyxDQUFBO0FBQ3pDLE9BQU8sRUFBQyxVQUFVLEVBQUUsVUFBVSxFQUFDLE1BQU0sTUFBTSxDQUFDO0FBQzVDLE9BQU8sRUFBQyxHQUFHLEVBQUMsTUFBTSxnQkFBZ0IsQ0FBQzs7O0FBS25DLE1BQU0sT0FBTyxXQUFXO0lBVUY7SUFDNkI7SUFWakQsTUFBTSxHQUFXLEVBQUUsQ0FBQTtJQUNYLFNBQVMsQ0FBUztJQUNsQixZQUFZLENBQVM7SUFDWixhQUFhLENBQVM7SUFDaEMsUUFBUSxDQUFTO0lBQ1AsU0FBUyxDQUFLO0lBQ3hCLGdCQUFnQixDQUFLO0lBQzVCLFlBQVksQ0FBUTtJQUVwQixZQUFvQixJQUFnQixFQUNhLE1BQW1CO1FBRGhELFNBQUksR0FBSixJQUFJLENBQVk7UUFDYSxXQUFNLEdBQU4sTUFBTSxDQUFhO1FBQ2xFLE1BQU0sUUFBUSxHQUFJLE1BQWMsRUFBRSxRQUFRLEVBQUUsUUFBUSxDQUFDLENBQUMsQ0FBRSxNQUFjLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDO1FBQ2hHLElBQUksQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxt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LEVBQUUsQ0FBQztZQUNULElBQUksVUFBVSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDakMsSUFBSSxVQUFVLENBQUMsTUFBTSxJQUFJLENBQUMsRUFBRSxDQUFDO2dCQUMzQixPQUFPLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUE7WUFDeEIsQ0FBQztpQkFBTSxDQUFDO2dCQUNOLElBQUksVUFBVSxDQUFDLFVBQVUsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUMsV0FBVyxFQUFFLElBQUksSUFBSSxFQUFFLENBQUM7b0JBQzVELE9BQU8sQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLEVBQUUsVUFBVSxDQUFDLFVBQVUsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLEVBQUUsVUFBVSxDQUFDLFVBQVUsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7Z0JBQ3pHLENBQUM7cUJBQU0sQ0FBQztvQkFDTixPQUFPLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxFQUFFLFVBQVUsQ0FBQyxVQUFVLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO2dCQUN0RSxDQUFDO1lBQ0gsQ0FBQztRQUNILENBQUM7YUFBTSxDQUFDO1lBQ04sT0FBTyxJQUFJLENBQUM7UUFDZCxDQUFDO0lBQ0gsQ0FBQzt1R0FyaUJVLFdBQVcsNENBV0YsbUJBQW1COzJHQVg1QixXQUFXLGNBRlYsS0FBSzs7MkZBRU4sV0FBVztrQkFIdkIsVUFBVTttQkFBQztvQkFDVixVQUFVLEVBQUUsS0FBSztpQkFDbEI7OzBCQVljLE1BQU07MkJBQUMsbUJBQW1CIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtIdHRwQ2xpZW50LCBIdHRwSGVhZGVyc30gZnJvbSBcIkBhbmd1bGFyL2NvbW1vbi9odHRwXCI7XHJcbmltcG9ydCB7SW5qZWN0LCBJbmplY3RhYmxlfSBmcm9tIFwiQGFuZ3VsYXIvY29yZVwiO1xyXG5pbXBvcnQgdHlwZSB7TXlMaWJDb25maWd9IGZyb20gXCIuLi9pbnRlcmZhY2VzL3NoYXJlZC5pbnRlcmZhY2VcIjtcclxuaW1wb3J0IHtGb3JtLCBIZWFkZXIsIE1lc3NhZ2VzLCBNWV9MSUJfQ09ORklHX1RPS0VOLCBQcm9maWxlSW5mb0Ryb3AsIFNlY3Rpb24sIFNlY3Rpb25IZWFkZXJ9IGZyb20gXCIuLi8uLi9wdWJsaWMtYXBpXCI7XHJcbmltcG9ydCAqIGFzIGNvbnN0YW50cyBmcm9tICcuLi9jb25zdGFudHMnXHJcbmltcG9ydCB7Y2F0Y2hFcnJvciwgdGhyb3dFcnJvcn0gZnJvbSBcInJ4anNcIjtcclxuaW1wb3J0IHttYXB9IGZyb20gXCJyeGpzL29wZXJhdG9yc1wiO1xyXG5cclxuQEluamVjdGFibGUoe1xyXG4gIHByb3ZpZGVkSW46IFwiYW55XCJcclxufSlcclxuZXhwb3J0IGNsYXNzIENvcmVTZXJ2aWNlIHtcclxuICBhcGlVcmw6IHN0cmluZyA9ICcnXHJcbiAgcHJpdmF0ZSBhdXRoVG9rZW46IHN0cmluZztcclxuICBwcml2YXRlIHJlZnJlc2hUb2tlbjogc3RyaW5nO1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgcHJvamVjdENvbmZpZzogc3RyaW5nO1xyXG4gIHB1YmxpYyB1c2VyRGF0YTogc3RyaW5nO1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgbG9jYWxVc2VyOiB7fTtcclxuICBwdWJsaWMgbG9nZ2VkSW5Vc2VyRGF0YToge307XHJcbiAgY3VycmVudEFjdG9yOiBzdHJpbmdcclxuXHJcbiAgY29uc3RydWN0b3IocHJpdmF0ZSBodHRwOiBIdHRwQ2xpZW50LFxyXG4gICAgICAgICAgICAgIEBJbmplY3QoTVlfTElCX0NPTkZJR19UT0tFTikgcHJpdmF0ZSBjb25maWc6IE15TGliQ29uZmlnKSB7XHJcbiAgICBjb25zdCBsYW5ndWFnZSA9ICh3aW5kb3cgYXMgYW55KT8ud21Db25maWc/Lmxhbmd1YWdlID8gKHdpbmRvdyBhcyBhbnkpLndtQ29uZmlnLmxhbmd1YWdlIDogJ2VuJztcclxuICAgIHRoaXMuYXBpVXJsID0gdGhpcy5jb25maWcucHJveHlTZXJ2aWNlQmFzZVVybCArIGxhbmd1YWdlICsgdGhpcy5jb25maWcucHJveHlGdWxsQWRkcmVzcyArIHRoaXMuY29uZmlnLnByb3h5U2VydmljZUV4ZWN1dGU7XHJcbiAgICBjb25zb2xlLmxvZygnQ29uZmlnOiAnLCB0aGlzLmNvbmZpZyk7IC8vIGZvciB0ZXN0aW5nIHB1cnBvc2VzIG9ubHlcclxuICAgIHRoaXMubG9jYWxVc2VyID0ge1xyXG4gICAgICBcImZvcm1QcmVmaXhcIjogXCJDRVBcIixcclxuICAgICAgXCJmb3JtSWRcIjogXCJDRVA1NTk1NDMyXCIsXHJcbiAgICAgIFwiaW5ib3hVcmlcIjogXCJcXC9ncm91cFxcL2h1YlxcL2luYm94XCIsXHJcbiAgICAgIFwiYmFzZVVybFwiOiBcIlxcL2dyb3VwXFwvaS1nYXRlXFwvd20tYnBtXFwvZm9ybXNcXC8tXFwvcHJveHlcIixcclxuICAgICAgXCJzaG93UHJpbnRcIjogdHJ1ZSxcclxuICAgICAgXCJsYW5ndWFnZVwiOiBcImVuXCIsXHJcbiAgICAgIFwiaXNNb2JpbGVcIjogdHJ1ZSxcclxuICAgICAgXCJvdXRsb29rXCI6IGZhbHNlLFxyXG4gICAgICBcImxvZ2dlZEluVXNlckVtYWlsXCI6IFwiaWJyYWhpbW1hYS5jQHN0Yy5jb20uc2FcIlxyXG4gICAgfVxyXG4gICAgdGhpcy5wcm9qZWN0Q29uZmlnID0gKHRoaXMuY29uZmlnLnByb2R1Y3Rpb24pID8gKHdpbmRvdyBhcyBhbnkpWyd3bUNvbmZpZyddIDogYnRvYShKU09OLnN0cmluZ2lmeSh0aGlzLmxvY2FsVXNlcikpO1xyXG4gICAgdGhpcy51c2VyRGF0YSA9IEpTT04ucGFyc2UoYXRvYih0aGlzLnByb2plY3RDb25maWcpKTtcclxuICB9XHJcblxyXG4gIGdldExvZ2dlZEluVXNlckRhdGEoKSB7XHJcbiAgICBsZXQgbG9nZ2VkSW5FbWFpbCA9IHRoaXMubG9nZ2VkSW5Vc2VySWQoKVxyXG4gICAgdGhpcy5lbXBsb3llZVByb2ZpbGUobG9nZ2VkSW5FbWFpbCkuc3Vic2NyaWJlKChyZXNwb25zZTogYW55KSA9PiB7XHJcbiAgICAgIHRoaXMubG9nZ2VkSW5Vc2VyRGF0YSA9IHJlc3BvbnNlPy5bXCJVc2Vyc1wiXT8uWzBdXHJcbiAgICAgIGNvbnNvbGUubG9nKCdnZXRMb2dnZWRJblVzZXJEYXRhJywgcmVzcG9uc2UpXHJcbiAgICB9KVxyXG4gIH1cclxuXHJcbiAgbG9hZEZvcm0oKSB7XHJcbiAgICBjb25zdCBhdXRoVXJsID0gdGhpcy5idWlsZEF1dGhVcmwoKTtcclxuICAgIHJldHVybiB0aGlzLmh0dHAuZ2V0KGF1dGhVcmwsIHtvYnNlcnZlOiAncmVzcG9uc2UnfSkudG9Qcm9taXNlKClcclxuICAgICAgLnRoZW4oKHJlczogYW55KSA9PiB7XHJcbiAgICAgICAgY29uc3QgdG9rZW5JbmZvcm1hdGlvbiA9IHJlcy5ib2R5O1xyXG4gICAgICAgIHRoaXMuYXV0aFRva2VuID0gdG9rZW5JbmZvcm1hdGlvbi50b2tlbjtcclxuICAgICAgICB0aGlzLmdldExvZ2dlZEluVXNlckRhdGEoKVxyXG4gICAgICAgIHRoaXMucmVmcmVzaFRva2VuID0gdG9rZW5JbmZvcm1hdGlvbi5yZWZyZXNoVG9rZW47XHJcbiAgICAgICAgY29uc3QgYm9keSA9IHRoaXMuYnVpbGRCb2R5KCk7XHJcbiAgICAgICAgY29uc3Qgb3B0aW9ucyA9IHRoaXMuZ2V0UmVxdWVzdE9wdGlvbnMoKTtcclxuICAgICAgICByZXR1cm4gdGhpcy5jYWxsUG9zdChib2R5LCBvcHRpb25zKTtcclxuICAgICAgfSlcclxuICAgICAgLmNhdGNoKChodHRwRXJyb3I6IGFueSkgPT4ge1xyXG4gICAgICAgIHJldHVybiB0aHJvd0Vycm9yKGh0dHBFcnJvcik7XHJcbiAgICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBidWlsZEF1dGhVcmwoKTogc3RyaW5nIHtcclxuICAgIGNvbnN0IGJhc2VVcmwgPSB0aGlzLmNvbmZpZy5wcm94eVNlcnZpY2VCYXNlVXJsO1xyXG4gICAgY29uc3QgbGFuZ3VhZ2UgPSAod2luZG93IGFzIGFueSk/LndtQ29uZmlnPy5sYW5ndWFnZSA/ICh3aW5kb3cgYXMgYW55KS53bUNvbmZpZy5sYW5ndWFnZSA6ICdlbic7XHJcbiAgICBjb25zdCBmdWxsQWRkcmVzcyA9IHRoaXMuY29uZmlnLnByb3h5RnVsbEFkZHJlc3M7XHJcbiAgICBjb25zdCBhdXRoUGFydCA9IHRoaXMuY29uZmlnLnByb3h5U2VydmljZUF1dGhvcml6YXRpb247XHJcbiAgICByZXR1cm4gYCR7YmFzZVVybH0ke2xhbmd1YWdlfSR7ZnVsbEFkZHJlc3N9JHthdXRoUGFydH0/dHM9JHsobmV3IERhdGUoKSkudmFsdWVPZigpfWA7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGJ1aWxkQm9keSgpOiBvYmplY3Qge1xyXG4gICAgY29uc3QgYmFzZUJvZHkgPSB7XHJcbiAgICAgIG1ldGhvZDogY29uc3RhbnRzLkhUVFBfTUVUSE9EX0dFVCxcclxuICAgICAgZGVzdGluYXRpb246IGNvbnN0YW50cy5UQVJHRVRfU0VSVkVSX1dNLFxyXG4gICAgICBzZXJ2aWNlTmFtZTogY29uc3RhbnRzLlNFUlZJQ0VfTkFNRV9XTV9GT1JNLFxyXG4gICAgICBmb3JtTmFtZTogdGhpcy5jb25maWcuZm9ybU5hbWUsXHJcbiAgICAgIGZvcm1JZDogXCJcIixcclxuICAgICAgcXVlcnlQYXJhbWV0ZXJzOiBudWxsXHJcbiAgICB9O1xyXG4gICAgaWYgKCF0aGlzLmNvbmZpZy5mb3JtSWQpIHtcclxuICAgICAgZGVsZXRlIGJhc2VCb2R5LmZvcm1JZDtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGJhc2VCb2R5LmZvcm1JZCA9IHRoaXMuY29uZmlnLmZvcm1JZDtcclxuICAgIH1cclxuICAgIHJldHVybiBiYXNlQm9keTtcclxuICB9XHJcblxyXG4gIGVtcGxveWVlUHJvZmlsZShlbXBsb3llZUVtYWlsOiBhbnkpIHtcclxuICAgIGxldCBib2R5ID0ge1xyXG4gICAgICBtZXRob2Q6IFwiR0VUXCIsXHJcbiAgICAgIGZvcm1OYW1lOiBcIkFBSVwiLFxyXG4gICAgICBkZXN0aW5hdGlvbjogXCJEUFwiLFxyXG4gICAgICBzZXJ2aWNlTmFtZTogXCJpZ2F0ZS51c2Vycy5zZWFyY2gudjNcIixcclxuICAgICAgcGFyYW1ldGVyczoge1xyXG4gICAgICAgIHE6IGVtcGxveWVlRW1haWxcclxuICAgICAgfVxyXG4gICAgfTtcclxuICAgIHJldHVybiB0aGlzLmh0dHAucG9zdCh0aGlzLmFwaVVybCwgYm9keSwge1xyXG4gICAgICBoZWFkZXJzOiBuZXcgSHR0cEhlYWRlcnMoe1xyXG4gICAgICAgIGF1dGhUb2tlbjogdGhpcy5hdXRoVG9rZW4sXHJcbiAgICAgICAgXCJDb250ZW50LVR5cGVcIjogXCJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWRcIlxyXG4gICAgICB9KSxcclxuICAgICAgb2JzZXJ2ZTogXCJib2R5XCJcclxuICAgIH0pLnBpcGUoXHJcbiAgICAgIG1hcCgocmVzcG9uc2U6IGFueSkgPT4ge1xyXG4gICAgICAgIHJldHVybiByZXNwb25zZVxyXG4gICAgICB9KVxyXG4gICAgICAsIGNhdGNoRXJyb3IoKGVycjogYW55KSA9PiB7XHJcbiAgICAgICAgcmV0dXJuIHRocm93RXJyb3IoZXJyKVxyXG4gICAgICB9KSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGdldFJlcXVlc3RPcHRpb25zKCkge1xyXG4gICAgcmV0dXJuIHtcclxuICAgICAgaGVhZGVyczogbmV3IEh0dHBIZWFkZXJzKHtcclxuICAgICAgICBhdXRoVG9rZW46IHRoaXMuYXV0aFRva2VuLFxyXG4gICAgICAgICdDb250ZW50LVR5cGUnOiBjb25zdGFudHMuSEVBREVSX0NPTlRFTlRfVFlQRV9GT1JNXHJcbiAgICAgIH0pLFxyXG4gICAgICBvYnNlcnZlOiAnYm9keSdcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgY2FsbFBvc3QoYm9keSwgb3B0aW9ucykge1xyXG4gICAgY29uc3QgbGFuZ3VhZ2UgPSAod2luZG93IGFzIGFueSk/LndtQ29uZmlnPy5sYW5ndWFnZSA/ICh3aW5kb3cgYXMgYW55KS53bUNvbmZpZy5sYW5ndWFnZSA6IFwiZW5cIjtcclxuICAgIGxldCBhcGlVcmwgPSB0aGlzLmNvbmZpZy5wcm94eVNlcnZpY2VCYXNlVXJsICsgbGFuZ3VhZ2UgKyB0aGlzLmNvbmZpZy5wcm94eUZ1bGxBZGRyZXNzICsgdGhpcy5jb25maWcucHJveHlTZXJ2aWNlRXhlY3V0ZTtcclxuICAgIHJldHVybiB0aGlzLmh0dHAucG9zdChhcGlVcmwsIGVuY29kZVVSSUNvbXBvbmVudChKU09OLnN0cmluZ2lmeShib2R5KSksIG9wdGlvbnMpLnRvUHJvbWlzZSgpXHJcbiAgICAgIC50aGVuKFxyXG4gICAgICAgIChyZXNwb25zZU9iamVjdDogYW55KSA9PiB7XHJcbiAgICAgICAgICAvLyBsZXQgcGF5bG9hZCA9IHJlc3BvbnNlT2JqZWN0LmJvZHk7XHJcbiAgICAgICAgICByZXR1cm4gdGhpcy5zdWNjZXNzV20ocmVzcG9uc2VPYmplY3QpXHJcbiAgICAgICAgfSxcclxuICAgICAgKS5jYXRjaChcclxuICAgICAgICAoaHR0cEVycm9yOiBhbnkpID0+IHtcclxuICAgICAgICAgIHJldHVybiB0aHJvd0Vycm9yKGh0dHBFcnJvcilcclxuICAgICAgICB9XHJcbiAgICAgICk7XHJcbiAgfVxyXG5cclxuICAvKnN1Y2Nlc3NXbSguLi5hcmdzOiBhbnlbXSkge1xyXG4gICAgbGV0IFtwYXlsb2FkXSA9IGFyZ3M7XHJcbiAgICBsZXQgd2FzU2VuZEJhY2sgPSBmYWxzZTtcclxuICAgIC8hKiBDb252ZXJ0IGludG8gRm9ybSBPYmplY3QgKiEvXHJcbiAgICBsZXQgcmVzdWx0ID0gbmV3IEZvcm0oXHJcbiAgICAgIGNvbnN0YW50cy5OT19WQUxVRSxcclxuICAgICAgY29uc3RhbnRzLk5PX1ZBTFVFLFxyXG4gICAgICBjb25zdGFudHMuTk9fVkFMVUUsXHJcbiAgICAgIGNvbnN0YW50cy5OT19WQUxVRSxcclxuICAgICAgY29uc3RhbnRzLk5PX1ZBTFVFLFxyXG4gICAgICBjb25zdGFudHMuTk9fVkFMVUUsXHJcbiAgICAgIGNvbnN0YW50cy5OT19WQUxVRVxyXG4gICAgKTtcclxuICAgIC8vIGtlZXAgZW1haWxzIG9uLXRyYWNrXHJcbiAgICBsZXQgcGF5bG9hZEZvcm1EZXRhaWxzID0gcGF5bG9hZC5kYXRhLmZvcm07XHJcbiAgICBsZXQgaXNSZWFkT25seSA9IChwYXlsb2FkRm9ybURldGFpbHMucmVhZE9ubHkudG9VcHBlckNhc2UoKSA9PT0gY29uc3RhbnRzLlRSVUVfU1RSSU5HID8gY29uc3RhbnRzLlRSVUVfQk9PTCA6IChwYXlsb2FkRm9ybURldGFpbHMucmVhZE9ubHkudG9VcHBlckNhc2UoKSA9PT0gY29uc3RhbnRzLkZBTFNFX1NUUklORyA/IGNvbnN0YW50cy5GQUxTRV9CT09MIDogY29uc3RhbnRzLk5PX1ZBTFVFKSlcclxuICAgIHJlc3VsdC5oZWFkZXIgPSBuZXcgSGVhZGVyKFxyXG4gICAgICBwYXlsb2FkLmRhdGE/LlsncmVxdWVzdGVyJ10uZnVsbE5hbWUsXHJcbiAgICAgIGNvbnN0YW50cy5JR0FURV9TVEFUSUNfQVNTRVRfUFJPRklMRV9QSE9UT19VUkwgKyBwYXlsb2FkLmRhdGEucmVxdWVzdGVyLmVtcGxveWVlRW1haWwsXHJcbiAgICAgIChwYXlsb2FkRm9ybURldGFpbHMuZm9ybUlkID8gcGF5bG9hZEZvcm1EZXRhaWxzLmZvcm1JZCA6IGNvbnN0YW50cy5ET05UX1NIT1cpLFxyXG4gICAgICAocGF5bG9hZEZvcm1EZXRhaWxzLmNyZWF0aW9uRGF0ZSA/IHBheWxvYWRGb3JtRGV0YWlscy5jcmVhdGlvbkRhdGUgOiBjb25zdGFudHMuRE9OVF9TSE9XKSxcclxuICAgICAgcGF5bG9hZEZvcm1EZXRhaWxzLmZvcm1TdGF0dXMsXHJcbiAgICAgIHBheWxvYWRGb3JtRGV0YWlscy5kZXRhaWxzXHJcbiAgICApO1xyXG4gICAgLy8gdGhpcy5pc1JlYWRPbmx5ID0gcGF5bG9hZEZvcm1EZXRhaWxzLnJlYWRPbmx5XHJcbiAgICAvISogR2VuZXJhdGUgUHJvZmlsZSBJbmZvcm1hdGlvbiBPYmplY3QgKiEvXHJcbiAgICBsZXQgcGF5bG9hZFByb2ZpbGVJbmZvID0gcGF5bG9hZC5kYXRhPy5bJ3JlcXVlc3RlciddO1xyXG4gICAgcmVzdWx0LnByb2ZpbGVJbmZvRHJvcCA9IG5ldyBQcm9maWxlSW5mb0Ryb3AoXHJcbiAgICAgIChwYXlsb2FkUHJvZmlsZUluZm8ub25CZWhhbGZBdXRob3JpemVkID8gSlNPTi5wYXJzZShwYXlsb2FkUHJvZmlsZUluZm8ub25CZWhhbGZBdXRob3JpemVkKSA6IG51bGwpLFxyXG4gICAgICBwYXlsb2FkUHJvZmlsZUluZm8/LlsnZW1wbG95ZWVJZCddLFxyXG4gICAgICBwYXlsb2FkUHJvZmlsZUluZm8uZW1wbG95ZWVFbWFpbCxcclxuICAgICAgcGF5bG9hZFByb2ZpbGVJbmZvLmZ1bGxOYW1lLFxyXG4gICAgICBwYXlsb2FkUHJvZmlsZUluZm8uZ2VuZXJhbERlcGFydG1lbnROYW1lLFxyXG4gICAgICBwYXlsb2FkUHJvZmlsZUluZm8uam9iUG9zaXRpb24sXHJcbiAgICAgIHBheWxvYWRQcm9maWxlSW5mbz8uWydzZWN0b3JOYW1lJ10sXHJcbiAgICAgIHBheWxvYWRQcm9maWxlSW5mby5kZXBhcnRtZW50TmFtZSxcclxuICAgICAgcGF5bG9hZFByb2ZpbGVJbmZvLmdlbmVyYWxEZXBhcnRtZW50Q29kZSxcclxuICAgICAgcGF5bG9hZFByb2ZpbGVJbmZvPy5bJ2h1bWFuUmVzb3VyY2VMb2NhdGlvbiddLFxyXG4gICAgICBwYXlsb2FkUHJvZmlsZUluZm8ubmF0aW9uYWxpdHksXHJcbiAgICAgIHBheWxvYWRQcm9maWxlSW5mby5idXNpbmVzc1Bob25lLFxyXG4gICAgICBwYXlsb2FkUHJvZmlsZUluZm8/LlsnZGlyZWN0TWFuYWdlck5hbWUnXVxyXG4gICAgKTtcclxuICAgIC8hKiBHZW5lcmF0ZSBTZWN0aW9ucyBPYmplY3QgKiEvXHJcbiAgICByZXN1bHQuc2VjdGlvbnMgPSBbXTtcclxuICAgIC8hKiBQdXNoIGFzIGZpcnN0IG9iamVjdCB0aGUgc2VjdGlvbiBmb3IgdGhlIHJlcXVlc3QgZGV0YWlscyAqIS9cclxuICAgIGxldCByZXF1ZXN0RGV0YWlsc0hhc0NvbW1lbnQgPSBmYWxzZTtcclxuICAgIGlmIChwYXlsb2FkLmRhdGEucmVxdWVzdC5kZXRhaWxzLmNvbW1lbnQpIHtcclxuICAgICAgcmVxdWVzdERldGFpbHNIYXNDb21tZW50ID0gdHJ1ZTtcclxuICAgIH1cclxuICAgIHJlc3VsdC5zZWN0aW9ucy5wdXNoKFxyXG4gICAgICBuZXcgU2VjdGlvbihcclxuICAgICAgICBjb25zdGFudHMuU0VDVElPTl9JRF9SRVFVRVNUX0RFVEFJTFMsXHJcbiAgICAgICAgbmV3IFNlY3Rpb25IZWFkZXIoXHJcbiAgICAgICAgICBjb25zdGFudHMuRE9OVF9TSE9XLFxyXG4gICAgICAgICAgY29uc3RhbnRzLkRPTlRfU0hPVyxcclxuICAgICAgICAgIGNvbnN0YW50cy5ET05UX1NIT1csXHJcbiAgICAgICAgICBjb25zdGFudHMuRE9OVF9TSE9XLFxyXG4gICAgICAgICAgY29uc3RhbnRzLkRPTlRfU0hPVyxcclxuICAgICAgICAgIGNvbnN0YW50cy5ET05UX1NIT1csXHJcbiAgICAgICAgICBjb25zdGFudHMuRE9OVF9TSE9XLFxyXG4gICAgICAgICAgcmVxdWVzdERldGFpbHNIYXNDb21tZW50LFxyXG4gICAgICAgICAgKHBheWxvYWQuZGF0YS53b3JrZmxvd1N0ZXBzID8gY29uc3RhbnRzLlJFQURfT05MWSA6IGlzUmVhZE9ubHkpXHJcbiAgICAgICAgKSxcclxuICAgICAgICBwYXlsb2FkLmRhdGEucmVxdWVzdFxyXG4gICAgICApXHJcbiAgICApO1xyXG5cclxuXHJcbiAgICBsZXQgcGF5bG9hZFdvcmtmbG93U3RlcHMgPSBwYXlsb2FkLmRhdGEud29ya2Zsb3dTdGVwcztcclxuICAgIGlmIChwYXlsb2FkV29ya2Zsb3dTdGVwcyAmJiBwYXlsb2FkV29ya2Zsb3dTdGVwcy5jb25zdHJ1Y3RvciA9PT0gQXJyYXkgJiYgcGF5bG9hZFdvcmtmbG93U3RlcHMubGVuZ3RoID4gMCkge1xyXG4gICAgICBwYXlsb2FkV29ya2Zsb3dTdGVwcy5mb3JFYWNoKChzdGVwLCBpbmRleCkgPT4ge1xyXG4gICAgICAgIGxldCBjdXJyZW50SXNSZXF1ZXN0ZXJTZW5kQmFjayA9IEpTT04uc3RyaW5naWZ5KHN0ZXAuZGV0YWlscykgPT09IEpTT04uc3RyaW5naWZ5KHt9KTtcclxuICAgICAgICBsZXQgaGFzQ29tbWVudHMgPSAoIWN1cnJlbnRJc1JlcXVlc3RlclNlbmRCYWNrICYmIChzdGVwLmRldGFpbHMuY29tbWVudCB8fCBzdGVwLmNvbW1lbnQpID8gY29uc3RhbnRzLkhBU19DT01NRU5UUyA6IGNvbnN0YW50cy5OT19DT01NRU5UUyk7XHJcbiAgICAgICAgdGhpcy5jdXJyZW50QWN0b3IgPSAoc3RlcC5hY3Rvci5lbWFpbCA9PT0gc3RlcC5hY3Rvci5yZWNpcGllbnQuZW1haWwgPyBzdGVwLmFjdG9yLnJlY2lwaWVudCA6IChzdGVwLmFjdG9yLmRlbGVnYXRlID8gc3RlcC5hY3Rvci5kZWxlZ2F0ZSA6IG51bGwpKVxyXG4gICAgICAgIGlmIChoYXNDb21tZW50cykge1xyXG4gICAgICAgICAgcmVzdWx0LmNvbW1lbnRzRHJvcCA9ICghcmVzdWx0LmNvbW1lbnRzRHJvcCA/IFtdIDogcmVzdWx0LmNvbW1lbnRzRHJvcCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAod2FzU2VuZEJhY2sgJiYgc3RlcC5hY3Rvci5yZWNpcGllbnQucm9sZSA9PT0gJ1JFUVVFU1RFUicpIHtcclxuICAgICAgICAgIGNvbnNvbGUubG9nKFwid2FzU2VuZEJhY2sgJiYgUkVRVUVTVEVSXCIpXHJcbiAgICAgICAgICByZXN1bHQuc2VjdGlvbnMgPSBbbmV3IFNlY3Rpb24oXHJcbiAgICAgICAgICAgIGNvbnN0YW50cy5TRUNUSU9OX0lEX1JFUVVFU1RfREVUQUlMUyxcclxuICAgICAgICAgICAgbmV3IFNlY3Rpb25IZWFkZXIoXHJcbiAgICAgICAgICAgICAgY29uc3RhbnRzLkRPTlRfU0hPVyxcclxuICAgICAgICAgICAgICBjb25zdGFudHMuRE9OVF9TSE9XLFxyXG4gICAgICAgICAgICAgIGNvbnN0YW50cy5ET05UX1NIT1csXHJcbiAgICAgICAgICAgICAgY29uc3RhbnRzLkRPTlRfU0hPVyxcclxuICAgICAgICAgICAgICBjb25zdGFudHMuRE9OVF9TSE9XLFxyXG4gICAgICAgICAgICAgIGNvbnN0YW50cy5ET05UX1NIT1csXHJcbiAgICAgICAgICAgICAgY29uc3RhbnRzLkRPTlRfU0hPVyxcclxuICAgICAgICAgICAgICByZXF1ZXN0RGV0YWlsc0hhc0NvbW1lbnQsXHJcbiAgICAgICAgICAgICAgKHBheWxvYWQuZGF0YS53b3JrZmxvd1N0ZXBzID8gY29uc3RhbnRzLlJFQURfT05MWSA6IGlzUmVhZE9ubHkpXHJcbiAgICAgICAgICAgICksXHJcbiAgICAgICAgICAgIHBheWxvYWQuZGF0YS5yZXF1ZXN0XHJcbiAgICAgICAgICApXVxyXG4gICAgICAgIH0gZWxzZSBpZiAod2FzU2VuZEJhY2spIHtcclxuICAgICAgICAgIGNvbnNvbGUubG9nKFwiUG9wXCIpXHJcbiAgICAgICAgICBpZiAocmVzdWx0LnNlY3Rpb25zLmxlbmd0aCA+IDEpIHtcclxuICAgICAgICAgICAgcmVzdWx0LnNlY3Rpb25zLnBvcCgpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgd2FzU2VuZEJhY2sgPSBmYWxzZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHN0ZXAuZGV0YWlscy5kZWNpc2lvbiAmJiBzdGVwLmRldGFpbHMuZGVjaXNpb24ua2V5ID09PSBjb25zdGFudHMuRk9STV9TVEFUVVNfU0VORF9CQUNLKSB7XHJcbiAgICAgICAgICB3YXNTZW5kQmFjayA9IHRydWU7XHJcbiAgICAgICAgfSBlbHNlIGlmIChKU09OLnN0cmluZ2lmeShzdGVwLmRldGFpbHMpICE9PSBKU09OLnN0cmluZ2lmeSh7fSkpIHtcclxuICAgICAgICAgIHJlc3VsdC5zZWN0aW9ucy5wdXNoKFxyXG4gICAgICAgICAgICBuZXcgU2VjdGlvbihcclxuICAgICAgICAgICAgICBzdGVwLmFjdG9yLnJlY2lwaWVudC5yb2xlLnRvTG93ZXJDYXNlKCkgKyBjb25zdGFudHMuU0VDVElPTl9JRF9BUFBST1ZBTF9QQVJUSUFMX05BTUUsXHJcbiAgICAgICAgICAgICAgbmV3IFNlY3Rpb25IZWFkZXIoXHJcbiAgICAgICAgICAgICAgICAodGhpcy5nZXRTaG9ydE5hbWUodGhpcy5jdXJyZW50QWN0b3I/Lm5hbWUpKSxcclxuICAgICAgICAgICAgICAgIHN0ZXAuZGF0ZSxcclxuICAgICAgICAgICAgICAgIHRoaXMuZ2V0U2hvcnROYW1lKHN0ZXAuYWN0b3IucmVjaXBpZW50Lm5hbWUpLFxyXG4gICAgICAgICAgICAgICAgY29uc3RhbnRzLklHQVRFX1NUQVRJQ19BU1NFVF9QUk9GSUxFX1BIT1RPX1VSTCArIHN0ZXAuYWN0b3IucmVjaXBpZW50LmVtYWlsLFxyXG4gICAgICAgICAgICAgICAgKHN0ZXAuYWN0b3IuZGVsZWdhdGUgJiYgc3RlcC5hY3Rvci5kZWxlZ2F0ZS5uYW1lID8gdGhpcy5nZXRTaG9ydE5hbWUoc3RlcC5hY3Rvci5kZWxlZ2F0ZS5uYW1lKSA6IG51bGwpLFxyXG4gICAgICAgICAgICAgICAgKHN0ZXAuYWN0b3IuZGVsZWdhdGUgJiYgc3RlcC5hY3Rvci5kZWxlZ2F0ZS5lbWFpbCA/IGNvbnN0YW50cy5JR0FURV9TVEFUSUNfQVNTRVRfUFJPRklMRV9QSE9UT19VUkwgKyBzdGVwLmFjdG9yLmRlbGVnYXRlLmVtYWlsIDogbnVsbCksXHJcbiAgICAgICAgICAgICAgICBzdGVwLmFjdG9yLnN0YXR1cyxcclxuICAgICAgICAgICAgICAgIGhhc0NvbW1lbnRzLFxyXG4gICAgICAgICAgICAgICAgKGluZGV4IDwgcGF5bG9hZFdvcmtmbG93U3RlcHMubGVuZ3RoIC0gMSA/IGNvbnN0YW50cy5SRUFEX09OTFkgOiBpc1JlYWRPbmx5KVxyXG4gICAgICAgICAgICAgICksXHJcbiAgICAgICAgICAgICAge2RldGFpbHM6IHN0ZXAuZGV0YWlscywgcHJvY2Vzc2luZ0RhdGU6IHN0ZXAuZGF0ZX1cclxuICAgICAgICAgICAgKVxyXG4gICAgICAgICAgKTtcclxuICAgICAgICAgIC8vIHRoaXMuZ2VuZXJhbFNlcnZpY2UuY3VycmVudFN1Ym1pdHRlciA9IHthY3Rvcjogc3RlcC5hY3RvciwgcmVjaXBpZW50OiBzdGVwLnJlY2lwaWVudCwgZGVsZWdhdGU6IHN0ZXAuYWN0b3IuZGVsZWdhdGV9O1xyXG5cclxuICAgICAgICB9XHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuXHJcbiAgICAvISogQ3JlYXRlIExvdiBTZWN0aW9ucyAqIS9cclxuICAgIHJlc3VsdC5sb3ZzID0gKHBheWxvYWQubWV0YSAmJiBwYXlsb2FkLm1ldGEubG92cyA/IHBheWxvYWQubWV0YS5sb3ZzIDogbnVsbCk7XHJcblxyXG4gICAgaWYgKHBheWxvYWQubWV0YSAmJiBwYXlsb2FkLm1ldGEubWVzc2FnZXMpIHtcclxuICAgICAgcmVzdWx0Lm1lc3NhZ2VzID0gbmV3IE1lc3NhZ2VzKFxyXG4gICAgICAgIHt9LFxyXG4gICAgICAgIFtdLFxyXG4gICAgICAgIFtdLFxyXG4gICAgICAgIFtdXHJcbiAgICAgICk7XHJcbiAgICAgIHBheWxvYWQubWV0YS5tZXNzYWdlcy5mb3JFYWNoKChtZXNzYWdlOiBhbnkpID0+IHtcclxuICAgICAgICByZXN1bHQubWVzc2FnZXNbbWVzc2FnZS50eXBlXS5wdXNoKG1lc3NhZ2UubWVzc2FnZSk7XHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG4gICAgLy8gcmVzdWx0Lm1lc3NhZ2VzID0gKHBheWxvYWQubWV0YSAmJiBwYXlsb2FkLm1ldGEubWVzc2FnZXMgPyBwYXlsb2FkLm1ldGEubWVzc2FnZXMgOiBudWxsKTtcclxuICAgIC8hKiBGaXggbGFzdCBzZWN0aW9uIHRvIGJlIHRoZSBSTy9XTSBmcm9tIHRoZSB2YXJpYWJsZSAqIS9cclxuICAgIHJlc3VsdC5zZWN0aW9uc1tyZXN1bHQuc2VjdGlvbnMubGVuZ3RoIC0gMV0uaGVhZGVyLnJlYWRPbmx5ID0gaXNSZWFkT25seTtcclxuICAgIHJldHVybiByZXN1bHQ7XHJcbiAgfSovXHJcblxyXG4gIHN1Y2Nlc3NXbSguLi5hcmdzKSB7XHJcbiAgICBsZXQgW3BheWxvYWRdID0gYXJncztcclxuICAgIC8vIGxldCB3YXNTZW5kQmFjayA9IGZhbHNlO1xyXG4gICAgLyogQ29udmVydCBpbnRvIEZvcm0gT2JqZWN0ICovXHJcbiAgICBsZXQgcmVzdWx0ID0gbmV3IEZvcm0oXHJcbiAgICAgIGNvbnN0YW50cy5OT19WQUxVRSxcclxuICAgICAgY29uc3RhbnRzLk5PX1ZBTFVFLFxyXG4gICAgICBjb25zdGFudHMuTk9fVkFMVUUsXHJcbiAgICAgIGNvbnN0YW50cy5OT19WQUxVRSxcclxuICAgICAgY29uc3RhbnRzLk5PX1ZBTFVFLFxyXG4gICAgICBjb25zdGFudHMuTk9fVkFMVUUsXHJcbiAgICAgIGNvbnN0YW50cy5OT19WQUxVRVxyXG4gICAgKTtcclxuICAgIC8qIEdlbmVyYXRlIEhlYWRlciBPYmplY3QgKi9cclxuICAgIGxldCBwYXlsb2FkRm9ybURldGFpbHMgPSBwYXlsb2FkLmRhdGEuZm9ybTtcclxuICAgIGxldCBpc1JlYWRPbmx5ID0gKHBheWxvYWRGb3JtRGV0YWlscy5yZWFkT25seS50b1VwcGVyQ2FzZSgpID09PSBjb25zdGFudHMuVFJVRV9TVFJJTkcgPyBjb25zdGFudHMuVFJVRV9CT09MIDogKHBheWxvYWRGb3JtRGV0YWlscy5yZWFkT25seS50b1VwcGVyQ2FzZSgpID09PSBjb25zdGFudHMuRkFMU0VfU1RSSU5HID8gY29uc3RhbnRzLkZBTFNFX0JPT0wgOiBjb25zdGFudHMuTk9fVkFMVUUpKVxyXG4gICAgcmVzdWx0LmhlYWRlciA9IG5ldyBIZWFkZXIoXHJcbiAgICAgIHBheWxvYWQuZGF0YVsncmVxdWVzdGVyJ10uZnVsbE5hbWUsXHJcbiAgICAgIGNvbnN0YW50cy5JR0FURV9TVEFUSUNfQVNTRVRfUFJPRklMRV9QSE9UT19VUkwgKyBwYXlsb2FkLmRhdGFbJ3JlcXVlc3RlciddLmVtcGxveWVlRW1haWwsXHJcbiAgICAgIChwYXlsb2FkRm9ybURldGFpbHMuZm9ybUlkID8gcGF5bG9hZEZvcm1EZXRhaWxzLmZvcm1JZCA6IGNvbnN0YW50cy5ET05UX1NIT1cpLFxyXG4gICAgICAocGF5bG9hZEZvcm1EZXRhaWxzLmNyZWF0aW9uRGF0ZSA/IHBheWxvYWRGb3JtRGV0YWlscy5jcmVhdGlvbkRhdGUgOiBjb25zdGFudHMuRE9OVF9TSE9XKSxcclxuICAgICAgcGF5bG9hZEZvcm1EZXRhaWxzWydmb3JtU3RhdHVzJ10sXHJcbiAgICAgIHBheWxvYWRGb3JtRGV0YWlscy5kZXRhaWxzXHJcbiAgICApO1xyXG4gICAgLyogR2VuZXJhdGUgUHJvZmlsZSBJbmZvcm1hdGlvbiBPYmplY3QgKi9cclxuICAgIGxldCBwYXlsb2FkUHJvZmlsZUluZm8gPSBwYXlsb2FkLmRhdGFbJ3JlcXVlc3RlciddO1xyXG4gICAgcmVzdWx0LnByb2ZpbGVJbmZvRHJvcCA9IG5ldyBQcm9maWxlSW5mb0Ryb3AoXHJcbiAgICAgIChwYXlsb2FkUHJvZmlsZUluZm8ub25CZWhhbGZBdXRob3JpemVkID8gSlNPTi5wYXJzZShwYXlsb2FkUHJvZmlsZUluZm8ub25CZWhhbGZBdXRob3JpemVkKSA6IG51bGwpLFxyXG4gICAgICBwYXlsb2FkUHJvZmlsZUluZm9bJ2VtcGxveWVlSWQnXSxcclxuICAgICAgcGF5bG9hZFByb2ZpbGVJbmZvLmVtcGxveWVlRW1haWwsXHJcbiAgICAgIHBheWxvYWRQcm9maWxlSW5mby5mdWxsTmFtZSxcclxuICAgICAgcGF5bG9hZFByb2ZpbGVJbmZvLmdlbmVyYWxEZXBhcnRtZW50TmFtZSxcclxuICAgICAgcGF5bG9hZFByb2ZpbGVJbmZvLmpvYlBvc2l0aW9uLFxyXG4gICAgICBwYXlsb2FkUHJvZmlsZUluZm8uc2VjdG9yTmFtZSxcclxuICAgICAgcGF5bG9hZFByb2ZpbGVJbmZvLmRlcGFydG1lbnROYW1lLFxyXG4gICAgICBwYXlsb2FkUHJvZmlsZUluZm8uZ2VuZXJhbERlcGFydG1lbnRDb2RlLFxyXG4gICAgICBwYXlsb2FkUHJvZmlsZUluZm9bJ2h1bWFuUmVzb3VyY2VMb2NhdGlvbiddLFxyXG4gICAgICBwYXlsb2FkUHJvZmlsZUluZm8ubmF0aW9uYWxpdHksXHJcbiAgICAgIHBheWxvYWRQcm9maWxlSW5mby5idXNpbmVzc1Bob25lLFxyXG4gICAgICBwYXlsb2FkUHJvZmlsZUluZm8uZGlyZWN0TWFuYWdlck5hbWUsXHJcbiAgICAgIHBheWxvYWRQcm9maWxlSW5mby5zZW5pb3JTZWN0b3JOYW1lXHJcbiAgICApO1xyXG4gICAgLyogR2VuZXJhdGUgU2VjdGlvbnMgT2JqZWN0ICovXHJcbiAgICByZXN1bHQuc2VjdGlvbnMgPSBbXTtcclxuICAgIC8qIFB1c2ggYXMgZmlyc3Qgb2JqZWN0IHRoZSBzZWN0aW9uIGZvciB0aGUgcmVxdWVzdCBkZXRhaWxzICovXHJcbiAgICBsZXQgcmVxdWVzdERldGFpbHNIYXNDb21tZW50ID0gZmFsc2U7XHJcbiAgICBpZiAocGF5bG9hZC5kYXRhLnJlcXVlc3QuZGV0YWlscy5jb21tZW50KSB7XHJcbiAgICAgIHJlcXVlc3REZXRhaWxzSGFzQ29tbWVudCA9IHRydWU7XHJcbiAgICB9XHJcbiAgICByZXN1bHQuc2VjdGlvbnMucHVzaChcclxuICAgICAgbmV3IFNlY3Rpb24oXHJcbiAgICAgICAgY29uc3RhbnRzLlNFQ1RJT05fSURfUkVRVUVTVF9ERVRBSUxTLFxyXG4gICAgICAgIG5ldyBTZWN0aW9uSGVhZGVyKGNvbnN0YW50cy5ET05UX1NIT1csIGNvbnN0YW50cy5ET05UX1NIT1csIGNvbnN0YW50cy5ET05UX1NIT1csIGNvbnN0YW50cy5ET05UX1NIT1csIGNvbnN0YW50cy5ET05UX1NIT1csIGNvbnN0YW50cy5ET05UX1NIT1csIGNvbnN0YW50cy5ET05UX1NIT1csIHJlcXVlc3REZXRhaWxzSGFzQ29tbWVudCwgKHBheWxvYWQuZGF0YVsnd29ya2Zsb3dTdGVwcyddID8gY29uc3RhbnRzLlJFQURfT05MWSA6IGlzUmVhZE9ubHkpKSxcclxuICAgICAgICBwYXlsb2FkLmRhdGEucmVxdWVzdFxyXG4gICAgICApXHJcbiAgICApO1xyXG5cclxuICAgIC8qaWYgKHJlc3VsdC5oZWFkZXIuZm9ybUlkKSB7XHJcbiAgICAgIHJlc3VsdC5jb21tZW50c0Ryb3AgPSAoIXJlc3VsdC5jb21tZW50c0Ryb3AgPyBbXSA6IHJlc3VsdC5jb21tZW50c0Ryb3ApO1xyXG4gICAgICB0aGlzLmRpc3BhdGNoKGNvbnN0YW50cy5TVEFURV9NQUNISU5FX0FDVElPTl9MT0FEX0hJU1RPUlksIHJlc3VsdC5oZWFkZXIuZm9ybUlkKS50aGVuKChyZXNwb25zZU9iamVjdDogYW55KSA9PiB7XHJcbiAgICAgICAgaWYgKHJlc3BvbnNlT2JqZWN0KSB7XHJcbiAgICAgICAgICByZXNwb25zZU9iamVjdC5pdGVtcy5mb3JFYWNoKChpdGVtOiBhbnkpID0+IHtcclxuICAgICAgICAgICAgaWYgKGl0ZW0uc2VxdWVuY2VOdW1iZXIgIT09ICcwJyAmJiBpdGVtLnByb2Nlc3NlZEJ5KSB7XHJcbiAgICAgICAgICAgICAgY29uc3QgbmFtZSA9IGl0ZW0ucHJvY2Vzc2VkQnkuZmlyc3ROYW1lICsgJyAnICsgaXRlbS5wcm9jZXNzZWRCeS5zZWNvbmRNaWRkbGVOYW1lICsgJyAnICsgaXRlbS5wcm9jZXNzZWRCeS5mYW1pbHlOYW1lO1xyXG4gICAgICAgICAgICAgIHJlc3VsdC5jb21tZW50c0Ryb3AucHVzaChuZXcgQ29tbWVudHNEcm9wKFxyXG4gICAgICAgICAgICAgICAgY29uc3RhbnRzLklHQVRFX1NUQVRJQ19BU1NFVF9QUk9GSUxFX1BIT1RPX1VSTCArIGl0ZW0ucHJvY2Vzc2VkQnkuZW1haWwsXHJcbiAgICAgICAgICAgICAgICBuYW1lLFxyXG4gICAgICAgICAgICAgICAgaXRlbS5jb21tZW50cyxcclxuICAgICAgICAgICAgICAgIGl0ZW0ubW9kaWZpZWREYXRlLFxyXG4gICAgICAgICAgICAgICAgaXRlbS5hdHRhY2htZW50cyxcclxuICAgICAgICAgICAgICAgIGl0ZW0ucHJvY2Vzc2VkQnkuam9iXHJcbiAgICAgICAgICAgICAgKSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuICAgICAgfSk7XHJcbiAgICB9Ki9cclxuICAgIC8qaWYgKHJlc3VsdC5oZWFkZXIuZm9ybUlkICYmIC9eRFlMLy50ZXN0KHJlc3VsdC5oZWFkZXIuZm9ybUlkKSkge1xyXG4gICAgICB0aGlzLnN0YXRlID0gY29uc3RhbnRzLlNUQVRFX01BQ0hJTkVfU1RBVFVTX0lETEU7XHJcbiAgICAgIHJlc3VsdC5jb25maWRlbnRpYWxDb21tZW50cyA9IFtdO1xyXG4gICAgICB0aGlzLmRpc3BhdGNoKCdsb2FkQ29uZmlkZW50aWFsQ29tbWVudHMnLCByZXN1bHQuaGVhZGVyLmZvcm1JZCkudGhlbigocmVzcG9uc2VPYmplY3Q6IGFueSkgPT4ge1xyXG4gICAgICAgIGlmIChyZXNwb25zZU9iamVjdCAmJiByZXNwb25zZU9iamVjdC5pdGVtcyAmJiByZXNwb25zZU9iamVjdC5pdGVtcy5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICByZXNwb25zZU9iamVjdC5pdGVtcy5mb3JFYWNoKChpdGVtOiBhbnkpID0+IHtcclxuICAgICAgICAgICAgcmVzdWx0LmNvbmZpZGVudGlhbENvbW1lbnRzLnB1c2gobmV3IENvbW1lbnRzRHJvcChcclxuICAgICAgICAgICAgICBjb25zdGFudHMuSUdBVEVfU1RBVElDX0FTU0VUX1BST0ZJTEVfUEhPVE9fVVJMICsgaXRlbS5lbWFpbCxcclxuICAgICAgICAgICAgICBpdGVtLm5hbWUsXHJcbiAgICAgICAgICAgICAgaXRlbS5jb21tZW50LFxyXG4gICAgICAgICAgICAgIGl0ZW0ubW9kaWZpZWREYXRlLFxyXG4gICAgICAgICAgICAgIGl0ZW0uYXR0YWNobWVudCxcclxuICAgICAgICAgICAgICBpdGVtLnBvc2l0aW9uXHJcbiAgICAgICAgICAgICkpO1xyXG4gICAgICAgICAgfSlcclxuICAgICAgICB9XHJcbiAgICAgIH0pO1xyXG4gICAgfSovXHJcblxyXG4gICAgLypjb25zdCBpbmJveFR5cGUgPSB0aGlzLmdldEluYm94VHlwZShyZXN1bHQpO1xyXG4gICAgaWYgKHJlc3VsdC5oZWFkZXIuZm9ybUlkICYmICghdGhpcy5pc09wZW5PbkluYm94KCkpKSB7XHJcbiAgICAgIHRoaXMuc3RhdGUgPSBjb25zdGFudHMuU1RBVEVfTUFDSElORV9TVEFUVVNfSURMRTtcclxuICAgICAgdGhpcy5kaXNwYXRjaChjb25zdGFudHMuU1RBVEVfTUFDSElORV9BQ1RJT05fR0VUX0lOQk9YX0lURU0sIHJlc3VsdC5oZWFkZXIuZm9ybUlkLCBpbmJveFR5cGUpLnRoZW4oKHJlc3BvbnNlT2JqZWN0KSA9PiB7XHJcbiAgICAgICAgaWYgKHJlc3BvbnNlT2JqZWN0KSB7XHJcbiAgICAgICAgICBjb25zdCBpdGVtID0gcmVzcG9uc2VPYmplY3QuaXRlbTtcclxuICAgICAgICAgIHJlc3VsdC5pbmJveEl0ZW0gPSBuZXcgSW5ib3hJdGVtKFxyXG4gICAgICAgICAgICBpdGVtLmZsYWdnaW5nLmZsYWdQcmlvcml0eSxcclxuICAgICAgICAgICAgaXRlbS5mbGFnZ2luZy5pc0ZsYWdnZWQsXHJcbiAgICAgICAgICAgIGl0ZW0uZmVlZGJhY2suY2FuUmVxdWVzdEZlZWRiYWNrLFxyXG4gICAgICAgICAgICBpdGVtLmZlZWRiYWNrLmhhc0ZlZWRiYWNrLFxyXG4gICAgICAgICAgICBpdGVtLmZlZWRiYWNrLmlzUGVuZGluZyxcclxuICAgICAgICAgICAgaXRlbS5mZWVkYmFjay5pc1JlcXVlc3RlZCxcclxuICAgICAgICAgICAgaXRlbS5mZWVkYmFjay5pc1Jlc3BvbmRlZFxyXG4gICAgICAgICAgKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0pO1xyXG4gICAgfSovXHJcblxyXG4gICAgbGV0IHBheWxvYWRXb3JrZmxvd1N0ZXBzID0gcGF5bG9hZC5kYXRhLndvcmtmbG93U3RlcHM7XHJcbiAgICBpZiAocGF5bG9hZFdvcmtmbG93U3RlcHMgJiYgcGF5bG9hZFdvcmtmbG93U3RlcHMuY29uc3RydWN0b3IgPT09IEFycmF5ICYmIHBheWxvYWRXb3JrZmxvd1N0ZXBzLmxlbmd0aCA+IDApIHtcclxuICAgICAgcGF5bG9hZFdvcmtmbG93U3RlcHMuZm9yRWFjaCgoc3RlcCwgaW5kZXgpID0+IHtcclxuICAgICAgICBsZXQgY3VycmVudElzUmVxdWVzdGVyU2VuZEJhY2sgPSBKU09OLnN0cmluZ2lmeShzdGVwLmRldGFpbHMpID09PSBKU09OLnN0cmluZ2lmeSh7fSk7XHJcbiAgICAgICAgbGV0IGhhc0NvbW1lbnRzID0gKCFjdXJyZW50SXNSZXF1ZXN0ZXJTZW5kQmFjayAmJiAoc3RlcC5kZXRhaWxzLmNvbW1lbnQgfHwgc3RlcC5jb21tZW50KSA/IGNvbnN0YW50cy5IQVNfQ09NTUVOVFMgOiBjb25zdGFudHMuTk9fQ09NTUVOVFMpO1xyXG4gICAgICAgIGxldCBjdXJyZW50QWN0b3IgPSAoc3RlcC5hY3Rvci5lbWFpbCA9PT0gc3RlcC5hY3Rvci5yZWNpcGllbnQuZW1haWwgPyBzdGVwLmFjdG9yLnJlY2lwaWVudCA6IChzdGVwLmFjdG9yLmRlbGVnYXRlID8gc3RlcC5hY3Rvci5kZWxlZ2F0ZSA6IG51bGwpKVxyXG4gICAgICAgIC8qaWYgKGhhc0NvbW1lbnRzKSB7XHJcbiAgICAgICAgICByZXN1bHQuY29tbWVudHNEcm9wID0gKCFyZXN1bHQuY29tbWVudHNEcm9wID8gW10gOiByZXN1bHQuY29tbWVudHNEcm9wKTtcclxuICAgICAgICAgIGlmIChzdGVwLmRldGFpbHMuYXR0YWNobWVudCAmJiBzdGVwLmRldGFpbHMuYXR0YWNobWVudC5hdHRhY2htZW50SWQgJiYgdGhpcy5jb25maWcucHJvZHVjdGlvbikge1xyXG4gICAgICAgICAgICB0aGlzLnN0YXRlID0gY29uc3RhbnRzLlNUQVRFX01BQ0hJTkVfU1RBVFVTX0lETEU7XHJcbiAgICAgICAgICAgIHRoaXMuZGlzcGF0Y2goY29uc3RhbnRzLlNUQVRFX01BQ0hJTkVfQUNUSU9OX0xPQURfRklMRSwgc3RlcC5kZXRhaWxzLmF0dGFjaG1lbnQuYXR0YWNobWVudElkKS50aGVuKChyZXNwb25zZU9iamVjdCkgPT4ge1xyXG4gICAgICAgICAgICAgIGxldCBmaWxlSW5mb3JtYXRpb24gPSByZXNwb25zZU9iamVjdC5ib2R5O1xyXG4gICAgICAgICAgICAgIGlmIChjdXJyZW50QWN0b3IpIHtcclxuICAgICAgICAgICAgICAgIC8hKnRoaXMuZGlzcGF0Y2goY29uc3RhbnRzLlNUQVRFX01BQ0hJTkVfQUNUSU9OX0VNUExPWUVFX1BST0ZJTEUsIGN1cnJlbnRBY3Rvci5lbWFpbCkudGhlbigocHJvZmlsZSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICByZXN1bHQuY29tbWVudHNEcm9wLnB1c2gobmV3IENvbW1lbnRzRHJvcChcclxuICAgICAgICAgICAgICAgICAgICBjb25zdGFudHMuSUdBVEVfU1RBVElDX0FTU0VUX1BST0ZJTEVfUEhPVE9fVVJMICsgY3VycmVudEFjdG9yLmVtYWlsLFxyXG4gICAgICAgICAgICAgICAgICAgIGN1cnJlbnRBY3Rvci5uYW1lLFxyXG4gICAgICAgICAgICAgICAgICAgIChzdGVwLmRldGFpbHMuY29tbWVudCA/IHN0ZXAuZGV0YWlscy5jb21tZW50IDogKHN0ZXAuY29tbWVudCA/IHN0ZXAuY29tbWVudCA6IG51bGwpKSxcclxuICAgICAgICAgICAgICAgICAgICBzdGVwLmRhdGUsXHJcbiAgICAgICAgICAgICAgICAgICAgZmlsZUluZm9ybWF0aW9uLmZpbGVOYW1lICsgXCJ8ZGF0YTpcIiArIGZpbGVJbmZvcm1hdGlvbi5taW1lVHlwZSArIFwiO2Jhc2U2NCxcIiArIGZpbGVJbmZvcm1hdGlvbi5maWxlQ29udGVudHMsXHJcbiAgICAgICAgICAgICAgICAgICAgcHJvZmlsZS5qb2IubmFtZVxyXG4gICAgICAgICAgICAgICAgICApKVxyXG4gICAgICAgICAgICAgICAgfSkqIS9cclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB0aGlzLnN0YXRlID0gY29uc3RhbnRzLlNUQVRFX01BQ0hJTkVfU1RBVFVTX0ZFVENISU5HO1xyXG4gICAgICAgICAgfSBlbHNlIGlmIChzdGVwLmRldGFpbHMuYXR0YWNobWVudElkKSB7XHJcbiAgICAgICAgICAgIHRoaXMuc3RhdGUgPSBjb25zdGFudHMuU1RBVEVfTUFDSElORV9TVEFUVVNfSURMRTtcclxuICAgICAgICAgICAgdGhpcy5kaXNwYXRjaChjb25zdGFudHMuU1RBVEVfTUFDSElORV9BQ1RJT05fTE9BRF9GSUxFLCBzdGVwLmRldGFpbHMuYXR0Y2htZW50SWQpLnRoZW4oKHJlc3BvbnNlT2JqZWN0KSA9PiB7XHJcbiAgICAgICAgICAgICAgbGV0IGZpbGVJbmZvcm1hdGlvbiA9IHJlc3BvbnNlT2JqZWN0LmJvZHk7XHJcbiAgICAgICAgICAgICAgaWYgKGN1cnJlbnRBY3Rvcikge1xyXG4gICAgICAgICAgICAgICAgLyEqdGhpcy5kaXNwYXRjaChjb25zdGFudHMuU1RBVEVfTUFDSElORV9BQ1RJT05fRU1QTE9ZRUVfUFJPRklMRSwgY3VycmVudEFjdG9yLmVtYWlsKS50aGVuKChwcm9maWxlKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgIHJlc3VsdC5jb21tZW50c0Ryb3AucHVzaChuZXcgQ29tbWVudHNEcm9wKFxyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0YW50cy5JR0FURV9TVEFUSUNfQVNTRVRfUFJPRklMRV9QSE9UT19VUkwgKyBjdXJyZW50QWN0b3IuZW1haWwsXHJcbiAgICAgICAgICAgICAgICAgICAgY3VycmVudEFjdG9yLm5hbWUsXHJcbiAgICAgICAgICAgICAgICAgICAgKHN0ZXAuZGV0YWlscy5jb21tZW50ID8gc3RlcC5kZXRhaWxzLmNvbW1lbnQgOiAoc3RlcC5jb21tZW50ID8gc3RlcC5jb21tZW50IDogbnVsbCkpLFxyXG4gICAgICAgICAgICAgICAgICAgIHN0ZXAuZGF0ZSxcclxuICAgICAgICAgICAgICAgICAgICBmaWxlSW5mb3JtYXRpb24uZmlsZU5hbWUgKyBcInxkYXRhOlwiICsgZmlsZUluZm9ybWF0aW9uLm1pbWVUeXBlICsgXCI7YmFzZTY0LFwiICsgZmlsZUluZm9ybWF0aW9uLmZpbGVDb250ZW50cyxcclxuICAgICAgICAgICAgICAgICAgICBwcm9maWxlLmpvYi5uYW1lXHJcbiAgICAgICAgICAgICAgICAgICkpXHJcbiAgICAgICAgICAgICAgICB9KSohL1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIHRoaXMuc3RhdGUgPSBjb25zdGFudHMuU1RBVEVfTUFDSElORV9TVEFUVVNfRkVUQ0hJTkc7XHJcbiAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBpZiAoY3VycmVudEFjdG9yKSB7XHJcbiAgICAgICAgICAgICAgdGhpcy5zdGF0ZSA9IGNvbnN0YW50cy5TVEFURV9NQUNISU5FX1NUQVRVU19JRExFO1xyXG4gICAgICAgICAgICAgIC8hKnRoaXMuZGlzcGF0Y2goY29uc3RhbnRzLlNUQVRFX01BQ0hJTkVfQUNUSU9OX0VNUExPWUVFX1BST0ZJTEUsIGN1cnJlbnRBY3Rvci5lbWFpbCkudGhlbigocHJvZmlsZSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgcmVzdWx0LmNvbW1lbnRzRHJvcC5wdXNoKG5ldyBDb21tZW50c0Ryb3AoXHJcbiAgICAgICAgICAgICAgICAgIGNvbnN0YW50cy5JR0FURV9TVEFUSUNfQVNTRVRfUFJPRklMRV9QSE9UT19VUkwgKyBjdXJyZW50QWN0b3IuZW1haWwsXHJcbiAgICAgICAgICAgICAgICAgIGN1cnJlbnRBY3Rvci5uYW1lLFxyXG4gICAgICAgICAgICAgICAgICAoc3RlcC5kZXRhaWxzLmNvbW1lbnQgPyBzdGVwLmRldGFpbHMuY29tbWVudCA6IChzdGVwLmNvbW1lbnQgPyBzdGVwLmNvbW1lbnQgOiBudWxsKSksXHJcbiAgICAgICAgICAgICAgICAgIHN0ZXAuZGF0ZSxcclxuICAgICAgICAgICAgICAgICAgbnVsbCxcclxuICAgICAgICAgICAgICAgICAgcHJvZmlsZS5qb2IubmFtZVxyXG4gICAgICAgICAgICAgICAgKSlcclxuICAgICAgICAgICAgICB9KSohL1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHRoaXMuc3RhdGUgPSBjb25zdGFudHMuU1RBVEVfTUFDSElORV9TVEFUVVNfRkVUQ0hJTkc7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSovXHJcblxyXG4gICAgICAgLyogaWYgKHdhc1NlbmRCYWNrICYmIHN0ZXAuYWN0b3IucmVjaXBpZW50LnJvbGUgPT09ICdSRVFVRVNURVInKSB7XHJcbiAgICAgICAgICBjb25zb2xlLmxvZyhcIndhc1NlbmRCYWNrICYmIFJFUVVFU1RFUlwiKVxyXG4gICAgICAgICAgcmVzdWx0LnNlY3Rpb25zID0gW25ldyBTZWN0aW9uKFxyXG4gICAgICAgICAgICBjb25zdGFudHMuU0VDVElPTl9JRF9SRVFVRVNUX0RFVEFJTFMsXHJcbiAgICAgICAgICAgIG5ldyBTZWN0aW9uSGVhZGVyKFxyXG4gICAgICAgICAgICAgIGNvbnN0YW50cy5ET05UX1NIT1csXHJcbiAgICAgICAgICAgICAgY29uc3RhbnRzLkRPTlRfU0hPVyxcclxuICAgICAgICAgICAgICBjb25zdGFudHMuRE9OVF9TSE9XLFxyXG4gICAgICAgICAgICAgIGNvbnN0YW50cy5ET05UX1NIT1csXHJcbiAgICAgICAgICAgICAgY29uc3RhbnRzLkRPTlRfU0hPVyxcclxuICAgICAgICAgICAgICBjb25zdGFudHMuRE9OVF9TSE9XLFxyXG4gICAgICAgICAgICAgIGNvbnN0YW50cy5ET05UX1NIT1csXHJcbiAgICAgICAgICAgICAgcmVxdWVzdERldGFpbHNIYXNDb21tZW50LFxyXG4gICAgICAgICAgICAgIChwYXlsb2FkLmRhdGEud29ya2Zsb3dTdGVwcyA/IGNvbnN0YW50cy5SRUFEX09OTFkgOiBpc1JlYWRPbmx5KVxyXG4gICAgICAgICAgICApLFxyXG4gICAgICAgICAgICBwYXlsb2FkLmRhdGEucmVxdWVzdFxyXG4gICAgICAgICAgKV1cclxuICAgICAgICB9IGVsc2UgaWYgKHdhc1NlbmRCYWNrKSB7XHJcbiAgICAgICAgICBjb25zb2xlLmxvZyhcIlBvcFwiKVxyXG4gICAgICAgICAgaWYgKHJlc3VsdC5zZWN0aW9ucy5sZW5ndGggPiAxKSB7XHJcbiAgICAgICAgICAgIHJlc3VsdC5zZWN0aW9ucy5wb3AoKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIHdhc1NlbmRCYWNrID0gZmFsc2U7XHJcbiAgICAgICAgfVxyXG4gICAgICAgICovXHJcblxyXG5cclxuICAgICAgICBpZiAoc3RlcC5kZXRhaWxzLmRlY2lzaW9uICYmIHN0ZXAuZGV0YWlscy5kZWNpc2lvbi5rZXkgPT09IGNvbnN0YW50cy5GT1JNX1NUQVRVU19TRU5EX0JBQ0spIHtcclxuICAgICAgICAgIC8vIHdhc1NlbmRCYWNrID0gdHJ1ZTtcclxuICAgICAgICB9IGVsc2UgaWYgKEpTT04uc3RyaW5naWZ5KHN0ZXAuZGV0YWlscykgIT09IEpTT04uc3RyaW5naWZ5KHt9KSkge1xyXG4gICAgICAgICAgcmVzdWx0LnNlY3Rpb25zLnB1c2goXHJcbiAgICAgICAgICAgIG5ldyBTZWN0aW9uKFxyXG4gICAgICAgICAgICAgIHN0ZXAuYWN0b3IucmVjaXBpZW50LnJvbGUudG9Mb3dlckNhc2UoKSArIGNvbnN0YW50cy5TRUNUSU9OX0lEX0FQUFJPVkFMX1BBUlRJQUxfTkFNRSxcclxuICAgICAgICAgICAgICBuZXcgU2VjdGlvbkhlYWRlcihcclxuICAgICAgICAgICAgICAgIChjdXJyZW50QWN0b3IgPyB0aGlzLmdldFNob3J0TmFtZShjdXJyZW50QWN0b3IubmFtZSkgOiBcIlwiKS50b1N0cmluZygpLFxyXG4gICAgICAgICAgICAgICAgc3RlcC5kYXRlLFxyXG4gICAgICAgICAgICAgICAgdGhpcy5nZXRTaG9ydE5hbWUoc3RlcC5hY3Rvci5yZWNpcGllbnQubmFtZSkudG9TdHJpbmcoKSxcclxuICAgICAgICAgICAgICAgIGNvbnN0YW50cy5JR0FURV9TVEFUSUNfQVNTRVRfUFJPRklMRV9QSE9UT19VUkwgKyBzdGVwLmFjdG9yLnJlY2lwaWVudC5lbWFpbCxcclxuICAgICAgICAgICAgICAgIChzdGVwLmFjdG9yLmRlbGVnYXRlPy5uYW1lID8gdGhpcy5nZXRTaG9ydE5hbWUoc3RlcC5hY3Rvci5kZWxlZ2F0ZS5uYW1lKSA6IFwiXCIpLnRvU3RyaW5nKCksXHJcbiAgICAgICAgICAgICAgICAoc3RlcC5hY3Rvci5kZWxlZ2F0ZT8uZW1haWwgPyBjb25zdGFudHMuSUdBVEVfU1RBVElDX0FTU0VUX1BST0ZJTEVfUEhPVE9fVVJMICsgc3RlcC5hY3Rvci5kZWxlZ2F0ZS5lbWFpbCA6IFwiXCIpLFxyXG4gICAgICAgICAgICAgICAgc3RlcC5hY3Rvci5zdGF0dXMsXHJcbiAgICAgICAgICAgICAgICBoYXNDb21tZW50cyxcclxuICAgICAgICAgICAgICAgIChpbmRleCA8IHBheWxvYWRXb3JrZmxvd1N0ZXBzLmxlbmd0aCAtIDEgPyBjb25zdGFudHMuUkVBRF9PTkxZIDogaXNSZWFkT25seSlcclxuICAgICAgICAgICAgICApLFxyXG4gICAgICAgICAgICAgIHtkZXRhaWxzOiBzdGVwLmRldGFpbHMsIHByb2Nlc3NpbmdEYXRlOiBzdGVwLmRhdGV9XHJcbiAgICAgICAgICAgIClcclxuICAgICAgICAgICk7XHJcbiAgICAgICAgICAvLyB0aGlzLmN1cnJlbnRTdWJtaXR0ZXIgPSB7YWN0b3I6IHN0ZXAuYWN0b3IsIHJlY2lwaWVudDogc3RlcC5yZWNpcGllbnQsIGRlbGVnYXRlOiBzdGVwLmFjdG9yLmRlbGVnYXRlfTtcclxuICAgICAgICB9XHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG4gICAgLyogQ3JlYXRlIExvdiBTZWN0aW9ucyAqL1xyXG4gICAgcmVzdWx0LmxvdnMgPSAocGF5bG9hZC5tZXRhICYmIHBheWxvYWQubWV0YS5sb3ZzID8gcGF5bG9hZC5tZXRhLmxvdnMgOiBudWxsKTtcclxuXHJcbiAgICBpZiAocGF5bG9hZC5tZXRhICYmIHBheWxvYWQubWV0YS5tZXNzYWdlcykge1xyXG4gICAgICByZXN1bHQubWVzc2FnZXMgPSBuZXcgTWVzc2FnZXMoXHJcbiAgICAgICAge30sXHJcbiAgICAgICAgW10sXHJcbiAgICAgICAgW10sXHJcbiAgICAgICAgW11cclxuICAgICAgKTtcclxuICAgICAgcGF5bG9hZC5tZXRhLm1lc3NhZ2VzLmZvckVhY2goKG1lc3NhZ2UpID0+IHtcclxuICAgICAgICByZXN1bHQubWVzc2FnZXMub3JpZ2luYWxNc2dzLnB1c2gobWVzc2FnZSk7XHJcbiAgICAgICAgcmVzdWx0Lm1lc3NhZ2VzW21lc3NhZ2UudHlwZV0ucHVzaChtZXNzYWdlLm1lc3NhZ2UpO1xyXG4gICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICAvLyByZXN1bHQubWVzc2FnZXMgPSAocGF5bG9hZC5tZXRhICYmIHBheWxvYWQubWV0YS5tZXNzYWdlcyA/IHBheWxvYWQubWV0YS5tZXNzYWdlcyA6IG51bGwpO1xyXG4gICAgLyogRml4IGxhc3Qgc2VjdGlvbiB0byBiZSB0aGUgUk8vV00gZnJvbSB0aGUgdmFyaWFibGUgKi9cclxuICAgIHJlc3VsdC5zZWN0aW9uc1tyZXN1bHQuc2VjdGlvbnMubGVuZ3RoIC0gMV0uaGVhZGVyLnJlYWRPbmx5ID0gaXNSZWFkT25seTtcclxuICAgIHJldHVybiByZXN1bHQ7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgbG9nZ2VkSW5Vc2VySWQoKSB7XHJcbiAgICByZXR1cm4gdGhpcy51c2VyRGF0YVsnbG9nZ2VkSW5Vc2VyRW1haWwnXTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBnZXRTaG9ydE5hbWUobmFtZTogc3RyaW5nKSB7XHJcbiAgICBpZiAobmFtZSkge1xyXG4gICAgICBsZXQgbmFtZVRva2VucyA9IG5hbWUuc3BsaXQoJyAnKTtcclxuICAgICAgaWYgKG5hbWVUb2tlbnMubGVuZ3RoID09IDEpIHtcclxuICAgICAgICByZXR1cm4gW25hbWVUb2tlbnNbMF1dXHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgaWYgKG5hbWVUb2tlbnNbbmFtZVRva2Vucy5sZW5ndGggLSAyXS50b0xvd2VyQ2FzZSgpID09ICdhbCcpIHtcclxuICAgICAgICAgIHJldHVybiBbbmFtZVRva2Vuc1swXSwgbmFtZVRva2Vuc1tuYW1lVG9rZW5zLmxlbmd0aCAtIDJdLCBuYW1lVG9rZW5zW25hbWVUb2tlbnMubGVuZ3RoIC0gMV1dLmpvaW4oJyAnKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgcmV0dXJuIFtuYW1lVG9rZW5zWzBdLCBuYW1lVG9rZW5zW25hbWVUb2tlbnMubGVuZ3RoIC0gMV1dLmpvaW4oJyAnKTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHJldHVybiBudWxsO1xyXG4gICAgfVxyXG4gIH1cclxufVxyXG4iXX0=