@hmcts/ccd-case-ui-toolkit 7.1.31-ungrey-back-button → 7.1.31

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 (116) hide show
  1. package/esm2022/lib/shared/components/case-editor/case-edit/case-edit.component.mjs +3 -3
  2. package/esm2022/lib/shared/components/case-editor/case-edit-page/case-edit-page.component.mjs +33 -107
  3. package/esm2022/lib/shared/components/case-editor/case-edit-submit/case-edit-submit.component.mjs +37 -60
  4. package/esm2022/lib/shared/components/case-editor/case-editor.module.mjs +4 -7
  5. package/esm2022/lib/shared/components/case-editor/services/case-flag-state.service.mjs +1 -3
  6. package/esm2022/lib/shared/components/case-editor/services/event-completion-state-machine.service.mjs +14 -2
  7. package/esm2022/lib/shared/components/case-editor/services/work-allocation.service.mjs +5 -1
  8. package/esm2022/lib/shared/components/case-viewer/case-event-trigger/case-event-trigger.component.mjs +4 -14
  9. package/esm2022/lib/shared/components/palette/base-field/index.mjs +1 -3
  10. package/esm2022/lib/shared/components/palette/case-file-view/components/case-file-view-folder/case-file-view-folder.component.mjs +8 -9
  11. package/esm2022/lib/shared/components/palette/case-file-view/test-data/categories-and-documents-test-data.mjs +2 -2
  12. package/esm2022/lib/shared/components/palette/case-flag/components/add-comments/add-comments.component.mjs +21 -21
  13. package/esm2022/lib/shared/components/palette/case-flag/components/case-flag-summary-list/case-flag-summary-list.component.mjs +3 -3
  14. package/esm2022/lib/shared/components/palette/case-flag/components/confirm-flag-status/confirm-flag-status.component.mjs +22 -25
  15. package/esm2022/lib/shared/components/palette/case-flag/components/manage-case-flags/manage-case-flags.component.mjs +35 -77
  16. package/esm2022/lib/shared/components/palette/case-flag/components/search-language-interpreter/search-language-interpreter.component.mjs +29 -32
  17. package/esm2022/lib/shared/components/palette/case-flag/components/select-flag-location/select-flag-location.component.mjs +28 -33
  18. package/esm2022/lib/shared/components/palette/case-flag/components/select-flag-type/select-flag-type.component.mjs +63 -159
  19. package/esm2022/lib/shared/components/palette/case-flag/components/update-flag/update-flag-add-translation-form/update-flag-add-translation-form.component.mjs +28 -28
  20. package/esm2022/lib/shared/components/palette/case-flag/components/update-flag/update-flag.component.mjs +105 -124
  21. package/esm2022/lib/shared/components/palette/case-flag/read-case-flag-field.component.mjs +4 -30
  22. package/esm2022/lib/shared/components/palette/case-flag/write-case-flag-field.component.mjs +33 -139
  23. package/esm2022/lib/shared/components/palette/document/write-document-field.component.mjs +17 -5
  24. package/esm2022/lib/shared/components/palette/linked-cases/components/before-you-start/before-you-start.component.mjs +21 -41
  25. package/esm2022/lib/shared/components/palette/linked-cases/components/check-your-answers/check-your-answers.component.mjs +7 -19
  26. package/esm2022/lib/shared/components/palette/linked-cases/components/link-cases/link-cases.component.mjs +61 -71
  27. package/esm2022/lib/shared/components/palette/linked-cases/components/no-linked-cases/no-linked-cases.component.mjs +9 -13
  28. package/esm2022/lib/shared/components/palette/linked-cases/components/unlink-cases/unlink-cases.component.mjs +48 -85
  29. package/esm2022/lib/shared/components/palette/linked-cases/services/linked-cases.service.mjs +2 -22
  30. package/esm2022/lib/shared/components/palette/linked-cases/write-linked-cases-field.component.mjs +52 -109
  31. package/esm2022/lib/shared/components/palette/palette.module.mjs +2 -2
  32. package/esm2022/lib/shared/components/palette/unsupported-field.component.mjs +4 -3
  33. package/esm2022/lib/shared/components/palette/utils/date.pipe.mjs +2 -2
  34. package/esm2022/lib/shared/components/search-result/search-result.component.mjs +39 -35
  35. package/esm2022/lib/shared/domain/index.mjs +1 -2
  36. package/esm2022/lib/shared/pipes/complex/ccd-page-fields.pipe.mjs +2 -2
  37. package/esm2022/lib/shared/services/index.mjs +1 -2
  38. package/fesm2022/hmcts-ccd-case-ui-toolkit.mjs +877 -1659
  39. package/fesm2022/hmcts-ccd-case-ui-toolkit.mjs.map +1 -1
  40. package/lib/shared/components/case-editor/case-edit-page/case-edit-page.component.d.ts +3 -16
  41. package/lib/shared/components/case-editor/case-edit-page/case-edit-page.component.d.ts.map +1 -1
  42. package/lib/shared/components/case-editor/case-edit-submit/case-edit-submit.component.d.ts +2 -7
  43. package/lib/shared/components/case-editor/case-edit-submit/case-edit-submit.component.d.ts.map +1 -1
  44. package/lib/shared/components/case-editor/case-editor.module.d.ts.map +1 -1
  45. package/lib/shared/components/case-editor/services/case-flag-state.service.d.ts +0 -1
  46. package/lib/shared/components/case-editor/services/case-flag-state.service.d.ts.map +1 -1
  47. package/lib/shared/components/case-editor/services/event-completion-state-machine.service.d.ts.map +1 -1
  48. package/lib/shared/components/case-editor/services/work-allocation.service.d.ts.map +1 -1
  49. package/lib/shared/components/case-viewer/case-event-trigger/case-event-trigger.component.d.ts +1 -2
  50. package/lib/shared/components/case-viewer/case-event-trigger/case-event-trigger.component.d.ts.map +1 -1
  51. package/lib/shared/components/palette/base-field/index.d.ts +0 -2
  52. package/lib/shared/components/palette/base-field/index.d.ts.map +1 -1
  53. package/lib/shared/components/palette/case-flag/components/add-comments/add-comments.component.d.ts +2 -4
  54. package/lib/shared/components/palette/case-flag/components/add-comments/add-comments.component.d.ts.map +1 -1
  55. package/lib/shared/components/palette/case-flag/components/confirm-flag-status/confirm-flag-status.component.d.ts +2 -4
  56. package/lib/shared/components/palette/case-flag/components/confirm-flag-status/confirm-flag-status.component.d.ts.map +1 -1
  57. package/lib/shared/components/palette/case-flag/components/manage-case-flags/manage-case-flags.component.d.ts +4 -11
  58. package/lib/shared/components/palette/case-flag/components/manage-case-flags/manage-case-flags.component.d.ts.map +1 -1
  59. package/lib/shared/components/palette/case-flag/components/search-language-interpreter/search-language-interpreter.component.d.ts +3 -6
  60. package/lib/shared/components/palette/case-flag/components/search-language-interpreter/search-language-interpreter.component.d.ts.map +1 -1
  61. package/lib/shared/components/palette/case-flag/components/select-flag-location/select-flag-location.component.d.ts +2 -5
  62. package/lib/shared/components/palette/case-flag/components/select-flag-location/select-flag-location.component.d.ts.map +1 -1
  63. package/lib/shared/components/palette/case-flag/components/select-flag-type/select-flag-type.component.d.ts +6 -16
  64. package/lib/shared/components/palette/case-flag/components/select-flag-type/select-flag-type.component.d.ts.map +1 -1
  65. package/lib/shared/components/palette/case-flag/components/update-flag/update-flag-add-translation-form/update-flag-add-translation-form.component.d.ts +2 -4
  66. package/lib/shared/components/palette/case-flag/components/update-flag/update-flag-add-translation-form/update-flag-add-translation-form.component.d.ts.map +1 -1
  67. package/lib/shared/components/palette/case-flag/components/update-flag/update-flag.component.d.ts +3 -7
  68. package/lib/shared/components/palette/case-flag/components/update-flag/update-flag.component.d.ts.map +1 -1
  69. package/lib/shared/components/palette/case-flag/read-case-flag-field.component.d.ts +0 -1
  70. package/lib/shared/components/palette/case-flag/read-case-flag-field.component.d.ts.map +1 -1
  71. package/lib/shared/components/palette/case-flag/write-case-flag-field.component.d.ts +6 -16
  72. package/lib/shared/components/palette/case-flag/write-case-flag-field.component.d.ts.map +1 -1
  73. package/lib/shared/components/palette/document/write-document-field.component.d.ts +3 -1
  74. package/lib/shared/components/palette/document/write-document-field.component.d.ts.map +1 -1
  75. package/lib/shared/components/palette/linked-cases/components/before-you-start/before-you-start.component.d.ts +3 -6
  76. package/lib/shared/components/palette/linked-cases/components/before-you-start/before-you-start.component.d.ts.map +1 -1
  77. package/lib/shared/components/palette/linked-cases/components/check-your-answers/check-your-answers.component.d.ts +2 -6
  78. package/lib/shared/components/palette/linked-cases/components/check-your-answers/check-your-answers.component.d.ts.map +1 -1
  79. package/lib/shared/components/palette/linked-cases/components/link-cases/link-cases.component.d.ts +3 -6
  80. package/lib/shared/components/palette/linked-cases/components/link-cases/link-cases.component.d.ts.map +1 -1
  81. package/lib/shared/components/palette/linked-cases/components/no-linked-cases/no-linked-cases.component.d.ts +2 -5
  82. package/lib/shared/components/palette/linked-cases/components/no-linked-cases/no-linked-cases.component.d.ts.map +1 -1
  83. package/lib/shared/components/palette/linked-cases/components/unlink-cases/unlink-cases.component.d.ts +3 -9
  84. package/lib/shared/components/palette/linked-cases/components/unlink-cases/unlink-cases.component.d.ts.map +1 -1
  85. package/lib/shared/components/palette/linked-cases/services/linked-cases.service.d.ts +0 -7
  86. package/lib/shared/components/palette/linked-cases/services/linked-cases.service.d.ts.map +1 -1
  87. package/lib/shared/components/palette/linked-cases/write-linked-cases-field.component.d.ts +3 -10
  88. package/lib/shared/components/palette/linked-cases/write-linked-cases-field.component.d.ts.map +1 -1
  89. package/lib/shared/components/palette/unsupported-field.component.d.ts +1 -1
  90. package/lib/shared/components/palette/unsupported-field.component.d.ts.map +1 -1
  91. package/lib/shared/domain/index.d.ts +0 -1
  92. package/lib/shared/domain/index.d.ts.map +1 -1
  93. package/lib/shared/services/index.d.ts +0 -1
  94. package/lib/shared/services/index.d.ts.map +1 -1
  95. package/package.json +1 -1
  96. package/esm2022/lib/shared/components/palette/base-field/abstract-field-write-journey.component.mjs +0 -96
  97. package/esm2022/lib/shared/components/palette/base-field/abstract-journey.component.mjs +0 -82
  98. package/esm2022/lib/shared/domain/journey/index.mjs +0 -3
  99. package/esm2022/lib/shared/domain/journey/journey-instigator.model.mjs +0 -2
  100. package/esm2022/lib/shared/domain/journey/journey.model.mjs +0 -2
  101. package/esm2022/lib/shared/services/journey/index.mjs +0 -2
  102. package/esm2022/lib/shared/services/journey/multipage-component-state.service.mjs +0 -117
  103. package/lib/shared/components/palette/base-field/abstract-field-write-journey.component.d.ts +0 -30
  104. package/lib/shared/components/palette/base-field/abstract-field-write-journey.component.d.ts.map +0 -1
  105. package/lib/shared/components/palette/base-field/abstract-journey.component.d.ts +0 -27
  106. package/lib/shared/components/palette/base-field/abstract-journey.component.d.ts.map +0 -1
  107. package/lib/shared/domain/journey/index.d.ts +0 -3
  108. package/lib/shared/domain/journey/index.d.ts.map +0 -1
  109. package/lib/shared/domain/journey/journey-instigator.model.d.ts +0 -5
  110. package/lib/shared/domain/journey/journey-instigator.model.d.ts.map +0 -1
  111. package/lib/shared/domain/journey/journey.model.d.ts +0 -19
  112. package/lib/shared/domain/journey/journey.model.d.ts.map +0 -1
  113. package/lib/shared/services/journey/index.d.ts +0 -2
  114. package/lib/shared/services/journey/index.d.ts.map +0 -1
  115. package/lib/shared/services/journey/multipage-component-state.service.d.ts +0 -26
  116. package/lib/shared/services/journey/multipage-component-state.service.d.ts.map +0 -1
@@ -189,7 +189,6 @@ export class ReadCaseFlagFieldComponent extends AbstractFieldReadComponent {
189
189
  flagLauncherComponent.caseField.display_context_parameter === CaseFlagDisplayContextParameter.CREATE_2_POINT_1 ||
190
190
  flagLauncherComponent.caseField.display_context_parameter === CaseFlagDisplayContextParameter.CREATE_EXTERNAL) &&
191
191
  flagLauncherComponent.selectedFlagsLocation) {
192
- this.cleanupNavigationFormAdditions(flagLauncherComponent.selectedFlagsLocation);
193
192
  this.pathToFlagsFormGroup = flagLauncherComponent.selectedFlagsLocation.pathToFlagsFormGroup;
194
193
  this.flagForSummaryDisplay = this.extractNewFlagToFlagDetailDisplayObject(flagLauncherComponent.selectedFlagsLocation);
195
194
  // The FlagLauncher component holds a reference (selectedFlag), which gets set after the selection step of the
@@ -198,16 +197,9 @@ export class ReadCaseFlagFieldComponent extends AbstractFieldReadComponent {
198
197
  else if ((flagLauncherComponent.caseField.display_context_parameter === CaseFlagDisplayContextParameter.UPDATE ||
199
198
  flagLauncherComponent.caseField.display_context_parameter === CaseFlagDisplayContextParameter.UPDATE_2_POINT_1 ||
200
199
  flagLauncherComponent.caseField.display_context_parameter === CaseFlagDisplayContextParameter.UPDATE_EXTERNAL) &&
201
- (flagLauncherComponent.selectedFlag ||
202
- (this.caseFlagStateService.formGroup.get('selectedManageCaseLocation').value.flagDetailDisplay && this.displayContextParameter === CaseFlagDisplayContextParameter.UPDATE_2_POINT_1))) {
203
- if (this.formGroup.get(flagLauncherControlName)['component']?.selectedFlag?.flagDetailDisplay !== undefined) {
204
- this.flagForSummaryDisplay =
205
- this.formGroup.get(flagLauncherControlName)['component'].selectedFlag.flagDetailDisplay;
206
- }
207
- else {
208
- this.flagForSummaryDisplay =
209
- this.caseFlagStateService.formGroup.get('selectedManageCaseLocation').value.flagDetailDisplay;
210
- }
200
+ flagLauncherComponent.selectedFlag) {
201
+ this.flagForSummaryDisplay =
202
+ this.formGroup.get(flagLauncherControlName)['component'].selectedFlag.flagDetailDisplay;
211
203
  // TODO: not the best solution, the caseFlagStateService should have all the fields, then we can delete a lot of the transformations here
212
204
  // in Create Case Flag it already has all fields
213
205
  const caseFlagFormGroupValue = this.caseFlagStateService.formGroup?.value;
@@ -222,24 +214,6 @@ export class ReadCaseFlagFieldComponent extends AbstractFieldReadComponent {
222
214
  }
223
215
  }
224
216
  }
225
- cleanupNavigationFormAdditions(selectedFlagsLocation) {
226
- const path = selectedFlagsLocation.pathToFlagsFormGroup;
227
- Object.keys(this.formGroup.controls).forEach((controlName) => {
228
- const control = this.formGroup.get(controlName);
229
- if ((controlName !== path)) {
230
- if (control['caseField'].formatted_value?.details) {
231
- // we want to loop through the current flag details to ensure that there are no additional data from the usre restarting the flow that have been added.
232
- for (const value in control['caseField'].formatted_value?.details) {
233
- // if the id is undefined then the user has added this as part of their current flow and we should remove it so it doesnt get added to the case
234
- if (!control['caseField'].formatted_value?.details[value].id) {
235
- control['caseField'].value.details.pop();
236
- control['caseField'].formatted_value.details.pop();
237
- }
238
- }
239
- }
240
- }
241
- });
242
- }
243
217
  extractNewFlagToFlagDetailDisplayObject(selectedFlagsLocation) {
244
218
  // Use the pathToFlagsFormGroup property from the selected flag location to drill down to the correct part of the
245
219
  // CaseField value containing the new flag
@@ -276,4 +250,4 @@ export class ReadCaseFlagFieldComponent extends AbstractFieldReadComponent {
276
250
  args: [{ selector: 'ccd-read-case-flag-field', template: "<ng-container *ngIf=\"context === paletteContext.CHECK_YOUR_ANSWER\">\n <ccd-case-flag-summary-list\n [flagForSummaryDisplay]=\"flagForSummaryDisplay\"\n [displayContextParameter]=\"displayContextParameter\"\n (changeButtonEmitter)=\"navigateBackToForm($event)\">\n </ccd-case-flag-summary-list>\n</ng-container>\n\n<ng-container *ngIf=\"context !== paletteContext.CHECK_YOUR_ANSWER\">\n <ng-container [ngSwitch]=\"displayContextParameter\">\n <ng-container *ngSwitchCase=\"caseFlagDisplayContextParameter.READ_EXTERNAL\">\n <h2 id=\"read-case-flag-title\" class=\"govuk-heading-l\">\n {{ 'Support requested' | rpxTranslate }}\n </h2>\n\n <div *ngFor=\"let flagData of partyLevelCaseFlagData\">\n <ccd-case-flag-table *ngIf=\"flagData.flags.partyName\"\n [tableCaption]=\"''\"\n [flagData]=\"flagData\"\n [firstColumnHeader]=\"flagData.flags.partyName\"\n [caseFlagsExternalUser]=\"caseFlagsExternalUser\"\n ></ccd-case-flag-table>\n </div>\n </ng-container>\n\n <ng-container *ngSwitchDefault>\n <h2 id=\"read-case-flag-title\" class=\"govuk-heading-l\">\n {{ 'Case flags' | rpxTranslate }}\n </h2>\n\n <div *ngFor=\"let flagData of partyLevelCaseFlagData\">\n <ccd-case-flag-table *ngIf=\"flagData.flags.partyName\"\n [tableCaption]=\"flagData.flags.partyName\"\n [flagData]=\"flagData\"\n [firstColumnHeader]=\"'Party level flags' | rpxTranslate\"\n ></ccd-case-flag-table>\n </div>\n <div *ngIf=\"caseLevelCaseFlagData\">\n <ccd-case-flag-table\n [tableCaption]=\"'Case level flags' | rpxTranslate\"\n [flagData]=\"caseLevelCaseFlagData\"\n [firstColumnHeader]=\"'Case flags' | rpxTranslate\"\n ></ccd-case-flag-table>\n </div>\n </ng-container>\n </ng-container>\n</ng-container>\n", styles: [".govuk-heading-l{margin-top:30px}\n"] }]
277
251
  }], () => [{ type: i1.ActivatedRoute }, { type: i1.Router }, { type: i2.CaseFlagStateService }], null); })();
278
252
  (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(ReadCaseFlagFieldComponent, { className: "ReadCaseFlagFieldComponent", filePath: "lib/shared/components/palette/case-flag/read-case-flag-field.component.ts", lineNumber: 16 }); })();
279
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVhZC1jYXNlLWZsYWctZmllbGQuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvY2NkLWNhc2UtdWktdG9vbGtpdC9zcmMvbGliL3NoYXJlZC9jb21wb25lbnRzL3BhbGV0dGUvY2FzZS1mbGFnL3JlYWQtY2FzZS1mbGFnLWZpZWxkLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2NjZC1jYXNlLXVpLXRvb2xraXQvc3JjL2xpYi9zaGFyZWQvY29tcG9uZW50cy9wYWxldHRlL2Nhc2UtZmxhZy9yZWFkLWNhc2UtZmxhZy1maWVsZC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFVLE1BQU0sZUFBZSxDQUFDO0FBQ2xELE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFFekQsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQ3ZELE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLG9EQUFvRCxDQUFDO0FBQzFGLE9BQU8sRUFBRSwwQkFBMEIsRUFBRSxNQUFNLDZDQUE2QyxDQUFDO0FBQ3pGLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxvQ0FBb0MsQ0FBQztBQUVwRSxPQUFPLEVBQUUsK0JBQStCLEVBQUUsY0FBYyxFQUFFLE1BQU0sU0FBUyxDQUFDOzs7Ozs7SUNSMUUsNkJBQW1FO0lBQ2pFLHFEQUdxRDtJQUFuRCxxUEFBdUIsaUNBQTBCLEtBQUM7SUFDcEQsaUJBQTZCOzs7O0lBSDNCLGNBQStDO0lBQy9DLEFBREEsb0VBQStDLDJEQUNJOzs7SUFhL0MseUNBS3VCOzs7O0lBREQsQUFEQSxBQURBLEFBREEsaUNBQW1CLHlCQUNFLGtEQUN5Qix1REFDQzs7O0lBTHZFLDJCQUFxRDtJQUNuRCwrSUFLQztJQUNI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REFBMUIsMEJBQTBCO1lDUHZDLEFBUkEsNkZBQW1FLGdGQVFBOztZQVJwRCwyRUFBa0Q7WUFRbEQsY0FBa0Q7WUFBbEQsMkVBQWtEOzs7aUZET3BELDBCQUEwQjtjQUx0QyxTQUFTOzJCQUNFLDBCQUEwQjs7a0ZBSXpCLDBCQUEwQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgT25Jbml0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBBY3RpdmF0ZWRSb3V0ZSwgUm91dGVyIH0gZnJvbSAnQGFuZ3VsYXIvcm91dGVyJztcbmltcG9ydCB7IENhc2VUYWIgfSBmcm9tICcuLi8uLi8uLi9kb21haW4nO1xuaW1wb3J0IHsgRmllbGRzVXRpbHMgfSBmcm9tICcuLi8uLi8uLi9zZXJ2aWNlcy9maWVsZHMnO1xuaW1wb3J0IHsgQ2FzZUZsYWdTdGF0ZVNlcnZpY2UgfSBmcm9tICcuLi8uLi9jYXNlLWVkaXRvci9zZXJ2aWNlcy9jYXNlLWZsYWctc3RhdGUuc2VydmljZSc7XG5pbXBvcnQgeyBBYnN0cmFjdEZpZWxkUmVhZENvbXBvbmVudCB9IGZyb20gJy4uL2Jhc2UtZmllbGQvYWJzdHJhY3QtZmllbGQtcmVhZC5jb21wb25lbnQnO1xuaW1wb3J0IHsgUGFsZXR0ZUNvbnRleHQgfSBmcm9tICcuLi9iYXNlLWZpZWxkL3BhbGV0dGUtY29udGV4dC5lbnVtJztcbmltcG9ydCB7IEZsYWdEZXRhaWxEaXNwbGF5LCBGbGFnc1dpdGhGb3JtR3JvdXBQYXRoIH0gZnJvbSAnLi9kb21haW4nO1xuaW1wb3J0IHsgQ2FzZUZsYWdEaXNwbGF5Q29udGV4dFBhcmFtZXRlciwgQ2FzZUZsYWdTdGF0dXMgfSBmcm9tICcuL2VudW1zJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnY2NkLXJlYWQtY2FzZS1mbGFnLWZpZWxkJyxcbiAgdGVtcGxhdGVVcmw6ICcuL3JlYWQtY2FzZS1mbGFnLWZpZWxkLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vcmVhZC1jYXNlLWZsYWctZmllbGQuY29tcG9uZW50LnNjc3MnXVxufSlcbmV4cG9ydCBjbGFzcyBSZWFkQ2FzZUZsYWdGaWVsZENvbXBvbmVudCBleHRlbmRzIEFic3RyYWN0RmllbGRSZWFkQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0IHtcbiAgcHVibGljIGZsYWdzRGF0YTogRmxhZ3NXaXRoRm9ybUdyb3VwUGF0aFtdO1xuICBwdWJsaWMgcGFydHlMZXZlbENhc2VGbGFnRGF0YTogRmxhZ3NXaXRoRm9ybUdyb3VwUGF0aFtdO1xuICBwdWJsaWMgY2FzZUxldmVsQ2FzZUZsYWdEYXRhOiBGbGFnc1dpdGhGb3JtR3JvdXBQYXRoO1xuICBwdWJsaWMgcGFsZXR0ZUNvbnRleHQgPSBQYWxldHRlQ29udGV4dDtcbiAgcHVibGljIGZsYWdGb3JTdW1tYXJ5RGlzcGxheTogRmxhZ0RldGFpbERpc3BsYXk7XG4gIHB1YmxpYyBkaXNwbGF5Q29udGV4dFBhcmFtZXRlcjogQ2FzZUZsYWdEaXNwbGF5Q29udGV4dFBhcmFtZXRlcjtcbiAgcHVibGljIGNhc2VGbGFnc0V4dGVybmFsVXNlciA9IGZhbHNlO1xuICBwdWJsaWMgcGF0aFRvRmxhZ3NGb3JtR3JvdXA6IHN0cmluZztcbiAgcHJpdmF0ZSByZWFkb25seSBjYXNlTGV2ZWxDYXNlRmxhZ3NGaWVsZElkID0gJ2Nhc2VGbGFncyc7XG5cbiAgcHVibGljIGdldCBjYXNlRmxhZ0Rpc3BsYXlDb250ZXh0UGFyYW1ldGVyKCk6IHR5cGVvZiBDYXNlRmxhZ0Rpc3BsYXlDb250ZXh0UGFyYW1ldGVyIHtcbiAgICByZXR1cm4gQ2FzZUZsYWdEaXNwbGF5Q29udGV4dFBhcmFtZXRlcjtcbiAgfVxuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgcmVhZG9ubHkgcm91dGU6IEFjdGl2YXRlZFJvdXRlLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgcm91dGVyOiBSb3V0ZXIsXG4gICAgcHJpdmF0ZSByZWFkb25seSBjYXNlRmxhZ1N0YXRlU2VydmljZTogQ2FzZUZsYWdTdGF0ZVNlcnZpY2VcbiAgKSB7XG4gICAgc3VwZXIoKTtcbiAgfVxuXG4gIHB1YmxpYyBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICBjb25zdCBmbGFnTGF1bmNoZXJDb250cm9sTmFtZSA9IE9iamVjdC5rZXlzKHRoaXMuZm9ybUdyb3VwLmNvbnRyb2xzKS5maW5kKFxuICAgICAgY29udHJvbE5hbWUgPT4gRmllbGRzVXRpbHMuaXNDYXNlRmllbGRPZlR5cGUodGhpcy5mb3JtR3JvdXAuZ2V0KGNvbnRyb2xOYW1lKVsnY2FzZUZpZWxkJ10sIFsnRmxhZ0xhdW5jaGVyJ10pKTtcbiAgICBjb25zdCBmbGFnTGF1bmNoZXJDb21wb25lbnQgPSB0aGlzLmZvcm1Hcm91cC5nZXQoZmxhZ0xhdW5jaGVyQ29udHJvbE5hbWUpPy5bJ2NvbXBvbmVudCddO1xuICAgIHRoaXMuZGlzcGxheUNvbnRleHRQYXJhbWV0ZXIgPSBmbGFnTGF1bmNoZXJDb21wb25lbnQ/LmNhc2VGaWVsZD8uZGlzcGxheV9jb250ZXh0X3BhcmFtZXRlcjtcbiAgICB0aGlzLmNhc2VGbGFnc0V4dGVybmFsVXNlciA9IHRoaXMuZGlzcGxheUNvbnRleHRQYXJhbWV0ZXIgPT09IENhc2VGbGFnRGlzcGxheUNvbnRleHRQYXJhbWV0ZXIuUkVBRF9FWFRFUk5BTDtcblxuICAgIC8vIElmIHRoZSBjb250ZXh0IGlzIFBhbGV0dGVDb250ZXh0LkRFRkFVTFQsIHRoZSBGbGFncyBmaWVsZHMgbmVlZCB0byBiZSBsb2NhdGVkIGJ5IENhc2VUYWIgKHRoZXkgd29uJ3QgYmUgcHJlc2VudFxuICAgIC8vIGluIHRoZSBGb3JtR3JvdXAgLSBvbmx5IHRoZSBGbGFnTGF1bmNoZXIgZmllbGQgaXMgcHJlc2VudClcbiAgICBpZiAodGhpcy5jb250ZXh0ID09PSBQYWxldHRlQ29udGV4dC5ERUZBVUxUKSB7XG4gICAgICAvLyBEZXRlcm1pbmUgdGhlIHRhYiB0aGlzIENhc2VGaWVsZCBiZWxvbmdzIHRvIChzaG91bGQgYmUgb25seSBvbmUpLCBmcm9tIHRoZSBDYXNlVmlldyBvYmplY3QgaW4gdGhlIHNuYXBzaG90XG4gICAgICAvLyBkYXRhLCBhbmQgZXh0cmFjdCBhbGwgZmxhZ3MtcmVsYXRlZCBkYXRhIGZyb20gaXRzIEZsYWdzIGZpZWxkc1xuICAgICAgaWYgKHRoaXMucm91dGUuc25hcHNob3QuZGF0YS5jYXNlPy50YWJzKSB7XG4gICAgICAgIHRoaXMuZmxhZ3NEYXRhID0gKHRoaXMucm91dGUuc25hcHNob3QuZGF0YS5jYXNlLnRhYnMgYXMgQ2FzZVRhYltdKVxuICAgICAgICAgIC5maWx0ZXIoKHRhYikgPT4gdGFiLmZpZWxkcz8uc29tZShcbiAgICAgICAgICAgIC8vIFRoZXJlIGNvdWxkIGJlIG1vcmUgdGhhbiBvbmUgRmxhZ0xhdW5jaGVyIGZpZWxkIGluc3RhbmNlIHNvIGFuIGFkZGl0aW9uYWwgY2hlY2sgb2YgY2FzZUZpZWxkIElEIGlzXG4gICAgICAgICAgICAvLyByZXF1aXJlZCB0byBlbnN1cmUgdGhlIGNvcnJlY3QgaW5zdGFuY2UgaXMgb2J0YWluZWRcbiAgICAgICAgICAgIChjYXNlRmllbGQpID0+IGNhc2VGaWVsZC5maWVsZF90eXBlLnR5cGUgPT09ICdGbGFnTGF1bmNoZXInICYmIGNhc2VGaWVsZC5pZCA9PT0gdGhpcy5jYXNlRmllbGQuaWQpKVxuICAgICAgICAgIFswXS5maWVsZHM/LnJlZHVjZSgoZmxhZ3MsIGNhc2VGaWVsZCkgPT4gRmllbGRzVXRpbHMuZXh0cmFjdEZsYWdzRGF0YUZyb21DYXNlRmllbGQoXG4gICAgICAgICAgICBmbGFncywgY2FzZUZpZWxkLCBjYXNlRmllbGQuaWQsIGNhc2VGaWVsZCksIFtdKTtcbiAgICAgIH1cblxuICAgICAgLy8gU2VwYXJhdGUgdGhlIHBhcnR5LWxldmVsIGFuZCBjYXNlLWxldmVsIGZsYWdzXG4gICAgICB0aGlzLnBhcnR5TGV2ZWxDYXNlRmxhZ0RhdGEgPSB0aGlzLmZsYWdzRGF0YS5maWx0ZXIoXG4gICAgICAgIChpbnN0YW5jZSkgPT4gaW5zdGFuY2UucGF0aFRvRmxhZ3NGb3JtR3JvdXAgIT09IHRoaXMuY2FzZUxldmVsQ2FzZUZsYWdzRmllbGRJZCk7XG4gICAgICAvLyBJZiB0aGUgdXNlciBpcyBpbnRlcm5hbCwgZ3JvdXAgYWxsIGZsYWdzIGRhdGEgYnkgZ3JvdXBJZCB3aGVyZSBwcmVzZW50IHNvIHRoZXkgc2VlIGEgY29tYmluZWQgY29sbGVjdGlvbiBvZlxuICAgICAgLy8gaW50ZXJuYWwgYW5kIGV4dGVybmFsIGZsYWdzIGRhdGEgZm9yIGVhY2ggcGFydHlcbiAgICAgIGlmICghdGhpcy5jYXNlRmxhZ3NFeHRlcm5hbFVzZXIpIHtcbiAgICAgICAgY29uc3QgZ3JvdXBlZEZsYWdzRGF0YSA9IHRoaXMucGFydHlMZXZlbENhc2VGbGFnRGF0YVxuICAgICAgICAgIC5maWx0ZXIoKGYpID0+IGYuZmxhZ3MuZ3JvdXBJZClcbiAgICAgICAgICAucmVkdWNlKChtZXJnZWRGbGFnRGV0YWlscywgZikgPT4ge1xuICAgICAgICAgICAgbWVyZ2VkRmxhZ0RldGFpbHNbZi5mbGFncy5ncm91cElkXSA9IG1lcmdlZEZsYWdEZXRhaWxzW2YuZmxhZ3MuZ3JvdXBJZF0gfHwgW107XG4gICAgICAgICAgICAvLyBUaGUgZmxhZ3MuZGV0YWlscyBwcm9wZXJ0eSAod2hpY2ggc2hvdWxkIGJlIGFuIGFycmF5KSBjb3VsZCBiZSBmYWxzeTsgc3ByZWFkIGFuIGVtcHR5IGFycmF5IGlmIHNvXG4gICAgICAgICAgICBtZXJnZWRGbGFnRGV0YWlsc1tmLmZsYWdzLmdyb3VwSWRdLnB1c2goLi4uKGYuZmxhZ3MuZGV0YWlscyB8fCBbXSkpO1xuICAgICAgICAgICAgcmV0dXJuIG1lcmdlZEZsYWdEZXRhaWxzO1xuICAgICAgICAgIH0sIE9iamVjdC5jcmVhdGUobnVsbCkpO1xuICAgICAgICAvLyBSZW1vdmUgZHVwbGljYXRlIGZsYWdzIG9iamVjdHMgd2l0aCB0aGUgc2FtZSBncm91cElkICh3aGljaCBhcmUgZ29pbmcgdG8gYmUgdHJlYXRlZCBhcyBvbmUgZm9yIGRpc3BsYXlcbiAgICAgICAgLy8gcHVycG9zZXMpXG4gICAgICAgIGNvbnN0IHVuaXF1ZVBhcnR5RGF0YSA9IHRoaXMucGFydHlMZXZlbENhc2VGbGFnRGF0YVxuICAgICAgICAgIC5maWx0ZXIoKGYpID0+IGYuZmxhZ3MuZ3JvdXBJZClcbiAgICAgICAgICAucmVkdWNlKChmbGFnc1VuaXF1ZUJ5R3JvdXBJZCwgZikgPT4ge1xuICAgICAgICAgICAgaWYgKGZsYWdzVW5pcXVlQnlHcm91cElkLmZpbmRJbmRleChmbGFnID0+IGZsYWcuZmxhZ3MuZ3JvdXBJZCA9PT0gZi5mbGFncy5ncm91cElkKSA9PT0gLTEpIHtcbiAgICAgICAgICAgIC8vIFNldCB0aGUgY29ycmVzcG9uZGluZyBncm91cGVkIGZsYWdzIGRhdGFcbiAgICAgICAgICAgICAgZi5mbGFncy5kZXRhaWxzID0gZ3JvdXBlZEZsYWdzRGF0YVtmLmZsYWdzLmdyb3VwSWRdO1xuICAgICAgICAgICAgICBmbGFnc1VuaXF1ZUJ5R3JvdXBJZC5wdXNoKGYpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGZsYWdzVW5pcXVlQnlHcm91cElkO1xuICAgICAgICAgIH0sIFtdKTtcbiAgICAgICAgLy8gQXBwZW5kIGZsYWdzIG9iamVjdHMgd2l0aCBubyBncm91cElkXG4gICAgICAgIHRoaXMucGFydHlMZXZlbENhc2VGbGFnRGF0YS5maWx0ZXIoKGYpID0+ICFmLmZsYWdzLmdyb3VwSWQpLmZvckVhY2goKGYpID0+IHVuaXF1ZVBhcnR5RGF0YS5wdXNoKGYpKTtcbiAgICAgICAgdGhpcy5wYXJ0eUxldmVsQ2FzZUZsYWdEYXRhID0gdW5pcXVlUGFydHlEYXRhO1xuICAgICAgfVxuXG4gICAgICAvLyBUaGVyZSB3aWxsIGJlIG9ubHkgb25lIGNhc2UtbGV2ZWwgZmxhZ3MgaW5zdGFuY2UgY29udGFpbmluZyBhbGwgY2FzZS1sZXZlbCBmbGFnIGRldGFpbHNcbiAgICAgIHRoaXMuY2FzZUxldmVsQ2FzZUZsYWdEYXRhID0gdGhpcy5mbGFnc0RhdGEuZmluZChcbiAgICAgICAgKGluc3RhbmNlKSA9PiBpbnN0YW5jZS5wYXRoVG9GbGFnc0Zvcm1Hcm91cCA9PT0gdGhpcy5jYXNlTGV2ZWxDYXNlRmxhZ3NGaWVsZElkKTtcbiAgICB9IGVsc2UgaWYgKHRoaXMuY29udGV4dCA9PT0gUGFsZXR0ZUNvbnRleHQuQ0hFQ0tfWU9VUl9BTlNXRVIpIHtcbiAgICAgIC8vIElmIHRoZSBjb250ZXh0IGlzIFBhbGV0dGVDb250ZXh0LkNIRUNLX1lPVVJfQU5TV0VSLCB0aGUgRmxhZ3MgZGF0YSBpcyBhbHJlYWR5IHByZXNlbnQgd2l0aGluIHRoZSBGb3JtR3JvdXAuXG4gICAgICAvLyBUaGUgRmxhZ0xhdW5jaGVyIGNvbXBvbmVudCwgV3JpdGVDYXNlRmxhZ0ZpZWxkQ29tcG9uZW50LCBob2xkcyBhIHJlZmVyZW5jZSB0bzpcbiAgICAgIC8vIGkpIHRoZSBwYXJlbnQgRm9ybUdyb3VwIGZvciB0aGUgRmxhZ3MgaW5zdGFuY2Ugd2hlcmUgY2hhbmdlcyBoYXZlIGJlZW4gbWFkZTtcbiAgICAgIC8vIGlpKSB0aGUgY3VycmVudGx5IHNlbGVjdGVkIGZsYWcgKHNlbGVjdGVkRmxhZykgaWYgb25lIGV4aXN0c1xuICAgICAgaWYgKGZsYWdMYXVuY2hlckNvbXBvbmVudCkge1xuICAgICAgICAvLyBUaGUgRmxhZ0xhdW5jaGVyIGNvbXBvbmVudCBob2xkcyBhIHJlZmVyZW5jZSAoc2VsZWN0ZWRGbGFnc0xvY2F0aW9uKSBjb250YWluaW5nIHRoZSBDYXNlRmllbGQgaW5zdGFuY2UgdG9cbiAgICAgICAgLy8gd2hpY2ggdGhlIG5ldyBmbGFnIGhhcyBiZWVuIGFkZGVkXG4gICAgICAgIGlmICgoZmxhZ0xhdW5jaGVyQ29tcG9uZW50LmNhc2VGaWVsZC5kaXNwbGF5X2NvbnRleHRfcGFyYW1ldGVyID09PSBDYXNlRmxhZ0Rpc3BsYXlDb250ZXh0UGFyYW1ldGVyLkNSRUFURSB8fFxuICAgICAgICAgIGZsYWdMYXVuY2hlckNvbXBvbmVudC5jYXNlRmllbGQuZGlzcGxheV9jb250ZXh0X3BhcmFtZXRlciA9PT0gQ2FzZUZsYWdEaXNwbGF5Q29udGV4dFBhcmFtZXRlci5DUkVBVEVfMl9QT0lOVF8xIHx8XG4gICAgICAgICAgZmxhZ0xhdW5jaGVyQ29tcG9uZW50LmNhc2VGaWVsZC5kaXNwbGF5X2NvbnRleHRfcGFyYW1ldGVyID09PSBDYXNlRmxhZ0Rpc3BsYXlDb250ZXh0UGFyYW1ldGVyLkNSRUFURV9FWFRFUk5BTCkgJiZcbiAgICAgICAgICBmbGFnTGF1bmNoZXJDb21wb25lbnQuc2VsZWN0ZWRGbGFnc0xvY2F0aW9uKSB7XG4gICAgICAgICAgdGhpcy5jbGVhbnVwTmF2aWdhdGlvbkZvcm1BZGRpdGlvbnMoZmxhZ0xhdW5jaGVyQ29tcG9uZW50LnNlbGVjdGVkRmxhZ3NMb2NhdGlvbik7XG4gICAgICAgICAgdGhpcy5wYXRoVG9GbGFnc0Zvcm1Hcm91cCA9IGZsYWdMYXVuY2hlckNvbXBvbmVudC5zZWxlY3RlZEZsYWdzTG9jYXRpb24ucGF0aFRvRmxhZ3NGb3JtR3JvdXA7XG4gICAgICAgICAgdGhpcy5mbGFnRm9yU3VtbWFyeURpc3BsYXkgPSB0aGlzLmV4dHJhY3ROZXdGbGFnVG9GbGFnRGV0YWlsRGlzcGxheU9iamVjdChcbiAgICAgICAgICAgIGZsYWdMYXVuY2hlckNvbXBvbmVudC5zZWxlY3RlZEZsYWdzTG9jYXRpb24pO1xuICAgICAgICAvLyBUaGUgRmxhZ0xhdW5jaGVyIGNvbXBvbmVudCBob2xkcyBhIHJlZmVyZW5jZSAoc2VsZWN0ZWRGbGFnKSwgd2hpY2ggZ2V0cyBzZXQgYWZ0ZXIgdGhlIHNlbGVjdGlvbiBzdGVwIG9mIHRoZVxuICAgICAgICAvLyBNYW5hZ2UgQ2FzZSBGbGFncyBqb3VybmV5XG4gICAgICAgIH0gZWxzZSBpZiAoKGZsYWdMYXVuY2hlckNvbXBvbmVudC5jYXNlRmllbGQuZGlzcGxheV9jb250ZXh0X3BhcmFtZXRlciA9PT0gQ2FzZUZsYWdEaXNwbGF5Q29udGV4dFBhcmFtZXRlci5VUERBVEUgfHxcbiAgICAgICAgICBmbGFnTGF1bmNoZXJDb21wb25lbnQuY2FzZUZpZWxkLmRpc3BsYXlfY29udGV4dF9wYXJhbWV0ZXIgPT09IENhc2VGbGFnRGlzcGxheUNvbnRleHRQYXJhbWV0ZXIuVVBEQVRFXzJfUE9JTlRfMSB8fFxuICAgICAgICAgIGZsYWdMYXVuY2hlckNvbXBvbmVudC5jYXNlRmllbGQuZGlzcGxheV9jb250ZXh0X3BhcmFtZXRlciA9PT0gQ2FzZUZsYWdEaXNwbGF5Q29udGV4dFBhcmFtZXRlci5VUERBVEVfRVhURVJOQUwpICYmXG4gICAgICAgICAgKGZsYWdMYXVuY2hlckNvbXBvbmVudC5zZWxlY3RlZEZsYWcgfHxcbiAgICAgICAgICAgICh0aGlzLmNhc2VGbGFnU3RhdGVTZXJ2aWNlLmZvcm1Hcm91cC5nZXQoJ3NlbGVjdGVkTWFuYWdlQ2FzZUxvY2F0aW9uJykudmFsdWUuZmxhZ0RldGFpbERpc3BsYXkgJiYgdGhpcy5kaXNwbGF5Q29udGV4dFBhcmFtZXRlciA9PT0gQ2FzZUZsYWdEaXNwbGF5Q29udGV4dFBhcmFtZXRlci5VUERBVEVfMl9QT0lOVF8xKSkpIHtcbiAgICAgICAgICBpZiAodGhpcy5mb3JtR3JvdXAuZ2V0KGZsYWdMYXVuY2hlckNvbnRyb2xOYW1lKVsnY29tcG9uZW50J10/LnNlbGVjdGVkRmxhZz8uZmxhZ0RldGFpbERpc3BsYXkgIT09IHVuZGVmaW5lZCl7XG4gICAgICAgICAgICB0aGlzLmZsYWdGb3JTdW1tYXJ5RGlzcGxheSA9XG4gICAgICAgICAgICAgIHRoaXMuZm9ybUdyb3VwLmdldChmbGFnTGF1bmNoZXJDb250cm9sTmFtZSlbJ2NvbXBvbmVudCddLnNlbGVjdGVkRmxhZy5mbGFnRGV0YWlsRGlzcGxheTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5mbGFnRm9yU3VtbWFyeURpc3BsYXkgPVxuICAgICAgICAgICAgICB0aGlzLmNhc2VGbGFnU3RhdGVTZXJ2aWNlLmZvcm1Hcm91cC5nZXQoJ3NlbGVjdGVkTWFuYWdlQ2FzZUxvY2F0aW9uJykudmFsdWUuZmxhZ0RldGFpbERpc3BsYXk7XG4gICAgICAgICAgfVxuICAgICAgICAgIC8vIFRPRE86IG5vdCB0aGUgYmVzdCBzb2x1dGlvbiwgdGhlIGNhc2VGbGFnU3RhdGVTZXJ2aWNlIHNob3VsZCBoYXZlIGFsbCB0aGUgZmllbGRzLCB0aGVuIHdlIGNhbiBkZWxldGUgYSBsb3Qgb2YgdGhlIHRyYW5zZm9ybWF0aW9ucyBoZXJlXG4gICAgICAgICAgLy8gaW4gQ3JlYXRlIENhc2UgRmxhZyBpdCBhbHJlYWR5IGhhcyBhbGwgZmllbGRzXG4gICAgICAgICAgY29uc3QgY2FzZUZsYWdGb3JtR3JvdXBWYWx1ZSA9IHRoaXMuY2FzZUZsYWdTdGF0ZVNlcnZpY2UuZm9ybUdyb3VwPy52YWx1ZTtcbiAgICAgICAgICBpZiAoY2FzZUZsYWdGb3JtR3JvdXBWYWx1ZSkge1xuICAgICAgICAgICAgY2FzZUZsYWdGb3JtR3JvdXBWYWx1ZS5zdGF0dXMgPSBDYXNlRmxhZ1N0YXR1c1tjYXNlRmxhZ0Zvcm1Hcm91cFZhbHVlLnN0YXR1c107XG4gICAgICAgICAgICB0aGlzLmZsYWdGb3JTdW1tYXJ5RGlzcGxheS5mbGFnRGV0YWlsID0ge1xuICAgICAgICAgICAgICAuLi50aGlzLmZsYWdGb3JTdW1tYXJ5RGlzcGxheS5mbGFnRGV0YWlsLFxuICAgICAgICAgICAgICAuLi5jYXNlRmxhZ0Zvcm1Hcm91cFZhbHVlXG4gICAgICAgICAgICB9O1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgY2xlYW51cE5hdmlnYXRpb25Gb3JtQWRkaXRpb25zKHNlbGVjdGVkRmxhZ3NMb2NhdGlvbjogRmxhZ3NXaXRoRm9ybUdyb3VwUGF0aCl7XG4gICAgY29uc3QgcGF0aCA9IHNlbGVjdGVkRmxhZ3NMb2NhdGlvbi5wYXRoVG9GbGFnc0Zvcm1Hcm91cDtcbiAgICBPYmplY3Qua2V5cyh0aGlzLmZvcm1Hcm91cC5jb250cm9scykuZm9yRWFjaCgoY29udHJvbE5hbWUpID0+IHtcbiAgICAgIGNvbnN0IGNvbnRyb2wgPSB0aGlzLmZvcm1Hcm91cC5nZXQoY29udHJvbE5hbWUpO1xuICAgICAgaWYgKChjb250cm9sTmFtZSAhPT0gcGF0aCkpIHtcbiAgICAgICAgaWYgKGNvbnRyb2xbJ2Nhc2VGaWVsZCddLmZvcm1hdHRlZF92YWx1ZT8uZGV0YWlscyl7XG4gICAgICAgICAgLy8gd2Ugd2FudCB0byBsb29wIHRocm91Z2ggdGhlIGN1cnJlbnQgZmxhZyBkZXRhaWxzIHRvIGVuc3VyZSB0aGF0IHRoZXJlIGFyZSBubyBhZGRpdGlvbmFsIGRhdGEgZnJvbSB0aGUgdXNyZSByZXN0YXJ0aW5nIHRoZSBmbG93IHRoYXQgaGF2ZSBiZWVuIGFkZGVkLlxuICAgICAgICAgIGZvciAoY29uc3QgdmFsdWUgaW4gY29udHJvbFsnY2FzZUZpZWxkJ10uZm9ybWF0dGVkX3ZhbHVlPy5kZXRhaWxzKXtcbiAgICAgICAgICAgIC8vIGlmIHRoZSBpZCBpcyB1bmRlZmluZWQgdGhlbiB0aGUgdXNlciBoYXMgYWRkZWQgdGhpcyBhcyBwYXJ0IG9mIHRoZWlyIGN1cnJlbnQgZmxvdyBhbmQgd2Ugc2hvdWxkIHJlbW92ZSBpdCBzbyBpdCBkb2VzbnQgZ2V0IGFkZGVkIHRvIHRoZSBjYXNlXG4gICAgICAgICAgICBpZiAoIWNvbnRyb2xbJ2Nhc2VGaWVsZCddLmZvcm1hdHRlZF92YWx1ZT8uZGV0YWlsc1t2YWx1ZV0uaWQpe1xuICAgICAgICAgICAgICBjb250cm9sWydjYXNlRmllbGQnXS52YWx1ZS5kZXRhaWxzLnBvcCgpO1xuICAgICAgICAgICAgICBjb250cm9sWydjYXNlRmllbGQnXS5mb3JtYXR0ZWRfdmFsdWUuZGV0YWlscy5wb3AoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgZXh0cmFjdE5ld0ZsYWdUb0ZsYWdEZXRhaWxEaXNwbGF5T2JqZWN0KHNlbGVjdGVkRmxhZ3NMb2NhdGlvbjogRmxhZ3NXaXRoRm9ybUdyb3VwUGF0aCk6IEZsYWdEZXRhaWxEaXNwbGF5IHtcbiAgICAvLyBVc2UgdGhlIHBhdGhUb0ZsYWdzRm9ybUdyb3VwIHByb3BlcnR5IGZyb20gdGhlIHNlbGVjdGVkIGZsYWcgbG9jYXRpb24gdG8gZHJpbGwgZG93biB0byB0aGUgY29ycmVjdCBwYXJ0IG9mIHRoZVxuICAgIC8vIENhc2VGaWVsZCB2YWx1ZSBjb250YWluaW5nIHRoZSBuZXcgZmxhZ1xuICAgIGxldCBmbGFnc0Nhc2VGaWVsZFZhbHVlID0gc2VsZWN0ZWRGbGFnc0xvY2F0aW9uLmNhc2VGaWVsZD8udmFsdWU7XG4gICAgY29uc3QgcGF0aCA9IHNlbGVjdGVkRmxhZ3NMb2NhdGlvbi5wYXRoVG9GbGFnc0Zvcm1Hcm91cDtcbiAgICAvLyBSb290LWxldmVsIEZsYWdzIENhc2VGaWVsZHMgZG9uJ3QgaGF2ZSBhIGRvdC1kZWxpbWl0ZWQgcGF0aCAtIGp1c3QgdGhlIENhc2VGaWVsZCBJRCBpdHNlbGYgLSBzbyBkb24ndCBkcmlsbCBkb3duXG4gICAgaWYgKHBhdGguaW5kZXhPZignLicpID4gLTEpIHtcbiAgICAgIHBhdGguc2xpY2UocGF0aC5pbmRleE9mKCcuJykgKyAxKS5zcGxpdCgnLicpLmZvckVhY2gocGFydCA9PiBmbGFnc0Nhc2VGaWVsZFZhbHVlID0gZmxhZ3NDYXNlRmllbGRWYWx1ZVtwYXJ0XSk7XG4gICAgfVxuICAgIGlmIChmbGFnc0Nhc2VGaWVsZFZhbHVlKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBwYXJ0eU5hbWU6IGZsYWdzQ2FzZUZpZWxkVmFsdWUucGFydHlOYW1lLFxuICAgICAgICAvLyBMb29rIGluIHRoZSBkZXRhaWxzIGFycmF5IGZvciB0aGUgb2JqZWN0IHRoYXQgZG9lcyAqbm90KiBoYXZlIGFuIGlkIC0gdGhpcyBpbmRpY2F0ZXMgaXQgaXMgdGhlIG5ldyBmbGFnXG4gICAgICAgIGZsYWdEZXRhaWw6IGZsYWdzQ2FzZUZpZWxkVmFsdWUuZGV0YWlscz8uZmluZChlbGVtZW50ID0+ICFlbGVtZW50Lmhhc093blByb3BlcnR5KCdpZCcpKT8udmFsdWVcbiAgICAgIH0gYXMgRmxhZ0RldGFpbERpc3BsYXk7XG4gICAgfVxuXG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBwdWJsaWMgbmF2aWdhdGVCYWNrVG9Gb3JtKGZpZWxkU3RhdGU6IG51bWJlcik6IHZvaWQge1xuICAgIHRoaXMuY2FzZUZsYWdTdGF0ZVNlcnZpY2UuZmllbGRTdGF0ZVRvTmF2aWdhdGUgPSBmaWVsZFN0YXRlO1xuICAgIHRoaXMucm91dGVyLm5hdmlnYXRlKFtgLi4vJHt0aGlzLmNhc2VGbGFnU3RhdGVTZXJ2aWNlLnBhZ2VMb2NhdGlvbn1gXSwgeyByZWxhdGl2ZVRvOiB0aGlzLnJvdXRlIH0pO1xuICB9XG59XG4iLCI8bmctY29udGFpbmVyICpuZ0lmPVwiY29udGV4dCA9PT0gcGFsZXR0ZUNvbnRleHQuQ0hFQ0tfWU9VUl9BTlNXRVJcIj5cbiAgPGNjZC1jYXNlLWZsYWctc3VtbWFyeS1saXN0XG4gICAgW2ZsYWdGb3JTdW1tYXJ5RGlzcGxheV09XCJmbGFnRm9yU3VtbWFyeURpc3BsYXlcIlxuICAgIFtkaXNwbGF5Q29udGV4dFBhcmFtZXRlcl09XCJkaXNwbGF5Q29udGV4dFBhcmFtZXRlclwiXG4gICAgKGNoYW5nZUJ1dHRvbkVtaXR0ZXIpPVwibmF2aWdhdGVCYWNrVG9Gb3JtKCRldmVudClcIj5cbiAgPC9jY2QtY2FzZS1mbGFnLXN1bW1hcnktbGlzdD5cbjwvbmctY29udGFpbmVyPlxuXG48bmctY29udGFpbmVyICpuZ0lmPVwiY29udGV4dCAhPT0gcGFsZXR0ZUNvbnRleHQuQ0hFQ0tfWU9VUl9BTlNXRVJcIj5cbiAgPG5nLWNvbnRhaW5lciBbbmdTd2l0Y2hdPVwiZGlzcGxheUNvbnRleHRQYXJhbWV0ZXJcIj5cbiAgICA8bmctY29udGFpbmVyICpuZ1N3aXRjaENhc2U9XCJjYXNlRmxhZ0Rpc3BsYXlDb250ZXh0UGFyYW1ldGVyLlJFQURfRVhURVJOQUxcIj5cbiAgICAgIDxoMiBpZD1cInJlYWQtY2FzZS1mbGFnLXRpdGxlXCIgY2xhc3M9XCJnb3Z1ay1oZWFkaW5nLWxcIj5cbiAgICAgICAge3sgJ1N1cHBvcnQgcmVxdWVzdGVkJyB8IHJweFRyYW5zbGF0ZSB9fVxuICAgICAgPC9oMj5cblxuICAgICAgPGRpdiAqbmdGb3I9XCJsZXQgZmxhZ0RhdGEgb2YgcGFydHlMZXZlbENhc2VGbGFnRGF0YVwiPlxuICAgICAgICA8Y2NkLWNhc2UtZmxhZy10YWJsZSAqbmdJZj1cImZsYWdEYXRhLmZsYWdzLnBhcnR5TmFtZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbdGFibGVDYXB0aW9uXT1cIicnXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtmbGFnRGF0YV09XCJmbGFnRGF0YVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbZmlyc3RDb2x1bW5IZWFkZXJdPVwiZmxhZ0RhdGEuZmxhZ3MucGFydHlOYW1lXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjYXNlRmxhZ3NFeHRlcm5hbFVzZXJdPVwiY2FzZUZsYWdzRXh0ZXJuYWxVc2VyXCJcbiAgICAgICAgPjwvY2NkLWNhc2UtZmxhZy10YWJsZT5cbiAgICAgIDwvZGl2PlxuICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgPG5nLWNvbnRhaW5lciAqbmdTd2l0Y2hEZWZhdWx0PlxuICAgICAgPGgyIGlkPVwicmVhZC1jYXNlLWZsYWctdGl0bGVcIiBjbGFzcz1cImdvdnVrLWhlYWRpbmctbFwiPlxuICAgICAgICB7eyAnQ2FzZSBmbGFncycgfCBycHhUcmFuc2xhdGUgfX1cbiAgICAgIDwvaDI+XG5cbiAgICAgIDxkaXYgKm5nRm9yPVwibGV0IGZsYWdEYXRhIG9mIHBhcnR5TGV2ZWxDYXNlRmxhZ0RhdGFcIj5cbiAgICAgICAgPGNjZC1jYXNlLWZsYWctdGFibGUgKm5nSWY9XCJmbGFnRGF0YS5mbGFncy5wYXJ0eU5hbWVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3RhYmxlQ2FwdGlvbl09XCJmbGFnRGF0YS5mbGFncy5wYXJ0eU5hbWVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2ZsYWdEYXRhXT1cImZsYWdEYXRhXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtmaXJzdENvbHVtbkhlYWRlcl09XCInUGFydHkgbGV2ZWwgZmxhZ3MnIHwgcnB4VHJhbnNsYXRlXCJcbiAgICAgICAgPjwvY2NkLWNhc2UtZmxhZy10YWJsZT5cbiAgICAgIDwvZGl2PlxuICAgICAgPGRpdiAqbmdJZj1cImNhc2VMZXZlbENhc2VGbGFnRGF0YVwiPlxuICAgICAgICA8Y2NkLWNhc2UtZmxhZy10YWJsZVxuICAgICAgICAgIFt0YWJsZUNhcHRpb25dPVwiJ0Nhc2UgbGV2ZWwgZmxhZ3MnIHwgcnB4VHJhbnNsYXRlXCJcbiAgICAgICAgICBbZmxhZ0RhdGFdPVwiY2FzZUxldmVsQ2FzZUZsYWdEYXRhXCJcbiAgICAgICAgICBbZmlyc3RDb2x1bW5IZWFkZXJdPVwiJ0Nhc2UgZmxhZ3MnIHwgcnB4VHJhbnNsYXRlXCJcbiAgICAgICAgPjwvY2NkLWNhc2UtZmxhZy10YWJsZT5cbiAgICAgIDwvZGl2PlxuICAgIDwvbmctY29udGFpbmVyPlxuICA8L25nLWNvbnRhaW5lcj5cbjwvbmctY29udGFpbmVyPlxuIl19
253
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVhZC1jYXNlLWZsYWctZmllbGQuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvY2NkLWNhc2UtdWktdG9vbGtpdC9zcmMvbGliL3NoYXJlZC9jb21wb25lbnRzL3BhbGV0dGUvY2FzZS1mbGFnL3JlYWQtY2FzZS1mbGFnLWZpZWxkLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2NjZC1jYXNlLXVpLXRvb2xraXQvc3JjL2xpYi9zaGFyZWQvY29tcG9uZW50cy9wYWxldHRlL2Nhc2UtZmxhZy9yZWFkLWNhc2UtZmxhZy1maWVsZC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFVLE1BQU0sZUFBZSxDQUFDO0FBQ2xELE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFFekQsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQ3ZELE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLG9EQUFvRCxDQUFDO0FBQzFGLE9BQU8sRUFBRSwwQkFBMEIsRUFBRSxNQUFNLDZDQUE2QyxDQUFDO0FBQ3pGLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxvQ0FBb0MsQ0FBQztBQUVwRSxPQUFPLEVBQUUsK0JBQStCLEVBQUUsY0FBYyxFQUFFLE1BQU0sU0FBUyxDQUFDOzs7Ozs7SUNSMUUsNkJBQW1FO0lBQ2pFLHFEQUdxRDtJQUFuRCxxUEFBdUIsaUNBQTBCLEtBQUM7SUFDcEQsaUJBQTZCOzs7O0lBSDNCLGNBQStDO0lBQy9DLEFBREEsb0VBQStDLDJEQUNJOzs7SUFhL0MseUNBS3VCOzs7O0lBREQsQUFEQSxBQURBLEFBREEsaUNBQW1CLHlCQUNFLGtEQUN5Qix1REFDQzs7O0lBTHZFLDJCQUFxRDtJQUNuRCwrSUFLQztJQUNI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S0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLG1CQUFtQixHQUFHLG1CQUFtQixDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7UUFDaEgsQ0FBQztRQUNELElBQUksbUJBQW1CLEVBQUUsQ0FBQztZQUN4QixPQUFPO2dCQUNMLFNBQVMsRUFBRSxtQkFBbUIsQ0FBQyxTQUFTO2dCQUN4QywwR0FBMEc7Z0JBQzFHLFVBQVUsRUFBRSxtQkFBbUIsQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsQ0FBQyxPQUFPLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxDQUFDLEVBQUUsS0FBSzthQUMxRSxDQUFDO1FBQ3pCLENBQUM7UUFFRCxPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7SUFFTSxrQkFBa0IsQ0FBQyxVQUFrQjtRQUMxQyxJQUFJLENBQUMsb0JBQW9CLENBQUMsb0JBQW9CLEdBQUcsVUFBVSxDQUFDO1FBQzVELElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUMsTUFBTSxJQUFJLENBQUMsb0JBQW9CLENBQUMsWUFBWSxFQUFFLENBQUMsRUFBRSxFQUFFLFVBQVUsRUFBRSxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQztJQUNyRyxDQUFDO29GQTVJVSwwQkFBMEI7NkRBQTFCLDBCQUEwQjtZQ1B2QyxBQVJBLDZGQUFtRSxnRkFRQTs7WUFScEQsMkVBQWtEO1lBUWxELGNBQWtEO1lBQWxELDJFQUFrRDs7O2lGRE9wRCwwQkFBMEI7Y0FMdEMsU0FBUzsyQkFDRSwwQkFBMEI7O2tGQUl6QiwwQkFBMEIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIE9uSW5pdCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQWN0aXZhdGVkUm91dGUsIFJvdXRlciB9IGZyb20gJ0Bhbmd1bGFyL3JvdXRlcic7XG5pbXBvcnQgeyBDYXNlVGFiIH0gZnJvbSAnLi4vLi4vLi4vZG9tYWluJztcbmltcG9ydCB7IEZpZWxkc1V0aWxzIH0gZnJvbSAnLi4vLi4vLi4vc2VydmljZXMvZmllbGRzJztcbmltcG9ydCB7IENhc2VGbGFnU3RhdGVTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vY2FzZS1lZGl0b3Ivc2VydmljZXMvY2FzZS1mbGFnLXN0YXRlLnNlcnZpY2UnO1xuaW1wb3J0IHsgQWJzdHJhY3RGaWVsZFJlYWRDb21wb25lbnQgfSBmcm9tICcuLi9iYXNlLWZpZWxkL2Fic3RyYWN0LWZpZWxkLXJlYWQuY29tcG9uZW50JztcbmltcG9ydCB7IFBhbGV0dGVDb250ZXh0IH0gZnJvbSAnLi4vYmFzZS1maWVsZC9wYWxldHRlLWNvbnRleHQuZW51bSc7XG5pbXBvcnQgeyBGbGFnRGV0YWlsRGlzcGxheSwgRmxhZ3NXaXRoRm9ybUdyb3VwUGF0aCB9IGZyb20gJy4vZG9tYWluJztcbmltcG9ydCB7IENhc2VGbGFnRGlzcGxheUNvbnRleHRQYXJhbWV0ZXIsIENhc2VGbGFnU3RhdHVzIH0gZnJvbSAnLi9lbnVtcyc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2NjZC1yZWFkLWNhc2UtZmxhZy1maWVsZCcsXG4gIHRlbXBsYXRlVXJsOiAnLi9yZWFkLWNhc2UtZmxhZy1maWVsZC5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL3JlYWQtY2FzZS1mbGFnLWZpZWxkLmNvbXBvbmVudC5zY3NzJ11cbn0pXG5leHBvcnQgY2xhc3MgUmVhZENhc2VGbGFnRmllbGRDb21wb25lbnQgZXh0ZW5kcyBBYnN0cmFjdEZpZWxkUmVhZENvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCB7XG4gIHB1YmxpYyBmbGFnc0RhdGE6IEZsYWdzV2l0aEZvcm1Hcm91cFBhdGhbXTtcbiAgcHVibGljIHBhcnR5TGV2ZWxDYXNlRmxhZ0RhdGE6IEZsYWdzV2l0aEZvcm1Hcm91cFBhdGhbXTtcbiAgcHVibGljIGNhc2VMZXZlbENhc2VGbGFnRGF0YTogRmxhZ3NXaXRoRm9ybUdyb3VwUGF0aDtcbiAgcHVibGljIHBhbGV0dGVDb250ZXh0ID0gUGFsZXR0ZUNvbnRleHQ7XG4gIHB1YmxpYyBmbGFnRm9yU3VtbWFyeURpc3BsYXk6IEZsYWdEZXRhaWxEaXNwbGF5O1xuICBwdWJsaWMgZGlzcGxheUNvbnRleHRQYXJhbWV0ZXI6IENhc2VGbGFnRGlzcGxheUNvbnRleHRQYXJhbWV0ZXI7XG4gIHB1YmxpYyBjYXNlRmxhZ3NFeHRlcm5hbFVzZXIgPSBmYWxzZTtcbiAgcHVibGljIHBhdGhUb0ZsYWdzRm9ybUdyb3VwOiBzdHJpbmc7XG4gIHByaXZhdGUgcmVhZG9ubHkgY2FzZUxldmVsQ2FzZUZsYWdzRmllbGRJZCA9ICdjYXNlRmxhZ3MnO1xuXG4gIHB1YmxpYyBnZXQgY2FzZUZsYWdEaXNwbGF5Q29udGV4dFBhcmFtZXRlcigpOiB0eXBlb2YgQ2FzZUZsYWdEaXNwbGF5Q29udGV4dFBhcmFtZXRlciB7XG4gICAgcmV0dXJuIENhc2VGbGFnRGlzcGxheUNvbnRleHRQYXJhbWV0ZXI7XG4gIH1cblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIHJlYWRvbmx5IHJvdXRlOiBBY3RpdmF0ZWRSb3V0ZSxcbiAgICBwcml2YXRlIHJlYWRvbmx5IHJvdXRlcjogUm91dGVyLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgY2FzZUZsYWdTdGF0ZVNlcnZpY2U6IENhc2VGbGFnU3RhdGVTZXJ2aWNlXG4gICkge1xuICAgIHN1cGVyKCk7XG4gIH1cblxuICBwdWJsaWMgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgY29uc3QgZmxhZ0xhdW5jaGVyQ29udHJvbE5hbWUgPSBPYmplY3Qua2V5cyh0aGlzLmZvcm1Hcm91cC5jb250cm9scykuZmluZChcbiAgICAgIGNvbnRyb2xOYW1lID0+IEZpZWxkc1V0aWxzLmlzQ2FzZUZpZWxkT2ZUeXBlKHRoaXMuZm9ybUdyb3VwLmdldChjb250cm9sTmFtZSlbJ2Nhc2VGaWVsZCddLCBbJ0ZsYWdMYXVuY2hlciddKSk7XG4gICAgY29uc3QgZmxhZ0xhdW5jaGVyQ29tcG9uZW50ID0gdGhpcy5mb3JtR3JvdXAuZ2V0KGZsYWdMYXVuY2hlckNvbnRyb2xOYW1lKT8uWydjb21wb25lbnQnXTtcbiAgICB0aGlzLmRpc3BsYXlDb250ZXh0UGFyYW1ldGVyID0gZmxhZ0xhdW5jaGVyQ29tcG9uZW50Py5jYXNlRmllbGQ/LmRpc3BsYXlfY29udGV4dF9wYXJhbWV0ZXI7XG4gICAgdGhpcy5jYXNlRmxhZ3NFeHRlcm5hbFVzZXIgPSB0aGlzLmRpc3BsYXlDb250ZXh0UGFyYW1ldGVyID09PSBDYXNlRmxhZ0Rpc3BsYXlDb250ZXh0UGFyYW1ldGVyLlJFQURfRVhURVJOQUw7XG5cbiAgICAvLyBJZiB0aGUgY29udGV4dCBpcyBQYWxldHRlQ29udGV4dC5ERUZBVUxULCB0aGUgRmxhZ3MgZmllbGRzIG5lZWQgdG8gYmUgbG9jYXRlZCBieSBDYXNlVGFiICh0aGV5IHdvbid0IGJlIHByZXNlbnRcbiAgICAvLyBpbiB0aGUgRm9ybUdyb3VwIC0gb25seSB0aGUgRmxhZ0xhdW5jaGVyIGZpZWxkIGlzIHByZXNlbnQpXG4gICAgaWYgKHRoaXMuY29udGV4dCA9PT0gUGFsZXR0ZUNvbnRleHQuREVGQVVMVCkge1xuICAgICAgLy8gRGV0ZXJtaW5lIHRoZSB0YWIgdGhpcyBDYXNlRmllbGQgYmVsb25ncyB0byAoc2hvdWxkIGJlIG9ubHkgb25lKSwgZnJvbSB0aGUgQ2FzZVZpZXcgb2JqZWN0IGluIHRoZSBzbmFwc2hvdFxuICAgICAgLy8gZGF0YSwgYW5kIGV4dHJhY3QgYWxsIGZsYWdzLXJlbGF0ZWQgZGF0YSBmcm9tIGl0cyBGbGFncyBmaWVsZHNcbiAgICAgIGlmICh0aGlzLnJvdXRlLnNuYXBzaG90LmRhdGEuY2FzZT8udGFicykge1xuICAgICAgICB0aGlzLmZsYWdzRGF0YSA9ICh0aGlzLnJvdXRlLnNuYXBzaG90LmRhdGEuY2FzZS50YWJzIGFzIENhc2VUYWJbXSlcbiAgICAgICAgICAuZmlsdGVyKCh0YWIpID0+IHRhYi5maWVsZHM/LnNvbWUoXG4gICAgICAgICAgICAvLyBUaGVyZSBjb3VsZCBiZSBtb3JlIHRoYW4gb25lIEZsYWdMYXVuY2hlciBmaWVsZCBpbnN0YW5jZSBzbyBhbiBhZGRpdGlvbmFsIGNoZWNrIG9mIGNhc2VGaWVsZCBJRCBpc1xuICAgICAgICAgICAgLy8gcmVxdWlyZWQgdG8gZW5zdXJlIHRoZSBjb3JyZWN0IGluc3RhbmNlIGlzIG9idGFpbmVkXG4gICAgICAgICAgICAoY2FzZUZpZWxkKSA9PiBjYXNlRmllbGQuZmllbGRfdHlwZS50eXBlID09PSAnRmxhZ0xhdW5jaGVyJyAmJiBjYXNlRmllbGQuaWQgPT09IHRoaXMuY2FzZUZpZWxkLmlkKSlcbiAgICAgICAgICBbMF0uZmllbGRzPy5yZWR1Y2UoKGZsYWdzLCBjYXNlRmllbGQpID0+IEZpZWxkc1V0aWxzLmV4dHJhY3RGbGFnc0RhdGFGcm9tQ2FzZUZpZWxkKFxuICAgICAgICAgICAgZmxhZ3MsIGNhc2VGaWVsZCwgY2FzZUZpZWxkLmlkLCBjYXNlRmllbGQpLCBbXSk7XG4gICAgICB9XG5cbiAgICAgIC8vIFNlcGFyYXRlIHRoZSBwYXJ0eS1sZXZlbCBhbmQgY2FzZS1sZXZlbCBmbGFnc1xuICAgICAgdGhpcy5wYXJ0eUxldmVsQ2FzZUZsYWdEYXRhID0gdGhpcy5mbGFnc0RhdGEuZmlsdGVyKFxuICAgICAgICAoaW5zdGFuY2UpID0+IGluc3RhbmNlLnBhdGhUb0ZsYWdzRm9ybUdyb3VwICE9PSB0aGlzLmNhc2VMZXZlbENhc2VGbGFnc0ZpZWxkSWQpO1xuICAgICAgLy8gSWYgdGhlIHVzZXIgaXMgaW50ZXJuYWwsIGdyb3VwIGFsbCBmbGFncyBkYXRhIGJ5IGdyb3VwSWQgd2hlcmUgcHJlc2VudCBzbyB0aGV5IHNlZSBhIGNvbWJpbmVkIGNvbGxlY3Rpb24gb2ZcbiAgICAgIC8vIGludGVybmFsIGFuZCBleHRlcm5hbCBmbGFncyBkYXRhIGZvciBlYWNoIHBhcnR5XG4gICAgICBpZiAoIXRoaXMuY2FzZUZsYWdzRXh0ZXJuYWxVc2VyKSB7XG4gICAgICAgIGNvbnN0IGdyb3VwZWRGbGFnc0RhdGEgPSB0aGlzLnBhcnR5TGV2ZWxDYXNlRmxhZ0RhdGFcbiAgICAgICAgLmZpbHRlcigoZikgPT4gZi5mbGFncy5ncm91cElkKVxuICAgICAgICAucmVkdWNlKChtZXJnZWRGbGFnRGV0YWlscywgZikgPT4ge1xuICAgICAgICAgIG1lcmdlZEZsYWdEZXRhaWxzW2YuZmxhZ3MuZ3JvdXBJZF0gPSBtZXJnZWRGbGFnRGV0YWlsc1tmLmZsYWdzLmdyb3VwSWRdIHx8IFtdO1xuICAgICAgICAgIC8vIFRoZSBmbGFncy5kZXRhaWxzIHByb3BlcnR5ICh3aGljaCBzaG91bGQgYmUgYW4gYXJyYXkpIGNvdWxkIGJlIGZhbHN5OyBzcHJlYWQgYW4gZW1wdHkgYXJyYXkgaWYgc29cbiAgICAgICAgICBtZXJnZWRGbGFnRGV0YWlsc1tmLmZsYWdzLmdyb3VwSWRdLnB1c2goLi4uKGYuZmxhZ3MuZGV0YWlscyB8fCBbXSkpO1xuICAgICAgICAgIHJldHVybiBtZXJnZWRGbGFnRGV0YWlscztcbiAgICAgICAgfSwgT2JqZWN0LmNyZWF0ZShudWxsKSk7XG4gICAgICAgIC8vIFJlbW92ZSBkdXBsaWNhdGUgZmxhZ3Mgb2JqZWN0cyB3aXRoIHRoZSBzYW1lIGdyb3VwSWQgKHdoaWNoIGFyZSBnb2luZyB0byBiZSB0cmVhdGVkIGFzIG9uZSBmb3IgZGlzcGxheVxuICAgICAgICAvLyBwdXJwb3NlcylcbiAgICAgICAgY29uc3QgdW5pcXVlUGFydHlEYXRhID0gdGhpcy5wYXJ0eUxldmVsQ2FzZUZsYWdEYXRhXG4gICAgICAgIC5maWx0ZXIoKGYpID0+IGYuZmxhZ3MuZ3JvdXBJZClcbiAgICAgICAgLnJlZHVjZSgoZmxhZ3NVbmlxdWVCeUdyb3VwSWQsIGYpID0+IHtcbiAgICAgICAgICBpZiAoZmxhZ3NVbmlxdWVCeUdyb3VwSWQuZmluZEluZGV4KGZsYWcgPT4gZmxhZy5mbGFncy5ncm91cElkID09PSBmLmZsYWdzLmdyb3VwSWQpID09PSAtMSkge1xuICAgICAgICAgICAgLy8gU2V0IHRoZSBjb3JyZXNwb25kaW5nIGdyb3VwZWQgZmxhZ3MgZGF0YVxuICAgICAgICAgICAgZi5mbGFncy5kZXRhaWxzID0gZ3JvdXBlZEZsYWdzRGF0YVtmLmZsYWdzLmdyb3VwSWRdO1xuICAgICAgICAgICAgZmxhZ3NVbmlxdWVCeUdyb3VwSWQucHVzaChmKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIGZsYWdzVW5pcXVlQnlHcm91cElkO1xuICAgICAgICB9LCBbXSk7XG4gICAgICAgIC8vIEFwcGVuZCBmbGFncyBvYmplY3RzIHdpdGggbm8gZ3JvdXBJZFxuICAgICAgICB0aGlzLnBhcnR5TGV2ZWxDYXNlRmxhZ0RhdGEuZmlsdGVyKChmKSA9PiAhZi5mbGFncy5ncm91cElkKS5mb3JFYWNoKChmKSA9PiB1bmlxdWVQYXJ0eURhdGEucHVzaChmKSk7XG4gICAgICAgIHRoaXMucGFydHlMZXZlbENhc2VGbGFnRGF0YSA9IHVuaXF1ZVBhcnR5RGF0YTtcbiAgICAgIH1cblxuICAgICAgLy8gVGhlcmUgd2lsbCBiZSBvbmx5IG9uZSBjYXNlLWxldmVsIGZsYWdzIGluc3RhbmNlIGNvbnRhaW5pbmcgYWxsIGNhc2UtbGV2ZWwgZmxhZyBkZXRhaWxzXG4gICAgICB0aGlzLmNhc2VMZXZlbENhc2VGbGFnRGF0YSA9IHRoaXMuZmxhZ3NEYXRhLmZpbmQoXG4gICAgICAgIChpbnN0YW5jZSkgPT4gaW5zdGFuY2UucGF0aFRvRmxhZ3NGb3JtR3JvdXAgPT09IHRoaXMuY2FzZUxldmVsQ2FzZUZsYWdzRmllbGRJZCk7XG4gICAgfSBlbHNlIGlmICh0aGlzLmNvbnRleHQgPT09IFBhbGV0dGVDb250ZXh0LkNIRUNLX1lPVVJfQU5TV0VSKSB7XG4gICAgICAvLyBJZiB0aGUgY29udGV4dCBpcyBQYWxldHRlQ29udGV4dC5DSEVDS19ZT1VSX0FOU1dFUiwgdGhlIEZsYWdzIGRhdGEgaXMgYWxyZWFkeSBwcmVzZW50IHdpdGhpbiB0aGUgRm9ybUdyb3VwLlxuICAgICAgLy8gVGhlIEZsYWdMYXVuY2hlciBjb21wb25lbnQsIFdyaXRlQ2FzZUZsYWdGaWVsZENvbXBvbmVudCwgaG9sZHMgYSByZWZlcmVuY2UgdG86XG4gICAgICAvLyBpKSB0aGUgcGFyZW50IEZvcm1Hcm91cCBmb3IgdGhlIEZsYWdzIGluc3RhbmNlIHdoZXJlIGNoYW5nZXMgaGF2ZSBiZWVuIG1hZGU7XG4gICAgICAvLyBpaSkgdGhlIGN1cnJlbnRseSBzZWxlY3RlZCBmbGFnIChzZWxlY3RlZEZsYWcpIGlmIG9uZSBleGlzdHNcbiAgICAgIGlmIChmbGFnTGF1bmNoZXJDb21wb25lbnQpIHtcbiAgICAgICAgLy8gVGhlIEZsYWdMYXVuY2hlciBjb21wb25lbnQgaG9sZHMgYSByZWZlcmVuY2UgKHNlbGVjdGVkRmxhZ3NMb2NhdGlvbikgY29udGFpbmluZyB0aGUgQ2FzZUZpZWxkIGluc3RhbmNlIHRvXG4gICAgICAgIC8vIHdoaWNoIHRoZSBuZXcgZmxhZyBoYXMgYmVlbiBhZGRlZFxuICAgICAgICBpZiAoKGZsYWdMYXVuY2hlckNvbXBvbmVudC5jYXNlRmllbGQuZGlzcGxheV9jb250ZXh0X3BhcmFtZXRlciA9PT0gQ2FzZUZsYWdEaXNwbGF5Q29udGV4dFBhcmFtZXRlci5DUkVBVEUgfHxcbiAgICAgICAgICBmbGFnTGF1bmNoZXJDb21wb25lbnQuY2FzZUZpZWxkLmRpc3BsYXlfY29udGV4dF9wYXJhbWV0ZXIgPT09IENhc2VGbGFnRGlzcGxheUNvbnRleHRQYXJhbWV0ZXIuQ1JFQVRFXzJfUE9JTlRfMSB8fFxuICAgICAgICAgIGZsYWdMYXVuY2hlckNvbXBvbmVudC5jYXNlRmllbGQuZGlzcGxheV9jb250ZXh0X3BhcmFtZXRlciA9PT0gQ2FzZUZsYWdEaXNwbGF5Q29udGV4dFBhcmFtZXRlci5DUkVBVEVfRVhURVJOQUwpICYmXG4gICAgICAgICAgZmxhZ0xhdW5jaGVyQ29tcG9uZW50LnNlbGVjdGVkRmxhZ3NMb2NhdGlvbikge1xuICAgICAgICAgICAgdGhpcy5wYXRoVG9GbGFnc0Zvcm1Hcm91cCA9IGZsYWdMYXVuY2hlckNvbXBvbmVudC5zZWxlY3RlZEZsYWdzTG9jYXRpb24ucGF0aFRvRmxhZ3NGb3JtR3JvdXA7XG4gICAgICAgICAgICB0aGlzLmZsYWdGb3JTdW1tYXJ5RGlzcGxheSA9IHRoaXMuZXh0cmFjdE5ld0ZsYWdUb0ZsYWdEZXRhaWxEaXNwbGF5T2JqZWN0KFxuICAgICAgICAgICAgICBmbGFnTGF1bmNoZXJDb21wb25lbnQuc2VsZWN0ZWRGbGFnc0xvY2F0aW9uKTtcbiAgICAgICAgLy8gVGhlIEZsYWdMYXVuY2hlciBjb21wb25lbnQgaG9sZHMgYSByZWZlcmVuY2UgKHNlbGVjdGVkRmxhZyksIHdoaWNoIGdldHMgc2V0IGFmdGVyIHRoZSBzZWxlY3Rpb24gc3RlcCBvZiB0aGVcbiAgICAgICAgLy8gTWFuYWdlIENhc2UgRmxhZ3Mgam91cm5leVxuICAgICAgICB9IGVsc2UgaWYgKChmbGFnTGF1bmNoZXJDb21wb25lbnQuY2FzZUZpZWxkLmRpc3BsYXlfY29udGV4dF9wYXJhbWV0ZXIgPT09IENhc2VGbGFnRGlzcGxheUNvbnRleHRQYXJhbWV0ZXIuVVBEQVRFIHx8XG4gICAgICAgICAgZmxhZ0xhdW5jaGVyQ29tcG9uZW50LmNhc2VGaWVsZC5kaXNwbGF5X2NvbnRleHRfcGFyYW1ldGVyID09PSBDYXNlRmxhZ0Rpc3BsYXlDb250ZXh0UGFyYW1ldGVyLlVQREFURV8yX1BPSU5UXzEgfHxcbiAgICAgICAgICBmbGFnTGF1bmNoZXJDb21wb25lbnQuY2FzZUZpZWxkLmRpc3BsYXlfY29udGV4dF9wYXJhbWV0ZXIgPT09IENhc2VGbGFnRGlzcGxheUNvbnRleHRQYXJhbWV0ZXIuVVBEQVRFX0VYVEVSTkFMKSAmJlxuICAgICAgICAgIGZsYWdMYXVuY2hlckNvbXBvbmVudC5zZWxlY3RlZEZsYWcpIHtcbiAgICAgICAgICAgIHRoaXMuZmxhZ0ZvclN1bW1hcnlEaXNwbGF5ID1cbiAgICAgICAgICAgICAgdGhpcy5mb3JtR3JvdXAuZ2V0KGZsYWdMYXVuY2hlckNvbnRyb2xOYW1lKVsnY29tcG9uZW50J10uc2VsZWN0ZWRGbGFnLmZsYWdEZXRhaWxEaXNwbGF5O1xuICAgICAgICAgIC8vIFRPRE86IG5vdCB0aGUgYmVzdCBzb2x1dGlvbiwgdGhlIGNhc2VGbGFnU3RhdGVTZXJ2aWNlIHNob3VsZCBoYXZlIGFsbCB0aGUgZmllbGRzLCB0aGVuIHdlIGNhbiBkZWxldGUgYSBsb3Qgb2YgdGhlIHRyYW5zZm9ybWF0aW9ucyBoZXJlXG4gICAgICAgICAgLy8gaW4gQ3JlYXRlIENhc2UgRmxhZyBpdCBhbHJlYWR5IGhhcyBhbGwgZmllbGRzXG4gICAgICAgICAgY29uc3QgY2FzZUZsYWdGb3JtR3JvdXBWYWx1ZSA9IHRoaXMuY2FzZUZsYWdTdGF0ZVNlcnZpY2UuZm9ybUdyb3VwPy52YWx1ZTtcbiAgICAgICAgICBpZiAoY2FzZUZsYWdGb3JtR3JvdXBWYWx1ZSkge1xuICAgICAgICAgICAgY2FzZUZsYWdGb3JtR3JvdXBWYWx1ZS5zdGF0dXMgPSBDYXNlRmxhZ1N0YXR1c1tjYXNlRmxhZ0Zvcm1Hcm91cFZhbHVlLnN0YXR1c107XG4gICAgICAgICAgICB0aGlzLmZsYWdGb3JTdW1tYXJ5RGlzcGxheS5mbGFnRGV0YWlsID0ge1xuICAgICAgICAgICAgICAuLi50aGlzLmZsYWdGb3JTdW1tYXJ5RGlzcGxheS5mbGFnRGV0YWlsLFxuICAgICAgICAgICAgICAuLi5jYXNlRmxhZ0Zvcm1Hcm91cFZhbHVlXG4gICAgICAgICAgICB9O1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgZXh0cmFjdE5ld0ZsYWdUb0ZsYWdEZXRhaWxEaXNwbGF5T2JqZWN0KHNlbGVjdGVkRmxhZ3NMb2NhdGlvbjogRmxhZ3NXaXRoRm9ybUdyb3VwUGF0aCk6IEZsYWdEZXRhaWxEaXNwbGF5IHtcbiAgICAvLyBVc2UgdGhlIHBhdGhUb0ZsYWdzRm9ybUdyb3VwIHByb3BlcnR5IGZyb20gdGhlIHNlbGVjdGVkIGZsYWcgbG9jYXRpb24gdG8gZHJpbGwgZG93biB0byB0aGUgY29ycmVjdCBwYXJ0IG9mIHRoZVxuICAgIC8vIENhc2VGaWVsZCB2YWx1ZSBjb250YWluaW5nIHRoZSBuZXcgZmxhZ1xuICAgIGxldCBmbGFnc0Nhc2VGaWVsZFZhbHVlID0gc2VsZWN0ZWRGbGFnc0xvY2F0aW9uLmNhc2VGaWVsZD8udmFsdWU7XG4gICAgY29uc3QgcGF0aCA9IHNlbGVjdGVkRmxhZ3NMb2NhdGlvbi5wYXRoVG9GbGFnc0Zvcm1Hcm91cDtcbiAgICAvLyBSb290LWxldmVsIEZsYWdzIENhc2VGaWVsZHMgZG9uJ3QgaGF2ZSBhIGRvdC1kZWxpbWl0ZWQgcGF0aCAtIGp1c3QgdGhlIENhc2VGaWVsZCBJRCBpdHNlbGYgLSBzbyBkb24ndCBkcmlsbCBkb3duXG4gICAgaWYgKHBhdGguaW5kZXhPZignLicpID4gLTEpIHtcbiAgICAgIHBhdGguc2xpY2UocGF0aC5pbmRleE9mKCcuJykgKyAxKS5zcGxpdCgnLicpLmZvckVhY2gocGFydCA9PiBmbGFnc0Nhc2VGaWVsZFZhbHVlID0gZmxhZ3NDYXNlRmllbGRWYWx1ZVtwYXJ0XSk7XG4gICAgfVxuICAgIGlmIChmbGFnc0Nhc2VGaWVsZFZhbHVlKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBwYXJ0eU5hbWU6IGZsYWdzQ2FzZUZpZWxkVmFsdWUucGFydHlOYW1lLFxuICAgICAgICAvLyBMb29rIGluIHRoZSBkZXRhaWxzIGFycmF5IGZvciB0aGUgb2JqZWN0IHRoYXQgZG9lcyAqbm90KiBoYXZlIGFuIGlkIC0gdGhpcyBpbmRpY2F0ZXMgaXQgaXMgdGhlIG5ldyBmbGFnXG4gICAgICAgIGZsYWdEZXRhaWw6IGZsYWdzQ2FzZUZpZWxkVmFsdWUuZGV0YWlscz8uZmluZChlbGVtZW50ID0+ICFlbGVtZW50Lmhhc093blByb3BlcnR5KCdpZCcpKT8udmFsdWVcbiAgICAgIH0gYXMgRmxhZ0RldGFpbERpc3BsYXk7XG4gICAgfVxuXG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBwdWJsaWMgbmF2aWdhdGVCYWNrVG9Gb3JtKGZpZWxkU3RhdGU6IG51bWJlcik6IHZvaWQge1xuICAgIHRoaXMuY2FzZUZsYWdTdGF0ZVNlcnZpY2UuZmllbGRTdGF0ZVRvTmF2aWdhdGUgPSBmaWVsZFN0YXRlO1xuICAgIHRoaXMucm91dGVyLm5hdmlnYXRlKFtgLi4vJHt0aGlzLmNhc2VGbGFnU3RhdGVTZXJ2aWNlLnBhZ2VMb2NhdGlvbn1gXSwgeyByZWxhdGl2ZVRvOiB0aGlzLnJvdXRlIH0pO1xuICB9XG59XG4iLCI8bmctY29udGFpbmVyICpuZ0lmPVwiY29udGV4dCA9PT0gcGFsZXR0ZUNvbnRleHQuQ0hFQ0tfWU9VUl9BTlNXRVJcIj5cbiAgPGNjZC1jYXNlLWZsYWctc3VtbWFyeS1saXN0XG4gICAgW2ZsYWdGb3JTdW1tYXJ5RGlzcGxheV09XCJmbGFnRm9yU3VtbWFyeURpc3BsYXlcIlxuICAgIFtkaXNwbGF5Q29udGV4dFBhcmFtZXRlcl09XCJkaXNwbGF5Q29udGV4dFBhcmFtZXRlclwiXG4gICAgKGNoYW5nZUJ1dHRvbkVtaXR0ZXIpPVwibmF2aWdhdGVCYWNrVG9Gb3JtKCRldmVudClcIj5cbiAgPC9jY2QtY2FzZS1mbGFnLXN1bW1hcnktbGlzdD5cbjwvbmctY29udGFpbmVyPlxuXG48bmctY29udGFpbmVyICpuZ0lmPVwiY29udGV4dCAhPT0gcGFsZXR0ZUNvbnRleHQuQ0hFQ0tfWU9VUl9BTlNXRVJcIj5cbiAgPG5nLWNvbnRhaW5lciBbbmdTd2l0Y2hdPVwiZGlzcGxheUNvbnRleHRQYXJhbWV0ZXJcIj5cbiAgICA8bmctY29udGFpbmVyICpuZ1N3aXRjaENhc2U9XCJjYXNlRmxhZ0Rpc3BsYXlDb250ZXh0UGFyYW1ldGVyLlJFQURfRVhURVJOQUxcIj5cbiAgICAgIDxoMiBpZD1cInJlYWQtY2FzZS1mbGFnLXRpdGxlXCIgY2xhc3M9XCJnb3Z1ay1oZWFkaW5nLWxcIj5cbiAgICAgICAge3sgJ1N1cHBvcnQgcmVxdWVzdGVkJyB8IHJweFRyYW5zbGF0ZSB9fVxuICAgICAgPC9oMj5cblxuICAgICAgPGRpdiAqbmdGb3I9XCJsZXQgZmxhZ0RhdGEgb2YgcGFydHlMZXZlbENhc2VGbGFnRGF0YVwiPlxuICAgICAgICA8Y2NkLWNhc2UtZmxhZy10YWJsZSAqbmdJZj1cImZsYWdEYXRhLmZsYWdzLnBhcnR5TmFtZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbdGFibGVDYXB0aW9uXT1cIicnXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtmbGFnRGF0YV09XCJmbGFnRGF0YVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbZmlyc3RDb2x1bW5IZWFkZXJdPVwiZmxhZ0RhdGEuZmxhZ3MucGFydHlOYW1lXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjYXNlRmxhZ3NFeHRlcm5hbFVzZXJdPVwiY2FzZUZsYWdzRXh0ZXJuYWxVc2VyXCJcbiAgICAgICAgPjwvY2NkLWNhc2UtZmxhZy10YWJsZT5cbiAgICAgIDwvZGl2PlxuICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgPG5nLWNvbnRhaW5lciAqbmdTd2l0Y2hEZWZhdWx0PlxuICAgICAgPGgyIGlkPVwicmVhZC1jYXNlLWZsYWctdGl0bGVcIiBjbGFzcz1cImdvdnVrLWhlYWRpbmctbFwiPlxuICAgICAgICB7eyAnQ2FzZSBmbGFncycgfCBycHhUcmFuc2xhdGUgfX1cbiAgICAgIDwvaDI+XG5cbiAgICAgIDxkaXYgKm5nRm9yPVwibGV0IGZsYWdEYXRhIG9mIHBhcnR5TGV2ZWxDYXNlRmxhZ0RhdGFcIj5cbiAgICAgICAgPGNjZC1jYXNlLWZsYWctdGFibGUgKm5nSWY9XCJmbGFnRGF0YS5mbGFncy5wYXJ0eU5hbWVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3RhYmxlQ2FwdGlvbl09XCJmbGFnRGF0YS5mbGFncy5wYXJ0eU5hbWVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2ZsYWdEYXRhXT1cImZsYWdEYXRhXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtmaXJzdENvbHVtbkhlYWRlcl09XCInUGFydHkgbGV2ZWwgZmxhZ3MnIHwgcnB4VHJhbnNsYXRlXCJcbiAgICAgICAgPjwvY2NkLWNhc2UtZmxhZy10YWJsZT5cbiAgICAgIDwvZGl2PlxuICAgICAgPGRpdiAqbmdJZj1cImNhc2VMZXZlbENhc2VGbGFnRGF0YVwiPlxuICAgICAgICA8Y2NkLWNhc2UtZmxhZy10YWJsZVxuICAgICAgICAgIFt0YWJsZUNhcHRpb25dPVwiJ0Nhc2UgbGV2ZWwgZmxhZ3MnIHwgcnB4VHJhbnNsYXRlXCJcbiAgICAgICAgICBbZmxhZ0RhdGFdPVwiY2FzZUxldmVsQ2FzZUZsYWdEYXRhXCJcbiAgICAgICAgICBbZmlyc3RDb2x1bW5IZWFkZXJdPVwiJ0Nhc2UgZmxhZ3MnIHwgcnB4VHJhbnNsYXRlXCJcbiAgICAgICAgPjwvY2NkLWNhc2UtZmxhZy10YWJsZT5cbiAgICAgIDwvZGl2PlxuICAgIDwvbmctY29udGFpbmVyPlxuICA8L25nLWNvbnRhaW5lcj5cbjwvbmctY29udGFpbmVyPlxuIl19