verben-workflow-ui 0.5.76 → 0.5.78

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 (182) hide show
  1. package/README.md +13 -0
  2. package/esm2022/src/lib/components/actors/actors.component.mjs +5 -5
  3. package/esm2022/src/lib/components/actors/actors.facade.mjs +3 -3
  4. package/esm2022/src/lib/components/actors/actors.form.component.mjs +5 -5
  5. package/esm2022/src/lib/components/actors/actors.module.mjs +4 -4
  6. package/esm2022/src/lib/components/actors/actors.service.mjs +3 -3
  7. package/esm2022/src/lib/components/actors/actors.state.mjs +3 -3
  8. package/esm2022/src/lib/components/designer/components/label-editor.component.mjs +6 -6
  9. package/esm2022/src/lib/components/designer/components/node-selector.component.mjs +4 -4
  10. package/esm2022/src/lib/components/designer/components/swimlane-label.component.mjs +3 -3
  11. package/esm2022/src/lib/components/designer/components/swimlane-popup.component.mjs +3 -3
  12. package/esm2022/src/lib/components/designer/components/wf-canvas.component.mjs +6 -6
  13. package/esm2022/src/lib/components/designer/components/wf-designer.component.mjs +3 -3
  14. package/esm2022/src/lib/components/designer/components/wf-toolbar.component.mjs +6 -6
  15. package/esm2022/src/lib/components/designer/services/canvas-state.service.mjs +3 -3
  16. package/esm2022/src/lib/components/designer/services/connection-segment-interaction.service.mjs +3 -3
  17. package/esm2022/src/lib/components/designer/services/connection.service.mjs +3 -3
  18. package/esm2022/src/lib/components/designer/services/keyboard-handler.service.mjs +3 -3
  19. package/esm2022/src/lib/components/designer/services/label-management.service.mjs +3 -3
  20. package/esm2022/src/lib/components/designer/services/node-finder.service.mjs +3 -3
  21. package/esm2022/src/lib/components/designer/services/node-interaction.service.mjs +3 -3
  22. package/esm2022/src/lib/components/designer/services/node-precondition.service.mjs +3 -3
  23. package/esm2022/src/lib/components/designer/services/node-selection.service.mjs +3 -3
  24. package/esm2022/src/lib/components/designer/services/orthogonal-router.service.mjs +3 -3
  25. package/esm2022/src/lib/components/designer/services/position-update.service.mjs +3 -3
  26. package/esm2022/src/lib/components/designer/services/rendering.service.mjs +3 -3
  27. package/esm2022/src/lib/components/designer/services/swimlane-management.service.mjs +3 -3
  28. package/esm2022/src/lib/components/designer/services/swimlane-stats.service.mjs +3 -3
  29. package/esm2022/src/lib/components/designer/services/viewport.service.mjs +3 -3
  30. package/esm2022/src/lib/components/designer/services/wf-facade.service.mjs +3 -3
  31. package/esm2022/src/lib/components/designer/services/wf-mapper.service.mjs +3 -3
  32. package/esm2022/src/lib/components/designer/services/wf-persistence.service.mjs +3 -3
  33. package/esm2022/src/lib/components/designer/services/wf-state.service.mjs +3 -3
  34. package/esm2022/src/lib/components/expiration/expiration.component.mjs +3 -3
  35. package/esm2022/src/lib/components/expiration/expiration.module.mjs +4 -4
  36. package/esm2022/src/lib/components/file-render/file-render.component.mjs +5 -5
  37. package/esm2022/src/lib/components/file-render/file-render.module.mjs +4 -4
  38. package/esm2022/src/lib/components/file-upload/file-upload.component.mjs +5 -5
  39. package/esm2022/src/lib/components/file-upload/file-upload.module.mjs +4 -4
  40. package/esm2022/src/lib/components/flowable-status/flowable-status.component.mjs +17 -10
  41. package/esm2022/src/lib/components/flowable-status/flowable-status.facade.mjs +3 -3
  42. package/esm2022/src/lib/components/flowable-status/flowable-status.form.component.mjs +5 -5
  43. package/esm2022/src/lib/components/flowable-status/flowable-status.module.mjs +4 -4
  44. package/esm2022/src/lib/components/flowable-status/flowable-status.service.mjs +3 -3
  45. package/esm2022/src/lib/components/flowable-status/flowable-status.state.mjs +3 -3
  46. package/esm2022/src/lib/components/form-control/form-control.component.mjs +5 -5
  47. package/esm2022/src/lib/components/form-control/form-control.module.mjs +4 -4
  48. package/esm2022/src/lib/components/form-group/base-table-style.mjs +6 -6
  49. package/esm2022/src/lib/components/form-group/form-fields/form-fields.component.mjs +5 -5
  50. package/esm2022/src/lib/components/form-group/form-fields/form-fields.module.mjs +4 -4
  51. package/esm2022/src/lib/components/form-group/form-fields/form-fields.service.mjs +3 -3
  52. package/esm2022/src/lib/components/form-group/form-group.component.mjs +5 -5
  53. package/esm2022/src/lib/components/form-group/form-group.module.mjs +4 -4
  54. package/esm2022/src/lib/components/form-group/form-group.service.mjs +3 -3
  55. package/esm2022/src/lib/components/form-response/form-response.component.mjs +5 -5
  56. package/esm2022/src/lib/components/form-response/form-response.module.mjs +4 -4
  57. package/esm2022/src/lib/components/form-response/form-response.service.mjs +3 -3
  58. package/esm2022/src/lib/components/form-timer/form-timer.component.mjs +5 -5
  59. package/esm2022/src/lib/components/form-timer/form-timer.module.mjs +4 -4
  60. package/esm2022/src/lib/components/forms/base-table-style.mjs +6 -6
  61. package/esm2022/src/lib/components/forms/forms.component.mjs +5 -5
  62. package/esm2022/src/lib/components/forms/forms.module.mjs +4 -4
  63. package/esm2022/src/lib/components/forms/forms.service.mjs +3 -3
  64. package/esm2022/src/lib/components/journal/journal.component.mjs +3 -3
  65. package/esm2022/src/lib/components/journal/journal.module.mjs +4 -4
  66. package/esm2022/src/lib/components/my-queue/my-queue.component.mjs +5 -5
  67. package/esm2022/src/lib/components/my-queue/my-queue.facade.mjs +3 -3
  68. package/esm2022/src/lib/components/my-queue/my-queue.module.mjs +4 -4
  69. package/esm2022/src/lib/components/my-queue/my-queue.service.mjs +3 -3
  70. package/esm2022/src/lib/components/my-queue/my-queue.state.mjs +3 -3
  71. package/esm2022/src/lib/components/my-queue/tasks.form.component.mjs +5 -5
  72. package/esm2022/src/lib/components/operation-popup/operation-popup.component.mjs +5 -5
  73. package/esm2022/src/lib/components/operation-popup/operation-popup.facade.mjs +3 -3
  74. package/esm2022/src/lib/components/operation-popup/operation-popup.service.mjs +3 -3
  75. package/esm2022/src/lib/components/operation-popup/operation-popup.state.mjs +3 -3
  76. package/esm2022/src/lib/components/stage-details/stage-details.component.mjs +5 -5
  77. package/esm2022/src/lib/components/stage-details/stage-details.module.mjs +4 -4
  78. package/esm2022/src/lib/components/task-form/task-form.component.mjs +5 -5
  79. package/esm2022/src/lib/components/task-form/task-form.module.mjs +4 -4
  80. package/esm2022/src/lib/components/task-history/task-history.component.mjs +5 -5
  81. package/esm2022/src/lib/components/task-history/task-history.module.mjs +4 -4
  82. package/esm2022/src/lib/components/task-history/task-history.service.mjs +3 -3
  83. package/esm2022/src/lib/components/task-notification/base-table-style.mjs +6 -6
  84. package/esm2022/src/lib/components/task-notification/task-notification.component.mjs +5 -5
  85. package/esm2022/src/lib/components/task-notification/task-notification.module.mjs +4 -4
  86. package/esm2022/src/lib/components/task-notification/task-notification.service.mjs +3 -3
  87. package/esm2022/src/lib/components/tasks/tasks.component.mjs +17 -26
  88. package/esm2022/src/lib/components/tasks/tasks.facade.mjs +3 -3
  89. package/esm2022/src/lib/components/tasks/tasks.form.component.mjs +5 -5
  90. package/esm2022/src/lib/components/tasks/tasks.module.mjs +4 -4
  91. package/esm2022/src/lib/components/tasks/tasks.service.mjs +3 -3
  92. package/esm2022/src/lib/components/tasks/tasks.state.mjs +3 -3
  93. package/esm2022/src/lib/components/wf/wf.component.mjs +3 -3
  94. package/esm2022/src/lib/components/wf/wf.module.mjs +4 -4
  95. package/esm2022/src/lib/components/wf/wf.service.mjs +3 -3
  96. package/esm2022/src/lib/components/workflow/table-style.mjs +6 -6
  97. package/esm2022/src/lib/components/workflow/workflow.component.mjs +8 -8
  98. package/esm2022/src/lib/components/workflow/workflow.module.mjs +4 -4
  99. package/esm2022/src/lib/components/workflow-designer/action-dialog/action-dialog.component.mjs +5 -5
  100. package/esm2022/src/lib/components/workflow-designer/actor-tags-dialog/actor-tags-dialog.component.mjs +5 -5
  101. package/esm2022/src/lib/components/workflow-designer/conditions-popup/conditions-popup.component.mjs +3 -3
  102. package/esm2022/src/lib/components/workflow-designer/decision-popup/decision-popup.component.mjs +4 -4
  103. package/esm2022/src/lib/components/workflow-designer/designer-canvas/designer-canvas.component.mjs +3 -3
  104. package/esm2022/src/lib/components/workflow-designer/designer-toolbar/designer-toolbar.component.mjs +5 -5
  105. package/esm2022/src/lib/components/workflow-designer/escalation-dialog/escalation-dialog.component.mjs +5 -5
  106. package/esm2022/src/lib/components/workflow-designer/services/connection.service.mjs +3 -3
  107. package/esm2022/src/lib/components/workflow-designer/services/node-management.service.mjs +3 -3
  108. package/esm2022/src/lib/components/workflow-designer/services/popup.service.mjs +3 -3
  109. package/esm2022/src/lib/components/workflow-designer/services/swimlane.service.mjs +3 -3
  110. package/esm2022/src/lib/components/workflow-designer/services/transformer.service.mjs +3 -3
  111. package/esm2022/src/lib/components/workflow-designer/stage-dialog/stage-dialog.component.mjs +5 -5
  112. package/esm2022/src/lib/components/workflow-designer/stage-node/stage-node.component.mjs +5 -5
  113. package/esm2022/src/lib/components/workflow-designer/swimlane-dialog/swimlane-dialog.component.mjs +5 -5
  114. package/esm2022/src/lib/components/workflow-designer/workflow-data.service.mjs +3 -3
  115. package/esm2022/src/lib/components/workflow-designer/workflow-designer.component.mjs +4 -4
  116. package/esm2022/src/lib/components/workflow-designer/workflow-designer.module.mjs +4 -4
  117. package/esm2022/src/lib/components/workflow-designer/workflow-designer.state.mjs +3 -3
  118. package/esm2022/src/lib/components/workflows/workflow-form/workflow-form.component.mjs +5 -5
  119. package/esm2022/src/lib/components/workflows/workflows.component.mjs +18 -9
  120. package/esm2022/src/lib/components/workflows/workflows.facade.mjs +3 -3
  121. package/esm2022/src/lib/components/workflows/workflows.module.mjs +4 -4
  122. package/esm2022/src/lib/components/workflows/workflows.service.mjs +3 -3
  123. package/esm2022/src/lib/components/workflows/workflows.state.mjs +3 -3
  124. package/esm2022/src/lib/pipes/async-label.pipe.mjs +3 -3
  125. package/esm2022/src/lib/services/environment.service.mjs +3 -3
  126. package/esm2022/src/lib/services/http-web-request.service.mjs +3 -3
  127. package/esm2022/src/lib/services/label.service.mjs +3 -3
  128. package/esm2022/src/lib/services/util.service.mjs +3 -3
  129. package/esm2022/src/lib/shared/base-table-style.mjs +6 -6
  130. package/esm2022/src/lib/shared/components/base-data-view.component.mjs +3 -3
  131. package/esm2022/src/lib/shared/shared.module.mjs +4 -4
  132. package/fesm2022/verben-workflow-ui-src-lib-components-actors.mjs +21 -21
  133. package/fesm2022/verben-workflow-ui-src-lib-components-actors.mjs.map +1 -1
  134. package/fesm2022/verben-workflow-ui-src-lib-components-designer.mjs +85 -85
  135. package/fesm2022/verben-workflow-ui-src-lib-components-designer.mjs.map +1 -1
  136. package/fesm2022/verben-workflow-ui-src-lib-components-expiration.mjs +7 -7
  137. package/fesm2022/verben-workflow-ui-src-lib-components-expiration.mjs.map +1 -1
  138. package/fesm2022/verben-workflow-ui-src-lib-components-file-render.mjs +8 -8
  139. package/fesm2022/verben-workflow-ui-src-lib-components-file-render.mjs.map +1 -1
  140. package/fesm2022/verben-workflow-ui-src-lib-components-file-upload.mjs +8 -8
  141. package/fesm2022/verben-workflow-ui-src-lib-components-file-upload.mjs.map +1 -1
  142. package/fesm2022/verben-workflow-ui-src-lib-components-flowable-status.mjs +33 -26
  143. package/fesm2022/verben-workflow-ui-src-lib-components-flowable-status.mjs.map +1 -1
  144. package/fesm2022/verben-workflow-ui-src-lib-components-form-control.mjs +8 -8
  145. package/fesm2022/verben-workflow-ui-src-lib-components-form-control.mjs.map +1 -1
  146. package/fesm2022/verben-workflow-ui-src-lib-components-form-group.mjs +27 -27
  147. package/fesm2022/verben-workflow-ui-src-lib-components-form-group.mjs.map +1 -1
  148. package/fesm2022/verben-workflow-ui-src-lib-components-form-response.mjs +11 -11
  149. package/fesm2022/verben-workflow-ui-src-lib-components-form-response.mjs.map +1 -1
  150. package/fesm2022/verben-workflow-ui-src-lib-components-form-timer.mjs +8 -8
  151. package/fesm2022/verben-workflow-ui-src-lib-components-form-timer.mjs.map +1 -1
  152. package/fesm2022/verben-workflow-ui-src-lib-components-forms.mjs +16 -16
  153. package/fesm2022/verben-workflow-ui-src-lib-components-forms.mjs.map +1 -1
  154. package/fesm2022/verben-workflow-ui-src-lib-components-journal.mjs +7 -7
  155. package/fesm2022/verben-workflow-ui-src-lib-components-my-queue.mjs +21 -21
  156. package/fesm2022/verben-workflow-ui-src-lib-components-my-queue.mjs.map +1 -1
  157. package/fesm2022/verben-workflow-ui-src-lib-components-operation-popup.mjs +13 -13
  158. package/fesm2022/verben-workflow-ui-src-lib-components-operation-popup.mjs.map +1 -1
  159. package/fesm2022/verben-workflow-ui-src-lib-components-stage-details.mjs +8 -8
  160. package/fesm2022/verben-workflow-ui-src-lib-components-stage-details.mjs.map +1 -1
  161. package/fesm2022/verben-workflow-ui-src-lib-components-task-form.mjs +8 -8
  162. package/fesm2022/verben-workflow-ui-src-lib-components-task-form.mjs.map +1 -1
  163. package/fesm2022/verben-workflow-ui-src-lib-components-task-history.mjs +11 -11
  164. package/fesm2022/verben-workflow-ui-src-lib-components-task-history.mjs.map +1 -1
  165. package/fesm2022/verben-workflow-ui-src-lib-components-task-notification.mjs +16 -16
  166. package/fesm2022/verben-workflow-ui-src-lib-components-task-notification.mjs.map +1 -1
  167. package/fesm2022/verben-workflow-ui-src-lib-components-tasks.mjs +33 -42
  168. package/fesm2022/verben-workflow-ui-src-lib-components-tasks.mjs.map +1 -1
  169. package/fesm2022/verben-workflow-ui-src-lib-components-wf.mjs +10 -10
  170. package/fesm2022/verben-workflow-ui-src-lib-components-workflow-designer.mjs +67 -67
  171. package/fesm2022/verben-workflow-ui-src-lib-components-workflow-designer.mjs.map +1 -1
  172. package/fesm2022/verben-workflow-ui-src-lib-components-workflow.mjs +16 -16
  173. package/fesm2022/verben-workflow-ui-src-lib-components-workflow.mjs.map +1 -1
  174. package/fesm2022/verben-workflow-ui-src-lib-components-workflows.mjs +34 -25
  175. package/fesm2022/verben-workflow-ui-src-lib-components-workflows.mjs.map +1 -1
  176. package/fesm2022/verben-workflow-ui-src-lib-pipes.mjs +3 -3
  177. package/fesm2022/verben-workflow-ui-src-lib-services.mjs +12 -12
  178. package/fesm2022/verben-workflow-ui-src-lib-shared.mjs +12 -12
  179. package/fesm2022/verben-workflow-ui-src-lib-shared.mjs.map +1 -1
  180. package/package.json +30 -30
  181. package/src/lib/components/workflow/workflow.component.d.ts +1 -1
  182. package/styles/styles.css +19 -1436
@@ -909,12 +909,12 @@ export class FormFieldsComponent {
909
909
  document.body.removeChild(link);
910
910
  }
911
911
  }
912
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: FormFieldsComponent, deps: [{ token: i1.UtilService }, { token: i1.HttpWebRequestService }, { token: i0.ChangeDetectorRef }, { token: i2.FormBuilder }, { token: i1.EnvironmentService }, { token: i3.Router }, { token: i3.ActivatedRoute }, { token: i4.FormsFieldService }, { token: i5.Location }, { token: i0.ElementRef }, { token: i0.Renderer2 }], target: i0.ɵɵFactoryTarget.Component });
913
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: FormFieldsComponent, selector: "lib-form-fields", inputs: { path: "path", application: "application", pageSize: "pageSize", searchDebounceTime: "searchDebounceTime" }, outputs: { onViewProcessClicked: "onViewProcessClicked" }, viewQueries: [{ propertyName: "fileInput", first: true, predicate: ["fileInput"], descendants: true, static: true }, { propertyName: "cardDataView", first: true, predicate: ["vdcv"], descendants: true }, { propertyName: "dataView", first: true, predicate: ["vdv"], descendants: true }, { propertyName: "tableView", first: true, predicate: ["dt"], descendants: true }], ngImport: i0, template: "<header\n class=\"rounded-lg shadow-lg flex justify-between items-center px-6 py-2 bg-[#D4A00773]\"\n>\n <div class=\"flex items-center gap-10\">\n <h4 class=\"font-semibold\">{{ formName }}</h4>\n <span class=\"flex items-center gap-1\">\n Ref ID:\n <span>{{ Id }}</span>\n </span>\n </div>\n <div class=\"flex gap-3 items-center\">\n <verbena-button\n [pd]=\"'6px'\"\n class=\"verben-primary-button\"\n (click)=\"saveAllProperties()\"\n text=\"Save All\"\n ></verbena-button>\n <verben-svg\n (click)=\"goBack()\"\n class=\"cursor-pointer\"\n [width]=\"17\"\n [height]=\"17\"\n [icon]=\"'close'\"\n ></verben-svg>\n </div>\n</header>\n<div #messageLog class=\"flex flex-col gap-4 message-log-container\">\n <verben-data-view\n #vdv\n [viewState]=\"{\n isSearch: true,\n isColumn: true,\n isFilter: true,\n isSort: true,\n isExport: true,\n isSelect: true,\n isCreate: true,\n isToggle: true,\n }\"\n [buttonClass]=\"'my-custom-button-class'\"\n [iconClass]=\"'my-icon-class'\"\n [showSortChild]=\"showSort\"\n [showColumnChild]=\"showColumn\"\n [activeIconClass]=\"'my-active-icon-class'\"\n [selectedColumnCount]=\"selectedColumnTableCount\"\n [selectedSortCount]=\"selectedSortTableCount\"\n [selectedFilterTableCount]=\"selectedFilterTableCount\"\n [showFilterChild]=\"showFilter\"\n [searchValue]=\"searchTerm\"\n (viewChange)=\"onViewChange($event)\"\n (stateChange)=\"onStateChange($event)\"\n (onSearchChange)=\"onSearch($event)\"\n >\n <div class=\"mt-2\" table-content>\n <lib-data-table\n #dt\n [data]=\"data[0].Properties\"\n [columns]=\"visibleColumnDef\"\n [styleConfig]=\"styles\"\n (selectionChange)=\"onSelectionChange($event)\"\n >\n <ng-container libColumn=\"select\">\n <ng-template\n #cell\n let-isSelected=\"isSelected\"\n let-toggleRowSelection=\"toggleRowSelection\"\n >\n <input\n type=\"checkbox\"\n [checked]=\"isSelected\"\n (change)=\"toggleRowSelection()\"\n />\n </ng-template>\n <ng-template\n #header\n let-allRowsSelected=\"allRowsSelected\"\n let-someRowsSelected=\"someRowsSelected\"\n let-toggleAllRows=\"toggleAllRows\"\n >\n <input\n type=\"checkbox\"\n [checked]=\"allRowsSelected()\"\n [indeterminate]=\"someRowsSelected()\"\n (change)=\"toggleAllRows()\"\n />\n </ng-template>\n </ng-container>\n <ng-container libColumn=\"name\">\n <ng-template #cell let-row=\"row\" let-value>\n {{ value.Name }}\n </ng-template>\n <ng-template\n #cellEdit\n let-row=\"row\"\n let-updateValue=\"updateValue\"\n let-value\n >\n <verbena-input\n inputContainerClass=\"w-fit\"\n [(ngModel)]=\"row.Name\"\n ></verbena-input>\n </ng-template>\n </ng-container>\n <ng-container libColumn=\"propertyName\">\n <ng-template #cell let-row=\"row\" let-value>\n {{ row.PropertyName }}\n </ng-template>\n <ng-template\n #cellEdit\n let-row=\"row\"\n let-updateValue=\"updateValue\"\n let-value\n >\n <verbena-input\n (keydown)=\"onKeyDown($event, row)\"\n (paste)=\"onPaste($event, row)\"\n (input)=\"onInput($event, row)\"\n inputContainerClass=\"w-fit\"\n [(ngModel)]=\"row.PropertyName\"\n ></verbena-input>\n </ng-template>\n </ng-container>\n <ng-container libColumn=\"minValue\">\n <ng-template #cell let-row=\"row\" let-value>\n {{ value }}\n </ng-template>\n <ng-template\n #cellEdit\n let-row=\"row\"\n let-updateValue=\"updateValue\"\n let-value\n >\n <verbena-input\n [type]=\"'number'\"\n [ngModel]=\"getStringValue(row, 'MinValue')\"\n (valueChange)=\"convertToInt($event, row, 'MinValue')\"\n inputContainerClass=\"w-[130px]\"\n ></verbena-input>\n </ng-template>\n </ng-container>\n <ng-container libColumn=\"maxValue\">\n <ng-template #cell let-row=\"row\" let-value>\n {{ value }}\n </ng-template>\n <ng-template\n #cellEdit\n let-row=\"row\"\n let-updateValue=\"updateValue\"\n let-value\n >\n <verbena-input\n [type]=\"'number'\"\n inputContainerClass=\"w-[130px]\"\n [ngModel]=\"getStringValue(row, 'MaxValue')\"\n (valueChange)=\"convertToInt($event, row, 'MaxValue')\"\n ></verbena-input>\n </ng-template>\n </ng-container>\n <ng-container libColumn=\"defaultValue\">\n <ng-template #cell let-row=\"row\" let-value>\n {{ value }}\n </ng-template>\n <ng-template\n #cellEdit\n let-row=\"row\"\n let-updateValue=\"updateValue\"\n let-value\n >\n <verbena-input\n [type]=\"'text'\"\n inputContainerClass=\"w-[130px]\"\n [(ngModel)]=\"row.DefaultValue\"\n ></verbena-input>\n </ng-template>\n </ng-container>\n <ng-container libColumn=\"dataType\">\n <ng-template #cell let-row=\"row\" let-value>\n {{ value }}\n </ng-template>\n <ng-template\n #cellEdit\n let-row=\"row\"\n let-updateValue=\"updateValue\"\n let-value\n >\n <div class=\"flex flex-col gap-1\">\n <verben-drop-down\n width=\"100%\"\n placeholder=\"Change Data Type\"\n [(options)]=\"dataType\"\n [(ngModel)]=\"row.DataType\"\n >\n </verben-drop-down>\n </div>\n </ng-template>\n </ng-container>\n\n <ng-container libColumn=\"isRequired\">\n <ng-template #cell let-row=\"row\" let-value>\n <verben-svg *ngIf=\"value === true\" [icon]=\"'check'\"></verben-svg>\n <verben-svg *ngIf=\"value === false\" [icon]=\"'error'\"></verben-svg>\n </ng-template>\n <ng-template\n #cellEdit\n let-row=\"row\"\n let-updateValue=\"updateValue\"\n let-value\n >\n <verbena-switch\n [onColor]=\"'#1A237E'\"\n [(ngModel)]=\"row.IsRequired\"\n ></verbena-switch>\n </ng-template>\n </ng-container>\n\n <ng-container libColumn=\"isReadOnly\">\n <ng-template #cell let-row=\"row\" let-value>\n <verben-svg *ngIf=\"value === true\" [icon]=\"'check'\"></verben-svg>\n <verben-svg *ngIf=\"value === false\" [icon]=\"'error'\"></verben-svg>\n </ng-template>\n <ng-template\n #cellEdit\n let-row=\"row\"\n let-updateValue=\"updateValue\"\n let-value\n >\n <verbena-switch\n [onColor]=\"'#1A237E'\"\n [(ngModel)]=\"row.IsReadOnly\"\n ></verbena-switch>\n </ng-template>\n </ng-container>\n\n <ng-container libColumn=\"actions\">\n <ng-template\n #cell\n let-isEditing=\"isEditing\"\n let-toggleRowEdit=\"toggleRowEdit\"\n let-row=\"row\"\n let-value\n >\n <verben-pop-Up\n [customStyles]=\"{ 'z-index': '99' }\"\n [dropdownOpen]=\"openDropdownId === row.id\"\n [enableMouseLeave]=\"false\"\n (close)=\"onClose()\"\n >\n <verben-svg\n class=\"cursor-pointer actions-icon\"\n (click)=\"openDropdown(row)\"\n dropdown-trigger\n icon=\"list\"\n ></verben-svg>\n <div\n class=\"pop-up-content flex flex-col\"\n *ngIf=\"openDropdownId === row.Id\"\n dropdown-content\n >\n <div\n (click)=\"toggleRowEdit()\"\n class=\"pop-up-value cursor-pointer\"\n >\n Edit\n </div>\n <div\n (click)=\"deleteProperty(row.Id)\"\n class=\"pop-up-value cursor-pointer\"\n >\n Delete\n </div>\n </div>\n </verben-pop-Up>\n </ng-template>\n <ng-template\n #cellEdit\n let-isEditing=\"isEditing\"\n let-toggleRowEdit=\"toggleRowEdit\"\n let-row=\"row\"\n let-value\n >\n <div class=\"flex gap-2 items-center\">\n <verben-svg\n icon=\"check\"\n [width]=\"15\"\n [height]=\"15\"\n (click)=\"saveViaTable(row, toggleRowEdit)\"\n ></verben-svg>\n <verben-svg\n (click)=\"toggleRowEdit(); deleteProperty(row.Id)\"\n icon=\"delete\"\n [width]=\"15\"\n [height]=\"15\"\n ></verben-svg>\n <verben-svg\n icon=\"cardViewAlt\"\n [width]=\"15\"\n [height]=\"15\"\n (click)=\"goToCardView(value)\"\n ></verben-svg>\n </div>\n </ng-template>\n </ng-container>\n </lib-data-table>\n </div>\n <div card-content>\n <verben-card-data-view\n borderRadius=\"12px\"\n #vdcv\n dataId=\"Id\"\n border=\"5px\"\n [cardDataList]=\"cardData\"\n rbgColor=\"#f5f6f9\"\n mg=\"0px\"\n >\n <verben-left-card-data-view class=\"space-y-7\">\n <verben-left-card-data\n #vlcd\n [parent]=\"vdcv\"\n dataId=\"id\"\n class=\"bg-secondary-100 rounded-xl border-primary border-[1px]\"\n [cardDataList]=\"cardData\"\n >\n <ng-template #card let-item>\n <div\n (click)=\"userCardClicked(item)\"\n class=\"flex cursor-pointer h-[max-content]\"\n >\n <!-- <verben-svg [width]=\"15\" [height]=\"15\" (click)=\"toggleChildren(item); $event.stopPropagation()\"\n [ngClass]=\"item.children && item.children.length?'visible':'invisible'\"\n class=\"items-center flex pr-1 cursor-pointer\" [icon]=\"item.isChildrenExpanded?'minus':'plus'\" /> -->\n <div class=\"flex w-full bg-secondary rounded-xl\">\n <div\n class=\"w-3 rounded-xl rounded-tr-none rounded-br-none\"\n [ngClass]=\"\n item.selected ? 'bg-primary' : 'bg-secondary-200'\n \"\n ></div>\n <div class=\"py-3 px-4 flex-1 h-[100%]\">\n <div\n class=\"flex items-start flex-1 gap-1 justify-between h-[100%]\"\n >\n <div\n class=\"flex flex-col flex-1 card-min-height justify-between h-[100%]\"\n >\n <div class=\"flex justify-between mr-4\">\n <div>\n <h3\n class=\"my-0 font-bold text-[#404040] leading-[19.5px]\"\n >\n {{ item.data.Name }}\n </h3>\n <span class=\"flex items-center gap-1 mt-2\">\n <span class=\"!text-[10px] text-[#404040]\"\n >Data Type:</span\n >\n <span class=\"!text-[13px] font-bold\">{{\n item.data.DataType\n }}</span>\n </span>\n </div>\n\n <div>\n <!-- <span class=\"!text-[10px] text-[#404040]\"\n >Default Value:</span\n >\n <p class=\"!text-[12px]\">\n {{ item.data.DefaultValue }}\n </p> -->\n </div>\n </div>\n </div>\n\n <!-- <div class=\"flex items-end h-[100%]\">\n <span class=\"enum-val {{item.data.Status}}\">{{item.data.Status}}</span>\n </div> -->\n </div>\n </div>\n </div>\n </div>\n </ng-template>\n </verben-left-card-data>\n </verben-left-card-data-view>\n <verben-right-card-data-view>\n <ng-template #parent>\n <div\n *ngIf=\"currentData\"\n class=\"flex flex-col rounded-xl h-full w-full relative gap-6\"\n >\n <verbena-input\n name=\"Name\"\n label=\"Name\"\n [(ngModel)]=\"currentData.data.Name\"\n />\n <verbena-input\n name=\"Name\"\n label=\"Property Name\"\n (keydown)=\"onKeyDown($event, currentData.data)\"\n (paste)=\"onPaste($event, currentData.data)\"\n (input)=\"onInput($event, currentData.data)\"\n [(ngModel)]=\"currentData.data.PropertyName\"\n />\n <div class=\"flex flex-col gap-1\">\n <div>Data Type</div>\n <verben-drop-down\n width=\"100%\"\n placeholder=\"Change Data Type\"\n [(options)]=\"dataType\"\n [(ngModel)]=\"currentData.data.DataType\"\n (ngModelChange)=\"onDropDownChange($event)\"\n >\n </verben-drop-down>\n </div>\n\n <div\n *ngIf=\"\n currentData.data.DataType === 'SingleSelection' ||\n currentData.data.DataType === 'MultiSelection'\n \"\n >\n <p class=\"mb-2\">Enter Options</p>\n <verben-chip\n [placeholder]=\"'Enter Options'\"\n [(ngModel)]=\"chipArray\"\n (onChange)=\"onChipChange($event)\"\n ></verben-chip>\n </div>\n <div>\n <verbena-input\n [placeHolder]=\"'Enter default text'\"\n [(ngModel)]=\"currentData.data.DefaultValue\"\n name=\"DefaultValue\"\n label=\"Default Value (optional)\"\n />\n </div>\n <div>\n <p class=\"mb-2\">Required</p>\n\n <verbena-switch\n [onColor]=\"'#1A237E'\"\n [(ngModel)]=\"currentData.data.IsRequired\"\n ></verbena-switch>\n </div>\n <div>\n <p class=\"mb-2\">Read Only</p>\n\n <verbena-switch\n [onColor]=\"'#1A237E'\"\n [(ngModel)]=\"currentData.data.IsReadOnly\"\n ></verbena-switch>\n </div>\n <div\n *ngIf=\"\n currentData.data.DataType === 'Number' ||\n currentData.data.DataType === 'Text'\n \"\n class=\"flex flex-col gap-6\"\n >\n <verbena-input\n [type]=\"'number'\"\n name=\"minValue\"\n label=\"Min Value\"\n [ngModel]=\"getStringValue(currentData.data, 'MinValue')\"\n (valueChange)=\"\n convertToInt($event, currentData.data, 'MinValue')\n \"\n />\n <verbena-input\n [type]=\"'number'\"\n name=\"maxValue\"\n label=\"Max Value\"\n (ngModelChange)=\"updateTable()\"\n [ngModel]=\"getStringValue(currentData.data, 'MaxValue')\"\n (valueChange)=\"\n convertToInt($event, currentData.data, 'MaxValue')\n \"\n />\n </div>\n <!-- buttons -->\n <div class=\"flex justify-between w-full bottom-8 left-0 right-0\">\n <verbena-button\n (click)=\"deleteProperty(currentData.data.Id)\"\n class=\"verben-delete-button\"\n text=\"Delete\"\n ></verbena-button>\n <div class=\"flex gap-3\">\n <verbena-button\n class=\"verben-switch-button\"\n (click)=\"goToTableView()\"\n text=\"Switch To Table\"\n ></verbena-button>\n <!-- <verbena-button class=\"verben-primary-button\" (click)=\"saveUser()\" text=\"Save\"></verbena-button> -->\n </div>\n </div>\n </div>\n </ng-template>\n </verben-right-card-data-view>\n <!-- <verben-right-card-data-view>\n yeshhhhhh\n </verben-right-card-data-view> -->\n\n <verben-card-data-view-footer>\n <div class=\"flex gap-2 justify-between\">\n <div\n *ngIf=\"!vdcv.hasCurrentItem()\"\n class=\"message-log-button-container flex justify-between\"\n >\n <verbena-button\n [fontWeight]=\"'bold'\"\n [bgColor]=\"'#8E8D87'\"\n [borderRadius]=\"'4px'\"\n [textColor]=\"'#fff'\"\n [text]=\"'Delete'\"\n >\n </verbena-button>\n </div>\n <div\n class=\"flex {{\n vdcv.hasCurrentItem() ? 'flex-1' : ''\n }} justify-end items-center gap-5\"\n >\n <span class=\"paginator-text\"\n >{{ cardData.length }} records loaded</span\n >\n </div>\n </div>\n </verben-card-data-view-footer>\n </verben-card-data-view>\n </div>\n <div column-content>\n <verben-visible-column\n (resetFilter)=\"getProperties(Id, showColumn)\"\n (columnsUpdated)=\"onColumnsUpdated($event)\"\n [border]=\"'1px solid rgba(212, 160, 7, 1)'\"\n borderRadius=\"10px\"\n boxShadow=\"2px 2px 2px 0px silver\"\n bgColor=\"white\"\n width=\"400px\"\n textColor=\"black\"\n pd=\"1rem\"\n primaryColor=\"#FFE681\"\n secondaryColor=\"#3479E9\"\n [columns]=\"visibleColumns\"\n [displayedColumns]=\"5\"\n ></verben-visible-column>\n </div>\n <div filter-content>\n <verben-table-filter\n (resetSortData)=\"getProperties(Id, showFilter)\"\n (filtersApplied)=\"onFilterApplied($event)\"\n [border]=\"'1px solid rgba(212, 160, 7, 1)'\"\n borderRadius=\"10px\"\n boxShadow=\"2px 2px 2px 0px silver\"\n bgColor=\"white\"\n width=\"420px\"\n textColor=\"black\"\n pd=\"1rem\"\n primaryColor=\"#FFE681\"\n secondaryColor=\"#3479E9\"\n tertiaryColor=\"#404040\"\n [filterOptions]=\"filterArray\"\n [maxFilterLength]=\"3\"\n ></verben-table-filter>\n </div>\n <div sort-content>\n <verben-sort-table\n (resetSortData)=\"getProperties(Id, showSort)\"\n (selectedOptions)=\"onSortUpdated($event)\"\n [border]=\"'1px solid rgba(212, 160, 7, 1)'\"\n borderRadius=\"10px\"\n boxShadow=\"2px 2px 2px 0px silver\"\n bgColor=\"white\"\n width=\"400px\"\n textColor=\"black\"\n pd=\"1rem\"\n primaryColor=\"#FFE681\"\n secondaryColor=\"#3479E9\"\n tertiaryColor=\"#404040\"\n [enableDragAndDrop]=\"true\"\n [sortOptions]=\"sortOptions\"\n ></verben-sort-table>\n </div>\n <div export-content>\n <lib-data-export\n [data]=\"data[0].Properties\"\n (exportDataEvent)=\"handleExport($event)\"\n >\n </lib-data-export>\n </div>\n </verben-data-view>\n <div *ngIf=\"vdv.isTableView\" class=\"flex gap-2 justify-between\">\n <div class=\"message-log-button-container flex justify-between\">\n <verbena-button\n [fontWeight]=\"'bold'\"\n [bgColor]=\"'#8E8D87'\"\n [borderRadius]=\"'4px'\"\n [textColor]=\"'#fff'\"\n [text]=\"'Delete'\"\n >\n </verbena-button>\n </div>\n <div class=\"flex justify-end items-center gap-5\">\n <span class=\"paginator-text\">{{ cardData.length }} records loaded</span>\n <button (click)=\"loadMore()\" class=\"load-more view-links\">\n Load more\n </button>\n </div>\n </div>\n</div>\n<!-- <div class=\"w-[400px] bg-white p-4 shadow-lg border\">\n <form-control [dataType]=\"dataType2\" [formProperties]=\"data[0].Properties\"></form-control>\n</div> -->\n", styles: [".view-links{font-size:14px!important;color:#00f;font-weight:600;cursor:pointer}.view-links:hover{text-decoration:underline;text-underline-offset:3px}.context-banner{background-color:#d4a00773}.card-min-height{gap:10px}::ng-deep .childrenPadding{max-height:300px;overflow-y:auto}::ng-deep .toolbar{margin-bottom:15px}::ng-deep .master-only-container{margin:0!important;padding:0!important}::ng-deep .master-detail-container{margin:0!important;padding:0!important}.pop-up-content{border-radius:4px;background-color:#fff;border:1px solid rgba(212,161,7,.5)}.pop-up-value{padding:10px 20px}.pop-up-content>div:nth-child(1){border-bottom:4px solid #FFE681}.enum-val{padding:2px 10px;width:100%;min-width:max-content;text-align:center}.enum-val.Active{background-color:#d6f3e6;color:#2db76f}.enum-val.InActive{background-color:#ffdfdf;color:#eb5757}.toggle-container{width:53px;padding:1px;color:#fff;height:22px;position:relative;background-color:#1a237e;border-radius:2rem;cursor:pointer}.toggle-circle{width:50%;height:100%;position:absolute;left:0;padding:5px;top:0;background-color:#fff;border-radius:50%;transform:scale(1);transition:transform .3s}.translate-100{transform:translate(100%)}.translate-0{transform:translate(0)}.toggle-text-on{display:block;font-size:12px;margin-left:4px}.toggle-text-off{display:block;font-size:12px;margin-right:4px;text-align:right}\n"], dependencies: [{ kind: "directive", type: i5.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i5.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: i6.DataTableComponent, selector: "lib-data-table", inputs: ["data", "columns", "dataKey", "formGroupConfig", "groupBy", "useVirtualScroll", "virtualScrollItemSize", "styleConfig"], outputs: ["rowEdit", "rowSave", "rowRevert", "rowDelete", "selectionChange"] }, { kind: "directive", type: i6.ColumnDirective, selector: "[libColumn]", inputs: ["libColumn"] }, { kind: "component", type: i6.SvgComponent, selector: "verben-svg", inputs: ["icon", "width", "height", "fill", "stroke", "type", "size"] }, { kind: "component", type: i6.VerbenPopUpComponent, selector: "verben-pop-Up", inputs: ["dropdownOpen", "dropdownWidth", "color", "customStyles", "popUpClass", "border", "borderRadius", "enableMouseLeave", "cdkPosition"], outputs: ["dropdownOpenChange", "close"] }, { kind: "component", type: i6.DataViewComponent, selector: "verben-data-view", inputs: ["buttonClass", "iconClass", "activeIconClass", "columnCustomClass", "filterCustomClass", "sortCustomClass", "extendCustomClass", "exportCustomClass", "selectCustomClass", "importCustomClass", "zIndex", "createCustomClass", "tableIcon", "cardIcon", "cardClass", "tableClass", "searchKey", "searchValue", "viewState", "searchTemplate", "importTemplate", "columnTemplate", "extendTemplate", "filterTemplate", "sortTemplate", "children", "exportTemplate", "createTemplate", "selectedColumnCount", "selectedSortCount", "selectedFilterTableCount", "inputWidth", "milliseconds", "showColumnChild", "showSortChild", "showFilterChild", "showImportChild", "showExportChild", "showExtendChild", "create", "showSelected", "isTableView"], outputs: ["viewChange", "stateChange", "onSearchChange"] }, { kind: "component", type: i6.VerbenaButtonComponent, selector: "verbena-button", inputs: ["text", "icon", "useIcon", "svgPosition", "iconPosition", "bgColor", "textColor", "border", "borderRadius", "pd", "width", "height", "fontSize", "fontWeight", "disable", "svgSize", "weight", "variant", "styleType", "svg", "svgWidth", "svgHeight", "iconColor", "svgColor", "buttonClass", "buttonTextClass", "isLoading", "spinnerSize", "spinnerColor"] }, { kind: "component", type: i6.CardDataViewComponent, selector: "verben-card-data-view", inputs: ["pd", "mg", "lHeight", "rHeight", "rWidth", "lWidth", "textColor", "lbgColor", "rbgColor", "border", "display", "borderRadius", "activeCss", "inActiveCss", "displayAsRow", "cardDataList", "dataId", "totalRecords", "footer", "noOfVisibleChildren", "showEditIcon", "onItemClick", "onCardChildClick"], outputs: ["editClicked", "loadMoreClick"] }, { kind: "component", type: i6.LeftCardDataComponent, selector: "verben-left-card-data", inputs: ["pd", "mg", "height", "weight", "activeCss", "inActiveCss", "cardDataList", "iconCollapse", "iconExpanded", "parent", "dataId"] }, { kind: "component", type: i6.LeftCardDataViewComponent, selector: "verben-left-card-data-view", inputs: ["cardDataList"] }, { kind: "component", type: i6.RightCardDataViewComponent, selector: "verben-right-card-data-view", inputs: ["parentData", "chilData", "meth"] }, { kind: "component", type: i6.CardDataViewFooterComponent, selector: "verben-card-data-view-footer" }, { kind: "component", type: i6.DropDownComponent, selector: "verben-drop-down", inputs: ["options", "width", "showHorizontalLine", "horizontalLineColor", "optionLabel", "optionSubLabel", "optionValue", "placeholder", "invalidMessage", "errorPosition", "loadMoreCaption", "display", "showClear", "lazyLoad", "selectKey", "styleClass", "group", "multiselect", "filter", "avoidDuplication", "filterBy", "debounceTime", "minChar", "disabled", "required", "load", "asyncLabel", "search"], outputs: ["optionsChange", "onChange", "onClick", "onClear"] }, { kind: "component", type: i6.TableFilterComponent, selector: "verben-table-filter", inputs: ["filterOptions", "pd", "mg", "height", "width", "bgColor", "boxShadow", "textColor", "primaryColor", "secondaryColor", "tertiaryColor", "border", "borderRadius", "selectWidth", "maxFilterLength", "tooltip"], outputs: ["filtersApplied", "resetSortData"] }, { kind: "component", type: i6.VisibleColumnComponent, selector: "verben-visible-column", inputs: ["columns", "items", "enableDragAndDrop", "displayedColumns", "showMore", "pd", "mg", "height", "width", "bgColor", "boxShadow", "textColor", "primaryColor", "secondaryColor", "tertiaryColor", "border", "borderRadius", "selectWidth", "closeColumn"], outputs: ["columnsUpdated", "resetFilter"] }, { kind: "component", type: i6.SortTableComponent, selector: "verben-sort-table", inputs: ["enableDragAndDrop", "sortOptions", "resetText", "displayedOptions", "propertyText", "showMoreText", "sortButtonText", "pd", "mg", "height", "width", "bgColor", "boxShadow", "textColor", "primaryColor", "secondaryColor", "tertiaryColor", "border", "borderRadius", "selectWidth", "containerHeight"], outputs: ["selectedOptions", "resetSortData"] }, { kind: "component", type: i6.DataExportComponent, selector: "lib-data-export", inputs: ["columns", "data", "dataFetchUrl", "dataQueryParameters"], outputs: ["exportDataEvent"] }, { kind: "component", type: i6.VerbenaInputComponent, selector: "verbena-input", inputs: ["label", "placeHolder", "required", "svgPosition", "minLength", "maxLength", "type", "bgColor", "border", "borderRadius", "textColor", "value", "labelPosition", "labelColor", "disable", "readOnly", "min", "max", "showBorder", "showErrorMessage", "errorMessageColor", "errorBorderColor", "errorPosition", "svg", "fontSize", "svgWidth", "svgHeight", "svgColor", "capitalization", "inputContainerClass", "inputFieldClass", "passLength", "inputWrapperClass", "passwordToggle", "customErrorMessages", "icon", "textPass"], outputs: ["valueChange"] }, { kind: "component", type: i6.VerbenaSwitchComponent, selector: "verbena-switch", inputs: ["label", "checked", "disabled", "offColor", "onColor", "onText", "offText", "width", "height", "customStyles"], outputs: ["change"] }, { kind: "component", type: i6.ChipComponent, selector: "verben-chip", inputs: ["width", "placeholder", "max", "styleClass", "separator", "disabled", "required", "invalidMessage", "errorPosition"], outputs: ["onChange"] }] });
912
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: FormFieldsComponent, deps: [{ token: i1.UtilService }, { token: i1.HttpWebRequestService }, { token: i0.ChangeDetectorRef }, { token: i2.FormBuilder }, { token: i1.EnvironmentService }, { token: i3.Router }, { token: i3.ActivatedRoute }, { token: i4.FormsFieldService }, { token: i5.Location }, { token: i0.ElementRef }, { token: i0.Renderer2 }], target: i0.ɵɵFactoryTarget.Component });
913
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.14", type: FormFieldsComponent, selector: "lib-form-fields", inputs: { path: "path", application: "application", pageSize: "pageSize", searchDebounceTime: "searchDebounceTime" }, outputs: { onViewProcessClicked: "onViewProcessClicked" }, viewQueries: [{ propertyName: "fileInput", first: true, predicate: ["fileInput"], descendants: true, static: true }, { propertyName: "cardDataView", first: true, predicate: ["vdcv"], descendants: true }, { propertyName: "dataView", first: true, predicate: ["vdv"], descendants: true }, { propertyName: "tableView", first: true, predicate: ["dt"], descendants: true }], ngImport: i0, template: "<header\n class=\"rounded-lg shadow-lg flex justify-between items-center px-6 py-2 bg-[#D4A00773]\"\n>\n <div class=\"flex items-center gap-10\">\n <h4 class=\"font-semibold\">{{ formName }}</h4>\n <span class=\"flex items-center gap-1\">\n Ref ID:\n <span>{{ Id }}</span>\n </span>\n </div>\n <div class=\"flex gap-3 items-center\">\n <verbena-button\n [pd]=\"'6px'\"\n class=\"verben-primary-button\"\n (click)=\"saveAllProperties()\"\n text=\"Save All\"\n ></verbena-button>\n <verben-svg\n (click)=\"goBack()\"\n class=\"cursor-pointer\"\n [width]=\"17\"\n [height]=\"17\"\n [icon]=\"'close'\"\n ></verben-svg>\n </div>\n</header>\n<div #messageLog class=\"flex flex-col gap-4 message-log-container\">\n <verben-data-view\n #vdv\n [viewState]=\"{\n isSearch: true,\n isColumn: true,\n isFilter: true,\n isSort: true,\n isExport: true,\n isSelect: true,\n isCreate: true,\n isToggle: true,\n }\"\n [buttonClass]=\"'my-custom-button-class'\"\n [iconClass]=\"'my-icon-class'\"\n [showSortChild]=\"showSort\"\n [showColumnChild]=\"showColumn\"\n [activeIconClass]=\"'my-active-icon-class'\"\n [selectedColumnCount]=\"selectedColumnTableCount\"\n [selectedSortCount]=\"selectedSortTableCount\"\n [selectedFilterTableCount]=\"selectedFilterTableCount\"\n [showFilterChild]=\"showFilter\"\n [searchValue]=\"searchTerm\"\n (viewChange)=\"onViewChange($event)\"\n (stateChange)=\"onStateChange($event)\"\n (onSearchChange)=\"onSearch($event)\"\n >\n <div class=\"mt-2\" table-content>\n <lib-data-table\n #dt\n [data]=\"data[0].Properties\"\n [columns]=\"visibleColumnDef\"\n [styleConfig]=\"styles\"\n (selectionChange)=\"onSelectionChange($event)\"\n >\n <ng-container libColumn=\"select\">\n <ng-template\n #cell\n let-isSelected=\"isSelected\"\n let-toggleRowSelection=\"toggleRowSelection\"\n >\n <input\n type=\"checkbox\"\n [checked]=\"isSelected\"\n (change)=\"toggleRowSelection()\"\n />\n </ng-template>\n <ng-template\n #header\n let-allRowsSelected=\"allRowsSelected\"\n let-someRowsSelected=\"someRowsSelected\"\n let-toggleAllRows=\"toggleAllRows\"\n >\n <input\n type=\"checkbox\"\n [checked]=\"allRowsSelected()\"\n [indeterminate]=\"someRowsSelected()\"\n (change)=\"toggleAllRows()\"\n />\n </ng-template>\n </ng-container>\n <ng-container libColumn=\"name\">\n <ng-template #cell let-row=\"row\" let-value>\n {{ value.Name }}\n </ng-template>\n <ng-template\n #cellEdit\n let-row=\"row\"\n let-updateValue=\"updateValue\"\n let-value\n >\n <verbena-input\n inputContainerClass=\"w-fit\"\n [(ngModel)]=\"row.Name\"\n ></verbena-input>\n </ng-template>\n </ng-container>\n <ng-container libColumn=\"propertyName\">\n <ng-template #cell let-row=\"row\" let-value>\n {{ row.PropertyName }}\n </ng-template>\n <ng-template\n #cellEdit\n let-row=\"row\"\n let-updateValue=\"updateValue\"\n let-value\n >\n <verbena-input\n (keydown)=\"onKeyDown($event, row)\"\n (paste)=\"onPaste($event, row)\"\n (input)=\"onInput($event, row)\"\n inputContainerClass=\"w-fit\"\n [(ngModel)]=\"row.PropertyName\"\n ></verbena-input>\n </ng-template>\n </ng-container>\n <ng-container libColumn=\"minValue\">\n <ng-template #cell let-row=\"row\" let-value>\n {{ value }}\n </ng-template>\n <ng-template\n #cellEdit\n let-row=\"row\"\n let-updateValue=\"updateValue\"\n let-value\n >\n <verbena-input\n [type]=\"'number'\"\n [ngModel]=\"getStringValue(row, 'MinValue')\"\n (valueChange)=\"convertToInt($event, row, 'MinValue')\"\n inputContainerClass=\"w-[130px]\"\n ></verbena-input>\n </ng-template>\n </ng-container>\n <ng-container libColumn=\"maxValue\">\n <ng-template #cell let-row=\"row\" let-value>\n {{ value }}\n </ng-template>\n <ng-template\n #cellEdit\n let-row=\"row\"\n let-updateValue=\"updateValue\"\n let-value\n >\n <verbena-input\n [type]=\"'number'\"\n inputContainerClass=\"w-[130px]\"\n [ngModel]=\"getStringValue(row, 'MaxValue')\"\n (valueChange)=\"convertToInt($event, row, 'MaxValue')\"\n ></verbena-input>\n </ng-template>\n </ng-container>\n <ng-container libColumn=\"defaultValue\">\n <ng-template #cell let-row=\"row\" let-value>\n {{ value }}\n </ng-template>\n <ng-template\n #cellEdit\n let-row=\"row\"\n let-updateValue=\"updateValue\"\n let-value\n >\n <verbena-input\n [type]=\"'text'\"\n inputContainerClass=\"w-[130px]\"\n [(ngModel)]=\"row.DefaultValue\"\n ></verbena-input>\n </ng-template>\n </ng-container>\n <ng-container libColumn=\"dataType\">\n <ng-template #cell let-row=\"row\" let-value>\n {{ value }}\n </ng-template>\n <ng-template\n #cellEdit\n let-row=\"row\"\n let-updateValue=\"updateValue\"\n let-value\n >\n <div class=\"flex flex-col gap-1\">\n <verben-drop-down\n width=\"100%\"\n placeholder=\"Change Data Type\"\n [(options)]=\"dataType\"\n [(ngModel)]=\"row.DataType\"\n >\n </verben-drop-down>\n </div>\n </ng-template>\n </ng-container>\n\n <ng-container libColumn=\"isRequired\">\n <ng-template #cell let-row=\"row\" let-value>\n <verben-svg *ngIf=\"value === true\" [icon]=\"'check'\"></verben-svg>\n <verben-svg *ngIf=\"value === false\" [icon]=\"'error'\"></verben-svg>\n </ng-template>\n <ng-template\n #cellEdit\n let-row=\"row\"\n let-updateValue=\"updateValue\"\n let-value\n >\n <verbena-switch\n [onColor]=\"'var(--vbn-color-text)'\"\n [(ngModel)]=\"row.IsRequired\"\n ></verbena-switch>\n </ng-template>\n </ng-container>\n\n <ng-container libColumn=\"isReadOnly\">\n <ng-template #cell let-row=\"row\" let-value>\n <verben-svg *ngIf=\"value === true\" [icon]=\"'check'\"></verben-svg>\n <verben-svg *ngIf=\"value === false\" [icon]=\"'error'\"></verben-svg>\n </ng-template>\n <ng-template\n #cellEdit\n let-row=\"row\"\n let-updateValue=\"updateValue\"\n let-value\n >\n <verbena-switch\n [onColor]=\"'var(--vbn-color-text)'\"\n [(ngModel)]=\"row.IsReadOnly\"\n ></verbena-switch>\n </ng-template>\n </ng-container>\n\n <ng-container libColumn=\"actions\">\n <ng-template\n #cell\n let-isEditing=\"isEditing\"\n let-toggleRowEdit=\"toggleRowEdit\"\n let-row=\"row\"\n let-value\n >\n <verben-pop-Up\n [customStyles]=\"{ 'z-index': '99' }\"\n [dropdownOpen]=\"openDropdownId === row.id\"\n [enableMouseLeave]=\"false\"\n (close)=\"onClose()\"\n >\n <verben-svg\n class=\"cursor-pointer actions-icon\"\n (click)=\"openDropdown(row)\"\n dropdown-trigger\n icon=\"list\"\n ></verben-svg>\n <div\n class=\"pop-up-content flex flex-col\"\n *ngIf=\"openDropdownId === row.Id\"\n dropdown-content\n >\n <div\n (click)=\"toggleRowEdit()\"\n class=\"pop-up-value cursor-pointer\"\n >\n Edit\n </div>\n <div\n (click)=\"deleteProperty(row.Id)\"\n class=\"pop-up-value cursor-pointer\"\n >\n Delete\n </div>\n </div>\n </verben-pop-Up>\n </ng-template>\n <ng-template\n #cellEdit\n let-isEditing=\"isEditing\"\n let-toggleRowEdit=\"toggleRowEdit\"\n let-row=\"row\"\n let-value\n >\n <div class=\"flex gap-2 items-center\">\n <verben-svg\n icon=\"check\"\n [width]=\"15\"\n [height]=\"15\"\n (click)=\"saveViaTable(row, toggleRowEdit)\"\n ></verben-svg>\n <verben-svg\n (click)=\"toggleRowEdit(); deleteProperty(row.Id)\"\n icon=\"delete\"\n [width]=\"15\"\n [height]=\"15\"\n ></verben-svg>\n <verben-svg\n icon=\"cardViewAlt\"\n [width]=\"15\"\n [height]=\"15\"\n (click)=\"goToCardView(value)\"\n ></verben-svg>\n </div>\n </ng-template>\n </ng-container>\n </lib-data-table>\n </div>\n <div card-content>\n <verben-card-data-view\n borderRadius=\"12px\"\n #vdcv\n dataId=\"Id\"\n border=\"5px\"\n [cardDataList]=\"cardData\"\n rbgColor=\"var(--vbn-color-surface-alt)\"\n mg=\"0px\"\n >\n <verben-left-card-data-view class=\"space-y-7\">\n <verben-left-card-data\n #vlcd\n [parent]=\"vdcv\"\n dataId=\"id\"\n class=\"bg-secondary-100 rounded-xl border-primary border-[1px]\"\n [cardDataList]=\"cardData\"\n >\n <ng-template #card let-item>\n <div\n (click)=\"userCardClicked(item)\"\n class=\"flex cursor-pointer h-[max-content]\"\n >\n <!-- <verben-svg [width]=\"15\" [height]=\"15\" (click)=\"toggleChildren(item); $event.stopPropagation()\"\n [ngClass]=\"item.children && item.children.length?'visible':'invisible'\"\n class=\"items-center flex pr-1 cursor-pointer\" [icon]=\"item.isChildrenExpanded?'minus':'plus'\" /> -->\n <div class=\"flex w-full bg-secondary rounded-xl\">\n <div\n class=\"w-3 rounded-xl rounded-tr-none rounded-br-none\"\n [ngClass]=\"\n item.selected ? 'bg-primary' : 'bg-secondary-200'\n \"\n ></div>\n <div class=\"py-3 px-4 flex-1 h-[100%]\">\n <div\n class=\"flex items-start flex-1 gap-1 justify-between h-[100%]\"\n >\n <div\n class=\"flex flex-col flex-1 card-min-height justify-between h-[100%]\"\n >\n <div class=\"flex justify-between mr-4\">\n <div>\n <h3\n class=\"my-0 font-bold text-[var(--vbn-color-on-primary)] leading-[19.5px]\"\n >\n {{ item.data.Name }}\n </h3>\n <span class=\"flex items-center gap-1 mt-2\">\n <span class=\"!text-[10px] text-[var(--vbn-color-on-primary)]\"\n >Data Type:</span\n >\n <span class=\"!text-[13px] font-bold\">{{\n item.data.DataType\n }}</span>\n </span>\n </div>\n\n <div>\n <!-- <span class=\"!text-[10px] text-[var(--vbn-color-on-primary)]\"\n >Default Value:</span\n >\n <p class=\"!text-[12px]\">\n {{ item.data.DefaultValue }}\n </p> -->\n </div>\n </div>\n </div>\n\n <!-- <div class=\"flex items-end h-[100%]\">\n <span class=\"enum-val {{item.data.Status}}\">{{item.data.Status}}</span>\n </div> -->\n </div>\n </div>\n </div>\n </div>\n </ng-template>\n </verben-left-card-data>\n </verben-left-card-data-view>\n <verben-right-card-data-view>\n <ng-template #parent>\n <div\n *ngIf=\"currentData\"\n class=\"flex flex-col rounded-xl h-full w-full relative gap-6\"\n >\n <verbena-input\n name=\"Name\"\n label=\"Name\"\n [(ngModel)]=\"currentData.data.Name\"\n />\n <verbena-input\n name=\"Name\"\n label=\"Property Name\"\n (keydown)=\"onKeyDown($event, currentData.data)\"\n (paste)=\"onPaste($event, currentData.data)\"\n (input)=\"onInput($event, currentData.data)\"\n [(ngModel)]=\"currentData.data.PropertyName\"\n />\n <div class=\"flex flex-col gap-1\">\n <div>Data Type</div>\n <verben-drop-down\n width=\"100%\"\n placeholder=\"Change Data Type\"\n [(options)]=\"dataType\"\n [(ngModel)]=\"currentData.data.DataType\"\n (ngModelChange)=\"onDropDownChange($event)\"\n >\n </verben-drop-down>\n </div>\n\n <div\n *ngIf=\"\n currentData.data.DataType === 'SingleSelection' ||\n currentData.data.DataType === 'MultiSelection'\n \"\n >\n <p class=\"mb-2\">Enter Options</p>\n <verben-chip\n [placeholder]=\"'Enter Options'\"\n [(ngModel)]=\"chipArray\"\n (onChange)=\"onChipChange($event)\"\n ></verben-chip>\n </div>\n <div>\n <verbena-input\n [placeHolder]=\"'Enter default text'\"\n [(ngModel)]=\"currentData.data.DefaultValue\"\n name=\"DefaultValue\"\n label=\"Default Value (optional)\"\n />\n </div>\n <div>\n <p class=\"mb-2\">Required</p>\n\n <verbena-switch\n [onColor]=\"'var(--vbn-color-text)'\"\n [(ngModel)]=\"currentData.data.IsRequired\"\n ></verbena-switch>\n </div>\n <div>\n <p class=\"mb-2\">Read Only</p>\n\n <verbena-switch\n [onColor]=\"'var(--vbn-color-text)'\"\n [(ngModel)]=\"currentData.data.IsReadOnly\"\n ></verbena-switch>\n </div>\n <div\n *ngIf=\"\n currentData.data.DataType === 'Number' ||\n currentData.data.DataType === 'Text'\n \"\n class=\"flex flex-col gap-6\"\n >\n <verbena-input\n [type]=\"'number'\"\n name=\"minValue\"\n label=\"Min Value\"\n [ngModel]=\"getStringValue(currentData.data, 'MinValue')\"\n (valueChange)=\"\n convertToInt($event, currentData.data, 'MinValue')\n \"\n />\n <verbena-input\n [type]=\"'number'\"\n name=\"maxValue\"\n label=\"Max Value\"\n (ngModelChange)=\"updateTable()\"\n [ngModel]=\"getStringValue(currentData.data, 'MaxValue')\"\n (valueChange)=\"\n convertToInt($event, currentData.data, 'MaxValue')\n \"\n />\n </div>\n <!-- buttons -->\n <div class=\"flex justify-between w-full bottom-8 left-0 right-0\">\n <verbena-button\n (click)=\"deleteProperty(currentData.data.Id)\"\n class=\"verben-delete-button\"\n text=\"Delete\"\n ></verbena-button>\n <div class=\"flex gap-3\">\n <verbena-button\n class=\"verben-switch-button\"\n (click)=\"goToTableView()\"\n text=\"Switch To Table\"\n ></verbena-button>\n <!-- <verbena-button class=\"verben-primary-button\" (click)=\"saveUser()\" text=\"Save\"></verbena-button> -->\n </div>\n </div>\n </div>\n </ng-template>\n </verben-right-card-data-view>\n <!-- <verben-right-card-data-view>\n yeshhhhhh\n </verben-right-card-data-view> -->\n\n <verben-card-data-view-footer>\n <div class=\"flex gap-2 justify-between\">\n <div\n *ngIf=\"!vdcv.hasCurrentItem()\"\n class=\"message-log-button-container flex justify-between\"\n >\n <verbena-button\n [fontWeight]=\"'bold'\"\n [bgColor]=\"'var(--vbn-color-text-muted)'\"\n [borderRadius]=\"'4px'\"\n [textColor]=\"'var(--vbn-color-surface)'\"\n [text]=\"'Delete'\"\n >\n </verbena-button>\n </div>\n <div\n class=\"flex {{\n vdcv.hasCurrentItem() ? 'flex-1' : ''\n }} justify-end items-center gap-5\"\n >\n <span class=\"paginator-text\"\n >{{ cardData.length }} records loaded</span\n >\n </div>\n </div>\n </verben-card-data-view-footer>\n </verben-card-data-view>\n </div>\n <div column-content>\n <verben-visible-column\n (resetFilter)=\"getProperties(Id, showColumn)\"\n (columnsUpdated)=\"onColumnsUpdated($event)\"\n [border]=\"'1px solid var(--vbn-color-primary)'\"\n borderRadius=\"10px\"\n boxShadow=\"2px 2px 2px 0px silver\"\n bgColor=\"white\"\n width=\"400px\"\n textColor=\"black\"\n pd=\"1rem\"\n primaryColor=\"var(--vbn-color-primary)\"\n secondaryColor=\"var(--vbn-color-border-focus)\"\n [columns]=\"visibleColumns\"\n [displayedColumns]=\"5\"\n ></verben-visible-column>\n </div>\n <div filter-content>\n <verben-table-filter\n (resetSortData)=\"getProperties(Id, showFilter)\"\n (filtersApplied)=\"onFilterApplied($event)\"\n [border]=\"'1px solid var(--vbn-color-primary)'\"\n borderRadius=\"10px\"\n boxShadow=\"2px 2px 2px 0px silver\"\n bgColor=\"white\"\n width=\"420px\"\n textColor=\"black\"\n pd=\"1rem\"\n primaryColor=\"var(--vbn-color-primary)\"\n secondaryColor=\"var(--vbn-color-border-focus)\"\n tertiaryColor=\"var(--vbn-color-on-primary)\"\n [filterOptions]=\"filterArray\"\n [maxFilterLength]=\"3\"\n ></verben-table-filter>\n </div>\n <div sort-content>\n <verben-sort-table\n (resetSortData)=\"getProperties(Id, showSort)\"\n (selectedOptions)=\"onSortUpdated($event)\"\n [border]=\"'1px solid var(--vbn-color-primary)'\"\n borderRadius=\"10px\"\n boxShadow=\"2px 2px 2px 0px silver\"\n bgColor=\"white\"\n width=\"400px\"\n textColor=\"black\"\n pd=\"1rem\"\n primaryColor=\"var(--vbn-color-primary)\"\n secondaryColor=\"var(--vbn-color-border-focus)\"\n tertiaryColor=\"var(--vbn-color-on-primary)\"\n [enableDragAndDrop]=\"true\"\n [sortOptions]=\"sortOptions\"\n ></verben-sort-table>\n </div>\n <div export-content>\n <lib-data-export\n [data]=\"data[0].Properties\"\n (exportDataEvent)=\"handleExport($event)\"\n >\n </lib-data-export>\n </div>\n </verben-data-view>\n <div *ngIf=\"vdv.isTableView\" class=\"flex gap-2 justify-between\">\n <div class=\"message-log-button-container flex justify-between\">\n <verbena-button\n [fontWeight]=\"'bold'\"\n [bgColor]=\"'var(--vbn-color-text-muted)'\"\n [borderRadius]=\"'4px'\"\n [textColor]=\"'var(--vbn-color-surface)'\"\n [text]=\"'Delete'\"\n >\n </verbena-button>\n </div>\n <div class=\"flex justify-end items-center gap-5\">\n <span class=\"paginator-text\">{{ cardData.length }} records loaded</span>\n <button (click)=\"loadMore()\" class=\"load-more view-links\">\n Load more\n </button>\n </div>\n </div>\n</div>\n<!-- <div class=\"w-[400px] bg-white p-4 shadow-lg border\">\n <form-control [dataType]=\"dataType2\" [formProperties]=\"data[0].Properties\"></form-control>\n</div> -->\n", styles: [".view-links{font-size:14px!important;color:var(--vbn-color-border-focus);font-weight:600;cursor:pointer}.view-links:hover{text-decoration:underline;text-underline-offset:3px}.context-banner{background-color:#d4a00773}.card-min-height{gap:10px}::ng-deep .childrenPadding{max-height:300px;overflow-y:auto}::ng-deep .toolbar{margin-bottom:15px}::ng-deep .master-only-container{margin:0!important;padding:0!important}::ng-deep .master-detail-container{margin:0!important;padding:0!important}.pop-up-content{border-radius:4px;background-color:var(--vbn-color-surface);border:1px solid rgba(212,161,7,.5)}.pop-up-value{padding:10px 20px}.pop-up-content>div:nth-child(1){border-bottom:4px solid var(--vbn-color-primary)}.enum-val{padding:2px 10px;width:100%;min-width:max-content;text-align:center}.enum-val.Active{background-color:var(--vbn-color-success-bg);color:var(--vbn-color-success)}.enum-val.InActive{background-color:#ffdfdf;color:var(--vbn-color-error)}.toggle-container{width:53px;padding:1px;color:var(--vbn-color-surface);height:22px;position:relative;background-color:var(--vbn-color-text);border-radius:2rem;cursor:pointer}.toggle-circle{width:50%;height:100%;position:absolute;left:0;padding:5px;top:0;background-color:var(--vbn-color-surface);border-radius:50%;transform:scale(1);transition:transform .3s}.translate-100{transform:translate(100%)}.translate-0{transform:translate(0)}.toggle-text-on{display:block;font-size:12px;margin-left:4px}.toggle-text-off{display:block;font-size:12px;margin-right:4px;text-align:right}\n"], dependencies: [{ kind: "directive", type: i5.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i5.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: i6.DataTableComponent, selector: "lib-data-table", inputs: ["data", "columns", "dataKey", "formGroupConfig", "groupBy", "useVirtualScroll", "virtualScrollItemSize", "styleConfig"], outputs: ["rowEdit", "rowSave", "rowRevert", "rowDelete", "selectionChange"] }, { kind: "directive", type: i6.ColumnDirective, selector: "[libColumn]", inputs: ["libColumn"] }, { kind: "component", type: i6.SvgComponent, selector: "verben-svg", inputs: ["icon", "width", "height", "fill", "stroke", "type", "size"] }, { kind: "component", type: i6.VerbenPopUpComponent, selector: "verben-pop-Up", inputs: ["dropdownOpen", "dropdownWidth", "color", "customStyles", "popUpClass", "border", "borderRadius", "enableMouseLeave", "cdkPosition"], outputs: ["dropdownOpenChange", "close"] }, { kind: "component", type: i6.DataViewComponent, selector: "verben-data-view", inputs: ["buttonClass", "iconClass", "activeIconClass", "columnCustomClass", "filterCustomClass", "sortCustomClass", "extendCustomClass", "exportCustomClass", "selectCustomClass", "importCustomClass", "zIndex", "createCustomClass", "tableIcon", "cardIcon", "cardClass", "tableClass", "searchKey", "searchValue", "viewState", "searchTemplate", "importTemplate", "columnTemplate", "extendTemplate", "filterTemplate", "sortTemplate", "children", "exportTemplate", "createTemplate", "selectedColumnCount", "selectedSortCount", "selectedFilterTableCount", "inputWidth", "milliseconds", "showColumnChild", "showSortChild", "showFilterChild", "showImportChild", "showExportChild", "showExtendChild", "create", "showSelected", "isTableView"], outputs: ["viewChange", "stateChange", "onSearchChange"] }, { kind: "component", type: i6.VerbenaButtonComponent, selector: "verbena-button", inputs: ["type", "text", "icon", "useIcon", "svgPosition", "iconPosition", "bgColor", "textColor", "border", "borderRadius", "pd", "width", "height", "fontSize", "fontWeight", "disable", "svgSize", "weight", "variant", "styleType", "svg", "svgWidth", "svgHeight", "iconColor", "svgColor", "buttonClass", "buttonTextClass", "isLoading", "spinnerSize", "spinnerColor"] }, { kind: "component", type: i6.CardDataViewComponent, selector: "verben-card-data-view", inputs: ["pd", "mg", "lHeight", "rHeight", "rWidth", "lWidth", "textColor", "lbgColor", "rbgColor", "border", "display", "borderRadius", "activeCss", "inActiveCss", "displayAsRow", "cardDataList", "dataId", "totalRecords", "footer", "noOfVisibleChildren", "showEditIcon", "useVirtualScroll", "virtualScrollItemSize", "onItemClick", "onCardChildClick"], outputs: ["editClicked", "loadMoreClick"] }, { kind: "component", type: i6.LeftCardDataComponent, selector: "verben-left-card-data", inputs: ["pd", "mg", "height", "weight", "activeCss", "inActiveCss", "cardDataList", "iconCollapse", "iconExpanded", "parent", "useVirtualScroll", "virtualScrollItemSize", "dataId"] }, { kind: "component", type: i6.LeftCardDataViewComponent, selector: "verben-left-card-data-view", inputs: ["cardDataList"] }, { kind: "component", type: i6.RightCardDataViewComponent, selector: "verben-right-card-data-view", inputs: ["parentData", "chilData", "meth"] }, { kind: "component", type: i6.CardDataViewFooterComponent, selector: "verben-card-data-view-footer" }, { kind: "component", type: i6.DropDownComponent, selector: "verben-drop-down", inputs: ["options", "width", "overlayWidth", "showHorizontalLine", "horizontalLineColor", "optionLabel", "optionSubLabel", "optionValue", "placeholder", "invalidMessage", "errorPosition", "loadMoreCaption", "display", "showClear", "lazyLoad", "selectKey", "styleClass", "group", "multiselect", "filter", "avoidDuplication", "filterBy", "debounceTime", "minChar", "refPageSize", "disabled", "required", "load", "asyncLabel", "search"], outputs: ["optionsChange", "onChange", "onClick", "onClear"] }, { kind: "component", type: i6.TableFilterComponent, selector: "verben-table-filter", inputs: ["filterOptions", "pd", "mg", "height", "width", "bgColor", "boxShadow", "textColor", "primaryColor", "secondaryColor", "tertiaryColor", "border", "borderRadius", "selectWidth", "maxFilterLength", "tooltip"], outputs: ["filtersApplied", "resetSortData"] }, { kind: "component", type: i6.VisibleColumnComponent, selector: "verben-visible-column", inputs: ["columns", "items", "enableDragAndDrop", "displayedColumns", "showMore", "pd", "mg", "height", "width", "bgColor", "boxShadow", "textColor", "primaryColor", "secondaryColor", "tertiaryColor", "border", "borderRadius", "selectWidth", "closeColumn"], outputs: ["columnsUpdated", "resetFilter"] }, { kind: "component", type: i6.SortTableComponent, selector: "verben-sort-table", inputs: ["enableDragAndDrop", "sortOptions", "resetText", "displayedOptions", "propertyText", "showMoreText", "sortButtonText", "pd", "mg", "height", "width", "bgColor", "boxShadow", "textColor", "primaryColor", "secondaryColor", "tertiaryColor", "border", "borderRadius", "selectWidth", "containerHeight"], outputs: ["selectedOptions", "resetSortData"] }, { kind: "component", type: i6.DataExportComponent, selector: "lib-data-export", inputs: ["columns", "data", "dataFetchUrl", "dataQueryParameters"], outputs: ["exportDataEvent"] }, { kind: "component", type: i6.VerbenaInputComponent, selector: "verbena-input", inputs: ["disabled", "label", "placeHolder", "required", "svgPosition", "minLength", "maxLength", "type", "bgColor", "border", "borderRadius", "textColor", "value", "labelPosition", "labelColor", "disable", "readOnly", "min", "max", "showBorder", "showErrorMessage", "errorMessageColor", "errorBorderColor", "errorPosition", "svg", "fontSize", "svgWidth", "svgHeight", "svgColor", "capitalization", "inputContainerClass", "inputFieldClass", "passLength", "inputWrapperClass", "passwordToggle", "customErrorMessages", "icon", "textPass"], outputs: ["valueChange"] }, { kind: "component", type: i6.VerbenaSwitchComponent, selector: "verbena-switch", inputs: ["label", "checked", "disabled", "offColor", "onColor", "onText", "offText", "width", "height", "customStyles"], outputs: ["change"] }, { kind: "component", type: i6.ChipComponent, selector: "verben-chip", inputs: ["width", "placeholder", "max", "styleClass", "separator", "disabled", "required", "invalidMessage", "errorPosition"], outputs: ["onChange"] }] });
914
914
  }
915
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: FormFieldsComponent, decorators: [{
915
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: FormFieldsComponent, decorators: [{
916
916
  type: Component,
917
- args: [{ selector: 'lib-form-fields', template: "<header\n class=\"rounded-lg shadow-lg flex justify-between items-center px-6 py-2 bg-[#D4A00773]\"\n>\n <div class=\"flex items-center gap-10\">\n <h4 class=\"font-semibold\">{{ formName }}</h4>\n <span class=\"flex items-center gap-1\">\n Ref ID:\n <span>{{ Id }}</span>\n </span>\n </div>\n <div class=\"flex gap-3 items-center\">\n <verbena-button\n [pd]=\"'6px'\"\n class=\"verben-primary-button\"\n (click)=\"saveAllProperties()\"\n text=\"Save All\"\n ></verbena-button>\n <verben-svg\n (click)=\"goBack()\"\n class=\"cursor-pointer\"\n [width]=\"17\"\n [height]=\"17\"\n [icon]=\"'close'\"\n ></verben-svg>\n </div>\n</header>\n<div #messageLog class=\"flex flex-col gap-4 message-log-container\">\n <verben-data-view\n #vdv\n [viewState]=\"{\n isSearch: true,\n isColumn: true,\n isFilter: true,\n isSort: true,\n isExport: true,\n isSelect: true,\n isCreate: true,\n isToggle: true,\n }\"\n [buttonClass]=\"'my-custom-button-class'\"\n [iconClass]=\"'my-icon-class'\"\n [showSortChild]=\"showSort\"\n [showColumnChild]=\"showColumn\"\n [activeIconClass]=\"'my-active-icon-class'\"\n [selectedColumnCount]=\"selectedColumnTableCount\"\n [selectedSortCount]=\"selectedSortTableCount\"\n [selectedFilterTableCount]=\"selectedFilterTableCount\"\n [showFilterChild]=\"showFilter\"\n [searchValue]=\"searchTerm\"\n (viewChange)=\"onViewChange($event)\"\n (stateChange)=\"onStateChange($event)\"\n (onSearchChange)=\"onSearch($event)\"\n >\n <div class=\"mt-2\" table-content>\n <lib-data-table\n #dt\n [data]=\"data[0].Properties\"\n [columns]=\"visibleColumnDef\"\n [styleConfig]=\"styles\"\n (selectionChange)=\"onSelectionChange($event)\"\n >\n <ng-container libColumn=\"select\">\n <ng-template\n #cell\n let-isSelected=\"isSelected\"\n let-toggleRowSelection=\"toggleRowSelection\"\n >\n <input\n type=\"checkbox\"\n [checked]=\"isSelected\"\n (change)=\"toggleRowSelection()\"\n />\n </ng-template>\n <ng-template\n #header\n let-allRowsSelected=\"allRowsSelected\"\n let-someRowsSelected=\"someRowsSelected\"\n let-toggleAllRows=\"toggleAllRows\"\n >\n <input\n type=\"checkbox\"\n [checked]=\"allRowsSelected()\"\n [indeterminate]=\"someRowsSelected()\"\n (change)=\"toggleAllRows()\"\n />\n </ng-template>\n </ng-container>\n <ng-container libColumn=\"name\">\n <ng-template #cell let-row=\"row\" let-value>\n {{ value.Name }}\n </ng-template>\n <ng-template\n #cellEdit\n let-row=\"row\"\n let-updateValue=\"updateValue\"\n let-value\n >\n <verbena-input\n inputContainerClass=\"w-fit\"\n [(ngModel)]=\"row.Name\"\n ></verbena-input>\n </ng-template>\n </ng-container>\n <ng-container libColumn=\"propertyName\">\n <ng-template #cell let-row=\"row\" let-value>\n {{ row.PropertyName }}\n </ng-template>\n <ng-template\n #cellEdit\n let-row=\"row\"\n let-updateValue=\"updateValue\"\n let-value\n >\n <verbena-input\n (keydown)=\"onKeyDown($event, row)\"\n (paste)=\"onPaste($event, row)\"\n (input)=\"onInput($event, row)\"\n inputContainerClass=\"w-fit\"\n [(ngModel)]=\"row.PropertyName\"\n ></verbena-input>\n </ng-template>\n </ng-container>\n <ng-container libColumn=\"minValue\">\n <ng-template #cell let-row=\"row\" let-value>\n {{ value }}\n </ng-template>\n <ng-template\n #cellEdit\n let-row=\"row\"\n let-updateValue=\"updateValue\"\n let-value\n >\n <verbena-input\n [type]=\"'number'\"\n [ngModel]=\"getStringValue(row, 'MinValue')\"\n (valueChange)=\"convertToInt($event, row, 'MinValue')\"\n inputContainerClass=\"w-[130px]\"\n ></verbena-input>\n </ng-template>\n </ng-container>\n <ng-container libColumn=\"maxValue\">\n <ng-template #cell let-row=\"row\" let-value>\n {{ value }}\n </ng-template>\n <ng-template\n #cellEdit\n let-row=\"row\"\n let-updateValue=\"updateValue\"\n let-value\n >\n <verbena-input\n [type]=\"'number'\"\n inputContainerClass=\"w-[130px]\"\n [ngModel]=\"getStringValue(row, 'MaxValue')\"\n (valueChange)=\"convertToInt($event, row, 'MaxValue')\"\n ></verbena-input>\n </ng-template>\n </ng-container>\n <ng-container libColumn=\"defaultValue\">\n <ng-template #cell let-row=\"row\" let-value>\n {{ value }}\n </ng-template>\n <ng-template\n #cellEdit\n let-row=\"row\"\n let-updateValue=\"updateValue\"\n let-value\n >\n <verbena-input\n [type]=\"'text'\"\n inputContainerClass=\"w-[130px]\"\n [(ngModel)]=\"row.DefaultValue\"\n ></verbena-input>\n </ng-template>\n </ng-container>\n <ng-container libColumn=\"dataType\">\n <ng-template #cell let-row=\"row\" let-value>\n {{ value }}\n </ng-template>\n <ng-template\n #cellEdit\n let-row=\"row\"\n let-updateValue=\"updateValue\"\n let-value\n >\n <div class=\"flex flex-col gap-1\">\n <verben-drop-down\n width=\"100%\"\n placeholder=\"Change Data Type\"\n [(options)]=\"dataType\"\n [(ngModel)]=\"row.DataType\"\n >\n </verben-drop-down>\n </div>\n </ng-template>\n </ng-container>\n\n <ng-container libColumn=\"isRequired\">\n <ng-template #cell let-row=\"row\" let-value>\n <verben-svg *ngIf=\"value === true\" [icon]=\"'check'\"></verben-svg>\n <verben-svg *ngIf=\"value === false\" [icon]=\"'error'\"></verben-svg>\n </ng-template>\n <ng-template\n #cellEdit\n let-row=\"row\"\n let-updateValue=\"updateValue\"\n let-value\n >\n <verbena-switch\n [onColor]=\"'#1A237E'\"\n [(ngModel)]=\"row.IsRequired\"\n ></verbena-switch>\n </ng-template>\n </ng-container>\n\n <ng-container libColumn=\"isReadOnly\">\n <ng-template #cell let-row=\"row\" let-value>\n <verben-svg *ngIf=\"value === true\" [icon]=\"'check'\"></verben-svg>\n <verben-svg *ngIf=\"value === false\" [icon]=\"'error'\"></verben-svg>\n </ng-template>\n <ng-template\n #cellEdit\n let-row=\"row\"\n let-updateValue=\"updateValue\"\n let-value\n >\n <verbena-switch\n [onColor]=\"'#1A237E'\"\n [(ngModel)]=\"row.IsReadOnly\"\n ></verbena-switch>\n </ng-template>\n </ng-container>\n\n <ng-container libColumn=\"actions\">\n <ng-template\n #cell\n let-isEditing=\"isEditing\"\n let-toggleRowEdit=\"toggleRowEdit\"\n let-row=\"row\"\n let-value\n >\n <verben-pop-Up\n [customStyles]=\"{ 'z-index': '99' }\"\n [dropdownOpen]=\"openDropdownId === row.id\"\n [enableMouseLeave]=\"false\"\n (close)=\"onClose()\"\n >\n <verben-svg\n class=\"cursor-pointer actions-icon\"\n (click)=\"openDropdown(row)\"\n dropdown-trigger\n icon=\"list\"\n ></verben-svg>\n <div\n class=\"pop-up-content flex flex-col\"\n *ngIf=\"openDropdownId === row.Id\"\n dropdown-content\n >\n <div\n (click)=\"toggleRowEdit()\"\n class=\"pop-up-value cursor-pointer\"\n >\n Edit\n </div>\n <div\n (click)=\"deleteProperty(row.Id)\"\n class=\"pop-up-value cursor-pointer\"\n >\n Delete\n </div>\n </div>\n </verben-pop-Up>\n </ng-template>\n <ng-template\n #cellEdit\n let-isEditing=\"isEditing\"\n let-toggleRowEdit=\"toggleRowEdit\"\n let-row=\"row\"\n let-value\n >\n <div class=\"flex gap-2 items-center\">\n <verben-svg\n icon=\"check\"\n [width]=\"15\"\n [height]=\"15\"\n (click)=\"saveViaTable(row, toggleRowEdit)\"\n ></verben-svg>\n <verben-svg\n (click)=\"toggleRowEdit(); deleteProperty(row.Id)\"\n icon=\"delete\"\n [width]=\"15\"\n [height]=\"15\"\n ></verben-svg>\n <verben-svg\n icon=\"cardViewAlt\"\n [width]=\"15\"\n [height]=\"15\"\n (click)=\"goToCardView(value)\"\n ></verben-svg>\n </div>\n </ng-template>\n </ng-container>\n </lib-data-table>\n </div>\n <div card-content>\n <verben-card-data-view\n borderRadius=\"12px\"\n #vdcv\n dataId=\"Id\"\n border=\"5px\"\n [cardDataList]=\"cardData\"\n rbgColor=\"#f5f6f9\"\n mg=\"0px\"\n >\n <verben-left-card-data-view class=\"space-y-7\">\n <verben-left-card-data\n #vlcd\n [parent]=\"vdcv\"\n dataId=\"id\"\n class=\"bg-secondary-100 rounded-xl border-primary border-[1px]\"\n [cardDataList]=\"cardData\"\n >\n <ng-template #card let-item>\n <div\n (click)=\"userCardClicked(item)\"\n class=\"flex cursor-pointer h-[max-content]\"\n >\n <!-- <verben-svg [width]=\"15\" [height]=\"15\" (click)=\"toggleChildren(item); $event.stopPropagation()\"\n [ngClass]=\"item.children && item.children.length?'visible':'invisible'\"\n class=\"items-center flex pr-1 cursor-pointer\" [icon]=\"item.isChildrenExpanded?'minus':'plus'\" /> -->\n <div class=\"flex w-full bg-secondary rounded-xl\">\n <div\n class=\"w-3 rounded-xl rounded-tr-none rounded-br-none\"\n [ngClass]=\"\n item.selected ? 'bg-primary' : 'bg-secondary-200'\n \"\n ></div>\n <div class=\"py-3 px-4 flex-1 h-[100%]\">\n <div\n class=\"flex items-start flex-1 gap-1 justify-between h-[100%]\"\n >\n <div\n class=\"flex flex-col flex-1 card-min-height justify-between h-[100%]\"\n >\n <div class=\"flex justify-between mr-4\">\n <div>\n <h3\n class=\"my-0 font-bold text-[#404040] leading-[19.5px]\"\n >\n {{ item.data.Name }}\n </h3>\n <span class=\"flex items-center gap-1 mt-2\">\n <span class=\"!text-[10px] text-[#404040]\"\n >Data Type:</span\n >\n <span class=\"!text-[13px] font-bold\">{{\n item.data.DataType\n }}</span>\n </span>\n </div>\n\n <div>\n <!-- <span class=\"!text-[10px] text-[#404040]\"\n >Default Value:</span\n >\n <p class=\"!text-[12px]\">\n {{ item.data.DefaultValue }}\n </p> -->\n </div>\n </div>\n </div>\n\n <!-- <div class=\"flex items-end h-[100%]\">\n <span class=\"enum-val {{item.data.Status}}\">{{item.data.Status}}</span>\n </div> -->\n </div>\n </div>\n </div>\n </div>\n </ng-template>\n </verben-left-card-data>\n </verben-left-card-data-view>\n <verben-right-card-data-view>\n <ng-template #parent>\n <div\n *ngIf=\"currentData\"\n class=\"flex flex-col rounded-xl h-full w-full relative gap-6\"\n >\n <verbena-input\n name=\"Name\"\n label=\"Name\"\n [(ngModel)]=\"currentData.data.Name\"\n />\n <verbena-input\n name=\"Name\"\n label=\"Property Name\"\n (keydown)=\"onKeyDown($event, currentData.data)\"\n (paste)=\"onPaste($event, currentData.data)\"\n (input)=\"onInput($event, currentData.data)\"\n [(ngModel)]=\"currentData.data.PropertyName\"\n />\n <div class=\"flex flex-col gap-1\">\n <div>Data Type</div>\n <verben-drop-down\n width=\"100%\"\n placeholder=\"Change Data Type\"\n [(options)]=\"dataType\"\n [(ngModel)]=\"currentData.data.DataType\"\n (ngModelChange)=\"onDropDownChange($event)\"\n >\n </verben-drop-down>\n </div>\n\n <div\n *ngIf=\"\n currentData.data.DataType === 'SingleSelection' ||\n currentData.data.DataType === 'MultiSelection'\n \"\n >\n <p class=\"mb-2\">Enter Options</p>\n <verben-chip\n [placeholder]=\"'Enter Options'\"\n [(ngModel)]=\"chipArray\"\n (onChange)=\"onChipChange($event)\"\n ></verben-chip>\n </div>\n <div>\n <verbena-input\n [placeHolder]=\"'Enter default text'\"\n [(ngModel)]=\"currentData.data.DefaultValue\"\n name=\"DefaultValue\"\n label=\"Default Value (optional)\"\n />\n </div>\n <div>\n <p class=\"mb-2\">Required</p>\n\n <verbena-switch\n [onColor]=\"'#1A237E'\"\n [(ngModel)]=\"currentData.data.IsRequired\"\n ></verbena-switch>\n </div>\n <div>\n <p class=\"mb-2\">Read Only</p>\n\n <verbena-switch\n [onColor]=\"'#1A237E'\"\n [(ngModel)]=\"currentData.data.IsReadOnly\"\n ></verbena-switch>\n </div>\n <div\n *ngIf=\"\n currentData.data.DataType === 'Number' ||\n currentData.data.DataType === 'Text'\n \"\n class=\"flex flex-col gap-6\"\n >\n <verbena-input\n [type]=\"'number'\"\n name=\"minValue\"\n label=\"Min Value\"\n [ngModel]=\"getStringValue(currentData.data, 'MinValue')\"\n (valueChange)=\"\n convertToInt($event, currentData.data, 'MinValue')\n \"\n />\n <verbena-input\n [type]=\"'number'\"\n name=\"maxValue\"\n label=\"Max Value\"\n (ngModelChange)=\"updateTable()\"\n [ngModel]=\"getStringValue(currentData.data, 'MaxValue')\"\n (valueChange)=\"\n convertToInt($event, currentData.data, 'MaxValue')\n \"\n />\n </div>\n <!-- buttons -->\n <div class=\"flex justify-between w-full bottom-8 left-0 right-0\">\n <verbena-button\n (click)=\"deleteProperty(currentData.data.Id)\"\n class=\"verben-delete-button\"\n text=\"Delete\"\n ></verbena-button>\n <div class=\"flex gap-3\">\n <verbena-button\n class=\"verben-switch-button\"\n (click)=\"goToTableView()\"\n text=\"Switch To Table\"\n ></verbena-button>\n <!-- <verbena-button class=\"verben-primary-button\" (click)=\"saveUser()\" text=\"Save\"></verbena-button> -->\n </div>\n </div>\n </div>\n </ng-template>\n </verben-right-card-data-view>\n <!-- <verben-right-card-data-view>\n yeshhhhhh\n </verben-right-card-data-view> -->\n\n <verben-card-data-view-footer>\n <div class=\"flex gap-2 justify-between\">\n <div\n *ngIf=\"!vdcv.hasCurrentItem()\"\n class=\"message-log-button-container flex justify-between\"\n >\n <verbena-button\n [fontWeight]=\"'bold'\"\n [bgColor]=\"'#8E8D87'\"\n [borderRadius]=\"'4px'\"\n [textColor]=\"'#fff'\"\n [text]=\"'Delete'\"\n >\n </verbena-button>\n </div>\n <div\n class=\"flex {{\n vdcv.hasCurrentItem() ? 'flex-1' : ''\n }} justify-end items-center gap-5\"\n >\n <span class=\"paginator-text\"\n >{{ cardData.length }} records loaded</span\n >\n </div>\n </div>\n </verben-card-data-view-footer>\n </verben-card-data-view>\n </div>\n <div column-content>\n <verben-visible-column\n (resetFilter)=\"getProperties(Id, showColumn)\"\n (columnsUpdated)=\"onColumnsUpdated($event)\"\n [border]=\"'1px solid rgba(212, 160, 7, 1)'\"\n borderRadius=\"10px\"\n boxShadow=\"2px 2px 2px 0px silver\"\n bgColor=\"white\"\n width=\"400px\"\n textColor=\"black\"\n pd=\"1rem\"\n primaryColor=\"#FFE681\"\n secondaryColor=\"#3479E9\"\n [columns]=\"visibleColumns\"\n [displayedColumns]=\"5\"\n ></verben-visible-column>\n </div>\n <div filter-content>\n <verben-table-filter\n (resetSortData)=\"getProperties(Id, showFilter)\"\n (filtersApplied)=\"onFilterApplied($event)\"\n [border]=\"'1px solid rgba(212, 160, 7, 1)'\"\n borderRadius=\"10px\"\n boxShadow=\"2px 2px 2px 0px silver\"\n bgColor=\"white\"\n width=\"420px\"\n textColor=\"black\"\n pd=\"1rem\"\n primaryColor=\"#FFE681\"\n secondaryColor=\"#3479E9\"\n tertiaryColor=\"#404040\"\n [filterOptions]=\"filterArray\"\n [maxFilterLength]=\"3\"\n ></verben-table-filter>\n </div>\n <div sort-content>\n <verben-sort-table\n (resetSortData)=\"getProperties(Id, showSort)\"\n (selectedOptions)=\"onSortUpdated($event)\"\n [border]=\"'1px solid rgba(212, 160, 7, 1)'\"\n borderRadius=\"10px\"\n boxShadow=\"2px 2px 2px 0px silver\"\n bgColor=\"white\"\n width=\"400px\"\n textColor=\"black\"\n pd=\"1rem\"\n primaryColor=\"#FFE681\"\n secondaryColor=\"#3479E9\"\n tertiaryColor=\"#404040\"\n [enableDragAndDrop]=\"true\"\n [sortOptions]=\"sortOptions\"\n ></verben-sort-table>\n </div>\n <div export-content>\n <lib-data-export\n [data]=\"data[0].Properties\"\n (exportDataEvent)=\"handleExport($event)\"\n >\n </lib-data-export>\n </div>\n </verben-data-view>\n <div *ngIf=\"vdv.isTableView\" class=\"flex gap-2 justify-between\">\n <div class=\"message-log-button-container flex justify-between\">\n <verbena-button\n [fontWeight]=\"'bold'\"\n [bgColor]=\"'#8E8D87'\"\n [borderRadius]=\"'4px'\"\n [textColor]=\"'#fff'\"\n [text]=\"'Delete'\"\n >\n </verbena-button>\n </div>\n <div class=\"flex justify-end items-center gap-5\">\n <span class=\"paginator-text\">{{ cardData.length }} records loaded</span>\n <button (click)=\"loadMore()\" class=\"load-more view-links\">\n Load more\n </button>\n </div>\n </div>\n</div>\n<!-- <div class=\"w-[400px] bg-white p-4 shadow-lg border\">\n <form-control [dataType]=\"dataType2\" [formProperties]=\"data[0].Properties\"></form-control>\n</div> -->\n", styles: [".view-links{font-size:14px!important;color:#00f;font-weight:600;cursor:pointer}.view-links:hover{text-decoration:underline;text-underline-offset:3px}.context-banner{background-color:#d4a00773}.card-min-height{gap:10px}::ng-deep .childrenPadding{max-height:300px;overflow-y:auto}::ng-deep .toolbar{margin-bottom:15px}::ng-deep .master-only-container{margin:0!important;padding:0!important}::ng-deep .master-detail-container{margin:0!important;padding:0!important}.pop-up-content{border-radius:4px;background-color:#fff;border:1px solid rgba(212,161,7,.5)}.pop-up-value{padding:10px 20px}.pop-up-content>div:nth-child(1){border-bottom:4px solid #FFE681}.enum-val{padding:2px 10px;width:100%;min-width:max-content;text-align:center}.enum-val.Active{background-color:#d6f3e6;color:#2db76f}.enum-val.InActive{background-color:#ffdfdf;color:#eb5757}.toggle-container{width:53px;padding:1px;color:#fff;height:22px;position:relative;background-color:#1a237e;border-radius:2rem;cursor:pointer}.toggle-circle{width:50%;height:100%;position:absolute;left:0;padding:5px;top:0;background-color:#fff;border-radius:50%;transform:scale(1);transition:transform .3s}.translate-100{transform:translate(100%)}.translate-0{transform:translate(0)}.toggle-text-on{display:block;font-size:12px;margin-left:4px}.toggle-text-off{display:block;font-size:12px;margin-right:4px;text-align:right}\n"] }]
917
+ args: [{ selector: 'lib-form-fields', template: "<header\n class=\"rounded-lg shadow-lg flex justify-between items-center px-6 py-2 bg-[#D4A00773]\"\n>\n <div class=\"flex items-center gap-10\">\n <h4 class=\"font-semibold\">{{ formName }}</h4>\n <span class=\"flex items-center gap-1\">\n Ref ID:\n <span>{{ Id }}</span>\n </span>\n </div>\n <div class=\"flex gap-3 items-center\">\n <verbena-button\n [pd]=\"'6px'\"\n class=\"verben-primary-button\"\n (click)=\"saveAllProperties()\"\n text=\"Save All\"\n ></verbena-button>\n <verben-svg\n (click)=\"goBack()\"\n class=\"cursor-pointer\"\n [width]=\"17\"\n [height]=\"17\"\n [icon]=\"'close'\"\n ></verben-svg>\n </div>\n</header>\n<div #messageLog class=\"flex flex-col gap-4 message-log-container\">\n <verben-data-view\n #vdv\n [viewState]=\"{\n isSearch: true,\n isColumn: true,\n isFilter: true,\n isSort: true,\n isExport: true,\n isSelect: true,\n isCreate: true,\n isToggle: true,\n }\"\n [buttonClass]=\"'my-custom-button-class'\"\n [iconClass]=\"'my-icon-class'\"\n [showSortChild]=\"showSort\"\n [showColumnChild]=\"showColumn\"\n [activeIconClass]=\"'my-active-icon-class'\"\n [selectedColumnCount]=\"selectedColumnTableCount\"\n [selectedSortCount]=\"selectedSortTableCount\"\n [selectedFilterTableCount]=\"selectedFilterTableCount\"\n [showFilterChild]=\"showFilter\"\n [searchValue]=\"searchTerm\"\n (viewChange)=\"onViewChange($event)\"\n (stateChange)=\"onStateChange($event)\"\n (onSearchChange)=\"onSearch($event)\"\n >\n <div class=\"mt-2\" table-content>\n <lib-data-table\n #dt\n [data]=\"data[0].Properties\"\n [columns]=\"visibleColumnDef\"\n [styleConfig]=\"styles\"\n (selectionChange)=\"onSelectionChange($event)\"\n >\n <ng-container libColumn=\"select\">\n <ng-template\n #cell\n let-isSelected=\"isSelected\"\n let-toggleRowSelection=\"toggleRowSelection\"\n >\n <input\n type=\"checkbox\"\n [checked]=\"isSelected\"\n (change)=\"toggleRowSelection()\"\n />\n </ng-template>\n <ng-template\n #header\n let-allRowsSelected=\"allRowsSelected\"\n let-someRowsSelected=\"someRowsSelected\"\n let-toggleAllRows=\"toggleAllRows\"\n >\n <input\n type=\"checkbox\"\n [checked]=\"allRowsSelected()\"\n [indeterminate]=\"someRowsSelected()\"\n (change)=\"toggleAllRows()\"\n />\n </ng-template>\n </ng-container>\n <ng-container libColumn=\"name\">\n <ng-template #cell let-row=\"row\" let-value>\n {{ value.Name }}\n </ng-template>\n <ng-template\n #cellEdit\n let-row=\"row\"\n let-updateValue=\"updateValue\"\n let-value\n >\n <verbena-input\n inputContainerClass=\"w-fit\"\n [(ngModel)]=\"row.Name\"\n ></verbena-input>\n </ng-template>\n </ng-container>\n <ng-container libColumn=\"propertyName\">\n <ng-template #cell let-row=\"row\" let-value>\n {{ row.PropertyName }}\n </ng-template>\n <ng-template\n #cellEdit\n let-row=\"row\"\n let-updateValue=\"updateValue\"\n let-value\n >\n <verbena-input\n (keydown)=\"onKeyDown($event, row)\"\n (paste)=\"onPaste($event, row)\"\n (input)=\"onInput($event, row)\"\n inputContainerClass=\"w-fit\"\n [(ngModel)]=\"row.PropertyName\"\n ></verbena-input>\n </ng-template>\n </ng-container>\n <ng-container libColumn=\"minValue\">\n <ng-template #cell let-row=\"row\" let-value>\n {{ value }}\n </ng-template>\n <ng-template\n #cellEdit\n let-row=\"row\"\n let-updateValue=\"updateValue\"\n let-value\n >\n <verbena-input\n [type]=\"'number'\"\n [ngModel]=\"getStringValue(row, 'MinValue')\"\n (valueChange)=\"convertToInt($event, row, 'MinValue')\"\n inputContainerClass=\"w-[130px]\"\n ></verbena-input>\n </ng-template>\n </ng-container>\n <ng-container libColumn=\"maxValue\">\n <ng-template #cell let-row=\"row\" let-value>\n {{ value }}\n </ng-template>\n <ng-template\n #cellEdit\n let-row=\"row\"\n let-updateValue=\"updateValue\"\n let-value\n >\n <verbena-input\n [type]=\"'number'\"\n inputContainerClass=\"w-[130px]\"\n [ngModel]=\"getStringValue(row, 'MaxValue')\"\n (valueChange)=\"convertToInt($event, row, 'MaxValue')\"\n ></verbena-input>\n </ng-template>\n </ng-container>\n <ng-container libColumn=\"defaultValue\">\n <ng-template #cell let-row=\"row\" let-value>\n {{ value }}\n </ng-template>\n <ng-template\n #cellEdit\n let-row=\"row\"\n let-updateValue=\"updateValue\"\n let-value\n >\n <verbena-input\n [type]=\"'text'\"\n inputContainerClass=\"w-[130px]\"\n [(ngModel)]=\"row.DefaultValue\"\n ></verbena-input>\n </ng-template>\n </ng-container>\n <ng-container libColumn=\"dataType\">\n <ng-template #cell let-row=\"row\" let-value>\n {{ value }}\n </ng-template>\n <ng-template\n #cellEdit\n let-row=\"row\"\n let-updateValue=\"updateValue\"\n let-value\n >\n <div class=\"flex flex-col gap-1\">\n <verben-drop-down\n width=\"100%\"\n placeholder=\"Change Data Type\"\n [(options)]=\"dataType\"\n [(ngModel)]=\"row.DataType\"\n >\n </verben-drop-down>\n </div>\n </ng-template>\n </ng-container>\n\n <ng-container libColumn=\"isRequired\">\n <ng-template #cell let-row=\"row\" let-value>\n <verben-svg *ngIf=\"value === true\" [icon]=\"'check'\"></verben-svg>\n <verben-svg *ngIf=\"value === false\" [icon]=\"'error'\"></verben-svg>\n </ng-template>\n <ng-template\n #cellEdit\n let-row=\"row\"\n let-updateValue=\"updateValue\"\n let-value\n >\n <verbena-switch\n [onColor]=\"'var(--vbn-color-text)'\"\n [(ngModel)]=\"row.IsRequired\"\n ></verbena-switch>\n </ng-template>\n </ng-container>\n\n <ng-container libColumn=\"isReadOnly\">\n <ng-template #cell let-row=\"row\" let-value>\n <verben-svg *ngIf=\"value === true\" [icon]=\"'check'\"></verben-svg>\n <verben-svg *ngIf=\"value === false\" [icon]=\"'error'\"></verben-svg>\n </ng-template>\n <ng-template\n #cellEdit\n let-row=\"row\"\n let-updateValue=\"updateValue\"\n let-value\n >\n <verbena-switch\n [onColor]=\"'var(--vbn-color-text)'\"\n [(ngModel)]=\"row.IsReadOnly\"\n ></verbena-switch>\n </ng-template>\n </ng-container>\n\n <ng-container libColumn=\"actions\">\n <ng-template\n #cell\n let-isEditing=\"isEditing\"\n let-toggleRowEdit=\"toggleRowEdit\"\n let-row=\"row\"\n let-value\n >\n <verben-pop-Up\n [customStyles]=\"{ 'z-index': '99' }\"\n [dropdownOpen]=\"openDropdownId === row.id\"\n [enableMouseLeave]=\"false\"\n (close)=\"onClose()\"\n >\n <verben-svg\n class=\"cursor-pointer actions-icon\"\n (click)=\"openDropdown(row)\"\n dropdown-trigger\n icon=\"list\"\n ></verben-svg>\n <div\n class=\"pop-up-content flex flex-col\"\n *ngIf=\"openDropdownId === row.Id\"\n dropdown-content\n >\n <div\n (click)=\"toggleRowEdit()\"\n class=\"pop-up-value cursor-pointer\"\n >\n Edit\n </div>\n <div\n (click)=\"deleteProperty(row.Id)\"\n class=\"pop-up-value cursor-pointer\"\n >\n Delete\n </div>\n </div>\n </verben-pop-Up>\n </ng-template>\n <ng-template\n #cellEdit\n let-isEditing=\"isEditing\"\n let-toggleRowEdit=\"toggleRowEdit\"\n let-row=\"row\"\n let-value\n >\n <div class=\"flex gap-2 items-center\">\n <verben-svg\n icon=\"check\"\n [width]=\"15\"\n [height]=\"15\"\n (click)=\"saveViaTable(row, toggleRowEdit)\"\n ></verben-svg>\n <verben-svg\n (click)=\"toggleRowEdit(); deleteProperty(row.Id)\"\n icon=\"delete\"\n [width]=\"15\"\n [height]=\"15\"\n ></verben-svg>\n <verben-svg\n icon=\"cardViewAlt\"\n [width]=\"15\"\n [height]=\"15\"\n (click)=\"goToCardView(value)\"\n ></verben-svg>\n </div>\n </ng-template>\n </ng-container>\n </lib-data-table>\n </div>\n <div card-content>\n <verben-card-data-view\n borderRadius=\"12px\"\n #vdcv\n dataId=\"Id\"\n border=\"5px\"\n [cardDataList]=\"cardData\"\n rbgColor=\"var(--vbn-color-surface-alt)\"\n mg=\"0px\"\n >\n <verben-left-card-data-view class=\"space-y-7\">\n <verben-left-card-data\n #vlcd\n [parent]=\"vdcv\"\n dataId=\"id\"\n class=\"bg-secondary-100 rounded-xl border-primary border-[1px]\"\n [cardDataList]=\"cardData\"\n >\n <ng-template #card let-item>\n <div\n (click)=\"userCardClicked(item)\"\n class=\"flex cursor-pointer h-[max-content]\"\n >\n <!-- <verben-svg [width]=\"15\" [height]=\"15\" (click)=\"toggleChildren(item); $event.stopPropagation()\"\n [ngClass]=\"item.children && item.children.length?'visible':'invisible'\"\n class=\"items-center flex pr-1 cursor-pointer\" [icon]=\"item.isChildrenExpanded?'minus':'plus'\" /> -->\n <div class=\"flex w-full bg-secondary rounded-xl\">\n <div\n class=\"w-3 rounded-xl rounded-tr-none rounded-br-none\"\n [ngClass]=\"\n item.selected ? 'bg-primary' : 'bg-secondary-200'\n \"\n ></div>\n <div class=\"py-3 px-4 flex-1 h-[100%]\">\n <div\n class=\"flex items-start flex-1 gap-1 justify-between h-[100%]\"\n >\n <div\n class=\"flex flex-col flex-1 card-min-height justify-between h-[100%]\"\n >\n <div class=\"flex justify-between mr-4\">\n <div>\n <h3\n class=\"my-0 font-bold text-[var(--vbn-color-on-primary)] leading-[19.5px]\"\n >\n {{ item.data.Name }}\n </h3>\n <span class=\"flex items-center gap-1 mt-2\">\n <span class=\"!text-[10px] text-[var(--vbn-color-on-primary)]\"\n >Data Type:</span\n >\n <span class=\"!text-[13px] font-bold\">{{\n item.data.DataType\n }}</span>\n </span>\n </div>\n\n <div>\n <!-- <span class=\"!text-[10px] text-[var(--vbn-color-on-primary)]\"\n >Default Value:</span\n >\n <p class=\"!text-[12px]\">\n {{ item.data.DefaultValue }}\n </p> -->\n </div>\n </div>\n </div>\n\n <!-- <div class=\"flex items-end h-[100%]\">\n <span class=\"enum-val {{item.data.Status}}\">{{item.data.Status}}</span>\n </div> -->\n </div>\n </div>\n </div>\n </div>\n </ng-template>\n </verben-left-card-data>\n </verben-left-card-data-view>\n <verben-right-card-data-view>\n <ng-template #parent>\n <div\n *ngIf=\"currentData\"\n class=\"flex flex-col rounded-xl h-full w-full relative gap-6\"\n >\n <verbena-input\n name=\"Name\"\n label=\"Name\"\n [(ngModel)]=\"currentData.data.Name\"\n />\n <verbena-input\n name=\"Name\"\n label=\"Property Name\"\n (keydown)=\"onKeyDown($event, currentData.data)\"\n (paste)=\"onPaste($event, currentData.data)\"\n (input)=\"onInput($event, currentData.data)\"\n [(ngModel)]=\"currentData.data.PropertyName\"\n />\n <div class=\"flex flex-col gap-1\">\n <div>Data Type</div>\n <verben-drop-down\n width=\"100%\"\n placeholder=\"Change Data Type\"\n [(options)]=\"dataType\"\n [(ngModel)]=\"currentData.data.DataType\"\n (ngModelChange)=\"onDropDownChange($event)\"\n >\n </verben-drop-down>\n </div>\n\n <div\n *ngIf=\"\n currentData.data.DataType === 'SingleSelection' ||\n currentData.data.DataType === 'MultiSelection'\n \"\n >\n <p class=\"mb-2\">Enter Options</p>\n <verben-chip\n [placeholder]=\"'Enter Options'\"\n [(ngModel)]=\"chipArray\"\n (onChange)=\"onChipChange($event)\"\n ></verben-chip>\n </div>\n <div>\n <verbena-input\n [placeHolder]=\"'Enter default text'\"\n [(ngModel)]=\"currentData.data.DefaultValue\"\n name=\"DefaultValue\"\n label=\"Default Value (optional)\"\n />\n </div>\n <div>\n <p class=\"mb-2\">Required</p>\n\n <verbena-switch\n [onColor]=\"'var(--vbn-color-text)'\"\n [(ngModel)]=\"currentData.data.IsRequired\"\n ></verbena-switch>\n </div>\n <div>\n <p class=\"mb-2\">Read Only</p>\n\n <verbena-switch\n [onColor]=\"'var(--vbn-color-text)'\"\n [(ngModel)]=\"currentData.data.IsReadOnly\"\n ></verbena-switch>\n </div>\n <div\n *ngIf=\"\n currentData.data.DataType === 'Number' ||\n currentData.data.DataType === 'Text'\n \"\n class=\"flex flex-col gap-6\"\n >\n <verbena-input\n [type]=\"'number'\"\n name=\"minValue\"\n label=\"Min Value\"\n [ngModel]=\"getStringValue(currentData.data, 'MinValue')\"\n (valueChange)=\"\n convertToInt($event, currentData.data, 'MinValue')\n \"\n />\n <verbena-input\n [type]=\"'number'\"\n name=\"maxValue\"\n label=\"Max Value\"\n (ngModelChange)=\"updateTable()\"\n [ngModel]=\"getStringValue(currentData.data, 'MaxValue')\"\n (valueChange)=\"\n convertToInt($event, currentData.data, 'MaxValue')\n \"\n />\n </div>\n <!-- buttons -->\n <div class=\"flex justify-between w-full bottom-8 left-0 right-0\">\n <verbena-button\n (click)=\"deleteProperty(currentData.data.Id)\"\n class=\"verben-delete-button\"\n text=\"Delete\"\n ></verbena-button>\n <div class=\"flex gap-3\">\n <verbena-button\n class=\"verben-switch-button\"\n (click)=\"goToTableView()\"\n text=\"Switch To Table\"\n ></verbena-button>\n <!-- <verbena-button class=\"verben-primary-button\" (click)=\"saveUser()\" text=\"Save\"></verbena-button> -->\n </div>\n </div>\n </div>\n </ng-template>\n </verben-right-card-data-view>\n <!-- <verben-right-card-data-view>\n yeshhhhhh\n </verben-right-card-data-view> -->\n\n <verben-card-data-view-footer>\n <div class=\"flex gap-2 justify-between\">\n <div\n *ngIf=\"!vdcv.hasCurrentItem()\"\n class=\"message-log-button-container flex justify-between\"\n >\n <verbena-button\n [fontWeight]=\"'bold'\"\n [bgColor]=\"'var(--vbn-color-text-muted)'\"\n [borderRadius]=\"'4px'\"\n [textColor]=\"'var(--vbn-color-surface)'\"\n [text]=\"'Delete'\"\n >\n </verbena-button>\n </div>\n <div\n class=\"flex {{\n vdcv.hasCurrentItem() ? 'flex-1' : ''\n }} justify-end items-center gap-5\"\n >\n <span class=\"paginator-text\"\n >{{ cardData.length }} records loaded</span\n >\n </div>\n </div>\n </verben-card-data-view-footer>\n </verben-card-data-view>\n </div>\n <div column-content>\n <verben-visible-column\n (resetFilter)=\"getProperties(Id, showColumn)\"\n (columnsUpdated)=\"onColumnsUpdated($event)\"\n [border]=\"'1px solid var(--vbn-color-primary)'\"\n borderRadius=\"10px\"\n boxShadow=\"2px 2px 2px 0px silver\"\n bgColor=\"white\"\n width=\"400px\"\n textColor=\"black\"\n pd=\"1rem\"\n primaryColor=\"var(--vbn-color-primary)\"\n secondaryColor=\"var(--vbn-color-border-focus)\"\n [columns]=\"visibleColumns\"\n [displayedColumns]=\"5\"\n ></verben-visible-column>\n </div>\n <div filter-content>\n <verben-table-filter\n (resetSortData)=\"getProperties(Id, showFilter)\"\n (filtersApplied)=\"onFilterApplied($event)\"\n [border]=\"'1px solid var(--vbn-color-primary)'\"\n borderRadius=\"10px\"\n boxShadow=\"2px 2px 2px 0px silver\"\n bgColor=\"white\"\n width=\"420px\"\n textColor=\"black\"\n pd=\"1rem\"\n primaryColor=\"var(--vbn-color-primary)\"\n secondaryColor=\"var(--vbn-color-border-focus)\"\n tertiaryColor=\"var(--vbn-color-on-primary)\"\n [filterOptions]=\"filterArray\"\n [maxFilterLength]=\"3\"\n ></verben-table-filter>\n </div>\n <div sort-content>\n <verben-sort-table\n (resetSortData)=\"getProperties(Id, showSort)\"\n (selectedOptions)=\"onSortUpdated($event)\"\n [border]=\"'1px solid var(--vbn-color-primary)'\"\n borderRadius=\"10px\"\n boxShadow=\"2px 2px 2px 0px silver\"\n bgColor=\"white\"\n width=\"400px\"\n textColor=\"black\"\n pd=\"1rem\"\n primaryColor=\"var(--vbn-color-primary)\"\n secondaryColor=\"var(--vbn-color-border-focus)\"\n tertiaryColor=\"var(--vbn-color-on-primary)\"\n [enableDragAndDrop]=\"true\"\n [sortOptions]=\"sortOptions\"\n ></verben-sort-table>\n </div>\n <div export-content>\n <lib-data-export\n [data]=\"data[0].Properties\"\n (exportDataEvent)=\"handleExport($event)\"\n >\n </lib-data-export>\n </div>\n </verben-data-view>\n <div *ngIf=\"vdv.isTableView\" class=\"flex gap-2 justify-between\">\n <div class=\"message-log-button-container flex justify-between\">\n <verbena-button\n [fontWeight]=\"'bold'\"\n [bgColor]=\"'var(--vbn-color-text-muted)'\"\n [borderRadius]=\"'4px'\"\n [textColor]=\"'var(--vbn-color-surface)'\"\n [text]=\"'Delete'\"\n >\n </verbena-button>\n </div>\n <div class=\"flex justify-end items-center gap-5\">\n <span class=\"paginator-text\">{{ cardData.length }} records loaded</span>\n <button (click)=\"loadMore()\" class=\"load-more view-links\">\n Load more\n </button>\n </div>\n </div>\n</div>\n<!-- <div class=\"w-[400px] bg-white p-4 shadow-lg border\">\n <form-control [dataType]=\"dataType2\" [formProperties]=\"data[0].Properties\"></form-control>\n</div> -->\n", styles: [".view-links{font-size:14px!important;color:var(--vbn-color-border-focus);font-weight:600;cursor:pointer}.view-links:hover{text-decoration:underline;text-underline-offset:3px}.context-banner{background-color:#d4a00773}.card-min-height{gap:10px}::ng-deep .childrenPadding{max-height:300px;overflow-y:auto}::ng-deep .toolbar{margin-bottom:15px}::ng-deep .master-only-container{margin:0!important;padding:0!important}::ng-deep .master-detail-container{margin:0!important;padding:0!important}.pop-up-content{border-radius:4px;background-color:var(--vbn-color-surface);border:1px solid rgba(212,161,7,.5)}.pop-up-value{padding:10px 20px}.pop-up-content>div:nth-child(1){border-bottom:4px solid var(--vbn-color-primary)}.enum-val{padding:2px 10px;width:100%;min-width:max-content;text-align:center}.enum-val.Active{background-color:var(--vbn-color-success-bg);color:var(--vbn-color-success)}.enum-val.InActive{background-color:#ffdfdf;color:var(--vbn-color-error)}.toggle-container{width:53px;padding:1px;color:var(--vbn-color-surface);height:22px;position:relative;background-color:var(--vbn-color-text);border-radius:2rem;cursor:pointer}.toggle-circle{width:50%;height:100%;position:absolute;left:0;padding:5px;top:0;background-color:var(--vbn-color-surface);border-radius:50%;transform:scale(1);transition:transform .3s}.translate-100{transform:translate(100%)}.translate-0{transform:translate(0)}.toggle-text-on{display:block;font-size:12px;margin-left:4px}.toggle-text-off{display:block;font-size:12px;margin-right:4px;text-align:right}\n"] }]
918
918
  }], ctorParameters: () => [{ type: i1.UtilService }, { type: i1.HttpWebRequestService }, { type: i0.ChangeDetectorRef }, { type: i2.FormBuilder }, { type: i1.EnvironmentService }, { type: i3.Router }, { type: i3.ActivatedRoute }, { type: i4.FormsFieldService }, { type: i5.Location }, { type: i0.ElementRef }, { type: i0.Renderer2 }], propDecorators: { path: [{
919
919
  type: Input
920
920
  }], fileInput: [{
@@ -938,4 +938,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
938
938
  }], onViewProcessClicked: [{
939
939
  type: Output
940
940
  }] } });
941
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZm9ybS1maWVsZHMuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvdmVyYmVuLXdvcmtmbG93LXVpL3NyYy9saWIvY29tcG9uZW50cy9mb3JtLWdyb3VwL2Zvcm0tZmllbGRzL2Zvcm0tZmllbGRzLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3ZlcmJlbi13b3JrZmxvdy11aS9zcmMvbGliL2NvbXBvbmVudHMvZm9ybS1ncm91cC9mb3JtLWZpZWxkcy9mb3JtLWZpZWxkcy5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFDQSxPQUFPLEVBRUwsU0FBUyxFQUVULFlBQVksRUFDWixLQUFLLEVBRUwsTUFBTSxFQUVOLFNBQVMsR0FDVixNQUFNLGVBQWUsQ0FBQztBQUd2QixPQUFPLEVBQUUsWUFBWSxFQUFFLE9BQU8sRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUM3QyxPQUFPLEVBS0wsa0JBQWtCLEVBQ2xCLGNBQWMsRUFLZixNQUFNLGNBQWMsQ0FBQztBQUN0QixPQUFPLEVBQUUsUUFBUSxFQUFFLGFBQWEsRUFBNEIsV0FBVyxFQUFlLGNBQWMsRUFBRSxrQkFBa0IsRUFBdUIsdUJBQXVCLEVBQUUsTUFBTSxFQUFFLE1BQU0sbUNBQW1DLENBQUM7QUFFMU4sT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLHFCQUFxQixDQUFDOzs7Ozs7OztBQUdoRCxJQUFLLG9CQVNKO0FBVEQsV0FBSyxvQkFBb0I7SUFDdkIscUNBQWEsQ0FBQTtJQUNiLHFDQUFhLENBQUE7SUFDYixxQ0FBYSxDQUFBO0lBQ2IsMkNBQW1CLENBQUE7SUFDbkIsbURBQTJCLENBQUE7SUFDM0IseUNBQWlCLENBQUE7SUFDakIsdUNBQWUsQ0FBQTtJQUNmLHlDQUFpQixDQUFBO0FBQ25CLENBQUMsRUFUSSxvQkFBb0IsS0FBcEIsb0JBQW9CLFFBU3hCO0FB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a0JBQWtCO3NCQUExQixLQUFLO2dCQUNJLG9CQUFvQjtzQkFBN0IsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IExvY2F0aW9uIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7XG4gIENoYW5nZURldGVjdG9yUmVmLFxuICBDb21wb25lbnQsXG4gIEVsZW1lbnRSZWYsXG4gIEV2ZW50RW1pdHRlcixcbiAgSW5wdXQsXG4gIE9uSW5pdCxcbiAgT3V0cHV0LFxuICBSZW5kZXJlcjIsXG4gIFZpZXdDaGlsZCxcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBGb3JtQnVpbGRlciB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7IEFjdGl2YXRlZFJvdXRlLCBSb3V0ZXIgfSBmcm9tICdAYW5ndWxhci9yb3V0ZXInO1xuaW1wb3J0IHsgZGVib3VuY2VUaW1lLCBTdWJqZWN0IH0gZnJvbSAncnhqcyc7XG5pbXBvcnQge1xuICBDYXJkRGF0YSxcbiAgQ2FyZERhdGFWaWV3Q29tcG9uZW50LFxuICBDaGlwQ2hhbmdlRXZlbnQsXG4gIENvbHVtbkRlZmluaXRpb24sXG4gIENvbmRpdGlvbmFsT3B0aW9ucyxcbiAgRGF0YUZpbHRlclR5cGUsXG4gIERhdGFUYWJsZUNvbXBvbmVudCxcbiAgRGF0YVZpZXdDb21wb25lbnQsXG4gIERyb3Bkb3duQ2hhbmdlRXZlbnQsXG4gIElEYXRhRmlsdGVyXG59IGZyb20gJ3ZlcmJlbi1uZy11aSc7XG5pbXBvcnQgeyBEYXRhVHlwZSwgRXJyb3JSZXNwb25zZSwgRm9ybUVudGl0eSwgRm9ybVByb3BlcnR5LCBPYmplY3RTdGF0ZSwgUGFnZWRSZXN1bHQsIFNlYXJjaE9wZXJhdG9yLCBTZWFyY2hQcm9wZXJ0eVNpZ24sIFNlYXJjaFByb3BlcnR5VmFsdWUsIFNlYXJjaFByb3BlcnR5VmFsdWVUeXBlLCBTdGF0dXMgfSBmcm9tICd2ZXJiZW4td29ya2Zsb3ctdWkvc3JjL2xpYi9tb2RlbHMnO1xuaW1wb3J0IHsgRW52aXJvbm1lbnRTZXJ2aWNlLCBIdHRwV2ViUmVxdWVzdFNlcnZpY2UsIFV0aWxTZXJ2aWNlIH0gZnJvbSAndmVyYmVuLXdvcmtmbG93LXVpL3NyYy9saWIvc2VydmljZXMnO1xuaW1wb3J0IHsgYmFzZVN0eWxlIH0gZnJvbSAnLi4vYmFzZS10YWJsZS1zdHlsZSc7XG5pbXBvcnQgeyBGb3Jtc0ZpZWxkU2VydmljZSB9IGZyb20gJy4vZm9ybS1maWVsZHMuc2VydmljZSc7XG5cbmVudW0gVGFza1VzZXJQcm9wZXJ0eU5hbWUge1xuICBVc2VyID0gJ1VzZXInLFxuICBEYXRlID0gJ0RhdGUnLFxuICBSb2xlID0gJ1JvbGUnLFxuICBTZXJ2aWNlID0gJ1NlcnZpY2UnLFxuICBBcHBsaWNhdGlvbiA9ICdBcHBsaWNhdGlvbicsXG4gIFRlbmFudCA9ICdUZW5hbnQnLFxuICBFbWFpbCA9ICdFbWFpbCcsXG4gIFN0YXR1cyA9ICdTdGF0dXMnLFxufVxuZW51bSBUYXNrVXNlclByb3BlcnR5TWFwIHtcbiAgVXNlciA9ICdOYW1lJyxcbiAgRGF0ZSA9ICdDcmVhdGVkQXQnLFxuICBSb2xlID0gJ1JvbGVJRCcsXG4gIFNlcnZpY2UgPSAnU2VydmljZU5hbWUnLFxuICBBcHBsaWNhdGlvbiA9ICdBcHBsaWNhdGlvbicsXG4gIFRlbmFudCA9ICdUZW5hbnRJZCcsXG4gIEVtYWlsID0gJ01haWxBZGRyZXNzJyxcbiAgU3RhdHVzID0gJ1N0YXR1cycsXG59XG5cbmVudW0gRmlsdGVyVHlwZXMge1xuICBCZWZvcmUgPSBTZWFyY2hQcm9wZXJ0eVNpZ24uTFQsXG4gIE9uID0gU2VhcmNoUHJvcGVydHlTaWduLkVRLFxuICBBZnRlciA9IFNlYXJjaFByb3BlcnR5U2lnbi5HVCxcbiAgTkVRID0gU2VhcmNoUHJvcGVydHlTaWduLk5FUSxcbn1cblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnbGliLWZvcm0tZmllbGRzJyxcbiAgdGVtcGxhdGVVcmw6ICcuL2Zvcm0tZmllbGRzLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmw6ICcuL2Zvcm0tZmllbGRzLmNvbXBvbmVudC5jc3MnLFxufSlcbmV4cG9ydCBjbGFzcyBGb3JtRmllbGRzQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0IHtcbiAgdmlzaWJsZUNvbHVtbkRlZjogQ29sdW1uRGVmaW5pdGlvbjxGb3JtUHJvcGVydHk+W10gPSBbXTtcbiAgc3R5bGVzID0gYmFzZVN0eWxlO1xuICBkYXRhOiBGb3JtRW50aXR5W10gPSBbXTtcbiAgaGlkZU1pbk1heDogYm9vbGVhbiA9IHRydWU7XG4gIEBJbnB1dCgpIHBhdGg6IHN0cmluZyA9ICcvZG9jdW1lbnRhdGlvbi93b3JrZmxvdy1mb3Jtcy9maWVsZHMnO1xuICBjYXJkRGF0YTogQ2FyZERhdGFbXSA9IFtdO1xuICBxdWVyeVBhcmFtczogYW55ID0ge307XG4gIHNob3dTb3J0OiBib29sZWFuID0gZmFsc2U7XG4gIHNob3dDb2x1bW46IGJvb2xlYW4gPSBmYWxzZTtcbiAgY3VycmVudERhdGE6IENhcmREYXRhIHwgbnVsbCA9IG51bGw7XG4gIEBWaWV3Q2hpbGQoJ2ZpbGVJbnB1dCcsIHsgc3RhdGljOiB0cnVlIH0pIGZpbGVJbnB1dCE6IEVsZW1lbnRSZWY7XG4gIEBWaWV3Q2hpbGQoJ3ZkY3YnKSBjYXJkRGF0YVZpZXchOiBDYXJkRGF0YVZpZXdDb21wb25lbnQ7XG4gIEBWaWV3Q2hpbGQoJ3ZkdicpIGRhdGFWaWV3ITogRGF0YVZpZXdDb21wb25lbnQ7XG4gIEBWaWV3Q2hpbGQoJ2R0JykgdGFibGVWaWV3ITogRGF0YVRhYmxlQ29tcG9uZW50PEZvcm1FbnRpdHk+O1xuICBASW5wdXQoKSBhcHBsaWNhdGlvbjogc3RyaW5nIHwgbnVsbCA9IG51bGw7XG4gIEBJbnB1dCgpIHBhZ2VTaXplOiBudW1iZXIgPSAxMDtcbiAgQElucHV0KCkgc2VhcmNoRGVib3VuY2VUaW1lOiBudW1iZXIgPSA1MDA7XG4gIEBPdXRwdXQoKSBvblZpZXdQcm9jZXNzQ2xpY2tlZDogRXZlbnRFbWl0dGVyPHN0cmluZz4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG4gIGN1cnJlbnRFeHBhbmRlZENhcmQ6IENhcmREYXRhIHwgbnVsbCA9IG51bGw7XG4gIHBhZ2VTdGF0ZTogUGFnZWRSZXN1bHQ8Rm9ybUVudGl0eT4gfCBudWxsID0gbnVsbDtcbiAgaXNPcGVuOiBib29sZWFuID0gZmFsc2U7XG4gIG9wZW5Ecm9wZG93bklkOiBzdHJpbmcgfCBudWxsIHwgbnVtYmVyID0gbnVsbDtcbiAgY3VycmVudEZpbHRlcnM6IElEYXRhRmlsdGVyW10gPSBbXTtcbiAgY3VycmVudFNvcnRzOiBJRGF0YUZpbHRlcltdID0gW107XG4gIHNlbGVjdGVkRmlsdGVyVGFibGVDb3VudDogbnVtYmVyID0gMDtcbiAgc2VsZWN0ZWRTb3J0VGFibGVDb3VudDogbnVtYmVyID0gMDtcbiAgc2VsZWN0ZWRDb2x1bW5UYWJsZUNvdW50OiBudW1iZXIgPSAwO1xuICBzaG93RmlsdGVyOiBib29sZWFuID0gZmFsc2U7XG4gIGZvcm1OYW1lOiBzdHJpbmcgPSAnJztcbiAgc2VhcmNoVGVybSQgPSBuZXcgU3ViamVjdDxzdHJpbmc+KCk7XG4gIHByb3BlcnRpZXM6IEZvcm1Qcm9wZXJ0eVtdID0gW107XG4gIHNlYXJjaFRlcm06IHN0cmluZyA9ICcnO1xuICBza2lwID0gMDtcbiAgY2hpcEFycmF5OiBzdHJpbmdbXSA9IFtdO1xuICBJZDogc3RyaW5nID0gJyc7XG4gIGNoaXBzOiBhbnk7XG4gIHN0YXR1c09wdGlvbnM6IFN0YXR1c1tdID0gT2JqZWN0LnZhbHVlcyhTdGF0dXMpO1xuICBkYXRhVHlwZTogRGF0YVR5cGVbXSA9IE9iamVjdC52YWx1ZXMoRGF0YVR5cGUpO1xuICBkYXRhVHlwZTI6IERhdGFUeXBlID0gRGF0YVR5cGUuVGV4dDtcbiAgdXNlcnM6IEZvcm1FbnRpdHlbXSA9IFtdO1xuXG4gIHZpc2libGVDb2x1bW5zOiBJRGF0YUZpbHRlcltdID0gW107XG5cbiAgZmlsdGVyQXJyYXk6IElEYXRhRmlsdGVyW10gPSBbXG4gICAge1xuICAgICAgbmFtZTogJ05hbWUnLFxuICAgICAgdHlwZTogRGF0YUZpbHRlclR5cGUuU3RyaW5nLFxuICAgICAgY2hlY2tlZDogZmFsc2UsXG4gICAgfSxcbiAgICB7XG4gICAgICBuYW1lOiAnRGF0YVR5cGUnLFxuICAgICAgdHlwZTogRGF0YUZpbHRlclR5cGUuU3RyaW5nLFxuICAgICAgY2hlY2tlZDogZmFsc2UsXG4gICAgfSxcbiAgICB7XG4gICAgICBuYW1lOiAnRGVmYXVsdFZhbHVlJyxcbiAgICAgIHR5cGU6IERhdGFGaWx0ZXJUeXBlLlN0cmluZyxcbiAgICAgIGNoZWNrZWQ6IGZhbHNlLFxuICAgIH0sXG5cbiAgICB7XG4gICAgICBuYW1lOiAnVmFsdWUnLFxuICAgICAgdHlwZTogRGF0YUZpbHRlclR5cGUuU3RyaW5nLFxuICAgICAgY2hlY2tlZDogZmFsc2UsXG4gICAgfSxcbiAgICB7XG4gICAgICBuYW1lOiAnTWF4VmFsdWUnLFxuICAgICAgdHlwZTogRGF0YUZpbHRlclR5cGUuTnVtYmVyLFxuICAgICAgY2hlY2tlZDogZmFsc2UsXG4gICAgfSxcbiAgICB7XG4gICAgICBuYW1lOiAnTWluVmFsdWUnLFxuICAgICAgdHlwZTogRGF0YUZpbHRlclR5cGUuU3RyaW5nLFxuICAgICAgY2hlY2tlZDogZmFsc2UsXG4gICAgfSxcbiAgICB7XG4gICAgICBuYW1lOiAnSXNSZXF1aXJlZCcsXG4gICAgICB0eXBlOiBEYXRhRmlsdGVyVHlwZS5Cb29sLFxuICAgICAgY2hlY2tlZDogZmFsc2UsXG4gICAgfSxcbiAgXTtcblxuICBzb3J0T3B0aW9uczogSURhdGFGaWx0ZXJbXSA9IFtcbiAgICB7XG4gICAgICBuYW1lOiAnTmFtZScsXG4gICAgICB0eXBlOiBEYXRhRmlsdGVyVHlwZS5TdHJpbmcsXG4gICAgICBjaGVja2VkOiBmYWxzZSxcbiAgICB9LFxuICAgIHtcbiAgICAgIG5hbWU6ICdEYXRhVHlwZScsXG4gICAgICB0eXBlOiBEYXRhRmlsdGVyVHlwZS5TdHJpbmcsXG4gICAgICBjaGVja2VkOiBmYWxzZSxcbiAgICB9LFxuICAgIHtcbiAgICAgIG5hbWU6ICdEZWZhdWx0VmFsdWUnLFxuICAgICAgdHlwZTogRGF0YUZpbHRlclR5cGUuU3RyaW5nLFxuICAgICAgY2hlY2tlZDogZmFsc2UsXG4gICAgfSxcblxuICAgIHtcbiAgICAgIG5hbWU6ICdWYWx1ZScsXG4gICAgICB0eXBlOiBEYXRhRmlsdGVyVHlwZS5TdHJpbmcsXG4gICAgICBjaGVja2VkOiBmYWxzZSxcbiAgICB9LFxuICAgIHtcbiAgICAgIG5hbWU6ICdNYXhWYWx1ZScsXG4gICAgICB0eXBlOiBEYXRhRmlsdGVyVHlwZS5OdW1iZXIsXG4gICAgICBjaGVja2VkOiBmYWxzZSxcbiAgICB9LFxuICAgIHtcbiAgICAgIG5hbWU6ICdNaW5WYWx1ZScsXG4gICAgICB0eXBlOiBEYXRhRmlsdGVyVHlwZS5TdHJpbmcsXG4gICAgICBjaGVja2VkOiBmYWxzZSxcbiAgICB9LFxuICAgIHtcbiAgICAgIG5hbWU6ICdJc1JlcXVpcmVkJyxcbiAgICAgIHR5cGU6IERhdGFGaWx0ZXJUeXBlLkJvb2wsXG4gICAgICBjaGVja2VkOiBmYWxzZSxcbiAgICB9LFxuICBdO1xuXG4gIHByaXZhdGUgY3VycmVudFNlYXJjaFRlcm06IHN0cmluZyA9ICcnO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgdXRpbFNlcnZpY2U6IFV0aWxTZXJ2aWNlLFxuICAgIHByaXZhdGUgc2VydmVyOiBIdHRwV2ViUmVxdWVzdFNlcnZpY2UsXG4gICAgcHJpdmF0ZSBjZHI6IENoYW5nZURldGVjdG9yUmVmLFxuICAgIHByaXZhdGUgZmI6IEZvcm1CdWlsZGVyLFxuICAgIHByaXZhdGUgZW52U3ZjOiBFbnZpcm9ubWVudFNlcnZpY2UsXG4gICAgcHJpdmF0ZSByb3V0ZXI6IFJvdXRlcixcbiAgICBwcml2YXRlIHJvdXRlOiBBY3RpdmF0ZWRSb3V0ZSxcbiAgICBwcml2YXRlIHRhc2tVc2Vyc1N2YzogRm9ybXNGaWVsZFNlcnZpY2UsXG4gICAgcHJpdmF0ZSBfbG9jYXRpb246IExvY2F0aW9uLFxuICAgIHByaXZhdGUgZWxSZWY6IEVsZW1lbnRSZWYsXG4gICAgcHJpdmF0ZSByZW5kZXJlcjogUmVuZGVyZXIyLFxuICApIHtcbiAgICB0aGlzLnZpc2libGVDb2x1bW5EZWYgPSB0YXNrVXNlcnNTdmMuZm9ybUZpZWxkQ29sdW1ucztcbiAgICB0aGlzLnZpc2libGVDb2x1bW5zID0gdGFza1VzZXJzU3ZjLmZvcm1GaWVsZENvbHVtbnMubWFwKChjb2wpID0+ICh7XG4gICAgICBjaGVja2VkOiB0cnVlLFxuICAgICAgbmFtZTogdHlwZW9mIGNvbC5oZWFkZXIgPT09ICdzdHJpbmcnID8gY29sLmhlYWRlciA6IGNvbC5pZCxcbiAgICAgIHR5cGU6IERhdGFGaWx0ZXJUeXBlLkJvb2wsXG4gICAgfSkpO1xuICB9XG4gIGFzeW5jIG5nT25Jbml0KCk6IFByb21pc2U8dm9pZD4ge1xuICAgIHRoaXMuc2VhcmNoVGVybSRcbiAgICAgIC5waXBlKGRlYm91bmNlVGltZSh0aGlzLnNlYXJjaERlYm91bmNlVGltZSkpIC8vIEFkanVzdCBkZWJvdW5jZSB0aW1lIGhlcmUgKGluIG1zKVxuICAgICAgLnN1YnNjcmliZShhc3luYyAoc2VhcmNoVGVybSkgPT4ge1xuICAgICAgICB0aGlzLmN1cnJlbnRTZWFyY2hUZXJtID0gc2VhcmNoVGVybTtcbiAgICAgICAgdGhpcy51cGRhdGVGaWx0ZXJzQW5kU29ydHModHJ1ZSk7XG4gICAgICB9KTtcbiAgICB0aGlzLnJvdXRlLnF1ZXJ5UGFyYW1zLnN1YnNjcmliZSgocGFyYW1zKSA9PiB7XG4gICAgICBjb25zdCBJZCA9IHBhcmFtc1snRm9ybUlkJ107XG4gICAgICBjb25zdCBOYW1lID0gcGFyYW1zWydOYW1lJ107XG4gICAgICB0aGlzLklkID0gSWQ7XG4gICAgICB0aGlzLmZvcm1OYW1lID0gTmFtZTtcbiAgICAgIGlmIChJZCkge1xuICAgICAgICB0aGlzLmdldFByb3BlcnRpZXMoSWQpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG4gIG9uQ2hpcENoYW5nZShjaGlwczogQ2hpcENoYW5nZUV2ZW50KSB7XG4gICAgdGhpcy5jaGlwcyA9IGNoaXBzO1xuICB9XG4gIGFzeW5jIHBvc3RTZWFyY2gocGF5bG9hZDogYW55KSB7XG4gICAgdGhpcy51dGlsU2VydmljZS5zZW5kQkkodHJ1ZSk7XG4gICAgY29uc3QgcmVzID0gYXdhaXQgdGhpcy5zZXJ2ZXIucG9zdChcbiAgICAgIGBTZWFyY2hGb3JtRW50aXRpZXMvMC8ke3RoaXMucGFnZVNpemV9YCxcbiAgICAgIHBheWxvYWRcbiAgICApO1xuICAgIHRoaXMudXRpbFNlcnZpY2Uuc2VuZEJJKGZhbHNlKTtcblxuICAgIGlmIChyZXMgaW5zdGFuY2VvZiBFcnJvclJlc3BvbnNlKSB7XG4gICAgICB0aGlzLnV0aWxTZXJ2aWNlLnNob3dFcnJvcignRXJyb3Igb2NjdXJyZWQgd2hpbGUgc2VhcmNoaW5nLicpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHBhZ2VTdGF0ZSA9IHJlcyBhcyBQYWdlZFJlc3VsdDxGb3JtRW50aXR5PjtcbiAgICBjb25zdCByZXN1bHQgPSBwYWdlU3RhdGU/LlJlc3VsdDtcblxuICAgIGlmICghcmVzdWx0IHx8IHJlc3VsdC5sZW5ndGggPT09IDApIHtcbiAgICAgIHRoaXMudXRpbFNlcnZpY2Uuc2hvd0luZm8oJ05vIHJlc3VsdHMgZm91bmQuJyk7XG4gICAgICB0aGlzLmRhdGEgPSBbXTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBBc3NpZ24gYW5kIGVuc3VyZSBQcm9wZXJ0aWVzIGV4aXN0XG4gICAgdGhpcy5kYXRhID0gcmVzdWx0Lm1hcCgoaXRlbSkgPT4gKHtcbiAgICAgIC4uLml0ZW0sXG4gICAgICBQcm9wZXJ0aWVzOiBpdGVtLlByb3BlcnRpZXMgfHwgW10sXG4gICAgfSkpO1xuXG4gICAgdGhpcy5zZXRVcENhcmREYXRhKCk7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIG9uRHJvcERvd25DaGFuZ2UoZXZlbnQ6IHN0cmluZykge1xuICAgIGlmIChldmVudCkge1xuICAgICAgdGhpcy5jaGVja01pbk1heChldmVudCk7XG4gICAgfVxuICB9XG4gIGFzeW5jIGdldFByb3BlcnRpZXMoXG4gICAgSWQ6IHN0cmluZyxcbiAgICBzaG93OiBib29sZWFuID0gZmFsc2UsXG4gICk6IFByb21pc2U8Rm9ybUVudGl0eVtdIHwgdW5kZWZpbmVkPiB7XG4gICAgaWYgKHRoaXMuc2hvd0NvbHVtbikge1xuICAgICAgdGhpcy5zaG93Q29sdW1uID0gZmFsc2U7XG4gICAgICB0aGlzLnNlbGVjdGVkQ29sdW1uVGFibGVDb3VudCA9IDA7XG4gICAgICB0aGlzLnJlc2V0KCk7XG4gICAgfVxuICAgIGlmICh0aGlzLnNob3dGaWx0ZXIpIHtcbiAgICAgIHRoaXMuc2hvd0ZpbHRlciA9IGZhbHNlO1xuICAgICAgdGhpcy5zZWxlY3RlZEZpbHRlclRhYmxlQ291bnQgPSAwO1xuXG4gICAgICB0aGlzLnJlc2V0KCk7XG4gICAgfVxuICAgIGlmICh0aGlzLnNob3dTb3J0KSB7XG4gICAgICB0aGlzLnNob3dTb3J0ID0gZmFsc2U7XG4gICAgICB0aGlzLnJlc2V0KCk7XG4gICAgICB0aGlzLnNlbGVjdGVkU29ydFRhYmxlQ291bnQgPSAwO1xuICAgIH1cblxuICAgIHZhciBwYXlsb2FkOiBTZWFyY2hQcm9wZXJ0eVZhbHVlW10gPSBbXG4gICAgICB7XG4gICAgICAgIFByb3BlcnR5TmFtZTogYENvZGVgLFxuICAgICAgICBFbnRpdHlWYWx1ZTogSWQsXG4gICAgICAgIE9wZXJhdG9yOiBTZWFyY2hPcGVyYXRvci5BbmQsXG4gICAgICAgIFNpZ246IFNlYXJjaFByb3BlcnR5U2lnbi5FUSxcbiAgICAgICAgVHlwZTogU2VhcmNoUHJvcGVydHlWYWx1ZVR5cGUuU3RyaW5nLFxuICAgICAgfSxcbiAgICBdO1xuICAgIHRoaXMudXRpbFNlcnZpY2Uuc2VuZEJJKHRydWUpO1xuICAgIGNvbnN0IHJlcyA9IGF3YWl0IHRoaXMuc2VydmVyLnBvc3QoXG4gICAgICBgU2VhcmNoRm9ybUVudGl0aWVzLyR7dGhpcy5za2lwfS8ke3RoaXMucGFnZVNpemV9YCxcbiAgICAgIHBheWxvYWRcbiAgICApO1xuICAgIHRoaXMudXRpbFNlcnZpY2Uuc2VuZEJJKGZhbHNlKTtcbiAgICBpZiAocmVzIGluc3RhbmNlb2YgRXJyb3JSZXNwb25zZSkge1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9IGVsc2Uge1xuICAgICAgdmFyIHJlc3VsdCA9IChyZXMgYXMgUGFnZWRSZXN1bHQ8Rm9ybUVudGl0eT4pLlJlc3VsdDtcbiAgICAgIHRoaXMuZGF0YSA9IHJlc3VsdDtcbiAgICAgIHRoaXMuZGF0YS5mb3JFYWNoKCh4KSA9PlxuICAgICAgICB4LlByb3BlcnRpZXMuZm9yRWFjaCgocCwgaSkgPT4gKHAuSWQgPSBpLnRvU3RyaW5nKCkpKSxcbiAgICAgICk7XG4gICAgICB0aGlzLnByb3BlcnRpZXMgPSB0aGlzLmRhdGFbMF0uUHJvcGVydGllcztcbiAgICAgIGNvbnNvbGUubG9nKHRoaXMucHJvcGVydGllcywgJ2pqaicpO1xuXG4gICAgICB0aGlzLnNldFVwQ2FyZERhdGEoKTtcbiAgICAgIHNob3cgPSBmYWxzZTtcbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuICB9XG5cbiAgb25Vc2VyU2VsZWN0ZWQoZXZlbnQ6IERyb3Bkb3duQ2hhbmdlRXZlbnQsIGl0ZW06IEZvcm1FbnRpdHkpIHtcbiAgICBjb25zdCB1c2VyID0gdGhpcy51c2Vycy5maW5kKCh4KSA9PiB4Lk5hbWUgPT0gZXZlbnQudmFsdWUpO1xuICAgIGlmICh1c2VyKSB7XG4gICAgICBpdGVtLk5hbWUgPSB1c2VyLk5hbWU7XG4gICAgICBpdGVtLkRlc2NyaXB0aW9uID0gdXNlci5EZXNjcmlwdGlvbjtcbiAgICAgIGl0ZW0uUHJvcGVydGllcyA9IHVzZXIuUHJvcGVydGllcztcbiAgICAgIGl0ZW0uSXNWYWxpZGF0ZWQgPSB1c2VyLklzVmFsaWRhdGVkO1xuICAgIH1cbiAgfVxuICBvbkNsZWFyKGV2ZW50OiBFdmVudCwgaXRlbTogRm9ybUVudGl0eSkge1xuICAgIGl0ZW0uTmFtZSA9ICcnO1xuICAgIGl0ZW0uRGVzY3JpcHRpb24gPSAnJztcbiAgICBpdGVtLlByb3BlcnRpZXMgPSBbXTtcbiAgICBpdGVtLklzVmFsaWRhdGVkID0gZmFsc2U7XG4gIH1cbiAgYXN5bmMgZ2V0Rm9ybXMoKTogUHJvbWlzZTxGb3JtRW50aXR5W10gfCB1bmRlZmluZWQ+IHtcbiAgICB0aGlzLnV0aWxTZXJ2aWNlLnNlbmRCSSh0cnVlKTtcbiAgICBjb25zdCByZXMgPSBhd2FpdCB0aGlzLnNlcnZlci5nZXQoXG4gICAgICBgR2V0Rm9ybUVudGl0aWVzV2l0aFBhcmFtcy9Hcm91cC8wLyR7dGhpcy5wYWdlU2l6ZX1gLFxuICAgICAgdGhpcy5lbnZTdmMuZW52aXJvbm1lbnQuV29ya0Zsb3dBUElcbiAgICApO1xuICAgIHRoaXMudXRpbFNlcnZpY2Uuc2VuZEJJKGZhbHNlKTtcbiAgICBpZiAocmVzIGluc3RhbmNlb2YgRXJyb3JSZXNwb25zZSkge1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5wYWdlU3RhdGUgPSByZXMgYXMgUGFnZWRSZXN1bHQ8Rm9ybUVudGl0eT47XG4gICAgICB2YXIgcmVzdWx0ID0gKHJlcyBhcyBQYWdlZFJlc3VsdDxGb3JtRW50aXR5PikuUmVzdWx0O1xuICAgICAgdGhpcy5kYXRhID0gcmVzdWx0O1xuICAgICAgdGhpcy5zZXRVcENhcmREYXRhKCk7XG4gICAgICB0aGlzLnByb3BlcnRpZXMgPSByZXN1bHRbMF0uUHJvcGVydGllcztcblxuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG4gIH1cbiAgZ2V0SXRlbUxhYmVsKG5hbWU6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgY29uc3QgaXRlbSA9IHRoaXMudXNlcnMuZmluZCgodXNlcikgPT4gdXNlci5OYW1lID09PSBuYW1lKTtcbiAgICBjb25zdCBvdGhlckNoZWNrID0gdGhpcy5kYXRhLmZpbmQoKGRhdGEpID0+IGRhdGEuTmFtZSA9PT0gbmFtZSk7XG4gICAgcmV0dXJuIGl0ZW0gPyBpdGVtLk5hbWUgOiBvdGhlckNoZWNrID8gb3RoZXJDaGVjay5OYW1lIDogJyc7XG4gIH1cblxuICBnZXRBc3luY0xhYmVsKHZhbHVlOiBhbnkpOiBzdHJpbmcge1xuICAgIGNvbnN0IGRhdGEgPSB0aGlzLmRhdGEuZmluZCgoeCkgPT4geC5OYW1lID09IHZhbHVlKTtcblxuICAgIHJldHVybiBkYXRhID8gZGF0YS5OYW1lIDogJyc7XG4gIH1cblxuICBhc3luYyBsb2FkTW9yZSgpIHtcbiAgICBpZiAoIXRoaXMucGFnZVN0YXRlKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMudXRpbFNlcnZpY2Uuc2VuZEJJKHRydWUpO1xuICAgIGNvbnN0IHJlcyA9XG4gICAgICB0aGlzLmN1cnJlbnRGaWx0ZXJzLmxlbmd0aCA+IDAgfHxcbiAgICAgICAgdGhpcy5jdXJyZW50U29ydHMubGVuZ3RoID4gMCB8fFxuICAgICAgICB0aGlzLmN1cnJlbnRTZWFyY2hUZXJtLnRyaW0oKS5sZW5ndGggPiAwXG4gICAgICAgID8gYXdhaXQgdGhpcy5sb2FkTW9yZUZpbHRlcnNBbmRTb3J0cygpXG4gICAgICAgIDogYXdhaXQgdGhpcy5zZXJ2ZXIuZ2V0KFxuICAgICAgICAgIGBHZXRUYXNrVXNlcnMvJHt0aGlzLnBhZ2VTdGF0ZS5Ta2lwfS8ke3RoaXMucGFnZVNpemV9YCxcbiAgICAgICAgICB0aGlzLmVudlN2Yy5lbnZpcm9ubWVudC5Xb3JrRmxvd0FQSVxuICAgICAgICApO1xuICAgIHRoaXMudXRpbFNlcnZpY2Uuc2VuZEJJKGZhbHNlKTtcbiAgICBpZiAocmVzIGluc3RhbmNlb2YgRXJyb3JSZXNwb25zZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnBhZ2VTdGF0ZSA9IHJlcyBhcyBQYWdlZFJlc3VsdDxGb3JtRW50aXR5PjtcbiAgICAgIHZhciByZXN1bHQgPSAocmVzIGFzIFBhZ2VkUmVzdWx0PEZvcm1FbnRpdHk+KS5SZXN1bHQ7XG5cbiAgICAgIHRoaXMuZGF0YSA9IHRoaXMuZGF0YS5jb25jYXQoXG4gICAgICAgIHJlc3VsdC5tYXAoKHgpID0+IHtcbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgLi4ueCxcbiAgICAgICAgICAgIGlkOiB4Lk5hbWUsXG4gICAgICAgICAgfTtcbiAgICAgICAgfSksXG4gICAgICApO1xuICAgICAgdGhpcy5zZXRVcENhcmREYXRhRXh0cmEocmVzdWx0KTtcbiAgICB9XG4gIH1cbiAgY2FyZENsaWNrZWQoaXRlbTogQ2FyZERhdGEsIHRvZ2dsZVZpZXc6IGJvb2xlYW4gPSBmYWxzZSkge1xuICAgIHRoaXMuY3VycmVudERhdGEgPSB0aGlzLmNhcmREYXRhVmlldy5vbkl0ZW1DbGljayhpdGVtKTtcbiAgICBpZiAodG9nZ2xlVmlldykge1xuICAgICAgdGhpcy5kYXRhVmlldy50b2dnbGVWaWV3KCk7XG4gICAgfVxuICB9XG4gIHRvZ2dsZUNoaWxkcmVuKGl0ZW06IENhcmREYXRhKSB7XG4gICAgdmFyIGN1cnJUb2dnbGVTdGF0ZSA9IGl0ZW0uaXNDaGlsZHJlbkV4cGFuZGVkO1xuICAgIHRoaXMuY2FyZERhdGEuZm9yRWFjaCgoXykgPT4ge1xuICAgICAgXy5pc0NoaWxkcmVuRXhwYW5kZWQgPSBmYWxzZTtcbiAgICB9KTtcbiAgICBpdGVtLmlzQ2hpbGRyZW5FeHBhbmRlZCA9ICFjdXJyVG9nZ2xlU3RhdGU7XG4gICAgaWYgKGl0ZW0uaXNDaGlsZHJlbkV4cGFuZGVkKSB7XG4gICAgICB0aGlzLmN1cnJlbnRFeHBhbmRlZENhcmQgPSBpdGVtO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmN1cnJlbnRFeHBhbmRlZENhcmQgPSBudWxsO1xuICAgIH1cbiAgfVxuICBzZXRVcENhcmREYXRhKCkge1xuICAgIGNvbnN0IGNhcmREYXRhOiBDYXJkRGF0YVtdID0gdGhpcy5kYXRhWzBdPy5Qcm9wZXJ0aWVzPy5tYXAoKHgpID0+IHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIC4uLngsXG4gICAgICAgIHNlbGVjdGVkOiBmYWxzZSxcbiAgICAgICAgdGl0bGU6IHguTmFtZSxcbiAgICAgICAgZGF0YTogeCxcbiAgICAgICAgYm9keTogW10sXG4gICAgICAgIGNoaWxkcmVuOiBbXSxcbiAgICAgIH07XG4gICAgfSk7XG5cbiAgICB0aGlzLmNhcmREYXRhID0gY2FyZERhdGE7IC8vIEFzc2lnbiB0aGUgdHJhbnNmb3JtZWQgYXJyYXkgdG8gYGNhcmREYXRhYFxuICB9XG5cbiAgb3BlbkRyb3Bkb3duKGl0ZW06IEZvcm1Qcm9wZXJ0eSk6IHZvaWQge1xuICAgIHRoaXMub3BlbkRyb3Bkb3duSWQgPSB0aGlzLm9wZW5Ecm9wZG93bklkID09PSBpdGVtLklkID8gbnVsbCA6IGl0ZW0uSWQ7XG4gIH1cblxuICBjbG9zZVBvcFVwKHJvdzogRm9ybVByb3BlcnR5KTogdm9pZCB7XG4gICAgaWYgKHRoaXMub3BlbkRyb3Bkb3duSWQgPT09IHJvdy5JZCkge1xuICAgICAgdGhpcy5vcGVuRHJvcGRvd25JZCA9IG51bGw7IC8vIFByb3Blcmx5IHJlc2V0IHdoZW4gY2xvc2luZ1xuICAgIH1cbiAgICB0aGlzLm9uQ2xvc2UoKTsgLy8gQ2FsbCBhbnkgYWRkaXRpb25hbCBsb2dpYyBmb3IgY2xvc3VyZVxuICB9XG4gIHNldFVwQ2FyZERhdGFFeHRyYShiYXNlRGF0YTogRm9ybUVudGl0eVtdKSB7XG4gICAgY29uc3QgY2FyZERhdGE6IENhcmREYXRhW10gPSBiYXNlRGF0YS5tYXAoKHgpID0+IHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHNlbGVjdGVkOiBmYWxzZSxcbiAgICAgICAgdGl0bGU6IHguTmFtZSxcbiAgICAgICAgZGF0YTogeCxcbiAgICAgICAgYm9keTogW10sXG4gICAgICAgIGNoaWxkcmVuOiBbXSxcbiAgICAgIH07XG4gICAgfSk7XG4gICAgdGhpcy5jYXJkRGF0YSA9IHRoaXMuY2FyZERhdGEuY29uY2F0KGNhcmREYXRhKTtcbiAgfVxuXG4gIGdvVG9DYXJkVmlldyhkYXRhOiBGb3JtUHJvcGVydHkpIHtcbiAgICBjb25zdCBpdGVtID0gdGhpcy5jYXJkRGF0YS5maW5kKCh4KSA9PiB4LmRhdGEgPT0gZGF0YSk7XG4gICAgaWYgKGl0ZW0pIHtcbiAgICAgIHRoaXMudXNlckNhcmRDbGlja2VkKGl0ZW0sIHRydWUpO1xuICAgIH1cbiAgfVxuXG4gIGdvVG9UYWJsZVZpZXcoKSB7XG4gICAgaWYgKCF0aGlzLmN1cnJlbnREYXRhKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuZGF0YVZpZXcudG9nZ2xlVmlldygpO1xuICAgIGNvbnN0IGlkID0gdGhpcy5jdXJyZW50RGF0YS5kYXRhID8gdGhpcy5jdXJyZW50RGF0YS5kYXRhLklkIDogJyc7XG4gICAgaWYgKGlkLnRyaW0oKS5sZW5ndGggPiAwICYmICF0aGlzLnRhYmxlVmlldy5pc1Jvd0VkaXRpbmcoaWQpKSB7XG4gICAgICB0aGlzLnRhYmxlVmlldy50b2dnbGVSb3dFZGl0KGlkKTtcbiAgICB9XG4gIH1cblxuICB2aWV3UHJvY2Vzc2VzKGNvZGU6IHN0cmluZykge1xuICAgIGlmIChjb2RlLnRyaW0oKS5sZW5ndGggPT0gMCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLm9uVmlld1Byb2Nlc3NDbGlja2VkLmVtaXQoY29kZSk7XG4gIH1cblxuICB1c2VyQ2FyZENsaWNrZWQoaXRlbTogQ2FyZERhdGEsIHRvZ2dsZVZpZXc6IGJvb2xlYW4gPSBmYWxzZSk6IHZvaWQge1xuICAgIHRoaXMuY2FyZERhdGEuZm9yRWFjaCgoY2FyZCkgPT4gKGNhcmQuc2VsZWN0ZWQgPSBmYWxzZSkpO1xuICAgIGl0ZW0uc2VsZWN0ZWQgPSB0cnVlO1xuICAgIHRoaXMuY3VycmVudERhdGEgPSB0aGlzLmNhcmREYXRhVmlldy5vbkl0ZW1DbGljayhpdGVtKTtcbiAgICB0aGlzLmNoaXBBcnJheSA9IEpTT04ucGFyc2UodGhpcy5jdXJyZW50RGF0YT8uZGF0YS5WYWx1ZSk7XG4gICAgaWYgKHRvZ2dsZVZpZXcpIHtcbiAgICAgIHRoaXMuZGF0YVZpZXcudG9nZ2xlVmlldygpO1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIHNhdmVGb3JtUHJvcGVydHkoKSB7XG4gICAgaWYgKCF0aGlzLmN1cnJlbnREYXRhKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgZm9ybVByb3BlcnR5OiBGb3JtRW50aXR5W10gPSB0aGlzLmRhdGE7XG5cbiAgICB0aGlzLnV0aWxTZXJ2aWNlLnNlbmRCSSh0cnVlKTtcblxuICAgIHRyeSB7XG4gICAgICAvLyBBUEkgY2FsbCB0byBzYXZlIHVzZXJcbiAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IHRoaXMuc2VydmVyLnBvc3QoXG4gICAgICAgIGBTYXZlRm9ybUVudGl0aWVzYCxcbiAgICAgICAgZm9ybVByb3BlcnR5LFxuICAgICAgICB0aGlzLmVudlN2Yy5lbnZpcm9ubWVudC5Xb3JrRmxvd0FQSSxcbiAgICAgICk7XG5cbiAgICAgIHRoaXMudXRpbFNlcnZpY2Uuc2VuZEJJKGZhbHNlKTtcblxuICAgICAgaWYgKCEocmVzIGluc3RhbmNlb2YgRXJyb3JSZXNwb25zZSkpIHtcbiAgICAgICAgdGhpcy51dGlsU2VydmljZS5zaG93U3VjY2VzcygnRm9ybSBwcm9wZXJ0eSBzYXZlZCBzdWNjZXNzZnVsbHknKTtcblxuICAgICAgICBjb25zdCByZXN1bHQgPSByZXMgYXMgRm9ybUVudGl0eVtdO1xuICAgICAgICBpZiAocmVzdWx0Lmxlbmd0aCA+IDApIHtcbiAgICAgICAgICBjb25zdCB1c2VyUmVzdWx0ID0gcmVzdWx0WzBdO1xuXG4gICAgICAgICAgY29uc3QgaXRlbUluZGV4ID0gdGhpcy5kYXRhLmZpbmRJbmRleChcbiAgICAgICAgICAgICh4KSA9PiB4ID09PSB0aGlzLmN1cnJlbnREYXRhPy5kYXRhLFxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgdGhpcy51dGlsU2VydmljZS5zZW5kQkkoZmFsc2UpO1xuICAgICAgLy8gT3B0aW9uYWw6IEhhbmRsZSBlcnJvcnMgaWYgbmVlZGVkXG4gICAgfVxuICB9XG4gIHN0cmluZ2lmeSh2YWw6IGFueSkge1xuICAgIHJldHVybiBKU09OLnN0cmluZ2lmeSh2YWwpO1xuICB9XG4gIGdlbmVyYXRlVW5pcXVlSWQoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gJ18nICsgTWF0aC5yYW5kb20oKS50b1N0cmluZygzNikuc3Vic3RyKDIsIDkpO1xuICB9XG5cbiAgYWRkT3JVcGRhdGVGb3JtUHJvcGVydHkoZm9ybTogRm9ybUVudGl0eSwgcHJvcGVydHk6IEZvcm1Qcm9wZXJ0eSk6IHZvaWQge1xuICAgIGlmICghcHJvcGVydHkuaWQpIHtcbiAgICAgIHByb3BlcnR5LmlkID0gdGhpcy5nZW5lcmF0ZVVuaXF1ZUlkKCk7XG4gICAgfVxuXG4gICAgY29uc3QgaW5kZXggPSBmb3JtLlByb3BlcnRpZXMuZmluZEluZGV4KChwKSA9PiBwLmlkID09PSBwcm9wZXJ0eS5pZCk7XG5cbiAgICBpZiAoaW5kZXggIT09IC0xKSB7XG4gICAgICBmb3JtLlByb3BlcnRpZXNbaW5kZXhdID0geyAuLi5wcm9wZXJ0eSB9OyAvLyB1cGRhdGVcbiAgICB9IGVsc2Uge1xuICAgICAgZm9ybS5Qcm9wZXJ0aWVzLnB1c2goeyAuLi5wcm9wZXJ0eSB9KTsgLy8gYWRkXG4gICAgfVxuXG4gICAgZm9ybS5EYXRhU3RhdGUgPVxuICAgICAgZm9ybS5EYXRhU3RhdGUgPT09IE9iamVjdFN0YXRlLk5ld1xuICAgICAgICA/IE9iamVjdFN0YXRlLk5ld1xuICAgICAgICA6IE9iamVjdFN0YXRlLkNoYW5nZWQ7XG4gIH1cbiAgZGVsZXRlUHJvcGVydHkocHJvcGVydHlJZDogc3RyaW5nKSB7XG4gICAgaWYgKCF0aGlzLmRhdGEgfHwgdGhpcy5kYXRhLmxlbmd0aCA9PT0gMCkgcmV0dXJuO1xuXG4gICAgY29uc3QgZm9ybSA9IHRoaXMuZGF0YVswXTtcbiAgICBmb3JtLlByb3BlcnRpZXMgPSBmb3JtLlByb3BlcnRpZXMuZmlsdGVyKFxuICAgICAgKHA6IEZvcm1Qcm9wZXJ0eSkgPT4gcC5JZCAhPT0gcHJvcGVydHlJZCxcbiAgICApO1xuXG4gICAgdGhpcy5jYXJkRGF0YSA9IHRoaXMuY2FyZERhdGEuZmlsdGVyKChjKSA9PiBjLmRhdGEuSWQgIT09IHByb3BlcnR5SWQpO1xuXG4gICAgaWYgKHRoaXMuY3VycmVudERhdGEgJiYgdGhpcy5jdXJyZW50RGF0YS5kYXRhLklkID09PSBwcm9wZXJ0eUlkKSB7XG4gICAgICB0aGlzLmN1cnJlbnREYXRhID0gbnVsbDtcbiAgICAgIHRoaXMuY2FyZERhdGFWaWV3LmNsZWFyRGF0YSgpO1xuICAgIH1cblxuXG4gICAgdGhpcy5kYXRhID0gWy4uLnRoaXMuZGF0YV07XG5cbiAgICB0aGlzLnV0aWxTZXJ2aWNlLnNob3dJbmZvKFwiUHJvcGVydHkgcmVtb3ZlZFwiKTtcbiAgfVxuXG5cbiAgYXN5bmMgc2F2ZUFsbFByb3BlcnRpZXMoKSB7XG4gICAgaWYgKCF0aGlzLmRhdGEgfHwgdGhpcy5kYXRhLmxlbmd0aCA9PT0gMCkgcmV0dXJuO1xuICAgIGNvbnN0IGZvcm0gPSB0aGlzLmRhdGFbMF07XG4gICAgZm9ybS5Qcm9wZXJ0aWVzLmZvckVhY2goKHByb3A6IEZvcm1Qcm9wZXJ0eSwgaW5kZXg6IG51bWJlcikgPT4ge1xuICAgICAgcHJvcC5JZCA9IGluZGV4LnRvU3RyaW5nKCk7XG4gICAgICBwcm9wLk1heFZhbHVlID0gTnVtYmVyKHByb3AuTWF4VmFsdWUpO1xuICAgICAgcHJvcC5NaW5WYWx1ZSA9IE51bWJlcihwcm9wLk1pblZhbHVlKTtcbiAgICAgIHByb3AuT3B0aW9ucyA9IEFycmF5LmlzQXJyYXkocHJvcC5PcHRpb25zKVxuICAgICAgICA/IHByb3AuT3B0aW9ucy5qb2luKFwiLFwiKVxuICAgICAgICA6IHByb3AuT3B0aW9ucyA/PyBcIlwiO1xuICAgICAgcHJvcC5WYWx1ZSA9IHByb3AuVmFsdWUgPz8gXCJcIjtcbiAgICB9KTtcblxuXG5cblxuXG5cbiAgICBjb25zdCBpbnZhbGlkID0gZm9ybS5Qcm9wZXJ0aWVzLmZpbmQoXG4gICAgICAocCkgPT4gIXAuTmFtZSB8fCBwLk5hbWUudHJpbSgpLmxlbmd0aCA9PT0gMFxuICAgICk7XG4gICAgaWYgKGludmFsaWQpIHtcbiAgICAgIHRoaXMudXRpbFNlcnZpY2Uuc2hvd0luZm8oXCJOYW1lIGNhbm5vdCBiZSBlbXB0eVwiKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBmb3JtLkRhdGFTdGF0ZSA9IE9iamVjdFN0YXRlLkNoYW5nZWQ7XG5cbiAgICB0aGlzLnV0aWxTZXJ2aWNlLnNlbmRCSSh0cnVlKTtcblxuICAgIGNvbnN0IHJlcyA9IGF3YWl0IHRoaXMuc2VydmVyLnBvc3QoXG4gICAgICBcIlNhdmVGb3JtRW50aXRpZXNcIixcbiAgICAgIFtmb3JtXSxcbiAgICAgIHRoaXMuZW52U3ZjLmVudmlyb25tZW50LldvcmtGbG93QVBJXG4gICAgKTtcblxuICAgIHRoaXMudXRpbFNlcnZpY2Uuc2VuZEJJKGZhbHNlKTtcblxuICAgIGlmIChyZXMgaW5zdGFuY2VvZiBFcnJvclJlc3BvbnNlKSB7XG4gICAgICB0aGlzLnV0aWxTZXJ2aWNlLnNob3dFcnJvcihcIkFuIGVycm9yIG9jY3VycmVkIHdoaWxlIHNhdmluZ1wiKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy51dGlsU2VydmljZS5zaG93U3VjY2VzcyhcIkZvcm0gcHJvcGVydGllcyBzYXZlZCBzdWNjZXNzZnVsbHlcIik7XG5cblxuXG4gICAgfVxuICB9XG5cblxuXG5cbiAgYXN5bmMgc2F2ZVZpYVRhYmxlKHJvdzogRm9ybVByb3BlcnR5LCBjYWxsQmFjazogKCkgPT4gYW55KSB7XG4gICAgaWYgKCFyb3cpIHJldHVybjtcblxuICAgIGNvbnN0IHByb3BlcnR5OiBGb3JtUHJvcGVydHkgPSByb3cgYXMgRm9ybVByb3BlcnR5O1xuICAgIHByb3BlcnR5Lk1heFZhbHVlID0gTnVtYmVyKHByb3BlcnR5Lk1heFZhbHVlKTtcbiAgICBwcm9wZXJ0eS5NaW5WYWx1ZSA9IE51bWJlcihwcm9wZXJ0eS5NaW5WYWx1ZSk7XG4gICAgcHJvcGVydHkuT3B0aW9ucyA9IHRoaXMuY2hpcEFycmF5Py50b1N0cmluZygpO1xuICAgIHByb3BlcnR5LlZhbHVlID0gJyc7XG5cbiAgICBpZiAoIXByb3BlcnR5Lk5hbWUgfHwgcHJvcGVydHkuTmFtZS50cmltKCkubGVuZ3RoID09PSAwKSB7XG4gICAgICB0aGlzLnV0aWxTZXJ2aWNlLnNob3dJbmZvKCdOYW1lIGNhbm5vdCBiZSBlbXB0eScpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMudXRpbFNlcnZpY2Uuc2VuZEJJKHRydWUpO1xuXG4gICAgY29uc3QgZm9ybSA9IHRoaXMuZGF0YVswXTtcbiAgICBjb25zdCBpbmRleCA9IGZvcm0uUHJvcGVydGllcy5maW5kSW5kZXgoKHApID0+IHAuaWQgPT09IHByb3BlcnR5LmlkKTtcblxuICAgIGlmIChpbmRleCA+IC0xKSB7XG4gICAgICBmb3JtLlByb3BlcnRpZXNbaW5kZXhdID0gcHJvcGVydHk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGZvcm0uUHJvcGVydGllcy5wdXNoKHByb3BlcnR5KTtcbiAgICB9XG5cbiAgICBmb3JtLkRhdGFTdGF0ZSA9XG4gICAgICBmb3JtLkRhdGFTdGF0ZSA9PT0gT2JqZWN0U3RhdGUuTmV3XG4gICAgICAgID8gT2JqZWN0U3RhdGUuTmV3XG4gICAgICAgIDogT2JqZWN0U3RhdGUuQ2hhbmdlZDtcblxuICAgIGNvbnN0IHJlcyA9IGF3YWl0IHRoaXMuc2VydmVyLnBvc3QoXG4gICAgICAnU2F2ZUZvcm1FbnRpdGllcycsXG4gICAgICB0aGlzLmRhdGEsXG4gICAgICB0aGlzLmVudlN2Yy5lbnZpcm9ubWVudC5Xb3JrRmxvd0FQSSxcbiAgICApO1xuXG4gICAgdGhpcy51dGlsU2VydmljZS5zZW5kQkkoZmFsc2UpO1xuXG4gICAgaWYgKHJlcyBpbnN0YW5jZW9mIEVycm9yUmVzcG9uc2UpIHtcbiAgICAgIHRoaXMudXRpbFNlcnZpY2Uuc2hvd0Vycm9yKCdBbiBlcnJvciBvY2N1cnJlZCB3aGlsZSBzYXZpbmcnKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy51dGlsU2VydmljZS5zaG93U3VjY2VzcygnRm9ybSBwcm9wZXJ0eSBzYXZlZCBzdWNjZXNzZnVsbHknKTtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IHJlcyBhcyBGb3JtRW50aXR5W107XG4gICAgICB0aGlzLmNsb3NlUG9wVXAocm93KTtcbiAgICAgIGNhbGxCYWNrKCk7XG4gICAgICBpZiAocmVzdWx0Lmxlbmd0aCA+IDApIHtcbiAgICAgICAgY29uc3QgdXBkYXRlZEZvcm0gPSByZXN1bHRbMF07XG4gICAgICAgIHRoaXMuZGF0YVswXS5Qcm9wZXJ0aWVzID0gdXBkYXRlZEZvcm0uUHJvcGVydGllcztcbiAgICAgICAgdGhpcy5kYXRhID0gWy4uLnRoaXMuZGF0YV07XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgdG9nZ2xlSXNWYWxpZGF0ZSh2YWx1ZTogYm9vbGVhbiwgcm93OiBGb3JtUHJvcGVydHkpOiB2b2lkIHtcbiAgICBjb25zdCBuZXdWYWx1ZSA9ICF2YWx1ZTtcbiAgICByb3cuSXNSZXF1aXJlZCA9IG5ld1ZhbHVlO1xuICAgIGNvbnNvbGUubG9nKHJvdyk7XG4gIH1cbiAgb25LZXlEb3duKGU6IEtleWJvYXJkRXZlbnQsIGRhdGE6IEZvcm1Qcm9wZXJ0eSkge1xuICAgIC8vIGFsbG93IG5hdmlnYXRpb24gLyBjb250cm9sIGtleXNcbiAgICBjb25zdCBhbGxvd2VkID0gW1xuICAgICAgJ0JhY2tzcGFjZScsXG4gICAgICAnRGVsZXRlJyxcbiAgICAgICdBcnJvd0xlZnQnLFxuICAgICAgJ0Fycm93UmlnaHQnLFxuICAgICAgJ0Fycm93VXAnLFxuICAgICAgJ0Fycm93RG93bicsXG4gICAgICAnVGFiJyxcbiAgICAgICdFbnRlcicsXG4gICAgICAnSG9tZScsXG4gICAgICAnRW5kJyxcbiAgICAgICdFc2NhcGUnLFxuICAgIF07XG4gICAgaWYgKGFsbG93ZWQuaW5jbHVkZXMoZS5rZXkpKSByZXR1cm47XG5cbiAgICAvLyBibG9jayB0aGUgU3BhY2Uga2V5IChjb3ZlcnMgbW9kZXJuICYgb2xkIGJyb3dzZXJzKVxuICAgIGlmIChlLmtleSA9PT0gJyAnIHx8IGUuY29kZSA9PT0gJ1NwYWNlJyB8fCBlLmtleSA9PT0gJ1NwYWNlYmFyJykge1xuICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgfVxuXG4gIG9uUGFzdGUoZTogQ2xpcGJvYXJkRXZlbnQsIGRhdGE6IEZvcm1Qcm9wZXJ0eSkge1xuICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICBjb25zdCBwYXN0ZWQgPSBlLmNsaXBib2FyZERhdGE/LmdldERhdGEoJ3RleHQnKSA/PyAnJztcbiAgICBjb25zdCBjbGVhbmVkID0gcGFzdGVkLnJlcGxhY2UoL1xccysvZywgJycpO1xuICAgIGNvbnN0IGlucHV0ID0gZS50YXJnZXQgYXMgSFRNTElucHV0RWxlbWVudDtcblxuICAgIGNvbnN0IHN0YXJ0ID0gaW5wdXQuc2VsZWN0aW9uU3RhcnQgPz8gaW5wdXQudmFsdWUubGVuZ3RoO1xuICAgIGNvbnN0IGVuZCA9IGlucHV0LnNlbGVjdGlvbkVuZCA/PyBzdGFydDtcbiAgICBjb25zdCBuZXdWYWwgPVxuICAgICAgaW5wdXQudmFsdWUuc2xpY2UoMCwgc3RhcnQpICsgY2xlYW5lZCArIGlucHV0LnZhbHVlLnNsaWNlKGVuZCk7XG5cbiAgICBpbnB1dC52YWx1ZSA9IG5ld1ZhbDtcbiAgICBkYXRhLlByb3BlcnR5TmFtZSA9IG5ld1ZhbDtcbiAgICB0aGlzLnVwZGF0ZVRhYmxlPy4oKTtcbiAgfVxuXG4gIG9uSW5wdXQoZTogRXZlbnQsIGRhdGE6IEZvcm1Qcm9wZXJ0eSkge1xuICAgIGNvbnN0IGlucHV0ID0gZS50YXJnZXQgYXMgSFRNTElucHV0RWxlbWVudDtcbiAgICBjb25zdCBjbGVhbmVkID0gaW5wdXQudmFsdWUucmVwbGFjZSgvXFxzKy9nLCAnJyk7XG4gICAgaWYgKGlucHV0LnZhbHVlICE9PSBjbGVhbmVkKSB7XG4gICAgICBjb25zdCBwb3MgPSBpbnB1dC5zZWxlY3Rpb25TdGFydCA/PyBjbGVhbmVkLmxlbmd0aDtcbiAgICAgIGlucHV0LnZhbHVlID0gY2xlYW5lZDtcblxuICAgICAgY29uc3QgbmV3UG9zID0gTWF0aC5taW4ocG9zLCBjbGVhbmVkLmxlbmd0aCk7XG4gICAgICBzZXRUaW1lb3V0KCgpID0+IGlucHV0LnNldFNlbGVjdGlvblJhbmdlKG5ld1BvcywgbmV3UG9zKSwgMCk7XG4gICAgfVxuICAgIGRhdGEuUHJvcGVydHlOYW1lID0gY2xlYW5lZDtcbiAgICB0aGlzLnVwZGF0ZVRhYmxlPy4oKTtcbiAgfVxuXG4gIHVwZGF0ZVRhYmxlKCkge1xuICAgIHRoaXMuZGF0YSA9IHRoaXMuZGF0YS5tYXAoKHgpID0+IHgpO1xuICB9XG5cbiAgY29udmVydFRvSW50KHZhbHVlOiBhbnksIGRhdGE6IGFueSwgcHJvcDogc3RyaW5nKSB7XG4gICAgZGF0YVtwcm9wXSA9IHBhcnNlSW50KHZhbHVlKTtcbiAgfVxuICBnZXRTdHJpbmdWYWx1ZShkYXRhOiBhbnksIHByb3A6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGRhdGFbcHJvcF0udG9TdHJpbmcoKTtcbiAgfVxuXG4gIGNoZWNrTWluTWF4KHZhbHVlOiBzdHJpbmcpIHtcbiAgICB2YXIgc2hvd01pbm1heCA9IGZhbHNlO1xuICAgIHN3aXRjaCAodmFsdWUpIHtcbiAgICAgIGNhc2UgJ1N0cmluZyc6XG4gICAgICAgIHNob3dNaW5tYXggPSB0cnVlO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ0ludCc6XG4gICAgICAgIHNob3dNaW5tYXggPSB0cnVlO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ0RlY2ltYWwnOlxuICAgICAgICBzaG93TWlubWF4ID0gdHJ1ZTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdGbG9hdCc6XG4gICAgICAgIHNob3dNaW5tYXggPSB0cnVlO1xuICAgICAgICBicmVhaztcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHNob3dNaW5tYXggPSBmYWxzZTtcbiAgICAgICAgYnJlYWs7XG4gICAgfVxuICAgIHJldHVybiAodGhpcy5oaWRlTWluTWF4ID0gc2hvd01pbm1heCk7XG4gIH1cblxuICBuYXZpZ2F0ZVRvRmllbGRzKCkge1xuICAgIGNvbnN0IHF1ZXJ5UGFyYW1zID0gdGhpcy5xdWVyeVBhcmFtcztcbiAgICB0aGlzLnJvdXRlci5uYXZpZ2F0ZShbYCR7dGhpcy5wYXRofWBdLCB7IHF1ZXJ5UGFyYW1zIH0pO1xuICB9XG4gIG9uQ2xvc2UoKSB7XG4gICAgdGhpcy5pc09wZW4gPSBmYWxzZTtcbiAgfVxuXG4gIGdvQmFjaygpIHtcbiAgICB0aGlzLl9sb2NhdGlvbi5iYWNrKCk7XG4gIH1cbiAgaXNEcm9wZG93bk9wZW4oaXRlbTogYW55KTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMub3BlbkRyb3Bkb3duSWQgPT09IGl0ZW0uaWQ7XG4gIH1cblxuICBvblZpZXdDaGFuZ2UoaXNHcmlkVmlldzogYm9vbGVhbik6IHZvaWQgeyB9XG5cbiAgb25TdGF0ZUNoYW5nZShldmVudDogeyBrZXk6IHN0cmluZzsgdmFsdWU6IGJvb2xlYW4gfSk6IHZvaWQge1xuICAgIHN3aXRjaCAoZXZlbnQua2V5KSB7XG4gICAgICBjYXNlICdjcmVhdGUnOlxuICAgICAgICBjb25zdCBuZXdJZCA9IGBwcm9wLSR7RGF0ZS5ub3coKX1gO1xuXG4gICAgICAgIHZhciBuZXdVc2VyOiBGb3JtUHJvcGVydHkgPSB7XG4gICAgICAgICAgTWF4VmFsdWU6IDEwMCxcbiAgICAgICAgICBOYW1lOiAnJyxcbiAgICAgICAgICBWYWx1ZTogJycsXG4gICAgICAgICAgTWluVmFsdWU6IDEwMCxcbiAgICAgICAgICBPcHRpb25zOiAnJyxcbiAgICAgICAgICBJc1JlcXVpcmVkOiBmYWxzZSxcbiAgICAgICAgICBJc1JlYWRPbmx5OiBmYWxzZSxcbiAgICAgICAgICBEYXRhVHlwZTogRGF0YVR5cGUuVGV4dCxcbiAgICAgICAgICBEZWZhdWx0VmFsdWU6ICcnLFxuICAgICAgICAgIFByb3BlcnR5TmFtZTogJycsXG4gICAgICAgICAgaWQ6IG5ld0lkLFxuICAgICAgICAgIElkOiBuZXdJZCxcbiAgICAgICAgfTtcblxuICAgICAgICB0aGlzLmNoaXBBcnJheSA9IFtdO1xuXG4gICAgICAgIGNvbnN0IGNhcmREYXRhOiBDYXJkRGF0YSA9IHtcbiAgICAgICAgICBzZWxlY3RlZDogZmFsc2UsXG4gICAgICAgICAgdGl0bGU6IG5ld1VzZXIuTmFtZSxcbiAgICAgICAgICBkYXRhOiBuZXdVc2VyLFxuICAgICAgICAgIGJvZHk6IFtdLFxuICAgICAgICAgIGNoaWxkcmVuOiBbXSxcbiAgICAgICAgfTtcbiAgICAgICAgaWYgKHRoaXMuZGF0YSAmJiB0aGlzLmRhdGEubGVuZ3RoID4gMCkge1xuICAgICAgICAgIHRoaXMuZGF0YVswXS5Qcm9wZXJ0aWVzID0gW1xuICAgICAgICAgICAgLi4uKHRoaXMuZGF0YVswXS5Qcm9wZXJ0aWVzID8/IFtdKSxcbiAgICAgICAgICAgIG5ld1VzZXIsXG4gICAgICAgICAgXTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmNhcmREYXRhLnB1c2goY2FyZERhdGEpO1xuICAgICAgICB0aGlzLnVzZXJDYXJkQ2xpY2tlZChjYXJkRGF0YSk7XG5cbiAgICAgICAgdGhpcy5kYXRhVmlldy5pc1RhYmxlVmlldyA9IGZhbHNlO1xuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSAnZmlsdGVyJzpcbiAgICAgICAgdGhpcy5zaG93RmlsdGVyID0gZXZlbnQudmFsdWU7XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBjYXNlICdzb3J0JzpcbiAgICAgICAgdGhpcy5zaG93U29ydCA9IGV2ZW50LnZhbHVlO1xuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSAnY29sdW1uJzpcbiAgICAgICAgdGhpcy5zaG93Q29sdW1uID0gZXZlbnQudmFsdWU7XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBkZWZhdWx0OlxuICAgICAgICBicmVhaztcbiAgICB9XG4gIH1cblxuICByZXNldCgpIHtcbiAgICB0aGlzLnNraXAgPSAwO1xuICAgIHRoaXMucGFnZVNpemUgPSAxMDtcbiAgfVxuICBhc3luYyBvblNlYXJjaChldmVudDogeyBrZXk6IHN0cmluZzsgdmFsdWU6IHN0cmluZyB9KSB7XG4gICAgdGhpcy5zZWFyY2hUZXJtID0gZXZlbnQudmFsdWU7XG4gICAgdGhpcy5yZXNldCgpO1xuICAgIGlmICghdGhpcy5zZWFyY2hUZXJtKSB7XG4gICAgICB0aGlzLmdldFByb3BlcnRpZXModGhpcy5JZCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy51dGlsU2VydmljZS5zZW5kQkkodHJ1ZSk7XG5cbiAgICB0cnkge1xuICAgICAgY29uc3QgcmVzID0gYXdhaXQgdGhpcy5zZXJ2ZXIuZ2V0KFxuICAgICAgICBgR2V0Rm9ybUVudGl0aWVzV2l0aFBhcmFtLyR7dGhpcy5zZWFyY2hUZXJtfS8ke3RoaXMuc2tpcH0vJHt0aGlzLnBhZ2VTaXplfS9DcmVhdGVkQXQvYXNjYFxuICAgICAgKTtcbiAgICAgIHRoaXMudXRpbFNlcnZpY2Uuc2VuZEJJKGZhbHNlKTtcblxuICAgICAgaWYgKHJlcyBpbnN0YW5jZW9mIEVycm9yUmVzcG9uc2UpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcignRXJyb3IgZHVyaW5nIHNlYXJjaDonLCByZXMpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5wYWdlU3RhdGUgPSByZXMgYXMgUGFnZWRSZXN1bHQ8Rm9ybUVudGl0eT47XG4gICAgICAgIHZhciByZXN1bHQgPSAocmVzIGFzIFBhZ2VkUmVzdWx0PEZvcm1FbnRpdHk+KS5SZXN1bHQ7XG4gICAgICAgIHRoaXMuZGF0YSA9IHJlc3VsdDtcblxuICAgICAgICB0aGlzLnNldFVwQ2FyZERhdGEoKTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgY29uc29sZS5lcnJvcignU2VhcmNoIGVycm9yOicsIGVycm9yKTtcbiAgICB9IGZpbmFsbHkge1xuICAgIH1cbiAgfVxuICBzaG93VGFibGVWaWV3OiBib29sZWFuID0gZmFsc2U7XG4gIG9uU2VsZWN0aW9uQ2hhbmdlKHNlbGVjdGVkUm93czogRm9ybVByb3BlcnR5W10pIHsgfVxuICByZXRyeU1lc3NhZ2UoKSB7IH1cblxuICBvbkNvbHVtbnNVcGRhdGVkKHVwZGF0ZWRDb2x1bW5zOiBJRGF0YUZpbHRlcltdKSB7XG4gICAgY29uc3QgdXBkYXRlZENvbHVtbkRlZjogQ29sdW1uRGVmaW5pdGlvbjxGb3JtUHJvcGVydHk+W10gPSBbXTtcbiAgICB0aGlzLnNob3dDb2x1bW4gPSBmYWxzZTtcbiAgICB0aGlzLnNlbGVjdGVkQ29sdW1uVGFibGVDb3VudCA9IHVwZGF0ZWRDb2x1bW5zLmxlbmd0aDtcbiAgICB1cGRhdGVkQ29sdW1ucy5mb3JFYWNoKChjb2wpID0+IHtcbiAgICAgIGNvbnN0IG1hdGNoaW5nQ29sID0gdGhpcy50YXNrVXNlcnNTdmMuZm9ybUZpZWxkQ29sdW1ucy5maW5kKFxuICAgICAgICAoY29sdW1uKSA9PiBjb2x1bW4uaGVhZGVyID09PSBjb2wubmFtZSB8fCBjb2x1bW4uaWQgPT09IGNvbC5uYW1lLFxuICAgICAgKTtcbiAgICAgIGlmIChtYXRjaGluZ0NvbCkge1xuICAgICAgICB1cGRhdGVkQ29sdW1uRGVmLnB1c2gobWF0Y2hpbmdDb2wpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgdGhpcy52aXNpYmxlQ29sdW1uRGVmID0gWy4uLnVwZGF0ZWRDb2x1bW5EZWZdO1xuICB9XG5cbiAgYXN5bmMgdXBkYXRlRmlsdGVyc0FuZFNvcnRzKGlzU2VhcmNoOiBib29sZWFuID0gZmFsc2UpIHtcbiAgICBpZiAoIWlzU2VhcmNoKSB7XG4gICAgICB0aGlzLmRhdGFWaWV3Lm9uQ2xlYXJTZWFyY2goKTtcbiAgICAgIHRoaXMuY3VycmVudFNlYXJjaFRlcm0gPSAnJztcbiAgICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcbiAgICAgIGNvbnN0IGNsaWNrRXZlbnQgPSBuZXcgTW91c2VFdmVudCgnY2xpY2snLCB7XG4gICAgICAgIGJ1YmJsZXM6IHRydWUsXG4gICAgICAgIGNhbmNlbGFibGU6IHRydWUsXG4gICAgICAgIHZpZXc6IHdpbmRvdyxcbiAgICAgIH0pO1xuICAgICAgZG9jdW1lbnQuZGlzcGF0Y2hFdmVudChjbGlja0V2ZW50KTtcbiAgICB9XG4gICAgdmFyIHBheWxvYWQ6IFNlYXJjaFByb3BlcnR5VmFsdWVbXSA9IHRoaXMuY3VycmVudEZpbHRlcnMubWFwKCh4KSA9PiB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBQcm9wZXJ0eU5hbWU6XG4gICAgICAgICAgVGFza1VzZXJQcm9wZXJ0eU1hcFt4Lm5hbWUgYXMga2V5b2YgdHlwZW9mIFRhc2tVc2VyUHJvcGVydHlNYXBdLFxuICAgICAgICBFbnRpdHlWYWx1ZTogeC52YWx1ZSxcbiAgICAgICAgT3BlcmF0b3I6IFNlYXJjaE9wZXJhdG9yLkFuZCxcbiAgICAgICAgU2lnbjpcbiAgICAgICAgICB4LmNvbmRpdGlvbiAmJiBPYmplY3Qua2V5cyhGaWx0ZXJUeXBlcykuaW5jbHVkZXMoeC5jb25kaXRpb24pXG4gICAgICAgICAgICA/IChGaWx0ZXJUeXBlc1tcbiAgICAgICAgICAgICAgeC5jb25kaXRpb24gYXMga2V5b2YgdHlwZW9mIEZpbHRlclR5cGVzXG4gICAgICAgICAgICBdIGFzIHVua25vd24gYXMgU2VhcmNoUHJvcGVydHlTaWduKVxuICAgICAgICAgICAgOiBTZWFyY2hQcm9wZXJ0eVNpZ24uRVEsXG4gICAgICAgIFR5cGU6XG4gICAgICAgICAgeC5uYW1lID09IFRhc2tVc2VyUHJvcGVydHlOYW1lLkRhdGVcbiAgICAgICAgICAgID8gU2VhcmNoUHJvcGVydHlWYWx1ZVR5cGUuRGF0ZVxuICAgICAgICAgICAgOiBTZWFyY2hQcm9wZXJ0eVZhbHVlVHlwZS5TdHJpbmcsXG4gICAgICB9O1xuICAgIH0pO1xuICAgIC8vIHBheWxvYWQucHVzaCh7XG4gICAgLy8gICBQcm9wZXJ0eU5hbWU6ICdBUElLZXknLFxuICAgIC8vICAgRW50aXR5VmFsdWU6IHRoaXMuZW52U3ZjLmVudmlyb25tZW50LkFQSUtleSxcbiAgICAvLyAgIE9wZXJhdG9yOiBTZWFyY2hPcGVyYXRvci5BbmQsXG4gICAgLy8gICBTaWduOiBTZWFyY2hQcm9wZXJ0eVNpZ24uRVEsXG4gICAgLy8gfSk7XG4gICAgY29uc3Qgc29ydFBhcmFtOiB7IFBhcmFtOiBzdHJpbmc7IE9yZGVyOiBzdHJpbmcgfSB8IG51bGwgPVxuICAgICAgdGhpcy5jdXJyZW50U29ydHMubGVuZ3RoID4gMFxuICAgICAgICA/IHtcbiAgICAgICAgICBQYXJhbTpcbiAgICAgICAgICAgIFRhc2tVc2VyUHJvcGVydHlNYXBbXG4gICAgICAgICAgICB0aGlzLmN1cnJlbnRTb3J0c1swXS5uYW1lIGFzIGtleW9mIHR5cGVvZiBUYXNrVXNlclByb3BlcnR5TWFwXG4gICAgICAgICAgICBdLFxuICAgICAgICAgIE9yZGVyOiB0aGlzLmN1cnJlbnRTb3J0c1swXS52YWx1ZSxcbiAgICAgICAgfVxuICAgICAgICA6IG51bGw7XG4gICAgY29uc3Qgc2VhcmNoVGVybUV4aXN0cyA9IHRoaXMuY3VycmVudFNlYXJjaFRlcm0udHJpbSgpLmxlbmd0aCA+IDA7XG4gICAgdGhpcy51dGlsU2VydmljZS5zZW5kQkkodHJ1ZSk7XG4gICAgY29uc3QgcmVzID0gc2VhcmNoVGVybUV4aXN0c1xuICAgICAgPyBhd2FpdCB0aGlzLnNlcnZlci5nZXQoXG4gICAgICAgIGBHZXRUYXNrVXNlcldpdGhQYXJhbS8ke3RoaXMuY3VycmVudFNlYXJjaFRlcm0udHJpbSgpfS8wLyR7dGhpcy5wYWdlU2l6ZVxuICAgICAgICB9YCxcbiAgICAgICAgdGhpcy5lbnZTdmMuZW52aXJvbm1lbnQuV29ya0Zsb3dBUElcbiAgICAgIClcbiAgICAgIDogYXdhaXQgdGhpcy5zZXJ2ZXIucG9zdChcbiAgICAgICAgc29ydFBhcmFtXG4gICAgICAgICAgPyBgU2VhcmNoVGFza1VzZXJzLzAvJHt0aGlzLnBhZ2VTaXplfS8ke3NvcnRQYXJhbS5QYXJhbX0vJHtzb3J0UGFyYW0uT3JkZXJ9YFxuICAgICAgICAgIDogYFNlYXJjaFRhc2tVc2Vycy8wLyR7dGhpcy5wYWdlU2l6ZX1gLFxuICAgICAgICBwYXlsb2FkLFxuICAgICAgICB0aGlzLmVudlN2Yy5lbnZpcm9ubWVudC5Xb3JrRmxvd0FQSVxuICAgICAgKTtcbiAgICB0aGlzLnV0aWxTZXJ2aWNlLnNlbmRCSShmYWxzZSk7XG4gICAgaWYgKHJlcyBpbnN0YW5jZW9mIEVycm9yUmVzcG9uc2UpIHtcbiAgICAgIHRoaXMuY3VycmVudEZpbHRlcnMgPSBbXTtcbiAgICAgIHRoaXMuY3VycmVudFNvcnRzID0gW107XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnBhZ2VTdGF0ZSA9IHJlcyBhcyBQYWdlZFJlc3VsdDxGb3JtRW50aXR5PjtcbiAgICAgIHZhciByZXN1bHQgPSAocmVzIGFzIFBhZ2VkUmVzdWx0PEZvcm1FbnRpdHk+KS5SZXN1bHQ7XG4gICAgICB0aGlzLmRhdGEgPSByZXN1bHQubWFwKCh4KSA9PiB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgLi4ueCxcbiAgICAgICAgICBpZDogeC5JZCxcbiAgICAgICAgfTtcbiAgICAgIH0pO1xuICAgICAgdGhpcy5zZXRVcENhcmREYXRhKCk7XG4gICAgfVxuICB9XG4gIGFzeW5jIGxvYWRNb3JlRmlsdGVyc0FuZFNvcnRzKCk6IFByb21pc2U8XG4gICAgUGFnZWRSZXN1bHQ8Rm9ybUVudGl0eT4gfCB1bmRlZmluZWRcbiAgPiB7XG4gICAgaWYgKCF0aGlzLnBhZ2VTdGF0ZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB2YXIgcGF5bG9hZDogU2VhcmNoUHJvcGVydHlWYWx1ZVtdID0gdGhpcy5jdXJyZW50RmlsdGVycy5tYXAoKHgpID0+IHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIFByb3BlcnR5TmFtZTpcbiAgICAgICAgICBUYXNrVXNlclByb3BlcnR5TWFwW3gubmFtZSBhcyBrZXlvZiB0eXBlb2YgVGFza1VzZXJQcm9wZXJ0eU1hcF0sXG4gICAgICAgIEVudGl0eVZhbHVlOiB4LnZhbHVlLFxuICAgICAgICBPcGVyYXRvcjogU2VhcmNoT3BlcmF0b3IuQW5kLFxuICAgICAgICBTaWduOlxuICAgICAgICAgIHguY29uZGl0aW9uICYmIE9iamVjdC5rZXlzKEZpbHRlclR5cGVzKS5pbmNsdWRlcyh4LmNvbmRpdGlvbilcbiAgICAgICAgICAgID8gKEZpbHRlclR5cGVzW1xuICAgICAgICAgICAgICB4LmNvbmRpdGlvbiBhcyBrZXlvZiB0eXBlb2YgRmlsdGVyVHlwZXNcbiAgICAgICAgICAgIF0gYXMgdW5rbm93biBhcyBTZWFyY2hQcm9wZXJ0eVNpZ24pXG4gICAgICAgICAgICA6IFNlYXJjaFByb3BlcnR5U2lnbi5FUSxcbiAgICAgICAgVHlwZTpcbiAgICAgICAgICB4Lm5hbWUgPT0gVGFza1VzZXJQcm9wZXJ0eU5hbWUuRGF0ZVxuICAgICAgICAgICAgPyBTZWFyY2hQcm9wZXJ0eVZhbHVlVHlwZS5EYXRlXG4gICAgICAgICAgICA6IFNlYXJjaFByb3BlcnR5VmFsdWVUeXBlLlN0cmluZyxcbiAgICAgIH07XG4gICAgfSk7XG4gICAgY29uc3Qgc29ydFBhcmFtOiB7IFBhcmFtOiBzdHJpbmc7IE9yZGVyOiBzdHJpbmcgfSB8IG51bGwgPVxuICAgICAgdGhpcy5jdXJyZW50U29ydHMubGVuZ3RoID4gMFxuICAgICAgICA/IHtcbiAgICAgICAgICBQYXJhbTpcbiAgICAgICAgICAgIFRhc2tVc2VyUHJvcGVydHlNYXBbXG4gICAgICAgICAgICB0aGlzLmN1cnJlbnRTb3J0c1swXS5uYW1lIGFzIGtleW9mIHR5cGVvZiBUYXNrVXNlclByb3BlcnR5TWFwXG4gICAgICAgICAgICBdLFxuICAgICAgICAgIE9yZGVyOiB0aGlzLmN1cnJlbnRTb3J0c1swXS52YWx1ZSxcbiAgICAgICAgfVxuICAgICAgICA6IG51bGw7XG4gICAgY29uc3Qgc2VhcmNoVGVybUV4aXN0cyA9IHRoaXMuY3VycmVudFNlYXJjaFRlcm0udHJpbSgpLmxlbmd0aCA+IDA7XG4gICAgdGhpcy51dGlsU2VydmljZS5zZW5kQkkodHJ1ZSk7XG4gICAgY29uc3QgcmVzID0gc2VhcmNoVGVybUV4aXN0c1xuICAgICAgPyBhd2FpdCB0aGlzLnNlcnZlci5nZXQoXG4gICAgICAgIGBHZXRUYXNrVXNlcldpdGhQYXJhbS8ke3RoaXMuY3VycmVudFNlYXJjaFRlcm0udHJpbSgpfS8ke3RoaXMucGFnZVN0YXRlLlNraXBcbiAgICAgICAgfS8ke3RoaXMucGFnZVNpemV9YCxcbiAgICAgICAgdGhpcy5lbnZTdmMuZW52aXJvbm1lbnQuV29ya0Zsb3dBUElcbiAgICAgIClcbiAgICAgIDogYXdhaXQgdGhpcy5zZXJ2ZXIucG9zdChcbiAgICAgICAgc29ydFBhcmFtXG4gICAgICAgICAgPyBgU2VhcmNoVGFza1VzZXJzLyR7dGhpcy5wYWdlU3RhdGUuU2tpcH0vJHt0aGlzLnBhZ2VTaXplfS8ke3NvcnRQYXJhbS5QYXJhbX0vJHtzb3J0UGFyYW0uT3JkZXJ9YFxuICAgICAgICAgIDogYFNlYXJjaFRhc2tVc2Vycy8ke3RoaXMucGFnZVN0YXRlLlNraXB9LyR7dGhpcy5wYWdlU2l6ZX1gLFxuICAgICAgICBwYXlsb2FkLFxuICAgICAgICB0aGlzLmVudlN2Yy5lbnZpcm9ubWVudC5Xb3JrRmxvd0FQSVxuICAgICAgKTtcbiAgICB0aGlzLnV0aWxTZXJ2aWNlLnNlbmRCSShmYWxzZSk7XG4gICAgaWYgKHJlcyBpbnN0YW5jZW9mIEVycm9yUmVzcG9uc2UpIHtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfSBlbHNlIHtcbiAgICAgIHZhciByZXN1bHQgPSByZXMgYXMgUGFnZWRSZXN1bHQ8Rm9ybUVudGl0eT47XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbiAgfVxuICBvbkZpbHRlckFwcGxpZWQoYXBwbGllZEZpbHRlcjogSURhdGFGaWx0ZXJbXSkge1xuICAgIGlmIChBcnJheS5pc0FycmF5KGFwcGxpZWRGaWx0ZXIpKSB7XG4gICAgICB0aGlzLnNlbGVjdGVkRmlsdGVyVGFibGVDb3VudCA9IGFwcGxpZWRGaWx0ZXIubGVuZ3RoO1xuXG4gICAgICB0aGlzLnNob3dGaWx0ZXIgPSBmYWxzZTtcbiAgICAgIGNvbnN0IHF1ZXJ5UGFyYW1zID0gYXBwbGllZEZpbHRlclxuICAgICAgICAuZmlsdGVyKChmaWx0ZXIpID0+IGZpbHRlci5jaGVja2VkKVxuICAgICAgICAubWFwKChmaWx0ZXIpID0+ICh7XG4gICAgICAgICAgUHJvcGVydHlOYW1lOiBmaWx0ZXIubmFtZSxcbiAgICAgICAgICBFbnRpdHlWYWx1ZTogZmlsdGVyLnZhbHVlLFxuICAgICAgICAgIFR5cGU6IGZpbHRlci50eXBlLFxuICAgICAgICAgIE9wZXJhdG9yOiAnQW5kJyxcbiAgICAgICAgICBTaWduOiB0aGlzLmdldENvbmRpdGlvbihmaWx0ZXIuY29uZGl0aW9uKSxcbiAgICAgICAgfSkpO1xuXG4gICAgICB0aGlzLnBvc3RTZWFyY2gocXVlcnlQYXJhbXMpO1xuICAgIH1cbiAgfVxuICBnZXRDb25kaXRpb24odmFsdWU6IGFueSkge1xuICAgIHN3aXRjaCAodmFsdWUpIHtcbiAgICAgIGNhc2UgQ29uZGl0aW9uYWxPcHRpb25zLk9uOlxuICAgICAgICByZXR1cm4gU2VhcmNoUHJvcGVydHlTaWduLkVRO1xuICAgICAgY2FzZSBDb25kaXRpb25hbE9wdGlvbnMuQWZ0ZXI6XG4gICAgICAgIHJldHVybiBTZWFyY2hQcm9wZXJ0eVNpZ24uRVE7XG4gICAgICBjYXNlIENvbmRpdGlvbmFsT3B0aW9ucy5CZWZvcmU6XG4gICAgICAgIHJldHVybiBTZWFyY2hQcm9wZXJ0eVNpZ24uTFQ7XG4gICAgICBjYXNlIENvbmRpdGlvbmFsT3B0aW9ucy5Ob3RFcXVhbDpcbiAgICAgICAgcmV0dXJuIFNlYXJjaFByb3BlcnR5U2lnbi5ORVE7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgfVxuICB9XG4gIG9uU29ydFVwZGF0ZWQodXBkYXRlZFNvcnRzOiBJRGF0YUZpbHRlcltdKSB7XG4gICAgdGhpcy5jdXJyZW50U29ydHMgPSB1cGRhdGVkU29ydHM7XG4gICAgdGhpcy5zaG93U29ydCA9IGZhbHNlO1xuICAgIHRoaXMuc2VsZWN0ZWRTb3J0VGFibGVDb3VudCA9IHVwZGF0ZWRTb3J0cy5sZW5ndGg7XG4gICAgdGhpcy51cGRhdGVGaWx0ZXJzQW5kU29ydHMoKTtcbiAgfVxuXG4gIGhhbmRsZVNlYXJjaChldmVudDogeyBrZXk6IHN0cmluZzsgdmFsdWU6IHN0cmluZyB9KSB7XG4gICAgdGhpcy5zZWFyY2hUZXJtJC5uZXh0KGV2ZW50LnZhbHVlKTtcbiAgfVxuXG4gIGhhbmRsZUV4cG9ydChleHBvcnRlZERhdGE6IFBhcnRpYWw8YW55PltdKSB7XG4gICAgLy8gY29uc29sZS5sb2coJ0V4cG9ydGVkIGRhdGE6JywgZXhwb3J0ZWREYXRhKTtcbiAgICB0aGlzLmRvd25sb2FkQ1NWKGV4cG9ydGVkRGF0YSk7XG4gIH1cbiAgcHJpdmF0ZSBkb3dubG9hZENTVihkYXRhOiBQYXJ0aWFsPGFueT5bXSkge1xuICAgIGNvbnN0IGhlYWRlcnMgPSBPYmplY3Qua2V5cyhkYXRhWzBdKTtcbiAgICBjb25zdCBjc3ZDb250ZW50ID0gW1xuICAgICAgaGVhZGVycy5qb2luKCcsJyksXG4gICAgICAuLi5kYXRhLm1hcCgocm93KSA9PiBoZWFkZXJzLm1hcCgoaGVhZGVyKSA9PiByb3dbaGVhZGVyXSkuam9pbignLCcpKSxcbiAgICBdLmpvaW4oJ1xcbicpO1xuXG4gICAgY29uc3QgYmxvYiA9IG5ldyBCbG9iKFtjc3ZDb250ZW50XSwgeyB0eXBlOiAndGV4dC9jc3Y7Y2hhcnNldD11dGYtODsnIH0pO1xuICAgIGNvbnN0IGxpbmsgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdhJyk7XG4gICAgaWYgKGxpbmsuZG93bmxvYWQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgY29uc3QgdXJsID0gVVJMLmNyZWF0ZU9iamVjdFVSTChibG9iKTtcbiAgICAgIGxpbmsuc2V0QXR0cmlidXRlKCdocmVmJywgdXJsKTtcbiAgICAgIGxpbmsuc2V0QXR0cmlidXRlKCdkb3dubG9hZCcsICdleHBvcnQuY3N2Jyk7XG4gICAgICBsaW5rLnN0eWxlLnZpc2liaWxpdHkgPSAnaGlkZGVuJztcbiAgICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQobGluayk7XG4gICAgICBsaW5rLmNsaWNrKCk7XG4gICAgICBkb2N1bWVudC5ib2R5LnJlbW92ZUNoaWxkKGxpbmspO1xuICAgIH1cbiAgfVxufVxuIiwiPGhlYWRlclxuICBjbGFzcz1cInJvdW5kZWQtbGcgc2hhZG93LWxnIGZsZXgganVzdGlmeS1iZXR3ZWVuIGl0ZW1zLWNlbnRlciBweC02IHB5LTIgYmctWyNENEEwMDc3M11cIlxuPlxuICA8ZGl2IGNsYXNzPVwiZmxleCBpdGVtcy1jZW50ZXIgZ2FwLTEwXCI+XG4gICAgPGg0IGNsYXNzPVwiZm9udC1zZW1pYm9sZFwiPnt7IGZvcm1OYW1lIH19PC9oND5cbiAgICA8c3BhbiBjbGFzcz1cImZsZXggaXRlbXMtY2VudGVyIGdhcC0xXCI+XG4gICAgICBSZWYgSUQ6XG4gICAgICA8c3Bhbj57eyBJZCB9fTwvc3Bhbj5cbiAgICA8L3NwYW4+XG4gIDwvZGl2PlxuICA8ZGl2IGNsYXNzPVwiZmxleCBnYXAtMyBpdGVtcy1jZW50ZXJcIj5cbiAgICA8dmVyYmVuYS1idXR0b25cbiAgICAgIFtwZF09XCInNnB4J1wiXG4gICAgICBjbGFzcz1cInZlcmJlbi1wcmltYXJ5LWJ1dHRvblwiXG4gICAgICAoY2xpY2spPVwic2F2ZUFsbFByb3BlcnRpZXMoKVwiXG4gICAgICB0ZXh0PVwiU2F2ZSBBbGxcIlxuICAgID48L3ZlcmJlbmEtYnV0dG9uPlxuICAgIDx2ZXJiZW4tc3ZnXG4gICAgICAoY2xpY2spPVwiZ29CYWNrKClcIlxuICAgICAgY2xhc3M9XCJjdXJzb3ItcG9pbnRlclwiXG4gICAgICBbd2lkdGhdPVwiMTdcIlxuICAgICAgW2hlaWdodF09XCIxN1wiXG4gICAgICBbaWNvbl09XCInY2xvc2UnXCJcbiAgICA+PC92ZXJiZW4tc3ZnPlxuICA8L2Rpdj5cbjwvaGVhZGVyPlxuPGRpdiAjbWVzc2FnZUxvZyBjbGFzcz1cImZsZXggZmxleC1jb2wgZ2FwLTQgbWVzc2FnZS1sb2ctY29udGFpbmVyXCI+XG4gIDx2ZXJiZW4tZGF0YS12aWV3XG4gICAgI3ZkdlxuICAgIFt2aWV3U3RhdGVdPVwie1xuICAgICAgaXNTZWFyY2g6IHRydWUsXG4gICAgICBpc0NvbHVtbjogdHJ1ZSxcbiAgICAgIGlzRmlsdGVyOiB0cnVlLFxuICAgICAgaXNTb3J0OiB0cnVlLFxuICAgICAgaXNFeHBvcnQ6IHRydWUsXG4gICAgICBpc1NlbGVjdDogdHJ1ZSxcbiAgICAgIGlzQ3JlYXRlOiB0cnVlLFxuICAgICAgaXNUb2dnbGU6IHRydWUsXG4gICAgfVwiXG4gICAgW2J1dHRvbkNsYXNzXT1cIidteS1jdXN0b20tYnV0dG9uLWNsYXNzJ1wiXG4gICAgW2ljb25DbGFzc109XCInbXktaWNvbi1jbGFzcydcIlxuICAgIFtzaG93U29ydENoaWxkXT1cInNob3dTb3J0XCJcbiAgICBbc2hvd0NvbHVtbkNoaWxkXT1cInNob3dDb2x1bW5cIlxuICAgIFthY3RpdmVJY29uQ2xhc3NdPVwiJ215LWFjdGl2ZS1pY29uLWNsYXNzJ1wiXG4gICAgW3NlbGVjdGVkQ29sdW1uQ291bnRdPVwic2VsZWN0ZWRDb2x1bW5UYWJsZUNvdW50XCJcbiAgICBbc2VsZWN0ZWRTb3J0Q291bnRdPVwic2VsZWN0ZWRTb3J0VGFibGVDb3VudFwiXG4gICAgW3NlbGVjdGVkRmlsdGVyVGFibGVDb3VudF09XCJzZWxlY3RlZEZpbHRlclRhYmxlQ291bnRcIlxuICAgIFtzaG93RmlsdGVyQ2hpbGRdPVwic2hvd0ZpbHRlclwiXG4gICAgW3NlYXJjaFZhbHVlXT1cInNlYXJjaFRlcm1cIlxuICAgICh2aWV3Q2hhbmdlKT1cIm9uVmlld0NoYW5nZSgkZXZlbnQpXCJcbiAgICAoc3RhdGVDaGFuZ2UpPVwib25TdGF0ZUNoYW5nZSgkZXZlbnQpXCJcbiAgICAob25TZWFyY2hDaGFuZ2UpPVwib25TZWFyY2goJGV2ZW50KVwiXG4gID5cbiAgICA8ZGl2IGNsYXNzPVwibXQtMlwiIHRhYmxlLWNvbnRlbnQ+XG4gICAgICA8bGliLWRhdGEtdGFibGVcbiAgICAgICAgI2R0XG4gICAgICAgIFtkYXRhXT1cImRhdGFbMF0uUHJvcGVydGllc1wiXG4gICAgICAgIFtjb2x1bW5zXT1cInZpc2libGVDb2x1bW5EZWZcIlxuICAgICAgICBbc3R5bGVDb25maWddPVwic3R5bGVzXCJcbiAgICAgICAgKHNlbGVjdGlvbkNoYW5nZSk9XCJvblNlbGVjdGlvbkNoYW5nZSgkZXZlbnQpXCJcbiAgICAgID5cbiAgICAgICAgPG5nLWNvbnRhaW5lciBsaWJDb2x1bW49XCJzZWxlY3RcIj5cbiAgICAgICAgICA8bmctdGVtcGxhdGVcbiAgICAgICAgICAgICNjZWxsXG4gICAgICAgICAgICBsZXQtaXNTZWxlY3RlZD1cImlzU2VsZWN0ZWRcIlxuICAgICAgICAgICAgbGV0LXRvZ2dsZVJvd1NlbGVjdGlvbj1cInRvZ2dsZVJvd1NlbGVjdGlvblwiXG4gICAgICAgICAgPlxuICAgICAgICAgICAgPGlucHV0XG4gICAgICAgICAgICAgIHR5cGU9XCJjaGVja2JveFwiXG4gICAgICAgICAgICAgIFtjaGVja2VkXT1cImlzU2VsZWN0ZWRcIlxuICAgICAgICAgICAgICAoY2hhbmdlKT1cInRvZ2dsZVJvd1NlbGVjdGlvbigpXCJcbiAgICAgICAgICAgIC8+XG4gICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgICA8bmctdGVtcGxhdGVcbiAgICAgICAgICAgICNoZWFkZXJcbiAgICAgICAgICAgIGxldC1hbGxSb3dzU2VsZWN0ZWQ9XCJhbGxSb3dzU2VsZWN0ZWRcIlxuICAgICAgICAgICAgbGV0LXNvbWVSb3dzU2VsZWN0ZWQ9XCJzb21lUm93c1NlbGVjdGVkXCJcbiAgICAgICAgICAgIGxldC10b2dnbGVBbGxSb3dzPVwidG9nZ2xlQWxsUm93c1wiXG4gICAgICAgICAgPlxuICAgICAgICAgICAgPGlucHV0XG4gICAgICAgICAgICAgIHR5cGU9XCJjaGVja2JveFwiXG4gICAgICAgICAgICAgIFtjaGVja2VkXT1cImFsbFJvd3NTZWxlY3RlZCgpXCJcbiAgICAgICAgICAgICAgW2luZGV0ZXJtaW5hdGVdPVwic29tZVJvd3NTZWxlY3RlZCgpXCJcbiAgICAgICAgICAgICAgKGNoYW5nZSk9XCJ0b2dnbGVBbGxSb3dzKClcIlxuICAgICAgICAgICAgLz5cbiAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPG5nLWNvbnRhaW5lciBsaWJDb2x1bW49XCJuYW1lXCI+XG4gICAgICAgICAgPG5nLXRlbXBsYXRlICNjZWxsIGxldC1yb3c9XCJyb3dcIiBsZXQtdmFsdWU+XG4gICAgICAgICAgICB7eyB2YWx1ZS5OYW1lIH19XG4gICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgICA8bmctdGVtcGxhdGVcbiAgICAgICAgICAgICNjZWxsRWRpdFxuICAgICAgICAgICAgbGV0LXJvdz1cInJvd1wiXG4gICAgICAgICAgICBsZXQtdXBkYXRlVmFsdWU9XCJ1cGRhdGVWYWx1ZVwiXG4gICAgICAgICAgICBsZXQtdmFsdWVcbiAgICAgICAgICA+XG4gICAgICAgICAgICA8dmVyYmVuYS1pbnB1dFxuICAgICAgICAgICAgICBpbnB1dENvbnRhaW5lckNsYXNzPVwidy1maXRcIlxuICAgICAgICAgICAgICBbKG5nTW9kZWwpXT1cInJvdy5OYW1lXCJcbiAgICAgICAgICAgID48L3ZlcmJlbmEtaW5wdXQ+XG4gICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgIDxuZy1jb250YWluZXIgbGliQ29sdW1uPVwicHJvcGVydHlOYW1lXCI+XG4gICAgICAgICAgPG5nLXRlbXBsYXRlICNjZWxsIGxldC1yb3c9XCJyb3dcIiBsZXQtdmFsdWU+XG4gICAgICAgICAgICB7eyByb3cuUHJvcGVydHlOYW1lIH19XG4gICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgICA8bmctdGVtcGxhdGVcbiAgICAgICAgICAgICNjZWxsRWRpdFxuICAgICAgICAgICAgbGV0LXJvdz1cInJvd1wiXG4gICAgICAgICAgICBsZXQtdXBkYXRlVmFsdWU9XCJ1cGRhdGVWYWx1ZVwiXG4gICAgICAgICAgICBsZXQtdmFsdWVcbiAgICAgICAgICA+XG4gICAgICAgICAgICA8dmVyYmVuYS1pbnB1dFxuICAgICAgICAgICAgICAoa2V5ZG93bik9XCJvbktleURvd24oJGV2ZW50LCByb3cpXCJcbiAgICAgICAgICAgICAgKHBhc3RlKT1cIm9uUGFzdGUoJGV2ZW50LCByb3cpXCJcbiAgICAgICAgICAgICAgKGlucHV0KT1cIm9uSW5wdXQoJGV2ZW50LCByb3cpXCJcbiAgICAgICAgICAgICAgaW5wdXRDb250YWluZXJDbGFzcz1cInctZml0XCJcbiAgICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJyb3cuUHJvcGVydHlOYW1lXCJcbiAgICAgICAgICAgID48L3ZlcmJlbmEtaW5wdXQ+XG4gICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgIDxuZy1jb250YWluZXIgbGliQ29sdW1uPVwibWluVmFsdWVcIj5cbiAgICAgICAgICA8bmctdGVtcGxhdGUgI2NlbGwgbGV0LXJvdz1cInJvd1wiIGxldC12YWx1ZT5cbiAgICAgICAgICAgIHt7IHZhbHVlIH19XG4gICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgICA8bmctdGVtcGxhdGVcbiAgICAgICAgICAgICNjZWxsRWRpdFxuICAgICAgICAgICAgbGV0LXJvdz1cInJvd1wiXG4gICAgICAgICAgICBsZXQtdXBkYXRlVmFsdWU9XCJ1cGRhdGVWYWx1ZVwiXG4gICAgICAgICAgICBsZXQtdmFsdWVcbiAgICAgICAgICA+XG4gICAgICAgICAgICA8dmVyYmVuYS1pbnB1dFxuICAgICAgICAgICAgICBbdHlwZV09XCInbnVtYmVyJ1wiXG4gICAgICAgICAgICAgIFtuZ01vZGVsXT1cImdldFN0cmluZ1ZhbHVlKHJvdywgJ01pblZhbHVlJylcIlxuICAgICAgICAgICAgICAodmFsdWVDaGFuZ2UpPVwiY29udmVydFRvSW50KCRldmVudCwgcm93LCAnTWluVmFsdWUnKVwiXG4gICAgICAgICAgICAgIGlucHV0Q29udGFpbmVyQ2xhc3M9XCJ3LVsxMzBweF1cIlxuICAgICAgICAgICAgPjwvdmVyYmVuYS1pbnB1dD5cbiAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPG5nLWNvbnRhaW5lciBsaWJDb2x1bW49XCJtYXhWYWx1ZVwiPlxuICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjY2VsbCBsZXQtcm93PVwicm93XCIgbGV0LXZhbHVlPlxuICAgICAgICAgICAge3sgdmFsdWUgfX1cbiAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICAgIDxuZy10ZW1wbGF0ZVxuICAgICAgICAgICAgI2NlbGxFZGl0XG4gICAgICAgICAgICBsZXQtcm93PVwicm93XCJcbiAgICAgICAgICAgIGxldC11cGRhdGVWYWx1ZT1cInVwZGF0ZVZhbHVlXCJcbiAgICAgICAgICAgIGxldC12YWx1ZVxuICAgICAgICAgID5cbiAgICAgICAgICAgIDx2ZXJiZW5hLWlucHV0XG4gICAgICAgICAgICAgIFt0eXBlXT1cIidudW1iZXInXCJcbiAgICAgICAgICAgICAgaW5wdXRDb250YWluZXJDbGFzcz1cInctWzEzMHB4XVwiXG4gICAgICAgICAgICAgIFtuZ01vZGVsXT1cImdldFN0cmluZ1ZhbHVlKHJvdywgJ01heFZhbHVlJylcIlxuICAgICAgICAgICAgICAodmFsdWVDaGFuZ2UpPVwiY29udmVydFRvSW50KCRldmVudCwgcm93LCAnTWF4VmFsdWUnKVwiXG4gICAgICAgICAgICA+PC92ZXJiZW5hLWlucHV0PlxuICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICA8bmctY29udGFpbmVyIGxpYkNvbHVtbj1cImRlZmF1bHRWYWx1ZVwiPlxuICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjY2VsbCBsZXQtcm93PVwicm93XCIgbGV0LXZhbHVlPlxuICAgICAgICAgICAge3sgdmFsdWUgfX1cbiAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICAgIDxuZy10ZW1wbGF0ZVxuICAgICAgICAgICAgI2NlbGxFZGl0XG4gICAgICAgICAgICBsZXQtcm93PVwicm93XCJcbiAgICAgICAgICAgIGxldC11cGRhdGVWYWx1ZT1cInVwZGF0ZVZhbHVlXCJcbiAgICAgICAgICAgIGxldC12YWx1ZVxuICAgICAgICAgID5cbiAgICAgICAgICAgIDx2ZXJiZW5hLWlucHV0XG4gICAgICAgICAgICAgIFt0eXBlXT1cIid0ZXh0J1wiXG4gICAgICAgICAgICAgIGlucHV0Q29udGFpbmVyQ2xhc3M9XCJ3LVsxMzBweF1cIlxuICAgICAgICAgICAgICBbKG5nTW9kZWwpXT1cInJvdy5EZWZhdWx0VmFsdWVcIlxuICAgICAgICAgICAgPjwvdmVyYmVuYS1pbnB1dD5cbiAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPG5nLWNvbnRhaW5lciBsaWJDb2x1bW49XCJkYXRhVHlwZVwiPlxuICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjY2VsbCBsZXQtcm93PVwicm93XCIgbGV0LXZhbHVlPlxuICAgICAgICAgICAge3sgdmFsdWUgfX1cbiAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICAgIDxuZy10ZW1wbGF0ZVxuICAgICAgICAgICAgI2NlbGxFZGl0XG4gICAgICAgICAgICBsZXQtcm93PVwicm93XCJcbiAgICAgICAgICAgIGxldC11cGRhdGVWYWx1ZT1cInVwZGF0ZVZhbHVlXCJcbiAgICAgICAgICAgIGxldC12YWx1ZVxuICAgICAgICAgID5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtY29sIGdhcC0xXCI+XG4gICAgICAgICAgICAgIDx2ZXJiZW4tZHJvcC1kb3duXG4gICAgICAgICAgICAgICAgd2lkdGg9XCIxMDAlXCJcbiAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcj1cIkNoYW5nZSBEYXRhIFR5cGVcIlxuICAgICAgICAgICAgICAgIFsob3B0aW9ucyldPVwiZGF0YVR5cGVcIlxuICAgICAgICAgICAgICAgIFsobmdNb2RlbCldPVwicm93LkRhdGFUeXBlXCJcbiAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICA8L3ZlcmJlbi1kcm9wLWRvd24+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgICA8bmctY29udGFpbmVyIGxpYkNvbHVtbj1cImlzUmVxdWlyZWRcIj5cbiAgICAgICAgICA8bmctdGVtcGxhdGUgI2NlbGwgbGV0LXJvdz1cInJvd1wiIGxldC12YWx1ZT5cbiAgICAgICAgICAgIDx2ZXJiZW4tc3ZnICpuZ0lmPVwidmFsdWUgPT09IHRydWVcIiBbaWNvbl09XCInY2hlY2snXCI+PC92ZXJiZW4tc3ZnPlxuICAgICAgICAgICAgPHZlcmJlbi1zdmcgKm5nSWY9XCJ2YWx1ZSA9PT0gZmFsc2VcIiBbaWNvbl09XCInZXJyb3InXCI+PC92ZXJiZW4tc3ZnPlxuICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgICAgPG5nLXRlbXBsYXRlXG4gICAgICAgICAgICAjY2VsbEVkaXRcbiAgICAgICAgICAgIGxldC1yb3c9XCJyb3dcIlxuICAgICAgICAgICAgbGV0LXVwZGF0ZVZhbHVlPVwidXBkYXRlVmFsdWVcIlxuICAgICAgICAgICAgbGV0LXZhbHVlXG4gICAgICAgICAgPlxuICAgICAgICAgICAgPHZlcmJlbmEtc3dpdGNoXG4gICAgICAgICAgICAgIFtvbkNvbG9yXT1cIicjMUEyMzdFJ1wiXG4gICAgICAgICAgICAgIFsobmdNb2RlbCldPVwicm93LklzUmVxdWlyZWRcIlxuICAgICAgICAgICAgPjwvdmVyYmVuYS1zd2l0Y2g+XG4gICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgICAgPG5nLWNvbnRhaW5lciBsaWJDb2x1bW49XCJpc1JlYWRPbmx5XCI+XG4gICAgICAgICAgPG5nLXRlbXBsYXRlICNjZWxsIGxldC1yb3c9XCJyb3dcIiBsZXQtdmFsdWU+XG4gICAgICAgICAgICA8dmVyYmVuLXN2ZyAqbmdJZj1cInZhbHVlID09PSB0cnVlXCIgW2ljb25dPVwiJ2NoZWNrJ1wiPjwvdmVyYmVuLXN2Zz5cbiAgICAgICAgICAgIDx2ZXJiZW4tc3ZnICpuZ0lmPVwidmFsdWUgPT09IGZhbHNlXCIgW2ljb25dPVwiJ2Vycm9yJ1wiPjwvdmVyYmVuLXN2Zz5cbiAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICAgIDxuZy10ZW1wbGF0ZVxuICAgICAgICAgICAgI2NlbGxFZGl0XG4gICAgICAgICAgICBsZXQtcm93PVwicm93XCJcbiAgICAgICAgICAgIGxldC11cGRhdGVWYWx1ZT1cInVwZGF0ZVZhbHVlXCJcbiAgICAgICAgICAgIGxldC12YWx1ZVxuICAgICAgICAgID5cbiAgICAgICAgICAgIDx2ZXJiZW5hLXN3aXRjaFxuICAgICAgICAgICAgICBbb25Db2xvcl09XCInIzFBMjM3RSdcIlxuICAgICAgICAgICAgICBbKG5nTW9kZWwpXT1cInJvdy5Jc1JlYWRPbmx5XCJcbiAgICAgICAgICAgID48L3ZlcmJlbmEtc3dpdGNoPlxuICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgICAgIDxuZy1jb250YWluZXIgbGliQ29sdW1uPVwiYWN0aW9uc1wiPlxuICAgICAgICAgIDxuZy10ZW1wbGF0ZVxuICAgICAgICAgICAgI2NlbGxcbiAgICAgICAgICAgIGxldC1pc0VkaXRpbmc9XCJpc0VkaXRpbmdcIlxuICAgICAgICAgICAgbGV0LXRvZ2dsZVJvd0VkaXQ9XCJ0b2dnbGVSb3dFZGl0XCJcbiAgICAgICAgICAgIGxldC1yb3c9XCJyb3dcIlxuICAgICAgICAgICAgbGV0LXZhbHVlXG4gICAgICAgICAgPlxuICAgICAgICAgICAgPHZlcmJlbi1wb3AtVXBcbiAgICAgICAgICAgICAgW2N1c3RvbVN0eWxlc109XCJ7ICd6LWluZGV4JzogJzk5JyB9XCJcbiAgICAgICAgICAgICAgW2Ryb3Bkb3duT3Blbl09XCJvcGVuRHJvcGRvd25JZCA9PT0gcm93LmlkXCJcbiAgICAgICAgICAgICAgW2VuYWJsZU1vdXNlTGVhdmVdPVwiZmFsc2VcIlxuICAgICAgICAgICAgICAoY2xvc2UpPVwib25DbG9zZSgpXCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgPHZlcmJlbi1zdmdcbiAgICAgICAgICAgICAgICBjbGFzcz1cImN1cnNvci1wb2ludGVyIGFjdGlvbnMtaWNvblwiXG4gICAgICAgICAgICAgICAgKGNsaWNrKT1cIm9wZW5Ecm9wZG93bihyb3cpXCJcbiAgICAgICAgICAgICAgICBkcm9wZG93bi10cmlnZ2VyXG4gICAgICAgICAgICAgICAgaWNvbj1cImxpc3RcIlxuICAgICAgICAgICAgICA+PC92ZXJiZW4tc3ZnPlxuICAgICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgY2xhc3M9XCJwb3AtdXAtY29udGVudCBmbGV4IGZsZXgtY29sXCJcbiAgICAgICAgICAgICAgICAqbmdJZj1cIm9wZW5Ecm9wZG93bklkID09PSByb3cuSWRcIlxuICAgICAgICAgICAgICAgIGRyb3Bkb3duLWNvbnRlbnRcbiAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgICAgIChjbGljayk9XCJ0b2dnbGVSb3dFZGl0KClcIlxuICAgICAgICAgICAgICAgICAgY2xhc3M9XCJwb3AtdXAtdmFsdWUgY3Vyc29yLXBvaW50ZXJcIlxuICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgIEVkaXRcbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgICAoY2xpY2spPVwiZGVsZXRlUHJvcGVydHkocm93LklkKVwiXG4gICAgICAgICAgICAgICAgICBjbGFzcz1cInBvcC11cC12YWx1ZSBjdXJzb3ItcG9pbnRlclwiXG4gICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgRGVsZXRlXG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC92ZXJiZW4tcG9wLVVwPlxuICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgICAgPG5nLXRlbXBsYXRlXG4gICAgICAgICAgICAjY2VsbEVkaXRcbiAgICAgICAgICAgIGxldC1pc0VkaXRpbmc9XCJpc0VkaXRpbmdcIlxuICAgICAgICAgICAgbGV0LXRvZ2dsZVJvd0VkaXQ9XCJ0b2dnbGVSb3dFZGl0XCJcbiAgICAgICAgICAgIGxldC1yb3c9XCJyb3dcIlxuICAgICAgICAgICAgbGV0LXZhbHVlXG4gICAgICAgICAgPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggZ2FwLTIgaXRlbXMtY2VudGVyXCI+XG4gICAgICAgICAgICAgIDx2ZXJiZW4tc3ZnXG4gICAgICAgICAgICAgICAgaWNvbj1cImNoZWNrXCJcbiAgICAgICAgICAgICAgICBbd2lkdGhdPVwiMTVcIlxuICAgICAgICAgICAgICAgIFtoZWlnaHRdPVwiMTVcIlxuICAgICAgICAgICAgICAgIChjbGljayk9XCJzYXZlVmlhVGFibGUocm93LCB0b2dnbGVSb3dFZGl0KVwiXG4gICAgICAgICAgICAgID48L3ZlcmJlbi1zdmc+XG4gICAgICAgICAgICAgIDx2ZXJiZW4tc3ZnXG4gICAgICAgICAgICAgICAgKGNsaWNrKT1cInRvZ2dsZVJvd0VkaXQoKTsgZGVsZXRlUHJvcGVydHkocm93LklkKVwiXG4gICAgICAgICAgICAgICAgaWNvbj1cImRlbGV0ZVwiXG4gICAgICAgICAgICAgICAgW3dpZHRoXT1cIjE1XCJcbiAgICAgICAgICAgICAgICBbaGVpZ2h0XT1cIjE1XCJcbiAgICAgICAgICAgICAgPjwvdmVyYmVuLXN2Zz5cbiAgICAgICAgICAgICAgPHZlcmJlbi1zdmdcbiAgICAgICAgICAgICAgICBpY29uPVwiY2FyZFZpZXdBbHRcIlxuICAgICAgICAgICAgICAgIFt3aWR0aF09XCIxNVwiXG4gICAgICAgICAgICAgICAgW2hlaWdodF09XCIxNVwiXG4gICAgICAgICAgICAgICAgKGNsaWNrKT1cImdvVG9DYXJkVmlldyh2YWx1ZSlcIlxuICAgICAgICAgICAgICA+PC92ZXJiZW4tc3ZnPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICA8L2xpYi1kYXRhLXRhYmxlPlxuICAgIDwvZGl2PlxuICAgIDxkaXYgY2FyZC1jb250ZW50PlxuICAgICAgPHZlcmJlbi1jYXJkLWRhdGEtdmlld1xuICAgICAgICBib3JkZXJSYWRpdXM9XCIxMnB4XCJcbiAgICAgICAgI3ZkY3ZcbiAgICAgICAgZGF0YUlkPVwiSWRcIlxuICAgICAgICBib3JkZXI9XCI1cHhcIlxuICAgICAgICBbY2FyZERhdGFMaXN0XT1cImNhcmREYXRhXCJcbiAgICAgICAgcmJnQ29sb3I9XCIjZjVmNmY5XCJcbiAgICAgICAgbWc9XCIwcHhcIlxuICAgICAgPlxuICAgICAgICA8dmVyYmVuLWxlZnQtY2FyZC1kYXRhLXZpZXcgY2xhc3M9XCJzcGFjZS15LTdcIj5cbiAgICAgICAgICA8dmVyYmVuLWxlZnQtY2FyZC1kYXRhXG4gICAgICAgICAgICAjdmxjZFxuICAgICAgICAgICAgW3BhcmVudF09XCJ2ZGN2XCJcbiAgICAgICAgICAgIGRhdGFJZD1cImlkXCJcbiAgICAgICAgICAgIGNsYXNzPVwiYmctc2Vjb25kYXJ5LTEwMCByb3VuZGVkLXhsIGJvcmRlci1wcmltYXJ5IGJvcmRlci1bMXB4XVwiXG4gICAgICAgICAgICBbY2FyZERhdGFMaXN0XT1cImNhcmREYXRhXCJcbiAgICAgICAgICA+XG4gICAgICAgICAgICA8bmctdGVtcGxhdGUgI2NhcmQgbGV0LWl0ZW0+XG4gICAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgICAoY2xpY2spPVwidXNlckNhcmRDbGlja2VkKGl0ZW0pXCJcbiAgICAgICAgICAgICAgICBjbGFzcz1cImZsZXggY3Vyc29yLXBvaW50ZXIgaC1bbWF4LWNvbnRlbnRdXCJcbiAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgIDwhLS0gPHZlcmJlbi1zdmcgW3dpZHRoXT1cIjE1XCIgW2hlaWdodF09XCIxNVwiIChjbGljayk9XCJ0b2dnbGVDaGlsZHJlbihpdGVtKTsgJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpXCJcbiAgICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwiaXRlbS5jaGlsZHJlbiAmJiBpdGVtLmNoaWxkcmVuLmxlbmd0aD8ndmlzaWJsZSc6J2ludmlzaWJsZSdcIlxuICAgICAgICAgICAgICAgICAgICBjbGFzcz1cIml0ZW1zLWNlbnRlciBmbGV4ICBwci0xIGN1cnNvci1wb2ludGVyXCIgW2ljb25dPVwiaXRlbS5pc0NoaWxkcmVuRXhwYW5kZWQ/J21pbnVzJzoncGx1cydcIiAvPiAtLT5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCB3LWZ1bGwgYmctc2Vjb25kYXJ5IHJvdW5kZWQteGxcIj5cbiAgICAgICAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJ3LTMgcm91bmRlZC14bCByb3VuZGVkLXRyLW5vbmUgcm91bmRlZC1ici1ub25lXCJcbiAgICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwiXG4gICAgICAgICAgICAgICAgICAgICAgaXRlbS5zZWxlY3RlZCA/ICdiZy1wcmltYXJ5JyA6ICdiZy1zZWNvbmRhcnktMjAwJ1xuICAgICAgICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgICAgICAgPjwvZGl2PlxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInB5LTMgcHgtNCBmbGV4LTEgaC1bMTAwJV1cIj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZmxleCBpdGVtcy1zdGFydCBmbGV4LTEgZ2FwLTEganVzdGlmeS1iZXR3ZWVuIGgtWzEwMCVdXCJcbiAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZmxleCBmbGV4LWNvbCBmbGV4LTEgY2FyZC1taW4taGVpZ2h0IGp1c3RpZnktYmV0d2VlbiBoLVsxMDAlXVwiXG4gICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXgganVzdGlmeS1iZXR3ZWVuIG1yLTRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aDNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwibXktMCBmb250LWJvbGQgdGV4dC1bIzQwNDA0MF0gbGVhZGluZy1bMTkuNXB4XVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3sgaXRlbS5kYXRhLk5hbWUgfX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2gzPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZmxleCBpdGVtcy1jZW50ZXIgZ2FwLTEgbXQtMlwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCIhdGV4dC1bMTBweF0gdGV4dC1bIzQwNDA0MF1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA+RGF0YSBUeXBlOjwvc3BhblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCIhdGV4dC1bMTNweF0gZm9udC1ib2xkXCI+e3tcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlbS5kYXRhLkRhdGFUeXBlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSA8c3BhbiBjbGFzcz1cIiF0ZXh0LVsxMHB4XSB0ZXh0LVsjNDA0MDQwXVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA+RGVmYXVsdCBWYWx1ZTo8L3NwYW5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHAgY2xhc3M9XCIhdGV4dC1bMTJweF1cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7IGl0ZW0uZGF0YS5EZWZhdWx0VmFsdWUgfX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3A+IC0tPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICAgICAgICAgICAgPCEtLSA8ZGl2IGNsYXNzPVwiZmxleCBpdGVtcy1lbmQgaC1bMTAwJV1cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJlbnVtLXZhbCB7e2l0ZW0uZGF0YS5TdGF0dXN9fVwiPnt7aXRlbS5kYXRhLlN0YXR1c319PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+IC0tPlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgICAgPC92ZXJiZW4tbGVmdC1jYXJkLWRhdGE+XG4gICAgICAgIDwvdmVyYmVuLWxlZnQtY2FyZC1kYXRhLXZpZXc+XG4gICAgICAgIDx2ZXJiZW4tcmlnaHQtY2FyZC1kYXRhLXZpZXc+XG4gICAgICAgICAgPG5nLXRlbXBsYXRlICNwYXJlbnQ+XG4gICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICpuZ0lmPVwiY3VycmVudERhdGFcIlxuICAgICAgICAgICAgICBjbGFzcz1cImZsZXggZmxleC1jb2wgcm91bmRlZC14bCBoLWZ1bGwgdy1mdWxsIHJlbGF0aXZlIGdhcC02XCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgPHZlcmJlbmEtaW5wdXRcbiAgICAgICAgICAgICAgICBuYW1lPVwiTmFtZVwiXG4gICAgICAgICAgICAgICAgbGFiZWw9XCJOYW1lXCJcbiAgICAgICAgICAgICAgICBbKG5nTW9kZWwpXT1cImN1cnJlbnREYXRhLmRhdGEuTmFtZVwiXG4gICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgIDx2ZXJiZW5hLWlucHV0XG4gICAgICAgICAgICAgICAgbmFtZT1cIk5hbWVcIlxuICAgICAgICAgICAgICAgIGxhYmVsPVwiUHJvcGVydHkgTmFtZVwiXG4gICAgICAgICAgICAgICAgKGtleWRvd24pPVwib25LZXlEb3duKCRldmVudCwgY3VycmVudERhdGEuZGF0YSlcIlxuICAgICAgICAgICAgICAgIChwYXN0ZSk9XCJvblBhc3RlKCRldmVudCwgY3VycmVudERhdGEuZGF0YSlcIlxuICAgICAgICAgICAgICAgIChpbnB1dCk9XCJvbklucHV0KCRldmVudCwgY3VycmVudERhdGEuZGF0YSlcIlxuICAgICAgICAgICAgICAgIFsobmdNb2RlbCldPVwiY3VycmVudERhdGEuZGF0YS5Qcm9wZXJ0eU5hbWVcIlxuICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBmbGV4LWNvbCBnYXAtMVwiPlxuICAgICAgICAgICAgICAgIDxkaXY+RGF0YSBUeXBlPC9kaXY+XG4gICAgICAgICAgICAgICAgPHZlcmJlbi1kcm9wLWRvd25cbiAgICAgICAgICAgICAgICAgIHdpZHRoPVwiMTAwJVwiXG4gICAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcj1cIkNoYW5nZSBEYXRhIFR5cGVcIlxuICAgICAgICAgICAgICAgICAgWyhvcHRpb25zKV09XCJkYXRhVHlwZVwiXG4gICAgICAgICAgICAgICAgICBbKG5nTW9kZWwpXT1cImN1cnJlbnREYXRhLmRhdGEuRGF0YVR5cGVcIlxuICAgICAgICAgICAgICAgICAgKG5nTW9kZWxDaGFuZ2UpPVwib25Ecm9wRG93bkNoYW5nZSgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgPC92ZXJiZW4tZHJvcC1kb3duPlxuICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgKm5nSWY9XCJcbiAgICAgICAgICAgICAgICAgIGN1cnJlbnREYXRhLmRhdGEuRGF0YVR5cGUgPT09ICdTaW5nbGVTZWxlY3Rpb24nIHx8XG4gICAgICAgICAgICAgICAgICBjdXJyZW50RGF0YS5kYXRhLkRhdGFUeXBlID09PSAnTXVsdGlTZWxlY3Rpb24nXG4gICAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgIDxwIGNsYXNzPVwibWItMlwiPkVudGVyIE9wdGlvbnM8L3A+XG4gICAgICAgICAgICAgICAgPHZlcmJlbi1jaGlwXG4gICAgICAgICAgICAgICAgICBbcGxhY2Vob2xkZXJdPVwiJ0VudGVyIE9wdGlvbnMnXCJcbiAgICAgICAgICAgICAgICAgIFsobmdNb2RlbCldPVwiY2hpcEFycmF5XCJcbiAgICAgICAgICAgICAgICAgIChvbkNoYW5nZSk9XCJvbkNoaXBDaGFuZ2UoJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgPjwvdmVyYmVuLWNoaXA+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgICAgIDx2ZXJiZW5hLWlucHV0XG4gICAgICAgICAgICAgICAgICBbcGxhY2VIb2xkZXJdPVwiJ0VudGVyIGRlZmF1bHQgdGV4dCdcIlxuICAgICAgICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJjdXJyZW50RGF0YS5kYXRhLkRlZmF1bHRWYWx1ZVwiXG4gICAgICAgICAgICAgICAgICBuYW1lPVwiRGVmYXVsdFZhbHVlXCJcbiAgICAgICAgICAgICAgICAgIGxhYmVsPVwiRGVmYXVsdCBWYWx1ZSAob3B0aW9uYWwpXCJcbiAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgICAgICA8cCBjbGFzcz1cIm1iLTJcIj5SZXF1aXJlZDwvcD5cblxuICAgICAgICAgICAgICAgIDx2ZXJiZW5hLXN3aXRjaFxuICAgICAgICAgICAgICAgICAgW29uQ29sb3JdPVwiJyMxQTIzN0UnXCJcbiAgICAgICAgICAgICAgICAgIFsobmdNb2RlbCldPVwiY3VycmVudERhdGEuZGF0YS5Jc1JlcXVpcmVkXCJcbiAgICAgICAgICAgICAgICA+PC92ZXJiZW5hLXN3aXRjaD5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICAgICAgPHAgY2xhc3M9XCJtYi0yXCI+UmVhZCBPbmx5PC9wPlxuXG4gICAgICAgICAgICAgICAgPHZlcmJlbmEtc3dpdGNoXG4gICAgICAgICAgICAgICAgICBbb25Db2xvcl09XCInIzFBMjM3RSdcIlxuICAgICAgICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJjdXJyZW50RGF0YS5kYXRhLklzUmVhZE9ubHlcIlxuICAgICAgICAgICAgICAgID48L3ZlcmJlbmEtc3dpdGNoPlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICAgICpuZ0lmPVwiXG4gICAgICAgICAgICAgICAgICBjdXJyZW50RGF0YS5kYXRhLkRhdGFUeXBlID09PSAnTnVtYmVyJyB8fFxuICAgICAgICAgICAgICAgICAgY3VycmVudERhdGEuZGF0YS5EYXRhVHlwZSA9PT0gJ1RleHQnXG4gICAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgICAgICBjbGFzcz1cImZsZXggZmxleC1jb2wgZ2FwLTZcIlxuICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgPHZlcmJlbmEtaW5wdXRcbiAgICAgICAgICAgICAgICAgIFt0eXBlXT1cIidudW1iZXInXCJcbiAgICAgICAgICAgICAgICAgIG5hbWU9XCJtaW5WYWx1ZVwiXG4gICAgICAgICAgICAgICAgICBsYWJlbD1cIk1pbiBWYWx1ZVwiXG4gICAgICAgICAgICAgICAgICBbbmdNb2RlbF09XCJnZXRTdHJpbmdWYWx1ZShjdXJyZW50RGF0YS5kYXRhLCAnTWluVmFsdWUnKVwiXG4gICAgICAgICAgICAgICAgICAodmFsdWVDaGFuZ2UpPVwiXG4gICAgICAgICAgICAgICAgICAgIGNvbnZlcnRUb0ludCgkZXZlbnQsIGN1cnJlbnREYXRhLmRhdGEsICdNaW5WYWx1ZScpXG4gICAgICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgPHZlcmJlbmEtaW5wdXRcbiAgICAgICAgICAgICAgICAgIFt0eXBlXT1cIidudW1iZXInXCJcbiAgICAgICAgICAgICAgICAgIG5hbWU9XCJtYXhWYWx1ZVwiXG4gICAgICAgICAgICAgICAgICBsYWJlbD1cIk1heCBWYWx1ZVwiXG4gICAgICAgICAgICAgICAgICAobmdNb2RlbENoYW5nZSk9XCJ1cGRhdGVUYWJsZSgpXCJcbiAgICAgICAgICAgICAgICAgIFtuZ01vZGVsXT1cImdldFN0cmluZ1ZhbHVlKGN1cnJlbnREYXRhLmRhdGEsICdNYXhWYWx1ZScpXCJcbiAgICAgICAgICAgICAgICAgICh2YWx1ZUNoYW5nZSk9XCJcbiAgICAgICAgICAgICAgICAgICAgY29udmVydFRvSW50KCRldmVudCwgY3VycmVudERhdGEuZGF0YSwgJ01heFZhbHVlJylcbiAgICAgICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDwhLS0gYnV0dG9ucyAtLT5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXgganVzdGlmeS1iZXR3ZWVuIHctZnVsbCBib3R0b20tOCBsZWZ0LTAgcmlnaHQtMFwiPlxuICAgICAgICAgICAgICAgIDx2ZXJiZW5hLWJ1dHRvblxuICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cImRlbGV0ZVByb3BlcnR5KGN1cnJlbnREYXRhLmRhdGEuSWQpXCJcbiAgICAgICAgICAgICAgICAgIGNsYXNzPVwidmVyYmVuLWRlbGV0ZS1idXR0b25cIlxuICAgICAgICAgICAgICAgICAgdGV4dD1cIkRlbGV0ZVwiXG4gICAgICAgICAgICAgICAgPjwvdmVyYmVuYS1idXR0b24+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggZ2FwLTNcIj5cbiAgICAgICAgICAgICAgICAgIDx2ZXJiZW5hLWJ1dHRvblxuICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInZlcmJlbi1zd2l0Y2gtYnV0dG9uXCJcbiAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cImdvVG9UYWJsZVZpZXcoKVwiXG4gICAgICAgICAgICAgICAgICAgIHRleHQ9XCJTd2l0Y2ggVG8gVGFibGVcIlxuICAgICAgICAgICAgICAgICAgPjwvdmVyYmVuYS1idXR0b24+XG4gICAgICAgICAgICAgICAgICA8IS0tIDx2ZXJiZW5hLWJ1dHRvbiBjbGFzcz1cInZlcmJlbi1wcmltYXJ5LWJ1dHRvblwiIChjbGljayk9XCJzYXZlVXNlcigpXCIgdGV4dD1cIlNhdmVcIj48L3ZlcmJlbmEtYnV0dG9uPiAtLT5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICA8L3ZlcmJlbi1yaWdodC1jYXJkLWRhdGEtdmlldz5cbiAgICAgICAgPCEtLSA8dmVyYmVuLXJpZ2h0LWNhcmQtZGF0YS12aWV3PlxuICAgICAgICAgICAgeWVzaGhoaGhoXG4gICAgICAgICAgPC92ZXJiZW4tcmlnaHQtY2FyZC1kYXRhLXZpZXc+IC0tPlxuXG4gICAgICAgIDx2ZXJiZW4tY2FyZC1kYXRhLXZpZXctZm9vdGVyPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGdhcC0yIGp1c3RpZnktYmV0d2VlblwiPlxuICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICAqbmdJZj1cIiF2ZGN2Lmhhc0N1cnJlbnRJdGVtKClcIlxuICAgICAgICAgICAgICBjbGFzcz1cIm1lc3NhZ2UtbG9nLWJ1dHRvbi1jb250YWluZXIgZmxleCBqdXN0aWZ5LWJldHdlZW5cIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICA8dmVyYmVuYS1idXR0b25cbiAgICAgICAgICAgICAgICBbZm9udFdlaWdodF09XCInYm9sZCdcIlxuICAgICAgICAgICAgICAgIFtiZ0NvbG9yXT1cIicjOEU4RDg3J1wiXG4gICAgICAgICAgICAgICAgW2JvcmRlclJhZGl1c109XCInNHB4J1wiXG4gICAgICAgICAgICAgICAgW3RleHRDb2xvcl09XCInI2ZmZidcIlxuICAgICAgICAgICAgICAgIFt0ZXh0XT1cIidEZWxldGUnXCJcbiAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICA8L3ZlcmJlbmEtYnV0dG9uPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgIGNsYXNzPVwiZmxleCB7e1xuICAgICAgICAgICAgICAgIHZkY3YuaGFzQ3VycmVudEl0ZW0oKSA/ICdmbGV4LTEnIDogJydcbiAgICAgICAgICAgICAgfX0ganVzdGlmeS1lbmQgaXRlbXMtY2VudGVyIGdhcC01XCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJwYWdpbmF0b3ItdGV4dFwiXG4gICAgICAgICAgICAgICAgPnt7IGNhcmREYXRhLmxlbmd0aCB9fSByZWNvcmRzIGxvYWRlZDwvc3BhblxuICAgICAgICAgICAgICA+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC92ZXJiZW4tY2FyZC1kYXRhLXZpZXctZm9vdGVyPlxuICAgICAgPC92ZXJiZW4tY2FyZC1kYXRhLXZpZXc+XG4gICAgPC9kaXY+XG4gICAgPGRpdiBjb2x1bW4tY29udGVudD5cbiAgICAgIDx2ZXJiZW4tdmlzaWJsZS1jb2x1bW5cbiAgICAgICAgKHJlc2V0RmlsdGVyKT1cImdldFByb3BlcnRpZXMoSWQsIHNob3dDb2x1bW4pXCJcbiAgICAgICAgKGNvbHVtbnNVcGRhdGVkKT1cIm9uQ29sdW1uc1VwZGF0ZWQoJGV2ZW50KVwiXG4gICAgICAgIFtib3JkZXJdPVwiJzFweCBzb2xpZCByZ2JhKDIxMiwgMTYwLCA3LCAxKSdcIlxuICAgICAgICBib3JkZXJSYWRpdXM9XCIxMHB4XCJcbiAgICAgICAgYm94U2hhZG93PVwiMnB4IDJweCAycHggMHB4IHNpbHZlclwiXG4gICAgICAgIGJnQ29sb3I9XCJ3aGl0ZVwiXG4gICAgICAgIHdpZHRoPVwiNDAwcHhcIlxuICAgICAgICB0ZXh0Q29sb3I9XCJibGFja1wiXG4gICAgICAgIHBkPVwiMXJlbVwiXG4gICAgICAgIHByaW1hcnlDb2xvcj1cIiNGRkU2ODFcIlxuICAgICAgICBzZWNvbmRhcnlDb2xvcj1cIiMzNDc5RTlcIlxuICAgICAgICBbY29sdW1uc109XCJ2aXNpYmxlQ29sdW1uc1wiXG4gICAgICAgIFtkaXNwbGF5ZWRDb2x1bW5zXT1cIjVcIlxuICAgICAgPjwvdmVyYmVuLXZpc2libGUtY29sdW1uPlxuICAgIDwvZGl2PlxuICAgIDxkaXYgZmlsdGVyLWNvbnRlbnQ+XG4gICAgICA8dmVyYmVuLXRhYmxlLWZpbHRlclxuICAgICAgICAocmVzZXRTb3J0RGF0YSk9XCJnZXRQcm9wZXJ0aWVzKElkLCBzaG93RmlsdGVyKVwiXG4gICAgICAgIChmaWx0ZXJzQXBwbGllZCk9XCJvbkZpbHRlckFwcGxpZWQoJGV2ZW50KVwiXG4gICAgICAgIFtib3JkZXJdPVwiJzFweCBzb2xpZCByZ2JhKDIxMiwgMTYwLCA3LCAxKSdcIlxuICAgICAgICBib3JkZXJSYWRpdXM9XCIxMHB4XCJcbiAgICAgICAgYm94U2hhZG93PVwiMnB4IDJweCAycHggMHB4IHNpbHZlclwiXG4gICAgICAgIGJnQ29sb3I9XCJ3aGl0ZVwiXG4gICAgICAgIHdpZHRoPVwiNDIwcHhcIlxuICAgICAgICB0ZXh0Q29sb3I9XCJibGFja1wiXG4gICAgICAgIHBkPVwiMXJlbVwiXG4gICAgICAgIHByaW1hcnlDb2xvcj1cIiNGRkU2ODFcIlxuICAgICAgICBzZWNvbmRhcnlDb2xvcj1cIiMzNDc5RTlcIlxuICAgICAgICB0ZXJ0aWFyeUNvbG9yPVwiIzQwNDA0MFwiXG4gICAgICAgIFtmaWx0ZXJPcHRpb25zXT1cImZpbHRlckFycmF5XCJcbiAgICAgICAgW21heEZpbHRlckxlbmd0aF09XCIzXCJcbiAgICAgID48L3ZlcmJlbi10YWJsZS1maWx0ZXI+XG4gICAgPC9kaXY+XG4gICAgPGRpdiBzb3J0LWNvbnRlbnQ+XG4gICAgICA8dmVyYmVuLXNvcnQtdGFibGVcbiAgICAgICAgKHJlc2V0U29ydERhdGEpPVwiZ2V0UHJvcGVydGllcyhJZCwgc2hvd1NvcnQpXCJcbiAgICAgICAgKHNlbGVjdGVkT3B0aW9ucyk9XCJvblNvcnRVcGRhdGVkKCRldmVudClcIlxuICAgICAgICBbYm9yZGVyXT1cIicxcHggc29saWQgcmdiYSgyMTIsIDE2MCwgNywgMSknXCJcbiAgICAgICAgYm9yZGVyUmFkaXVzPVwiMTBweFwiXG4gICAgICAgIGJveFNoYWRvdz1cIjJweCAycHggMnB4IDBweCBzaWx2ZXJcIlxuICAgICAgICBiZ0NvbG9yPVwid2hpdGVcIlxuICAgICAgICB3aWR0aD1cIjQwMHB4XCJcbiAgICAgICAgdGV4dENvbG9yPVwiYmxhY2tcIlxuICAgICAgICBwZD1cIjFyZW1cIlxuICAgICAgICBwcmltYXJ5Q29sb3I9XCIjRkZFNjgxXCJcbiAgICAgICAgc2Vjb25kYXJ5Q29sb3I9XCIjMzQ3OUU5XCJcbiAgICAgICAgdGVydGlhcnlDb2xvcj1cIiM0MDQwNDBcIlxuICAgICAgICBbZW5hYmxlRHJhZ0FuZERyb3BdPVwidHJ1ZVwiXG4gICAgICAgIFtzb3J0T3B0aW9uc109XCJzb3J0T3B0aW9uc1wiXG4gICAgICA+PC92ZXJiZW4tc29ydC10YWJsZT5cbiAgICA8L2Rpdj5cbiAgICA8ZGl2IGV4cG9ydC1jb250ZW50PlxuICAgICAgPGxpYi1kYXRhLWV4cG9ydFxuICAgICAgICBbZGF0YV09XCJkYXRhWzBdLlByb3BlcnRpZXNcIlxuICAgICAgICAoZXhwb3J0RGF0YUV2ZW50KT1cImhhbmRsZUV4cG9ydCgkZXZlbnQpXCJcbiAgICAgID5cbiAgICAgIDwvbGliLWRhdGEtZXhwb3J0PlxuICAgIDwvZGl2PlxuICA8L3ZlcmJlbi1kYXRhLXZpZXc+XG4gIDxkaXYgKm5nSWY9XCJ2ZHYuaXNUYWJsZVZpZXdcIiBjbGFzcz1cImZsZXggZ2FwLTIganVzdGlmeS1iZXR3ZWVuXCI+XG4gICAgPGRpdiBjbGFzcz1cIm1lc3NhZ2UtbG9nLWJ1dHRvbi1jb250YWluZXIgZmxleCBqdXN0aWZ5LWJldHdlZW5cIj5cbiAgICAgIDx2ZXJiZW5hLWJ1dHRvblxuICAgICAgICBbZm9udFdlaWdodF09XCInYm9sZCdcIlxuICAgICAgICBbYmdDb2xvcl09XCInIzhFOEQ4NydcIlxuICAgICAgICBbYm9yZGVyUmFkaXVzXT1cIic0cHgnXCJcbiAgICAgICAgW3RleHRDb2xvcl09XCInI2ZmZidcIlxuICAgICAgICBbdGV4dF09XCInRGVsZXRlJ1wiXG4gICAgICA+XG4gICAgICA8L3ZlcmJlbmEtYnV0dG9uPlxuICAgIDwvZGl2PlxuICAgIDxkaXYgY2xhc3M9XCJmbGV4IGp1c3RpZnktZW5kIGl0ZW1zLWNlbnRlciBnYXAtNVwiPlxuICAgICAgPHNwYW4gY2xhc3M9XCJwYWdpbmF0b3ItdGV4dFwiPnt7IGNhcmREYXRhLmxlbmd0aCB9fSByZWNvcmRzIGxvYWRlZDwvc3Bhbj5cbiAgICAgIDxidXR0b24gKGNsaWNrKT1cImxvYWRNb3JlKClcIiBjbGFzcz1cImxvYWQtbW9yZSB2aWV3LWxpbmtzXCI+XG4gICAgICAgIExvYWQgbW9yZVxuICAgICAgPC9idXR0b24+XG4gICAgPC9kaXY+XG4gIDwvZGl2PlxuPC9kaXY+XG48IS0tIDxkaXYgY2xhc3M9XCJ3LVs0MDBweF0gYmctd2hpdGUgcC00IHNoYWRvdy1sZyBib3JkZXJcIj5cbiAgPGZvcm0tY29udHJvbCAgW2RhdGFUeXBlXT1cImRhdGFUeXBlMlwiIFtmb3JtUHJvcGVydGllc109XCJkYXRhWzBdLlByb3BlcnRpZXNcIj48L2Zvcm0tY29udHJvbD5cbjwvZGl2PiAtLT5cbiJdfQ==
941
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZm9ybS1maWVsZHMuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvdmVyYmVuLXdvcmtmbG93LXVpL3NyYy9saWIvY29tcG9uZW50cy9mb3JtLWdyb3VwL2Zvcm0tZmllbGRzL2Zvcm0tZmllbGRzLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3ZlcmJlbi13b3JrZmxvdy11aS9zcmMvbGliL2NvbXBvbmVudHMvZm9ybS1ncm91cC9mb3JtLWZpZWxkcy9mb3JtLWZpZWxkcy5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFDQSxPQUFPLEVBRUwsU0FBUyxFQUVULFlBQVksRUFDWixLQUFLLEVBRUwsTUFBTSxFQUVOLFNBQVMsR0FDVixNQUFNLGVBQWUsQ0FBQztBQUd2QixPQUFPLEVBQUUsWUFBWSxFQUFFLE9BQU8sRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUM3QyxPQUFPLEVBS0wsa0JBQWtCLEVBQ2xCLGNBQWMsRUFLZixNQUFNLGNBQWMsQ0FBQztBQUN0QixPQUFPLEVBQUUsUUFBUSxFQUFFLGFBQWEsRUFBNEIsV0FBVyxFQUFlLGNBQWMsRUFBRSxrQkFBa0IsRUFBdUIsdUJBQXVCLEVBQUUsTUFBTSxFQUFFLE1BQU0sbUNBQW1DLENBQUM7QUFFMU4sT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLHFCQUFxQixDQUFDOzs7Ozs7OztBQUdoRCxJQUFLLG9CQVNKO0FBVEQsV0FBSyxvQkFBb0I7SUFDdkIscUNBQWEsQ0FBQTtJQUNiLHFDQUFhLENBQUE7SUFDYixxQ0FBYSxDQUFBO0lBQ2IsMkNBQW1CLENBQUE7SUFDbkIsbURBQTJCLENBQUE7SUFDM0IseUNBQWlCLENBQUE7SUFDakIsdUNBQWUsQ0FBQTtJQUNmLHlDQUFpQixDQUFBO0FBQ25CLENBQUMsRUFUSSxvQkFBb0IsS0FBcEIsb0JBQW9CLFFBU3hCO0FB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a0JBQWtCO3NCQUExQixLQUFLO2dCQUNJLG9CQUFvQjtzQkFBN0IsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IExvY2F0aW9uIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7XG4gIENoYW5nZURldGVjdG9yUmVmLFxuICBDb21wb25lbnQsXG4gIEVsZW1lbnRSZWYsXG4gIEV2ZW50RW1pdHRlcixcbiAgSW5wdXQsXG4gIE9uSW5pdCxcbiAgT3V0cHV0LFxuICBSZW5kZXJlcjIsXG4gIFZpZXdDaGlsZCxcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBGb3JtQnVpbGRlciB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7IEFjdGl2YXRlZFJvdXRlLCBSb3V0ZXIgfSBmcm9tICdAYW5ndWxhci9yb3V0ZXInO1xuaW1wb3J0IHsgZGVib3VuY2VUaW1lLCBTdWJqZWN0IH0gZnJvbSAncnhqcyc7XG5pbXBvcnQge1xuICBDYXJkRGF0YSxcbiAgQ2FyZERhdGFWaWV3Q29tcG9uZW50LFxuICBDaGlwQ2hhbmdlRXZlbnQsXG4gIENvbHVtbkRlZmluaXRpb24sXG4gIENvbmRpdGlvbmFsT3B0aW9ucyxcbiAgRGF0YUZpbHRlclR5cGUsXG4gIERhdGFUYWJsZUNvbXBvbmVudCxcbiAgRGF0YVZpZXdDb21wb25lbnQsXG4gIERyb3Bkb3duQ2hhbmdlRXZlbnQsXG4gIElEYXRhRmlsdGVyXG59IGZyb20gJ3ZlcmJlbi1uZy11aSc7XG5pbXBvcnQgeyBEYXRhVHlwZSwgRXJyb3JSZXNwb25zZSwgRm9ybUVudGl0eSwgRm9ybVByb3BlcnR5LCBPYmplY3RTdGF0ZSwgUGFnZWRSZXN1bHQsIFNlYXJjaE9wZXJhdG9yLCBTZWFyY2hQcm9wZXJ0eVNpZ24sIFNlYXJjaFByb3BlcnR5VmFsdWUsIFNlYXJjaFByb3BlcnR5VmFsdWVUeXBlLCBTdGF0dXMgfSBmcm9tICd2ZXJiZW4td29ya2Zsb3ctdWkvc3JjL2xpYi9tb2RlbHMnO1xuaW1wb3J0IHsgRW52aXJvbm1lbnRTZXJ2aWNlLCBIdHRwV2ViUmVxdWVzdFNlcnZpY2UsIFV0aWxTZXJ2aWNlIH0gZnJvbSAndmVyYmVuLXdvcmtmbG93LXVpL3NyYy9saWIvc2VydmljZXMnO1xuaW1wb3J0IHsgYmFzZVN0eWxlIH0gZnJvbSAnLi4vYmFzZS10YWJsZS1zdHlsZSc7XG5pbXBvcnQgeyBGb3Jtc0ZpZWxkU2VydmljZSB9IGZyb20gJy4vZm9ybS1maWVsZHMuc2VydmljZSc7XG5cbmVudW0gVGFza1VzZXJQcm9wZXJ0eU5hbWUge1xuICBVc2VyID0gJ1VzZXInLFxuICBEYXRlID0gJ0RhdGUnLFxuICBSb2xlID0gJ1JvbGUnLFxuICBTZXJ2aWNlID0gJ1NlcnZpY2UnLFxuICBBcHBsaWNhdGlvbiA9ICdBcHBsaWNhdGlvbicsXG4gIFRlbmFudCA9ICdUZW5hbnQnLFxuICBFbWFpbCA9ICdFbWFpbCcsXG4gIFN0YXR1cyA9ICdTdGF0dXMnLFxufVxuZW51bSBUYXNrVXNlclByb3BlcnR5TWFwIHtcbiAgVXNlciA9ICdOYW1lJyxcbiAgRGF0ZSA9ICdDcmVhdGVkQXQnLFxuICBSb2xlID0gJ1JvbGVJRCcsXG4gIFNlcnZpY2UgPSAnU2VydmljZU5hbWUnLFxuICBBcHBsaWNhdGlvbiA9ICdBcHBsaWNhdGlvbicsXG4gIFRlbmFudCA9ICdUZW5hbnRJZCcsXG4gIEVtYWlsID0gJ01haWxBZGRyZXNzJyxcbiAgU3RhdHVzID0gJ1N0YXR1cycsXG59XG5cbmVudW0gRmlsdGVyVHlwZXMge1xuICBCZWZvcmUgPSBTZWFyY2hQcm9wZXJ0eVNpZ24uTFQsXG4gIE9uID0gU2VhcmNoUHJvcGVydHlTaWduLkVRLFxuICBBZnRlciA9IFNlYXJjaFByb3BlcnR5U2lnbi5HVCxcbiAgTkVRID0gU2VhcmNoUHJvcGVydHlTaWduLk5FUSxcbn1cblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnbGliLWZvcm0tZmllbGRzJyxcbiAgdGVtcGxhdGVVcmw6ICcuL2Zvcm0tZmllbGRzLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmw6ICcuL2Zvcm0tZmllbGRzLmNvbXBvbmVudC5jc3MnLFxufSlcbmV4cG9ydCBjbGFzcyBGb3JtRmllbGRzQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0IHtcbiAgdmlzaWJsZUNvbHVtbkRlZjogQ29sdW1uRGVmaW5pdGlvbjxGb3JtUHJvcGVydHk+W10gPSBbXTtcbiAgc3R5bGVzID0gYmFzZVN0eWxlO1xuICBkYXRhOiBGb3JtRW50aXR5W10gPSBbXTtcbiAgaGlkZU1pbk1heDogYm9vbGVhbiA9IHRydWU7XG4gIEBJbnB1dCgpIHBhdGg6IHN0cmluZyA9ICcvZG9jdW1lbnRhdGlvbi93b3JrZmxvdy1mb3Jtcy9maWVsZHMnO1xuICBjYXJkRGF0YTogQ2FyZERhdGFbXSA9IFtdO1xuICBxdWVyeVBhcmFtczogYW55ID0ge307XG4gIHNob3dTb3J0OiBib29sZWFuID0gZmFsc2U7XG4gIHNob3dDb2x1bW46IGJvb2xlYW4gPSBmYWxzZTtcbiAgY3VycmVudERhdGE6IENhcmREYXRhIHwgbnVsbCA9IG51bGw7XG4gIEBWaWV3Q2hpbGQoJ2ZpbGVJbnB1dCcsIHsgc3RhdGljOiB0cnVlIH0pIGZpbGVJbnB1dCE6IEVsZW1lbnRSZWY7XG4gIEBWaWV3Q2hpbGQoJ3ZkY3YnKSBjYXJkRGF0YVZpZXchOiBDYXJkRGF0YVZpZXdDb21wb25lbnQ7XG4gIEBWaWV3Q2hpbGQoJ3ZkdicpIGRhdGFWaWV3ITogRGF0YVZpZXdDb21wb25lbnQ7XG4gIEBWaWV3Q2hpbGQoJ2R0JykgdGFibGVWaWV3ITogRGF0YVRhYmxlQ29tcG9uZW50PEZvcm1FbnRpdHk+O1xuICBASW5wdXQoKSBhcHBsaWNhdGlvbjogc3RyaW5nIHwgbnVsbCA9IG51bGw7XG4gIEBJbnB1dCgpIHBhZ2VTaXplOiBudW1iZXIgPSAxMDtcbiAgQElucHV0KCkgc2VhcmNoRGVib3VuY2VUaW1lOiBudW1iZXIgPSA1MDA7XG4gIEBPdXRwdXQoKSBvblZpZXdQcm9jZXNzQ2xpY2tlZDogRXZlbnRFbWl0dGVyPHN0cmluZz4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG4gIGN1cnJlbnRFeHBhbmRlZENhcmQ6IENhcmREYXRhIHwgbnVsbCA9IG51bGw7XG4gIHBhZ2VTdGF0ZTogUGFnZWRSZXN1bHQ8Rm9ybUVudGl0eT4gfCBudWxsID0gbnVsbDtcbiAgaXNPcGVuOiBib29sZWFuID0gZmFsc2U7XG4gIG9wZW5Ecm9wZG93bklkOiBzdHJpbmcgfCBudWxsIHwgbnVtYmVyID0gbnVsbDtcbiAgY3VycmVudEZpbHRlcnM6IElEYXRhRmlsdGVyW10gPSBbXTtcbiAgY3VycmVudFNvcnRzOiBJRGF0YUZpbHRlcltdID0gW107XG4gIHNlbGVjdGVkRmlsdGVyVGFibGVDb3VudDogbnVtYmVyID0gMDtcbiAgc2VsZWN0ZWRTb3J0VGFibGVDb3VudDogbnVtYmVyID0gMDtcbiAgc2VsZWN0ZWRDb2x1bW5UYWJsZUNvdW50OiBudW1iZXIgPSAwO1xuICBzaG93RmlsdGVyOiBib29sZWFuID0gZmFsc2U7XG4gIGZvcm1OYW1lOiBzdHJpbmcgPSAnJztcbiAgc2VhcmNoVGVybSQgPSBuZXcgU3ViamVjdDxzdHJpbmc+KCk7XG4gIHByb3BlcnRpZXM6IEZvcm1Qcm9wZXJ0eVtdID0gW107XG4gIHNlYXJjaFRlcm06IHN0cmluZyA9ICcnO1xuICBza2lwID0gMDtcbiAgY2hpcEFycmF5OiBzdHJpbmdbXSA9IFtdO1xuICBJZDogc3RyaW5nID0gJyc7XG4gIGNoaXBzOiBhbnk7XG4gIHN0YXR1c09wdGlvbnM6IFN0YXR1c1tdID0gT2JqZWN0LnZhbHVlcyhTdGF0dXMpO1xuICBkYXRhVHlwZTogRGF0YVR5cGVbXSA9IE9iamVjdC52YWx1ZXMoRGF0YVR5cGUpO1xuICBkYXRhVHlwZTI6IERhdGFUeXBlID0gRGF0YVR5cGUuVGV4dDtcbiAgdXNlcnM6IEZvcm1FbnRpdHlbXSA9IFtdO1xuXG4gIHZpc2libGVDb2x1bW5zOiBJRGF0YUZpbHRlcltdID0gW107XG5cbiAgZmlsdGVyQXJyYXk6IElEYXRhRmlsdGVyW10gPSBbXG4gICAge1xuICAgICAgbmFtZTogJ05hbWUnLFxuICAgICAgdHlwZTogRGF0YUZpbHRlclR5cGUuU3RyaW5nLFxuICAgICAgY2hlY2tlZDogZmFsc2UsXG4gICAgfSxcbiAgICB7XG4gICAgICBuYW1lOiAnRGF0YVR5cGUnLFxuICAgICAgdHlwZTogRGF0YUZpbHRlclR5cGUuU3RyaW5nLFxuICAgICAgY2hlY2tlZDogZmFsc2UsXG4gICAgfSxcbiAgICB7XG4gICAgICBuYW1lOiAnRGVmYXVsdFZhbHVlJyxcbiAgICAgIHR5cGU6IERhdGFGaWx0ZXJUeXBlLlN0cmluZyxcbiAgICAgIGNoZWNrZWQ6IGZhbHNlLFxuICAgIH0sXG5cbiAgICB7XG4gICAgICBuYW1lOiAnVmFsdWUnLFxuICAgICAgdHlwZTogRGF0YUZpbHRlclR5cGUuU3RyaW5nLFxuICAgICAgY2hlY2tlZDogZmFsc2UsXG4gICAgfSxcbiAgICB7XG4gICAgICBuYW1lOiAnTWF4VmFsdWUnLFxuICAgICAgdHlwZTogRGF0YUZpbHRlclR5cGUuTnVtYmVyLFxuICAgICAgY2hlY2tlZDogZmFsc2UsXG4gICAgfSxcbiAgICB7XG4gICAgICBuYW1lOiAnTWluVmFsdWUnLFxuICAgICAgdHlwZTogRGF0YUZpbHRlclR5cGUuU3RyaW5nLFxuICAgICAgY2hlY2tlZDogZmFsc2UsXG4gICAgfSxcbiAgICB7XG4gICAgICBuYW1lOiAnSXNSZXF1aXJlZCcsXG4gICAgICB0eXBlOiBEYXRhRmlsdGVyVHlwZS5Cb29sLFxuICAgICAgY2hlY2tlZDogZmFsc2UsXG4gICAgfSxcbiAgXTtcblxuICBzb3J0T3B0aW9uczogSURhdGFGaWx0ZXJbXSA9IFtcbiAgICB7XG4gICAgICBuYW1lOiAnTmFtZScsXG4gICAgICB0eXBlOiBEYXRhRmlsdGVyVHlwZS5TdHJpbmcsXG4gICAgICBjaGVja2VkOiBmYWxzZSxcbiAgICB9LFxuICAgIHtcbiAgICAgIG5hbWU6ICdEYXRhVHlwZScsXG4gICAgICB0eXBlOiBEYXRhRmlsdGVyVHlwZS5TdHJpbmcsXG4gICAgICBjaGVja2VkOiBmYWxzZSxcbiAgICB9LFxuICAgIHtcbiAgICAgIG5hbWU6ICdEZWZhdWx0VmFsdWUnLFxuICAgICAgdHlwZTogRGF0YUZpbHRlclR5cGUuU3RyaW5nLFxuICAgICAgY2hlY2tlZDogZmFsc2UsXG4gICAgfSxcblxuICAgIHtcbiAgICAgIG5hbWU6ICdWYWx1ZScsXG4gICAgICB0eXBlOiBEYXRhRmlsdGVyVHlwZS5TdHJpbmcsXG4gICAgICBjaGVja2VkOiBmYWxzZSxcbiAgICB9LFxuICAgIHtcbiAgICAgIG5hbWU6ICdNYXhWYWx1ZScsXG4gICAgICB0eXBlOiBEYXRhRmlsdGVyVHlwZS5OdW1iZXIsXG4gICAgICBjaGVja2VkOiBmYWxzZSxcbiAgICB9LFxuICAgIHtcbiAgICAgIG5hbWU6ICdNaW5WYWx1ZScsXG4gICAgICB0eXBlOiBEYXRhRmlsdGVyVHlwZS5TdHJpbmcsXG4gICAgICBjaGVja2VkOiBmYWxzZSxcbiAgICB9LFxuICAgIHtcbiAgICAgIG5hbWU6ICdJc1JlcXVpcmVkJyxcbiAgICAgIHR5cGU6IERhdGFGaWx0ZXJUeXBlLkJvb2wsXG4gICAgICBjaGVja2VkOiBmYWxzZSxcbiAgICB9LFxuICBdO1xuXG4gIHByaXZhdGUgY3VycmVudFNlYXJjaFRlcm06IHN0cmluZyA9ICcnO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgdXRpbFNlcnZpY2U6IFV0aWxTZXJ2aWNlLFxuICAgIHByaXZhdGUgc2VydmVyOiBIdHRwV2ViUmVxdWVzdFNlcnZpY2UsXG4gICAgcHJpdmF0ZSBjZHI6IENoYW5nZURldGVjdG9yUmVmLFxuICAgIHByaXZhdGUgZmI6IEZvcm1CdWlsZGVyLFxuICAgIHByaXZhdGUgZW52U3ZjOiBFbnZpcm9ubWVudFNlcnZpY2UsXG4gICAgcHJpdmF0ZSByb3V0ZXI6IFJvdXRlcixcbiAgICBwcml2YXRlIHJvdXRlOiBBY3RpdmF0ZWRSb3V0ZSxcbiAgICBwcml2YXRlIHRhc2tVc2Vyc1N2YzogRm9ybXNGaWVsZFNlcnZpY2UsXG4gICAgcHJpdmF0ZSBfbG9jYXRpb246IExvY2F0aW9uLFxuICAgIHByaXZhdGUgZWxSZWY6IEVsZW1lbnRSZWYsXG4gICAgcHJpdmF0ZSByZW5kZXJlcjogUmVuZGVyZXIyLFxuICApIHtcbiAgICB0aGlzLnZpc2libGVDb2x1bW5EZWYgPSB0YXNrVXNlcnNTdmMuZm9ybUZpZWxkQ29sdW1ucztcbiAgICB0aGlzLnZpc2libGVDb2x1bW5zID0gdGFza1VzZXJzU3ZjLmZvcm1GaWVsZENvbHVtbnMubWFwKChjb2wpID0+ICh7XG4gICAgICBjaGVja2VkOiB0cnVlLFxuICAgICAgbmFtZTogdHlwZW9mIGNvbC5oZWFkZXIgPT09ICdzdHJpbmcnID8gY29sLmhlYWRlciA6IGNvbC5pZCxcbiAgICAgIHR5cGU6IERhdGFGaWx0ZXJUeXBlLkJvb2wsXG4gICAgfSkpO1xuICB9XG4gIGFzeW5jIG5nT25Jbml0KCk6IFByb21pc2U8dm9pZD4ge1xuICAgIHRoaXMuc2VhcmNoVGVybSRcbiAgICAgIC5waXBlKGRlYm91bmNlVGltZSh0aGlzLnNlYXJjaERlYm91bmNlVGltZSkpIC8vIEFkanVzdCBkZWJvdW5jZSB0aW1lIGhlcmUgKGluIG1zKVxuICAgICAgLnN1YnNjcmliZShhc3luYyAoc2VhcmNoVGVybSkgPT4ge1xuICAgICAgICB0aGlzLmN1cnJlbnRTZWFyY2hUZXJtID0gc2VhcmNoVGVybTtcbiAgICAgICAgdGhpcy51cGRhdGVGaWx0ZXJzQW5kU29ydHModHJ1ZSk7XG4gICAgICB9KTtcbiAgICB0aGlzLnJvdXRlLnF1ZXJ5UGFyYW1zLnN1YnNjcmliZSgocGFyYW1zKSA9PiB7XG4gICAgICBjb25zdCBJZCA9IHBhcmFtc1snRm9ybUlkJ107XG4gICAgICBjb25zdCBOYW1lID0gcGFyYW1zWydOYW1lJ107XG4gICAgICB0aGlzLklkID0gSWQ7XG4gICAgICB0aGlzLmZvcm1OYW1lID0gTmFtZTtcbiAgICAgIGlmIChJZCkge1xuICAgICAgICB0aGlzLmdldFByb3BlcnRpZXMoSWQpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG4gIG9uQ2hpcENoYW5nZShjaGlwczogQ2hpcENoYW5nZUV2ZW50KSB7XG4gICAgdGhpcy5jaGlwcyA9IGNoaXBzO1xuICB9XG4gIGFzeW5jIHBvc3RTZWFyY2gocGF5bG9hZDogYW55KSB7XG4gICAgdGhpcy51dGlsU2VydmljZS5zZW5kQkkodHJ1ZSk7XG4gICAgY29uc3QgcmVzID0gYXdhaXQgdGhpcy5zZXJ2ZXIucG9zdChcbiAgICAgIGBTZWFyY2hGb3JtRW50aXRpZXMvMC8ke3RoaXMucGFnZVNpemV9YCxcbiAgICAgIHBheWxvYWRcbiAgICApO1xuICAgIHRoaXMudXRpbFNlcnZpY2Uuc2VuZEJJKGZhbHNlKTtcblxuICAgIGlmIChyZXMgaW5zdGFuY2VvZiBFcnJvclJlc3BvbnNlKSB7XG4gICAgICB0aGlzLnV0aWxTZXJ2aWNlLnNob3dFcnJvcignRXJyb3Igb2NjdXJyZWQgd2hpbGUgc2VhcmNoaW5nLicpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHBhZ2VTdGF0ZSA9IHJlcyBhcyBQYWdlZFJlc3VsdDxGb3JtRW50aXR5PjtcbiAgICBjb25zdCByZXN1bHQgPSBwYWdlU3RhdGU/LlJlc3VsdDtcblxuICAgIGlmICghcmVzdWx0IHx8IHJlc3VsdC5sZW5ndGggPT09IDApIHtcbiAgICAgIHRoaXMudXRpbFNlcnZpY2Uuc2hvd0luZm8oJ05vIHJlc3VsdHMgZm91bmQuJyk7XG4gICAgICB0aGlzLmRhdGEgPSBbXTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBBc3NpZ24gYW5kIGVuc3VyZSBQcm9wZXJ0aWVzIGV4aXN0XG4gICAgdGhpcy5kYXRhID0gcmVzdWx0Lm1hcCgoaXRlbSkgPT4gKHtcbiAgICAgIC4uLml0ZW0sXG4gICAgICBQcm9wZXJ0aWVzOiBpdGVtLlByb3BlcnRpZXMgfHwgW10sXG4gICAgfSkpO1xuXG4gICAgdGhpcy5zZXRVcENhcmREYXRhKCk7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIG9uRHJvcERvd25DaGFuZ2UoZXZlbnQ6IHN0cmluZykge1xuICAgIGlmIChldmVudCkge1xuICAgICAgdGhpcy5jaGVja01pbk1heChldmVudCk7XG4gICAgfVxuICB9XG4gIGFzeW5jIGdldFByb3BlcnRpZXMoXG4gICAgSWQ6IHN0cmluZyxcbiAgICBzaG93OiBib29sZWFuID0gZmFsc2UsXG4gICk6IFByb21pc2U8Rm9ybUVudGl0eVtdIHwgdW5kZWZpbmVkPiB7XG4gICAgaWYgKHRoaXMuc2hvd0NvbHVtbikge1xuICAgICAgdGhpcy5zaG93Q29sdW1uID0gZmFsc2U7XG4gICAgICB0aGlzLnNlbGVjdGVkQ29sdW1uVGFibGVDb3VudCA9IDA7XG4gICAgICB0aGlzLnJlc2V0KCk7XG4gICAgfVxuICAgIGlmICh0aGlzLnNob3dGaWx0ZXIpIHtcbiAgICAgIHRoaXMuc2hvd0ZpbHRlciA9IGZhbHNlO1xuICAgICAgdGhpcy5zZWxlY3RlZEZpbHRlclRhYmxlQ291bnQgPSAwO1xuXG4gICAgICB0aGlzLnJlc2V0KCk7XG4gICAgfVxuICAgIGlmICh0aGlzLnNob3dTb3J0KSB7XG4gICAgICB0aGlzLnNob3dTb3J0ID0gZmFsc2U7XG4gICAgICB0aGlzLnJlc2V0KCk7XG4gICAgICB0aGlzLnNlbGVjdGVkU29ydFRhYmxlQ291bnQgPSAwO1xuICAgIH1cblxuICAgIHZhciBwYXlsb2FkOiBTZWFyY2hQcm9wZXJ0eVZhbHVlW10gPSBbXG4gICAgICB7XG4gICAgICAgIFByb3BlcnR5TmFtZTogYENvZGVgLFxuICAgICAgICBFbnRpdHlWYWx1ZTogSWQsXG4gICAgICAgIE9wZXJhdG9yOiBTZWFyY2hPcGVyYXRvci5BbmQsXG4gICAgICAgIFNpZ246IFNlYXJjaFByb3BlcnR5U2lnbi5FUSxcbiAgICAgICAgVHlwZTogU2VhcmNoUHJvcGVydHlWYWx1ZVR5cGUuU3RyaW5nLFxuICAgICAgfSxcbiAgICBdO1xuICAgIHRoaXMudXRpbFNlcnZpY2Uuc2VuZEJJKHRydWUpO1xuICAgIGNvbnN0IHJlcyA9IGF3YWl0IHRoaXMuc2VydmVyLnBvc3QoXG4gICAgICBgU2VhcmNoRm9ybUVudGl0aWVzLyR7dGhpcy5za2lwfS8ke3RoaXMucGFnZVNpemV9YCxcbiAgICAgIHBheWxvYWRcbiAgICApO1xuICAgIHRoaXMudXRpbFNlcnZpY2Uuc2VuZEJJKGZhbHNlKTtcbiAgICBpZiAocmVzIGluc3RhbmNlb2YgRXJyb3JSZXNwb25zZSkge1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9IGVsc2Uge1xuICAgICAgdmFyIHJlc3VsdCA9IChyZXMgYXMgUGFnZWRSZXN1bHQ8Rm9ybUVudGl0eT4pLlJlc3VsdDtcbiAgICAgIHRoaXMuZGF0YSA9IHJlc3VsdDtcbiAgICAgIHRoaXMuZGF0YS5mb3JFYWNoKCh4KSA9PlxuICAgICAgICB4LlByb3BlcnRpZXMuZm9yRWFjaCgocCwgaSkgPT4gKHAuSWQgPSBpLnRvU3RyaW5nKCkpKSxcbiAgICAgICk7XG4gICAgICB0aGlzLnByb3BlcnRpZXMgPSB0aGlzLmRhdGFbMF0uUHJvcGVydGllcztcbiAgICAgIGNvbnNvbGUubG9nKHRoaXMucHJvcGVydGllcywgJ2pqaicpO1xuXG4gICAgICB0aGlzLnNldFVwQ2FyZERhdGEoKTtcbiAgICAgIHNob3cgPSBmYWxzZTtcbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuICB9XG5cbiAgb25Vc2VyU2VsZWN0ZWQoZXZlbnQ6IERyb3Bkb3duQ2hhbmdlRXZlbnQsIGl0ZW06IEZvcm1FbnRpdHkpIHtcbiAgICBjb25zdCB1c2VyID0gdGhpcy51c2Vycy5maW5kKCh4KSA9PiB4Lk5hbWUgPT0gZXZlbnQudmFsdWUpO1xuICAgIGlmICh1c2VyKSB7XG4gICAgICBpdGVtLk5hbWUgPSB1c2VyLk5hbWU7XG4gICAgICBpdGVtLkRlc2NyaXB0aW9uID0gdXNlci5EZXNjcmlwdGlvbjtcbiAgICAgIGl0ZW0uUHJvcGVydGllcyA9IHVzZXIuUHJvcGVydGllcztcbiAgICAgIGl0ZW0uSXNWYWxpZGF0ZWQgPSB1c2VyLklzVmFsaWRhdGVkO1xuICAgIH1cbiAgfVxuICBvbkNsZWFyKGV2ZW50OiBFdmVudCwgaXRlbTogRm9ybUVudGl0eSkge1xuICAgIGl0ZW0uTmFtZSA9ICcnO1xuICAgIGl0ZW0uRGVzY3JpcHRpb24gPSAnJztcbiAgICBpdGVtLlByb3BlcnRpZXMgPSBbXTtcbiAgICBpdGVtLklzVmFsaWRhdGVkID0gZmFsc2U7XG4gIH1cbiAgYXN5bmMgZ2V0Rm9ybXMoKTogUHJvbWlzZTxGb3JtRW50aXR5W10gfCB1bmRlZmluZWQ+IHtcbiAgICB0aGlzLnV0aWxTZXJ2aWNlLnNlbmRCSSh0cnVlKTtcbiAgICBjb25zdCByZXMgPSBhd2FpdCB0aGlzLnNlcnZlci5nZXQoXG4gICAgICBgR2V0Rm9ybUVudGl0aWVzV2l0aFBhcmFtcy9Hcm91cC8wLyR7dGhpcy5wYWdlU2l6ZX1gLFxuICAgICAgdGhpcy5lbnZTdmMuZW52aXJvbm1lbnQuV29ya0Zsb3dBUElcbiAgICApO1xuICAgIHRoaXMudXRpbFNlcnZpY2Uuc2VuZEJJKGZhbHNlKTtcbiAgICBpZiAocmVzIGluc3RhbmNlb2YgRXJyb3JSZXNwb25zZSkge1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5wYWdlU3RhdGUgPSByZXMgYXMgUGFnZWRSZXN1bHQ8Rm9ybUVudGl0eT47XG4gICAgICB2YXIgcmVzdWx0ID0gKHJlcyBhcyBQYWdlZFJlc3VsdDxGb3JtRW50aXR5PikuUmVzdWx0O1xuICAgICAgdGhpcy5kYXRhID0gcmVzdWx0O1xuICAgICAgdGhpcy5zZXRVcENhcmREYXRhKCk7XG4gICAgICB0aGlzLnByb3BlcnRpZXMgPSByZXN1bHRbMF0uUHJvcGVydGllcztcblxuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG4gIH1cbiAgZ2V0SXRlbUxhYmVsKG5hbWU6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgY29uc3QgaXRlbSA9IHRoaXMudXNlcnMuZmluZCgodXNlcikgPT4gdXNlci5OYW1lID09PSBuYW1lKTtcbiAgICBjb25zdCBvdGhlckNoZWNrID0gdGhpcy5kYXRhLmZpbmQoKGRhdGEpID0+IGRhdGEuTmFtZSA9PT0gbmFtZSk7XG4gICAgcmV0dXJuIGl0ZW0gPyBpdGVtLk5hbWUgOiBvdGhlckNoZWNrID8gb3RoZXJDaGVjay5OYW1lIDogJyc7XG4gIH1cblxuICBnZXRBc3luY0xhYmVsKHZhbHVlOiBhbnkpOiBzdHJpbmcge1xuICAgIGNvbnN0IGRhdGEgPSB0aGlzLmRhdGEuZmluZCgoeCkgPT4geC5OYW1lID09IHZhbHVlKTtcblxuICAgIHJldHVybiBkYXRhID8gZGF0YS5OYW1lIDogJyc7XG4gIH1cblxuICBhc3luYyBsb2FkTW9yZSgpIHtcbiAgICBpZiAoIXRoaXMucGFnZVN0YXRlKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMudXRpbFNlcnZpY2Uuc2VuZEJJKHRydWUpO1xuICAgIGNvbnN0IHJlcyA9XG4gICAgICB0aGlzLmN1cnJlbnRGaWx0ZXJzLmxlbmd0aCA+IDAgfHxcbiAgICAgICAgdGhpcy5jdXJyZW50U29ydHMubGVuZ3RoID4gMCB8fFxuICAgICAgICB0aGlzLmN1cnJlbnRTZWFyY2hUZXJtLnRyaW0oKS5sZW5ndGggPiAwXG4gICAgICAgID8gYXdhaXQgdGhpcy5sb2FkTW9yZUZpbHRlcnNBbmRTb3J0cygpXG4gICAgICAgIDogYXdhaXQgdGhpcy5zZXJ2ZXIuZ2V0KFxuICAgICAgICAgIGBHZXRUYXNrVXNlcnMvJHt0aGlzLnBhZ2VTdGF0ZS5Ta2lwfS8ke3RoaXMucGFnZVNpemV9YCxcbiAgICAgICAgICB0aGlzLmVudlN2Yy5lbnZpcm9ubWVudC5Xb3JrRmxvd0FQSVxuICAgICAgICApO1xuICAgIHRoaXMudXRpbFNlcnZpY2Uuc2VuZEJJKGZhbHNlKTtcbiAgICBpZiAocmVzIGluc3RhbmNlb2YgRXJyb3JSZXNwb25zZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnBhZ2VTdGF0ZSA9IHJlcyBhcyBQYWdlZFJlc3VsdDxGb3JtRW50aXR5PjtcbiAgICAgIHZhciByZXN1bHQgPSAocmVzIGFzIFBhZ2VkUmVzdWx0PEZvcm1FbnRpdHk+KS5SZXN1bHQ7XG5cbiAgICAgIHRoaXMuZGF0YSA9IHRoaXMuZGF0YS5jb25jYXQoXG4gICAgICAgIHJlc3VsdC5tYXAoKHgpID0+IHtcbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgLi4ueCxcbiAgICAgICAgICAgIGlkOiB4Lk5hbWUsXG4gICAgICAgICAgfTtcbiAgICAgICAgfSksXG4gICAgICApO1xuICAgICAgdGhpcy5zZXRVcENhcmREYXRhRXh0cmEocmVzdWx0KTtcbiAgICB9XG4gIH1cbiAgY2FyZENsaWNrZWQoaXRlbTogQ2FyZERhdGEsIHRvZ2dsZVZpZXc6IGJvb2xlYW4gPSBmYWxzZSkge1xuICAgIHRoaXMuY3VycmVudERhdGEgPSB0aGlzLmNhcmREYXRhVmlldy5vbkl0ZW1DbGljayhpdGVtKTtcbiAgICBpZiAodG9nZ2xlVmlldykge1xuICAgICAgdGhpcy5kYXRhVmlldy50b2dnbGVWaWV3KCk7XG4gICAgfVxuICB9XG4gIHRvZ2dsZUNoaWxkcmVuKGl0ZW06IENhcmREYXRhKSB7XG4gICAgdmFyIGN1cnJUb2dnbGVTdGF0ZSA9IGl0ZW0uaXNDaGlsZHJlbkV4cGFuZGVkO1xuICAgIHRoaXMuY2FyZERhdGEuZm9yRWFjaCgoXykgPT4ge1xuICAgICAgXy5pc0NoaWxkcmVuRXhwYW5kZWQgPSBmYWxzZTtcbiAgICB9KTtcbiAgICBpdGVtLmlzQ2hpbGRyZW5FeHBhbmRlZCA9ICFjdXJyVG9nZ2xlU3RhdGU7XG4gICAgaWYgKGl0ZW0uaXNDaGlsZHJlbkV4cGFuZGVkKSB7XG4gICAgICB0aGlzLmN1cnJlbnRFeHBhbmRlZENhcmQgPSBpdGVtO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmN1cnJlbnRFeHBhbmRlZENhcmQgPSBudWxsO1xuICAgIH1cbiAgfVxuICBzZXRVcENhcmREYXRhKCkge1xuICAgIGNvbnN0IGNhcmREYXRhOiBDYXJkRGF0YVtdID0gdGhpcy5kYXRhWzBdPy5Qcm9wZXJ0aWVzPy5tYXAoKHgpID0+IHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIC4uLngsXG4gICAgICAgIHNlbGVjdGVkOiBmYWxzZSxcbiAgICAgICAgdGl0bGU6IHguTmFtZSxcbiAgICAgICAgZGF0YTogeCxcbiAgICAgICAgYm9keTogW10sXG4gICAgICAgIGNoaWxkcmVuOiBbXSxcbiAgICAgIH07XG4gICAgfSk7XG5cbiAgICB0aGlzLmNhcmREYXRhID0gY2FyZERhdGE7IC8vIEFzc2lnbiB0aGUgdHJhbnNmb3JtZWQgYXJyYXkgdG8gYGNhcmREYXRhYFxuICB9XG5cbiAgb3BlbkRyb3Bkb3duKGl0ZW06IEZvcm1Qcm9wZXJ0eSk6IHZvaWQge1xuICAgIHRoaXMub3BlbkRyb3Bkb3duSWQgPSB0aGlzLm9wZW5Ecm9wZG93bklkID09PSBpdGVtLklkID8gbnVsbCA6IGl0ZW0uSWQ7XG4gIH1cblxuICBjbG9zZVBvcFVwKHJvdzogRm9ybVByb3BlcnR5KTogdm9pZCB7XG4gICAgaWYgKHRoaXMub3BlbkRyb3Bkb3duSWQgPT09IHJvdy5JZCkge1xuICAgICAgdGhpcy5vcGVuRHJvcGRvd25JZCA9IG51bGw7IC8vIFByb3Blcmx5IHJlc2V0IHdoZW4gY2xvc2luZ1xuICAgIH1cbiAgICB0aGlzLm9uQ2xvc2UoKTsgLy8gQ2FsbCBhbnkgYWRkaXRpb25hbCBsb2dpYyBmb3IgY2xvc3VyZVxuICB9XG4gIHNldFVwQ2FyZERhdGFFeHRyYShiYXNlRGF0YTogRm9ybUVudGl0eVtdKSB7XG4gICAgY29uc3QgY2FyZERhdGE6IENhcmREYXRhW10gPSBiYXNlRGF0YS5tYXAoKHgpID0+IHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHNlbGVjdGVkOiBmYWxzZSxcbiAgICAgICAgdGl0bGU6IHguTmFtZSxcbiAgICAgICAgZGF0YTogeCxcbiAgICAgICAgYm9keTogW10sXG4gICAgICAgIGNoaWxkcmVuOiBbXSxcbiAgICAgIH07XG4gICAgfSk7XG4gICAgdGhpcy5jYXJkRGF0YSA9IHRoaXMuY2FyZERhdGEuY29uY2F0KGNhcmREYXRhKTtcbiAgfVxuXG4gIGdvVG9DYXJkVmlldyhkYXRhOiBGb3JtUHJvcGVydHkpIHtcbiAgICBjb25zdCBpdGVtID0gdGhpcy5jYXJkRGF0YS5maW5kKCh4KSA9PiB4LmRhdGEgPT0gZGF0YSk7XG4gICAgaWYgKGl0ZW0pIHtcbiAgICAgIHRoaXMudXNlckNhcmRDbGlja2VkKGl0ZW0sIHRydWUpO1xuICAgIH1cbiAgfVxuXG4gIGdvVG9UYWJsZVZpZXcoKSB7XG4gICAgaWYgKCF0aGlzLmN1cnJlbnREYXRhKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuZGF0YVZpZXcudG9nZ2xlVmlldygpO1xuICAgIGNvbnN0IGlkID0gdGhpcy5jdXJyZW50RGF0YS5kYXRhID8gdGhpcy5jdXJyZW50RGF0YS5kYXRhLklkIDogJyc7XG4gICAgaWYgKGlkLnRyaW0oKS5sZW5ndGggPiAwICYmICF0aGlzLnRhYmxlVmlldy5pc1Jvd0VkaXRpbmcoaWQpKSB7XG4gICAgICB0aGlzLnRhYmxlVmlldy50b2dnbGVSb3dFZGl0KGlkKTtcbiAgICB9XG4gIH1cblxuICB2aWV3UHJvY2Vzc2VzKGNvZGU6IHN0cmluZykge1xuICAgIGlmIChjb2RlLnRyaW0oKS5sZW5ndGggPT0gMCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLm9uVmlld1Byb2Nlc3NDbGlja2VkLmVtaXQoY29kZSk7XG4gIH1cblxuICB1c2VyQ2FyZENsaWNrZWQoaXRlbTogQ2FyZERhdGEsIHRvZ2dsZVZpZXc6IGJvb2xlYW4gPSBmYWxzZSk6IHZvaWQge1xuICAgIHRoaXMuY2FyZERhdGEuZm9yRWFjaCgoY2FyZCkgPT4gKGNhcmQuc2VsZWN0ZWQgPSBmYWxzZSkpO1xuICAgIGl0ZW0uc2VsZWN0ZWQgPSB0cnVlO1xuICAgIHRoaXMuY3VycmVudERhdGEgPSB0aGlzLmNhcmREYXRhVmlldy5vbkl0ZW1DbGljayhpdGVtKTtcbiAgICB0aGlzLmNoaXBBcnJheSA9IEpTT04ucGFyc2UodGhpcy5jdXJyZW50RGF0YT8uZGF0YS5WYWx1ZSk7XG4gICAgaWYgKHRvZ2dsZVZpZXcpIHtcbiAgICAgIHRoaXMuZGF0YVZpZXcudG9nZ2xlVmlldygpO1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIHNhdmVGb3JtUHJvcGVydHkoKSB7XG4gICAgaWYgKCF0aGlzLmN1cnJlbnREYXRhKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgZm9ybVByb3BlcnR5OiBGb3JtRW50aXR5W10gPSB0aGlzLmRhdGE7XG5cbiAgICB0aGlzLnV0aWxTZXJ2aWNlLnNlbmRCSSh0cnVlKTtcblxuICAgIHRyeSB7XG4gICAgICAvLyBBUEkgY2FsbCB0byBzYXZlIHVzZXJcbiAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IHRoaXMuc2VydmVyLnBvc3QoXG4gICAgICAgIGBTYXZlRm9ybUVudGl0aWVzYCxcbiAgICAgICAgZm9ybVByb3BlcnR5LFxuICAgICAgICB0aGlzLmVudlN2Yy5lbnZpcm9ubWVudC5Xb3JrRmxvd0FQSSxcbiAgICAgICk7XG5cbiAgICAgIHRoaXMudXRpbFNlcnZpY2Uuc2VuZEJJKGZhbHNlKTtcblxuICAgICAgaWYgKCEocmVzIGluc3RhbmNlb2YgRXJyb3JSZXNwb25zZSkpIHtcbiAgICAgICAgdGhpcy51dGlsU2VydmljZS5zaG93U3VjY2VzcygnRm9ybSBwcm9wZXJ0eSBzYXZlZCBzdWNjZXNzZnVsbHknKTtcblxuICAgICAgICBjb25zdCByZXN1bHQgPSByZXMgYXMgRm9ybUVudGl0eVtdO1xuICAgICAgICBpZiAocmVzdWx0Lmxlbmd0aCA+IDApIHtcbiAgICAgICAgICBjb25zdCB1c2VyUmVzdWx0ID0gcmVzdWx0WzBdO1xuXG4gICAgICAgICAgY29uc3QgaXRlbUluZGV4ID0gdGhpcy5kYXRhLmZpbmRJbmRleChcbiAgICAgICAgICAgICh4KSA9PiB4ID09PSB0aGlzLmN1cnJlbnREYXRhPy5kYXRhLFxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgdGhpcy51dGlsU2VydmljZS5zZW5kQkkoZmFsc2UpO1xuICAgICAgLy8gT3B0aW9uYWw6IEhhbmRsZSBlcnJvcnMgaWYgbmVlZGVkXG4gICAgfVxuICB9XG4gIHN0cmluZ2lmeSh2YWw6IGFueSkge1xuICAgIHJldHVybiBKU09OLnN0cmluZ2lmeSh2YWwpO1xuICB9XG4gIGdlbmVyYXRlVW5pcXVlSWQoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gJ18nICsgTWF0aC5yYW5kb20oKS50b1N0cmluZygzNikuc3Vic3RyKDIsIDkpO1xuICB9XG5cbiAgYWRkT3JVcGRhdGVGb3JtUHJvcGVydHkoZm9ybTogRm9ybUVudGl0eSwgcHJvcGVydHk6IEZvcm1Qcm9wZXJ0eSk6IHZvaWQge1xuICAgIGlmICghcHJvcGVydHkuaWQpIHtcbiAgICAgIHByb3BlcnR5LmlkID0gdGhpcy5nZW5lcmF0ZVVuaXF1ZUlkKCk7XG4gICAgfVxuXG4gICAgY29uc3QgaW5kZXggPSBmb3JtLlByb3BlcnRpZXMuZmluZEluZGV4KChwKSA9PiBwLmlkID09PSBwcm9wZXJ0eS5pZCk7XG5cbiAgICBpZiAoaW5kZXggIT09IC0xKSB7XG4gICAgICBmb3JtLlByb3BlcnRpZXNbaW5kZXhdID0geyAuLi5wcm9wZXJ0eSB9OyAvLyB1cGRhdGVcbiAgICB9IGVsc2Uge1xuICAgICAgZm9ybS5Qcm9wZXJ0aWVzLnB1c2goeyAuLi5wcm9wZXJ0eSB9KTsgLy8gYWRkXG4gICAgfVxuXG4gICAgZm9ybS5EYXRhU3RhdGUgPVxuICAgICAgZm9ybS5EYXRhU3RhdGUgPT09IE9iamVjdFN0YXRlLk5ld1xuICAgICAgICA/IE9iamVjdFN0YXRlLk5ld1xuICAgICAgICA6IE9iamVjdFN0YXRlLkNoYW5nZWQ7XG4gIH1cbiAgZGVsZXRlUHJvcGVydHkocHJvcGVydHlJZDogc3RyaW5nKSB7XG4gICAgaWYgKCF0aGlzLmRhdGEgfHwgdGhpcy5kYXRhLmxlbmd0aCA9PT0gMCkgcmV0dXJuO1xuXG4gICAgY29uc3QgZm9ybSA9IHRoaXMuZGF0YVswXTtcbiAgICBmb3JtLlByb3BlcnRpZXMgPSBmb3JtLlByb3BlcnRpZXMuZmlsdGVyKFxuICAgICAgKHA6IEZvcm1Qcm9wZXJ0eSkgPT4gcC5JZCAhPT0gcHJvcGVydHlJZCxcbiAgICApO1xuXG4gICAgdGhpcy5jYXJkRGF0YSA9IHRoaXMuY2FyZERhdGEuZmlsdGVyKChjKSA9PiBjLmRhdGEuSWQgIT09IHByb3BlcnR5SWQpO1xuXG4gICAgaWYgKHRoaXMuY3VycmVudERhdGEgJiYgdGhpcy5jdXJyZW50RGF0YS5kYXRhLklkID09PSBwcm9wZXJ0eUlkKSB7XG4gICAgICB0aGlzLmN1cnJlbnREYXRhID0gbnVsbDtcbiAgICAgIHRoaXMuY2FyZERhdGFWaWV3LmNsZWFyRGF0YSgpO1xuICAgIH1cblxuXG4gICAgdGhpcy5kYXRhID0gWy4uLnRoaXMuZGF0YV07XG5cbiAgICB0aGlzLnV0aWxTZXJ2aWNlLnNob3dJbmZvKFwiUHJvcGVydHkgcmVtb3ZlZFwiKTtcbiAgfVxuXG5cbiAgYXN5bmMgc2F2ZUFsbFByb3BlcnRpZXMoKSB7XG4gICAgaWYgKCF0aGlzLmRhdGEgfHwgdGhpcy5kYXRhLmxlbmd0aCA9PT0gMCkgcmV0dXJuO1xuICAgIGNvbnN0IGZvcm0gPSB0aGlzLmRhdGFbMF07XG4gICAgZm9ybS5Qcm9wZXJ0aWVzLmZvckVhY2goKHByb3A6IEZvcm1Qcm9wZXJ0eSwgaW5kZXg6IG51bWJlcikgPT4ge1xuICAgICAgcHJvcC5JZCA9IGluZGV4LnRvU3RyaW5nKCk7XG4gICAgICBwcm9wLk1heFZhbHVlID0gTnVtYmVyKHByb3AuTWF4VmFsdWUpO1xuICAgICAgcHJvcC5NaW5WYWx1ZSA9IE51bWJlcihwcm9wLk1pblZhbHVlKTtcbiAgICAgIHByb3AuT3B0aW9ucyA9IEFycmF5LmlzQXJyYXkocHJvcC5PcHRpb25zKVxuICAgICAgICA/IHByb3AuT3B0aW9ucy5qb2luKFwiLFwiKVxuICAgICAgICA6IHByb3AuT3B0aW9ucyA/PyBcIlwiO1xuICAgICAgcHJvcC5WYWx1ZSA9IHByb3AuVmFsdWUgPz8gXCJcIjtcbiAgICB9KTtcblxuXG5cblxuXG5cbiAgICBjb25zdCBpbnZhbGlkID0gZm9ybS5Qcm9wZXJ0aWVzLmZpbmQoXG4gICAgICAocCkgPT4gIXAuTmFtZSB8fCBwLk5hbWUudHJpbSgpLmxlbmd0aCA9PT0gMFxuICAgICk7XG4gICAgaWYgKGludmFsaWQpIHtcbiAgICAgIHRoaXMudXRpbFNlcnZpY2Uuc2hvd0luZm8oXCJOYW1lIGNhbm5vdCBiZSBlbXB0eVwiKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBmb3JtLkRhdGFTdGF0ZSA9IE9iamVjdFN0YXRlLkNoYW5nZWQ7XG5cbiAgICB0aGlzLnV0aWxTZXJ2aWNlLnNlbmRCSSh0cnVlKTtcblxuICAgIGNvbnN0IHJlcyA9IGF3YWl0IHRoaXMuc2VydmVyLnBvc3QoXG4gICAgICBcIlNhdmVGb3JtRW50aXRpZXNcIixcbiAgICAgIFtmb3JtXSxcbiAgICAgIHRoaXMuZW52U3ZjLmVudmlyb25tZW50LldvcmtGbG93QVBJXG4gICAgKTtcblxuICAgIHRoaXMudXRpbFNlcnZpY2Uuc2VuZEJJKGZhbHNlKTtcblxuICAgIGlmIChyZXMgaW5zdGFuY2VvZiBFcnJvclJlc3BvbnNlKSB7XG4gICAgICB0aGlzLnV0aWxTZXJ2aWNlLnNob3dFcnJvcihcIkFuIGVycm9yIG9jY3VycmVkIHdoaWxlIHNhdmluZ1wiKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy51dGlsU2VydmljZS5zaG93U3VjY2VzcyhcIkZvcm0gcHJvcGVydGllcyBzYXZlZCBzdWNjZXNzZnVsbHlcIik7XG5cblxuXG4gICAgfVxuICB9XG5cblxuXG5cbiAgYXN5bmMgc2F2ZVZpYVRhYmxlKHJvdzogRm9ybVByb3BlcnR5LCBjYWxsQmFjazogKCkgPT4gYW55KSB7XG4gICAgaWYgKCFyb3cpIHJldHVybjtcblxuICAgIGNvbnN0IHByb3BlcnR5OiBGb3JtUHJvcGVydHkgPSByb3cgYXMgRm9ybVByb3BlcnR5O1xuICAgIHByb3BlcnR5Lk1heFZhbHVlID0gTnVtYmVyKHByb3BlcnR5Lk1heFZhbHVlKTtcbiAgICBwcm9wZXJ0eS5NaW5WYWx1ZSA9IE51bWJlcihwcm9wZXJ0eS5NaW5WYWx1ZSk7XG4gICAgcHJvcGVydHkuT3B0aW9ucyA9IHRoaXMuY2hpcEFycmF5Py50b1N0cmluZygpO1xuICAgIHByb3BlcnR5LlZhbHVlID0gJyc7XG5cbiAgICBpZiAoIXByb3BlcnR5Lk5hbWUgfHwgcHJvcGVydHkuTmFtZS50cmltKCkubGVuZ3RoID09PSAwKSB7XG4gICAgICB0aGlzLnV0aWxTZXJ2aWNlLnNob3dJbmZvKCdOYW1lIGNhbm5vdCBiZSBlbXB0eScpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMudXRpbFNlcnZpY2Uuc2VuZEJJKHRydWUpO1xuXG4gICAgY29uc3QgZm9ybSA9IHRoaXMuZGF0YVswXTtcbiAgICBjb25zdCBpbmRleCA9IGZvcm0uUHJvcGVydGllcy5maW5kSW5kZXgoKHApID0+IHAuaWQgPT09IHByb3BlcnR5LmlkKTtcblxuICAgIGlmIChpbmRleCA+IC0xKSB7XG4gICAgICBmb3JtLlByb3BlcnRpZXNbaW5kZXhdID0gcHJvcGVydHk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGZvcm0uUHJvcGVydGllcy5wdXNoKHByb3BlcnR5KTtcbiAgICB9XG5cbiAgICBmb3JtLkRhdGFTdGF0ZSA9XG4gICAgICBmb3JtLkRhdGFTdGF0ZSA9PT0gT2JqZWN0U3RhdGUuTmV3XG4gICAgICAgID8gT2JqZWN0U3RhdGUuTmV3XG4gICAgICAgIDogT2JqZWN0U3RhdGUuQ2hhbmdlZDtcblxuICAgIGNvbnN0IHJlcyA9IGF3YWl0IHRoaXMuc2VydmVyLnBvc3QoXG4gICAgICAnU2F2ZUZvcm1FbnRpdGllcycsXG4gICAgICB0aGlzLmRhdGEsXG4gICAgICB0aGlzLmVudlN2Yy5lbnZpcm9ubWVudC5Xb3JrRmxvd0FQSSxcbiAgICApO1xuXG4gICAgdGhpcy51dGlsU2VydmljZS5zZW5kQkkoZmFsc2UpO1xuXG4gICAgaWYgKHJlcyBpbnN0YW5jZW9mIEVycm9yUmVzcG9uc2UpIHtcbiAgICAgIHRoaXMudXRpbFNlcnZpY2Uuc2hvd0Vycm9yKCdBbiBlcnJvciBvY2N1cnJlZCB3aGlsZSBzYXZpbmcnKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy51dGlsU2VydmljZS5zaG93U3VjY2VzcygnRm9ybSBwcm9wZXJ0eSBzYXZlZCBzdWNjZXNzZnVsbHknKTtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IHJlcyBhcyBGb3JtRW50aXR5W107XG4gICAgICB0aGlzLmNsb3NlUG9wVXAocm93KTtcbiAgICAgIGNhbGxCYWNrKCk7XG4gICAgICBpZiAocmVzdWx0Lmxlbmd0aCA+IDApIHtcbiAgICAgICAgY29uc3QgdXBkYXRlZEZvcm0gPSByZXN1bHRbMF07XG4gICAgICAgIHRoaXMuZGF0YVswXS5Qcm9wZXJ0aWVzID0gdXBkYXRlZEZvcm0uUHJvcGVydGllcztcbiAgICAgICAgdGhpcy5kYXRhID0gWy4uLnRoaXMuZGF0YV07XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgdG9nZ2xlSXNWYWxpZGF0ZSh2YWx1ZTogYm9vbGVhbiwgcm93OiBGb3JtUHJvcGVydHkpOiB2b2lkIHtcbiAgICBjb25zdCBuZXdWYWx1ZSA9ICF2YWx1ZTtcbiAgICByb3cuSXNSZXF1aXJlZCA9IG5ld1ZhbHVlO1xuICAgIGNvbnNvbGUubG9nKHJvdyk7XG4gIH1cbiAgb25LZXlEb3duKGU6IEtleWJvYXJkRXZlbnQsIGRhdGE6IEZvcm1Qcm9wZXJ0eSkge1xuICAgIC8vIGFsbG93IG5hdmlnYXRpb24gLyBjb250cm9sIGtleXNcbiAgICBjb25zdCBhbGxvd2VkID0gW1xuICAgICAgJ0JhY2tzcGFjZScsXG4gICAgICAnRGVsZXRlJyxcbiAgICAgICdBcnJvd0xlZnQnLFxuICAgICAgJ0Fycm93UmlnaHQnLFxuICAgICAgJ0Fycm93VXAnLFxuICAgICAgJ0Fycm93RG93bicsXG4gICAgICAnVGFiJyxcbiAgICAgICdFbnRlcicsXG4gICAgICAnSG9tZScsXG4gICAgICAnRW5kJyxcbiAgICAgICdFc2NhcGUnLFxuICAgIF07XG4gICAgaWYgKGFsbG93ZWQuaW5jbHVkZXMoZS5rZXkpKSByZXR1cm47XG5cbiAgICAvLyBibG9jayB0aGUgU3BhY2Uga2V5IChjb3ZlcnMgbW9kZXJuICYgb2xkIGJyb3dzZXJzKVxuICAgIGlmIChlLmtleSA9PT0gJyAnIHx8IGUuY29kZSA9PT0gJ1NwYWNlJyB8fCBlLmtleSA9PT0gJ1NwYWNlYmFyJykge1xuICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgfVxuXG4gIG9uUGFzdGUoZTogQ2xpcGJvYXJkRXZlbnQsIGRhdGE6IEZvcm1Qcm9wZXJ0eSkge1xuICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICBjb25zdCBwYXN0ZWQgPSBlLmNsaXBib2FyZERhdGE/LmdldERhdGEoJ3RleHQnKSA/PyAnJztcbiAgICBjb25zdCBjbGVhbmVkID0gcGFzdGVkLnJlcGxhY2UoL1xccysvZywgJycpO1xuICAgIGNvbnN0IGlucHV0ID0gZS50YXJnZXQgYXMgSFRNTElucHV0RWxlbWVudDtcblxuICAgIGNvbnN0IHN0YXJ0ID0gaW5wdXQuc2VsZWN0aW9uU3RhcnQgPz8gaW5wdXQudmFsdWUubGVuZ3RoO1xuICAgIGNvbnN0IGVuZCA9IGlucHV0LnNlbGVjdGlvbkVuZCA/PyBzdGFydDtcbiAgICBjb25zdCBuZXdWYWwgPVxuICAgICAgaW5wdXQudmFsdWUuc2xpY2UoMCwgc3RhcnQpICsgY2xlYW5lZCArIGlucHV0LnZhbHVlLnNsaWNlKGVuZCk7XG5cbiAgICBpbnB1dC52YWx1ZSA9IG5ld1ZhbDtcbiAgICBkYXRhLlByb3BlcnR5TmFtZSA9IG5ld1ZhbDtcbiAgICB0aGlzLnVwZGF0ZVRhYmxlPy4oKTtcbiAgfVxuXG4gIG9uSW5wdXQoZTogRXZlbnQsIGRhdGE6IEZvcm1Qcm9wZXJ0eSkge1xuICAgIGNvbnN0IGlucHV0ID0gZS50YXJnZXQgYXMgSFRNTElucHV0RWxlbWVudDtcbiAgICBjb25zdCBjbGVhbmVkID0gaW5wdXQudmFsdWUucmVwbGFjZSgvXFxzKy9nLCAnJyk7XG4gICAgaWYgKGlucHV0LnZhbHVlICE9PSBjbGVhbmVkKSB7XG4gICAgICBjb25zdCBwb3MgPSBpbnB1dC5zZWxlY3Rpb25TdGFydCA/PyBjbGVhbmVkLmxlbmd0aDtcbiAgICAgIGlucHV0LnZhbHVlID0gY2xlYW5lZDtcblxuICAgICAgY29uc3QgbmV3UG9zID0gTWF0aC5taW4ocG9zLCBjbGVhbmVkLmxlbmd0aCk7XG4gICAgICBzZXRUaW1lb3V0KCgpID0+IGlucHV0LnNldFNlbGVjdGlvblJhbmdlKG5ld1BvcywgbmV3UG9zKSwgMCk7XG4gICAgfVxuICAgIGRhdGEuUHJvcGVydHlOYW1lID0gY2xlYW5lZDtcbiAgICB0aGlzLnVwZGF0ZVRhYmxlPy4oKTtcbiAgfVxuXG4gIHVwZGF0ZVRhYmxlKCkge1xuICAgIHRoaXMuZGF0YSA9IHRoaXMuZGF0YS5tYXAoKHgpID0+IHgpO1xuICB9XG5cbiAgY29udmVydFRvSW50KHZhbHVlOiBhbnksIGRhdGE6IGFueSwgcHJvcDogc3RyaW5nKSB7XG4gICAgZGF0YVtwcm9wXSA9IHBhcnNlSW50KHZhbHVlKTtcbiAgfVxuICBnZXRTdHJpbmdWYWx1ZShkYXRhOiBhbnksIHByb3A6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGRhdGFbcHJvcF0udG9TdHJpbmcoKTtcbiAgfVxuXG4gIGNoZWNrTWluTWF4KHZhbHVlOiBzdHJpbmcpIHtcbiAgICB2YXIgc2hvd01pbm1heCA9IGZhbHNlO1xuICAgIHN3aXRjaCAodmFsdWUpIHtcbiAgICAgIGNhc2UgJ1N0cmluZyc6XG4gICAgICAgIHNob3dNaW5tYXggPSB0cnVlO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ0ludCc6XG4gICAgICAgIHNob3dNaW5tYXggPSB0cnVlO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ0RlY2ltYWwnOlxuICAgICAgICBzaG93TWlubWF4ID0gdHJ1ZTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdGbG9hdCc6XG4gICAgICAgIHNob3dNaW5tYXggPSB0cnVlO1xuICAgICAgICBicmVhaztcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHNob3dNaW5tYXggPSBmYWxzZTtcbiAgICAgICAgYnJlYWs7XG4gICAgfVxuICAgIHJldHVybiAodGhpcy5oaWRlTWluTWF4ID0gc2hvd01pbm1heCk7XG4gIH1cblxuICBuYXZpZ2F0ZVRvRmllbGRzKCkge1xuICAgIGNvbnN0IHF1ZXJ5UGFyYW1zID0gdGhpcy5xdWVyeVBhcmFtcztcbiAgICB0aGlzLnJvdXRlci5uYXZpZ2F0ZShbYCR7dGhpcy5wYXRofWBdLCB7IHF1ZXJ5UGFyYW1zIH0pO1xuICB9XG4gIG9uQ2xvc2UoKSB7XG4gICAgdGhpcy5pc09wZW4gPSBmYWxzZTtcbiAgfVxuXG4gIGdvQmFjaygpIHtcbiAgICB0aGlzLl9sb2NhdGlvbi5iYWNrKCk7XG4gIH1cbiAgaXNEcm9wZG93bk9wZW4oaXRlbTogYW55KTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMub3BlbkRyb3Bkb3duSWQgPT09IGl0ZW0uaWQ7XG4gIH1cblxuICBvblZpZXdDaGFuZ2UoaXNHcmlkVmlldzogYm9vbGVhbik6IHZvaWQgeyB9XG5cbiAgb25TdGF0ZUNoYW5nZShldmVudDogeyBrZXk6IHN0cmluZzsgdmFsdWU6IGJvb2xlYW4gfSk6IHZvaWQge1xuICAgIHN3aXRjaCAoZXZlbnQua2V5KSB7XG4gICAgICBjYXNlICdjcmVhdGUnOlxuICAgICAgICBjb25zdCBuZXdJZCA9IGBwcm9wLSR7RGF0ZS5ub3coKX1gO1xuXG4gICAgICAgIHZhciBuZXdVc2VyOiBGb3JtUHJvcGVydHkgPSB7XG4gICAgICAgICAgTWF4VmFsdWU6IDEwMCxcbiAgICAgICAgICBOYW1lOiAnJyxcbiAgICAgICAgICBWYWx1ZTogJycsXG4gICAgICAgICAgTWluVmFsdWU6IDEwMCxcbiAgICAgICAgICBPcHRpb25zOiAnJyxcbiAgICAgICAgICBJc1JlcXVpcmVkOiBmYWxzZSxcbiAgICAgICAgICBJc1JlYWRPbmx5OiBmYWxzZSxcbiAgICAgICAgICBEYXRhVHlwZTogRGF0YVR5cGUuVGV4dCxcbiAgICAgICAgICBEZWZhdWx0VmFsdWU6ICcnLFxuICAgICAgICAgIFByb3BlcnR5TmFtZTogJycsXG4gICAgICAgICAgaWQ6IG5ld0lkLFxuICAgICAgICAgIElkOiBuZXdJZCxcbiAgICAgICAgfTtcblxuICAgICAgICB0aGlzLmNoaXBBcnJheSA9IFtdO1xuXG4gICAgICAgIGNvbnN0IGNhcmREYXRhOiBDYXJkRGF0YSA9IHtcbiAgICAgICAgICBzZWxlY3RlZDogZmFsc2UsXG4gICAgICAgICAgdGl0bGU6IG5ld1VzZXIuTmFtZSxcbiAgICAgICAgICBkYXRhOiBuZXdVc2VyLFxuICAgICAgICAgIGJvZHk6IFtdLFxuICAgICAgICAgIGNoaWxkcmVuOiBbXSxcbiAgICAgICAgfTtcbiAgICAgICAgaWYgKHRoaXMuZGF0YSAmJiB0aGlzLmRhdGEubGVuZ3RoID4gMCkge1xuICAgICAgICAgIHRoaXMuZGF0YVswXS5Qcm9wZXJ0aWVzID0gW1xuICAgICAgICAgICAgLi4uKHRoaXMuZGF0YVswXS5Qcm9wZXJ0aWVzID8/IFtdKSxcbiAgICAgICAgICAgIG5ld1VzZXIsXG4gICAgICAgICAgXTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmNhcmREYXRhLnB1c2goY2FyZERhdGEpO1xuICAgICAgICB0aGlzLnVzZXJDYXJkQ2xpY2tlZChjYXJkRGF0YSk7XG5cbiAgICAgICAgdGhpcy5kYXRhVmlldy5pc1RhYmxlVmlldyA9IGZhbHNlO1xuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSAnZmlsdGVyJzpcbiAgICAgICAgdGhpcy5zaG93RmlsdGVyID0gZXZlbnQudmFsdWU7XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBjYXNlICdzb3J0JzpcbiAgICAgICAgdGhpcy5zaG93U29ydCA9IGV2ZW50LnZhbHVlO1xuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSAnY29sdW1uJzpcbiAgICAgICAgdGhpcy5zaG93Q29sdW1uID0gZXZlbnQudmFsdWU7XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBkZWZhdWx0OlxuICAgICAgICBicmVhaztcbiAgICB9XG4gIH1cblxuICByZXNldCgpIHtcbiAgICB0aGlzLnNraXAgPSAwO1xuICAgIHRoaXMucGFnZVNpemUgPSAxMDtcbiAgfVxuICBhc3luYyBvblNlYXJjaChldmVudDogeyBrZXk6IHN0cmluZzsgdmFsdWU6IHN0cmluZyB9KSB7XG4gICAgdGhpcy5zZWFyY2hUZXJtID0gZXZlbnQudmFsdWU7XG4gICAgdGhpcy5yZXNldCgpO1xuICAgIGlmICghdGhpcy5zZWFyY2hUZXJtKSB7XG4gICAgICB0aGlzLmdldFByb3BlcnRpZXModGhpcy5JZCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy51dGlsU2VydmljZS5zZW5kQkkodHJ1ZSk7XG5cbiAgICB0cnkge1xuICAgICAgY29uc3QgcmVzID0gYXdhaXQgdGhpcy5zZXJ2ZXIuZ2V0KFxuICAgICAgICBgR2V0Rm9ybUVudGl0aWVzV2l0aFBhcmFtLyR7dGhpcy5zZWFyY2hUZXJtfS8ke3RoaXMuc2tpcH0vJHt0aGlzLnBhZ2VTaXplfS9DcmVhdGVkQXQvYXNjYFxuICAgICAgKTtcbiAgICAgIHRoaXMudXRpbFNlcnZpY2Uuc2VuZEJJKGZhbHNlKTtcblxuICAgICAgaWYgKHJlcyBpbnN0YW5jZW9mIEVycm9yUmVzcG9uc2UpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcignRXJyb3IgZHVyaW5nIHNlYXJjaDonLCByZXMpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5wYWdlU3RhdGUgPSByZXMgYXMgUGFnZWRSZXN1bHQ8Rm9ybUVudGl0eT47XG4gICAgICAgIHZhciByZXN1bHQgPSAocmVzIGFzIFBhZ2VkUmVzdWx0PEZvcm1FbnRpdHk+KS5SZXN1bHQ7XG4gICAgICAgIHRoaXMuZGF0YSA9IHJlc3VsdDtcblxuICAgICAgICB0aGlzLnNldFVwQ2FyZERhdGEoKTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgY29uc29sZS5lcnJvcignU2VhcmNoIGVycm9yOicsIGVycm9yKTtcbiAgICB9IGZpbmFsbHkge1xuICAgIH1cbiAgfVxuICBzaG93VGFibGVWaWV3OiBib29sZWFuID0gZmFsc2U7XG4gIG9uU2VsZWN0aW9uQ2hhbmdlKHNlbGVjdGVkUm93czogRm9ybVByb3BlcnR5W10pIHsgfVxuICByZXRyeU1lc3NhZ2UoKSB7IH1cblxuICBvbkNvbHVtbnNVcGRhdGVkKHVwZGF0ZWRDb2x1bW5zOiBJRGF0YUZpbHRlcltdKSB7XG4gICAgY29uc3QgdXBkYXRlZENvbHVtbkRlZjogQ29sdW1uRGVmaW5pdGlvbjxGb3JtUHJvcGVydHk+W10gPSBbXTtcbiAgICB0aGlzLnNob3dDb2x1bW4gPSBmYWxzZTtcbiAgICB0aGlzLnNlbGVjdGVkQ29sdW1uVGFibGVDb3VudCA9IHVwZGF0ZWRDb2x1bW5zLmxlbmd0aDtcbiAgICB1cGRhdGVkQ29sdW1ucy5mb3JFYWNoKChjb2wpID0+IHtcbiAgICAgIGNvbnN0IG1hdGNoaW5nQ29sID0gdGhpcy50YXNrVXNlcnNTdmMuZm9ybUZpZWxkQ29sdW1ucy5maW5kKFxuICAgICAgICAoY29sdW1uKSA9PiBjb2x1bW4uaGVhZGVyID09PSBjb2wubmFtZSB8fCBjb2x1bW4uaWQgPT09IGNvbC5uYW1lLFxuICAgICAgKTtcbiAgICAgIGlmIChtYXRjaGluZ0NvbCkge1xuICAgICAgICB1cGRhdGVkQ29sdW1uRGVmLnB1c2gobWF0Y2hpbmdDb2wpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgdGhpcy52aXNpYmxlQ29sdW1uRGVmID0gWy4uLnVwZGF0ZWRDb2x1bW5EZWZdO1xuICB9XG5cbiAgYXN5bmMgdXBkYXRlRmlsdGVyc0FuZFNvcnRzKGlzU2VhcmNoOiBib29sZWFuID0gZmFsc2UpIHtcbiAgICBpZiAoIWlzU2VhcmNoKSB7XG4gICAgICB0aGlzLmRhdGFWaWV3Lm9uQ2xlYXJTZWFyY2goKTtcbiAgICAgIHRoaXMuY3VycmVudFNlYXJjaFRlcm0gPSAnJztcbiAgICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcbiAgICAgIGNvbnN0IGNsaWNrRXZlbnQgPSBuZXcgTW91c2VFdmVudCgnY2xpY2snLCB7XG4gICAgICAgIGJ1YmJsZXM6IHRydWUsXG4gICAgICAgIGNhbmNlbGFibGU6IHRydWUsXG4gICAgICAgIHZpZXc6IHdpbmRvdyxcbiAgICAgIH0pO1xuICAgICAgZG9jdW1lbnQuZGlzcGF0Y2hFdmVudChjbGlja0V2ZW50KTtcbiAgICB9XG4gICAgdmFyIHBheWxvYWQ6IFNlYXJjaFByb3BlcnR5VmFsdWVbXSA9IHRoaXMuY3VycmVudEZpbHRlcnMubWFwKCh4KSA9PiB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBQcm9wZXJ0eU5hbWU6XG4gICAgICAgICAgVGFza1VzZXJQcm9wZXJ0eU1hcFt4Lm5hbWUgYXMga2V5b2YgdHlwZW9mIFRhc2tVc2VyUHJvcGVydHlNYXBdLFxuICAgICAgICBFbnRpdHlWYWx1ZTogeC52YWx1ZSxcbiAgICAgICAgT3BlcmF0b3I6IFNlYXJjaE9wZXJhdG9yLkFuZCxcbiAgICAgICAgU2lnbjpcbiAgICAgICAgICB4LmNvbmRpdGlvbiAmJiBPYmplY3Qua2V5cyhGaWx0ZXJUeXBlcykuaW5jbHVkZXMoeC5jb25kaXRpb24pXG4gICAgICAgICAgICA/IChGaWx0ZXJUeXBlc1tcbiAgICAgICAgICAgICAgeC5jb25kaXRpb24gYXMga2V5b2YgdHlwZW9mIEZpbHRlclR5cGVzXG4gICAgICAgICAgICBdIGFzIHVua25vd24gYXMgU2VhcmNoUHJvcGVydHlTaWduKVxuICAgICAgICAgICAgOiBTZWFyY2hQcm9wZXJ0eVNpZ24uRVEsXG4gICAgICAgIFR5cGU6XG4gICAgICAgICAgeC5uYW1lID09IFRhc2tVc2VyUHJvcGVydHlOYW1lLkRhdGVcbiAgICAgICAgICAgID8gU2VhcmNoUHJvcGVydHlWYWx1ZVR5cGUuRGF0ZVxuICAgICAgICAgICAgOiBTZWFyY2hQcm9wZXJ0eVZhbHVlVHlwZS5TdHJpbmcsXG4gICAgICB9O1xuICAgIH0pO1xuICAgIC8vIHBheWxvYWQucHVzaCh7XG4gICAgLy8gICBQcm9wZXJ0eU5hbWU6ICdBUElLZXknLFxuICAgIC8vICAgRW50aXR5VmFsdWU6IHRoaXMuZW52U3ZjLmVudmlyb25tZW50LkFQSUtleSxcbiAgICAvLyAgIE9wZXJhdG9yOiBTZWFyY2hPcGVyYXRvci5BbmQsXG4gICAgLy8gICBTaWduOiBTZWFyY2hQcm9wZXJ0eVNpZ24uRVEsXG4gICAgLy8gfSk7XG4gICAgY29uc3Qgc29ydFBhcmFtOiB7IFBhcmFtOiBzdHJpbmc7IE9yZGVyOiBzdHJpbmcgfSB8IG51bGwgPVxuICAgICAgdGhpcy5jdXJyZW50U29ydHMubGVuZ3RoID4gMFxuICAgICAgICA/IHtcbiAgICAgICAgICBQYXJhbTpcbiAgICAgICAgICAgIFRhc2tVc2VyUHJvcGVydHlNYXBbXG4gICAgICAgICAgICB0aGlzLmN1cnJlbnRTb3J0c1swXS5uYW1lIGFzIGtleW9mIHR5cGVvZiBUYXNrVXNlclByb3BlcnR5TWFwXG4gICAgICAgICAgICBdLFxuICAgICAgICAgIE9yZGVyOiB0aGlzLmN1cnJlbnRTb3J0c1swXS52YWx1ZSxcbiAgICAgICAgfVxuICAgICAgICA6IG51bGw7XG4gICAgY29uc3Qgc2VhcmNoVGVybUV4aXN0cyA9IHRoaXMuY3VycmVudFNlYXJjaFRlcm0udHJpbSgpLmxlbmd0aCA+IDA7XG4gICAgdGhpcy51dGlsU2VydmljZS5zZW5kQkkodHJ1ZSk7XG4gICAgY29uc3QgcmVzID0gc2VhcmNoVGVybUV4aXN0c1xuICAgICAgPyBhd2FpdCB0aGlzLnNlcnZlci5nZXQoXG4gICAgICAgIGBHZXRUYXNrVXNlcldpdGhQYXJhbS8ke3RoaXMuY3VycmVudFNlYXJjaFRlcm0udHJpbSgpfS8wLyR7dGhpcy5wYWdlU2l6ZVxuICAgICAgICB9YCxcbiAgICAgICAgdGhpcy5lbnZTdmMuZW52aXJvbm1lbnQuV29ya0Zsb3dBUElcbiAgICAgIClcbiAgICAgIDogYXdhaXQgdGhpcy5zZXJ2ZXIucG9zdChcbiAgICAgICAgc29ydFBhcmFtXG4gICAgICAgICAgPyBgU2VhcmNoVGFza1VzZXJzLzAvJHt0aGlzLnBhZ2VTaXplfS8ke3NvcnRQYXJhbS5QYXJhbX0vJHtzb3J0UGFyYW0uT3JkZXJ9YFxuICAgICAgICAgIDogYFNlYXJjaFRhc2tVc2Vycy8wLyR7dGhpcy5wYWdlU2l6ZX1gLFxuICAgICAgICBwYXlsb2FkLFxuICAgICAgICB0aGlzLmVudlN2Yy5lbnZpcm9ubWVudC5Xb3JrRmxvd0FQSVxuICAgICAgKTtcbiAgICB0aGlzLnV0aWxTZXJ2aWNlLnNlbmRCSShmYWxzZSk7XG4gICAgaWYgKHJlcyBpbnN0YW5jZW9mIEVycm9yUmVzcG9uc2UpIHtcbiAgICAgIHRoaXMuY3VycmVudEZpbHRlcnMgPSBbXTtcbiAgICAgIHRoaXMuY3VycmVudFNvcnRzID0gW107XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnBhZ2VTdGF0ZSA9IHJlcyBhcyBQYWdlZFJlc3VsdDxGb3JtRW50aXR5PjtcbiAgICAgIHZhciByZXN1bHQgPSAocmVzIGFzIFBhZ2VkUmVzdWx0PEZvcm1FbnRpdHk+KS5SZXN1bHQ7XG4gICAgICB0aGlzLmRhdGEgPSByZXN1bHQubWFwKCh4KSA9PiB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgLi4ueCxcbiAgICAgICAgICBpZDogeC5JZCxcbiAgICAgICAgfTtcbiAgICAgIH0pO1xuICAgICAgdGhpcy5zZXRVcENhcmREYXRhKCk7XG4gICAgfVxuICB9XG4gIGFzeW5jIGxvYWRNb3JlRmlsdGVyc0FuZFNvcnRzKCk6IFByb21pc2U8XG4gICAgUGFnZWRSZXN1bHQ8Rm9ybUVudGl0eT4gfCB1bmRlZmluZWRcbiAgPiB7XG4gICAgaWYgKCF0aGlzLnBhZ2VTdGF0ZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB2YXIgcGF5bG9hZDogU2VhcmNoUHJvcGVydHlWYWx1ZVtdID0gdGhpcy5jdXJyZW50RmlsdGVycy5tYXAoKHgpID0+IHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIFByb3BlcnR5TmFtZTpcbiAgICAgICAgICBUYXNrVXNlclByb3BlcnR5TWFwW3gubmFtZSBhcyBrZXlvZiB0eXBlb2YgVGFza1VzZXJQcm9wZXJ0eU1hcF0sXG4gICAgICAgIEVudGl0eVZhbHVlOiB4LnZhbHVlLFxuICAgICAgICBPcGVyYXRvcjogU2VhcmNoT3BlcmF0b3IuQW5kLFxuICAgICAgICBTaWduOlxuICAgICAgICAgIHguY29uZGl0aW9uICYmIE9iamVjdC5rZXlzKEZpbHRlclR5cGVzKS5pbmNsdWRlcyh4LmNvbmRpdGlvbilcbiAgICAgICAgICAgID8gKEZpbHRlclR5cGVzW1xuICAgICAgICAgICAgICB4LmNvbmRpdGlvbiBhcyBrZXlvZiB0eXBlb2YgRmlsdGVyVHlwZXNcbiAgICAgICAgICAgIF0gYXMgdW5rbm93biBhcyBTZWFyY2hQcm9wZXJ0eVNpZ24pXG4gICAgICAgICAgICA6IFNlYXJjaFByb3BlcnR5U2lnbi5FUSxcbiAgICAgICAgVHlwZTpcbiAgICAgICAgICB4Lm5hbWUgPT0gVGFza1VzZXJQcm9wZXJ0eU5hbWUuRGF0ZVxuICAgICAgICAgICAgPyBTZWFyY2hQcm9wZXJ0eVZhbHVlVHlwZS5EYXRlXG4gICAgICAgICAgICA6IFNlYXJjaFByb3BlcnR5VmFsdWVUeXBlLlN0cmluZyxcbiAgICAgIH07XG4gICAgfSk7XG4gICAgY29uc3Qgc29ydFBhcmFtOiB7IFBhcmFtOiBzdHJpbmc7IE9yZGVyOiBzdHJpbmcgfSB8IG51bGwgPVxuICAgICAgdGhpcy5jdXJyZW50U29ydHMubGVuZ3RoID4gMFxuICAgICAgICA/IHtcbiAgICAgICAgICBQYXJhbTpcbiAgICAgICAgICAgIFRhc2tVc2VyUHJvcGVydHlNYXBbXG4gICAgICAgICAgICB0aGlzLmN1cnJlbnRTb3J0c1swXS5uYW1lIGFzIGtleW9mIHR5cGVvZiBUYXNrVXNlclByb3BlcnR5TWFwXG4gICAgICAgICAgICBdLFxuICAgICAgICAgIE9yZGVyOiB0aGlzLmN1cnJlbnRTb3J0c1swXS52YWx1ZSxcbiAgICAgICAgfVxuICAgICAgICA6IG51bGw7XG4gICAgY29uc3Qgc2VhcmNoVGVybUV4aXN0cyA9IHRoaXMuY3VycmVudFNlYXJjaFRlcm0udHJpbSgpLmxlbmd0aCA+IDA7XG4gICAgdGhpcy51dGlsU2VydmljZS5zZW5kQkkodHJ1ZSk7XG4gICAgY29uc3QgcmVzID0gc2VhcmNoVGVybUV4aXN0c1xuICAgICAgPyBhd2FpdCB0aGlzLnNlcnZlci5nZXQoXG4gICAgICAgIGBHZXRUYXNrVXNlcldpdGhQYXJhbS8ke3RoaXMuY3VycmVudFNlYXJjaFRlcm0udHJpbSgpfS8ke3RoaXMucGFnZVN0YXRlLlNraXBcbiAgICAgICAgfS8ke3RoaXMucGFnZVNpemV9YCxcbiAgICAgICAgdGhpcy5lbnZTdmMuZW52aXJvbm1lbnQuV29ya0Zsb3dBUElcbiAgICAgIClcbiAgICAgIDogYXdhaXQgdGhpcy5zZXJ2ZXIucG9zdChcbiAgICAgICAgc29ydFBhcmFtXG4gICAgICAgICAgPyBgU2VhcmNoVGFza1VzZXJzLyR7dGhpcy5wYWdlU3RhdGUuU2tpcH0vJHt0aGlzLnBhZ2VTaXplfS8ke3NvcnRQYXJhbS5QYXJhbX0vJHtzb3J0UGFyYW0uT3JkZXJ9YFxuICAgICAgICAgIDogYFNlYXJjaFRhc2tVc2Vycy8ke3RoaXMucGFnZVN0YXRlLlNraXB9LyR7dGhpcy5wYWdlU2l6ZX1gLFxuICAgICAgICBwYXlsb2FkLFxuICAgICAgICB0aGlzLmVudlN2Yy5lbnZpcm9ubWVudC5Xb3JrRmxvd0FQSVxuICAgICAgKTtcbiAgICB0aGlzLnV0aWxTZXJ2aWNlLnNlbmRCSShmYWxzZSk7XG4gICAgaWYgKHJlcyBpbnN0YW5jZW9mIEVycm9yUmVzcG9uc2UpIHtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfSBlbHNlIHtcbiAgICAgIHZhciByZXN1bHQgPSByZXMgYXMgUGFnZWRSZXN1bHQ8Rm9ybUVudGl0eT47XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbiAgfVxuICBvbkZpbHRlckFwcGxpZWQoYXBwbGllZEZpbHRlcjogSURhdGFGaWx0ZXJbXSkge1xuICAgIGlmIChBcnJheS5pc0FycmF5KGFwcGxpZWRGaWx0ZXIpKSB7XG4gICAgICB0aGlzLnNlbGVjdGVkRmlsdGVyVGFibGVDb3VudCA9IGFwcGxpZWRGaWx0ZXIubGVuZ3RoO1xuXG4gICAgICB0aGlzLnNob3dGaWx0ZXIgPSBmYWxzZTtcbiAgICAgIGNvbnN0IHF1ZXJ5UGFyYW1zID0gYXBwbGllZEZpbHRlclxuICAgICAgICAuZmlsdGVyKChmaWx0ZXIpID0+IGZpbHRlci5jaGVja2VkKVxuICAgICAgICAubWFwKChmaWx0ZXIpID0+ICh7XG4gICAgICAgICAgUHJvcGVydHlOYW1lOiBmaWx0ZXIubmFtZSxcbiAgICAgICAgICBFbnRpdHlWYWx1ZTogZmlsdGVyLnZhbHVlLFxuICAgICAgICAgIFR5cGU6IGZpbHRlci50eXBlLFxuICAgICAgICAgIE9wZXJhdG9yOiAnQW5kJyxcbiAgICAgICAgICBTaWduOiB0aGlzLmdldENvbmRpdGlvbihmaWx0ZXIuY29uZGl0aW9uKSxcbiAgICAgICAgfSkpO1xuXG4gICAgICB0aGlzLnBvc3RTZWFyY2gocXVlcnlQYXJhbXMpO1xuICAgIH1cbiAgfVxuICBnZXRDb25kaXRpb24odmFsdWU6IGFueSkge1xuICAgIHN3aXRjaCAodmFsdWUpIHtcbiAgICAgIGNhc2UgQ29uZGl0aW9uYWxPcHRpb25zLk9uOlxuICAgICAgICByZXR1cm4gU2VhcmNoUHJvcGVydHlTaWduLkVRO1xuICAgICAgY2FzZSBDb25kaXRpb25hbE9wdGlvbnMuQWZ0ZXI6XG4gICAgICAgIHJldHVybiBTZWFyY2hQcm9wZXJ0eVNpZ24uRVE7XG4gICAgICBjYXNlIENvbmRpdGlvbmFsT3B0aW9ucy5CZWZvcmU6XG4gICAgICAgIHJldHVybiBTZWFyY2hQcm9wZXJ0eVNpZ24uTFQ7XG4gICAgICBjYXNlIENvbmRpdGlvbmFsT3B0aW9ucy5Ob3RFcXVhbDpcbiAgICAgICAgcmV0dXJuIFNlYXJjaFByb3BlcnR5U2lnbi5ORVE7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgfVxuICB9XG4gIG9uU29ydFVwZGF0ZWQodXBkYXRlZFNvcnRzOiBJRGF0YUZpbHRlcltdKSB7XG4gICAgdGhpcy5jdXJyZW50U29ydHMgPSB1cGRhdGVkU29ydHM7XG4gICAgdGhpcy5zaG93U29ydCA9IGZhbHNlO1xuICAgIHRoaXMuc2VsZWN0ZWRTb3J0VGFibGVDb3VudCA9IHVwZGF0ZWRTb3J0cy5sZW5ndGg7XG4gICAgdGhpcy51cGRhdGVGaWx0ZXJzQW5kU29ydHMoKTtcbiAgfVxuXG4gIGhhbmRsZVNlYXJjaChldmVudDogeyBrZXk6IHN0cmluZzsgdmFsdWU6IHN0cmluZyB9KSB7XG4gICAgdGhpcy5zZWFyY2hUZXJtJC5uZXh0KGV2ZW50LnZhbHVlKTtcbiAgfVxuXG4gIGhhbmRsZUV4cG9ydChleHBvcnRlZERhdGE6IFBhcnRpYWw8YW55PltdKSB7XG4gICAgLy8gY29uc29sZS5sb2coJ0V4cG9ydGVkIGRhdGE6JywgZXhwb3J0ZWREYXRhKTtcbiAgICB0aGlzLmRvd25sb2FkQ1NWKGV4cG9ydGVkRGF0YSk7XG4gIH1cbiAgcHJpdmF0ZSBkb3dubG9hZENTVihkYXRhOiBQYXJ0aWFsPGFueT5bXSkge1xuICAgIGNvbnN0IGhlYWRlcnMgPSBPYmplY3Qua2V5cyhkYXRhWzBdKTtcbiAgICBjb25zdCBjc3ZDb250ZW50ID0gW1xuICAgICAgaGVhZGVycy5qb2luKCcsJyksXG4gICAgICAuLi5kYXRhLm1hcCgocm93KSA9PiBoZWFkZXJzLm1hcCgoaGVhZGVyKSA9PiByb3dbaGVhZGVyXSkuam9pbignLCcpKSxcbiAgICBdLmpvaW4oJ1xcbicpO1xuXG4gICAgY29uc3QgYmxvYiA9IG5ldyBCbG9iKFtjc3ZDb250ZW50XSwgeyB0eXBlOiAndGV4dC9jc3Y7Y2hhcnNldD11dGYtODsnIH0pO1xuICAgIGNvbnN0IGxpbmsgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdhJyk7XG4gICAgaWYgKGxpbmsuZG93bmxvYWQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgY29uc3QgdXJsID0gVVJMLmNyZWF0ZU9iamVjdFVSTChibG9iKTtcbiAgICAgIGxpbmsuc2V0QXR0cmlidXRlKCdocmVmJywgdXJsKTtcbiAgICAgIGxpbmsuc2V0QXR0cmlidXRlKCdkb3dubG9hZCcsICdleHBvcnQuY3N2Jyk7XG4gICAgICBsaW5rLnN0eWxlLnZpc2liaWxpdHkgPSAnaGlkZGVuJztcbiAgICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQobGluayk7XG4gICAgICBsaW5rLmNsaWNrKCk7XG4gICAgICBkb2N1bWVudC5ib2R5LnJlbW92ZUNoaWxkKGxpbmspO1xuICAgIH1cbiAgfVxufVxuIiwiPGhlYWRlclxuICBjbGFzcz1cInJvdW5kZWQtbGcgc2hhZG93LWxnIGZsZXgganVzdGlmeS1iZXR3ZWVuIGl0ZW1zLWNlbnRlciBweC02IHB5LTIgYmctWyNENEEwMDc3M11cIlxuPlxuICA8ZGl2IGNsYXNzPVwiZmxleCBpdGVtcy1jZW50ZXIgZ2FwLTEwXCI+XG4gICAgPGg0IGNsYXNzPVwiZm9udC1zZW1pYm9sZFwiPnt7IGZvcm1OYW1lIH19PC9oND5cbiAgICA8c3BhbiBjbGFzcz1cImZsZXggaXRlbXMtY2VudGVyIGdhcC0xXCI+XG4gICAgICBSZWYgSUQ6XG4gICAgICA8c3Bhbj57eyBJZCB9fTwvc3Bhbj5cbiAgICA8L3NwYW4+XG4gIDwvZGl2PlxuICA8ZGl2IGNsYXNzPVwiZmxleCBnYXAtMyBpdGVtcy1jZW50ZXJcIj5cbiAgICA8dmVyYmVuYS1idXR0b25cbiAgICAgIFtwZF09XCInNnB4J1wiXG4gICAgICBjbGFzcz1cInZlcmJlbi1wcmltYXJ5LWJ1dHRvblwiXG4gICAgICAoY2xpY2spPVwic2F2ZUFsbFByb3BlcnRpZXMoKVwiXG4gICAgICB0ZXh0PVwiU2F2ZSBBbGxcIlxuICAgID48L3ZlcmJlbmEtYnV0dG9uPlxuICAgIDx2ZXJiZW4tc3ZnXG4gICAgICAoY2xpY2spPVwiZ29CYWNrKClcIlxuICAgICAgY2xhc3M9XCJjdXJzb3ItcG9pbnRlclwiXG4gICAgICBbd2lkdGhdPVwiMTdcIlxuICAgICAgW2hlaWdodF09XCIxN1wiXG4gICAgICBbaWNvbl09XCInY2xvc2UnXCJcbiAgICA+PC92ZXJiZW4tc3ZnPlxuICA8L2Rpdj5cbjwvaGVhZGVyPlxuPGRpdiAjbWVzc2FnZUxvZyBjbGFzcz1cImZsZXggZmxleC1jb2wgZ2FwLTQgbWVzc2FnZS1sb2ctY29udGFpbmVyXCI+XG4gIDx2ZXJiZW4tZGF0YS12aWV3XG4gICAgI3ZkdlxuICAgIFt2aWV3U3RhdGVdPVwie1xuICAgICAgaXNTZWFyY2g6IHRydWUsXG4gICAgICBpc0NvbHVtbjogdHJ1ZSxcbiAgICAgIGlzRmlsdGVyOiB0cnVlLFxuICAgICAgaXNTb3J0OiB0cnVlLFxuICAgICAgaXNFeHBvcnQ6IHRydWUsXG4gICAgICBpc1NlbGVjdDogdHJ1ZSxcbiAgICAgIGlzQ3JlYXRlOiB0cnVlLFxuICAgICAgaXNUb2dnbGU6IHRydWUsXG4gICAgfVwiXG4gICAgW2J1dHRvbkNsYXNzXT1cIidteS1jdXN0b20tYnV0dG9uLWNsYXNzJ1wiXG4gICAgW2ljb25DbGFzc109XCInbXktaWNvbi1jbGFzcydcIlxuICAgIFtzaG93U29ydENoaWxkXT1cInNob3dTb3J0XCJcbiAgICBbc2hvd0NvbHVtbkNoaWxkXT1cInNob3dDb2x1bW5cIlxuICAgIFthY3RpdmVJY29uQ2xhc3NdPVwiJ215LWFjdGl2ZS1pY29uLWNsYXNzJ1wiXG4gICAgW3NlbGVjdGVkQ29sdW1uQ291bnRdPVwic2VsZWN0ZWRDb2x1bW5UYWJsZUNvdW50XCJcbiAgICBbc2VsZWN0ZWRTb3J0Q291bnRdPVwic2VsZWN0ZWRTb3J0VGFibGVDb3VudFwiXG4gICAgW3NlbGVjdGVkRmlsdGVyVGFibGVDb3VudF09XCJzZWxlY3RlZEZpbHRlclRhYmxlQ291bnRcIlxuICAgIFtzaG93RmlsdGVyQ2hpbGRdPVwic2hvd0ZpbHRlclwiXG4gICAgW3NlYXJjaFZhbHVlXT1cInNlYXJjaFRlcm1cIlxuICAgICh2aWV3Q2hhbmdlKT1cIm9uVmlld0NoYW5nZSgkZXZlbnQpXCJcbiAgICAoc3RhdGVDaGFuZ2UpPVwib25TdGF0ZUNoYW5nZSgkZXZlbnQpXCJcbiAgICAob25TZWFyY2hDaGFuZ2UpPVwib25TZWFyY2goJGV2ZW50KVwiXG4gID5cbiAgICA8ZGl2IGNsYXNzPVwibXQtMlwiIHRhYmxlLWNvbnRlbnQ+XG4gICAgICA8bGliLWRhdGEtdGFibGVcbiAgICAgICAgI2R0XG4gICAgICAgIFtkYXRhXT1cImRhdGFbMF0uUHJvcGVydGllc1wiXG4gICAgICAgIFtjb2x1bW5zXT1cInZpc2libGVDb2x1bW5EZWZcIlxuICAgICAgICBbc3R5bGVDb25maWddPVwic3R5bGVzXCJcbiAgICAgICAgKHNlbGVjdGlvbkNoYW5nZSk9XCJvblNlbGVjdGlvbkNoYW5nZSgkZXZlbnQpXCJcbiAgICAgID5cbiAgICAgICAgPG5nLWNvbnRhaW5lciBsaWJDb2x1bW49XCJzZWxlY3RcIj5cbiAgICAgICAgICA8bmctdGVtcGxhdGVcbiAgICAgICAgICAgICNjZWxsXG4gICAgICAgICAgICBsZXQtaXNTZWxlY3RlZD1cImlzU2VsZWN0ZWRcIlxuICAgICAgICAgICAgbGV0LXRvZ2dsZVJvd1NlbGVjdGlvbj1cInRvZ2dsZVJvd1NlbGVjdGlvblwiXG4gICAgICAgICAgPlxuICAgICAgICAgICAgPGlucHV0XG4gICAgICAgICAgICAgIHR5cGU9XCJjaGVja2JveFwiXG4gICAgICAgICAgICAgIFtjaGVja2VkXT1cImlzU2VsZWN0ZWRcIlxuICAgICAgICAgICAgICAoY2hhbmdlKT1cInRvZ2dsZVJvd1NlbGVjdGlvbigpXCJcbiAgICAgICAgICAgIC8+XG4gICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgICA8bmctdGVtcGxhdGVcbiAgICAgICAgICAgICNoZWFkZXJcbiAgICAgICAgICAgIGxldC1hbGxSb3dzU2VsZWN0ZWQ9XCJhbGxSb3dzU2VsZWN0ZWRcIlxuICAgICAgICAgICAgbGV0LXNvbWVSb3dzU2VsZWN0ZWQ9XCJzb21lUm93c1NlbGVjdGVkXCJcbiAgICAgICAgICAgIGxldC10b2dnbGVBbGxSb3dzPVwidG9nZ2xlQWxsUm93c1wiXG4gICAgICAgICAgPlxuICAgICAgICAgICAgPGlucHV0XG4gICAgICAgICAgICAgIHR5cGU9XCJjaGVja2JveFwiXG4gICAgICAgICAgICAgIFtjaGVja2VkXT1cImFsbFJvd3NTZWxlY3RlZCgpXCJcbiAgICAgICAgICAgICAgW2luZGV0ZXJtaW5hdGVdPVwic29tZVJvd3NTZWxlY3RlZCgpXCJcbiAgICAgICAgICAgICAgKGNoYW5nZSk9XCJ0b2dnbGVBbGxSb3dzKClcIlxuICAgICAgICAgICAgLz5cbiAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPG5nLWNvbnRhaW5lciBsaWJDb2x1bW49XCJuYW1lXCI+XG4gICAgICAgICAgPG5nLXRlbXBsYXRlICNjZWxsIGxldC1yb3c9XCJyb3dcIiBsZXQtdmFsdWU+XG4gICAgICAgICAgICB7eyB2YWx1ZS5OYW1lIH19XG4gICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgICA8bmctdGVtcGxhdGVcbiAgICAgICAgICAgICNjZWxsRWRpdFxuICAgICAgICAgICAgbGV0LXJvdz1cInJvd1wiXG4gICAgICAgICAgICBsZXQtdXBkYXRlVmFsdWU9XCJ1cGRhdGVWYWx1ZVwiXG4gICAgICAgICAgICBsZXQtdmFsdWVcbiAgICAgICAgICA+XG4gICAgICAgICAgICA8dmVyYmVuYS1pbnB1dFxuICAgICAgICAgICAgICBpbnB1dENvbnRhaW5lckNsYXNzPVwidy1maXRcIlxuICAgICAgICAgICAgICBbKG5nTW9kZWwpXT1cInJvdy5OYW1lXCJcbiAgICAgICAgICAgID48L3ZlcmJlbmEtaW5wdXQ+XG4gICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgIDxuZy1jb250YWluZXIgbGliQ29sdW1uPVwicHJvcGVydHlOYW1lXCI+XG4gICAgICAgICAgPG5nLXRlbXBsYXRlICNjZWxsIGxldC1yb3c9XCJyb3dcIiBsZXQtdmFsdWU+XG4gICAgICAgICAgICB7eyByb3cuUHJvcGVydHlOYW1lIH19XG4gICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgICA8bmctdGVtcGxhdGVcbiAgICAgICAgICAgICNjZWxsRWRpdFxuICAgICAgICAgICAgbGV0LXJvdz1cInJvd1wiXG4gICAgICAgICAgICBsZXQtdXBkYXRlVmFsdWU9XCJ1cGRhdGVWYWx1ZVwiXG4gICAgICAgICAgICBsZXQtdmFsdWVcbiAgICAgICAgICA+XG4gICAgICAgICAgICA8dmVyYmVuYS1pbnB1dFxuICAgICAgICAgICAgICAoa2V5ZG93bik9XCJvbktleURvd24oJGV2ZW50LCByb3cpXCJcbiAgICAgICAgICAgICAgKHBhc3RlKT1cIm9uUGFzdGUoJGV2ZW50LCByb3cpXCJcbiAgICAgICAgICAgICAgKGlucHV0KT1cIm9uSW5wdXQoJGV2ZW50LCByb3cpXCJcbiAgICAgICAgICAgICAgaW5wdXRDb250YWluZXJDbGFzcz1cInctZml0XCJcbiAgICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJyb3cuUHJvcGVydHlOYW1lXCJcbiAgICAgICAgICAgID48L3ZlcmJlbmEtaW5wdXQ+XG4gICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgIDxuZy1jb250YWluZXIgbGliQ29sdW1uPVwibWluVmFsdWVcIj5cbiAgICAgICAgICA8bmctdGVtcGxhdGUgI2NlbGwgbGV0LXJvdz1cInJvd1wiIGxldC12YWx1ZT5cbiAgICAgICAgICAgIHt7IHZhbHVlIH19XG4gICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgICA8bmctdGVtcGxhdGVcbiAgICAgICAgICAgICNjZWxsRWRpdFxuICAgICAgICAgICAgbGV0LXJvdz1cInJvd1wiXG4gICAgICAgICAgICBsZXQtdXBkYXRlVmFsdWU9XCJ1cGRhdGVWYWx1ZVwiXG4gICAgICAgICAgICBsZXQtdmFsdWVcbiAgICAgICAgICA+XG4gICAgICAgICAgICA8dmVyYmVuYS1pbnB1dFxuICAgICAgICAgICAgICBbdHlwZV09XCInbnVtYmVyJ1wiXG4gICAgICAgICAgICAgIFtuZ01vZGVsXT1cImdldFN0cmluZ1ZhbHVlKHJvdywgJ01pblZhbHVlJylcIlxuICAgICAgICAgICAgICAodmFsdWVDaGFuZ2UpPVwiY29udmVydFRvSW50KCRldmVudCwgcm93LCAnTWluVmFsdWUnKVwiXG4gICAgICAgICAgICAgIGlucHV0Q29udGFpbmVyQ2xhc3M9XCJ3LVsxMzBweF1cIlxuICAgICAgICAgICAgPjwvdmVyYmVuYS1pbnB1dD5cbiAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPG5nLWNvbnRhaW5lciBsaWJDb2x1bW49XCJtYXhWYWx1ZVwiPlxuICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjY2VsbCBsZXQtcm93PVwicm93XCIgbGV0LXZhbHVlPlxuICAgICAgICAgICAge3sgdmFsdWUgfX1cbiAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICAgIDxuZy10ZW1wbGF0ZVxuICAgICAgICAgICAgI2NlbGxFZGl0XG4gICAgICAgICAgICBsZXQtcm93PVwicm93XCJcbiAgICAgICAgICAgIGxldC11cGRhdGVWYWx1ZT1cInVwZGF0ZVZhbHVlXCJcbiAgICAgICAgICAgIGxldC12YWx1ZVxuICAgICAgICAgID5cbiAgICAgICAgICAgIDx2ZXJiZW5hLWlucHV0XG4gICAgICAgICAgICAgIFt0eXBlXT1cIidudW1iZXInXCJcbiAgICAgICAgICAgICAgaW5wdXRDb250YWluZXJDbGFzcz1cInctWzEzMHB4XVwiXG4gICAgICAgICAgICAgIFtuZ01vZGVsXT1cImdldFN0cmluZ1ZhbHVlKHJvdywgJ01heFZhbHVlJylcIlxuICAgICAgICAgICAgICAodmFsdWVDaGFuZ2UpPVwiY29udmVydFRvSW50KCRldmVudCwgcm93LCAnTWF4VmFsdWUnKVwiXG4gICAgICAgICAgICA+PC92ZXJiZW5hLWlucHV0PlxuICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICA8bmctY29udGFpbmVyIGxpYkNvbHVtbj1cImRlZmF1bHRWYWx1ZVwiPlxuICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjY2VsbCBsZXQtcm93PVwicm93XCIgbGV0LXZhbHVlPlxuICAgICAgICAgICAge3sgdmFsdWUgfX1cbiAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICAgIDxuZy10ZW1wbGF0ZVxuICAgICAgICAgICAgI2NlbGxFZGl0XG4gICAgICAgICAgICBsZXQtcm93PVwicm93XCJcbiAgICAgICAgICAgIGxldC11cGRhdGVWYWx1ZT1cInVwZGF0ZVZhbHVlXCJcbiAgICAgICAgICAgIGxldC12YWx1ZVxuICAgICAgICAgID5cbiAgICAgICAgICAgIDx2ZXJiZW5hLWlucHV0XG4gICAgICAgICAgICAgIFt0eXBlXT1cIid0ZXh0J1wiXG4gICAgICAgICAgICAgIGlucHV0Q29udGFpbmVyQ2xhc3M9XCJ3LVsxMzBweF1cIlxuICAgICAgICAgICAgICBbKG5nTW9kZWwpXT1cInJvdy5EZWZhdWx0VmFsdWVcIlxuICAgICAgICAgICAgPjwvdmVyYmVuYS1pbnB1dD5cbiAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPG5nLWNvbnRhaW5lciBsaWJDb2x1bW49XCJkYXRhVHlwZVwiPlxuICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjY2VsbCBsZXQtcm93PVwicm93XCIgbGV0LXZhbHVlPlxuICAgICAgICAgICAge3sgdmFsdWUgfX1cbiAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICAgIDxuZy10ZW1wbGF0ZVxuICAgICAgICAgICAgI2NlbGxFZGl0XG4gICAgICAgICAgICBsZXQtcm93PVwicm93XCJcbiAgICAgICAgICAgIGxldC11cGRhdGVWYWx1ZT1cInVwZGF0ZVZhbHVlXCJcbiAgICAgICAgICAgIGxldC12YWx1ZVxuICAgICAgICAgID5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtY29sIGdhcC0xXCI+XG4gICAgICAgICAgICAgIDx2ZXJiZW4tZHJvcC1kb3duXG4gICAgICAgICAgICAgICAgd2lkdGg9XCIxMDAlXCJcbiAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcj1cIkNoYW5nZSBEYXRhIFR5cGVcIlxuICAgICAgICAgICAgICAgIFsob3B0aW9ucyldPVwiZGF0YVR5cGVcIlxuICAgICAgICAgICAgICAgIFsobmdNb2RlbCldPVwicm93LkRhdGFUeXBlXCJcbiAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICA8L3ZlcmJlbi1kcm9wLWRvd24+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgICA8bmctY29udGFpbmVyIGxpYkNvbHVtbj1cImlzUmVxdWlyZWRcIj5cbiAgICAgICAgICA8bmctdGVtcGxhdGUgI2NlbGwgbGV0LXJvdz1cInJvd1wiIGxldC12YWx1ZT5cbiAgICAgICAgICAgIDx2ZXJiZW4tc3ZnICpuZ0lmPVwidmFsdWUgPT09IHRydWVcIiBbaWNvbl09XCInY2hlY2snXCI+PC92ZXJiZW4tc3ZnPlxuICAgICAgICAgICAgPHZlcmJlbi1zdmcgKm5nSWY9XCJ2YWx1ZSA9PT0gZmFsc2VcIiBbaWNvbl09XCInZXJyb3InXCI+PC92ZXJiZW4tc3ZnPlxuICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgICAgPG5nLXRlbXBsYXRlXG4gICAgICAgICAgICAjY2VsbEVkaXRcbiAgICAgICAgICAgIGxldC1yb3c9XCJyb3dcIlxuICAgICAgICAgICAgbGV0LXVwZGF0ZVZhbHVlPVwidXBkYXRlVmFsdWVcIlxuICAgICAgICAgICAgbGV0LXZhbHVlXG4gICAgICAgICAgPlxuICAgICAgICAgICAgPHZlcmJlbmEtc3dpdGNoXG4gICAgICAgICAgICAgIFtvbkNvbG9yXT1cIid2YXIoLS12Ym4tY29sb3ItdGV4dCknXCJcbiAgICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJyb3cuSXNSZXF1aXJlZFwiXG4gICAgICAgICAgICA+PC92ZXJiZW5hLXN3aXRjaD5cbiAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgICA8bmctY29udGFpbmVyIGxpYkNvbHVtbj1cImlzUmVhZE9ubHlcIj5cbiAgICAgICAgICA8bmctdGVtcGxhdGUgI2NlbGwgbGV0LXJvdz1cInJvd1wiIGxldC12YWx1ZT5cbiAgICAgICAgICAgIDx2ZXJiZW4tc3ZnICpuZ0lmPVwidmFsdWUgPT09IHRydWVcIiBbaWNvbl09XCInY2hlY2snXCI+PC92ZXJiZW4tc3ZnPlxuICAgICAgICAgICAgPHZlcmJlbi1zdmcgKm5nSWY9XCJ2YWx1ZSA9PT0gZmFsc2VcIiBbaWNvbl09XCInZXJyb3InXCI+PC92ZXJiZW4tc3ZnPlxuICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgICAgPG5nLXRlbXBsYXRlXG4gICAgICAgICAgICAjY2VsbEVkaXRcbiAgICAgICAgICAgIGxldC1yb3c9XCJyb3dcIlxuICAgICAgICAgICAgbGV0LXVwZGF0ZVZhbHVlPVwidXBkYXRlVmFsdWVcIlxuICAgICAgICAgICAgbGV0LXZhbHVlXG4gICAgICAgICAgPlxuICAgICAgICAgICAgPHZlcmJlbmEtc3dpdGNoXG4gICAgICAgICAgICAgIFtvbkNvbG9yXT1cIid2YXIoLS12Ym4tY29sb3ItdGV4dCknXCJcbiAgICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJyb3cuSXNSZWFkT25seVwiXG4gICAgICAgICAgICA+PC92ZXJiZW5hLXN3aXRjaD5cbiAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgICA8bmctY29udGFpbmVyIGxpYkNvbHVtbj1cImFjdGlvbnNcIj5cbiAgICAgICAgICA8bmctdGVtcGxhdGVcbiAgICAgICAgICAgICNjZWxsXG4gICAgICAgICAgICBsZXQtaXNFZGl0aW5nPVwiaXNFZGl0aW5nXCJcbiAgICAgICAgICAgIGxldC10b2dnbGVSb3dFZGl0PVwidG9nZ2xlUm93RWRpdFwiXG4gICAgICAgICAgICBsZXQtcm93PVwicm93XCJcbiAgICAgICAgICAgIGxldC12YWx1ZVxuICAgICAgICAgID5cbiAgICAgICAgICAgIDx2ZXJiZW4tcG9wLVVwXG4gICAgICAgICAgICAgIFtjdXN0b21TdHlsZXNdPVwieyAnei1pbmRleCc6ICc5OScgfVwiXG4gICAgICAgICAgICAgIFtkcm9wZG93bk9wZW5dPVwib3BlbkRyb3Bkb3duSWQgPT09IHJvdy5pZFwiXG4gICAgICAgICAgICAgIFtlbmFibGVNb3VzZUxlYXZlXT1cImZhbHNlXCJcbiAgICAgICAgICAgICAgKGNsb3NlKT1cIm9uQ2xvc2UoKVwiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgIDx2ZXJiZW4tc3ZnXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJjdXJzb3ItcG9pbnRlciBhY3Rpb25zLWljb25cIlxuICAgICAgICAgICAgICAgIChjbGljayk9XCJvcGVuRHJvcGRvd24ocm93KVwiXG4gICAgICAgICAgICAgICAgZHJvcGRvd24tdHJpZ2dlclxuICAgICAgICAgICAgICAgIGljb249XCJsaXN0XCJcbiAgICAgICAgICAgICAgPjwvdmVyYmVuLXN2Zz5cbiAgICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICAgIGNsYXNzPVwicG9wLXVwLWNvbnRlbnQgZmxleCBmbGV4LWNvbFwiXG4gICAgICAgICAgICAgICAgKm5nSWY9XCJvcGVuRHJvcGRvd25JZCA9PT0gcm93LklkXCJcbiAgICAgICAgICAgICAgICBkcm9wZG93bi1jb250ZW50XG4gICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgICAoY2xpY2spPVwidG9nZ2xlUm93RWRpdCgpXCJcbiAgICAgICAgICAgICAgICAgIGNsYXNzPVwicG9wLXVwLXZhbHVlIGN1cnNvci1wb2ludGVyXCJcbiAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICBFZGl0XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cImRlbGV0ZVByb3BlcnR5KHJvdy5JZClcIlxuICAgICAgICAgICAgICAgICAgY2xhc3M9XCJwb3AtdXAtdmFsdWUgY3Vyc29yLXBvaW50ZXJcIlxuICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgIERlbGV0ZVxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvdmVyYmVuLXBvcC1VcD5cbiAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICAgIDxuZy10ZW1wbGF0ZVxuICAgICAgICAgICAgI2NlbGxFZGl0XG4gICAgICAgICAgICBsZXQtaXNFZGl0aW5nPVwiaXNFZGl0aW5nXCJcbiAgICAgICAgICAgIGxldC10b2dnbGVSb3dFZGl0PVwidG9nZ2xlUm93RWRpdFwiXG4gICAgICAgICAgICBsZXQtcm93PVwicm93XCJcbiAgICAgICAgICAgIGxldC12YWx1ZVxuICAgICAgICAgID5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGdhcC0yIGl0ZW1zLWNlbnRlclwiPlxuICAgICAgICAgICAgICA8dmVyYmVuLXN2Z1xuICAgICAgICAgICAgICAgIGljb249XCJjaGVja1wiXG4gICAgICAgICAgICAgICAgW3dpZHRoXT1cIjE1XCJcbiAgICAgICAgICAgICAgICBbaGVpZ2h0XT1cIjE1XCJcbiAgICAgICAgICAgICAgICAoY2xpY2spPVwic2F2ZVZpYVRhYmxlKHJvdywgdG9nZ2xlUm93RWRpdClcIlxuICAgICAgICAgICAgICA+PC92ZXJiZW4tc3ZnPlxuICAgICAgICAgICAgICA8dmVyYmVuLXN2Z1xuICAgICAgICAgICAgICAgIChjbGljayk9XCJ0b2dnbGVSb3dFZGl0KCk7IGRlbGV0ZVByb3BlcnR5KHJvdy5JZClcIlxuICAgICAgICAgICAgICAgIGljb249XCJkZWxldGVcIlxuICAgICAgICAgICAgICAgIFt3aWR0aF09XCIxNVwiXG4gICAgICAgICAgICAgICAgW2hlaWdodF09XCIxNVwiXG4gICAgICAgICAgICAgID48L3ZlcmJlbi1zdmc+XG4gICAgICAgICAgICAgIDx2ZXJiZW4tc3ZnXG4gICAgICAgICAgICAgICAgaWNvbj1cImNhcmRWaWV3QWx0XCJcbiAgICAgICAgICAgICAgICBbd2lkdGhdPVwiMTVcIlxuICAgICAgICAgICAgICAgIFtoZWlnaHRdPVwiMTVcIlxuICAgICAgICAgICAgICAgIChjbGljayk9XCJnb1RvQ2FyZFZpZXcodmFsdWUpXCJcbiAgICAgICAgICAgICAgPjwvdmVyYmVuLXN2Zz5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgPC9saWItZGF0YS10YWJsZT5cbiAgICA8L2Rpdj5cbiAgICA8ZGl2IGNhcmQtY29udGVudD5cbiAgICAgIDx2ZXJiZW4tY2FyZC1kYXRhLXZpZXdcbiAgICAgICAgYm9yZGVyUmFkaXVzPVwiMTJweFwiXG4gICAgICAgICN2ZGN2XG4gICAgICAgIGRhdGFJZD1cIklkXCJcbiAgICAgICAgYm9yZGVyPVwiNXB4XCJcbiAgICAgICAgW2NhcmREYXRhTGlzdF09XCJjYXJkRGF0YVwiXG4gICAgICAgIHJiZ0NvbG9yPVwidmFyKC0tdmJuLWNvbG9yLXN1cmZhY2UtYWx0KVwiXG4gICAgICAgIG1nPVwiMHB4XCJcbiAgICAgID5cbiAgICAgICAgPHZlcmJlbi1sZWZ0LWNhcmQtZGF0YS12aWV3IGNsYXNzPVwic3BhY2UteS03XCI+XG4gICAgICAgICAgPHZlcmJlbi1sZWZ0LWNhcmQtZGF0YVxuICAgICAgICAgICAgI3ZsY2RcbiAgICAgICAgICAgIFtwYXJlbnRdPVwidmRjdlwiXG4gICAgICAgICAgICBkYXRhSWQ9XCJpZFwiXG4gICAgICAgICAgICBjbGFzcz1cImJnLXNlY29uZGFyeS0xMDAgcm91bmRlZC14bCBib3JkZXItcHJpbWFyeSBib3JkZXItWzFweF1cIlxuICAgICAgICAgICAgW2NhcmREYXRhTGlzdF09XCJjYXJkRGF0YVwiXG4gICAgICAgICAgPlxuICAgICAgICAgICAgPG5nLXRlbXBsYXRlICNjYXJkIGxldC1pdGVtPlxuICAgICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgKGNsaWNrKT1cInVzZXJDYXJkQ2xpY2tlZChpdGVtKVwiXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJmbGV4IGN1cnNvci1wb2ludGVyIGgtW21heC1jb250ZW50XVwiXG4gICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICA8IS0tIDx2ZXJiZW4tc3ZnIFt3aWR0aF09XCIxNVwiIFtoZWlnaHRdPVwiMTVcIiAoY2xpY2spPVwidG9nZ2xlQ2hpbGRyZW4oaXRlbSk7ICRldmVudC5zdG9wUHJvcGFnYXRpb24oKVwiXG4gICAgICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cIml0ZW0uY2hpbGRyZW4gJiYgaXRlbS5jaGlsZHJlbi5sZW5ndGg/J3Zpc2libGUnOidpbnZpc2libGUnXCJcbiAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJpdGVtcy1jZW50ZXIgZmxleCAgcHItMSBjdXJzb3ItcG9pbnRlclwiIFtpY29uXT1cIml0ZW0uaXNDaGlsZHJlbkV4cGFuZGVkPydtaW51cyc6J3BsdXMnXCIgLz4gLS0+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggdy1mdWxsIGJnLXNlY29uZGFyeSByb3VuZGVkLXhsXCI+XG4gICAgICAgICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgICAgIGNsYXNzPVwidy0zIHJvdW5kZWQteGwgcm91bmRlZC10ci1ub25lIHJvdW5kZWQtYnItbm9uZVwiXG4gICAgICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cIlxuICAgICAgICAgICAgICAgICAgICAgIGl0ZW0uc2VsZWN0ZWQgPyAnYmctcHJpbWFyeScgOiAnYmctc2Vjb25kYXJ5LTIwMCdcbiAgICAgICAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgICAgICAgID48L2Rpdj5cbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJweS0zIHB4LTQgZmxleC0xIGgtWzEwMCVdXCI+XG4gICAgICAgICAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImZsZXggaXRlbXMtc3RhcnQgZmxleC0xIGdhcC0xIGp1c3RpZnktYmV0d2VlbiBoLVsxMDAlXVwiXG4gICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImZsZXggZmxleC1jb2wgZmxleC0xIGNhcmQtbWluLWhlaWdodCBqdXN0aWZ5LWJldHdlZW4gaC1bMTAwJV1cIlxuICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGp1c3RpZnktYmV0d2VlbiBtci00XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGgzXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cIm15LTAgZm9udC1ib2xkIHRleHQtW3ZhcigtLXZibi1jb2xvci1vbi1wcmltYXJ5KV0gbGVhZGluZy1bMTkuNXB4XVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3sgaXRlbS5kYXRhLk5hbWUgfX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2gzPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZmxleCBpdGVtcy1jZW50ZXIgZ2FwLTEgbXQtMlwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCIhdGV4dC1bMTBweF0gdGV4dC1bdmFyKC0tdmJuLWNvbG9yLW9uLXByaW1hcnkpXVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID5EYXRhIFR5cGU6PC9zcGFuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cIiF0ZXh0LVsxM3B4XSBmb250LWJvbGRcIj57e1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVtLmRhdGEuRGF0YVR5cGVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIDxzcGFuIGNsYXNzPVwiIXRleHQtWzEwcHhdIHRleHQtW3ZhcigtLXZibi1jb2xvci1vbi1wcmltYXJ5KV1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPkRlZmF1bHQgVmFsdWU6PC9zcGFuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwIGNsYXNzPVwiIXRleHQtWzEycHhdXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eyBpdGVtLmRhdGEuRGVmYXVsdFZhbHVlIH19XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wPiAtLT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgICAgICAgICAgIDwhLS0gPGRpdiBjbGFzcz1cImZsZXggaXRlbXMtZW5kIGgtWzEwMCVdXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZW51bS12YWwge3tpdGVtLmRhdGEuU3RhdHVzfX1cIj57e2l0ZW0uZGF0YS5TdGF0dXN9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PiAtLT5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICAgIDwvdmVyYmVuLWxlZnQtY2FyZC1kYXRhPlxuICAgICAgICA8L3ZlcmJlbi1sZWZ0LWNhcmQtZGF0YS12aWV3PlxuICAgICAgICA8dmVyYmVuLXJpZ2h0LWNhcmQtZGF0YS12aWV3PlxuICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjcGFyZW50PlxuICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICAqbmdJZj1cImN1cnJlbnREYXRhXCJcbiAgICAgICAgICAgICAgY2xhc3M9XCJmbGV4IGZsZXgtY29sIHJvdW5kZWQteGwgaC1mdWxsIHctZnVsbCByZWxhdGl2ZSBnYXAtNlwiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgIDx2ZXJiZW5hLWlucHV0XG4gICAgICAgICAgICAgICAgbmFtZT1cIk5hbWVcIlxuICAgICAgICAgICAgICAgIGxhYmVsPVwiTmFtZVwiXG4gICAgICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJjdXJyZW50RGF0YS5kYXRhLk5hbWVcIlxuICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICA8dmVyYmVuYS1pbnB1dFxuICAgICAgICAgICAgICAgIG5hbWU9XCJOYW1lXCJcbiAgICAgICAgICAgICAgICBsYWJlbD1cIlByb3BlcnR5IE5hbWVcIlxuICAgICAgICAgICAgICAgIChrZXlkb3duKT1cIm9uS2V5RG93bigkZXZlbnQsIGN1cnJlbnREYXRhLmRhdGEpXCJcbiAgICAgICAgICAgICAgICAocGFzdGUpPVwib25QYXN0ZSgkZXZlbnQsIGN1cnJlbnREYXRhLmRhdGEpXCJcbiAgICAgICAgICAgICAgICAoaW5wdXQpPVwib25JbnB1dCgkZXZlbnQsIGN1cnJlbnREYXRhLmRhdGEpXCJcbiAgICAgICAgICAgICAgICBbKG5nTW9kZWwpXT1cImN1cnJlbnREYXRhLmRhdGEuUHJvcGVydHlOYW1lXCJcbiAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggZmxleC1jb2wgZ2FwLTFcIj5cbiAgICAgICAgICAgICAgICA8ZGl2PkRhdGEgVHlwZTwvZGl2PlxuICAgICAgICAgICAgICAgIDx2ZXJiZW4tZHJvcC1kb3duXG4gICAgICAgICAgICAgICAgICB3aWR0aD1cIjEwMCVcIlxuICAgICAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCJDaGFuZ2UgRGF0YSBUeXBlXCJcbiAgICAgICAgICAgICAgICAgIFsob3B0aW9ucyldPVwiZGF0YVR5cGVcIlxuICAgICAgICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJjdXJyZW50RGF0YS5kYXRhLkRhdGFUeXBlXCJcbiAgICAgICAgICAgICAgICAgIChuZ01vZGVsQ2hhbmdlKT1cIm9uRHJvcERvd25DaGFuZ2UoJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgIDwvdmVyYmVuLWRyb3AtZG93bj5cbiAgICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICAgICpuZ0lmPVwiXG4gICAgICAgICAgICAgICAgICBjdXJyZW50RGF0YS5kYXRhLkRhdGFUeXBlID09PSAnU2luZ2xlU2VsZWN0aW9uJyB8fFxuICAgICAgICAgICAgICAgICAgY3VycmVudERhdGEuZGF0YS5EYXRhVHlwZSA9PT0gJ011bHRpU2VsZWN0aW9uJ1xuICAgICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICA8cCBjbGFzcz1cIm1iLTJcIj5FbnRlciBPcHRpb25zPC9wPlxuICAgICAgICAgICAgICAgIDx2ZXJiZW4tY2hpcFxuICAgICAgICAgICAgICAgICAgW3BsYWNlaG9sZGVyXT1cIidFbnRlciBPcHRpb25zJ1wiXG4gICAgICAgICAgICAgICAgICBbKG5nTW9kZWwpXT1cImNoaXBBcnJheVwiXG4gICAgICAgICAgICAgICAgICAob25DaGFuZ2UpPVwib25DaGlwQ2hhbmdlKCRldmVudClcIlxuICAgICAgICAgICAgICAgID48L3ZlcmJlbi1jaGlwPlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgICAgICA8dmVyYmVuYS1pbnB1dFxuICAgICAgICAgICAgICAgICAgW3BsYWNlSG9sZGVyXT1cIidFbnRlciBkZWZhdWx0IHRleHQnXCJcbiAgICAgICAgICAgICAgICAgIFsobmdNb2RlbCldPVwiY3VycmVudERhdGEuZGF0YS5EZWZhdWx0VmFsdWVcIlxuICAgICAgICAgICAgICAgICAgbmFtZT1cIkRlZmF1bHRWYWx1ZVwiXG4gICAgICAgICAgICAgICAgICBsYWJlbD1cIkRlZmF1bHQgVmFsdWUgKG9wdGlvbmFsKVwiXG4gICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICAgICAgPHAgY2xhc3M9XCJtYi0yXCI+UmVxdWlyZWQ8L3A+XG5cbiAgICAgICAgICAgICAgICA8dmVyYmVuYS1zd2l0Y2hcbiAgICAgICAgICAgICAgICAgIFtvbkNvbG9yXT1cIid2YXIoLS12Ym4tY29sb3ItdGV4dCknXCJcbiAgICAgICAgICAgICAgICAgIFsobmdNb2RlbCldPVwiY3VycmVudERhdGEuZGF0YS5Jc1JlcXVpcmVkXCJcbiAgICAgICAgICAgICAgICA+PC92ZXJiZW5hLXN3aXRjaD5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICAgICAgPHAgY2xhc3M9XCJtYi0yXCI+UmVhZCBPbmx5PC9wPlxuXG4gICAgICAgICAgICAgICAgPHZlcmJlbmEtc3dpdGNoXG4gICAgICAgICAgICAgICAgICBbb25Db2xvcl09XCIndmFyKC0tdmJuLWNvbG9yLXRleHQpJ1wiXG4gICAgICAgICAgICAgICAgICBbKG5nTW9kZWwpXT1cImN1cnJlbnREYXRhLmRhdGEuSXNSZWFkT25seVwiXG4gICAgICAgICAgICAgICAgPjwvdmVyYmVuYS1zd2l0Y2g+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgKm5nSWY9XCJcbiAgICAgICAgICAgICAgICAgIGN1cnJlbnREYXRhLmRhdGEuRGF0YVR5cGUgPT09ICdOdW1iZXInIHx8XG4gICAgICAgICAgICAgICAgICBjdXJyZW50RGF0YS5kYXRhLkRhdGFUeXBlID09PSAnVGV4dCdcbiAgICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgICAgIGNsYXNzPVwiZmxleCBmbGV4LWNvbCBnYXAtNlwiXG4gICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICA8dmVyYmVuYS1pbnB1dFxuICAgICAgICAgICAgICAgICAgW3R5cGVdPVwiJ251bWJlcidcIlxuICAgICAgICAgICAgICAgICAgbmFtZT1cIm1pblZhbHVlXCJcbiAgICAgICAgICAgICAgICAgIGxhYmVsPVwiTWluIFZhbHVlXCJcbiAgICAgICAgICAgICAgICAgIFtuZ01vZGVsXT1cImdldFN0cmluZ1ZhbHVlKGN1cnJlbnREYXRhLmRhdGEsICdNaW5WYWx1ZScpXCJcbiAgICAgICAgICAgICAgICAgICh2YWx1ZUNoYW5nZSk9XCJcbiAgICAgICAgICAgICAgICAgICAgY29udmVydFRvSW50KCRldmVudCwgY3VycmVudERhdGEuZGF0YSwgJ01pblZhbHVlJylcbiAgICAgICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICA8dmVyYmVuYS1pbnB1dFxuICAgICAgICAgICAgICAgICAgW3R5cGVdPVwiJ251bWJlcidcIlxuICAgICAgICAgICAgICAgICAgbmFtZT1cIm1heFZhbHVlXCJcbiAgICAgICAgICAgICAgICAgIGxhYmVsPVwiTWF4IFZhbHVlXCJcbiAgICAgICAgICAgICAgICAgIChuZ01vZGVsQ2hhbmdlKT1cInVwZGF0ZVRhYmxlKClcIlxuICAgICAgICAgICAgICAgICAgW25nTW9kZWxdPVwiZ2V0U3RyaW5nVmFsdWUoY3VycmVudERhdGEuZGF0YSwgJ01heFZhbHVlJylcIlxuICAgICAgICAgICAgICAgICAgKHZhbHVlQ2hhbmdlKT1cIlxuICAgICAgICAgICAgICAgICAgICBjb252ZXJ0VG9JbnQoJGV2ZW50LCBjdXJyZW50RGF0YS5kYXRhLCAnTWF4VmFsdWUnKVxuICAgICAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPCEtLSBidXR0b25zIC0tPlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBqdXN0aWZ5LWJldHdlZW4gdy1mdWxsIGJvdHRvbS04IGxlZnQtMCByaWdodC0wXCI+XG4gICAgICAgICAgICAgICAgPHZlcmJlbmEtYnV0dG9uXG4gICAgICAgICAgICAgICAgICAoY2xpY2spPVwiZGVsZXRlUHJvcGVydHkoY3VycmVudERhdGEuZGF0YS5JZClcIlxuICAgICAgICAgICAgICAgICAgY2xhc3M9XCJ2ZXJiZW4tZGVsZXRlLWJ1dHRvblwiXG4gICAgICAgICAgICAgICAgICB0ZXh0PVwiRGVsZXRlXCJcbiAgICAgICAgICAgICAgICA+PC92ZXJiZW5hLWJ1dHRvbj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBnYXAtM1wiPlxuICAgICAgICAgICAgICAgICAgPHZlcmJlbmEtYnV0dG9uXG4gICAgICAgICAgICAgICAgICAgIGNsYXNzPVwidmVyYmVuLXN3aXRjaC1idXR0b25cIlxuICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiZ29Ub1RhYmxlVmlldygpXCJcbiAgICAgICAgICAgICAgICAgICAgdGV4dD1cIlN3aXRjaCBUbyBUYWJsZVwiXG4gICAgICAgICAgICAgICAgICA+PC92ZXJiZW5hLWJ1dHRvbj5cbiAgICAgICAgICAgICAgICAgIDwhLS0gPHZlcmJlbmEtYnV0dG9uIGNsYXNzPVwidmVyYmVuLXByaW1hcnktYnV0dG9uXCIgKGNsaWNrKT1cInNhdmVVc2VyKClcIiB0ZXh0PVwiU2F2ZVwiPjwvdmVyYmVuYS1idXR0b24+IC0tPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgIDwvdmVyYmVuLXJpZ2h0LWNhcmQtZGF0YS12aWV3PlxuICAgICAgICA8IS0tIDx2ZXJiZW4tcmlnaHQtY2FyZC1kYXRhLXZpZXc+XG4gICAgICAgICAgICB5ZXNoaGhoaGhcbiAgICAgICAgICA8L3ZlcmJlbi1yaWdodC1jYXJkLWRhdGEtdmlldz4gLS0+XG5cbiAgICAgICAgPHZlcmJlbi1jYXJkLWRhdGEtdmlldy1mb290ZXI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggZ2FwLTIganVzdGlmeS1iZXR3ZWVuXCI+XG4gICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICpuZ0lmPVwiIXZkY3YuaGFzQ3VycmVudEl0ZW0oKVwiXG4gICAgICAgICAgICAgIGNsYXNzPVwibWVzc2FnZS1sb2ctYnV0dG9uLWNvbnRhaW5lciBmbGV4IGp1c3RpZnktYmV0d2VlblwiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgIDx2ZXJiZW5hLWJ1dHRvblxuICAgICAgICAgICAgICAgIFtmb250V2VpZ2h0XT1cIidib2xkJ1wiXG4gICAgICAgICAgICAgICAgW2JnQ29sb3JdPVwiJ3ZhcigtLXZibi1jb2xvci10ZXh0LW11dGVkKSdcIlxuICAgICAgICAgICAgICAgIFtib3JkZXJSYWRpdXNdPVwiJzRweCdcIlxuICAgICAgICAgICAgICAgIFt0ZXh0Q29sb3JdPVwiJ3ZhcigtLXZibi1jb2xvci1zdXJmYWNlKSdcIlxuICAgICAgICAgICAgICAgIFt0ZXh0XT1cIidEZWxldGUnXCJcbiAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICA8L3ZlcmJlbmEtYnV0dG9uPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgIGNsYXNzPVwiZmxleCB7e1xuICAgICAgICAgICAgICAgIHZkY3YuaGFzQ3VycmVudEl0ZW0oKSA/ICdmbGV4LTEnIDogJydcbiAgICAgICAgICAgICAgfX0ganVzdGlmeS1lbmQgaXRlbXMtY2VudGVyIGdhcC01XCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJwYWdpbmF0b3ItdGV4dFwiXG4gICAgICAgICAgICAgICAgPnt7IGNhcmREYXRhLmxlbmd0aCB9fSByZWNvcmRzIGxvYWRlZDwvc3BhblxuICAgICAgICAgICAgICA+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC92ZXJiZW4tY2FyZC1kYXRhLXZpZXctZm9vdGVyPlxuICAgICAgPC92ZXJiZW4tY2FyZC1kYXRhLXZpZXc+XG4gICAgPC9kaXY+XG4gICAgPGRpdiBjb2x1bW4tY29udGVudD5cbiAgICAgIDx2ZXJiZW4tdmlzaWJsZS1jb2x1bW5cbiAgICAgICAgKHJlc2V0RmlsdGVyKT1cImdldFByb3BlcnRpZXMoSWQsIHNob3dDb2x1bW4pXCJcbiAgICAgICAgKGNvbHVtbnNVcGRhdGVkKT1cIm9uQ29sdW1uc1VwZGF0ZWQoJGV2ZW50KVwiXG4gICAgICAgIFtib3JkZXJdPVwiJzFweCBzb2xpZCB2YXIoLS12Ym4tY29sb3ItcHJpbWFyeSknXCJcbiAgICAgICAgYm9yZGVyUmFkaXVzPVwiMTBweFwiXG4gICAgICAgIGJveFNoYWRvdz1cIjJweCAycHggMnB4IDBweCBzaWx2ZXJcIlxuICAgICAgICBiZ0NvbG9yPVwid2hpdGVcIlxuICAgICAgICB3aWR0aD1cIjQwMHB4XCJcbiAgICAgICAgdGV4dENvbG9yPVwiYmxhY2tcIlxuICAgICAgICBwZD1cIjFyZW1cIlxuICAgICAgICBwcmltYXJ5Q29sb3I9XCJ2YXIoLS12Ym4tY29sb3ItcHJpbWFyeSlcIlxuICAgICAgICBzZWNvbmRhcnlDb2xvcj1cInZhcigtLXZibi1jb2xvci1ib3JkZXItZm9jdXMpXCJcbiAgICAgICAgW2NvbHVtbnNdPVwidmlzaWJsZUNvbHVtbnNcIlxuICAgICAgICBbZGlzcGxheWVkQ29sdW1uc109XCI1XCJcbiAgICAgID48L3ZlcmJlbi12aXNpYmxlLWNvbHVtbj5cbiAgICA8L2Rpdj5cbiAgICA8ZGl2IGZpbHRlci1jb250ZW50PlxuICAgICAgPHZlcmJlbi10YWJsZS1maWx0ZXJcbiAgICAgICAgKHJlc2V0U29ydERhdGEpPVwiZ2V0UHJvcGVydGllcyhJZCwgc2hvd0ZpbHRlcilcIlxuICAgICAgICAoZmlsdGVyc0FwcGxpZWQpPVwib25GaWx0ZXJBcHBsaWVkKCRldmVudClcIlxuICAgICAgICBbYm9yZGVyXT1cIicxcHggc29saWQgdmFyKC0tdmJuLWNvbG9yLXByaW1hcnkpJ1wiXG4gICAgICAgIGJvcmRlclJhZGl1cz1cIjEwcHhcIlxuICAgICAgICBib3hTaGFkb3c9XCIycHggMnB4IDJweCAwcHggc2lsdmVyXCJcbiAgICAgICAgYmdDb2xvcj1cIndoaXRlXCJcbiAgICAgICAgd2lkdGg9XCI0MjBweFwiXG4gICAgICAgIHRleHRDb2xvcj1cImJsYWNrXCJcbiAgICAgICAgcGQ9XCIxcmVtXCJcbiAgICAgICAgcHJpbWFyeUNvbG9yPVwidmFyKC0tdmJuLWNvbG9yLXByaW1hcnkpXCJcbiAgICAgICAgc2Vjb25kYXJ5Q29sb3I9XCJ2YXIoLS12Ym4tY29sb3ItYm9yZGVyLWZvY3VzKVwiXG4gICAgICAgIHRlcnRpYXJ5Q29sb3I9XCJ2YXIoLS12Ym4tY29sb3Itb24tcHJpbWFyeSlcIlxuICAgICAgICBbZmlsdGVyT3B0aW9uc109XCJmaWx0ZXJBcnJheVwiXG4gICAgICAgIFttYXhGaWx0ZXJMZW5ndGhdPVwiM1wiXG4gICAgICA+PC92ZXJiZW4tdGFibGUtZmlsdGVyPlxuICAgIDwvZGl2PlxuICAgIDxkaXYgc29ydC1jb250ZW50PlxuICAgICAgPHZlcmJlbi1zb3J0LXRhYmxlXG4gICAgICAgIChyZXNldFNvcnREYXRhKT1cImdldFByb3BlcnRpZXMoSWQsIHNob3dTb3J0KVwiXG4gICAgICAgIChzZWxlY3RlZE9wdGlvbnMpPVwib25Tb3J0VXBkYXRlZCgkZXZlbnQpXCJcbiAgICAgICAgW2JvcmRlcl09XCInMXB4IHNvbGlkIHZhcigtLXZibi1jb2xvci1wcmltYXJ5KSdcIlxuICAgICAgICBib3JkZXJSYWRpdXM9XCIxMHB4XCJcbiAgICAgICAgYm94U2hhZG93PVwiMnB4IDJweCAycHggMHB4IHNpbHZlclwiXG4gICAgICAgIGJnQ29sb3I9XCJ3aGl0ZVwiXG4gICAgICAgIHdpZHRoPVwiNDAwcHhcIlxuICAgICAgICB0ZXh0Q29sb3I9XCJibGFja1wiXG4gICAgICAgIHBkPVwiMXJlbVwiXG4gICAgICAgIHByaW1hcnlDb2xvcj1cInZhcigtLXZibi1jb2xvci1wcmltYXJ5KVwiXG4gICAgICAgIHNlY29uZGFyeUNvbG9yPVwidmFyKC0tdmJuLWNvbG9yLWJvcmRlci1mb2N1cylcIlxuICAgICAgICB0ZXJ0aWFyeUNvbG9yPVwidmFyKC0tdmJuLWNvbG9yLW9uLXByaW1hcnkpXCJcbiAgICAgICAgW2VuYWJsZURyYWdBbmREcm9wXT1cInRydWVcIlxuICAgICAgICBbc29ydE9wdGlvbnNdPVwic29ydE9wdGlvbnNcIlxuICAgICAgPjwvdmVyYmVuLXNvcnQtdGFibGU+XG4gICAgPC9kaXY+XG4gICAgPGRpdiBleHBvcnQtY29udGVudD5cbiAgICAgIDxsaWItZGF0YS1leHBvcnRcbiAgICAgICAgW2RhdGFdPVwiZGF0YVswXS5Qcm9wZXJ0aWVzXCJcbiAgICAgICAgKGV4cG9ydERhdGFFdmVudCk9XCJoYW5kbGVFeHBvcnQoJGV2ZW50KVwiXG4gICAgICA+XG4gICAgICA8L2xpYi1kYXRhLWV4cG9ydD5cbiAgICA8L2Rpdj5cbiAgPC92ZXJiZW4tZGF0YS12aWV3PlxuICA8ZGl2ICpuZ0lmPVwidmR2LmlzVGFibGVWaWV3XCIgY2xhc3M9XCJmbGV4IGdhcC0yIGp1c3RpZnktYmV0d2VlblwiPlxuICAgIDxkaXYgY2xhc3M9XCJtZXNzYWdlLWxvZy1idXR0b24tY29udGFpbmVyIGZsZXgganVzdGlmeS1iZXR3ZWVuXCI+XG4gICAgICA8dmVyYmVuYS1idXR0b25cbiAgICAgICAgW2ZvbnRXZWlnaHRdPVwiJ2JvbGQnXCJcbiAgICAgICAgW2JnQ29sb3JdPVwiJ3ZhcigtLXZibi1jb2xvci10ZXh0LW11dGVkKSdcIlxuICAgICAgICBbYm9yZGVyUmFkaXVzXT1cIic0cHgnXCJcbiAgICAgICAgW3RleHRDb2xvcl09XCIndmFyKC0tdmJuLWNvbG9yLXN1cmZhY2UpJ1wiXG4gICAgICAgIFt0ZXh0XT1cIidEZWxldGUnXCJcbiAgICAgID5cbiAgICAgIDwvdmVyYmVuYS1idXR0b24+XG4gICAgPC9kaXY+XG4gICAgPGRpdiBjbGFzcz1cImZsZXgganVzdGlmeS1lbmQgaXRlbXMtY2VudGVyIGdhcC01XCI+XG4gICAgICA8c3BhbiBjbGFzcz1cInBhZ2luYXRvci10ZXh0XCI+e3sgY2FyZERhdGEubGVuZ3RoIH19IHJlY29yZHMgbG9hZGVkPC9zcGFuPlxuICAgICAgPGJ1dHRvbiAoY2xpY2spPVwibG9hZE1vcmUoKVwiIGNsYXNzPVwibG9hZC1tb3JlIHZpZXctbGlua3NcIj5cbiAgICAgICAgTG9hZCBtb3JlXG4gICAgICA8L2J1dHRvbj5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+XG48L2Rpdj5cbjwhLS0gPGRpdiBjbGFzcz1cInctWzQwMHB4XSBiZy13aGl0ZSBwLTQgc2hhZG93LWxnIGJvcmRlclwiPlxuICA8Zm9ybS1jb250cm9sICBbZGF0YVR5cGVdPVwiZGF0YVR5cGUyXCIgW2Zvcm1Qcm9wZXJ0aWVzXT1cImRhdGFbMF0uUHJvcGVydGllc1wiPjwvZm9ybS1jb250cm9sPlxuPC9kaXY+IC0tPlxuIl19