@netgrif/components-core 6.2.0-rc.9 → 6.2.2

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 (178) hide show
  1. package/commons/schema.d.ts +3 -0
  2. package/esm2020/assets/i18n/de.json +18 -8
  3. package/esm2020/assets/i18n/en.json +11 -1
  4. package/esm2020/assets/i18n/sk.json +11 -1
  5. package/esm2020/commons/schema.mjs +1 -1
  6. package/esm2020/commons/view-class-info.mjs +9 -1
  7. package/esm2020/lib/admin/public-api.mjs +2 -2
  8. package/esm2020/lib/admin/role-assignment-ldap-group/abstract-ldap-group-role-assignment.component.mjs +88 -0
  9. package/esm2020/lib/authentication/services/methods/basic-authentication/basic-authentication.service.mjs +10 -2
  10. package/esm2020/lib/authorization/permission/access.service.mjs +2 -2
  11. package/esm2020/lib/authorization/role/role-guard.service.mjs +36 -11
  12. package/esm2020/lib/data-fields/button-field/abstract-button-field.component.mjs +2 -12
  13. package/esm2020/lib/data-fields/button-field/models/button-field.mjs +2 -18
  14. package/esm2020/lib/data-fields/enumeration-field/models/dynamic-enumeration-field.mjs +4 -5
  15. package/esm2020/lib/data-fields/enumeration-field/models/enumeration-field.mjs +2 -22
  16. package/esm2020/lib/data-fields/file-field/abstract-file-field.component.mjs +35 -15
  17. package/esm2020/lib/data-fields/file-list-field/abstract-file-list-field.component.mjs +38 -15
  18. package/esm2020/lib/data-fields/i18n-field/abstract-i18n-field.component.mjs +1 -4
  19. package/esm2020/lib/data-fields/models/abstract-data-field.mjs +9 -1
  20. package/esm2020/lib/data-fields/multichoice-field/models/multichoice-field.mjs +2 -17
  21. package/esm2020/lib/data-fields/multichoice-field/multichoice-autocomplete-field/abstract-multichoice-autocomplete-field-component.component.mjs +79 -0
  22. package/esm2020/lib/data-fields/number-field/currency-number-field/abstract-currency-number-field.component.mjs +3 -2
  23. package/esm2020/lib/data-fields/public-api.mjs +4 -1
  24. package/esm2020/lib/data-fields/text-field/models/text-area-field.mjs +4 -5
  25. package/esm2020/lib/data-fields/text-field/models/text-field.mjs +2 -14
  26. package/esm2020/lib/data-fields/user-list-field/abstract-user-list-field.component.mjs +75 -0
  27. package/esm2020/lib/data-fields/user-list-field/models/user-list-field.mjs +11 -0
  28. package/esm2020/lib/data-fields/user-list-field/models/user-list-value.mjs +36 -0
  29. package/esm2020/lib/dialog/components/alert-dialog/alert-dialog.component.mjs +4 -4
  30. package/esm2020/lib/dialog/components/confirm-dialog/confirm-dialog.component.mjs +4 -4
  31. package/esm2020/lib/dialog/components/prompt-dialog/prompt-dialog.component.mjs +4 -4
  32. package/esm2020/lib/dialog/models/abstract-dialog.component.mjs +29 -0
  33. package/esm2020/lib/header/abstract-header-service.mjs +25 -9
  34. package/esm2020/lib/header/abstract-header.component.mjs +7 -5
  35. package/esm2020/lib/header/case-header/case-header.service.mjs +2 -2
  36. package/esm2020/lib/header/services/overflow.service.mjs +2 -2
  37. package/esm2020/lib/header/task-header/task-header.service.mjs +7 -4
  38. package/esm2020/lib/header/workflow-header/workflow-header.service.mjs +11 -8
  39. package/esm2020/lib/navigation/breadcrumbs/abstract-breadcrumbs.component.mjs +69 -0
  40. package/esm2020/lib/navigation/navigation-double-drawer/abstract-navigation-double-drawer.mjs +7 -4
  41. package/esm2020/lib/navigation/public-api.mjs +2 -1
  42. package/esm2020/lib/navigation/service/uri.service.mjs +5 -1
  43. package/esm2020/lib/panel/abstract/panel-with-header-binding.mjs +17 -5
  44. package/esm2020/lib/panel/abstract/panel-with-immediate-data.mjs +52 -22
  45. package/esm2020/lib/panel/abstract-panel.component.mjs +16 -4
  46. package/esm2020/lib/panel/case-panel/abstract-case-panel.component.mjs +13 -11
  47. package/esm2020/lib/panel/configuration/config-params.mjs +5 -0
  48. package/esm2020/lib/panel/public-api.mjs +3 -1
  49. package/esm2020/lib/panel/task-panel/abstract-task-panel.component.mjs +18 -12
  50. package/esm2020/lib/panel/task-panel-list/abstract-task-list.component.mjs +3 -3
  51. package/esm2020/lib/panel/task-panel-list/default-task-panel-list/abstract-default-task-list.component.mjs +94 -0
  52. package/esm2020/lib/panel/task-panel-list/task-panel-list-pagination/abstract-task-list-pagination.component.mjs +3 -3
  53. package/esm2020/lib/panel/workflow-panel/abstract-workflow-panel.component.mjs +40 -6
  54. package/esm2020/lib/public/factories/public-factory-resolver.mjs +8 -3
  55. package/esm2020/lib/resources/engine-endpoint/petri-net-resource.service.mjs +12 -4
  56. package/esm2020/lib/resources/engine-endpoint/public/public-task-resource.service.mjs +1 -40
  57. package/esm2020/lib/resources/engine-endpoint/task-resource.service.mjs +6 -3
  58. package/esm2020/lib/resources/interface/fields.mjs +1 -1
  59. package/esm2020/lib/routing/redirect-service/redirect.service.mjs +2 -1
  60. package/esm2020/lib/search/models/category/case/case-dataset.mjs +7 -4
  61. package/esm2020/lib/search/search-operand-input-component/abstract-search-operand-input.component.mjs +3 -3
  62. package/esm2020/lib/side-menu/content-components/new-case/abstract-new-case.component.mjs +22 -11
  63. package/esm2020/lib/side-menu/content-components/new-case/model/new-case-injection-data.mjs +1 -1
  64. package/esm2020/lib/side-menu/content-components/save-filter/abstract-save-filter.component.mjs +8 -7
  65. package/esm2020/lib/side-menu/content-components/user-assign/abstract-user-assign.component.mjs +1 -1
  66. package/esm2020/lib/side-menu/content-components/user-assign/model/user-list-injected-data.mjs +1 -1
  67. package/esm2020/lib/snack-bar/components/error-snack-bar/error-snack-bar.component.mjs +3 -3
  68. package/esm2020/lib/snack-bar/components/generic-snack-bar/generic-snack-bar.component.mjs +3 -3
  69. package/esm2020/lib/snack-bar/components/success-snack-bar/success-snack-bar.component.mjs +3 -3
  70. package/esm2020/lib/snack-bar/components/warning-snack-bar/warning-snack-bar.component.mjs +3 -3
  71. package/esm2020/lib/snack-bar/models/abstract-snack-bar.component.mjs +26 -0
  72. package/esm2020/lib/snack-bar/public-api.mjs +2 -2
  73. package/esm2020/lib/task/services/finish-policy.service.mjs +2 -2
  74. package/esm2020/lib/task/services/task-data.service.mjs +51 -13
  75. package/esm2020/lib/task-content/model/field-type-resource.mjs +2 -1
  76. package/esm2020/lib/task-content/model/resource-interface.mjs +1 -1
  77. package/esm2020/lib/task-content/services/field-converter.service.mjs +28 -90
  78. package/esm2020/lib/task-content/services/task-content.service.mjs +5 -2
  79. package/esm2020/lib/view/abstract/view-with-headers.mjs +13 -4
  80. package/esm2020/lib/view/case-view/abstract-case-view.mjs +9 -12
  81. package/esm2020/lib/view/case-view/components/case-list/abstract-case-list.component.mjs +3 -3
  82. package/esm2020/lib/view/case-view/components/case-list-paginator/abstract-case-list-paginator.component.mjs +3 -3
  83. package/esm2020/lib/view/case-view/components/default-case-list/abstract-default-case-list.component.mjs +81 -0
  84. package/esm2020/lib/view/case-view/tabbed-case-view.mjs +7 -14
  85. package/esm2020/lib/view/task-view/abstract-single-task-view.component.mjs +3 -4
  86. package/esm2020/lib/view/task-view/abstract-task-view.mjs +6 -5
  87. package/esm2020/lib/view/task-view/tabbed-task-view.mjs +6 -5
  88. package/esm2020/lib/view/tree-case-view/tree-component/case-tree.service.mjs +6 -4
  89. package/esm2020/lib/view/workflow-view/abstract-workflow-view.component.mjs +6 -5
  90. package/fesm2015/netgrif-components-core.mjs +1010 -611
  91. package/fesm2015/netgrif-components-core.mjs.map +1 -1
  92. package/fesm2020/netgrif-components-core.mjs +996 -616
  93. package/fesm2020/netgrif-components-core.mjs.map +1 -1
  94. package/lib/admin/public-api.d.ts +1 -1
  95. package/lib/admin/role-assignment-ldap-group/{abstract-ldap-group-role-assignment.d.ts → abstract-ldap-group-role-assignment.component.d.ts} +3 -3
  96. package/lib/authentication/services/methods/basic-authentication/basic-authentication.service.d.ts +2 -0
  97. package/lib/authorization/role/role-guard.service.d.ts +2 -1
  98. package/lib/data-fields/button-field/abstract-button-field.component.d.ts +0 -5
  99. package/lib/data-fields/button-field/models/button-field.d.ts +1 -12
  100. package/lib/data-fields/enumeration-field/models/dynamic-enumeration-field.d.ts +2 -3
  101. package/lib/data-fields/enumeration-field/models/enumeration-field.d.ts +1 -11
  102. package/lib/data-fields/i18n-field/abstract-i18n-field.component.d.ts +0 -1
  103. package/lib/data-fields/models/abstract-data-field.d.ts +5 -0
  104. package/lib/data-fields/multichoice-field/models/multichoice-field.d.ts +1 -8
  105. package/lib/data-fields/multichoice-field/multichoice-autocomplete-field/abstract-multichoice-autocomplete-field-component.component.d.ts +24 -0
  106. package/lib/data-fields/number-field/currency-number-field/abstract-currency-number-field.component.d.ts +1 -0
  107. package/lib/data-fields/public-api.d.ts +3 -0
  108. package/lib/data-fields/text-field/models/text-area-field.d.ts +2 -3
  109. package/lib/data-fields/text-field/models/text-field.d.ts +1 -9
  110. package/lib/data-fields/user-list-field/abstract-user-list-field.component.d.ts +38 -0
  111. package/lib/data-fields/user-list-field/models/user-list-field.d.ts +10 -0
  112. package/lib/data-fields/user-list-field/models/user-list-value.d.ts +16 -0
  113. package/lib/dialog/components/alert-dialog/alert-dialog.component.d.ts +3 -3
  114. package/lib/dialog/components/confirm-dialog/confirm-dialog.component.d.ts +3 -3
  115. package/lib/dialog/components/prompt-dialog/prompt-dialog.component.d.ts +3 -3
  116. package/lib/dialog/models/{abstract-dialog.d.ts → abstract-dialog.component.d.ts} +3 -3
  117. package/lib/header/abstract-header-service.d.ts +6 -3
  118. package/lib/header/abstract-header.component.d.ts +2 -2
  119. package/lib/header/services/overflow.service.d.ts +1 -1
  120. package/lib/header/task-header/task-header.service.d.ts +3 -2
  121. package/lib/header/workflow-header/workflow-header.service.d.ts +3 -2
  122. package/lib/navigation/breadcrumbs/abstract-breadcrumbs.component.d.ts +18 -0
  123. package/lib/navigation/navigation-double-drawer/abstract-navigation-double-drawer.d.ts +1 -1
  124. package/lib/navigation/public-api.d.ts +1 -0
  125. package/lib/navigation/service/uri.service.d.ts +2 -0
  126. package/lib/panel/abstract/panel-with-header-binding.d.ts +5 -2
  127. package/lib/panel/abstract/panel-with-immediate-data.d.ts +4 -2
  128. package/lib/panel/abstract-panel.component.d.ts +5 -1
  129. package/lib/panel/case-panel/abstract-case-panel.component.d.ts +3 -3
  130. package/lib/panel/configuration/config-params.d.ts +3 -0
  131. package/lib/panel/public-api.d.ts +1 -0
  132. package/lib/panel/task-panel/abstract-task-panel.component.d.ts +5 -2
  133. package/lib/panel/task-panel-list/abstract-task-list.component.d.ts +2 -2
  134. package/lib/panel/task-panel-list/default-task-panel-list/{abstract-default-task-list.d.ts → abstract-default-task-list.component.d.ts} +3 -3
  135. package/lib/panel/task-panel-list/task-panel-list-pagination/abstract-task-list-pagination.component.d.ts +2 -2
  136. package/lib/panel/workflow-panel/abstract-workflow-panel.component.d.ts +13 -2
  137. package/lib/public/factories/public-factory-resolver.d.ts +2 -1
  138. package/lib/resources/engine-endpoint/petri-net-resource.service.d.ts +1 -1
  139. package/lib/resources/engine-endpoint/public/public-task-resource.service.d.ts +0 -12
  140. package/lib/resources/engine-endpoint/task-resource.service.d.ts +2 -1
  141. package/lib/resources/interface/fields.d.ts +0 -5
  142. package/lib/search/search-operand-input-component/abstract-search-operand-input.component.d.ts +1 -1
  143. package/lib/side-menu/content-components/new-case/model/new-case-injection-data.d.ts +5 -0
  144. package/lib/side-menu/content-components/save-filter/abstract-save-filter.component.d.ts +2 -1
  145. package/lib/side-menu/content-components/user-assign/model/user-list-injected-data.d.ts +2 -1
  146. package/lib/snack-bar/components/error-snack-bar/error-snack-bar.component.d.ts +2 -2
  147. package/lib/snack-bar/components/generic-snack-bar/generic-snack-bar.component.d.ts +2 -2
  148. package/lib/snack-bar/components/success-snack-bar/success-snack-bar.component.d.ts +2 -2
  149. package/lib/snack-bar/components/warning-snack-bar/warning-snack-bar.component.d.ts +2 -2
  150. package/lib/snack-bar/models/{abstract-snack-bar.d.ts → abstract-snack-bar.component.d.ts} +3 -3
  151. package/lib/snack-bar/public-api.d.ts +1 -1
  152. package/lib/task/services/task-data.service.d.ts +12 -3
  153. package/lib/task-content/model/field-type-resource.d.ts +1 -0
  154. package/lib/task-content/model/resource-interface.d.ts +0 -3
  155. package/lib/task-content/services/field-converter.service.d.ts +3 -16
  156. package/lib/task-content/services/task-content.service.d.ts +1 -0
  157. package/lib/view/abstract/view-with-headers.d.ts +5 -1
  158. package/lib/view/case-view/abstract-case-view.d.ts +5 -3
  159. package/lib/view/case-view/components/case-list/abstract-case-list.component.d.ts +2 -2
  160. package/lib/view/case-view/components/case-list-paginator/abstract-case-list-paginator.component.d.ts +2 -2
  161. package/lib/view/case-view/components/default-case-list/{abstract-default-case-list.d.ts → abstract-default-case-list.component.d.ts} +3 -3
  162. package/lib/view/case-view/tabbed-case-view.d.ts +4 -4
  163. package/lib/view/task-view/abstract-single-task-view.component.d.ts +0 -1
  164. package/lib/view/task-view/abstract-task-view.d.ts +2 -1
  165. package/lib/view/task-view/tabbed-task-view.d.ts +2 -1
  166. package/lib/view/workflow-view/abstract-workflow-view.component.d.ts +2 -1
  167. package/package.json +1 -2
  168. package/schematics/_commons/view-class-info.js +8 -0
  169. package/schematics/_commons/view-class-info.js.map +1 -1
  170. package/src/assets/i18n/de.json +18 -8
  171. package/src/assets/i18n/en.json +11 -1
  172. package/src/assets/i18n/sk.json +11 -1
  173. package/src/schema/nae-schema.json +6 -0
  174. package/esm2020/lib/admin/role-assignment-ldap-group/abstract-ldap-group-role-assignment.mjs +0 -88
  175. package/esm2020/lib/dialog/models/abstract-dialog.mjs +0 -29
  176. package/esm2020/lib/panel/task-panel-list/default-task-panel-list/abstract-default-task-list.mjs +0 -94
  177. package/esm2020/lib/snack-bar/models/abstract-snack-bar.mjs +0 -26
  178. package/esm2020/lib/view/case-view/components/default-case-list/abstract-default-case-list.mjs +0 -81
@@ -608,9 +608,11 @@ export class CaseTreeService {
608
608
  this._logger.error('Case ref accessor task could not be assigned', assignResponse.error);
609
609
  }
610
610
  const body = {};
611
- body[TreePetriflowIdentifiers.CHILDREN_CASE_REF] = {
612
- type: 'caseRef',
613
- value: newCaseRefValue
611
+ body[task.stringId] = {
612
+ [TreePetriflowIdentifiers.CHILDREN_CASE_REF]: {
613
+ type: 'caseRef',
614
+ value: newCaseRefValue
615
+ }
614
616
  };
615
617
  this._taskResourceService.setData(task.stringId, body).subscribe((outcomeResource) => {
616
618
  const changedFields = outcomeResource.outcome.changedFields.changedFields;
@@ -845,4 +847,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.11", ngImpo
845
847
  type: Inject,
846
848
  args: [NAE_TREE_CASE_VIEW_CONFIGURATION]
847
849
  }] }]; } });
848
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2FzZS10cmVlLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZXRncmlmLWNvbXBvbmVudHMtY29yZS9zcmMvbGliL3ZpZXcvdHJlZS1jYXNlLXZpZXcvdHJlZS1jb21wb25lbnQvY2FzZS10cmVlLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFDLE1BQU0sRUFBRSxVQUFVLEVBQWEsUUFBUSxFQUFDLE1BQU0sZUFBZSxDQUFDO0FBRXRFLE9BQU8sRUFBQyxVQUFVLEVBQUMsTUFBTSxzQkFBc0IsQ0FBQztBQUVoRCxPQUFPLEVBQUMsWUFBWSxFQUFDLE1BQU0sd0JBQXdCLENBQUM7QUFRcEQsT0FBTyxFQUFDLFlBQVksRUFBQyxNQUFNLDBDQUEwQyxDQUFDO0FBQ3RFLE9BQU8sRUFBQyxRQUFRLEVBQWMsRUFBRSxFQUFFLGFBQWEsRUFBeUIsVUFBVSxFQUFDLE1BQU0sTUFBTSxDQUFDO0FBRWhHLE9BQU8sRUFBQyx3QkFBd0IsRUFBQyxNQUFNLHFDQUFxQyxDQUFDO0FBQzdFLE9BQU8sRUFBQyxHQUFHLEVBQUMsTUFBTSxnQkFBZ0IsQ0FBQztBQUVuQyxPQUFPLEVBQUMsVUFBVSxFQUFDLE1BQU0sOENBQThDLENBQUM7QUFDeEUsT0FBTyxFQUFDLGlCQUFpQixFQUFDLE1BQU0sbUJBQW1CLENBQUM7QUFDcEQsT0FBTyxFQUFDLHVCQUF1QixFQUFDLE1BQU0sd0JBQXdCLENBQUM7QUFDL0QsT0FBTyxFQUFDLE1BQU0sRUFBQyxNQUFNLDBCQUEwQixDQUFDO0FBRWhELE9BQU8sRUFBQyxnQkFBZ0IsRUFBQyxNQUFNLHFDQUFxQyxDQUFDO0FBQ3JFLE9BQU8sRUFBQyw2QkFBNkIsRUFBQyxNQUFNLHdEQUF3RCxDQUFDO0FBQ3JHLE9BQU8sRUFBQyxZQUFZLEVBQUMsTUFBTSxzQ0FBc0MsQ0FBQztBQUdsRSxPQUFPLEVBQUMsc0JBQXNCLEVBQUMs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OzJCQUFDLDZCQUE2Qjs7MEJBQ2hELFFBQVE7OzBCQUFJLE1BQU07MkJBQUMsZ0NBQWdDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtJbmplY3QsIEluamVjdGFibGUsIE9uRGVzdHJveSwgT3B0aW9uYWx9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHtGaWx0ZXJ9IGZyb20gJy4uLy4uLy4uL2ZpbHRlci9tb2RlbHMvZmlsdGVyJztcbmltcG9ydCB7SHR0cFBhcmFtc30gZnJvbSAnQGFuZ3VsYXIvY29tbW9uL2h0dHAnO1xuaW1wb3J0IHtDYXNlUmVzb3VyY2VTZXJ2aWNlfSBmcm9tICcuLi8uLi8uLi9yZXNvdXJjZXMvZW5naW5lLWVuZHBvaW50L2Nhc2UtcmVzb3VyY2Uuc2VydmljZSc7XG5pbXBvcnQge0Nhc2VUcmVlTm9kZX0gZnJvbSAnLi9tb2RlbC9jYXNlLXRyZWUtbm9kZSc7XG5pbXBvcnQge1RyZWVDYXNlVmlld1NlcnZpY2V9IGZyb20gJy4uL3RyZWUtY2FzZS12aWV3LnNlcnZpY2UnO1xuaW1wb3J0IHtUYXNrUmVzb3VyY2VTZXJ2aWNlfSBmcm9tICcuLi8uLi8uLi9yZXNvdXJjZXMvZW5naW5lLWVuZHBvaW50L3Rhc2stcmVzb3VyY2Uuc2VydmljZSc7XG5pbXBvcnQge0xvZ2dlclNlcnZpY2V9IGZyb20gJy4uLy4uLy4uL2xvZ2dlci9zZXJ2aWNlcy9sb2dnZXIuc2VydmljZSc7XG5pbXBvcnQge0ltbWVkaWF0ZURhdGF9IGZyb20gJy4uLy4uLy4uL3Jlc291cmNlcy9pbnRlcmZhY2UvaW1tZWRpYXRlLWRhdGEnO1xuaW1wb3J0IHtDYXNlfSBmcm9tICcuLi8uLi8uLi9yZXNvdXJjZXMvaW50ZXJmYWNlL2Nhc2UnO1xuaW1wb3J0IHtQcm9jZXNzU2VydmljZX0gZnJvbSAnLi4vLi4vLi4vcHJvY2Vzcy9wcm9jZXNzLnNlcnZpY2UnO1xuaW1wb3J0IHtTaWRlTWVudVNlcnZpY2V9IGZyb20gJy4uLy4uLy4uL3NpZGUtbWVudS9zZXJ2aWNlcy9zaWRlLW1lbnUuc2VydmljZSc7XG5pbXBvcnQge1NpZGVNZW51U2l6ZX0gZnJvbSAnLi4vLi4vLi4vc2lkZS1tZW51L21vZGVscy9zaWRlLW1lbnUtc2l6ZSc7XG5pbXBvcnQge2ZvcmtKb2luLCBPYnNlcnZhYmxlLCBvZiwgUmVwbGF5U3ViamVjdCwgU3ViamVjdCwgU3Vic2NyaXB0aW9uLCB0aHJvd0Vycm9yfSBmcm9tICdyeGpzJztcbmltcG9ydCB7UGFnZX0gZnJvbSAnLi4vLi4vLi4vcmVzb3VyY2VzL2ludGVyZmFjZS9wYWdlJztcbmltcG9ydCB7VHJlZVBldHJpZmxvd0lkZW50aWZpZXJzfSBmcm9tICcuLi9tb2RlbC90cmVlLXBldHJpZmxvdy1pZGVudGlmaWVycyc7XG5pbXBvcnQge3RhcH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuaW1wb3J0IHtUcmFuc2xhdGVTZXJ2aWNlfSBmcm9tICdAbmd4LXRyYW5zbGF0ZS9jb3JlJztcbmltcG9ydCB7aGFzQ29udGVudH0gZnJvbSAnLi4vLi4vLi4vdXRpbGl0eS9wYWdpbmF0aW9uL3BhZ2UtaGFzLWNvbnRlbnQnO1xuaW1wb3J0IHtOZXN0ZWRUcmVlQ29udHJvbH0gZnJvbSAnQGFuZ3VsYXIvY2RrL3RyZWUnO1xuaW1wb3J0IHtNYXRUcmVlTmVzdGVkRGF0YVNvdXJjZX0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvdHJlZSc7XG5pbXBvcnQge29mVm9pZH0gZnJvbSAnLi4vLi4vLi4vdXRpbGl0eS9vZi12b2lkJztcbmltcG9ydCB7Q2FzZUdldFJlcXVlc3RCb2R5fSBmcm9tICcuLi8uLi8uLi9yZXNvdXJjZXMvaW50ZXJmYWNlL2Nhc2UtZ2V0LXJlcXVlc3QtYm9keSc7XG5pbXBvcnQge2dldEltbWVkaWF0ZURhdGF9IGZyb20gJy4uLy4uLy4uL3V0aWxpdHkvZ2V0LWltbWVkaWF0ZS1kYXRhJztcbmltcG9ydCB7TkFFX09QVElPTl9TRUxFQ1RPUl9DT01QT05FTlR9IGZyb20gJy4uLy4uLy4uL3NpZGUtbWVudS9jb250ZW50LWNvbXBvbmVudHMvaW5qZWN0aW9uLXRva2Vucyc7XG5pbXBvcnQge1NpbXBsZUZpbHRlcn0gZnJvbSAnLi4vLi4vLi4vZmlsdGVyL21vZGVscy9zaW1wbGUtZmlsdGVyJztcbmltcG9ydCB7Q2FzZVRyZWVQYXRofSBmcm9tICcuL21vZGVsL2Nhc2UtdHJlZS1wYXRoJztcbmltcG9ydCB7RXhwYW5zaW9uVHJlZX0gZnJvbSAnLi9tb2RlbC9leHBhbnNpb24tdHJlZSc7XG5pbXBvcnQge1Jlc3VsdFdpdGhBZnRlckFjdGlvbnN9IGZyb20gJy4uLy4uLy4uL3V0aWxpdHkvcmVzdWx0LXdpdGgtYWZ0ZXItYWN0aW9ucyc7XG5pbXBvcnQge0V2ZW50T3V0Y29tZU1lc3NhZ2VSZXNvdXJjZX0gZnJvbSAnLi4vLi4vLi4vcmVzb3VyY2VzL2ludGVyZmFjZS9tZXNzYWdlLXJlc291cmNlJztcbmltcG9ydCB7U2V0RGF0YUV2ZW50T3V0Y29tZX0gZnJvbSAnLi4vLi4vLi4vZXZlbnQvbW9kZWwvZXZlbnQtb3V0Y29tZXMvZGF0YS1vdXRjb21lcy9zZXQtZGF0YS1ldmVudC1vdXRjb21lJztcbmltcG9ydCB7Q3JlYXRlQ2FzZUV2ZW50T3V0Y29tZX0gZnJvbSAnLi4vLi4vLi4vZXZlbnQvbW9kZWwvZXZlbnQtb3V0Y29tZXMvY2FzZS1vdXRjb21lcy9jcmVhdGUtY2FzZS1ldmVudC1vdXRjb21lJztcbmltcG9ydCB7cmVmcmVzaFRyZWV9IGZyb20gJy4uLy4uLy4uL3V0aWxpdHkvcmVmcmVzaC10cmVlJztcbmltcG9ydCB7TkFFX1RSRUVfQ0FTRV9WSUVXX0NPTkZJR1VSQVRJT059IGZyb20gJy4vbW9kZWwvdHJlZS1jb25maWd1cmF0aW9uLWluamVjdGlvbi10b2tlbic7XG5pbXBvcnQge1RyZWVDYXNlVmlld0NvbmZpZ3VyYXRpb259IGZyb20gJy4vbW9kZWwvdHJlZS1jYXNlLXZpZXctY29uZmlndXJhdGlvbic7XG5pbXBvcnQge1BhZ2luYXRpb25QYXJhbXN9IGZyb20gJy4uLy4uLy4uL3V0aWxpdHkvcGFnaW5hdGlvbi9wYWdpbmF0aW9uLXBhcmFtcyc7XG5pbXBvcnQge2NyZWF0ZVNvcnRQYXJhbSwgUGFnaW5hdGlvblNvcnR9IGZyb20gJy4uLy4uLy4uL3V0aWxpdHkvcGFnaW5hdGlvbi9wYWdpbmF0aW9uLXNvcnQnO1xuXG4vKipcbiAqIEFuIGludGVybmFsIGhlbHBlciBvYmplY3QsIHRoYXQgaXMgdXNlZCB0byByZXR1cm4gdHdvIHZhbHVlcyBmcm9tIGEgZnVuY3Rpb24uXG4gKi9cbmludGVyZmFjZSBDYXNlVXBkYXRlUmVzdWx0IHtcbiAgICAvKipcbiAgICAgKiBXaGV0aGVyIHRoZSBhdHRyaWJ1dGVzIHRoYXQgYXJlIHZpc2libGUgb24gdGhlIHRyZWUgY2hhbmdlZFxuICAgICAqL1xuICAgIHZpc2libGVUcmVlUHJvcGVydGllc0NoYW5nZWQ6IGJvb2xlYW47XG4gICAgLyoqXG4gICAgICogV2hldGhlciB0aGUgbm9kZXMgY2hpbGRyZW4gY2hhbmdlZFxuICAgICAqL1xuICAgIGNoaWxkcmVuQ2hhbmdlZDogYm9vbGVhbjtcbn1cblxuQEluamVjdGFibGUoKVxuZXhwb3J0IGNsYXNzIENhc2VUcmVlU2VydmljZSBpbXBsZW1lbnRzIE9uRGVzdHJveSB7XG5cbiAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IERFRkFVTFRfUEFHRV9TSVpFID0gNTA7XG5cbiAgICBwcm90ZWN0ZWQgX2N1cnJlbnROb2RlOiBDYXNlVHJlZU5vZGU7XG4gICAgcHJpdmF0ZSBfcm9vdE5vZGVzRmlsdGVyOiBGaWx0ZXI7XG4gICAgcHJpdmF0ZSByZWFkb25seSBfdHJlZURhdGFTb3VyY2U6IE1hdFRyZWVOZXN0ZWREYXRhU291cmNlPENhc2VUcmVlTm9kZT47XG4gICAgcHJpdmF0ZSByZWFkb25seSBfdHJlZUNvbnRyb2w6IE5lc3RlZFRyZWVDb250cm9sPENhc2VUcmVlTm9kZT47XG4gICAgcHJpdmF0ZSBfdHJlZVJvb3RMb2FkZWQkOiBSZXBsYXlTdWJqZWN0PGJvb2xlYW4+O1xuICAgIHByaXZhdGUgX3Jvb3ROb2RlOiBDYXNlVHJlZU5vZGU7XG4gICAgcHJpdmF0ZSBfc2hvd1Jvb3Q6IGJvb2xlYW47XG4gICAgLyoqXG4gICAgICogV2VhdGhlciB0aGUgdHJlZSBpcyBlYWdlciBsb2FkZWQgb3Igbm90LlxuICAgICAqXG4gICAgICogRGVmYXVsdHMgdG8gYGZhbHNlYC5cbiAgICAgKlxuICAgICAqIEl0IGlzIG5vdCByZWNvbW1lbmRlZCB0byBlYWdlciBsb2FkIGxhcmdlIHRyZWVzIGFzIGVhY2ggbm9kZSBzZW5kcyBhIHNlcGFyYXRlIGJhY2tlbmQgcmVxdWVzdCB0byBsb2FkIGl0cyBkYXRhLlxuICAgICAqL1xuICAgIHByaXZhdGUgX2lzRWFnZXJMb2FkZWQgPSBmYWxzZTtcbiAgICAvKipcbiAgICAgKiBzdHJpbmcgaWQgb2YgdGhlIGNhc2UsIHRoYXQgaXMgY3VycmVudGx5IGJlaW5nIHJlbG9hZGVkLCBgdW5kZWZpbmVkYCBpZiBubyBjYXNlIGlzIGN1cnJlbnRseSBiZWluZyByZWxvYWRlZFxuICAgICAqL1xuICAgIHByaXZhdGUgX3JlbG9hZGVkQ2FzZUlkOiBzdHJpbmc7XG5cbiAgICBjb25zdHJ1Y3Rvcihwcm90ZWN0ZWQgX2Nhc2VSZXNvdXJjZVNlcnZpY2U6IENhc2VSZXNvdXJjZVNlcnZpY2UsXG4gICAgICAgICAgICAgICAgcHJvdGVjdGVkIF90cmVlQ2FzZVZpZXdTZXJ2aWNlOiBUcmVlQ2FzZVZpZXdTZXJ2aWNlLFxuICAgICAgICAgICAgICAgIHByb3RlY3RlZCBfdGFza1Jlc291cmNlU2VydmljZTogVGFza1Jlc291cmNlU2VydmljZSxcbiAgICAgICAgICAgICAgICBwcm90ZWN0ZWQgX2xvZ2dlcjogTG9nZ2VyU2VydmljZSxcbiAgICAgICAgICAgICAgICBwcm90ZWN0ZWQgX3Byb2Nlc3NTZXJ2aWNlOiBQcm9jZXNzU2VydmljZSxcbiAgICAgICAgICAgICAgICBwcm90ZWN0ZWQgX3NpZGVNZW51U2VydmljZTogU2lkZU1lbnVTZXJ2aWNlLFxuICAgICAgICAgICAgICAgIHByb3RlY3RlZCBfdHJhbnNsYXRlU2VydmljZTogVHJhbnNsYXRlU2VydmljZSxcbiAgICAgICAgICAgICAgICBAT3B0aW9uYWwoKSBASW5qZWN0KE5BRV9PUFRJT05fU0VMRUNUT1JfQ09NUE9ORU5UKSBwcm90ZWN0ZWQgX29wdGlvblNlbGVjdG9yQ29tcG9uZW50OiBhbnksXG4gICAgICAgICAgICAgICAgQE9wdGlvbmFsKCkgQEluamVjdChOQUVfVFJFRV9DQVNFX1ZJRVdfQ09ORklHVVJBVElPTikgcHJvdGVjdGVkIF90cmVlQ29uZmlndXJhdGlvbjogVHJlZUNhc2VWaWV3Q29uZmlndXJhdGlvbikge1xuICAgICAgICBpZiAoIXRoaXMuX3RyZWVDb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICB0aGlzLl90cmVlQ29uZmlndXJhdGlvbiA9IHtcbiAgICAgICAgICAgICAgICBwYWdlU2l6ZTogQ2FzZVRyZWVTZXJ2aWNlLkRFRkFVTFRfUEFHRV9TSVpFXG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5fdHJlZURhdGFTb3VyY2UgPSBuZXcgTWF0VHJlZU5lc3RlZERhdGFTb3VyY2U8Q2FzZVRyZWVOb2RlPigpO1xuICAgICAgICB0aGlzLl90cmVlQ29udHJvbCA9IG5ldyBOZXN0ZWRUcmVlQ29udHJvbDxDYXNlVHJlZU5vZGU+KG5vZGUgPT4gbm9kZS5jaGlsZHJlbik7XG4gICAgICAgIF90cmVlQ2FzZVZpZXdTZXJ2aWNlLnJlbG9hZENhc2UkLmFzT2JzZXJ2YWJsZSgpLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLnJlbG9hZEN1cnJlbnRDYXNlKCk7XG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLl90cmVlUm9vdExvYWRlZCQgPSBuZXcgUmVwbGF5U3ViamVjdDxib29sZWFuPigxKTtcbiAgICB9XG5cbiAgICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5fdHJlZVJvb3RMb2FkZWQkLmNvbXBsZXRlKCk7XG4gICAgfVxuXG4gICAgcHVibGljIHNldCByb290RmlsdGVyKGZpbHRlcjogRmlsdGVyKSB7XG4gICAgICAgIHRoaXMuX3Jvb3ROb2Rlc0ZpbHRlciA9IGZpbHRlcjtcbiAgICAgICAgdGhpcy5kYXRhU291cmNlLmRhdGEgPSBbXTtcbiAgICAgICAgdGhpcy5sb2FkVHJlZVJvb3QoKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IGRhdGFTb3VyY2UoKTogTWF0VHJlZU5lc3RlZERhdGFTb3VyY2U8Q2FzZVRyZWVOb2RlPiB7XG4gICAgICAgIHJldHVybiB0aGlzLl90cmVlRGF0YVNvdXJjZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IHRyZWVDb250cm9sKCk6IE5lc3RlZFRyZWVDb250cm9sPENhc2VUcmVlTm9kZT4ge1xuICAgICAgICByZXR1cm4gdGhpcy5fdHJlZUNvbnRyb2w7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBjdXJyZW50Tm9kZSgpOiBDYXNlVHJlZU5vZGUge1xuICAgICAgICByZXR1cm4gdGhpcy5fY3VycmVudE5vZGU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRW1pdHMgYSB2YWx1ZSB3aGVuZXZlciBhIG5ldyByb290IG5vZGUgRmlsdGVyIGlzIHNldC5cbiAgICAgKlxuICAgICAqIGB0cnVlYCBpcyBlbWl0dGVkIGlmIHRoZSByb290IG5vZGUgd2FzIHN1Y2Nlc3NmdWxseSBsb2FkZWQuIGBmYWxzZWAgb3RoZXJ3aXNlLlxuICAgICAqXG4gICAgICogT24gc3Vic2NyaXB0aW9uIGVtaXRzIHRoZSBsYXN0IGVtaXR0ZWQgdmFsdWUgKGlmIGFueSkgdG8gdGhlIHN1YnNjcmliZXIuXG4gICAgICovXG4gICAgcHVibGljIGdldCB0cmVlUm9vdExvYWRlZCQoKTogT2JzZXJ2YWJsZTxib29sZWFuPiB7XG4gICAgICAgIHJldHVybiB0aGlzLl90cmVlUm9vdExvYWRlZCQuYXNPYnNlcnZhYmxlKCk7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIGdldCBfY3VycmVudENhc2UoKTogQ2FzZSB8IHVuZGVmaW5lZCB7XG4gICAgICAgIHJldHVybiB0aGlzLl9jdXJyZW50Tm9kZSA/IHRoaXMuX2N1cnJlbnROb2RlLmNhc2UgOiB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybnMgYW4gYE9ic2VydmFibGVgIG9mIHRoZSB7QGxpbmsgTG9hZGluZ0VtaXR0ZXJ9IHJlcHJlc2VudGluZyB0aGUgbG9hZGluZyBzdGF0ZSBvZiB0aGUgcm9vdCBub2RlLlxuICAgICAqIFJldHVybnMgYHVuZGVmaW5lZGAgaWYgdGhlIHRyZWUgaGFzIG5vdCB5ZXQgYmVlbiBpbml0aWFsaXplZC5cbiAgICAgKlxuICAgICAqIFdhaXQgZm9yIGFuIGVtaXNzaW9uIG9uIHRoZSBbdHJlZVJvb3RMb2FkZWQkXXtAbGluayBDYXNlVHJlZVNlcnZpY2UjdHJlZVJvb3RMb2FkZWQkfSBzdHJlYW0gYmVmb3JlIGdldHRpbmcgdGhpcyBPYnNlcnZhYmxlLlxuICAgICAqXG4gICAgICogVGhlIGZpcnN0IHZhbHVlIGVtaXR0ZWQgYnkgdGhlIE9ic2VydmFibGUgaXMgYGZhbHNlYCwgd2hlbiB0aGUgdHJlZSBmaW5pc2hlcyBpbml0aWFsaXppbmcuXG4gICAgICovXG4gICAgcHVibGljIGdldCByb290Tm9kZUxvYWRpbmckKCk6IE9ic2VydmFibGU8Ym9vbGVhbj4gfCB1bmRlZmluZWQge1xuICAgICAgICByZXR1cm4gISF0aGlzLl9yb290Tm9kZSA/IHRoaXMuX3Jvb3ROb2RlLmxvYWRpbmdDaGlsZHJlbi5hc09ic2VydmFibGUoKSA6IHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJucyBhbiBgT2JzZXJ2YWJsZWAgb2YgdGhlIHtAbGluayBMb2FkaW5nRW1pdHRlcn0gcmVwcmVzZW50aW5nIHdoZXRoZXIgdGhlIHJvb3Qgbm9kZSBpcyBjdXJyZW50bHlcbiAgICAgKiBpbiB0aGUgcHJvY2VzcyBvZiBhZGRpbmcgYSBuZXcgY2hpbGQgbm9kZSBvciBub3QuXG4gICAgICogUmV0dXJucyBgdW5kZWZpbmVkYCBpZiB0aGUgdHJlZSBoYXMgbm90IHlldCBiZWVuIGluaXRpYWxpemVkLlxuICAgICAqXG4gICAgICogV2FpdCBmb3IgYW4gZW1pc3Npb24gb24gdGhlIFt0cmVlUm9vdExvYWRlZCRde0BsaW5rIENhc2VUcmVlU2VydmljZSN0cmVlUm9vdExvYWRlZCR9IHN0cmVhbSBiZWZvcmUgZ2V0dGluZyB0aGlzIE9ic2VydmFibGUuXG4gICAgICpcbiAgICAgKiBUaGUgZmlyc3QgdmFsdWUgZW1pdHRlZCBieSB0aGUgT2JzZXJ2YWJsZSBpcyBgZmFsc2VgLCB3aGVuIHRoZSB0cmVlIGZpbmlzaGVzIGluaXRpYWxpemluZy5cbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IHJvb3ROb2RlQWRkaW5nQ2hpbGQkKCk6IE9ic2VydmFibGU8Ym9vbGVhbj4gfCB1bmRlZmluZWQge1xuICAgICAgICByZXR1cm4gISF0aGlzLl9yb290Tm9kZSA/IHRoaXMuX3Jvb3ROb2RlLmFkZGluZ05vZGUuYXNPYnNlcnZhYmxlKCkgOiB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogV2VhdGhlciB0aGUgdHJlZSBpcyBlYWdlciBsb2FkZWQgb3Igbm90LlxuICAgICAqXG4gICAgICogRGVmYXVsdHMgdG8gYGZhbHNlYC5cbiAgICAgKlxuICAgICAqIEl0IGlzIG5vdCByZWNvbW1lbmRlZCB0byBlYWdlciBsb2FkIGxhcmdlIHRyZWVzIGFzIGVhY2ggbm9kZSBzZW5kcyBhIHNlcGFyYXRlIGJhY2tlbmQgcmVxdWVzdCB0byBsb2FkIGl0cyBkYXRhLlxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgaXNFYWdlckxvYWRlZCgpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2lzRWFnZXJMb2FkZWQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogV2VhdGhlciB0aGUgdHJlZSBpcyBlYWdlciBsb2FkZWQgb3Igbm90LlxuICAgICAqXG4gICAgICogRGVmYXVsdHMgdG8gYGZhbHNlYC5cbiAgICAgKlxuICAgICAqIEl0IGlzIG5vdCByZWNvbW1lbmRlZCB0byBlYWdlciBsb2FkIGxhcmdlIHRyZWVzIGFzIGVhY2ggbm9kZSBzZW5kcyBhIHNlcGFyYXRlIGJhY2tlbmQgcmVxdWVzdCB0byBsb2FkIGl0cyBkYXRhLlxuICAgICAqXG4gICAgICogQHBhcmFtIGVhZ2VyIHRoZSBuZXcgc2V0dGluZyBmb3IgZWFnZXIgbG9hZGluZ1xuICAgICAqL1xuICAgIHB1YmxpYyBzZXQgaXNFYWdlckxvYWRlZChlYWdlcjogYm9vbGVhbikge1xuICAgICAgICB0aGlzLl9pc0VhZ2VyTG9hZGVkID0gZWFnZXI7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogTG9hZHMgYW5kIHBvcHVsYXRlcyB0aGUgdG9wbW9zdCBsZXZlbCBvZiB0aGUgdHJlZS5cbiAgICAgKlxuICAgICAqIFRoZSBkaXNwbGF5ZWQgY2FzZXMgYXJlIGRldGVybWluZWQgYnkgdGhpcyBvYmplY3QncyBbcm9vdEZpbHRlcl17QGxpbmsgQ2FzZVRyZWVTZXJ2aWNlI3Jvb3RGaWx0ZXJ9LlxuICAgICAqXG4gICAgICogQ2FzZXMgYXJlIGxvYWRlZCBvbmUgcGFnZSBhdCBhIHRpbWUgYW5kIHRoZSB0cmVlIGlzIHJlZnJlc2hlZCBhZnRlciBlYWNoIHBhZ2UuXG4gICAgICogW2ZpbmlzaGVkTG9hZGluZ0ZpcnN0TGV2ZWwkXXtAbGluayBDYXNlVHJlZVNlcnZpY2UjdHJlZVJvb3RMb2FkZWQkfVxuICAgICAqIHdpbGwgZW1pdCBgdHJ1ZWAgb25jZSB0aGUgbGFzdCBwYWdlIGxvYWRzIHN1Y2Nlc3NmdWxseS5cbiAgICAgKiBgZmFsc2VgIHdpbGwgYmUgZW1pdHRlZCBpZiBhbnkgb2YgdGhlIHJlcXVlc3RzIGZhaWwuXG4gICAgICovXG4gICAgcHJvdGVjdGVkIGxvYWRUcmVlUm9vdCgpIHtcbiAgICAgICAgaWYgKHRoaXMuX3Jvb3ROb2Rlc0ZpbHRlcikge1xuICAgICAgICAgICAgdGhpcy5fY2FzZVJlc291cmNlU2VydmljZS5zZWFyY2hDYXNlcyh0aGlzLl9yb290Tm9kZXNGaWx0ZXIpLnN1YnNjcmliZShwYWdlID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoaGFzQ29udGVudChwYWdlKSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9yb290Tm9kZSA9IG5ldyBDYXNlVHJlZU5vZGUocGFnZS5jb250ZW50WzBdLCB1bmRlZmluZWQpO1xuICAgICAgICAgICAgICAgICAgICBpZiAocGFnZS5jb250ZW50Lmxlbmd0aCAhPT0gMSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fbG9nZ2VyLndhcm4oJ0ZpbHRlciBmb3IgdHJlZSByb290IHJldHVybmVkIG1vcmUgdGhhbiBvbmUgY2FzZS4gVXNpbmcgdGhlIGZpcnN0IHZhbHVlIGFzIHRyZWUgcm9vdC4uLicpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX3RyZWVSb290TG9hZGVkJC5uZXh0KHRydWUpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2xvZ2dlci5lcnJvcignVHJlZSByb290IGNhbm5vdCBiZSBnZW5lcmF0ZWQgZnJvbSB0aGUgcHJvdmlkZWQgZmlsdGVyJywgcGFnZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSwgZXJyb3IgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuX2xvZ2dlci5lcnJvcignUm9vdCBub2RlIG9mIHRoZSBjYXNlIHRyZWUgY291bGQgbm90IGJlIGxvYWRlZCcsIGVycm9yKTtcbiAgICAgICAgICAgICAgICB0aGlzLl90cmVlUm9vdExvYWRlZCQubmV4dChmYWxzZSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEFkZHMgdGhlIGxvYWRlZCB0cmVlIHJvb3QgdG8gdGhlIGRpc3BsYXkgYmFzZWQgb24gdGhlIHNldHRpbmcuXG4gICAgICogQHBhcmFtIHNob3dSb290IHdoZXRoZXIgdGhlIHJvb3Qgb2YgdGhlIHRyZWUgc2hvdWxkIGJlIGRpc3BsYXllZCBpbiB0aGUgdHJlZSBvciBub3QuXG4gICAgICogSWYgdGhlIHJvb3QgaXMgbm90IGRpc3BsYXllZCBpdCdzIGNoaWxkcmVuIHdpbGwgYmUgZGlzcGxheWVkIG9uIHRoZSBmaXJzdCBsZXZlbC5cbiAgICAgKiBAcmV0dXJucyBhbiBPYnNlcnZhYmxlIHRoYXQgZW1pdHMgd2hlbiB0aGUgdHJlZSBmaW5pc2hlcyBpbml0aWFsaXphdGlvbi5cbiAgICAgKi9cbiAgICBwdWJsaWMgaW5pdGlhbGl6ZVRyZWUoc2hvd1Jvb3Q6IGJvb2xlYW4pOiBPYnNlcnZhYmxlPHZvaWQ+IHtcbiAgICAgICAgaWYgKCF0aGlzLl9yb290Tm9kZSkge1xuICAgICAgICAgICAgdGhpcy5fbG9nZ2VyLmVycm9yKCdTZXQgYSBGaWx0ZXIgYmVmb3JlIGluaXRpYWxpemluZyB0aGUgY2FzZSB0cmVlJyk7XG4gICAgICAgICAgICByZXR1cm4gdGhyb3dFcnJvcihuZXcgRXJyb3IoJ1NldCBhIEZpbHRlciBiZWZvcmUgaW5pdGlhbGl6aW5nIHRoZSBjYXNlIHRyZWUnKSk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLl9zaG93Um9vdCA9IHNob3dSb290O1xuXG4gICAgICAgIGlmIChzaG93Um9vdCkge1xuICAgICAgICAgICAgdGhpcy5kYXRhU291cmNlLmRhdGEgPSBbdGhpcy5fcm9vdE5vZGVdO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5kYXRhU291cmNlLmRhdGEgPSB0aGlzLl9yb290Tm9kZS5jaGlsZHJlbjtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCByZXQ6IE9ic2VydmFibGU8dm9pZD47XG4gICAgICAgIGlmICghc2hvd1Jvb3QgfHwgdGhpcy5faXNFYWdlckxvYWRlZCkge1xuICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gbmV3IFJlcGxheVN1YmplY3Q8dm9pZD4oMSk7XG4gICAgICAgICAgICByZXQgPSByZXN1bHQuYXNPYnNlcnZhYmxlKCk7XG4gICAgICAgICAgICB0aGlzLmV4cGFuZE5vZGUodGhpcy5fcm9vdE5vZGUpLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5yZWZyZXNoVHJlZSgpO1xuICAgICAgICAgICAgICAgIHJlc3VsdC5uZXh0KCk7XG4gICAgICAgICAgICAgICAgcmVzdWx0LmNvbXBsZXRlKCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMucmVmcmVzaFRyZWUoKTtcbiAgICAgICAgICAgIHJldCA9IG9mVm9pZCgpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogTm90aWZpZXMgdGhlIHBhcmVudCBUcmVlQ2FzZVZpZXcgdGhhdCBhIGNhc2Ugd2FzIGNsaWNrZWQgaW4gdGhlIHRyZWUgYW5kIGl0J3MgVGFzayBzaG91bGQgYmUgZGlzcGxheWVkXG4gICAgICovXG4gICAgcHVibGljIGNoYW5nZUFjdGl2ZU5vZGUobm9kZTogQ2FzZVRyZWVOb2RlIHwgdW5kZWZpbmVkKTogdm9pZCB7XG4gICAgICAgIHRoaXMuX2N1cnJlbnROb2RlID0gbm9kZTtcbiAgICAgICAgdGhpcy5fdHJlZUNhc2VWaWV3U2VydmljZS5sb2FkVGFzayQubmV4dChub2RlID8gbm9kZS5jYXNlIDogdW5kZWZpbmVkKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUb2dnbGVzIHRoZSBleHBhbnNpb24gc3RhdGUgb2YgYSBub2RlXG4gICAgICogQHBhcmFtIG5vZGUgdGhlIHtAbGluayBDYXNlVHJlZU5vZGV9IHdobydzIGNvbnRlbnQgc2hvdWxkIGJlIHRvZ2dsZWRcbiAgICAgKi9cbiAgICBwdWJsaWMgdG9nZ2xlTm9kZShub2RlOiBDYXNlVHJlZU5vZGUpOiB2b2lkIHtcbiAgICAgICAgaWYgKHRoaXMuX3RyZWVDb250cm9sLmlzRXhwYW5kZWQobm9kZSkpIHtcbiAgICAgICAgICAgIHRoaXMuX3RyZWVDb250cm9sLmNvbGxhcHNlKG5vZGUpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5leHBhbmROb2RlKG5vZGUpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRXhwYW5kcyB0aGUgdGFyZ2V0IG5vZGUgaW4gdGhlIHRyZWUgYW5kIHJlbG9hZHMgaXQncyBjaGlsZHJlbiBpZiB0aGV5IGFyZSBtYXJrZWQgYXMgZGlydHlcbiAgICAgKiBAcGFyYW0gbm9kZSB0aGUge0BsaW5rIENhc2VUcmVlTm9kZX0gdGhhdCBzaG91bGQgYmUgZXhwYW5kZWRcbiAgICAgKiBAcmV0dXJucyBlbWl0cyBgdHJ1ZWAgaWYgdGhlIG5vZGUgaXMgZXhwYW5kZWQgYW5kIGBmYWxzZWAgaWYgbm90LiBJZiB0aGUgZXhwYW5zaW9uIGNhdXNlcyBtb3JlIG5vZGUgZXhwYW5zaW9uc1xuICAgICAqIChlLmcuIGVhZ2VyIGxvYWRlZCB0cmVlKSB0aGVuLCB0aGUgT2JzZXJ2YWJsZSBlbWl0cyBhZnRlciBhbGwgdGhlIHN1YnRyZWUgZXhwYW5zaW9ucyBjb21wbGV0ZS5cbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgZXhwYW5kTm9kZShub2RlOiBDYXNlVHJlZU5vZGUpOiBPYnNlcnZhYmxlPGJvb2xlYW4+IHtcbiAgICAgICAgdGhpcy5fbG9nZ2VyLmRlYnVnKCdSZXF1ZXN0aW5nIGV4cGFuc2lvbiBvZiB0cmVlIG5vZGUnLCBub2RlLnRvTG9nZ2FibGVGb3JtKCkpO1xuXG4gICAgICAgIGlmIChub2RlLmxvYWRpbmdDaGlsZHJlbi5pc0FjdGl2ZSkge1xuICAgICAgICAgICAgdGhpcy5fbG9nZ2VyLmRlYnVnKCdOb2RlIHJlcXVlc3RlZCBmb3IgZXhwYW5zaW9uIGlzIGxvYWRpbmcuIEV4cGFuc2lvbiBjYW5jZWxlZC4nKTtcbiAgICAgICAgICAgIHJldHVybiBvZihmYWxzZSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIW5vZGUuZGlydHlDaGlsZHJlbikge1xuICAgICAgICAgICAgdGhpcy5fbG9nZ2VyLmRlYnVnKCdOb2RlIHJlcXVlc3RlZCBmb3IgZXhwYW5zaW9uIGhhcyBjbGVhbiBjaGlsZHJlbi4gU2ltcGxlIGV4cGFuc2lvbi4nKTtcbiAgICAgICAgICAgIHRoaXMudHJlZUNvbnRyb2wuZXhwYW5kKG5vZGUpO1xuICAgICAgICAgICAgcmV0dXJuIG9mKHRydWUpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgcmV0ID0gbmV3IFJlcGxheVN1YmplY3Q8Ym9vbGVhbj4oMSk7XG4gICAgICAgIHRoaXMudXBkYXRlTm9kZUNoaWxkcmVuKG5vZGUpLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLl9sb2dnZXIuZGVidWcoJ05vZGUgcmVxdWVzdGVkIGZvciBleHBhbnNpb24gd2l0aCBkaXJ0eSBjaGlsZHJlbiBoYWQgaXRzIGNoaWxkcmVuIHJlbG9hZGVkLicpO1xuICAgICAgICAgICAgaWYgKG5vZGUuY2hpbGRyZW4ubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgIHRoaXMuX2xvZ2dlci5kZWJ1ZygnTm9kZSBleHBhbmRlZC4nLCBub2RlLnRvTG9nZ2FibGVGb3JtKCkpO1xuICAgICAgICAgICAgICAgIHRoaXMudHJlZUNvbnRyb2wuZXhwYW5kKG5vZGUpO1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLl9pc0VhZ2VyTG9hZGVkKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2xvZ2dlci5kZWJ1ZyhgRWFnZXIgbG9hZGluZyBjaGlsZHJlbiBvZiB0cmVlIG5vZGUgd2l0aCBjYXNlIGlkICcke25vZGUuY2FzZS5zdHJpbmdJZH0nYCk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGlubmVyT2JzZXJ2YWJsZXMgPSBub2RlLmNoaWxkcmVuLm1hcChjaGlsZE5vZGUgPT4gdGhpcy5leHBhbmROb2RlKGNoaWxkTm9kZSkpO1xuICAgICAgICAgICAgICAgICAgICAvLyBmb3JrSm9pbiBkb2Vzbid0IGVtaXQgd2l0aCAwIGlucHV0IG9ic2VydmFibGVzXG4gICAgICAgICAgICAgICAgICAgIGlubmVyT2JzZXJ2YWJsZXMucHVzaChvZih0cnVlKSk7XG4gICAgICAgICAgICAgICAgICAgIGZvcmtKb2luKGlubmVyT2JzZXJ2YWJsZXMpLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXQubmV4dCh0cnVlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldC5jb21wbGV0ZSgpO1xuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICByZXQubmV4dCh0cnVlKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0LmNvbXBsZXRlKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXQubmV4dChmYWxzZSk7XG4gICAgICAgICAgICAgICAgcmV0LmNvbXBsZXRlKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gcmV0LmFzT2JzZXJ2YWJsZSgpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENoZWNrcyB3aGV0aGVyIGRpcnR5IGNoaWxkcmVuIG5lZWQgdG8gYmUgcmVsb2FkZWQgYW5kIHJlbG9hZHMgdGhlbSBpZiBuZWVkZWQuXG4gICAgICogQHBhcmFtIG5vZGUgdGhlIHtAbGluayBDYXNlVHJlZU5vZGV9IHdobydzIGNoaWxkcmVuIGFyZSB1cGRhdGVkXG4gICAgICogQHJldHVybnMgZW1pdHMgd2hlbiBsb2FkaW5nIGZpbmlzaGVzXG4gICAgICovXG4gICAgcHJvdGVjdGVkIHVwZGF0ZU5vZGVDaGlsZHJlbihub2RlOiBDYXNlVHJlZU5vZGUpOiBPYnNlcnZhYmxlPHZvaWQ+IHtcbiAgICAgICAgbm9kZS5sb2FkaW5nQ2hpbGRyZW4ub24oKTtcblxuICAgICAgICBjb25zdCBjaGlsZHJlbkNhc2VSZWYgPSBnZXRJbW1lZGlhdGVEYXRhKG5vZGUuY2FzZSwgVHJlZVBldHJpZmxvd0lkZW50aWZpZXJzLkNISUxEUkVOX0NBU0VfUkVGKTtcbiAgICAgICAgaWYgKCFjaGlsZHJlbkNhc2VSZWYgfHwgY2hpbGRyZW5DYXNlUmVmLnZhbHVlLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgbm9kZS5jaGlsZHJlbiA9IFtdO1xuICAgICAgICAgICAgdGhpcy5yZWZyZXNoVHJlZSgpO1xuICAgICAgICAgICAgbm9kZS5kaXJ0eUNoaWxkcmVuID0gZmFsc2U7XG4gICAgICAgICAgICBub2RlLmxvYWRpbmdDaGlsZHJlbi5vZmYoKTtcbiAgICAgICAgICAgIHJldHVybiBvZlZvaWQoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChub2RlLmNoaWxkcmVuLmxlbmd0aCA9PT0gY2hpbGRyZW5DYXNlUmVmLnZhbHVlLmxlbmd0aCkge1xuICAgICAgICAgICAgY29uc3QgZXhpc3RpbmdDaGlsZHJlbiA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICAgICAgICAgICAgbm9kZS5jaGlsZHJlbi5mb3JFYWNoKGNoaWxkTm9kZSA9PiBleGlzdGluZ0NoaWxkcmVuLmFkZChjaGlsZE5vZGUuY2FzZS5zdHJpbmdJZCkpO1xuICAgICAgICAgICAgaWYgKGNoaWxkcmVuQ2FzZVJlZi52YWx1ZS5ldmVyeShjYXNlSWQgPT4gZXhpc3RpbmdDaGlsZHJlbi5oYXMoY2FzZUlkKSkpIHtcbiAgICAgICAgICAgICAgICBub2RlLmRpcnR5Q2hpbGRyZW4gPSBmYWxzZTtcbiAgICAgICAgICAgICAgICBub2RlLmxvYWRpbmdDaGlsZHJlbi5vZmYoKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gb2ZWb2lkKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdGhpcy51cGRhdGVQYWdlT2ZDaGlsZHJlbihub2RlLCAwKS5waXBlKFxuICAgICAgICAgICAgdGFwKCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5yZWZyZXNoVHJlZSgpO1xuICAgICAgICAgICAgICAgICAgICBub2RlLmRpcnR5Q2hpbGRyZW4gPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgbm9kZS5sb2FkaW5nQ2hpbGRyZW4ub2ZmKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgKVxuICAgICAgICApO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIExvYWRzIGV2ZXJ5IHBhZ2Ugb2YgY2hpbGRyZW4gZnJvbSB0aGUgZ2l2ZW4gbnVtYmVyIGFuZCB1cGRhdGVzIHRoZSBleGlzdGluZyBjaGlsZHJlbi5cbiAgICAgKlxuICAgICAqIE1pc3Npbmcgbm9kZXMgYXJlIHJlbW92ZWQuIEV4aXN0aW5nIG5vZGVzIGFyZSBtYXJrZWQgYXMgZGlydHkuIE5ldyBub2RlcyBhcmUgYWRkZWQuXG4gICAgICpcbiAgICAgKiBOb2RlcyBhcmUgcmV0dXJuZWQgaW4gdGhlaXIgaW5zZXJ0aW9uIG9yZGVyLlxuICAgICAqIEBwYXJhbSBub2RlIHRoZSB7QGxpbmsgQ2FzZVRyZWVOb2RlfSB3aG8ncyBjaGlsZHJlbiBhcmUgdXBkYXRlZFxuICAgICAqIEBwYXJhbSBwYWdlTnVtYmVyIHRoZSBudW1iZXIgb2YgdGhlIGZpcnN0IHBhZ2UgdGhhdCBzaG91bGQgYmUgbG9hZGVkLiBBbGwgZm9sbG93aW5nIHBhZ2VzIGFyZSBsb2FkZWQgYXMgd2VsbFxuICAgICAqIEByZXR1cm5zIG5leHQgaXMgZW1pdHRlZCB3aGVuIGxvYWRpbmcgb2YgYWxsIHBhZ2VzIGNvbXBsZXRlcyAocmVnYXJkbGVzcyBvZiB0aGUgb3V0Y29tZSlcbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgdXBkYXRlUGFnZU9mQ2hpbGRyZW4obm9kZTogQ2FzZVRyZWVOb2RlLCBwYWdlTnVtYmVyOiBudW1iZXIpOiBPYnNlcnZhYmxlPHZvaWQ+IHtcbiAgICAgICAgY29uc3QgcmVxdWVzdEJvZHkgPSB0aGlzLmNyZWF0ZUNoaWxkUmVxdWVzdEJvZHkobm9kZSk7XG4gICAgICAgIGlmICghcmVxdWVzdEJvZHkpIHtcbiAgICAgICAgICAgIHRoaXMuX2xvZ2dlci5lcnJvcignQ2Fubm90IGNyZWF0ZSBmaWx0ZXIgdG8gZmluZCBjaGlsZHJlbiBvZiB0aGUgZ2l2ZW4gbm9kZScsIG5vZGUuY2FzZSk7XG4gICAgICAgICAgICByZXR1cm4gdGhyb3dFcnJvcihuZXcgRXJyb3IoJ0Nhbm5vdCBjcmVhdGUgZmlsdGVyIHRvIGZpbmQgY2hpbGRyZW4gb2YgdGhlIGdpdmVuIG5vZGUnKSk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBkb25lID0gbmV3IFJlcGxheVN1YmplY3Q8dm9pZD4oMSk7XG5cbiAgICAgICAgbGV0IHBhcmFtczogSHR0cFBhcmFtcyA9IG5ldyBIdHRwUGFyYW1zKCk7XG4gICAgICAgIHBhcmFtcyA9IHBhcmFtcy5zZXQoUGFnaW5hdGlvblBhcmFtcy5QQUdFX1NJWkUsIGAke3RoaXMuX3RyZWVDb25maWd1cmF0aW9uLnBhZ2VTaXplfWApXG4gICAgICAgICAgICAgICAgICAgICAgIC5zZXQoUGFnaW5hdGlvblBhcmFtcy5QQUdFX05VTUJFUiwgYCR7cGFnZU51bWJlcn1gKVxuICAgICAgICAgICAgICAgICAgICAgICAuc2V0KFBhZ2luYXRpb25QYXJhbXMuUEFHRV9TT1JULCBjcmVhdGVTb3J0UGFyYW0oJ2NyZWF0aW9uRGF0ZScsIFBhZ2luYXRpb25Tb3J0LkFTQ0VORElORykpO1xuICAgICAgICB0aGlzLl9jYXNlUmVzb3VyY2VTZXJ2aWNlLmdldENhc2VzKHJlcXVlc3RCb2R5LCBwYXJhbXMpLnN1YnNjcmliZShwYWdlID0+IHtcbiAgICAgICAgICAgIGlmICghaGFzQ29udGVudChwYWdlKSkge1xuICAgICAgICAgICAgICAgIHRoaXMuX2xvZ2dlci5lcnJvcignQ2hpbGQgY2FzZXMgaW52YWxpZCBwYWdlIGNvbnRlbnQnLCBwYWdlKTtcbiAgICAgICAgICAgICAgICBkb25lLm5leHQoKTtcbiAgICAgICAgICAgICAgICBkb25lLmNvbXBsZXRlKCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB0aGlzLnVwZGF0ZUN1cnJlbnRDaGlsZHJlbldpdGhOZXdQYWdlKG5vZGUsIHBhZ2UpO1xuXG4gICAgICAgICAgICBpZiAocGFnZU51bWJlciArIDEgPCBwYWdlLnBhZ2luYXRpb24udG90YWxQYWdlcykge1xuICAgICAgICAgICAgICAgIHRoaXMudXBkYXRlUGFnZU9mQ2hpbGRyZW4obm9kZSwgcGFnZU51bWJlciArIDEpLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGRvbmUubmV4dCgpO1xuICAgICAgICAgICAgICAgICAgICBkb25lLmNvbXBsZXRlKCk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGRvbmUubmV4dCgpO1xuICAgICAgICAgICAgICAgIGRvbmUuY29tcGxldGUoKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICB9LCBlcnJvciA9PiB7XG4gICAgICAgICAgICB0aGlzLl9sb2dnZXIuZXJyb3IoJ0NoaWxkIGNhc2VzIGNvdWxkIG5vdCBiZSBsb2FkZWQnLCBlcnJvcik7XG4gICAgICAgICAgICBkb25lLm5leHQoKTtcbiAgICAgICAgICAgIGRvbmUuY29tcGxldGUoKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgcmV0dXJuIGRvbmUuYXNPYnNlcnZhYmxlKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVXBkYXRlcyB0aGUgY2hpbGRyZW4gb2YgdGhlIGdpdmVuIHtAbGluayBDYXNlVHJlZU5vZGV9IHdpdGggW0Nhc2VzXXtAbGluayBDYXNlfSBmcm9tIHRoZSBwcm92aWRlZCB7QGxpbmsgUGFnZX0uXG4gICAgICogQHBhcmFtIG5vZGUgdGhlIHtAbGluayBDYXNlVHJlZU5vZGV9IHdobydzIGNoaWxkcmVuIGFyZSB1cGRhdGVkXG4gICAgICogQHBhcmFtIHBhZ2UgdGhlIHtAbGluayBQYWdlfSB0aGF0IGNvbnRhaW5zIHRoZSB1cGRhdGVkIGNoaWxkcmVuXG4gICAgICovXG4gICAgcHJvdGVjdGVkIHVwZGF0ZUN1cnJlbnRDaGlsZHJlbldpdGhOZXdQYWdlKG5vZGU6IENhc2VUcmVlTm9kZSwgcGFnZTogUGFnZTxDYXNlPik6IHZvaWQge1xuICAgICAgICBwYWdlLmNvbnRlbnQuZm9yRWFjaCgobmV3Q2FzZSwgaW5kZXgpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHBvc2l0aW9uID0gcGFnZS5wYWdpbmF0aW9uLnNpemUgKiBwYWdlLnBhZ2luYXRpb24ubnVtYmVyICsgaW5kZXg7XG4gICAgICAgICAgICB3aGlsZSAocG9zaXRpb24gPCBub2RlLmNoaWxkcmVuLmxlbmd0aCAmJiBub2RlLmNoaWxkcmVuW3Bvc2l0aW9uXS5jYXNlLnN0cmluZ0lkICE9PSBuZXdDYXNlLnN0cmluZ0lkKSB7XG4gICAgICAgICAgICAgICAgbm9kZS5jaGlsZHJlbi5zcGxpY2UocG9zaXRpb24sIDEpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKG5vZGUuY2hpbGRyZW4ubGVuZ3RoID09PSBwb3NpdGlvbikge1xuICAgICAgICAgICAgICAgIG5vZGUuY2hpbGRyZW4ucHVzaChuZXcgQ2FzZVRyZWVOb2RlKG5ld0Nhc2UsIG5vZGUpKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgbm9kZS5jaGlsZHJlbltwb3NpdGlvbl0uY2FzZSA9IG5ld0Nhc2U7XG4gICAgICAgICAgICAgICAgbm9kZS5kaXJ0eUNoaWxkcmVuID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB0aGlzLnRyZWVDb250cm9sLmNvbGxhcHNlRGVzY2VuZGFudHMobm9kZS5jaGlsZHJlbltwb3NpdGlvbl0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0gbm9kZSB0aGUge0BsaW5rIENhc2VUcmVlTm9kZX0gd2hvJ3MgY2hpbGRyZW4gdGhlIHtAbGluayBGaWx0ZXJ9IHNob3VsZCByZXR1cm5cbiAgICAgKiBAcmV0dXJucyBhIHJlcXVlc3QgYm9keSB0aGF0IGZpbmRzIGFsbCBjaGlsZCBjYXNlcyBvZiB0aGUgZ2l2ZW4gYG5vZGVgLlxuICAgICAqIFJldHVybnMgYHVuZGVmaW5lZGAgaWYgdGhlIHByb3ZpZGVkIGBub2RlYCBkb2Vzbid0IGNvbnRhaW4gZW5vdWdoIGluZm9ybWF0aW9uIHRvIGNyZWF0ZSB0aGUgcmVxdWVzdCBib2R5LlxuICAgICAqL1xuICAgIHByb3RlY3RlZCBjcmVhdGVDaGlsZFJlcXVlc3RCb2R5KG5vZGU6IENhc2VUcmVlTm9kZSk6IENhc2VHZXRSZXF1ZXN0Qm9keSB7XG4gICAgICAgIGNvbnN0IGNoaWxkQ2FzZVJlZiA9IGdldEltbWVkaWF0ZURhdGEobm9kZS5jYXNlLCBUcmVlUGV0cmlmbG93SWRlbnRpZmllcnMuQ0hJTERSRU5fQ0FTRV9SRUYpO1xuICAgICAgICBpZiAoIWNoaWxkQ2FzZVJlZikge1xuICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB7c3RyaW5nSWQ6IChjaGlsZENhc2VSZWYudmFsdWUgYXMgQXJyYXk8c3RyaW5nPil9O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEFkZHMgYSBjaGlsZCB0byB0aGUgcm9vdCBub2RlLlxuICAgICAqXG4gICAgICogVXNlZnVsIGlmIHlvdSBhcmUgdXNpbmcgdGhlIGxheW91dCB3aGVyZSB0aGUgcm9vdCBub2RlIGlzIGhpZGRlbi5cbiAgICAgKiBAcmV0dXJucyBlbWl0cyBgdHJ1ZWAgaWYgdGhlIGNoaWxkIHdhcyBzdWNjZXNzZnVsbHkgYWRkZWQsIGBmYWxzZWAgaWYgbm90XG4gICAgICovXG4gICAgcHVibGljIGFkZFJvb3RDaGlsZE5vZGUoKTogT2JzZXJ2YWJsZTxib29sZWFuPiB7XG4gICAgICAgIGNvbnN0IHJldCA9IG5ldyBSZXBsYXlTdWJqZWN0PGJvb2xlYW4+KDEpO1xuICAgICAgICB0aGlzLmFkZENoaWxkTm9kZSh0aGlzLl9yb290Tm9kZSkuc3Vic2NyaWJlKGFkZGVkID0+IHtcbiAgICAgICAgICAgIGlmIChhZGRlZCkge1xuICAgICAgICAgICAgICAgIGlmICghdGhpcy5fc2hvd1Jvb3QgJiYgdGhpcy5fdHJlZURhdGFTb3VyY2UuZGF0YS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fdHJlZURhdGFTb3VyY2UuZGF0YSA9IHRoaXMuX3Jvb3ROb2RlLmNoaWxkcmVuO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnJlZnJlc2hUcmVlKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0Lm5leHQoYWRkZWQpO1xuICAgICAgICAgICAgcmV0LmNvbXBsZXRlKCk7XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gcmV0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEFkZHMgYSBuZXcgY2hpbGQgbm9kZSB0byB0aGUgZ2l2ZW4gbm9kZSBiYXNlZCBvbiB0aGUgcHJvcGVydGllcyBvZiB0aGUgbm9kZSdzIGNhc2VcbiAgICAgKiBAcmV0dXJucyBlbWl0cyBgdHJ1ZWAgaWYgdGhlIGNoaWxkIHdhcyBzdWNjZXNzZnVsbHkgYWRkZWQsIGBmYWxzZWAgaWYgbm90XG4gICAgICovXG4gICAgcHVibGljIGFkZENoaWxkTm9kZShjbGlja2VkTm9kZTogQ2FzZVRyZWVOb2RlKTogT2JzZXJ2YWJsZTxib29sZWFuPiB7XG4gICAgICAgIGNsaWNrZWROb2RlLmFkZGluZ05vZGUub24oKTtcbiAgICAgICAgY29uc3QgY2FzZVJlZkZpZWxkID0gZ2V0SW1tZWRpYXRlRGF0YShjbGlja2VkTm9kZS5jYXNlLCBUcmVlUGV0cmlmbG93SWRlbnRpZmllcnMuQ0hJTERSRU5fQ0FTRV9SRUYpO1xuXG4gICAgICAgIGlmIChjYXNlUmVmRmllbGQuYWxsb3dlZE5ldHMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICB0aGlzLl9sb2dnZXIuZXJyb3IoYENhc2UgJHtjbGlja2VkTm9kZS5jYXNlLnN0cmluZ0lkfSBjYW4gYWRkIG5ldyB0cmVlIG5vZGVzIGJ1dCBoYXMgbm8gYWxsb3dlZCBuZXRzYCk7XG4gICAgICAgICAgICBjbGlja2VkTm9kZS5hZGRpbmdOb2RlLm9mZigpO1xuICAgICAgICAgICAgcmV0dXJuIG9mKGZhbHNlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHJldCA9IG5ldyBSZXBsYXlTdWJqZWN0PGJvb2xlYW4+KDEpO1xuXG4gICAgICAgIGlmIChjYXNlUmVmRmllbGQuYWxsb3dlZE5ldHMubGVuZ3RoID09PSAxKSB7XG4gICAgICAgICAgICB0aGlzLmNyZWF0ZUFuZEFkZENoaWxkQ2FzZShjYXNlUmVmRmllbGQuYWxsb3dlZE5ldHNbMF0sIGNsaWNrZWROb2RlLCByZXQpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5fcHJvY2Vzc1NlcnZpY2UuZ2V0TmV0cyhjYXNlUmVmRmllbGQuYWxsb3dlZE5ldHMpLnN1YnNjcmliZShuZXRzID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBzaWRlTWV1UmVmID0gdGhpcy5fc2lkZU1lbnVTZXJ2aWNlLm9wZW4odGhpcy5fb3B0aW9uU2VsZWN0b3JDb21wb25lbnQsIFNpZGVNZW51U2l6ZS5NRURJVU0sIHtcbiAgICAgICAgICAgICAgICAgICAgdGl0bGU6IGNsaWNrZWROb2RlLmNhc2UudGl0bGUsXG4gICAgICAgICAgICAgICAgICAgIG9wdGlvbnM6IG5ldHMubWFwKG5ldCA9PiAoe3RleHQ6IG5ldC50aXRsZSwgdmFsdWU6IG5ldC5pZGVudGlmaWVyfSkpXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgbGV0IHNpZGVNZW51U3Vic2NyaXB0aW9uOiBTdWJzY3JpcHRpb247XG4gICAgICAgICAgICAgICAgc2lkZU1lbnVTdWJzY3JpcHRpb24gPSBzaWRlTWV1UmVmLm9uQ2xvc2Uuc3Vic2NyaWJlKGV2ZW50ID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCEhZXZlbnQuZGF0YSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jcmVhdGVBbmRBZGRDaGlsZENhc2UoZXZlbnQuZGF0YS52YWx1ZSwgY2xpY2tlZE5vZGUsIHJldCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBzaWRlTWVudVN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgY2xpY2tlZE5vZGUuYWRkaW5nTm9kZS5vZmYoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldC5uZXh0KGZhbHNlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldC5jb21wbGV0ZSgpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmV0LmFzT2JzZXJ2YWJsZSgpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBuZXcgY2FzZSBhbmQgYWRkcyBpdCB0byB0aGUgY2hpbGRyZW4gb2YgdGhlIHNwZWNpZmllZCBub2RlXG4gICAgICogQHBhcmFtIHByb2Nlc3NJZGVudGlmaWVyIGlkZW50aWZpZXIgb2YgdGhlIHByb2Nlc3MgdGhhdCBzaG91bGQgYmUgY3JlYXRlZFxuICAgICAqIEBwYXJhbSBjbGlja2VkTm9kZSB0aGUgbm9kZSB0aGF0IGlzIHRoZSBwYXJlbnQgb2YgdGhlIG5ldyBjYXNlXG4gICAgICogQHBhcmFtIG9wZXJhdGlvblJlc3VsdCB0aGUgcmVzdWx0IG9mIHRoZSBvcGVyYXRpb24gd2lsbCBiZSBlbWl0dGVkIGludG8gdGhpcyBzdHJlYW0gd2hlbiB0aGUgb3BlcmF0aW9uIGNvbXBsZXRlc1xuICAgICAqL1xuICAgIHByb3RlY3RlZCBjcmVhdGVBbmRBZGRDaGlsZENhc2UocHJvY2Vzc0lkZW50aWZpZXI6IHN0cmluZyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsaWNrZWROb2RlOiBDYXNlVHJlZU5vZGUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGVyYXRpb25SZXN1bHQ6IFN1YmplY3Q8Ym9vbGVhbj4pIHtcbiAgICAgICAgdGhpcy5fcHJvY2Vzc1NlcnZpY2UuZ2V0TmV0KHByb2Nlc3NJZGVudGlmaWVyKS5zdWJzY3JpYmUobmV0ID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGNoaWxkVGl0bGVJbW1lZGlhdGUgPSBnZXRJbW1lZGlhdGVEYXRhKGNsaWNrZWROb2RlLmNhc2UsIFRyZWVQZXRyaWZsb3dJZGVudGlmaWVycy5DSElMRF9OT0RFX1RJVExFKTtcbiAgICAgICAgICAgIGxldCBjaGlsZFRpdGxlID0gdGhpcy5fdHJhbnNsYXRlU2VydmljZS5pbnN0YW50KCdjYXNlVHJlZS5uZXdOb2RlRGVmYXVsdE5hbWUnKTtcbiAgICAgICAgICAgIGlmICghIWNoaWxkVGl0bGVJbW1lZGlhdGUpIHtcbiAgICAgICAgICAgICAgICBjaGlsZFRpdGxlID0gY2hpbGRUaXRsZUltbWVkaWF0ZS52YWx1ZTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoISFuZXQuZGVmYXVsdENhc2VOYW1lKSB7XG4gICAgICAgICAgICAgICAgY2hpbGRUaXRsZSA9IG5ldC5kZWZhdWx0Q2FzZU5hbWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLl9jYXNlUmVzb3VyY2VTZXJ2aWNlLmNyZWF0ZUNhc2Uoe1xuICAgICAgICAgICAgICAgIHRpdGxlOiBjaGlsZFRpdGxlLFxuICAgICAgICAgICAgICAgIG5ldElkOiBuZXQuc3RyaW5nSWRcbiAgICAgICAgICAgIH0pLnN1YnNjcmliZSgob3V0Y29tZVJlc291cmNlOiBFdmVudE91dGNvbWVNZXNzYWdlUmVzb3VyY2UpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBjYXNlUmVmRmllbGQgPSBnZXRJbW1lZGlhdGVEYXRhKGNsaWNrZWROb2RlLmNhc2UsIFRyZWVQZXRyaWZsb3dJZGVudGlmaWVycy5DSElMRFJFTl9DQVNFX1JFRik7XG4gICAgICAgICAgICAgICAgY29uc3Qgc2V0Q2FzZVJlZlZhbHVlID0gWy4uLmNhc2VSZWZGaWVsZC52YWx1ZSwgKG91dGNvbWVSZXNvdXJjZS5vdXRjb21lIGFzIENyZWF0ZUNhc2VFdmVudE91dGNvbWUpLmFDYXNlLnN0cmluZ0lkXTtcbiAgICAgICAgICAgICAgICB0aGlzLnBlcmZvcm1DYXNlUmVmQ2FsbChjbGlja2VkTm9kZS5jYXNlLnN0cmluZ0lkLCBzZXRDYXNlUmVmVmFsdWUpLnN1YnNjcmliZShcbiAgICAgICAgICAgICAgICAgICAgdmFsdWVDaGFuZ2UgPT4gdGhpcy51cGRhdGVUcmVlQWZ0ZXJDaGlsZEFkZChjbGlja2VkTm9kZSwgdmFsdWVDaGFuZ2UgPyB2YWx1ZUNoYW5nZSA6IHNldENhc2VSZWZWYWx1ZSwgb3BlcmF0aW9uUmVzdWx0KVxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVXBkYXRlcyB0aGUgdHJlZSBhZnRlciBhZGRpbmcgYSBuZXcgY2hpbGRcbiAgICAgKiBAcGFyYW0gY2xpY2tlZE5vZGUgdGhlIHBhcmVudCBub2RlXG4gICAgICogQHBhcmFtIG5ld0Nhc2VSZWZWYWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSBwYXJlbnQgbm9kZSdzIGNhc2UgcmVmXG4gICAgICogQHBhcmFtIG9wZXJhdGlvblJlc3VsdCB0aGUgcmVzdWx0IG9mIHRoZSBvcGVyYXRpb24gd2lsbCBiZSBlbWl0dGVkIGludG8gdGhpcyBzdHJlYW0gd2hlbiB0aGUgb3BlcmF0aW9uIGNvbXBsZXRlc1xuICAgICAqL1xuICAgIHByb3RlY3RlZCB1cGRhdGVUcmVlQWZ0ZXJDaGlsZEFkZChjbGlja2VkTm9kZTogQ2FzZVRyZWVOb2RlLCBuZXdDYXNlUmVmVmFsdWU6IEFycmF5PHN0cmluZz4sIG9wZXJhdGlvblJlc3VsdDogU3ViamVjdDxib29sZWFuPik6IHZvaWQge1xuICAgICAgICB0aGlzLnVwZGF0ZU5vZGVDaGlsZHJlbkZyb21DaGFuZ2VkRmllbGRzKGNsaWNrZWROb2RlLCBuZXdDYXNlUmVmVmFsdWUpLnN1YnNjcmliZShyZXN1bHQgPT4ge1xuICAgICAgICAgICAgY2xpY2tlZE5vZGUuYWRkaW5nTm9kZS5vZmYoKTtcbiAgICAgICAgICAgIHRoaXMuZXhwYW5kTm9kZShjbGlja2VkTm9kZSkuc3Vic2NyaWJlKGV4cGFuZFN1Y2Nlc3MgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChleHBhbmRTdWNjZXNzKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY2hhbmdlQWN0aXZlTm9kZShjbGlja2VkTm9kZS5jaGlsZHJlbltjbGlja2VkTm9kZS5jaGlsZHJlbi5sZW5ndGggLSAxXSk7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdC5leGVjdXRlQWZ0ZXJBY3Rpb25zKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIG9wZXJhdGlvblJlc3VsdC5uZXh0KHRydWUpO1xuICAgICAgICAgICAgICAgIG9wZXJhdGlvblJlc3VsdC5jb21wbGV0ZSgpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIHJlbW92ZXMgdGhlIHByb3ZpZGVkIG5vbi1yb290IG5vZGUgaWYgdGhlIHVuZGVybHlpbmcgY2FzZSBhbGxvd3MgaXQuXG4gICAgICpcbiAgICAgKiBUaGUgdW5kZXJseWluZyBjYXNlIGlzIHJlbW92ZWQgZnJvbSB0aGUgY2FzZSByZWYgb2YgaXQncyBwYXJlbnQgZWxlbWVudCB3aXRoIHRoZSBoZWxwIGZyb20gdGhlIGByZW1vdmVgXG4gICAgICogb3BlcmF0aW9uIHByb3ZpZGVkIGJ5IGNhc2UgcmVmIGl0c2VsZi5cbiAgICAgKiBAcGFyYW0gbm9kZSB0aGUgbm9kZSB0aGF0IHNob3VsZCBiZSByZW1vdmVkIGZyb20gdGhlIHRyZWVcbiAgICAgKi9cbiAgICBwdWJsaWMgcmVtb3ZlTm9kZShub2RlOiBDYXNlVHJlZU5vZGUpOiB2b2lkIHtcbiAgICAgICAgaWYgKCFub2RlLnBhcmVudCkge1xuICAgICAgICAgICAgdGhpcy5fbG9nZ2VyLmVycm9yKCdDYXNlIHRyZWUgZG9lc25cXCd0IHN1cHBvcnQgcmVtb3ZhbCBvZiB0aGUgcm9vdCBub2RlLCBhcyBpdCBoYXMgbm8gcGFyZW50IGNhc2UgcmVmLicpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgbm9kZS5yZW1vdmluZ05vZGUub24oKTtcbiAgICAgICAgY29uc3QgY2FzZVJlZkltbWVkaWF0ZSA9IGdldEltbWVkaWF0ZURhdGEobm9kZS5wYXJlbnQuY2FzZSwgVHJlZVBldHJpZmxvd0lkZW50aWZpZXJzLkNISUxEUkVOX0NBU0VfUkVGKTtcbiAgICAgICAgY29uc3Qgc2V0Q2FzZVJlZlZhbHVlID0gKGNhc2VSZWZJbW1lZGlhdGUudmFsdWUgYXMgQXJyYXk8c3RyaW5nPikuZmlsdGVyKGlkID0+IGlkICE9PSBub2RlLmNhc2Uuc3RyaW5nSWQpO1xuICAgICAgICB0aGlzLnBlcmZvcm1DYXNlUmVmQ2FsbChub2RlLnBhcmVudC5jYXNlLnN0cmluZ0lkLCBzZXRDYXNlUmVmVmFsdWUpLnN1YnNjcmliZShjYXNlUmVmQ2hhbmdlID0+IHtcbiAgICAgICAgICAgIGNvbnN0IG5ld0Nhc2VSZWZWYWx1ZSA9IGNhc2VSZWZDaGFuZ2UgPyBjYXNlUmVmQ2hhbmdlIDogc2V0Q2FzZVJlZlZhbHVlO1xuICAgICAgICAgICAgdGhpcy5kZWxldGVSZW1vdmVkTm9kZXMobm9kZS5wYXJlbnQsIG5ld0Nhc2VSZWZWYWx1ZSk7XG4gICAgICAgICAgICB0aGlzLnVwZGF0ZU5vZGVDaGlsZHJlbkZyb21DaGFuZ2VkRmllbGRzKG5vZGUucGFyZW50LCBuZXdDYXNlUmVmVmFsdWUpO1xuXG4gICAgICAgICAgICBub2RlLnJlbW92aW5nTm9kZS5vZmYoKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgdGhpcy5kZXNlbGVjdE5vZGVJZkRlc2NlbmRhbnRPZihub2RlKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBFeHBhbmRzIGFsbCBub2RlcyBpbiB0aGUgdHJlZSBkaWN0YXRlZCBieSB0aGUgYXJndW1lbnQuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gcGF0aCBub2RlcyB0aGF0IHNob3VsZCBiZSBleHBhbmRlZCBhbG9uZyB3aXRoIHRoZWlyIHBhdGggZnJvbSB0aGUgcm9vdCBub2RlXG4gICAgICovXG4gICAgcHVibGljIGV4cGFuZFBhdGgocGF0aDogQ2FzZVRyZWVQYXRoKTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLmRhdGFTb3VyY2UuZGF0YS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBsZXQgcm9vdE5vZGUgPSB0aGlzLmRhdGFTb3VyY2UuZGF0YVswXTtcbiAgICAgICAgd2hpbGUgKHJvb3ROb2RlLnBhcmVudCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICByb290Tm9kZSA9IHJvb3ROb2RlLnBhcmVudDtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmV4cGFuZExldmVsKFtyb290Tm9kZV0sIHRoaXMuY29udmVydFBhdGhUb0V4cGFuc2lvblRyZWUocGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRyYW5zZm9ybXMgYSB7QExpbmsgQ2FzZVRyZWVQYXRofSBvYmplY3QgaW50byBhbiB7QGxpbmsgRXhwYW5zaW9uVHJlZX0gb2JqZWN0LlxuICAgICAqIFRoZSByZXN1bHQgaGFzIGFsbCB0aGUgY29tbW9uIHBhdGhzIG1lcmdlZCBpbnRvIHNpbmdsZSBicmFuY2hlcyBvZiB0aGUgcmVzdWx0aW5nIHRyZWUgc3RydWN0dXJlLlxuICAgICAqXG4gICAgICogQHBhcmFtIHBhdGhzIG5vZGVzIHRoYXQgc2hvdWxkIGJlIGV4cGFuZGVkIGFsb25nIHdpdGggdGhlaXIgcGF0aCBmcm9tIHRoZSByb290IG5vZGVcbiAgICAgKiBAcmV0dXJucyBhbiB7QGxpbmsgRXhwYW5zaW9uVHJlZX0gZXF1aXZhbGVudCB0byB0aGUgcHJvdmlkZWQge0BsaW5rIENhc2VUcmVlUGF0aH1cbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgY29udmVydFBhdGhUb0V4cGFuc2lvblRyZWUocGF0aHM6IENhc2VUcmVlUGF0aCk6IEV4cGFuc2lvblRyZWUge1xuICAgICAgICBjb25zdCByZXN1bHQgPSB7fTtcbiAgICAgICAgT2JqZWN0LnZhbHVlcyhwYXRocykuZm9yRWFjaChwYXRoID0+IHtcbiAgICAgICAgICAgIGxldCBjdXJyZW50Tm9kZSA9IHJlc3VsdDtcbiAgICAgICAgICAgIHBhdGguZm9yRWFjaChub2RlSWQgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChjdXJyZW50Tm9kZVtub2RlSWRdID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgY3VycmVudE5vZGVbbm9kZUlkXSA9IHt9O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjdXJyZW50Tm9kZSA9IGN1cnJlbnROb2RlW25vZGVJZF07XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmVjdXJzaXZlbHkgZXhwYW5kcyBhbGwgbm9kZXMgZnJvbSB0aGUgcHJvdmlkZWQgYXJyYXkgb2Ygbm9kZXMsIHRoYXQgYXBwZWFyIGluIHRoZSB0b3AgbGV2ZWwgb2YgdGhlIHtAbGluayBFeHBhbnNpb25UcmVlfSBvYmplY3QuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gbGV2ZWxOb2RlcyBub2RlcyBmcm9tIHdoaWNoIHRoZSBleHBhbnNpb24gc2hvdWxkIHN0YXJ0XG4gICAgICogQHBhcmFtIHRhcmdldHMgYSB0cmVlIHN0cnVjdHVyZSByZXByZXNlbnRpbmcgdGhlIG5vZGVzIHRoYXQgYXJlIHRvIGJlIGV4cGFuZGVkIHJlY3Vyc2l2ZWx5LlxuICAgICAqIFRoZSB0b3AgbGV2ZWwgbm9kZXMgYXJlIGV4cGFuZGVkIGZpcnN0LCBmcm9tIHRoZSBwcm92aWRlZCBgbGV2ZWxOb2Rlc2AuXG4gICAgICovXG4gICAgcHJvdGVjdGVkIGV4cGFuZExldmVsKGxldmVsTm9kZXM6IEFycmF5PENhc2VUcmVlTm9kZT4sIHRhcmdldHM6IEV4cGFuc2lvblRyZWUpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgZGVzaXJlZElkcyA9IG5ldyBTZXQoT2JqZWN0LmtleXModGFyZ2V0cykpO1xuICAgICAgICBpZiAoZGVzaXJlZElkcy5zaXplID09PSAwKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBsZXZlbE5vZGVzLmZvckVhY2gobiA9PiB7XG4gICAgICAgICAgICBjb25zdCBub2RlID0gbjtcbiAgICAgICAgICAgIGlmICghZGVzaXJlZElkcy5oYXMobm9kZS5jYXNlLnN0cmluZ0lkKSkge1xuICAgICAgICAgICAgICAgIHJldHVybjsgLy8gY29udGludWVcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuZXhwYW5kTm9kZShub2RlKS5zdWJzY3JpYmUoc3VjY2VzcyA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKCFzdWNjZXNzKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2xvZ2dlci5kZWJ1ZygnQ291bGQgbm90IGV4cGFuZCB0cmVlIG5vZGUgd2l0aCBJRDogJyArIG5vZGUuY2FzZS5zdHJpbmdJZCk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdGhpcy5leHBhbmRMZXZlbChub2RlLmNoaWxkcmVuLCB0YXJnZXRzW25vZGUuY2FzZS5zdHJpbmdJZF0pO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIERlbGV0ZXMgdGhlIHN1YnRyZWVzIHJvb3RlZCBhdCB0aGUgbm9kZXMgdGhhdCBhcmUgcHJlc2VudCBpbiB0aGUgcGFyZW50IG5vZGUncyBjaGlsZCBjYXNlIHJlZiB2YWx1ZXMsXG4gICAgICogYnV0IGFyZSBubyBsb25nZXIgcHJlc2VudCBpbiB0aGUgbmV3IHZhbHVlXG4gICAgICogQHBhcmFtIHBhcmVudE5vZGUgYW4gaW5uZXIgbm9kZSBvZiB0aGUgdHJlZSB0aGF0IGhhZCBzb21lIG9mIGl0J3MgY2hpbGRyZW4gcmVtb3ZlZFxuICAgICAqIEBwYXJhbSBuZXdDYXNlUmVmVmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgcGFyZW50IG5vZGUncyBjYXNlIHJlZlxuICAgICAqL1xuICAgIHByb3RlY3RlZCBkZWxldGVSZW1vdmVkTm9kZXMocGFyZW50Tm9kZTogQ2FzZVRyZWVOb2RlLCBuZXdDYXNlUmVmVmFsdWU6IEFycmF5PHN0cmluZz4pOiB2b2lkIHtcbiAgICAgICAgY29uc3QgcmVtb3ZlZENoaWxkcmVuID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gICAgICAgIGdldEltbWVkaWF0ZURhdGEocGFyZW50Tm9kZS5jYXNlLCBUcmVlUGV0cmlmbG93SWRlbnRpZmllcnMuQ0hJTERSRU5fQ0FTRV9SRUYpLnZhbHVlLmZvckVhY2goaWQgPT4gcmVtb3ZlZENoaWxkcmVuLmFkZChpZCkpO1xuICAgICAgICBuZXdDYXNlUmVmVmFsdWUuZm9yRWFjaChpZCA9PiByZW1vdmVkQ2hpbGRyZW4uZGVsZXRlKGlkKSk7XG4gICAgICAgIHJlbW92ZWRDaGlsZHJlbi5mb3JFYWNoKHJlbW92ZWRJZCA9PiB0aGlzLl9jYXNlUmVzb3VyY2VTZXJ2aWNlLmRlbGV0ZUNhc2UocmVtb3ZlZElkLCB0cnVlKVxuICAgICAgICAgICAgLnN1YnNjcmliZShyZXNwb25zZU1lc3NhZ2UgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChyZXNwb25zZU1lc3NhZ2UuZXJyb3IpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fbG9nZ2VyLmVycm9yKCdSZW1vdmFsIG9mIGNoaWxkIGNhc2UgdW5zdWNjZXNzZnVsJywgcmVzcG9uc2VNZXNzYWdlLmVycm9yKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRGVzZWxlY3RzIHRoZSBjdXJyZW50bHkgc2VsZWN0ZWQgbm9kZSBpZiBpdCBpcyBhIGRlc2NlbmRhbnQgb2YgdGhlIHByb3ZpZGVkIG5vZGVcbiAgICAgKiBAcGFyYW0gbm9kZSB0aGUgbm9kZSB3aG8ncyBkZXNjZW5kYW50cyBzaG91bGQgYmUgZGVzZWxlY3RlZFxuICAgICAqL1xuICAgIHByb3RlY3RlZCBkZXNlbGVjdE5vZGVJZkRlc2NlbmRhbnRPZihub2RlOiBDYXNlVHJlZU5vZGUpOiB2b2lkIHtcbiAgICAgICAgbGV0IGJ1YmJsaW5nTm9kZSA9IHRoaXMuY3VycmVudE5vZGU7XG4gICAgICAgIHdoaWxlIChidWJibGluZ05vZGUgJiYgYnViYmxpbmdOb2RlICE9PSB0aGlzLl9yb290Tm9kZSkge1xuICAgICAgICAgICAgaWYgKGJ1YmJsaW5nTm9kZSA9PT0gbm9kZSkge1xuICAgICAgICAgICAgICAgIHRoaXMuY2hhbmdlQWN0aXZlTm9kZSh1bmRlZmluZWQpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYnViYmxpbmdOb2RlID0gYnViYmxpbmdOb2RlLnBhcmVudDtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFBlcmZvcm1zIGEgYmFja2VuZCBjYWxsIG9uIHRoZSBnaXZlbiBjYXNlLCBhbmQgc2V0cyB0aGUgdmFsdWUgb2YgdGhlIGNhc2UgcmVmIGZpZWxkIGluIHRoZSB0cmFuc2l0aW9uIGRlZmluZWQgYnlcbiAgICAgKiBbQ0FTRV9SRUZfVFJBTlNJVElPTl17QGxpbmsgVHJlZVBldHJpZmxvd0lkZW50aWZpZXJzI0NBU0VfUkVGX1RSQU5TSVRJT059LlxuICAgICAqIEBwYXJhbSBjYXNlSWQgc3RyaW5nIElEIG9mIHRoZSBjYXNlIHRoYXQgc2hvdWxkIGhhdmUgaXQncyB0cmVlIGNhc2UgcmVmIHNldFxuICAgICAqIEBwYXJhbSBuZXdDYXNlUmVmVmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgY2FzZSByZWYgZmllbGRcbiAgICAgKi9cbiAgICBwcml2YXRlIHBlcmZvcm1DYXNlUmVmQ2FsbChjYXNlSWQ6IHN0cmluZywgbmV3Q2FzZVJlZlZhbHVlOiBBcnJheTxzdHJpbmc+KTogT2JzZXJ2YWJsZTxBcnJheTxzdHJpbmc+IHwgdW5kZWZpbmVkPiB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCQgPSBuZXcgUmVwbGF5U3ViamVjdDxBcnJheTxzdHJpbmc+PigxKTtcblxuICAgICAgICB0aGlzLl90YXNrUmVzb3VyY2VTZXJ2aWNlLmdldFRhc2tzKFNpbXBsZUZpbHRlci5mcm9tVGFza1F1ZXJ5KHtcbiAgICAgICAgICAgIGNhc2U6IHtpZDogY2FzZUlkfSxcbiAgICAgICAgICAgIHRyYW5zaXRpb25JZDogVHJlZVBldHJpZmxvd0lkZW50aWZpZXJzLkNBU0VfUkVGX1RSQU5TSVRJT05cbiAgICAgICAgfSkpLnN1YnNjcmliZShwYWdlID0+IHtcbiAgICAgICAgICAgIGlmICghaGFzQ29udGVudChwYWdlKSkge1xuICAgICAgICAgICAgICAgIHRoaXMuX2xvZ2dlci5lcnJvcignQ2FzZSByZWYgYWNjZXNzb3IgdGFzayBkb2VzblxcJ3QgZXhpc3QhJyk7XG4gICAgICAgICAgICAgICAgcmVzdWx0JC5jb21wbGV0ZSgpO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgdGFzayA9IHBhZ2UuY29udGVudFswXTtcblxuICAgICAgICAgICAgdGhpcy5fdGFza1Jlc291cmNlU2VydmljZS5hc3NpZ25UYXNrKHRhc2suc3RyaW5nSWQpLnN1YnNjcmliZShhc3NpZ25SZXNwb25zZSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKCFhc3NpZ25SZXNwb25zZS5zdWNjZXNzKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2xvZ2dlci5lcnJvcignQ2FzZSByZWYgYWNjZXNzb3IgdGFzayBjb3VsZCBub3QgYmUgYXNzaWduZWQnLCBhc3NpZ25SZXNwb25zZS5lcnJvcik7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgY29uc3QgYm9keSA9IHt9O1xuICAgICAgICAgICAgICAgIGJvZHlbVHJlZVBldHJpZmxvd0lkZW50aWZpZXJzLkNISUxEUkVOX0NBU0VfUkVGXSA9IHtcbiAgICAgICAgICAgICAgICAgICAgdHlwZTogJ2Nhc2VSZWYnLFxuICAgICAgICAgICAgICAgICAgICB2YWx1ZTogbmV3Q2FzZVJlZlZhbHVlXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICB0aGlzLl90YXNrUmVzb3VyY2VTZXJ2aWNlLnNldERhdGEodGFzay5zdHJpbmdJZCwgYm9keSkuc3Vic2NyaWJlKChvdXRjb21lUmVzb3VyY2U6IEV2ZW50T3V0Y29tZU1lc3NhZ2VSZXNvdXJjZSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFuZ2VkRmllbGRzID0gKG91dGNvbWVSZXNvdXJjZS5vdXRjb21lIGFzIFNldERhdGFFdmVudE91dGNvbWUpLmNoYW5nZWRGaWVsZHMuY2hhbmdlZEZpZWxkcztcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgY2FzZVJlZkNoYW5nZXMgPSBjaGFuZ2VkRmllbGRzW1RyZWVQZXRyaWZsb3dJZGVudGlmaWVycy5DSElMRFJFTl9DQVNFX1JFRl07XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdCQubmV4dChjYXNlUmVmQ2hhbmdlcyA/IGNhc2VSZWZDaGFuZ2VzLnZhbHVlIDogdW5kZWZpbmVkKTtcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0JC5jb21wbGV0ZSgpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl90YXNrUmVzb3VyY2VTZXJ2aWNlLmZpbmlzaFRhc2sodGFzay5zdHJpbmdJZCkuc3Vic2NyaWJlKGZpbmlzaFJlc3BvbnNlID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmaW5pc2hSZXNwb25zZS5zdWNjZXNzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fbG9nZ2VyLmRlYnVnKCdDYXNlIHJlZiBhY2Nlc3NvciB0YXNrIGZpbmlzaGVkJywgZmluaXNoUmVzcG9uc2Uuc3VjY2Vzcyk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2xvZ2dlci5lcnJvcignQ2FzZSByZWYgYWNjZXNzb3IgdGFzayBmaW5pc2ggZmFpbGVkJywgZmluaXNoUmVzcG9uc2UuZXJyb3IpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9LCBlcnJvciA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2xvZ2dlci5lcnJvcignQ291bGQgbm90IHNldCBkYXRhIHRvIHRyZWUgY2FzZSByZWYnLCBlcnJvcik7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdCQuY29tcGxldGUoKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0sIGVycm9yID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLl9sb2dnZXIuZXJyb3IoJ0Nhc2UgcmVmIGFjY2Vzc29yIHRhc2sgY291bGQgbm90IGJlIGFzc2lnbmVkJywgZXJyb3IpO1xuICAgICAgICAgICAgICAgIHJlc3VsdCQuY29tcGxldGUoKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9LCBlcnJvciA9PiB7XG4gICAgICAgICAgICB0aGlzLl9sb2dnZXIuZXJyb3IoJ0Nhc2UgcmVmIGFjY2Vzc29yIHRhc2sgY291bGQgbm90IGJlIGZvdW5kJywgZXJyb3IpO1xuICAgICAgICAgICAgcmVzdWx0JC5jb21wbGV0ZSgpO1xuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHJlc3VsdCQuYXNPYnNlcnZhYmxlKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUGVyZm9ybXMgYW4gdXBkYXRlIGFmdGVyIGFkZGluZyBvciByZW1vdmluZyBhIG5vZGUgZnJvbSB0aGUgdHJlZS5cbiAgICAgKlxuICAgICAqIElmIG9ubHkgb25lIG5vZGUgd2FzIGFkZGVkIGFkZHMgaXQgaW50byB0aGUgdHJlZVxuICAgICAqXG4gICAgICogSWYgb25seSBvbmUgbm9kZSB3YXMgcmVtb3ZlZCByZW1vdmVzIGl0IGZyb20gdGhlIHRyZWVcbiAgICAgKlxuICAgICAqIE90aGVyd2lzZSBjb2xsYXBzZXMgdGhlIGFmZmVjdGVkIG5vZGUgYW5kIG1hcmtzIGl0J3MgY2hpbGRyZW4gYXMgZGlydHlcbiAgICAgKlxuICAgICAqIEBwYXJhbSBhZmZlY3RlZE5vZGUgbm9kZSB0aGF0IGhhZCBpdCdzIGNoaWxkcmVuIGNoYW5nZWRcbiAgICAgKiBAcGFyYW0gbmV3Q2FzZVJlZlZhbHVlIG5ldyB2YWx1ZSBvZiB0aGUgY2FzZVJlZiBmaWVsZCByZXR1cm5lZCBieSBiYWNrZW5kXG4gICAgICogQHJldHVybnMgYW4gYE9ic2VydmFibGVgIHRoYXQgZW1pdHMgYW4gb2JqZWN0IHdpdGggdGhlIFtyZXN1bHRde0BsaW5rIFJlc3VsdFdpdGhBZnRlckFjdGlvbnMjcmVzdWx0fSBhdHRyaWJ1dGUgc2V0IHRvIGB0cnVlYCBpZlxuICAgICAqIHRoZSB1cGRhdGUgY29tcGxldGVzIHN1Y2Nlc3NmdWxseSBhbmQgYGZhbHNlYCBvdGhlcndpc2UuXG4gICAgICovXG4gICAgcHJpdmF0ZSB1cGRhdGVOb2RlQ2hpbGRyZW5Gcm9tQ2hhbmdlZEZpZWxkcyhhZmZlY3RlZE5vZGU6IENhc2VUcmVlTm9kZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld0Nhc2VSZWZWYWx1ZTogQXJyYXk8c3RyaW5nPik6IE9ic2VydmFibGU8UmVzdWx0V2l0aEFmdGVyQWN0aW9uczxib29sZWFuPj4ge1xuICAgICAgICBjb25zdCBjYXNlUmVmRmllbGQgPSBnZXRJbW1lZGlhdGVEYXRhKGFmZmVjdGVkTm9kZS5jYXNlLCBUcmVlUGV0cmlmbG93SWRlbnRpZmllcnMuQ0hJTERSRU5fQ0FTRV9SRUYpO1xuICAgICAgICBjb25zdCBuZXdDaGlsZHJlbiA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICAgICAgICBuZXdDYXNlUmVmVmFsdWUuZm9yRWFjaChpZCA9PiBuZXdDaGlsZHJlbi5hZGQoaWQpKTtcblxuICAgICAgICBsZXQgbnVtYmVyT2ZNaXNzaW5nQ2hpbGRyZW4gPSAwO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNhc2VSZWZGaWVsZC52YWx1ZS5sZW5ndGggJiYgbnVtYmVyT2ZNaXNzaW5nQ2hpbGRyZW4gPCAyOyBpKyspIHtcbiAgICAgICAgICAgIGlmICghbmV3Q2hpbGRyZW4uaGFzKGNhc2VSZWZGaWVsZC52YWx1ZVtpXSkpIHtcbiAgICAgICAgICAgICAgICBudW1iZXJPZk1pc3NpbmdDaGlsZHJlbisrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgZXhhY3RseU9uZUNoaWxkQWRkZWQgPSBjYXNlUmVmRmllbGQudmFsdWUubGVuZ3RoICsgMSA9PT0gbmV3Q2FzZVJlZlZhbHVlLmxlbmd0aFxuICAgICAgICAgICAgJiYgY2FzZVJlZkZpZWxkLnZhbHVlLmV2ZXJ5KGl0ID0+IG5ld0NoaWxkcmVuLmhhcyhpdCkpO1xuXG4gICAgICAgIGNvbnN0IGV4YWN0bHlPbmVDaGlsZFJlbW92ZWQgPSBjYXNlUmVmRmllbGQudmFsdWUubGVuZ3RoIC0gMSA9PT0gbmV3Q2FzZVJlZlZhbHVlLmxlbmd0aFxuICAgICAgICAgICAgJiYgbnVtYmVyT2ZNaXNzaW5nQ2hpbGRyZW4gPT09IDE7XG5cbiAgICAgICAgaWYgKCFleGFjdGx5T25lQ2hpbGRBZGRlZCAmJiAhZXhhY3RseU9uZUNoaWxkUmVtb3ZlZCkge1xuICAgICAgICAgICAgY2FzZVJlZkZpZWxkLnZhbHVlID0gbmV3Q2FzZVJlZlZhbHVlO1xuICAgICAgICAgICAgdGhpcy5fdHJlZUNvbnRyb2wuY29sbGFwc2VEZXNjZW5kYW50cyhhZmZlY3RlZE5vZGUpO1xuICAgICAgICAgICAgYWZmZWN0ZWROb2RlLmRpcnR5Q2hpbGRyZW4gPSB0cnVlO1xuICAgICAgICAgICAgcmV0dXJuIG9mKG5ldyBSZXN1bHRXaXRoQWZ0ZXJBY3Rpb25zKHRydWUpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChleGFjdGx5T25lQ2hpbGRBZGRlZCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMucHJvY2Vzc0NoaWxkTm9kZUFkZChhZmZlY3RlZE5vZGUsIGNhc2VSZWZGaWVsZCwgbmV3Q2FzZVJlZlZhbHVlKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnByb2Nlc3NDaGlsZE5vZGVSZW1vdmUoYWZmZWN0ZWROb2RlLCBjYXNlUmVmRmllbGQsIG5ld0NoaWxkcmVuKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEFkZHMgYSBuZXcgY2hpbGQgbm9kZSB0byB0aGUgYGFmZmVjdGVkTm9kZWAgYnkgYWRkaW5nIHRoZSBsYXN0IENhc2UgZnJvbSB0aGUgYG5ld0Nhc2VSZWZWYWx1ZWBcbiAgICAgKiBAcGFyYW0gYWZmZWN0ZWROb2RlIHRoZSBub2RlIGluIHRoZSB0cmVlIHRoYXQgaGFkIGEgY2hpbGQgYWRkZWQgLSB0aGUgcGFyZW50IG5vZGVcbiAgICAgKiBAcGFyYW0gY2FzZVJlZkZpZWxkIHRoZSBjYXNlIHJlZiBmaWVsZCBvZiB0aGUgYWZmZWN0ZWQgbm9kZVxuICAgICAqIEBwYXJhbSBuZXdDYXNlUmVmVmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgY2FzZSByZWYgZmllbGQgaW4gdGhlIG5vZGVcbiAgICAgKiBAcmV0dXJucyBhbiBgT2JzZXJ2YWJsZWAgdGhhdCBlbWl0cyBgdHJ1ZWAgaWYgYSBub2RlIHdhcyBzdWNjZXNzZnVsbHkgYWRkZWQsIGBmYWxzZWAgb3RoZXJ3aXNlLlxuICAgICAqL1xuICAgIHByb3RlY3RlZCBwcm9jZXNzQ2hpbGROb2RlQWRkKGFmZmVjdGVkTm9kZTogQ2FzZVRyZWVOb2RlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2VSZWZGaWVsZDogSW1tZWRpYXRlRGF0YSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdDYXNlUmVmVmFsdWU6IEFycmF5PHN0cmluZz4pOiBPYnNlcnZhYmxlPFJlc3VsdFdpdGhBZnRlckFjdGlvbnM8Ym9vbGVhbj4+IHtcbiAgICAgICAgY29uc3QgcmVzdWx0JCA9IG5ldyBSZXBsYXlTdWJqZWN0PFJlc3VsdFdpdGhBZnRlckFjdGlvbnM8Ym9vbGVhbj4+KDEpO1xuXG4gICAgICAgIGNhc2VSZWZGaWVsZC52YWx1ZSA9IG5ld0Nhc2VSZWZWYWx1ZTtcbiAgICAgICAgdGhpcy5fY2FzZVJlc291cmNlU2VydmljZS5nZXRPbmVDYXNlKG5ld0Nhc2VSZWZWYWx1ZVtuZXdDYXNlUmVmVmFsdWUubGVuZ3RoIC0gMV0pLnN1YnNjcmliZShjaGlsZENhc2UgPT4ge1xuICAgICAgICAgICAgaWYgKGNoaWxkQ2FzZSkge1xuICAgICAgICAgICAgICAgIHRoaXMuX2xvZ2dlci5kZWJ1ZygnUHVzaGluZyBjaGlsZCBub2RlIHRvIHRyZWUnLCB7Y2hpbGRDYXNlLCBhZmZlY3RlZE5vZGU6IGFmZmVjdGVkTm9kZS50b0xvZ2dhYmxlRm9ybSgpfSk7XG4gICAgICAgICAgICAgICAgY29uc3QgY2hpbGROb2RlID0gdGhpcy5wdXNoQ2hpbGRUb1RyZWUoYWZmZWN0ZWROb2RlLCBjaGlsZENhc2UpO1xuICAgICAgICAgICAgICAgIHJlc3VsdCQubmV4dChuZXcgUmVzdWx0V2l0aEFmdGVyQWN0aW9ucyh0cnVlLCBbKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5faXNFYWdlckxvYWRlZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fbG9nZ2VyLmRlYnVnKCdFYWdlcmx5IGV4cGFuZGluZyBhIG5ld2x5IGFkZGVkIG5vZGUuJywgY2hpbGROb2RlLnRvTG9nZ2FibGVGb3JtKCkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5leHBhbmROb2RlKGNoaWxkTm9kZSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XSkpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9sb2dnZXIuZXJyb3IoJ05ldyBjaGlsZCBjYXNlIHdhcyBub3QgZm91bmQsIGlsbGVnYWwgc3RhdGUnLCBjaGlsZENhc2UpO1xuICAgICAgICAgICAgICAgIHJlc3VsdCQubmV4dChuZXcgUmVzdWx0V2l0aEFmdGVyQWN0aW9ucyhmYWxzZSkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmVzdWx0JC5jb21wbGV0ZSgpO1xuICAgICAgICB9LCBlcnJvciA9PiB7XG4gICAgICAgICAgICB0aGlzLl9sb2dnZXIuZXJyb3IoJ05ldyBjaGlsZCBub2RlIGNhc2UgY291bGQgbm90IGJlIGZvdW5kJywgZXJyb3IpO1xuICAgICAgICAgICAgcmVzdWx0JC5uZXh0KG5ldyBSZXN1bHRXaXRoQWZ0ZXJBY3Rpb25zKGZhbHNlKSk7XG4gICAgICAgICAgICByZXN1bHQkLmNvbXBsZXRlKCk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHJldHVybiByZXN1bHQkLmFzT2JzZXJ2YWJsZSgpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEFkZHMgYSBuZXcgY2hpbGQgbm9kZSB0byB0aGUgdGFyZ2V0IHBhcmVudCBub2RlLlxuICAgICAqIEBwYXJhbSBwYXJlbnROb2RlIHRoZSBub2RlcyB3aG9zZSBjaGlsZCBzaG91bGQgYmUgYWRkZWRcbiAgICAgKiBAcGFyYW0gY2hpbGRDYXNlIHRoZSBjaGlsZCBjYXNlXG4gICAgICogQHJldHVybnMgdGhlIG5ld2x5IGFkZGVkIG5vZGVcbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgcHVzaENoaWxkVG9UcmVlKHBhcmVudE5vZGU6IENhc2VUcmVlTm9kZSwgY2hpbGRDYXNlOiBDYXNlKTogQ2FzZVRyZWVOb2RlIHtcbiAgICAgICAgY29uc3QgY2hpbGROb2RlID0gbmV3IENhc2VUcmVlTm9kZShjaGlsZENhc2UsIHBhcmVudE5vZGUpO1xuICAgICAgICBwYXJlbnROb2RlLmNoaWxkcmVuLnB1c2goY2hpbGROb2RlKTtcbiAgICAgICAgdGhpcy5yZWZyZXNoVHJlZSgpO1xuICAgICAgICByZXR1cm4gY2hpbGROb2RlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlbW92ZXMgdGhlIGRlbGV0ZWQgbm9kZSBmcm9tIHRoZSBjaGlsZHJlbiBvZiB0aGUgYGFmZmVjdGVkTm9kZWBcbiAgICAgKiBAcGFyYW0gYWZmZWN0ZWROb2RlIHRoZSBub2RlIGluIHRoZSB0cmVlIHRoYXQgaGFkIGl0J3MgY2hpbGQgcmVtb3ZlZFxuICAgICAqIEBwYXJhbSBjYXNlUmVmRmllbGQgdGhlIGNhc2UgcmVmIGZpZWxkIG9mIHRoZSBhZmZlY3RlZCBub2RlXG4gICAgICogQHBhcmFtIG5ld0Nhc2VSZWZWYWx1ZXMgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgY2FzZSByZWYgZmllbGQgaW4gdGhlIG5vZGVcbiAgICAgKiBAcmV0dXJucyBhbiBgT2JzZXJ2YWJsZWAgdGhhdCBlbWl0cyBgdHJ1ZWAgd2hlbiB0aGUgcmVtb3ZlIG9wZXJhdGlvbiBjb21wbGV0ZXMuXG4gICAgICovXG4gICAgcHJvdGVjdGVkIHByb2Nlc3NDaGlsZE5vZGVSZW1vdmUoYWZmZWN0ZWROb2RlOiBDYXNlVHJlZU5vZGUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZVJlZkZpZWxkOiBJbW1lZGlhdGVEYXRhLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld0Nhc2VSZWZWYWx1ZXM6IFNldDxzdHJpbmc+KTogT2JzZXJ2YWJsZTxSZXN1bHRXaXRoQWZ0ZXJBY3Rpb25zPGJvb2xlYW4+PiB7XG4gICAgICAgIGNvbnN0IGluZGV4ID0gY2FzZVJlZkZpZWxkLnZhbHVlLmZpbmRJbmRleChpdCA9PiAhbmV3Q2FzZVJlZlZhbHVlcy5oYXMoaXQpKTtcbiAgICAgICAgY2FzZVJlZkZpZWxkLnZhbHVlLnNwbGljZShpbmRleCwgMSk7XG4gICAgICAgIGFmZmVjdGVkTm9kZS5jaGlsZHJlbi5zcGxpY2UoaW5kZXgsIDEpO1xuICAgICAgICB0aGlzLnJlZnJlc2hUcmVlKCk7XG4gICAgICAgIHJldHVybiBvZihuZXcgUmVzdWx0V2l0aEFmdGVyQWN0aW9ucyh0cnVlKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGlnbm9yZVxuICAgICAqIEZvcmNlcyBhIHJlcmVuZGVyIG9mIHRoZSB0cmVlIGNvbnRlbnRcbiAgICAgKi9cbiAgICBwcml2YXRlIHJlZnJlc2hUcmVlKCk6IHZvaWQge1xuICAgICAgICByZWZyZXNoVHJlZSh0aGlzLl90cmVlRGF0YVNvdXJjZSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmVsb2FkcyB0aGUgY3VycmVudGx5IHNlbGVjdGVkIGNhc2Ugbm9kZS4gVGhlIHtAbGluayBDYXNlfSBvYmplY3QgaGVsZCBpbiB0aGUge0BsaW5rIENhc2VUcmVlTm9kZX0gaW5zdGFuY2UgaXMgbm90IHJlcGxhY2VkLFxuICAgICAqIGJ1dCB0aGUgbmV3IENhc2UgaXMgYE9iamVjdC5hc3NpZ25gLWVkIGludG8gaXQuIFRoaXMgbWVhbnMgdGhhdCB0aGUgcmVmZXJlbmNlIHRvIHRoZSBDYXNlIGluc3RhbmNlIGlzIHVuY2hhbmdlZCBidXQgcmVmZXJlbmNlc1xuICAgICAqIHRvIGFsbCBpdCdzIG5vbi1wcmltaXRpdmUgYXR0cmlidXRlcyBhcmUgY2hhbmdlZC5cbiAgICAgKlxuICAgICAqIElmIGEgcmVsb2FkIG9mIHRoZSBjdXJyZW50IG5vZGUgaXMgaW5pdGlhdGVkIGJlZm9yZSB0aGUgcHJldmlvdXMgb25lIGNvbXBsZXRlZCwgdGhlIG5ldyBvbmUgaXMgaWdub3JlZC5cbiAgICAgKlxuICAgICAqIElmIHRoZSBjdXJyZW50bHkgc2VsZWN0ZWQgY2FzZSBjaGFuZ2VkIGJlZm9yZSBhIHJlc3BvbnNlIGZyb20gYmFja2VuZCB3YXMgcmVjZWl2ZWQgdGhlIHJlc3BvbnNlIGlzIGlnbm9yZWQuXG4gICAgICpcbiAgICAgKiBOb3RlIHRoYXQgdGhlIHBhcmVudCBub2RlLCBub3IgdGhlIGNoaWxkIG5vZGVzIGFyZSByZWxvYWRlZC5cbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgcmVsb2FkQ3VycmVudENhc2UoKTogdm9pZCB7XG4gICAgICAgIGlmICghdGhpcy5fY3VycmVudE5vZGUpIHtcbiAgICAgICAgICAgIHRoaXMuX2xvZ2dlci5kZWJ1ZygnTm8gVHJlZSBDYXNlIE5vZGUgc2VsZWN0ZWQsIG5vdGhpbmcgdG8gcmVsb2FkJyk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuX3JlbG9hZGVkQ2FzZUlkICYmIHRoaXMuX2N1cnJlbnROb2RlLmNhc2Uuc3RyaW5nSWQgIT09IHRoaXMuX3JlbG9hZGVkQ2FzZUlkKSB7XG4gICAgICAgICAgICB0aGlzLl9sb2dnZXIuZGVidWcoJ1JlbG9hZCBvZiB0aGUgY3VycmVudCBjYXNlIGFscmVhZHkgaW4gcHJvZ3Jlc3MnKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9yZWxvYWRlZENhc2VJZCA9IHRoaXMuX2N1cnJlbnROb2RlLmNhc2Uuc3RyaW5nSWQ7XG4gICAgICAgIHRoaXMuX2Nhc2VSZXNvdXJjZVNlcnZpY2UuZ2V0T25lQ2FzZSh0aGlzLl9jdXJyZW50Q2FzZS5zdHJpbmdJZCkuc3Vic2NyaWJlKHJlbG9hZGVkQ3VycmVudENhc2UgPT4ge1xuICAgICAgICAgICAgaWYgKCFyZWxvYWRlZEN1cnJlbnRDYXNlKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fbG9nZ2VyLmVycm9yKCdDdXJyZW50IENhc2UgVHJlZSBOb2RlIGNvdWxkIG5vdCBiZSByZWxvYWRlZC4gSW52YWxpZCBzZXJ2ZXIgcmVzcG9uc2UnLCByZWxvYWRlZEN1cnJlbnRDYXNlKTtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAodGhpcy5fY3VycmVudE5vZGUgJiYgcmVsb2FkZWRDdXJyZW50Q2FzZS5zdHJpbmdJZCA9PT0gdGhpcy5fY3VycmVudE5vZGUuY2FzZS5zdHJpbmdJZCkge1xuICAgICAgICAgICAgICAgIHRoaXMuX3JlbG9hZGVkQ2FzZUlkID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgIGNvbnN0IGNoYW5nZSA9IHRoaXMuZGV0ZXJtaW5lQ2FzZVVwZGF0ZSh0aGlzLl9jdXJyZW50Q2FzZSwgcmVsb2FkZWRDdXJyZW50Q2FzZSk7XG4gICAgICAgICAgICAgICAgT2JqZWN0LmFzc2lnbih0aGlzLl9jdXJyZW50Q2FzZSwgcmVsb2FkZWRDdXJyZW50Q2FzZSk7XG4gICAgICAgICAgICAgICAgdGhpcy5fdHJlZUNhc2VWaWV3U2VydmljZS5sb2FkVGFzayQubmV4dCh0aGlzLl9jdXJyZW50Q2FzZSk7XG4gICAgICAgICAgICAgICAgaWYgKGNoYW5nZS52aXNpYmxlVHJlZVByb3BlcnRpZXNDaGFuZ2VkKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMucmVmcmVzaFRyZWUoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKGNoYW5nZS5jaGlsZHJlbkNoYW5nZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fY3VycmVudE5vZGUuZGlydHlDaGlsZHJlbiA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZXhwYW5kTm9kZSh0aGlzLl9jdXJyZW50Tm9kZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHRoaXMuX2xvZ2dlci5kZWJ1ZygnQ3VycmVudCBDYXNlIFRyZWUgTm9kZSByZWxvYWRlZCcpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9sb2dnZXIuZGVidWcoJ0Rpc2NhcmRpbmcgY2FzZSByZWxvYWQgcmVzcG9uc2UsIHNpbmNlIHRoZSBjdXJyZW50IG5vZGUgaGFzIGNoYW5nZWQgYmVmb3JlIGl0cyBjYXNlIHdhcyByZWNlaXZlZCcpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LCBlcnJvciA9PiB7XG4gICAgICAgICAgICB0aGlzLl9sb2dnZXIuZXJyb3IoJ0N1cnJlbnQgQ2FzZSBUcmVlIE5vZGUgcmVsb2FkIHJlcXVlc3QgZmFpbGVkJywgZXJyb3IpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBEZXRlcm1pbmVzIGlmIGFubnkgb2YgdGhlIGNhc2UgYXR0cmlidXRlcyB0aGF0IGFyZSB2aXNpYmxlIG9uIHRoZSB0cmVlIGNoYW5nZWQuXG4gICAgICogQHBhcmFtIG9sZENhc2UgdGhlIHByZXZpb3VzIHZlcnNpb24gb2YgdGhlIENhc2Ugb2JqZWN0LCB0aGF0IGlzIGN1cnJlbnRseSBkaXNwbGF5ZWQgb24gdGhlIHRyZWVcbiAgICAgKiBAcGFyYW0gbmV3Q2FzZSB0aGUgbmV3IHZlcnNpb24gb2YgdGhlIENhc2Ugb2JqZWN0LCB0aGF0IHNob3VsZCByZXBsYWNlIHRoZSBvbGQgb25lXG4gICAgICovXG4gICAgcHJpdmF0ZSBkZXRlcm1pbmVDYXNlVXBkYXRlKG9sZENhc2U6IENhc2UsIG5ld0Nhc2U6IENhc2UpOiBDYXNlVXBkYXRlUmVzdWx0IHtcbiAgICAgICAgY29uc3QgdmlzaWJsZUF0dHJpYnV0ZXMgPSBbXG4gICAgICAgICAgICBUcmVlUGV0cmlmbG93SWRlbnRpZmllcnMuQ0FOX0FERF9DSElMRFJFTixcbiAgICAgICAgICAgIFRyZWVQZXRyaWZsb3dJZGVudGlmaWVycy5DQU5fUkVNT1ZFX05PREUsXG4gICAgICAgICAgICBUcmVlUGV0cmlmbG93SWRlbnRpZmllcnMuQkVGT1JFX1RFWFRfSUNPTixcbiAgICAgICAgICAgIFRyZWVQZXRyaWZsb3dJZGVudGlmaWVycy5UUkVFX0FERF9JQ09OXG4gICAgICAgIF07XG5cbiAgICAgICAgY29uc3QgcmVzdWx0OiBDYXNlVXBkYXRlUmVzdWx0ID0ge1xuICAgICAgICAgICAgdmlzaWJsZVRyZWVQcm9wZXJ0aWVzQ2hhbmdlZDogdHJ1ZSwgLy8gZm9yIHNob3J0LWNpcmN1aXRpbmcgdGhlIGV2YWx1YXRpb24sIGlmIG5vZGVzIGNoaWxkcmVuIGNoYW5nZWRcbiAgICAgICAgICAgIGNoaWxkcmVuQ2hhbmdlZDogZmFsc2VcbiAgICAgICAgfTtcblxuICAgICAgICBjb25zdCBvbGRDaGlsZENhc2VSZWYgPSBnZXRJbW1lZGlhdGVEYXRhKG9sZENhc2UsIFRyZWVQZXRyaWZsb3dJZGVudGlmaWVycy5DSElMRFJFTl9DQVNFX1JFRik7XG4gICAgICAgIGlmIChvbGRDaGlsZENhc2VSZWYgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgY29uc3Qgb2xkQ2hpbGRyZW4gPSBuZXcgU2V0KG9sZENoaWxkQ2FzZVJlZi52YWx1ZSk7XG4gICAgICAgICAgICBjb25zdCBuZXdDaGlsZHJlbiA9IG5ldyBTZXQoZ2V0SW1tZWRpYXRlRGF0YShuZXdDYXNlLCBUcmVlUGV0cmlmbG93SWRlbnRpZmllcnMuQ0hJTERSRU5fQ0FTRV9SRUYpLnZhbHVlKTtcblxuICAgICAgICAgICAgcmVzdWx0LmNoaWxkcmVuQ2hhbmdlZCA9IG9sZENoaWxkcmVuLnNpemUgIT09IG5ld0NoaWxkcmVuLnNpemU7XG4gICAgICAgICAgICBpZiAoIXJlc3VsdC5jaGlsZHJlbkNoYW5nZWQpIHtcbiAgICAgICAgICAgICAgICByZXN1bHQuY2hpbGRyZW5DaGFuZ2VkID0gQXJyYXkuZnJvbShvbGRDaGlsZHJlbikuc29tZShjaGlsZElkID0+ICFuZXdDaGlsZHJlbi5oYXMoY2hpbGRJZCkpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBzaG9ydC1jaXJjdWl0XG4gICAgICAgICAgICBpZiAocmVzdWx0LmNoaWxkcmVuQ2hhbmdlZCkge1xuICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXN1bHQudmlzaWJsZVRyZWVQcm9wZXJ0aWVzQ2hhbmdlZCA9IHZpc2libGVBdHRyaWJ1dGVzLnNvbWUoYXR0cmlidXRlID0+IHtcbiAgICAgICAgICAgIHJldHVybiBnZXRJbW1lZGlhdGVEYXRhKG9sZENhc2UsIGF0dHJpYnV0ZSlcbiAgICAgICAgICAgICAgICAmJiBnZXRJbW1lZGlhdGVEYXRhKG9sZENhc2UsIGF0dHJpYnV0ZSkudmFsdWUgIT09IGdldEltbWVkaWF0ZURhdGEobmV3Q2FzZSwgYXR0cmlidXRlKS52YWx1ZTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG59XG4iXX0=
850
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2FzZS10cmVlLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZXRncmlmLWNvbXBvbmVudHMtY29yZS9zcmMvbGliL3ZpZXcvdHJlZS1jYXNlLXZpZXcvdHJlZS1jb21wb25lbnQvY2FzZS10cmVlLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFDLE1BQU0sRUFBRSxVQUFVLEVBQWEsUUFBUSxFQUFDLE1BQU0sZUFBZSxDQUFDO0FBRXRFLE9BQU8sRUFBQyxVQUFVLEVBQUMsTUFBTSxzQkFBc0IsQ0FBQztBQUVoRCxPQUFPLEVBQUMsWUFBWSxFQUFDLE1BQU0sd0JBQXdCLENBQUM7QUFRcEQsT0FBTyxFQUFDLFlBQVksRUFBQyxNQUFNLDBDQUEwQyxDQUFDO0FBQ3RFLE9BQU8sRUFBQyxRQUFRLEVBQWMsRUFBRSxFQUFFLGFBQWEsRUFBeUIsVUFBVSxFQUFDLE1BQU0sTUFBTSxDQUFDO0FBRWhHLE9BQU8sRUFBQyx3QkFBd0IsRUFBQyxNQUFNLHFDQUFxQyxDQUFDO0FBQzdFLE9BQU8sRUFBQyxHQUFHLEVBQUMsTUFBTSxnQkFBZ0IsQ0FBQztBQUVuQyxPQUFPLEVBQUMsVUFBVSxFQUFDLE1BQU0sOENBQThDLENBQUM7QUFDeEUsT0FBTyxFQUFDLGlCQUFpQixFQUFDLE1BQU0sbUJBQW1CLENBQUM7QUFDcEQsT0FBTyxFQUFDLHVCQUF1QixFQUFDLE1BQU0sd0JBQXdCLENBQUM7QUFDL0QsT0FBTyxFQUFDLE1BQU0sRUFBQyxNQUFNLDBCQUEwQixDQUFDO0FBRWhELE9BQU8sRUFBQyxnQkFBZ0IsRUFBQyxNQUFNLHFDQUFxQyxDQUFDO0FBQ3JFLE9BQU8sRUFBQyw2QkFBNkIsRUFBQyxNQUFNLHdEQUF3RCxDQUFDO0FBQ3JHLE9BQU8sRUFBQyxZQUFZLEVBQUMsTUFBTSxzQ0FBc0MsQ0FBQztBQUdsRSxPQUFPLEVBQUMsc0JBQXNCLEVBQUMs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ZixlQUFlO2tCQUQzQixVQUFVOzswQkFnQ00sUUFBUTs7MEJBQUksTUFBTTsyQkFBQyw2QkFBNkI7OzBCQUNoRCxRQUFROzswQkFBSSxNQUFNOzJCQUFDLGdDQUFnQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7SW5qZWN0LCBJbmplY3RhYmxlLCBPbkRlc3Ryb3ksIE9wdGlvbmFsfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7RmlsdGVyfSBmcm9tICcuLi8uLi8uLi9maWx0ZXIvbW9kZWxzL2ZpbHRlcic7XG5pbXBvcnQge0h0dHBQYXJhbXN9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbi9odHRwJztcbmltcG9ydCB7Q2FzZVJlc291cmNlU2VydmljZX0gZnJvbSAnLi4vLi4vLi4vcmVzb3VyY2VzL2VuZ2luZS1lbmRwb2ludC9jYXNlLXJlc291cmNlLnNlcnZpY2UnO1xuaW1wb3J0IHtDYXNlVHJlZU5vZGV9IGZyb20gJy4vbW9kZWwvY2FzZS10cmVlLW5vZGUnO1xuaW1wb3J0IHtUcmVlQ2FzZVZpZXdTZXJ2aWNlfSBmcm9tICcuLi90cmVlLWNhc2Utdmlldy5zZXJ2aWNlJztcbmltcG9ydCB7VGFza1Jlc291cmNlU2VydmljZX0gZnJvbSAnLi4vLi4vLi4vcmVzb3VyY2VzL2VuZ2luZS1lbmRwb2ludC90YXNrLXJlc291cmNlLnNlcnZpY2UnO1xuaW1wb3J0IHtMb2dnZXJTZXJ2aWNlfSBmcm9tICcuLi8uLi8uLi9sb2dnZXIvc2VydmljZXMvbG9nZ2VyLnNlcnZpY2UnO1xuaW1wb3J0IHtJbW1lZGlhdGVEYXRhfSBmcm9tICcuLi8uLi8uLi9yZXNvdXJjZXMvaW50ZXJmYWNlL2ltbWVkaWF0ZS1kYXRhJztcbmltcG9ydCB7Q2FzZX0gZnJvbSAnLi4vLi4vLi4vcmVzb3VyY2VzL2ludGVyZmFjZS9jYXNlJztcbmltcG9ydCB7UHJvY2Vzc1NlcnZpY2V9IGZyb20gJy4uLy4uLy4uL3Byb2Nlc3MvcHJvY2Vzcy5zZXJ2aWNlJztcbmltcG9ydCB7U2lkZU1lbnVTZXJ2aWNlfSBmcm9tICcuLi8uLi8uLi9zaWRlLW1lbnUvc2VydmljZXMvc2lkZS1tZW51LnNlcnZpY2UnO1xuaW1wb3J0IHtTaWRlTWVudVNpemV9IGZyb20gJy4uLy4uLy4uL3NpZGUtbWVudS9tb2RlbHMvc2lkZS1tZW51LXNpemUnO1xuaW1wb3J0IHtmb3JrSm9pbiwgT2JzZXJ2YWJsZSwgb2YsIFJlcGxheVN1YmplY3QsIFN1YmplY3QsIFN1YnNjcmlwdGlvbiwgdGhyb3dFcnJvcn0gZnJvbSAncnhqcyc7XG5pbXBvcnQge1BhZ2V9IGZyb20gJy4uLy4uLy4uL3Jlc291cmNlcy9pbnRlcmZhY2UvcGFnZSc7XG5pbXBvcnQge1RyZWVQZXRyaWZsb3dJZGVudGlmaWVyc30gZnJvbSAnLi4vbW9kZWwvdHJlZS1wZXRyaWZsb3ctaWRlbnRpZmllcnMnO1xuaW1wb3J0IHt0YXB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcbmltcG9ydCB7VHJhbnNsYXRlU2VydmljZX0gZnJvbSAnQG5neC10cmFuc2xhdGUvY29yZSc7XG5pbXBvcnQge2hhc0NvbnRlbnR9IGZyb20gJy4uLy4uLy4uL3V0aWxpdHkvcGFnaW5hdGlvbi9wYWdlLWhhcy1jb250ZW50JztcbmltcG9ydCB7TmVzdGVkVHJlZUNvbnRyb2x9IGZyb20gJ0Bhbmd1bGFyL2Nkay90cmVlJztcbmltcG9ydCB7TWF0VHJlZU5lc3RlZERhdGFTb3VyY2V9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL3RyZWUnO1xuaW1wb3J0IHtvZlZvaWR9IGZyb20gJy4uLy4uLy4uL3V0aWxpdHkvb2Ytdm9pZCc7XG5pbXBvcnQge0Nhc2VHZXRSZXF1ZXN0Qm9keX0gZnJvbSAnLi4vLi4vLi4vcmVzb3VyY2VzL2ludGVyZmFjZS9jYXNlLWdldC1yZXF1ZXN0LWJvZHknO1xuaW1wb3J0IHtnZXRJbW1lZGlhdGVEYXRhfSBmcm9tICcuLi8uLi8uLi91dGlsaXR5L2dldC1pbW1lZGlhdGUtZGF0YSc7XG5pbXBvcnQge05BRV9PUFRJT05fU0VMRUNUT1JfQ09NUE9ORU5UfSBmcm9tICcuLi8uLi8uLi9zaWRlLW1lbnUvY29udGVudC1jb21wb25lbnRzL2luamVjdGlvbi10b2tlbnMnO1xuaW1wb3J0IHtTaW1wbGVGaWx0ZXJ9IGZyb20gJy4uLy4uLy4uL2ZpbHRlci9tb2RlbHMvc2ltcGxlLWZpbHRlcic7XG5pbXBvcnQge0Nhc2VUcmVlUGF0aH0gZnJvbSAnLi9tb2RlbC9jYXNlLXRyZWUtcGF0aCc7XG5pbXBvcnQge0V4cGFuc2lvblRyZWV9IGZyb20gJy4vbW9kZWwvZXhwYW5zaW9uLXRyZWUnO1xuaW1wb3J0IHtSZXN1bHRXaXRoQWZ0ZXJBY3Rpb25zfSBmcm9tICcuLi8uLi8uLi91dGlsaXR5L3Jlc3VsdC13aXRoLWFmdGVyLWFjdGlvbnMnO1xuaW1wb3J0IHtFdmVudE91dGNvbWVNZXNzYWdlUmVzb3VyY2V9IGZyb20gJy4uLy4uLy4uL3Jlc291cmNlcy9pbnRlcmZhY2UvbWVzc2FnZS1yZXNvdXJjZSc7XG5pbXBvcnQge1NldERhdGFFdmVudE91dGNvbWV9IGZyb20gJy4uLy4uLy4uL2V2ZW50L21vZGVsL2V2ZW50LW91dGNvbWVzL2RhdGEtb3V0Y29tZXMvc2V0LWRhdGEtZXZlbnQtb3V0Y29tZSc7XG5pbXBvcnQge0NyZWF0ZUNhc2VFdmVudE91dGNvbWV9IGZyb20gJy4uLy4uLy4uL2V2ZW50L21vZGVsL2V2ZW50LW91dGNvbWVzL2Nhc2Utb3V0Y29tZXMvY3JlYXRlLWNhc2UtZXZlbnQtb3V0Y29tZSc7XG5pbXBvcnQge3JlZnJlc2hUcmVlfSBmcm9tICcuLi8uLi8uLi91dGlsaXR5L3JlZnJlc2gtdHJlZSc7XG5pbXBvcnQge05BRV9UUkVFX0NBU0VfVklFV19DT05GSUdVUkFUSU9OfSBmcm9tICcuL21vZGVsL3RyZWUtY29uZmlndXJhdGlvbi1pbmplY3Rpb24tdG9rZW4nO1xuaW1wb3J0IHtUcmVlQ2FzZVZpZXdDb25maWd1cmF0aW9ufSBmcm9tICcuL21vZGVsL3RyZWUtY2FzZS12aWV3LWNvbmZpZ3VyYXRpb24nO1xuaW1wb3J0IHtQYWdpbmF0aW9uUGFyYW1zfSBmcm9tICcuLi8uLi8uLi91dGlsaXR5L3BhZ2luYXRpb24vcGFnaW5hdGlvbi1wYXJhbXMnO1xuaW1wb3J0IHtjcmVhdGVTb3J0UGFyYW0sIFBhZ2luYXRpb25Tb3J0fSBmcm9tICcuLi8uLi8uLi91dGlsaXR5L3BhZ2luYXRpb24vcGFnaW5hdGlvbi1zb3J0JztcblxuLyoqXG4gKiBBbiBpbnRlcm5hbCBoZWxwZXIgb2JqZWN0LCB0aGF0IGlzIHVzZWQgdG8gcmV0dXJuIHR3byB2YWx1ZXMgZnJvbSBhIGZ1bmN0aW9uLlxuICovXG5pbnRlcmZhY2UgQ2FzZVVwZGF0ZVJlc3VsdCB7XG4gICAgLyoqXG4gICAgICogV2hldGhlciB0aGUgYXR0cmlidXRlcyB0aGF0IGFyZSB2aXNpYmxlIG9uIHRoZSB0cmVlIGNoYW5nZWRcbiAgICAgKi9cbiAgICB2aXNpYmxlVHJlZVByb3BlcnRpZXNDaGFuZ2VkOiBib29sZWFuO1xuICAgIC8qKlxuICAgICAqIFdoZXRoZXIgdGhlIG5vZGVzIGNoaWxkcmVuIGNoYW5nZWRcbiAgICAgKi9cbiAgICBjaGlsZHJlbkNoYW5nZWQ6IGJvb2xlYW47XG59XG5cbkBJbmplY3RhYmxlKClcbmV4cG9ydCBjbGFzcyBDYXNlVHJlZVNlcnZpY2UgaW1wbGVtZW50cyBPbkRlc3Ryb3kge1xuXG4gICAgcHVibGljIHN0YXRpYyByZWFkb25seSBERUZBVUxUX1BBR0VfU0laRSA9IDUwO1xuXG4gICAgcHJvdGVjdGVkIF9jdXJyZW50Tm9kZTogQ2FzZVRyZWVOb2RlO1xuICAgIHByaXZhdGUgX3Jvb3ROb2Rlc0ZpbHRlcjogRmlsdGVyO1xuICAgIHByaXZhdGUgcmVhZG9ubHkgX3RyZWVEYXRhU291cmNlOiBNYXRUcmVlTmVzdGVkRGF0YVNvdXJjZTxDYXNlVHJlZU5vZGU+O1xuICAgIHByaXZhdGUgcmVhZG9ubHkgX3RyZWVDb250cm9sOiBOZXN0ZWRUcmVlQ29udHJvbDxDYXNlVHJlZU5vZGU+O1xuICAgIHByaXZhdGUgX3RyZWVSb290TG9hZGVkJDogUmVwbGF5U3ViamVjdDxib29sZWFuPjtcbiAgICBwcml2YXRlIF9yb290Tm9kZTogQ2FzZVRyZWVOb2RlO1xuICAgIHByaXZhdGUgX3Nob3dSb290OiBib29sZWFuO1xuICAgIC8qKlxuICAgICAqIFdlYXRoZXIgdGhlIHRyZWUgaXMgZWFnZXIgbG9hZGVkIG9yIG5vdC5cbiAgICAgKlxuICAgICAqIERlZmF1bHRzIHRvIGBmYWxzZWAuXG4gICAgICpcbiAgICAgKiBJdCBpcyBub3QgcmVjb21tZW5kZWQgdG8gZWFnZXIgbG9hZCBsYXJnZSB0cmVlcyBhcyBlYWNoIG5vZGUgc2VuZHMgYSBzZXBhcmF0ZSBiYWNrZW5kIHJlcXVlc3QgdG8gbG9hZCBpdHMgZGF0YS5cbiAgICAgKi9cbiAgICBwcml2YXRlIF9pc0VhZ2VyTG9hZGVkID0gZmFsc2U7XG4gICAgLyoqXG4gICAgICogc3RyaW5nIGlkIG9mIHRoZSBjYXNlLCB0aGF0IGlzIGN1cnJlbnRseSBiZWluZyByZWxvYWRlZCwgYHVuZGVmaW5lZGAgaWYgbm8gY2FzZSBpcyBjdXJyZW50bHkgYmVpbmcgcmVsb2FkZWRcbiAgICAgKi9cbiAgICBwcml2YXRlIF9yZWxvYWRlZENhc2VJZDogc3RyaW5nO1xuXG4gICAgY29uc3RydWN0b3IocHJvdGVjdGVkIF9jYXNlUmVzb3VyY2VTZXJ2aWNlOiBDYXNlUmVzb3VyY2VTZXJ2aWNlLFxuICAgICAgICAgICAgICAgIHByb3RlY3RlZCBfdHJlZUNhc2VWaWV3U2VydmljZTogVHJlZUNhc2VWaWV3U2VydmljZSxcbiAgICAgICAgICAgICAgICBwcm90ZWN0ZWQgX3Rhc2tSZXNvdXJjZVNlcnZpY2U6IFRhc2tSZXNvdXJjZVNlcnZpY2UsXG4gICAgICAgICAgICAgICAgcHJvdGVjdGVkIF9sb2dnZXI6IExvZ2dlclNlcnZpY2UsXG4gICAgICAgICAgICAgICAgcHJvdGVjdGVkIF9wcm9jZXNzU2VydmljZTogUHJvY2Vzc1NlcnZpY2UsXG4gICAgICAgICAgICAgICAgcHJvdGVjdGVkIF9zaWRlTWVudVNlcnZpY2U6IFNpZGVNZW51U2VydmljZSxcbiAgICAgICAgICAgICAgICBwcm90ZWN0ZWQgX3RyYW5zbGF0ZVNlcnZpY2U6IFRyYW5zbGF0ZVNlcnZpY2UsXG4gICAgICAgICAgICAgICAgQE9wdGlvbmFsKCkgQEluamVjdChOQUVfT1BUSU9OX1NFTEVDVE9SX0NPTVBPTkVOVCkgcHJvdGVjdGVkIF9vcHRpb25TZWxlY3RvckNvbXBvbmVudDogYW55LFxuICAgICAgICAgICAgICAgIEBPcHRpb25hbCgpIEBJbmplY3QoTkFFX1RSRUVfQ0FTRV9WSUVXX0NPTkZJR1VSQVRJT04pIHByb3RlY3RlZCBfdHJlZUNvbmZpZ3VyYXRpb246IFRyZWVDYXNlVmlld0NvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgaWYgKCF0aGlzLl90cmVlQ29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgdGhpcy5fdHJlZUNvbmZpZ3VyYXRpb24gPSB7XG4gICAgICAgICAgICAgICAgcGFnZVNpemU6IENhc2VUcmVlU2VydmljZS5ERUZBVUxUX1BBR0VfU0laRVxuICAgICAgICAgICAgfTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuX3RyZWVEYXRhU291cmNlID0gbmV3IE1hdFRyZWVOZXN0ZWREYXRhU291cmNlPENhc2VUcmVlTm9kZT4oKTtcbiAgICAgICAgdGhpcy5fdHJlZUNvbnRyb2wgPSBuZXcgTmVzdGVkVHJlZUNvbnRyb2w8Q2FzZVRyZWVOb2RlPihub2RlID0+IG5vZGUuY2hpbGRyZW4pO1xuICAgICAgICBfdHJlZUNhc2VWaWV3U2VydmljZS5yZWxvYWRDYXNlJC5hc09ic2VydmFibGUoKS5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5yZWxvYWRDdXJyZW50Q2FzZSgpO1xuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5fdHJlZVJvb3RMb2FkZWQkID0gbmV3IFJlcGxheVN1YmplY3Q8Ym9vbGVhbj4oMSk7XG4gICAgfVxuXG4gICAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgICAgIHRoaXMuX3RyZWVSb290TG9hZGVkJC5jb21wbGV0ZSgpO1xuICAgIH1cblxuICAgIHB1YmxpYyBzZXQgcm9vdEZpbHRlcihmaWx0ZXI6IEZpbHRlcikge1xuICAgICAgICB0aGlzLl9yb290Tm9kZXNGaWx0ZXIgPSBmaWx0ZXI7XG4gICAgICAgIHRoaXMuZGF0YVNvdXJjZS5kYXRhID0gW107XG4gICAgICAgIHRoaXMubG9hZFRyZWVSb290KCk7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBkYXRhU291cmNlKCk6IE1hdFRyZWVOZXN0ZWREYXRhU291cmNlPENhc2VUcmVlTm9kZT4ge1xuICAgICAgICByZXR1cm4gdGhpcy5fdHJlZURhdGFTb3VyY2U7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCB0cmVlQ29udHJvbCgpOiBOZXN0ZWRUcmVlQ29udHJvbDxDYXNlVHJlZU5vZGU+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3RyZWVDb250cm9sO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgY3VycmVudE5vZGUoKTogQ2FzZVRyZWVOb2RlIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2N1cnJlbnROb2RlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEVtaXRzIGEgdmFsdWUgd2hlbmV2ZXIgYSBuZXcgcm9vdCBub2RlIEZpbHRlciBpcyBzZXQuXG4gICAgICpcbiAgICAgKiBgdHJ1ZWAgaXMgZW1pdHRlZCBpZiB0aGUgcm9vdCBub2RlIHdhcyBzdWNjZXNzZnVsbHkgbG9hZGVkLiBgZmFsc2VgIG90aGVyd2lzZS5cbiAgICAgKlxuICAgICAqIE9uIHN1YnNjcmlwdGlvbiBlbWl0cyB0aGUgbGFzdCBlbWl0dGVkIHZhbHVlIChpZiBhbnkpIHRvIHRoZSBzdWJzY3JpYmVyLlxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgdHJlZVJvb3RMb2FkZWQkKCk6IE9ic2VydmFibGU8Ym9vbGVhbj4ge1xuICAgICAgICByZXR1cm4gdGhpcy5fdHJlZVJvb3RMb2FkZWQkLmFzT2JzZXJ2YWJsZSgpO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBnZXQgX2N1cnJlbnRDYXNlKCk6IENhc2UgfCB1bmRlZmluZWQge1xuICAgICAgICByZXR1cm4gdGhpcy5fY3VycmVudE5vZGUgPyB0aGlzLl9jdXJyZW50Tm9kZS5jYXNlIDogdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm5zIGFuIGBPYnNlcnZhYmxlYCBvZiB0aGUge0BsaW5rIExvYWRpbmdFbWl0dGVyfSByZXByZXNlbnRpbmcgdGhlIGxvYWRpbmcgc3RhdGUgb2YgdGhlIHJvb3Qgbm9kZS5cbiAgICAgKiBSZXR1cm5zIGB1bmRlZmluZWRgIGlmIHRoZSB0cmVlIGhhcyBub3QgeWV0IGJlZW4gaW5pdGlhbGl6ZWQuXG4gICAgICpcbiAgICAgKiBXYWl0IGZvciBhbiBlbWlzc2lvbiBvbiB0aGUgW3RyZWVSb290TG9hZGVkJF17QGxpbmsgQ2FzZVRyZWVTZXJ2aWNlI3RyZWVSb290TG9hZGVkJH0gc3RyZWFtIGJlZm9yZSBnZXR0aW5nIHRoaXMgT2JzZXJ2YWJsZS5cbiAgICAgKlxuICAgICAqIFRoZSBmaXJzdCB2YWx1ZSBlbWl0dGVkIGJ5IHRoZSBPYnNlcnZhYmxlIGlzIGBmYWxzZWAsIHdoZW4gdGhlIHRyZWUgZmluaXNoZXMgaW5pdGlhbGl6aW5nLlxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgcm9vdE5vZGVMb2FkaW5nJCgpOiBPYnNlcnZhYmxlPGJvb2xlYW4+IHwgdW5kZWZpbmVkIHtcbiAgICAgICAgcmV0dXJuICEhdGhpcy5fcm9vdE5vZGUgPyB0aGlzLl9yb290Tm9kZS5sb2FkaW5nQ2hpbGRyZW4uYXNPYnNlcnZhYmxlKCkgOiB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybnMgYW4gYE9ic2VydmFibGVgIG9mIHRoZSB7QGxpbmsgTG9hZGluZ0VtaXR0ZXJ9IHJlcHJlc2VudGluZyB3aGV0aGVyIHRoZSByb290IG5vZGUgaXMgY3VycmVudGx5XG4gICAgICogaW4gdGhlIHByb2Nlc3Mgb2YgYWRkaW5nIGEgbmV3IGNoaWxkIG5vZGUgb3Igbm90LlxuICAgICAqIFJldHVybnMgYHVuZGVmaW5lZGAgaWYgdGhlIHRyZWUgaGFzIG5vdCB5ZXQgYmVlbiBpbml0aWFsaXplZC5cbiAgICAgKlxuICAgICAqIFdhaXQgZm9yIGFuIGVtaXNzaW9uIG9uIHRoZSBbdHJlZVJvb3RMb2FkZWQkXXtAbGluayBDYXNlVHJlZVNlcnZpY2UjdHJlZVJvb3RMb2FkZWQkfSBzdHJlYW0gYmVmb3JlIGdldHRpbmcgdGhpcyBPYnNlcnZhYmxlLlxuICAgICAqXG4gICAgICogVGhlIGZpcnN0IHZhbHVlIGVtaXR0ZWQgYnkgdGhlIE9ic2VydmFibGUgaXMgYGZhbHNlYCwgd2hlbiB0aGUgdHJlZSBmaW5pc2hlcyBpbml0aWFsaXppbmcuXG4gICAgICovXG4gICAgcHVibGljIGdldCByb290Tm9kZUFkZGluZ0NoaWxkJCgpOiBPYnNlcnZhYmxlPGJvb2xlYW4+IHwgdW5kZWZpbmVkIHtcbiAgICAgICAgcmV0dXJuICEhdGhpcy5fcm9vdE5vZGUgPyB0aGlzLl9yb290Tm9kZS5hZGRpbmdOb2RlLmFzT2JzZXJ2YWJsZSgpIDogdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFdlYXRoZXIgdGhlIHRyZWUgaXMgZWFnZXIgbG9hZGVkIG9yIG5vdC5cbiAgICAgKlxuICAgICAqIERlZmF1bHRzIHRvIGBmYWxzZWAuXG4gICAgICpcbiAgICAgKiBJdCBpcyBub3QgcmVjb21tZW5kZWQgdG8gZWFnZXIgbG9hZCBsYXJnZSB0cmVlcyBhcyBlYWNoIG5vZGUgc2VuZHMgYSBzZXBhcmF0ZSBiYWNrZW5kIHJlcXVlc3QgdG8gbG9hZCBpdHMgZGF0YS5cbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IGlzRWFnZXJMb2FkZWQoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLl9pc0VhZ2VyTG9hZGVkO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFdlYXRoZXIgdGhlIHRyZWUgaXMgZWFnZXIgbG9hZGVkIG9yIG5vdC5cbiAgICAgKlxuICAgICAqIERlZmF1bHRzIHRvIGBmYWxzZWAuXG4gICAgICpcbiAgICAgKiBJdCBpcyBub3QgcmVjb21tZW5kZWQgdG8gZWFnZXIgbG9hZCBsYXJnZSB0cmVlcyBhcyBlYWNoIG5vZGUgc2VuZHMgYSBzZXBhcmF0ZSBiYWNrZW5kIHJlcXVlc3QgdG8gbG9hZCBpdHMgZGF0YS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBlYWdlciB0aGUgbmV3IHNldHRpbmcgZm9yIGVhZ2VyIGxvYWRpbmdcbiAgICAgKi9cbiAgICBwdWJsaWMgc2V0IGlzRWFnZXJMb2FkZWQoZWFnZXI6IGJvb2xlYW4pIHtcbiAgICAgICAgdGhpcy5faXNFYWdlckxvYWRlZCA9IGVhZ2VyO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIExvYWRzIGFuZCBwb3B1bGF0ZXMgdGhlIHRvcG1vc3QgbGV2ZWwgb2YgdGhlIHRyZWUuXG4gICAgICpcbiAgICAgKiBUaGUgZGlzcGxheWVkIGNhc2VzIGFyZSBkZXRlcm1pbmVkIGJ5IHRoaXMgb2JqZWN0J3MgW3Jvb3RGaWx0ZXJde0BsaW5rIENhc2VUcmVlU2VydmljZSNyb290RmlsdGVyfS5cbiAgICAgKlxuICAgICAqIENhc2VzIGFyZSBsb2FkZWQgb25lIHBhZ2UgYXQgYSB0aW1lIGFuZCB0aGUgdHJlZSBpcyByZWZyZXNoZWQgYWZ0ZXIgZWFjaCBwYWdlLlxuICAgICAqIFtmaW5pc2hlZExvYWRpbmdGaXJzdExldmVsJF17QGxpbmsgQ2FzZVRyZWVTZXJ2aWNlI3RyZWVSb290TG9hZGVkJH1cbiAgICAgKiB3aWxsIGVtaXQgYHRydWVgIG9uY2UgdGhlIGxhc3QgcGFnZSBsb2FkcyBzdWNjZXNzZnVsbHkuXG4gICAgICogYGZhbHNlYCB3aWxsIGJlIGVtaXR0ZWQgaWYgYW55IG9mIHRoZSByZXF1ZXN0cyBmYWlsLlxuICAgICAqL1xuICAgIHByb3RlY3RlZCBsb2FkVHJlZVJvb3QoKSB7XG4gICAgICAgIGlmICh0aGlzLl9yb290Tm9kZXNGaWx0ZXIpIHtcbiAgICAgICAgICAgIHRoaXMuX2Nhc2VSZXNvdXJjZVNlcnZpY2Uuc2VhcmNoQ2FzZXModGhpcy5fcm9vdE5vZGVzRmlsdGVyKS5zdWJzY3JpYmUocGFnZSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKGhhc0NvbnRlbnQocGFnZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fcm9vdE5vZGUgPSBuZXcgQ2FzZVRyZWVOb2RlKHBhZ2UuY29udGVudFswXSwgdW5kZWZpbmVkKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHBhZ2UuY29udGVudC5sZW5ndGggIT09IDEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2xvZ2dlci53YXJuKCdGaWx0ZXIgZm9yIHRyZWUgcm9vdCByZXR1cm5lZCBtb3JlIHRoYW4gb25lIGNhc2UuIFVzaW5nIHRoZSBmaXJzdCB2YWx1ZSBhcyB0cmVlIHJvb3QuLi4nKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB0aGlzLl90cmVlUm9vdExvYWRlZCQubmV4dCh0cnVlKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9sb2dnZXIuZXJyb3IoJ1RyZWUgcm9vdCBjYW5ub3QgYmUgZ2VuZXJhdGVkIGZyb20gdGhlIHByb3ZpZGVkIGZpbHRlcicsIHBhZ2UpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sIGVycm9yID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLl9sb2dnZXIuZXJyb3IoJ1Jvb3Qgbm9kZSBvZiB0aGUgY2FzZSB0cmVlIGNvdWxkIG5vdCBiZSBsb2FkZWQnLCBlcnJvcik7XG4gICAgICAgICAgICAgICAgdGhpcy5fdHJlZVJvb3RMb2FkZWQkLm5leHQoZmFsc2UpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBZGRzIHRoZSBsb2FkZWQgdHJlZSByb290IHRvIHRoZSBkaXNwbGF5IGJhc2VkIG9uIHRoZSBzZXR0aW5nLlxuICAgICAqIEBwYXJhbSBzaG93Um9vdCB3aGV0aGVyIHRoZSByb290IG9mIHRoZSB0cmVlIHNob3VsZCBiZSBkaXNwbGF5ZWQgaW4gdGhlIHRyZWUgb3Igbm90LlxuICAgICAqIElmIHRoZSByb290IGlzIG5vdCBkaXNwbGF5ZWQgaXQncyBjaGlsZHJlbiB3aWxsIGJlIGRpc3BsYXllZCBvbiB0aGUgZmlyc3QgbGV2ZWwuXG4gICAgICogQHJldHVybnMgYW4gT2JzZXJ2YWJsZSB0aGF0IGVtaXRzIHdoZW4gdGhlIHRyZWUgZmluaXNoZXMgaW5pdGlhbGl6YXRpb24uXG4gICAgICovXG4gICAgcHVibGljIGluaXRpYWxpemVUcmVlKHNob3dSb290OiBib29sZWFuKTogT2JzZXJ2YWJsZTx2b2lkPiB7XG4gICAgICAgIGlmICghdGhpcy5fcm9vdE5vZGUpIHtcbiAgICAgICAgICAgIHRoaXMuX2xvZ2dlci5lcnJvcignU2V0IGEgRmlsdGVyIGJlZm9yZSBpbml0aWFsaXppbmcgdGhlIGNhc2UgdHJlZScpO1xuICAgICAgICAgICAgcmV0dXJuIHRocm93RXJyb3IobmV3IEVycm9yKCdTZXQgYSBGaWx0ZXIgYmVmb3JlIGluaXRpYWxpemluZyB0aGUgY2FzZSB0cmVlJykpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5fc2hvd1Jvb3QgPSBzaG93Um9vdDtcblxuICAgICAgICBpZiAoc2hvd1Jvb3QpIHtcbiAgICAgICAgICAgIHRoaXMuZGF0YVNvdXJjZS5kYXRhID0gW3RoaXMuX3Jvb3ROb2RlXTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuZGF0YVNvdXJjZS5kYXRhID0gdGhpcy5fcm9vdE5vZGUuY2hpbGRyZW47XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgcmV0OiBPYnNlcnZhYmxlPHZvaWQ+O1xuICAgICAgICBpZiAoIXNob3dSb290IHx8IHRoaXMuX2lzRWFnZXJMb2FkZWQpIHtcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IG5ldyBSZXBsYXlTdWJqZWN0PHZvaWQ+KDEpO1xuICAgICAgICAgICAgcmV0ID0gcmVzdWx0LmFzT2JzZXJ2YWJsZSgpO1xuICAgICAgICAgICAgdGhpcy5leHBhbmROb2RlKHRoaXMuX3Jvb3ROb2RlKS5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMucmVmcmVzaFRyZWUoKTtcbiAgICAgICAgICAgICAgICByZXN1bHQubmV4dCgpO1xuICAgICAgICAgICAgICAgIHJlc3VsdC5jb21wbGV0ZSgpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLnJlZnJlc2hUcmVlKCk7XG4gICAgICAgICAgICByZXQgPSBvZlZvaWQoKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmV0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIE5vdGlmaWVzIHRoZSBwYXJlbnQgVHJlZUNhc2VWaWV3IHRoYXQgYSBjYXNlIHdhcyBjbGlja2VkIGluIHRoZSB0cmVlIGFuZCBpdCdzIFRhc2sgc2hvdWxkIGJlIGRpc3BsYXllZFxuICAgICAqL1xuICAgIHB1YmxpYyBjaGFuZ2VBY3RpdmVOb2RlKG5vZGU6IENhc2VUcmVlTm9kZSB8IHVuZGVmaW5lZCk6IHZvaWQge1xuICAgICAgICB0aGlzLl9jdXJyZW50Tm9kZSA9IG5vZGU7XG4gICAgICAgIHRoaXMuX3RyZWVDYXNlVmlld1NlcnZpY2UubG9hZFRhc2skLm5leHQobm9kZSA/IG5vZGUuY2FzZSA6IHVuZGVmaW5lZCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVG9nZ2xlcyB0aGUgZXhwYW5zaW9uIHN0YXRlIG9mIGEgbm9kZVxuICAgICAqIEBwYXJhbSBub2RlIHRoZSB7QGxpbmsgQ2FzZVRyZWVOb2RlfSB3aG8ncyBjb250ZW50IHNob3VsZCBiZSB0b2dnbGVkXG4gICAgICovXG4gICAgcHVibGljIHRvZ2dsZU5vZGUobm9kZTogQ2FzZVRyZWVOb2RlKTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLl90cmVlQ29udHJvbC5pc0V4cGFuZGVkKG5vZGUpKSB7XG4gICAgICAgICAgICB0aGlzLl90cmVlQ29udHJvbC5jb2xsYXBzZShub2RlKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuZXhwYW5kTm9kZShub2RlKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEV4cGFuZHMgdGhlIHRhcmdldCBub2RlIGluIHRoZSB0cmVlIGFuZCByZWxvYWRzIGl0J3MgY2hpbGRyZW4gaWYgdGhleSBhcmUgbWFya2VkIGFzIGRpcnR5XG4gICAgICogQHBhcmFtIG5vZGUgdGhlIHtAbGluayBDYXNlVHJlZU5vZGV9IHRoYXQgc2hvdWxkIGJlIGV4cGFuZGVkXG4gICAgICogQHJldHVybnMgZW1pdHMgYHRydWVgIGlmIHRoZSBub2RlIGlzIGV4cGFuZGVkIGFuZCBgZmFsc2VgIGlmIG5vdC4gSWYgdGhlIGV4cGFuc2lvbiBjYXVzZXMgbW9yZSBub2RlIGV4cGFuc2lvbnNcbiAgICAgKiAoZS5nLiBlYWdlciBsb2FkZWQgdHJlZSkgdGhlbiwgdGhlIE9ic2VydmFibGUgZW1pdHMgYWZ0ZXIgYWxsIHRoZSBzdWJ0cmVlIGV4cGFuc2lvbnMgY29tcGxldGUuXG4gICAgICovXG4gICAgcHJvdGVjdGVkIGV4cGFuZE5vZGUobm9kZTogQ2FzZVRyZWVOb2RlKTogT2JzZXJ2YWJsZTxib29sZWFuPiB7XG4gICAgICAgIHRoaXMuX2xvZ2dlci5kZWJ1ZygnUmVxdWVzdGluZyBleHBhbnNpb24gb2YgdHJlZSBub2RlJywgbm9kZS50b0xvZ2dhYmxlRm9ybSgpKTtcblxuICAgICAgICBpZiAobm9kZS5sb2FkaW5nQ2hpbGRyZW4uaXNBY3RpdmUpIHtcbiAgICAgICAgICAgIHRoaXMuX2xvZ2dlci5kZWJ1ZygnTm9kZSByZXF1ZXN0ZWQgZm9yIGV4cGFuc2lvbiBpcyBsb2FkaW5nLiBFeHBhbnNpb24gY2FuY2VsZWQuJyk7XG4gICAgICAgICAgICByZXR1cm4gb2YoZmFsc2UpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCFub2RlLmRpcnR5Q2hpbGRyZW4pIHtcbiAgICAgICAgICAgIHRoaXMuX2xvZ2dlci5kZWJ1ZygnTm9kZSByZXF1ZXN0ZWQgZm9yIGV4cGFuc2lvbiBoYXMgY2xlYW4gY2hpbGRyZW4uIFNpbXBsZSBleHBhbnNpb24uJyk7XG4gICAgICAgICAgICB0aGlzLnRyZWVDb250cm9sLmV4cGFuZChub2RlKTtcbiAgICAgICAgICAgIHJldHVybiBvZih0cnVlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHJldCA9IG5ldyBSZXBsYXlTdWJqZWN0PGJvb2xlYW4+KDEpO1xuICAgICAgICB0aGlzLnVwZGF0ZU5vZGVDaGlsZHJlbihub2RlKS5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5fbG9nZ2VyLmRlYnVnKCdOb2RlIHJlcXVlc3RlZCBmb3IgZXhwYW5zaW9uIHdpdGggZGlydHkgY2hpbGRyZW4gaGFkIGl0cyBjaGlsZHJlbiByZWxvYWRlZC4nKTtcbiAgICAgICAgICAgIGlmIChub2RlLmNoaWxkcmVuLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9sb2dnZXIuZGVidWcoJ05vZGUgZXhwYW5kZWQuJywgbm9kZS50b0xvZ2dhYmxlRm9ybSgpKTtcbiAgICAgICAgICAgICAgICB0aGlzLnRyZWVDb250cm9sLmV4cGFuZChub2RlKTtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5faXNFYWdlckxvYWRlZCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9sb2dnZXIuZGVidWcoYEVhZ2VyIGxvYWRpbmcgY2hpbGRyZW4gb2YgdHJlZSBub2RlIHdpdGggY2FzZSBpZCAnJHtub2RlLmNhc2Uuc3RyaW5nSWR9J2ApO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBpbm5lck9ic2VydmFibGVzID0gbm9kZS5jaGlsZHJlbi5tYXAoY2hpbGROb2RlID0+IHRoaXMuZXhwYW5kTm9kZShjaGlsZE5vZGUpKTtcbiAgICAgICAgICAgICAgICAgICAgLy8gZm9ya0pvaW4gZG9lc24ndCBlbWl0IHdpdGggMCBpbnB1dCBvYnNlcnZhYmxlc1xuICAgICAgICAgICAgICAgICAgICBpbm5lck9ic2VydmFibGVzLnB1c2gob2YodHJ1ZSkpO1xuICAgICAgICAgICAgICAgICAgICBmb3JrSm9pbihpbm5lck9ic2VydmFibGVzKS5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0Lm5leHQodHJ1ZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXQuY29tcGxldGUoKTtcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0Lm5leHQodHJ1ZSk7XG4gICAgICAgICAgICAgICAgICAgIHJldC5jb21wbGV0ZSgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0Lm5leHQoZmFsc2UpO1xuICAgICAgICAgICAgICAgIHJldC5jb21wbGV0ZSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHJldC5hc09ic2VydmFibGUoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDaGVja3Mgd2hldGhlciBkaXJ0eSBjaGlsZHJlbiBuZWVkIHRvIGJlIHJlbG9hZGVkIGFuZCByZWxvYWRzIHRoZW0gaWYgbmVlZGVkLlxuICAgICAqIEBwYXJhbSBub2RlIHRoZSB7QGxpbmsgQ2FzZVRyZWVOb2RlfSB3aG8ncyBjaGlsZHJlbiBhcmUgdXBkYXRlZFxuICAgICAqIEByZXR1cm5zIGVtaXRzIHdoZW4gbG9hZGluZyBmaW5pc2hlc1xuICAgICAqL1xuICAgIHByb3RlY3RlZCB1cGRhdGVOb2RlQ2hpbGRyZW4obm9kZTogQ2FzZVRyZWVOb2RlKTogT2JzZXJ2YWJsZTx2b2lkPiB7XG4gICAgICAgIG5vZGUubG9hZGluZ0NoaWxkcmVuLm9uKCk7XG5cbiAgICAgICAgY29uc3QgY2hpbGRyZW5DYXNlUmVmID0gZ2V0SW1tZWRpYXRlRGF0YShub2RlLmNhc2UsIFRyZWVQZXRyaWZsb3dJZGVudGlmaWVycy5DSElMRFJFTl9DQVNFX1JFRik7XG4gICAgICAgIGlmICghY2hpbGRyZW5DYXNlUmVmIHx8IGNoaWxkcmVuQ2FzZVJlZi52YWx1ZS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIG5vZGUuY2hpbGRyZW4gPSBbXTtcbiAgICAgICAgICAgIHRoaXMucmVmcmVzaFRyZWUoKTtcbiAgICAgICAgICAgIG5vZGUuZGlydHlDaGlsZHJlbiA9IGZhbHNlO1xuICAgICAgICAgICAgbm9kZS5sb2FkaW5nQ2hpbGRyZW4ub2ZmKCk7XG4gICAgICAgICAgICByZXR1cm4gb2ZWb2lkKCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAobm9kZS5jaGlsZHJlbi5sZW5ndGggPT09IGNoaWxkcmVuQ2FzZVJlZi52YWx1ZS5sZW5ndGgpIHtcbiAgICAgICAgICAgIGNvbnN0IGV4aXN0aW5nQ2hpbGRyZW4gPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgICAgICAgICAgIG5vZGUuY2hpbGRyZW4uZm9yRWFjaChjaGlsZE5vZGUgPT4gZXhpc3RpbmdDaGlsZHJlbi5hZGQoY2hpbGROb2RlLmNhc2Uuc3RyaW5nSWQpKTtcbiAgICAgICAgICAgIGlmIChjaGlsZHJlbkNhc2VSZWYudmFsdWUuZXZlcnkoY2FzZUlkID0+IGV4aXN0aW5nQ2hpbGRyZW4uaGFzKGNhc2VJZCkpKSB7XG4gICAgICAgICAgICAgICAgbm9kZS5kaXJ0eUNoaWxkcmVuID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgbm9kZS5sb2FkaW5nQ2hpbGRyZW4ub2ZmKCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG9mVm9pZCgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRoaXMudXBkYXRlUGFnZU9mQ2hpbGRyZW4obm9kZSwgMCkucGlwZShcbiAgICAgICAgICAgIHRhcCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMucmVmcmVzaFRyZWUoKTtcbiAgICAgICAgICAgICAgICAgICAgbm9kZS5kaXJ0eUNoaWxkcmVuID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIG5vZGUubG9hZGluZ0NoaWxkcmVuLm9mZigpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIClcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBMb2FkcyBldmVyeSBwYWdlIG9mIGNoaWxkcmVuIGZyb20gdGhlIGdpdmVuIG51bWJlciBhbmQgdXBkYXRlcyB0aGUgZXhpc3RpbmcgY2hpbGRyZW4uXG4gICAgICpcbiAgICAgKiBNaXNzaW5nIG5vZGVzIGFyZSByZW1vdmVkLiBFeGlzdGluZyBub2RlcyBhcmUgbWFya2VkIGFzIGRpcnR5LiBOZXcgbm9kZXMgYXJlIGFkZGVkLlxuICAgICAqXG4gICAgICogTm9kZXMgYXJlIHJldHVybmVkIGluIHRoZWlyIGluc2VydGlvbiBvcmRlci5cbiAgICAgKiBAcGFyYW0gbm9kZSB0aGUge0BsaW5rIENhc2VUcmVlTm9kZX0gd2hvJ3MgY2hpbGRyZW4gYXJlIHVwZGF0ZWRcbiAgICAgKiBAcGFyYW0gcGFnZU51bWJlciB0aGUgbnVtYmVyIG9mIHRoZSBmaXJzdCBwYWdlIHRoYXQgc2hvdWxkIGJlIGxvYWRlZC4gQWxsIGZvbGxvd2luZyBwYWdlcyBhcmUgbG9hZGVkIGFzIHdlbGxcbiAgICAgKiBAcmV0dXJucyBuZXh0IGlzIGVtaXR0ZWQgd2hlbiBsb2FkaW5nIG9mIGFsbCBwYWdlcyBjb21wbGV0ZXMgKHJlZ2FyZGxlc3Mgb2YgdGhlIG91dGNvbWUpXG4gICAgICovXG4gICAgcHJvdGVjdGVkIHVwZGF0ZVBhZ2VPZkNoaWxkcmVuKG5vZGU6IENhc2VUcmVlTm9kZSwgcGFnZU51bWJlcjogbnVtYmVyKTogT2JzZXJ2YWJsZTx2b2lkPiB7XG4gICAgICAgIGNvbnN0IHJlcXVlc3RCb2R5ID0gdGhpcy5jcmVhdGVDaGlsZFJlcXVlc3RCb2R5KG5vZGUpO1xuICAgICAgICBpZiAoIXJlcXVlc3RCb2R5KSB7XG4gICAgICAgICAgICB0aGlzLl9sb2dnZXIuZXJyb3IoJ0Nhbm5vdCBjcmVhdGUgZmlsdGVyIHRvIGZpbmQgY2hpbGRyZW4gb2YgdGhlIGdpdmVuIG5vZGUnLCBub2RlLmNhc2UpO1xuICAgICAgICAgICAgcmV0dXJuIHRocm93RXJyb3IobmV3IEVycm9yKCdDYW5ub3QgY3JlYXRlIGZpbHRlciB0byBmaW5kIGNoaWxkcmVuIG9mIHRoZSBnaXZlbiBub2RlJykpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgZG9uZSA9IG5ldyBSZXBsYXlTdWJqZWN0PHZvaWQ+KDEpO1xuXG4gICAgICAgIGxldCBwYXJhbXM6IEh0dHBQYXJhbXMgPSBuZXcgSHR0cFBhcmFtcygpO1xuICAgICAgICBwYXJhbXMgPSBwYXJhbXMuc2V0KFBhZ2luYXRpb25QYXJhbXMuUEFHRV9TSVpFLCBgJHt0aGlzLl90cmVlQ29uZmlndXJhdGlvbi5wYWdlU2l6ZX1gKVxuICAgICAgICAgICAgICAgICAgICAgICAuc2V0KFBhZ2luYXRpb25QYXJhbXMuUEFHRV9OVU1CRVIsIGAke3BhZ2VOdW1iZXJ9YClcbiAgICAgICAgICAgICAgICAgICAgICAgLnNldChQYWdpbmF0aW9uUGFyYW1zLlBBR0VfU09SVCwgY3JlYXRlU29ydFBhcmFtKCdjcmVhdGlvbkRhdGUnLCBQYWdpbmF0aW9uU29ydC5BU0NFTkRJTkcpKTtcbiAgICAgICAgdGhpcy5fY2FzZVJlc291cmNlU2VydmljZS5nZXRDYXNlcyhyZXF1ZXN0Qm9keSwgcGFyYW1zKS5zdWJzY3JpYmUocGFnZSA9PiB7XG4gICAgICAgICAgICBpZiAoIWhhc0NvbnRlbnQocGFnZSkpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9sb2dnZXIuZXJyb3IoJ0NoaWxkIGNhc2VzIGludmFsaWQgcGFnZSBjb250ZW50JywgcGFnZSk7XG4gICAgICAgICAgICAgICAgZG9uZS5uZXh0KCk7XG4gICAgICAgICAgICAgICAgZG9uZS5jb21wbGV0ZSgpO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdGhpcy51cGRhdGVDdXJyZW50Q2hpbGRyZW5XaXRoTmV3UGFnZShub2RlLCBwYWdlKTtcblxuICAgICAgICAgICAgaWYgKHBhZ2VOdW1iZXIgKyAxIDwgcGFnZS5wYWdpbmF0aW9uLnRvdGFsUGFnZXMpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnVwZGF0ZVBhZ2VPZkNoaWxkcmVuKG5vZGUsIHBhZ2VOdW1iZXIgKyAxKS5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBkb25lLm5leHQoKTtcbiAgICAgICAgICAgICAgICAgICAgZG9uZS5jb21wbGV0ZSgpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBkb25lLm5leHQoKTtcbiAgICAgICAgICAgICAgICBkb25lLmNvbXBsZXRlKCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgfSwgZXJyb3IgPT4ge1xuICAgICAgICAgICAgdGhpcy5fbG9nZ2VyLmVycm9yKCdDaGlsZCBjYXNlcyBjb3VsZCBub3QgYmUgbG9hZGVkJywgZXJyb3IpO1xuICAgICAgICAgICAgZG9uZS5uZXh0KCk7XG4gICAgICAgICAgICBkb25lLmNvbXBsZXRlKCk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHJldHVybiBkb25lLmFzT2JzZXJ2YWJsZSgpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFVwZGF0ZXMgdGhlIGNoaWxkcmVuIG9mIHRoZSBnaXZlbiB7QGxpbmsgQ2FzZVRyZWVOb2RlfSB3aXRoIFtDYXNlc117QGxpbmsgQ2FzZX0gZnJvbSB0aGUgcHJvdmlkZWQge0BsaW5rIFBhZ2V9LlxuICAgICAqIEBwYXJhbSBub2RlIHRoZSB7QGxpbmsgQ2FzZVRyZWVOb2RlfSB3aG8ncyBjaGlsZHJlbiBhcmUgdXBkYXRlZFxuICAgICAqIEBwYXJhbSBwYWdlIHRoZSB7QGxpbmsgUGFnZX0gdGhhdCBjb250YWlucyB0aGUgdXBkYXRlZCBjaGlsZHJlblxuICAgICAqL1xuICAgIHByb3RlY3RlZCB1cGRhdGVDdXJyZW50Q2hpbGRyZW5XaXRoTmV3UGFnZShub2RlOiBDYXNlVHJlZU5vZGUsIHBhZ2U6IFBhZ2U8Q2FzZT4pOiB2b2lkIHtcbiAgICAgICAgcGFnZS5jb250ZW50LmZvckVhY2goKG5ld0Nhc2UsIGluZGV4KSA9PiB7XG4gICAgICAgICAgICBjb25zdCBwb3NpdGlvbiA9IHBhZ2UucGFnaW5hdGlvbi5zaXplICogcGFnZS5wYWdpbmF0aW9uLm51bWJlciArIGluZGV4O1xuICAgICAgICAgICAgd2hpbGUgKHBvc2l0aW9uIDwgbm9kZS5jaGlsZHJlbi5sZW5ndGggJiYgbm9kZS5jaGlsZHJlbltwb3NpdGlvbl0uY2FzZS5zdHJpbmdJZCAhPT0gbmV3Q2FzZS5zdHJpbmdJZCkge1xuICAgICAgICAgICAgICAgIG5vZGUuY2hpbGRyZW4uc3BsaWNlKHBvc2l0aW9uLCAxKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChub2RlLmNoaWxkcmVuLmxlbmd0aCA9PT0gcG9zaXRpb24pIHtcbiAgICAgICAgICAgICAgICBub2RlLmNoaWxkcmVuLnB1c2gobmV3IENhc2VUcmVlTm9kZShuZXdDYXNlLCBub2RlKSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIG5vZGUuY2hpbGRyZW5bcG9zaXRpb25dLmNhc2UgPSBuZXdDYXNlO1xuICAgICAgICAgICAgICAgIG5vZGUuZGlydHlDaGlsZHJlbiA9IHRydWU7XG4gICAgICAgICAgICAgICAgdGhpcy50cmVlQ29udHJvbC5jb2xsYXBzZURlc2NlbmRhbnRzKG5vZGUuY2hpbGRyZW5bcG9zaXRpb25dKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIG5vZGUgdGhlIHtAbGluayBDYXNlVHJlZU5vZGV9IHdobydzIGNoaWxkcmVuIHRoZSB7QGxpbmsgRmlsdGVyfSBzaG91bGQgcmV0dXJuXG4gICAgICogQHJldHVybnMgYSByZXF1ZXN0IGJvZHkgdGhhdCBmaW5kcyBhbGwgY2hpbGQgY2FzZXMgb2YgdGhlIGdpdmVuIGBub2RlYC5cbiAgICAgKiBSZXR1cm5zIGB1bmRlZmluZWRgIGlmIHRoZSBwcm92aWRlZCBgbm9kZWAgZG9lc24ndCBjb250YWluIGVub3VnaCBpbmZvcm1hdGlvbiB0byBjcmVhdGUgdGhlIHJlcXVlc3QgYm9keS5cbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgY3JlYXRlQ2hpbGRSZXF1ZXN0Qm9keShub2RlOiBDYXNlVHJlZU5vZGUpOiBDYXNlR2V0UmVxdWVzdEJvZHkge1xuICAgICAgICBjb25zdCBjaGlsZENhc2VSZWYgPSBnZXRJbW1lZGlhdGVEYXRhKG5vZGUuY2FzZSwgVHJlZVBldHJpZmxvd0lkZW50aWZpZXJzLkNISUxEUkVOX0NBU0VfUkVGKTtcbiAgICAgICAgaWYgKCFjaGlsZENhc2VSZWYpIHtcbiAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4ge3N0cmluZ0lkOiAoY2hpbGRDYXNlUmVmLnZhbHVlIGFzIEFycmF5PHN0cmluZz4pfTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBZGRzIGEgY2hpbGQgdG8gdGhlIHJvb3Qgbm9kZS5cbiAgICAgKlxuICAgICAqIFVzZWZ1bCBpZiB5b3UgYXJlIHVzaW5nIHRoZSBsYXlvdXQgd2hlcmUgdGhlIHJvb3Qgbm9kZSBpcyBoaWRkZW4uXG4gICAgICogQHJldHVybnMgZW1pdHMgYHRydWVgIGlmIHRoZSBjaGlsZCB3YXMgc3VjY2Vzc2Z1bGx5IGFkZGVkLCBgZmFsc2VgIGlmIG5vdFxuICAgICAqL1xuICAgIHB1YmxpYyBhZGRSb290Q2hpbGROb2RlKCk6IE9ic2VydmFibGU8Ym9vbGVhbj4ge1xuICAgICAgICBjb25zdCByZXQgPSBuZXcgUmVwbGF5U3ViamVjdDxib29sZWFuPigxKTtcbiAgICAgICAgdGhpcy5hZGRDaGlsZE5vZGUodGhpcy5fcm9vdE5vZGUpLnN1YnNjcmliZShhZGRlZCA9PiB7XG4gICAgICAgICAgICBpZiAoYWRkZWQpIHtcbiAgICAgICAgICAgICAgICBpZiAoIXRoaXMuX3Nob3dSb290ICYmIHRoaXMuX3RyZWVEYXRhU291cmNlLmRhdGEubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX3RyZWVEYXRhU291cmNlLmRhdGEgPSB0aGlzLl9yb290Tm9kZS5jaGlsZHJlbjtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5yZWZyZXNoVHJlZSgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldC5uZXh0KGFkZGVkKTtcbiAgICAgICAgICAgIHJldC5jb21wbGV0ZSgpO1xuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHJldDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBZGRzIGEgbmV3IGNoaWxkIG5vZGUgdG8gdGhlIGdpdmVuIG5vZGUgYmFzZWQgb24gdGhlIHByb3BlcnRpZXMgb2YgdGhlIG5vZGUncyBjYXNlXG4gICAgICogQHJldHVybnMgZW1pdHMgYHRydWVgIGlmIHRoZSBjaGlsZCB3YXMgc3VjY2Vzc2Z1bGx5IGFkZGVkLCBgZmFsc2VgIGlmIG5vdFxuICAgICAqL1xuICAgIHB1YmxpYyBhZGRDaGlsZE5vZGUoY2xpY2tlZE5vZGU6IENhc2VUcmVlTm9kZSk6IE9ic2VydmFibGU8Ym9vbGVhbj4ge1xuICAgICAgICBjbGlja2VkTm9kZS5hZGRpbmdOb2RlLm9uKCk7XG4gICAgICAgIGNvbnN0IGNhc2VSZWZGaWVsZCA9IGdldEltbWVkaWF0ZURhdGEoY2xpY2tlZE5vZGUuY2FzZSwgVHJlZVBldHJpZmxvd0lkZW50aWZpZXJzLkNISUxEUkVOX0NBU0VfUkVGKTtcblxuICAgICAgICBpZiAoY2FzZVJlZkZpZWxkLmFsbG93ZWROZXRzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgdGhpcy5fbG9nZ2VyLmVycm9yKGBDYXNlICR7Y2xpY2tlZE5vZGUuY2FzZS5zdHJpbmdJZH0gY2FuIGFkZCBuZXcgdHJlZSBub2RlcyBidXQgaGFzIG5vIGFsbG93ZWQgbmV0c2ApO1xuICAgICAgICAgICAgY2xpY2tlZE5vZGUuYWRkaW5nTm9kZS5vZmYoKTtcbiAgICAgICAgICAgIHJldHVybiBvZihmYWxzZSk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCByZXQgPSBuZXcgUmVwbGF5U3ViamVjdDxib29sZWFuPigxKTtcblxuICAgICAgICBpZiAoY2FzZVJlZkZpZWxkLmFsbG93ZWROZXRzLmxlbmd0aCA9PT0gMSkge1xuICAgICAgICAgICAgdGhpcy5jcmVhdGVBbmRBZGRDaGlsZENhc2UoY2FzZVJlZkZpZWxkLmFsbG93ZWROZXRzWzBdLCBjbGlja2VkTm9kZSwgcmV0KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuX3Byb2Nlc3NTZXJ2aWNlLmdldE5ldHMoY2FzZVJlZkZpZWxkLmFsbG93ZWROZXRzKS5zdWJzY3JpYmUobmV0cyA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3Qgc2lkZU1ldVJlZiA9IHRoaXMuX3NpZGVNZW51U2VydmljZS5vcGVuKHRoaXMuX29wdGlvblNlbGVjdG9yQ29tcG9uZW50LCBTaWRlTWVudVNpemUuTUVESVVNLCB7XG4gICAgICAgICAgICAgICAgICAgIHRpdGxlOiBjbGlja2VkTm9kZS5jYXNlLnRpdGxlLFxuICAgICAgICAgICAgICAgICAgICBvcHRpb25zOiBuZXRzLm1hcChuZXQgPT4gKHt0ZXh0OiBuZXQudGl0bGUsIHZhbHVlOiBuZXQuaWRlbnRpZmllcn0pKVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIGxldCBzaWRlTWVudVN1YnNjcmlwdGlvbjogU3Vic2NyaXB0aW9uO1xuICAgICAgICAgICAgICAgIHNpZGVNZW51U3Vic2NyaXB0aW9uID0gc2lkZU1ldVJlZi5vbkNsb3NlLnN1YnNjcmliZShldmVudCA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmICghIWV2ZW50LmRhdGEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY3JlYXRlQW5kQWRkQ2hpbGRDYXNlKGV2ZW50LmRhdGEudmFsdWUsIGNsaWNrZWROb2RlLCByZXQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgc2lkZU1lbnVTdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsaWNrZWROb2RlLmFkZGluZ05vZGUub2ZmKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXQubmV4dChmYWxzZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXQuY29tcGxldGUoKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJldC5hc09ic2VydmFibGUoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgbmV3IGNhc2UgYW5kIGFkZHMgaXQgdG8gdGhlIGNoaWxkcmVuIG9mIHRoZSBzcGVjaWZpZWQgbm9kZVxuICAgICAqIEBwYXJhbSBwcm9jZXNzSWRlbnRpZmllciBpZGVudGlmaWVyIG9mIHRoZSBwcm9jZXNzIHRoYXQgc2hvdWxkIGJlIGNyZWF0ZWRcbiAgICAgKiBAcGFyYW0gY2xpY2tlZE5vZGUgdGhlIG5vZGUgdGhhdCBpcyB0aGUgcGFyZW50IG9mIHRoZSBuZXcgY2FzZVxuICAgICAqIEBwYXJhbSBvcGVyYXRpb25SZXN1bHQgdGhlIHJlc3VsdCBvZiB0aGUgb3BlcmF0aW9uIHdpbGwgYmUgZW1pdHRlZCBpbnRvIHRoaXMgc3RyZWFtIHdoZW4gdGhlIG9wZXJhdGlvbiBjb21wbGV0ZXNcbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgY3JlYXRlQW5kQWRkQ2hpbGRDYXNlKHByb2Nlc3NJZGVudGlmaWVyOiBzdHJpbmcsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGlja2VkTm9kZTogQ2FzZVRyZWVOb2RlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BlcmF0aW9uUmVzdWx0OiBTdWJqZWN0PGJvb2xlYW4+KSB7XG4gICAgICAgIHRoaXMuX3Byb2Nlc3NTZXJ2aWNlLmdldE5ldChwcm9jZXNzSWRlbnRpZmllcikuc3Vic2NyaWJlKG5ldCA9PiB7XG4gICAgICAgICAgICBjb25zdCBjaGlsZFRpdGxlSW1tZWRpYXRlID0gZ2V0SW1tZWRpYXRlRGF0YShjbGlja2VkTm9kZS5jYXNlLCBUcmVlUGV0cmlmbG93SWRlbnRpZmllcnMuQ0hJTERfTk9ERV9USVRMRSk7XG4gICAgICAgICAgICBsZXQgY2hpbGRUaXRsZSA9IHRoaXMuX3RyYW5zbGF0ZVNlcnZpY2UuaW5zdGFudCgnY2FzZVRyZWUubmV3Tm9kZURlZmF1bHROYW1lJyk7XG4gICAgICAgICAgICBpZiAoISFjaGlsZFRpdGxlSW1tZWRpYXRlKSB7XG4gICAgICAgICAgICAgICAgY2hpbGRUaXRsZSA9IGNoaWxkVGl0bGVJbW1lZGlhdGUudmFsdWU7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKCEhbmV0LmRlZmF1bHRDYXNlTmFtZSkge1xuICAgICAgICAgICAgICAgIGNoaWxkVGl0bGUgPSBuZXQuZGVmYXVsdENhc2VOYW1lO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5fY2FzZVJlc291cmNlU2VydmljZS5jcmVhdGVDYXNlKHtcbiAgICAgICAgICAgICAgICB0aXRsZTogY2hpbGRUaXRsZSxcbiAgICAgICAgICAgICAgICBuZXRJZDogbmV0LnN0cmluZ0lkXG4gICAgICAgICAgICB9KS5zdWJzY3JpYmUoKG91dGNvbWVSZXNvdXJjZTogRXZlbnRPdXRjb21lTWVzc2FnZVJlc291cmNlKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgY2FzZVJlZkZpZWxkID0gZ2V0SW1tZWRpYXRlRGF0YShjbGlja2VkTm9kZS5jYXNlLCBUcmVlUGV0cmlmbG93SWRlbnRpZmllcnMuQ0hJTERSRU5fQ0FTRV9SRUYpO1xuICAgICAgICAgICAgICAgIGNvbnN0IHNldENhc2VSZWZWYWx1ZSA9IFsuLi5jYXNlUmVmRmllbGQudmFsdWUsIChvdXRjb21lUmVzb3VyY2Uub3V0Y29tZSBhcyBDcmVhdGVDYXNlRXZlbnRPdXRjb21lKS5hQ2FzZS5zdHJpbmdJZF07XG4gICAgICAgICAgICAgICAgdGhpcy5wZXJmb3JtQ2FzZVJlZkNhbGwoY2xpY2tlZE5vZGUuY2FzZS5zdHJpbmdJZCwgc2V0Q2FzZVJlZlZhbHVlKS5zdWJzY3JpYmUoXG4gICAgICAgICAgICAgICAgICAgIHZhbHVlQ2hhbmdlID0+IHRoaXMudXBkYXRlVHJlZUFmdGVyQ2hpbGRBZGQoY2xpY2tlZE5vZGUsIHZhbHVlQ2hhbmdlID8gdmFsdWVDaGFuZ2UgOiBzZXRDYXNlUmVmVmFsdWUsIG9wZXJhdGlvblJlc3VsdClcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFVwZGF0ZXMgdGhlIHRyZWUgYWZ0ZXIgYWRkaW5nIGEgbmV3IGNoaWxkXG4gICAgICogQHBhcmFtIGNsaWNrZWROb2RlIHRoZSBwYXJlbnQgbm9kZVxuICAgICAqIEBwYXJhbSBuZXdDYXNlUmVmVmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgcGFyZW50IG5vZGUncyBjYXNlIHJlZlxuICAgICAqIEBwYXJhbSBvcGVyYXRpb25SZXN1bHQgdGhlIHJlc3VsdCBvZiB0aGUgb3BlcmF0aW9uIHdpbGwgYmUgZW1pdHRlZCBpbnRvIHRoaXMgc3RyZWFtIHdoZW4gdGhlIG9wZXJhdGlvbiBjb21wbGV0ZXNcbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgdXBkYXRlVHJlZUFmdGVyQ2hpbGRBZGQoY2xpY2tlZE5vZGU6IENhc2VUcmVlTm9kZSwgbmV3Q2FzZVJlZlZhbHVlOiBBcnJheTxzdHJpbmc+LCBvcGVyYXRpb25SZXN1bHQ6IFN1YmplY3Q8Ym9vbGVhbj4pOiB2b2lkIHtcbiAgICAgICAgdGhpcy51cGRhdGVOb2RlQ2hpbGRyZW5Gcm9tQ2hhbmdlZEZpZWxkcyhjbGlja2VkTm9kZSwgbmV3Q2FzZVJlZlZhbHVlKS5zdWJzY3JpYmUocmVzdWx0ID0+IHtcbiAgICAgICAgICAgIGNsaWNrZWROb2RlLmFkZGluZ05vZGUub2ZmKCk7XG4gICAgICAgICAgICB0aGlzLmV4cGFuZE5vZGUoY2xpY2tlZE5vZGUpLnN1YnNjcmliZShleHBhbmRTdWNjZXNzID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoZXhwYW5kU3VjY2Vzcykge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmNoYW5nZUFjdGl2ZU5vZGUoY2xpY2tlZE5vZGUuY2hpbGRyZW5bY2xpY2tlZE5vZGUuY2hpbGRyZW4ubGVuZ3RoIC0gMV0pO1xuICAgICAgICAgICAgICAgICAgICByZXN1bHQuZXhlY3V0ZUFmdGVyQWN0aW9ucygpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBvcGVyYXRpb25SZXN1bHQubmV4dCh0cnVlKTtcbiAgICAgICAgICAgICAgICBvcGVyYXRpb25SZXN1bHQuY29tcGxldGUoKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiByZW1vdmVzIHRoZSBwcm92aWRlZCBub24tcm9vdCBub2RlIGlmIHRoZSB1bmRlcmx5aW5nIGNhc2UgYWxsb3dzIGl0LlxuICAgICAqXG4gICAgICogVGhlIHVuZGVybHlpbmcgY2FzZSBpcyByZW1vdmVkIGZyb20gdGhlIGNhc2UgcmVmIG9mIGl0J3MgcGFyZW50IGVsZW1lbnQgd2l0aCB0aGUgaGVscCBmcm9tIHRoZSBgcmVtb3ZlYFxuICAgICAqIG9wZXJhdGlvbiBwcm92aWRlZCBieSBjYXNlIHJlZiBpdHNlbGYuXG4gICAgICogQHBhcmFtIG5vZGUgdGhlIG5vZGUgdGhhdCBzaG91bGQgYmUgcmVtb3ZlZCBmcm9tIHRoZSB0cmVlXG4gICAgICovXG4gICAgcHVibGljIHJlbW92ZU5vZGUobm9kZTogQ2FzZVRyZWVOb2RlKTogdm9pZCB7XG4gICAgICAgIGlmICghbm9kZS5wYXJlbnQpIHtcbiAgICAgICAgICAgIHRoaXMuX2xvZ2dlci5lcnJvcignQ2FzZSB0cmVlIGRvZXNuXFwndCBzdXBwb3J0IHJlbW92YWwgb2YgdGhlIHJvb3Qgbm9kZSwgYXMgaXQgaGFzIG5vIHBhcmVudCBjYXNlIHJlZi4nKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIG5vZGUucmVtb3ZpbmdOb2RlLm9uKCk7XG4gICAgICAgIGNvbnN0IGNhc2VSZWZJbW1lZGlhdGUgPSBnZXRJbW1lZGlhdGVEYXRhKG5vZGUucGFyZW50LmNhc2UsIFRyZWVQZXRyaWZsb3dJZGVudGlmaWVycy5DSElMRFJFTl9DQVNFX1JFRik7XG4gICAgICAgIGNvbnN0IHNldENhc2VSZWZWYWx1ZSA9IChjYXNlUmVmSW1tZWRpYXRlLnZhbHVlIGFzIEFycmF5PHN0cmluZz4pLmZpbHRlcihpZCA9PiBpZCAhPT0gbm9kZS5jYXNlLnN0cmluZ0lkKTtcbiAgICAgICAgdGhpcy5wZXJmb3JtQ2FzZVJlZkNhbGwobm9kZS5wYXJlbnQuY2FzZS5zdHJpbmdJZCwgc2V0Q2FzZVJlZlZhbHVlKS5zdWJzY3JpYmUoY2FzZVJlZkNoYW5nZSA9PiB7XG4gICAgICAgICAgICBjb25zdCBuZXdDYXNlUmVmVmFsdWUgPSBjYXNlUmVmQ2hhbmdlID8gY2FzZVJlZkNoYW5nZSA6IHNldENhc2VSZWZWYWx1ZTtcbiAgICAgICAgICAgIHRoaXMuZGVsZXRlUmVtb3ZlZE5vZGVzKG5vZGUucGFyZW50LCBuZXdDYXNlUmVmVmFsdWUpO1xuICAgICAgICAgICAgdGhpcy51cGRhdGVOb2RlQ2hpbGRyZW5Gcm9tQ2hhbmdlZEZpZWxkcyhub2RlLnBhcmVudCwgbmV3Q2FzZVJlZlZhbHVlKTtcblxuICAgICAgICAgICAgbm9kZS5yZW1vdmluZ05vZGUub2ZmKCk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHRoaXMuZGVzZWxlY3ROb2RlSWZEZXNjZW5kYW50T2Yobm9kZSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRXhwYW5kcyBhbGwgbm9kZXMgaW4gdGhlIHRyZWUgZGljdGF0ZWQgYnkgdGhlIGFyZ3VtZW50LlxuICAgICAqXG4gICAgICogQHBhcmFtIHBhdGggbm9kZXMgdGhhdCBzaG91bGQgYmUgZXhwYW5kZWQgYWxvbmcgd2l0aCB0aGVpciBwYXRoIGZyb20gdGhlIHJvb3Qgbm9kZVxuICAgICAqL1xuICAgIHB1YmxpYyBleHBhbmRQYXRoKHBhdGg6IENhc2VUcmVlUGF0aCk6IHZvaWQge1xuICAgICAgICBpZiAodGhpcy5kYXRhU291cmNlLmRhdGEubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgbGV0IHJvb3ROb2RlID0gdGhpcy5kYXRhU291cmNlLmRhdGFbMF07XG4gICAgICAgIHdoaWxlIChyb290Tm9kZS5wYXJlbnQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgcm9vdE5vZGUgPSByb290Tm9kZS5wYXJlbnQ7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5leHBhbmRMZXZlbChbcm9vdE5vZGVdLCB0aGlzLmNvbnZlcnRQYXRoVG9FeHBhbnNpb25UcmVlKHBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUcmFuc2Zvcm1zIGEge0BMaW5rIENhc2VUcmVlUGF0aH0gb2JqZWN0IGludG8gYW4ge0BsaW5rIEV4cGFuc2lvblRyZWV9IG9iamVjdC5cbiAgICAgKiBUaGUgcmVzdWx0IGhhcyBhbGwgdGhlIGNvbW1vbiBwYXRocyBtZXJnZWQgaW50byBzaW5nbGUgYnJhbmNoZXMgb2YgdGhlIHJlc3VsdGluZyB0cmVlIHN0cnVjdHVyZS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBwYXRocyBub2RlcyB0aGF0IHNob3VsZCBiZSBleHBhbmRlZCBhbG9uZyB3aXRoIHRoZWlyIHBhdGggZnJvbSB0aGUgcm9vdCBub2RlXG4gICAgICogQHJldHVybnMgYW4ge0BsaW5rIEV4cGFuc2lvblRyZWV9IGVxdWl2YWxlbnQgdG8gdGhlIHByb3ZpZGVkIHtAbGluayBDYXNlVHJlZVBhdGh9XG4gICAgICovXG4gICAgcHJvdGVjdGVkIGNvbnZlcnRQYXRoVG9FeHBhbnNpb25UcmVlKHBhdGhzOiBDYXNlVHJlZVBhdGgpOiBFeHBhbnNpb25UcmVlIHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0ge307XG4gICAgICAgIE9iamVjdC52YWx1ZXMocGF0aHMpLmZvckVhY2gocGF0aCA9PiB7XG4gICAgICAgICAgICBsZXQgY3VycmVudE5vZGUgPSByZXN1bHQ7XG4gICAgICAgICAgICBwYXRoLmZvckVhY2gobm9kZUlkID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoY3VycmVudE5vZGVbbm9kZUlkXSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgICAgIGN1cnJlbnROb2RlW25vZGVJZF0gPSB7fTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY3VycmVudE5vZGUgPSBjdXJyZW50Tm9kZVtub2RlSWRdO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlY3Vyc2l2ZWx5IGV4cGFuZHMgYWxsIG5vZGVzIGZyb20gdGhlIHByb3ZpZGVkIGFycmF5IG9mIG5vZGVzLCB0aGF0IGFwcGVhciBpbiB0aGUgdG9wIGxldmVsIG9mIHRoZSB7QGxpbmsgRXhwYW5zaW9uVHJlZX0gb2JqZWN0LlxuICAgICAqXG4gICAgICogQHBhcmFtIGxldmVsTm9kZXMgbm9kZXMgZnJvbSB3aGljaCB0aGUgZXhwYW5zaW9uIHNob3VsZCBzdGFydFxuICAgICAqIEBwYXJhbSB0YXJnZXRzIGEgdHJlZSBzdHJ1Y3R1cmUgcmVwcmVzZW50aW5nIHRoZSBub2RlcyB0aGF0IGFyZSB0byBiZSBleHBhbmRlZCByZWN1cnNpdmVseS5cbiAgICAgKiBUaGUgdG9wIGxldmVsIG5vZGVzIGFyZSBleHBhbmRlZCBmaXJzdCwgZnJvbSB0aGUgcHJvdmlkZWQgYGxldmVsTm9kZXNgLlxuICAgICAqL1xuICAgIHByb3RlY3RlZCBleHBhbmRMZXZlbChsZXZlbE5vZGVzOiBBcnJheTxDYXNlVHJlZU5vZGU+LCB0YXJnZXRzOiBFeHBhbnNpb25UcmVlKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IGRlc2lyZWRJZHMgPSBuZXcgU2V0KE9iamVjdC5rZXlzKHRhcmdldHMpKTtcbiAgICAgICAgaWYgKGRlc2lyZWRJZHMuc2l6ZSA9PT0gMCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV2ZWxOb2Rlcy5mb3JFYWNoKG4gPT4ge1xuICAgICAgICAgICAgY29uc3Qgbm9kZSA9IG47XG4gICAgICAgICAgICBpZiAoIWRlc2lyZWRJZHMuaGFzKG5vZGUuY2FzZS5zdHJpbmdJZCkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm47IC8vIGNvbnRpbnVlXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLmV4cGFuZE5vZGUobm9kZSkuc3Vic2NyaWJlKHN1Y2Nlc3MgPT4ge1xuICAgICAgICAgICAgICAgIGlmICghc3VjY2Vzcykge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9sb2dnZXIuZGVidWcoJ0NvdWxkIG5vdCBleHBhbmQgdHJlZSBub2RlIHdpdGggSUQ6ICcgKyBub2RlLmNhc2Uuc3RyaW5nSWQpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHRoaXMuZXhwYW5kTGV2ZWwobm9kZS5jaGlsZHJlbiwgdGFyZ2V0c1tub2RlLmNhc2Uuc3RyaW5nSWRdKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBEZWxldGVzIHRoZSBzdWJ0cmVlcyByb290ZWQgYXQgdGhlIG5vZGVzIHRoYXQgYXJlIHByZXNlbnQgaW4gdGhlIHBhcmVudCBub2RlJ3MgY2hpbGQgY2FzZSByZWYgdmFsdWVzLFxuICAgICAqIGJ1dCBhcmUgbm8gbG9uZ2VyIHByZXNlbnQgaW4gdGhlIG5ldyB2YWx1ZVxuICAgICAqIEBwYXJhbSBwYXJlbnROb2RlIGFuIGlubmVyIG5vZGUgb2YgdGhlIHRyZWUgdGhhdCBoYWQgc29tZSBvZiBpdCdzIGNoaWxkcmVuIHJlbW92ZWRcbiAgICAgKiBAcGFyYW0gbmV3Q2FzZVJlZlZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlIHBhcmVudCBub2RlJ3MgY2FzZSByZWZcbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgZGVsZXRlUmVtb3ZlZE5vZGVzKHBhcmVudE5vZGU6IENhc2VUcmVlTm9kZSwgbmV3Q2FzZVJlZlZhbHVlOiBBcnJheTxzdHJpbmc+KTogdm9pZCB7XG4gICAgICAgIGNvbnN0IHJlbW92ZWRDaGlsZHJlbiA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICAgICAgICBnZXRJbW1lZGlhdGVEYXRhKHBhcmVudE5vZGUuY2FzZSwgVHJlZVBldHJpZmxvd0lkZW50aWZpZXJzLkNISUxEUkVOX0NBU0VfUkVGKS52YWx1ZS5mb3JFYWNoKGlkID0+IHJlbW92ZWRDaGlsZHJlbi5hZGQoaWQpKTtcbiAgICAgICAgbmV3Q2FzZVJlZlZhbHVlLmZvckVhY2goaWQgPT4gcmVtb3ZlZENoaWxkcmVuLmRlbGV0ZShpZCkpO1xuICAgICAgICByZW1vdmVkQ2hpbGRyZW4uZm9yRWFjaChyZW1vdmVkSWQgPT4gdGhpcy5fY2FzZVJlc291cmNlU2VydmljZS5kZWxldGVDYXNlKHJlbW92ZWRJZCwgdHJ1ZSlcbiAgICAgICAgICAgIC5zdWJzY3JpYmUocmVzcG9uc2VNZXNzYWdlID0+IHtcbiAgICAgICAgICAgICAgICBpZiAocmVzcG9uc2VNZXNzYWdlLmVycm9yKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2xvZ2dlci5lcnJvcignUmVtb3ZhbCBvZiBjaGlsZCBjYXNlIHVuc3VjY2Vzc2Z1bCcsIHJlc3BvbnNlTWVzc2FnZS5lcnJvcik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIERlc2VsZWN0cyB0aGUgY3VycmVudGx5IHNlbGVjdGVkIG5vZGUgaWYgaXQgaXMgYSBkZXNjZW5kYW50IG9mIHRoZSBwcm92aWRlZCBub2RlXG4gICAgICogQHBhcmFtIG5vZGUgdGhlIG5vZGUgd2hvJ3MgZGVzY2VuZGFudHMgc2hvdWxkIGJlIGRlc2VsZWN0ZWRcbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgZGVzZWxlY3ROb2RlSWZEZXNjZW5kYW50T2Yobm9kZTogQ2FzZVRyZWVOb2RlKTogdm9pZCB7XG4gICAgICAgIGxldCBidWJibGluZ05vZGUgPSB0aGlzLmN1cnJlbnROb2RlO1xuICAgICAgICB3aGlsZSAoYnViYmxpbmdOb2RlICYmIGJ1YmJsaW5nTm9kZSAhPT0gdGhpcy5fcm9vdE5vZGUpIHtcbiAgICAgICAgICAgIGlmIChidWJibGluZ05vZGUgPT09IG5vZGUpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmNoYW5nZUFjdGl2ZU5vZGUodW5kZWZpbmVkKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGJ1YmJsaW5nTm9kZSA9IGJ1YmJsaW5nTm9kZS5wYXJlbnQ7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBQZXJmb3JtcyBhIGJhY2tlbmQgY2FsbCBvbiB0aGUgZ2l2ZW4gY2FzZSwgYW5kIHNldHMgdGhlIHZhbHVlIG9mIHRoZSBjYXNlIHJlZiBmaWVsZCBpbiB0aGUgdHJhbnNpdGlvbiBkZWZpbmVkIGJ5XG4gICAgICogW0NBU0VfUkVGX1RSQU5TSVRJT05de0BsaW5rIFRyZWVQZXRyaWZsb3dJZGVudGlmaWVycyNDQVNFX1JFRl9UUkFOU0lUSU9OfS5cbiAgICAgKiBAcGFyYW0gY2FzZUlkIHN0cmluZyBJRCBvZiB0aGUgY2FzZSB0aGF0IHNob3VsZCBoYXZlIGl0J3MgdHJlZSBjYXNlIHJlZiBzZXRcbiAgICAgKiBAcGFyYW0gbmV3Q2FzZVJlZlZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlIGNhc2UgcmVmIGZpZWxkXG4gICAgICovXG4gICAgcHJpdmF0ZSBwZXJmb3JtQ2FzZVJlZkNhbGwoY2FzZUlkOiBzdHJpbmcsIG5ld0Nhc2VSZWZWYWx1ZTogQXJyYXk8c3RyaW5nPik6IE9ic2VydmFibGU8QXJyYXk8c3RyaW5nPiB8IHVuZGVmaW5lZD4ge1xuICAgICAgICBjb25zdCByZXN1bHQkID0gbmV3IFJlcGxheVN1YmplY3Q8QXJyYXk8c3RyaW5nPj4oMSk7XG5cbiAgICAgICAgdGhpcy5fdGFza1Jlc291cmNlU2VydmljZS5nZXRUYXNrcyhTaW1wbGVGaWx0ZXIuZnJvbVRhc2tRdWVyeSh7XG4gICAgICAgICAgICBjYXNlOiB7aWQ6IGNhc2VJZH0sXG4gICAgICAgICAgICB0cmFuc2l0aW9uSWQ6IFRyZWVQZXRyaWZsb3dJZGVudGlmaWVycy5DQVNFX1JFRl9UUkFOU0lUSU9OXG4gICAgICAgIH0pKS5zdWJzY3JpYmUocGFnZSA9PiB7XG4gICAgICAgICAgICBpZiAoIWhhc0NvbnRlbnQocGFnZSkpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9sb2dnZXIuZXJyb3IoJ0Nhc2UgcmVmIGFjY2Vzc29yIHRhc2sgZG9lc25cXCd0IGV4aXN0IScpO1xuICAgICAgICAgICAgICAgIHJlc3VsdCQuY29tcGxldGUoKTtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IHRhc2sgPSBwYWdlLmNvbnRlbnRbMF07XG5cbiAgICAgICAgICAgIHRoaXMuX3Rhc2tSZXNvdXJjZVNlcnZpY2UuYXNzaWduVGFzayh0YXNrLnN0cmluZ0lkKS5zdWJzY3JpYmUoYXNzaWduUmVzcG9uc2UgPT4ge1xuICAgICAgICAgICAgICAgIGlmICghYXNzaWduUmVzcG9uc2Uuc3VjY2Vzcykge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9sb2dnZXIuZXJyb3IoJ0Nhc2UgcmVmIGFjY2Vzc29yIHRhc2sgY291bGQgbm90IGJlIGFzc2lnbmVkJywgYXNzaWduUmVzcG9uc2UuZXJyb3IpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGNvbnN0IGJvZHkgPSB7fTtcbiAgICAgICAgICAgICAgICBib2R5W3Rhc2suc3RyaW5nSWRdID0ge1xuICAgICAgICAgICAgICAgICAgICBbVHJlZVBldHJpZmxvd0lkZW50aWZpZXJzLkNISUxEUkVOX0NBU0VfUkVGXToge1xuICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogJ2Nhc2VSZWYnLFxuICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6IG5ld0Nhc2VSZWZWYWx1ZVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICB0aGlzLl90YXNrUmVzb3VyY2VTZXJ2aWNlLnNldERhdGEodGFzay5zdHJpbmdJZCwgYm9keSkuc3Vic2NyaWJlKChvdXRjb21lUmVzb3VyY2U6IEV2ZW50T3V0Y29tZU1lc3NhZ2VSZXNvdXJjZSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFuZ2VkRmllbGRzID0gKG91dGNvbWVSZXNvdXJjZS5vdXRjb21lIGFzIFNldERhdGFFdmVudE91dGNvbWUpLmNoYW5nZWRGaWVsZHMuY2hhbmdlZEZpZWxkcztcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgY2FzZVJlZkNoYW5nZXMgPSBjaGFuZ2VkRmllbGRzW1RyZWVQZXRyaWZsb3dJZGVudGlmaWVycy5DSElMRFJFTl9DQVNFX1JFRl07XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdCQubmV4dChjYXNlUmVmQ2hhbmdlcyA/IGNhc2VSZWZDaGFuZ2VzLnZhbHVlIDogdW5kZWZpbmVkKTtcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0JC5jb21wbGV0ZSgpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl90YXNrUmVzb3VyY2VTZXJ2aWNlLmZpbmlzaFRhc2sodGFzay5zdHJpbmdJZCkuc3Vic2NyaWJlKGZpbmlzaFJlc3BvbnNlID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmaW5pc2hSZXNwb25zZS5zdWNjZXNzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fbG9nZ2VyLmRlYnVnKCdDYXNlIHJlZiBhY2Nlc3NvciB0YXNrIGZpbmlzaGVkJywgZmluaXNoUmVzcG9uc2Uuc3VjY2Vzcyk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2xvZ2dlci5lcnJvcignQ2FzZSByZWYgYWNjZXNzb3IgdGFzayBmaW5pc2ggZmFpbGVkJywgZmluaXNoUmVzcG9uc2UuZXJyb3IpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9LCBlcnJvciA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2xvZ2dlci5lcnJvcignQ291bGQgbm90IHNldCBkYXRhIHRvIHRyZWUgY2FzZSByZWYnLCBlcnJvcik7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdCQuY29tcGxldGUoKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0sIGVycm9yID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLl9sb2dnZXIuZXJyb3IoJ0Nhc2UgcmVmIGFjY2Vzc29yIHRhc2sgY291bGQgbm90IGJlIGFzc2lnbmVkJywgZXJyb3IpO1xuICAgICAgICAgICAgICAgIHJlc3VsdCQuY29tcGxldGUoKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9LCBlcnJvciA9PiB7XG4gICAgICAgICAgICB0aGlzLl9sb2dnZXIuZXJyb3IoJ0Nhc2UgcmVmIGFjY2Vzc29yIHRhc2sgY291bGQgbm90IGJlIGZvdW5kJywgZXJyb3IpO1xuICAgICAgICAgICAgcmVzdWx0JC5jb21wbGV0ZSgpO1xuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHJlc3VsdCQuYXNPYnNlcnZhYmxlKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUGVyZm9ybXMgYW4gdXBkYXRlIGFmdGVyIGFkZGluZyBvciByZW1vdmluZyBhIG5vZGUgZnJvbSB0aGUgdHJlZS5cbiAgICAgKlxuICAgICAqIElmIG9ubHkgb25lIG5vZGUgd2FzIGFkZGVkIGFkZHMgaXQgaW50byB0aGUgdHJlZVxuICAgICAqXG4gICAgICogSWYgb25seSBvbmUgbm9kZSB3YXMgcmVtb3ZlZCByZW1vdmVzIGl0IGZyb20gdGhlIHRyZWVcbiAgICAgKlxuICAgICAqIE90aGVyd2lzZSBjb2xsYXBzZXMgdGhlIGFmZmVjdGVkIG5vZGUgYW5kIG1hcmtzIGl0J3MgY2hpbGRyZW4gYXMgZGlydHlcbiAgICAgKlxuICAgICAqIEBwYXJhbSBhZmZlY3RlZE5vZGUgbm9kZSB0aGF0IGhhZCBpdCdzIGNoaWxkcmVuIGNoYW5nZWRcbiAgICAgKiBAcGFyYW0gbmV3Q2FzZVJlZlZhbHVlIG5ldyB2YWx1ZSBvZiB0aGUgY2FzZVJlZiBmaWVsZCByZXR1cm5lZCBieSBiYWNrZW5kXG4gICAgICogQHJldHVybnMgYW4gYE9ic2VydmFibGVgIHRoYXQgZW1pdHMgYW4gb2JqZWN0IHdpdGggdGhlIFtyZXN1bHRde0BsaW5rIFJlc3VsdFdpdGhBZnRlckFjdGlvbnMjcmVzdWx0fSBhdHRyaWJ1dGUgc2V0IHRvIGB0cnVlYCBpZlxuICAgICAqIHRoZSB1cGRhdGUgY29tcGxldGVzIHN1Y2Nlc3NmdWxseSBhbmQgYGZhbHNlYCBvdGhlcndpc2UuXG4gICAgICovXG4gICAgcHJpdmF0ZSB1cGRhdGVOb2RlQ2hpbGRyZW5Gcm9tQ2hhbmdlZEZpZWxkcyhhZmZlY3RlZE5vZGU6IENhc2VUcmVlTm9kZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld0Nhc2VSZWZWYWx1ZTogQXJyYXk8c3RyaW5nPik6IE9ic2VydmFibGU8UmVzdWx0V2l0aEFmdGVyQWN0aW9uczxib29sZWFuPj4ge1xuICAgICAgICBjb25zdCBjYXNlUmVmRmllbGQgPSBnZXRJbW1lZGlhdGVEYXRhKGFmZmVjdGVkTm9kZS5jYXNlLCBUcmVlUGV0cmlmbG93SWRlbnRpZmllcnMuQ0hJTERSRU5fQ0FTRV9SRUYpO1xuICAgICAgICBjb25zdCBuZXdDaGlsZHJlbiA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICAgICAgICBuZXdDYXNlUmVmVmFsdWUuZm9yRWFjaChpZCA9PiBuZXdDaGlsZHJlbi5hZGQoaWQpKTtcblxuICAgICAgICBsZXQgbnVtYmVyT2ZNaXNzaW5nQ2hpbGRyZW4gPSAwO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNhc2VSZWZGaWVsZC52YWx1ZS5sZW5ndGggJiYgbnVtYmVyT2ZNaXNzaW5nQ2hpbGRyZW4gPCAyOyBpKyspIHtcbiAgICAgICAgICAgIGlmICghbmV3Q2hpbGRyZW4uaGFzKGNhc2VSZWZGaWVsZC52YWx1ZVtpXSkpIHtcbiAgICAgICAgICAgICAgICBudW1iZXJPZk1pc3NpbmdDaGlsZHJlbisrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgZXhhY3RseU9uZUNoaWxkQWRkZWQgPSBjYXNlUmVmRmllbGQudmFsdWUubGVuZ3RoICsgMSA9PT0gbmV3Q2FzZVJlZlZhbHVlLmxlbmd0aFxuICAgICAgICAgICAgJiYgY2FzZVJlZkZpZWxkLnZhbHVlLmV2ZXJ5KGl0ID0+IG5ld0NoaWxkcmVuLmhhcyhpdCkpO1xuXG4gICAgICAgIGNvbnN0IGV4YWN0bHlPbmVDaGlsZFJlbW92ZWQgPSBjYXNlUmVmRmllbGQudmFsdWUubGVuZ3RoIC0gMSA9PT0gbmV3Q2FzZVJlZlZhbHVlLmxlbmd0aFxuICAgICAgICAgICAgJiYgbnVtYmVyT2ZNaXNzaW5nQ2hpbGRyZW4gPT09IDE7XG5cbiAgICAgICAgaWYgKCFleGFjdGx5T25lQ2hpbGRBZGRlZCAmJiAhZXhhY3RseU9uZUNoaWxkUmVtb3ZlZCkge1xuICAgICAgICAgICAgY2FzZVJlZkZpZWxkLnZhbHVlID0gbmV3Q2FzZVJlZlZhbHVlO1xuICAgICAgICAgICAgdGhpcy5fdHJlZUNvbnRyb2wuY29sbGFwc2VEZXNjZW5kYW50cyhhZmZlY3RlZE5vZGUpO1xuICAgICAgICAgICAgYWZmZWN0ZWROb2RlLmRpcnR5Q2hpbGRyZW4gPSB0cnVlO1xuICAgICAgICAgICAgcmV0dXJuIG9mKG5ldyBSZXN1bHRXaXRoQWZ0ZXJBY3Rpb25zKHRydWUpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChleGFjdGx5T25lQ2hpbGRBZGRlZCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMucHJvY2Vzc0NoaWxkTm9kZUFkZChhZmZlY3RlZE5vZGUsIGNhc2VSZWZGaWVsZCwgbmV3Q2FzZVJlZlZhbHVlKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnByb2Nlc3NDaGlsZE5vZGVSZW1vdmUoYWZmZWN0ZWROb2RlLCBjYXNlUmVmRmllbGQsIG5ld0NoaWxkcmVuKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEFkZHMgYSBuZXcgY2hpbGQgbm9kZSB0byB0aGUgYGFmZmVjdGVkTm9kZWAgYnkgYWRkaW5nIHRoZSBsYXN0IENhc2UgZnJvbSB0aGUgYG5ld0Nhc2VSZWZWYWx1ZWBcbiAgICAgKiBAcGFyYW0gYWZmZWN0ZWROb2RlIHRoZSBub2RlIGluIHRoZSB0cmVlIHRoYXQgaGFkIGEgY2hpbGQgYWRkZWQgLSB0aGUgcGFyZW50IG5vZGVcbiAgICAgKiBAcGFyYW0gY2FzZVJlZkZpZWxkIHRoZSBjYXNlIHJlZiBmaWVsZCBvZiB0aGUgYWZmZWN0ZWQgbm9kZVxuICAgICAqIEBwYXJhbSBuZXdDYXNlUmVmVmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgY2FzZSByZWYgZmllbGQgaW4gdGhlIG5vZGVcbiAgICAgKiBAcmV0dXJucyBhbiBgT2JzZXJ2YWJsZWAgdGhhdCBlbWl0cyBgdHJ1ZWAgaWYgYSBub2RlIHdhcyBzdWNjZXNzZnVsbHkgYWRkZWQsIGBmYWxzZWAgb3RoZXJ3aXNlLlxuICAgICAqL1xuICAgIHByb3RlY3RlZCBwcm9jZXNzQ2hpbGROb2RlQWRkKGFmZmVjdGVkTm9kZTogQ2FzZVRyZWVOb2RlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2VSZWZGaWVsZDogSW1tZWRpYXRlRGF0YSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdDYXNlUmVmVmFsdWU6IEFycmF5PHN0cmluZz4pOiBPYnNlcnZhYmxlPFJlc3VsdFdpdGhBZnRlckFjdGlvbnM8Ym9vbGVhbj4+IHtcbiAgICAgICAgY29uc3QgcmVzdWx0JCA9IG5ldyBSZXBsYXlTdWJqZWN0PFJlc3VsdFdpdGhBZnRlckFjdGlvbnM8Ym9vbGVhbj4+KDEpO1xuXG4gICAgICAgIGNhc2VSZWZGaWVsZC52YWx1ZSA9IG5ld0Nhc2VSZWZWYWx1ZTtcbiAgICAgICAgdGhpcy5fY2FzZVJlc291cmNlU2VydmljZS5nZXRPbmVDYXNlKG5ld0Nhc2VSZWZWYWx1ZVtuZXdDYXNlUmVmVmFsdWUubGVuZ3RoIC0gMV0pLnN1YnNjcmliZShjaGlsZENhc2UgPT4ge1xuICAgICAgICAgICAgaWYgKGNoaWxkQ2FzZSkge1xuICAgICAgICAgICAgICAgIHRoaXMuX2xvZ2dlci5kZWJ1ZygnUHVzaGluZyBjaGlsZCBub2RlIHRvIHRyZWUnLCB7Y2hpbGRDYXNlLCBhZmZlY3RlZE5vZGU6IGFmZmVjdGVkTm9kZS50b0xvZ2dhYmxlRm9ybSgpfSk7XG4gICAgICAgICAgICAgICAgY29uc3QgY2hpbGROb2RlID0gdGhpcy5wdXNoQ2hpbGRUb1RyZWUoYWZmZWN0ZWROb2RlLCBjaGlsZENhc2UpO1xuICAgICAgICAgICAgICAgIHJlc3VsdCQubmV4dChuZXcgUmVzdWx0V2l0aEFmdGVyQWN0aW9ucyh0cnVlLCBbKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5faXNFYWdlckxvYWRlZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fbG9nZ2VyLmRlYnVnKCdFYWdlcmx5IGV4cGFuZGluZyBhIG5ld2x5IGFkZGVkIG5vZGUuJywgY2hpbGROb2RlLnRvTG9nZ2FibGVGb3JtKCkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5leHBhbmROb2RlKGNoaWxkTm9kZSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XSkpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9sb2dnZXIuZXJyb3IoJ05ldyBjaGlsZCBjYXNlIHdhcyBub3QgZm91bmQsIGlsbGVnYWwgc3RhdGUnLCBjaGlsZENhc2UpO1xuICAgICAgICAgICAgICAgIHJlc3VsdCQubmV4dChuZXcgUmVzdWx0V2l0aEFmdGVyQWN0aW9ucyhmYWxzZSkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmVzdWx0JC5jb21wbGV0ZSgpO1xuICAgICAgICB9LCBlcnJvciA9PiB7XG4gICAgICAgICAgICB0aGlzLl9sb2dnZXIuZXJyb3IoJ05ldyBjaGlsZCBub2RlIGNhc2UgY291bGQgbm90IGJlIGZvdW5kJywgZXJyb3IpO1xuICAgICAgICAgICAgcmVzdWx0JC5uZXh0KG5ldyBSZXN1bHRXaXRoQWZ0ZXJBY3Rpb25zKGZhbHNlKSk7XG4gICAgICAgICAgICByZXN1bHQkLmNvbXBsZXRlKCk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHJldHVybiByZXN1bHQkLmFzT2JzZXJ2YWJsZSgpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEFkZHMgYSBuZXcgY2hpbGQgbm9kZSB0byB0aGUgdGFyZ2V0IHBhcmVudCBub2RlLlxuICAgICAqIEBwYXJhbSBwYXJlbnROb2RlIHRoZSBub2RlcyB3aG9zZSBjaGlsZCBzaG91bGQgYmUgYWRkZWRcbiAgICAgKiBAcGFyYW0gY2hpbGRDYXNlIHRoZSBjaGlsZCBjYXNlXG4gICAgICogQHJldHVybnMgdGhlIG5ld2x5IGFkZGVkIG5vZGVcbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgcHVzaENoaWxkVG9UcmVlKHBhcmVudE5vZGU6IENhc2VUcmVlTm9kZSwgY2hpbGRDYXNlOiBDYXNlKTogQ2FzZVRyZWVOb2RlIHtcbiAgICAgICAgY29uc3QgY2hpbGROb2RlID0gbmV3IENhc2VUcmVlTm9kZShjaGlsZENhc2UsIHBhcmVudE5vZGUpO1xuICAgICAgICBwYXJlbnROb2RlLmNoaWxkcmVuLnB1c2goY2hpbGROb2RlKTtcbiAgICAgICAgdGhpcy5yZWZyZXNoVHJlZSgpO1xuICAgICAgICByZXR1cm4gY2hpbGROb2RlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlbW92ZXMgdGhlIGRlbGV0ZWQgbm9kZSBmcm9tIHRoZSBjaGlsZHJlbiBvZiB0aGUgYGFmZmVjdGVkTm9kZWBcbiAgICAgKiBAcGFyYW0gYWZmZWN0ZWROb2RlIHRoZSBub2RlIGluIHRoZSB0cmVlIHRoYXQgaGFkIGl0J3MgY2hpbGQgcmVtb3ZlZFxuICAgICAqIEBwYXJhbSBjYXNlUmVmRmllbGQgdGhlIGNhc2UgcmVmIGZpZWxkIG9mIHRoZSBhZmZlY3RlZCBub2RlXG4gICAgICogQHBhcmFtIG5ld0Nhc2VSZWZWYWx1ZXMgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgY2FzZSByZWYgZmllbGQgaW4gdGhlIG5vZGVcbiAgICAgKiBAcmV0dXJucyBhbiBgT2JzZXJ2YWJsZWAgdGhhdCBlbWl0cyBgdHJ1ZWAgd2hlbiB0aGUgcmVtb3ZlIG9wZXJhdGlvbiBjb21wbGV0ZXMuXG4gICAgICovXG4gICAgcHJvdGVjdGVkIHByb2Nlc3NDaGlsZE5vZGVSZW1vdmUoYWZmZWN0ZWROb2RlOiBDYXNlVHJlZU5vZGUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZVJlZkZpZWxkOiBJbW1lZGlhdGVEYXRhLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld0Nhc2VSZWZWYWx1ZXM6IFNldDxzdHJpbmc+KTogT2JzZXJ2YWJsZTxSZXN1bHRXaXRoQWZ0ZXJBY3Rpb25zPGJvb2xlYW4+PiB7XG4gICAgICAgIGNvbnN0IGluZGV4ID0gY2FzZVJlZkZpZWxkLnZhbHVlLmZpbmRJbmRleChpdCA9PiAhbmV3Q2FzZVJlZlZhbHVlcy5oYXMoaXQpKTtcbiAgICAgICAgY2FzZVJlZkZpZWxkLnZhbHVlLnNwbGljZShpbmRleCwgMSk7XG4gICAgICAgIGFmZmVjdGVkTm9kZS5jaGlsZHJlbi5zcGxpY2UoaW5kZXgsIDEpO1xuICAgICAgICB0aGlzLnJlZnJlc2hUcmVlKCk7XG4gICAgICAgIHJldHVybiBvZihuZXcgUmVzdWx0V2l0aEFmdGVyQWN0aW9ucyh0cnVlKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGlnbm9yZVxuICAgICAqIEZvcmNlcyBhIHJlcmVuZGVyIG9mIHRoZSB0cmVlIGNvbnRlbnRcbiAgICAgKi9cbiAgICBwcml2YXRlIHJlZnJlc2hUcmVlKCk6IHZvaWQge1xuICAgICAgICByZWZyZXNoVHJlZSh0aGlzLl90cmVlRGF0YVNvdXJjZSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmVsb2FkcyB0aGUgY3VycmVudGx5IHNlbGVjdGVkIGNhc2Ugbm9kZS4gVGhlIHtAbGluayBDYXNlfSBvYmplY3QgaGVsZCBpbiB0aGUge0BsaW5rIENhc2VUcmVlTm9kZX0gaW5zdGFuY2UgaXMgbm90IHJlcGxhY2VkLFxuICAgICAqIGJ1dCB0aGUgbmV3IENhc2UgaXMgYE9iamVjdC5hc3NpZ25gLWVkIGludG8gaXQuIFRoaXMgbWVhbnMgdGhhdCB0aGUgcmVmZXJlbmNlIHRvIHRoZSBDYXNlIGluc3RhbmNlIGlzIHVuY2hhbmdlZCBidXQgcmVmZXJlbmNlc1xuICAgICAqIHRvIGFsbCBpdCdzIG5vbi1wcmltaXRpdmUgYXR0cmlidXRlcyBhcmUgY2hhbmdlZC5cbiAgICAgKlxuICAgICAqIElmIGEgcmVsb2FkIG9mIHRoZSBjdXJyZW50IG5vZGUgaXMgaW5pdGlhdGVkIGJlZm9yZSB0aGUgcHJldmlvdXMgb25lIGNvbXBsZXRlZCwgdGhlIG5ldyBvbmUgaXMgaWdub3JlZC5cbiAgICAgKlxuICAgICAqIElmIHRoZSBjdXJyZW50bHkgc2VsZWN0ZWQgY2FzZSBjaGFuZ2VkIGJlZm9yZSBhIHJlc3BvbnNlIGZyb20gYmFja2VuZCB3YXMgcmVjZWl2ZWQgdGhlIHJlc3BvbnNlIGlzIGlnbm9yZWQuXG4gICAgICpcbiAgICAgKiBOb3RlIHRoYXQgdGhlIHBhcmVudCBub2RlLCBub3IgdGhlIGNoaWxkIG5vZGVzIGFyZSByZWxvYWRlZC5cbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgcmVsb2FkQ3VycmVudENhc2UoKTogdm9pZCB7XG4gICAgICAgIGlmICghdGhpcy5fY3VycmVudE5vZGUpIHtcbiAgICAgICAgICAgIHRoaXMuX2xvZ2dlci5kZWJ1ZygnTm8gVHJlZSBDYXNlIE5vZGUgc2VsZWN0ZWQsIG5vdGhpbmcgdG8gcmVsb2FkJyk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuX3JlbG9hZGVkQ2FzZUlkICYmIHRoaXMuX2N1cnJlbnROb2RlLmNhc2Uuc3RyaW5nSWQgIT09IHRoaXMuX3JlbG9hZGVkQ2FzZUlkKSB7XG4gICAgICAgICAgICB0aGlzLl9sb2dnZXIuZGVidWcoJ1JlbG9hZCBvZiB0aGUgY3VycmVudCBjYXNlIGFscmVhZHkgaW4gcHJvZ3Jlc3MnKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9yZWxvYWRlZENhc2VJZCA9IHRoaXMuX2N1cnJlbnROb2RlLmNhc2Uuc3RyaW5nSWQ7XG4gICAgICAgIHRoaXMuX2Nhc2VSZXNvdXJjZVNlcnZpY2UuZ2V0T25lQ2FzZSh0aGlzLl9jdXJyZW50Q2FzZS5zdHJpbmdJZCkuc3Vic2NyaWJlKHJlbG9hZGVkQ3VycmVudENhc2UgPT4ge1xuICAgICAgICAgICAgaWYgKCFyZWxvYWRlZEN1cnJlbnRDYXNlKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fbG9nZ2VyLmVycm9yKCdDdXJyZW50IENhc2UgVHJlZSBOb2RlIGNvdWxkIG5vdCBiZSByZWxvYWRlZC4gSW52YWxpZCBzZXJ2ZXIgcmVzcG9uc2UnLCByZWxvYWRlZEN1cnJlbnRDYXNlKTtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAodGhpcy5fY3VycmVudE5vZGUgJiYgcmVsb2FkZWRDdXJyZW50Q2FzZS5zdHJpbmdJZCA9PT0gdGhpcy5fY3VycmVudE5vZGUuY2FzZS5zdHJpbmdJZCkge1xuICAgICAgICAgICAgICAgIHRoaXMuX3JlbG9hZGVkQ2FzZUlkID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgIGNvbnN0IGNoYW5nZSA9IHRoaXMuZGV0ZXJtaW5lQ2FzZVVwZGF0ZSh0aGlzLl9jdXJyZW50Q2FzZSwgcmVsb2FkZWRDdXJyZW50Q2FzZSk7XG4gICAgICAgICAgICAgICAgT2JqZWN0LmFzc2lnbih0aGlzLl9jdXJyZW50Q2FzZSwgcmVsb2FkZWRDdXJyZW50Q2FzZSk7XG4gICAgICAgICAgICAgICAgdGhpcy5fdHJlZUNhc2VWaWV3U2VydmljZS5sb2FkVGFzayQubmV4dCh0aGlzLl9jdXJyZW50Q2FzZSk7XG4gICAgICAgICAgICAgICAgaWYgKGNoYW5nZS52aXNpYmxlVHJlZVByb3BlcnRpZXNDaGFuZ2VkKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMucmVmcmVzaFRyZWUoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKGNoYW5nZS5jaGlsZHJlbkNoYW5nZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fY3VycmVudE5vZGUuZGlydHlDaGlsZHJlbiA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZXhwYW5kTm9kZSh0aGlzLl9jdXJyZW50Tm9kZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHRoaXMuX2xvZ2dlci5kZWJ1ZygnQ3VycmVudCBDYXNlIFRyZWUgTm9kZSByZWxvYWRlZCcpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9sb2dnZXIuZGVidWcoJ0Rpc2NhcmRpbmcgY2FzZSByZWxvYWQgcmVzcG9uc2UsIHNpbmNlIHRoZSBjdXJyZW50IG5vZGUgaGFzIGNoYW5nZWQgYmVmb3JlIGl0cyBjYXNlIHdhcyByZWNlaXZlZCcpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LCBlcnJvciA9PiB7XG4gICAgICAgICAgICB0aGlzLl9sb2dnZXIuZXJyb3IoJ0N1cnJlbnQgQ2FzZSBUcmVlIE5vZGUgcmVsb2FkIHJlcXVlc3QgZmFpbGVkJywgZXJyb3IpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBEZXRlcm1pbmVzIGlmIGFubnkgb2YgdGhlIGNhc2UgYXR0cmlidXRlcyB0aGF0IGFyZSB2aXNpYmxlIG9uIHRoZSB0cmVlIGNoYW5nZWQuXG4gICAgICogQHBhcmFtIG9sZENhc2UgdGhlIHByZXZpb3VzIHZlcnNpb24gb2YgdGhlIENhc2Ugb2JqZWN0LCB0aGF0IGlzIGN1cnJlbnRseSBkaXNwbGF5ZWQgb24gdGhlIHRyZWVcbiAgICAgKiBAcGFyYW0gbmV3Q2FzZSB0aGUgbmV3IHZlcnNpb24gb2YgdGhlIENhc2Ugb2JqZWN0LCB0aGF0IHNob3VsZCByZXBsYWNlIHRoZSBvbGQgb25lXG4gICAgICovXG4gICAgcHJpdmF0ZSBkZXRlcm1pbmVDYXNlVXBkYXRlKG9sZENhc2U6IENhc2UsIG5ld0Nhc2U6IENhc2UpOiBDYXNlVXBkYXRlUmVzdWx0IHtcbiAgICAgICAgY29uc3QgdmlzaWJsZUF0dHJpYnV0ZXMgPSBbXG4gICAgICAgICAgICBUcmVlUGV0cmlmbG93SWRlbnRpZmllcnMuQ0FOX0FERF9DSElMRFJFTixcbiAgICAgICAgICAgIFRyZWVQZXRyaWZsb3dJZGVudGlmaWVycy5DQU5fUkVNT1ZFX05PREUsXG4gICAgICAgICAgICBUcmVlUGV0cmlmbG93SWRlbnRpZmllcnMuQkVGT1JFX1RFWFRfSUNPTixcbiAgICAgICAgICAgIFRyZWVQZXRyaWZsb3dJZGVudGlmaWVycy5UUkVFX0FERF9JQ09OXG4gICAgICAgIF07XG5cbiAgICAgICAgY29uc3QgcmVzdWx0OiBDYXNlVXBkYXRlUmVzdWx0ID0ge1xuICAgICAgICAgICAgdmlzaWJsZVRyZWVQcm9wZXJ0aWVzQ2hhbmdlZDogdHJ1ZSwgLy8gZm9yIHNob3J0LWNpcmN1aXRpbmcgdGhlIGV2YWx1YXRpb24sIGlmIG5vZGVzIGNoaWxkcmVuIGNoYW5nZWRcbiAgICAgICAgICAgIGNoaWxkcmVuQ2hhbmdlZDogZmFsc2VcbiAgICAgICAgfTtcblxuICAgICAgICBjb25zdCBvbGRDaGlsZENhc2VSZWYgPSBnZXRJbW1lZGlhdGVEYXRhKG9sZENhc2UsIFRyZWVQZXRyaWZsb3dJZGVudGlmaWVycy5DSElMRFJFTl9DQVNFX1JFRik7XG4gICAgICAgIGlmIChvbGRDaGlsZENhc2VSZWYgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgY29uc3Qgb2xkQ2hpbGRyZW4gPSBuZXcgU2V0KG9sZENoaWxkQ2FzZVJlZi52YWx1ZSk7XG4gICAgICAgICAgICBjb25zdCBuZXdDaGlsZHJlbiA9IG5ldyBTZXQoZ2V0SW1tZWRpYXRlRGF0YShuZXdDYXNlLCBUcmVlUGV0cmlmbG93SWRlbnRpZmllcnMuQ0hJTERSRU5fQ0FTRV9SRUYpLnZhbHVlKTtcblxuICAgICAgICAgICAgcmVzdWx0LmNoaWxkcmVuQ2hhbmdlZCA9IG9sZENoaWxkcmVuLnNpemUgIT09IG5ld0NoaWxkcmVuLnNpemU7XG4gICAgICAgICAgICBpZiAoIXJlc3VsdC5jaGlsZHJlbkNoYW5nZWQpIHtcbiAgICAgICAgICAgICAgICByZXN1bHQuY2hpbGRyZW5DaGFuZ2VkID0gQXJyYXkuZnJvbShvbGRDaGlsZHJlbikuc29tZShjaGlsZElkID0+ICFuZXdDaGlsZHJlbi5oYXMoY2hpbGRJZCkpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBzaG9ydC1jaXJjdWl0XG4gICAgICAgICAgICBpZiAocmVzdWx0LmNoaWxkcmVuQ2hhbmdlZCkge1xuICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXN1bHQudmlzaWJsZVRyZWVQcm9wZXJ0aWVzQ2hhbmdlZCA9IHZpc2libGVBdHRyaWJ1dGVzLnNvbWUoYXR0cmlidXRlID0+IHtcbiAgICAgICAgICAgIHJldHVybiBnZXRJbW1lZGlhdGVEYXRhKG9sZENhc2UsIGF0dHJpYnV0ZSlcbiAgICAgICAgICAgICAgICAmJiBnZXRJbW1lZGlhdGVEYXRhKG9sZENhc2UsIGF0dHJpYnV0ZSkudmFsdWUgIT09IGdldEltbWVkaWF0ZURhdGEobmV3Q2FzZSwgYXR0cmlidXRlKS52YWx1ZTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG59XG4iXX0=
@@ -8,9 +8,10 @@ import * as i1 from "../../side-menu/services/side-menu.service";
8
8
  import * as i2 from "./workflow-view.service";
9
9
  import * as i3 from "../../logger/services/logger.service";
10
10
  import * as i4 from "../../process/process.service";
11
+ import * as i5 from "@angular/router";
11
12
  export class AbstractWorkflowViewComponent extends AbstractViewWithHeadersComponent {
12
- constructor(_sideMenuService, _workflowViewService, _log, _processService) {
13
- super(_workflowViewService);
13
+ constructor(_sideMenuService, _workflowViewService, _log, _processService, _activatedRoute) {
14
+ super(_workflowViewService, _activatedRoute);
14
15
  this._sideMenuService = _sideMenuService;
15
16
  this._workflowViewService = _workflowViewService;
16
17
  this._log = _log;
@@ -63,7 +64,7 @@ export class AbstractWorkflowViewComponent extends AbstractViewWithHeadersCompon
63
64
  }
64
65
  }
65
66
  }
66
- AbstractWorkflowViewComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.3.11", ngImport: i0, type: AbstractWorkflowViewComponent, deps: [{ token: i1.SideMenuService }, { token: i2.WorkflowViewService }, { token: i3.LoggerService }, { token: i4.ProcessService }], target: i0.ɵɵFactoryTarget.Component });
67
+ AbstractWorkflowViewComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.3.11", ngImport: i0, type: AbstractWorkflowViewComponent, deps: [{ token: i1.SideMenuService }, { token: i2.WorkflowViewService }, { token: i3.LoggerService }, { token: i4.ProcessService }, { token: i5.ActivatedRoute }], target: i0.ɵɵFactoryTarget.Component });
67
68
  AbstractWorkflowViewComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.3.11", type: AbstractWorkflowViewComponent, selector: "ncc-abstract-workflow-view", inputs: { footerSize: "footerSize", showDeleteMenu: "showDeleteMenu" }, viewQueries: [{ propertyName: "workflowHeader", first: true, predicate: ["header"], descendants: true }, { propertyName: "viewport", first: true, predicate: CdkVirtualScrollViewport, descendants: true }], usesInheritance: true, ngImport: i0, template: '', isInline: true });
68
69
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.11", ngImport: i0, type: AbstractWorkflowViewComponent, decorators: [{
69
70
  type: Component,
@@ -71,7 +72,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.11", ngImpo
71
72
  selector: 'ncc-abstract-workflow-view',
72
73
  template: ''
73
74
  }]
74
- }], ctorParameters: function () { return [{ type: i1.SideMenuService }, { type: i2.WorkflowViewService }, { type: i3.LoggerService }, { type: i4.ProcessService }]; }, propDecorators: { footerSize: [{
75
+ }], ctorParameters: function () { return [{ type: i1.SideMenuService }, { type: i2.WorkflowViewService }, { type: i3.LoggerService }, { type: i4.ProcessService }, { type: i5.ActivatedRoute }]; }, propDecorators: { footerSize: [{
75
76
  type: Input
76
77
  }], showDeleteMenu: [{
77
78
  type: Input
@@ -82,4 +83,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.11", ngImpo
82
83
  type: ViewChild,
83
84
  args: [CdkVirtualScrollViewport]
84
85
  }] } });
85
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWJzdHJhY3Qtd29ya2Zsb3ctdmlldy5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZXRncmlmLWNvbXBvbmVudHMtY29yZS9zcmMvbGliL3ZpZXcvd29ya2Zsb3ctdmlldy9hYnN0cmFjdC13b3JrZmxvdy12aWV3LmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQWdCLFNBQVMsRUFBRSxLQUFLLEVBQUUsU0FBUyxFQUFDLE1BQU0sZUFBZSxDQUFDO0FBSXpFLE9BQU8sRUFBQyxnQ0FBZ0MsRUFBQyxNQUFNLCtCQUErQixDQUFDO0FBQy9FLE9BQU8sRUFBQyxVQUFVLEVBQUMsTUFBTSxpQ0FBaUMsQ0FBQztBQUUzRCxPQUFPLEVBQUMsR0FBRyxFQUFDLE1BQU0sbUJBQW1CLENBQUM7QUFDdEMsT0FBTyxFQUFDLHdCQUF3QixFQUFDLE1BQU0sd0JBQXdCLENBQUM7Ozs7OztBQVFoRSxNQUFNLE9BQWdCLDZCQUE4QixTQUFRLGdDQUFnQztJQVl4RixZQUFnQyxnQkFBaUMsRUFDakMsb0JBQXlDLEVBQ3pDLElBQW1CLEVBQ25CLGVBQStCO1FBQzNELEtBQUssQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDO1FBSkEscUJBQWdCLEdBQWhCLGdCQUFnQixDQUFpQjtRQUNqQyx5QkFBb0IsR0FBcEIsb0JBQW9CLENBQXFCO1FBQ3pDLFNBQUksR0FBSixJQUFJLENBQWU7UUFDbkIsb0JBQWUsR0FBZixlQUFlLENBQWdCO1FBWnRELG1CQUFjLEdBQUcsS0FBSyxDQUFDO1FBR2hCLGVBQVUsR0FBRyxVQUFVLENBQUMsUUFBUSxDQUFDO1FBVzdDLElBQUksQ0FBQyxVQUFVLEdBQUcsSUFBSSxDQUFDLG9CQUFvQixDQUFDLFVBQVUsQ0FBQztRQUN2RCxJQUFJLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxRQUFRLENBQUM7UUFDbkQsSUFBSSxDQUFDLFVBQVUsR0FBRyxDQUFDLENBQUM7SUFDeEIsQ0FBQztJQUVELGVBQWU7UUFDWCxJQUFJLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxDQUFDO0lBQy9DLENBQUM7SUFFTSxpQkFBaUIsQ0FBQyxTQUFTO1FBQzlCLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsRUFBRTtZQUM1RCxJQUFJLEtBQUssQ0FBQyxJQUFJLEVBQUUsR0FBRyxLQUFLLFNBQVMsRUFBRTtnQkFDL0IsSUFBSSxDQUFDLG9CQUFvQixDQUFDLE1BQU0sRUFBRSxDQUFDO2dCQUNuQyxJQUFJLEtBQUssQ0FBQyxJQUFJLEVBQUUsR0FBRyxFQUFFO29CQUNqQixJQUFJLENBQUMsZUFBZSxDQUFDLFNBQVMsQ0FBQyxJQUFJLEdBQUcsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7aUJBQzNEO2FBQ0o7aUJBQU07Z0JBQ0gsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLENBQUM7YUFDdkI7UUFDTCxDQUFDLENBQUMsQ0FBQztJQUNQLENBQUM7SUFFTSxPQUFPLENBQUMsQ0FBQztRQUNaLE9BQU8sQ0FBQyxDQUFDO0lBQ2IsQ0FBQztJQUVNLFlBQVk7UUFDZixJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRTtZQUNoQixPQUFPO1NBQ1Y7UUFDRCxJQUFJLENBQUMsb0JBQW9CLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsZ0JBQWdCLEVBQUUsRUFBRSxJQUFJLENBQUMsUUFBUSxDQUFDLGFBQWEsRUFBRSxDQUFDLENBQUM7SUFDeEcsQ0FBQztJQUVTLG1CQUFtQixDQUFDLGFBQXNCO1FBQ2hELElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFO1lBQ2hCLE9BQU87U0FDVjtRQUNELE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsYUFBYSxFQUFFLENBQUMsYUFBYSxDQUFDO1FBQzVELElBQUksYUFBYSxLQUFLLElBQUksSUFBSSxhQUFhLEtBQUssU0FBUyxFQUFFO1lBQ3ZELE9BQU8sQ0FBQyxLQUFLLENBQUMsTUFBTSxHQUFHLGFBQWEsR0FBRyxJQUFJLENBQUM7U0FDL0M7YUFBTTtZQUNILE1BQU0sY0FBYyxHQUFHLE1BQU0sQ0FBQyxXQUFXLEdBQUcsT0FBTyxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDO1lBQ2hGLElBQUksT0FBTyxDQUFDLEtBQUssQ0FBQyxNQUFNLEtBQUssY0FBYyxHQUFHLElBQUksRUFBRTtnQkFDaEQsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsbUNBQW1DLEdBQUcsY0FBYyxDQUFDLENBQUM7Z0JBQ3JFLE9BQU8sQ0FBQyxLQUFLLENBQUMsTUFBTSxHQUFHLGNBQWMsR0FBRyxJQUFJLENBQUM7YUFDaEQ7U0FDSjtJQUNMLENBQUM7OzJIQWhFaUIsNkJBQTZCOytHQUE3Qiw2QkFBNkIsK1FBVXBDLHdCQUF3Qix1RUFaekIsRUFBRTs0RkFFTSw2QkFBNkI7a0JBSmxELFNBQVM7bUJBQUM7b0JBQ1AsUUFBUSxFQUFFLDRCQUE0QjtvQkFDdEMsUUFBUSxFQUFFLEVBQUU7aUJBQ2Y7aU1BR21CLFVBQVU7c0JBQXpCLEtBQUs7Z0JBQ0csY0FBYztzQkFBdEIsS0FBSztnQkFDc0IsY0FBYztzQkFBekMsU0FBUzt1QkFBQyxRQUFRO2dCQU15QixRQUFRO3NCQUFuRCxTQUFTO3VCQUFDLHdCQUF3QiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7QWZ0ZXJWaWV3SW5pdCwgQ29tcG9uZW50LCBJbnB1dCwgVmlld0NoaWxkfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7U2lkZU1lbnVTZXJ2aWNlfSBmcm9tICcuLi8uLi9zaWRlLW1lbnUvc2VydmljZXMvc2lkZS1tZW51LnNlcnZpY2UnO1xuaW1wb3J0IHtXb3JrZmxvd1ZpZXdTZXJ2aWNlfSBmcm9tICcuL3dvcmtmbG93LXZpZXcuc2VydmljZSc7XG5pbXBvcnQge0Fic3RyYWN0SGVhZGVyQ29tcG9uZW50fSBmcm9tICcuLi8uLi9oZWFkZXIvYWJzdHJhY3QtaGVhZGVyLmNvbXBvbmVudCc7XG5pbXBvcnQge0Fic3RyYWN0Vmlld1dpdGhIZWFkZXJzQ29tcG9uZW50fSBmcm9tICcuLi9hYnN0cmFjdC92aWV3LXdpdGgtaGVhZGVycyc7XG5pbXBvcnQge0hlYWRlclR5cGV9IGZyb20gJy4uLy4uL2hlYWRlci9tb2RlbHMvaGVhZGVyLXR5cGUnO1xuaW1wb3J0IHtPYnNlcnZhYmxlfSBmcm9tICdyeGpzJztcbmltcG9ydCB7TmV0fSBmcm9tICcuLi8uLi9wcm9jZXNzL25ldCc7XG5pbXBvcnQge0Nka1ZpcnR1YWxTY3JvbGxWaWV3cG9ydH0gZnJvbSAnQGFuZ3VsYXIvY2RrL3Njcm9sbGluZyc7XG5pbXBvcnQge0xvZ2dlclNlcnZpY2V9IGZyb20gJy4uLy4uL2xvZ2dlci9zZXJ2aWNlcy9sb2dnZXIuc2VydmljZSc7XG5pbXBvcnQge1Byb2Nlc3NTZXJ2aWNlfSBmcm9tICcuLi8uLi9wcm9jZXNzL3Byb2Nlc3Muc2VydmljZSc7XG5cbkBDb21wb25lbnQoe1xuICAgIHNlbGVjdG9yOiAnbmNjLWFic3RyYWN0LXdvcmtmbG93LXZpZXcnLFxuICAgIHRlbXBsYXRlOiAnJ1xufSlcbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdFdvcmtmbG93Vmlld0NvbXBvbmVudCBleHRlbmRzIEFic3RyYWN0Vmlld1dpdGhIZWFkZXJzQ29tcG9uZW50IGltcGxlbWVudHMgQWZ0ZXJWaWV3SW5pdCB7XG5cbiAgICBASW5wdXQoKSBwdWJsaWMgZm9vdGVyU2l6ZTogbnVtYmVyO1xuICAgIEBJbnB1dCgpIHNob3dEZWxldGVNZW51ID0gZmFsc2U7XG4gICAgQFZpZXdDaGlsZCgnaGVhZGVyJykgcHVibGljIHdvcmtmbG93SGVhZGVyOiBBYnN0cmFjdEhlYWRlckNvbXBvbmVudDtcblxuICAgIHB1YmxpYyByZWFkb25seSBoZWFkZXJUeXBlID0gSGVhZGVyVHlwZS5XT1JLRkxPVztcbiAgICBwdWJsaWMgd29ya2Zsb3dzJDogT2JzZXJ2YWJsZTxBcnJheTxOZXQ+PjtcbiAgICBwdWJsaWMgbG9hZGluZyQ6IE9ic2VydmFibGU8Ym9vbGVhbj47XG5cbiAgICBAVmlld0NoaWxkKENka1ZpcnR1YWxTY3JvbGxWaWV3cG9ydCkgcHVibGljIHZpZXdwb3J0OiBDZGtWaXJ0dWFsU2Nyb2xsVmlld3BvcnQ7XG5cbiAgICBwcm90ZWN0ZWQgY29uc3RydWN0b3IocHJvdGVjdGVkIF9zaWRlTWVudVNlcnZpY2U6IFNpZGVNZW51U2VydmljZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvdGVjdGVkIF93b3JrZmxvd1ZpZXdTZXJ2aWNlOiBXb3JrZmxvd1ZpZXdTZXJ2aWNlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICBwcm90ZWN0ZWQgX2xvZzogTG9nZ2VyU2VydmljZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvdGVjdGVkIF9wcm9jZXNzU2VydmljZTogUHJvY2Vzc1NlcnZpY2UpIHtcbiAgICAgICAgc3VwZXIoX3dvcmtmbG93Vmlld1NlcnZpY2UpO1xuICAgICAgICB0aGlzLndvcmtmbG93cyQgPSB0aGlzLl93b3JrZmxvd1ZpZXdTZXJ2aWNlLndvcmtmbG93cyQ7XG4gICAgICAgIHRoaXMubG9hZGluZyQgPSB0aGlzLl93b3JrZmxvd1ZpZXdTZXJ2aWNlLmxvYWRpbmckO1xuICAgICAgICB0aGlzLmZvb3RlclNpemUgPSAwO1xuICAgIH1cblxuICAgIG5nQWZ0ZXJWaWV3SW5pdCgpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5pbml0aWFsaXplSGVhZGVyKHRoaXMud29ya2Zsb3dIZWFkZXIpO1xuICAgIH1cblxuICAgIHB1YmxpYyBpbXBvcnRTaWRlbWVudU5ldChjb21wb25lbnQpIHtcbiAgICAgICAgdGhpcy5fc2lkZU1lbnVTZXJ2aWNlLm9wZW4oY29tcG9uZW50KS5vbkNsb3NlLnN1YnNjcmliZShldmVudCA9PiB7XG4gICAgICAgICAgICBpZiAoZXZlbnQuZGF0YT8ubmV0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl93b3JrZmxvd1ZpZXdTZXJ2aWNlLnJlbG9hZCgpO1xuICAgICAgICAgICAgICAgIGlmIChldmVudC5kYXRhPy5uZXQpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fcHJvY2Vzc1NlcnZpY2UudXBkYXRlTmV0KG5ldyBOZXQoZXZlbnQuZGF0YS5uZXQpKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMuX2xvZy5kZWJ1ZygnJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHB1YmxpYyB0cmFja0J5KGkpOiBhbnkge1xuICAgICAgICByZXR1cm4gaTtcbiAgICB9XG5cbiAgICBwdWJsaWMgbG9hZE5leHRQYWdlKCk6IHZvaWQge1xuICAgICAgICBpZiAoIXRoaXMudmlld3BvcnQpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl93b3JrZmxvd1ZpZXdTZXJ2aWNlLm5leHRQYWdlKHRoaXMudmlld3BvcnQuZ2V0UmVuZGVyZWRSYW5nZSgpLCB0aGlzLnZpZXdwb3J0LmdldERhdGFMZW5ndGgoKSk7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIGNhbGN1bGF0ZUxpc3RIZWlnaHQocHJlY2lzZUhlaWdodD86IG51bWJlcik6IHZvaWQge1xuICAgICAgICBpZiAoIXRoaXMudmlld3BvcnQpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBlbGVtZW50ID0gdGhpcy52aWV3cG9ydC5nZXRFbGVtZW50UmVmKCkubmF0aXZlRWxlbWVudDtcbiAgICAgICAgaWYgKHByZWNpc2VIZWlnaHQgIT09IG51bGwgJiYgcHJlY2lzZUhlaWdodCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBlbGVtZW50LnN0eWxlLmhlaWdodCA9IHByZWNpc2VIZWlnaHQgKyAncHgnO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29uc3Qgdmlld3BvcnRIZWlnaHQgPSB3aW5kb3cuaW5uZXJIZWlnaHQgLSBlbGVtZW50Lm9mZnNldFRvcCAtIHRoaXMuZm9vdGVyU2l6ZTtcbiAgICAgICAgICAgIGlmIChlbGVtZW50LnN0eWxlLmhlaWdodCAhPT0gdmlld3BvcnRIZWlnaHQgKyAncHgnKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fbG9nLmluZm8oJ1ZpcnR1YWwgc2Nyb2xsIGhlaWdodCBjaGFuZ2UgdG86ICcgKyB2aWV3cG9ydEhlaWdodCk7XG4gICAgICAgICAgICAgICAgZWxlbWVudC5zdHlsZS5oZWlnaHQgPSB2aWV3cG9ydEhlaWdodCArICdweCc7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbn1cbiJdfQ==
86
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWJzdHJhY3Qtd29ya2Zsb3ctdmlldy5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZXRncmlmLWNvbXBvbmVudHMtY29yZS9zcmMvbGliL3ZpZXcvd29ya2Zsb3ctdmlldy9hYnN0cmFjdC13b3JrZmxvdy12aWV3LmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQWdCLFNBQVMsRUFBRSxLQUFLLEVBQUUsU0FBUyxFQUFDLE1BQU0sZUFBZSxDQUFDO0FBSXpFLE9BQU8sRUFBQyxnQ0FBZ0MsRUFBQyxNQUFNLCtCQUErQixDQUFDO0FBQy9FLE9BQU8sRUFBQyxVQUFVLEVBQUMsTUFBTSxpQ0FBaUMsQ0FBQztBQUUzRCxPQUFPLEVBQUMsR0FBRyxFQUFDLE1BQU0sbUJBQW1CLENBQUM7QUFDdEMsT0FBTyxFQUFDLHdCQUF3QixFQUFDLE1BQU0sd0JBQXdCLENBQUM7Ozs7Ozs7QUFTaEUsTUFBTSxPQUFnQiw2QkFBOEIsU0FBUSxnQ0FBZ0M7SUFZeEYsWUFBZ0MsZ0JBQWlDLEVBQ2pDLG9CQUF5QyxFQUN6QyxJQUFtQixFQUNuQixlQUErQixFQUN6QyxlQUFnQztRQUNsRCxLQUFLLENBQUMsb0JBQW9CLEVBQUUsZUFBZSxDQUFDLENBQUM7UUFMakIscUJBQWdCLEdBQWhCLGdCQUFnQixDQUFpQjtRQUNqQyx5QkFBb0IsR0FBcEIsb0JBQW9CLENBQXFCO1FBQ3pDLFNBQUksR0FBSixJQUFJLENBQWU7UUFDbkIsb0JBQWUsR0FBZixlQUFlLENBQWdCO1FBWnRELG1CQUFjLEdBQUcsS0FBSyxDQUFDO1FBR2hCLGVBQVUsR0FBRyxVQUFVLENBQUMsUUFBUSxDQUFDO1FBWTdDLElBQUksQ0FBQyxVQUFVLEdBQUcsSUFBSSxDQUFDLG9CQUFvQixDQUFDLFVBQVUsQ0FBQztRQUN2RCxJQUFJLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxRQUFRLENBQUM7UUFDbkQsSUFBSSxDQUFDLFVBQVUsR0FBRyxDQUFDLENBQUM7SUFDeEIsQ0FBQztJQUVELGVBQWU7UUFDWCxJQUFJLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxDQUFDO0lBQy9DLENBQUM7SUFFTSxpQkFBaUIsQ0FBQyxTQUFTO1FBQzlCLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsRUFBRTtZQUM1RCxJQUFJLEtBQUssQ0FBQyxJQUFJLEVBQUUsR0FBRyxLQUFLLFNBQVMsRUFBRTtnQkFDL0IsSUFBSSxDQUFDLG9CQUFvQixDQUFDLE1BQU0sRUFBRSxDQUFDO2dCQUNuQyxJQUFJLEtBQUssQ0FBQyxJQUFJLEVBQUUsR0FBRyxFQUFFO29CQUNqQixJQUFJLENBQUMsZUFBZSxDQUFDLFNBQVMsQ0FBQyxJQUFJLEdBQUcsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7aUJBQzNEO2FBQ0o7aUJBQU07Z0JBQ0gsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLENBQUM7YUFDdkI7UUFDTCxDQUFDLENBQUMsQ0FBQztJQUNQLENBQUM7SUFFTSxPQUFPLENBQUMsQ0FBQztRQUNaLE9BQU8sQ0FBQyxDQUFDO0lBQ2IsQ0FBQztJQUVNLFlBQVk7UUFDZixJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRTtZQUNoQixPQUFPO1NBQ1Y7UUFDRCxJQUFJLENBQUMsb0JBQW9CLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsZ0JBQWdCLEVBQUUsRUFBRSxJQUFJLENBQUMsUUFBUSxDQUFDLGFBQWEsRUFBRSxDQUFDLENBQUM7SUFDeEcsQ0FBQztJQUVTLG1CQUFtQixDQUFDLGFBQXNCO1FBQ2hELElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFO1lBQ2hCLE9BQU87U0FDVjtRQUNELE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsYUFBYSxFQUFFLENBQUMsYUFBYSxDQUFDO1FBQzVELElBQUksYUFBYSxLQUFLLElBQUksSUFBSSxhQUFhLEtBQUssU0FBUyxFQUFFO1lBQ3ZELE9BQU8sQ0FBQyxLQUFLLENBQUMsTUFBTSxHQUFHLGFBQWEsR0FBRyxJQUFJLENBQUM7U0FDL0M7YUFBTTtZQUNILE1BQU0sY0FBYyxHQUFHLE1BQU0sQ0FBQyxXQUFXLEdBQUcsT0FBTyxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDO1lBQ2hGLElBQUksT0FBTyxDQUFDLEtBQUssQ0FBQyxNQUFNLEtBQUssY0FBYyxHQUFHLElBQUksRUFBRTtnQkFDaEQsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsbUNBQW1DLEdBQUcsY0FBYyxDQUFDLENBQUM7Z0JBQ3JFLE9BQU8sQ0FBQyxLQUFLLENBQUMsTUFBTSxHQUFHLGNBQWMsR0FBRyxJQUFJLENBQUM7YUFDaEQ7U0FDSjtJQUNMLENBQUM7OzJIQWpFaUIsNkJBQTZCOytHQUE3Qiw2QkFBNkIsK1FBVXBDLHdCQUF3Qix1RUFaekIsRUFBRTs0RkFFTSw2QkFBNkI7a0JBSmxELFNBQVM7bUJBQUM7b0JBQ1AsUUFBUSxFQUFFLDRCQUE0QjtvQkFDdEMsUUFBUSxFQUFFLEVBQUU7aUJBQ2Y7OE5BR21CLFVBQVU7c0JBQXpCLEtBQUs7Z0JBQ0csY0FBYztzQkFBdEIsS0FBSztnQkFDc0IsY0FBYztzQkFBekMsU0FBUzt1QkFBQyxRQUFRO2dCQU15QixRQUFRO3NCQUFuRCxTQUFTO3VCQUFDLHdCQUF3QiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7QWZ0ZXJWaWV3SW5pdCwgQ29tcG9uZW50LCBJbnB1dCwgVmlld0NoaWxkfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7U2lkZU1lbnVTZXJ2aWNlfSBmcm9tICcuLi8uLi9zaWRlLW1lbnUvc2VydmljZXMvc2lkZS1tZW51LnNlcnZpY2UnO1xuaW1wb3J0IHtXb3JrZmxvd1ZpZXdTZXJ2aWNlfSBmcm9tICcuL3dvcmtmbG93LXZpZXcuc2VydmljZSc7XG5pbXBvcnQge0Fic3RyYWN0SGVhZGVyQ29tcG9uZW50fSBmcm9tICcuLi8uLi9oZWFkZXIvYWJzdHJhY3QtaGVhZGVyLmNvbXBvbmVudCc7XG5pbXBvcnQge0Fic3RyYWN0Vmlld1dpdGhIZWFkZXJzQ29tcG9uZW50fSBmcm9tICcuLi9hYnN0cmFjdC92aWV3LXdpdGgtaGVhZGVycyc7XG5pbXBvcnQge0hlYWRlclR5cGV9IGZyb20gJy4uLy4uL2hlYWRlci9tb2RlbHMvaGVhZGVyLXR5cGUnO1xuaW1wb3J0IHtPYnNlcnZhYmxlfSBmcm9tICdyeGpzJztcbmltcG9ydCB7TmV0fSBmcm9tICcuLi8uLi9wcm9jZXNzL25ldCc7XG5pbXBvcnQge0Nka1ZpcnR1YWxTY3JvbGxWaWV3cG9ydH0gZnJvbSAnQGFuZ3VsYXIvY2RrL3Njcm9sbGluZyc7XG5pbXBvcnQge0xvZ2dlclNlcnZpY2V9IGZyb20gJy4uLy4uL2xvZ2dlci9zZXJ2aWNlcy9sb2dnZXIuc2VydmljZSc7XG5pbXBvcnQge1Byb2Nlc3NTZXJ2aWNlfSBmcm9tICcuLi8uLi9wcm9jZXNzL3Byb2Nlc3Muc2VydmljZSc7XG5pbXBvcnQgeyBBY3RpdmF0ZWRSb3V0ZSB9IGZyb20gJ0Bhbmd1bGFyL3JvdXRlcic7XG5cbkBDb21wb25lbnQoe1xuICAgIHNlbGVjdG9yOiAnbmNjLWFic3RyYWN0LXdvcmtmbG93LXZpZXcnLFxuICAgIHRlbXBsYXRlOiAnJ1xufSlcbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdFdvcmtmbG93Vmlld0NvbXBvbmVudCBleHRlbmRzIEFic3RyYWN0Vmlld1dpdGhIZWFkZXJzQ29tcG9uZW50IGltcGxlbWVudHMgQWZ0ZXJWaWV3SW5pdCB7XG5cbiAgICBASW5wdXQoKSBwdWJsaWMgZm9vdGVyU2l6ZTogbnVtYmVyO1xuICAgIEBJbnB1dCgpIHNob3dEZWxldGVNZW51ID0gZmFsc2U7XG4gICAgQFZpZXdDaGlsZCgnaGVhZGVyJykgcHVibGljIHdvcmtmbG93SGVhZGVyOiBBYnN0cmFjdEhlYWRlckNvbXBvbmVudDtcblxuICAgIHB1YmxpYyByZWFkb25seSBoZWFkZXJUeXBlID0gSGVhZGVyVHlwZS5XT1JLRkxPVztcbiAgICBwdWJsaWMgd29ya2Zsb3dzJDogT2JzZXJ2YWJsZTxBcnJheTxOZXQ+PjtcbiAgICBwdWJsaWMgbG9hZGluZyQ6IE9ic2VydmFibGU8Ym9vbGVhbj47XG5cbiAgICBAVmlld0NoaWxkKENka1ZpcnR1YWxTY3JvbGxWaWV3cG9ydCkgcHVibGljIHZpZXdwb3J0OiBDZGtWaXJ0dWFsU2Nyb2xsVmlld3BvcnQ7XG5cbiAgICBwcm90ZWN0ZWQgY29uc3RydWN0b3IocHJvdGVjdGVkIF9zaWRlTWVudVNlcnZpY2U6IFNpZGVNZW51U2VydmljZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvdGVjdGVkIF93b3JrZmxvd1ZpZXdTZXJ2aWNlOiBXb3JrZmxvd1ZpZXdTZXJ2aWNlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICBwcm90ZWN0ZWQgX2xvZzogTG9nZ2VyU2VydmljZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvdGVjdGVkIF9wcm9jZXNzU2VydmljZTogUHJvY2Vzc1NlcnZpY2UsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIF9hY3RpdmF0ZWRSb3V0ZT86IEFjdGl2YXRlZFJvdXRlKSB7XG4gICAgICAgIHN1cGVyKF93b3JrZmxvd1ZpZXdTZXJ2aWNlLCBfYWN0aXZhdGVkUm91dGUpO1xuICAgICAgICB0aGlzLndvcmtmbG93cyQgPSB0aGlzLl93b3JrZmxvd1ZpZXdTZXJ2aWNlLndvcmtmbG93cyQ7XG4gICAgICAgIHRoaXMubG9hZGluZyQgPSB0aGlzLl93b3JrZmxvd1ZpZXdTZXJ2aWNlLmxvYWRpbmckO1xuICAgICAgICB0aGlzLmZvb3RlclNpemUgPSAwO1xuICAgIH1cblxuICAgIG5nQWZ0ZXJWaWV3SW5pdCgpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5pbml0aWFsaXplSGVhZGVyKHRoaXMud29ya2Zsb3dIZWFkZXIpO1xuICAgIH1cblxuICAgIHB1YmxpYyBpbXBvcnRTaWRlbWVudU5ldChjb21wb25lbnQpIHtcbiAgICAgICAgdGhpcy5fc2lkZU1lbnVTZXJ2aWNlLm9wZW4oY29tcG9uZW50KS5vbkNsb3NlLnN1YnNjcmliZShldmVudCA9PiB7XG4gICAgICAgICAgICBpZiAoZXZlbnQuZGF0YT8ubmV0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl93b3JrZmxvd1ZpZXdTZXJ2aWNlLnJlbG9hZCgpO1xuICAgICAgICAgICAgICAgIGlmIChldmVudC5kYXRhPy5uZXQpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fcHJvY2Vzc1NlcnZpY2UudXBkYXRlTmV0KG5ldyBOZXQoZXZlbnQuZGF0YS5uZXQpKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMuX2xvZy5kZWJ1ZygnJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHB1YmxpYyB0cmFja0J5KGkpOiBhbnkge1xuICAgICAgICByZXR1cm4gaTtcbiAgICB9XG5cbiAgICBwdWJsaWMgbG9hZE5leHRQYWdlKCk6IHZvaWQge1xuICAgICAgICBpZiAoIXRoaXMudmlld3BvcnQpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl93b3JrZmxvd1ZpZXdTZXJ2aWNlLm5leHRQYWdlKHRoaXMudmlld3BvcnQuZ2V0UmVuZGVyZWRSYW5nZSgpLCB0aGlzLnZpZXdwb3J0LmdldERhdGFMZW5ndGgoKSk7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIGNhbGN1bGF0ZUxpc3RIZWlnaHQocHJlY2lzZUhlaWdodD86IG51bWJlcik6IHZvaWQge1xuICAgICAgICBpZiAoIXRoaXMudmlld3BvcnQpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBlbGVtZW50ID0gdGhpcy52aWV3cG9ydC5nZXRFbGVtZW50UmVmKCkubmF0aXZlRWxlbWVudDtcbiAgICAgICAgaWYgKHByZWNpc2VIZWlnaHQgIT09IG51bGwgJiYgcHJlY2lzZUhlaWdodCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBlbGVtZW50LnN0eWxlLmhlaWdodCA9IHByZWNpc2VIZWlnaHQgKyAncHgnO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29uc3Qgdmlld3BvcnRIZWlnaHQgPSB3aW5kb3cuaW5uZXJIZWlnaHQgLSBlbGVtZW50Lm9mZnNldFRvcCAtIHRoaXMuZm9vdGVyU2l6ZTtcbiAgICAgICAgICAgIGlmIChlbGVtZW50LnN0eWxlLmhlaWdodCAhPT0gdmlld3BvcnRIZWlnaHQgKyAncHgnKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fbG9nLmluZm8oJ1ZpcnR1YWwgc2Nyb2xsIGhlaWdodCBjaGFuZ2UgdG86ICcgKyB2aWV3cG9ydEhlaWdodCk7XG4gICAgICAgICAgICAgICAgZWxlbWVudC5zdHlsZS5oZWlnaHQgPSB2aWV3cG9ydEhlaWdodCArICdweCc7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbn1cbiJdfQ==