@hmcts/ccd-case-ui-toolkit 7.0.21-upload-timestamp → 7.0.22-rc1

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 (28) hide show
  1. package/esm2020/lib/shared/components/case-editor/case-edit-page/case-edit-page.component.mjs +35 -7
  2. package/esm2020/lib/shared/components/case-editor/services/page-validation.service.mjs +10 -5
  3. package/esm2020/lib/shared/components/case-history/case-history.component.mjs +13 -13
  4. package/esm2020/lib/shared/components/case-viewer/case-full-access-view/case-full-access-view.component.mjs +3 -3
  5. package/esm2020/lib/shared/components/palette/case-file-view/components/case-file-view-folder/case-file-view-folder.component.mjs +3 -3
  6. package/esm2020/lib/shared/components/palette/complex/read-complex-field.component.mjs +14 -12
  7. package/esm2020/lib/shared/components/palette/document/write-document-field.component.mjs +25 -29
  8. package/esm2020/lib/shared/components/palette/dynamic-list/dynamic-list.pipe.mjs +2 -2
  9. package/esm2020/lib/shared/domain/document/document-data.model.mjs +1 -1
  10. package/esm2020/lib/shared/domain/http/http-error.model.mjs +7 -1
  11. package/esm2020/lib/shared/services/fields/fields.purger.mjs +4 -3
  12. package/fesm2015/hmcts-ccd-case-ui-toolkit.mjs +108 -64
  13. package/fesm2015/hmcts-ccd-case-ui-toolkit.mjs.map +1 -1
  14. package/fesm2020/hmcts-ccd-case-ui-toolkit.mjs +106 -68
  15. package/fesm2020/hmcts-ccd-case-ui-toolkit.mjs.map +1 -1
  16. package/lib/shared/components/case-editor/case-edit-page/case-edit-page.component.d.ts +2 -1
  17. package/lib/shared/components/case-editor/case-edit-page/case-edit-page.component.d.ts.map +1 -1
  18. package/lib/shared/components/case-editor/services/page-validation.service.d.ts +1 -1
  19. package/lib/shared/components/case-editor/services/page-validation.service.d.ts.map +1 -1
  20. package/lib/shared/components/palette/complex/read-complex-field.component.d.ts.map +1 -1
  21. package/lib/shared/components/palette/document/write-document-field.component.d.ts +1 -1
  22. package/lib/shared/components/palette/document/write-document-field.component.d.ts.map +1 -1
  23. package/lib/shared/domain/document/document-data.model.d.ts +0 -1
  24. package/lib/shared/domain/document/document-data.model.d.ts.map +1 -1
  25. package/lib/shared/domain/http/http-error.model.d.ts +1 -0
  26. package/lib/shared/domain/http/http-error.model.d.ts.map +1 -1
  27. package/lib/shared/services/fields/fields.purger.d.ts.map +1 -1
  28. package/package.json +1 -1
@@ -290,7 +290,8 @@ export class CaseEditPageComponent {
290
290
  return this.caseEdit.first();
291
291
  }
292
292
  currentPageIsNotValid() {
293
- return !this.pageValidationService.isPageValid(this.currentPage, this.editForm) ||
293
+ this.failingCaseFields = this.pageValidationService.getInvalidFields(this.currentPage, this.editForm);
294
+ return this.failingCaseFields.length > 0 ||
294
295
  (this.isLinkedCasesJourney() && !this.isLinkedCasesJourneyAtFinalStep);
295
296
  }
296
297
  isLinkedCasesJourney() {
@@ -312,9 +313,15 @@ export class CaseEditPageComponent {
312
313
  // Adding validation message to show it as Error Summary
313
314
  generateErrorMessage(fields, container, path) {
314
315
  const group = container || this.editForm.controls['data'];
315
- fields.filter(casefield => !this.caseFieldService.isReadOnly(casefield))
316
- .filter(casefield => !this.pageValidationService.isHidden(casefield, this.editForm, path))
316
+ let validErrorFieldFound = false;
317
+ let validationErrorAmount = this.validationErrors.length;
318
+ const failingFields = fields.filter(casefield => !this.caseFieldService.isReadOnly(casefield))
319
+ .filter(casefield => !this.pageValidationService.isHidden(casefield, this.editForm, path));
320
+ // note that thougn these checks are on getinvalidfields they are needed for sub field checks
321
+ failingFields
317
322
  .forEach(casefield => {
323
+ let errorPresent = true;
324
+ validErrorFieldFound = true;
318
325
  const fieldElement = FieldsUtils.isCaseFieldOfType(casefield, ['JudicialUser'])
319
326
  ? group.get(`${casefield.id}_judicialUserControl`)
320
327
  : group.get(casefield.id);
@@ -359,7 +366,7 @@ export class CaseEditPageComponent {
359
366
  }
360
367
  else if (fieldElement.invalid) {
361
368
  if (casefield.isComplex()) {
362
- this.generateErrorMessage(casefield.field_type.complex_fields, fieldElement, id);
369
+ errorPresent = this.generateErrorMessage(casefield.field_type.complex_fields, fieldElement, id);
363
370
  }
364
371
  else if (casefield.isCollection() && casefield.field_type.collection_field_type.type === 'Complex') {
365
372
  const fieldArray = fieldElement;
@@ -367,7 +374,7 @@ export class CaseEditPageComponent {
367
374
  id = `${fieldArray['component']['collItems'][0].prefix}`;
368
375
  }
369
376
  fieldArray.controls.forEach((c) => {
370
- this.generateErrorMessage(casefield.field_type.collection_field_type.complex_fields, c.get('value'), id);
377
+ errorPresent = this.generateErrorMessage(casefield.field_type.collection_field_type.complex_fields, c.get('value'), id);
371
378
  });
372
379
  }
373
380
  else if (FieldsUtils.isCaseFieldOfType(casefield, ['FlagLauncher'])) {
@@ -382,8 +389,29 @@ export class CaseEditPageComponent {
382
389
  }
383
390
  }
384
391
  }
392
+ else {
393
+ validErrorFieldFound = false;
394
+ }
395
+ if (!errorPresent && this.validationErrors.length === validationErrorAmount) {
396
+ // if no error messages have been added in internal field despite parent field failing
397
+ this.validationErrors.push({ id: casefield.id, message: `A field that is causing an error is ${casefield.id} but it is not producing a valid error message. Please ensure all details are correct` });
398
+ }
385
399
  });
400
+ if (!validErrorFieldFound) {
401
+ path ? this.validationErrors.push({ id: path, message: `There is an internal issue with ${path} fields. The field that is causing the error cannot be determined but there is an error present` })
402
+ : this.validationErrors.push({ id: null, message: `The field that is causing the error cannot be determined but there is an error present` });
403
+ }
404
+ else if (this.validationErrors.length === validationErrorAmount) {
405
+ // if no error messages have been generated
406
+ if (path) {
407
+ return false;
408
+ }
409
+ else {
410
+ this.validationErrors.push({ id: null, message: `The field that is causing the error cannot be determined but there is an error present. Please fill in more of the form` });
411
+ }
412
+ }
386
413
  CaseEditPageComponent.scrollToTop();
414
+ return true;
387
415
  }
388
416
  navigateToErrorElement(elementId) {
389
417
  /* istanbul ignore else */
@@ -408,7 +436,7 @@ export class CaseEditPageComponent {
408
436
  CaseEditPageComponent.scrollToTop();
409
437
  }
410
438
  else {
411
- this.generateErrorMessage(this.currentPage.case_fields);
439
+ this.generateErrorMessage(this.failingCaseFields);
412
440
  }
413
441
  }
414
442
  if (!this.caseEdit.isSubmitting && !this.currentPageIsNotValid()) {
@@ -748,4 +776,4 @@ CaseEditPageComponent.ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: CaseE
748
776
  type: Component,
749
777
  args: [{ selector: 'ccd-case-edit-page', template: "<ng-container *ngIf=\"currentPage\">\n <h1 *ngIf=\"!currentPage.label\" class=\"govuk-heading-l\">{{eventTrigger.name | rpxTranslate}}</h1>\n <ng-container *ngIf=\"currentPage.label\">\n <span class=\"govuk-caption-l\">{{ eventTrigger.name | rpxTranslate}}</span>\n <h1 class=\"govuk-heading-l\">{{currentPage.label | rpxTranslate}}</h1>\n </ng-container>\n</ng-container>\n\n<!--Case ID or Title -->\n<div *ngIf=\"getCaseTitle(); then titleBlock; else idBlock\"></div>\n<ng-template #titleBlock>\n <ccd-markdown [content]=\"getCaseTitle() | ccdCaseTitle: caseFields : editForm.controls['data']\"></ccd-markdown>\n</ng-template>\n<ng-template #idBlock>\n <h2 *ngIf=\"getCaseId()\" class=\"heading-h2\">#{{ getCaseId() | ccdCaseReference }}</h2>\n</ng-template>\n\n<!-- Error message summary -->\n<div *ngIf=\"validationErrors.length > 0\" class=\"govuk-error-summary\" aria-labelledby=\"error-summary-title\" role=\"alert\" tabindex=\"-1\" data-module=\"govuk-error-summary\">\n <h2 class=\"govuk-error-summary__title\" id=\"error-summary-title\">\n {{'There is a problem' | rpxTranslate}}\n </h2>\n <div *ngFor=\"let validationError of validationErrors\" class=\"govuk-error-summary__body\">\n <ul class=\"govuk-list govuk-error-summary__list\">\n <li>\n <a (click)=\"navigateToErrorElement(validationError.id)\" class=\"validation-error\">\n {{ validationError.message | rpxTranslate: getRpxTranslatePipeArgs(validationError.label | rpxTranslate): null }}\n </a>\n </li>\n </ul>\n </div>\n</div>\n\n<ccd-case-edit-generic-errors [error]=\"caseEdit.error\"></ccd-case-edit-generic-errors>\n\n<ccd-callback-errors\n [triggerTextContinue]=\"triggerTextStart\"\n [triggerTextIgnore]=\"triggerTextIgnoreWarnings\"\n [callbackErrorsSubject]=\"caseEdit.callbackErrorsSubject\"\n (callbackErrorsContext)=\"callbackErrorsNotify($event)\">\n</ccd-callback-errors>\n<div class=\"width-50\">\n <form *ngIf=\"currentPage\" class=\"form\" [formGroup]=\"editForm\" (submit)=\"submit()\">\n <fieldset id=\"fieldset-case-data\">\n <legend style=\"display: none;\"></legend>\n <!-- single column -->\n <ccd-case-edit-form id='caseEditForm' *ngIf=\"!currentPage.isMultiColumn()\" [fields]=\"currentPage.getCol1Fields()\"\n [formGroup]=\"editForm.controls['data']\" [caseFields]=\"caseFields\"\n [pageChangeSubject]=\"pageChangeSubject\"\n (valuesChanged)=\"applyValuesChanged($event)\"></ccd-case-edit-form>\n <!-- two columns -->\n <div *ngIf=\"currentPage.isMultiColumn()\" class=\"grid-row\">\n <div class=\"column-two-thirds rightBorderSeparator\">\n <ccd-case-edit-form id='caseEditForm1' [fields]=\"currentPage.getCol1Fields()\"\n [formGroup]=\"editForm.controls['data']\" [caseFields]=\"caseFields\"></ccd-case-edit-form>\n </div>\n <div class=\"column-one-third\">\n <ccd-case-edit-form id='caseEditForm2' [fields]=\"currentPage.getCol2Fields()\"\n [formGroup]=\"editForm.controls['data']\" [caseFields]=\"caseFields\"></ccd-case-edit-form>\n </div>\n </div>\n </fieldset>\n\n <div class=\"form-group form-group-related\">\n <button class=\"button button-secondary\" type=\"button\" [disabled]=\"!(hasPreviousPage$ | async)\" (click)=\"toPreviousPage()\">\n {{'Previous' | rpxTranslate}}\n </button>\n <button class=\"button\" type=\"submit\" [disabled]=\"submitting()\">{{triggerText | rpxTranslate}}</button>\n </div>\n\n <p class=\"cancel\"><a (click)=\"cancel()\" href=\"javascript:void(0)\">{{getCancelText() | rpxTranslate}}</a></p>\n </form>\n</div>\n\n<ccd-case-event-completion *ngIf=\"caseEdit.isEventCompletionChecksRequired\"\n [eventCompletionParams]=\"caseEdit.eventCompletionParams\"\n (eventCanBeCompleted)=\"onEventCanBeCompleted($event)\">\n</ccd-case-event-completion>\n", styles: [".rightBorderSeparator{border-right-width:4px;border-right-color:#ffcc02;border-right-style:solid}.validation-error{cursor:pointer;text-decoration:underline;color:#d4351c}\n"] }]
750
778
  }], function () { return [{ type: i1.CaseEditComponent }, { type: i2.ActivatedRoute }, { type: i3.FormValueService }, { type: i4.FormErrorService }, { type: i0.ChangeDetectorRef }, { type: i5.PageValidationService }, { type: i6.MatLegacyDialog }, { type: i7.CaseFieldService }, { type: i8.CaseEditDataService }, { type: i9.LoadingService }, { type: i10.ValidPageListCaseFieldsService }, { type: i9.AddressesService }]; }, null); })();
751
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2FzZS1lZGl0LXBhZ2UuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvY2NkLWNhc2UtdWktdG9vbGtpdC9zcmMvbGliL3NoYXJlZC9jb21wb25lbnRzL2Nhc2UtZWRpdG9yL2Nhc2UtZWRpdC1wYWdlL2Nhc2UtZWRpdC1wYWdlLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2NjZC1jYXNlLXVpLXRvb2xraXQvc3JjL2xpYi9zaGFyZWQvY29tcG9uZW50cy9jYXNlLWVkaXRvci9jYXNlLWVkaXQtcGFnZS9jYXNlLWVkaXQtcGFnZS5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBb0IsaUJBQWlCLEVBQUUsU0FBUyxFQUFxQixNQUFNLGVBQWUsQ0FBQztBQUVsRyxPQUFPLEVBQUUsZUFBZSxJQUFJLFNBQVMsRUFBMkMsTUFBTSxpQ0FBaUMsQ0FBQztBQUN4SCxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDakQsT0FBTyxFQUFFLGVBQWUsRUFBRSxPQUFPLEVBQWdCLE1BQU0sTUFBTSxDQUFDO0FBQzlELE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUMxQyxPQUFPLEVBQUUsbUJBQW1CLEVBQTJCLE1BQU0saUNBQWlDLENBQUM7QUFJL0YsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLDZCQUE2QixDQUFDO0FBQzNELE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxjQUFjLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUNyRSxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxrREFBa0QsQ0FBQztBQUNwRixPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDdkQsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sMkNBQTJDLENBQUM7QUFDN0UsT0FBTyxF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QUM3RCxRQUFRLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBZSxDQUFDLGFBQWEsQ0FBQyxHQUFHLFNBQVMsQ0FBQyxFQUFFLHNCQUFzQixDQUFDLENBQUM7YUFDL0Y7UUFDSCxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7O0FBeGtCc0IsMENBQW9CLEdBQUcsc0JBQXNCLENBQUM7QUFDOUMsc0NBQWdCLEdBQUcsa0JBQWtCLENBQUM7QUFDdEMsbUNBQWEsR0FBRyx1QkFBdUIsQ0FBQztBQUN4Qyx1Q0FBaUIsR0FBRyxtQkFBbUIsQ0FBQztBQUN4Qyx3Q0FBa0IsR0FBRyxVQUFVLENBQUM7QUFDaEMsdUNBQWlCLEdBQUcsbUJBQW1CLENBQUM7QUFDeEMsMkNBQXFCLEdBQUcsNkJBQTZCLENBQUM7MEZBUGxFLHFCQUFxQjt3RUFBckIscUJBQXFCO1FDOUJsQyx3RkFNZTtRQUdmLHNFQUFpRTtRQUNqRSx1SEFFYztRQUNkLHVIQUVjO1FBR2Qsc0VBYU07UUFFTixrREFBc0Y7UUFFdEYsOENBSXlEO1FBQXZELHFKQUF5QixnQ0FBNEIsSUFBQztRQUN4RCxpQkFBc0I7UUFDdEIsOEJBQXNCO1FBQ3BCLDRFQTZCTztRQUNULGlCQUFNO1FBRU4sb0hBRzRCOzs7O1FBN0ViLHNDQUFpQjtRQVMxQixlQUFzQjtRQUF0Qix5Q0FBc0IsaUJBQUEsaUJBQUE7UUFTdEIsZUFBaUM7UUFBakMsc0RBQWlDO1FBZVQsZUFBd0I7UUFBeEIsMENBQXdCO1FBR3BELGVBQXdDO1FBQXhDLDBEQUF3QyxvREFBQSw2REFBQTtRQU1qQyxlQUFpQjtRQUFqQixzQ0FBaUI7UUFnQ0UsZUFBOEM7UUFBOUMsbUVBQThDOzt1RkQ1QzdELHFCQUFxQjtjQUxqQyxTQUFTOzJCQUNFLG9CQUFvQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEFmdGVyVmlld0NoZWNrZWQsIENoYW5nZURldGVjdG9yUmVmLCBDb21wb25lbnQsIE9uRGVzdHJveSwgT25Jbml0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBBYnN0cmFjdENvbnRyb2wsIEZvcm1BcnJheSwgRm9ybUdyb3VwIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgTWF0TGVnYWN5RGlhbG9nIGFzIE1hdERpYWxvZywgTWF0TGVnYWN5RGlhbG9nQ29uZmlnIGFzIE1hdERpYWxvZ0NvbmZpZ30gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvbGVnYWN5LWRpYWxvZyc7XG5pbXBvcnQgeyBBY3RpdmF0ZWRSb3V0ZSB9IGZyb20gJ0Bhbmd1bGFyL3JvdXRlcic7XG5pbXBvcnQgeyBCZWhhdmlvclN1YmplY3QsIFN1YmplY3QsIFN1YnNjcmlwdGlvbiB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgZmluYWxpemUgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQgeyBDYXNlRWRpdERhdGFTZXJ2aWNlLCBDYXNlRWRpdFZhbGlkYXRpb25FcnJvciB9IGZyb20gJy4uLy4uLy4uL2NvbW1vbnMvY2FzZS1lZGl0LWRhdGEnO1xuaW1wb3J0IHsgQ2FzZUV2ZW50RGF0YSB9IGZyb20gJy4uLy4uLy4uL2RvbWFpbi9jYXNlLWV2ZW50LWRhdGEubW9kZWwnO1xuaW1wb3J0IHsgQ2FzZUV2ZW50VHJpZ2dlciB9IGZyb20gJy4uLy4uLy4uL2RvbWFpbi9jYXNlLXZpZXcvY2FzZS1ldmVudC10cmlnZ2VyLm1vZGVsJztcbmltcG9ydCB7IENhc2VGaWVsZCB9IGZyb20gJy4uLy4uLy4uL2RvbWFpbi9kZWZpbml0aW9uJztcbmltcG9ydCB7IERSQUZUX1BSRUZJWCB9IGZyb20gJy4uLy4uLy4uL2RvbWFpbi9kcmFmdC5tb2RlbCc7XG5pbXBvcnQgeyBBZGRyZXNzZXNTZXJ2aWNlLCBMb2FkaW5nU2VydmljZSB9IGZyb20gJy4uLy4uLy4uL3NlcnZpY2VzJztcbmltcG9ydCB7IENhc2VGaWVsZFNlcnZpY2UgfSBmcm9tICcuLi8uLi8uLi9zZXJ2aWNlcy9jYXNlLWZpZWxkcy9jYXNlLWZpZWxkLnNlcnZpY2UnO1xuaW1wb3J0IHsgRmllbGRzVXRpbHMgfSBmcm9tICcuLi8uLi8uLi9zZXJ2aWNlcy9maWVsZHMnO1xuaW1wb3J0IHsgRm9ybUVycm9yU2VydmljZSB9IGZyb20gJy4uLy4uLy4uL3NlcnZpY2VzL2Zvcm0vZm9ybS1lcnJvci5zZXJ2aWNlJztcbmltcG9ydCB7IEZvcm1WYWx1ZVNlcnZpY2UgfSBmcm9tICcuLi8uLi8uLi9zZXJ2aWNlcy9mb3JtL2Zvcm0tdmFsdWUuc2VydmljZSc7XG5pbXBvcnQgeyBTYXZlT3JEaXNjYXJkRGlhbG9nQ29tcG9uZW50IH0gZnJvbSAnLi4vLi4vZGlhbG9ncy9zYXZlLW9yLWRpc2NhcmQtZGlhbG9nJztcbmltcG9ydCB7IENhbGxiYWNrRXJyb3JzQ29udGV4dCB9IGZyb20gJy4uLy4uL2Vycm9yL2RvbWFpbi9lcnJvci1jb250ZXh0JztcbmltcG9ydCB7IGluaXREaWFsb2cgfSBmcm9tICcuLi8uLi9oZWxwZXJzJztcbmltcG9ydCB7IENhc2VFZGl0Q29tcG9uZW50IH0gZnJvbSAnLi4vY2FzZS1lZGl0L2Nhc2UtZWRpdC5jb21wb25lbnQnO1xuaW1wb3J0IHsgV2l6YXJkUGFnZSB9IGZyb20gJy4uL2RvbWFpbi93aXphcmQtcGFnZS5tb2RlbCc7XG5pbXBvcnQgeyBXaXphcmQgfSBmcm9tICcuLi9kb21haW4vd2l6YXJkLm1vZGVsJztcbmltcG9ydCB7IFBhZ2VWYWxpZGF0aW9uU2VydmljZSB9IGZyb20gJy4uL3NlcnZpY2VzL3BhZ2UtdmFsaWRhdGlvbi5zZXJ2aWNlJztcbmltcG9ydCB7IFZhbGlkUGFnZUxpc3RDYXNlRmllbGRzU2VydmljZSB9IGZyb20gJy4uL3NlcnZpY2VzL3ZhbGlkLXBhZ2UtbGlzdC1jYXNlRmllbGRzLnNlcnZpY2UnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdjY2QtY2FzZS1lZGl0LXBhZ2UnLFxuICB0ZW1wbGF0ZVVybDogJ2Nhc2UtZWRpdC1wYWdlLmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9jYXNlLWVkaXQtcGFnZS5zY3NzJ11cbn0pXG5leHBvcnQgY2xhc3MgQ2FzZUVkaXRQYWdlQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBBZnRlclZpZXdDaGVja2VkLCBPbkRlc3Ryb3kge1xuICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFJFU1VNRURfRk9STV9ESVNDQVJEID0gJ1JFU1VNRURfRk9STV9ESVNDQVJEJztcbiAgcHVibGljIHN0YXRpYyByZWFkb25seSBORVdfRk9STV9ESVNDQVJEID0gJ05FV19GT1JNX0RJU0NBUkQnO1xuICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IE5FV19GT1JNX1NBVkUgPSAnTkVXX0ZPUk1fQ0hBTkdFRF9TQVZFJztcbiAgcHVibGljIHN0YXRpYyByZWFkb25seSBSRVNVTUVEX0ZPUk1fU0FWRSA9ICdSRVNVTUVEX0ZPUk1fU0FWRSc7XG4gIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgVFJJR0dFUl9URVhUX1NUQVJUID0gJ0NvbnRpbnVlJztcbiAgcHVibGljIHN0YXRpYyByZWFkb25seSBUUklHR0VSX1RFWFRfU0FWRSA9ICdTYXZlIGFuZCBjb250aW51ZSc7XG4gIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgVFJJR0dFUl9URVhUX0NPTlRJTlVFID0gJ0lnbm9yZSBXYXJuaW5nIGFuZCBDb250aW51ZSc7XG5cbiAgcHVibGljIGV2ZW50VHJpZ2dlcjogQ2FzZUV2ZW50VHJpZ2dlcjtcbiAgcHVibGljIGVkaXRGb3JtOiBGb3JtR3JvdXA7XG4gIHB1YmxpYyB3aXphcmQ6IFdpemFyZDtcbiAgcHVibGljIGN1cnJlbnRQYWdlOiBXaXphcmRQYWdlO1xuICBwdWJsaWMgZGlhbG9nQ29uZmlnOiBNYXREaWFsb2dDb25maWc7XG4gIHB1YmxpYyB0cmlnZ2VyVGV4dFN0YXJ0ID0gQ2FzZUVkaXRQYWdlQ29tcG9uZW50LlRSSUdHRVJfVEVYVF9TVEFSVDtcbiAgcHVibGljIHRyaWdnZXJUZXh0SWdub3JlV2FybmluZ3MgPSBDYXNlRWRpdFBhZ2VDb21wb25lbnQuVFJJR0dFUl9URVhUX0NPTlRJTlVFO1xuICBwdWJsaWMgdHJpZ2dlclRleHQ6IHN0cmluZztcbiAgcHVibGljIGZvcm1WYWx1ZXNDaGFuZ2VkID0gZmFsc2U7XG4gIHB1YmxpYyBwYWdlQ2hhbmdlU3ViamVjdDogU3ViamVjdDxib29sZWFuPiA9IG5ldyBTdWJqZWN0KCk7XG4gIHB1YmxpYyBjYXNlRmllbGRzOiBDYXNlRmllbGRbXTtcbiAgcHVibGljIHZhbGlkYXRpb25FcnJvcnM6IENhc2VFZGl0VmFsaWRhdGlvbkVycm9yW10gPSBbXTtcbiAgcHVibGljIGhhc1ByZXZpb3VzUGFnZSQ6IEJlaGF2aW9yU3ViamVjdDxib29sZWFuPiA9IG5ldyBCZWhhdmlvclN1YmplY3Q8Ym9vbGVhbj4oZmFsc2UpO1xuICBwdWJsaWMgY2FsbGJhY2tFcnJvcnNTdWJqZWN0OiBTdWJqZWN0PGFueT4gPSBuZXcgU3ViamVjdCgpO1xuICBwdWJsaWMgaXNMaW5rZWRDYXNlc0pvdXJuZXlBdEZpbmFsU3RlcDogYm9vbGVhbjtcbiAgcHVibGljIHJvdXRlUGFyYW1zU3ViOiBTdWJzY3JpcHRpb247XG4gIHB1YmxpYyBjYXNlRWRpdEZvcm1TdWI6IFN1YnNjcmlwdGlvbjtcbiAgcHVibGljIGNhc2VJc0xpbmtlZENhc2VzSm91cm5leUF0RmluYWxTdGVwU3ViOiBTdWJzY3JpcHRpb247XG4gIHB1YmxpYyBjYXNlVHJpZ2dlclN1Ym1pdEV2ZW50U3ViOiBTdWJzY3JpcHRpb247XG4gIHB1YmxpYyB2YWxpZGF0ZVN1YjogU3Vic2NyaXB0aW9uO1xuICBwdWJsaWMgZGlhbG9nUmVmQWZ0ZXJDbG9zZWRTdWI6IFN1YnNjcmlwdGlvbjtcbiAgcHVibGljIHNhdmVEcmFmdFN1YjogU3Vic2NyaXB0aW9uO1xuICBwdWJsaWMgY2FzZUZvcm1WYWxpZGF0aW9uRXJyb3JzU3ViOiBTdWJzY3JpcHRpb247XG5cbiAgcHJpdmF0ZSBzdGF0aWMgc2Nyb2xsVG9Ub3AoKTogdm9pZCB7XG4gICAgd2luZG93LnNjcm9sbFRvKDAsIDApO1xuICB9XG5cbiAgcHJpdmF0ZSBzdGF0aWMgc2V0Rm9jdXNUb1RvcCgpIHtcbiAgICBjb25zdCB0b3BDb250YWluZXIgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndG9wJyk7XG4gICAgaWYgKHRvcENvbnRhaW5lcikge1xuICAgICAgdG9wQ29udGFpbmVyLmZvY3VzKCk7XG4gICAgfVxuICB9XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHVibGljIGNhc2VFZGl0OiBDYXNlRWRpdENvbXBvbmVudCxcbiAgICBwcml2YXRlIHJlYWRvbmx5IHJvdXRlOiBBY3RpdmF0ZWRSb3V0ZSxcbiAgICBwcml2YXRlIHJlYWRvbmx5IGZvcm1WYWx1ZVNlcnZpY2U6IEZvcm1WYWx1ZVNlcnZpY2UsXG4gICAgcHJpdmF0ZSByZWFkb25seSBmb3JtRXJyb3JTZXJ2aWNlOiBGb3JtRXJyb3JTZXJ2aWNlLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgY2RSZWY6IENoYW5nZURldGVjdG9yUmVmLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgcGFnZVZhbGlkYXRpb25TZXJ2aWNlOiBQYWdlVmFsaWRhdGlvblNlcnZpY2UsXG4gICAgcHJpdmF0ZSByZWFkb25seSBkaWFsb2c6IE1hdERpYWxvZyxcbiAgICBwcml2YXRlIHJlYWRvbmx5IGNhc2VGaWVsZFNlcnZpY2U6IENhc2VGaWVsZFNlcnZpY2UsXG4gICAgcHJpdmF0ZSByZWFkb25seSBjYXNlRWRpdERhdGFTZXJ2aWNlOiBDYXNlRWRpdERhdGFTZXJ2aWNlLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgbG9hZGluZ1NlcnZpY2U6IExvYWRpbmdTZXJ2aWNlLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgdmFsaWRQYWdlTGlzdENhc2VGaWVsZHNTZXJ2aWNlOiBWYWxpZFBhZ2VMaXN0Q2FzZUZpZWxkc1NlcnZpY2UsXG4gICAgcHJpdmF0ZSByZWFkb25seSBhZGRyZXNzU2VydmljZTogQWRkcmVzc2VzU2VydmljZVxuICApIHtcbiAgfVxuXG4gIHB1YmxpYyBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICBpbml0RGlhbG9nKCk7XG4gICAgdGhpcy5ldmVudFRyaWdnZXIgPSB0aGlzLmNhc2VFZGl0LmV2ZW50VHJpZ2dlcjtcbiAgICB0aGlzLmVkaXRGb3JtID0gdGhpcy5jYXNlRWRpdC5mb3JtO1xuICAgIHRoaXMud2l6YXJkID0gdGhpcy5jYXNlRWRpdC53aXphcmQ7XG4gICAgdGhpcy5jYXNlRmllbGRzID0gdGhpcy5nZXRDYXNlRmllbGRzKCk7XG5cbiAgICB0aGlzLnN5bmNDYXNlRWRpdERhdGFTZXJ2aWNlKCk7XG5cbiAgICB0aGlzLnJvdXRlUGFyYW1zU3ViID0gdGhpcy5yb3V0ZS5wYXJhbXNcbiAgICAgIC5zdWJzY3JpYmUocGFyYW1zID0+IHtcbiAgICAgICAgY29uc3QgcGFnZUlkID0gcGFyYW1zWydwYWdlJ107XG4gICAgICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBlbHNlICovXG4gICAgICAgIGlmICghdGhpcy5jdXJyZW50UGFnZSB8fCBwYWdlSWQgIT09IHRoaXMuY3VycmVudFBhZ2U/LmlkKSB7XG4gICAgICAgICAgY29uc3QgcGFnZSA9IHRoaXMuY2FzZUVkaXQuZ2V0UGFnZShwYWdlSWQpO1xuICAgICAgICAgIGlmIChwYWdlKSB7XG4gICAgICAgICAgICB0aGlzLmN1cnJlbnRQYWdlID0gcGFnZTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaWYgKHRoaXMuY3VycmVudFBhZ2UpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIHRoaXMubmV4dCgpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuZmlyc3QoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgdGhpcy5oYXNQcmV2aW91c1BhZ2UkLm5leHQodGhpcy5jYXNlRWRpdC5oYXNQcmV2aW91cyh0aGlzLmN1cnJlbnRQYWdlPy5pZCkpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMudHJpZ2dlclRleHQgPSB0aGlzLmdldFRyaWdnZXJUZXh0KCk7XG4gICAgICB9KTtcbiAgICBDYXNlRWRpdFBhZ2VDb21wb25lbnQuc2V0Rm9jdXNUb1RvcCgpO1xuICAgIHRoaXMuY2FzZUVkaXRGb3JtU3ViID0gdGhpcy5jYXNlRWRpdERhdGFTZXJ2aWNlLmNhc2VFZGl0Rm9ybSQuc3Vic2NyaWJlKHtcbiAgICAgIG5leHQ6IGVkaXRGb3JtID0+IHRoaXMuZWRpdEZvcm0gPSBlZGl0Rm9ybVxuICAgIH0pO1xuICAgIHRoaXMuY2FzZUlzTGlua2VkQ2FzZXNKb3VybmV5QXRGaW5hbFN0ZXBTdWIgPVxuICAgICAgdGhpcy5jYXNlRWRpdERhdGFTZXJ2aWNlLmNhc2VJc0xpbmtlZENhc2VzSm91cm5leUF0RmluYWxTdGVwJC5zdWJzY3JpYmUoe1xuICAgICAgICBuZXh0OiBpc0xpbmtlZENhc2VzSm91cm5leUF0RmluYWxTdGVwID0+IHRoaXMuaXNMaW5rZWRDYXNlc0pvdXJuZXlBdEZpbmFsU3RlcCA9IGlzTGlua2VkQ2FzZXNKb3VybmV5QXRGaW5hbFN0ZXBcbiAgICAgIH0pO1xuICAgIHRoaXMuY2FzZVRyaWdnZXJTdWJtaXRFdmVudFN1YiA9IHRoaXMuY2FzZUVkaXREYXRhU2VydmljZS5jYXNlVHJpZ2dlclN1Ym1pdEV2ZW50JC5zdWJzY3JpYmUoe1xuICAgICAgbmV4dDogc3RhdGUgPT4ge1xuICAgICAgICBpZiAoc3RhdGUpIHtcbiAgICAgICAgICB0aGlzLmNhc2VFZGl0RGF0YVNlcnZpY2Uuc2V0VHJpZ2dlclN1Ym1pdEV2ZW50KGZhbHNlKTtcbiAgICAgICAgICB0aGlzLnN1Ym1pdCgpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBwdWJsaWMgbmdBZnRlclZpZXdDaGVja2VkKCk6IHZvaWQge1xuICAgIHRoaXMuY2RSZWYuZGV0ZWN0Q2hhbmdlcygpO1xuICB9XG5cbiAgcHVibGljIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgIHRoaXMucm91dGVQYXJhbXNTdWI/LnVuc3Vic2NyaWJlKCk7XG4gICAgdGhpcy5jYXNlRWRpdEZvcm1TdWI/LnVuc3Vic2NyaWJlKCk7XG4gICAgdGhpcy5jYXNlSXNMaW5rZWRDYXNlc0pvdXJuZXlBdEZpbmFsU3RlcFN1Yj8udW5zdWJzY3JpYmUoKTtcbiAgICB0aGlzLmNhc2VUcmlnZ2VyU3VibWl0RXZlbnRTdWI/LnVuc3Vic2NyaWJlKCk7XG4gICAgdGhpcy52YWxpZGF0ZVN1Yj8udW5zdWJzY3JpYmUoKTtcbiAgICB0aGlzLmRpYWxvZ1JlZkFmdGVyQ2xvc2VkU3ViPy51bnN1YnNjcmliZSgpO1xuICAgIHRoaXMuc2F2ZURyYWZ0U3ViPy51bnN1YnNjcmliZSgpO1xuICAgIHRoaXMuY2FzZUZvcm1WYWxpZGF0aW9uRXJyb3JzU3ViPy51bnN1YnNjcmliZSgpO1xuICB9XG5cbiAgcHVibGljIGFwcGx5VmFsdWVzQ2hhbmdlZCh2YWx1ZXNDaGFuZ2VkOiBib29sZWFuKTogdm9pZCB7XG4gICAgdGhpcy5mb3JtVmFsdWVzQ2hhbmdlZCA9IHZhbHVlc0NoYW5nZWQ7XG4gIH1cblxuICBwdWJsaWMgZmlyc3QoKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgcmV0dXJuIHRoaXMuY2FzZUVkaXQuZmlyc3QoKTtcbiAgfVxuXG4gIHB1YmxpYyBjdXJyZW50UGFnZUlzTm90VmFsaWQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuICF0aGlzLnBhZ2VWYWxpZGF0aW9uU2VydmljZS5pc1BhZ2VWYWxpZCh0aGlzLmN1cnJlbnRQYWdlLCB0aGlzLmVkaXRGb3JtKSB8fFxuICAgICAgKHRoaXMuaXNMaW5rZWRDYXNlc0pvdXJuZXkoKSAmJiAhdGhpcy5pc0xpbmtlZENhc2VzSm91cm5leUF0RmluYWxTdGVwKTtcbiAgfVxuXG4gIHB1YmxpYyBpc0xpbmtlZENhc2VzSm91cm5leSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gRmllbGRzVXRpbHMuY29udGFpbnNMaW5rZWRDYXNlc0Nhc2VGaWVsZCh0aGlzLmN1cnJlbnRQYWdlLmNhc2VfZmllbGRzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBjYXNlRXZlbnREYXRhLmV2ZW50X2RhdGEgY29udGFpbnMgYWxsIHRoZSB2YWx1ZXMgZnJvbSB0aGUgcHJldmlvdXMgcGFnZXMgc28gd2Ugc2V0IGNhc2VFdmVudERhdGEuZGF0YSA9IGNhc2VFdmVudERhdGEuZXZlbnRfZGF0YVxuICAgKiBUaGlzIGJ1aWxkcyB0aGUgZm9ybSB3aXRoIGRhdGEgZnJvbSB0aGUgcHJldmlvdXMgcGFnZXNcbiAgICogRVVJLTM3MzIgLSBCcmVhdGhpbmcgc3BhY2UgZGF0YSBub3QgcGVyc2lzdGVkIG9uIFByZXZpb3VzIGJ1dHRvbiBjbGljayB3aXRoIEV4cFVJIERlbW9cbiAgICovXG4gIHB1YmxpYyB0b1ByZXZpb3VzUGFnZSgpOiB2b2lkIHtcbiAgICB0aGlzLmNhc2VFZGl0RGF0YVNlcnZpY2UuY2xlYXJGb3JtVmFsaWRhdGlvbkVycm9ycygpO1xuXG4gICAgY29uc3QgY2FzZUV2ZW50RGF0YTogQ2FzZUV2ZW50RGF0YSA9IHRoaXMuYnVpbGRDYXNlRXZlbnREYXRhKHRydWUpO1xuICAgIGNhc2VFdmVudERhdGEuZGF0YSA9IGNhc2VFdmVudERhdGEuZXZlbnRfZGF0YTtcbiAgICB0aGlzLnVwZGF0ZUZvcm1EYXRhKGNhc2VFdmVudERhdGEpO1xuICAgIHRoaXMucHJldmlvdXMoKTtcbiAgICBDYXNlRWRpdFBhZ2VDb21wb25lbnQuc2V0Rm9jdXNUb1RvcCgpO1xuICB9XG5cbiAgLy8gQWRkaW5nIHZhbGlkYXRpb24gbWVzc2FnZSB0byBzaG93IGl0IGFzIEVycm9yIFN1bW1hcnlcbiAgcHVibGljIGdlbmVyYXRlRXJyb3JNZXNzYWdlKGZpZWxkczogQ2FzZUZpZWxkW10sIGNvbnRhaW5lcj86IEFic3RyYWN0Q29udHJvbCwgcGF0aD86IHN0cmluZyk6IHZvaWQge1xuICAgIGNvbnN0IGdyb3VwOiBBYnN0cmFjdENvbnRyb2wgPSBjb250YWluZXIgfHwgdGhpcy5lZGl0Rm9ybS5jb250cm9sc1snZGF0YSddO1xuICAgIGZpZWxkcy5maWx0ZXIoY2FzZWZpZWxkID0+ICF0aGlzLmNhc2VGaWVsZFNlcnZpY2UuaXNSZWFkT25seShjYXNlZmllbGQpKVxuICAgICAgLmZpbHRlcihjYXNlZmllbGQgPT4gIXRoaXMucGFnZVZhbGlkYXRpb25TZXJ2aWNlLmlzSGlkZGVuKGNhc2VmaWVsZCwgdGhpcy5lZGl0Rm9ybSwgcGF0aCkpXG4gICAgICAuZm9yRWFjaChjYXNlZmllbGQgPT4ge1xuICAgICAgICBjb25zdCBmaWVsZEVsZW1lbnQgPSBGaWVsZHNVdGlscy5pc0Nhc2VGaWVsZE9mVHlwZShjYXNlZmllbGQsIFsnSnVkaWNpYWxVc2VyJ10pXG4gICAgICAgICAgPyBncm91cC5nZXQoYCR7Y2FzZWZpZWxkLmlkfV9qdWRpY2lhbFVzZXJDb250cm9sYClcbiAgICAgICAgICA6IGdyb3VwLmdldChjYXNlZmllbGQuaWQpO1xuICAgICAgICBpZiAoZmllbGRFbGVtZW50KSB7XG4gICAgICAgICAgY29uc3QgbGFiZWwgPSBjYXNlZmllbGQubGFiZWwgfHwgJ0ZpZWxkJztcbiAgICAgICAgICBsZXQgaWQgPSBjYXNlZmllbGQuaWQ7XG4gICAgICAgICAgaWYgKGZpZWxkRWxlbWVudFsnY29tcG9uZW50J10gJiYgZmllbGRFbGVtZW50Wydjb21wb25lbnQnXS5wYXJlbnQpIHtcbiAgICAgICAgICAgIGlmIChmaWVsZEVsZW1lbnRbJ2NvbXBvbmVudCddLmlkUHJlZml4LmluZGV4T2YoYF8ke2lkfV9gKSA9PT0gLTEpIHtcbiAgICAgICAgICAgICAgaWQgPSBgJHtmaWVsZEVsZW1lbnRbJ2NvbXBvbmVudCddLmlkUHJlZml4fSR7aWR9YDtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIGlkID0gYCR7ZmllbGRFbGVtZW50Wydjb21wb25lbnQnXS5pZFByZWZpeH1gO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoZmllbGRFbGVtZW50Lmhhc0Vycm9yKCdyZXF1aXJlZCcpKSB7XG4gICAgICAgICAgICBpZiAoY2FzZWZpZWxkLmlkID09PSAnQWRkcmVzc0xpbmUxJykge1xuICAgICAgICAgICAgICAvLyBFVUktMTA2NyAtIERpc3BsYXkgbW9yZSByZWxldmFudCBlcnJvciBtZXNzYWdlIHRvIHVzZXIgYW5kIGNvcnJlY3RseSBuYXZpZ2F0ZSB0byB0aGUgZmllbGRcbiAgICAgICAgICAgICAgdGhpcy5hZGRyZXNzU2VydmljZS5zZXRNYW5kYXRvcnlFcnJvcih0cnVlKTtcbiAgICAgICAgICAgICAgdGhpcy5jYXNlRWRpdERhdGFTZXJ2aWNlLmFkZEZvcm1WYWxpZGF0aW9uRXJyb3IoeyBpZDogYCR7cGF0aH1fJHtwYXRofWAsIG1lc3NhZ2U6IGBBbiBhZGRyZXNzIGlzIHJlcXVpcmVkYCB9KTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHRoaXMuY2FzZUVkaXREYXRhU2VydmljZS5hZGRGb3JtVmFsaWRhdGlvbkVycm9yKHsgaWQsIG1lc3NhZ2U6IGAlRklFTERMQUJFTCUgaXMgcmVxdWlyZWRgLCBsYWJlbCB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGZpZWxkRWxlbWVudC5tYXJrQXNEaXJ0eSgpO1xuICAgICAgICAgICAgLy8gRm9yIHRoZSBKdWRpY2lhbFVzZXIgZmllbGQgdHlwZSwgYW4gZXJyb3IgbmVlZHMgdG8gYmUgc2V0IG9uIHRoZSBjb21wb25lbnQgc28gdGhhdCBhbiBlcnJvciBtZXNzYWdlXG4gICAgICAgICAgICAvLyBjYW4gYmUgZGlzcGxheWVkIGF0IGZpZWxkIGxldmVsXG4gICAgICAgICAgICBpZiAoRmllbGRzVXRpbHMuaXNDYXNlRmllbGRPZlR5cGUoY2FzZWZpZWxkLCBbJ0p1ZGljaWFsVXNlciddKSkge1xuICAgICAgICAgICAgICBmaWVsZEVsZW1lbnRbJ2NvbXBvbmVudCddLmVycm9ycyA9IHsgcmVxdWlyZWQ6IHRydWUgfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2UgaWYgKGZpZWxkRWxlbWVudC5oYXNFcnJvcigncGF0dGVybicpKSB7XG4gICAgICAgICAgICB0aGlzLmNhc2VFZGl0RGF0YVNlcnZpY2UuYWRkRm9ybVZhbGlkYXRpb25FcnJvcih7IGlkLCBtZXNzYWdlOiBgJUZJRUxETEFCRUwlIGlzIG5vdCB2YWxpZGAsIGxhYmVsIH0pO1xuICAgICAgICAgICAgZmllbGRFbGVtZW50Lm1hcmtBc0RpcnR5KCk7XG4gICAgICAgICAgfSBlbHNlIGlmIChmaWVsZEVsZW1lbnQuaGFzRXJyb3IoJ21pbmxlbmd0aCcpKSB7XG4gICAgICAgICAgICB0aGlzLmNhc2VFZGl0RGF0YVNlcnZpY2UuYWRkRm9ybVZhbGlkYXRpb25FcnJvcih7IGlkLCBtZXNzYWdlOiBgJUZJRUxETEFCRUwlIGlzIGJlbG93IHRoZSBtaW5pbXVtIGxlbmd0aGAsIGxhYmVsIH0pO1xuICAgICAgICAgICAgZmllbGRFbGVtZW50Lm1hcmtBc0RpcnR5KCk7XG4gICAgICAgICAgfSBlbHNlIGlmIChmaWVsZEVsZW1lbnQuaGFzRXJyb3IoJ21heGxlbmd0aCcpKSB7XG4gICAgICAgICAgICB0aGlzLmNhc2VFZGl0RGF0YVNlcnZpY2UuYWRkRm9ybVZhbGlkYXRpb25FcnJvcih7IGlkLCBtZXNzYWdlOiBgJUZJRUxETEFCRUwlIGV4Y2VlZHMgdGhlIG1heGltdW0gbGVuZ3RoYCwgbGFiZWwgfSk7XG4gICAgICAgICAgICBmaWVsZEVsZW1lbnQubWFya0FzRGlydHkoKTtcbiAgICAgICAgICB9IGVsc2UgaWYgKGZpZWxkRWxlbWVudC5pbnZhbGlkKSB7XG4gICAgICAgICAgICBpZiAoY2FzZWZpZWxkLmlzQ29tcGxleCgpKSB7XG4gICAgICAgICAgICAgIHRoaXMuZ2VuZXJhdGVFcnJvck1lc3NhZ2UoY2FzZWZpZWxkLmZpZWxkX3R5cGUuY29tcGxleF9maWVsZHMsIGZpZWxkRWxlbWVudCwgaWQpO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChjYXNlZmllbGQuaXNDb2xsZWN0aW9uKCkgJiYgY2FzZWZpZWxkLmZpZWxkX3R5cGUuY29sbGVjdGlvbl9maWVsZF90eXBlLnR5cGUgPT09ICdDb21wbGV4Jykge1xuICAgICAgICAgICAgICBjb25zdCBmaWVsZEFycmF5ID0gZmllbGRFbGVtZW50IGFzIEZvcm1BcnJheTtcbiAgICAgICAgICAgICAgaWYgKGZpZWxkQXJyYXlbJ2NvbXBvbmVudCddICYmIGZpZWxkQXJyYXlbJ2NvbXBvbmVudCddWydjb2xsSXRlbXMnXSAmJiBmaWVsZEFycmF5Wydjb21wb25lbnQnXVsnY29sbEl0ZW1zJ10ubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgIGlkID0gYCR7ZmllbGRBcnJheVsnY29tcG9uZW50J11bJ2NvbGxJdGVtcyddWzBdLnByZWZpeH1gO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGZpZWxkQXJyYXkuY29udHJvbHMuZm9yRWFjaCgoYzogQWJzdHJhY3RDb250cm9sKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5nZW5lcmF0ZUVycm9yTWVzc2FnZShjYXNlZmllbGQuZmllbGRfdHlwZS5jb2xsZWN0aW9uX2ZpZWxkX3R5cGUuY29tcGxleF9maWVsZHMsIGMuZ2V0KCd2YWx1ZScpLCBpZCk7XG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChGaWVsZHNVdGlscy5pc0Nhc2VGaWVsZE9mVHlwZShjYXNlZmllbGQsIFsnRmxhZ0xhdW5jaGVyJ10pKSB7XG4gICAgICAgICAgICAgIHRoaXMudmFsaWRhdGlvbkVycm9ycy5wdXNoKHtcbiAgICAgICAgICAgICAgICBpZCxcbiAgICAgICAgICAgICAgICBtZXNzYWdlOiBGaWVsZHNVdGlscy5nZXRWYWxpZGF0aW9uRXJyb3JNZXNzYWdlRm9yRmxhZ0xhdW5jaGVyQ2FzZUZpZWxkKGNhc2VmaWVsZClcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICB0aGlzLnZhbGlkYXRpb25FcnJvcnMucHVzaCh7IGlkLCBtZXNzYWdlOiBgU2VsZWN0IG9yIGZpbGwgdGhlIHJlcXVpcmVkICR7Y2FzZWZpZWxkLmxhYmVsfSBmaWVsZGAgfSk7XG4gICAgICAgICAgICAgIGZpZWxkRWxlbWVudC5tYXJrQXNEaXJ0eSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgQ2FzZUVkaXRQYWdlQ29tcG9uZW50LnNjcm9sbFRvVG9wKCk7XG4gIH1cblxuICBwdWJsaWMgbmF2aWdhdGVUb0Vycm9yRWxlbWVudChlbGVtZW50SWQ6IHN0cmluZyk6IHZvaWQge1xuICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBlbHNlICovXG4gICAgaWYgKGVsZW1lbnRJZCkge1xuICAgICAgY29uc3QgaHRtbEVsZW1lbnQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChlbGVtZW50SWQpO1xuICAgICAgLyogaXN0YW5idWwgaWdub3JlIGVsc2UgKi9cbiAgICAgIGlmIChodG1sRWxlbWVudCkge1xuICAgICAgICBodG1sRWxlbWVudC5zY3JvbGxJbnRvVmlldyh7IGJlaGF2aW9yOiAnc21vb3RoJywgYmxvY2s6ICdjZW50ZXInIH0pO1xuICAgICAgICBodG1sRWxlbWVudC5mb2N1cygpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBzdWJtaXQoKTogdm9pZCB7XG4gICAgdGhpcy5jYXNlRWRpdERhdGFTZXJ2aWNlLmNsZWFyRm9ybVZhbGlkYXRpb25FcnJvcnMoKTtcbiAgICBjb25zb2xlLmxvZygnUGFnZSBzdWJtaXQgZXZlbnQgZmlyZWQhJylcbiAgICBpZiAodGhpcy5jdXJyZW50UGFnZUlzTm90VmFsaWQoKSkge1xuICAgICAgLy8gVGhlIGdlbmVyYXRlRXJyb3JNZXNzYWdlIG1ldGhvZCBmaWx0ZXJzIG91dCB0aGUgaGlkZGVuIGZpZWxkcy5cbiAgICAgIC8vIFRoZSBlcnJvciBtZXNzYWdlIGZvciBMaW5rZWRDYXNlcyBqb3VybmV5IHdpbGwgbmV2ZXIgZ2V0IGRpc3BsYXllZCBiZWNhdXNlIHRoZVxuICAgICAgLy8gTGlua2VkQ2FzZXMgaXMgY29uZmlndXJlZCB3aXRoIENvbXBvbmVudExhdW5jaGVyIGZpZWxkIGFzIHZpc2libGUgYW5kIGNhc2VMaW5rcyBmaWVsZCBhcyBoaWRkZW4uXG4gICAgICBpZiAodGhpcy5pc0xpbmtlZENhc2VzSm91cm5leSgpKSB7XG4gICAgICAgIHRoaXMudmFsaWRhdGlvbkVycm9ycy5wdXNoKHsgaWQ6ICduZXh0LWJ1dHRvbicsIG1lc3NhZ2U6ICdQbGVhc2Ugc2VsZWN0IE5leHQgdG8gZ28gdG8gdGhlIG5leHQgcGFnZScgfSk7XG4gICAgICAgIENhc2VFZGl0UGFnZUNvbXBvbmVudC5zY3JvbGxUb1RvcCgpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5nZW5lcmF0ZUVycm9yTWVzc2FnZSh0aGlzLmN1cnJlbnRQYWdlLmNhc2VfZmllbGRzKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoIXRoaXMuY2FzZUVkaXQuaXNTdWJtaXR0aW5nICYmICF0aGlzLmN1cnJlbnRQYWdlSXNOb3RWYWxpZCgpKSB7XG4gICAgICB0aGlzLmFkZHJlc3NTZXJ2aWNlLnNldE1hbmRhdG9yeUVycm9yKGZhbHNlKTtcbiAgICAgIGNvbnNvbGUubG9nKCdDYXNlIEVkaXQgRXJyb3InLCB0aGlzLmNhc2VFZGl0LmVycm9yKTtcbiAgICAgIGlmICh0aGlzLmNhc2VFZGl0LnZhbGlkUGFnZUxpc3QuZmluZEluZGV4KHBhZ2U9PiBwYWdlLmlkID09PSB0aGlzLmN1cnJlbnRQYWdlLmlkKSA9PT0gLTEpIHtcbiAgICAgICAgdGhpcy5jYXNlRWRpdC52YWxpZFBhZ2VMaXN0LnB1c2godGhpcy5jdXJyZW50UGFnZSk7XG4gICAgICB9XG4gICAgICB0aGlzLmNhc2VFZGl0LmlzU3VibWl0dGluZyA9IHRydWU7XG4gICAgICB0aGlzLmNhc2VFZGl0LmVycm9yID0gbnVsbDtcbiAgICAgIGNvbnN0IGNhc2VFdmVudERhdGE6IENhc2VFdmVudERhdGEgPSB0aGlzLmJ1aWxkQ2FzZUV2ZW50RGF0YSgpO1xuICAgICAgY29uc3QgbG9hZGluZ1NwaW5uZXJUb2tlbiA9IHRoaXMubG9hZGluZ1NlcnZpY2UucmVnaXN0ZXIoKTtcbiAgICAgIHRoaXMudmFsaWRhdGVTdWIgPSB0aGlzLmNhc2VFZGl0LnZhbGlkYXRlKGNhc2VFdmVudERhdGEsIHRoaXMuY3VycmVudFBhZ2UuaWQpXG4gICAgICAgIC5waXBlKFxuICAgICAgICAgIGZpbmFsaXplKCgpID0+IHtcbiAgICAgICAgICAgIHRoaXMubG9hZGluZ1NlcnZpY2UudW5yZWdpc3Rlcihsb2FkaW5nU3Bpbm5lclRva2VuKTtcbiAgICAgICAgICB9KVxuICAgICAgICApXG4gICAgICAgIC5zdWJzY3JpYmUoKGpzb25EYXRhKSA9PiB7XG4gICAgICAgICAgLyogaXN0YW5idWwgaWdub3JlIGVsc2UgKi9cbiAgICAgICAgICBpZiAoanNvbkRhdGEpIHtcbiAgICAgICAgICAgIHRoaXMudXBkYXRlRm9ybURhdGEoanNvbkRhdGEgYXMgQ2FzZUV2ZW50RGF0YSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHRoaXMuc2F2ZURyYWZ0KCk7XG4gICAgICAgICAgdGhpcy5uZXh0KCk7XG4gICAgICAgIH0sIGVycm9yID0+IHtcbiAgICAgICAgICB0aGlzLmhhbmRsZUVycm9yKGVycm9yKTtcbiAgICAgICAgfSk7XG4gICAgICBDYXNlRWRpdFBhZ2VDb21wb25lbnQuc2Nyb2xsVG9Ub3AoKTtcbiAgICAgIC8vIFJlbW92ZSBhbGwgSnVkaWNpYWxVc2VyIEZvcm1Db250cm9scyB3aXRoIHRoZSBJRCBzdWZmaXggXCJfanVkaWNpYWxVc2VyQ29udHJvbFwiIGJlY2F1c2UgdGhlc2UgYXJlIG5vdFxuICAgICAgLy8gaW50ZW5kZWQgdG8gYmUgcHJlc2VudCBpbiB0aGUgQ2FzZSBFdmVudCBkYXRhICh0aGV5IGFyZSBhZGRlZCBvbmx5IGZvciB2YWx1ZSBzZWxlY3Rpb24gYW5kIHZhbGlkYXRpb25cbiAgICAgIC8vIHB1cnBvc2VzKVxuICAgICAgdGhpcy5yZW1vdmVBbGxKdWRpY2lhbFVzZXJGb3JtQ29udHJvbHModGhpcy5jdXJyZW50UGFnZSwgdGhpcy5lZGl0Rm9ybSk7XG4gICAgfVxuICAgIENhc2VFZGl0UGFnZUNvbXBvbmVudC5zZXRGb2N1c1RvVG9wKCk7XG4gIH1cblxuICBwdWJsaWMgdXBkYXRlRm9ybURhdGEoanNvbkRhdGE6IENhc2VFdmVudERhdGEpOiB2b2lkIHtcbiAgICBmb3IgKGNvbnN0IGNhc2VGaWVsZElkIG9mIE9iamVjdC5rZXlzKGpzb25EYXRhLmRhdGEpKSB7XG4gICAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgZWxzZSAqL1xuICAgICAgaWYgKHRoaXMucGFnZVdpdGhGaWVsZEV4aXN0cyhjYXNlRmllbGRJZCkpIHtcbiAgICAgICAgdGhpcy51cGRhdGVFdmVudFRyaWdnZXJDYXNlRmllbGRzKGNhc2VGaWVsZElkLCBqc29uRGF0YSwgdGhpcy5jYXNlRWRpdC5ldmVudFRyaWdnZXIpO1xuICAgICAgICB0aGlzLnVwZGF0ZUZvcm1Db250cm9sc1ZhbHVlKHRoaXMuZWRpdEZvcm0sIGNhc2VGaWVsZElkLCBqc29uRGF0YS5kYXRhW2Nhc2VGaWVsZElkXSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLy8gd2UgZG8gdGhlIGNoZWNrLCBiZWNhc3VlIHRoZSBkYXRhIGNvbWVzIGZyb20gdGhlIGV4dGVybmFsIHNvdXJjZVxuICBwdWJsaWMgcGFnZVdpdGhGaWVsZEV4aXN0cyhjYXNlRmllbGRJZDogc3RyaW5nKSB7XG4gICAgcmV0dXJuIHRoaXMud2l6YXJkLmZpbmRXaXphcmRQYWdlKGNhc2VGaWVsZElkKTtcbiAgfVxuXG4gIHB1YmxpYyB1cGRhdGVFdmVudFRyaWdnZXJDYXNlRmllbGRzKGNhc2VGaWVsZElkOiBzdHJpbmcsIGpzb25EYXRhOiBDYXNlRXZlbnREYXRhLCBldmVudFRyaWdnZXI6IENhc2VFdmVudFRyaWdnZXIpIHtcbiAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgZWxzZSAqL1xuICAgIGlmIChldmVudFRyaWdnZXI/LmNhc2VfZmllbGRzKSB7XG4gICAgICBldmVudFRyaWdnZXIuY2FzZV9maWVsZHNcbiAgICAgICAgLmZpbHRlcihlbGVtZW50ID0+IGVsZW1lbnQuaWQgPT09IGNhc2VGaWVsZElkKVxuICAgICAgICAuZm9yRWFjaChlbGVtZW50ID0+IHtcbiAgICAgICAgICBpZiAodGhpcy5pc0FuT2JqZWN0KGVsZW1lbnQudmFsdWUpKSB7XG4gICAgICAgICAgICBjb25zdCB1cGRhdGVkSnNvbkRhdGFPYmplY3QgPSB0aGlzLnVwZGF0ZUpzb25EYXRhT2JqZWN0KGNhc2VGaWVsZElkLCBqc29uRGF0YSwgZWxlbWVudCk7XG5cbiAgICAgICAgICAgIGVsZW1lbnQudmFsdWUgPSB7XG4gICAgICAgICAgICAgIC4uLmVsZW1lbnQudmFsdWUsXG4gICAgICAgICAgICAgIC4uLnVwZGF0ZWRKc29uRGF0YU9iamVjdCxcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGVsZW1lbnQudmFsdWUgPSBqc29uRGF0YS5kYXRhW2Nhc2VGaWVsZElkXTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgdXBkYXRlSnNvbkRhdGFPYmplY3QoY2FzZUZpZWxkSWQ6IHN0cmluZywganNvbkRhdGE6IENhc2VFdmVudERhdGEsIGVsZW1lbnQ6IENhc2VGaWVsZCk6IFJlY29yZDxzdHJpbmcsIHVua25vd24+IHtcbiAgICByZXR1cm4gT2JqZWN0LmtleXMoanNvbkRhdGEuZGF0YVtjYXNlRmllbGRJZF0pLnJlZHVjZSgoYWNjLCBrZXkpID0+IHtcbiAgICAgIGNvbnN0IGVsZW1lbnRWYWx1ZSA9IGVsZW1lbnQudmFsdWVba2V5XTtcbiAgICAgIGNvbnN0IGpzb25EYXRhVmFsdWUgPSBqc29uRGF0YS5kYXRhW2Nhc2VGaWVsZElkXVtrZXldO1xuICAgICAgY29uc3QgaGFzRWxlbWVudEdvdFZhbHVlUHJvcGVydHkgPSB0aGlzLmlzQW5PYmplY3QoZWxlbWVudFZhbHVlKSAmJiBlbGVtZW50VmFsdWUudmFsdWUgIT09IHVuZGVmaW5lZDtcbiAgICAgIGNvbnN0IGpzb25EYXRhT3JFbGVtZW50VmFsdWUgPSBqc29uRGF0YVZhbHVlPy52YWx1ZSAhPT0gbnVsbCAmJiBqc29uRGF0YVZhbHVlPy52YWx1ZSAhPT0gdW5kZWZpbmVkID8ganNvbkRhdGFWYWx1ZSA6IGVsZW1lbnRWYWx1ZTtcblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgLi4uYWNjLFxuICAgICAgICBbYCR7a2V5fWBdOiBoYXNFbGVtZW50R290VmFsdWVQcm9wZXJ0eSA/IGpzb25EYXRhT3JFbGVtZW50VmFsdWUgOiBqc29uRGF0YVZhbHVlXG4gICAgICB9O1xuICAgIH0sIHt9KTtcbiAgfVxuXG4gIHByaXZhdGUgaXNBbk9iamVjdChwcm9wZXJ0eTogdW5rbm93bik6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0eXBlb2YgcHJvcGVydHkgPT09ICdvYmplY3QnICYmICFBcnJheS5pc0FycmF5KHByb3BlcnR5KSAmJiBwcm9wZXJ0eSAhPT0gbnVsbDtcbiAgfVxuXG4gIHB1YmxpYyB1cGRhdGVGb3JtQ29udHJvbHNWYWx1ZShmb3JtR3JvdXA6IEZvcm1Hcm91cCwgY2FzZUZpZWxkSWQ6IHN0cmluZywgdmFsdWU6IGFueSk6IHZvaWQge1xuICAgIGNvbnN0IHRoZUNvbnRyb2wgPSBmb3JtR3JvdXAuY29udHJvbHNbJ2RhdGEnXS5nZXQoY2FzZUZpZWxkSWQpO1xuICAgIGlmICh0aGVDb250cm9sICYmIHRoZUNvbnRyb2xbJ3N0YXR1cyddICE9PSAnRElTQUJMRUQnKSB7XG4gICAgICBpZiAoQXJyYXkuaXNBcnJheSh0aGVDb250cm9sLnZhbHVlKSAmJiBBcnJheS5pc0FycmF5KHZhbHVlKVxuICAgICAgICAmJiB0aGVDb250cm9sLnZhbHVlLmxlbmd0aCA+IHZhbHVlLmxlbmd0aCAmJiB0aGVDb250cm9sWydjYXNlRmllbGQnXVxuICAgICAgICAmJiB0aGVDb250cm9sWydjYXNlRmllbGQnXVsnZGlzcGxheV9jb250ZXh0J10gJiYgdGhlQ29udHJvbFsnY2FzZUZpZWxkJ11bJ2Rpc3BsYXlfY29udGV4dCddID09PSAnT1BUSU9OQUwnXG4gICAgICAgICYmIHRoZUNvbnRyb2xbJ2Nhc2VGaWVsZCddWydmaWVsZF90eXBlJ10gJiYgdGhlQ29udHJvbFsnY2FzZUZpZWxkJ11bJ2ZpZWxkX3R5cGUnXVsndHlwZSddID09PSAnQ29sbGVjdGlvbicpIHtcbiAgICAgICAgLy8gZG8gbm90aGluZ1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhlQ29udHJvbC5wYXRjaFZhbHVlKHZhbHVlKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwdWJsaWMgY2FsbGJhY2tFcnJvcnNOb3RpZnkoZXJyb3JDb250ZXh0OiBDYWxsYmFja0Vycm9yc0NvbnRleHQpIHtcbiAgICB0aGlzLmNhc2VFZGl0Lmlnbm9yZVdhcm5pbmcgPSBlcnJvckNvbnRleHQuaWdub3JlV2FybmluZztcbiAgICB0aGlzLnRyaWdnZXJUZXh0ID0gZXJyb3JDb250ZXh0LnRyaWdnZXJUZXh0O1xuICB9XG5cbiAgcHVibGljIG5leHQoKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgaWYgKHRoaXMuY2FuTmF2aWdhdGVUb1N1bW1hcnlQYWdlKCkpIHtcbiAgICAgIHRoaXMuY2FzZUVkaXQuaXNTdWJtaXR0aW5nID0gZmFsc2U7XG4gICAgfVxuICAgIHRoaXMucmVzZXRFcnJvcnMoKTtcbiAgICB0aGlzLmZvcm1WYWx1ZXNDaGFuZ2VkID0gZmFsc2U7XG4gICAgdGhpcy5wYWdlQ2hhbmdlU3ViamVjdC5uZXh0KHRydWUpO1xuICAgIHJldHVybiB0aGlzLmNhc2VFZGl0Lm5leHQodGhpcy5jdXJyZW50UGFnZS5pZCk7XG4gIH1cblxuICBwdWJsaWMgcHJldmlvdXMoKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgdGhpcy5yZXNldEVycm9ycygpO1xuICAgIHRoaXMuc2F2ZURyYWZ0KCk7XG4gICAgdGhpcy5mb3JtVmFsdWVzQ2hhbmdlZCA9IGZhbHNlO1xuICAgIHRoaXMucGFnZUNoYW5nZVN1YmplY3QubmV4dCh0cnVlKTtcbiAgICByZXR1cm4gdGhpcy5jYXNlRWRpdC5wcmV2aW91cyh0aGlzLmN1cnJlbnRQYWdlLmlkKTtcbiAgfVxuXG4gIHB1YmxpYyBoYXNQcmV2aW91cygpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5jYXNlRWRpdC5oYXNQcmV2aW91cyh0aGlzLmN1cnJlbnRQYWdlLmlkKTtcbiAgfVxuXG4gIHB1YmxpYyBjYW5jZWwoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuZXZlbnRUcmlnZ2VyLmNhbl9zYXZlX2RyYWZ0KSB7XG4gICAgICBpZiAodGhpcy5mb3JtVmFsdWVzQ2hhbmdlZCkge1xuICAgICAgICBjb25zdCBkaWFsb2dSZWYgPSB0aGlzLmRpYWxvZy5vcGVuKFNhdmVPckRpc2NhcmREaWFsb2dDb21wb25lbnQsIHRoaXMuZGlhbG9nQ29uZmlnKTtcbiAgICAgICAgdGhpcy5kaWFsb2dSZWZBZnRlckNsb3NlZFN1YiA9IGRpYWxvZ1JlZi5hZnRlckNsb3NlZCgpLnN1YnNjcmliZShyZXN1bHQgPT4ge1xuICAgICAgICAgIGlmIChyZXN1bHQgPT09ICdEaXNjYXJkJykge1xuICAgICAgICAgICAgdGhpcy5kaXNjYXJkKCk7XG4gICAgICAgICAgfSBlbHNlIGlmIChyZXN1bHQgPT09ICdTYXZlJykge1xuICAgICAgICAgICAgY29uc3QgZHJhZnRDYXNlRXZlbnREYXRhOiBDYXNlRXZlbnREYXRhID0gdGhpcy5mb3JtVmFsdWVTZXJ2aWNlLnNhbml0aXNlKHRoaXMuZWRpdEZvcm0udmFsdWUpIGFzIENhc2VFdmVudERhdGE7XG4gICAgICAgICAgICBpZiAodGhpcy5yb3V0ZS5zbmFwc2hvdC5xdWVyeVBhcmFtTWFwLmdldChDYXNlRWRpdENvbXBvbmVudC5PUklHSU5fUVVFUllfUEFSQU0pID09PSAndmlld0RyYWZ0Jykge1xuICAgICAgICAgICAgICB0aGlzLmNhc2VFZGl0LmNhbmNlbGxlZC5lbWl0KHsgc3RhdHVzOiBDYXNlRWRpdFBhZ2VDb21wb25lbnQuUkVTVU1FRF9GT1JNX1NBVkUsIGRhdGE6IGRyYWZ0Q2FzZUV2ZW50RGF0YSB9KTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHRoaXMuY2FzZUVkaXQuY2FuY2VsbGVkLmVtaXQoeyBzdGF0dXM6IENhc2VFZGl0UGFnZUNvbXBvbmVudC5ORVdfRk9STV9TQVZFLCBkYXRhOiBkcmFmdENhc2VFdmVudERhdGEgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuZGlzY2FyZCgpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmNhc2VFZGl0LmNhbmNlbGxlZC5lbWl0KCk7XG4gICAgfVxuXG4gICAgdGhpcy5jYXNlRWRpdERhdGFTZXJ2aWNlLmNsZWFyRm9ybVZhbGlkYXRpb25FcnJvcnMoKTtcbiAgfVxuXG4gIHB1YmxpYyBzdWJtaXR0aW5nKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmNhc2VFZGl0LmlzU3VibWl0dGluZztcbiAgfVxuXG4gIHB1YmxpYyBnZXRDYXNlSWQoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gKHRoaXMuY2FzZUVkaXQuY2FzZURldGFpbHMgPyB0aGlzLmNhc2VFZGl0LmNhc2VEZXRhaWxzLmNhc2VfaWQgOiAnJyk7XG4gIH1cblxuICBwdWJsaWMgZ2V0Q2FzZVRpdGxlKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuICh0aGlzLmNhc2VFZGl0LmNhc2VEZXRhaWxzICYmIHRoaXMuY2FzZUVkaXQuY2FzZURldGFpbHMuc3RhdGUgJiZcbiAgICAgIHRoaXMuY2FzZUVkaXQuY2FzZURldGFpbHMuc3RhdGUudGl0bGVfZGlzcGxheSA/IHRoaXMuY2FzZUVkaXQuY2FzZURldGFpbHMuc3RhdGUudGl0bGVfZGlzcGxheSA6ICcnKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRDYW5jZWxUZXh0KCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuZXZlbnRUcmlnZ2VyLmNhbl9zYXZlX2RyYWZ0ID8gJ1JldHVybiB0byBjYXNlIGxpc3QnIDogJ0NhbmNlbCc7XG4gIH1cblxuICBwcml2YXRlIGNhbk5hdmlnYXRlVG9TdW1tYXJ5UGFnZSgpOiBib29sZWFuIHtcbiAgICBjb25zdCBuZXh0UGFnZSA9IHRoaXMuY2FzZUVkaXQuZ2V0TmV4dFBhZ2Uoe1xuICAgICAgY3VycmVudFBhZ2VJZDogdGhpcy5jdXJyZW50UGFnZT8uaWQsXG4gICAgICB3aXphcmQ6IHRoaXMud2l6YXJkLFxuICAgICAgZXZlbnRUcmlnZ2VyOiB0aGlzLmV2ZW50VHJpZ2dlcixcbiAgICAgIGZvcm06IHRoaXMuZWRpdEZvcm1cbiAgICB9KTtcblxuICAgIHJldHVybiB0aGlzLmV2ZW50VHJpZ2dlci5zaG93X3N1bW1hcnkgfHwgISFuZXh0UGFnZTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0VHJpZ2dlclRleHQoKTogc3RyaW5nIHtcbiAgICBjb25zdCB0ZXh0QmFzZWRPbkNhblNhdmVEcmFmdCA9IHRoaXMuZXZlbnRUcmlnZ2VyICYmIHRoaXMuZXZlbnRUcmlnZ2VyLmNhbl9zYXZlX2RyYWZ0XG4gICAgICA/IENhc2VFZGl0UGFnZUNvbXBvbmVudC5UUklHR0VSX1RFWFRfU0FWRVxuICAgICAgOiBDYXNlRWRpdFBhZ2VDb21wb25lbnQuVFJJR0dFUl9URVhUX1NUQVJUO1xuXG4gICAgcmV0dXJuIHRoaXMuY2FuTmF2aWdhdGVUb1N1bW1hcnlQYWdlKClcbiAgICAgID8gdGV4dEJhc2VkT25DYW5TYXZlRHJhZnRcbiAgICAgIDogJ1N1Ym1pdCc7XG4gIH1cblxuICBwcml2YXRlIGRpc2NhcmQoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMucm91dGUuc25hcHNob3QucXVlcnlQYXJhbU1hcC5nZXQoQ2FzZUVkaXRDb21wb25lbnQuT1JJR0lOX1FVRVJZX1BBUkFNKSA9PT0gJ3ZpZXdEcmFmdCcpIHtcbiAgICAgIHRoaXMuY2FzZUVkaXQuY2FuY2VsbGVkLmVtaXQoeyBzdGF0dXM6IENhc2VFZGl0UGFnZUNvbXBvbmVudC5SRVNVTUVEX0ZPUk1fRElTQ0FSRCB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5jYXNlRWRpdC5jYW5jZWxsZWQuZW1pdCh7IHN0YXR1czogQ2FzZUVkaXRQYWdlQ29tcG9uZW50Lk5FV19GT1JNX0RJU0NBUkQgfSk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBoYW5kbGVFcnJvcihlcnJvcikge1xuICAgIHRoaXMuY2FzZUVkaXQuaXNTdWJtaXR0aW5nID0gZmFsc2U7XG4gICAgdGhpcy5jYXNlRWRpdC5lcnJvciA9IGVycm9yO1xuICAgIHRoaXMuY2FzZUVkaXQuY2FsbGJhY2tFcnJvcnNTdWJqZWN0Lm5leHQodGhpcy5jYXNlRWRpdC5lcnJvcik7XG4gICAgdGhpcy5jYWxsYmFja0Vycm9yc1N1YmplY3QubmV4dCh0aGlzLmNhc2VFZGl0LmVycm9yKTtcbiAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgZWxzZSAqL1xuICAgIGlmICh0aGlzLmNhc2VFZGl0LmVycm9yLmRldGFpbHMpIHtcbiAgICAgIHRoaXMuZm9ybUVycm9yU2VydmljZVxuICAgICAgICAubWFwRmllbGRFcnJvcnModGhpcy5jYXNlRWRpdC5lcnJvci5kZXRhaWxzLmZpZWxkX2Vycm9ycywgdGhpcy5lZGl0Rm9ybT8uY29udHJvbHM/LlsnZGF0YSddIGFzIEZvcm1Hcm91cCwgJ3ZhbGlkYXRpb24nKTtcbiAgICB9XG4gICAgY29uc29sZS5sb2coJ2hhbmRsZUVycm9yICcsIGVycm9yKTtcbiAgfVxuXG4gIHByaXZhdGUgcmVzZXRFcnJvcnMoKTogdm9pZCB7XG4gICAgdGhpcy5jYXNlRWRpdC5lcnJvciA9IG51bGw7XG4gICAgdGhpcy5jYXNlRWRpdC5pZ25vcmVXYXJuaW5nID0gZmFsc2U7XG4gICAgdGhpcy50cmlnZ2VyVGV4dCA9IHRoaXMuZ2V0VHJpZ2dlclRleHQoKTtcbiAgICB0aGlzLmNhc2VFZGl0LmNhbGxiYWNrRXJyb3JzU3ViamVjdC5uZXh0KG51bGwpO1xuICB9XG5cbiAgcHJpdmF0ZSBzYXZlRHJhZnQoKSB7XG4gICAgaWYgKHRoaXMuZXZlbnRUcmlnZ2VyLmNhbl9zYXZlX2RyYWZ0KSB7XG4gICAgICBjb25zdCBkcmFmdENhc2VFdmVudERhdGE6IENhc2VFdmVudERhdGEgPSB0aGlzLmZvcm1WYWx1ZVNlcnZpY2Uuc2FuaXRpc2UodGhpcy5lZGl0Rm9ybS52YWx1ZSkgYXMgQ2FzZUV2ZW50RGF0YTtcbiAgICAgIGRyYWZ0Q2FzZUV2ZW50RGF0YS5ldmVudF90b2tlbiA9IHRoaXMuZXZlbnRUcmlnZ2VyLmV2ZW50X3Rva2VuO1xuICAgICAgZHJhZnRDYXNlRXZlbnREYXRhLmlnbm9yZV93YXJuaW5nID0gdGhpcy5jYXNlRWRpdC5pZ25vcmVXYXJuaW5nO1xuICAgICAgdGhpcy5zYXZlRHJhZnRTdWIgPSB0aGlzLmNhc2VFZGl0LnNhdmVEcmFmdChkcmFmdENhc2VFdmVudERhdGEpLnN1YnNjcmliZShcbiAgICAgICAgKGRyYWZ0KSA9PiB0aGlzLmV2ZW50VHJpZ2dlci5jYXNlX2lkID0gRFJBRlRfUFJFRklYICsgZHJhZnQuaWQsIGVycm9yID0+IHRoaXMuaGFuZGxlRXJyb3IoZXJyb3IpXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgZ2V0Q2FzZUZpZWxkcygpOiBDYXNlRmllbGRbXSB7XG4gICAgaWYgKHRoaXMuY2FzZUVkaXQuY2FzZURldGFpbHMpIHtcbiAgICAgIHJldHVybiBGaWVsZHNVdGlscy5nZXRDYXNlRmllbGRzKHRoaXMuY2FzZUVkaXQuY2FzZURldGFpbHMpO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLmV2ZW50VHJpZ2dlci5jYXNlX2ZpZWxkcztcbiAgfVxuXG4gIHByaXZhdGUgZ2V0Q2FzZUZpZWxkc0Zyb21DdXJyZW50QW5kUHJldmlvdXNQYWdlcygpOiBDYXNlRmllbGRbXSB7XG4gICAgY29uc3QgcmVzdWx0OiBDYXNlRmllbGRbXSA9IFtdO1xuICAgIHRoaXMud2l6YXJkLnBhZ2VzLmZvckVhY2gocGFnZSA9PiB7XG4gICAgICBpZiAocGFnZS5vcmRlciA8PSB0aGlzLmN1cnJlbnRQYWdlLm9yZGVyKSB7XG4gICAgICAgIHBhZ2UuY2FzZV9maWVsZHMuZm9yRWFjaChmaWVsZCA9PiByZXN1bHQucHVzaChmaWVsZCkpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICBwdWJsaWMgYnVpbGRDYXNlRXZlbnREYXRhKGZyb21QcmV2aW91c1BhZ2U/OiBib29sZWFuKTogQ2FzZUV2ZW50RGF0YSB7XG4gICAgY29uc3QgZm9ybVZhbHVlOiBvYmplY3QgPSB0aGlzLmVkaXRGb3JtLnZhbHVlO1xuXG4gICAgLy8gR2V0IHRoZSBDYXNlRXZlbnREYXRhIGZvciB0aGUgY3VycmVudCBwYWdlLlxuICAgIGNvbnN0IHBhZ2VGaWVsZHM6IENhc2VGaWVsZFtdID0gdGhpcy5jdXJyZW50UGFnZS5jYXNlX2ZpZWxkcztcbiAgICBjb25zdCBwYWdlRXZlbnREYXRhOiBDYXNlRXZlbnREYXRhID0gdGhpcy5nZXRGaWx0ZXJlZENhc2VFdmVudERhdGEocGFnZUZpZWxkcywgZm9ybVZhbHVlLCB0cnVlKTtcblxuICAgIC8vIEdldCB0aGUgQ2FzZUV2ZW50RGF0YSBmb3IgdGhlIGVudGlyZSBmb3JtIChhbGwgcGFnZXMpLlxuICAgIGNvbnN0IGFsbENhc2VGaWVsZHMgPSB0aGlzLmdldENhc2VGaWVsZHNGcm9tQ3VycmVudEFuZFByZXZpb3VzUGFnZXMoKTtcbiAgICBjb25zdCBmb3JtRXZlbnREYXRhOiBDYXNlRXZlbnREYXRhID0gdGhpcy5nZXRGaWx0ZXJlZENhc2VFdmVudERhdGEoYWxsQ2FzZUZpZWxkcywgZm9ybVZhbHVlLCBmYWxzZSwgdHJ1ZSwgZnJvbVByZXZpb3VzUGFnZSk7XG5cbiAgICAvLyBOb3cgaGVyZSdzIHRoZSBrZXkgdGhpbmcgLSB0aGUgcGFnZUV2ZW50RGF0YSBoYXMgYSBwcm9wZXJ0eSBjYWxsZWQgYGV2ZW50X2RhdGFgIGFuZFxuICAgIC8vIHdlIG5lZWQgVEhBVCB0byBiZSB0aGUgdmFsdWUgb2YgdGhlIGVudGlyZSBmb3JtOiBgZm9ybUV2ZW50RGF0YS5kYXRhYC5cbiAgICBwYWdlRXZlbnREYXRhLmV2ZW50X2RhdGEgPSBmb3JtRXZlbnREYXRhLmRhdGE7XG5cbiAgICAvLyBGaW5hbGlzZSB0aGUgQ2FzZUV2ZW50RGF0YSBvYmplY3QuXG4gICAgcGFnZUV2ZW50RGF0YS5ldmVudF90b2tlbiA9IHRoaXMuZXZlbnRUcmlnZ2VyLmV2ZW50X3Rva2VuO1xuICAgIHBhZ2VFdmVudERhdGEuaWdub3JlX3dhcm5pbmcgPSB0aGlzLmNhc2VFZGl0Lmlnbm9yZVdhcm5pbmc7XG5cbiAgICAvLyBGaW5hbGx5LCB0cnkgdG8gc2V0IHVwIHRoZSBjYXNlX3JlZmVyZW5jZS5cbiAgICBpZiAodGhpcy5jYXNlRWRpdC5jYXNlRGV0YWlscykge1xuICAgICAgcGFnZUV2ZW50RGF0YS5jYXNlX3JlZmVyZW5jZSA9IHRoaXMuY2FzZUVkaXQuY2FzZURldGFpbHMuY2FzZV9pZDtcbiAgICB9XG5cbiAgICAvLyBSZXR1cm4gdGhlIG5vdyBob3BlZnVsbHkgc2FuZSBDYXNlRXZlbnREYXRhLlxuICAgIHJldHVybiBwYWdlRXZlbnREYXRhO1xuICB9XG5cbiAgLyoqXG4gICAqIEFic3RyYWN0ZWQgdGhpcyBtZXRob2QgZnJvbSBidWlsZENhc2VFdmVudERhdGEgdG8gcmVtb3ZlIGR1cGxpY2F0aW9uLlxuICAgKiBAcGFyYW0gY2FzZUZpZWxkcyBUaGUgZmllbGRzIHRvIGZpbHRlciB0aGUgZGF0YSBieS5cbiAgICogQHBhcmFtIGZvcm1WYWx1ZSBUaGUgb3JpZ2luYWwgdmFsdWUgb2YgdGhlIGZvcm0uXG4gICAqIEBwYXJhbSBjbGVhckVtcHR5IFdoZXRoZXIgb3Igbm90IHRvIGNsZWFyIG91dCBlbXB0eSB2YWx1ZXMuXG4gICAqIEBwYXJhbSBjbGVhck5vbkNhc2UgV2hldGhlciBvciBub3QgdG8gY2xlYXIgb3V0IGZpZWxkcyB0aGF0IGFyZSBub3QgcGFydCBvZiB0aGUgY2FzZS5cbiAgICogQHJldHVybnMgQ2FzZUV2ZW50RGF0YSBmb3IgdGhlIHNwZWNpZmllZCBwYXJhbWV0ZXJzLlxuICAgKi9cbiAgcHJpdmF0ZSBnZXRGaWx0ZXJlZENhc2VFdmVudERhdGEoY2FzZUZpZWxkczogQ2FzZUZpZWxkW10sIGZvcm1WYWx1ZTogb2JqZWN0LCBjbGVhckVtcHR5ID0gZmFsc2UsXG4gICAgY2xlYXJOb25DYXNlID0gZmFsc2UsIGZyb21QcmV2aW91c1BhZ2UgPSBmYWxzZSk6IENhc2VFdmVudERhdGEge1xuICAgIC8vIEdldCB0aGUgZGF0YSBmb3IgdGhlIGZpZWxkcyBzcGVjaWZpZWQuXG4gICAgY29uc3QgZm9ybUZpZWxkcyA9IHRoaXMuZm9ybVZhbHVlU2VydmljZS5maWx0ZXJDdXJyZW50UGFnZUZpZWxkcyhjYXNlRmllbGRzLCBmb3JtVmFsdWUpO1xuXG4gICAgLy8gU29ydCBvdXQgdGhlIGR5bmFtaWMgbGlzdHMuXG4gICAgdGhpcy5mb3JtVmFsdWVTZXJ2aWNlLnNhbml0aXNlRHluYW1pY0xpc3RzKGNhc2VGaWVsZHMsIGZvcm1GaWVsZHMpO1xuXG4gICAgLy8gR2V0IGhvbGQgb2YgdGhlIENhc2VFdmVudERhdGEuXG4gICAgY29uc3QgY2FzZUV2ZW50RGF0YTogQ2FzZUV2ZW50RGF0YSA9IHRoaXMuZm9ybVZhbHVlU2VydmljZS5zYW5pdGlzZShmb3JtRmllbGRzKSBhcyBDYXNlRXZlbnREYXRhO1xuXG4gICAgLy8gZGVsZXRlIGZpZWxkcyB3aGljaCBhcmUgbm90IHBhcnQgb2YgdGhlIGNhc2UgZXZlbnQgam91cm5leSB3aXphcmQgcGFnZXMgY2FzZSBmaWVsZHNcbiAgICB0aGlzLnZhbGlkUGFnZUxpc3RDYXNlRmllbGRzU2VydmljZS5kZWxldGVOb25WYWxpZGF0ZWRGaWVsZHModGhpcy5jYXNlRWRpdC52YWxpZFBhZ2VMaXN0LCBjYXNlRXZlbnREYXRhLmRhdGEsIHRoaXMuZXZlbnRUcmlnZ2VyLmNhc2VfZmllbGRzLCBmcm9tUHJldmlvdXNQYWdlLCB0aGlzLmVkaXRGb3JtLmNvbnRyb2xzWydkYXRhJ10udmFsdWUpO1xuXG4gICAgLy8gVGlkeSBpdCB1cCBiZWZvcmUgd2UgcmV0dXJuIGl0LlxuICAgIHRoaXMuZm9ybVZhbHVlU2VydmljZS5yZW1vdmVVbm5lY2Vzc2FyeUZpZWxkcyhjYXNlRXZlbnREYXRhLmRhdGEsIGNhc2VGaWVsZHMsIGNsZWFyRW1wdHksIGNsZWFyTm9uQ2FzZSxcbiAgICAgIGZyb21QcmV2aW91c1BhZ2UsIHRoaXMuY3VycmVudFBhZ2UuY2FzZV9maWVsZHMpO1xuXG4gICAgcmV0dXJuIGNhc2VFdmVudERhdGE7XG4gIH1cblxuICBwcml2YXRlIHN5bmNDYXNlRWRpdERhdGFTZXJ2aWNlKCk6IHZvaWQge1xuICAgIHRoaXMuY2FzZUVkaXREYXRhU2VydmljZS5zZXRDYXNlRGV0YWlscyh0aGlzLmNhc2VFZGl0LmNhc2VEZXRhaWxzKTtcbiAgICB0aGlzLmNhc2VFZGl0RGF0YVNlcnZpY2Uuc2V0Q2FzZUV2ZW50VHJpZ2dlck5hbWUodGhpcy5ldmVudFRyaWdnZXIubmFtZSk7XG4gICAgdGhpcy5jYXNlRWRpdERhdGFTZXJ2aWNlLnNldENhc2VUaXRsZSh0aGlzLmdldENhc2VUaXRsZSgpKTtcbiAgICB0aGlzLmNhc2VFZGl0RGF0YVNlcnZpY2Uuc2V0Q2FzZUVkaXRGb3JtKHRoaXMuZWRpdEZvcm0pO1xuICAgIHRoaXMuY2FzZUZvcm1WYWxpZGF0aW9uRXJyb3JzU3ViID0gdGhpcy5jYXNlRWRpdERhdGFTZXJ2aWNlLmNhc2VGb3JtVmFsaWRhdGlvbkVycm9ycyQuc3Vic2NyaWJlKHtcbiAgICAgIG5leHQ6ICh2YWxpZGF0aW9uRXJyb3JzKSA9PiB0aGlzLnZhbGlkYXRpb25FcnJvcnMgPSB2YWxpZGF0aW9uRXJyb3JzXG4gICAgfSk7XG4gIH1cblxuICBwdWJsaWMgZ2V0UnB4VHJhbnNsYXRlUGlwZUFyZ3MoZmllbGRMYWJlbDogc3RyaW5nKTogeyBGSUVMRExBQkVMOiBzdHJpbmcgfSB8IG51bGwge1xuICAgIHJldHVybiBmaWVsZExhYmVsID8gKHsgRklFTERMQUJFTDogZmllbGRMYWJlbCB9KSA6IG51bGw7XG4gIH1cblxuICBwdWJsaWMgb25FdmVudENhbkJlQ29tcGxldGVkKGV2ZW50Q2FuQmVDb21wbGV0ZWQ6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICB0aGlzLmNhc2VFZGl0Lm9uRXZlbnRDYW5CZUNvbXBsZXRlZCh7XG4gICAgICBldmVudFRyaWdnZXI6IHRoaXMuZXZlbnRUcmlnZ2VyLFxuICAgICAgZXZlbnRDYW5CZUNvbXBsZXRlZCxcbiAgICAgIGNhc2VEZXRhaWxzOiB0aGlzLmNhc2VFZGl0LmNhc2VEZXRhaWxzLFxuICAgICAgZm9ybTogdGhpcy5lZGl0Rm9ybSxcbiAgICAgIHN1Ym1pdDogdGhpcy5jYXNlRWRpdC5zdWJtaXQsXG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIHJlbW92ZUFsbEp1ZGljaWFsVXNlckZvcm1Db250cm9scyhwYWdlOiBXaXphcmRQYWdlLCBlZGl0Rm9ybTogRm9ybUdyb3VwKTogdm9pZCB7XG4gICAgcGFnZS5jYXNlX2ZpZWxkcy5mb3JFYWNoKGNhc2VGaWVsZCA9PiB7XG4gICAgICBpZiAoRmllbGRzVXRpbHMuaXNDYXNlRmllbGRPZlR5cGUoY2FzZUZpZWxkLCBbJ0p1ZGljaWFsVXNlciddKSkge1xuICAgICAgICAoZWRpdEZvcm0uY29udHJvbHNbJ2RhdGEnXSBhcyBGb3JtR3JvdXApLnJlbW92ZUNvbnRyb2woYCR7Y2FzZUZpZWxkLmlkfV9qdWRpY2lhbFVzZXJDb250cm9sYCk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cbn1cbiIsIjxuZy1jb250YWluZXIgKm5nSWY9XCJjdXJyZW50UGFnZVwiPlxuICA8aDEgKm5nSWY9XCIhY3VycmVudFBhZ2UubGFiZWxcIiBjbGFzcz1cImdvdnVrLWhlYWRpbmctbFwiPnt7ZXZlbnRUcmlnZ2VyLm5hbWUgfCBycHhUcmFuc2xhdGV9fTwvaDE+XG4gIDxuZy1jb250YWluZXIgKm5nSWY9XCJjdXJyZW50UGFnZS5sYWJlbFwiPlxuICAgIDxzcGFuIGNsYXNzPVwiZ292dWstY2FwdGlvbi1sXCI+e3sgZXZlbnRUcmlnZ2VyLm5hbWUgfCBycHhUcmFuc2xhdGV9fTwvc3Bhbj5cbiAgICA8aDEgY2xhc3M9XCJnb3Z1ay1oZWFkaW5nLWxcIj57e2N1cnJlbnRQYWdlLmxhYmVsIHwgcnB4VHJhbnNsYXRlfX08L2gxPlxuICA8L25nLWNvbnRhaW5lcj5cbjwvbmctY29udGFpbmVyPlxuXG48IS0tQ2FzZSBJRCBvciBUaXRsZSAtLT5cbjxkaXYgKm5nSWY9XCJnZXRDYXNlVGl0bGUoKTsgdGhlbiB0aXRsZUJsb2NrOyBlbHNlIGlkQmxvY2tcIj48L2Rpdj5cbjxuZy10ZW1wbGF0ZSAjdGl0bGVCbG9jaz5cbiAgPGNjZC1tYXJrZG93biBbY29udGVudF09XCJnZXRDYXNlVGl0bGUoKSB8IGNjZENhc2VUaXRsZTogY2FzZUZpZWxkcyA6IGVkaXRGb3JtLmNvbnRyb2xzWydkYXRhJ11cIj48L2NjZC1tYXJrZG93bj5cbjwvbmctdGVtcGxhdGU+XG48bmctdGVtcGxhdGUgI2lkQmxvY2s+XG4gIDxoMiAqbmdJZj1cImdldENhc2VJZCgpXCIgY2xhc3M9XCJoZWFkaW5nLWgyXCI+I3t7IGdldENhc2VJZCgpIHwgY2NkQ2FzZVJlZmVyZW5jZSB9fTwvaDI+XG48L25nLXRlbXBsYXRlPlxuXG48IS0tIEVycm9yIG1lc3NhZ2Ugc3VtbWFyeSAtLT5cbjxkaXYgKm5nSWY9XCJ2YWxpZGF0aW9uRXJyb3JzLmxlbmd0aCA+IDBcIiBjbGFzcz1cImdvdnVrLWVycm9yLXN1bW1hcnlcIiBhcmlhLWxhYmVsbGVkYnk9XCJlcnJvci1zdW1tYXJ5LXRpdGxlXCIgcm9sZT1cImFsZXJ0XCIgdGFiaW5kZXg9XCItMVwiIGRhdGEtbW9kdWxlPVwiZ292dWstZXJyb3Itc3VtbWFyeVwiPlxuICA8aDIgY2xhc3M9XCJnb3Z1ay1lcnJvci1zdW1tYXJ5X190aXRsZVwiIGlkPVwiZXJyb3Itc3VtbWFyeS10aXRsZVwiPlxuICAgIHt7J1RoZXJlIGlzIGEgcHJvYmxlbScgfCBycHhUcmFuc2xhdGV9fVxuICA8L2gyPlxuICA8ZGl2ICpuZ0Zvcj1cImxldCB2YWxpZGF0aW9uRXJyb3Igb2YgdmFsaWRhdGlvbkVycm9yc1wiIGNsYXNzPVwiZ292dWstZXJyb3Itc3VtbWFyeV9fYm9keVwiPlxuICAgIDx1bCBjbGFzcz1cImdvdnVrLWxpc3QgZ292dWstZXJyb3Itc3VtbWFyeV9fbGlzdFwiPlxuICAgICAgPGxpPlxuICAgICAgICA8YSAoY2xpY2spPVwibmF2aWdhdGVUb0Vycm9yRWxlbWVudCh2YWxpZGF0aW9uRXJyb3IuaWQpXCIgY2xhc3M9XCJ2YWxpZGF0aW9uLWVycm9yXCI+XG4gICAgICAgICAge3sgdmFsaWRhdGlvbkVycm9yLm1lc3NhZ2UgfCBycHhUcmFuc2xhdGU6IGdldFJweFRyYW5zbGF0ZVBpcGVBcmdzKHZhbGlkYXRpb25FcnJvci5sYWJlbCB8IHJweFRyYW5zbGF0ZSk6IG51bGwgfX1cbiAgICAgICAgPC9hPlxuICAgICAgPC9saT5cbiAgICA8L3VsPlxuICA8L2Rpdj5cbjwvZGl2PlxuXG48Y2NkLWNhc2UtZWRpdC1nZW5lcmljLWVycm9ycyBbZXJyb3JdPVwiY2FzZUVkaXQuZXJyb3JcIj48L2NjZC1jYXNlLWVkaXQtZ2VuZXJpYy1lcnJvcnM+XG5cbjxjY2QtY2FsbGJhY2stZXJyb3JzXG4gIFt0cmlnZ2VyVGV4dENvbnRpbnVlXT1cInRyaWdnZXJUZXh0U3RhcnRcIlxuICBbdHJpZ2dlclRleHRJZ25vcmVdPVwidHJpZ2dlclRleHRJZ25vcmVXYXJuaW5nc1wiXG4gIFtjYWxsYmFja0Vycm9yc1N1YmplY3RdPVwiY2FzZUVkaXQuY2FsbGJhY2tFcnJvcnNTdWJqZWN0XCJcbiAgKGNhbGxiYWNrRXJyb3JzQ29udGV4dCk9XCJjYWxsYmFja0Vycm9yc05vdGlmeSgkZXZlbnQpXCI+XG48L2NjZC1jYWxsYmFjay1lcnJvcnM+XG48ZGl2IGNsYXNzPVwid2lkdGgtNTBcIj5cbiAgPGZvcm0gKm5nSWY9XCJjdXJyZW50UGFnZVwiIGNsYXNzPVwiZm9ybVwiIFtmb3JtR3JvdXBdPVwiZWRpdEZvcm1cIiAoc3VibWl0KT1cInN1Ym1pdCgpXCI+XG4gICAgPGZpZWxkc2V0IGlkPVwiZmllbGRzZXQtY2FzZS1kYXRhXCI+XG4gICAgICA8bGVnZW5kIHN0eWxlPVwiZGlzcGxheTogbm9uZTtcIj48L2xlZ2VuZD5cbiAgICAgIDwhLS0gc2luZ2xlIGNvbHVtbiAtLT5cbiAgICAgIDxjY2QtY2FzZS1lZGl0LWZvcm0gaWQ9J2Nhc2VFZGl0Rm9ybScgKm5nSWY9XCIhY3VycmVudFBhZ2UuaXNNdWx0aUNvbHVtbigpXCIgW2ZpZWxkc109XCJjdXJyZW50UGFnZS5nZXRDb2wxRmllbGRzKClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICBbZm9ybUdyb3VwXT1cImVkaXRGb3JtLmNvbnRyb2xzWydkYXRhJ11cIiBbY2FzZUZpZWxkc109XCJjYXNlRmllbGRzXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgW3BhZ2VDaGFuZ2VTdWJqZWN0XT1cInBhZ2VDaGFuZ2VTdWJqZWN0XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKHZhbHVlc0NoYW5nZWQpPVwiYXBwbHlWYWx1ZXNDaGFuZ2VkKCRldmVudClcIj48L2NjZC1jYXNlLWVkaXQtZm9ybT5cbiAgICAgIDwhLS0gdHdvIGNvbHVtbnMgLS0+XG4gICAgICA8ZGl2ICpuZ0lmPVwiY3VycmVudFBhZ2UuaXNNdWx0aUNvbHVtbigpXCIgY2xhc3M9XCJncmlkLXJvd1wiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiY29sdW1uLXR3by10aGlyZHMgcmlnaHRCb3JkZXJTZXBhcmF0b3JcIj5cbiAgICAgICAgICA8Y2NkLWNhc2UtZWRpdC1mb3JtIGlkPSdjYXNlRWRpdEZvcm0xJyBbZmllbGRzXT1cImN1cnJlbnRQYWdlLmdldENvbDFGaWVsZHMoKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbZm9ybUdyb3VwXT1cImVkaXRGb3JtLmNvbnRyb2xzWydkYXRhJ11cIiBbY2FzZUZpZWxkc109XCJjYXNlRmllbGRzXCI+PC9jY2QtY2FzZS1lZGl0LWZvcm0+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2IGNsYXNzPVwiY29sdW1uLW9uZS10aGlyZFwiPlxuICAgICAgICAgIDxjY2QtY2FzZS1lZGl0LWZvcm0gaWQ9J2Nhc2VFZGl0Rm9ybTInIFtmaWVsZHNdPVwiY3VycmVudFBhZ2UuZ2V0Q29sMkZpZWxkcygpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtmb3JtR3JvdXBdPVwiZWRpdEZvcm0uY29udHJvbHNbJ2RhdGEnXVwiIFtjYXNlRmllbGRzXT1cImNhc2VGaWVsZHNcIj48L2NjZC1jYXNlLWVkaXQtZm9ybT5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICA8L2ZpZWxkc2V0PlxuXG4gICAgPGRpdiBjbGFzcz1cImZvcm0tZ3JvdXAgZm9ybS1ncm91cC1yZWxhdGVkXCI+XG4gICAgICA8YnV0dG9uIGNsYXNzPVwiYnV0dG9uIGJ1dHRvbi1zZWNvbmRhcnlcIiB0eXBlPVwiYnV0dG9uXCIgW2Rpc2FibGVkXT1cIiEoaGFzUHJldmlvdXNQYWdlJCB8IGFzeW5jKVwiIChjbGljayk9XCJ0b1ByZXZpb3VzUGFnZSgpXCI+XG4gICAgICAgIHt7J1ByZXZpb3VzJyB8IHJweFRyYW5zbGF0ZX19XG4gICAgICA8L2J1dHRvbj5cbiAgICAgIDxidXR0b24gY2xhc3M9XCJidXR0b25cIiB0eXBlPVwic3VibWl0XCIgW2Rpc2FibGVkXT1cInN1Ym1pdHRpbmcoKVwiPnt7dHJpZ2dlclRleHQgfCBycHhUcmFuc2xhdGV9fTwvYnV0dG9uPlxuICAgIDwvZGl2PlxuXG4gICAgPHAgY2xhc3M9XCJjYW5jZWxcIj48YSAoY2xpY2spPVwiY2FuY2VsKClcIiBocmVmPVwiamF2YXNjcmlwdDp2b2lkKDApXCI+e3tnZXRDYW5jZWxUZXh0KCkgfCBycHhUcmFuc2xhdGV9fTwvYT48L3A+XG4gIDwvZm9ybT5cbjwvZGl2PlxuXG48Y2NkLWNhc2UtZXZlbnQtY29tcGxldGlvbiAqbmdJZj1cImNhc2VFZGl0LmlzRXZlbnRDb21wbGV0aW9uQ2hlY2tzUmVxdWlyZWRcIlxuICBbZXZlbnRDb21wbGV0aW9uUGFyYW1zXT1cImNhc2VFZGl0LmV2ZW50Q29tcGxldGlvblBhcmFtc1wiXG4gIChldmVudENhbkJlQ29tcGxldGVkKT1cIm9uRXZlbnRDYW5CZUNvbXBsZXRlZCgkZXZlbnQpXCI+XG48L2NjZC1jYXNlLWV2ZW50LWNvbXBsZXRpb24+XG4iXX0=
779
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2FzZS1lZGl0LXBhZ2UuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvY2NkLWNhc2UtdWktdG9vbGtpdC9zcmMvbGliL3NoYXJlZC9jb21wb25lbnRzL2Nhc2UtZWRpdG9yL2Nhc2UtZWRpdC1wYWdlL2Nhc2UtZWRpdC1wYWdlLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2NjZC1jYXNlLXVpLXRvb2xraXQvc3JjL2xpYi9zaGFyZWQvY29tcG9uZW50cy9jYXNlLWVkaXRvci9jYXNlLWVkaXQtcGFnZS9jYXNlLWVkaXQtcGFnZS5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBb0IsaUJBQWlCLEVBQUUsU0FBUyxFQUFxQixNQUFNLGVBQWUsQ0FBQztBQUVsRyxPQUFPLEVBQUUsZUFBZSxJQUFJLFNBQVMsRUFBMkMsTUFBTSxpQ0FBaUMsQ0FBQztBQUN4SCxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDakQsT0FBTyxFQUFFLGVBQWUsRUFBRSxPQUFPLEVBQWdCLE1BQU0sTUFBTSxDQUFDO0FBQzlELE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUMxQyxPQUFPLEVBQUUsbUJBQW1CLEVBQTJCLE1BQU0saUNBQWlDLENBQUM7QUFJL0YsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLDZCQUE2QixDQUFDO0FBQzNELE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxjQUFjLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUNyRSxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxrREFBa0QsQ0FBQztBQUNwRixPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDdkQsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sMkNBQTJDLENBQUM7QUFDN0UsT0FBTyxF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Y2VzQ29udGVudCI6WyJpbXBvcnQgeyBBZnRlclZpZXdDaGVja2VkLCBDaGFuZ2VEZXRlY3RvclJlZiwgQ29tcG9uZW50LCBPbkRlc3Ryb3ksIE9uSW5pdCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQWJzdHJhY3RDb250cm9sLCBGb3JtQXJyYXksIEZvcm1Hcm91cCB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7IE1hdExlZ2FjeURpYWxvZyBhcyBNYXREaWFsb2csIE1hdExlZ2FjeURpYWxvZ0NvbmZpZyBhcyBNYXREaWFsb2dDb25maWd9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2xlZ2FjeS1kaWFsb2cnO1xuaW1wb3J0IHsgQWN0aXZhdGVkUm91dGUgfSBmcm9tICdAYW5ndWxhci9yb3V0ZXInO1xuaW1wb3J0IHsgQmVoYXZpb3JTdWJqZWN0LCBTdWJqZWN0LCBTdWJzY3JpcHRpb24gfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IGZpbmFsaXplIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuaW1wb3J0IHsgQ2FzZUVkaXREYXRhU2VydmljZSwgQ2FzZUVkaXRWYWxpZGF0aW9uRXJyb3IgfSBmcm9tICcuLi8uLi8uLi9jb21tb25zL2Nhc2UtZWRpdC1kYXRhJztcbmltcG9ydCB7IENhc2VFdmVudERhdGEgfSBmcm9tICcuLi8uLi8uLi9kb21haW4vY2FzZS1ldmVudC1kYXRhLm1vZGVsJztcbmltcG9ydCB7IENhc2VFdmVudFRyaWdnZXIgfSBmcm9tICcuLi8uLi8uLi9kb21haW4vY2FzZS12aWV3L2Nhc2UtZXZlbnQtdHJpZ2dlci5tb2RlbCc7XG5pbXBvcnQgeyBDYXNlRmllbGQgfSBmcm9tICcuLi8uLi8uLi9kb21haW4vZGVmaW5pdGlvbic7XG5pbXBvcnQgeyBEUkFGVF9QUkVGSVggfSBmcm9tICcuLi8uLi8uLi9kb21haW4vZHJhZnQubW9kZWwnO1xuaW1wb3J0IHsgQWRkcmVzc2VzU2VydmljZSwgTG9hZGluZ1NlcnZpY2UgfSBmcm9tICcuLi8uLi8uLi9zZXJ2aWNlcyc7XG5pbXBvcnQgeyBDYXNlRmllbGRTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vc2VydmljZXMvY2FzZS1maWVsZHMvY2FzZS1maWVsZC5zZXJ2aWNlJztcbmltcG9ydCB7IEZpZWxkc1V0aWxzIH0gZnJvbSAnLi4vLi4vLi4vc2VydmljZXMvZmllbGRzJztcbmltcG9ydCB7IEZvcm1FcnJvclNlcnZpY2UgfSBmcm9tICcuLi8uLi8uLi9zZXJ2aWNlcy9mb3JtL2Zvcm0tZXJyb3Iuc2VydmljZSc7XG5pbXBvcnQgeyBGb3JtVmFsdWVTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vc2VydmljZXMvZm9ybS9mb3JtLXZhbHVlLnNlcnZpY2UnO1xuaW1wb3J0IHsgU2F2ZU9yRGlzY2FyZERpYWxvZ0NvbXBvbmVudCB9IGZyb20gJy4uLy4uL2RpYWxvZ3Mvc2F2ZS1vci1kaXNjYXJkLWRpYWxvZyc7XG5pbXBvcnQgeyBDYWxsYmFja0Vycm9yc0NvbnRleHQgfSBmcm9tICcuLi8uLi9lcnJvci9kb21haW4vZXJyb3ItY29udGV4dCc7XG5pbXBvcnQgeyBpbml0RGlhbG9nIH0gZnJvbSAnLi4vLi4vaGVscGVycyc7XG5pbXBvcnQgeyBDYXNlRWRpdENvbXBvbmVudCB9IGZyb20gJy4uL2Nhc2UtZWRpdC9jYXNlLWVkaXQuY29tcG9uZW50JztcbmltcG9ydCB7IFdpemFyZFBhZ2UgfSBmcm9tICcuLi9kb21haW4vd2l6YXJkLXBhZ2UubW9kZWwnO1xuaW1wb3J0IHsgV2l6YXJkIH0gZnJvbSAnLi4vZG9tYWluL3dpemFyZC5tb2RlbCc7XG5pbXBvcnQgeyBQYWdlVmFsaWRhdGlvblNlcnZpY2UgfSBmcm9tICcuLi9zZXJ2aWNlcy9wYWdlLXZhbGlkYXRpb24uc2VydmljZSc7XG5pbXBvcnQgeyBWYWxpZFBhZ2VMaXN0Q2FzZUZpZWxkc1NlcnZpY2UgfSBmcm9tICcuLi9zZXJ2aWNlcy92YWxpZC1wYWdlLWxpc3QtY2FzZUZpZWxkcy5zZXJ2aWNlJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnY2NkLWNhc2UtZWRpdC1wYWdlJyxcbiAgdGVtcGxhdGVVcmw6ICdjYXNlLWVkaXQtcGFnZS5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vY2FzZS1lZGl0LXBhZ2Uuc2NzcyddXG59KVxuZXhwb3J0IGNsYXNzIENhc2VFZGl0UGFnZUNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgQWZ0ZXJWaWV3Q2hlY2tlZCwgT25EZXN0cm95IHtcbiAgcHVibGljIHN0YXRpYyByZWFkb25seSBSRVNVTUVEX0ZPUk1fRElTQ0FSRCA9ICdSRVNVTUVEX0ZPUk1fRElTQ0FSRCc7XG4gIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgTkVXX0ZPUk1fRElTQ0FSRCA9ICdORVdfRk9STV9ESVNDQVJEJztcbiAgcHVibGljIHN0YXRpYyByZWFkb25seSBORVdfRk9STV9TQVZFID0gJ05FV19GT1JNX0NIQU5HRURfU0FWRSc7XG4gIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgUkVTVU1FRF9GT1JNX1NBVkUgPSAnUkVTVU1FRF9GT1JNX1NBVkUnO1xuICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFRSSUdHRVJfVEVYVF9TVEFSVCA9ICdDb250aW51ZSc7XG4gIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgVFJJR0dFUl9URVhUX1NBVkUgPSAnU2F2ZSBhbmQgY29udGludWUnO1xuICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFRSSUdHRVJfVEVYVF9DT05USU5VRSA9ICdJZ25vcmUgV2FybmluZyBhbmQgQ29udGludWUnO1xuXG4gIHB1YmxpYyBldmVudFRyaWdnZXI6IENhc2VFdmVudFRyaWdnZXI7XG4gIHB1YmxpYyBlZGl0Rm9ybTogRm9ybUdyb3VwO1xuICBwdWJsaWMgd2l6YXJkOiBXaXphcmQ7XG4gIHB1YmxpYyBjdXJyZW50UGFnZTogV2l6YXJkUGFnZTtcbiAgcHVibGljIGRpYWxvZ0NvbmZpZzogTWF0RGlhbG9nQ29uZmlnO1xuICBwdWJsaWMgdHJpZ2dlclRleHRTdGFydCA9IENhc2VFZGl0UGFnZUNvbXBvbmVudC5UUklHR0VSX1RFWFRfU1RBUlQ7XG4gIHB1YmxpYyB0cmlnZ2VyVGV4dElnbm9yZVdhcm5pbmdzID0gQ2FzZUVkaXRQYWdlQ29tcG9uZW50LlRSSUdHRVJfVEVYVF9DT05USU5VRTtcbiAgcHVibGljIHRyaWdnZXJUZXh0OiBzdHJpbmc7XG4gIHB1YmxpYyBmb3JtVmFsdWVzQ2hhbmdlZCA9IGZhbHNlO1xuICBwdWJsaWMgcGFnZUNoYW5nZVN1YmplY3Q6IFN1YmplY3Q8Ym9vbGVhbj4gPSBuZXcgU3ViamVjdCgpO1xuICBwdWJsaWMgY2FzZUZpZWxkczogQ2FzZUZpZWxkW107XG4gIHB1YmxpYyBmYWlsaW5nQ2FzZUZpZWxkczogQ2FzZUZpZWxkW107XG4gIHB1YmxpYyB2YWxpZGF0aW9uRXJyb3JzOiBDYXNlRWRpdFZhbGlkYXRpb25FcnJvcltdID0gW107XG4gIHB1YmxpYyBoYXNQcmV2aW91c1BhZ2UkOiBCZWhhdmlvclN1YmplY3Q8Ym9vbGVhbj4gPSBuZXcgQmVoYXZpb3JTdWJqZWN0PGJvb2xlYW4+KGZhbHNlKTtcbiAgcHVibGljIGNhbGxiYWNrRXJyb3JzU3ViamVjdDogU3ViamVjdDxhbnk+ID0gbmV3IFN1YmplY3QoKTtcbiAgcHVibGljIGlzTGlua2VkQ2FzZXNKb3VybmV5QXRGaW5hbFN0ZXA6IGJvb2xlYW47XG4gIHB1YmxpYyByb3V0ZVBhcmFtc1N1YjogU3Vic2NyaXB0aW9uO1xuICBwdWJsaWMgY2FzZUVkaXRGb3JtU3ViOiBTdWJzY3JpcHRpb247XG4gIHB1YmxpYyBjYXNlSXNMaW5rZWRDYXNlc0pvdXJuZXlBdEZpbmFsU3RlcFN1YjogU3Vic2NyaXB0aW9uO1xuICBwdWJsaWMgY2FzZVRyaWdnZXJTdWJtaXRFdmVudFN1YjogU3Vic2NyaXB0aW9uO1xuICBwdWJsaWMgdmFsaWRhdGVTdWI6IFN1YnNjcmlwdGlvbjtcbiAgcHVibGljIGRpYWxvZ1JlZkFmdGVyQ2xvc2VkU3ViOiBTdWJzY3JpcHRpb247XG4gIHB1YmxpYyBzYXZlRHJhZnRTdWI6IFN1YnNjcmlwdGlvbjtcbiAgcHVibGljIGNhc2VGb3JtVmFsaWRhdGlvbkVycm9yc1N1YjogU3Vic2NyaXB0aW9uO1xuXG4gIHByaXZhdGUgc3RhdGljIHNjcm9sbFRvVG9wKCk6IHZvaWQge1xuICAgIHdpbmRvdy5zY3JvbGxUbygwLCAwKTtcbiAgfVxuXG4gIHByaXZhdGUgc3RhdGljIHNldEZvY3VzVG9Ub3AoKSB7XG4gICAgY29uc3QgdG9wQ29udGFpbmVyID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3RvcCcpO1xuICAgIGlmICh0b3BDb250YWluZXIpIHtcbiAgICAgIHRvcENvbnRhaW5lci5mb2N1cygpO1xuICAgIH1cbiAgfVxuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHB1YmxpYyBjYXNlRWRpdDogQ2FzZUVkaXRDb21wb25lbnQsXG4gICAgcHJpdmF0ZSByZWFkb25seSByb3V0ZTogQWN0aXZhdGVkUm91dGUsXG4gICAgcHJpdmF0ZSByZWFkb25seSBmb3JtVmFsdWVTZXJ2aWNlOiBGb3JtVmFsdWVTZXJ2aWNlLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgZm9ybUVycm9yU2VydmljZTogRm9ybUVycm9yU2VydmljZSxcbiAgICBwcml2YXRlIHJlYWRvbmx5IGNkUmVmOiBDaGFuZ2VEZXRlY3RvclJlZixcbiAgICBwcml2YXRlIHJlYWRvbmx5IHBhZ2VWYWxpZGF0aW9uU2VydmljZTogUGFnZVZhbGlkYXRpb25TZXJ2aWNlLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgZGlhbG9nOiBNYXREaWFsb2csXG4gICAgcHJpdmF0ZSByZWFkb25seSBjYXNlRmllbGRTZXJ2aWNlOiBDYXNlRmllbGRTZXJ2aWNlLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgY2FzZUVkaXREYXRhU2VydmljZTogQ2FzZUVkaXREYXRhU2VydmljZSxcbiAgICBwcml2YXRlIHJlYWRvbmx5IGxvYWRpbmdTZXJ2aWNlOiBMb2FkaW5nU2VydmljZSxcbiAgICBwcml2YXRlIHJlYWRvbmx5IHZhbGlkUGFnZUxpc3RDYXNlRmllbGRzU2VydmljZTogVmFsaWRQYWdlTGlzdENhc2VGaWVsZHNTZXJ2aWNlLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgYWRkcmVzc1NlcnZpY2U6IEFkZHJlc3Nlc1NlcnZpY2VcbiAgKSB7XG4gIH1cblxuICBwdWJsaWMgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgaW5pdERpYWxvZygpO1xuICAgIHRoaXMuZXZlbnRUcmlnZ2VyID0gdGhpcy5jYXNlRWRpdC5ldmVudFRyaWdnZXI7XG4gICAgdGhpcy5lZGl0Rm9ybSA9IHRoaXMuY2FzZUVkaXQuZm9ybTtcbiAgICB0aGlzLndpemFyZCA9IHRoaXMuY2FzZUVkaXQud2l6YXJkO1xuICAgIHRoaXMuY2FzZUZpZWxkcyA9IHRoaXMuZ2V0Q2FzZUZpZWxkcygpO1xuXG4gICAgdGhpcy5zeW5jQ2FzZUVkaXREYXRhU2VydmljZSgpO1xuXG4gICAgdGhpcy5yb3V0ZVBhcmFtc1N1YiA9IHRoaXMucm91dGUucGFyYW1zXG4gICAgICAuc3Vic2NyaWJlKHBhcmFtcyA9PiB7XG4gICAgICAgIGNvbnN0IHBhZ2VJZCA9IHBhcmFtc1sncGFnZSddO1xuICAgICAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgZWxzZSAqL1xuICAgICAgICBpZiAoIXRoaXMuY3VycmVudFBhZ2UgfHwgcGFnZUlkICE9PSB0aGlzLmN1cnJlbnRQYWdlPy5pZCkge1xuICAgICAgICAgIGNvbnN0IHBhZ2UgPSB0aGlzLmNhc2VFZGl0LmdldFBhZ2UocGFnZUlkKTtcbiAgICAgICAgICBpZiAocGFnZSkge1xuICAgICAgICAgICAgdGhpcy5jdXJyZW50UGFnZSA9IHBhZ2U7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGlmICh0aGlzLmN1cnJlbnRQYWdlKSB7XG4gICAgICAgICAgICAgIHJldHVybiB0aGlzLm5leHQoKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHJldHVybiB0aGlzLmZpcnN0KCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIHRoaXMuaGFzUHJldmlvdXNQYWdlJC5uZXh0KHRoaXMuY2FzZUVkaXQuaGFzUHJldmlvdXModGhpcy5jdXJyZW50UGFnZT8uaWQpKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnRyaWdnZXJUZXh0ID0gdGhpcy5nZXRUcmlnZ2VyVGV4dCgpO1xuICAgICAgfSk7XG4gICAgQ2FzZUVkaXRQYWdlQ29tcG9uZW50LnNldEZvY3VzVG9Ub3AoKTtcbiAgICB0aGlzLmNhc2VFZGl0Rm9ybVN1YiA9IHRoaXMuY2FzZUVkaXREYXRhU2VydmljZS5jYXNlRWRpdEZvcm0kLnN1YnNjcmliZSh7XG4gICAgICBuZXh0OiBlZGl0Rm9ybSA9PiB0aGlzLmVkaXRGb3JtID0gZWRpdEZvcm1cbiAgICB9KTtcbiAgICB0aGlzLmNhc2VJc0xpbmtlZENhc2VzSm91cm5leUF0RmluYWxTdGVwU3ViID1cbiAgICAgIHRoaXMuY2FzZUVkaXREYXRhU2VydmljZS5jYXNlSXNMaW5rZWRDYXNlc0pvdXJuZXlBdEZpbmFsU3RlcCQuc3Vic2NyaWJlKHtcbiAgICAgICAgbmV4dDogaXNMaW5rZWRDYXNlc0pvdXJuZXlBdEZpbmFsU3RlcCA9PiB0aGlzLmlzTGlua2VkQ2FzZXNKb3VybmV5QXRGaW5hbFN0ZXAgPSBpc0xpbmtlZENhc2VzSm91cm5leUF0RmluYWxTdGVwXG4gICAgICB9KTtcbiAgICB0aGlzLmNhc2VUcmlnZ2VyU3VibWl0RXZlbnRTdWIgPSB0aGlzLmNhc2VFZGl0RGF0YVNlcnZpY2UuY2FzZVRyaWdnZXJTdWJtaXRFdmVudCQuc3Vic2NyaWJlKHtcbiAgICAgIG5leHQ6IHN0YXRlID0+IHtcbiAgICAgICAgaWYgKHN0YXRlKSB7XG4gICAgICAgICAgdGhpcy5jYXNlRWRpdERhdGFTZXJ2aWNlLnNldFRyaWdnZXJTdWJtaXRFdmVudChmYWxzZSk7XG4gICAgICAgICAgdGhpcy5zdWJtaXQoKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIG5nQWZ0ZXJWaWV3Q2hlY2tlZCgpOiB2b2lkIHtcbiAgICB0aGlzLmNkUmVmLmRldGVjdENoYW5nZXMoKTtcbiAgfVxuXG4gIHB1YmxpYyBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICB0aGlzLnJvdXRlUGFyYW1zU3ViPy51bnN1YnNjcmliZSgpO1xuICAgIHRoaXMuY2FzZUVkaXRGb3JtU3ViPy51bnN1YnNjcmliZSgpO1xuICAgIHRoaXMuY2FzZUlzTGlua2VkQ2FzZXNKb3VybmV5QXRGaW5hbFN0ZXBTdWI/LnVuc3Vic2NyaWJlKCk7XG4gICAgdGhpcy5jYXNlVHJpZ2dlclN1Ym1pdEV2ZW50U3ViPy51bnN1YnNjcmliZSgpO1xuICAgIHRoaXMudmFsaWRhdGVTdWI/LnVuc3Vic2NyaWJlKCk7XG4gICAgdGhpcy5kaWFsb2dSZWZBZnRlckNsb3NlZFN1Yj8udW5zdWJzY3JpYmUoKTtcbiAgICB0aGlzLnNhdmVEcmFmdFN1Yj8udW5zdWJzY3JpYmUoKTtcbiAgICB0aGlzLmNhc2VGb3JtVmFsaWRhdGlvbkVycm9yc1N1Yj8udW5zdWJzY3JpYmUoKTtcbiAgfVxuXG4gIHB1YmxpYyBhcHBseVZhbHVlc0NoYW5nZWQodmFsdWVzQ2hhbmdlZDogYm9vbGVhbik6IHZvaWQge1xuICAgIHRoaXMuZm9ybVZhbHVlc0NoYW5nZWQgPSB2YWx1ZXNDaGFuZ2VkO1xuICB9XG5cbiAgcHVibGljIGZpcnN0KCk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIHJldHVybiB0aGlzLmNhc2VFZGl0LmZpcnN0KCk7XG4gIH1cblxuICBwdWJsaWMgY3VycmVudFBhZ2VJc05vdFZhbGlkKCk6IGJvb2xlYW4ge1xuICAgIHRoaXMuZmFpbGluZ0Nhc2VGaWVsZHMgPSB0aGlzLnBhZ2VWYWxpZGF0aW9uU2VydmljZS5nZXRJbnZhbGlkRmllbGRzKHRoaXMuY3VycmVudFBhZ2UsIHRoaXMuZWRpdEZvcm0pO1xuICAgIHJldHVybiB0aGlzLmZhaWxpbmdDYXNlRmllbGRzLmxlbmd0aCA+IDAgfHxcbiAgICAgICh0aGlzLmlzTGlua2VkQ2FzZXNKb3VybmV5KCkgJiYgIXRoaXMuaXNMaW5rZWRDYXNlc0pvdXJuZXlBdEZpbmFsU3RlcCk7XG4gIH1cblxuICBwdWJsaWMgaXNMaW5rZWRDYXNlc0pvdXJuZXkoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIEZpZWxkc1V0aWxzLmNvbnRhaW5zTGlua2VkQ2FzZXNDYXNlRmllbGQodGhpcy5jdXJyZW50UGFnZS5jYXNlX2ZpZWxkcyk7XG4gIH1cblxuICAvKipcbiAgICogY2FzZUV2ZW50RGF0YS5ldmVudF9kYXRhIGNvbnRhaW5zIGFsbCB0aGUgdmFsdWVzIGZyb20gdGhlIHByZXZpb3VzIHBhZ2VzIHNvIHdlIHNldCBjYXNlRXZlbnREYXRhLmRhdGEgPSBjYXNlRXZlbnREYXRhLmV2ZW50X2RhdGFcbiAgICogVGhpcyBidWlsZHMgdGhlIGZvcm0gd2l0aCBkYXRhIGZyb20gdGhlIHByZXZpb3VzIHBhZ2VzXG4gICAqIEVVSS0zNzMyIC0gQnJlYXRoaW5nIHNwYWNlIGRhdGEgbm90IHBlcnNpc3RlZCBvbiBQcmV2aW91cyBidXR0b24gY2xpY2sgd2l0aCBFeHBVSSBEZW1vXG4gICAqL1xuICBwdWJsaWMgdG9QcmV2aW91c1BhZ2UoKTogdm9pZCB7XG4gICAgdGhpcy5jYXNlRWRpdERhdGFTZXJ2aWNlLmNsZWFyRm9ybVZhbGlkYXRpb25FcnJvcnMoKTtcblxuICAgIGNvbnN0IGNhc2VFdmVudERhdGE6IENhc2VFdmVudERhdGEgPSB0aGlzLmJ1aWxkQ2FzZUV2ZW50RGF0YSh0cnVlKTtcbiAgICBjYXNlRXZlbnREYXRhLmRhdGEgPSBjYXNlRXZlbnREYXRhLmV2ZW50X2RhdGE7XG4gICAgdGhpcy51cGRhdGVGb3JtRGF0YShjYXNlRXZlbnREYXRhKTtcbiAgICB0aGlzLnByZXZpb3VzKCk7XG4gICAgQ2FzZUVkaXRQYWdlQ29tcG9uZW50LnNldEZvY3VzVG9Ub3AoKTtcbiAgfVxuXG4gIC8vIEFkZGluZyB2YWxpZGF0aW9uIG1lc3NhZ2UgdG8gc2hvdyBpdCBhcyBFcnJvciBTdW1tYXJ5XG4gIHB1YmxpYyBnZW5lcmF0ZUVycm9yTWVzc2FnZShmaWVsZHM6IENhc2VGaWVsZFtdLCBjb250YWluZXI/OiBBYnN0cmFjdENvbnRyb2wsIHBhdGg/OiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICBjb25zdCBncm91cDogQWJzdHJhY3RDb250cm9sID0gY29udGFpbmVyIHx8IHRoaXMuZWRpdEZvcm0uY29udHJvbHNbJ2RhdGEnXTtcbiAgICBsZXQgdmFsaWRFcnJvckZpZWxkRm91bmQgPSBmYWxzZTtcbiAgICBsZXQgdmFsaWRhdGlvbkVycm9yQW1vdW50ID0gdGhpcy52YWxpZGF0aW9uRXJyb3JzLmxlbmd0aDtcbiAgICBjb25zdCBmYWlsaW5nRmllbGRzID0gZmllbGRzLmZpbHRlcihjYXNlZmllbGQgPT4gIXRoaXMuY2FzZUZpZWxkU2VydmljZS5pc1JlYWRPbmx5KGNhc2VmaWVsZCkpXG4gICAgLmZpbHRlcihjYXNlZmllbGQgPT4gIXRoaXMucGFnZVZhbGlkYXRpb25TZXJ2aWNlLmlzSGlkZGVuKGNhc2VmaWVsZCwgdGhpcy5lZGl0Rm9ybSwgcGF0aCkpO1xuICAgIC8vIG5vdGUgdGhhdCB0aG91Z24gdGhlc2UgY2hlY2tzIGFyZSBvbiBnZXRpbnZhbGlkZmllbGRzIHRoZXkgYXJlIG5lZWRlZCBmb3Igc3ViIGZpZWxkIGNoZWNrc1xuICAgIGZhaWxpbmdGaWVsZHNcbiAgICAgIC5mb3JFYWNoKGNhc2VmaWVsZCA9PiB7XG4gICAgICAgIGxldCBlcnJvclByZXNlbnQgPSB0cnVlO1xuICAgICAgICB2YWxpZEVycm9yRmllbGRGb3VuZCA9IHRydWU7XG4gICAgICAgIGNvbnN0IGZpZWxkRWxlbWVudCA9IEZpZWxkc1V0aWxzLmlzQ2FzZUZpZWxkT2ZUeXBlKGNhc2VmaWVsZCwgWydKdWRpY2lhbFVzZXInXSlcbiAgICAgICAgICA/IGdyb3VwLmdldChgJHtjYXNlZmllbGQuaWR9X2p1ZGljaWFsVXNlckNvbnRyb2xgKVxuICAgICAgICAgIDogZ3JvdXAuZ2V0KGNhc2VmaWVsZC5pZCk7XG4gICAgICAgIGlmIChmaWVsZEVsZW1lbnQpIHtcbiAgICAgICAgICBjb25zdCBsYWJlbCA9IGNhc2VmaWVsZC5sYWJlbCB8fCAnRmllbGQnO1xuICAgICAgICAgIGxldCBpZCA9IGNhc2VmaWVsZC5pZDtcbiAgICAgICAgICBpZiAoZmllbGRFbGVtZW50Wydjb21wb25lbnQnXSAmJiBmaWVsZEVsZW1lbnRbJ2NvbXBvbmVudCddLnBhcmVudCkge1xuICAgICAgICAgICAgaWYgKGZpZWxkRWxlbWVudFsnY29tcG9uZW50J10uaWRQcmVmaXguaW5kZXhPZihgXyR7aWR9X2ApID09PSAtMSkge1xuICAgICAgICAgICAgICBpZCA9IGAke2ZpZWxkRWxlbWVudFsnY29tcG9uZW50J10uaWRQcmVmaXh9JHtpZH1gO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgaWQgPSBgJHtmaWVsZEVsZW1lbnRbJ2NvbXBvbmVudCddLmlkUHJlZml4fWA7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChmaWVsZEVsZW1lbnQuaGFzRXJyb3IoJ3JlcXVpcmVkJykpIHtcbiAgICAgICAgICAgIGlmIChjYXNlZmllbGQuaWQgPT09ICdBZGRyZXNzTGluZTEnKSB7XG4gICAgICAgICAgICAgIC8vIEVVSS0xMDY3IC0gRGlzcGxheSBtb3JlIHJlbGV2YW50IGVycm9yIG1lc3NhZ2UgdG8gdXNlciBhbmQgY29ycmVjdGx5IG5hdmlnYXRlIHRvIHRoZSBmaWVsZFxuICAgICAgICAgICAgICB0aGlzLmFkZHJlc3NTZXJ2aWNlLnNldE1hbmRhdG9yeUVycm9yKHRydWUpO1xuICAgICAgICAgICAgICB0aGlzLmNhc2VFZGl0RGF0YVNlcnZpY2UuYWRkRm9ybVZhbGlkYXRpb25FcnJvcih7IGlkOiBgJHtwYXRofV8ke3BhdGh9YCwgbWVzc2FnZTogYEFuIGFkZHJlc3MgaXMgcmVxdWlyZWRgIH0pO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgdGhpcy5jYXNlRWRpdERhdGFTZXJ2aWNlLmFkZEZvcm1WYWxpZGF0aW9uRXJyb3IoeyBpZCwgbWVzc2FnZTogYCVGSUVMRExBQkVMJSBpcyByZXF1aXJlZGAsIGxhYmVsIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZmllbGRFbGVtZW50Lm1hcmtBc0RpcnR5KCk7XG4gICAgICAgICAgICAvLyBGb3IgdGhlIEp1ZGljaWFsVXNlciBmaWVsZCB0eXBlLCBhbiBlcnJvciBuZWVkcyB0byBiZSBzZXQgb24gdGhlIGNvbXBvbmVudCBzbyB0aGF0IGFuIGVycm9yIG1lc3NhZ2VcbiAgICAgICAgICAgIC8vIGNhbiBiZSBkaXNwbGF5ZWQgYXQgZmllbGQgbGV2ZWxcbiAgICAgICAgICAgIGlmIChGaWVsZHNVdGlscy5pc0Nhc2VGaWVsZE9mVHlwZShjYXNlZmllbGQsIFsnSnVkaWNpYWxVc2VyJ10pKSB7XG4gICAgICAgICAgICAgIGZpZWxkRWxlbWVudFsnY29tcG9uZW50J10uZXJyb3JzID0geyByZXF1aXJlZDogdHJ1ZSB9O1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSBpZiAoZmllbGRFbGVtZW50Lmhhc0Vycm9yKCdwYXR0ZXJuJykpIHtcbiAgICAgICAgICAgIHRoaXMuY2FzZUVkaXREYXRhU2VydmljZS5hZGRGb3JtVmFsaWRhdGlvbkVycm9yKHsgaWQsIG1lc3NhZ2U6IGAlRklFTERMQUJFTCUgaXMgbm90IHZhbGlkYCwgbGFiZWwgfSk7XG4gICAgICAgICAgICBmaWVsZEVsZW1lbnQubWFya0FzRGlydHkoKTtcbiAgICAgICAgICB9IGVsc2UgaWYgKGZpZWxkRWxlbWVudC5oYXNFcnJvcignbWlubGVuZ3RoJykpIHtcbiAgICAgICAgICAgIHRoaXMuY2FzZUVkaXREYXRhU2VydmljZS5hZGRGb3JtVmFsaWRhdGlvbkVycm9yKHsgaWQsIG1lc3NhZ2U6IGAlRklFTERMQUJFTCUgaXMgYmVsb3cgdGhlIG1pbmltdW0gbGVuZ3RoYCwgbGFiZWwgfSk7XG4gICAgICAgICAgICBmaWVsZEVsZW1lbnQubWFya0FzRGlydHkoKTtcbiAgICAgICAgICB9IGVsc2UgaWYgKGZpZWxkRWxlbWVudC5oYXNFcnJvcignbWF4bGVuZ3RoJykpIHtcbiAgICAgICAgICAgIHRoaXMuY2FzZUVkaXREYXRhU2VydmljZS5hZGRGb3JtVmFsaWRhdGlvbkVycm9yKHsgaWQsIG1lc3NhZ2U6IGAlRklFTERMQUJFTCUgZXhjZWVkcyB0aGUgbWF4aW11bSBsZW5ndGhgLCBsYWJlbCB9KTtcbiAgICAgICAgICAgIGZpZWxkRWxlbWVudC5tYXJrQXNEaXJ0eSgpO1xuICAgICAgICAgIH0gZWxzZSBpZiAoZmllbGRFbGVtZW50LmludmFsaWQpIHtcbiAgICAgICAgICAgIGlmIChjYXNlZmllbGQuaXNDb21wbGV4KCkpIHtcbiAgICAgICAgICAgICAgZXJyb3JQcmVzZW50ID0gdGhpcy5nZW5lcmF0ZUVycm9yTWVzc2FnZShjYXNlZmllbGQuZmllbGRfdHlwZS5jb21wbGV4X2ZpZWxkcywgZmllbGRFbGVtZW50LCBpZCk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGNhc2VmaWVsZC5pc0NvbGxlY3Rpb24oKSAmJiBjYXNlZmllbGQuZmllbGRfdHlwZS5jb2xsZWN0aW9uX2ZpZWxkX3R5cGUudHlwZSA9PT0gJ0NvbXBsZXgnKSB7XG4gICAgICAgICAgICAgIGNvbnN0IGZpZWxkQXJyYXkgPSBmaWVsZEVsZW1lbnQgYXMgRm9ybUFycmF5O1xuICAgICAgICAgICAgICBpZiAoZmllbGRBcnJheVsnY29tcG9uZW50J10gJiYgZmllbGRBcnJheVsnY29tcG9uZW50J11bJ2NvbGxJdGVtcyddICYmIGZpZWxkQXJyYXlbJ2NvbXBvbmVudCddWydjb2xsSXRlbXMnXS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgaWQgPSBgJHtmaWVsZEFycmF5Wydjb21wb25lbnQnXVsnY29sbEl0ZW1zJ11bMF0ucHJlZml4fWA7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgZmllbGRBcnJheS5jb250cm9scy5mb3JFYWNoKChjOiBBYnN0cmFjdENvbnRyb2wpID0+IHtcbiAgICAgICAgICAgICAgIGVycm9yUHJlc2VudCA9IHRoaXMuZ2VuZXJhdGVFcnJvck1lc3NhZ2UoY2FzZWZpZWxkLmZpZWxkX3R5cGUuY29sbGVjdGlvbl9maWVsZF90eXBlLmNvbXBsZXhfZmllbGRzLCBjLmdldCgndmFsdWUnKSwgaWQpO1xuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoRmllbGRzVXRpbHMuaXNDYXNlRmllbGRPZlR5cGUoY2FzZWZpZWxkLCBbJ0ZsYWdMYXVuY2hlciddKSkge1xuICAgICAgICAgICAgICB0aGlzLnZhbGlkYXRpb25FcnJvcnMucHVzaCh7XG4gICAgICAgICAgICAgICAgaWQsXG4gICAgICAgICAgICAgICAgbWVzc2FnZTogRmllbGRzVXRpbHMuZ2V0VmFsaWRhdGlvbkVycm9yTWVzc2FnZUZvckZsYWdMYXVuY2hlckNhc2VGaWVsZChjYXNlZmllbGQpXG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgdGhpcy52YWxpZGF0aW9uRXJyb3JzLnB1c2goeyBpZCwgbWVzc2FnZTogYFNlbGVjdCBvciBmaWxsIHRoZSByZXF1aXJlZCAke2Nhc2VmaWVsZC5sYWJlbH0gZmllbGRgIH0pO1xuICAgICAgICAgICAgICBmaWVsZEVsZW1lbnQubWFya0FzRGlydHkoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdmFsaWRFcnJvckZpZWxkRm91bmQgPSBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIWVycm9yUHJlc2VudCAmJiB0aGlzLnZhbGlkYXRpb25FcnJvcnMubGVuZ3RoID09PSB2YWxpZGF0aW9uRXJyb3JBbW91bnQpIHtcbiAgICAgICAgICAvLyBpZiBubyBlcnJvciBtZXNzYWdlcyBoYXZlIGJlZW4gYWRkZWQgaW4gaW50ZXJuYWwgZmllbGQgZGVzcGl0ZSBwYXJlbnQgZmllbGQgZmFpbGluZ1xuICAgICAgICAgIHRoaXMudmFsaWRhdGlvbkVycm9ycy5wdXNoKHsgaWQ6IGNhc2VmaWVsZC5pZCwgbWVzc2FnZTogYEEgZmllbGQgdGhhdCBpcyBjYXVzaW5nIGFuIGVycm9yIGlzICR7Y2FzZWZpZWxkLmlkfSBidXQgaXQgaXMgbm90IHByb2R1Y2luZyBhIHZhbGlkIGVycm9yIG1lc3NhZ2UuIFBsZWFzZSBlbnN1cmUgYWxsIGRldGFpbHMgYXJlIGNvcnJlY3RgIH0pO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICBpZiAoIXZhbGlkRXJyb3JGaWVsZEZvdW5kKSB7XG4gICAgICBwYXRoID8gdGhpcy52YWxpZGF0aW9uRXJyb3JzLnB1c2goeyBpZDogcGF0aCwgbWVzc2FnZTogYFRoZXJlIGlzIGFuIGludGVybmFsIGlzc3VlIHdpdGggJHtwYXRofSBmaWVsZHMuIFRoZSBmaWVsZCB0aGF0IGlzIGNhdXNpbmcgdGhlIGVycm9yIGNhbm5vdCBiZSBkZXRlcm1pbmVkIGJ1dCB0aGVyZSBpcyBhbiBlcnJvciBwcmVzZW50YCB9KVxuICAgICAgIDogdGhpcy52YWxpZGF0aW9uRXJyb3JzLnB1c2goeyBpZDogbnVsbCwgbWVzc2FnZTogYFRoZSBmaWVsZCB0aGF0IGlzIGNhdXNpbmcgdGhlIGVycm9yIGNhbm5vdCBiZSBkZXRlcm1pbmVkIGJ1dCB0aGVyZSBpcyBhbiBlcnJvciBwcmVzZW50YCB9KTtcbiAgICB9IGVsc2UgaWYgKHRoaXMudmFsaWRhdGlvbkVycm9ycy5sZW5ndGggPT09IHZhbGlkYXRpb25FcnJvckFtb3VudCkge1xuICAgICAgLy8gaWYgbm8gZXJyb3IgbWVzc2FnZXMgaGF2ZSBiZWVuIGdlbmVyYXRlZFxuICAgICAgaWYgKHBhdGgpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy52YWxpZGF0aW9uRXJyb3JzLnB1c2goeyBpZDogbnVsbCwgbWVzc2FnZTogYFRoZSBmaWVsZCB0aGF0IGlzIGNhdXNpbmcgdGhlIGVycm9yIGNhbm5vdCBiZSBkZXRlcm1pbmVkIGJ1dCB0aGVyZSBpcyBhbiBlcnJvciBwcmVzZW50LiBQbGVhc2UgZmlsbCBpbiBtb3JlIG9mIHRoZSBmb3JtYCB9KVxuICAgICAgfVxuICAgIH1cbiAgICBDYXNlRWRpdFBhZ2VDb21wb25lbnQuc2Nyb2xsVG9Ub3AoKTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIHB1YmxpYyBuYXZpZ2F0ZVRvRXJyb3JFbGVtZW50KGVsZW1lbnRJZDogc3RyaW5nKTogdm9pZCB7XG4gICAgLyogaXN0YW5idWwgaWdub3JlIGVsc2UgKi9cbiAgICBpZiAoZWxlbWVudElkKSB7XG4gICAgICBjb25zdCBodG1sRWxlbWVudCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGVsZW1lbnRJZCk7XG4gICAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgZWxzZSAqL1xuICAgICAgaWYgKGh0bWxFbGVtZW50KSB7XG4gICAgICAgIGh0bWxFbGVtZW50LnNjcm9sbEludG9WaWV3KHsgYmVoYXZpb3I6ICdzbW9vdGgnLCBibG9jazogJ2NlbnRlcicgfSk7XG4gICAgICAgIGh0bWxFbGVtZW50LmZvY3VzKCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHVibGljIHN1Ym1pdCgpOiB2b2lkIHtcbiAgICB0aGlzLmNhc2VFZGl0RGF0YVNlcnZpY2UuY2xlYXJGb3JtVmFsaWRhdGlvbkVycm9ycygpO1xuICAgIGNvbnNvbGUubG9nKCdQYWdlIHN1Ym1pdCBldmVudCBmaXJlZCEnKVxuICAgIGlmICh0aGlzLmN1cnJlbnRQYWdlSXNOb3RWYWxpZCgpKSB7XG4gICAgICAvLyBUaGUgZ2VuZXJhdGVFcnJvck1lc3NhZ2UgbWV0aG9kIGZpbHRlcnMgb3V0IHRoZSBoaWRkZW4gZmllbGRzLlxuICAgICAgLy8gVGhlIGVycm9yIG1lc3NhZ2UgZm9yIExpbmtlZENhc2VzIGpvdXJuZXkgd2lsbCBuZXZlciBnZXQgZGlzcGxheWVkIGJlY2F1c2UgdGhlXG4gICAgICAvLyBMaW5rZWRDYXNlcyBpcyBjb25maWd1cmVkIHdpdGggQ29tcG9uZW50TGF1bmNoZXIgZmllbGQgYXMgdmlzaWJsZSBhbmQgY2FzZUxpbmtzIGZpZWxkIGFzIGhpZGRlbi5cbiAgICAgIGlmICh0aGlzLmlzTGlua2VkQ2FzZXNKb3VybmV5KCkpIHtcbiAgICAgICAgdGhpcy52YWxpZGF0aW9uRXJyb3JzLnB1c2goeyBpZDogJ25leHQtYnV0dG9uJywgbWVzc2FnZTogJ1BsZWFzZSBzZWxlY3QgTmV4dCB0byBnbyB0byB0aGUgbmV4dCBwYWdlJyB9KTtcbiAgICAgICAgQ2FzZUVkaXRQYWdlQ29tcG9uZW50LnNjcm9sbFRvVG9wKCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLmdlbmVyYXRlRXJyb3JNZXNzYWdlKHRoaXMuZmFpbGluZ0Nhc2VGaWVsZHMpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmICghdGhpcy5jYXNlRWRpdC5pc1N1Ym1pdHRpbmcgJiYgIXRoaXMuY3VycmVudFBhZ2VJc05vdFZhbGlkKCkpIHtcbiAgICAgIHRoaXMuYWRkcmVzc1NlcnZpY2Uuc2V0TWFuZGF0b3J5RXJyb3IoZmFsc2UpO1xuICAgICAgY29uc29sZS5sb2coJ0Nhc2UgRWRpdCBFcnJvcicsIHRoaXMuY2FzZUVkaXQuZXJyb3IpO1xuICAgICAgaWYgKHRoaXMuY2FzZUVkaXQudmFsaWRQYWdlTGlzdC5maW5kSW5kZXgocGFnZT0+IHBhZ2UuaWQgPT09IHRoaXMuY3VycmVudFBhZ2UuaWQpID09PSAtMSkge1xuICAgICAgICB0aGlzLmNhc2VFZGl0LnZhbGlkUGFnZUxpc3QucHVzaCh0aGlzLmN1cnJlbnRQYWdlKTtcbiAgICAgIH1cbiAgICAgIHRoaXMuY2FzZUVkaXQuaXNTdWJtaXR0aW5nID0gdHJ1ZTtcbiAgICAgIHRoaXMuY2FzZUVkaXQuZXJyb3IgPSBudWxsO1xuICAgICAgY29uc3QgY2FzZUV2ZW50RGF0YTogQ2FzZUV2ZW50RGF0YSA9IHRoaXMuYnVpbGRDYXNlRXZlbnREYXRhKCk7XG4gICAgICBjb25zdCBsb2FkaW5nU3Bpbm5lclRva2VuID0gdGhpcy5sb2FkaW5nU2VydmljZS5yZWdpc3RlcigpO1xuICAgICAgdGhpcy52YWxpZGF0ZVN1YiA9IHRoaXMuY2FzZUVkaXQudmFsaWRhdGUoY2FzZUV2ZW50RGF0YSwgdGhpcy5jdXJyZW50UGFnZS5pZClcbiAgICAgICAgLnBpcGUoXG4gICAgICAgICAgZmluYWxpemUoKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5sb2FkaW5nU2VydmljZS51bnJlZ2lzdGVyKGxvYWRpbmdTcGlubmVyVG9rZW4pO1xuICAgICAgICAgIH0pXG4gICAgICAgIClcbiAgICAgICAgLnN1YnNjcmliZSgoanNvbkRhdGEpID0+IHtcbiAgICAgICAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgZWxzZSAqL1xuICAgICAgICAgIGlmIChqc29uRGF0YSkge1xuICAgICAgICAgICAgdGhpcy51cGRhdGVGb3JtRGF0YShqc29uRGF0YSBhcyBDYXNlRXZlbnREYXRhKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgdGhpcy5zYXZlRHJhZnQoKTtcbiAgICAgICAgICB0aGlzLm5leHQoKTtcbiAgICAgICAgfSwgZXJyb3IgPT4ge1xuICAgICAgICAgIHRoaXMuaGFuZGxlRXJyb3IoZXJyb3IpO1xuICAgICAgICB9KTtcbiAgICAgIENhc2VFZGl0UGFnZUNvbXBvbmVudC5zY3JvbGxUb1RvcCgpO1xuICAgICAgLy8gUmVtb3ZlIGFsbCBKdWRpY2lhbFVzZXIgRm9ybUNvbnRyb2xzIHdpdGggdGhlIElEIHN1ZmZpeCBcIl9qdWRpY2lhbFVzZXJDb250cm9sXCIgYmVjYXVzZSB0aGVzZSBhcmUgbm90XG4gICAgICAvLyBpbnRlbmRlZCB0byBiZSBwcmVzZW50IGluIHRoZSBDYXNlIEV2ZW50IGRhdGEgKHRoZXkgYXJlIGFkZGVkIG9ubHkgZm9yIHZhbHVlIHNlbGVjdGlvbiBhbmQgdmFsaWRhdGlvblxuICAgICAgLy8gcHVycG9zZXMpXG4gICAgICB0aGlzLnJlbW92ZUFsbEp1ZGljaWFsVXNlckZvcm1Db250cm9scyh0aGlzLmN1cnJlbnRQYWdlLCB0aGlzLmVkaXRGb3JtKTtcbiAgICB9XG4gICAgQ2FzZUVkaXRQYWdlQ29tcG9uZW50LnNldEZvY3VzVG9Ub3AoKTtcbiAgfVxuXG4gIHB1YmxpYyB1cGRhdGVGb3JtRGF0YShqc29uRGF0YTogQ2FzZUV2ZW50RGF0YSk6IHZvaWQge1xuICAgIGZvciAoY29uc3QgY2FzZUZpZWxkSWQgb2YgT2JqZWN0LmtleXMoanNvbkRhdGEuZGF0YSkpIHtcbiAgICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBlbHNlICovXG4gICAgICBpZiAodGhpcy5wYWdlV2l0aEZpZWxkRXhpc3RzKGNhc2VGaWVsZElkKSkge1xuICAgICAgICB0aGlzLnVwZGF0ZUV2ZW50VHJpZ2dlckNhc2VGaWVsZHMoY2FzZUZpZWxkSWQsIGpzb25EYXRhLCB0aGlzLmNhc2VFZGl0LmV2ZW50VHJpZ2dlcik7XG4gICAgICAgIHRoaXMudXBkYXRlRm9ybUNvbnRyb2xzVmFsdWUodGhpcy5lZGl0Rm9ybSwgY2FzZUZpZWxkSWQsIGpzb25EYXRhLmRhdGFbY2FzZUZpZWxkSWRdKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvLyB3ZSBkbyB0aGUgY2hlY2ssIGJlY2FzdWUgdGhlIGRhdGEgY29tZXMgZnJvbSB0aGUgZXh0ZXJuYWwgc291cmNlXG4gIHB1YmxpYyBwYWdlV2l0aEZpZWxkRXhpc3RzKGNhc2VGaWVsZElkOiBzdHJpbmcpIHtcbiAgICByZXR1cm4gdGhpcy53aXphcmQuZmluZFdpemFyZFBhZ2UoY2FzZUZpZWxkSWQpO1xuICB9XG5cbiAgcHVibGljIHVwZGF0ZUV2ZW50VHJpZ2dlckNhc2VGaWVsZHMoY2FzZUZpZWxkSWQ6IHN0cmluZywganNvbkRhdGE6IENhc2VFdmVudERhdGEsIGV2ZW50VHJpZ2dlcjogQ2FzZUV2ZW50VHJpZ2dlcikge1xuICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBlbHNlICovXG4gICAgaWYgKGV2ZW50VHJpZ2dlcj8uY2FzZV9maWVsZHMpIHtcbiAgICAgIGV2ZW50VHJpZ2dlci5jYXNlX2ZpZWxkc1xuICAgICAgICAuZmlsdGVyKGVsZW1lbnQgPT4gZWxlbWVudC5pZCA9PT0gY2FzZUZpZWxkSWQpXG4gICAgICAgIC5mb3JFYWNoKGVsZW1lbnQgPT4ge1xuICAgICAgICAgIGlmICh0aGlzLmlzQW5PYmplY3QoZWxlbWVudC52YWx1ZSkpIHtcbiAgICAgICAgICAgIGNvbnN0IHVwZGF0ZWRKc29uRGF0YU9iamVjdCA9IHRoaXMudXBkYXRlSnNvbkRhdGFPYmplY3QoY2FzZUZpZWxkSWQsIGpzb25EYXRhLCBlbGVtZW50KTtcblxuICAgICAgICAgICAgZWxlbWVudC52YWx1ZSA9IHtcbiAgICAgICAgICAgICAgLi4uZWxlbWVudC52YWx1ZSxcbiAgICAgICAgICAgICAgLi4udXBkYXRlZEpzb25EYXRhT2JqZWN0LFxuICAgICAgICAgICAgfTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgZWxlbWVudC52YWx1ZSA9IGpzb25EYXRhLmRhdGFbY2FzZUZpZWxkSWRdO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSB1cGRhdGVKc29uRGF0YU9iamVjdChjYXNlRmllbGRJZDogc3RyaW5nLCBqc29uRGF0YTogQ2FzZUV2ZW50RGF0YSwgZWxlbWVudDogQ2FzZUZpZWxkKTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4ge1xuICAgIHJldHVybiBPYmplY3Qua2V5cyhqc29uRGF0YS5kYXRhW2Nhc2VGaWVsZElkXSkucmVkdWNlKChhY2MsIGtleSkgPT4ge1xuICAgICAgY29uc3QgZWxlbWVudFZhbHVlID0gZWxlbWVudC52YWx1ZVtrZXldO1xuICAgICAgY29uc3QganNvbkRhdGFWYWx1ZSA9IGpzb25EYXRhLmRhdGFbY2FzZUZpZWxkSWRdW2tleV07XG4gICAgICBjb25zdCBoYXNFbGVtZW50R290VmFsdWVQcm9wZXJ0eSA9IHRoaXMuaXNBbk9iamVjdChlbGVtZW50VmFsdWUpICYmIGVsZW1lbnRWYWx1ZS52YWx1ZSAhPT0gdW5kZWZpbmVkO1xuICAgICAgY29uc3QganNvbkRhdGFPckVsZW1lbnRWYWx1ZSA9IGpzb25EYXRhVmFsdWU/LnZhbHVlICE9PSBudWxsICYmIGpzb25EYXRhVmFsdWU/LnZhbHVlICE9PSB1bmRlZmluZWQgPyBqc29uRGF0YVZhbHVlIDogZWxlbWVudFZhbHVlO1xuXG4gICAgICByZXR1cm4ge1xuICAgICAgICAuLi5hY2MsXG4gICAgICAgIFtgJHtrZXl9YF06IGhhc0VsZW1lbnRHb3RWYWx1ZVByb3BlcnR5ID8ganNvbkRhdGFPckVsZW1lbnRWYWx1ZSA6IGpzb25EYXRhVmFsdWVcbiAgICAgIH07XG4gICAgfSwge30pO1xuICB9XG5cbiAgcHJpdmF0ZSBpc0FuT2JqZWN0KHByb3BlcnR5OiB1bmtub3duKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHR5cGVvZiBwcm9wZXJ0eSA9PT0gJ29iamVjdCcgJiYgIUFycmF5LmlzQXJyYXkocHJvcGVydHkpICYmIHByb3BlcnR5ICE9PSBudWxsO1xuICB9XG5cbiAgcHVibGljIHVwZGF0ZUZvcm1Db250cm9sc1ZhbHVlKGZvcm1Hcm91cDogRm9ybUdyb3VwLCBjYXNlRmllbGRJZDogc3RyaW5nLCB2YWx1ZTogYW55KTogdm9pZCB7XG4gICAgY29uc3QgdGhlQ29udHJvbCA9IGZvcm1Hcm91cC5jb250cm9sc1snZGF0YSddLmdldChjYXNlRmllbGRJZCk7XG4gICAgaWYgKHRoZUNvbnRyb2wgJiYgdGhlQ29udHJvbFsnc3RhdHVzJ10gIT09ICdESVNBQkxFRCcpIHtcbiAgICAgIGlmIChBcnJheS5pc0FycmF5KHRoZUNvbnRyb2wudmFsdWUpICYmIEFycmF5LmlzQXJyYXkodmFsdWUpXG4gICAgICAgICYmIHRoZUNvbnRyb2wudmFsdWUubGVuZ3RoID4gdmFsdWUubGVuZ3RoICYmIHRoZUNvbnRyb2xbJ2Nhc2VGaWVsZCddXG4gICAgICAgICYmIHRoZUNvbnRyb2xbJ2Nhc2VGaWVsZCddWydkaXNwbGF5X2NvbnRleHQnXSAmJiB0aGVDb250cm9sWydjYXNlRmllbGQnXVsnZGlzcGxheV9jb250ZXh0J10gPT09ICdPUFRJT05BTCdcbiAgICAgICAgJiYgdGhlQ29udHJvbFsnY2FzZUZpZWxkJ11bJ2ZpZWxkX3R5cGUnXSAmJiB0aGVDb250cm9sWydjYXNlRmllbGQnXVsnZmllbGRfdHlwZSddWyd0eXBlJ10gPT09ICdDb2xsZWN0aW9uJykge1xuICAgICAgICAvLyBkbyBub3RoaW5nXG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGVDb250cm9sLnBhdGNoVmFsdWUodmFsdWUpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBjYWxsYmFja0Vycm9yc05vdGlmeShlcnJvckNvbnRleHQ6IENhbGxiYWNrRXJyb3JzQ29udGV4dCkge1xuICAgIHRoaXMuY2FzZUVkaXQuaWdub3JlV2FybmluZyA9IGVycm9yQ29udGV4dC5pZ25vcmVXYXJuaW5nO1xuICAgIHRoaXMudHJpZ2dlclRleHQgPSBlcnJvckNvbnRleHQudHJpZ2dlclRleHQ7XG4gIH1cblxuICBwdWJsaWMgbmV4dCgpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICBpZiAodGhpcy5jYW5OYXZpZ2F0ZVRvU3VtbWFyeVBhZ2UoKSkge1xuICAgICAgdGhpcy5jYXNlRWRpdC5pc1N1Ym1pdHRpbmcgPSBmYWxzZTtcbiAgICB9XG4gICAgdGhpcy5yZXNldEVycm9ycygpO1xuICAgIHRoaXMuZm9ybVZhbHVlc0NoYW5nZWQgPSBmYWxzZTtcbiAgICB0aGlzLnBhZ2VDaGFuZ2VTdWJqZWN0Lm5leHQodHJ1ZSk7XG4gICAgcmV0dXJuIHRoaXMuY2FzZUVkaXQubmV4dCh0aGlzLmN1cnJlbnRQYWdlLmlkKTtcbiAgfVxuXG4gIHB1YmxpYyBwcmV2aW91cygpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICB0aGlzLnJlc2V0RXJyb3JzKCk7XG4gICAgdGhpcy5zYXZlRHJhZnQoKTtcbiAgICB0aGlzLmZvcm1WYWx1ZXNDaGFuZ2VkID0gZmFsc2U7XG4gICAgdGhpcy5wYWdlQ2hhbmdlU3ViamVjdC5uZXh0KHRydWUpO1xuICAgIHJldHVybiB0aGlzLmNhc2VFZGl0LnByZXZpb3VzKHRoaXMuY3VycmVudFBhZ2UuaWQpO1xuICB9XG5cbiAgcHVibGljIGhhc1ByZXZpb3VzKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmNhc2VFZGl0Lmhhc1ByZXZpb3VzKHRoaXMuY3VycmVudFBhZ2UuaWQpO1xuICB9XG5cbiAgcHVibGljIGNhbmNlbCgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5ldmVudFRyaWdnZXIuY2FuX3NhdmVfZHJhZnQpIHtcbiAgICAgIGlmICh0aGlzLmZvcm1WYWx1ZXNDaGFuZ2VkKSB7XG4gICAgICAgIGNvbnN0IGRpYWxvZ1JlZiA9IHRoaXMuZGlhbG9nLm9wZW4oU2F2ZU9yRGlzY2FyZERpYWxvZ0NvbXBvbmVudCwgdGhpcy5kaWFsb2dDb25maWcpO1xuICAgICAgICB0aGlzLmRpYWxvZ1JlZkFmdGVyQ2xvc2VkU3ViID0gZGlhbG9nUmVmLmFmdGVyQ2xvc2VkKCkuc3Vic2NyaWJlKHJlc3VsdCA9PiB7XG4gICAgICAgICAgaWYgKHJlc3VsdCA9PT0gJ0Rpc2NhcmQnKSB7XG4gICAgICAgICAgICB0aGlzLmRpc2NhcmQoKTtcbiAgICAgICAgICB9IGVsc2UgaWYgKHJlc3VsdCA9PT0gJ1NhdmUnKSB7XG4gICAgICAgICAgICBjb25zdCBkcmFmdENhc2VFdmVudERhdGE6IENhc2VFdmVudERhdGEgPSB0aGlzLmZvcm1WYWx1ZVNlcnZpY2Uuc2FuaXRpc2UodGhpcy5lZGl0Rm9ybS52YWx1ZSkgYXMgQ2FzZUV2ZW50RGF0YTtcbiAgICAgICAgICAgIGlmICh0aGlzLnJvdXRlLnNuYXBzaG90LnF1ZXJ5UGFyYW1NYXAuZ2V0KENhc2VFZGl0Q29tcG9uZW50Lk9SSUdJTl9RVUVSWV9QQVJBTSkgPT09ICd2aWV3RHJhZnQnKSB7XG4gICAgICAgICAgICAgIHRoaXMuY2FzZUVkaXQuY2FuY2VsbGVkLmVtaXQoeyBzdGF0dXM6IENhc2VFZGl0UGFnZUNvbXBvbmVudC5SRVNVTUVEX0ZPUk1fU0FWRSwgZGF0YTogZHJhZnRDYXNlRXZlbnREYXRhIH0pO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgdGhpcy5jYXNlRWRpdC5jYW5jZWxsZWQuZW1pdCh7IHN0YXR1czogQ2FzZUVkaXRQYWdlQ29tcG9uZW50Lk5FV19GT1JNX1NBVkUsIGRhdGE6IGRyYWZ0Q2FzZUV2ZW50RGF0YSB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5kaXNjYXJkKCk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuY2FzZUVkaXQuY2FuY2VsbGVkLmVtaXQoKTtcbiAgICB9XG5cbiAgICB0aGlzLmNhc2VFZGl0RGF0YVNlcnZpY2UuY2xlYXJGb3JtVmFsaWRhdGlvbkVycm9ycygpO1xuICB9XG5cbiAgcHVibGljIHN1Ym1pdHRpbmcoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuY2FzZUVkaXQuaXNTdWJtaXR0aW5nO1xuICB9XG5cbiAgcHVibGljIGdldENhc2VJZCgpOiBzdHJpbmcge1xuICAgIHJldHVybiAodGhpcy5jYXNlRWRpdC5jYXNlRGV0YWlscyA/IHRoaXMuY2FzZUVkaXQuY2FzZURldGFpbHMuY2FzZV9pZCA6ICcnKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRDYXNlVGl0bGUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gKHRoaXMuY2FzZUVkaXQuY2FzZURldGFpbHMgJiYgdGhpcy5jYXNlRWRpdC5jYXNlRGV0YWlscy5zdGF0ZSAmJlxuICAgICAgdGhpcy5jYXNlRWRpdC5jYXNlRGV0YWlscy5zdGF0ZS50aXRsZV9kaXNwbGF5ID8gdGhpcy5jYXNlRWRpdC5jYXNlRGV0YWlscy5zdGF0ZS50aXRsZV9kaXNwbGF5IDogJycpO1xuICB9XG5cbiAgcHVibGljIGdldENhbmNlbFRleHQoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5ldmVudFRyaWdnZXIuY2FuX3NhdmVfZHJhZnQgPyAnUmV0dXJuIHRvIGNhc2UgbGlzdCcgOiAnQ2FuY2VsJztcbiAgfVxuXG4gIHByaXZhdGUgY2FuTmF2aWdhdGVUb1N1bW1hcnlQYWdlKCk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IG5leHRQYWdlID0gdGhpcy5jYXNlRWRpdC5nZXROZXh0UGFnZSh7XG4gICAgICBjdXJyZW50UGFnZUlkOiB0aGlzLmN1cnJlbnRQYWdlPy5pZCxcbiAgICAgIHdpemFyZDogdGhpcy53aXphcmQsXG4gICAgICBldmVudFRyaWdnZXI6IHRoaXMuZXZlbnRUcmlnZ2VyLFxuICAgICAgZm9ybTogdGhpcy5lZGl0Rm9ybVxuICAgIH0pO1xuXG4gICAgcmV0dXJuIHRoaXMuZXZlbnRUcmlnZ2VyLnNob3dfc3VtbWFyeSB8fCAhIW5leHRQYWdlO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRUcmlnZ2VyVGV4dCgpOiBzdHJpbmcge1xuICAgIGNvbnN0IHRleHRCYXNlZE9uQ2FuU2F2ZURyYWZ0ID0gdGhpcy5ldmVudFRyaWdnZXIgJiYgdGhpcy5ldmVudFRyaWdnZXIuY2FuX3NhdmVfZHJhZnRcbiAgICAgID8gQ2FzZUVkaXRQYWdlQ29tcG9uZW50LlRSSUdHRVJfVEVYVF9TQVZFXG4gICAgICA6IENhc2VFZGl0UGFnZUNvbXBvbmVudC5UUklHR0VSX1RFWFRfU1RBUlQ7XG5cbiAgICByZXR1cm4gdGhpcy5jYW5OYXZpZ2F0ZVRvU3VtbWFyeVBhZ2UoKVxuICAgICAgPyB0ZXh0QmFzZWRPbkNhblNhdmVEcmFmdFxuICAgICAgOiAnU3VibWl0JztcbiAgfVxuXG4gIHByaXZhdGUgZGlzY2FyZCgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5yb3V0ZS5zbmFwc2hvdC5xdWVyeVBhcmFtTWFwLmdldChDYXNlRWRpdENvbXBvbmVudC5PUklHSU5fUVVFUllfUEFSQU0pID09PSAndmlld0RyYWZ0Jykge1xuICAgICAgdGhpcy5jYXNlRWRpdC5jYW5jZWxsZWQuZW1pdCh7IHN0YXR1czogQ2FzZUVkaXRQYWdlQ29tcG9uZW50LlJFU1VNRURfRk9STV9ESVNDQVJEIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmNhc2VFZGl0LmNhbmNlbGxlZC5lbWl0KHsgc3RhdHVzOiBDYXNlRWRpdFBhZ2VDb21wb25lbnQuTkVXX0ZPUk1fRElTQ0FSRCB9KTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGhhbmRsZUVycm9yKGVycm9yKSB7XG4gICAgdGhpcy5jYXNlRWRpdC5pc1N1Ym1pdHRpbmcgPSBmYWxzZTtcbiAgICB0aGlzLmNhc2VFZGl0LmVycm9yID0gZXJyb3I7XG4gICAgdGhpcy5jYXNlRWRpdC5jYWxsYmFja0Vycm9yc1N1YmplY3QubmV4dCh0aGlzLmNhc2VFZGl0LmVycm9yKTtcbiAgICB0aGlzLmNhbGxiYWNrRXJyb3JzU3ViamVjdC5uZXh0KHRoaXMuY2FzZUVkaXQuZXJyb3IpO1xuICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBlbHNlICovXG4gICAgaWYgKHRoaXMuY2FzZUVkaXQuZXJyb3IuZGV0YWlscykge1xuICAgICAgdGhpcy5mb3JtRXJyb3JTZXJ2aWNlXG4gICAgICAgIC5tYXBGaWVsZEVycm9ycyh0aGlzLmNhc2VFZGl0LmVycm9yLmRldGFpbHMuZmllbGRfZXJyb3JzLCB0aGlzLmVkaXRGb3JtPy5jb250cm9scz8uWydkYXRhJ10gYXMgRm9ybUdyb3VwLCAndmFsaWRhdGlvbicpO1xuICAgIH1cbiAgICBjb25zb2xlLmxvZygnaGFuZGxlRXJyb3IgJywgZXJyb3IpO1xuICB9XG5cbiAgcHJpdmF0ZSByZXNldEVycm9ycygpOiB2b2lkIHtcbiAgICB0aGlzLmNhc2VFZGl0LmVycm9yID0gbnVsbDtcbiAgICB0aGlzLmNhc2VFZGl0Lmlnbm9yZVdhcm5pbmcgPSBmYWxzZTtcbiAgICB0aGlzLnRyaWdnZXJUZXh0ID0gdGhpcy5nZXRUcmlnZ2VyVGV4dCgpO1xuICAgIHRoaXMuY2FzZUVkaXQuY2FsbGJhY2tFcnJvcnNTdWJqZWN0Lm5leHQobnVsbCk7XG4gIH1cblxuICBwcml2YXRlIHNhdmVEcmFmdCgpIHtcbiAgICBpZiAodGhpcy5ldmVudFRyaWdnZXIuY2FuX3NhdmVfZHJhZnQpIHtcbiAgICAgIGNvbnN0IGRyYWZ0Q2FzZUV2ZW50RGF0YTogQ2FzZUV2ZW50RGF0YSA9IHRoaXMuZm9ybVZhbHVlU2VydmljZS5zYW5pdGlzZSh0aGlzLmVkaXRGb3JtLnZhbHVlKSBhcyBDYXNlRXZlbnREYXRhO1xuICAgICAgZHJhZnRDYXNlRXZlbnREYXRhLmV2ZW50X3Rva2VuID0gdGhpcy5ldmVudFRyaWdnZXIuZXZlbnRfdG9rZW47XG4gICAgICBkcmFmdENhc2VFdmVudERhdGEuaWdub3JlX3dhcm5pbmcgPSB0aGlzLmNhc2VFZGl0Lmlnbm9yZVdhcm5pbmc7XG4gICAgICB0aGlzLnNhdmVEcmFmdFN1YiA9IHRoaXMuY2FzZUVkaXQuc2F2ZURyYWZ0KGRyYWZ0Q2FzZUV2ZW50RGF0YSkuc3Vic2NyaWJlKFxuICAgICAgICAoZHJhZnQpID0+IHRoaXMuZXZlbnRUcmlnZ2VyLmNhc2VfaWQgPSBEUkFGVF9QUkVGSVggKyBkcmFmdC5pZCwgZXJyb3IgPT4gdGhpcy5oYW5kbGVFcnJvcihlcnJvcilcbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBnZXRDYXNlRmllbGRzKCk6IENhc2VGaWVsZFtdIHtcbiAgICBpZiAodGhpcy5jYXNlRWRpdC5jYXNlRGV0YWlscykge1xuICAgICAgcmV0dXJuIEZpZWxkc1V0aWxzLmdldENhc2VGaWVsZHModGhpcy5jYXNlRWRpdC5jYXNlRGV0YWlscyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuZXZlbnRUcmlnZ2VyLmNhc2VfZmllbGRzO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRDYXNlRmllbGRzRnJvbUN1cnJlbnRBbmRQcmV2aW91c1BhZ2VzKCk6IENhc2VGaWVsZFtdIHtcbiAgICBjb25zdCByZXN1bHQ6IENhc2VGaWVsZFtdID0gW107XG4gICAgdGhpcy53aXphcmQucGFnZXMuZm9yRWFjaChwYWdlID0+IHtcbiAgICAgIGlmIChwYWdlLm9yZGVyIDw9IHRoaXMuY3VycmVudFBhZ2Uub3JkZXIpIHtcbiAgICAgICAgcGFnZS5jYXNlX2ZpZWxkcy5mb3JFYWNoKGZpZWxkID0+IHJlc3VsdC5wdXNoKGZpZWxkKSk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIHB1YmxpYyBidWlsZENhc2VFdmVudERhdGEoZnJvbVByZXZpb3VzUGFnZT86IGJvb2xlYW4pOiBDYXNlRXZlbnREYXRhIHtcbiAgICBjb25zdCBmb3JtVmFsdWU6IG9iamVjdCA9IHRoaXMuZWRpdEZvcm0udmFsdWU7XG5cbiAgICAvLyBHZXQgdGhlIENhc2VFdmVudERhdGEgZm9yIHRoZSBjdXJyZW50IHBhZ2UuXG4gICAgY29uc3QgcGFnZUZpZWxkczogQ2FzZUZpZWxkW10gPSB0aGlzLmN1cnJlbnRQYWdlLmNhc2VfZmllbGRzO1xuICAgIGNvbnN0IHBhZ2VFdmVudERhdGE6IENhc2VFdmVudERhdGEgPSB0aGlzLmdldEZpbHRlcmVkQ2FzZUV2ZW50RGF0YShwYWdlRmllbGRzLCBmb3JtVmFsdWUsIHRydWUpO1xuXG4gICAgLy8gR2V0IHRoZSBDYXNlRXZlbnREYXRhIGZvciB0aGUgZW50aXJlIGZvcm0gKGFsbCBwYWdlcykuXG4gICAgY29uc3QgYWxsQ2FzZUZpZWxkcyA9IHRoaXMuZ2V0Q2FzZUZpZWxkc0Zyb21DdXJyZW50QW5kUHJldmlvdXNQYWdlcygpO1xuICAgIGNvbnN0IGZvcm1FdmVudERhdGE6IENhc2VFdmVudERhdGEgPSB0aGlzLmdldEZpbHRlcmVkQ2FzZUV2ZW50RGF0YShhbGxDYXNlRmllbGRzLCBmb3JtVmFsdWUsIGZhbHNlLCB0cnVlLCBmcm9tUHJldmlvdXNQYWdlKTtcblxuICAgIC8vIE5vdyBoZXJlJ3MgdGhlIGtleSB0aGluZyAtIHRoZSBwYWdlRXZlbnREYXRhIGhhcyBhIHByb3BlcnR5IGNhbGxlZCBgZXZlbnRfZGF0YWAgYW5kXG4gICAgLy8gd2UgbmVlZCBUSEFUIHRvIGJlIHRoZSB2YWx1ZSBvZiB0aGUgZW50aXJlIGZvcm06IGBmb3JtRXZlbnREYXRhLmRhdGFgLlxuICAgIHBhZ2VFdmVudERhdGEuZXZlbnRfZGF0YSA9IGZvcm1FdmVudERhdGEuZGF0YTtcblxuICAgIC8vIEZpbmFsaXNlIHRoZSBDYXNlRXZlbnREYXRhIG9iamVjdC5cbiAgICBwYWdlRXZlbnREYXRhLmV2ZW50X3Rva2VuID0gdGhpcy5ldmVudFRyaWdnZXIuZXZlbnRfdG9rZW47XG4gICAgcGFnZUV2ZW50RGF0YS5pZ25vcmVfd2FybmluZyA9IHRoaXMuY2FzZUVkaXQuaWdub3JlV2FybmluZztcblxuICAgIC8vIEZpbmFsbHksIHRyeSB0byBzZXQgdXAgdGhlIGNhc2VfcmVmZXJlbmNlLlxuICAgIGlmICh0aGlzLmNhc2VFZGl0LmNhc2VEZXRhaWxzKSB7XG4gICAgICBwYWdlRXZlbnREYXRhLmNhc2VfcmVmZXJlbmNlID0gdGhpcy5jYXNlRWRpdC5jYXNlRGV0YWlscy5jYXNlX2lkO1xuICAgIH1cblxuICAgIC8vIFJldHVybiB0aGUgbm93IGhvcGVmdWxseSBzYW5lIENhc2VFdmVudERhdGEuXG4gICAgcmV0dXJuIHBhZ2VFdmVudERhdGE7XG4gIH1cblxuICAvKipcbiAgICogQWJzdHJhY3RlZCB0aGlzIG1ldGhvZCBmcm9tIGJ1aWxkQ2FzZUV2ZW50RGF0YSB0byByZW1vdmUgZHVwbGljYXRpb24uXG4gICAqIEBwYXJhbSBjYXNlRmllbGRzIFRoZSBmaWVsZHMgdG8gZmlsdGVyIHRoZSBkYXRhIGJ5LlxuICAgKiBAcGFyYW0gZm9ybVZhbHVlIFRoZSBvcmlnaW5hbCB2YWx1ZSBvZiB0aGUgZm9ybS5cbiAgICogQHBhcmFtIGNsZWFyRW1wdHkgV2hldGhlciBvciBub3QgdG8gY2xlYXIgb3V0IGVtcHR5IHZhbHVlcy5cbiAgICogQHBhcmFtIGNsZWFyTm9uQ2FzZSBXaGV0aGVyIG9yIG5vdCB0byBjbGVhciBvdXQgZmllbGRzIHRoYXQgYXJlIG5vdCBwYXJ0IG9mIHRoZSBjYXNlLlxuICAgKiBAcmV0dXJucyBDYXNlRXZlbnREYXRhIGZvciB0aGUgc3BlY2lmaWVkIHBhcmFtZXRlcnMuXG4gICAqL1xuICBwcml2YXRlIGdldEZpbHRlcmVkQ2FzZUV2ZW50RGF0YShjYXNlRmllbGRzOiBDYXNlRmllbGRbXSwgZm9ybVZhbHVlOiBvYmplY3QsIGNsZWFyRW1wdHkgPSBmYWxzZSxcbiAgICBjbGVhck5vbkNhc2UgPSBmYWxzZSwgZnJvbVByZXZpb3VzUGFnZSA9IGZhbHNlKTogQ2FzZUV2ZW50RGF0YSB7XG4gICAgLy8gR2V0IHRoZSBkYXRhIGZvciB0aGUgZmllbGRzIHNwZWNpZmllZC5cbiAgICBjb25zdCBmb3JtRmllbGRzID0gdGhpcy5mb3JtVmFsdWVTZXJ2aWNlLmZpbHRlckN1cnJlbnRQYWdlRmllbGRzKGNhc2VGaWVsZHMsIGZvcm1WYWx1ZSk7XG5cbiAgICAvLyBTb3J0IG91dCB0aGUgZHluYW1pYyBsaXN0cy5cbiAgICB0aGlzLmZvcm1WYWx1ZVNlcnZpY2Uuc2FuaXRpc2VEeW5hbWljTGlzdHMoY2FzZUZpZWxkcywgZm9ybUZpZWxkcyk7XG5cbiAgICAvLyBHZXQgaG9sZCBvZiB0aGUgQ2FzZUV2ZW50RGF0YS5cbiAgICBjb25zdCBjYXNlRXZlbnREYXRhOiBDYXNlRXZlbnREYXRhID0gdGhpcy5mb3JtVmFsdWVTZXJ2aWNlLnNhbml0aXNlKGZvcm1GaWVsZHMpIGFzIENhc2VFdmVudERhdGE7XG5cbiAgICAvLyBkZWxldGUgZmllbGRzIHdoaWNoIGFyZSBub3QgcGFydCBvZiB0aGUgY2FzZSBldmVudCBqb3VybmV5IHdpemFyZCBwYWdlcyBjYXNlIGZpZWxkc1xuICAgIHRoaXMudmFsaWRQYWdlTGlzdENhc2VGaWVsZHNTZXJ2aWNlLmRlbGV0ZU5vblZhbGlkYXRlZEZpZWxkcyh0aGlzLmNhc2VFZGl0LnZhbGlkUGFnZUxpc3QsIGNhc2VFdmVudERhdGEuZGF0YSwgdGhpcy5ldmVudFRyaWdnZXIuY2FzZV9maWVsZHMsIGZyb21QcmV2aW91c1BhZ2UsIHRoaXMuZWRpdEZvcm0uY29udHJvbHNbJ2RhdGEnXS52YWx1ZSk7XG5cbiAgICAvLyBUaWR5IGl0IHVwIGJlZm9yZSB3ZSByZXR1cm4gaXQuXG4gICAgdGhpcy5mb3JtVmFsdWVTZXJ2aWNlLnJlbW92ZVVubmVjZXNzYXJ5RmllbGRzKGNhc2VFdmVudERhdGEuZGF0YSwgY2FzZUZpZWxkcywgY2xlYXJFbXB0eSwgY2xlYXJOb25DYXNlLFxuICAgICAgZnJvbVByZXZpb3VzUGFnZSwgdGhpcy5jdXJyZW50UGFnZS5jYXNlX2ZpZWxkcyk7XG5cbiAgICByZXR1cm4gY2FzZUV2ZW50RGF0YTtcbiAgfVxuXG4gIHByaXZhdGUgc3luY0Nhc2VFZGl0RGF0YVNlcnZpY2UoKTogdm9pZCB7XG4gICAgdGhpcy5jYXNlRWRpdERhdGFTZXJ2aWNlLnNldENhc2VEZXRhaWxzKHRoaXMuY2FzZUVkaXQuY2FzZURldGFpbHMpO1xuICAgIHRoaXMuY2FzZUVkaXREYXRhU2VydmljZS5zZXRDYXNlRXZlbnRUcmlnZ2VyTmFtZSh0aGlzLmV2ZW50VHJpZ2dlci5uYW1lKTtcbiAgICB0aGlzLmNhc2VFZGl0RGF0YVNlcnZpY2Uuc2V0Q2FzZVRpdGxlKHRoaXMuZ2V0Q2FzZVRpdGxlKCkpO1xuICAgIHRoaXMuY2FzZUVkaXREYXRhU2VydmljZS5zZXRDYXNlRWRpdEZvcm0odGhpcy5lZGl0Rm9ybSk7XG4gICAgdGhpcy5jYXNlRm9ybVZhbGlkYXRpb25FcnJvcnNTdWIgPSB0aGlzLmNhc2VFZGl0RGF0YVNlcnZpY2UuY2FzZUZvcm1WYWxpZGF0aW9uRXJyb3JzJC5zdWJzY3JpYmUoe1xuICAgICAgbmV4dDogKHZhbGlkYXRpb25FcnJvcnMpID0+IHRoaXMudmFsaWRhdGlvbkVycm9ycyA9IHZhbGlkYXRpb25FcnJvcnNcbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRScHhUcmFuc2xhdGVQaXBlQXJncyhmaWVsZExhYmVsOiBzdHJpbmcpOiB7IEZJRUxETEFCRUw6IHN0cmluZyB9IHwgbnVsbCB7XG4gICAgcmV0dXJuIGZpZWxkTGFiZWwgPyAoeyBGSUVMRExBQkVMOiBmaWVsZExhYmVsIH0pIDogbnVsbDtcbiAgfVxuXG4gIHB1YmxpYyBvbkV2ZW50Q2FuQmVDb21wbGV0ZWQoZXZlbnRDYW5CZUNvbXBsZXRlZDogYm9vbGVhbik6IHZvaWQge1xuICAgIHRoaXMuY2FzZUVkaXQub25FdmVudENhbkJlQ29tcGxldGVkKHtcbiAgICAgIGV2ZW50VHJpZ2dlcjogdGhpcy5ldmVudFRyaWdnZXIsXG4gICAgICBldmVudENhbkJlQ29tcGxldGVkLFxuICAgICAgY2FzZURldGFpbHM6IHRoaXMuY2FzZUVkaXQuY2FzZURldGFpbHMsXG4gICAgICBmb3JtOiB0aGlzLmVkaXRGb3JtLFxuICAgICAgc3VibWl0OiB0aGlzLmNhc2VFZGl0LnN1Ym1pdCxcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgcmVtb3ZlQWxsSnVkaWNpYWxVc2VyRm9ybUNvbnRyb2xzKHBhZ2U6IFdpemFyZFBhZ2UsIGVkaXRGb3JtOiBGb3JtR3JvdXApOiB2b2lkIHtcbiAgICBwYWdlLmNhc2VfZmllbGRzLmZvckVhY2goY2FzZUZpZWxkID0+IHtcbiAgICAgIGlmIChGaWVsZHNVdGlscy5pc0Nhc2VGaWVsZE9mVHlwZShjYXNlRmllbGQsIFsnSnVkaWNpYWxVc2VyJ10pKSB7XG4gICAgICAgIChlZGl0Rm9ybS5jb250cm9sc1snZGF0YSddIGFzIEZvcm1Hcm91cCkucmVtb3ZlQ29udHJvbChgJHtjYXNlRmllbGQuaWR9X2p1ZGljaWFsVXNlckNvbnRyb2xgKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxufVxuIiwiPG5nLWNvbnRhaW5lciAqbmdJZj1cImN1cnJlbnRQYWdlXCI+XG4gIDxoMSAqbmdJZj1cIiFjdXJyZW50UGFnZS5sYWJlbFwiIGNsYXNzPVwiZ292dWstaGVhZGluZy1sXCI+e3tldmVudFRyaWdnZXIubmFtZSB8IHJweFRyYW5zbGF0ZX19PC9oMT5cbiAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImN1cnJlbnRQYWdlLmxhYmVsXCI+XG4gICAgPHNwYW4gY2xhc3M9XCJnb3Z1ay1jYXB0aW9uLWxcIj57eyBldmVudFRyaWdnZXIubmFtZSB8IHJweFRyYW5zbGF0ZX19PC9zcGFuPlxuICAgIDxoMSBjbGFzcz1cImdvdnVrLWhlYWRpbmctbFwiPnt7Y3VycmVudFBhZ2UubGFiZWwgfCBycHhUcmFuc2xhdGV9fTwvaDE+XG4gIDwvbmctY29udGFpbmVyPlxuPC9uZy1jb250YWluZXI+XG5cbjwhLS1DYXNlIElEIG9yIFRpdGxlIC0tPlxuPGRpdiAqbmdJZj1cImdldENhc2VUaXRsZSgpOyB0aGVuIHRpdGxlQmxvY2s7IGVsc2UgaWRCbG9ja1wiPjwvZGl2PlxuPG5nLXRlbXBsYXRlICN0aXRsZUJsb2NrPlxuICA8Y2NkLW1hcmtkb3duIFtjb250ZW50XT1cImdldENhc2VUaXRsZSgpIHwgY2NkQ2FzZVRpdGxlOiBjYXNlRmllbGRzIDogZWRpdEZvcm0uY29udHJvbHNbJ2RhdGEnXVwiPjwvY2NkLW1hcmtkb3duPlxuPC9uZy10ZW1wbGF0ZT5cbjxuZy10ZW1wbGF0ZSAjaWRCbG9jaz5cbiAgPGgyICpuZ0lmPVwiZ2V0Q2FzZUlkKClcIiBjbGFzcz1cImhlYWRpbmctaDJcIj4je3sgZ2V0Q2FzZUlkKCkgfCBjY2RDYXNlUmVmZXJlbmNlIH19PC9oMj5cbjwvbmctdGVtcGxhdGU+XG5cbjwhLS0gRXJyb3IgbWVzc2FnZSBzdW1tYXJ5IC0tPlxuPGRpdiAqbmdJZj1cInZhbGlkYXRpb25FcnJvcnMubGVuZ3RoID4gMFwiIGNsYXNzPVwiZ292dWstZXJyb3Itc3VtbWFyeVwiIGFyaWEtbGFiZWxsZWRieT1cImVycm9yLXN1bW1hcnktdGl0bGVcIiByb2xlPVwiYWxlcnRcIiB0YWJpbmRleD1cIi0xXCIgZGF0YS1tb2R1bGU9XCJnb3Z1ay1lcnJvci1zdW1tYXJ5XCI+XG4gIDxoMiBjbGFzcz1cImdvdnVrLWVycm9yLXN1bW1hcnlfX3RpdGxlXCIgaWQ9XCJlcnJvci1zdW1tYXJ5LXRpdGxlXCI+XG4gICAge3snVGhlcmUgaXMgYSBwcm9ibGVtJyB8IHJweFRyYW5zbGF0ZX19XG4gIDwvaDI+XG4gIDxkaXYgKm5nRm9yPVwibGV0IHZhbGlkYXRpb25FcnJvciBvZiB2YWxpZGF0aW9uRXJyb3JzXCIgY2xhc3M9XCJnb3Z1ay1lcnJvci1zdW1tYXJ5X19ib2R5XCI+XG4gICAgPHVsIGNsYXNzPVwiZ292dWstbGlzdCBnb3Z1ay1lcnJvci1zdW1tYXJ5X19saXN0XCI+XG4gICAgICA8bGk+XG4gICAgICAgIDxhIChjbGljayk9XCJuYXZpZ2F0ZVRvRXJyb3JFbGVtZW50KHZhbGlkYXRpb25FcnJvci5pZClcIiBjbGFzcz1cInZhbGlkYXRpb24tZXJyb3JcIj5cbiAgICAgICAgICB7eyB2YWxpZGF0aW9uRXJyb3IubWVzc2FnZSB8IHJweFRyYW5zbGF0ZTogZ2V0UnB4VHJhbnNsYXRlUGlwZUFyZ3ModmFsaWRhdGlvbkVycm9yLmxhYmVsIHwgcnB4VHJhbnNsYXRlKTogbnVsbCB9fVxuICAgICAgICA8L2E+XG4gICAgICA8L2xpPlxuICAgIDwvdWw+XG4gIDwvZGl2PlxuPC9kaXY+XG5cbjxjY2QtY2FzZS1lZGl0LWdlbmVyaWMtZXJyb3JzIFtlcnJvcl09XCJjYXNlRWRpdC5lcnJvclwiPjwvY2NkLWNhc2UtZWRpdC1nZW5lcmljLWVycm9ycz5cblxuPGNjZC1jYWxsYmFjay1lcnJvcnNcbiAgW3RyaWdnZXJUZXh0Q29udGludWVdPVwidHJpZ2dlclRleHRTdGFydFwiXG4gIFt0cmlnZ2VyVGV4dElnbm9yZV09XCJ0cmlnZ2VyVGV4dElnbm9yZVdhcm5pbmdzXCJcbiAgW2NhbGxiYWNrRXJyb3JzU3ViamVjdF09XCJjYXNlRWRpdC5jYWxsYmFja0Vycm9yc1N1YmplY3RcIlxuICAoY2FsbGJhY2tFcnJvcnNDb250ZXh0KT1cImNhbGxiYWNrRXJyb3JzTm90aWZ5KCRldmVudClcIj5cbjwvY2NkLWNhbGxiYWNrLWVycm9ycz5cbjxkaXYgY2xhc3M9XCJ3aWR0aC01MFwiPlxuICA8Zm9ybSAqbmdJZj1cImN1cnJlbnRQYWdlXCIgY2xhc3M9XCJmb3JtXCIgW2Zvcm1Hcm91cF09XCJlZGl0Rm9ybVwiIChzdWJtaXQpPVwic3VibWl0KClcIj5cbiAgICA8ZmllbGRzZXQgaWQ9XCJmaWVsZHNldC1jYXNlLWRhdGFcIj5cbiAgICAgIDxsZWdlbmQgc3R5bGU9XCJkaXNwbGF5OiBub25lO1wiPjwvbGVnZW5kPlxuICAgICAgPCEtLSBzaW5nbGUgY29sdW1uIC0tPlxuICAgICAgPGNjZC1jYXNlLWVkaXQtZm9ybSBpZD0nY2FzZUVkaXRGb3JtJyAqbmdJZj1cIiFjdXJyZW50UGFnZS5pc011bHRpQ29sdW1uKClcIiBbZmllbGRzXT1cImN1cnJlbnRQYWdlLmdldENvbDFGaWVsZHMoKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFtmb3JtR3JvdXBdPVwiZWRpdEZvcm0uY29udHJvbHNbJ2RhdGEnXVwiIFtjYXNlRmllbGRzXT1cImNhc2VGaWVsZHNcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICBbcGFnZUNoYW5nZVN1YmplY3RdPVwicGFnZUNoYW5nZVN1YmplY3RcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAodmFsdWVzQ2hhbmdlZCk9XCJhcHBseVZhbHVlc0NoYW5nZWQoJGV2ZW50KVwiPjwvY2NkLWNhc2UtZWRpdC1mb3JtPlxuICAgICAgPCEtLSB0d28gY29sdW1ucyAtLT5cbiAgICAgIDxkaXYgKm5nSWY9XCJjdXJyZW50UGFnZS5pc011bHRpQ29sdW1uKClcIiBjbGFzcz1cImdyaWQtcm93XCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJjb2x1bW4tdHdvLXRoaXJkcyByaWdodEJvcmRlclNlcGFyYXRvclwiPlxuICAgICAgICAgIDxjY2QtY2FzZS1lZGl0LWZvcm0gaWQ9J2Nhc2VFZGl0Rm9ybTEnIFtmaWVsZHNdPVwiY3VycmVudFBhZ2UuZ2V0Q29sMUZpZWxkcygpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtmb3JtR3JvdXBdPVwiZWRpdEZvcm0uY29udHJvbHNbJ2RhdGEnXVwiIFtjYXNlRmllbGRzXT1cImNhc2VGaWVsZHNcIj48L2NjZC1jYXNlLWVkaXQtZm9ybT5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJjb2x1bW4tb25lLXRoaXJkXCI+XG4gICAgICAgICAgPGNjZC1jYXNlLWVkaXQtZm9ybSBpZD0nY2FzZUVkaXRGb3JtMicgW2ZpZWxkc109XCJjdXJyZW50UGFnZS5nZXRDb2wyRmllbGRzKClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2Zvcm1Hcm91cF09XCJlZGl0Rm9ybS5jb250cm9sc1snZGF0YSddXCIgW2Nhc2VGaWVsZHNdPVwiY2FzZUZpZWxkc1wiPjwvY2NkLWNhc2UtZWRpdC1mb3JtPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZmllbGRzZXQ+XG5cbiAgICA8ZGl2IGNsYXNzPVwiZm9ybS1ncm91cCBmb3JtLWdyb3VwLXJlbGF0ZWRcIj5cbiAgICAgIDxidXR0b24gY2xhc3M9XCJidXR0b24gYnV0dG9uLXNlY29uZGFyeVwiIHR5cGU9XCJidXR0b25cIiBbZGlzYWJsZWRdPVwiIShoYXNQcmV2aW91c1BhZ2UkIHwgYXN5bmMpXCIgKGNsaWNrKT1cInRvUHJldmlvdXNQYWdlKClcIj5cbiAgICAgICAge3snUHJldmlvdXMnIHwgcnB4VHJhbnNsYXRlfX1cbiAgICAgIDwvYnV0dG9uPlxuICAgICAgPGJ1dHRvbiBjbGFzcz1cImJ1dHRvblwiIHR5cGU9XCJzdWJtaXRcIiBbZGlzYWJsZWRdPVwic3VibWl0dGluZygpXCI+e3t0cmlnZ2VyVGV4dCB8IHJweFRyYW5zbGF0ZX19PC9idXR0b24+XG4gICAgPC9kaXY+XG5cbiAgICA8cCBjbGFzcz1cImNhbmNlbFwiPjxhIChjbGljayk9XCJjYW5jZWwoKVwiIGhyZWY9XCJqYXZhc2NyaXB0OnZvaWQoMClcIj57e2dldENhbmNlbFRleHQoKSB8IHJweFRyYW5zbGF0ZX19PC9hPjwvcD5cbiAgPC9mb3JtPlxuPC9kaXY+XG5cbjxjY2QtY2FzZS1ldmVudC1jb21wbGV0aW9uICpuZ0lmPVwiY2FzZUVkaXQuaXNFdmVudENvbXBsZXRpb25DaGVja3NSZXF1aXJlZFwiXG4gIFtldmVudENvbXBsZXRpb25QYXJhbXNdPVwiY2FzZUVkaXQuZXZlbnRDb21wbGV0aW9uUGFyYW1zXCJcbiAgKGV2ZW50Q2FuQmVDb21wbGV0ZWQpPVwib25FdmVudENhbkJlQ29tcGxldGVkKCRldmVudClcIj5cbjwvY2NkLWNhc2UtZXZlbnQtY29tcGxldGlvbj5cbiJdfQ==
@@ -8,16 +8,21 @@ export class PageValidationService {
8
8
  constructor(caseFieldService) {
9
9
  this.caseFieldService = caseFieldService;
10
10
  }
11
- isPageValid(page, editForm) {
12
- return page.case_fields
11
+ getInvalidFields(page, editForm) {
12
+ const failingCaseFields = [];
13
+ page.case_fields
13
14
  .filter(caseField => !this.caseFieldService.isReadOnly(caseField))
14
15
  .filter(caseField => !this.isHidden(caseField, editForm))
15
- .every(caseField => {
16
+ .map(caseField => {
16
17
  const theControl = FieldsUtils.isCaseFieldOfType(caseField, ['JudicialUser'])
17
18
  ? editForm.controls['data'].get(`${caseField.id}_judicialUserControl`)
18
19
  : editForm.controls['data'].get(caseField.id);
19
- return this.checkDocumentField(caseField, theControl) && this.checkOptionalField(caseField, theControl);
20
+ if (!(this.checkDocumentField(caseField, theControl) && this.checkOptionalField(caseField, theControl))) {
21
+ failingCaseFields.push(caseField);
22
+ }
23
+ ;
20
24
  });
25
+ return failingCaseFields;
21
26
  }
22
27
  isHidden(caseField, editForm, path) {
23
28
  const formFields = editForm.getRawValue();
@@ -50,4 +55,4 @@ PageValidationService.ɵprov = /*@__PURE__*/ i0.ɵɵdefineInjectable({ token: Pa
50
55
  (function () { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(PageValidationService, [{
51
56
  type: Injectable
52
57
  }], function () { return [{ type: i1.CaseFieldService }]; }, null); })();
53
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGFnZS12YWxpZGF0aW9uLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9jY2QtY2FzZS11aS10b29sa2l0L3NyYy9saWIvc2hhcmVkL2NvbXBvbmVudHMvY2FzZS1lZGl0b3Ivc2VydmljZXMvcGFnZS12YWxpZGF0aW9uLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUczQyxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sb0VBQW9FLENBQUM7QUFFbkcsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sa0RBQWtELENBQUM7QUFDcEYsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLDBCQUEwQixDQUFDOzs7QUFJdkQsTUFBTSxPQUFPLHFCQUFxQjtJQUNoQyxZQUE2QixnQkFBa0M7UUFBbEMscUJBQWdCLEdBQWhCLGdCQUFnQixDQUFrQjtJQUFJLENBQUM7SUFFN0QsV0FBVyxDQUFDLElBQWdCLEVBQUUsUUFBbUI7UUFDdEQsT0FBTyxJQUFJLENBQUMsV0FBVzthQUNwQixNQUFNLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxVQUFVLENBQUMsU0FBUyxDQUFDLENBQUM7YUFDakUsTUFBTSxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLFNBQVMsRUFBRSxRQUFRLENBQUMsQ0FBQzthQUN4RCxLQUFLLENBQUMsU0FBUyxDQUFDLEVBQUU7WUFDakIsTUFBTSxVQUFVLEdBQUcsV0FBVyxDQUFDLGlCQUFpQixDQUFDLFNBQVMsRUFBRSxDQUFDLGNBQWMsQ0FBQyxDQUFDO2dCQUMzRSxDQUFDLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxTQUFTLENBQUMsRUFBRSxzQkFBc0IsQ0FBQztnQkFDdEUsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUMsQ0FBQztZQUNoRCxPQUFPLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxTQUFTLEVBQUUsVUFBVSxDQUFDLElBQUksSUFBSSxDQUFDLGtCQUFrQixDQUFDLFNBQVMsRUFBRSxVQUFVLENBQUMsQ0FBQztRQUMxRyxDQUFDLENBQUMsQ0FBQztJQUNQLENBQUM7SUFFTSxRQUFRLENBQUMsU0FBb0IsRUFBRSxRQUFtQixFQUFFLElBQWE7UUFDdEUsTUFBTSxVQUFVLEdBQUcsUUFBUSxDQUFDLFdBQVcsRUFBRSxDQUFDO1FBQzFDLE1BQU0sU0FBUyxHQUFHLGFBQWEsQ0FBQyxXQUFXLENBQUMsU0FBUyxDQUFDLGNBQWMsQ0FBQyxDQUFDO1FBQ3RFLElBQUksSUFBSSxJQUFJLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxTQUFTLENBQUMsRUFBRSxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRTtZQUNwRCxJQUFJLEdBQUcsR0FBRyxJQUFJLEdBQUcsU0FBUyxDQUFDLEVBQUUsRUFBRSxDQUFDO1NBQ2pDO1FBQ0QsT0FBTyxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsVUFBVSxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsQ0FBQztJQUNqRCxDQUFDO0lBRU8sa0JBQWtCLENBQUMsU0FBb0IsRUFBRSxVQUEyQjtRQUMxRSxJQUFJLFNBQVMsQ0FBQyxVQUFVLENBQUMsRUFBRSxLQUFLLFVBQVUsRUFBRTtZQUMxQyxPQUFPLElBQUksQ0FBQztTQUNiO1FBQ0QsT0FBTyxDQUFDLENBQUMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLFNBQVMsRUFBRSxVQUFVLENBQUMsQ0FBQyxDQUFDO0lBQzVELENBQUM7SUFFTyxrQkFBa0IsQ0FBQyxTQUFvQixFQUFFLFVBQTJCO1FBQzFFLElBQUksQ0FBQyxVQUFVLEVBQUU7WUFDZixPQUFPLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxVQUFVLENBQUMsU0FBUyxDQUFDLENBQUM7U0FDcEQ7YUFBTTtZQUNMLE9BQU8sVUFBVSxDQUFDLEtBQUssSUFBSSxVQUFVLENBQUMsUUFBUSxDQUFDO1NBQ2hEO0lBQ0gsQ0FBQztJQUVPLG1CQUFtQixDQUFDLFNBQW9CLEVBQUUsVUFBMkI7UUFDM0UsT0FBTyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsV0FBVyxDQUFDLFNBQVMsQ0FBQyxJQUFJLFVBQVUsS0FBSyxJQUFJLENBQUM7SUFDN0UsQ0FBQzs7MEZBekNVLHFCQUFxQjsyRUFBckIscUJBQXFCLFdBQXJCLHFCQUFxQjt1RkFBckIscUJBQXFCO2NBRGpDLFVBQVUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBBYnN0cmFjdENvbnRyb2wsIEZvcm1Hcm91cCB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcblxuaW1wb3J0IHsgU2hvd0NvbmRpdGlvbiB9IGZyb20gJy4uLy4uLy4uL2RpcmVjdGl2ZXMvY29uZGl0aW9uYWwtc2hvdy9kb21haW4vY29uZGl0aW9uYWwtc2hvdy5tb2RlbCc7XG5pbXBvcnQgeyBDYXNlRmllbGQgfSBmcm9tICcuLi8uLi8uLi9kb21haW4vZGVmaW5pdGlvbi9jYXNlLWZpZWxkLm1vZGVsJztcbmltcG9ydCB7IENhc2VGaWVsZFNlcnZpY2UgfSBmcm9tICcuLi8uLi8uLi9zZXJ2aWNlcy9jYXNlLWZpZWxkcy9jYXNlLWZpZWxkLnNlcnZpY2UnO1xuaW1wb3J0IHsgRmllbGRzVXRpbHMgfSBmcm9tICcuLi8uLi8uLi9zZXJ2aWNlcy9maWVsZHMnO1xuaW1wb3J0IHsgV2l6YXJkUGFnZSB9IGZyb20gJy4uL2RvbWFpbi93aXphcmQtcGFnZS5tb2RlbCc7XG5cbkBJbmplY3RhYmxlKClcbmV4cG9ydCBjbGFzcyBQYWdlVmFsaWRhdGlvblNlcnZpY2Uge1xuICBjb25zdHJ1Y3Rvcihwcml2YXRlIHJlYWRvbmx5IGNhc2VGaWVsZFNlcnZpY2U6IENhc2VGaWVsZFNlcnZpY2UpIHsgfVxuXG4gIHB1YmxpYyBpc1BhZ2VWYWxpZChwYWdlOiBXaXphcmRQYWdlLCBlZGl0Rm9ybTogRm9ybUdyb3VwKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHBhZ2UuY2FzZV9maWVsZHNcbiAgICAgIC5maWx0ZXIoY2FzZUZpZWxkID0+ICF0aGlzLmNhc2VGaWVsZFNlcnZpY2UuaXNSZWFkT25seShjYXNlRmllbGQpKVxuICAgICAgLmZpbHRlcihjYXNlRmllbGQgPT4gIXRoaXMuaXNIaWRkZW4oY2FzZUZpZWxkLCBlZGl0Rm9ybSkpXG4gICAgICAuZXZlcnkoY2FzZUZpZWxkID0+IHtcbiAgICAgICAgY29uc3QgdGhlQ29udHJvbCA9IEZpZWxkc1V0aWxzLmlzQ2FzZUZpZWxkT2ZUeXBlKGNhc2VGaWVsZCwgWydKdWRpY2lhbFVzZXInXSlcbiAgICAgICAgICA/IGVkaXRGb3JtLmNvbnRyb2xzWydkYXRhJ10uZ2V0KGAke2Nhc2VGaWVsZC5pZH1fanVkaWNpYWxVc2VyQ29udHJvbGApXG4gICAgICAgICAgOiBlZGl0Rm9ybS5jb250cm9sc1snZGF0YSddLmdldChjYXNlRmllbGQuaWQpO1xuICAgICAgICByZXR1cm4gdGhpcy5jaGVja0RvY3VtZW50RmllbGQoY2FzZUZpZWxkLCB0aGVDb250cm9sKSAmJiB0aGlzLmNoZWNrT3B0aW9uYWxGaWVsZChjYXNlRmllbGQsIHRoZUNvbnRyb2wpO1xuICAgICAgfSk7XG4gIH1cblxuICBwdWJsaWMgaXNIaWRkZW4oY2FzZUZpZWxkOiBDYXNlRmllbGQsIGVkaXRGb3JtOiBGb3JtR3JvdXAsIHBhdGg/OiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICBjb25zdCBmb3JtRmllbGRzID0gZWRpdEZvcm0uZ2V0UmF3VmFsdWUoKTtcbiAgICBjb25zdCBjb25kaXRpb24gPSBTaG93Q29uZGl0aW9uLmdldEluc3RhbmNlKGNhc2VGaWVsZC5zaG93X2NvbmRpdGlvbik7XG4gICAgaWYgKHBhdGggJiYgcGF0aC5pbmRleE9mKGBfJHtjYXNlRmllbGQuaWR9X2ApID09PSAtMSkge1xuICAgICAgcGF0aCA9IGAke3BhdGh9JHtjYXNlRmllbGQuaWR9YDtcbiAgICB9XG4gICAgcmV0dXJuICFjb25kaXRpb24ubWF0Y2goZm9ybUZpZWxkcy5kYXRhLCBwYXRoKTtcbiAgfVxuXG4gIHByaXZhdGUgY2hlY2tEb2N1bWVudEZpZWxkKGNhc2VGaWVsZDogQ2FzZUZpZWxkLCB0aGVDb250cm9sOiBBYnN0cmFjdENvbnRyb2wpOiBib29sZWFuIHtcbiAgICBpZiAoY2FzZUZpZWxkLmZpZWxkX3R5cGUuaWQgIT09ICdEb2N1bWVudCcpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICByZXR1cm4gISh0aGlzLmNoZWNrTWFuZGF0b3J5RmllbGQoY2FzZUZpZWxkLCB0aGVDb250cm9sKSk7XG4gIH1cblxuICBwcml2YXRlIGNoZWNrT3B0aW9uYWxGaWVsZChjYXNlRmllbGQ6IENhc2VGaWVsZCwgdGhlQ29udHJvbDogQWJzdHJhY3RDb250cm9sKTogYm9vbGVhbiB7XG4gICAgaWYgKCF0aGVDb250cm9sKSB7XG4gICAgICByZXR1cm4gdGhpcy5jYXNlRmllbGRTZXJ2aWNlLmlzT3B0aW9uYWwoY2FzZUZpZWxkKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHRoZUNvbnRyb2wudmFsaWQgfHwgdGhlQ29udHJvbC5kaXNhYmxlZDtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGNoZWNrTWFuZGF0b3J5RmllbGQoY2FzZUZpZWxkOiBDYXNlRmllbGQsIHRoZUNvbnRyb2w6IEFic3RyYWN0Q29udHJvbCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmNhc2VGaWVsZFNlcnZpY2UuaXNNYW5kYXRvcnkoY2FzZUZpZWxkKSAmJiB0aGVDb250cm9sID09PSBudWxsO1xuICB9XG59XG4iXX0=
58
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGFnZS12YWxpZGF0aW9uLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9jY2QtY2FzZS11aS10b29sa2l0L3NyYy9saWIvc2hhcmVkL2NvbXBvbmVudHMvY2FzZS1lZGl0b3Ivc2VydmljZXMvcGFnZS12YWxpZGF0aW9uLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUczQyxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sb0VBQW9FLENBQUM7QUFFbkcsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sa0RBQWtELENBQUM7QUFDcEYsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLDBCQUEwQixDQUFDOzs7QUFJdkQsTUFBTSxPQUFPLHFCQUFxQjtJQUNoQyxZQUE2QixnQkFBa0M7UUFBbEMscUJBQWdCLEdBQWhCLGdCQUFnQixDQUFrQjtJQUFJLENBQUM7SUFFN0QsZ0JBQWdCLENBQUMsSUFBZ0IsRUFBRSxRQUFtQjtRQUMzRCxNQUFNLGlCQUFpQixHQUFHLEVBQUUsQ0FBQztRQUM3QixJQUFJLENBQUMsV0FBVzthQUNiLE1BQU0sQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLFVBQVUsQ0FBQyxTQUFTLENBQUMsQ0FBQzthQUNqRSxNQUFNLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsU0FBUyxFQUFFLFFBQVEsQ0FBQyxDQUFDO2FBQ3hELEdBQUcsQ0FBQyxTQUFTLENBQUMsRUFBRTtZQUNmLE1BQU0sVUFBVSxHQUFHLFdBQVcsQ0FBQyxpQkFBaUIsQ0FBQyxTQUFTLEVBQUUsQ0FBQyxjQUFjLENBQUMsQ0FBQztnQkFDM0UsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsU0FBUyxDQUFDLEVBQUUsc0JBQXNCLENBQUM7Z0JBQ3RFLENBQUMsQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDLENBQUM7WUFDaEQsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLGtCQUFrQixDQUFDLFNBQVMsRUFBRSxVQUFVLENBQUMsSUFBSSxJQUFJLENBQUMsa0JBQWtCLENBQUMsU0FBUyxFQUFFLFVBQVUsQ0FBQyxDQUFDLEVBQUU7Z0JBQ3ZHLGlCQUFpQixDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQzthQUNuQztZQUFBLENBQUM7UUFDSixDQUFDLENBQUMsQ0FBQztRQUNMLE9BQU8saUJBQWlCLENBQUM7SUFDM0IsQ0FBQztJQUVNLFFBQVEsQ0FBQyxTQUFvQixFQUFFLFFBQW1CLEVBQUUsSUFBYTtRQUN0RSxNQUFNLFVBQVUsR0FBRyxRQUFRLENBQUMsV0FBVyxFQUFFLENBQUM7UUFDMUMsTUFBTSxTQUFTLEdBQUcsYUFBYSxDQUFDLFdBQVcsQ0FBQyxTQUFTLENBQUMsY0FBYyxDQUFDLENBQUM7UUFDdEUsSUFBSSxJQUFJLElBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLFNBQVMsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFO1lBQ3BELElBQUksR0FBRyxHQUFHLElBQUksR0FBRyxTQUFTLENBQUMsRUFBRSxFQUFFLENBQUM7U0FDakM7UUFDRCxPQUFPLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxVQUFVLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDO0lBQ2pELENBQUM7SUFFTyxrQkFBa0IsQ0FBQyxTQUFvQixFQUFFLFVBQTJCO1FBQzFFLElBQUksU0FBUyxDQUFDLFVBQVUsQ0FBQyxFQUFFLEtBQUssVUFBVSxFQUFFO1lBQzFDLE9BQU8sSUFBSSxDQUFDO1NBQ2I7UUFDRCxPQUFPLENBQUMsQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsU0FBUyxFQUFFLFVBQVUsQ0FBQyxDQUFDLENBQUM7SUFDNUQsQ0FBQztJQUVPLGtCQUFrQixDQUFDLFNBQW9CLEVBQUUsVUFBMkI7UUFDMUUsSUFBSSxDQUFDLFVBQVUsRUFBRTtZQUNmLE9BQU8sSUFBSSxDQUFDLGdCQUFnQixDQUFDLFVBQVUsQ0FBQyxTQUFTLENBQUMsQ0FBQztTQUNwRDthQUFNO1lBQ0wsT0FBTyxVQUFVLENBQUMsS0FBSyxJQUFJLFVBQVUsQ0FBQyxRQUFRLENBQUM7U0FDaEQ7SUFDSCxDQUFDO0lBRU8sbUJBQW1CLENBQUMsU0FBb0IsRUFBRSxVQUEyQjtRQUMzRSxPQUFPLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxXQUFXLENBQUMsU0FBUyxDQUFDLElBQUksVUFBVSxLQUFLLElBQUksQ0FBQztJQUM3RSxDQUFDOzswRkE3Q1UscUJBQXFCOzJFQUFyQixxQkFBcUIsV0FBckIscUJBQXFCO3VGQUFyQixxQkFBcUI7Y0FEakMsVUFBVSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdGFibGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEFic3RyYWN0Q29udHJvbCwgRm9ybUdyb3VwIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuXG5pbXBvcnQgeyBTaG93Q29uZGl0aW9uIH0gZnJvbSAnLi4vLi4vLi4vZGlyZWN0aXZlcy9jb25kaXRpb25hbC1zaG93L2RvbWFpbi9jb25kaXRpb25hbC1zaG93Lm1vZGVsJztcbmltcG9ydCB7IENhc2VGaWVsZCB9IGZyb20gJy4uLy4uLy4uL2RvbWFpbi9kZWZpbml0aW9uL2Nhc2UtZmllbGQubW9kZWwnO1xuaW1wb3J0IHsgQ2FzZUZpZWxkU2VydmljZSB9IGZyb20gJy4uLy4uLy4uL3NlcnZpY2VzL2Nhc2UtZmllbGRzL2Nhc2UtZmllbGQuc2VydmljZSc7XG5pbXBvcnQgeyBGaWVsZHNVdGlscyB9IGZyb20gJy4uLy4uLy4uL3NlcnZpY2VzL2ZpZWxkcyc7XG5pbXBvcnQgeyBXaXphcmRQYWdlIH0gZnJvbSAnLi4vZG9tYWluL3dpemFyZC1wYWdlLm1vZGVsJztcblxuQEluamVjdGFibGUoKVxuZXhwb3J0IGNsYXNzIFBhZ2VWYWxpZGF0aW9uU2VydmljZSB7XG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgcmVhZG9ubHkgY2FzZUZpZWxkU2VydmljZTogQ2FzZUZpZWxkU2VydmljZSkgeyB9XG5cbiAgcHVibGljIGdldEludmFsaWRGaWVsZHMocGFnZTogV2l6YXJkUGFnZSwgZWRpdEZvcm06IEZvcm1Hcm91cCk6IENhc2VGaWVsZFtdIHtcbiAgICBjb25zdCBmYWlsaW5nQ2FzZUZpZWxkcyA9IFtdO1xuICAgIHBhZ2UuY2FzZV9maWVsZHNcbiAgICAgIC5maWx0ZXIoY2FzZUZpZWxkID0+ICF0aGlzLmNhc2VGaWVsZFNlcnZpY2UuaXNSZWFkT25seShjYXNlRmllbGQpKVxuICAgICAgLmZpbHRlcihjYXNlRmllbGQgPT4gIXRoaXMuaXNIaWRkZW4oY2FzZUZpZWxkLCBlZGl0Rm9ybSkpXG4gICAgICAubWFwKGNhc2VGaWVsZCA9PiB7XG4gICAgICAgIGNvbnN0IHRoZUNvbnRyb2wgPSBGaWVsZHNVdGlscy5pc0Nhc2VGaWVsZE9mVHlwZShjYXNlRmllbGQsIFsnSnVkaWNpYWxVc2VyJ10pXG4gICAgICAgICAgPyBlZGl0Rm9ybS5jb250cm9sc1snZGF0YSddLmdldChgJHtjYXNlRmllbGQuaWR9X2p1ZGljaWFsVXNlckNvbnRyb2xgKVxuICAgICAgICAgIDogZWRpdEZvcm0uY29udHJvbHNbJ2RhdGEnXS5nZXQoY2FzZUZpZWxkLmlkKTtcbiAgICAgICAgaWYgKCEodGhpcy5jaGVja0RvY3VtZW50RmllbGQoY2FzZUZpZWxkLCB0aGVDb250cm9sKSAmJiB0aGlzLmNoZWNrT3B0aW9uYWxGaWVsZChjYXNlRmllbGQsIHRoZUNvbnRyb2wpKSkge1xuICAgICAgICAgIGZhaWxpbmdDYXNlRmllbGRzLnB1c2goY2FzZUZpZWxkKTtcbiAgICAgICAgfTtcbiAgICAgIH0pO1xuICAgIHJldHVybiBmYWlsaW5nQ2FzZUZpZWxkcztcbiAgfVxuXG4gIHB1YmxpYyBpc0hpZGRlbihjYXNlRmllbGQ6IENhc2VGaWVsZCwgZWRpdEZvcm06IEZvcm1Hcm91cCwgcGF0aD86IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IGZvcm1GaWVsZHMgPSBlZGl0Rm9ybS5nZXRSYXdWYWx1ZSgpO1xuICAgIGNvbnN0IGNvbmRpdGlvbiA9IFNob3dDb25kaXRpb24uZ2V0SW5zdGFuY2UoY2FzZUZpZWxkLnNob3dfY29uZGl0aW9uKTtcbiAgICBpZiAocGF0aCAmJiBwYXRoLmluZGV4T2YoYF8ke2Nhc2VGaWVsZC5pZH1fYCkgPT09IC0xKSB7XG4gICAgICBwYXRoID0gYCR7cGF0aH0ke2Nhc2VGaWVsZC5pZH1gO1xuICAgIH1cbiAgICByZXR1cm4gIWNvbmRpdGlvbi5tYXRjaChmb3JtRmllbGRzLmRhdGEsIHBhdGgpO1xuICB9XG5cbiAgcHJpdmF0ZSBjaGVja0RvY3VtZW50RmllbGQoY2FzZUZpZWxkOiBDYXNlRmllbGQsIHRoZUNvbnRyb2w6IEFic3RyYWN0Q29udHJvbCk6IGJvb2xlYW4ge1xuICAgIGlmIChjYXNlRmllbGQuZmllbGRfdHlwZS5pZCAhPT0gJ0RvY3VtZW50Jykge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIHJldHVybiAhKHRoaXMuY2hlY2tNYW5kYXRvcnlGaWVsZChjYXNlRmllbGQsIHRoZUNvbnRyb2wpKTtcbiAgfVxuXG4gIHByaXZhdGUgY2hlY2tPcHRpb25hbEZpZWxkKGNhc2VGaWVsZDogQ2FzZUZpZWxkLCB0aGVDb250cm9sOiBBYnN0cmFjdENvbnRyb2wpOiBib29sZWFuIHtcbiAgICBpZiAoIXRoZUNvbnRyb2wpIHtcbiAgICAgIHJldHVybiB0aGlzLmNhc2VGaWVsZFNlcnZpY2UuaXNPcHRpb25hbChjYXNlRmllbGQpO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gdGhlQ29udHJvbC52YWxpZCB8fCB0aGVDb250cm9sLmRpc2FibGVkO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgY2hlY2tNYW5kYXRvcnlGaWVsZChjYXNlRmllbGQ6IENhc2VGaWVsZCwgdGhlQ29udHJvbDogQWJzdHJhY3RDb250cm9sKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuY2FzZUZpZWxkU2VydmljZS5pc01hbmRhdG9yeShjYXNlRmllbGQpICYmIHRoZUNvbnRyb2wgPT09IG51bGw7XG4gIH1cbn1cbiJdfQ==